refine-rails 2.11.6 → 2.11.9

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/refine-stimulus.esm.js +1 -1
  3. data/app/assets/javascripts/refine-stimulus.esm.js.map +1 -1
  4. data/app/assets/javascripts/refine-stimulus.js +1 -1
  5. data/app/assets/javascripts/refine-stimulus.js.map +1 -1
  6. data/app/assets/javascripts/refine-stimulus.modern.js +1 -1
  7. data/app/assets/javascripts/refine-stimulus.modern.js.map +1 -1
  8. data/app/assets/javascripts/refine-stimulus.umd.js +1 -1
  9. data/app/assets/javascripts/refine-stimulus.umd.js.map +1 -1
  10. data/app/assets/stylesheets/index.css +104 -7
  11. data/app/assets/stylesheets/index.tailwind.css +102 -7
  12. data/app/controllers/refine/advanced_inline/criteria_controller.rb +186 -0
  13. data/app/controllers/refine/advanced_inline/stored_filters_controller.rb +84 -0
  14. data/app/controllers/refine/inline/criteria_controller.rb +0 -8
  15. data/app/javascript/controllers/fields/shoelace/tab-group-controller.js +85 -0
  16. data/app/javascript/controllers/index.js +5 -2
  17. data/app/javascript/controllers/refine/modal-controller.js +0 -1
  18. data/app/javascript/controllers/refine/popup-controller.js +1 -0
  19. data/app/models/refine/conditions/has_icon.rb +36 -0
  20. data/app/models/refine/filter.rb +1 -0
  21. data/app/views/refine/advanced_inline/criteria/_condition_list_item_card.html.erb +31 -0
  22. data/app/views/refine/advanced_inline/criteria/_form_fields.html.erb +121 -0
  23. data/app/views/refine/advanced_inline/criteria/create.turbo_stream.erb +19 -0
  24. data/app/views/refine/advanced_inline/criteria/edit.turbo_stream.erb +31 -0
  25. data/app/views/refine/advanced_inline/criteria/index.html.erb +77 -0
  26. data/app/views/refine/advanced_inline/criteria/new.turbo_stream.erb +31 -0
  27. data/app/views/refine/advanced_inline/filters/_add_first_condition_button.html.erb +19 -0
  28. data/app/views/refine/advanced_inline/filters/_and_button.html.erb +30 -0
  29. data/app/views/refine/advanced_inline/filters/_clear_button.html.erb +13 -0
  30. data/app/views/refine/advanced_inline/filters/_criterion.html.erb +22 -0
  31. data/app/views/refine/advanced_inline/filters/_group.html.erb +4 -0
  32. data/app/views/refine/advanced_inline/filters/_or_button.html.erb +29 -0
  33. data/app/views/refine/advanced_inline/filters/_or_separator.html.erb +12 -0
  34. data/app/views/refine/advanced_inline/filters/_popup.html.erb +26 -0
  35. data/app/views/refine/advanced_inline/filters/_save_button.html.erb +15 -0
  36. data/app/views/refine/advanced_inline/filters/_show.html.erb +38 -0
  37. data/app/views/refine/advanced_inline/inputs/_date_condition.html.erb +9 -0
  38. data/app/views/refine/advanced_inline/inputs/_date_condition_days.html.erb +18 -0
  39. data/app/views/refine/advanced_inline/inputs/_date_condition_range.html.erb +22 -0
  40. data/app/views/refine/advanced_inline/inputs/_date_condition_single.html.erb +9 -0
  41. data/app/views/refine/advanced_inline/inputs/_date_picker.html.erb +20 -0
  42. data/app/views/refine/advanced_inline/inputs/_numeric_condition.html.erb +23 -0
  43. data/app/views/refine/advanced_inline/inputs/_option_condition.html.erb +27 -0
  44. data/app/views/refine/advanced_inline/inputs/_text_condition.html.erb +8 -0
  45. data/app/views/refine/advanced_inline/stored_filters/find.turbo_stream.erb +19 -0
  46. data/app/views/refine/advanced_inline/stored_filters/index.html.erb +27 -0
  47. data/app/views/refine/advanced_inline/stored_filters/new.turbo_stream.erb +47 -0
  48. data/app/views/refine/inline/criteria/_condition_list_item.html.erb +0 -7
  49. data/app/views/refine/inline/filters/_add_first_condition_button.html.erb +3 -8
  50. data/app/views/refine/inline/filters/_and_button.html.erb +3 -8
  51. data/app/views/refine/inline/filters/_group.html.erb +1 -3
  52. data/app/views/refine/inline/filters/_or_button.html.erb +3 -8
  53. data/app/views/refine/inline/filters/_show.html.erb +4 -10
  54. data/config/locales/en/refine.en.yml +17 -0
  55. data/config/routes.rb +9 -1
  56. data/lib/refine/rails/version.rb +1 -1
  57. metadata +33 -5
  58. data/app/views/refine/inline/criteria/index_advanced.html.erb +0 -29
  59. data/app/views/refine/inline/filters/_modal_or_popup.html.erb +0 -35
  60. /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]
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
  }
@@ -11,7 +11,6 @@ export default class extends Controller {
11
11
  }
12
12
 
13
13
  connect() {
14
- console.log("Connecting modal controller")
15
14
  useClickOutside(this)
16
15
  }
17
16
 
@@ -29,6 +29,7 @@ export default class extends Controller {
29
29
  hide(event) {
30
30
  if (this.isOpenValue) {
31
31
  event?.preventDefault()
32
+ event?.stopPropagation()
32
33
  this.frameTarget.innerHTML = "";
33
34
  this.isOpenValue = false
34
35
  }
@@ -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
@@ -320,5 +320,6 @@ module Refine
320
320
  def clear_blueprint!
321
321
  @blueprint = []
322
322
  end
323
+
323
324
  end
324
325
  end
@@ -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 %>