refine-rails 2.11.8 → 2.11.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/refine-stimulus.esm.js +1 -1
- data/app/assets/javascripts/refine-stimulus.esm.js.map +1 -1
- data/app/assets/javascripts/refine-stimulus.js +1 -1
- data/app/assets/javascripts/refine-stimulus.js.map +1 -1
- data/app/assets/javascripts/refine-stimulus.modern.js +1 -1
- data/app/assets/javascripts/refine-stimulus.modern.js.map +1 -1
- data/app/assets/javascripts/refine-stimulus.umd.js +1 -1
- data/app/assets/javascripts/refine-stimulus.umd.js.map +1 -1
- data/app/assets/stylesheets/index.css +129 -7
- data/app/assets/stylesheets/index.tailwind.css +126 -7
- data/app/controllers/refine/advanced_inline/criteria_controller.rb +186 -0
- data/app/controllers/refine/advanced_inline/stored_filters_controller.rb +84 -0
- data/app/controllers/refine/inline/criteria_controller.rb +0 -8
- data/app/javascript/controllers/fields/shoelace/tab-group-controller.js +85 -0
- data/app/javascript/controllers/index.js +5 -2
- data/app/javascript/controllers/refine/modal-controller.js +0 -1
- data/app/javascript/controllers/refine/popup-controller.js +1 -0
- data/app/models/refine/conditions/has_icon.rb +36 -0
- data/app/models/refine/filter.rb +1 -0
- data/app/views/refine/advanced_inline/criteria/_condition_list_item_card.html.erb +31 -0
- data/app/views/refine/advanced_inline/criteria/_form_fields.html.erb +121 -0
- data/app/views/refine/advanced_inline/criteria/create.turbo_stream.erb +19 -0
- data/app/views/refine/advanced_inline/criteria/edit.turbo_stream.erb +31 -0
- data/app/views/refine/advanced_inline/criteria/index.html.erb +90 -0
- data/app/views/refine/advanced_inline/criteria/new.turbo_stream.erb +31 -0
- data/app/views/refine/advanced_inline/filters/_add_first_condition_button.html.erb +19 -0
- data/app/views/refine/advanced_inline/filters/_and_button.html.erb +30 -0
- data/app/views/refine/advanced_inline/filters/_clear_button.html.erb +13 -0
- data/app/views/refine/advanced_inline/filters/_criterion.html.erb +22 -0
- data/app/views/refine/advanced_inline/filters/_group.html.erb +4 -0
- data/app/views/refine/advanced_inline/filters/_or_button.html.erb +29 -0
- data/app/views/refine/advanced_inline/filters/_or_separator.html.erb +12 -0
- data/app/views/refine/advanced_inline/filters/_popup.html.erb +26 -0
- data/app/views/refine/advanced_inline/filters/_save_button.html.erb +15 -0
- data/app/views/refine/advanced_inline/filters/_show.html.erb +38 -0
- data/app/views/refine/advanced_inline/inputs/_date_condition.html.erb +9 -0
- data/app/views/refine/advanced_inline/inputs/_date_condition_days.html.erb +18 -0
- data/app/views/refine/advanced_inline/inputs/_date_condition_range.html.erb +22 -0
- data/app/views/refine/advanced_inline/inputs/_date_condition_single.html.erb +9 -0
- data/app/views/refine/advanced_inline/inputs/_date_picker.html.erb +20 -0
- data/app/views/refine/advanced_inline/inputs/_numeric_condition.html.erb +23 -0
- data/app/views/refine/advanced_inline/inputs/_option_condition.html.erb +27 -0
- data/app/views/refine/advanced_inline/inputs/_text_condition.html.erb +8 -0
- data/app/views/refine/advanced_inline/stored_filters/find.turbo_stream.erb +19 -0
- data/app/views/refine/advanced_inline/stored_filters/index.html.erb +28 -0
- data/app/views/refine/advanced_inline/stored_filters/new.turbo_stream.erb +47 -0
- data/app/views/refine/inline/criteria/_condition_list_item.html.erb +0 -7
- data/app/views/refine/inline/filters/_add_first_condition_button.html.erb +3 -8
- data/app/views/refine/inline/filters/_and_button.html.erb +3 -8
- data/app/views/refine/inline/filters/_group.html.erb +1 -3
- data/app/views/refine/inline/filters/_or_button.html.erb +3 -8
- data/app/views/refine/inline/filters/_show.html.erb +4 -10
- data/config/locales/en/refine.en.yml +18 -0
- data/config/routes.rb +9 -1
- data/lib/refine/rails/version.rb +1 -1
- metadata +33 -5
- data/app/views/refine/inline/criteria/index_advanced.html.erb +0 -29
- data/app/views/refine/inline/filters/_modal_or_popup.html.erb +0 -35
- /data/app/views/refine/{inline → advanced_inline}/filters/_modal.html.erb +0 -0
@@ -0,0 +1,186 @@
|
|
1
|
+
class Refine::AdvancedInline::CriteriaController < ApplicationController
|
2
|
+
layout false
|
3
|
+
before_action :set_refine_filter
|
4
|
+
# List available conditions for new criteria
|
5
|
+
# Carries position and index forward
|
6
|
+
def index
|
7
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
8
|
+
@conditions = @refine_filter.instantiated_conditions
|
9
|
+
end
|
10
|
+
|
11
|
+
# Show the form to add a new criteria
|
12
|
+
def new
|
13
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
14
|
+
respond_to do |format|
|
15
|
+
# render a turbo_stream so that we can render inputs and forms in separate areas of the page
|
16
|
+
# in case we're nested inside a form
|
17
|
+
format.turbo_stream
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Create a new criterion
|
22
|
+
def create
|
23
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
24
|
+
blueprint = @refine_filter.blueprint
|
25
|
+
|
26
|
+
Refine::Filters::BlueprintEditor
|
27
|
+
.new(@refine_filter.blueprint)
|
28
|
+
.add(
|
29
|
+
position: @criterion.position.to_i,
|
30
|
+
conjunction: @criterion.conjunction,
|
31
|
+
criterion: @criterion.to_blueprint_node
|
32
|
+
)
|
33
|
+
|
34
|
+
@error_messages = filter_error_messages(@refine_filter)
|
35
|
+
if @error_messages.none?
|
36
|
+
handle_filter_update(@refine_filter.to_stable_id)
|
37
|
+
else
|
38
|
+
respond_to do |format|
|
39
|
+
format.turbo_stream { render :new }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# show the form to edit an existing criterion
|
45
|
+
def edit
|
46
|
+
@criterion = Refine::Inline::Criterion
|
47
|
+
.groups_from_filter(@refine_filter, **criterion_params.slice(:client_id, :stable_id))
|
48
|
+
.flatten
|
49
|
+
.detect { |c| c.position.to_s == params[:id] }
|
50
|
+
|
51
|
+
@criterion.attributes = criterion_params
|
52
|
+
respond_to do |format|
|
53
|
+
# render a turbo_stream so that we can render inputs and forms in separate areas of the page
|
54
|
+
# in case we're nested inside a form
|
55
|
+
format.turbo_stream
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# update an exsiting criterion
|
60
|
+
def update
|
61
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
62
|
+
Refine::Filters::BlueprintEditor
|
63
|
+
.new(@refine_filter.blueprint)
|
64
|
+
.update(params[:id].to_i, criterion: @criterion.to_blueprint_node)
|
65
|
+
|
66
|
+
@error_messages = filter_error_messages(@refine_filter)
|
67
|
+
if @error_messages.none?
|
68
|
+
handle_filter_update(@refine_filter.to_stable_id)
|
69
|
+
else
|
70
|
+
respond_to do |format|
|
71
|
+
format.turbo_stream { render :edit }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# remove an existing criterion
|
77
|
+
def destroy
|
78
|
+
@criterion = Refine::Inline::Criterion
|
79
|
+
.groups_from_filter(@refine_filter, **criterion_params.slice(:client_id, :stable_id))
|
80
|
+
.flatten
|
81
|
+
.detect { |c| c.position.to_s == params[:id] }
|
82
|
+
|
83
|
+
Refine::Filters::BlueprintEditor
|
84
|
+
.new(@refine_filter.blueprint)
|
85
|
+
.delete(params[:id].to_i)
|
86
|
+
|
87
|
+
handle_filter_update(@refine_filter.to_stable_id)
|
88
|
+
end
|
89
|
+
|
90
|
+
def clear
|
91
|
+
@refine_filter.clear_blueprint!
|
92
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
93
|
+
handle_filter_update()
|
94
|
+
end
|
95
|
+
|
96
|
+
def merge_groups
|
97
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
98
|
+
Refine::Filters::BlueprintEditor
|
99
|
+
.new(@refine_filter.blueprint)
|
100
|
+
.change_conjunction(criterion_params[:position].to_i - 1, "and")
|
101
|
+
|
102
|
+
handle_filter_update(@refine_filter.to_stable_id)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def set_refine_filter
|
108
|
+
@refine_filter ||= Refine::Rails.configuration.stabilizer_classes[:url]
|
109
|
+
.new
|
110
|
+
.from_stable_id(id: criterion_params[:stable_id])
|
111
|
+
end
|
112
|
+
|
113
|
+
def criterion_params
|
114
|
+
params.require(:refine_inline_criterion).permit(
|
115
|
+
:stable_id,
|
116
|
+
:client_id,
|
117
|
+
:condition_id,
|
118
|
+
:position,
|
119
|
+
:conjunction,
|
120
|
+
input_attributes: [
|
121
|
+
:clause,
|
122
|
+
:date1,
|
123
|
+
:date2,
|
124
|
+
:days,
|
125
|
+
:modifier,
|
126
|
+
:selected,
|
127
|
+
:value,
|
128
|
+
:value1,
|
129
|
+
:value2,
|
130
|
+
selected: [],
|
131
|
+
count_refinement_attributes: [
|
132
|
+
:clause,
|
133
|
+
:value1,
|
134
|
+
:value2
|
135
|
+
],
|
136
|
+
date_refinement_attributes: [
|
137
|
+
:clause,
|
138
|
+
:date1,
|
139
|
+
:date2,
|
140
|
+
:days,
|
141
|
+
:modifier
|
142
|
+
]
|
143
|
+
]
|
144
|
+
)
|
145
|
+
end
|
146
|
+
|
147
|
+
# either directly redirect or emit a `filter-submit-success` event
|
148
|
+
def handle_filter_update(stable_id=nil)
|
149
|
+
# update_stable_id in url
|
150
|
+
uri = URI(request.referrer)
|
151
|
+
new_query_ar = URI.decode_www_form(String(uri.query))
|
152
|
+
new_query_ar.reject! { |(k, _v)| k == "stable_id" }
|
153
|
+
if stable_id
|
154
|
+
new_query_ar << ["stable_id", stable_id]
|
155
|
+
end
|
156
|
+
uri.query = URI.encode_www_form(new_query_ar)
|
157
|
+
|
158
|
+
respond_to do |format|
|
159
|
+
format.turbo_stream do
|
160
|
+
@refine_stable_id = stable_id
|
161
|
+
@url_for_redirect = uri
|
162
|
+
@refine_client_id = @criterion.client_id
|
163
|
+
render :create
|
164
|
+
end
|
165
|
+
format.html do
|
166
|
+
redirect_to uri.to_s
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def filter_valid?(refine_filter)
|
172
|
+
Refine::Inline::Criterion
|
173
|
+
.groups_from_filter(refine_filter, **criterion_params.slice(:client_id, :stable_id))
|
174
|
+
.flatten
|
175
|
+
.all?(&:valid?)
|
176
|
+
end
|
177
|
+
|
178
|
+
def filter_error_messages(refine_filter)
|
179
|
+
criteria = Refine::Inline::Criterion
|
180
|
+
.groups_from_filter(refine_filter, **criterion_params.slice(:client_id, :stable_id))
|
181
|
+
.flatten
|
182
|
+
|
183
|
+
criteria.each(&:validate!)
|
184
|
+
criteria.flat_map {|c| c.errors.full_messages }
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
class Refine::AdvancedInline::StoredFiltersController < ApplicationController
|
2
|
+
layout false
|
3
|
+
before_action :set_refine_filter
|
4
|
+
|
5
|
+
|
6
|
+
def index
|
7
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params)
|
8
|
+
@stored_filters = Refine::StoredFilter.where(filter_type: @refine_filter.type)
|
9
|
+
@stored_filters = instance_exec(@stored_filters, &Refine::Rails.configuration.stored_filter_scope)
|
10
|
+
end
|
11
|
+
|
12
|
+
def find
|
13
|
+
@stored_filter = Refine::StoredFilter.find_by(id: params[:id], filter_type: @refine_filter.type)
|
14
|
+
handle_filter_update @stored_filter.refine_filter.to_stable_id
|
15
|
+
end
|
16
|
+
|
17
|
+
def new
|
18
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params)
|
19
|
+
@stored_filter = Refine::StoredFilter.new(filter_type: @refine_filter.type)
|
20
|
+
respond_to do |format|
|
21
|
+
format.turbo_stream
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def create
|
26
|
+
@criterion = Refine::Inline::Criterion.new(criterion_params)
|
27
|
+
@stored_filter = Refine::StoredFilter.new(stored_filter_params.merge(
|
28
|
+
state: @refine_filter.state,
|
29
|
+
filter_type: @refine_filter.type,
|
30
|
+
**instance_exec(&Refine::Rails.configuration.custom_stored_filter_attributes)
|
31
|
+
)
|
32
|
+
)
|
33
|
+
|
34
|
+
if @stored_filter.save
|
35
|
+
handle_filter_update @stored_filter.refine_filter.to_stable_id
|
36
|
+
else
|
37
|
+
respond_to do |format|
|
38
|
+
format.turbo_stream { render :new }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def set_refine_filter
|
46
|
+
@refine_filter ||= Refine::Rails.configuration.stabilizer_classes[:url]
|
47
|
+
.new
|
48
|
+
.from_stable_id(id: criterion_params[:stable_id])
|
49
|
+
end
|
50
|
+
|
51
|
+
def criterion_params
|
52
|
+
params.require(:refine_inline_criterion).permit(
|
53
|
+
:stable_id,
|
54
|
+
:client_id,
|
55
|
+
:position,
|
56
|
+
:conjunction
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
def stored_filter_params
|
61
|
+
params.require(:refine_stored_filter).permit(:name)
|
62
|
+
end
|
63
|
+
|
64
|
+
# either directly redirect or emit a `filter-submit-success` event
|
65
|
+
def handle_filter_update stable_id
|
66
|
+
# update_stable_id in url
|
67
|
+
uri = URI(request.referrer)
|
68
|
+
new_query_ar = URI.decode_www_form(String(uri.query))
|
69
|
+
new_query_ar.reject! { |(k, _v)| k == "stable_id" }
|
70
|
+
new_query_ar << ["stable_id", stable_id]
|
71
|
+
uri.query = URI.encode_www_form(new_query_ar)
|
72
|
+
|
73
|
+
respond_to do |format|
|
74
|
+
format.turbo_stream do
|
75
|
+
@refine_stable_id = stable_id
|
76
|
+
@url_for_redirect = uri
|
77
|
+
@refine_client_id = criterion_params[:client_id]
|
78
|
+
@refine_filter = @stored_filter.refine_filter
|
79
|
+
render :find
|
80
|
+
end
|
81
|
+
format.html {redirect_to uri.to_s }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -8,14 +8,6 @@ class Refine::Inline::CriteriaController < ApplicationController
|
|
8
8
|
@conditions = @refine_filter.instantiated_conditions
|
9
9
|
end
|
10
10
|
|
11
|
-
# List available conditions for new criteria in advanced view (IE: Modal)
|
12
|
-
# Carries position and index forward
|
13
|
-
def index_advanced
|
14
|
-
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
15
|
-
@conditions = @refine_filter.instantiated_conditions
|
16
|
-
@fill_modal = params[:fill_modal] && params[:fill_modal] == "true"
|
17
|
-
end
|
18
|
-
|
19
11
|
# Show the form to add a new criteria
|
20
12
|
def new
|
21
13
|
@criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
|
@@ -0,0 +1,85 @@
|
|
1
|
+
// to be used with sl-tab-group
|
2
|
+
import { Controller } from "@hotwired/stimulus"
|
3
|
+
|
4
|
+
// This controller is used to handle the tab group component
|
5
|
+
// @see https://shoelace.style/components/tab-group
|
6
|
+
// @param keepScrollPosition [Boolean] - If true, the scroll position will be kept when changing tabs
|
7
|
+
// @usage <div data-controller="shoelace--tab-group" data-shoelace--tab-group-keep-scroll-position-value="true">
|
8
|
+
|
9
|
+
export default class extends Controller {
|
10
|
+
static values = {
|
11
|
+
keepScrollPosition: { type: Boolean, default: false },
|
12
|
+
}
|
13
|
+
|
14
|
+
connect() {
|
15
|
+
this.currentScrollYPosition = 0
|
16
|
+
this.navigateToTab = this.navigateToTab.bind(this)
|
17
|
+
this.handleTabShow = this.handleTabShow.bind(this)
|
18
|
+
|
19
|
+
this.navigateToTab()
|
20
|
+
|
21
|
+
document.addEventListener('turbo:load', this.navigateToTab)
|
22
|
+
this.element.addEventListener('sl-tab-show', this.handleTabShow)
|
23
|
+
}
|
24
|
+
|
25
|
+
disconnect() {
|
26
|
+
document.removeEventListener('turbo:load', this.navigateToTab)
|
27
|
+
this.element.removeEventListener('sl-tab-show', this.handleTabShow)
|
28
|
+
}
|
29
|
+
|
30
|
+
handleTabShow(event) {
|
31
|
+
this.setLocationHash(event)
|
32
|
+
|
33
|
+
if (this.keepScrollPositionValue) {
|
34
|
+
this.handleTabChange()
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
setLocationHash(event) {
|
39
|
+
window.location.hash = event.detail.name
|
40
|
+
}
|
41
|
+
|
42
|
+
navigateToTab() {
|
43
|
+
let hash = window.location.hash.toString()
|
44
|
+
if (hash) {
|
45
|
+
this.element.show(hash.slice(1))
|
46
|
+
} else {
|
47
|
+
/*
|
48
|
+
* Turbo doesn't currently support hashes on redirects (see https://github.com/hotwired/turbo/issues/825)
|
49
|
+
* so we've created a workaround. Pass `redirect_anchor` as a query param, and the component will convert
|
50
|
+
* it to a hash and delete the query param. e.g. `some_url?redirect_anchor=store_upsells`
|
51
|
+
*/
|
52
|
+
const params = new URLSearchParams(window.location.search)
|
53
|
+
const redirectedHashParam = params.get('redirect_anchor')
|
54
|
+
if (redirectedHashParam) {
|
55
|
+
params.delete('redirect_anchor')
|
56
|
+
let newParams = params.toString()
|
57
|
+
window.history.replaceState(
|
58
|
+
null,
|
59
|
+
'',
|
60
|
+
[window.location.pathname, newParams ? `?${newParams}` : '', '#', redirectedHashParam].join('')
|
61
|
+
)
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
handleTabChange() {
|
67
|
+
this.currentScrollYPosition = window.scrollY
|
68
|
+
}
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Programmatically reveal a sl-tab-panel via action params.
|
72
|
+
* @see Shoelace sl-tab-group show() method
|
73
|
+
* @see https://shoelace.style/components/tab-group?id=methods
|
74
|
+
*
|
75
|
+
* @param {Event} event
|
76
|
+
* @param {string} event.params.showPanel - the name attribute of the sl-tab-panel to show
|
77
|
+
* @example <button type='button' data-action="click->shoelace--tab-group#show"
|
78
|
+
* data-shoelace--tab-group-show-panel-param="mypanelname">
|
79
|
+
* @returns {void}
|
80
|
+
*/
|
81
|
+
show(event) {
|
82
|
+
const { showPanel } = event.params
|
83
|
+
this.element.show(showPanel)
|
84
|
+
}
|
85
|
+
}
|
@@ -18,6 +18,7 @@ import TurboStreamLinkController from './refine/turbo-stream-link-controller'
|
|
18
18
|
import TypeaheadListController from './refine/typeahead-list-controller'
|
19
19
|
import UpdateController from './refine/update-controller'
|
20
20
|
import DateController from './refine/date-controller'
|
21
|
+
import TabGroupController from "./fields/shoelace/tab-group-controller"
|
21
22
|
|
22
23
|
export const controllerDefinitions = [
|
23
24
|
[AddController, 'refine/add-controller.js'],
|
@@ -37,7 +38,8 @@ export const controllerDefinitions = [
|
|
37
38
|
[TurboStreamLinkController, 'refine/turbo-stream-link-controller.js'],
|
38
39
|
[TypeaheadListController, './refine/typeahead-list-controller.js'],
|
39
40
|
[UpdateController, 'refine/update-controller.js'],
|
40
|
-
[DateController, 'refine/date-controller.js']
|
41
|
+
[DateController, 'refine/date-controller.js'],
|
42
|
+
[TabGroupController, 'fields/shoelace/tab-group-controller.js']
|
41
43
|
].map(function(d) {
|
42
44
|
const key = d[1]
|
43
45
|
const controller = d[0]
|
@@ -65,5 +67,6 @@ export {
|
|
65
67
|
TurboStreamLinkController,
|
66
68
|
TypeaheadListController,
|
67
69
|
UpdateController,
|
68
|
-
DateController
|
70
|
+
DateController,
|
71
|
+
TabGroupController
|
69
72
|
}
|
@@ -7,6 +7,27 @@ module Refine::Conditions::HasIcon
|
|
7
7
|
@icon_template ||= {}
|
8
8
|
end
|
9
9
|
|
10
|
+
def category_icon_class
|
11
|
+
@category_icon_class ||= nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def category_icon_template
|
15
|
+
@category_icon_template ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def icon_container_class
|
19
|
+
@icon_container_class ||= nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def with_icon(icon_class: nil, template: {}, category_icon_class: nil, category_icon_template: {}, icon_container_class: nil)
|
23
|
+
with_icon_class(icon_class) if icon_class.present?
|
24
|
+
with_icon_template(template) if template.present?
|
25
|
+
with_category_icon_class(category_icon_class) if category_icon_class.present?
|
26
|
+
with_category_icon_template(category_icon_template) if category_icon_template.present?
|
27
|
+
with_icon_container_class(icon_container_class) if icon_container_class.present?
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
10
31
|
def with_icon_class(icon_class)
|
11
32
|
@icon_class = icon_class
|
12
33
|
self
|
@@ -17,6 +38,21 @@ module Refine::Conditions::HasIcon
|
|
17
38
|
self
|
18
39
|
end
|
19
40
|
|
41
|
+
def with_category_icon_class(icon_class)
|
42
|
+
@category_icon_class = icon_class
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def with_category_icon_template(template_path:, locals: {})
|
47
|
+
@category_icon_template = { template_path: template_path, locals: locals }
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def with_icon_container_class(icon_container_class)
|
52
|
+
@icon_container_class = icon_container_class
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
20
56
|
def has_icon?
|
21
57
|
icon_class.present? || !icon_template.empty?
|
22
58
|
end
|
data/app/models/refine/filter.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
<%
|
2
|
+
category ||= nil
|
3
|
+
|
4
|
+
data = {
|
5
|
+
controller: "refine--turbo-stream-link",
|
6
|
+
action: "refine--turbo-stream-link#visit",
|
7
|
+
refine__typeahead_list_target: "listItem",
|
8
|
+
list_item_value: condition.display,
|
9
|
+
}
|
10
|
+
if category && category.present?
|
11
|
+
data[:category] = category
|
12
|
+
end
|
13
|
+
link_class = "refine--condition-list-item refine--condition-list-card"
|
14
|
+
link_class += " refine--condition-list-card"
|
15
|
+
%>
|
16
|
+
<%= link_to(
|
17
|
+
new_refine_advanced_inline_criterion_url(@criterion.to_params.deep_merge(refine_inline_criterion: {condition_id: condition.id})),
|
18
|
+
{
|
19
|
+
class: link_class,
|
20
|
+
}.merge(data: data)) do %>
|
21
|
+
<% if condition.has_icon? %>
|
22
|
+
<% if condition.icon_class.present? %>
|
23
|
+
<div class="refine--condition-list-icon-container <%= condition.icon_container_class %>">
|
24
|
+
<i class="refine--condition-list-card-icon <%= condition.icon_class %>"></i>
|
25
|
+
</div>
|
26
|
+
<% else %>
|
27
|
+
<%= render partial: condition.icon_template[:template_path], locals: condition.icon_template[:locals] %>
|
28
|
+
<% end %>
|
29
|
+
<% end %>
|
30
|
+
<%= condition.display %>
|
31
|
+
<% end %>
|
@@ -0,0 +1,121 @@
|
|
1
|
+
<%
|
2
|
+
condition = @criterion.condition
|
3
|
+
date_refinement_condition = condition.has_date_refinement? && condition.get_date_refinement_condition
|
4
|
+
count_refinement_condition = condition.has_count_refinement? && condition.get_count_refinement_condition
|
5
|
+
condition_clause = @criterion.input.clause || condition.approved_clauses.first.id
|
6
|
+
|
7
|
+
last_clause_select = if count_refinement_condition
|
8
|
+
:count
|
9
|
+
elsif date_refinement_condition
|
10
|
+
:date
|
11
|
+
else
|
12
|
+
:criterion
|
13
|
+
end
|
14
|
+
%>
|
15
|
+
|
16
|
+
|
17
|
+
<%= form.hidden_field :stable_id, form: form_id %>
|
18
|
+
<%= form.hidden_field :client_id, form: form_id %>
|
19
|
+
<%= form.hidden_field :condition_id, form: form_id %>
|
20
|
+
<%= form.hidden_field :conjunction, form: form_id %>
|
21
|
+
<%= form.hidden_field :position, form: form_id %>
|
22
|
+
|
23
|
+
<%= form.fields :input_attributes, model: @criterion.input do |input_fields| %>
|
24
|
+
|
25
|
+
<%# Clause Select %>
|
26
|
+
<div class="refine--criterion-clause-container">
|
27
|
+
<%= input_fields.label :clause, t('.rule') %>
|
28
|
+
<%= input_fields.collection_select :clause,
|
29
|
+
@criterion.condition.approved_clauses,
|
30
|
+
:id,
|
31
|
+
:display,
|
32
|
+
{selected: condition_clause},
|
33
|
+
class: "refine--select refine--clause-select",
|
34
|
+
data: {action: "change->refine--criterion-form#refresh"},
|
35
|
+
form: form_id
|
36
|
+
%>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
|
40
|
+
<%# Input Value %>
|
41
|
+
<% unless ['st', 'nst'].include? condition_clause %>
|
42
|
+
<div class="refine--separator"></div>
|
43
|
+
<%= render @criterion.input_partial, criterion: @criterion, form: form, input_fields: input_fields, form_id: form_id %>
|
44
|
+
<% end %>
|
45
|
+
|
46
|
+
<% if last_clause_select == :criterion %>
|
47
|
+
<div class="refine--separator"></div>
|
48
|
+
<%= form.button t('global.buttons.apply'), class: "refine--apply-button", type: "submit", form: form_id %>
|
49
|
+
<% end %>
|
50
|
+
|
51
|
+
<%# Date Refinement %>
|
52
|
+
<% if @criterion.condition.has_date_refinement? %>
|
53
|
+
<div class="refine--separator"></div>
|
54
|
+
<div class="refine--criterion-clause-container refine--date-refinement-clause-container">
|
55
|
+
<%= input_fields.label :clause, date_refinement_condition.display, class: "refine--block" %>
|
56
|
+
<%= input_fields.fields :date_refinement_attributes, model: @criterion.input.date_refinement do |date_fields| %>
|
57
|
+
<%= date_fields.label :clause, t('.rule') %>
|
58
|
+
<%= date_fields.collection_select :clause,
|
59
|
+
date_refinement_condition.approved_clauses,
|
60
|
+
:id,
|
61
|
+
:display,
|
62
|
+
{},
|
63
|
+
class: "refine--select refine--clause-select",
|
64
|
+
data: {action: "change->refine--criterion-form#refresh"},
|
65
|
+
form: form_id
|
66
|
+
%>
|
67
|
+
</div>
|
68
|
+
<div class="refine--refinement-input-container">
|
69
|
+
<% unless ['st', 'nst'].include? @criterion.input.date_refinement.clause %>
|
70
|
+
<%= render "refine/advanced_inline/inputs/date_condition", criterion: @criterion, form: form, input_fields: date_fields, form_id: form_id %>
|
71
|
+
<% end %>
|
72
|
+
</div>
|
73
|
+
<% end %>
|
74
|
+
<% if last_clause_select == :date %>
|
75
|
+
<%= form.button t('global.buttons.apply'), class: "refine--apply-button", type: "submit", form: form_id %>
|
76
|
+
<% end %>
|
77
|
+
<% end %>
|
78
|
+
|
79
|
+
<%# Count Refinement %>
|
80
|
+
<% if count_refinement_condition %>
|
81
|
+
<label><%= @criterion.condition.get_count_refinement_condition.display %></label>
|
82
|
+
<%= input_fields.fields :count_refinement_attributes, model: @criterion.input.count_refinement do |count_fields| %>
|
83
|
+
<div class="refine--criterion-clause-container">
|
84
|
+
<%= count_fields.collection_select :clause,
|
85
|
+
count_refinement_condition.approved_clauses,
|
86
|
+
:id,
|
87
|
+
:display,
|
88
|
+
{},
|
89
|
+
class: "refine--clause-select",
|
90
|
+
data: {action: "change->refine--criterion-form#refresh"}
|
91
|
+
%>
|
92
|
+
</div>
|
93
|
+
|
94
|
+
<% unless ['st', 'nst'].include? @criterion.input.count_refinement.clause %>
|
95
|
+
<%= render "refine/advanced_inline/inputs/numeric_condition", criterion: @criterion, form: form, input_fields: count_fields, form_id: form_id %>
|
96
|
+
<% end %>
|
97
|
+
|
98
|
+
<div class="refine--criterion-clause-container">
|
99
|
+
<%= count.label :clause, t('.rule') %>
|
100
|
+
<%= count.collection_select :clause,
|
101
|
+
@criterion.condition.approved_clauses,
|
102
|
+
:id,
|
103
|
+
:display,
|
104
|
+
{},
|
105
|
+
class: "refine--select refine--clause-select",
|
106
|
+
data: {action: "change->refine--criterion-form#refresh"},
|
107
|
+
form: form_id
|
108
|
+
%>
|
109
|
+
<% if last_clause_select == :count %>
|
110
|
+
<%= form.button t('global.buttons.apply'), class: "refine--apply-button", type: "submit", form: form_id %>
|
111
|
+
<% end %>
|
112
|
+
</div>
|
113
|
+
<% end %>
|
114
|
+
<% end %>
|
115
|
+
<% end %>
|
116
|
+
|
117
|
+
<% @error_messages&.each do |msg| %>
|
118
|
+
<p class="refine-criterion-error">
|
119
|
+
<%= msg %>
|
120
|
+
</p>
|
121
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%= turbo_stream.append_all "body" do %>
|
2
|
+
<script>
|
3
|
+
(function() {
|
4
|
+
const event = new CustomEvent("filter-submit-success", {
|
5
|
+
bubbles: true,
|
6
|
+
detail: {
|
7
|
+
stableId: <%= @refine_stable_id.to_json.html_safe %>,
|
8
|
+
url: <%= @url_for_redirect.to_json.html_safe %>,
|
9
|
+
formId: <%= @refine_client_id.to_json.html_safe %>
|
10
|
+
}
|
11
|
+
})
|
12
|
+
document
|
13
|
+
.getElementById(<%= "refine-inline-filter-#{@refine_client_id}".to_json.html_safe %>)
|
14
|
+
.dispatchEvent(event)
|
15
|
+
})()
|
16
|
+
</script>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<%= turbo_stream.replace "refine-inline-filter-#{@refine_client_id}", partial: "refine/advanced_inline/filters/show", locals: {} %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<% form_id = dom_id(@criterion, :form) %>
|
2
|
+
|
3
|
+
<%= turbo_stream.update dom_id(@criterion) do %>
|
4
|
+
<%= turbo_frame_tag dom_id(@criterion), class: "refine--inline-popup", data: {refine__popup_target: "frame"} do %>
|
5
|
+
<%= tag.div class: "refine--criterion-fields",
|
6
|
+
data: {
|
7
|
+
controller: "refine--criterion-form",
|
8
|
+
refine__criterion_form_url_value: edit_refine_advanced_inline_criterion_url(
|
9
|
+
@criterion.position, @criterion.to_params
|
10
|
+
),
|
11
|
+
refine__criterion_form_form_id_value: form_id
|
12
|
+
} do
|
13
|
+
%>
|
14
|
+
<%= fields model: @criterion do |form| %>
|
15
|
+
<%= render "form_fields", form: form, form_id: form_id %>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
<%= turbo_stream.append_all "body" do %>
|
25
|
+
<%= form_with url: refine_advanced_inline_criterion_path(@criterion.position),
|
26
|
+
method: :put,
|
27
|
+
id: form_id,
|
28
|
+
html: { autocomplete: "off" },
|
29
|
+
data: {controller: "refine--turbo-stream-form", action: "submit->refine--turbo-stream-form#submit"}
|
30
|
+
%>
|
31
|
+
<% end %>
|