headmin 0.4.0 → 0.5.0

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/.lock-487e157d270f3062a98b7b2a012753708-1272821827 +0 -0
  3. data/CHANGELOG.md +16 -2
  4. data/Gemfile.lock +77 -79
  5. data/app/assets/javascripts/headmin/controllers/autocomplete_controller.js +84 -21
  6. data/app/assets/javascripts/headmin/controllers/date_range_controller.js +12 -6
  7. data/app/assets/javascripts/headmin/controllers/filter_controller.js +61 -11
  8. data/app/assets/javascripts/headmin/controllers/filter_row_controller.js +50 -0
  9. data/app/assets/javascripts/headmin/controllers/flatpickr_controller.js +2 -6
  10. data/app/assets/javascripts/headmin/controllers/popup_controller.js +14 -5
  11. data/app/assets/javascripts/headmin/controllers/table_actions_controller.js +16 -21
  12. data/app/assets/javascripts/headmin/index.js +2 -0
  13. data/app/assets/javascripts/headmin.js +186 -56
  14. data/app/assets/stylesheets/headmin/filter.scss +74 -0
  15. data/app/assets/stylesheets/headmin/general.scss +8 -0
  16. data/app/assets/stylesheets/headmin/layout/body.scss +5 -0
  17. data/app/assets/stylesheets/headmin/popup.scss +0 -1
  18. data/app/assets/stylesheets/headmin.css +70 -1
  19. data/app/controllers/concerns/headmin/filterable.rb +27 -0
  20. data/app/models/concerns/headmin/field.rb +4 -2
  21. data/app/models/concerns/headmin/fieldable.rb +138 -44
  22. data/app/models/headmin/filter/base.rb +238 -0
  23. data/app/models/headmin/filter/base_view.rb +64 -0
  24. data/app/models/headmin/filter/boolean.rb +15 -0
  25. data/app/models/headmin/filter/boolean_view.rb +61 -0
  26. data/app/models/headmin/filter/button_view.rb +25 -0
  27. data/app/models/headmin/filter/conditional_view.rb +16 -0
  28. data/app/models/headmin/filter/date.rb +19 -0
  29. data/app/models/headmin/filter/date_view.rb +52 -0
  30. data/app/models/headmin/filter/flatpickr_view.rb +54 -0
  31. data/app/models/headmin/filter/menu_item_view.rb +6 -0
  32. data/app/models/headmin/filter/money.rb +13 -0
  33. data/app/models/headmin/filter/number.rb +27 -0
  34. data/app/models/headmin/filter/number_view.rb +54 -0
  35. data/app/models/headmin/filter/operator_view.rb +30 -0
  36. data/app/models/headmin/filter/options_view.rb +61 -0
  37. data/app/models/headmin/filter/row_view.rb +13 -0
  38. data/app/models/headmin/filter/search.rb +18 -0
  39. data/app/models/headmin/filter/search_view.rb +31 -0
  40. data/app/models/headmin/filter/text.rb +25 -0
  41. data/app/models/headmin/filter/text_view.rb +53 -0
  42. data/app/models/headmin/filters.rb +29 -0
  43. data/app/models/headmin/form/blocks_view.rb +1 -1
  44. data/app/models/headmin/form/checkbox_view.rb +3 -3
  45. data/app/models/headmin/form/date_range_view.rb +2 -2
  46. data/app/models/headmin/form/date_view.rb +5 -5
  47. data/app/models/headmin/form/datetime_range_view.rb +25 -0
  48. data/app/models/headmin/form/datetime_view.rb +45 -0
  49. data/app/models/headmin/form/email_view.rb +7 -7
  50. data/app/models/headmin/form/file_view.rb +6 -6
  51. data/app/models/headmin/form/flatpickr_range_view.rb +11 -22
  52. data/app/models/headmin/form/flatpickr_view.rb +4 -13
  53. data/app/models/headmin/form/input_group_view.rb +1 -1
  54. data/app/models/headmin/form/label_view.rb +1 -1
  55. data/app/models/headmin/form/number_view.rb +5 -5
  56. data/app/models/headmin/form/password_view.rb +5 -5
  57. data/app/models/headmin/form/redactorx_view.rb +2 -2
  58. data/app/models/headmin/form/search_view.rb +7 -7
  59. data/app/models/headmin/form/select_view.rb +6 -6
  60. data/app/models/headmin/form/switch_view.rb +1 -1
  61. data/app/models/headmin/form/text_view.rb +7 -7
  62. data/app/models/headmin/form/textarea_view.rb +5 -5
  63. data/app/models/headmin/form/url_view.rb +7 -7
  64. data/app/models/headmin/form/wrapper_view.rb +1 -1
  65. data/app/models/headmin/form/wysiwyg_view.rb +1 -1
  66. data/app/models/view_model.rb +1 -1
  67. data/app/views/examples/admin.html.erb +13 -13
  68. data/app/views/examples/auth.html.erb +1 -1
  69. data/app/views/headmin/_filters.html.erb +6 -6
  70. data/app/views/headmin/_form.html.erb +2 -2
  71. data/app/views/headmin/_index.html.erb +1 -1
  72. data/app/views/headmin/_pagination.html.erb +1 -1
  73. data/app/views/headmin/_popup.html.erb +2 -2
  74. data/app/views/headmin/_table.html.erb +1 -1
  75. data/app/views/headmin/dropdown/_devise.html.erb +8 -8
  76. data/app/views/headmin/dropdown/_locale.html.erb +4 -4
  77. data/app/views/headmin/filters/_base.html.erb +95 -0
  78. data/app/views/headmin/filters/_boolean.html.erb +23 -0
  79. data/app/views/headmin/filters/_date.html.erb +14 -38
  80. data/app/views/headmin/filters/_flatpickr.html.erb +15 -48
  81. data/app/views/headmin/filters/_number.html.erb +23 -0
  82. data/app/views/headmin/filters/_options.html.erb +24 -0
  83. data/app/views/headmin/filters/_search.html.erb +14 -12
  84. data/app/views/headmin/filters/_text.html.erb +23 -0
  85. data/app/views/headmin/filters/filter/_button.html.erb +9 -10
  86. data/app/views/headmin/filters/filter/_conditional.html.erb +18 -0
  87. data/app/views/headmin/filters/filter/_menu_item.html.erb +5 -2
  88. data/app/views/headmin/filters/filter/_null_select.html.erb +8 -0
  89. data/app/views/headmin/filters/filter/_operator.html.erb +16 -0
  90. data/app/views/headmin/filters/filter/_row.html.erb +11 -0
  91. data/app/views/headmin/forms/_blocks.html.erb +1 -1
  92. data/app/views/headmin/forms/_date_range.html.erb +3 -3
  93. data/app/views/headmin/forms/_datetime.html.erb +41 -0
  94. data/app/views/headmin/forms/_datetime_range.html.erb +40 -0
  95. data/app/views/headmin/forms/_file.html.erb +3 -3
  96. data/app/views/headmin/forms/_flatpickr.html.erb +1 -1
  97. data/app/views/headmin/forms/_flatpickr_range.html.erb +3 -4
  98. data/app/views/headmin/forms/_label.html.erb +1 -1
  99. data/app/views/headmin/forms/_repeater.html.erb +12 -12
  100. data/app/views/headmin/forms/fields/_base.html.erb +1 -1
  101. data/app/views/headmin/forms/fields/_file.html.erb +3 -3
  102. data/app/views/headmin/forms/fields/_files.html.erb +17 -0
  103. data/app/views/headmin/forms/fields/_group.html.erb +10 -5
  104. data/app/views/headmin/forms/fields/_list.html.erb +4 -4
  105. data/app/views/headmin/forms/fields/_text.html.erb +2 -2
  106. data/app/views/headmin/layout/_footer.html.erb +1 -1
  107. data/app/views/headmin/layout/_main.html.erb +1 -1
  108. data/app/views/headmin/nav/_dropdown.html.erb +3 -3
  109. data/app/views/headmin/nav/_item.html.erb +2 -2
  110. data/app/views/headmin/nav/item/_devise.html.erb +8 -8
  111. data/app/views/headmin/nav/item/_locale.html.erb +4 -4
  112. data/app/views/headmin/table/_actions.html.erb +3 -6
  113. data/app/views/headmin/table/actions/_export.html.erb +1 -1
  114. data/app/views/headmin/table/body/_row.html.erb +3 -3
  115. data/app/views/headmin/table/foot/_id.html.erb +1 -1
  116. data/app/views/headmin/views/devise/confirmations/_new.html.erb +1 -1
  117. data/app/views/headmin/views/devise/passwords/_edit.html.erb +2 -2
  118. data/app/views/headmin/views/devise/passwords/_new.html.erb +1 -1
  119. data/app/views/headmin/views/devise/registrations/_edit.html.erb +4 -4
  120. data/app/views/headmin/views/devise/registrations/_new.html.erb +3 -3
  121. data/app/views/headmin/views/devise/sessions/_new.html.erb +3 -3
  122. data/app/views/headmin/views/devise/unlocks/_new.html.erb +1 -1
  123. data/config/locales/en.yml +4 -0
  124. data/config/locales/headmin/dropdown/en.yml +6 -0
  125. data/config/locales/headmin/dropdown/nl.yml +6 -0
  126. data/config/locales/headmin/filters/en.yml +26 -1
  127. data/config/locales/headmin/filters/nl.yml +26 -1
  128. data/config/locales/headmin/forms/en.yml +1 -1
  129. data/config/locales/headmin/forms/nl.yml +1 -1
  130. data/config/locales/headmin/layout/en.yml +0 -9
  131. data/config/locales/headmin/layout/nl.yml +0 -9
  132. data/config/locales/headmin/nav/en.yml +7 -0
  133. data/config/locales/headmin/nav/nl.yml +7 -0
  134. data/config/locales/nl.yml +4 -0
  135. data/lib/generators/templates/views/layouts/auth.html.erb +1 -1
  136. data/lib/headmin/version.rb +1 -1
  137. data/package.json +1 -1
  138. metadata +44 -7
  139. data/app/controllers/concerns/headmin/filter.rb +0 -5
  140. data/app/controllers/concerns/headmin/searchable.rb +0 -15
  141. data/app/views/headmin/filters/_select.html.erb +0 -45
  142. data/app/views/headmin/filters/filter/_template.html.erb +0 -13
  143. data/app/views/headmin/forms/fields/_image.html.erb +0 -17
@@ -8,7 +8,7 @@
8
8
  # To trigger this popup create an element with a data attribute like this
9
9
  #
10
10
  # <button data-popup-id="popupId">open Popup</button>
11
- # <%= render 'headmin/popup', id: 'popupId' do %#>
11
+ # <%= render "headmin/popup", id: 'popupId' do %#>
12
12
  # popup Content
13
13
  # <% end %#>
14
14
  #
@@ -16,7 +16,7 @@
16
16
  # "data-popup-pass-thru" attribute.
17
17
  #
18
18
  # <button data-popup-id="popupId" data-popup-pass-thru="#link">open Popup</button>
19
- # <%= render 'headmin/popup', id: 'popupId' do %#>
19
+ # <%= render "headmin/popup", id: 'popupId' do %#>
20
20
  # <a href="https://example.com" id="link">
21
21
  # <% end %#>
22
22
  data = local_assigns.has_key?(:data) ? data : {}
@@ -5,7 +5,7 @@
5
5
  # * +sort_url</tt> - Url to post object ids to in the order of positions
6
6
  #
7
7
  # ==== Examples
8
- # <%= render 'headmin/table', sort_url: positions_admin_categories_path do %#>
8
+ # <%= render "headmin/table", sort_url: positions_admin_categories_path do %#>
9
9
  # table content here
10
10
  # <% end %#>
11
11
 
@@ -2,7 +2,7 @@
2
2
  # headmin/dropdown/devise
3
3
  #
4
4
  # ==== Options
5
- # * +scope</tt> - (symbol) devise scope, i.e. ':users' => current_user
5
+ # * +scope</tt> - (symbol) devise scope, i.e. ":users" => current_user
6
6
  # * +class</tt> - Custom class names to put on the dropdown
7
7
  #
8
8
  # ==== Examples
@@ -12,20 +12,20 @@
12
12
  # Custom scope
13
13
  # <%= render "headmin/dropdown/devise", scope: :admins %#>
14
14
 
15
- class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : ''
15
+ class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : ""
16
16
  scope = local_assigns.has_key?(:scope) ? scope : :users
17
17
  singular = scope.to_s.singularize.to_sym
18
18
  user = send("current_#{singular}")
19
19
  %>
20
20
 
21
21
 
22
- <%= render 'headmin/dropdown', class: class_names do %>
23
- <%= render 'headmin/dropdown/button' do %>
22
+ <%= render "headmin/dropdown", class: class_names do %>
23
+ <%= render "headmin/dropdown/button" do %>
24
24
  <%= user.to_s %>
25
25
  <% end %>
26
- <%= render 'headmin/dropdown/list', class: 'dropdown-menu-end' do %>
27
- <%= render 'headmin/dropdown/item', name: t('.edit_profile'), url: polymorphic_path([:edit, singular, :registration]) %>
28
- <%= render 'headmin/dropdown/divider' %>
29
- <%= render 'headmin/dropdown/item', name: t('.log_out'), url: polymorphic_path([:destroy, singular, :session]), method: :delete %>
26
+ <%= render "headmin/dropdown/list", class: "dropdown-menu-end" do %>
27
+ <%= render "headmin/dropdown/item", name: t("headmin.dropdown.devise.edit_profile"), url: polymorphic_path([:edit, :admin, user]) %>
28
+ <%= render "headmin/dropdown/divider" %>
29
+ <%= render "headmin/dropdown/item", name: t("headmin.dropdown.devise.log_out"), url: polymorphic_path([:destroy, singular, :session]), method: :delete %>
30
30
  <% end %>
31
31
  <% end %>
@@ -4,14 +4,14 @@
4
4
  parameters: none
5
5
  %>
6
6
 
7
- <%= render 'headmin/dropdown' do %>
8
- <%= render 'headmin/dropdown/button', id: 'locale-dropdown' do %>
7
+ <%= render "headmin/dropdown" do %>
8
+ <%= render "headmin/dropdown/button", id: 'locale-dropdown' do %>
9
9
  <%= bootstrap_icon('globe', class: 'me-2') %>
10
10
  <%= t('language_name', locale: ::I18n.locale) %>
11
11
  <% end %>
12
- <%= render 'headmin/dropdown/list', id: 'locale-dropdown' do %>
12
+ <%= render "headmin/dropdown/list", id: 'locale-dropdown' do %>
13
13
  <% I18n.available_locales.each do |locale| %>
14
- <%= render 'headmin/dropdown/item', name: t('language_name', locale: locale), url: url_for({locale: locale.to_s}) %>
14
+ <%= render "headmin/dropdown/item", name: t('language_name', locale: locale), url: url_for({locale: locale.to_s}) %>
15
15
  <% end %>
16
16
  <% end %>
17
17
  <% end %>
@@ -0,0 +1,95 @@
1
+ <%
2
+ # headmin/filters/base
3
+ #
4
+ # ==== Required parameters
5
+ # * +form+ - Form object
6
+ # * +name+ - Name of the filter parameter
7
+ #
8
+ # ==== Optional parameters
9
+ # * +label+ - Display label
10
+ #
11
+ # ==== Examples
12
+ # Basic version
13
+ #
14
+ # <%= render "headmin/filters/base", name: :title do |value| %#>
15
+ # <%= render "headmin/forms/text", value: value %#>
16
+ # <% end %#>
17
+ #
18
+
19
+
20
+ base = Headmin::Filter::BaseView.new(local_assigns)
21
+ %>
22
+
23
+ <%= content_for :filters_menu do %>
24
+ <%= render "headmin/filters/filter/menu_item", base.menu_item_options %>
25
+ <% end %>
26
+
27
+ <%= content_for :filters_templates do %>
28
+ <template data-filter-name="<%= name %>" data-filters-target="template">
29
+ <%= render "headmin/filters/filter/button", name: name, label: label, filter: nil, value: nil, id: "template_id" do %>
30
+ <div class="h-filter-rows mb-3" data-filter-target="wrapper">
31
+ <%= render "headmin/filters/filter/row" do %>
32
+ <%= render "headmin/filters/filter/operator", base.filter_operator_options.merge({selected: nil}) %>
33
+ <%= yield(nil) %>
34
+ <%= render "headmin/filters/filter/null_select", value: nil %>
35
+ <% end %>
36
+ </div>
37
+
38
+ <!-- Apply button -->
39
+ <button type="submit" class="btn btn-primary w-100" data-action="click->filters#update">
40
+ <%= t("headmin.filters.apply") %>
41
+ </button>
42
+
43
+ <!-- Filter field -->
44
+ <%= hidden_field_tag("#{name}", "", data: {filter_target: "hidden"}) %>
45
+
46
+ <!-- Filter template -->
47
+ <template data-filter-target="template">
48
+ <%= render "headmin/filters/filter/conditional" %>
49
+ <%= render "headmin/filters/filter/row" do %>
50
+ <%= render "headmin/filters/filter/operator", base.filter_operator_options.merge({selected: nil}) %>
51
+ <%= yield(nil) %>
52
+ <%= render "headmin/filters/filter/null_select", value: nil %>
53
+ <% end %>
54
+ </template>
55
+ <% end %>
56
+ </template>
57
+ <% end %>
58
+
59
+ <%= content_for :filters_buttons do %>
60
+ <% if filter_param_exists?(name) %>
61
+ <%= render "headmin/filters/filter/button", base.filter_button_options.merge({id: "#{name}_#{SecureRandom.hex}"}) do %>
62
+ <div class="h-filter-rows mb-3" data-filter-target="wrapper">
63
+ <% filter.values.each_with_index do |value, index| %>
64
+ <% if index > 0 %>
65
+ <%= render "headmin/filters/filter/conditional", selected: filter.conditionals[index - 1] %>
66
+ <% end %>
67
+
68
+ <%= render "headmin/filters/filter/row" do %>
69
+ <%= render "headmin/filters/filter/operator", base.filter_operator_options.merge({selected: filter.operators[index]}) %>
70
+ <%= yield(value) %>
71
+ <%= render "headmin/filters/filter/null_select", value: value %>
72
+ <% end %>
73
+ <% end %>
74
+ </div>
75
+
76
+ <!-- Apply button -->
77
+ <button type="submit" class="btn btn-primary w-100" data-action="click->filters#update">
78
+ <%= t("headmin.filters.apply") %>
79
+ </button>
80
+
81
+ <!-- Filter field -->
82
+ <%= hidden_field_tag("#{name}", params[name], data: {filter_target: "hidden"}) %>
83
+
84
+ <!-- Filter template -->
85
+ <template data-filter-target="template">
86
+ <%= render "headmin/filters/filter/conditional" %>
87
+ <%= render "headmin/filters/filter/row" do %>
88
+ <%= render "headmin/filters/filter/operator", base.filter_operator_options.merge({selected: nil}) %>
89
+ <%= yield(nil) %>
90
+ <%= render "headmin/filters/filter/null_select", value: nil %>
91
+ <% end %>
92
+ </template>
93
+ <% end %>
94
+ <% end %>
95
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%
2
+ # headmin/filters/boolean
3
+ #
4
+ # ==== Required parameters
5
+ # * +attribute+ - Name of the attribute to be filtered
6
+ # * +form+ - Form object
7
+ #
8
+ # ==== Optional parameters
9
+ # * +name+ - Name of the filter parameter
10
+ # * +label+ - Display label
11
+ #
12
+ # ==== Examples
13
+ # Basic version
14
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
15
+ # <%= render "headmin/filters/boolean", form: form, attribute: :published %#>
16
+ # <% end %#>
17
+
18
+ boolean = Headmin::Filter::BooleanView.new(local_assigns.merge(params: params))
19
+ %>
20
+
21
+ <%= render "headmin/filters/base", boolean.base_options do |value| %>
22
+ <%= render "headmin/forms/select", boolean.input_options.merge(selected: value) %>
23
+ <% end %>
@@ -1,47 +1,23 @@
1
1
  <%
2
2
  # headmin/filters/date
3
3
  #
4
- # ==== Options
5
- # * +name</tt> - Name of the filter parameter
6
- # * +label</tt> - Display name
4
+ # ==== Required parameters
5
+ # * +attribute+ - Name of the attribute to be filtered
6
+ # * +form+ - Form object
7
+ #
8
+ # ==== Optional parameters
9
+ # * +name+ - Name of the filter parameter
10
+ # * +label+ - Display label
7
11
  #
8
12
  # ==== Examples
9
13
  # Basic version
10
- # <%= render "headmin/filters/date", name: :created_at, label: 'Created at' %#>
11
-
12
- name = local_assigns.has_key?(:name) ? name.to_sym : nil
13
- label = local_assigns.has_key?(:label) ? label : name.to_s.humanize
14
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
15
+ # <%= render "headmin/filters/date", form: form, attribute: :created_at %#>
16
+ # <% end %#>
14
17
 
15
- input_options = {
16
- placeholder: 'dd/mm/yyyy',
17
- class: "form-control",
18
- required: true,
19
- data: {
20
- 'filters-target': 'input',
21
- 'action': 'change->filters#update',
22
- }
23
- }
18
+ date = Headmin::Filter::DateView.new(local_assigns.merge(params: params))
24
19
  %>
25
20
 
26
- <%= content_for :filters_menu do %>
27
- <%= render 'headmin/filters/filter/menu_item', name: name, label: label %>
28
- <% end %>
29
-
30
- <%= content_for :filters_templates do %>
31
- <%= render 'headmin/filters/filter/template', name: name, label: label do %>
32
- <div class="input-group">
33
- <%= date_field_tag(name, nil, input_options) %>
34
- </div>
35
- <% end %>
36
- <% end %>
37
-
38
- <%= content_for :filters_buttons do %>
39
- <% if filter_param_exists?(name) %>
40
- <% value_formatted = Date.parse(params[name]).strftime('%d/%m/%Y') %>
41
- <%= render 'headmin/filters/filter/button', name: name, label: label, value: value_formatted do %>
42
- <div class="input-group">
43
- <%= date_field_tag(name, params[name], input_options) %>
44
- </div>
45
- <% end %>
46
- <% end %>
47
- <% end %>
21
+ <%= render "headmin/filters/base", date.base_options do |value| %>
22
+ <%= render "headmin/forms/date", date.input_options.merge({value: value}) %>
23
+ <% end %>
@@ -1,57 +1,24 @@
1
1
  <%
2
2
  # headmin/filters/flatpickr
3
3
  #
4
- # ==== Options
5
- # * +name</tt> - Name of the filter parameter
6
- # * +label</tt> - Display name
4
+ # ==== Required parameters
5
+ # * +form+ - Form object
6
+ # * +attribute+ - Name of the attribute to be filtered
7
+ #
8
+ # ==== Optional parameters
9
+ # * +label+ - Display label
10
+ # * +name+ - Name of the filter parameter
7
11
  #
8
12
  # ==== Examples
9
13
  # Basic version
10
- # <%= render "headmin/filters/flatpickr", name: :created_at, label: 'Created at' %#>
11
-
12
- name = local_assigns.has_key?(:name) ? name.to_sym : nil
13
- label = local_assigns.has_key?(:label) ? label : name.to_s.humanize
14
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
15
+ # <%= render "headmin/filters/flatpickr", form: form, attribute: :created_at %#>
16
+ # <% end %#>
14
17
 
15
- input_options = {
16
- placeholder: 'dd/mm/yyyy',
17
- class: "form-control",
18
- required: true,
19
- data: {
20
- 'filters-target': 'input',
21
- 'flatpickr-target': 'input',
22
- 'action': 'change->filters#update',
23
- 'flatpickr-options': {
24
- defaultDate: params[name]
25
- }
26
- }
27
- }
18
+ flatpickr = Headmin::Filter::FlatpickrView.new(local_assigns.merge(params: params))
28
19
  %>
29
20
 
30
- <%= content_for :filters_menu do %>
31
- <%= render 'headmin/filters/filter/menu_item', name: name, label: label %>
32
- <% end %>
33
-
34
- <%= content_for :filters_templates do %>
35
- <%= render 'headmin/filters/filter/template', name: name, label: label do %>
36
- <div class="input-group" data-controller="flatpickr">
37
- <span class="input-group-text">
38
- <%= bootstrap_icon('calendar') %>
39
- </span>
40
- <%= date_field_tag(name, nil, input_options) %>
41
- </div>
42
- <% end %>
43
- <% end %>
44
-
45
- <%= content_for :filters_buttons do %>
46
- <% if filter_param_exists?(name) %>
47
- <% value_formatted = Date.parse(params[name]).strftime('%d/%m/%Y') %>
48
- <%= render 'headmin/filters/filter/button', name: name, label: label, value: value_formatted do %>
49
- <div class="input-group" data-controller="flatpickr">
50
- <span class="input-group-text">
51
- <%= bootstrap_icon('calendar') %>
52
- </span>
53
- <%= date_field_tag(name, params[name], input_options) %>
54
- </div>
55
- <% end %>
56
- <% end %>
57
- <% end %>
21
+ <%= render "headmin/filters/base", flatpickr.base_options do |value| %>
22
+ <% default_date = value != 1 && value != 0 ? value&.strftime("%d/%m/%Y") : value %>
23
+ <%= render "headmin/forms/flatpickr", flatpickr.input_options.deep_merge({value: value, data: {flatpickr: {defaultDate: default_date}}}) %>
24
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%
2
+ # headmin/filters/number
3
+ #
4
+ # ==== Required parameters
5
+ # * +attribute+ - Name of the attribute to be filtered
6
+ # * +form+ - Form object
7
+ #
8
+ # ==== Optional parameters
9
+ # * +label+ - Display label
10
+ # * +name+ - Name of the filter parameter
11
+ #
12
+ # ==== Examples
13
+ # Basic version
14
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
15
+ # <%= render "headmin/filters/number", form: form, attribute: :beverages %#>
16
+ # <% end %#>
17
+
18
+ number = Headmin::Filter::NumberView.new(local_assigns.merge(params: params))
19
+ %>
20
+
21
+ <%= render "headmin/filters/base", number.base_options do |value| %>
22
+ <%= render "headmin/forms/number", number.input_options.merge({value: value}) %>
23
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%
2
+ # headmin/filters/boolean
3
+ #
4
+ # ==== Required parameters
5
+ # * +attribute+ - Name of the attribute to be filtered
6
+ # * +collection+ - Values to create option tags for
7
+ # * +form+ - Form object
8
+ #
9
+ # ==== Optional parameters
10
+ # * +label+ - Display label
11
+ # * +name+ - Name of the filter parameter
12
+ #
13
+ # ==== Examples
14
+ # Basic version
15
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
16
+ # <%= render "headmin/filters/options", form: form, attribute: :category %#>
17
+ # <% end %#>
18
+
19
+ options = Headmin::Filter::OptionsView.new(local_assigns.merge(params: params))
20
+ %>
21
+
22
+ <%= render "headmin/filters/base", options.base_options do |value| %>
23
+ <%= render "headmin/forms/select", options.input_options.merge(selected: value) %>
24
+ <% end %>
@@ -1,22 +1,24 @@
1
1
  <%
2
2
  # headmin/filters/search
3
3
  #
4
- # ==== Options
5
- # * +name</tt> - Name of the filter parameter
6
- # * +label</tt> - Name of the resource to be used in the placeholder (search in ...)
7
- # * +placeholder</tt> - Placeholder in the search field
4
+ # ==== Required parameters
5
+ # * +attribute+ - Name of the attribute to be filtered
6
+ # * +form+ - Form object
7
+
8
+ # ==== Optional parameters
9
+ # * +name+ - Name of the filter parameter
10
+ # * +label+ - Name of the resource to be used in the placeholder (search in ...)
11
+ # * +placeholder+ - Placeholder in the search field
8
12
  #
9
13
  # ==== Examples
10
14
  # Basic version.
11
- # <%= render 'headmin/filters/search', name: :search, label: Poll.model_name.human(count: 2) %#>
12
-
13
- name = local_assigns.has_key?(:name) ? name : :search
14
- label = local_assigns.has_key?(:label) ? label : name.to_s.humanize
15
- placeholder = local_assigns.has_key?(:placeholder) ? placeholder : t('.placeholder', resource: label)
15
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
16
+ # <%= render "headmin/filters/search", attribute: :search, label: Poll.model_name.human(count: 2) %#>
17
+ # <% end %#>
16
18
 
17
- value = filter_param_exists?(name) ? params[name] : nil
19
+ search = Headmin::Filter::SearchView.new(local_assigns.merge(params: params))
18
20
  %>
19
21
 
20
22
  <% content_for :filters_search do %>
21
- <input class="form-control" type="search" placeholder="<%= raw placeholder.capitalize %>" aria-label="Search" name="<%= name %>" value="<%= value %>">
22
- <% end %>
23
+ <%= render "headmin/forms/search", search.input_options %>
24
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%
2
+ # headmin/filters/text
3
+ #
4
+ # ==== Required parameters
5
+ # * +form+ - Form object
6
+ # * +attribute+ - Name of the attribute to be filtered
7
+ #
8
+ # ==== Optional parameters
9
+ # * +label+ - Display label
10
+ # * +name+ - Name of the filter parameter
11
+ #
12
+ # ==== Examples
13
+ # Basic version
14
+ # <%= render "headmin/filters", url: admin_orders_path do |form| %#>
15
+ # <%= render "headmin/filters/text", form: form, attribute: :title %#>
16
+ # <% end %#>
17
+
18
+ text = Headmin::Filter::TextView.new(local_assigns.merge(params: params))
19
+ %>
20
+
21
+ <%= render "headmin/filters/base", text.base_options do |value| %>
22
+ <%= render "headmin/forms/text", text.input_options.merge({value: value}) %>
23
+ <% end %>
@@ -3,28 +3,27 @@
3
3
  accepts block: yes
4
4
  parameters:
5
5
  name: (string) Name of the parameter
6
- label: (string) Display name
7
6
  value: (string) Value of the parameter
8
7
  %>
9
- <% id = local_assigns.has_key?(:id) ? id : SecureRandom.hex %>
10
- <% name = local_assigns.has_key?(:name) ? name.to_sym : nil %>
11
- <% label = local_assigns.has_key?(:label) ? label : name.to_s.humanize %>
12
- <% value = local_assigns.has_key?(:value) ? value : nil %>
13
8
 
14
- <div class="h-filter me-1 my-1" data-controller="filter" data-filter-name="<%= name %>">
9
+ <% button_view = Headmin::Filter::ButtonView.new(local_assigns) %>
10
+
11
+ <div class="h-filter me-1 my-1" data-controller="filter" data-filter-name="<%= button_view.name %>" data-filter-name-value="<%= button_view.name %>">
15
12
  <button
16
13
  type="button"
17
14
  class="h-filter-button btn h-btn-outline-transparent"
18
15
  data-filter-target="button"
19
16
  data-popup-target="button"
20
- data-popup-id="<%= id %>"
17
+ data-popup-id="<%= button_view.id %>"
21
18
  data-action="click->popup#open"
22
19
  >
23
- <%= "#{label}: #{value || t('.all')}" %>
24
- <span class="h-filter-remove" data-action="click->filters#remove"><%= bootstrap_icon('x-lg') %></span>
20
+ <%= raw("#{button_view.label} #{button_view.filter&.string(display_values: button_view.display_values)}") %>
21
+ <span class="h-filter-remove" data-action="click->filters#remove">
22
+ <%= bootstrap_icon('x-lg') %>
23
+ </span>
25
24
  </button>
26
25
 
27
- <%= render 'headmin/popup', id: "#{id}", data: {'filter-target': 'popup'} do %>
26
+ <%= render "headmin/popup", id: "#{button_view.id}", data: {'filter-target': 'popup'} do %>
28
27
  <%= yield %>
29
28
  <% end %>
30
29
  </div>
@@ -0,0 +1,18 @@
1
+ <%#
2
+ headmin/filters/filter/conditional
3
+ accepts block: no
4
+ parameters:
5
+
6
+ %>
7
+
8
+ <% conditional = Headmin::Filter::ConditionalView.new(local_assigns) %>
9
+
10
+ <div class="h-filter-conditional">
11
+ <select class="form-control-plaintext form-control-sm" data-action="change->filter#updateHiddenValue" data-filter-target="conditional">
12
+ <% conditional.values.each do |value, display_value| %>
13
+ <option value="<%= value %>" <%= conditional.selected == value.to_s ? "selected" : "" %>>
14
+ <%= display_value.upcase %>
15
+ </option>
16
+ <% end %>
17
+ </select>
18
+ </div>
@@ -5,8 +5,11 @@
5
5
  name: (string) Name of the parameter
6
6
  label: (string) Display name
7
7
  %>
8
+
9
+ <% menu_item = Headmin::Filter::MenuItemView.new(local_assigns) %>
10
+
8
11
  <li>
9
- <a class="dropdown-item" href="#" data-filters-target="menuItem" data-action="click->filters#add" data-filter-name="<%= name %>">
10
- <%= label %>
12
+ <a class="dropdown-item" href="#" data-filters-target="menuItem" data-action="click->filters#add" data-filter-name="<%= menu_item.name %>">
13
+ <%= menu_item.label %>
11
14
  </a>
12
15
  </li>
@@ -0,0 +1,8 @@
1
+ <select class="form-select" data-filter-row-target="null" data-action="change->filter#updateHiddenValue" data-filter-target="value">
2
+ <option value="1" <%= value == 1 ? "selected" : "" %>>
3
+ <%= t('headmin.filters.values.yes') %>
4
+ </option>
5
+ <option value="0" <%= value == 0 ? "selected" : "" %>>
6
+ <%= t('headmin.filters.values.no') %>
7
+ </option>
8
+ </select>
@@ -0,0 +1,16 @@
1
+ <%#
2
+ headmin/filters/filter/button
3
+ accepts block: no
4
+ parameters:
5
+
6
+ %>
7
+
8
+ <% operators = Headmin::Filter::OperatorView.new(local_assigns) %>
9
+
10
+ <select class="h-filter-operator form-select" data-action="change->filter#updateHiddenValue" data-filter-target="operator" data-filter-row-target="operator">
11
+ <% operators.allowed_operators.each do |operator| %>
12
+ <option value="<%= operator.to_s %>" <%= operators.selected == operator.to_s ? "selected" : "" %>>
13
+ <%= raw(operators.operator_symbol[operator.to_sym]) %>
14
+ </option>
15
+ <% end %>
16
+ </select>
@@ -0,0 +1,11 @@
1
+ <% row = Headmin::Filter::RowView.new(local_assigns) %>
2
+
3
+ <div class="h-filter-row" data-controller="filter-row" data-filter-target="row">
4
+ <%= yield(row.operator, row.value) %>
5
+ <button type="button" class="btn btn-sm btn-link h-filter-add-input" data-action="click->filter#add">
6
+ <i class="bi bi-plus-circle"></i>
7
+ </button>
8
+ <button type="button" class="btn btn-sm btn-link h-filter-remove-input" data-action="click->filter#remove">
9
+ <i class="bi bi-dash-circle"></i>
10
+ </button>
11
+ </div>
@@ -22,7 +22,7 @@
22
22
  @lookup_context.prefixes = @lookup_context.prefixes + blocks.prefixes
23
23
  %>
24
24
 
25
- <%= render 'headmin/forms/repeater', blocks.repeater_options do |block_form, template| %>
25
+ <%= render "headmin/forms/repeater", blocks.repeater_options do |block_form, template| %>
26
26
  <% name = template || block_form.object.name %>
27
27
 
28
28
  <!-- Name input of the block -->
@@ -23,7 +23,7 @@
23
23
  # ==== Examples
24
24
  # Basic version
25
25
  # <%= form_with do |form| %#>
26
- # <%= render 'headmin/forms/date_range', form: form, start: {attribute: :start_date}, end: {attribute: :end_date} %#>
26
+ # <%= render "headmin/forms/date_range", form: form, start: {attribute: :start_date}, end: {attribute: :end_date} %#>
27
27
  # <% end %#>
28
28
 
29
29
  date_range = Headmin::Form::DateRangeView.new(local_assigns)
@@ -31,10 +31,10 @@
31
31
 
32
32
  <div class="row">
33
33
  <div class="col">
34
- <%= render 'headmin/forms/date', date_range.start_options %>
34
+ <%= render "headmin/forms/date", date_range.start_options %>
35
35
  </div>
36
36
  <div class="col">
37
- <%= render 'headmin/forms/date', date_range.end_options %>
37
+ <%= render "headmin/forms/date", date_range.end_options %>
38
38
  </div>
39
39
  </div>
40
40
 
@@ -0,0 +1,41 @@
1
+ <%
2
+ # headmin/forms/datetime
3
+ #
4
+ # ==== Required parameters
5
+ # * +attribute+ - Name of the attribute of the form model
6
+ # * +form+ - Form object
7
+ #
8
+ # ==== Optional parameters
9
+ # * +append+ - Display as input group with text on the right-hand side
10
+ # * +float+ - Use floating labels. Defaults to false
11
+ # * +hint+ - Informative text to assist with data input. HTML markup is allowed.
12
+ # * +label+ - Text to display inside label tag. Defaults to the attribute name. Set to false if you don"t want to show a label.
13
+ # * +list+ - Options are passed through options_for_select
14
+ # * +plaintext+ - Render input as plain text.
15
+ # * +prepend+ - Display as input group with text on the left-hand side
16
+ # * +wrapper+ - Hash with all options for the surrounding html tag
17
+ #
18
+ # ==== References
19
+ # https://headmin.dev/docs/forms/datetime
20
+ # https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local
21
+ # https://apidock.com/rails/ActionView/Helpers/FormHelper/datetime_field
22
+ #
23
+ # ==== Examples
24
+ # Basic version
25
+ # <%= form_with do |form| %#>
26
+ # <%= render "headmin/forms/datetime", form: form, attribute: :deadline %#>
27
+ # <% end %#>
28
+
29
+ datetime = Headmin::Form::DatetimeView.new(local_assigns)
30
+ %>
31
+
32
+ <%= render "headmin/forms/wrapper", datetime.wrapper_options do %>
33
+ <%= render "headmin/forms/label", datetime.label_options if datetime.prepend_label? %>
34
+ <%= render "headmin/forms/input_group", datetime.input_group_options do %>
35
+ <%= form.datetime_field(datetime.attribute, datetime.input_options) %>
36
+ <%= render "headmin/forms/datalist", datetime.datalist_options if datetime.datalist? %>
37
+ <% end %>
38
+ <%= render "headmin/forms/validation", datetime.validation_options if datetime.validate? %>
39
+ <%= render "headmin/forms/hint", datetime.hint_options if datetime.hint? %>
40
+ <%= render "headmin/forms/label", datetime.label_options if datetime.append_label? %>
41
+ <% end %>