From 1bd6d95af2c33aa1624491cdcb1dc43a4ce40946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Fri, 10 Jan 2020 14:07:11 -0300 Subject: [PATCH 1/9] 1489 - Expose required fields on form --- .../administrate/components/_field-unit.scss | 7 +++++++ app/helpers/administrate/application_helper.rb | 8 ++++++++ app/views/administrate/application/_form.html.erb | 2 +- spec/helpers/administrate/application_helper_spec.rb | 12 ++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/administrate/components/_field-unit.scss b/app/assets/stylesheets/administrate/components/_field-unit.scss index 0908bd4435..5ceffd684c 100644 --- a/app/assets/stylesheets/administrate/components/_field-unit.scss +++ b/app/assets/stylesheets/administrate/components/_field-unit.scss @@ -34,3 +34,10 @@ width: calc(25% - 1rem); } } + +.field-unit--required { + label:after { + content:" *"; + color: tomato; + } +} diff --git a/app/helpers/administrate/application_helper.rb b/app/helpers/administrate/application_helper.rb index c51a3b8670..5ad96d8366 100644 --- a/app/helpers/administrate/application_helper.rb +++ b/app/helpers/administrate/application_helper.rb @@ -15,6 +15,14 @@ def render_field(field, locals = {}) render locals: locals, partial: field.to_partial_path end + def required_field?(field) + has_presence_validator?(field.resource.class, field.attribute) ? 'required' : 'optional' + end + + def has_presence_validator?(resource_class, field_name) + resource_class.validators_on(field_name).map(&:class).include?(ActiveRecord::Validations::PresenceValidator) + end + def class_from_resource(resource_name) resource_name.to_s.classify.constantize end diff --git a/app/views/administrate/application/_form.html.erb b/app/views/administrate/application/_form.html.erb index 23d8024162..2b7818de1b 100644 --- a/app/views/administrate/application/_form.html.erb +++ b/app/views/administrate/application/_form.html.erb @@ -34,7 +34,7 @@ and renders all form fields for a resource's editable attributes. <% end %> <% page.attributes.each do |attribute| -%> -
+
<%= render_field attribute, f: f %>
<% end -%> diff --git a/spec/helpers/administrate/application_helper_spec.rb b/spec/helpers/administrate/application_helper_spec.rb index c1ebe170e3..4b40ad8d47 100644 --- a/spec/helpers/administrate/application_helper_spec.rb +++ b/spec/helpers/administrate/application_helper_spec.rb @@ -54,6 +54,18 @@ end end + describe "#has_presence_validator?" do + it "returns true if field is required" do + required = has_presence_validator?(Blog::Post, :title) + expect(required).to eq(true) + end + + it "returns false if field is not required" do + required = has_presence_validator?(Blog::Post, :publish_at) + expect(required).to eq(false) + end + end + describe "#sort_order" do it "sanitizes to ascending/descending/none" do expect(sort_order("asc")).to eq("ascending") From d021f26f5d37646ab97ac7c1ecacd165f9a140c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Fri, 10 Jan 2020 14:51:06 -0300 Subject: [PATCH 2/9] Organize code flagged by Hound --- .../administrate/components/_field-unit.scss | 6 +++--- app/helpers/administrate/application_helper.rb | 10 ++++++++-- app/views/administrate/application/_form.html.erb | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/administrate/components/_field-unit.scss b/app/assets/stylesheets/administrate/components/_field-unit.scss index 5ceffd684c..d5858ae6a9 100644 --- a/app/assets/stylesheets/administrate/components/_field-unit.scss +++ b/app/assets/stylesheets/administrate/components/_field-unit.scss @@ -36,8 +36,8 @@ } .field-unit--required { - label:after { - content:" *"; - color: tomato; + label::after { + color: $red; + content: " *"; } } diff --git a/app/helpers/administrate/application_helper.rb b/app/helpers/administrate/application_helper.rb index 5ad96d8366..fe21ad9022 100644 --- a/app/helpers/administrate/application_helper.rb +++ b/app/helpers/administrate/application_helper.rb @@ -15,12 +15,18 @@ def render_field(field, locals = {}) render locals: locals, partial: field.to_partial_path end + def requireness(field) + required_field?(field) ? "required" : "optional" + end + def required_field?(field) - has_presence_validator?(field.resource.class, field.attribute) ? 'required' : 'optional' + has_presence_validator?(field.resource.class, field.attribute) end def has_presence_validator?(resource_class, field_name) - resource_class.validators_on(field_name).map(&:class).include?(ActiveRecord::Validations::PresenceValidator) + resource_class.validators_on(field_name) + .map(&:class) + .include?(ActiveRecord::Validations::PresenceValidator) end def class_from_resource(resource_name) diff --git a/app/views/administrate/application/_form.html.erb b/app/views/administrate/application/_form.html.erb index 2b7818de1b..c380e23b43 100644 --- a/app/views/administrate/application/_form.html.erb +++ b/app/views/administrate/application/_form.html.erb @@ -34,7 +34,7 @@ and renders all form fields for a resource's editable attributes. <% end %> <% page.attributes.each do |attribute| -%> -
+
<%= render_field attribute, f: f %>
<% end -%> From 006578d4702107ffab4d3e29c407db0eb47314bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Fri, 10 Jan 2020 14:53:45 -0300 Subject: [PATCH 3/9] Code indenting --- app/helpers/administrate/application_helper.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/administrate/application_helper.rb b/app/helpers/administrate/application_helper.rb index fe21ad9022..5f601b9a0e 100644 --- a/app/helpers/administrate/application_helper.rb +++ b/app/helpers/administrate/application_helper.rb @@ -24,9 +24,9 @@ def required_field?(field) end def has_presence_validator?(resource_class, field_name) - resource_class.validators_on(field_name) - .map(&:class) - .include?(ActiveRecord::Validations::PresenceValidator) + resource_class.validators_on(field_name). + map(&:class). + include?(ActiveRecord::Validations::PresenceValidator) end def class_from_resource(resource_name) From 5752ff9b86666c0466cde73bc852183c31b740b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Mon, 13 Jan 2020 15:01:10 -0300 Subject: [PATCH 4/9] Specs for 'requireness' method --- .../administrate/application_helper_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/helpers/administrate/application_helper_spec.rb b/spec/helpers/administrate/application_helper_spec.rb index 4b40ad8d47..6bba3ca4f5 100644 --- a/spec/helpers/administrate/application_helper_spec.rb +++ b/spec/helpers/administrate/application_helper_spec.rb @@ -54,6 +54,20 @@ end end + describe "#requireness" do + let(:page) { Administrate::Page::Form.new(Blog::PostDashboard.new, Blog::Post.new) } + + it "returns 'required' if field is required" do + title_field = page.attributes.select { |i| i.attribute == :title }.first + expect(requireness(title_field)).to eq('required') + end + + it "returns 'optional' if field is not required" do + publish_at_field = page.attributes.select { |i| i.attribute == :published_at }.first + expect(requireness(publish_at_field)).to eq('optional') + end + end + describe "#has_presence_validator?" do it "returns true if field is required" do required = has_presence_validator?(Blog::Post, :title) From f84df1a87ba80115a2150aef9bd1f9ce5bd9514b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Mon, 13 Jan 2020 15:03:05 -0300 Subject: [PATCH 5/9] Refactoring method --- app/helpers/administrate/application_helper.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/administrate/application_helper.rb b/app/helpers/administrate/application_helper.rb index 5f601b9a0e..f98626f6a4 100644 --- a/app/helpers/administrate/application_helper.rb +++ b/app/helpers/administrate/application_helper.rb @@ -24,9 +24,9 @@ def required_field?(field) end def has_presence_validator?(resource_class, field_name) - resource_class.validators_on(field_name). - map(&:class). - include?(ActiveRecord::Validations::PresenceValidator) + resource_class. + validators_on(field_name). + any? { |v| v.class == ActiveRecord::Validations::PresenceValidator } end def class_from_resource(resource_name) From 1fc1e260db81867a52c3fa5bf19e11c83591833e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Tue, 21 Jan 2020 10:35:25 -0300 Subject: [PATCH 6/9] Refactoring code --- spec/helpers/administrate/application_helper_spec.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/spec/helpers/administrate/application_helper_spec.rb b/spec/helpers/administrate/application_helper_spec.rb index 6bba3ca4f5..9b0b22678f 100644 --- a/spec/helpers/administrate/application_helper_spec.rb +++ b/spec/helpers/administrate/application_helper_spec.rb @@ -55,16 +55,18 @@ end describe "#requireness" do - let(:page) { Administrate::Page::Form.new(Blog::PostDashboard.new, Blog::Post.new) } + let(:page) { + Administrate::Page::Form.new(Blog::PostDashboard.new, Blog::Post.new) + } it "returns 'required' if field is required" do - title_field = page.attributes.select { |i| i.attribute == :title }.first - expect(requireness(title_field)).to eq('required') + title = page.attributes.find { |i| i.attribute == :title } + expect(requireness(title)).to eq("required") end it "returns 'optional' if field is not required" do - publish_at_field = page.attributes.select { |i| i.attribute == :published_at }.first - expect(requireness(publish_at_field)).to eq('optional') + publish_at = page.attributes.find { |i| i.attribute == :published_at } + expect(requireness(publish_at)).to eq("optional") end end From 3ef629d6789caecb8373cc7d9a27f2d838b76731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Tue, 21 Jan 2020 13:46:18 -0300 Subject: [PATCH 7/9] Validators back-compatibility --- app/helpers/administrate/application_helper.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/helpers/administrate/application_helper.rb b/app/helpers/administrate/application_helper.rb index f98626f6a4..e11418ba6d 100644 --- a/app/helpers/administrate/application_helper.rb +++ b/app/helpers/administrate/application_helper.rb @@ -24,11 +24,15 @@ def required_field?(field) end def has_presence_validator?(resource_class, field_name) - resource_class. - validators_on(field_name). + validators_on(resource_class, field_name). any? { |v| v.class == ActiveRecord::Validations::PresenceValidator } end + def validators_on(resource_class, field_name) + return [] unless resource_class.respond_to?(:validators_on) + resource_class.validators_on(field_name) + end + def class_from_resource(resource_name) resource_name.to_s.classify.constantize end From 3e4146d9489a39254d933993695f4c48aca91e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Tue, 21 Jan 2020 14:02:20 -0300 Subject: [PATCH 8/9] Refactoring --- app/helpers/administrate/application_helper.rb | 1 + spec/helpers/administrate/application_helper_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/helpers/administrate/application_helper.rb b/app/helpers/administrate/application_helper.rb index e11418ba6d..fa0a196761 100644 --- a/app/helpers/administrate/application_helper.rb +++ b/app/helpers/administrate/application_helper.rb @@ -30,6 +30,7 @@ def has_presence_validator?(resource_class, field_name) def validators_on(resource_class, field_name) return [] unless resource_class.respond_to?(:validators_on) + resource_class.validators_on(field_name) end diff --git a/spec/helpers/administrate/application_helper_spec.rb b/spec/helpers/administrate/application_helper_spec.rb index 9b0b22678f..657b2e4c90 100644 --- a/spec/helpers/administrate/application_helper_spec.rb +++ b/spec/helpers/administrate/application_helper_spec.rb @@ -60,12 +60,12 @@ } it "returns 'required' if field is required" do - title = page.attributes.find { |i| i.attribute == :title } + title = page.attributes.detect { |i| i.attribute == :title } expect(requireness(title)).to eq("required") end it "returns 'optional' if field is not required" do - publish_at = page.attributes.find { |i| i.attribute == :published_at } + publish_at = page.attributes.detect { |i| i.attribute == :published_at } expect(requireness(publish_at)).to eq("optional") end end From 7cf63771854b5117178b0e4b878e38b1539b8e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Tapaj=C3=B3s?= Date: Thu, 23 Jan 2020 10:01:40 -0300 Subject: [PATCH 9/9] Change block to keep project standard --- spec/helpers/administrate/application_helper_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/helpers/administrate/application_helper_spec.rb b/spec/helpers/administrate/application_helper_spec.rb index 657b2e4c90..a1c43ef9ae 100644 --- a/spec/helpers/administrate/application_helper_spec.rb +++ b/spec/helpers/administrate/application_helper_spec.rb @@ -55,9 +55,9 @@ end describe "#requireness" do - let(:page) { + let(:page) do Administrate::Page::Form.new(Blog::PostDashboard.new, Blog::Post.new) - } + end it "returns 'required' if field is required" do title = page.attributes.detect { |i| i.attribute == :title }