Skip to content

Commit 8b23aba

Browse files
goosyspablobm
andauthored
Introduce partial search similar to Rails (#2467)
Introduce partial search similar to Rails. Models that have an inheritance relationship often use similar or almost identical partials. Being able to reuse partials not only makes it easier to create new fields, but also improves maintainability. Developers who want to provide alternative templates can override `local_partial_prefixes`. --------- Co-authored-by: Pablo Brasero <pablo@pablobm.com>
1 parent e1dede0 commit 8b23aba

File tree

19 files changed

+86
-84
lines changed

19 files changed

+86
-84
lines changed

app/helpers/administrate/application_helper.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ def application_title
99

1010
def render_field(field, locals = {})
1111
locals[:field] = field
12-
render locals: locals, partial: field.to_partial_path
12+
if (prefix = find_partial_prefix(field))
13+
render locals: locals, partial: "#{prefix}/#{field.page}"
14+
end
15+
end
16+
17+
def find_partial_prefix(field)
18+
field.partial_prefixes.detect do |prefix|
19+
lookup_context.template_exists?(field.page, [prefix], true)
20+
end
1321
end
1422

1523
def requireness(field)

lib/administrate/field/base.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ def self.permitted_attribute(attr, _options = nil)
3636
attr
3737
end
3838

39+
def self.partial_prefixes
40+
@partial_prefixes ||=
41+
if superclass.respond_to?(:partial_prefixes)
42+
local_partial_prefixes + superclass.partial_prefixes
43+
else
44+
local_partial_prefixes
45+
end
46+
end
47+
48+
def self.local_partial_prefixes
49+
["fields/#{field_type}"]
50+
end
51+
3952
def initialize(attribute, data, page, options = {})
4053
@attribute = attribute
4154
@page = page
@@ -70,8 +83,8 @@ def read_value(data)
7083
end
7184
end
7285

73-
def to_partial_path
74-
"/fields/#{self.class.field_type}/#{page}"
86+
def partial_prefixes
87+
self.class.partial_prefixes
7588
end
7689

7790
def required?

spec/administrate/views/fields/has_one/_show_spec.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
name: "simple_string_field",
3636
truncate: "string value",
3737
html_class: "string",
38-
to_partial_path: "fields/string/index"
38+
page: "index",
39+
partial_prefixes: ["fields/string"]
3940
)
4041

4142
nested_show_page_for_has_one = instance_double(
@@ -123,7 +124,8 @@ def render_field
123124
data: nested_collection,
124125
html_class: "has-many",
125126
name: "payments",
126-
to_partial_path: "fields/has_many/index"
127+
page: "index",
128+
partial_prefixes: ["fields/has_many"]
127129
)
128130

129131
nested_show_page_for_nested_has_one = instance_double(
@@ -141,7 +143,8 @@ def render_field
141143
linkable?: true,
142144
nested_show: nested_show_page_for_nested_has_one,
143145
html_class: "has-one",
144-
to_partial_path: "fields/has_one/show",
146+
page: "show",
147+
partial_prefixes: ["fields/has_one"],
145148
display_associated_resource: "Resource Doubly Nested with HasOne",
146149
name: "page"
147150
)

spec/example_app/app/views/fields/has_many_variant/_form.html.erb

Lines changed: 0 additions & 13 deletions
This file was deleted.

spec/example_app/app/views/fields/has_many_variant/_index.html.erb

Lines changed: 0 additions & 6 deletions
This file was deleted.

spec/example_app/app/views/fields/has_many_variant/_show.html.erb

Lines changed: 0 additions & 23 deletions
This file was deleted.

spec/helpers/administrate/application_helper_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
require "rails_helper"
2+
require "administrate/field/has_many"
3+
require "administrate/field/has_many_variant"
24

35
RSpec.describe Administrate::ApplicationHelper do
6+
describe "#find_partial_prefix" do
7+
context "when the field has a partial" do
8+
it "returns the prefix" do
9+
field = Administrate::Field::HasMany.new(:name, "hello", :show)
10+
expect(find_partial_prefix(field)).to eq("fields/has_many")
11+
end
12+
end
13+
14+
context "when the field does not have a partial and the superclass does" do
15+
it "returns the superclass prefix" do
16+
field = Administrate::Field::HasManyVariant.new(:name, "hello", :show)
17+
expect(find_partial_prefix(field)).to eq("fields/has_many")
18+
end
19+
end
20+
end
21+
422
describe "#display_resource_name" do
523
it "defaults to the plural of the model name" do
624
displayed = display_resource_name(:customer)

spec/lib/fields/belongs_to_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@
2626
end
2727
end
2828

29-
describe "#to_partial_path" do
29+
describe "#partial_prefixes" do
3030
it "returns a partial based on the page being rendered" do
3131
page = :show
3232
owner = double
3333
field = Administrate::Field::BelongsTo.new(:owner, owner, page)
3434

35-
path = field.to_partial_path
35+
prefixes = field.partial_prefixes
3636

37-
expect(path).to eq("/fields/belongs_to/#{page}")
37+
expect(prefixes).to eq(["fields/belongs_to", "fields/associative", "fields/base"])
3838
end
3939
end
4040

spec/lib/fields/boolean_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
describe Administrate::Field::Boolean do
66
include FieldMatchers
77

8-
describe "#to_partial_path" do
8+
describe "#partial_prefixes" do
99
it "returns a partial based on the page being rendered" do
1010
page = :show
1111
boolean = double
1212
field = Administrate::Field::Boolean.new(:price, boolean, page)
1313

14-
path = field.to_partial_path
14+
prefixes = field.partial_prefixes
1515

16-
expect(path).to eq("/fields/boolean/#{page}")
16+
expect(prefixes).to eq(["fields/boolean", "fields/base"])
1717
end
1818
end
1919

spec/lib/fields/email_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
require "administrate/field/email"
22

33
describe Administrate::Field::Email do
4-
describe "#to_partial_path" do
4+
describe "#partial_prefixes" do
55
it "returns a partial based on the page being rendered" do
66
page = :show
77
field = Administrate::Field::Email.new(:email, "foo@example.com", page)
88

9-
path = field.to_partial_path
9+
prefixes = field.partial_prefixes
1010

11-
expect(path).to eq("/fields/email/#{page}")
11+
expect(prefixes).to eq(["fields/email", "fields/base"])
1212
end
1313
end
1414
end

0 commit comments

Comments
 (0)