headmin 0.2.8 → 0.3.4

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 (271) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +29 -3
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +39 -24
  6. data/README.md +65 -57
  7. data/app/assets/config/headmin_manifest.js +2 -0
  8. data/app/assets/images/document.docx +0 -0
  9. data/{src/scss/headmin/filters.scss → app/assets/images/document.pdf} +0 -0
  10. data/app/assets/images/image.jpg +0 -0
  11. data/app/assets/images/spreadsheet.xls +0 -0
  12. data/app/assets/images/video.mp4 +0 -0
  13. data/app/assets/javascripts/headmin/config/i18n.js +11 -0
  14. data/{src/js → app/assets/javascripts}/headmin/controllers/blocks_controller.js +0 -1
  15. data/{src/js → app/assets/javascripts}/headmin/controllers/date_range_controller.js +0 -2
  16. data/app/assets/javascripts/headmin/controllers/dropzone_controller.js +33 -0
  17. data/app/assets/javascripts/headmin/controllers/file_preview_controller.js +244 -0
  18. data/{src/js → app/assets/javascripts}/headmin/controllers/filter_controller.js +12 -6
  19. data/{src/js → app/assets/javascripts}/headmin/controllers/filters_controller.js +0 -0
  20. data/{src/js → app/assets/javascripts}/headmin/controllers/flatpickr_controller.js +2 -1
  21. data/app/assets/javascripts/headmin/controllers/hello_controller.js +7 -0
  22. data/app/assets/javascripts/headmin/controllers/notification_controller.js +8 -0
  23. data/{src/js → app/assets/javascripts}/headmin/controllers/popup_controller.js +0 -1
  24. data/app/assets/javascripts/headmin/controllers/redactorx_controller.js +13 -0
  25. data/{src/js → app/assets/javascripts}/headmin/controllers/repeater_controller.js +0 -0
  26. data/app/assets/javascripts/headmin/controllers/select_controller.js +48 -0
  27. data/{src/js → app/assets/javascripts}/headmin/controllers/table_actions_controller.js +18 -6
  28. data/{src/js → app/assets/javascripts}/headmin/controllers/table_controller.js +28 -14
  29. data/app/assets/javascripts/headmin/index.js +37 -0
  30. data/app/assets/javascripts/headmin.js +15280 -0
  31. data/{src/scss → app/assets/stylesheets}/headmin/filter.scss +0 -0
  32. data/app/assets/stylesheets/headmin/filters.scss +0 -0
  33. data/{src/scss → app/assets/stylesheets}/headmin/form.scss +53 -4
  34. data/{src/scss → app/assets/stylesheets}/headmin/general.scss +0 -0
  35. data/{src/scss → app/assets/stylesheets}/headmin/layout/body.scss +0 -0
  36. data/{src/scss → app/assets/stylesheets}/headmin/layout/sidebar.scss +0 -0
  37. data/{src/scss → app/assets/stylesheets}/headmin/layout.scss +0 -0
  38. data/{src/scss → app/assets/stylesheets}/headmin/login.scss +0 -0
  39. data/{src/scss/vendor/bootstrap/variables.scss → app/assets/stylesheets/headmin/overrides/bootstrap.scss} +0 -0
  40. data/{src/scss/vendor/redactorx/override.css → app/assets/stylesheets/headmin/overrides/redactorx.css} +0 -0
  41. data/{src/scss → app/assets/stylesheets}/headmin/popup.scss +0 -0
  42. data/app/assets/stylesheets/headmin/syntax.scss +349 -0
  43. data/{src/scss → app/assets/stylesheets}/headmin/table.scss +0 -0
  44. data/app/assets/stylesheets/headmin/thumbnail.scss +20 -0
  45. data/app/assets/stylesheets/headmin/utilities.scss +68 -0
  46. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_accordion.scss +118 -0
  47. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_alert.scss +57 -0
  48. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_badge.scss +29 -0
  49. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_breadcrumb.scss +28 -0
  50. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_button-group.scss +139 -0
  51. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_buttons.scss +111 -0
  52. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_card.scss +216 -0
  53. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_carousel.scss +229 -0
  54. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_close.scss +40 -0
  55. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_containers.scss +41 -0
  56. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_dropdown.scss +240 -0
  57. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_forms.scss +9 -0
  58. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_functions.scss +302 -0
  59. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_grid.scss +33 -0
  60. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_helpers.scss +9 -0
  61. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_images.scss +42 -0
  62. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_list-group.scss +174 -0
  63. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_mixins.scss +43 -0
  64. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_modal.scss +209 -0
  65. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_nav.scss +139 -0
  66. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_navbar.scss +335 -0
  67. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_offcanvas.scss +83 -0
  68. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_pagination.scss +64 -0
  69. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_placeholders.scss +51 -0
  70. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_popover.scss +158 -0
  71. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_progress.scss +48 -0
  72. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_reboot.scss +625 -0
  73. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_root.scss +54 -0
  74. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_spinners.scss +69 -0
  75. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_tables.scss +155 -0
  76. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_toasts.scss +51 -0
  77. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_tooltip.scss +115 -0
  78. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_transitions.scss +27 -0
  79. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_type.scss +104 -0
  80. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_utilities.scss +630 -0
  81. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_variables.scss +1641 -0
  82. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap-grid.scss +67 -0
  83. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap-reboot.scss +13 -0
  84. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap-utilities.scss +18 -0
  85. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap.scss +53 -0
  86. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_floating-labels.scss +63 -0
  87. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-check.scss +152 -0
  88. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-control.scss +219 -0
  89. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-range.scss +91 -0
  90. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-select.scss +72 -0
  91. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-text.scss +11 -0
  92. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_input-group.scss +121 -0
  93. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_labels.scss +36 -0
  94. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_validation.scss +12 -0
  95. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_clearfix.scss +3 -0
  96. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_colored-links.scss +12 -0
  97. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_position.scss +30 -0
  98. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_ratio.scss +26 -0
  99. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_stacks.scss +15 -0
  100. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  101. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  102. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  103. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_vr.scss +8 -0
  104. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_alert.scss +11 -0
  105. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_backdrop.scss +14 -0
  106. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_border-radius.scss +78 -0
  107. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  108. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  109. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_buttons.scss +133 -0
  110. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_caret.scss +64 -0
  111. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_clearfix.scss +9 -0
  112. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  113. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_container.scss +9 -0
  114. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_deprecate.scss +10 -0
  115. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_forms.scss +144 -0
  116. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_gradients.scss +47 -0
  117. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_grid.scss +151 -0
  118. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_image.scss +16 -0
  119. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_list-group.scss +24 -0
  120. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_lists.scss +7 -0
  121. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_pagination.scss +31 -0
  122. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_reset-text.scss +17 -0
  123. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_resize.scss +6 -0
  124. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_table-variants.scss +21 -0
  125. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  126. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_transition.scss +26 -0
  127. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_utilities.scss +89 -0
  128. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_visually-hidden.scss +29 -0
  129. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/utilities/_api.scss +47 -0
  130. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/vendor/_rfs.scss +354 -0
  131. data/app/assets/stylesheets/headmin/vendor/flatpickr.css +903 -0
  132. data/{src/scss/vendor/redactorx → app/assets/stylesheets/headmin/vendor}/redactorx.css +0 -0
  133. data/app/assets/stylesheets/headmin/vendor/tom-select-bootstrap.css +536 -0
  134. data/app/assets/stylesheets/headmin.css +13454 -0
  135. data/app/assets/stylesheets/headmin.scss +65 -0
  136. data/app/controllers/concerns/headmin/authentication.rb +1 -1
  137. data/app/controllers/concerns/headmin/searchable.rb +1 -1
  138. data/app/controllers/concerns/headmin/sortable.rb +7 -7
  139. data/app/helpers/headmin/admin_helper.rb +2 -1
  140. data/app/helpers/headmin/bootstrap_helper.rb +4 -4
  141. data/app/helpers/headmin/documentation_helper.rb +35 -0
  142. data/app/helpers/headmin/filter_helper.rb +1 -1
  143. data/app/helpers/headmin/form_helper.rb +7 -3
  144. data/app/helpers/headmin/notification_helper.rb +21 -21
  145. data/app/helpers/headmin/request_helper.rb +5 -10
  146. data/app/models/concerns/headmin/block.rb +1 -2
  147. data/app/models/concerns/headmin/blockable.rb +1 -1
  148. data/app/models/concerns/headmin/field.rb +1 -1
  149. data/app/models/concerns/headmin/fieldable.rb +8 -8
  150. data/app/models/headmin/documentation_renderer.rb +32 -0
  151. data/app/models/headmin/form/base.rb +78 -0
  152. data/app/models/headmin/form/text.rb +51 -0
  153. data/app/models/headmin/thumbnail.rb +61 -0
  154. data/app/services/block_service.rb +53 -53
  155. data/app/views/examples/admin.html.erb +1 -1
  156. data/app/views/headmin/_blocks.html.erb +2 -2
  157. data/app/views/headmin/_breadcrumbs.html.erb +1 -1
  158. data/app/views/headmin/_card.html.erb +8 -6
  159. data/app/views/headmin/_dropdown.html.erb +1 -1
  160. data/app/views/headmin/_filters.html.erb +20 -8
  161. data/app/views/headmin/_form.html.erb +14 -14
  162. data/app/views/headmin/_heading.html.erb +1 -1
  163. data/app/views/headmin/_notifications.html.erb +1 -1
  164. data/app/views/headmin/_pagination.html.erb +1 -1
  165. data/app/views/headmin/_popup.html.erb +10 -4
  166. data/app/views/headmin/_table.html.erb +2 -2
  167. data/app/views/headmin/_thumbnail.html.erb +47 -0
  168. data/app/views/headmin/dropdown/_devise.html.erb +2 -2
  169. data/app/views/headmin/dropdown/_item.html.erb +1 -1
  170. data/app/views/headmin/dropdown/_list.html.erb +3 -6
  171. data/app/views/headmin/filters/_date.html.erb +4 -10
  172. data/app/views/headmin/filters/_flatpickr.html.erb +5 -5
  173. data/app/views/headmin/filters/_search.html.erb +5 -5
  174. data/app/views/headmin/filters/_select.html.erb +6 -6
  175. data/app/views/headmin/filters/filter/_button.html.erb +7 -7
  176. data/app/views/headmin/filters/filter/_template.html.erb +1 -1
  177. data/app/views/headmin/forms/_actions.html.erb +1 -1
  178. data/app/views/headmin/forms/_base.html.erb +98 -45
  179. data/app/views/headmin/forms/_blocks.html.erb +4 -4
  180. data/app/views/headmin/forms/_checkbox.html.erb +4 -4
  181. data/app/views/headmin/forms/_date.html.erb +29 -45
  182. data/app/views/headmin/forms/_date_range.html.erb +24 -66
  183. data/app/views/headmin/forms/_email.html.erb +35 -26
  184. data/app/views/headmin/forms/_file.html.erb +186 -34
  185. data/app/views/headmin/forms/_flatpickr.html.erb +18 -39
  186. data/app/views/headmin/forms/_flatpickr_range.html.erb +34 -45
  187. data/app/views/headmin/forms/_hidden.html.erb +13 -12
  188. data/app/views/headmin/forms/_image.html.erb +11 -45
  189. data/app/views/headmin/forms/_label.html.erb +18 -14
  190. data/app/views/headmin/forms/_number.html.erb +40 -37
  191. data/app/views/headmin/forms/_password.html.erb +37 -58
  192. data/app/views/headmin/forms/_redactorx.html.erb +8 -7
  193. data/app/views/headmin/forms/_repeater.html.erb +7 -7
  194. data/app/views/headmin/forms/_select.html.erb +43 -48
  195. data/app/views/headmin/forms/_text.html.erb +95 -58
  196. data/app/views/headmin/forms/_textarea.html.erb +37 -26
  197. data/app/views/headmin/forms/_url.html.erb +35 -26
  198. data/app/views/headmin/forms/_validation.html.erb +3 -3
  199. data/app/views/headmin/forms/_video.html.erb +21 -0
  200. data/app/views/headmin/forms/actions/_destroy.html.erb +3 -3
  201. data/app/views/headmin/forms/fields/_base.html.erb +3 -3
  202. data/app/views/headmin/forms/fields/_file.html.erb +2 -2
  203. data/app/views/headmin/forms/fields/_group.html.erb +4 -4
  204. data/app/views/headmin/forms/fields/_image.html.erb +2 -2
  205. data/app/views/headmin/forms/fields/_list.html.erb +3 -3
  206. data/app/views/headmin/forms/fields/_text.html.erb +2 -2
  207. data/app/views/headmin/forms/repeater/_row.html.erb +1 -1
  208. data/app/views/headmin/heading/_title.html.erb +1 -1
  209. data/app/views/headmin/layout/_body.html.erb +1 -1
  210. data/app/views/headmin/layout/_content.html.erb +1 -1
  211. data/app/views/headmin/layout/_footer.html.erb +1 -1
  212. data/app/views/headmin/layout/_header.html.erb +1 -1
  213. data/app/views/headmin/layout/_main.html.erb +1 -1
  214. data/app/views/headmin/layout/_sidebar.html.erb +3 -3
  215. data/app/views/headmin/layout/sidebar/_bottom.html.erb +1 -1
  216. data/app/views/headmin/layout/sidebar/_nav.html.erb +1 -1
  217. data/app/views/headmin/nav/_dropdown.html.erb +34 -0
  218. data/app/views/headmin/nav/_item.html.erb +22 -13
  219. data/app/views/headmin/nav/item/_devise.html.erb +1 -1
  220. data/app/views/headmin/table/_actions.html.erb +2 -2
  221. data/app/views/headmin/table/_body.html.erb +1 -1
  222. data/app/views/headmin/table/_foot.html.erb +1 -1
  223. data/app/views/headmin/table/_footer.html.erb +1 -1
  224. data/app/views/headmin/table/_head.html.erb +1 -1
  225. data/app/views/headmin/table/_header.html.erb +1 -1
  226. data/app/views/headmin/table/actions/_action.html.erb +6 -5
  227. data/app/views/headmin/table/actions/_delete.html.erb +2 -2
  228. data/app/views/headmin/table/actions/_export.html.erb +1 -1
  229. data/app/views/headmin/table/body/_row.html.erb +2 -2
  230. data/app/views/headmin/views/devise/registrations/_edit.html.erb +2 -2
  231. data/config/importmap.rb +2 -0
  232. data/config/initializers/customize_input_error.rb +4 -4
  233. data/config/locales/en.yml +0 -3
  234. data/config/locales/headmin/forms/en.yml +5 -0
  235. data/config/locales/headmin/forms/nl.yml +5 -0
  236. data/config/locales/headmin/popup/en.yml +4 -0
  237. data/config/locales/headmin/popup/nl.yml +4 -0
  238. data/config/locales/headmin/thumbnail/en.yml +4 -0
  239. data/config/locales/headmin/thumbnail/nl.yml +4 -0
  240. data/config/locales/nl.yml +0 -3
  241. data/esbuild-css.js +25 -0
  242. data/esbuild-js.js +11 -0
  243. data/headmin.gemspec +4 -1
  244. data/lib/generators/headmin/blocks_generator.rb +8 -8
  245. data/lib/generators/headmin/devise_generator.rb +4 -4
  246. data/lib/generators/headmin/fields_generator.rb +9 -9
  247. data/lib/generators/templates/controllers/auth/confirmations_controller.rb +1 -1
  248. data/lib/generators/templates/controllers/auth/omniauth_callbacks_controller.rb +1 -1
  249. data/lib/generators/templates/controllers/auth/passwords_controller.rb +1 -1
  250. data/lib/generators/templates/controllers/auth/registrations_controller.rb +1 -1
  251. data/lib/generators/templates/controllers/auth/sessions_controller.rb +1 -1
  252. data/lib/generators/templates/controllers/auth/unlocks_controller.rb +1 -1
  253. data/lib/generators/templates/models/block.rb +1 -1
  254. data/lib/headmin/engine.rb +18 -3
  255. data/lib/headmin/version.rb +1 -1
  256. data/lib/headmin.rb +1 -1
  257. data/package.json +16 -34
  258. data/src/js/headmin.js +1 -1
  259. data/src/scss/headmin.scss +1 -61
  260. data/yarn-error.log +362 -0
  261. data/yarn.lock +234 -5275
  262. metadata +194 -38
  263. data/.nvmrc +0 -1
  264. data/.rubocop.yml +0 -13
  265. data/app/controllers/concerns/headmin/ckeditor.rb +0 -27
  266. data/app/views/headmin/forms/_ckeditor.html.erb +0 -42
  267. data/dist/css/headmin.css +0 -12357
  268. data/dist/js/headmin.js +0 -1115
  269. data/src/js/headmin/headmin.js +0 -158
  270. data/src/scss/headmin/utilities.scss +0 -19
  271. data/webpack.config.js +0 -30
@@ -0,0 +1,65 @@
1
+ // Bootstrap icons
2
+ @import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css");
3
+
4
+ // Bootstrap
5
+ @import "headmin/vendor/bootstrap/scss/functions";
6
+ @import "headmin/vendor/bootstrap/scss/functions";
7
+ @import "headmin/vendor/bootstrap/scss/functions";
8
+ @import "headmin/vendor/bootstrap/scss/variables";
9
+ @import "headmin/vendor/bootstrap/scss/mixins";
10
+ @import "headmin/vendor/bootstrap/scss/utilities";
11
+ @import "headmin/overrides/bootstrap";
12
+ @import "headmin/vendor/bootstrap/scss/root";
13
+ @import "headmin/vendor/bootstrap/scss/reboot";
14
+ @import "headmin/vendor/bootstrap/scss/type";
15
+ @import "headmin/vendor/bootstrap/scss/images";
16
+ @import "headmin/vendor/bootstrap/scss/containers";
17
+ @import "headmin/vendor/bootstrap/scss/grid";
18
+ @import "headmin/vendor/bootstrap/scss/tables";
19
+ @import "headmin/vendor/bootstrap/scss/forms";
20
+ @import "headmin/vendor/bootstrap/scss/buttons";
21
+ @import "headmin/vendor/bootstrap/scss/transitions";
22
+ @import "headmin/vendor/bootstrap/scss/dropdown";
23
+ @import "headmin/vendor/bootstrap/scss/button-group";
24
+ @import "headmin/vendor/bootstrap/scss/nav";
25
+ @import "headmin/vendor/bootstrap/scss/navbar";
26
+ @import "headmin/vendor/bootstrap/scss/card";
27
+ @import "headmin/vendor/bootstrap/scss/accordion";
28
+ @import "headmin/vendor/bootstrap/scss/breadcrumb";
29
+ @import "headmin/vendor/bootstrap/scss/pagination";
30
+ @import "headmin/vendor/bootstrap/scss/badge";
31
+ @import "headmin/vendor/bootstrap/scss/alert";
32
+ @import "headmin/vendor/bootstrap/scss/progress";
33
+ @import "headmin/vendor/bootstrap/scss/list-group";
34
+ @import "headmin/vendor/bootstrap/scss/close";
35
+ @import "headmin/vendor/bootstrap/scss/toasts";
36
+ @import "headmin/vendor/bootstrap/scss/modal";
37
+ @import "headmin/vendor/bootstrap/scss/tooltip";
38
+ @import "headmin/vendor/bootstrap/scss/popover";
39
+ @import "headmin/vendor/bootstrap/scss/carousel";
40
+ @import "headmin/vendor/bootstrap/scss/spinners";
41
+ @import "headmin/vendor/bootstrap/scss/helpers";
42
+ @import "headmin/vendor/bootstrap/scss/utilities/api";
43
+
44
+ // Tom select
45
+ @import "headmin/vendor/tom-select-bootstrap";
46
+
47
+ // Flatpickr
48
+ @import "headmin/vendor/flatpickr";
49
+
50
+ // Redactor
51
+ @import "headmin/vendor/redactorx";
52
+ @import "headmin/overrides/redactorx";
53
+
54
+ // Headmin
55
+ @import "headmin/filters";
56
+ @import "headmin/form";
57
+ @import "headmin/general";
58
+ @import "headmin/layout";
59
+ @import "headmin/login";
60
+ @import "headmin/table";
61
+ @import "headmin/utilities";
62
+ @import "headmin/filter";
63
+ @import "headmin/popup";
64
+ @import "headmin/thumbnail";
65
+ @import "headmin/syntax";
@@ -6,4 +6,4 @@ module Headmin
6
6
  before_action :authenticate_admin!
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -9,7 +9,7 @@ module Headmin
9
9
  end
10
10
 
11
11
  def search_params
12
- @search_params ||= params[:search] && params[:search].to_s
12
+ @search_params ||= params[:search]&.to_s
13
13
  end
14
14
  end
15
15
  end
@@ -12,8 +12,8 @@ module Headmin
12
12
 
13
13
  def sort_by_params(collection)
14
14
  sort_params.each do |key, value|
15
- next unless %w(asc desc).include?(value)
16
- attribute = key.gsub('sort_', '')
15
+ next unless %w[asc desc].include?(value)
16
+ attribute = key.gsub("sort_", "")
17
17
 
18
18
  # Sort on model columns first, then check for translation columns
19
19
  if collection.attribute_names.include?(attribute.to_s)
@@ -26,19 +26,19 @@ module Headmin
26
26
 
27
27
  order_scope = "order_by_#{attribute}".to_sym
28
28
  sort_scope = "sort_by_#{attribute}".to_sym
29
- if collection.respond_to?(order_scope)
30
- collection = collection.send(order_scope, value)
29
+ collection = if collection.respond_to?(order_scope)
30
+ collection.send(order_scope, value)
31
31
  elsif collection.respond_to?(sort_scope)
32
- collection = collection.send(sort_scope, value)
32
+ collection.send(sort_scope, value)
33
33
  else
34
- collection = collection.order(column.send(value))
34
+ collection.order(column.send(value))
35
35
  end
36
36
  end
37
37
  collection
38
38
  end
39
39
 
40
40
  def sort_params
41
- params.permit!.select { |p| p.to_s.include?('sort_') }
41
+ params.permit!.select { |p| p.to_s.include?("sort_") }
42
42
  end
43
43
  end
44
44
  end
@@ -5,5 +5,6 @@ module Headmin
5
5
  include Headmin::FormHelper
6
6
  include Headmin::NotificationHelper
7
7
  include Headmin::RequestHelper
8
+ include Headmin::DocumentationHelper
8
9
  end
9
- end
10
+ end
@@ -1,9 +1,9 @@
1
1
  module Headmin
2
2
  module BootstrapHelper
3
3
  def bootstrap_icon(icon, options = {})
4
- data = options.has_key?(:data) ? options[:data] : nil
5
- klass = options.has_key?(:class) ? options[:class] : nil
6
- content_tag(:i, class: "bi bi-#{icon} #{klass}", data: data) {}
4
+ tag_name = options.extract!(:tag_name).fetch(:tag_name, :i)
5
+ options[:class] = ["bi", "bi-#{icon}", options.dig(:class)].compact.join(" ")
6
+ content_tag(tag_name, options) {}
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -0,0 +1,35 @@
1
+ module Headmin
2
+ module DocumentationHelper
3
+ def extract_documentation(text)
4
+ # Get content inside documentation block
5
+ starts_with = '<% documentation do %>\n'
6
+ ends_with = '\n<% end %>'
7
+ between = text[/#{starts_with}(.*?)#{ends_with}/m, 1]
8
+
9
+ # Remove leading whitespaces from each line
10
+ between.lines.map { |line| line.sub(" ", "") }.join
11
+ end
12
+
13
+ def markdown_to_html(text)
14
+ renderer = Headmin::DocumentationRenderer.new(escape_html: true)
15
+ markdown = Redcarpet::Markdown.new(renderer, tables: true, fenced_code_blocks: true)
16
+ markdown.render(text)
17
+ end
18
+
19
+ def documentation(template = nil)
20
+ # Disable rendering inside block
21
+ return if block_given?
22
+
23
+ # Read contents of template
24
+ content = @lookup_context.find_template(template, nil, true).encode!
25
+
26
+ # Extract documentation
27
+ content = extract_documentation(content)
28
+
29
+ # Convert markdown into HTML
30
+ html = markdown_to_html(content)
31
+
32
+ raw html
33
+ end
34
+ end
35
+ end
@@ -13,4 +13,4 @@ module Headmin
13
13
  end
14
14
  end
15
15
  end
16
- end
16
+ end
@@ -5,12 +5,16 @@ module Headmin
5
5
  end
6
6
 
7
7
  def form_field_validation_id(form, name)
8
- [form.object_name, name.to_s, 'validation'].join('_').parameterize.underscore
8
+ [form.object_name, name.to_s, "validation"].join("_").parameterize.underscore
9
9
  end
10
10
 
11
11
  def form_field_validation_class(form, name)
12
12
  return nil if request.get?
13
- form.object.errors.has_key?(name) ? 'is-invalid' : 'is-valid'
13
+ form.object.errors.has_key?(name) ? "is-invalid" : "is-valid"
14
+ end
15
+
16
+ def human_attribute_name(attribute)
17
+ attribute.to_s.humanize
14
18
  end
15
19
 
16
20
  # Outputs currently present query parameters as hidden fields for a given form
@@ -33,4 +37,4 @@ module Headmin
33
37
  test.join.html_safe
34
38
  end
35
39
  end
36
- end
40
+ end
@@ -2,30 +2,30 @@ module Headmin
2
2
  module NotificationHelper
3
3
  def notification_color(name)
4
4
  color = {
5
- notice: {
6
- background: 'bg-success',
7
- text: 'text-white'
8
- },
9
- error: {
10
- text: 'text-dark',
11
- background: 'bg-danger'
12
- },
13
- alert: {
14
- text: 'text-dark',
15
- background: 'bg-warning'
16
- },
17
- timedout: {
18
- text: 'text-dark',
19
- background: 'bg-warning'
20
- },
21
- fallback: {
22
- text: 'text-light',
23
- background: 'bg-info',
24
- }
5
+ notice: {
6
+ background: "bg-success",
7
+ text: "text-white"
8
+ },
9
+ error: {
10
+ text: "text-dark",
11
+ background: "bg-danger"
12
+ },
13
+ alert: {
14
+ text: "text-dark",
15
+ background: "bg-warning"
16
+ },
17
+ timedout: {
18
+ text: "text-dark",
19
+ background: "bg-warning"
20
+ },
21
+ fallback: {
22
+ text: "text-light",
23
+ background: "bg-info"
24
+ }
25
25
  }
26
26
 
27
27
  name = name.to_sym
28
28
  color.key?(name) ? color[name] : color[:fallback]
29
29
  end
30
30
  end
31
- end
31
+ end
@@ -3,15 +3,10 @@ module Headmin
3
3
  def current_url?(url)
4
4
  uri = URI(url)
5
5
  path = uri.path
6
- query_string = uri.query
6
+ query_string = uri.query || ""
7
7
  matches_path = request.path.include?(path)
8
- matches_query = uri.query ? request.query_string.include?(query_string) : true
9
- is_root = request.fullpath == url
10
- if url == admin_root_path
11
- is_root
12
- else
13
- matches_path && matches_query
14
- end
8
+ matches_query = request.query_string.include?(query_string)
9
+ matches_path && matches_query
15
10
  end
16
11
 
17
12
  def default_params
@@ -33,7 +28,7 @@ module Headmin
33
28
  end
34
29
 
35
30
  def is_sort_param_key?(key)
36
- key.to_s.include?('sort_')
31
+ key.to_s.include?("sort_")
37
32
  end
38
33
  end
39
- end
34
+ end
@@ -3,9 +3,8 @@ module Headmin
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
-
7
6
  # Associations
8
7
  belongs_to :blockable, polymorphic: true, optional: true, touch: true
9
8
  end
10
9
  end
11
- end
10
+ end
@@ -7,4 +7,4 @@ module Headmin
7
7
  accepts_nested_attributes_for :blocks, allow_destroy: true
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -14,4 +14,4 @@ module Headmin
14
14
  has_one_attached :file
15
15
  end
16
16
  end
17
- end
17
+ end
@@ -24,27 +24,27 @@ module Headmin
24
24
  when Hash
25
25
  fields.build(
26
26
  name: key,
27
- field_type: 'group',
27
+ field_type: "group",
28
28
  fields: parse_fields_hash(value)
29
29
  )
30
30
  when Array
31
31
  fields.build(
32
32
  name: key,
33
- field_type: 'list',
33
+ field_type: "list",
34
34
  fields: value.map do |item|
35
- fields.new(name: 'item', field_type: 'group', fields: parse_fields_hash(item))
35
+ fields.new(name: "item", field_type: "group", fields: parse_fields_hash(item))
36
36
  end
37
37
  )
38
38
  when String
39
39
  fields.build(
40
40
  name: key,
41
- field_type: 'text',
41
+ field_type: "text",
42
42
  value: value
43
43
  )
44
44
  else
45
45
  fields.build(
46
46
  name: key,
47
- field_type: 'file',
47
+ field_type: "file",
48
48
  file: value
49
49
  )
50
50
  end
@@ -52,7 +52,7 @@ module Headmin
52
52
  end
53
53
 
54
54
  def parse_hash_tree(hash_tree)
55
- Hash[hash_tree.map do |field, children|
55
+ hash_tree.map do |field, children|
56
56
  case field.field_type.to_sym
57
57
  when :group
58
58
  children = children.any? ? children : field.hash_tree
@@ -67,8 +67,8 @@ module Headmin
67
67
  else
68
68
  [field.name, field.value]
69
69
  end
70
- end]
70
+ end.to_h
71
71
  end
72
72
  end
73
73
  end
74
- end
74
+ end
@@ -0,0 +1,32 @@
1
+ module Headmin
2
+ class DocumentationRenderer < Redcarpet::Render::HTML
3
+ def block_code(code, language)
4
+ if language == "erbx"
5
+ "<div class=\"card mb-3\"><div class=\"card-body\">#{render_code(code)}</div><div class=\"card-footer\"><pre><code class=\"h-syntax\">#{highlight_syntax(code, "erb")}</code></pre></div></div>"
6
+ else
7
+ "<pre><code class=\"h-syntax\">#{highlight_syntax(code, language)}</code></pre></div>"
8
+ end
9
+ end
10
+
11
+ def table(header, body)
12
+ "<table class=\"table table-sm\">#{header}#{body}</table>"
13
+ end
14
+
15
+ private
16
+
17
+ def highlight_syntax(code, language)
18
+ formatter = Rouge::Formatters::HTML.new
19
+ lexer = Rouge::Lexer.find(language)
20
+ formatter.format(lexer.lex(code))
21
+ end
22
+
23
+ def render_code(code)
24
+ ApplicationController.renderer.new(
25
+ "action_dispatch.request.path_parameters" => {
26
+ controller: "main",
27
+ action: "index"
28
+ }
29
+ ).render(inline: code)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,78 @@
1
+ module Headmin
2
+ module Form
3
+ class Base
4
+ def initialize(local_assigns)
5
+ @local_assigns = local_assigns
6
+ end
7
+
8
+ def class_names
9
+ class_names = [@local_assigns[:class]]
10
+ class_names << "form-floating" if float
11
+ class_names << "mb-3 text-start"
12
+ class_names.join(" ")
13
+ end
14
+
15
+ def data
16
+ @local_assigns[:data]
17
+ end
18
+
19
+ def label_options
20
+ {
21
+ attribute: attribute,
22
+ class: "d-block",
23
+ for: id,
24
+ form: form,
25
+ required: required,
26
+ text: label
27
+ }
28
+ end
29
+
30
+ def required
31
+ @local_assigns[:required]
32
+ end
33
+
34
+ def form
35
+ @local_assigns[:form]
36
+ end
37
+
38
+ def id
39
+ @local_assigns[:id]
40
+ end
41
+
42
+ def validation_options
43
+ {
44
+ attribute: attribute,
45
+ form: form
46
+ }
47
+ end
48
+
49
+ def attribute
50
+ @local_assigns[:attribute]
51
+ end
52
+
53
+ def list
54
+ @local_assigns[:list]
55
+ end
56
+
57
+ def list_id
58
+ list ? "#{attribute}_list" : nil
59
+ end
60
+
61
+ def append
62
+ @local_assigns[:append]
63
+ end
64
+
65
+ def prepend
66
+ @local_assigns[:prepend]
67
+ end
68
+
69
+ def float
70
+ @local_assigns[:float] || false
71
+ end
72
+
73
+ def label
74
+ @local_assigns[:label]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,51 @@
1
+ module Headmin
2
+ module Form
3
+ class Text
4
+ def initialize(local_assigns, request)
5
+ @local_assigns = local_assigns
6
+ @request = request
7
+ end
8
+
9
+ def placeholder
10
+ @local_assigns[:float] ? @local_assigns[:placeholder] || attribute : @local_assigns[:placeholder]
11
+ end
12
+
13
+ def attribute
14
+ @local_assigns[:attribute]
15
+ end
16
+
17
+ def form
18
+ @local_assigns[:form]
19
+ end
20
+
21
+ def options
22
+ option_keys = %i[aria autocomplete autofocus data disabled id maxlength minlength list pattern placeholder readonly required spellcheck size value]
23
+ @local_assigns.slice(*option_keys).merge(
24
+ aria: {describedby: form_field_validation_id(form, attribute)},
25
+ class: ["form-control", form_field_validation_class(form, attribute)].join(" "),
26
+ list: @local_assigns[:list] ? "#{attribute}_list" : nil,
27
+ placeholder: placeholder
28
+ )
29
+ end
30
+
31
+ attr_reader :local_assigns
32
+
33
+ def form_field_valid?(form, name)
34
+ return unless form.object
35
+
36
+ !form.object.errors.has_key?(name)
37
+ end
38
+
39
+ def form_field_validation_id(form, name)
40
+ return unless form.object
41
+
42
+ [form.object_name, name.to_s, "validation"].join("_").parameterize.underscore
43
+ end
44
+
45
+ def form_field_validation_class(form, name)
46
+ return nil if @request.get?
47
+ form.object.errors.has_key?(name) ? "is-invalid" : "is-valid"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,61 @@
1
+ module Headmin
2
+ class Thumbnail
3
+ def initialize(local_assigns)
4
+ @local_assigns = local_assigns
5
+ end
6
+
7
+ def class_names
8
+ class_names = [@local_assigns[:class]]
9
+ class_names << "img-thumbnail h-thumbnail"
10
+ class_names.join(" ")
11
+ end
12
+
13
+ def width
14
+ @local_assigns[:width] || 150
15
+ end
16
+
17
+ def height
18
+ @local_assigns[:height] || 150
19
+ end
20
+
21
+ def src
22
+ @local_assigns[:src]
23
+ end
24
+
25
+ def mime_type
26
+ if src
27
+ stripped_path = URI.parse(src).path
28
+ extension = File.extname(stripped_path)
29
+ Rack::Mime.mime_type(extension)
30
+ end
31
+ end
32
+
33
+ def image?
34
+ mime_type&.match?(/^image/)
35
+ end
36
+
37
+ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
38
+ def icon_name
39
+ type_map = {
40
+ image: %w[image/bmp image/gif image/vnd.microsoft.icon image/jpeg image/png image/svg+xml image/tiff image/webp],
41
+ play: %w[video/mp4 video/mpeg video/ogg video/mp2t video/webm video/3gpp video/3gpp2],
42
+ music: %w[audio/aac audio/midi audio/x-midi audio/mpeg audio/ogg audio/opus audio/wav audio/webm audio/3gpp audio/3gpp2],
43
+ word: %w[application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document],
44
+ ppt: %w[application/vnd.ms-powerpoint application/vnd.openxmlformats-officedocument.presentationml.presentation],
45
+ excel: %w[application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet],
46
+ slides: %w[application/vnd.oasis.opendocument.presentation],
47
+ spreadsheet: %w[application/vnd.oasis.opendocument.spreadsheet],
48
+ richtext: %w[application/vnd.oasis.opendocument.text],
49
+ zip: %w[application/zip application/x-7z-compressed application/x-bzip application/x-bzip2 application/gzip application/vnd.rar],
50
+ pdf: %w[application/pdf]
51
+ }
52
+
53
+ type = type_map.find { |key, mime_types| mime_types.include?(mime_type) }
54
+ if type
55
+ ["file", "earmark", type.first].compact.join("-")
56
+ else
57
+ "question"
58
+ end
59
+ end
60
+ end
61
+ end