administrate 0.16.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/administrate/application_controller.rb +18 -5
  3. data/app/views/administrate/application/_collection.html.erb +18 -22
  4. data/app/views/administrate/application/_collection_header_actions.html.erb +4 -0
  5. data/app/views/administrate/application/_collection_item_actions.html.erb +17 -0
  6. data/app/views/administrate/application/_flashes.html.erb +1 -0
  7. data/app/views/administrate/application/_form.html.erb +1 -1
  8. data/app/views/administrate/application/_icons.html.erb +1 -1
  9. data/app/views/administrate/application/_index_header.html.erb +28 -0
  10. data/app/views/administrate/application/index.html.erb +8 -28
  11. data/app/views/fields/belongs_to/_index.html.erb +1 -1
  12. data/app/views/fields/belongs_to/_show.html.erb +1 -1
  13. data/app/views/fields/select/_form.html.erb +4 -2
  14. data/app/views/fields/time/_index.html.erb +1 -1
  15. data/app/views/fields/time/_show.html.erb +1 -1
  16. data/config/locales/administrate.zh-TW.yml +1 -1
  17. data/docs/customizing_controller_actions.md +19 -1
  18. data/docs/customizing_dashboards.md +36 -4
  19. data/docs/extending_administrate.md +5 -5
  20. data/docs/getting_started.md +1 -1
  21. data/lib/administrate/base_dashboard.rb +16 -2
  22. data/lib/administrate/field/select.rb +4 -0
  23. data/lib/administrate/field/time.rb +11 -0
  24. data/lib/administrate/page/form.rb +9 -2
  25. data/lib/administrate/search.rb +21 -17
  26. data/lib/administrate/version.rb +1 -1
  27. data/lib/generators/administrate/dashboard/templates/controller.rb.erb +2 -2
  28. data/lib/generators/administrate/install/templates/application_controller.rb.erb +1 -1
  29. metadata +6 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4919291c5352f8cfb68e629292b4cd85f89d1e8912bf75e6702ecee682383f7
4
- data.tar.gz: 48212e43cd940b32a40f1d86c93f181cb808fbcfaa839459292ec258460c8b97
3
+ metadata.gz: 6a099c28c8a74491759229e6fe82de763f25b9ff59473d5c70b00d38675e3498
4
+ data.tar.gz: c24140b9e1bc63eb9ecd5f38cd0cfd3d3c0f125a81370df1dd6663af66121baa
5
5
  SHA512:
6
- metadata.gz: 839bab4d2832921f6a6f7fcc06cbc8f8a5e18017e9de81d7d0c5d22360567ba9b9a427a68223c5b6fe600cb07dbb176404476a51fecb56f07f559a1461da0c4c
7
- data.tar.gz: 7b356066b5c0dbe9d82bdc65eefe6563111e30592b827b94fdd03196f01a29e167fb5d22cee9ec907c7e57c29913f12ba75a922aef7f8172a0130b964527c2d8
6
+ metadata.gz: 8ada94532afa210a359eece24f042fdb7de549cdb6bb94507c044f85df7b26cfbd5855202de2016255d635d2448dcba303d91eac4dc41c896f30e52f95073345
7
+ data.tar.gz: 98e115c8c3acfe7dc5cab3a3055b5f06dfa5661f9d2eb135c528b474cbe36e6fb51b36a8c88489860a9fda200758ce37f4d60375705f0e0234af4dc2805e75ff
@@ -6,7 +6,7 @@ module Administrate
6
6
  authorize_resource(resource_class)
7
7
  search_term = params[:search].to_s.strip
8
8
  resources = Administrate::Search.new(scoped_resource,
9
- dashboard_class,
9
+ dashboard,
10
10
  search_term).run
11
11
  resources = apply_collection_includes(resources)
12
12
  resources = order.apply(resources)
@@ -47,7 +47,7 @@ module Administrate
47
47
 
48
48
  if resource.save
49
49
  redirect_to(
50
- [namespace, resource],
50
+ after_resource_created_path(resource),
51
51
  notice: translate_with_resource("create.success"),
52
52
  )
53
53
  else
@@ -60,7 +60,7 @@ module Administrate
60
60
  def update
61
61
  if requested_resource.update(resource_params)
62
62
  redirect_to(
63
- [namespace, requested_resource],
63
+ after_resource_updated_path(requested_resource),
64
64
  notice: translate_with_resource("update.success"),
65
65
  )
66
66
  else
@@ -76,14 +76,27 @@ module Administrate
76
76
  else
77
77
  flash[:error] = requested_resource.errors.full_messages.join("<br/>")
78
78
  end
79
- redirect_to action: :index
79
+ redirect_to after_resource_destroyed_path(requested_resource)
80
80
  end
81
81
 
82
82
  private
83
83
 
84
+ def after_resource_destroyed_path(_requested_resource)
85
+ { action: :index }
86
+ end
87
+
88
+ def after_resource_created_path(requested_resource)
89
+ [namespace, requested_resource]
90
+ end
91
+
92
+ def after_resource_updated_path(requested_resource)
93
+ [namespace, requested_resource]
94
+ end
95
+
84
96
  helper_method :nav_link_state
85
97
  def nav_link_state(resource)
86
- resource_name.to_s.pluralize == resource.to_s ? :active : :inactive
98
+ underscore_resource = resource.to_s.split("/").join("__")
99
+ resource_name.to_s.pluralize == underscore_resource ? :active : :inactive
87
100
  end
88
101
 
89
102
  helper_method :valid_action?
@@ -24,7 +24,8 @@ to display a collection of resources in an HTML table.
24
24
  <% collection_presenter.attribute_types.each do |attr_name, attr_type| %>
25
25
  <th class="cell-label
26
26
  cell-label--<%= attr_type.html_class %>
27
- cell-label--<%= collection_presenter.ordered_html_class(attr_name) %>"
27
+ cell-label--<%= collection_presenter.ordered_html_class(attr_name) %>
28
+ cell-label--<%= "#{resource_name}_#{attr_name}" %>"
28
29
  scope="col"
29
30
  role="columnheader"
30
31
  aria-sort="<%= sort_order(collection_presenter.ordered_html_class(attr_name)) %>">
@@ -45,10 +46,13 @@ to display a collection of resources in an HTML table.
45
46
  <% end %>
46
47
  </th>
47
48
  <% end %>
48
- <% [valid_action?(:edit, collection_presenter.resource_name),
49
- valid_action?(:destroy, collection_presenter.resource_name)].count(true).times do %>
50
- <th scope="col"></th>
51
- <% end %>
49
+ <%= render(
50
+ "collection_header_actions",
51
+ collection_presenter: collection_presenter,
52
+ page: page,
53
+ resources: resources,
54
+ table_title: "page-title"
55
+ ) %>
52
56
  </tr>
53
57
  </thead>
54
58
 
@@ -74,23 +78,15 @@ to display a collection of resources in an HTML table.
74
78
  </td>
75
79
  <% end %>
76
80
 
77
- <% if valid_action? :edit, collection_presenter.resource_name %>
78
- <td><%= link_to(
79
- t("administrate.actions.edit"),
80
- [:edit, namespace, resource],
81
- class: "action-edit",
82
- ) if show_action? :edit, resource%></td>
83
- <% end %>
84
-
85
- <% if valid_action? :destroy, collection_presenter.resource_name %>
86
- <td><%= link_to(
87
- t("administrate.actions.destroy"),
88
- [namespace, resource],
89
- class: "text-color-red",
90
- method: :delete,
91
- data: { confirm: t("administrate.actions.confirm") }
92
- ) if show_action? :destroy, resource %></td>
93
- <% end %>
81
+ <%= render(
82
+ "collection_item_actions",
83
+ collection_presenter: collection_presenter,
84
+ collection_field_name: collection_field_name,
85
+ page: page,
86
+ namespace: namespace,
87
+ resource: resource,
88
+ table_title: "page-title"
89
+ ) %>
94
90
  </tr>
95
91
  <% end %>
96
92
  </tbody>
@@ -0,0 +1,4 @@
1
+ <% [valid_action?(:edit, collection_presenter.resource_name),
2
+ valid_action?(:destroy, collection_presenter.resource_name)].count(true).times do %>
3
+ <th scope="col"></th>
4
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <% if valid_action?(:edit, collection_presenter.resource_name) %>
2
+ <td><%= link_to(
3
+ t("administrate.actions.edit"),
4
+ [:edit, namespace, resource],
5
+ class: "action-edit",
6
+ ) if show_action?(:edit, resource) %></td>
7
+ <% end %>
8
+
9
+ <% if valid_action?(:destroy, collection_presenter.resource_name) %>
10
+ <td><%= link_to(
11
+ t("administrate.actions.destroy"),
12
+ [namespace, resource],
13
+ class: "text-color-red",
14
+ method: :delete,
15
+ data: { confirm: t("administrate.actions.confirm") }
16
+ ) if show_action?(:destroy, resource) %></td>
17
+ <% end %>
@@ -14,6 +14,7 @@ This partial renders flash messages on every page.
14
14
  <% if flash.any? %>
15
15
  <div class="flashes">
16
16
  <% flash.each do |key, value| -%>
17
+ <% next unless value.respond_to?(:html_safe) %>
17
18
  <div class="flash flash-<%= key %>"><%= value.html_safe %></div>
18
19
  <% end -%>
19
20
  </div>
@@ -33,7 +33,7 @@ and renders all form fields for a resource's editable attributes.
33
33
  </div>
34
34
  <% end %>
35
35
 
36
- <% page.attributes.each do |attribute| -%>
36
+ <% page.attributes(controller.action_name).each do |attribute| -%>
37
37
  <div class="field-unit field-unit--<%= attribute.html_class %> field-unit--<%= requireness(attribute) %>">
38
38
  <%= render_field attribute, f: f %>
39
39
  </div>
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
1
+ <svg hidden xmlns="http://www.w3.org/2000/svg">
2
2
  <symbol id="icon-cancel" viewBox="0 0 48 48">
3
3
  <path fill-rule="evenodd" d="M24 19.757l-8.485-8.485c-.784-.783-2.047-.782-2.827 0l-1.417 1.416c-.777.777-.78 2.046.002 2.827L19.757 24l-8.485 8.485c-.783.784-.782 2.047 0 2.827l1.416 1.417c.777.777 2.046.78 2.827-.002L24 28.243l8.485 8.485c.784.783 2.047.782 2.827 0l1.417-1.416c.777-.777.78-2.046-.002-2.827L28.243 24l8.485-8.485c.783-.784.782-2.047 0-2.827l-1.416-1.417c-.777-.777-2.046-.78-2.827.002L24 19.757zM24 47c12.703 0 23-10.297 23-23S36.703 1 24 1 1 11.297 1 24s10.297 23 23 23z" />
4
4
  </symbol>
@@ -0,0 +1,28 @@
1
+ <% content_for(:title) do %>
2
+ <%= display_resource_name(page.resource_name) %>
3
+ <% end %>
4
+
5
+ <header class="main-content__header" role="banner">
6
+ <h1 class="main-content__page-title" id="page-title">
7
+ <%= content_for(:title) %>
8
+ </h1>
9
+
10
+ <% if show_search_bar %>
11
+ <%= render(
12
+ "search",
13
+ search_term: search_term,
14
+ resource_name: display_resource_name(page.resource_name)
15
+ ) %>
16
+ <% end %>
17
+
18
+ <div>
19
+ <%= link_to(
20
+ t(
21
+ "administrate.actions.new_resource",
22
+ name: display_resource_name(page.resource_name, singular: true).downcase
23
+ ),
24
+ [:new, namespace, page.resource_path.to_sym],
25
+ class: "button",
26
+ ) if valid_action?(:new) && show_action?(:new, new_resource) %>
27
+ </div>
28
+ </header>
@@ -23,34 +23,14 @@ It renders the `_table` partial to display details about the resources.
23
23
  [1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Collection
24
24
  %>
25
25
 
26
- <% content_for(:title) do %>
27
- <%= display_resource_name(page.resource_name) %>
28
- <% end %>
29
-
30
- <header class="main-content__header" role="banner">
31
- <h1 class="main-content__page-title" id="page-title">
32
- <%= content_for(:title) %>
33
- </h1>
34
-
35
- <% if show_search_bar %>
36
- <%= render(
37
- "search",
38
- search_term: search_term,
39
- resource_name: display_resource_name(page.resource_name)
40
- ) %>
41
- <% end %>
42
-
43
- <div>
44
- <%= link_to(
45
- t(
46
- "administrate.actions.new_resource",
47
- name: display_resource_name(page.resource_name, singular: true).downcase
48
- ),
49
- [:new, namespace, page.resource_path.to_sym],
50
- class: "button",
51
- ) if valid_action?(:new) && show_action?(:new, new_resource) %>
52
- </div>
53
- </header>
26
+ <%=
27
+ render("index_header",
28
+ resources: resources,
29
+ search_term: search_term,
30
+ page: page,
31
+ show_search_bar: show_search_bar,
32
+ )
33
+ %>
54
34
 
55
35
  <section class="main-content__body main-content__body--flush">
56
36
  <%= render(
@@ -16,7 +16,7 @@ By default, the relationship is rendered as a link to the associated object.
16
16
  %>
17
17
 
18
18
  <% if field.data %>
19
- <% if valid_action?(:show, field.associated_class) %>
19
+ <% if valid_action?(:show, field.associated_class) && show_action?(:show, field.associated_class) %>
20
20
  <%= link_to(
21
21
  field.display_associated_resource,
22
22
  [namespace, field.data],
@@ -16,7 +16,7 @@ By default, the relationship is rendered as a link to the associated object.
16
16
  %>
17
17
 
18
18
  <% if field.data %>
19
- <% if valid_action?(:show, field.associated_class) %>
19
+ <% if valid_action?(:show, field.associated_class) && show_action?(:show, field.associated_class) %>
20
20
  <%= link_to(
21
21
  field.display_associated_resource,
22
22
  [namespace, field.data],
@@ -27,7 +27,8 @@ to be displayed on a resource's edit form page.
27
27
  :last,
28
28
  :first,
29
29
  field.data,
30
- )
30
+ ),
31
+ include_blank: field.include_blank_option
31
32
  ) %>
32
33
  <% else %>
33
34
  <%= f.select(
@@ -37,7 +38,8 @@ to be displayed on a resource's edit form page.
37
38
  :to_s,
38
39
  :to_s,
39
40
  field.data,
40
- )
41
+ ),
42
+ include_blank: field.include_blank_option
41
43
  ) %>
42
44
  <% end %>
43
45
  </div>
@@ -15,5 +15,5 @@ By default, the attribute is rendered as a text tag.
15
15
  %>
16
16
 
17
17
  <% if field.data %>
18
- <%= field.data.strftime("%I:%M%p").to_s %>
18
+ <%= field.time %>
19
19
  <% end %>
@@ -15,5 +15,5 @@ By default, the attribute is rendered as a text tag.
15
15
  %>
16
16
 
17
17
  <% if field.data %>
18
- <%= field.data.strftime("%I:%M%p").to_s %>
18
+ <%= field.time %>
19
19
  <% end %>
@@ -24,7 +24,7 @@ zh-TW:
24
24
  error: 錯誤
25
25
  errors: "%{pluralized_errors} 導致此 %{resource_name} 不能被儲存:"
26
26
  navigation:
27
- back_to_app: 返回应用
27
+ back_to_app: 返回首頁
28
28
  search:
29
29
  clear: 清除搜尋
30
30
  label: 搜尋 %{resource}
@@ -69,4 +69,22 @@ end
69
69
  def default_sorting_direction
70
70
  :desc
71
71
  end
72
- ```
72
+ ```
73
+
74
+ ## Customizing Redirects after actions
75
+
76
+ To set custom redirects after the actions `create`, `update` and `destroy` you can override `after_resource_created_path`, `after_resource_updated_path` or `after_resource_destroyed_path` like this:
77
+
78
+ ```ruby
79
+ def after_resource_destroyed_path(_requested_resource)
80
+ { action: :index, controller: :some_other_resource }
81
+ end
82
+
83
+ def after_resource_created_path(requested_resource)
84
+ [namespace, requested_resource.some_other_resource]
85
+ end
86
+
87
+ def after_resource_updated_path(requested_resource)
88
+ [namespace, requested_resource.some_other_resource]
89
+ end
90
+ ```
@@ -8,9 +8,9 @@ edit the dashboard file generated by the installation generator.
8
8
  By default, the file will look something like this:
9
9
 
10
10
  ```ruby
11
- require "administrate/dashboard/base"
11
+ require "administrate/base_dashboard"
12
12
 
13
- class CustomerDashboard < Administrate::Dashboard::Base
13
+ class CustomerDashboard < Administrate::BaseDashboard
14
14
  ATTRIBUTE_TYPES = {
15
15
  id: Field::Number,
16
16
  name: Field::String,
@@ -183,9 +183,9 @@ Or, to display a distance in kilometers, using a space as the delimiter:
183
183
  distance: Field::Number.with_options(
184
184
  suffix: " km",
185
185
  decimals: 2,
186
- format: {
186
+ format: {
187
187
  formatter: :number_to_delimited,
188
- formatter_options: {
188
+ formatter_options: {
189
189
  delimiter: ' ',
190
190
  },
191
191
  },
@@ -223,6 +223,9 @@ an array or an object responding to `:call`. Defaults to `[]`.
223
223
  `:searchable` - Specify if the attribute should be considered when searching.
224
224
  Default is `true`.
225
225
 
226
+ `:include_blank` - Specifies if the select element to be rendered should include
227
+ blank option. Default is `false`.
228
+
226
229
  **Field::String**
227
230
 
228
231
  `:searchable` - Specify if the attribute should be considered when searching.
@@ -326,3 +329,32 @@ COLLECTION_FILTERS = {
326
329
  inactive: ->(resources) { resources.inactive }
327
330
  }
328
331
  ```
332
+
333
+ You can also define a filter with parameters:
334
+
335
+ ```ruby
336
+ COLLECTION_FILTERS = {
337
+ state: ->(resources, attr) { resources.where(state: attr) }
338
+ }
339
+ ```
340
+
341
+ You can now search your resource with 'state:open' and your
342
+ collection filter Proc will be called with with attr = open.
343
+
344
+ ## Form Attributes
345
+
346
+ You can define different attributes for new/create or edit/update actions:
347
+
348
+ ```ruby
349
+ FORM_ATTRIBUTES_NEW = [
350
+ :name,
351
+ :email
352
+ ]
353
+ FORM_ATTRIBUTES_EDIT = [
354
+ :name,
355
+ :email,
356
+ :orders
357
+ ]
358
+ ```
359
+
360
+ Or for custom action with constant name `"FORM_ATTRIBUTES_#{action.upcase}"`
@@ -5,13 +5,13 @@ title: Extending Administrate
5
5
  Apart from the configuration described in these pages, it is possible to
6
6
  extend Administrate's capabilities with the use of plugins. There are a
7
7
  number of plugins available, many of which can be found at [RubyGems.org].
8
- At the time of writing, these appear to be the most popular ones:
8
+ These are some popular examples:
9
9
 
10
10
  1. [ActiveStorage support](https://github.com/Dreamersoul/administrate-field-active_storage)
11
- 2. [Password field](https://github.com/valiot/administrate-field-password)
12
- 3. [Enum field](https://github.com/Valiot/administrate-field-enum)
13
- 4. [Nested has-many forms](https://github.com/nickcharlton/administrate-field-nested_has_many)
14
- 5. [Belongs-to with Ajax search](https://github.com/fishbrain/administrate-field-belongs_to_search)
11
+ 2. [Enum field](https://github.com/Valiot/administrate-field-enum)
12
+ 3. [Nested has-many forms](https://github.com/nickcharlton/administrate-field-nested_has_many)
13
+ 4. [Belongs-to with Ajax search](https://github.com/fishbrain/administrate-field-belongs_to_search)
14
+ 5. [JSONb field plugin for Administrate](https://github.com/codica2/administrate-field-jsonb/)
15
15
 
16
16
  See many more at https://rubygems.org/gems/administrate/reverse_dependencies.
17
17
 
@@ -3,7 +3,7 @@ title: Getting Started
3
3
  ---
4
4
 
5
5
  Administrate is released as a Ruby gem, and can be installed on Rails
6
- applications version 5.0 or greater. We support Ruby 2.4 and up.
6
+ applications version 5.0 or greater. We support Ruby 2.6 and up.
7
7
 
8
8
  First, add the following to your Gemfile:
9
9
 
@@ -50,8 +50,16 @@ module Administrate
50
50
  attribute_types.keys
51
51
  end
52
52
 
53
- def form_attributes
54
- self.class::FORM_ATTRIBUTES
53
+ def form_attributes(action = nil)
54
+ specific_form_attributes_for(action) || self.class::FORM_ATTRIBUTES
55
+ end
56
+
57
+ def specific_form_attributes_for(action)
58
+ return unless action
59
+
60
+ cname = "FORM_ATTRIBUTES_#{action.upcase}"
61
+
62
+ self.class.const_get(cname) if self.class.const_defined?(cname)
55
63
  end
56
64
 
57
65
  def permitted_attributes
@@ -71,6 +79,12 @@ module Administrate
71
79
  self.class::COLLECTION_ATTRIBUTES
72
80
  end
73
81
 
82
+ def search_attributes
83
+ attribute_types.keys.select do |attribute|
84
+ attribute_types[attribute].searchable?
85
+ end
86
+ end
87
+
74
88
  def display_resource(resource)
75
89
  "#{resource.class} ##{resource.id}"
76
90
  end
@@ -11,6 +11,10 @@ module Administrate
11
11
  collection
12
12
  end
13
13
 
14
+ def include_blank_option
15
+ options.fetch(:include_blank, false)
16
+ end
17
+
14
18
  private
15
19
 
16
20
  def collection
@@ -3,6 +3,17 @@ require_relative "base"
3
3
  module Administrate
4
4
  module Field
5
5
  class Time < Base
6
+ def time
7
+ return I18n.localize(data, format: format) if options[:format]
8
+
9
+ data.strftime("%I:%M%p")
10
+ end
11
+
12
+ private
13
+
14
+ def format
15
+ options[:format]
16
+ end
6
17
  end
7
18
  end
8
19
  end
@@ -10,8 +10,15 @@ module Administrate
10
10
 
11
11
  attr_reader :resource
12
12
 
13
- def attributes
14
- dashboard.form_attributes.map do |attribute|
13
+ def attributes(action = nil)
14
+ action =
15
+ case action
16
+ when "update" then "edit"
17
+ when "create" then "new"
18
+ else action
19
+ end
20
+
21
+ dashboard.form_attributes(action).map do |attribute|
15
22
  attribute_field(dashboard, resource, attribute, :form)
16
23
  end
17
24
  end
@@ -4,14 +4,15 @@ require "active_support/core_ext/object/blank"
4
4
  module Administrate
5
5
  class Search
6
6
  class Query
7
- attr_reader :filters
7
+ attr_reader :filters, :valid_filters
8
8
 
9
9
  def blank?
10
10
  terms.blank? && filters.empty?
11
11
  end
12
12
 
13
- def initialize(original_query)
13
+ def initialize(original_query, valid_filters = nil)
14
14
  @original_query = original_query
15
+ @valid_filters = valid_filters
15
16
  @filters, @terms = parse_query(original_query)
16
17
  end
17
18
 
@@ -30,7 +31,7 @@ module Administrate
30
31
  private
31
32
 
32
33
  def filter?(word)
33
- word.match?(/^\w+:$/)
34
+ valid_filters&.any? { |filter| word.match?(/^#{filter}:\w*$/) }
34
35
  end
35
36
 
36
37
  def parse_query(query)
@@ -38,7 +39,7 @@ module Administrate
38
39
  terms = []
39
40
  query.to_s.split.each do |word|
40
41
  if filter?(word)
41
- filters << word.split(":").first
42
+ filters << word
42
43
  else
43
44
  terms << word
44
45
  end
@@ -47,10 +48,10 @@ module Administrate
47
48
  end
48
49
  end
49
50
 
50
- def initialize(scoped_resource, dashboard_class, term)
51
- @dashboard_class = dashboard_class
51
+ def initialize(scoped_resource, dashboard, term)
52
+ @dashboard = dashboard
52
53
  @scoped_resource = scoped_resource
53
- @query = Query.new(term)
54
+ @query = Query.new(term, valid_filters.keys)
54
55
  end
55
56
 
56
57
  def run
@@ -65,15 +66,20 @@ module Administrate
65
66
 
66
67
  private
67
68
 
68
- def apply_filter(filter, resources)
69
+ def apply_filter(filter, filter_param, resources)
69
70
  return resources unless filter
70
- filter.call(resources)
71
+ if filter.parameters.size == 1
72
+ filter.call(resources)
73
+ else
74
+ filter.call(resources, filter_param)
75
+ end
71
76
  end
72
77
 
73
78
  def filter_results(resources)
74
- query.filters.each do |filter_name|
79
+ query.filters.each do |filter_query|
80
+ filter_name, filter_param = filter_query.split(":")
75
81
  filter = valid_filters[filter_name]
76
- resources = apply_filter(filter, resources)
82
+ resources = apply_filter(filter, filter_param, resources)
77
83
  end
78
84
  resources
79
85
  end
@@ -102,9 +108,7 @@ module Administrate
102
108
  end
103
109
 
104
110
  def search_attributes
105
- attribute_types.keys.select do |attribute|
106
- attribute_types[attribute].searchable?
107
- end
111
+ @dashboard.search_attributes
108
112
  end
109
113
 
110
114
  def search_results(resources)
@@ -114,15 +118,15 @@ module Administrate
114
118
  end
115
119
 
116
120
  def valid_filters
117
- if @dashboard_class.const_defined?(:COLLECTION_FILTERS)
118
- @dashboard_class.const_get(:COLLECTION_FILTERS).stringify_keys
121
+ if @dashboard.class.const_defined?(:COLLECTION_FILTERS)
122
+ @dashboard.class.const_get(:COLLECTION_FILTERS).stringify_keys
119
123
  else
120
124
  {}
121
125
  end
122
126
  end
123
127
 
124
128
  def attribute_types
125
- @dashboard_class::ATTRIBUTE_TYPES
129
+ @dashboard.class.const_get(:ATTRIBUTE_TYPES)
126
130
  end
127
131
 
128
132
  def query_table_name(attr)
@@ -1,3 +1,3 @@
1
1
  module Administrate
2
- VERSION = "0.16.0".freeze
2
+ VERSION = "0.17.0".freeze
3
3
  end
@@ -1,5 +1,5 @@
1
- module <%= namespace.to_s.classify %>
2
- class <%= class_name.pluralize %>Controller < <%= namespace.to_s.classify %>::ApplicationController
1
+ module <%= namespace.to_s.camelize %>
2
+ class <%= class_name.pluralize %>Controller < <%= namespace.to_s.camelize %>::ApplicationController
3
3
  # Overwrite any of the RESTful controller actions to implement custom behavior
4
4
  # For example, you may want to send an email after a foo is updated.
5
5
  #
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # If you want to add pagination or other controller-level concerns,
6
6
  # you're free to overwrite the RESTful controller actions.
7
- module <%= namespace.classify %>
7
+ module <%= namespace.camelize %>
8
8
  class ApplicationController < Administrate::ApplicationController
9
9
  before_action :authenticate_admin
10
10
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: administrate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Charlton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-05-06 00:00:00.000000000 Z
12
+ date: 2022-02-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -137,20 +137,6 @@ dependencies:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0.6'
140
- - !ruby/object:Gem::Dependency
141
- name: rspec-rails
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- version: '0'
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - ">="
152
- - !ruby/object:Gem::Version
153
- version: '0'
154
140
  description: |
155
141
  Administrate is heavily inspired by projects like Rails Admin and ActiveAdmin,
156
142
  but aims to provide a better user experience for site admins,
@@ -203,9 +189,12 @@ files:
203
189
  - app/controllers/concerns/administrate/punditize.rb
204
190
  - app/helpers/administrate/application_helper.rb
205
191
  - app/views/administrate/application/_collection.html.erb
192
+ - app/views/administrate/application/_collection_header_actions.html.erb
193
+ - app/views/administrate/application/_collection_item_actions.html.erb
206
194
  - app/views/administrate/application/_flashes.html.erb
207
195
  - app/views/administrate/application/_form.html.erb
208
196
  - app/views/administrate/application/_icons.html.erb
197
+ - app/views/administrate/application/_index_header.html.erb
209
198
  - app/views/administrate/application/_javascript.html.erb
210
199
  - app/views/administrate/application/_navigation.html.erb
211
200
  - app/views/administrate/application/_search.html.erb
@@ -381,7 +370,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
381
370
  - !ruby/object:Gem::Version
382
371
  version: '0'
383
372
  requirements: []
384
- rubygems_version: 3.1.4
373
+ rubygems_version: 3.1.6
385
374
  signing_key:
386
375
  specification_version: 4
387
376
  summary: A Rails engine for creating super-flexible admin dashboards