Skip to content

Commit 4e5bdd6

Browse files
committed
feat: WIP
1 parent 9ca11ff commit 4e5bdd6

17 files changed

Lines changed: 167 additions & 229 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<% content_for(:stylesheet) do %>
2+
<style>
3+
.main-content__header {
4+
display: grid;
5+
}
6+
.main-content__header > div {
7+
text-align: right;
8+
}
9+
.main-content__header > .ransack-search {
10+
order: 2;
11+
text-align: initial;
12+
}
13+
14+
.ransack-search form {
15+
grid-column-start: 1;
16+
grid-column-end: 3;
17+
18+
display: grid;
19+
grid-auto-flow: column;
20+
grid-gap: 4px;
21+
}
22+
23+
.ransack-search .filter > * {
24+
margin-bottom: 4px;
25+
}
26+
27+
.ransack-search .ransack-controls {
28+
text-align: right;
29+
margin: auto 0;
30+
}
31+
32+
.ransack-search .selectize-input {
33+
min-height: 39px;
34+
}
35+
</style>
36+
<% end %>
37+
38+
<% render 'administrate_ransack/javascript' %>
39+
40+
<div class="ransack-search">
41+
<% form_path = [namespace, @ransack_results] %>
42+
<%= search_form_for(form_path, html: { 'data-administrate-ransack-filters': '1' }) do |f| %>
43+
<% @fields.each do |field, field_conf| %>
44+
<% type, param, options, label = field_conf %>
45+
<div class="filter filter-<%= field.to_s.parameterize %> <%= type %>">
46+
<% attrs = { form: f, model: @model, field: field, label: label, type: type, param: param, options: options } %>
47+
<%= render "administrate_ransack/components/field_#{type}", attrs %>
48+
</div>
49+
<% end %>
50+
51+
<div class="ransack-controls">
52+
<button type="submit" class="button--alt">search</button>
53+
</div>
54+
<% end %>
55+
</div>

app/views/administrate_ransack/_filters.html.erb

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

app/views/administrate_ransack/_javascript.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
// selectize setup
1212
$(function () {
13-
$('.filters select').selectize();
13+
$('.ransack-search select').selectize();
1414
});
1515
});
1616
</script>
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
<% field_key = model.ransackable_scopes.include?(field) ? field : "#{field}_eq" %>
21
<% values = [[t('administrate_ransack.filters.no'), false], [t('administrate_ransack.filters.yes'), true]] %>
32

43
<%= form.label(label, class: 'filter-label') %>
5-
<%= form.select(field_key, values, include_blank: true) %>
4+
<%= form.select(param, values, include_blank: true) %>
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
<% field_key = model.ransackable_scopes.include?(field) ? field : "#{field}_eq" %>
2-
31
<%= form.label(label, class: 'filter-label') %>
4-
<%= form.number_field(field_key) %>
2+
<%= form.number_field(param) %>
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
<% field_key = model.ransackable_scopes.include?(field) ? field : "#{field}_cont" %>
2-
31
<%= form.label(label, class: 'filter-label') %>
4-
<%= form.search_field(field_key) %>
2+
<%= form.search_field(param) %>

lib/administrate_ransack/filters.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
module AdministrateRansack
44
FILTERS = {
5-
'Administrate::Field::BelongsTo' => 'field_belongs_to',
6-
'Administrate::Field::Boolean' => 'field_boolean',
7-
'Administrate::Field::Date' => 'field_date',
8-
'Administrate::Field::DateTime' => 'field_date',
9-
'Administrate::Field::Email' => 'field_string',
10-
'Administrate::Field::HasMany' => 'field_has_many',
11-
'Administrate::Field::Number' => 'field_number',
12-
'Administrate::Field::Select' => 'field_select',
13-
'Administrate::Field::String' => 'field_string',
14-
'Administrate::Field::Text' => 'field_string'
5+
'Administrate::Field::BelongsTo' => :belongs_to,
6+
'Administrate::Field::Boolean' => :boolean,
7+
'Administrate::Field::Date' => :date,
8+
'Administrate::Field::DateTime' => :date,
9+
'Administrate::Field::Email' => :string,
10+
'Administrate::Field::HasMany' => :has_many,
11+
'Administrate::Field::Number' => :number,
12+
'Administrate::Field::Select' => :select,
13+
'Administrate::Field::String' => :string,
14+
'Administrate::Field::Text' => :string
1515
}.freeze
1616
end

lib/administrate_ransack/searchable.rb

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
module AdministrateRansack
66
module Searchable
77
def filter_resources(resources, search_term:)
8-
options = respond_to?(:ransack_options, true) ? ransack_options : {}
9-
distinct = respond_to?(:ransack_result_distinct, true) ? ransack_result_distinct : true
10-
query = params[:q] || parse_search_term(search_term)
11-
@ransack_results = prepare_search(resource_collection: resources, query_params: query, options: options)
12-
@ransack_results.result(distinct: distinct)
8+
query = params[:q] || parse_search_term(search_term, model: resources.klass)
9+
@ransack_results = prepare_search(resource_collection: resources, query_params: query)
10+
setup_view_attrs(dashboard:, model: resources.klass)
11+
prepare_result(@ransack_results)
1312
end
1413

1514
# ref => https://github.com/thoughtbot/administrate/blob/v0.18.0/app/helpers/administrate/application_helper.rb#L72-L78
@@ -18,7 +17,7 @@ def sanitized_order_params(page, current_field_name)
1817
association_params = collection_names.map do |assoc_name|
1918
{ assoc_name => %i[order direction page per_page] }
2019
end
21-
params.permit(:search, :id, :page, :per_page, association_params, q: {})
20+
params.permit(:search, :id, :page, :per_page, :utf8, :_page, association_params, q: {})
2221
end
2322

2423
class << self
@@ -29,12 +28,18 @@ def prepended(base)
2928

3029
private
3130

32-
def parse_search_term(search_term)
33-
terms = search_term.split.map { _1.split(':') }.select { |k, v| v.present? && k.present? }
34-
terms.to_h.transform_keys { "#{_1}_cont" }
31+
def parse_search_term(search_term, model:)
32+
return {} if search_term.blank?
33+
34+
terms_regex = /(\w+):"([^"]+)"|(\w+):'([^']+)'|(\w+):(\w+)/
35+
terms = search_term.scan(terms_regex).map(&:compact)
36+
terms.to_h.transform_keys do |key|
37+
model.ransackable_attributes.include?(key) ? "#{key}_cont" : key
38+
end
3539
end
3640

37-
def prepare_search(resource_collection:, query_params:, options:)
41+
def prepare_search(resource_collection:, query_params:)
42+
options = respond_to?(:ransack_options, true) ? ransack_options : {}
3843
resource_collection.ransack(query_params, **options)
3944
rescue ArgumentError => e
4045
if defined?(Ransack::InvalidSearchError) && e.is_a?(Ransack::InvalidSearchError) # rubocop:disable Style/GuardClause
@@ -52,5 +57,42 @@ def ransack_invalid_search_error(error)
5257
flash.now[:alert] = I18n.t('administrate_ransack.errors.invalid_search', default: error.message)
5358
end
5459
end
60+
61+
def setup_view_attrs(dashboard:, model:)
62+
@model = model
63+
@fields = prepare_fields_for(dashboard:)
64+
end
65+
66+
def prepare_fields_for(dashboard:)
67+
dashboard_class = dashboard.class
68+
fields = defined?(dashboard_class::RANSACK_SEARCH) ? dashboard_class::RANSACK_SEARCH : {}
69+
ret = fields.to_h do |field, conf|
70+
[field, eval_type(dashboard:, field:, conf:)]
71+
end
72+
end
73+
74+
def eval_type(dashboard:, field:, conf:)
75+
param = "#{field}_eq"
76+
type =
77+
if conf.blank?
78+
field_type = dashboard.attribute_type_for(field).to_s
79+
AdministrateRansack::FILTERS[field_type]
80+
elsif conf.is_a?(Hash)
81+
type = (conf[:type] || :string).to_sym
82+
param = "#{field}_cont" if type == :string
83+
param = field.to_s if conf[:scope]
84+
param = conf[:param] if conf[:param].present?
85+
type
86+
else
87+
type = conf
88+
end
89+
90+
[type, param, {}, field.to_s]
91+
end
92+
93+
def prepare_result(ransack_results)
94+
distinct = respond_to?(:ransack_result_distinct, true) ? ransack_result_distinct : true
95+
ransack_results.result(distinct: distinct)
96+
end
5597
end
5698
end

spec/dummy/app/dashboards/post_dashboard.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,20 @@ class PostDashboard < Administrate::BaseDashboard
9999
# def display_resource(post)
100100
# "Post ##{post.id}"
101101
# end
102+
103+
RANSACK_SEARCH = {
104+
title: {
105+
type: :string,
106+
# param: :title_cont
107+
},
108+
published: :boolean,
109+
position: :number,
110+
by_category: {
111+
type: :string,
112+
scope: true
113+
},
114+
dt: :date,
115+
}.freeze
116+
117+
# RANSACK_SEARCH = %i[title published dt].freeze
102118
end

spec/dummy/app/views/admin/application/_javascript.html.erb

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

0 commit comments

Comments
 (0)