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.
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 +129 -7
  11. data/app/assets/stylesheets/index.tailwind.css +126 -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 +90 -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 +28 -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 +18 -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,90 @@
1
+ <%
2
+ # a hash mapping Category => [array, of, conditions], sorted by category
3
+ categorized_conditions = @conditions
4
+ .group_by {|c| c.meta[:category].presence}
5
+ .sort_by do |(category, _conditions)|
6
+ if @refine_filter.has_category_ordering?
7
+ @refine_filter.category_order.index(category) || Float::INFINITY
8
+ else
9
+ category.to_s.downcase
10
+ end
11
+ end
12
+ .to_h
13
+
14
+ recommended_conditions = @conditions
15
+ .select { |c| c.meta[:recommended] }
16
+ .sort_by {|recommended| recommended.to_s.downcase }
17
+
18
+ # an array of uncategorized conditions
19
+ uncategorized_conditions = categorized_conditions.delete(nil)
20
+ dialog_class = "sl-dialog refine--inline-modal-container"
21
+ %>
22
+
23
+ <%= turbo_frame_tag @criterion do %>
24
+ <sl-dialog open class="<%= dialog_class %>" no-header data-controller="refine--typeahead-list" >
25
+
26
+ <div class="dialog__header-actions refine--modal-header">
27
+ <h2 part="title" class="dialog__title refine--header-title" id="title">
28
+ <slot name="label"><%= t(".title") %></slot>
29
+ </h2>
30
+ <div part="header-actions" class="refine--modal-header-actions ">
31
+ <slot name="header-actions"></slot>
32
+ <div class="refine--filter-condition-search" >
33
+ <div class="absolute inset-y-0 left-0 pl-3 pr-2 flex items-center pointer-events-none" aria-hidden="true">
34
+ <i class="text-coolGray-600 dark:text-coolGray-200 fa-regular fa-magnifying-glass" ></i>
35
+ </div>
36
+ <input type="text" class="input input--search" placeholder="<%= t(".search_attributes") %>" data-search-target="filterProperties" data-action="refine--typeahead-list#filter" />
37
+ </div>
38
+ <sl-icon-button part="close-button" exportparts="base:close-button__base refine--modal-close" class="dialog__close" name="x-lg" library="system" label="Close" data-action="click->refine--modal#close"></sl-icon-button>
39
+ </div>
40
+ </div>
41
+ <sl-tab-group>
42
+
43
+ <sl-tab slot="nav" panel="filter_attributes">
44
+ <i class="fa fa-filter"></i>
45
+ <span class="pl-2"><%= t(".filter_attributes_tab_name") %></span>
46
+ </sl-tab>
47
+
48
+ <sl-tab slot="nav" panel="saved_filters">
49
+ <i class="fa fa-floppy-disks"></i>
50
+ <span class="pl-2"><%= t(".filter_saved_filters_tab_name") %></span>
51
+ </sl-tab>
52
+
53
+ <sl-tab-panel name="filter_attributes" class="refine--advanced-condition-select">
54
+ <% if uncategorized_conditions&.any? %>
55
+ <div class="refine--advanced-condition-select-group">
56
+ <% uncategorized_conditions.each do |condition| %>
57
+ <%= render partial: "condition_list_item_card", locals: {condition: condition } %>
58
+ <% end %>
59
+ </div>
60
+ <% end %>
61
+
62
+ <% if recommended_conditions.any? %>
63
+ <b data-refine--typeahead-list-target="recommended" class="refine--advanced-condition-category-header"><%= t('.recommended') %></b>
64
+ <div class="refine--advanced-condition-select-group">
65
+ <% recommended_conditions.each do |condition| %>
66
+ <%= render partial: "condition_list_item_card", locals: {condition: condition } %>
67
+ <% end %>
68
+ </div>
69
+ <% end %>
70
+
71
+ <% categorized_conditions.each do |(category, conditions)| %>
72
+ <b data-refine--typeahead-list-target="category" class="refine--advanced-condition-category-header"><%= category %></b>
73
+ <div class="refine--advanced-condition-select-group">
74
+ <% conditions.each do |condition| %>
75
+ <%= render partial: "condition_list_item_card", locals: {condition: condition, category: category } %>
76
+ <% end %>
77
+ </div>
78
+ <% end %>
79
+ </sl-tab-panel>
80
+
81
+ <sl-tab-panel name="saved_filters" class="refine--advanced-condition-select">
82
+ <%= turbo_frame_tag dom_id(@criterion, :load), src: refine_advanced_inline_stored_filters_path(@criterion.to_params), loading: :lazy do %>
83
+ <div class="flex items-center justify-center p-9">
84
+ <%= sl_component(:spinner, class: "sl-spinner--medium") %>
85
+ </div>
86
+ <% end %>
87
+ </sl-tab-panel>
88
+ </sl-tab-group>
89
+ </sl-dialog>
90
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <% form_id = dom_id(@criterion, :form) %>
2
+
3
+ <% puts "In New Turbo Stream" %>
4
+ <%= turbo_stream.update dom_id(@criterion) do %>
5
+ <%= render "refine/advanced_inline/filters/popup",
6
+ frame_id: dom_id(@criterion), is_open: true do
7
+ %>
8
+ <%= tag.div class: "refine--inline-popup refine--criterion-fields",
9
+ data: {
10
+ controller: "refine--criterion-form",
11
+ refine__criterion_form_url_value: new_refine_advanced_inline_criterion_url(
12
+ @criterion.to_params),
13
+ refine__criterion_form_form_id_value: form_id
14
+ } do
15
+ %>
16
+ <%= fields model: @criterion do |form| %>
17
+ <%= render "form_fields", form: form, conjunction: @conjunction, position: @position, form_id: form_id %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
22
+
23
+ <%# The actual form tag is appended to the end of the body html. Inputs are attached using the `form` attribute. This allows the query builder to be placed inside an outer form on the page. %>
24
+ <%= turbo_stream.append_all "body" do %>
25
+ <%= form_with url: refine_advanced_inline_criteria_path,
26
+ method: :post,
27
+ id: form_id,
28
+ html: { autocomplete: "off" },
29
+ data: {controller: "refine--turbo-stream-form", action: "submit->refine--turbo-stream-form#submit"} %>
30
+ <% end %>
31
+
@@ -0,0 +1,19 @@
1
+ <%
2
+ criterion = Refine::Inline::Criterion.new(
3
+ stable_id: @refine_filter.to_stable_id,
4
+ refine_filter: @refine_filter,
5
+ client_id: @refine_client_id,
6
+ conjunction: "and",
7
+ position: position
8
+ )
9
+ %>
10
+
11
+ <%= render "refine/advanced_inline/filters/modal",
12
+ frame_id: dom_id(criterion),
13
+ src: refine_advanced_inline_criteria_path(criterion.to_params) do
14
+ %>
15
+ <button class="refine--add-condition-button refine--add-first-condition-button" href="#" data-action="click->refine--modal#open" type="button">
16
+ <span><%= t(".filter") %></span>
17
+ <span class="icon material-icons-outlined refine--icon-sm">add</span>
18
+ </button>
19
+ <% end %>
@@ -0,0 +1,30 @@
1
+ <%
2
+ criterion = Refine::Inline::Criterion.new(
3
+ stable_id: @refine_filter.to_stable_id,
4
+ refine_filter: @refine_filter,
5
+ client_id: @refine_client_id,
6
+ conjunction: "and",
7
+ position: position
8
+ )
9
+ %>
10
+
11
+ <% if @refine_filter.criteria_limit_reached? %>
12
+ <button disabled class="refine--add-condition-button refine--group-last-item refine--condition-pill-end" type="button" title="<%= t(".criteria_limit", criteria_limit: @refine_filter.criteria_limit) %>">
13
+ <% if show_label %>
14
+ <span class="refine--add-button-label"><%= t("refine.inline.filters.and_button.condition") %></span>
15
+ <% end %>
16
+ <span class="icon material-icons-outlined refine--icon-sm">add</span>
17
+ </button>
18
+ <% else %>
19
+ <%= render "refine/advanced_inline/filters/modal",
20
+ frame_id: dom_id(criterion),
21
+ src: refine_advanced_inline_criteria_path(criterion.to_params) do
22
+ %>
23
+ <button class="refine--add-condition-button refine--group-last-item refine--condition-pill-end" type="button" data-action="click->refine--modal#open">
24
+ <% if show_label %>
25
+ <span class="refine--add-button-label"><%= t("refine.inline.filters.and_button.condition") %></span>
26
+ <% end %>
27
+ <span class="icon material-icons-outlined refine--icon-sm">add</span>
28
+ </button>
29
+ <% end %>
30
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%
2
+ criterion = Refine::Inline::Criterion.new(
3
+ stable_id: @refine_filter.to_stable_id,
4
+ client_id: @refine_client_id,
5
+ )
6
+ %>
7
+
8
+ <%= link_to clear_refine_advanced_inline_criteria_path(criterion.to_params), method: :post,
9
+ class: "refine--clear-filter-link", data: {turbo_stream: true, turbo_method: :post} do %>
10
+ <span class="material-icons-outlined refine--icon-sm">clear</span>
11
+ <span class="refine--clear-filter-link-label"><%= t('refine.inline.filters.clear_filter') %></span>
12
+ <% end %>
13
+
@@ -0,0 +1,22 @@
1
+ <%# Filter Pill partial %>
2
+
3
+ <%= render "refine/advanced_inline/filters/popup",
4
+ frame_id: dom_id(criterion) do
5
+ %>
6
+
7
+ <div class="refine--condition-pill-wrapper">
8
+ <div class="refine--condition-pill">
9
+ <%= link_to refine_advanced_inline_criterion_path(criterion.position, criterion.to_params), class: "refine--remove-condition", data: {turbo_method: :delete, controller: "refine--turbo-stream-link", action: "refine--turbo-stream-link#visit"} do %>
10
+ <span class="material-icons-outlined refine--icon-sm">clear</span>
11
+ <% end %>
12
+ <%= link_to edit_refine_advanced_inline_criterion_path(criterion.position, criterion.to_params), class:"refine--condition-pill-button", data: {controller: "refine--turbo-stream-link", action: "refine--turbo-stream-link#visit refine--popup#show"} do %>
13
+ <div class="refine--condition-pill-name"><%= criterion.condition_display %></div>
14
+ <div class="refine--condition-value-clause"><%= criterion.clause_display %></div>
15
+ <div class="refine--condition-value-self" title="<%= criterion.human_readable_value %>" data-controller="tooltip" data-tooltip-content-value="<%= criterion.human_readable_value %>">
16
+ <%= criterion.human_readable_value %>
17
+ </div>
18
+ <% end %>
19
+ </div>
20
+ </div>
21
+
22
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <% group.each.with_index do |criterion, i| %>
2
+ <%= render "refine/advanced_inline/filters/criterion", criterion: criterion, placement: i, size: group.length %>
3
+ <% end %>
4
+ <%= render "refine/advanced_inline/filters/and_button", position: group.last.position + 1, show_label: (group_count < 2 && condition_count < 2) %>
@@ -0,0 +1,29 @@
1
+ <%
2
+ criterion = Refine::Inline::Criterion.new(
3
+ stable_id: @refine_filter.to_stable_id,
4
+ refine_filter: @refine_filter,
5
+ client_id: @refine_client_id,
6
+ conjunction: "or",
7
+ position: position
8
+ )
9
+ %>
10
+
11
+ <% if @refine_filter.criteria_limit_reached? %>
12
+ <div class="refine--add-group-wrapper">
13
+ <button disabled class="refine--add-group-button" type="button" title="<%= t(".criteria_limit", criteria_limit: @refine_filter.criteria_limit) %>">
14
+ <span class="refine--add-group-button-label"><%= t(".group") %></span>
15
+ </button>
16
+ </div>
17
+ <% else %>
18
+
19
+ <%= render "refine/advanced_inline/filters/modal",
20
+ frame_id: dom_id(criterion),
21
+ src: refine_advanced_inline_criteria_path(criterion.to_params) do
22
+ %>
23
+ <div class="refine--add-group-wrapper">
24
+ <button class="refine--add-group-button" type="button" data-action="click->refine--modal#open">
25
+ <span class="refine--add-group-button-label"><%= t(".group") %></span>
26
+ </button>
27
+ </div>
28
+ <% end %>
29
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <% group_position ||= 0 %>
2
+
3
+ <% unless group_position == 0 %>
4
+ <div class="refine--group-join-stack">
5
+ <div class="refine--group-join">
6
+ <%= t("refine.inline.filters.or") %>
7
+ <%= link_to merge_groups_refine_advanced_inline_criteria_path(group.first.to_params), class: "refine--remove-group", data: {turbo_method: :post, controller: "refine--turbo-stream-link", action: "refine--turbo-stream-link#visit"} do %>
8
+ <span class="material-icons-outlined refine--icon-sm">clear</span>
9
+ <% end %>
10
+ </div>
11
+ </div>
12
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <%#
2
+ Generic partial for placing a button that will load popup content via hotwire.
3
+ Required params:
4
+ - frame_id (the DOM ID of the turbo frame)
5
+
6
+ Optional class:
7
+ - src (the URL to load popup content from)
8
+ - container_class (class attribute of the wrapper div. Defaults to "refine--inline-popup-container")
9
+ - frame_class (class attribute of the turbo frame. Defaults to "refine--inline-popup")
10
+
11
+ somewhere in your yield be sure to include a `data-action="click->refine--popup#show"` to trigger the the popup
12
+
13
+ Popup can be hidden with `data-action="click->refine--popup#hide"`
14
+ %>
15
+
16
+ <%
17
+ src ||= ""
18
+ container_class ||= "refine--inline-popup-container"
19
+ frame_class ||= "refine--inline-popup"
20
+ is_open ||= false
21
+ %>
22
+
23
+ <%= tag.div class: container_class, data: {controller: "refine--popup", refine__popup_src_value: src, refine__is_open_value: is_open } do %>
24
+ <%= yield %>
25
+ <%= turbo_frame_tag frame_id, class: frame_class, data: {refine__popup_target: "frame"} %>
26
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <%
2
+ criterion = Refine::Inline::Criterion.new(
3
+ stable_id: @refine_filter.to_stable_id,
4
+ client_id: @refine_client_id,
5
+ )
6
+ %>
7
+
8
+ <%= turbo_frame_tag dom_id(criterion, :save) do %>
9
+ <%= link_to new_refine_advanced_inline_stored_filter_path(criterion.to_params),
10
+ class: "refine--save-filter-link", data: {turbo_stream: true} do %>
11
+ <span class="material-icons-outlined refine--icon-sm">save</span>
12
+ <span class="refine--save-filter-link-label"><%= t('refine.inline.filters.save_filter') %></span>
13
+ <% end %>
14
+ <% end %>
15
+
@@ -0,0 +1,38 @@
1
+ <%
2
+ groups = Refine::Inline::Criterion.groups_from_filter(@refine_filter, client_id: @refine_client_id, stable_id: @refine_stable_id)
3
+
4
+ root_data = (defined?(data) && data) || {}
5
+
6
+ main_row_class = class_names "refine--filter-row" => true,
7
+ "refine--has-many-groups" => groups.many?
8
+ %>
9
+
10
+ <%= tag.div class: "refine--filter-wrapper", id: "refine-inline-filter-#{@refine_client_id}", data: root_data do %>
11
+ <%= tag.div class: main_row_class do %>
12
+ <% if @refine_filter.blueprint.empty? %>
13
+ <%= render "refine/advanced_inline/filters/add_first_condition_button", position: 0, btn_class: "refine--add-first-condition-btn" %>
14
+ <% else %>
15
+ <div class="refine--groups-wrapper">
16
+ <% groups.each.with_index do |group, i| %>
17
+ <%= render "refine/advanced_inline/filters/or_separator", group: group, group_position: i %>
18
+ <%= render "refine/advanced_inline/filters/group", group: group, group_count: groups.count, condition_count: group.count %>
19
+ <% if i == groups.length - 1 %>
20
+ <%= render "refine/advanced_inline/filters/or_button", position: @refine_filter.blueprint.length %>
21
+ <% end %>
22
+ <% end %>
23
+
24
+ </div>
25
+ <% end %>
26
+ <% if @refine_filter.blueprint&.any? %>
27
+ <div class="refine--filter-control-group">
28
+ <%= render "refine/advanced_inline/filters/clear_button" %>
29
+ <%= render "refine/advanced_inline/filters/save_button" %>
30
+ </div>
31
+ <% end %>
32
+ <% end %>
33
+
34
+ <% end %>
35
+
36
+
37
+
38
+
@@ -0,0 +1,9 @@
1
+ <% if input_fields.object.clause.in? ["exct", "gt", "lt"] %>
2
+ <%= render "refine/inline/inputs/date_condition_days", input_fields: input_fields, criterion: criterion, form_id: form_id %>
3
+ <% elsif input_fields.object.clause.in? ["btwn", "nbtwn"] %>
4
+ <%= render "refine/inline/inputs/date_condition_range", input_fields: input_fields, criterion: criterion, form_id: form_id %>
5
+ <% elsif input_fields.object.clause.in? ['st', 'nst'] %>
6
+ <!-- render nothing -->
7
+ <% else %>
8
+ <%= render "refine/inline/inputs/date_condition_single", input_fields: input_fields, criterion: criterion, form_id: form_id %>
9
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <div class="refine--date-condition-days-container">
2
+ <%= input_fields.label :days, t(".number_of_days"), class: "sr-only" %>
3
+ <%= input_fields.text_field :days,
4
+ class: "refine--input",
5
+ placeholder: criterion.condition.display.downcase,
6
+ form: form_id
7
+ %>
8
+ </div>
9
+ <div class="refine--date-condition-days-modifier-container">
10
+ <%= input_fields.collection_select :modifier,
11
+ Refine::Inline::Criteria::Input::MODIFIERS,
12
+ :first,
13
+ :last,
14
+ {},
15
+ class: "refine--select",
16
+ form: form_id
17
+ %>
18
+ </div>
@@ -0,0 +1,22 @@
1
+ <%= tag.div class: "refine--date-condition-first-date-container-btwn" do %>
2
+ <%= render "refine/inline/inputs/date_picker",
3
+ input_fields: input_fields,
4
+ attribute: :date1,
5
+ value: input_fields.object.date1,
6
+ label: "#{criterion.condition.display.downcase} (#{t('.min')})",
7
+ form_id: form_id
8
+ %>
9
+
10
+ <div class="refine--date-condition-and"><%= t(".and") %></div>
11
+
12
+ <div class="refine--date-condition-second-date-container">
13
+ <%= render "refine/inline/inputs/date_picker",
14
+ input_fields: input_fields,
15
+ attribute: :date2,
16
+ value: input_fields.object.date2,
17
+ label: "#{criterion.condition.display.downcase} (#{t('.max')})",
18
+ form_id: form_id
19
+ %>
20
+ </div>
21
+ <% end %>
22
+
@@ -0,0 +1,9 @@
1
+ <%= tag.div class: "refine--date-condition-first-date-container" do %>
2
+ <%= render "refine/inline/inputs/date_picker",
3
+ input_fields: input_fields,
4
+ attribute: :date1,
5
+ value: input_fields.object.date1,
6
+ label: criterion.condition.display.downcase,
7
+ form_id: form_id
8
+ %>
9
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <div
2
+ data-controller="refine--date"
3
+ class="refine-date-picker-container"
4
+ data-refine--date-locale-value="<%= I18n.locale %>"
5
+ data-refine--date-date-format-value="<%= I18n.t("refine.date.formats.moment") %>"
6
+ data-refine--date-datetime-format-value="<%= I18n.t("refine.time.formats.moment") %>"
7
+ >
8
+ <input
9
+ class="refine--input"
10
+ type="text"
11
+ value="<%= value&.to_date && I18n.l(value&.to_date, format: I18n.t("refine.date.formats.ruby")) %>"
12
+ data-refine--date-target="field"
13
+ placeholder="<%= label %>"
14
+ />
15
+ <%= input_fields.hidden_field attribute,
16
+ value: value&.to_date&.strftime('%Y-%m-%d'),
17
+ data: { refine__date_target: "hiddenField" },
18
+ form: form_id
19
+ %>
20
+ </div>
@@ -0,0 +1,23 @@
1
+ <%
2
+ is_range = ['btwn', 'nbtwn'].include? input_fields.object.clause
3
+ value1_placeholder = criterion.condition.display.downcase
4
+ value1_placeholder += " (#{t('.min')})" if is_range
5
+ value2_placeholder = "#{criterion.condition.display.downcase} (#{t('.max')})"
6
+ %>
7
+
8
+ <%= tag.div class: ('btwn' ? 'refine--numeric-condition-container' : 'refine-numeric-condition-container-btwn') do %>
9
+
10
+ <%= input_fields.text_field :value1,
11
+ class: "refine--input refine--numeric-input",
12
+ placeholder: value1_placeholder,
13
+ form: form_id
14
+ %>
15
+
16
+ <% if is_range %>
17
+ <div class="refine--numeric-condition-and"><%= t(".and") %></div>
18
+ <div class="refine--numeric-condition-second-container">
19
+ <%= input_fields.text_field :value2, class: "refine--input refine--numeric-input", placeholder: value2_placeholder,
20
+ form: form_id %>
21
+ </div>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <div class="refine--option-condition-container" data-controller="refine--typeahead-list">
2
+ <div class="refine--search-box">
3
+ <span class="material-icons refine--icon-search">search</span>
4
+ <input class="refine--search-trigger" data-search-target="filterProperties" placeholder="<%= t('.type_to_search') %>..." type="text" data-action="refine--typeahead-list#filter" autofocus>
5
+ </div>
6
+
7
+ <div class="refine--option-list">
8
+ <% criterion.options.each do |option| %>
9
+ <%= tag.label class: "refine--option-label",
10
+ data: {
11
+ refine__typeahead_list_target: "listItem",
12
+ list_item_value: option.display
13
+ } do
14
+ %>
15
+ <% if criterion.multiple? %>
16
+ <%= check_box_tag input_fields.field_name("selected", multiple: true), option.id, criterion.input.selected.to_a.include?(option.id), class: "refine--option-input", form: form_id %>
17
+ <% else %>
18
+ <%= radio_button_tag input_fields.field_name("selected"), option.id, (criterion.input.selected == [option.id]), class: "refine--option-input", form: form_id %>
19
+ <% end %>
20
+ <span class="refine--option-text" title="<%= option.display %>"><%= option.display.truncate(64) %></span>
21
+ <% end %>
22
+ <% end %>
23
+ <% if criterion.condition.meta[:postfix] %>
24
+ <span class="refine-option--condition-postfix"><%= meta[:postfix] %></span>
25
+ <% end %>
26
+ </div>
27
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="refine--text-condition-container">
2
+ <%= form.label :condition_id, criterion.condition.display, class: "sr-only" %>
3
+ <%= input_fields.text_field :value,
4
+ class: "refine--input refine--text-input #{"has-error" if criterion.errors.any?}",
5
+ placeholder: criterion.condition.display.downcase,
6
+ form: form_id
7
+ %>
8
+ </div>
@@ -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" %>
@@ -0,0 +1,28 @@
1
+ <%= turbo_frame_tag dom_id(@criterion, :load), class: "refine--stored-filter-list-window" do %>
2
+ <div class="refine--stored-filter-list">
3
+ <% if @stored_filters.empty? %>
4
+ <a><%= t('.no_stored_filters') %></a>
5
+ <% end %>
6
+
7
+
8
+ <% @stored_filters.each do |filter| %>
9
+ <%= puts filter.inspect %>
10
+ <%= form_with(
11
+ model: @criterion,
12
+ url: find_refine_advanced_inline_stored_filters_path,
13
+ method: :post,
14
+ class: "refine--stored-filter-search-form",
15
+ data: {
16
+ controller: "refine--submit-form"
17
+ }) do |form| %>
18
+ <!-- Saved filter selector -->
19
+ <%= form.hidden_field :stable_id %>
20
+ <%= form.hidden_field :client_id %>
21
+ <%= hidden_field_tag :id, filter.id %>
22
+ <a href="#" class="refine--stored-filter-list-item" data-action="refine--submit-form#submit">
23
+ <%= filter.name %>
24
+ </a>
25
+ <% end %>
26
+ <% end %>
27
+ </div>
28
+ <% end %>
@@ -0,0 +1,47 @@
1
+ <% form_id = dom_id(@criterion, :save_form) %>
2
+
3
+ <%= turbo_stream.update dom_id(@criterion, :save) do %>
4
+ <% if false && @stored_filter.errors.any? # TODO place in tooltip%>
5
+ <% @stored_filter.errors.full_messages.each do |message|%>
6
+ <p class="refine-stored-filter-error"><%= message %></p>
7
+ <% end %>
8
+ <% end %>
9
+
10
+ <%= tag.div class: "refine--save-filter-form" do %>
11
+
12
+ <%= fields model: @criterion do |criteria_fields| %>
13
+ <%= criteria_fields.hidden_field :client_id, form: form_id %>
14
+ <%= criteria_fields.hidden_field :stable_id, form: form_id %>
15
+ <% end %>
16
+
17
+ <%= fields model: @stored_filter do |stored_filter_fields| %>
18
+ <%= stored_filter_fields.label :name, "#{t('.save_filter_label')}" %>
19
+
20
+ <%# TODO replace with content-editable that writes to hidden input %>
21
+ <div class="refine--save-filter-input-wrapper">
22
+ <div class="refine--tooltip"><%= sanitize t('.tooltip') %></div>
23
+
24
+ <%= stored_filter_fields.text_field :name,
25
+ class: "refine--save-filter-input",
26
+ placeholder: t('.save_filter_placeholder'),
27
+ autofocus: true,
28
+ form: form_id
29
+ %>
30
+ </div>
31
+ <% end %>
32
+
33
+ <% end %>
34
+ <% end %>
35
+
36
+
37
+ <%# The actual form tag is appended to the end of the body html. Inputs are attached using the `form` attribute. This allows the query builder to be placed inside an outer form on the page. %>
38
+ <%= turbo_stream.append_all "body" do %>
39
+ <%= form_with(
40
+ url: refine_advanced_inline_stored_filters_path,
41
+ method: :post,
42
+ class: "refine--save-filter-form",
43
+ id: form_id,
44
+ data: {
45
+ turbo_frame: dom_id(@criterion, :save)
46
+ }) %>
47
+ <% end %>
@@ -16,12 +16,5 @@
16
16
  {
17
17
  class: "refine--condition-list-item",
18
18
  }.merge(data: data)) do %>
19
- <% if condition.has_icon? %>
20
- <% if condition.icon_class.present? %>
21
- <i class="<%= condition.icon_class %>"></i>
22
- <% else %>
23
- <%= render partial: condition.icon_template[:template_path], locals: condition.icon_template[:locals] %>
24
- <% end %>
25
- <% end %>
26
19
  <%= condition.display %>
27
20
  <% end %>
@@ -6,18 +6,13 @@
6
6
  conjunction: "and",
7
7
  position: position
8
8
  )
9
- use_modal ||= false
10
- fill_modal ||= false
11
- src = use_modal ? index_advanced_refine_inline_criteria_path(criterion.to_params.merge(fill_modal: fill_modal)) : refine_inline_criteria_path(criterion.to_params)
12
9
  %>
13
10
 
14
- <%= render "refine/inline/filters/modal_or_popup",
11
+ <%= render "refine/inline/filters/popup",
15
12
  frame_id: dom_id(criterion),
16
- use_modal: use_modal,
17
- fill_modal: fill_modal,
18
- src: src do
13
+ src: refine_inline_criteria_path(criterion.to_params) do
19
14
  %>
20
- <button class="refine--add-condition-button refine--add-first-condition-button" href="#" data-action="click->refine--popup#show click->refine--modal#open" type="button">
15
+ <button class="refine--add-condition-button refine--add-first-condition-button" href="#" data-action="click->refine--popup#show" type="button">
21
16
  <span><%= t(".filter") %></span>
22
17
  <span class="icon material-icons-outlined refine--icon-sm">add</span>
23
18
  </button>