Skip to content

Commit d756627

Browse files
committed
Introduce partial search similar to Rails
1 parent f8d5d33 commit d756627

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 ||= begin
41+
return local_partial_prefixes if superclass == Administrate::Field::Base
42+
43+
local_partial_prefixes + superclass._partial_prefixes
44+
end
45+
end
46+
47+
def self.local_partial_prefixes
48+
["fields/#{field_type}"]
49+
end
50+
private_class_method :local_partial_prefixes
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"])
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"])
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"])
1212
end
1313
end
1414
end

0 commit comments

Comments
 (0)