voom-presenters 0.1.12 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.gem_release.yml +1 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.github/ISSUE_TEMPLATE/questions-support.md +10 -0
  7. data/.github/workflows/semantic-release.yml +42 -0
  8. data/.gitignore +4 -2
  9. data/.releaserc +15 -0
  10. data/.ruby-version +2 -1
  11. data/CHANGELOG.md +143 -0
  12. data/CODE-OF-CONDUCT.md +73 -0
  13. data/CONTRIBUTING.md +60 -0
  14. data/Gemfile +12 -3
  15. data/Gemfile.lock +104 -64
  16. data/HISTORY.md +61 -0
  17. data/Procfile +1 -0
  18. data/README.md +48 -24
  19. data/app/demo/component_status.pom +1 -1
  20. data/app/demo/components/avatars.pom +40 -0
  21. data/app/demo/components/cards.pom +11 -4
  22. data/app/demo/components/chips.pom +65 -52
  23. data/app/demo/components/content.pom +111 -0
  24. data/app/demo/components/date_fields.pom +1 -1
  25. data/app/demo/components/datetime_fields.pom +6 -0
  26. data/app/demo/components/dialogs.pom +175 -6
  27. data/app/demo/components/drawers.pom +1 -1
  28. data/app/demo/components/file_inputs.pom +52 -0
  29. data/app/demo/components/footers.pom +1 -1
  30. data/app/demo/components/google_maps.pom +22 -0
  31. data/app/demo/components/headers.pom +80 -20
  32. data/app/demo/components/icons.pom +86 -55
  33. data/app/demo/components/image_lists.pom +100 -0
  34. data/app/demo/components/images.pom +45 -0
  35. data/app/demo/components/layouts.pom +15 -5
  36. data/app/demo/components/lists.pom +51 -17
  37. data/app/demo/components/menus.pom +14 -4
  38. data/app/demo/components/nav/menu.pom +40 -2
  39. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  40. data/app/demo/components/nav/pattern_menu.pom +12 -0
  41. data/app/demo/components/number_fields.pom +53 -0
  42. data/app/demo/components/padding.pom +96 -0
  43. data/app/demo/components/progress.pom +71 -0
  44. data/app/demo/components/selects.pom +44 -5
  45. data/app/demo/components/sliders.pom +54 -0
  46. data/app/demo/components/snackbar.pom +10 -0
  47. data/app/demo/components/steppers.pom +178 -0
  48. data/app/demo/components/tab_bars.pom +66 -0
  49. data/app/demo/components/tables.pom +96 -13
  50. data/app/demo/components/text_areas.pom +23 -3
  51. data/app/demo/components/text_fields.pom +75 -17
  52. data/app/demo/components/toggles.pom +83 -16
  53. data/app/demo/components/tooltips.pom +10 -10
  54. data/app/demo/components/unordered_list.pom +81 -0
  55. data/app/demo/custom_css.pom +37 -0
  56. data/app/demo/events/actions/autocomplete.pom +3 -3
  57. data/app/demo/events/actions/clear.pom +25 -0
  58. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  59. data/app/demo/events/actions/dialogs/show_dialog.pom +4 -2
  60. data/app/demo/events/actions/last_response.pom +40 -0
  61. data/app/demo/events/actions/loads.pom +16 -6
  62. data/app/demo/events/actions/posts.pom +1 -1
  63. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  64. data/app/demo/events/actions/toggle_visiblity.pom +4 -3
  65. data/app/demo/events/content_as_form.pom +313 -0
  66. data/app/demo/events/nav/drawer.pom +7 -3
  67. data/app/demo/events/parallel.pom +44 -0
  68. data/app/demo/events/tagged_input.pom +37 -0
  69. data/app/demo/hello_world.pom +3 -0
  70. data/app/demo/markdown.pom +1 -0
  71. data/app/demo/namespaces.pom +89 -0
  72. data/app/demo/nav/top_nav.pom +24 -0
  73. data/app/demo/patterns.pom +19 -0
  74. data/app/demo/patterns/drag_drop.pom +89 -0
  75. data/app/demo/patterns/floating_card.pom +29 -0
  76. data/app/demo/patterns/search_select.pom +106 -0
  77. data/app/demo/plugins/chart.pom +254 -0
  78. data/app/demo/plugins/image_crop.pom +44 -0
  79. data/app/demo/plugins/index.pom +29 -0
  80. data/app/demo/plugins/nav/drawer.pom +19 -0
  81. data/app/demo/shared/context_list.pom +2 -2
  82. data/app/demo/styles.pom +24 -12
  83. data/bin/console +4 -4
  84. data/component-status.yml +26 -26
  85. data/config.ru +21 -10
  86. data/docs/settings.md +81 -0
  87. data/exe/presenters +3 -0
  88. data/lib/hash_ext/traverse.rb +14 -0
  89. data/lib/voom.rb +25 -0
  90. data/lib/voom/container_methods.rb +2 -2
  91. data/lib/voom/engine.rb +5 -0
  92. data/lib/voom/presenters/api/app.rb +46 -13
  93. data/lib/voom/presenters/api/router.rb +3 -87
  94. data/lib/voom/presenters/app.rb +3 -3
  95. data/lib/voom/presenters/cli.rb +28 -0
  96. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  97. data/lib/voom/presenters/demo/echo.rb +7 -0
  98. data/lib/voom/presenters/demo/slow.rb +18 -0
  99. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  100. data/lib/voom/presenters/dsl/components/actions/base.rb +65 -0
  101. data/lib/voom/presenters/dsl/components/actions/clear.rb +15 -0
  102. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  103. data/lib/voom/presenters/dsl/components/actions/deletes.rb +15 -0
  104. data/lib/voom/presenters/dsl/components/actions/dialog.rb +15 -0
  105. data/lib/voom/presenters/dsl/components/actions/loads.rb +31 -0
  106. data/lib/voom/presenters/dsl/components/actions/navigates.rb +15 -0
  107. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  108. data/lib/voom/presenters/dsl/components/actions/posts.rb +20 -0
  109. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  110. data/lib/voom/presenters/dsl/components/actions/remove.rb +15 -0
  111. data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
  112. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +15 -0
  113. data/lib/voom/presenters/dsl/components/actions/stepper.rb +15 -0
  114. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  115. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +15 -0
  116. data/lib/voom/presenters/dsl/components/actions/updates.rb +20 -0
  117. data/lib/voom/presenters/dsl/components/avatar.rb +5 -10
  118. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  119. data/lib/voom/presenters/dsl/components/base.rb +37 -21
  120. data/lib/voom/presenters/dsl/components/button.rb +23 -17
  121. data/lib/voom/presenters/dsl/components/card.rb +54 -42
  122. data/lib/voom/presenters/dsl/components/checkbox.rb +2 -2
  123. data/lib/voom/presenters/dsl/components/chip.rb +10 -13
  124. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  125. data/lib/voom/presenters/dsl/components/content.rb +33 -13
  126. data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
  127. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -3
  128. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  129. data/lib/voom/presenters/dsl/components/dialog.rb +41 -13
  130. data/lib/voom/presenters/dsl/components/drawer.rb +13 -8
  131. data/lib/voom/presenters/dsl/components/event.rb +117 -60
  132. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  133. data/lib/voom/presenters/dsl/components/expansion_panel.rb +3 -6
  134. data/lib/voom/presenters/dsl/components/file_input.rb +34 -0
  135. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  136. data/lib/voom/presenters/dsl/components/form.rb +3 -16
  137. data/lib/voom/presenters/dsl/components/grid.rb +64 -22
  138. data/lib/voom/presenters/dsl/components/header.rb +19 -6
  139. data/lib/voom/presenters/dsl/components/hidden_field.rb +1 -3
  140. data/lib/voom/presenters/dsl/components/icon.rb +3 -6
  141. data/lib/voom/presenters/dsl/components/icon_base.rb +6 -8
  142. data/lib/voom/presenters/dsl/components/icon_toggle.rb +3 -5
  143. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  144. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  145. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  146. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  147. data/lib/voom/presenters/dsl/components/list.rb +11 -16
  148. data/lib/voom/presenters/dsl/components/lists/action.rb +11 -14
  149. data/lib/voom/presenters/dsl/components/lists/actions.rb +60 -0
  150. data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
  151. data/lib/voom/presenters/dsl/components/lists/line.rb +40 -29
  152. data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
  153. data/lib/voom/presenters/dsl/components/menu.rb +56 -16
  154. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  155. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +7 -3
  156. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -4
  157. data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
  158. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -3
  159. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  160. data/lib/voom/presenters/dsl/components/mixins/common.rb +21 -16
  161. data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
  162. data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
  163. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -3
  164. data/lib/voom/presenters/dsl/components/mixins/event.rb +2 -4
  165. data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
  166. data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  167. data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
  168. data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
  169. data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
  170. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  171. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  172. data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
  173. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  174. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  175. data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
  176. data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
  177. data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
  178. data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
  179. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +17 -0
  180. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  181. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +10 -3
  182. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -5
  183. data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
  184. data/lib/voom/presenters/dsl/components/mixins/typography.rb +91 -14
  185. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  186. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  187. data/lib/voom/presenters/dsl/components/page.rb +0 -1
  188. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  189. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  190. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  191. data/lib/voom/presenters/dsl/components/rich_text_area.rb +20 -0
  192. data/lib/voom/presenters/dsl/components/select.rb +23 -12
  193. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  194. data/lib/voom/presenters/dsl/components/slider.rb +38 -0
  195. data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
  196. data/lib/voom/presenters/dsl/components/stepper.rb +96 -0
  197. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  198. data/lib/voom/presenters/dsl/components/tab_bar.rb +50 -0
  199. data/lib/voom/presenters/dsl/components/table.rb +126 -35
  200. data/lib/voom/presenters/dsl/components/text_area.rb +4 -5
  201. data/lib/voom/presenters/dsl/components/text_field.rb +55 -16
  202. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  203. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  204. data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
  205. data/lib/voom/presenters/dsl/components/typography.rb +6 -7
  206. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  207. data/lib/voom/presenters/dsl/definer.rb +0 -4
  208. data/lib/voom/presenters/dsl/definition.rb +9 -6
  209. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  210. data/lib/voom/presenters/dsl/user_interface.rb +43 -32
  211. data/lib/voom/presenters/errors.rb +1 -0
  212. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  213. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  214. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  215. data/lib/voom/presenters/generators/plugin.rb +115 -0
  216. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  217. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  218. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  219. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  220. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  221. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  222. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  223. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  224. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  225. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  226. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  227. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  228. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  229. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  230. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  231. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  232. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  233. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  234. data/lib/voom/presenters/helpers.rb +2 -8
  235. data/lib/voom/presenters/helpers/date.rb +3 -3
  236. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  237. data/lib/voom/presenters/helpers/rails.rb +18 -6
  238. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  239. data/lib/voom/presenters/helpers/redact.rb +13 -0
  240. data/lib/voom/presenters/helpers/route.rb +15 -2
  241. data/lib/voom/presenters/helpers/time.rb +1 -1
  242. data/lib/voom/presenters/namespace.rb +12 -0
  243. data/lib/voom/presenters/pluggable.rb +37 -0
  244. data/lib/voom/presenters/plugins.rb +7 -0
  245. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  246. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  247. data/lib/voom/presenters/plugins/google_maps/google_map.rb +41 -0
  248. data/lib/voom/presenters/{dsl.rb → registry.rb} +14 -10
  249. data/lib/voom/presenters/router.rb +59 -0
  250. data/lib/voom/presenters/settings.rb +70 -39
  251. data/lib/voom/presenters/version.rb +3 -1
  252. data/lib/voom/presenters/web_client/app.rb +121 -34
  253. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  254. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  255. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  256. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  257. data/lib/voom/presenters/web_client/custom_render.rb +31 -0
  258. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  259. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  260. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  261. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  262. data/lib/voom/presenters/web_client/router.rb +3 -89
  263. data/lib/voom/railtie.rb +37 -0
  264. data/lib/voom/serializer.rb +2 -2
  265. data/lib/voom/symbol/to_str.rb +3 -3
  266. data/lib/voom/trace.rb +0 -2
  267. data/presenters.gemspec +11 -6
  268. data/public/bundle.css +18221 -0
  269. data/public/bundle.js +59949 -0
  270. data/public/img/demo/avatar.jpg +0 -0
  271. data/public/presenters/custom_css.css +26 -0
  272. data/public/style-bundle.js +2 -2
  273. data/public/wc.js +52704 -0
  274. data/scripts/build.sh +10 -0
  275. data/views/mdc/.babelrc +8 -0
  276. data/views/mdc/.eslintrc.yml +24 -0
  277. data/views/mdc/.nvmrc +1 -0
  278. data/views/mdc/assets/js/app.js +30 -6
  279. data/views/mdc/assets/js/components/base-component.js +160 -2
  280. data/views/mdc/assets/js/components/base-container.js +87 -0
  281. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  282. data/views/mdc/assets/js/components/button.js +71 -9
  283. data/views/mdc/assets/js/components/cards.js +13 -2
  284. data/views/mdc/assets/js/components/checkboxes.js +11 -11
  285. data/views/mdc/assets/js/components/chips.js +104 -7
  286. data/views/mdc/assets/js/components/content.js +14 -0
  287. data/views/mdc/assets/js/components/data-tables.js +15 -0
  288. data/views/mdc/assets/js/components/datetime.js +83 -20
  289. data/views/mdc/assets/js/components/dialogs.js +130 -27
  290. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  291. data/views/mdc/assets/js/components/drawer.js +43 -0
  292. data/views/mdc/assets/js/components/events.js +195 -68
  293. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  294. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  295. data/views/mdc/assets/js/components/events/autocomplete.js +15 -17
  296. data/views/mdc/assets/js/components/events/base.js +142 -16
  297. data/views/mdc/assets/js/components/events/clears.js +15 -12
  298. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  299. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  300. data/views/mdc/assets/js/components/events/encode.js +8 -0
  301. data/views/mdc/assets/js/components/events/errors.js +175 -92
  302. data/views/mdc/assets/js/components/events/loads.js +50 -11
  303. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  304. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  305. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  306. data/views/mdc/assets/js/components/events/posts.js +169 -47
  307. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  308. data/views/mdc/assets/js/components/events/removes.js +21 -0
  309. data/views/mdc/assets/js/components/events/replaces.js +110 -57
  310. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  311. data/views/mdc/assets/js/components/events/stepper.js +21 -0
  312. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  313. data/views/mdc/assets/js/components/events/toggle_visibility.js +62 -16
  314. data/views/mdc/assets/js/components/file-inputs.js +76 -0
  315. data/views/mdc/assets/js/components/form-fields.js +16 -0
  316. data/views/mdc/assets/js/components/forms.js +9 -60
  317. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  318. data/views/mdc/assets/js/components/grid.js +21 -0
  319. data/views/mdc/assets/js/components/header.js +20 -0
  320. data/views/mdc/assets/js/components/hidden-fields.js +44 -0
  321. data/views/mdc/assets/js/components/icon-toggles.js +10 -17
  322. data/views/mdc/assets/js/components/images.js +19 -0
  323. data/views/mdc/assets/js/components/initialize.js +62 -18
  324. data/views/mdc/assets/js/components/lists.js +10 -5
  325. data/views/mdc/assets/js/components/menus.js +66 -20
  326. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  327. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  328. data/views/mdc/assets/js/components/mixins/visibility-observer.js +35 -0
  329. data/views/mdc/assets/js/components/plugins.js +86 -0
  330. data/views/mdc/assets/js/components/progress.js +31 -0
  331. data/views/mdc/assets/js/components/radios.js +14 -0
  332. data/views/mdc/assets/js/components/rich-text-area.js +227 -0
  333. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  334. data/views/mdc/assets/js/components/root_document.js +5 -0
  335. data/views/mdc/assets/js/components/selects.js +41 -30
  336. data/views/mdc/assets/js/components/sliders.js +67 -0
  337. data/views/mdc/assets/js/components/snackbar.js +17 -23
  338. data/views/mdc/assets/js/components/steppers.js +48 -0
  339. data/views/mdc/assets/js/components/switches.js +10 -32
  340. data/views/mdc/assets/js/components/tab-bars.js +28 -0
  341. data/views/mdc/assets/js/components/text-fields.js +117 -43
  342. data/views/mdc/assets/js/components/tooltip.js +17 -0
  343. data/views/mdc/assets/js/components/typography.js +28 -0
  344. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  345. data/views/mdc/assets/js/config.js +27 -0
  346. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  347. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  348. data/views/mdc/assets/js/utils/config.js +73 -0
  349. data/views/mdc/assets/js/utils/config.test.js +59 -0
  350. data/views/mdc/assets/js/utils/urls.js +5 -2
  351. data/views/mdc/assets/js/wc.js +111 -0
  352. data/views/mdc/assets/scss/app.scss +20 -5
  353. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  354. data/views/mdc/assets/scss/components/button.scss +20 -7
  355. data/views/mdc/assets/scss/components/card.scss +13 -7
  356. data/views/mdc/assets/scss/components/checkbox.scss +0 -4
  357. data/views/mdc/assets/scss/components/chip.scss +4 -0
  358. data/views/mdc/assets/scss/components/content.scss +36 -0
  359. data/views/mdc/assets/scss/components/data-table.scss +91 -0
  360. data/views/mdc/assets/scss/components/datetime.scss +7 -2
  361. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  362. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  363. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  364. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  365. data/views/mdc/assets/scss/components/fab.scss +23 -4
  366. data/views/mdc/assets/scss/components/file-input.scss +18 -0
  367. data/views/mdc/assets/scss/components/grid.scss +74 -3
  368. data/views/mdc/assets/scss/components/header.scss +21 -0
  369. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  370. data/views/mdc/assets/scss/components/icon.scss +23 -0
  371. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  372. data/views/mdc/assets/scss/components/image.scss +14 -16
  373. data/views/mdc/assets/scss/components/list.scss +19 -0
  374. data/views/mdc/assets/scss/components/menu.scss +14 -3
  375. data/views/mdc/assets/scss/components/progress.scss +1 -0
  376. data/views/mdc/assets/scss/components/radio.scss +4 -0
  377. data/views/mdc/assets/scss/components/rich-text-area.scss +73 -0
  378. data/views/mdc/assets/scss/components/select.scss +6 -3
  379. data/views/mdc/assets/scss/components/separator.scss +3 -0
  380. data/views/mdc/assets/scss/components/slider.scss +1 -0
  381. data/views/mdc/assets/scss/components/snackbar.scss +1 -5
  382. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  383. data/views/mdc/assets/scss/components/switch.scss +13 -4
  384. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  385. data/views/mdc/assets/scss/components/textfield.scss +14 -3
  386. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  387. data/views/mdc/assets/scss/components/typography.scss +10 -0
  388. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  389. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  390. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  391. data/views/mdc/assets/scss/media.scss +39 -0
  392. data/views/mdc/assets/scss/palette.scss +16 -0
  393. data/views/mdc/assets/scss/styles.scss +40 -1
  394. data/views/mdc/assets/scss/theme.scss +25 -2
  395. data/views/mdc/body/dismissable-drawer.erb +34 -0
  396. data/views/mdc/body/drawer/divider.erb +1 -0
  397. data/views/mdc/body/drawer/item.erb +13 -0
  398. data/views/mdc/body/drawer/label.erb +1 -0
  399. data/views/mdc/body/drawers/menu.erb +1 -1
  400. data/views/mdc/body/footers/menu_item.erb +2 -2
  401. data/views/mdc/body/header.erb +38 -30
  402. data/views/mdc/body/modal-drawer.erb +35 -0
  403. data/views/mdc/body/snackbar.erb +12 -6
  404. data/views/mdc/components/actions/autocomplete.rb +8 -0
  405. data/views/mdc/components/actions/clear.rb +11 -0
  406. data/views/mdc/components/actions/close_dialog.rb +10 -0
  407. data/views/mdc/components/actions/delete.rb +11 -0
  408. data/views/mdc/components/actions/dialog.rb +11 -0
  409. data/views/mdc/components/actions/loads.rb +17 -0
  410. data/views/mdc/components/actions/navigates.rb +11 -0
  411. data/views/mdc/components/actions/post.rb +14 -0
  412. data/views/mdc/components/actions/post_message.rb +10 -0
  413. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  414. data/views/mdc/components/actions/remove.rb +10 -0
  415. data/views/mdc/components/actions/replaces.rb +16 -0
  416. data/views/mdc/components/actions/resolver.rb +39 -0
  417. data/views/mdc/components/actions/snackbar.rb +12 -0
  418. data/views/mdc/components/actions/stepper.rb +10 -0
  419. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  420. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  421. data/views/mdc/components/actions/update.rb +10 -0
  422. data/views/mdc/components/avatar.erb +12 -7
  423. data/views/mdc/components/badge.erb +1 -1
  424. data/views/mdc/components/button.erb +10 -8
  425. data/views/mdc/components/buttons/button.erb +19 -14
  426. data/views/mdc/components/buttons/fab.erb +9 -2
  427. data/views/mdc/components/buttons/icon.erb +12 -5
  428. data/views/mdc/components/buttons/image.erb +11 -5
  429. data/views/mdc/components/{display.erb → caption.erb} +0 -0
  430. data/views/mdc/components/card.erb +67 -41
  431. data/views/mdc/components/checkbox.erb +32 -23
  432. data/views/mdc/components/chip.erb +39 -22
  433. data/views/mdc/components/chipset.erb +18 -0
  434. data/views/mdc/components/content.erb +37 -11
  435. data/views/mdc/components/datetime.erb +12 -17
  436. data/views/mdc/components/dialog.erb +45 -22
  437. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  438. data/views/mdc/components/event.erb +3 -9
  439. data/views/mdc/components/expansion_panel.erb +8 -6
  440. data/views/mdc/components/file_input.erb +17 -0
  441. data/views/mdc/components/form.erb +7 -8
  442. data/views/mdc/components/grid.erb +27 -10
  443. data/views/mdc/components/headline.erb +2 -0
  444. data/views/mdc/components/hidden_field.erb +5 -1
  445. data/views/mdc/components/icon.erb +7 -5
  446. data/views/mdc/components/icon_toggle.erb +9 -8
  447. data/views/mdc/components/image.erb +23 -5
  448. data/views/mdc/components/image_list.erb +38 -0
  449. data/views/mdc/components/link.erb +3 -13
  450. data/views/mdc/components/list.erb +9 -4
  451. data/views/mdc/components/list/actions/switch.erb +1 -1
  452. data/views/mdc/components/list/avatar.erb +2 -1
  453. data/views/mdc/components/list/header.erb +5 -3
  454. data/views/mdc/components/list/hidden_field.erb +3 -0
  455. data/views/mdc/components/list/icon.erb +2 -1
  456. data/views/mdc/components/list/line.erb +24 -13
  457. data/views/mdc/components/list/menu.erb +7 -2
  458. data/views/mdc/components/list/separator.erb +1 -1
  459. data/views/mdc/components/menu.erb +20 -16
  460. data/views/mdc/components/number_field.erb +38 -0
  461. data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
  462. data/views/mdc/components/page_title.erb +2 -2
  463. data/views/mdc/components/progress.erb +11 -0
  464. data/views/mdc/components/radio_button.erb +19 -10
  465. data/views/mdc/components/render.erb +2 -3
  466. data/views/mdc/components/rich_text_area.erb +22 -0
  467. data/views/mdc/components/select.erb +28 -8
  468. data/views/mdc/components/separator.erb +3 -0
  469. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  470. data/views/mdc/components/shared/input_label.erb +7 -0
  471. data/views/mdc/components/slider.erb +43 -0
  472. data/views/mdc/components/snackbar.erb +2 -6
  473. data/views/mdc/components/stepper.erb +47 -0
  474. data/views/mdc/components/stepper/step.erb +33 -0
  475. data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
  476. data/views/mdc/components/switch.erb +28 -12
  477. data/views/mdc/components/tab_bar.erb +35 -0
  478. data/views/mdc/components/table.erb +28 -13
  479. data/views/mdc/components/table/checkbox.erb +20 -0
  480. data/views/mdc/components/table/column.erb +18 -0
  481. data/views/mdc/components/table/footer.erb +8 -0
  482. data/views/mdc/components/table/header.erb +14 -4
  483. data/views/mdc/components/table/pagination.erb +11 -24
  484. data/views/mdc/components/table/row.erb +7 -5
  485. data/views/mdc/components/text_area.erb +15 -7
  486. data/views/mdc/components/text_field.erb +38 -28
  487. data/views/mdc/components/tooltip.erb +2 -2
  488. data/views/mdc/components/typography.erb +7 -5
  489. data/views/mdc/components/unordered_list.erb +10 -0
  490. data/views/mdc/components/unordered_list/icon.erb +3 -0
  491. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  492. data/views/mdc/layout.erb +45 -31
  493. data/views/mdc/package-lock.json +11786 -6868
  494. data/views/mdc/package.json +66 -29
  495. data/views/mdc/web.erb +4 -0
  496. data/views/mdc/webpack.config.js +14 -1
  497. metadata +341 -32
  498. data/app/demo/components/forms.pom +0 -31
  499. data/lib/voom-presenters.rb +0 -9
  500. data/lib/voom/presenters-engine.rb +0 -41
  501. data/lib/voom/presenters.rb +0 -13
  502. data/lib/voom/presenters/dsl/components/action.rb +0 -35
  503. data/lib/voom/presenters/web_client/markdown_render.rb +0 -16
  504. data/public/.gitignore +0 -2
  505. data/scripts/bump.sh +0 -4
  506. data/scripts/deploy-demo.sh +0 -2
  507. data/scripts/release.sh +0 -5
  508. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  509. data/views/mdc/assets/js/material.js +0 -3996
  510. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  511. data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
  512. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  513. data/views/mdc/body/drawer.erb +0 -18
  514. data/views/mdc/components/modal.erb +0 -15
  515. data/views/mdc/components/static.erb +0 -7
@@ -0,0 +1,31 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class PageTitle < Typography
6
+ include Mixins::Grids
7
+ include Mixins::Append
8
+ include Components::Mixins::Typography
9
+ include Components::Mixins::Icons
10
+ include Components::Mixins::Buttons
11
+
12
+ attr_accessor :components
13
+
14
+ def initialize(parent:, level: nil, **attribs_, &block)
15
+ @components = []
16
+ super(type: :page_title,
17
+ parent: parent,
18
+ level: level,
19
+ **attribs_, &block)
20
+ self.icon(attribs.delete(:icon)) if attribs.key?(:icon)
21
+ end
22
+
23
+ def icon(icon = nil, **attribs, &block)
24
+ self << Components::Icon.new(parent: self, icon: icon,
25
+ **attribs, &block)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class Progress < Base
6
+ attr_reader :hidden, :position
7
+
8
+ def initialize(**attribs_, &block)
9
+ super(type: :progress, **attribs_, &block)
10
+ @hidden = attribs.delete(:hidden) {true}
11
+ @position = attribs.delete(:position) {:top}
12
+ validate_position(@position)
13
+ end
14
+
15
+ private
16
+
17
+ def validate_position(position)
18
+ unless (Array(position) - %i(top bottom both)).empty?
19
+ raise(Errors::ParameterValidation,
20
+ "Position (#{position}) must be either :top, :bottom or :both")
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,4 +1,3 @@
1
- require_relative 'toggle_base'
2
1
  module Voom
3
2
  module Presenters
4
3
  module DSL
@@ -0,0 +1,20 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class RichTextArea < TextField
6
+ attr_reader :placeholder, :height, :resizable
7
+
8
+ def initialize(**attribs_, &block)
9
+ super(type: :rich_text_area, **attribs_, &block)
10
+ @placeholder = attribs.delete(:placeholder)
11
+ @rows = attribs.delete(:rows) || default(:rows)
12
+ @height = "#{@rows * 24}px"
13
+ @resizable = attribs.delete(:resizable) { false }
14
+ expand!
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,17 +1,16 @@
1
- require_relative 'input'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class Select < Input
8
6
 
9
- attr_reader :required, :full_width, :options
7
+ attr_reader :required, :full_width, :options, :outlined
10
8
 
11
9
  def initialize(**attribs_, &block)
12
10
  super(type: :select, **attribs_, &block)
13
11
  @required = attribs.delete(:required)
14
- @full_width = attribs.delete(:full_width) || true
12
+ @full_width = attribs.delete(:full_width){ true }
13
+ @outlined = attribs.delete(:outlined){ true }
15
14
  @options = []
16
15
  expand!
17
16
  end
@@ -21,19 +20,27 @@ module Voom
21
20
  @label = text
22
21
  end
23
22
 
23
+ def option(text=nil, **attribs, &block)
24
+ @options << Option.new(parent: self,
25
+ text: text,
26
+ **attribs, &block)
27
+ end
28
+
29
+ def value
30
+ @options.select(&:_selected?).first&.value
31
+ end
32
+
33
+ def hint(hint=nil)
34
+ return @hint if locked?
35
+ @hint = hint
36
+ end
37
+
24
38
  def icon(icon=nil, **attribs, &block)
25
39
  return @icon if locked?
26
- @icon = Components::Icon.new(parent: self, icon: icon,
27
- context: context,
40
+ @icon = Components::Icon.new(parent: self, icon: icon, position: attribs.delete(:position){:right},
28
41
  **attribs, &block)
29
42
  end
30
43
 
31
- def option(**attribs, &block)
32
- @options << Option.new(parent: self,
33
- context: context,
34
- **attribs, &block)
35
- end
36
-
37
44
  class Option < Base
38
45
  attr_reader :selected, :disabled
39
46
 
@@ -55,6 +62,10 @@ module Voom
55
62
  return @text if locked?
56
63
  @text = text
57
64
  end
65
+
66
+ def _selected?
67
+ @selected
68
+ end
58
69
  end
59
70
  end
60
71
  end
@@ -0,0 +1,21 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class Separator < Base
6
+ attr_reader :padding
7
+
8
+ def initialize(**attribs_, &block)
9
+ super(type: :separator, **attribs_, &block)
10
+ padding = attribs.delete(:padding) {:full}
11
+ @padding = validate_padding(coerce_padding(padding)).uniq if padding != nil
12
+ expand!
13
+ end
14
+
15
+ private
16
+ include Mixins::Padding
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class Slider < Input
6
+ attr_reader :value_min,
7
+ :value_max,
8
+ :step,
9
+ :show_tracker_marks,
10
+ :discrete
11
+
12
+ def initialize(**attribs_, &block)
13
+ super(type: :slider, **attribs_, &block)
14
+ @value_min = attribs.delete(:value_min){0}
15
+ @value_max = attribs.delete(:value_max){100}
16
+ @step = attribs.delete(:step){nil}
17
+ @discrete = attribs.delete(:discrete){true}
18
+ @show_tracker_marks = attribs.delete(:show_tracker_marks){false}
19
+ @show_tracker_marks = false unless discrete
20
+ expand!
21
+ end
22
+
23
+ def label(text=nil)
24
+ return @label if locked?
25
+ @label = text
26
+ end
27
+
28
+ def value(value=nil)
29
+ return @value if locked?
30
+ @value = value
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -11,9 +11,9 @@ module Voom
11
11
  expand!
12
12
  end
13
13
 
14
- def action(text=nil, **params, &block)
14
+ def action(text=nil, &block)
15
15
  return @action if locked?
16
- @action = Action.new(parent: self, text: text, context: params, &block)
16
+ @action = Action.new(parent: self, text: text, &block)
17
17
  end
18
18
 
19
19
  class Action < EventBase
@@ -0,0 +1,96 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class Stepper < Base
6
+ attr_reader :steps, :orientation, :linear
7
+ VALID_ORIENTATIONS = [:vertical, :horizontal]
8
+
9
+ def initialize(**attribs_, &block)
10
+ super(type: :stepper, **attribs_, &block)
11
+ @orientation = attribs.delete(:orientation) {:horizontal}
12
+ raise_parameter_validation "Invalid Orientation Type specified: #{orientation}" unless VALID_ORIENTATIONS.include? orientation
13
+ @linear = attribs.delete(:linear) {true}
14
+ @steps = []
15
+ expand!
16
+ end
17
+
18
+ def step(text = nil, **attribs, &block)
19
+ @steps << Step.new(parent: self, text: text, **attribs, &block)
20
+ end
21
+
22
+ class Step < Components::Content
23
+ attr_accessor :components, :editable, :optional, :selected
24
+
25
+ def initialize(**attribs_, &block)
26
+ super(type: :step, **attribs_, &block)
27
+ @editable = attribs.delete(:editable) {true}
28
+ @optional = attribs.delete(:optional) {false}
29
+ @selected = attribs.delete(:selected) {false}
30
+ @components = []
31
+ expand!
32
+ end
33
+
34
+ def label(text = nil)
35
+ return @label if locked?
36
+ @label = text
37
+ end
38
+
39
+ def actions(**attribs, &block)
40
+ return @actions if locked?
41
+ @actions = Actions.new(parent: self,
42
+ **attribs, &block)
43
+ end
44
+
45
+ class Actions < Base
46
+ attr_accessor :buttons
47
+
48
+ def initialize(**attribs_, &block)
49
+ super(type: :action, **attribs_, &block)
50
+ @buttons = []
51
+ expand!
52
+ end
53
+
54
+ def continue(text = 'Continue', **options, &block)
55
+ button(text, :next, **options, &block)
56
+ end
57
+ alias :next :continue
58
+
59
+ def back(text = 'Back', **options, &block)
60
+ button(text, :back, **options, &block)
61
+ end
62
+
63
+ def skip(text = 'Skip', **options, &block)
64
+ button(text,:skip, **options, &block)
65
+ end
66
+
67
+ def cancel(text = 'Cancel', **options, &block)
68
+ button(text,:cancel, **options, &block)
69
+ end
70
+
71
+ private
72
+
73
+ def button(text = nil, stepper_type, **options, &block)
74
+ btn = StepperButton.new(stepper_type, parent: self, text: text,
75
+ **options, &block)
76
+ @buttons << btn
77
+ end
78
+
79
+ class StepperButton < Components::Button
80
+ attr_reader :stepper_type
81
+ def initialize(stepper_type, **attribs_, &block)
82
+ @stepper_type = stepper_type
83
+ super(**attribs_, &block)
84
+ end
85
+ end
86
+
87
+
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,5 +1,3 @@
1
- require_relative 'toggle_base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -0,0 +1,50 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class TabBar < Base
6
+ attr_reader :tabs
7
+
8
+ def initialize(**attribs_, &block)
9
+ super(type: :tab_bar, **attribs_, &block)
10
+ @tabs = []
11
+ expand!
12
+ end
13
+
14
+ def tab(label, **attribs, &block)
15
+ @tabs << Tab.new(parent: self, label: label, **attribs, &block)
16
+ end
17
+
18
+ class Tab < EventBase
19
+ include Mixins::Common
20
+
21
+ attr_accessor :components, :label, :icon, :stacked, :selected
22
+
23
+ def initialize(**attribs_, &block)
24
+ super(type: :tab, **attribs_, &block)
25
+ @label = attribs.delete(:label){nil}
26
+ @icon = attribs.delete(:icon) {nil}
27
+ @stacked = attribs.delete(:stacked) {false}
28
+ @selected = attribs.delete(:selected) {false}
29
+ @components = []
30
+ expand!
31
+ end
32
+
33
+ def label(text = nil)
34
+ return @label if locked?
35
+ @label = text
36
+ end
37
+
38
+ def icon(icon = nil, **attribs, &block)
39
+ return @icon if locked?
40
+ @icon = Components::Icon.new(parent: self, icon: icon,
41
+ **attribs, &block)
42
+ end
43
+
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,20 +1,17 @@
1
- require_relative 'mixins/common'
2
- require_relative 'mixins/event'
3
- require_relative 'mixins/tooltips'
4
- require_relative 'mixins/chips'
5
- require_relative 'mixins/selects'
6
- require_relative 'mixins/icons'
7
-
8
1
  module Voom
9
2
  module Presenters
10
3
  module DSL
11
4
  module Components
12
5
  class Table < Base
13
- attr_accessor :header, :rows, :selectable
6
+ include Mixins::Common
7
+ include Mixins::Event
8
+ attr_accessor :header, :rows, :selectable, :width, :border
14
9
 
15
10
  def initialize(**attribs_, &block)
16
11
  super(type: :table, **attribs_, &block)
17
12
  @selectable = attribs.delete(:selectable)
13
+ @border = attribs.delete(:border){ true }
14
+ @width = attribs.delete(:width)
18
15
  @rows = []
19
16
  expand!
20
17
  end
@@ -22,79 +19,173 @@ module Voom
22
19
  def header(**attribs, &block)
23
20
  return @header if locked?
24
21
  @header = Row.new(parent: self, type: :header,
25
- context: context,
22
+ **attribs, &block)
23
+ end
24
+
25
+ def footer(**attribs, &block)
26
+ return @footer if locked?
27
+ @footer = Row.new(parent: self, type: :footer,
26
28
  **attribs, &block)
27
29
  end
28
30
 
29
31
  def row(**attribs, &block)
30
32
  @rows << Row.new(parent: self, type: :row,
31
- context: context,
32
33
  **attribs, &block)
33
34
  end
34
35
 
35
- # WIP
36
- # def pagination(**attribs, &block)
37
- # @pagination = Pagination.new(parent: self,
38
- # context: context,
39
- # **attribs, &block)
40
- # end
36
+ def pagination(**attribs, &block)
37
+ return @pagination if locked?
38
+ @pagination = Pagination.new(parent: self,
39
+ **attribs, &block)
40
+ end
41
41
 
42
42
  class Row < Base
43
- attr_accessor :columns, :color
43
+ attr_accessor :columns, :color, :checkbox
44
44
 
45
45
  def initialize(type:, **attribs_, &block)
46
46
  super(type: type, **attribs_, &block)
47
47
  @columns = []
48
48
  @color = attribs.delete(:color)
49
+ self.checkbox(attribs.slice(:name, :value, :checked)) if @parent.selectable
49
50
  expand!
50
51
  end
51
52
 
52
53
  def column(value=nil, **attribs, &block)
53
54
  @columns << Column.new(parent: self, value: value,
54
- context: context,
55
55
  **attribs, &block)
56
56
  end
57
57
 
58
+ def checkbox(**attributes, &block)
59
+ return @checkbox if locked?
60
+ field_name = @type == :header ? 'all' : "#{attributes.delete(:name)}[]"
61
+ tag = @type == :header ? '' : @parent.tag
62
+ @checkbox = Components::Checkbox.new(parent: self,
63
+ name: field_name,
64
+ tag: tag,
65
+ **attributes,
66
+ &block)
67
+ end
68
+
58
69
  class Column < EventBase
59
70
  include Mixins::Tooltips
60
- include Mixins::Chips
71
+ include Mixins::Chipset
61
72
  include Mixins::Selects
62
73
  include Mixins::Icons
74
+ include Mixins::Typography
75
+ include Mixins::Content
63
76
 
64
- attr_accessor :numeric, :color, :components
77
+ attr_accessor :align, :color, :components, :colspan
65
78
 
66
79
  def initialize(**attribs_, &block)
67
80
  super(type: :column, **attribs_, &block)
68
81
  value = attribs.delete(:value)
69
- @numeric = attribs.delete(:numeric){numeric?(value)}
70
- self.value(value) if value
82
+ @align = validate_alignment(attribs.delete(:align){numeric?(value) ? :right : :left})
83
+ self.value(value, **attribs.slice(:markdown)) if value
71
84
  @color = attribs.delete(:color)
85
+ @colspan = attribs.delete(:colspan)
72
86
  @components = []
73
87
  expand!
74
88
  end
75
89
 
76
90
  def value(*value, **attribs, &block)
77
91
  return @value if locked?
78
- @value = Components::Typography.new(parent: self, type: :text, text: value, context: context, **attribs, &block)
92
+ @value = Components::Typography.new(parent: self, type: :text, text: value, **attribs, &block)
93
+ end
94
+
95
+ def numeric?(_value = value&.text)
96
+ return true if _value.is_a? Numeric
97
+ (_value.to_s.strip.sub(/\D/, '') =~ /^[\$]?[-+]?(,?[0-9])*\.?[0-9]+$/) != nil
79
98
  end
80
99
 
81
100
  private
82
- def numeric?(value)
83
- return true if value.is_a? Numeric
84
- (value.to_s.sub(/\D/, '') =~ /^[-+]?[0-9]*\.?[0-9]+$/) != nil
101
+ VALID_ALIGNMENTS = %i[left center right].freeze
102
+
103
+ def validate_alignment(value)
104
+ return :left if value.nil?
105
+ unless VALID_ALIGNMENTS.include?(value.to_sym)
106
+ raise Errors::ParameterValidation,
107
+ "Invalid column alignment! Valid alignements include #{VALID_ALIGNMENTS.join(', ')}"
108
+ end
109
+ value
85
110
  end
111
+
86
112
  end
87
113
 
88
114
  end
89
- # class Pagination < Base
90
- # attr_accessor :page_size
91
- #
92
- # def initialize(**attribs_, &block)
93
- # super(type: :pagination, **attribs_, &block)
94
- # @page_size = attribs.delete(:page_size)
95
- # expand!
96
- # end
97
- # end
115
+
116
+ class Pagination < Base
117
+ attr_accessor :page_size, :total, :current_page, :per_page, :previous_button, :next_button
118
+
119
+ def initialize(**attribs_, &block)
120
+ super(type: :pagination, **attribs_, &block)
121
+ @page_size = attribs.delete(:page_size){10}.to_i
122
+ @page_size_options = attribs.delete(:page_size_options){[10,20,30,40,50,100]}
123
+ @total = attribs.delete(:total)
124
+ @current_page = attribs.delete(:current_page){ 1 }.to_i
125
+ @replace_id = attribs.delete(:replace_id)
126
+ @replace_presenter = attribs.delete(:replace_presenter)
127
+ previous_button_icon
128
+ next_button_icon
129
+ per_page_select
130
+ range
131
+ expand!
132
+ end
133
+
134
+ def range
135
+ return @range if locked?
136
+ end_range = @total - (@total - @page_size * @current_page.to_i)
137
+ start_range = end_range - @page_size + 1
138
+ @range = [start_range, end_range]
139
+ end
140
+
141
+ def previous_button_icon(icon = :keyboard_arrow_left)
142
+ return @previous_button if locked?
143
+ @previous_button = button(icon, [1, @current_page-1].max)
144
+ end
145
+
146
+ def next_button_icon(icon = :keyboard_arrow_right)
147
+ return @next_button if locked?
148
+ @next_button = button(icon, [total_pages, @current_page+1].min)
149
+ end
150
+
151
+ def per_page_select
152
+ return @per_page if locked?
153
+ @per_page = select(@page_size_options, @page_size, @total)
154
+ end
155
+
156
+ private
157
+
158
+ def total_pages
159
+ (@total.to_f / @page_size.to_f).ceil
160
+ end
161
+
162
+ def button(icon_name, page, replace_id = @replace_id, replace_presenter = @replace_presenter)
163
+ __attribs__ = attribs.merge({ page: page, page_size: @page_size })
164
+ Components::Button.new(parent: self, type: :icon, icon: icon_name) do
165
+ event :click do
166
+ replaces replace_id, replace_presenter, __attribs__
167
+ end
168
+ end
169
+ end
170
+
171
+ def select(options, current_option, total_records, replace_id = @replace_id, replace_presenter = @replace_presenter)
172
+ __attribs__ = attribs.reject{ |key,val| [:page_size, :page].include? key }
173
+ Components::Select.new(parent: self, name: :page_size, full_width: false) do
174
+ options.each do |num|
175
+ option selected: (num == current_option) do
176
+ text num
177
+ value num
178
+ end
179
+ break if num > total_records
180
+ end
181
+ event :change do
182
+ replaces replace_id, replace_presenter, __attribs__.merge(page_size: context[:page_size])
183
+ end
184
+ end
185
+ end
186
+
187
+ end
188
+
98
189
  end
99
190
  end
100
191
  end