trestle 0.9.9 → 0.10.0.pre

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 (328) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +31 -3
  3. data/.gitignore +3 -0
  4. data/Gemfile +5 -1
  5. data/README.md +2 -1
  6. data/app/assets/bundle/trestle/admin.css +23 -0
  7. data/app/assets/bundle/trestle/admin.js +83 -0
  8. data/app/assets/bundle/trestle/fa-brands-400.ttf +0 -0
  9. data/app/assets/bundle/trestle/fa-brands-400.woff2 +0 -0
  10. data/app/assets/bundle/trestle/fa-regular-400.ttf +0 -0
  11. data/app/assets/bundle/trestle/fa-regular-400.woff2 +0 -0
  12. data/app/assets/bundle/trestle/fa-solid-900.ttf +0 -0
  13. data/app/assets/bundle/trestle/fa-solid-900.woff2 +0 -0
  14. data/app/assets/bundle/trestle/locale/cs.js +110 -0
  15. data/app/assets/bundle/trestle/locale/de.js +116 -0
  16. data/app/assets/bundle/trestle/locale/en.js +329 -0
  17. data/app/assets/bundle/trestle/locale/es-MX.js +109 -0
  18. data/app/assets/bundle/trestle/locale/es.js +109 -0
  19. data/app/assets/bundle/trestle/locale/fr.js +111 -0
  20. data/app/assets/bundle/trestle/locale/ko.js +111 -0
  21. data/app/assets/bundle/trestle/locale/lv.js +109 -0
  22. data/app/assets/bundle/trestle/locale/nl.js +96 -0
  23. data/app/assets/bundle/trestle/locale/pl.js +99 -0
  24. data/app/assets/bundle/trestle/locale/pt-BR.js +98 -0
  25. data/app/assets/bundle/trestle/locale/vi.js +116 -0
  26. data/app/assets/bundle/trestle/locale/zh-CN.js +109 -0
  27. data/app/assets/bundle/trestle/photoswipe-7aa1aec9c3c1fd65c382.digested.js +6 -0
  28. data/app/assets/sprockets/trestle/custom.css +1 -0
  29. data/app/assets/sprockets/trestle/icons/font-awesome.css.erb +32 -0
  30. data/app/assets/sprockets/trestle/manifest.js +4 -0
  31. data/app/assets/stylesheets/trestle/custom.css +6 -1
  32. data/app/controllers/concerns/trestle/controller/helpers.rb +2 -0
  33. data/app/controllers/concerns/trestle/controller/location.rb +1 -6
  34. data/app/controllers/concerns/trestle/controller/modal.rb +23 -0
  35. data/app/controllers/concerns/trestle/controller/turbo.rb +21 -0
  36. data/app/controllers/concerns/trestle/resource/controller/actions.rb +39 -28
  37. data/app/controllers/concerns/trestle/resource/controller/redirection.rb +5 -5
  38. data/app/controllers/trestle/application_controller.rb +2 -1
  39. data/app/helpers/trestle/flash_helper.rb +10 -0
  40. data/app/helpers/trestle/form_helper.rb +3 -2
  41. data/app/helpers/trestle/format_helper.rb +2 -1
  42. data/app/helpers/trestle/i18n_helper.rb +46 -7
  43. data/app/helpers/trestle/modal_helper.rb +34 -0
  44. data/app/helpers/trestle/tab_helper.rb +1 -1
  45. data/app/helpers/trestle/turbo_frame_helper.rb +34 -0
  46. data/app/helpers/trestle/url_helper.rb +7 -4
  47. data/app/views/layouts/trestle/admin.html.erb +16 -18
  48. data/app/views/layouts/trestle/admin.turbo_stream.erb +11 -0
  49. data/app/views/layouts/trestle/modal.html.erb +5 -0
  50. data/app/views/trestle/_i18n.html.erb +12 -0
  51. data/app/views/trestle/_theme.html.erb +15 -0
  52. data/app/views/trestle/application/_header.html.erb +1 -1
  53. data/app/views/trestle/application/_layout.html.erb +6 -3
  54. data/app/views/trestle/application/_modal.html.erb +36 -0
  55. data/app/views/trestle/application/_tabs.html.erb +4 -4
  56. data/app/views/trestle/flash/_alert.html.erb +1 -1
  57. data/app/views/trestle/flash/_debug.html.erb +1 -1
  58. data/app/views/trestle/resource/_form.html.erb +5 -0
  59. data/app/views/trestle/resource/create.turbo_stream.erb +5 -0
  60. data/app/views/trestle/resource/destroy.turbo_stream.erb +1 -0
  61. data/app/views/trestle/resource/edit.html.erb +4 -2
  62. data/app/views/trestle/resource/index.html.erb +12 -10
  63. data/app/views/trestle/resource/new.html.erb +4 -2
  64. data/app/views/trestle/resource/show.html.erb +4 -2
  65. data/app/views/trestle/resource/update.turbo_stream.erb +5 -0
  66. data/app/views/trestle/shared/_sidebar.html.erb +9 -9
  67. data/frontend/css/components/_alerts.scss +19 -17
  68. data/frontend/css/components/_background.scss +7 -35
  69. data/frontend/css/components/_badges.scss +31 -0
  70. data/frontend/css/components/_breadcrumbs.scss +4 -4
  71. data/frontend/css/components/_buttons.scss +5 -4
  72. data/frontend/css/components/_datepicker.scss +12 -8
  73. data/frontend/css/components/_dropdown.scss +23 -3
  74. data/frontend/css/components/{_fields.scss → _forms.scss} +16 -3
  75. data/frontend/css/components/_media-grid.scss +52 -44
  76. data/frontend/css/components/_modal.scss +33 -4
  77. data/frontend/css/components/_pagination.scss +1 -1
  78. data/frontend/css/components/_photoswipe.scss +8 -0
  79. data/frontend/css/components/_popover.scss +1 -0
  80. data/frontend/css/components/_scopes.scss +1 -1
  81. data/frontend/css/components/_select.scss +161 -31
  82. data/frontend/css/components/_table.scss +60 -65
  83. data/frontend/css/components/_tabs.scss +10 -3
  84. data/frontend/css/components/_tags.scss +71 -16
  85. data/frontend/css/components/_toolbars.scss +16 -11
  86. data/frontend/css/components/_turbo.scss +3 -0
  87. data/frontend/css/core/_bootstrap.scss +46 -0
  88. data/frontend/css/core/_dependencies.scss +4 -3
  89. data/frontend/css/core/_functions.scss +39 -0
  90. data/frontend/css/core/_mixins.scss +2 -36
  91. data/frontend/css/core/_theme.scss +258 -0
  92. data/frontend/css/core/_typography.scss +10 -1
  93. data/frontend/css/icons/_fontawesome.scss +3 -15
  94. data/frontend/css/index.scss +12 -6
  95. data/frontend/css/layout/_base.scss +3 -3
  96. data/frontend/css/layout/_content.scss +10 -6
  97. data/frontend/css/layout/_footer.scss +1 -1
  98. data/frontend/css/layout/_header.scss +5 -3
  99. data/frontend/css/layout/_navigation.scss +2 -2
  100. data/frontend/css/layout/_sidebar.scss +19 -9
  101. data/frontend/css/support/_sprockets.scss +2 -0
  102. data/frontend/css/support/_webpack.scss +2 -0
  103. data/frontend/css/variables/_bootstrap.scss +134 -40
  104. data/frontend/css/variables/_maps.scss +15 -0
  105. data/frontend/css/variables/_trestle.scss +55 -26
  106. data/frontend/js/controllers/application_controller.js +17 -0
  107. data/frontend/js/controllers/checkbox_select_controller.js +43 -0
  108. data/frontend/js/controllers/confirm_controller.js +115 -0
  109. data/frontend/js/controllers/confirm_delete_controller.js +11 -0
  110. data/frontend/js/controllers/datepicker_controller.js +12 -0
  111. data/frontend/js/controllers/datetimepicker_controller.js +13 -0
  112. data/frontend/js/controllers/deprecated/init_controller.js +9 -0
  113. data/frontend/js/controllers/flatpickr_controller.js +50 -0
  114. data/frontend/js/controllers/follow_url_controller.js +36 -0
  115. data/frontend/js/controllers/form_error_controller.js +24 -0
  116. data/frontend/js/controllers/form_loading_controller.js +50 -0
  117. data/frontend/js/controllers/gallery_controller.js +10 -0
  118. data/frontend/js/controllers/index.js +19 -0
  119. data/frontend/js/controllers/keyboard_submit_controller.js +25 -0
  120. data/frontend/js/controllers/lightbox_controller.js +160 -0
  121. data/frontend/js/controllers/mobile_sidebar_controller.js +30 -0
  122. data/frontend/js/controllers/modal_controller.js +36 -0
  123. data/frontend/js/controllers/modal_frame_controller.js +11 -0
  124. data/frontend/js/controllers/modal_trigger_controller.js +74 -0
  125. data/frontend/js/{components/navigation.js → controllers/navigation_controller.js} +14 -10
  126. data/frontend/js/controllers/navigation_tooltip_controller.js +32 -0
  127. data/frontend/js/controllers/popover_controller.js +87 -0
  128. data/frontend/js/controllers/reloadable_controller.js +34 -0
  129. data/frontend/js/controllers/select_controller.js +49 -0
  130. data/frontend/js/controllers/sidebar_controller.js +33 -0
  131. data/frontend/js/controllers/tab_errors_controller.js +45 -0
  132. data/frontend/js/controllers/tabs_controller.js +45 -0
  133. data/frontend/js/controllers/timepicker_controller.js +14 -0
  134. data/frontend/js/controllers/toggle_attr_controller.js +27 -0
  135. data/frontend/js/controllers/toggle_class_controller.js +27 -0
  136. data/frontend/js/controllers/tooltip_controller.js +13 -0
  137. data/frontend/js/controllers/wrapper_controller.js +43 -0
  138. data/frontend/js/core/backdrop.js +100 -0
  139. data/frontend/js/core/error_modal.js +65 -0
  140. data/frontend/js/core/fetch.js +32 -0
  141. data/frontend/js/core/i18n.js +24 -10
  142. data/frontend/js/core/modal.js +52 -0
  143. data/frontend/js/core/stream_actions.js +56 -0
  144. data/frontend/js/core/turbo_errors.js +9 -0
  145. data/frontend/js/{core → deprecated}/events.js +1 -8
  146. data/frontend/js/deprecated/tooltip.js +8 -0
  147. data/frontend/js/index.js +28 -40
  148. data/frontend/js/mixins/index.js +5 -0
  149. data/frontend/js/mixins/photoswipe.js +10 -0
  150. data/frontend/js/util/bootstrap.js +93 -0
  151. data/i18n/config.yml +14 -0
  152. data/i18n/environment.rb +8 -0
  153. data/i18n/export +3 -0
  154. data/i18n/template.erb +1 -0
  155. data/lib/generators/trestle/install/install_generator.rb +3 -8
  156. data/lib/generators/trestle/install/templates/trestle.rb.erb +5 -5
  157. data/lib/trestle/color.rb +113 -0
  158. data/lib/trestle/configuration.rb +16 -8
  159. data/lib/trestle/engine.rb +23 -17
  160. data/lib/trestle/form/fields/check_box_helpers.rb +7 -18
  161. data/lib/trestle/form/fields/collection_select.rb +1 -1
  162. data/lib/trestle/form/fields/color_field.rb +4 -0
  163. data/lib/trestle/form/fields/date_field.rb +4 -0
  164. data/lib/trestle/form/fields/date_picker.rb +10 -4
  165. data/lib/trestle/form/fields/date_select.rb +1 -1
  166. data/lib/trestle/form/fields/datetime_field.rb +4 -0
  167. data/lib/trestle/form/fields/datetime_select.rb +1 -1
  168. data/lib/trestle/form/fields/file_field.rb +3 -28
  169. data/lib/trestle/form/fields/form_control.rb +2 -2
  170. data/lib/trestle/form/fields/form_group.rb +1 -1
  171. data/lib/trestle/form/fields/grouped_collection_select.rb +1 -1
  172. data/lib/trestle/form/fields/radio_button_helpers.rb +5 -17
  173. data/lib/trestle/form/fields/range_field.rb +1 -5
  174. data/lib/trestle/form/fields/select.rb +17 -1
  175. data/lib/trestle/form/fields/time_field.rb +4 -0
  176. data/lib/trestle/form/fields/time_select.rb +1 -1
  177. data/lib/trestle/form/fields/time_zone_select.rb +1 -1
  178. data/lib/trestle/form/renderer.rb +3 -0
  179. data/lib/trestle/form.rb +16 -1
  180. data/lib/trestle/resource/toolbar.rb +2 -2
  181. data/lib/trestle/table/actions_column.rb +2 -2
  182. data/lib/trestle/table/row.rb +2 -1
  183. data/lib/trestle/table/select_column.rb +3 -6
  184. data/lib/trestle/table.rb +6 -1
  185. data/lib/trestle/toolbar/item.rb +1 -1
  186. data/lib/trestle/toolbar/menu.rb +3 -6
  187. data/lib/trestle/version.rb +1 -1
  188. data/lib/trestle.rb +2 -23
  189. data/package.json +31 -27
  190. data/trestle.gemspec +2 -3
  191. data/webpack.config.js +10 -10
  192. data/yarn.lock +1456 -1194
  193. metadata +166 -164
  194. data/app/assets/bundle/trestle/bundle.css +0 -12
  195. data/app/assets/bundle/trestle/bundle.js +0 -89
  196. data/app/assets/bundle/trestle/fa-brands-400.eot +0 -0
  197. data/app/assets/bundle/trestle/fa-brands-400.svg +0 -3717
  198. data/app/assets/bundle/trestle/fa-brands-400.woff +0 -0
  199. data/app/assets/bundle/trestle/fa-regular-400.eot +0 -0
  200. data/app/assets/bundle/trestle/fa-regular-400.svg +0 -801
  201. data/app/assets/bundle/trestle/fa-regular-400.woff +0 -0
  202. data/app/assets/bundle/trestle/fa-solid-900.eot +0 -0
  203. data/app/assets/bundle/trestle/fa-solid-900.svg +0 -5034
  204. data/app/assets/bundle/trestle/fa-solid-900.woff +0 -0
  205. data/app/assets/javascripts/trestle/admin.js +0 -3
  206. data/app/assets/javascripts/trestle/i18n.js.erb +0 -8
  207. data/app/assets/stylesheets/trestle/admin.css +0 -2
  208. data/app/assets/stylesheets/trestle/icons/_font-awesome.css.erb +0 -40
  209. data/app/controllers/concerns/trestle/controller/dialog.rb +0 -16
  210. data/app/views/trestle/application/_dialog.html.erb +0 -34
  211. data/frontend/css/components/_color-vars.scss +0 -10
  212. data/frontend/css/components/_custom-forms.scss +0 -35
  213. data/frontend/css/components/_magnific-popup.scss +0 -36
  214. data/frontend/css/components/_turbolinks.scss +0 -3
  215. data/frontend/js/components/confirmation.js +0 -32
  216. data/frontend/js/components/datepicker.js +0 -69
  217. data/frontend/js/components/dialog.js +0 -149
  218. data/frontend/js/components/file.js +0 -7
  219. data/frontend/js/components/form.js +0 -100
  220. data/frontend/js/components/gallery.js +0 -33
  221. data/frontend/js/components/pagination.js +0 -51
  222. data/frontend/js/components/select.js +0 -18
  223. data/frontend/js/components/sidebar.js +0 -75
  224. data/frontend/js/components/table.js +0 -61
  225. data/frontend/js/components/tabs.js +0 -59
  226. data/frontend/js/components/tooltips.js +0 -25
  227. data/frontend/js/core/contexts.js +0 -17
  228. data/frontend/js/core/turbolinks.js +0 -3
  229. data/frontend/js/core/visit.js +0 -16
  230. data/frontend/theme/trestle/_theme.scss +0 -4
  231. data/frontend/theme/trestle/_variables.scss +0 -4
  232. data/frontend/theme/trestle/theme/_defaults.scss +0 -152
  233. data/frontend/theme/trestle/theme/_functions.scss +0 -44
  234. data/frontend/theme/trestle/theme/_variables.scss +0 -15
  235. data/frontend/theme/trestle/theme/bootstrap/_alert.scss +0 -19
  236. data/frontend/theme/trestle/theme/bootstrap/_badge.scss +0 -25
  237. data/frontend/theme/trestle/theme/bootstrap/_buttons.scss +0 -93
  238. data/frontend/theme/trestle/theme/bootstrap/_color-vars.scss +0 -11
  239. data/frontend/theme/trestle/theme/bootstrap/_custom-forms.scss +0 -93
  240. data/frontend/theme/trestle/theme/bootstrap/_dropdown.scss +0 -6
  241. data/frontend/theme/trestle/theme/bootstrap/_forms.scss +0 -6
  242. data/frontend/theme/trestle/theme/bootstrap/_links.scss +0 -7
  243. data/frontend/theme/trestle/theme/bootstrap/_list-group.scss +0 -31
  244. data/frontend/theme/trestle/theme/bootstrap/_nav.scss +0 -6
  245. data/frontend/theme/trestle/theme/bootstrap/_pagination.scss +0 -18
  246. data/frontend/theme/trestle/theme/bootstrap/_progress.scss +0 -3
  247. data/frontend/theme/trestle/theme/bootstrap/_tables.scss +0 -41
  248. data/frontend/theme/trestle/theme/bootstrap/_utilities.scss +0 -3
  249. data/frontend/theme/trestle/theme/bootstrap/utilities/_background.scss +0 -17
  250. data/frontend/theme/trestle/theme/bootstrap/utilities/_borders.scss +0 -5
  251. data/frontend/theme/trestle/theme/bootstrap/utilities/_text.scss +0 -18
  252. data/frontend/theme/trestle/theme/trestle/_background.scss +0 -61
  253. data/frontend/theme/trestle/theme/trestle/_datepicker.scss +0 -58
  254. data/frontend/theme/trestle/theme/trestle/_headers.scss +0 -4
  255. data/frontend/theme/trestle/theme/trestle/_navbar.scss +0 -15
  256. data/frontend/theme/trestle/theme/trestle/_navigation.scss +0 -5
  257. data/frontend/theme/trestle/theme/trestle/_select2.scss +0 -22
  258. data/frontend/theme/trestle/theme/trestle/_tags.scss +0 -12
  259. data/frontend/theme/trestle/theme/trestle/_turbolinks.scss +0 -3
  260. data/frontend/theme/trestle/theme.scss +0 -29
  261. data/lib/generators/trestle/install/templates/_theme.scss +0 -13
  262. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ar-dz.js +0 -0
  263. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ar.js +0 -0
  264. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/at.js +0 -0
  265. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/az.js +0 -0
  266. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/be.js +0 -0
  267. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/bg.js +0 -0
  268. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/bn.js +0 -0
  269. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/bs.js +0 -0
  270. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/cat.js +0 -0
  271. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ckb.js +0 -0
  272. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/cs.js +0 -0
  273. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/cy.js +0 -0
  274. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/da.js +0 -0
  275. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/de.js +0 -0
  276. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/default.js +0 -0
  277. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/eo.js +0 -0
  278. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/es.js +0 -0
  279. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/et.js +0 -0
  280. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/fa.js +0 -0
  281. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/fi.js +0 -0
  282. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/fo.js +0 -0
  283. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/fr.js +0 -0
  284. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ga.js +0 -0
  285. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/gr.js +0 -0
  286. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/he.js +0 -0
  287. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/hi.js +0 -0
  288. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/hr.js +0 -0
  289. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/hu.js +0 -0
  290. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/hy.js +0 -0
  291. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/id.js +0 -0
  292. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/is.js +0 -0
  293. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/it.js +0 -0
  294. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ja.js +0 -0
  295. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ka.js +0 -0
  296. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/km.js +0 -0
  297. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ko.js +0 -0
  298. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/kz.js +0 -0
  299. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/lt.js +0 -0
  300. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/lv.js +0 -0
  301. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/mk.js +0 -0
  302. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/mn.js +0 -0
  303. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ms.js +0 -0
  304. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/my.js +0 -0
  305. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/nl.js +0 -0
  306. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/nn.js +0 -0
  307. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/no.js +0 -0
  308. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/pa.js +0 -0
  309. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/pl.js +0 -0
  310. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/pt.js +0 -0
  311. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ro.js +0 -0
  312. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/ru.js +0 -0
  313. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/si.js +0 -0
  314. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/sk.js +0 -0
  315. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/sl.js +0 -0
  316. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/sq.js +0 -0
  317. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/sr-cyr.js +0 -0
  318. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/sr.js +0 -0
  319. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/sv.js +0 -0
  320. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/th.js +0 -0
  321. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/tr.js +0 -0
  322. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/uk.js +0 -0
  323. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/uz.js +0 -0
  324. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/uz_latn.js +0 -0
  325. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/vn.js +0 -0
  326. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/zh-tw.js +0 -0
  327. /data/app/assets/bundle/trestle/{flatpickr → locale/flatpickr}/zh.js +0 -0
  328. /data/app/assets/{stylesheets → sprockets}/trestle/_custom.css +0 -0
@@ -0,0 +1,52 @@
1
+ import { Modal as BootstrapModal } from 'bootstrap'
2
+
3
+ import Backdrop from './backdrop'
4
+ import { fetchTurboStream } from './fetch'
5
+
6
+ export default class Modal extends BootstrapModal {
7
+ static load (url, fetchParams) {
8
+ const backdrop = Backdrop.getInstance()
9
+ backdrop.loading(true)
10
+ backdrop.show()
11
+
12
+ Modal.existing.forEach((modal) => modal.classList.add('background'))
13
+
14
+ return new Promise((resolve) => {
15
+ document.addEventListener('modal:render', (e) => {
16
+ resolve(e.detail)
17
+ }, { capture: true, once: true })
18
+
19
+ fetchTurboStream(url, {
20
+ ...fetchParams,
21
+
22
+ headers: {
23
+ 'X-Trestle-Modal': true
24
+ }
25
+ })
26
+ })
27
+ }
28
+
29
+ static get existing () {
30
+ return document.querySelectorAll('.modal.show')
31
+ }
32
+
33
+ static restorePrevious () {
34
+ const previousModal = document.querySelector('.modal.show:last-child')
35
+
36
+ if (previousModal) {
37
+ previousModal.classList.remove('background')
38
+ }
39
+ }
40
+
41
+ constructor (element) {
42
+ super(element)
43
+
44
+ element.addEventListener('show.bs.modal', () => {
45
+ this._backdrop.loading(false)
46
+ })
47
+ }
48
+
49
+ _initializeBackDrop () {
50
+ return Backdrop.getInstance()
51
+ }
52
+ }
@@ -0,0 +1,56 @@
1
+ /* global CustomEvent */
2
+
3
+ import { StreamActions, visit } from '@hotwired/turbo'
4
+
5
+ import { Modal } from 'bootstrap'
6
+
7
+ const buildModalEvent = (modal) => {
8
+ return new CustomEvent('modal:render', { detail: modal })
9
+ }
10
+
11
+ StreamActions.modal = function () {
12
+ const target = document.getElementById('modal')
13
+ const modal = this.templateContent.querySelector('*')
14
+
15
+ target.appendChild(modal)
16
+ target.dispatchEvent(buildModalEvent(modal))
17
+ }
18
+
19
+ StreamActions.closeModal = function () {
20
+ this.targetElements.forEach((e) => {
21
+ const modalEl = e.closest('.modal')
22
+ const modal = Modal.getInstance(modalEl)
23
+ if (modal) { modal.hide() }
24
+ })
25
+ }
26
+
27
+ StreamActions.flash = function () {
28
+ const flashTarget = document.querySelector('.modal.show .modal-flash') || document.querySelector('#flash')
29
+
30
+ flashTarget.innerHTML = ""
31
+ flashTarget.append(this.templateContent)
32
+ }
33
+
34
+ StreamActions.reload = function () {
35
+ let reloadables
36
+
37
+ if (this.target || this.targets) {
38
+ reloadables = this.targetElements
39
+ } else {
40
+ reloadables = document.querySelectorAll('[data-controller="reloadable"]')
41
+ }
42
+
43
+ reloadables.forEach((frame) => {
44
+ const modal = frame.closest('.modal')
45
+ if (modal && !modal.classList.contains('show')) {
46
+ return
47
+ }
48
+
49
+ const controller = Stimulus.getControllerForElementAndIdentifier(frame, 'reloadable')
50
+ if (controller) { controller.reload() }
51
+ })
52
+ }
53
+
54
+ StreamActions.redirect = function () {
55
+ visit(this.target)
56
+ }
@@ -0,0 +1,9 @@
1
+ import ErrorModal from './error_modal'
2
+
3
+ document.addEventListener('turbo:frame-missing', async (e) => {
4
+ e.preventDefault()
5
+
6
+ const response = e.detail.response
7
+ const title = `${response.status} (${response.statusText})`
8
+ response.text().then(content => ErrorModal.show({ title, content }))
9
+ })
@@ -1,7 +1,5 @@
1
1
  import $ from 'jquery'
2
2
 
3
- import turbolinks from './turbolinks'
4
-
5
3
  // The ready function sets up a callback to run on each page load.
6
4
  //
7
5
  // Trestle.ready(function() {
@@ -42,9 +40,4 @@ ready(function () {
42
40
  triggerInit(document)
43
41
  })
44
42
 
45
- // Trigger the page load events.
46
- if (turbolinks) {
47
- $(document).on('turbolinks:load', triggerReady)
48
- } else {
49
- $(document).ready(triggerReady)
50
- }
43
+ document.addEventListener('turbo:load', () => triggerReady())
@@ -0,0 +1,8 @@
1
+ import { Tooltip } from 'bootstrap'
2
+
3
+ document.addEventListener('turbo:load', function () {
4
+ // eslint-disable-next-line no-new
5
+ new Tooltip(document.body, {
6
+ selector: '[data-toggle="tooltip"]'
7
+ })
8
+ })
data/frontend/js/index.js CHANGED
@@ -1,62 +1,50 @@
1
- // Dependencies
2
-
3
- import 'jquery'
4
- import Rails from '@rails/ujs'
1
+ // Global Dependencies
5
2
 
3
+ import '@hotwired/turbo'
6
4
  import 'bootstrap'
7
- import 'bootstrap-confirmation2'
8
-
9
- import 'magnific-popup'
10
-
11
- import 'flatpickr'
12
5
 
13
- import 'select2/dist/js/select2.full'
6
+ // Core Functionality
14
7
 
15
- // Core
8
+ import './core/stream_actions'
9
+ import './core/turbo_errors'
16
10
 
17
- import { refreshContext, refreshMainContext } from './core/contexts'
18
11
  import cookie from './core/cookie'
19
- import { init, ready, triggerInit, triggerReady } from './core/events'
20
12
  import { i18n, localize } from './core/i18n'
21
- import turbolinks from './core/turbolinks'
22
- import visit from './core/visit'
23
13
 
24
- // Components
14
+ import Modal from './core/modal'
15
+ import ErrorModal from './core/error_modal'
25
16
 
26
- import './components/confirmation'
27
- import './components/datepicker'
28
- import Dialog from './components/dialog'
29
- import './components/file'
30
- import './components/form'
31
- import './components/gallery'
32
- import './components/pagination'
33
- import './components/select'
34
- import './components/sidebar'
35
- import './components/table'
36
- import { focusTab, focusActiveTab } from './components/tabs'
37
- import './components/tooltips'
17
+ // Stimulus Controllers
38
18
 
39
- // Initialize
19
+ import { ApplicationController, Controllers } from './controllers'
20
+ import Mixins from './mixins'
40
21
 
41
- Rails.start()
22
+ // Deprecated Functionality
23
+
24
+ import { init, ready, triggerInit, triggerReady } from './deprecated/events'
25
+ import './deprecated/tooltip'
42
26
 
43
27
  // Export
44
28
 
45
29
  const Trestle = {
46
- refreshContext,
47
- refreshMainContext,
48
30
  cookie,
31
+ i18n,
32
+ localize,
33
+
34
+ // Stimulus
35
+ ApplicationController,
36
+ Controllers,
37
+ Mixins,
38
+
39
+ // Modals
40
+ Modal,
41
+ ErrorModal,
42
+
43
+ // Deprecated
49
44
  init,
50
45
  ready,
51
46
  triggerInit,
52
- triggerReady,
53
- i18n,
54
- localize,
55
- turbolinks,
56
- visit,
57
- Dialog,
58
- focusTab,
59
- focusActiveTab
47
+ triggerReady
60
48
  }
61
49
 
62
50
  export default Trestle
@@ -0,0 +1,5 @@
1
+ import usePhotoSwipe from './photoswipe'
2
+
3
+ export default {
4
+ usePhotoSwipe
5
+ }
@@ -0,0 +1,10 @@
1
+ const usePhotoSwipe = (controller) => {
2
+ Object.assign(controller, {
3
+ loadPhotoSwipe () {
4
+ return import(/* webpackChunkName: "photoswipe" */ 'photoswipe')
5
+ .then(module => module.default)
6
+ }
7
+ })
8
+ }
9
+
10
+ export default usePhotoSwipe
@@ -0,0 +1,93 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.1.3): util/index.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ const MILLISECONDS_MULTIPLIER = 1000
9
+ const TRANSITION_END = 'transitionend'
10
+
11
+ /**
12
+ * Trick to restart an element's animation
13
+ *
14
+ * @param {HTMLElement} element
15
+ * @return void
16
+ *
17
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
18
+ */
19
+ const reflow = element => {
20
+ // eslint-disable-next-line no-unused-expressions
21
+ element.offsetHeight
22
+ }
23
+
24
+ const execute = callback => {
25
+ if (typeof callback === 'function') {
26
+ callback()
27
+ }
28
+ }
29
+
30
+ const getTransitionDurationFromElement = element => {
31
+ if (!element) {
32
+ return 0
33
+ }
34
+
35
+ // Get transition-duration of the element
36
+ let { transitionDuration, transitionDelay } = window.getComputedStyle(element)
37
+
38
+ const floatTransitionDuration = Number.parseFloat(transitionDuration)
39
+ const floatTransitionDelay = Number.parseFloat(transitionDelay)
40
+
41
+ // Return 0 if element or transition duration is not found
42
+ if (!floatTransitionDuration && !floatTransitionDelay) {
43
+ return 0
44
+ }
45
+
46
+ // If multiple durations are defined, take the first
47
+ transitionDuration = transitionDuration.split(',')[0]
48
+ transitionDelay = transitionDelay.split(',')[0]
49
+
50
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER
51
+ }
52
+
53
+ const triggerTransitionEnd = element => {
54
+ // eslint-disable-next-line no-undef
55
+ element.dispatchEvent(new Event(TRANSITION_END))
56
+ }
57
+
58
+ const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
59
+ if (!waitForTransition) {
60
+ execute(callback)
61
+ return
62
+ }
63
+
64
+ const durationPadding = 5
65
+ const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding
66
+
67
+ let called = false
68
+
69
+ const handler = ({ target }) => {
70
+ if (target !== transitionElement) {
71
+ return
72
+ }
73
+
74
+ called = true
75
+ transitionElement.removeEventListener(TRANSITION_END, handler)
76
+ execute(callback)
77
+ }
78
+
79
+ transitionElement.addEventListener(TRANSITION_END, handler)
80
+ setTimeout(() => {
81
+ if (!called) {
82
+ triggerTransitionEnd(transitionElement)
83
+ }
84
+ }, emulatedDuration)
85
+ }
86
+
87
+ export {
88
+ getTransitionDurationFromElement,
89
+ triggerTransitionEnd,
90
+ reflow,
91
+ execute,
92
+ executeAfterTransition
93
+ }
data/i18n/config.yml ADDED
@@ -0,0 +1,14 @@
1
+ ---
2
+ translations:
3
+ - file: i18n/locale/:locale.json
4
+ patterns:
5
+ - "*"
6
+ - "!*.activerecord"
7
+ - "!*.errors"
8
+ - "!*.number.nth"
9
+
10
+ export_files:
11
+ enabled: true
12
+ files:
13
+ - template: i18n/template.erb
14
+ output: app/assets/bundle/trestle/locale/%{base_name}.js
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "rails"
5
+ require "active_support/railtie"
6
+ require "action_view/railtie"
7
+
8
+ I18n.load_path += Dir["./config/locales/**/*.yml"]
data/i18n/export ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ bundle exec i18n export -c i18n/config.yml -r i18n/environment.rb
data/i18n/template.erb ADDED
@@ -0,0 +1 @@
1
+ Trestle.i18n.store(<%= JSON.pretty_generate(translations) %>);
@@ -10,14 +10,9 @@ module Trestle
10
10
  end
11
11
 
12
12
  def create_assets
13
- if defined?(Sass) || defined?(SassC)
14
- template "_custom.scss", "app/assets/stylesheets/trestle/_custom.scss"
15
- template "_theme.scss", "app/assets/stylesheets/trestle/_theme.scss"
16
- else
17
- template "_custom.css", "app/assets/stylesheets/trestle/_custom.css"
18
- end
19
-
20
- template "custom.js", "app/assets/javascripts/trestle/custom.js"
13
+ css = (defined?(Sass) || defined?(SassC)) ? "scss" : "css"
14
+ template "_custom.#{css}", "app/assets/stylesheets/trestle/_custom.#{css}"
15
+ template "custom.js", "app/assets/javascripts/trestle/custom.js"
21
16
  end
22
17
 
23
18
  def create_directory
@@ -15,6 +15,11 @@ Trestle.configure do |config|
15
15
  #
16
16
  # config.site_logo_small = "logo-small.png"
17
17
 
18
+ # Define primary and secondary theme colors. Color values may be specified
19
+ # as either 3- or 6-digit hex codes, or rgb/hsl() triplets.
20
+ #
21
+ # config.theme = { primary: "#338ab7", secondary: "#719dc3" }
22
+
18
23
  # Specify a favicon to be used within the admin.
19
24
  #
20
25
  # config.favicon = "favicon.ico"
@@ -94,11 +99,6 @@ Trestle.configure do |config|
94
99
  # stylesheet_link_tag "custom"
95
100
  # end
96
101
 
97
- # Toggle whether Turbolinks is enabled within the admin.
98
- # Defaults to true if Turbolinks is available.
99
- #
100
- # config.turbolinks = false
101
-
102
102
  # Specify the parameters that should persist across requests when
103
103
  # paginating or reordering. Defaults to [:sort, :order, :scope].
104
104
  #
@@ -0,0 +1,113 @@
1
+ module Trestle
2
+ class Color
3
+ attr_reader :r, :g, :b
4
+
5
+ def initialize(r, g, b)
6
+ @r, @g, @b = r, g, b
7
+ end
8
+
9
+ def hex
10
+ "##{[r, g, b].map { |i| i < 16 ? "0#{i.to_s(16)}" : i.to_s(16) }.join}"
11
+ end
12
+
13
+ def rgb
14
+ [r, g, b]
15
+ end
16
+
17
+ def hsl
18
+ r = @r / 255.0
19
+ g = @g / 255.0
20
+ b = @b / 255.0
21
+
22
+ min = [r, g, b].min
23
+ max = [r, g, b].max
24
+
25
+ h = s = l = (max + min) / 2.0
26
+
27
+ if max == min
28
+ h = 0
29
+ s = 0
30
+ else
31
+ d = max - min
32
+ s = l >= 0.5 ? d / (2 - max - min) : d / (max + min)
33
+
34
+ case max
35
+ when r
36
+ h = (g - b) / d + (g < b ? 6 : 0)
37
+ when g
38
+ h = (b - r) / d + 2
39
+ when b
40
+ h = (r - g) / d + 4
41
+ end
42
+
43
+ h /= 6.0
44
+ end
45
+
46
+ [(h*360).round, (s*100).round, (l*100).round]
47
+ end
48
+
49
+ def self.parse(str)
50
+ if str.starts_with?("#") && str.length.in?([4, 7])
51
+ parse_hex(str)
52
+ elsif str.starts_with?("rgb")
53
+ parse_rgb(str)
54
+ elsif str.starts_with?("hsl")
55
+ parse_hsl(str)
56
+ else
57
+ raise ArgumentError, "Could not parse color code: #{str}"
58
+ end
59
+ end
60
+
61
+ def self.parse_hex(str)
62
+ str = str.sub(/^#/, "")
63
+
64
+ if str.length == 3
65
+ str = str[0] * 2 + str[1] * 2 + str[2] * 2
66
+ end
67
+
68
+ new(str[0, 2].hex, str[2, 2].hex, str[4, 2].hex)
69
+ end
70
+
71
+ def self.parse_rgb(str)
72
+ match = str.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/)
73
+ new(match[1].to_i, match[2].to_i, match[3].to_i)
74
+ end
75
+
76
+ def self.parse_hsl(str)
77
+ match = str.match(/^hsl\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/)
78
+ h, s, l = match[1].to_f, match[2].to_f, match[3].to_f
79
+
80
+ h /= 360
81
+ s /= 100
82
+ l /= 100
83
+
84
+ if s == 0
85
+ r = g = b = l.to_f
86
+ else
87
+ q = l < 0.5 ? l * (1 + s) : l + s - l * s
88
+ p = 2 * l - q
89
+
90
+ r = hue_to_rgb(p, q, h + 1/3.0)
91
+ g = hue_to_rgb(p, q, h)
92
+ b = hue_to_rgb(p, q, h - 1/3.0)
93
+ end
94
+
95
+ new((r * 255).round, (g * 255).round, (b * 255).round)
96
+ end
97
+
98
+ def self.hue_to_rgb(p, q, t)
99
+ t += 1 if t < 0
100
+ t -= 1 if t > 1
101
+
102
+ if t < 1 / 6.0
103
+ p + (q - p) * 6 * t
104
+ elsif t < 1 / 2.0
105
+ q
106
+ elsif t < 2 / 3.0
107
+ p + (q - p) * (2 / 3.0 - t) * 6
108
+ else
109
+ p
110
+ end
111
+ end
112
+ end
113
+ end
@@ -22,8 +22,19 @@ module Trestle
22
22
  # Default timestamp precision
23
23
  option :timestamp_precision, :minutes
24
24
 
25
- # Theme stylesheet compilation (requires Sass support)
26
- option :theme, defined?(Sass) || defined?(SassC)
25
+ # Theme colors
26
+ option :theme, {}
27
+
28
+ def theme=(colors)
29
+ if [true, false].include?(colors)
30
+ Trestle.deprecator.warn("Passing a boolean to config.theme is deprecated. Please pass primary and secondary theme colors as a hash.")
31
+ else
32
+ original = fetch(:colors) || {}
33
+ colors = colors.transform_values { |color| Trestle::Color.parse(color) }
34
+
35
+ assign(:theme, original.merge(colors))
36
+ end
37
+ end
27
38
 
28
39
 
29
40
  ## Mounting Options
@@ -68,8 +79,8 @@ module Trestle
68
79
  self.helper_module.module_eval(&block) if block_given?
69
80
  end
70
81
 
71
- # Enable or disable Turbolinks within the Trestle admin
72
- option :turbolinks, defined?(Turbolinks)
82
+ # [DEPRECATED] Enable or disable Turbolinks within the Trestle admin
83
+ deprecated_option :turbolinks, "The config.turbolinks option is deprecated. Turbo is included and enabled by default within Trestle."
73
84
 
74
85
  # List of parameters that should persist across requests when paginating or reordering
75
86
  option :persistent_params, [:sort, :order, :scope]
@@ -94,10 +105,7 @@ module Trestle
94
105
  end
95
106
 
96
107
  # List of i18n keys to pass into the Trestle.i18n JavaScript object
97
- option :javascript_i18n_keys, [
98
- "trestle.confirmation.title", "trestle.confirmation.delete", "trestle.confirmation.cancel", "trestle.dialog.error",
99
- "admin.buttons.ok", "admin.datepicker.formats.date", "admin.datepicker.formats.datetime", "admin.datepicker.formats.time"
100
- ]
108
+ option :javascript_i18n_keys, []
101
109
 
102
110
  # List of load paths for where to find admin definitions
103
111
  option :load_paths, [
@@ -1,17 +1,16 @@
1
- require "sprockets/railtie"
2
-
3
1
  module Trestle
4
2
  class Engine < ::Rails::Engine
5
3
  isolate_namespace Trestle
6
4
  self.routes.default_scope = {}
7
5
 
8
- # Application assets
9
- config.assets.precompile << "trestle/admin.css" << "trestle/admin.js" << "trestle/custom.css"
6
+ initializer "trestle.sprockets" do |app|
7
+ # Sprockets manifest
8
+ config.assets.precompile << "trestle/manifest.js"
9
+ end if defined?(Sprockets)
10
10
 
11
- # Vendor assets
12
- %w(eot svg ttf woff woff2).each do |ext|
13
- config.assets.precompile << "trestle/fa-*.#{ext}"
14
- end
11
+ initializer "trestle.propshaft" do |app|
12
+ app.config.assets.excluded_paths << Trestle::Engine.root.join("app/assets/sprockets")
13
+ end if defined?(Propshaft)
15
14
 
16
15
  initializer "trestle.automount" do |app|
17
16
  if Trestle.config.automount
@@ -21,23 +20,30 @@ module Trestle
21
20
  end
22
21
  end
23
22
 
23
+ initializer "trestle.deprecator" do |app|
24
+ app.deprecators[:trestle] = Trestle.deprecator if app.respond_to?(:deprecators)
25
+ end
26
+
24
27
  initializer "trestle.draper" do |app|
25
28
  if defined?(Draper)
26
29
  Draper::CollectionDecorator.delegate :current_page, :total_pages, :limit_value, :entry_name, :total_count, :offset_value, :last_page?
27
30
  end
28
31
  end
29
32
 
30
- initializer "trestle.theme" do |app|
31
- # Enable theme compilation
32
- if Trestle.config.theme
33
- app.config.assets.paths << root.join("frontend/theme").to_s
34
- app.config.assets.precompile << "trestle/theme.css"
35
- end
33
+ initializer "turbo.mimetype" do
34
+ Mime::Type.register "text/vnd.turbo-stream.html", :turbo_stream unless Mime[:turbo_stream]
36
35
  end
37
36
 
38
- initializer "trestle.turbolinks" do |app|
39
- # Optional turbolinks
40
- app.config.assets.precompile << "turbolinks.js" if Trestle.config.turbolinks
37
+ initializer "turbo.renderer" do
38
+ ActiveSupport.on_load(:action_controller) do
39
+ # Compatibility fix for Rails 5.2
40
+ delegate :media_type, to: "@_response" unless instance_methods.include?(:media_type)
41
+
42
+ ActionController::Renderers.add :turbo_stream do |turbo_streams_html, options|
43
+ self.content_type = Mime[:turbo_stream] if media_type.nil?
44
+ turbo_streams_html
45
+ end
46
+ end
41
47
  end
42
48
 
43
49
  config.to_prepare do