trestle 0.9.0 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +28 -0
  3. data/.gitignore +3 -0
  4. data/CONTRIBUTING.md +38 -0
  5. data/Gemfile +12 -5
  6. data/README.md +9 -2
  7. data/app/assets/bundle/trestle/bundle.css +9 -9
  8. data/app/assets/bundle/trestle/bundle.js +50 -48
  9. data/app/assets/bundle/trestle/fa-brands-400.eot +0 -0
  10. data/app/assets/bundle/trestle/fa-brands-400.svg +818 -597
  11. data/app/assets/bundle/trestle/fa-brands-400.ttf +0 -0
  12. data/app/assets/bundle/trestle/fa-brands-400.woff +0 -0
  13. data/app/assets/bundle/trestle/fa-brands-400.woff2 +0 -0
  14. data/app/assets/bundle/trestle/fa-regular-400.eot +0 -0
  15. data/app/assets/bundle/trestle/fa-regular-400.svg +93 -95
  16. data/app/assets/bundle/trestle/fa-regular-400.ttf +0 -0
  17. data/app/assets/bundle/trestle/fa-regular-400.woff +0 -0
  18. data/app/assets/bundle/trestle/fa-regular-400.woff2 +0 -0
  19. data/app/assets/bundle/trestle/fa-solid-900.eot +0 -0
  20. data/app/assets/bundle/trestle/fa-solid-900.svg +1209 -842
  21. data/app/assets/bundle/trestle/fa-solid-900.ttf +0 -0
  22. data/app/assets/bundle/trestle/fa-solid-900.woff +0 -0
  23. data/app/assets/bundle/trestle/fa-solid-900.woff2 +0 -0
  24. data/app/assets/bundle/trestle/flatpickr/ar-dz.js +1 -0
  25. data/app/assets/bundle/trestle/flatpickr/ar.js +1 -1
  26. data/app/assets/bundle/trestle/flatpickr/at.js +1 -1
  27. data/app/assets/bundle/trestle/flatpickr/az.js +1 -1
  28. data/app/assets/bundle/trestle/flatpickr/be.js +1 -1
  29. data/app/assets/bundle/trestle/flatpickr/bg.js +1 -1
  30. data/app/assets/bundle/trestle/flatpickr/bn.js +1 -1
  31. data/app/assets/bundle/trestle/flatpickr/bs.js +1 -1
  32. data/app/assets/bundle/trestle/flatpickr/cat.js +1 -1
  33. data/app/assets/bundle/trestle/flatpickr/ckb.js +1 -0
  34. data/app/assets/bundle/trestle/flatpickr/cs.js +1 -1
  35. data/app/assets/bundle/trestle/flatpickr/cy.js +1 -1
  36. data/app/assets/bundle/trestle/flatpickr/da.js +1 -1
  37. data/app/assets/bundle/trestle/flatpickr/de.js +1 -1
  38. data/app/assets/bundle/trestle/flatpickr/default.js +1 -1
  39. data/app/assets/bundle/trestle/flatpickr/eo.js +1 -1
  40. data/app/assets/bundle/trestle/flatpickr/es.js +1 -1
  41. data/app/assets/bundle/trestle/flatpickr/et.js +1 -1
  42. data/app/assets/bundle/trestle/flatpickr/fa.js +1 -1
  43. data/app/assets/bundle/trestle/flatpickr/fi.js +1 -1
  44. data/app/assets/bundle/trestle/flatpickr/fo.js +1 -1
  45. data/app/assets/bundle/trestle/flatpickr/fr.js +1 -1
  46. data/app/assets/bundle/trestle/flatpickr/ga.js +1 -1
  47. data/app/assets/bundle/trestle/flatpickr/gr.js +1 -1
  48. data/app/assets/bundle/trestle/flatpickr/he.js +1 -1
  49. data/app/assets/bundle/trestle/flatpickr/hi.js +1 -1
  50. data/app/assets/bundle/trestle/flatpickr/hr.js +1 -1
  51. data/app/assets/bundle/trestle/flatpickr/hu.js +1 -1
  52. data/app/assets/bundle/trestle/flatpickr/hy.js +1 -0
  53. data/app/assets/bundle/trestle/flatpickr/id.js +1 -1
  54. data/app/assets/bundle/trestle/flatpickr/is.js +1 -1
  55. data/app/assets/bundle/trestle/flatpickr/it.js +1 -1
  56. data/app/assets/bundle/trestle/flatpickr/ja.js +1 -1
  57. data/app/assets/bundle/trestle/flatpickr/ka.js +1 -1
  58. data/app/assets/bundle/trestle/flatpickr/km.js +1 -1
  59. data/app/assets/bundle/trestle/flatpickr/ko.js +1 -1
  60. data/app/assets/bundle/trestle/flatpickr/kz.js +1 -1
  61. data/app/assets/bundle/trestle/flatpickr/lt.js +1 -1
  62. data/app/assets/bundle/trestle/flatpickr/lv.js +1 -1
  63. data/app/assets/bundle/trestle/flatpickr/mk.js +1 -1
  64. data/app/assets/bundle/trestle/flatpickr/mn.js +1 -1
  65. data/app/assets/bundle/trestle/flatpickr/ms.js +1 -1
  66. data/app/assets/bundle/trestle/flatpickr/my.js +1 -1
  67. data/app/assets/bundle/trestle/flatpickr/nl.js +1 -1
  68. data/app/assets/bundle/trestle/flatpickr/nn.js +1 -0
  69. data/app/assets/bundle/trestle/flatpickr/no.js +1 -1
  70. data/app/assets/bundle/trestle/flatpickr/pa.js +1 -1
  71. data/app/assets/bundle/trestle/flatpickr/pl.js +1 -1
  72. data/app/assets/bundle/trestle/flatpickr/pt.js +1 -1
  73. data/app/assets/bundle/trestle/flatpickr/ro.js +1 -1
  74. data/app/assets/bundle/trestle/flatpickr/ru.js +1 -1
  75. data/app/assets/bundle/trestle/flatpickr/si.js +1 -1
  76. data/app/assets/bundle/trestle/flatpickr/sk.js +1 -1
  77. data/app/assets/bundle/trestle/flatpickr/sl.js +1 -1
  78. data/app/assets/bundle/trestle/flatpickr/sq.js +1 -1
  79. data/app/assets/bundle/trestle/flatpickr/sr-cyr.js +1 -1
  80. data/app/assets/bundle/trestle/flatpickr/sr.js +1 -1
  81. data/app/assets/bundle/trestle/flatpickr/sv.js +1 -1
  82. data/app/assets/bundle/trestle/flatpickr/th.js +1 -1
  83. data/app/assets/bundle/trestle/flatpickr/tr.js +1 -1
  84. data/app/assets/bundle/trestle/flatpickr/uk.js +1 -1
  85. data/app/assets/bundle/trestle/flatpickr/uz.js +1 -0
  86. data/app/assets/bundle/trestle/flatpickr/uz_latn.js +1 -0
  87. data/app/assets/bundle/trestle/flatpickr/vn.js +1 -1
  88. data/app/assets/bundle/trestle/flatpickr/zh-tw.js +1 -1
  89. data/app/assets/bundle/trestle/flatpickr/zh.js +1 -1
  90. data/app/assets/javascripts/trestle/admin.js +1 -0
  91. data/app/assets/javascripts/trestle/i18n.js.erb +8 -0
  92. data/{lib → app/controllers/concerns}/trestle/controller/breadcrumbs.rb +1 -1
  93. data/app/controllers/concerns/trestle/controller/title.rb +20 -0
  94. data/app/controllers/concerns/trestle/controller/toolbars.rb +30 -0
  95. data/app/controllers/concerns/trestle/resource/controller/actions.rb +133 -0
  96. data/app/controllers/concerns/trestle/resource/controller/data_methods.rb +52 -0
  97. data/app/controllers/concerns/trestle/resource/controller/redirection.rb +23 -0
  98. data/app/controllers/concerns/trestle/resource/controller/toolbar.rb +11 -0
  99. data/app/controllers/trestle/admin_controller.rb +31 -0
  100. data/app/controllers/trestle/application_controller.rb +12 -0
  101. data/app/controllers/trestle/dashboard_controller.rb +2 -2
  102. data/app/controllers/trestle/resource_controller.rb +6 -0
  103. data/app/helpers/trestle/avatar_helper.rb +6 -2
  104. data/app/helpers/trestle/container_helper.rb +12 -4
  105. data/app/helpers/trestle/grid_helper.rb +51 -7
  106. data/app/helpers/trestle/hook_helper.rb +1 -25
  107. data/app/helpers/trestle/i18n_helper.rb +8 -15
  108. data/app/helpers/trestle/layout_helper.rb +20 -0
  109. data/app/helpers/trestle/navigation_helper.rb +23 -0
  110. data/app/helpers/trestle/params_helper.rb +4 -1
  111. data/app/helpers/trestle/table_helper.rb +22 -3
  112. data/app/helpers/trestle/title_helper.rb +11 -0
  113. data/app/helpers/trestle/toolbars_helper.rb +0 -11
  114. data/app/helpers/trestle/url_helper.rb +1 -11
  115. data/app/views/layouts/trestle/admin.html.erb +6 -6
  116. data/app/views/trestle/application/_dialog.html.erb +1 -1
  117. data/app/views/trestle/application/_header.html.erb +1 -3
  118. data/app/views/trestle/flash/_alert.html.erb +3 -1
  119. data/app/views/trestle/flash/_debug.html.erb +13 -8
  120. data/app/views/trestle/flash/_flash.html.erb +1 -1
  121. data/app/views/trestle/resource/_scopes.html.erb +17 -8
  122. data/app/views/trestle/resource/edit.html.erb +2 -2
  123. data/app/views/trestle/resource/index.html.erb +3 -3
  124. data/app/views/trestle/resource/new.html.erb +1 -1
  125. data/app/views/trestle/resource/show.html.erb +2 -2
  126. data/app/views/trestle/shared/_sidebar.html.erb +5 -6
  127. data/app/views/trestle/table/_pagination.html.erb +1 -1
  128. data/config/locales/de.rb +18 -0
  129. data/config/locales/de.yml +101 -0
  130. data/config/locales/vi.rb +18 -0
  131. data/config/locales/vi.yml +101 -0
  132. data/config/routes.rb +1 -1
  133. data/frontend/css/components/_alerts.scss +31 -0
  134. data/frontend/css/components/_avatar.scss +14 -0
  135. data/frontend/css/components/_buttons.scss +0 -1
  136. data/frontend/css/components/_datepicker.scss +1 -0
  137. data/frontend/css/components/_fields.scss +6 -0
  138. data/frontend/css/components/_modal.scss +2 -0
  139. data/frontend/css/components/_scopes.scss +66 -21
  140. data/frontend/css/components/_table.scss +20 -0
  141. data/frontend/css/components/_tags.scss +2 -0
  142. data/frontend/css/components/_timestamp.scss +1 -1
  143. data/frontend/css/layout/_content.scss +5 -2
  144. data/frontend/css/layout/_sidebar.scss +9 -3
  145. data/frontend/css/variables/_bootstrap.scss +1 -0
  146. data/frontend/css/variables/_trestle.scss +25 -5
  147. data/frontend/js/components/confirmation.js +4 -2
  148. data/frontend/js/components/dialog.js +15 -4
  149. data/frontend/js/components/form.js +9 -0
  150. data/frontend/js/components/navigation.js +63 -0
  151. data/frontend/js/components/pagination.js +51 -0
  152. data/frontend/js/components/sidebar.js +8 -11
  153. data/frontend/js/components/table.js +33 -2
  154. data/frontend/js/components/tabs.js +3 -3
  155. data/frontend/js/core/events.js +7 -3
  156. data/frontend/js/index.js +1 -0
  157. data/frontend/theme/trestle/theme/_defaults.scss +4 -4
  158. data/frontend/theme/trestle/theme/bootstrap/_buttons.scss +3 -0
  159. data/lib/generators/trestle/install/install_generator.rb +6 -2
  160. data/lib/generators/trestle/install/templates/_custom.css +8 -0
  161. data/lib/generators/trestle/install/templates/_theme.scss +1 -1
  162. data/lib/generators/trestle/install/templates/trestle.rb.erb +8 -2
  163. data/lib/generators/trestle/resource/resource_generator.rb +15 -1
  164. data/lib/generators/trestle/resource/templates/admin.rb.erb +15 -8
  165. data/lib/trestle/adapters/active_record_adapter.rb +17 -1
  166. data/lib/trestle/adapters.rb +1 -1
  167. data/lib/trestle/admin/builder.rb +7 -3
  168. data/lib/trestle/admin.rb +18 -8
  169. data/lib/trestle/configurable.rb +16 -0
  170. data/lib/trestle/configuration.rb +7 -8
  171. data/lib/trestle/debug_errors.rb +24 -0
  172. data/lib/trestle/engine.rb +3 -10
  173. data/lib/trestle/evaluation_context.rb +11 -3
  174. data/lib/trestle/form/automatic.rb +4 -2
  175. data/lib/trestle/form/builder.rb +6 -7
  176. data/lib/trestle/form/field.rb +44 -17
  177. data/lib/trestle/form/fields/check_box_helpers.rb +1 -1
  178. data/lib/trestle/form/fields/collection_select.rb +1 -1
  179. data/lib/trestle/form/fields/date_picker.rb +9 -3
  180. data/lib/trestle/form/fields/date_select.rb +1 -1
  181. data/lib/trestle/form/fields/datetime_select.rb +1 -1
  182. data/lib/trestle/form/fields/file_field.rb +1 -1
  183. data/lib/trestle/form/fields/form_group.rb +18 -5
  184. data/lib/trestle/form/fields/grouped_collection_select.rb +1 -1
  185. data/lib/trestle/form/fields/range_field.rb +2 -4
  186. data/lib/trestle/form/fields/select.rb +2 -3
  187. data/lib/trestle/form/fields/static_field.rb +7 -3
  188. data/lib/trestle/form/fields/tag_select.rb +3 -1
  189. data/lib/trestle/form/fields/time_select.rb +1 -1
  190. data/lib/trestle/form/fields/time_zone_select.rb +1 -1
  191. data/lib/trestle/form/fields.rb +6 -38
  192. data/lib/trestle/form/renderer.rb +11 -4
  193. data/lib/trestle/form.rb +5 -7
  194. data/lib/trestle/hook/helpers.rb +33 -0
  195. data/lib/trestle/hook/set.rb +32 -0
  196. data/lib/trestle/hook.rb +5 -31
  197. data/lib/trestle/lazy.rb +56 -0
  198. data/lib/trestle/navigation/group.rb +5 -2
  199. data/lib/trestle/navigation/item.rb +7 -3
  200. data/lib/trestle/navigation.rb +3 -6
  201. data/lib/trestle/registry.rb +61 -0
  202. data/lib/trestle/reloader.rb +24 -12
  203. data/lib/trestle/resource/builder.rb +4 -3
  204. data/lib/trestle/resource/collection.rb +1 -5
  205. data/lib/trestle/resource/toolbar.rb +42 -0
  206. data/lib/trestle/resource.rb +8 -9
  207. data/lib/trestle/scopes/block.rb +9 -8
  208. data/lib/trestle/scopes/definition.rb +22 -0
  209. data/lib/trestle/scopes/scope.rb +6 -2
  210. data/lib/trestle/scopes.rb +38 -11
  211. data/lib/trestle/tab.rb +2 -0
  212. data/lib/trestle/table/actions_column.rb +6 -6
  213. data/lib/trestle/table/automatic.rb +10 -3
  214. data/lib/trestle/table/builder.rb +4 -4
  215. data/lib/trestle/table/column.rb +34 -25
  216. data/lib/trestle/table/row.rb +13 -13
  217. data/lib/trestle/table/select_column.rb +19 -7
  218. data/lib/trestle/table.rb +17 -12
  219. data/lib/trestle/toolbar.rb +4 -11
  220. data/lib/trestle/version.rb +1 -1
  221. data/lib/trestle.rb +62 -48
  222. data/package.json +21 -24
  223. data/trestle.gemspec +6 -6
  224. data/webpack.config.js +40 -49
  225. data/yarn.lock +3044 -4730
  226. metadata +66 -22
  227. data/.travis.yml +0 -27
  228. data/lib/trestle/admin/controller.rb +0 -28
  229. data/lib/trestle/application_controller.rb +0 -12
  230. data/lib/trestle/resource/controller.rb +0 -174
  231. /data/{lib → app/controllers/concerns}/trestle/controller/callbacks.rb +0 -0
  232. /data/{lib → app/controllers/concerns}/trestle/controller/dialog.rb +0 -0
  233. /data/{lib → app/controllers/concerns}/trestle/controller/helpers.rb +0 -0
  234. /data/{lib → app/controllers/concerns}/trestle/controller/layout.rb +0 -0
  235. /data/{lib → app/controllers/concerns}/trestle/controller/location.rb +0 -0
@@ -1 +1 @@
1
- !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e=e||self).sk={})}(this,function(e){"use strict";var o="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["Ned","Pon","Ut","Str","Štv","Pia","Sob"],longhand:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],longhand:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};o.l10ns.sk=t;var n=o.l10ns;e.Slovak=t,e.default=n,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).sk={})}(this,(function(e){"use strict";var o="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["Ned","Pon","Ut","Str","Štv","Pia","Sob"],longhand:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],longhand:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};o.l10ns.sk=t;var n=o.l10ns;e.Slovak=t,e.default=n,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).sl={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],longhand:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};n.l10ns.sl=o;var t=n.l10ns;e.Slovenian=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).sl={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],longhand:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"]},firstDayOfWeek:1,rangeSeparator:" do ",time_24hr:!0,ordinal:function(){return"."}};n.l10ns.sl=o;var t=n.l10ns;e.Slovenian=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).sq={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["Di","Hë","Ma","Më","En","Pr","Sh"],longhand:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtunë"]},months:{shorthand:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],longhand:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"]},time_24hr:!0};n.l10ns.sq=t;var r=n.l10ns;e.Albanian=t,e.default=r,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).sq={})}(this,(function(e){"use strict";var r="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},a={weekdays:{shorthand:["Di","Hë","Ma","Më","En","Pr","Sh"],longhand:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtunë"]},months:{shorthand:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],longhand:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"]},firstDayOfWeek:1,rangeSeparator:" deri ",weekAbbreviation:"Java",yearAriaLabel:"Viti",monthAriaLabel:"Muaji",hourAriaLabel:"Ora",minuteAriaLabel:"Minuta",time_24hr:!0};r.l10ns.sq=a;var n=r.l10ns;e.Albanian=a,e.default=n,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self)["sr-cyr"]={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],longhand:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"]},months:{shorthand:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],longhand:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"]},firstDayOfWeek:1,weekAbbreviation:"Нед.",rangeSeparator:" до "};n.l10ns.sr=o;var t=n.l10ns;e.SerbianCyrillic=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["sr-cyr"]={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],longhand:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"]},months:{shorthand:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],longhand:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"]},firstDayOfWeek:1,weekAbbreviation:"Нед.",rangeSeparator:" до "};n.l10ns.sr=o;var i=n.l10ns;e.SerbianCyrillic=o,e.default=i,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).sr={})}(this,function(e){"use strict";var t="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},a={weekdays:{shorthand:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],longhand:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"]},firstDayOfWeek:1,weekAbbreviation:"Ned.",rangeSeparator:" do ",time_24hr:!0};t.l10ns.sr=a;var n=t.l10ns;e.Serbian=a,e.default=n,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).sr={})}(this,(function(e){"use strict";var t="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},a={weekdays:{shorthand:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],longhand:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],longhand:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"]},firstDayOfWeek:1,weekAbbreviation:"Ned.",rangeSeparator:" do ",time_24hr:!0};t.l10ns.sr=a;var n=t.l10ns;e.Serbian=a,e.default=n,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).sv={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},r={firstDayOfWeek:1,weekAbbreviation:"v",weekdays:{shorthand:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],longhand:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"]},months:{shorthand:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],longhand:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"]},time_24hr:!0,ordinal:function(){return"."}};n.l10ns.sv=r;var i=n.l10ns;e.Swedish=r,e.default=i,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).sv={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},a={firstDayOfWeek:1,weekAbbreviation:"v",weekdays:{shorthand:["sön","mån","tis","ons","tor","fre","lör"],longhand:["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"]},months:{shorthand:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],longhand:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"]},rangeSeparator:" till ",time_24hr:!0,ordinal:function(){return"."}};n.l10ns.sv=a;var o=n.l10ns;e.Swedish=a,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).th={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["อา","จ","อ","พ","พฤ","ศ","ส"],longhand:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"]},months:{shorthand:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],longhand:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"]},firstDayOfWeek:1,rangeSeparator:" ถึง ",scrollTitle:"เลื่อนเพื่อเพิ่มหรือลด",toggleTitle:"คลิกเพื่อเปลี่ยน",time_24hr:!0,ordinal:function(){return""}};n.l10ns.th=t;var o=n.l10ns;e.Thai=t,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).th={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["อา","จ","อ","พ","พฤ","ศ","ส"],longhand:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"]},months:{shorthand:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],longhand:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"]},firstDayOfWeek:1,rangeSeparator:" ถึง ",scrollTitle:"เลื่อนเพื่อเพิ่มหรือลด",toggleTitle:"คลิกเพื่อเปลี่ยน",time_24hr:!0,ordinal:function(){return""}};n.l10ns.th=t;var o=n.l10ns;e.Thai=t,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(a,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((a=a||self).tr={})}(this,function(a){"use strict";var e="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],longhand:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"]},months:{shorthand:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],longhand:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"]},firstDayOfWeek:1,ordinal:function(){return"."},rangeSeparator:" - ",weekAbbreviation:"Hf",scrollTitle:"Artırmak için kaydırın",toggleTitle:"Aç/Kapa",amPM:["ÖÖ","ÖS"],time_24hr:!0};e.l10ns.tr=t;var r=e.l10ns;a.Turkish=t,a.default=r,Object.defineProperty(a,"__esModule",{value:!0})});
1
+ !function(e,a){"object"==typeof exports&&"undefined"!=typeof module?a(exports):"function"==typeof define&&define.amd?define(["exports"],a):a((e="undefined"!=typeof globalThis?globalThis:e||self).tr={})}(this,(function(e){"use strict";var a="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],longhand:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"]},months:{shorthand:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],longhand:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"]},firstDayOfWeek:1,ordinal:function(){return"."},rangeSeparator:" - ",weekAbbreviation:"Hf",scrollTitle:"Artırmak için kaydırın",toggleTitle:"Aç/Kapa",amPM:["ÖÖ","ÖS"],time_24hr:!0};a.l10ns.tr=t;var r=a.l10ns;e.Turkish=t,e.default=r,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).uk={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={firstDayOfWeek:1,weekdays:{shorthand:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],longhand:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"]},months:{shorthand:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],longhand:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"]},time_24hr:!0};n.l10ns.uk=t;var o=n.l10ns;e.Ukrainian=t,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).uk={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={firstDayOfWeek:1,weekdays:{shorthand:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],longhand:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"]},months:{shorthand:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],longhand:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"]},time_24hr:!0};n.l10ns.uk=o;var t=n.l10ns;e.Ukrainian=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -0,0 +1 @@
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).uz={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["Якш","Душ","Сеш","Чор","Пай","Жум","Шан"],longhand:["Якшанба","Душанба","Сешанба","Чоршанба","Пайшанба","Жума","Шанба"]},months:{shorthand:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],longhand:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" — ",weekAbbreviation:"Ҳафта",scrollTitle:"Катталаштириш учун айлантиринг",toggleTitle:"Ўтиш учун босинг",amPM:["AM","PM"],yearAriaLabel:"Йил",time_24hr:!0};n.l10ns.uz=o;var t=n.l10ns;e.Uzbek=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -0,0 +1 @@
1
+ !function(a,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((a="undefined"!=typeof globalThis?globalThis:a||self).uz_latn={})}(this,(function(a){"use strict";var e="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},n={weekdays:{shorthand:["Ya","Du","Se","Cho","Pa","Ju","Sha"],longhand:["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"]},months:{shorthand:["Yan","Fev","Mar","Apr","May","Iyun","Iyul","Avg","Sen","Okt","Noy","Dek"],longhand:["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"]},firstDayOfWeek:1,ordinal:function(){return""},rangeSeparator:" — ",weekAbbreviation:"Hafta",scrollTitle:"Kattalashtirish uchun aylantiring",toggleTitle:"O‘tish uchun bosing",amPM:["AM","PM"],yearAriaLabel:"Yil",time_24hr:!0};e.l10ns.uz_latn=n;var t=e.l10ns;a.UzbekLatin=n,a.default=t,Object.defineProperty(a,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(n,h){"object"==typeof exports&&"undefined"!=typeof module?h(exports):"function"==typeof define&&define.amd?define(["exports"],h):h((n=n||self).vn={})}(this,function(n){"use strict";var h="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},e={weekdays:{shorthand:["CN","T2","T3","T4","T5","T6","T7"],longhand:["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"]},months:{shorthand:["Th1","Th2","Th3","Th4","Th5","Th6","Th7","Th8","Th9","Th10","Th11","Th12"],longhand:["Tháng một","Tháng hai","Tháng ba","Tháng tư","Tháng năm","Tháng sáu","Tháng bảy","Tháng tám","Tháng chín","Tháng mười","Tháng 11","Tháng 12"]},firstDayOfWeek:1,rangeSeparator:" đến "};h.l10ns.vn=e;var T=h.l10ns;n.Vietnamese=e,n.default=T,Object.defineProperty(n,"__esModule",{value:!0})});
1
+ !function(n,h){"object"==typeof exports&&"undefined"!=typeof module?h(exports):"function"==typeof define&&define.amd?define(["exports"],h):h((n="undefined"!=typeof globalThis?globalThis:n||self).vn={})}(this,(function(n){"use strict";var h="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},e={weekdays:{shorthand:["CN","T2","T3","T4","T5","T6","T7"],longhand:["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"]},months:{shorthand:["Th1","Th2","Th3","Th4","Th5","Th6","Th7","Th8","Th9","Th10","Th11","Th12"],longhand:["Tháng một","Tháng hai","Tháng ba","Tháng tư","Tháng năm","Tháng sáu","Tháng bảy","Tháng tám","Tháng chín","Tháng mười","Tháng mười một","Tháng mười hai"]},firstDayOfWeek:1,rangeSeparator:" đến "};h.l10ns.vn=e;var T=h.l10ns;n.Vietnamese=e,n.default=T,Object.defineProperty(n,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self)["zh-tw"]={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},t={weekdays:{shorthand:["週日","週一","週二","週三","週四","週五","週六"],longhand:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},months:{shorthand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],longhand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},rangeSeparator:" 至 ",weekAbbreviation:"週",scrollTitle:"滾動切換",toggleTitle:"點擊切換 12/24 小時時制"};n.l10ns.zh_tw=t;var o=n.l10ns;e.MandarinTraditional=t,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["zh-tw"]={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["週日","週一","週二","週三","週四","週五","週六"],longhand:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},months:{shorthand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],longhand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},rangeSeparator:" 至 ",weekAbbreviation:"週",scrollTitle:"滾動切換",toggleTitle:"點擊切換 12/24 小時時制"};n.l10ns.zh_tw=o;var t=n.l10ns;e.MandarinTraditional=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1 +1 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).zh={})}(this,function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["周日","周一","周二","周三","周四","周五","周六"],longhand:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},months:{shorthand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],longhand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},rangeSeparator:" 至 ",weekAbbreviation:"周",scrollTitle:"滚动切换",toggleTitle:"点击切换 12/24 小时时制"};n.l10ns.zh=o;var t=n.l10ns;e.Mandarin=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).zh={})}(this,(function(e){"use strict";var n="undefined"!=typeof window&&void 0!==window.flatpickr?window.flatpickr:{l10ns:{}},o={weekdays:{shorthand:["周日","周一","周二","周三","周四","周五","周六"],longhand:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},months:{shorthand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],longhand:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},rangeSeparator:" 至 ",weekAbbreviation:"周",scrollTitle:"滚动切换",toggleTitle:"点击切换 12/24 小时时制"};n.l10ns.zh=o;var t=n.l10ns;e.Mandarin=o,e.default=t,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1,2 +1,3 @@
1
1
  //= require trestle/bundle
2
+ //= require trestle/i18n
2
3
  //= require trestle/custom
@@ -0,0 +1,8 @@
1
+ <% flatpickr_locale_conversions = { ca: "cat", el: "gr", nb: "no", vi: "vn" } %>
2
+
3
+ <% I18n.available_locales.sort.each do |locale| %>
4
+ <% Trestle.i18n_fallbacks(locale).each do |candidate| %>
5
+ <% candidate = flatpickr_locale_conversions[candidate] || candidate %>
6
+ <% require_asset("trestle/flatpickr/#{candidate}") rescue nil %>
7
+ <% end %>
8
+ <% end %>
@@ -10,7 +10,7 @@ module Trestle
10
10
 
11
11
  protected
12
12
  def breadcrumbs
13
- @breadcrumbs ||= Breadcrumb::Trail.new(Trestle.config.root_breadcrumbs)
13
+ @_breadcrumbs ||= Breadcrumb::Trail.new(Trestle.config.root_breadcrumbs)
14
14
  end
15
15
 
16
16
  def breadcrumb(label, path=nil)
@@ -0,0 +1,20 @@
1
+ module Trestle
2
+ module Controller
3
+ module Title
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ helper_method :default_title
8
+ end
9
+
10
+ protected
11
+ def title(title=nil)
12
+ @_title = title if title
13
+ end
14
+
15
+ def default_title
16
+ @_title || action_name.titleize
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ module Trestle
2
+ module Controller
3
+ module Toolbars
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ helper_method :toolbars
8
+ helper_method :toolbar
9
+ end
10
+
11
+ protected
12
+ def toolbars
13
+ @_toolbars ||= {}
14
+ end
15
+
16
+ def toolbar(name, options={}, &block)
17
+ builder = options[:builder] || default_toolbar_builder
18
+
19
+ toolbar = (toolbars[name.to_s] ||= Toolbar.new(builder))
20
+ toolbar.clear! if options[:clear]
21
+ toolbar.prepend(&block) if block_given?
22
+ toolbar
23
+ end
24
+
25
+ def default_toolbar_builder
26
+ Toolbar::Builder
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,133 @@
1
+ module Trestle
2
+ class Resource
3
+ module Controller
4
+ module Actions
5
+ def index
6
+ respond_to do |format|
7
+ format.html
8
+ format.json { render json: collection }
9
+
10
+ yield format if block_given?
11
+ end
12
+ end
13
+
14
+ def new
15
+ respond_to do |format|
16
+ format.html
17
+ format.json { render json: instance }
18
+
19
+ yield format if block_given?
20
+ end
21
+ end
22
+
23
+ def create
24
+ if save_instance
25
+ respond_to do |format|
26
+ format.html do
27
+ flash[:message] = flash_message("create.success", title: "Success!", message: "The %{lowercase_model_name} was successfully created.")
28
+ redirect_to_return_location(:create, instance, default: admin.instance_path(instance))
29
+ end
30
+ format.json { render json: instance, status: :created, location: admin.instance_path(instance) }
31
+
32
+ yield format if block_given?
33
+ end
34
+ else
35
+ respond_to do |format|
36
+ format.html do
37
+ flash.now[:error] = flash_message("create.failure", title: "Warning!", message: "Please correct the errors below.")
38
+ render "new", status: :unprocessable_entity
39
+ end
40
+ format.json { render json: instance.errors, status: :unprocessable_entity }
41
+
42
+ yield format if block_given?
43
+ end
44
+ end
45
+ end
46
+
47
+ def show
48
+ if admin.singular? && instance.nil?
49
+ respond_to do |format|
50
+ format.html { redirect_to action: :new }
51
+ format.json { head :not_found }
52
+
53
+ yield format if block_given?
54
+ end
55
+ else
56
+ respond_to do |format|
57
+ format.html
58
+ format.json { render json: instance }
59
+
60
+ yield format if block_given?
61
+ end
62
+ end
63
+ end
64
+
65
+ def edit
66
+ if admin.singular? && instance.nil?
67
+ respond_to do |format|
68
+ format.html { redirect_to action: :new }
69
+ format.json { head :not_found }
70
+
71
+ yield format if block_given?
72
+ end
73
+ else
74
+ respond_to do |format|
75
+ format.html
76
+ format.json { render json: instance }
77
+
78
+ yield format if block_given?
79
+ end
80
+ end
81
+ end
82
+
83
+ def update
84
+ if update_instance
85
+ respond_to do |format|
86
+ format.html do
87
+ flash[:message] = flash_message("update.success", title: "Success!", message: "The %{lowercase_model_name} was successfully updated.")
88
+ redirect_to_return_location(:update, instance, default: admin.instance_path(instance))
89
+ end
90
+ format.json { render json: instance, status: :ok }
91
+
92
+ yield format if block_given?
93
+ end
94
+ else
95
+ respond_to do |format|
96
+ format.html do
97
+ flash.now[:error] = flash_message("update.failure", title: "Warning!", message: "Please correct the errors below.")
98
+ render "show", status: :unprocessable_entity
99
+ end
100
+ format.json { render json: instance.errors, status: :unprocessable_entity }
101
+
102
+ yield format if block_given?
103
+ end
104
+ end
105
+ end
106
+
107
+ def destroy
108
+ success = delete_instance
109
+
110
+ respond_to do |format|
111
+ format.html do
112
+ if success
113
+ flash[:message] = flash_message("destroy.success", title: "Success!", message: "The %{lowercase_model_name} was successfully deleted.")
114
+ redirect_to_return_location(:destroy, instance, default: admin.path(:index))
115
+ else
116
+ flash[:error] = flash_message("destroy.failure", title: "Warning!", message: "Could not delete %{lowercase_model_name}.")
117
+
118
+ if load_instance
119
+ redirect_to_return_location(:update, instance, default: admin.instance_path(instance))
120
+ else
121
+ redirect_to_return_location(:destroy, instance, default: admin.path(:index))
122
+ end
123
+ end
124
+ end
125
+ format.json { head :no_content }
126
+
127
+ yield format if block_given?
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,52 @@
1
+ module Trestle
2
+ class Resource
3
+ module Controller
4
+ module DataMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ attr_accessor :instance, :collection
9
+ helper_method :instance, :collection
10
+
11
+ before_action :load_collection, only: [:index]
12
+ before_action :load_instance, only: [:show, :edit, :update, :destroy]
13
+ before_action :build_instance, only: [:new, :create]
14
+ end
15
+
16
+ protected
17
+ def load_instance
18
+ self.instance = admin.find_instance(params)
19
+ end
20
+
21
+ def load_collection
22
+ self.collection = admin.prepare_collection(params)
23
+ end
24
+
25
+ def build_instance
26
+ self.instance = admin.build_instance(resource_params, params)
27
+ end
28
+
29
+ def update_instance
30
+ admin.update_instance(instance, resource_params, params)
31
+ admin.save_instance(instance, params)
32
+ end
33
+
34
+ def save_instance
35
+ admin.save_instance(instance, params)
36
+ end
37
+
38
+ def delete_instance
39
+ admin.delete_instance(instance, params)
40
+ end
41
+
42
+ def resource_params
43
+ if params.key?(admin.parameter_name)
44
+ admin.permitted_params(params)
45
+ else
46
+ {}
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ module Trestle
2
+ class Resource
3
+ module Controller
4
+ module Redirection
5
+ protected
6
+ def redirect_to_return_location(action, instance, default:)
7
+ if admin.return_locations[action] && !dialog_request?
8
+ location = instance_exec(instance, &admin.return_locations[action])
9
+
10
+ case location
11
+ when :back
12
+ redirect_back fallback_location: default, turbolinks: false
13
+ else
14
+ redirect_to location, turbolinks: false
15
+ end
16
+ else
17
+ redirect_to default, turbolinks: false
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ module Trestle
2
+ class Resource
3
+ module Controller
4
+ module Toolbar
5
+ def default_toolbar_builder
6
+ Resource::Toolbar::Builder
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ class Trestle::AdminController < Trestle::ApplicationController
2
+ def index
3
+ end
4
+
5
+ class << self
6
+ attr_reader :admin
7
+
8
+ private
9
+ def local_prefixes
10
+ return admin.view_path_prefixes if admin
11
+ [controller_path.sub(/\/$/, "")]
12
+ end
13
+ end
14
+
15
+ def admin
16
+ @_admin ||= self.class.admin.new(self)
17
+ end
18
+ helper_method :admin
19
+
20
+ protected
21
+ def breadcrumbs
22
+ @_breadcrumbs ||= admin.breadcrumbs.dup
23
+ end
24
+
25
+ def flash_message(type, title:, message:)
26
+ {
27
+ title: admin.t("flash.#{type}.title", default: title),
28
+ message: admin.t("flash.#{type}.message", default: message)
29
+ }
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+ class Trestle::ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+
4
+ include Trestle::Controller::Breadcrumbs
5
+ include Trestle::Controller::Callbacks
6
+ include Trestle::Controller::Dialog
7
+ include Trestle::Controller::Helpers
8
+ include Trestle::Controller::Layout
9
+ include Trestle::Controller::Location
10
+ include Trestle::Controller::Title
11
+ include Trestle::Controller::Toolbars
12
+ end
@@ -8,8 +8,8 @@ private
8
8
  def primary_admin
9
9
  if navigation = Trestle.navigation(self).first
10
10
  navigation.admin
11
- elsif Trestle.admins.values.any?
12
- Trestle.admins.values.first
11
+ elsif Trestle.registry.any?
12
+ Trestle.registry.first
13
13
  end
14
14
  end
15
15
  end
@@ -0,0 +1,6 @@
1
+ class Trestle::ResourceController < Trestle::AdminController
2
+ include Trestle::Resource::Controller::Actions
3
+ include Trestle::Resource::Controller::DataMethods
4
+ include Trestle::Resource::Controller::Redirection
5
+ include Trestle::Resource::Controller::Toolbar
6
+ end
@@ -3,19 +3,23 @@ module Trestle
3
3
  def avatar(options={})
4
4
  fallback = options.delete(:fallback) if options[:fallback]
5
5
 
6
- content_tag(:div, options.reverse_merge(class: "avatar")) do
6
+ content_tag(:div, default_avatar_options.merge(options)) do
7
7
  concat content_tag(:span, fallback, class: "avatar-fallback") if fallback
8
8
  concat yield if block_given?
9
9
  end
10
10
  end
11
11
 
12
12
  def gravatar(email, options={})
13
- options = { d: "mm" }.merge(options)
13
+ options = { d: "mp" }.merge(options)
14
14
 
15
15
  url = "https://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(email.to_s.downcase)}.png"
16
16
  url << "?#{options.to_query}" if options.any?
17
17
 
18
18
  image_tag(url)
19
19
  end
20
+
21
+ def default_avatar_options
22
+ Trestle::Options.new(class: ["avatar"])
23
+ end
20
24
  end
21
25
  end
@@ -6,7 +6,7 @@ module Trestle
6
6
 
7
7
  content_tag(:div, class: "main-content-container") do
8
8
  concat content_tag(:div, content, class: "main-content")
9
- concat content_tag(:aside, context.sidebar, class: "main-content-sidebar") unless context.sidebar.blank?
9
+ concat context.sidebar if context.sidebar
10
10
  end
11
11
  end
12
12
 
@@ -15,9 +15,17 @@ module Trestle
15
15
  @template = template
16
16
  end
17
17
 
18
- def sidebar(&block)
19
- @sidebar = @template.capture(&block) if block_given?
20
- @sidebar
18
+ def sidebar(options={}, &block)
19
+ if block_given?
20
+ @sidebar = @template.content_tag(:aside, default_sidebar_options.merge(options), &block)
21
+ nil
22
+ else
23
+ @sidebar
24
+ end
25
+ end
26
+
27
+ def default_sidebar_options
28
+ Trestle::Options.new(class: ["main-content-sidebar"])
21
29
  end
22
30
  end
23
31
  end
@@ -1,24 +1,68 @@
1
1
  module Trestle
2
2
  module GridHelper
3
- def row
4
- content_tag(:div, class: "row") { yield }
3
+ # Renders a row div, one of the building blocks of Bootstrap's grid system.
4
+ # https://getbootstrap.com/docs/4.4/layout/grid/
5
+ #
6
+ # attrs - Hash of attributes that will be passed to the tag (e.g. id, data, class).
7
+ #
8
+ # Examples
9
+ #
10
+ # <%= row do %>
11
+ # <%= col do %>Column content<% end %>
12
+ # <% end %>
13
+ #
14
+ # <%= row class: "row-cols-2", id: "my-row" do %> ...
15
+ #
16
+ # Returns a HTML-safe String.
17
+ def row(attrs={})
18
+ defaults = Trestle::Options.new(class: ["row"])
19
+ options = defaults.merge(attrs)
20
+
21
+ content_tag(:div, options) { yield }
5
22
  end
6
23
 
24
+ # Renders a column div, one of the building blocks of Bootstrap's grid system.
25
+ # https://getbootstrap.com/docs/4.4/layout/grid/
26
+ #
27
+ # Column divs should always be rendered inside of a row div.
28
+ #
29
+ # Examples
30
+ #
31
+ # # Standard column - evenly fills available space
32
+ # <%= col do %>...<% end %>
33
+ #
34
+ # # Column spans 4 (out of 12) grid columns (i.e. 1/3 width) at all breakpoints
35
+ # <%= col 4 do %> ...
36
+ #
37
+ # # Column spans 6 grid columns at smallest breakpoint, 4 at md breakpoint
38
+ # # and above (portrait tablet) and 3 at xl breakpoint and above (desktop)
39
+ # <%= col 6, md: 4, xl: 3 do %> ...
40
+ #
41
+ # Returns a HTML-safe String.
7
42
  def col(columns=nil, breakpoints={})
8
43
  if columns.is_a?(Hash)
9
44
  breakpoints = columns
10
45
  columns = breakpoints.delete("xs") || breakpoints.delete(:xs)
11
46
  end
12
47
 
13
- classes = []
14
- classes << (columns ? "col-#{columns}" : "col")
15
- classes += breakpoints.map { |breakpoint, span| "col-#{breakpoint}-#{span}" }
48
+ if columns.nil? && breakpoints.empty?
49
+ classes = "col"
50
+ else
51
+ classes = []
52
+ classes << "col-#{columns}" if columns
53
+ classes += breakpoints.map { |breakpoint, span| "col-#{breakpoint}-#{span}" }
54
+ end
16
55
 
17
56
  content_tag(:div, class: classes) { yield }
18
57
  end
19
58
 
20
- def divider
21
- content_tag(:hr)
59
+ # Renders an <HR> (horizontal rule) HTML tag.
60
+ #
61
+ # attrs - Hash of attributes that will be passed to the tag (e.g. id, data, class).
62
+ #
63
+ # Returns a HTML-safe String.
64
+ def divider(attrs={})
65
+ tag(:hr, attrs)
22
66
  end
23
67
  end
24
68
  end