headmin 0.3.3 → 0.4.1

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 (160) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +27 -0
  3. data/.gitignore +14 -0
  4. data/.nvmrc +1 -0
  5. data/CHANGELOG.md +24 -0
  6. data/Gemfile +7 -4
  7. data/Gemfile.lock +171 -3
  8. data/README.md +9 -1
  9. data/Rakefile +1 -7
  10. data/app/assets/javascripts/headmin/config/i18n.js +9 -9
  11. data/app/assets/javascripts/headmin/controllers/autocomplete_controller.js +318 -0
  12. data/app/assets/javascripts/headmin/controllers/blocks_controller.js +74 -79
  13. data/app/assets/javascripts/headmin/controllers/date_range_controller.js +24 -24
  14. data/app/assets/javascripts/headmin/controllers/dropzone_controller.js +23 -25
  15. data/app/assets/javascripts/headmin/controllers/file_preview_controller.js +237 -237
  16. data/app/assets/javascripts/headmin/controllers/filter_controller.js +44 -44
  17. data/app/assets/javascripts/headmin/controllers/filters_controller.js +57 -61
  18. data/app/assets/javascripts/headmin/controllers/flatpickr_controller.js +29 -29
  19. data/app/assets/javascripts/headmin/controllers/hello_controller.js +3 -3
  20. data/app/assets/javascripts/headmin/controllers/notification_controller.js +7 -6
  21. data/app/assets/javascripts/headmin/controllers/popup_controller.js +57 -51
  22. data/app/assets/javascripts/headmin/controllers/redactorx_controller.js +36 -9
  23. data/app/assets/javascripts/headmin/controllers/repeater_controller.js +122 -125
  24. data/app/assets/javascripts/headmin/controllers/select_controller.js +40 -39
  25. data/app/assets/javascripts/headmin/controllers/table_actions_controller.js +88 -77
  26. data/app/assets/javascripts/headmin/controllers/table_controller.js +115 -116
  27. data/app/assets/javascripts/headmin/index.js +38 -35
  28. data/app/assets/javascripts/headmin.js +309 -42
  29. data/app/assets/stylesheets/headmin/forms/autocomplete.scss +21 -0
  30. data/app/assets/stylesheets/headmin/forms/file.scss +46 -0
  31. data/app/assets/stylesheets/headmin/forms/repeater.scss +62 -0
  32. data/app/assets/stylesheets/headmin/forms/search.scss +12 -0
  33. data/app/assets/stylesheets/headmin/forms.scss +11 -0
  34. data/app/assets/stylesheets/headmin/general.scss +14 -0
  35. data/app/assets/stylesheets/headmin/overrides/bootstrap.scss +5 -3
  36. data/app/assets/stylesheets/headmin/overrides/redactorx.scss +74 -0
  37. data/app/assets/stylesheets/headmin/popup.scss +1 -0
  38. data/app/assets/stylesheets/headmin/syntax.scss +36 -349
  39. data/app/assets/stylesheets/headmin/table.scss +1 -1
  40. data/app/assets/stylesheets/headmin/utilities/buttons.scss +19 -0
  41. data/app/assets/stylesheets/headmin/utilities/dropzone.scss +72 -0
  42. data/app/assets/stylesheets/headmin/utilities.scss +2 -68
  43. data/app/assets/stylesheets/headmin.css +209 -205
  44. data/app/assets/stylesheets/headmin.scss +1 -1
  45. data/app/helpers/headmin/admin_helper.rb +0 -1
  46. data/app/helpers/headmin/form_helper.rb +2 -8
  47. data/app/models/concerns/headmin/blockable.rb +1 -1
  48. data/app/models/concerns/headmin/field.rb +1 -0
  49. data/app/models/concerns/headmin/form/autocompletable.rb +38 -0
  50. data/app/models/concerns/headmin/form/hintable.rb +19 -0
  51. data/app/models/concerns/headmin/form/input_groupable.rb +23 -0
  52. data/app/models/concerns/headmin/form/labelable.rb +33 -0
  53. data/app/models/concerns/headmin/form/listable.rb +28 -0
  54. data/app/models/concerns/headmin/form/placeholderable.rb +13 -0
  55. data/app/models/concerns/headmin/form/validatable.rb +40 -0
  56. data/app/models/concerns/headmin/form/wrappable.rb +21 -0
  57. data/app/models/headmin/.DS_Store +0 -0
  58. data/app/models/headmin/blocks_view.rb +15 -0
  59. data/app/models/headmin/form/blocks_view.rb +29 -0
  60. data/app/models/headmin/form/checkbox_view.rb +52 -0
  61. data/app/models/headmin/form/date_range_view.rb +25 -0
  62. data/app/models/headmin/form/date_view.rb +45 -0
  63. data/app/models/headmin/form/email_view.rb +48 -0
  64. data/app/models/headmin/form/file_view.rb +116 -0
  65. data/app/models/headmin/form/flatpickr_range_view.rb +102 -0
  66. data/app/models/headmin/form/flatpickr_view.rb +37 -0
  67. data/app/models/headmin/form/hidden_view.rb +10 -0
  68. data/app/models/headmin/form/hint_view.rb +6 -0
  69. data/app/models/headmin/form/input_group_view.rb +19 -0
  70. data/app/models/headmin/form/label_view.rb +24 -0
  71. data/app/models/headmin/form/number_view.rb +49 -0
  72. data/app/models/headmin/form/password_view.rb +44 -0
  73. data/app/models/headmin/form/redactorx_view.rb +59 -0
  74. data/app/models/headmin/form/search_view.rb +48 -0
  75. data/app/models/headmin/form/select_view.rb +62 -0
  76. data/app/models/headmin/form/switch_view.rb +23 -0
  77. data/app/models/headmin/form/text_view.rb +48 -0
  78. data/app/models/headmin/form/textarea_view.rb +44 -0
  79. data/app/models/headmin/form/url_view.rb +48 -0
  80. data/app/models/headmin/form/wrapper_view.rb +19 -0
  81. data/app/models/headmin/form/wysiwyg_view.rb +17 -0
  82. data/app/models/headmin/{thumbnail.rb → thumbnail_view.rb} +6 -1
  83. data/app/models/view_model.rb +58 -0
  84. data/app/views/headmin/_blocks.html.erb +13 -9
  85. data/app/views/headmin/_heading.html.erb +7 -1
  86. data/app/views/headmin/_thumbnail.html.erb +1 -37
  87. data/app/views/headmin/forms/_autocomplete.html.erb +11 -0
  88. data/app/views/headmin/forms/_blocks.html.erb +16 -17
  89. data/app/views/headmin/forms/_checkbox.html.erb +24 -29
  90. data/app/views/headmin/forms/_datalist.html.erb +3 -0
  91. data/app/views/headmin/forms/_date.html.erb +24 -24
  92. data/app/views/headmin/forms/_date_range.html.erb +19 -21
  93. data/app/views/headmin/forms/_email.html.erb +27 -32
  94. data/app/views/headmin/forms/_errors.html.erb +2 -3
  95. data/app/views/headmin/forms/_file.html.erb +84 -181
  96. data/app/views/headmin/forms/_flatpickr.html.erb +19 -20
  97. data/app/views/headmin/forms/_flatpickr_range.html.erb +28 -37
  98. data/app/views/headmin/forms/_hidden.html.erb +9 -10
  99. data/app/views/headmin/forms/_hint.html.erb +16 -0
  100. data/app/views/headmin/forms/_input_group.html.erb +21 -0
  101. data/app/views/headmin/forms/_label.html.erb +5 -13
  102. data/app/views/headmin/forms/_number.html.erb +23 -35
  103. data/app/views/headmin/forms/_password.html.erb +21 -30
  104. data/app/views/headmin/forms/_redactorx.html.erb +21 -40
  105. data/app/views/headmin/forms/_repeater.html.erb +55 -60
  106. data/app/views/headmin/forms/_search.html.erb +43 -0
  107. data/app/views/headmin/forms/_select.html.erb +24 -49
  108. data/app/views/headmin/forms/_switch.html.erb +29 -0
  109. data/app/views/headmin/forms/_text.html.erb +42 -96
  110. data/app/views/headmin/forms/_textarea.html.erb +21 -32
  111. data/app/views/headmin/forms/_url.html.erb +26 -31
  112. data/app/views/headmin/forms/_validation.html.erb +10 -13
  113. data/app/views/headmin/forms/_wrapper.html.erb +9 -0
  114. data/app/views/headmin/forms/_wysiwyg.html.erb +28 -0
  115. data/app/views/headmin/forms/autocomplete/_item.html.erb +3 -0
  116. data/app/views/headmin/forms/autocomplete/_list.html.erb +3 -0
  117. data/app/views/headmin/forms/fields/_group.html.erb +9 -2
  118. data/app/views/headmin/forms/repeater/_row.html.erb +4 -4
  119. data/app/views/headmin/table/_actions.html.erb +1 -1
  120. data/app/views/headmin/table/actions/_action.html.erb +2 -1
  121. data/app/views/headmin/table/actions/_delete.html.erb +1 -1
  122. data/bin/console +0 -1
  123. data/config/locales/headmin/forms/en.yml +1 -12
  124. data/config/locales/headmin/forms/nl.yml +1 -12
  125. data/esbuild-css.js +18 -18
  126. data/esbuild-js.js +8 -8
  127. data/headmin.gemspec +1 -3
  128. data/lib/generators/templates/controllers/auth/confirmations_controller.rb +0 -2
  129. data/lib/generators/templates/controllers/auth/omniauth_callbacks_controller.rb +0 -2
  130. data/lib/generators/templates/controllers/auth/passwords_controller.rb +0 -2
  131. data/lib/generators/templates/controllers/auth/registrations_controller.rb +0 -2
  132. data/lib/generators/templates/controllers/auth/sessions_controller.rb +0 -2
  133. data/lib/generators/templates/controllers/auth/unlocks_controller.rb +0 -2
  134. data/lib/headmin/version.rb +1 -3
  135. data/lib/headmin.rb +0 -2
  136. data/package-lock.json +5359 -0
  137. data/package.json +13 -6
  138. data/view_model_benchmark.rb +74 -0
  139. data/yarn-error.log +367 -0
  140. data/yarn.lock +1575 -31
  141. metadata +63 -24
  142. data/app/assets/stylesheets/headmin/form.scss +0 -132
  143. data/app/assets/stylesheets/headmin/overrides/redactorx.css +0 -3
  144. data/app/helpers/headmin/documentation_helper.rb +0 -35
  145. data/app/models/headmin/documentation_renderer.rb +0 -32
  146. data/app/models/headmin/form/base.rb +0 -78
  147. data/app/models/headmin/form/text.rb +0 -51
  148. data/app/services/block_service.rb +0 -72
  149. data/app/views/headmin/_card.html.erb +0 -52
  150. data/app/views/headmin/forms/_actions.html.erb +0 -28
  151. data/app/views/headmin/forms/_base.html.erb +0 -114
  152. data/app/views/headmin/forms/_image.html.erb +0 -21
  153. data/app/views/headmin/forms/_video.html.erb +0 -21
  154. data/app/views/headmin/forms/actions/_destroy.html.erb +0 -13
  155. data/app/views/headmin/forms/actions/_save.html.erb +0 -12
  156. data/app/views/headmin/forms/actions/_view.html.erb +0 -15
  157. data/docs/blocks-and-fields.md +0 -54
  158. data/docs/blocks.md +0 -48
  159. data/docs/devise.md +0 -41
  160. data/docs/fields.md +0 -79
@@ -1,48 +1,49 @@
1
- import {Controller} from "@hotwired/stimulus"
2
- import TomSelect from "tom-select";
3
- import I18n from "../config/i18n";
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import TomSelect from 'tom-select'
3
+ import I18n from '../config/i18n'
4
4
 
5
5
  export default class extends Controller {
6
- connect() {
7
- if (this.element.hasAttribute('multiple')) {
8
- this.initTomSelect()
9
- }
6
+ connect () {
7
+ if (this.element.hasAttribute('multiple')) {
8
+ this.initTomSelect()
10
9
  }
10
+ }
11
11
 
12
- defaultOptions(locale) {
13
- const defaultOptions = {
14
- en: {
15
- render: {
16
- option_create: function (data, escape) {
17
- return '<div class="create">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>'
18
- },
19
- no_results: function (data, escape) {
20
- return '<div class="no-results">No results found</div>'
21
- }
22
- }
23
- },
24
- nl: {
25
- render: {
26
- option_create: function (data, escape) {
27
- return '<div class="create">Voeg <strong>' + escape(data.input) + '</strong> toe &hellip;</div>'
28
- },
29
- no_results: function (data, escape) {
30
- return '<div class="no-results">Geen resultaten gevonden</div>'
31
- }
32
- }
33
- }
12
+ defaultOptions (locale) {
13
+ const defaultOptions = {
14
+ en: {
15
+ render: {
16
+ option_create: function (data, escape) {
17
+ return '<div class="create">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>'
18
+ },
19
+ no_results: function (data, escape) {
20
+ return '<div class="no-results">No results found</div>'
21
+ }
22
+ }
23
+ },
24
+ nl: {
25
+ render: {
26
+ option_create: function (data, escape) {
27
+ return '<div class="create">Voeg <strong>' + escape(data.input) + '</strong> toe &hellip;</div>'
28
+ },
29
+ no_results: function (data, escape) {
30
+ return '<div class="no-results">Geen resultaten gevonden</div>'
31
+ }
34
32
  }
35
- return defaultOptions[locale]
33
+ }
36
34
  }
35
+ return defaultOptions[locale]
36
+ }
37
37
 
38
- hasTags() {
39
- return this.element.dataset['tags'] === "true"
40
- }
38
+ hasTags () {
39
+ return this.element.dataset.tags === 'true'
40
+ }
41
41
 
42
- initTomSelect() {
43
- const defaultOptions = this.defaultOptions(I18n.locale)
44
- const options = {create: this.hasTags()}
42
+ initTomSelect () {
43
+ const defaultOptions = this.defaultOptions(I18n.locale)
44
+ const options = { create: this.hasTags() }
45
45
 
46
- new TomSelect(this.element, {...defaultOptions, ...options})
47
- }
48
- }
46
+ /* eslint-disable no-new */
47
+ new TomSelect(this.element, { ...defaultOptions, ...options })
48
+ }
49
+ }
@@ -1,98 +1,109 @@
1
- import {Controller} from "@hotwired/stimulus"
1
+ import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  export default class extends Controller {
4
- static get targets() {
5
- return ["wrapper", "form", "select", "method", "button", "idInputTemplate", "id", "counter"]
6
- }
4
+ static get targets () {
5
+ return ['wrapper', 'form', 'select', 'method', 'button', 'idInputTemplate', 'id', 'counter']
6
+ }
7
7
 
8
- connect() {
9
- this.wrapperTarget.addEventListener('idSelectionChanged', (event) => {
10
- this.updateIdFields(event.detail.ids)
11
- this.updateCounter(event.detail.count)
12
- this.toggleCounter(event.detail.count)
13
- })
8
+ connect () {
9
+ this.wrapperTarget.addEventListener('idSelectionChanged', (event) => {
10
+ this.updateIdFields(event.detail.ids)
11
+ this.updateCounter(event.detail.count)
12
+ this.toggleCounter(event.detail.count)
13
+ })
14
+ }
14
15
 
15
- }
16
+ update (event) {
17
+ event.preventDefault()
18
+ this.updateFormAction()
19
+ this.updateFormMethod()
20
+ this.updateFormDataAttributes()
21
+ this.enableButton()
22
+ }
16
23
 
17
- update(event) {
18
- event.preventDefault()
19
- this.updateFormAction()
20
- this.updateFormMethod()
21
- this.updateButton()
24
+ updateIdFields (ids) {
25
+ this.removeIds()
26
+ if (ids instanceof Array) {
27
+ ids.forEach((id) => {
28
+ this.addId(id)
29
+ })
30
+ } else {
31
+ this.addId('')
22
32
  }
33
+ }
23
34
 
24
- updateIdFields(ids) {
25
- this.removeIds()
26
- if (ids instanceof Array) {
27
- ids.forEach((id) => {
28
- this.addId(id)
29
- })
30
- } else {
31
- this.addId('')
32
- }
35
+ updateCounter (count) {
36
+ let htmlString = ''
37
+ switch (count) {
38
+ case 0:
39
+ htmlString = this.counterTarget.getAttribute('data-items-zero')
40
+ break
41
+ case 1:
42
+ htmlString = this.counterTarget.getAttribute('data-items-one')
43
+ break
44
+ default:
45
+ htmlString = this.counterTarget.getAttribute('data-items-other')
46
+ htmlString = htmlString.replace(/<b>[\s\S]*?<\/b>/, `<b>${count}</b>`)
33
47
  }
48
+ this.counterTarget.innerHTML = htmlString
49
+ }
34
50
 
35
- updateCounter(count) {
36
- let htmlString = ''
37
- switch (count) {
38
- case 0:
39
- htmlString = this.counterTarget.getAttribute('data-items-zero')
40
- break;
41
- case 1:
42
- htmlString = this.counterTarget.getAttribute('data-items-one')
43
- break;
44
- default:
45
- htmlString = this.counterTarget.getAttribute('data-items-other')
46
- htmlString = htmlString.replace(/<b>[\s\S]*?<\/b>/, `<b>${count}<\/b>`);
47
- }
48
- this.counterTarget.innerHTML = htmlString;
51
+ toggleCounter (count) {
52
+ if (count > 0) {
53
+ this.wrapperTarget.classList.remove('d-none')
54
+ } else {
55
+ this.wrapperTarget.classList.add('d-none')
49
56
  }
57
+ }
50
58
 
51
- toggleCounter(count) {
52
- if (count > 0) {
53
- this.wrapperTarget.classList.remove('d-none')
54
- } else {
55
- this.wrapperTarget.classList.add('d-none')
56
- }
57
- }
59
+ updateFormAction () {
60
+ this.formTarget.action = this.selectTarget.value
61
+ }
58
62
 
59
- updateFormAction() {
60
- this.formTarget.action = this.selectTarget.value
61
- }
63
+ updateFormMethod () {
64
+ const option = this.selectedOption()
65
+ this.methodTarget.value = option.dataset.method
66
+ }
62
67
 
63
- updateFormMethod() {
64
- const option = this.selectedOption()
65
- this.methodTarget.value = option.dataset.method
66
- }
68
+ updateFormDataAttributes () {
69
+ const option = this.selectedOption()
70
+ this.updateFormDataConfirm(option.dataset.turboConfirm)
71
+ this.updateFormDataTurbo(option.dataset.turbo)
72
+ }
67
73
 
68
- updateButton() {
69
- const option = this.selectedOption()
70
- const confirm = option.dataset.confirm
71
- if (confirm) {
72
- this.formTarget.dataset.turboConfirm = confirm
73
- } else {
74
- this.formTarget.removeAttribute('data-turbo-confirm')
75
- }
76
- this.enableButton()
74
+ updateFormDataConfirm (confirm) {
75
+ if (confirm) {
76
+ this.formTarget.dataset.turboConfirm = confirm
77
+ } else {
78
+ this.formTarget.removeAttribute('data-turbo-confirm')
77
79
  }
80
+ }
78
81
 
79
- selectedOption() {
80
- return this.selectTarget.options[this.selectTarget.selectedIndex]
82
+ updateFormDataTurbo (turbo) {
83
+ if (turbo) {
84
+ this.formTarget.dataset.turbo = turbo
85
+ } else {
86
+ this.formTarget.removeAttribute('data-turbo')
81
87
  }
88
+ }
82
89
 
83
- enableButton() {
84
- this.buttonTarget.removeAttribute('disabled')
85
- }
90
+ selectedOption () {
91
+ return this.selectTarget.options[this.selectTarget.selectedIndex]
92
+ }
86
93
 
87
- addId(id) {
88
- const template = this.idInputTemplateTarget
89
- const input = template.innerHTML.replace(/ID/g, id)
90
- this.formTarget.insertAdjacentHTML('afterbegin', input)
91
- }
94
+ enableButton () {
95
+ this.buttonTarget.removeAttribute('disabled')
96
+ }
92
97
 
93
- removeIds() {
94
- this.idTargets.forEach((input) => {
95
- this.formTarget.removeChild(input)
96
- });
97
- }
98
+ addId (id) {
99
+ const template = this.idInputTemplateTarget
100
+ const input = template.innerHTML.replace(/ID/g, id)
101
+ this.formTarget.insertAdjacentHTML('afterbegin', input)
102
+ }
103
+
104
+ removeIds () {
105
+ this.idTargets.forEach((input) => {
106
+ this.formTarget.removeChild(input)
107
+ })
108
+ }
98
109
  }
@@ -1,125 +1,124 @@
1
- import {Controller} from "@hotwired/stimulus"
2
- import Sortable from "sortablejs";
1
+ /* global CustomEvent, fetch, FormData */
2
+ import { Controller } from '@hotwired/stimulus'
3
+ import Sortable from 'sortablejs'
3
4
 
4
5
  export default class extends Controller {
5
- static get values() {
6
- return {
7
- url: String,
8
- count: Number
9
- }
10
- }
11
-
12
- static get targets() {
13
- return ["table", "body", "actions", "idCheckbox", "idsCheckbox", "row"]
14
- }
15
-
16
- connect() {
17
- new Sortable(this.bodyTarget, {
18
- handle: '.table-drag-sort-handle',
19
- onEnd: (event) => {
20
- this.submitPositions()
21
- }
22
- })
23
- }
24
-
25
- submitPositions() {
26
- fetch(this.urlValue, {
27
- method: 'PATCH',
28
- body: this.idsFormData(),
29
- headers: {
30
- 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
31
- },
32
- }).then((response) => {
33
- return response.text()
34
- }).catch((err) => {
35
- console.warn('Fetch went wrong', err)
36
- })
37
- }
38
-
39
- positions() {
40
- const handles = [...this.tableTarget.querySelectorAll(".table-drag-sort-handle")]
41
- return handles.map((handle) => {
42
- return handle.dataset.id
43
- })
44
- }
45
-
46
- idsFormData() {
47
- let formData = new FormData()
48
- console.log(this.positions())
49
- this.positions().forEach(id => {
50
- formData.append('ids[]', id)
51
- })
52
- return formData
53
- }
54
-
55
- toggleIds(event) {
56
- const checkbox = event.target
57
- this.toggleIdsCheckboxes(checkbox.checked)
58
- this.toggleIdCheckboxes(checkbox.checked)
59
- this.updateActions()
60
- }
61
-
62
- toggleId(event) {
63
- this.toggleIdsCheckboxes(false)
64
- this.updateActions()
65
- }
66
-
67
- updateActions() {
68
- this.actionsTarget.dispatchEvent(
69
- new CustomEvent(
70
- 'idSelectionChanged',
71
- {
72
- detail: {
73
- ids: this.ids(),
74
- count: this.selectedIdsCount()
75
- }
76
- }
77
- )
78
- )
79
- }
80
-
81
- selectedIdsCount() {
82
- if (this.ids() instanceof Array) {
83
- return this.ids().length
84
- } else {
85
- return this.totalCount()
86
- }
87
- }
88
-
89
- totalCount() {
90
- if (this.countValue === 0) {
91
- return this.rowTargets.length
92
- } else {
93
- return this.countValue
94
- }
6
+ static get values () {
7
+ return {
8
+ url: String,
9
+ count: Number
95
10
  }
96
-
97
- ids() {
98
- if (this.idsCheckboxTarget.checked) {
99
- return null
100
- } else {
101
- return this.selectedIdCheckboxes().map((checkbox) => {
102
- return checkbox.value
103
- })
11
+ }
12
+
13
+ static get targets () {
14
+ return ['table', 'body', 'actions', 'idCheckbox', 'idsCheckbox', 'row']
15
+ }
16
+
17
+ connect () {
18
+ Sortable.create(this.bodyTarget, {
19
+ handle: '.table-drag-sort-handle',
20
+ onEnd: (event) => {
21
+ this.submitPositions()
22
+ }
23
+ })
24
+ }
25
+
26
+ submitPositions () {
27
+ fetch(this.urlValue, {
28
+ method: 'PATCH',
29
+ body: this.idsFormData(),
30
+ headers: {
31
+ 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
32
+ }
33
+ }).then((response) => {
34
+ return response.text()
35
+ }).catch((err) => {
36
+ console.warn('Fetch went wrong', err)
37
+ })
38
+ }
39
+
40
+ positions () {
41
+ const handles = [...this.tableTarget.querySelectorAll('.table-drag-sort-handle')]
42
+ return handles.map((handle) => {
43
+ return handle.dataset.id
44
+ })
45
+ }
46
+
47
+ idsFormData () {
48
+ const formData = new FormData()
49
+ this.positions().forEach(id => {
50
+ formData.append('ids[]', id)
51
+ })
52
+ return formData
53
+ }
54
+
55
+ toggleIds (event) {
56
+ const checkbox = event.target
57
+ this.toggleIdsCheckboxes(checkbox.checked)
58
+ this.toggleIdCheckboxes(checkbox.checked)
59
+ this.updateActions()
60
+ }
61
+
62
+ toggleId (event) {
63
+ this.toggleIdsCheckboxes(false)
64
+ this.updateActions()
65
+ }
66
+
67
+ updateActions () {
68
+ this.actionsTarget.dispatchEvent(
69
+ new CustomEvent(
70
+ 'idSelectionChanged',
71
+ {
72
+ detail: {
73
+ ids: this.ids(),
74
+ count: this.selectedIdsCount()
75
+ }
104
76
  }
77
+ )
78
+ )
79
+ }
80
+
81
+ selectedIdsCount () {
82
+ if (this.ids() instanceof Array) {
83
+ return this.ids().length
84
+ } else {
85
+ return this.totalCount()
105
86
  }
87
+ }
106
88
 
107
- selectedIdCheckboxes() {
108
- return this.idCheckboxTargets.filter((checkbox) => {
109
- return checkbox.checked
110
- })
89
+ totalCount () {
90
+ if (this.countValue === 0) {
91
+ return this.rowTargets.length
92
+ } else {
93
+ return this.countValue
111
94
  }
112
-
113
- toggleIdsCheckboxes(checked) {
114
- this.idsCheckboxTargets.forEach((checkbox) => {
115
- checkbox.checked = checked
116
- });
95
+ }
96
+
97
+ ids () {
98
+ if (this.idsCheckboxTarget.checked) {
99
+ return null
100
+ } else {
101
+ return this.selectedIdCheckboxes().map((checkbox) => {
102
+ return checkbox.value
103
+ })
117
104
  }
118
-
119
- toggleIdCheckboxes(checked) {
120
- this.idCheckboxTargets.forEach((checkbox) => {
121
- checkbox.checked = checked
122
- });
123
- }
124
-
105
+ }
106
+
107
+ selectedIdCheckboxes () {
108
+ return this.idCheckboxTargets.filter((checkbox) => {
109
+ return checkbox.checked
110
+ })
111
+ }
112
+
113
+ toggleIdsCheckboxes (checked) {
114
+ this.idsCheckboxTargets.forEach((checkbox) => {
115
+ checkbox.checked = checked
116
+ })
117
+ }
118
+
119
+ toggleIdCheckboxes (checked) {
120
+ this.idCheckboxTargets.forEach((checkbox) => {
121
+ checkbox.checked = checked
122
+ })
123
+ }
125
124
  }
@@ -1,37 +1,40 @@
1
- import {Application} from "@hotwired/stimulus"
2
- import BlocksController from "./controllers/blocks_controller"
3
- import DateRangeController from "./controllers/date_range_controller"
4
- import DropzoneController from "./controllers/dropzone_controller"
5
- import FilePreviewController from "./controllers/file_preview_controller"
6
- import FilterController from "./controllers/filter_controller"
7
- import FiltersController from "./controllers/filters_controller"
8
- import FlatpickrController from "./controllers/flatpickr_controller"
9
- import HelloController from "./controllers/hello_controller"
10
- import NotificationController from "./controllers/notification_controller"
11
- import PopupController from "./controllers/popup_controller"
12
- import RedactorxController from "./controllers/redactorx_controller"
13
- import RepeaterController from "./controllers/repeater_controller"
14
- import SelectController from "./controllers/select_controller"
15
- import TableActionsController from "./controllers/table_actions_controller"
16
- import TableController from "./controllers/table_controller"
1
+ /* global Stimulus */
2
+ import { Application } from '@hotwired/stimulus'
3
+ import AutocompleteController from './controllers/autocomplete_controller'
4
+ import BlocksController from './controllers/blocks_controller'
5
+ import DateRangeController from './controllers/date_range_controller'
6
+ import DropzoneController from './controllers/dropzone_controller'
7
+ import FilePreviewController from './controllers/file_preview_controller'
8
+ import FilterController from './controllers/filter_controller'
9
+ import FiltersController from './controllers/filters_controller'
10
+ import FlatpickrController from './controllers/flatpickr_controller'
11
+ import HelloController from './controllers/hello_controller'
12
+ import NotificationController from './controllers/notification_controller'
13
+ import PopupController from './controllers/popup_controller'
14
+ import RedactorxController from './controllers/redactorx_controller'
15
+ import RepeaterController from './controllers/repeater_controller'
16
+ import SelectController from './controllers/select_controller'
17
+ import TableActionsController from './controllers/table_actions_controller'
18
+ import TableController from './controllers/table_controller'
17
19
 
18
20
  export class Headmin {
19
- static start() {
20
- window.Stimulus = window.Stimulus || Application.start()
21
- Stimulus.register("blocks", BlocksController)
22
- Stimulus.register("date_range", DateRangeController)
23
- Stimulus.register("dropzone", DropzoneController)
24
- Stimulus.register("file-preview", FilePreviewController)
25
- Stimulus.register("filter", FilterController)
26
- Stimulus.register("filters", FiltersController)
27
- Stimulus.register("flatpickr", FlatpickrController)
28
- Stimulus.register("hello", HelloController)
29
- Stimulus.register("notification", NotificationController)
30
- Stimulus.register("popup", PopupController)
31
- Stimulus.register("redactorx", RedactorxController)
32
- Stimulus.register("repeater", RepeaterController)
33
- Stimulus.register("select", SelectController)
34
- Stimulus.register("table", TableController)
35
- Stimulus.register("table-actions", TableActionsController)
36
- }
37
- }
21
+ static start () {
22
+ window.Stimulus = window.Stimulus || Application.start()
23
+ Stimulus.register('autocomplete', AutocompleteController)
24
+ Stimulus.register('blocks', BlocksController)
25
+ Stimulus.register('date-range', DateRangeController)
26
+ Stimulus.register('dropzone', DropzoneController)
27
+ Stimulus.register('file-preview', FilePreviewController)
28
+ Stimulus.register('filter', FilterController)
29
+ Stimulus.register('filters', FiltersController)
30
+ Stimulus.register('flatpickr', FlatpickrController)
31
+ Stimulus.register('hello', HelloController)
32
+ Stimulus.register('notification', NotificationController)
33
+ Stimulus.register('popup', PopupController)
34
+ Stimulus.register('redactorx', RedactorxController)
35
+ Stimulus.register('repeater', RepeaterController)
36
+ Stimulus.register('select', SelectController)
37
+ Stimulus.register('table', TableController)
38
+ Stimulus.register('table-actions', TableActionsController)
39
+ }
40
+ }