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
@@ -0,0 +1,25 @@
1
+ module Headmin
2
+ module Form
3
+ class DatetimeRangeView < ViewModel
4
+ def start_options
5
+ default_start_options.deep_merge(@start || {})
6
+ end
7
+
8
+ def end_options
9
+ default_end_options.deep_merge(@end || {})
10
+ end
11
+
12
+ private
13
+
14
+ def default_start_options
15
+ keys = attributes - %i[start]
16
+ to_h.slice(*keys)
17
+ end
18
+
19
+ def default_end_options
20
+ keys = attributes - %i[end]
21
+ to_h.slice(*keys)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,45 @@
1
+ module Headmin
2
+ module Form
3
+ class DatetimeView < ViewModel
4
+ include Headmin::Form::Hintable
5
+ include Headmin::Form::InputGroupable
6
+ include Headmin::Form::Labelable
7
+ include Headmin::Form::Listable
8
+ include Headmin::Form::Placeholderable
9
+ include Headmin::Form::Validatable
10
+ include Headmin::Form::Wrappable
11
+
12
+ def input_options
13
+ keys = attributes - %i[append attribute float form input_group input_group label prepend validate wrapper]
14
+ options = to_h.slice(*keys)
15
+ default_input_options.deep_merge(options)
16
+ end
17
+
18
+ def input_group_options
19
+ default_input_group_options
20
+ .deep_merge(label_input_group_options)
21
+ .deep_merge(@input_group || {})
22
+ end
23
+
24
+ def wrapper_options
25
+ default_wrapper_options.deep_merge({
26
+ class: ["mb-3", ("form-floating" if float)]
27
+ }).deep_merge(@wrapper || {})
28
+ end
29
+
30
+ private
31
+
32
+ def default_input_options
33
+ {
34
+ aria: {describedby: validation_id},
35
+ class: [form_control_class, validation_class],
36
+ placeholder: placeholder
37
+ }
38
+ end
39
+
40
+ def form_control_class
41
+ plaintext ? "form-control-plaintext" : "form-control"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -13,21 +13,21 @@ module Headmin
13
13
  def input_options
14
14
  keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
15
15
  options = to_h.slice(*keys)
16
- options = default_input_options.merge(options)
17
- options.merge(autocomplete_input_options)
16
+ options = default_input_options.deep_merge(options)
17
+ options.deep_merge(autocomplete_input_options)
18
18
  end
19
19
 
20
20
  def input_group_options
21
21
  default_input_group_options
22
- .merge(autocomplete_input_group_options)
23
- .merge(label_input_group_options)
24
- .merge(@input_group || {})
22
+ .deep_merge(autocomplete_input_group_options)
23
+ .deep_merge(label_input_group_options)
24
+ .deep_merge(@input_group || {})
25
25
  end
26
26
 
27
27
  def wrapper_options
28
- default_wrapper_options.merge({
28
+ default_wrapper_options.deep_merge({
29
29
  class: ["mb-3", ("form-floating" if float)]
30
- }).merge(@wrapper || {})
30
+ }).deep_merge(@wrapper || {})
31
31
  end
32
32
 
33
33
  private
@@ -11,24 +11,24 @@ module Headmin
11
11
  def input_options
12
12
  keys = attributes - %i[append attribute dropzone destroy form input_group label prepend preview validate wrapper]
13
13
  options = to_h.slice(*keys)
14
- options = default_input_options.merge(options)
15
- options = options.merge(required: false) if attachments.any?
14
+ options = default_input_options.deep_merge(options)
15
+ options = options.deep_merge(required: false) if attachments.any?
16
16
  options
17
17
  end
18
18
 
19
19
  def input_group_options
20
20
  default_input_group_options
21
- .merge(label_input_group_options)
22
- .merge(@input_group || {})
21
+ .deep_merge(label_input_group_options)
22
+ .deep_merge(@input_group || {})
23
23
  end
24
24
 
25
25
  def wrapper_options
26
- default_wrapper_options.merge({
26
+ default_wrapper_options.deep_merge({
27
27
  class: ["mb-3 h-form-file", ("form-floating" if float)],
28
28
  data: {
29
29
  controller: ("file-preview" if preview)
30
30
  }
31
- }).merge(@wrapper || {})
31
+ }).deep_merge(@wrapper || {})
32
32
  end
33
33
 
34
34
  def preview
@@ -22,32 +22,29 @@ module Headmin
22
22
  end
23
23
 
24
24
  def start_options
25
- default_start_options.merge(@start || {})
25
+ default_start_options.deep_merge(@start || {})
26
26
  end
27
27
 
28
28
  def end_options
29
- default_end_options.merge(@end || {})
29
+ default_end_options.deep_merge(@end || {})
30
30
  end
31
31
 
32
32
  def input_options
33
33
  keys = attributes - %i[append attribute end float form input_group label prepend start validate wrapper]
34
34
  options = to_h.slice(*keys)
35
- default_input_options.merge(options)
35
+ default_input_options.deep_merge(options)
36
36
  end
37
37
 
38
38
  def input_group_options
39
39
  default_input_group_options
40
- .merge(label_input_group_options)
41
- .merge(@input_group || {})
40
+ .deep_merge(label_input_group_options)
41
+ .deep_merge(@input_group || {})
42
42
  end
43
43
 
44
44
  def wrapper_options
45
- default_wrapper_options.merge({
46
- class: ["mb-3", ("form-floating" if float)],
47
- data: {
48
- controller: "flatpickr date-range"
49
- }
50
- }).merge(@wrapper || {})
45
+ default_wrapper_options.deep_merge({
46
+ class: ["mb-3", ("form-floating" if float)]
47
+ }).deep_merge(@wrapper || {})
51
48
  end
52
49
 
53
50
  private
@@ -59,19 +56,11 @@ module Headmin
59
56
  end
60
57
 
61
58
  def default_start_options
62
- {
63
- data: {
64
- 'date-range-target': "startDateInput"
65
- }
66
- }
59
+ {}
67
60
  end
68
61
 
69
62
  def default_end_options
70
- {
71
- data: {
72
- 'date-range-target': "endDateInput"
73
- }
74
- }
63
+ {}
75
64
  end
76
65
 
77
66
  def default_input_options
@@ -81,7 +70,7 @@ module Headmin
81
70
  placeholder: placeholder,
82
71
  name: nil,
83
72
  data: {
84
- "flatpickr-target": "input",
73
+ controller: "flatpickr date-range",
85
74
  action: "change->date-range#update",
86
75
  flatpickr: {
87
76
  mode: "range",
@@ -2,36 +2,27 @@ module Headmin
2
2
  module Form
3
3
  class FlatpickrView < ViewModel
4
4
  def options
5
- keys = attributes - %i[data wrapper]
5
+ keys = attributes - %i[data]
6
6
  options = to_h.slice(*keys)
7
- default_options.merge(options)
7
+ default_options.deep_merge(options)
8
8
  end
9
9
 
10
10
  private
11
11
 
12
12
  def default_options
13
13
  {
14
- data: default_data.merge(data || {}),
15
- wrapper: default_wrapper_options.merge(wrapper || {})
14
+ data: default_data.deep_merge(data || {})
16
15
  }
17
16
  end
18
17
 
19
18
  def default_data
20
19
  {
21
- "flatpickr-target": "input",
20
+ controller: "flatpickr",
22
21
  flatpickr: {
23
22
  defaultDate: form.object&.send(attribute)&.strftime("%d/%m/%Y")
24
23
  }
25
24
  }
26
25
  end
27
-
28
- def default_wrapper_options
29
- {
30
- data: {
31
- controller: "flatpickr"
32
- }
33
- }
34
- end
35
26
  end
36
27
  end
37
28
  end
@@ -4,7 +4,7 @@ module Headmin
4
4
  def options
5
5
  keys = attributes - %i[bypass append prepend]
6
6
  options = to_h.slice(*keys)
7
- default_options.merge(options)
7
+ default_options.deep_merge(options)
8
8
  end
9
9
 
10
10
  private
@@ -8,7 +8,7 @@ module Headmin
8
8
  def options
9
9
  keys = attributes - %i[attribute form text]
10
10
  options = to_h.slice(*keys)
11
- default_options.merge(options)
11
+ default_options.deep_merge(options)
12
12
  end
13
13
 
14
14
  private
@@ -12,19 +12,19 @@ module Headmin
12
12
  def input_options
13
13
  keys = attributes - %i[append attribute float form input_group label prepend validate wrapper]
14
14
  options = to_h.slice(*keys)
15
- default_input_options.merge(options)
15
+ default_input_options.deep_merge(options)
16
16
  end
17
17
 
18
18
  def input_group_options
19
19
  default_input_group_options
20
- .merge(label_input_group_options)
21
- .merge(@input_group || {})
20
+ .deep_merge(label_input_group_options)
21
+ .deep_merge(@input_group || {})
22
22
  end
23
23
 
24
24
  def wrapper_options
25
- default_wrapper_options.merge({
25
+ default_wrapper_options.deep_merge({
26
26
  class: ["mb-3", float_class]
27
- }).merge(@wrapper || {})
27
+ }).deep_merge(@wrapper || {})
28
28
  end
29
29
 
30
30
  private
@@ -11,19 +11,19 @@ module Headmin
11
11
  def input_options
12
12
  keys = attributes - %i[append attribute float form input_group label prepend validate wrapper]
13
13
  options = to_h.slice(*keys)
14
- default_input_options.merge(options)
14
+ default_input_options.deep_merge(options)
15
15
  end
16
16
 
17
17
  def input_group_options
18
18
  default_input_group_options
19
- .merge(label_input_group_options)
20
- .merge(@input_group || {})
19
+ .deep_merge(label_input_group_options)
20
+ .deep_merge(@input_group || {})
21
21
  end
22
22
 
23
23
  def wrapper_options
24
- default_wrapper_options.merge({
24
+ default_wrapper_options.deep_merge({
25
25
  class: ["mb-3", ("form-floating" if float)]
26
- }).merge(@wrapper || {})
26
+ }).deep_merge(@wrapper || {})
27
27
  end
28
28
 
29
29
  private
@@ -2,7 +2,7 @@ module Headmin
2
2
  module Form
3
3
  class RedactorxView < ViewModel
4
4
  def options
5
- default_options.merge(to_h)
5
+ default_options.deep_merge(to_h)
6
6
  end
7
7
 
8
8
  private
@@ -39,7 +39,7 @@ module Headmin
39
39
  attr_reader :topbar
40
40
 
41
41
  def redactor_options
42
- default_redactor_options.merge(redactor || {})
42
+ default_redactor_options.deep_merge(redactor || {})
43
43
  end
44
44
 
45
45
  def default_redactor_options
@@ -13,21 +13,21 @@ module Headmin
13
13
  def input_options
14
14
  keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
15
15
  options = to_h.slice(*keys)
16
- options = default_input_options.merge(options)
17
- options.merge(autocomplete_input_options)
16
+ options = default_input_options.deep_merge(options)
17
+ options.deep_merge(autocomplete_input_options)
18
18
  end
19
19
 
20
20
  def input_group_options
21
21
  default_input_group_options
22
- .merge(autocomplete_input_group_options)
23
- .merge(label_input_group_options)
24
- .merge(@input_group || {})
22
+ .deep_merge(autocomplete_input_group_options)
23
+ .deep_merge(label_input_group_options)
24
+ .deep_merge(@input_group || {})
25
25
  end
26
26
 
27
27
  def wrapper_options
28
- default_wrapper_options.merge({
28
+ default_wrapper_options.deep_merge({
29
29
  class: ["mb-3", ("form-floating" if float)]
30
- }).merge(@wrapper || {})
30
+ }).deep_merge(@wrapper || {})
31
31
  end
32
32
 
33
33
  private
@@ -12,25 +12,25 @@ module Headmin
12
12
  def input_options
13
13
  keys = attributes - %i[append attribute collection float form input_group include_blank label prepend validate selected tags wrapper]
14
14
  options = to_h.slice(*keys)
15
- default_input_options.merge(options)
15
+ default_input_options.deep_merge(options)
16
16
  end
17
17
 
18
18
  def input_group_options
19
19
  default_input_group_options
20
- .merge(label_input_group_options)
21
- .merge(@input_group || {})
20
+ .deep_merge(label_input_group_options)
21
+ .deep_merge(@input_group || {})
22
22
  end
23
23
 
24
24
  def wrapper_options
25
- default_wrapper_options.merge({
25
+ default_wrapper_options.deep_merge({
26
26
  class: ["mb-3", ("form-floating" if float)]
27
- }).merge(@wrapper || {})
27
+ }).deep_merge(@wrapper || {})
28
28
  end
29
29
 
30
30
  def select_options
31
31
  keys = %i[include_blank selected]
32
32
  options = to_h.slice(*keys)
33
- default_options.merge(options)
33
+ default_options.deep_merge(options)
34
34
  end
35
35
 
36
36
  private
@@ -2,7 +2,7 @@ module Headmin
2
2
  module Form
3
3
  class SwitchView < ViewModel
4
4
  def options
5
- default_options.merge(to_h)
5
+ default_options.deep_merge(to_h)
6
6
  end
7
7
 
8
8
  private
@@ -13,21 +13,21 @@ module Headmin
13
13
  def input_options
14
14
  keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
15
15
  options = to_h.slice(*keys)
16
- options = default_input_options.merge(options)
17
- options.merge(autocomplete_input_options)
16
+ options = default_input_options.deep_merge(options)
17
+ options.deep_merge(autocomplete_input_options)
18
18
  end
19
19
 
20
20
  def input_group_options
21
21
  default_input_group_options
22
- .merge(autocomplete_input_group_options)
23
- .merge(label_input_group_options)
24
- .merge(@input_group || {})
22
+ .deep_merge(autocomplete_input_group_options)
23
+ .deep_merge(label_input_group_options)
24
+ .deep_merge(@input_group || {})
25
25
  end
26
26
 
27
27
  def wrapper_options
28
- default_wrapper_options.merge({
28
+ default_wrapper_options.deep_merge({
29
29
  class: ["mb-3", ("form-floating" if float)]
30
- }).merge(@wrapper || {})
30
+ }).deep_merge(@wrapper || {})
31
31
  end
32
32
 
33
33
  private
@@ -11,19 +11,19 @@ module Headmin
11
11
  def input_options
12
12
  keys = attributes - %i[attribute float form input_group label validate wrapper]
13
13
  options = to_h.slice(*keys)
14
- default_input_options.merge(options)
14
+ default_input_options.deep_merge(options)
15
15
  end
16
16
 
17
17
  def input_group_options
18
18
  default_input_group_options
19
- .merge(label_input_group_options)
20
- .merge(@input_group || {})
19
+ .deep_merge(label_input_group_options)
20
+ .deep_merge(@input_group || {})
21
21
  end
22
22
 
23
23
  def wrapper_options
24
- default_wrapper_options.merge({
24
+ default_wrapper_options.deep_merge({
25
25
  class: ["mb-3", ("form-floating" if float)]
26
- }).merge(@wrapper || {})
26
+ }).deep_merge(@wrapper || {})
27
27
  end
28
28
 
29
29
  private
@@ -13,21 +13,21 @@ module Headmin
13
13
  def input_options
14
14
  keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
15
15
  options = to_h.slice(*keys)
16
- options = default_input_options.merge(options)
17
- options.merge(autocomplete_input_options)
16
+ options = default_input_options.deep_merge(options)
17
+ options.deep_merge(autocomplete_input_options)
18
18
  end
19
19
 
20
20
  def input_group_options
21
21
  default_input_group_options
22
- .merge(autocomplete_input_group_options)
23
- .merge(label_input_group_options)
24
- .merge(@input_group || {})
22
+ .deep_merge(autocomplete_input_group_options)
23
+ .deep_merge(label_input_group_options)
24
+ .deep_merge(@input_group || {})
25
25
  end
26
26
 
27
27
  def wrapper_options
28
- default_wrapper_options.merge({
28
+ default_wrapper_options.deep_merge({
29
29
  class: ["mb-3", ("form-floating" if float)]
30
- }).merge(@wrapper || {})
30
+ }).deep_merge(@wrapper || {})
31
31
  end
32
32
 
33
33
  private
@@ -4,7 +4,7 @@ module Headmin
4
4
  def options
5
5
  keys = attributes - %i[bypass]
6
6
  options = to_h.slice(*keys)
7
- default_options.merge(options)
7
+ default_options.deep_merge(options)
8
8
  end
9
9
 
10
10
  private
@@ -2,7 +2,7 @@ module Headmin
2
2
  module Form
3
3
  class WysiwygView < ViewModel
4
4
  def options
5
- default_options.merge(to_h)
5
+ default_options.deep_merge(to_h)
6
6
  end
7
7
 
8
8
  private
@@ -33,7 +33,7 @@ class ViewModel
33
33
  end
34
34
 
35
35
  def to_hash
36
- attributes.map { |attribute| {attribute => value_for(attribute)} }.inject(:merge)
36
+ attributes.map { |attribute| {attribute => value_for(attribute)} }.inject(:merge) || {}
37
37
  end
38
38
 
39
39
  alias_method :to_h, :to_hash
@@ -11,26 +11,26 @@
11
11
  </head>
12
12
 
13
13
  <body>
14
- <%= render 'headmin/layout/main' do %>
15
- <%= render 'headmin/layout/sidebar', logo: inline_svg_tag('logo.svg') do %>
16
- <%= render 'headmin/layout/sidebar/menu' do %>
17
- <%= render 'headmin/layout/sidebar/menu/item', name: t('.dashboard'), link: admin_root_path, icon: 'speedometer' %>
14
+ <%= render "headmin/layout/main" do %>
15
+ <%= render "headmin/layout/sidebar", logo: inline_svg_tag('logo.svg') do %>
16
+ <%= render "headmin/layout/sidebar/menu" do %>
17
+ <%= render "headmin/layout/sidebar/menu/item", name: t('.dashboard'), link: admin_root_path, icon: 'speedometer' %>
18
18
  <div class="d-block d-md-none">
19
- <%= render 'headmin/layout/sidebar/menu/locale' do end %>
20
- <%= render 'headmin/layout/sidebar/menu/account' do end %>
19
+ <%= render "headmin/layout/sidebar/menu/locale" do end %>
20
+ <%= render "headmin/layout/sidebar/menu/account" do end %>
21
21
  </div>
22
22
  <% end %>
23
23
  <% end %>
24
- <%= render 'headmin/layout/body' do %>
25
- <%= render 'headmin/layout/header' do %>
26
- <%= render 'headmin/layout/header/locale' do end %>
27
- <%= render 'headmin/layout/header/account' do end %>
24
+ <%= render "headmin/layout/body" do %>
25
+ <%= render "headmin/layout/header" do %>
26
+ <%= render "headmin/layout/header/locale" do end %>
27
+ <%= render "headmin/layout/header/account" do end %>
28
28
  <% end %>
29
- <%= render 'headmin/layout/content' do %>
30
- <%= render 'headmin/notifications' %>
29
+ <%= render "headmin/layout/content" do %>
30
+ <%= render "headmin/notifications" %>
31
31
  <%= yield %>
32
32
  <% end %>
33
- <%= render 'headmin/layout/footer', class: 'text-secondary' do %>
33
+ <%= render "headmin/layout/footer", class: 'text-secondary' do %>
34
34
  <%= bootstrap_icon('question-circle') %>
35
35
  <a class="text-secondary" href="mailto:info@insiting.com" title="<%= t('.help') %>">
36
36
  <%= t('.help') %>
@@ -10,7 +10,7 @@
10
10
  </head>
11
11
  <body class="bg-light w-100 vh-100">
12
12
 
13
- <%= render 'headmin/notifications' %>
13
+ <%= render "headmin/notifications" %>
14
14
 
15
15
  <main class="d-flex justify-content-center align-items-center w-100 vh-100 p-3">
16
16
  <%= yield %>
@@ -14,16 +14,16 @@
14
14
  # <%= render "headmin/filters", url: admin_polls_path %#>
15
15
 
16
16
  action = local_assigns.has_key?(:url) ? url : request.path
17
-
18
- # Perform yield in order to capture content blocks
19
- yield
20
17
  %>
21
18
 
22
- <form action="<%= action %>" data-controller="filters" data-filters-target="form">
19
+ <%= form_with url: action, method: :get, data: {controller: "filters", filters_target: "form"} do |form| %>
20
+
21
+ <%# Perform yield in order to capture content blocks, pass form so we can use headmin form inputs %>
22
+ <%= yield(form) %>
23
23
 
24
24
  <!-- Default parameters (e.g. sorting, pagination) -->
25
25
  <% default_params.except('page').each do |name, value| %>
26
- <%= hidden_field_tag(name.to_sym, value) %>
26
+ <%= form.hidden_field name.to_sym, value: value %>
27
27
  <% end %>
28
28
 
29
29
  <div class="d-flex flex-column flex-md-row align-content-start align-items-md-start">
@@ -69,8 +69,8 @@
69
69
 
70
70
  <!-- Filter templates -->
71
71
  <%= yield :filters_templates %>
72
- </form>
73
72
 
73
+ <% end %>
74
74
 
75
75
  <%
76
76
  # Clears content blocks to make this view reusable
@@ -19,12 +19,12 @@
19
19
  #
20
20
  # === Examples
21
21
  # Basic version
22
- # <%= render 'headmin/form', model: @product do |form| %#>
22
+ # <%= render "headmin/form", model: @product do |form| %#>
23
23
  # Form content
24
24
  # <% end %#>
25
25
  #
26
26
  # Specify URL to post to
27
- # <%= render 'headmin/form', model: @product, url: admin_products_path do |form| %#>
27
+ # <%= render "headmin/form", model: @product, url: admin_products_path do |form| %#>
28
28
  # Form content
29
29
  # <% end %#>
30
30
 
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # === Examples
5
5
  # Basic version
6
- # <%= render 'headmin/index' do %#>
6
+ # <%= render "headmin/index" do %#>
7
7
  # Index content
8
8
  # <% end %#>
9
9
  %>
@@ -11,7 +11,7 @@
11
11
 
12
12
  <div class="d-flex flex-row-reverse flex-md-row align-items-center justify-content-between justify-content-md-end my-1">
13
13
  <% content_for :collection_total_count, collection.total_count.to_s unless content_for?(:collection_total_count) %>
14
- <div class="ms-2 me-md-2 text-secondary">
14
+ <div class="ms-2 me-md-2 text-secondary flex-grow-1 flex-shrink-0">
15
15
  <%= t('.items', count: content_for(:collection_total_count).to_i) %>
16
16
  </div>
17
17
  <%= paginate collection, views_prefix: 'headmin/pagination' %>