trestle 0.9.3 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +18 -4
  4. data/CONTRIBUTING.md +38 -0
  5. data/Gemfile +12 -4
  6. data/README.md +6 -1
  7. data/app/assets/bundle/trestle/bundle.css +9 -9
  8. data/app/assets/bundle/trestle/bundle.js +47 -45
  9. data/app/assets/bundle/trestle/fa-brands-400.eot +0 -0
  10. data/app/assets/bundle/trestle/fa-brands-400.svg +801 -654
  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 +1175 -1079
  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/i18n.js.erb +1 -1
  91. data/app/controllers/trestle/admin_controller.rb +23 -25
  92. data/app/controllers/trestle/application_controller.rb +10 -12
  93. data/app/controllers/trestle/dashboard_controller.rb +11 -13
  94. data/app/controllers/trestle/resource_controller.rb +5 -7
  95. data/app/helpers/trestle/avatar_helper.rb +6 -2
  96. data/app/helpers/trestle/container_helper.rb +12 -4
  97. data/app/helpers/trestle/hook_helper.rb +1 -27
  98. data/app/helpers/trestle/layout_helper.rb +20 -0
  99. data/app/helpers/trestle/navigation_helper.rb +23 -0
  100. data/app/helpers/trestle/params_helper.rb +4 -1
  101. data/app/helpers/trestle/table_helper.rb +15 -0
  102. data/app/helpers/trestle/url_helper.rb +1 -11
  103. data/app/views/layouts/trestle/admin.html.erb +2 -2
  104. data/app/views/trestle/flash/_alert.html.erb +3 -1
  105. data/app/views/trestle/flash/_debug.html.erb +13 -8
  106. data/app/views/trestle/flash/_flash.html.erb +1 -1
  107. data/app/views/trestle/resource/_scopes.html.erb +17 -8
  108. data/app/views/trestle/resource/index.html.erb +2 -2
  109. data/app/views/trestle/shared/_sidebar.html.erb +4 -5
  110. data/app/views/trestle/table/_pagination.html.erb +1 -1
  111. data/config/locales/vi.rb +18 -0
  112. data/config/locales/vi.yml +101 -0
  113. data/config/routes.rb +1 -1
  114. data/frontend/css/components/_alerts.scss +31 -0
  115. data/frontend/css/components/_avatar.scss +14 -0
  116. data/frontend/css/components/_buttons.scss +0 -1
  117. data/frontend/css/components/_datepicker.scss +1 -0
  118. data/frontend/css/components/_fields.scss +5 -0
  119. data/frontend/css/components/_modal.scss +2 -0
  120. data/frontend/css/components/_scopes.scss +66 -21
  121. data/frontend/css/components/_table.scss +4 -0
  122. data/frontend/css/components/_tags.scss +2 -0
  123. data/frontend/css/components/_timestamp.scss +1 -1
  124. data/frontend/css/layout/_content.scss +5 -2
  125. data/frontend/css/layout/_sidebar.scss +3 -2
  126. data/frontend/css/variables/_bootstrap.scss +1 -0
  127. data/frontend/css/variables/_trestle.scss +25 -5
  128. data/frontend/js/components/dialog.js +8 -3
  129. data/frontend/js/components/navigation.js +63 -0
  130. data/frontend/js/components/pagination.js +51 -0
  131. data/frontend/js/components/sidebar.js +4 -7
  132. data/frontend/js/index.js +1 -0
  133. data/frontend/theme/trestle/theme/_defaults.scss +4 -4
  134. data/lib/generators/trestle/install/templates/_theme.scss +1 -1
  135. data/lib/generators/trestle/install/templates/trestle.rb.erb +6 -1
  136. data/lib/trestle/adapters/active_record_adapter.rb +16 -0
  137. data/lib/trestle/admin.rb +12 -2
  138. data/lib/trestle/engine.rb +3 -6
  139. data/lib/trestle/evaluation_context.rb +11 -3
  140. data/lib/trestle/form/automatic.rb +2 -0
  141. data/lib/trestle/form/field.rb +20 -13
  142. data/lib/trestle/form/fields/collection_select.rb +1 -1
  143. data/lib/trestle/form/fields/date_picker.rb +9 -3
  144. data/lib/trestle/form/fields/file_field.rb +1 -1
  145. data/lib/trestle/form/fields/form_group.rb +18 -5
  146. data/lib/trestle/form/fields/grouped_collection_select.rb +1 -1
  147. data/lib/trestle/form/fields/range_field.rb +2 -4
  148. data/lib/trestle/form/fields/select.rb +2 -3
  149. data/lib/trestle/form/fields/static_field.rb +2 -2
  150. data/lib/trestle/form/fields/tag_select.rb +1 -1
  151. data/lib/trestle/form/fields/time_zone_select.rb +1 -1
  152. data/lib/trestle/form/renderer.rb +9 -4
  153. data/lib/trestle/hook/helpers.rb +33 -0
  154. data/lib/trestle/hook/set.rb +32 -0
  155. data/lib/trestle/hook.rb +3 -29
  156. data/lib/trestle/navigation/group.rb +4 -0
  157. data/lib/trestle/registry.rb +61 -0
  158. data/lib/trestle/reloader.rb +26 -6
  159. data/lib/trestle/resource/builder.rb +3 -2
  160. data/lib/trestle/resource/collection.rb +1 -5
  161. data/lib/trestle/resource.rb +4 -3
  162. data/lib/trestle/scopes/block.rb +9 -8
  163. data/lib/trestle/scopes/definition.rb +22 -0
  164. data/lib/trestle/scopes/scope.rb +6 -2
  165. data/lib/trestle/scopes.rb +37 -8
  166. data/lib/trestle/table/automatic.rb +7 -0
  167. data/lib/trestle/version.rb +1 -1
  168. data/lib/trestle.rb +29 -14
  169. data/package.json +21 -24
  170. data/webpack.config.js +40 -49
  171. data/yarn.lock +3129 -4810
  172. metadata +22 -6
@@ -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,6 +1,6 @@
1
1
  <% flatpickr_locale_conversions = { ca: "cat", el: "gr", nb: "no", vi: "vn" } %>
2
2
 
3
- <% I18n.available_locales.each do |locale| %>
3
+ <% I18n.available_locales.sort.each do |locale| %>
4
4
  <% Trestle.i18n_fallbacks(locale).each do |candidate| %>
5
5
  <% candidate = flatpickr_locale_conversions[candidate] || candidate %>
6
6
  <% require_asset("trestle/flatpickr/#{candidate}") rescue nil %>
@@ -1,33 +1,31 @@
1
- module Trestle
2
- class AdminController < ApplicationController
3
- def index
4
- end
1
+ class Trestle::AdminController < Trestle::ApplicationController
2
+ def index
3
+ end
5
4
 
6
- class << self
7
- attr_reader :admin
5
+ class << self
6
+ attr_reader :admin
8
7
 
9
- private
10
- def local_prefixes
11
- return admin.view_path_prefixes if admin
12
- [controller_path.sub(/\/$/, "")]
13
- end
8
+ private
9
+ def local_prefixes
10
+ return admin.view_path_prefixes if admin
11
+ [controller_path.sub(/\/$/, "")]
14
12
  end
13
+ end
15
14
 
16
- def admin
17
- @_admin ||= self.class.admin.new(self)
18
- end
19
- helper_method :admin
15
+ def admin
16
+ @_admin ||= self.class.admin.new(self)
17
+ end
18
+ helper_method :admin
20
19
 
21
- protected
22
- def breadcrumbs
23
- @_breadcrumbs ||= admin.breadcrumbs.dup
24
- end
20
+ protected
21
+ def breadcrumbs
22
+ @_breadcrumbs ||= admin.breadcrumbs.dup
23
+ end
25
24
 
26
- def flash_message(type, title:, message:)
27
- {
28
- title: admin.t("flash.#{type}.title", default: title),
29
- message: admin.t("flash.#{type}.message", default: message)
30
- }
31
- end
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
+ }
32
30
  end
33
31
  end
@@ -1,14 +1,12 @@
1
- module Trestle
2
- class ApplicationController < ActionController::Base
3
- protect_from_forgery
1
+ class Trestle::ApplicationController < ActionController::Base
2
+ protect_from_forgery
4
3
 
5
- include Controller::Breadcrumbs
6
- include Controller::Callbacks
7
- include Controller::Dialog
8
- include Controller::Helpers
9
- include Controller::Layout
10
- include Controller::Location
11
- include Controller::Title
12
- include Controller::Toolbars
13
- end
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
14
12
  end
@@ -1,17 +1,15 @@
1
- module Trestle
2
- class DashboardController < ApplicationController
3
- def index
4
- admin = primary_admin
5
- redirect_to admin.path if admin
6
- end
1
+ class Trestle::DashboardController < Trestle::ApplicationController
2
+ def index
3
+ admin = primary_admin
4
+ redirect_to admin.path if admin
5
+ end
7
6
 
8
- private
9
- def primary_admin
10
- if navigation = Trestle.navigation(self).first
11
- navigation.admin
12
- elsif Trestle.admins.values.any?
13
- Trestle.admins.values.first
14
- end
7
+ private
8
+ def primary_admin
9
+ if navigation = Trestle.navigation(self).first
10
+ navigation.admin
11
+ elsif Trestle.registry.any?
12
+ Trestle.registry.first
15
13
  end
16
14
  end
17
15
  end
@@ -1,8 +1,6 @@
1
- module Trestle
2
- class ResourceController < AdminController
3
- include Resource::Controller::Actions
4
- include Resource::Controller::DataMethods
5
- include Resource::Controller::Redirection
6
- include Resource::Controller::Toolbar
7
- end
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
8
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,31 +1,5 @@
1
1
  module Trestle
2
2
  module HookHelper
3
- def hook(name, *args)
4
- hooks = hooks(name)
5
-
6
- if hooks.any?
7
- safe_join(hooks.map { |hook|
8
- hook.evaluate(self, *args)
9
- }, "\n")
10
- elsif block_given?
11
- capture(*args, &Proc.new)
12
- end
13
- end
14
-
15
- def hook?(name)
16
- hooks(name).any?
17
- end
18
-
19
- protected
20
- def hooks(name)
21
- hook_sets.map { |set| set.for(name) }.inject(&:+).select { |h| h.visible?(self) }
22
- end
23
-
24
- def hook_sets
25
- @_hook_sets ||= [
26
- (admin.hooks if defined?(admin) && admin),
27
- Trestle.config.hooks
28
- ].compact
29
- end
3
+ include Trestle::Hook::Helpers
30
4
  end
31
5
  end
@@ -0,0 +1,20 @@
1
+ module Trestle
2
+ module LayoutHelper
3
+ SIDEBAR_CLASSES = {
4
+ "expanded" => "sidebar-expanded",
5
+ "collapsed" => "sidebar-collapsed"
6
+ }
7
+
8
+ def body_attributes
9
+ {
10
+ class: body_classes
11
+ }.reject { |k, v| v.blank? }
12
+ end
13
+
14
+ def body_classes
15
+ [
16
+ SIDEBAR_CLASSES[cookies["trestle:sidebar"]]
17
+ ].compact
18
+ end
19
+ end
20
+ end
@@ -7,5 +7,28 @@ module Trestle
7
7
  def current_admin?(admin)
8
8
  respond_to?(:admin) && self.admin && self.admin.name == admin.name
9
9
  end
10
+
11
+ def navigation_group_collapsed?(group)
12
+ if collapsed_navigation_groups.include?(group.id)
13
+ # Explicitly collapsed by user
14
+ true
15
+ elsif group.collapse?
16
+ # Default to collapsed unless expanded by user
17
+ !expanded_navigation_groups.include?(group.id)
18
+ end
19
+ end
20
+
21
+ private
22
+ def collapsed_navigation_groups
23
+ @collapsed_navigation_groups ||= navigation_groups(:collapsed)
24
+ end
25
+
26
+ def expanded_navigation_groups
27
+ @expanded_navigation_groups ||= navigation_groups(:expanded)
28
+ end
29
+
30
+ def navigation_groups(state)
31
+ cookies["trestle:navigation:#{state}"].try(:split, ",") || []
32
+ end
10
33
  end
11
34
  end
@@ -1,7 +1,10 @@
1
1
  module Trestle
2
2
  module ParamsHelper
3
3
  def persistent_params
4
- params.slice(*Trestle.config.persistent_params).permit(*Trestle.config.persistent_params)
4
+ flat, nested = Trestle.config.persistent_params.partition { |p| !p.is_a?(Hash) }
5
+ nested = nested.inject({}) { |result, param| result.merge(param) }
6
+
7
+ params.slice(*(flat + nested.keys)).permit(*(flat << nested))
5
8
  end
6
9
  end
7
10
  end
@@ -47,5 +47,20 @@ module Trestle
47
47
 
48
48
  render "trestle/table/table", table: table, collection: collection
49
49
  end
50
+
51
+ # Renders the pagination controls for a collection.
52
+ #
53
+ # collection - The paginated Kaminari collection to render controls for (required).
54
+ # options - Hash of options that will be passed to the Kaminari #paginate method (default: {}):
55
+ #
56
+ # Examples
57
+ #
58
+ # <%= pagination collection: Account.page(params[:page]), remote: true %>
59
+ #
60
+ # Returns the HTML representation of the pagination controls as a HTML-safe String.
61
+ def pagination(collection:, entry_name: nil, **options)
62
+ collection = collection.call if collection.respond_to?(:call)
63
+ render "trestle/table/pagination", collection: collection, entry_name: entry_name, options: options
64
+ end
50
65
  end
51
66
  end
@@ -73,17 +73,7 @@ module Trestle
73
73
  end
74
74
 
75
75
  def admin_for(instance)
76
- klass = instance.class
77
-
78
- while klass
79
- admin = Trestle.admins[klass.name.underscore.pluralize]
80
- return admin if admin
81
-
82
- klass = klass.superclass
83
- end
84
-
85
- # No admin found
86
- nil
76
+ Trestle.lookup_model(instance.class)
87
77
  end
88
78
  end
89
79
  end
@@ -40,7 +40,7 @@
40
40
  <%= hook :head %>
41
41
  </head>
42
42
 
43
- <body<%=raw " class=\"sidebar-#{cookies["trestle:sidebar"]}\"" if cookies["trestle:sidebar"] %>>
43
+ <%= content_tag :body, body_attributes do %>
44
44
  <div class="app-wrapper">
45
45
  <%= render "trestle/shared/sidebar" %>
46
46
 
@@ -54,5 +54,5 @@
54
54
  <%= render "trestle/shared/footer" %>
55
55
  </div>
56
56
  </div>
57
- </body>
57
+ <% end %>
58
58
  </html>
@@ -8,7 +8,9 @@
8
8
  <h3><%= alert[:title] %></h3>
9
9
  <% end %>
10
10
 
11
- <p><%= alert[:message] %></p>
11
+ <% if alert[:message] %>
12
+ <p><%= alert[:message] %></p>
13
+ <% end %>
12
14
 
13
15
  <%= yield if block_given? %>
14
16
  </div>
@@ -1,8 +1,13 @@
1
- <%= link_to "Debug errors", "#debug-errors", class: "toggle-debug-errors small", data: { toggle: "collapse" } %>
2
- <div id="debug-errors" class="debug-errors collapse">
3
- <ul>
4
- <% instance.errors.each do |key, message| %>
5
- <li class="small"><tt><%= key %>:</tt> <%= message %></li>
6
- <% end %>
7
- </ul>
8
- </div>
1
+ <% errors = local_assigns.fetch(:errors, {}) %>
2
+
3
+ <% if errors.any? %>
4
+ <%= link_to "Debug errors", "#debug-errors", class: "toggle-debug-errors small", data: { toggle: "collapse" } %>
5
+
6
+ <div id="debug-errors" class="debug-errors collapse">
7
+ <ul>
8
+ <% errors.each do |key, message| %>
9
+ <li class="small"><tt><%= key %>:</tt> <%= message %></li>
10
+ <% end %>
11
+ </ul>
12
+ </div>
13
+ <% end %>
@@ -2,6 +2,6 @@
2
2
  <%= render "trestle/flash/alert", html_class: "alert-success", icon: icon("alert-icon far fa-check-circle"), alert: normalize_flash_alert(flash[:message]) %>
3
3
  <% elsif flash[:error] -%>
4
4
  <%= render layout: "trestle/flash/alert", locals: { html_class: "alert-danger", icon: icon("alert-icon far fa-times-circle"), alert: normalize_flash_alert(flash[:error]) } do %>
5
- <%= render "trestle/flash/debug" if debug_form_errors? %>
5
+ <%= render "trestle/flash/debug", errors: instance.errors if debug_form_errors? %>
6
6
  <% end %>
7
7
  <% end -%>
@@ -1,9 +1,18 @@
1
- <ul class="scopes">
2
- <% admin.scopes.each do |name, scope| %>
3
- <%= content_tag(:li, class: ("active" if scope.active?(params))) do %>
4
- <%= link_to persistent_params.merge(scope: (name unless scope.active?(params))) do %>
5
- <strong><%= scope.label %></strong> (<%= number_with_delimiter(scope.count(admin.collection(params))) %>)
6
- <% end %>
7
- <% end %>
1
+ <%= content_tag(:dl, class: admin.scopes.classes) do %>
2
+ <% admin.scopes.grouped.each do |group, scopes| %>
3
+ <%= content_tag(:dt, group, class: ["scope-group", ("scope-group-empty" if group.blank?)]) if admin.scopes.grouped? %>
4
+
5
+ <dd>
6
+ <ul class="scope-list">
7
+ <% scopes.each do |scope| %>
8
+ <li>
9
+ <%= link_to persistent_params.merge(scope: (scope unless scope.active?(params))), class: ["scope", ("active" if scope.active?(params))] do %>
10
+ <strong><%= scope.label %></strong>
11
+ (<%= number_with_delimiter(scope.count(admin.collection(params))) %>)
12
+ <% end %>
13
+ </li>
14
+ <% end %>
15
+ </ul>
16
+ </dd>
8
17
  <% end %>
9
- </ul>
18
+ <% end %>
@@ -5,7 +5,7 @@
5
5
  <% end %>
6
6
 
7
7
  <% content_for(:utilities) do %>
8
- <%= render "scopes" if admin.scopes.any? %>
8
+ <%= render "scopes" %>
9
9
  <% end if admin.scopes.any? %>
10
10
 
11
11
  <%= render layout: "layout" do %>
@@ -20,6 +20,6 @@
20
20
  <footer class="main-content-footer">
21
21
  <%= hook("resource.index.footer") %>
22
22
 
23
- <%= render "trestle/table/pagination", collection: collection, entry_name: admin.model_name %>
23
+ <%= pagination collection: collection, entry_name: admin.model_name, remote: admin.pagination_options[:ajax] %>
24
24
  </footer>
25
25
  <% end %>
@@ -11,24 +11,23 @@
11
11
 
12
12
  <div class="app-sidebar-inner">
13
13
  <nav class="app-nav">
14
- <% collapsed = cookies["trestle:navigation:collapsed"].try(:split, ",") || [] %>
15
14
  <% Trestle.navigation(self).each do |group, items| %>
16
- <ul<% if group.present? && collapsed.include?(group.id) %> class="collapsed"<% end %>>
15
+ <%= content_tag(:ul, class: ("collapsed" if group.present? && navigation_group_collapsed?(group)), data: { group: group.id }) do %>
17
16
  <% if group.present? %>
18
17
  <li class="nav-header"><%= link_to group.label, "##{group.id}" %></li>
19
18
  <% end %>
20
19
 
21
20
  <% items.each do |item| %>
22
- <li<% if current_navigation_item?(item) %> class="active"<% end %>>
21
+ <%= content_tag(:li, class: ("active" if current_navigation_item?(item))) do %>
23
22
  <%= link_to item.path, item.html_options do %>
24
23
  <%= icon("nav-icon", item.icon) %>
25
24
  <span class="nav-label"><%= item.label %></span>
26
25
 
27
26
  <%= content_tag(:span, item.badge.text, class: ["badge", item.badge.html_class]) if item.badge? %>
28
27
  <% end %>
29
- </li>
28
+ <% end %>
30
29
  <% end %>
31
- </ul>
30
+ <% end %>
32
31
  <% end %>
33
32
  </nav>
34
33
 
@@ -1,5 +1,5 @@
1
1
  <nav class="pagination-container">
2
2
  <p><%= page_entries_info(collection, entry_name: (entry_name if local_assigns.has_key?(:entry_name))) %>
3
3
 
4
- <%= paginate(collection, theme: "trestle") %>
4
+ <%= paginate(collection, **{ theme: "trestle" }.reverse_merge(local_assigns.has_key?(:options) ? options : {})) %>
5
5
  </nav>