voom-presenters 0.1.13 → 0.2.0

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 (305) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +186 -0
  4. data/Gemfile.lock +37 -38
  5. data/HISTORY.md +61 -0
  6. data/README.md +23 -1
  7. data/app/demo/components/chips.pom +6 -0
  8. data/app/demo/components/{forms.pom → content.pom} +3 -3
  9. data/app/demo/components/date_fields.pom +1 -1
  10. data/app/demo/components/datetime_fields.pom +6 -0
  11. data/app/demo/components/drawers.pom +1 -1
  12. data/app/demo/components/file_inputs.pom +16 -0
  13. data/app/demo/components/footers.pom +1 -1
  14. data/app/demo/components/google_maps.pom +17 -0
  15. data/app/demo/components/headers.pom +1 -1
  16. data/app/demo/components/layouts.pom +36 -4
  17. data/app/demo/components/lists.pom +25 -0
  18. data/app/demo/components/nav/menu.pom +9 -2
  19. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  20. data/app/demo/components/nav/pattern_menu.pom +12 -0
  21. data/app/demo/components/sliders.pom +49 -0
  22. data/app/demo/components/snackbar.pom +10 -0
  23. data/app/demo/components/steppers.pom +178 -0
  24. data/app/demo/components/tab_bars.pom +51 -0
  25. data/app/demo/components/tables.pom +85 -13
  26. data/app/demo/components/text_areas.pom +13 -0
  27. data/app/demo/components/text_fields.pom +20 -8
  28. data/app/demo/components/toggles.pom +50 -14
  29. data/app/demo/components/tooltips.pom +2 -6
  30. data/app/demo/events/actions/clear.pom +23 -0
  31. data/app/demo/events/actions/loads.pom +16 -6
  32. data/app/demo/events/actions/posts.pom +1 -1
  33. data/app/demo/events/actions/toggle_visiblity.pom +4 -3
  34. data/app/demo/events/nav/drawer.pom +2 -2
  35. data/app/demo/events/tagged_input.pom +37 -0
  36. data/app/demo/hello_world.pom +3 -0
  37. data/app/demo/markdown.pom +1 -0
  38. data/app/demo/namespaces.pom +89 -0
  39. data/app/demo/nav/top_nav.pom +12 -0
  40. data/app/demo/patterns.pom +19 -0
  41. data/app/demo/patterns/search_select.pom +104 -0
  42. data/app/demo/shared/context_list.pom +1 -1
  43. data/app/demo/styles.pom +21 -11
  44. data/component-status.yml +11 -11
  45. data/config.ru +2 -1
  46. data/lib/voom/container_methods.rb +1 -1
  47. data/lib/voom/presenters-engine.rb +29 -26
  48. data/lib/voom/presenters.rb +15 -9
  49. data/lib/voom/presenters/api/app.rb +18 -5
  50. data/lib/voom/presenters/api/router.rb +11 -49
  51. data/lib/voom/presenters/demo/echo.rb +5 -0
  52. data/lib/voom/presenters/dsl.rb +10 -4
  53. data/lib/voom/presenters/dsl/components/actions/base.rb +37 -0
  54. data/lib/voom/presenters/dsl/components/actions/clear.rb +17 -0
  55. data/lib/voom/presenters/dsl/components/actions/deletes.rb +17 -0
  56. data/lib/voom/presenters/dsl/components/actions/dialog.rb +17 -0
  57. data/lib/voom/presenters/dsl/components/actions/loads.rb +32 -0
  58. data/lib/voom/presenters/dsl/components/actions/navigates.rb +17 -0
  59. data/lib/voom/presenters/dsl/components/actions/posts.rb +17 -0
  60. data/lib/voom/presenters/dsl/components/actions/remove.rb +17 -0
  61. data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
  62. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +17 -0
  63. data/lib/voom/presenters/dsl/components/actions/stepper.rb +17 -0
  64. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +17 -0
  65. data/lib/voom/presenters/dsl/components/actions/updates.rb +17 -0
  66. data/lib/voom/presenters/dsl/components/avatar.rb +4 -5
  67. data/lib/voom/presenters/dsl/components/badge.rb +1 -1
  68. data/lib/voom/presenters/dsl/components/base.rb +20 -11
  69. data/lib/voom/presenters/dsl/components/button.rb +12 -10
  70. data/lib/voom/presenters/dsl/components/card.rb +18 -19
  71. data/lib/voom/presenters/dsl/components/checkbox.rb +3 -1
  72. data/lib/voom/presenters/dsl/components/chip.rb +9 -10
  73. data/lib/voom/presenters/dsl/components/content.rb +21 -11
  74. data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
  75. data/lib/voom/presenters/dsl/components/datetime_base.rb +1 -2
  76. data/lib/voom/presenters/dsl/components/datetime_field.rb +1 -1
  77. data/lib/voom/presenters/dsl/components/dialog.rb +10 -6
  78. data/lib/voom/presenters/dsl/components/drawer.rb +6 -4
  79. data/lib/voom/presenters/dsl/components/event.rb +55 -39
  80. data/lib/voom/presenters/dsl/components/event_base.rb +2 -2
  81. data/lib/voom/presenters/dsl/components/expansion_panel.rb +5 -5
  82. data/lib/voom/presenters/dsl/components/file_input.rb +22 -0
  83. data/lib/voom/presenters/dsl/components/footer.rb +1 -1
  84. data/lib/voom/presenters/dsl/components/form.rb +17 -15
  85. data/lib/voom/presenters/dsl/components/google_map.rb +40 -0
  86. data/lib/voom/presenters/dsl/components/grid.rb +58 -18
  87. data/lib/voom/presenters/dsl/components/header.rb +2 -5
  88. data/lib/voom/presenters/dsl/components/hidden_field.rb +2 -2
  89. data/lib/voom/presenters/dsl/components/icon.rb +4 -5
  90. data/lib/voom/presenters/dsl/components/icon_base.rb +3 -3
  91. data/lib/voom/presenters/dsl/components/icon_toggle.rb +2 -2
  92. data/lib/voom/presenters/dsl/components/image.rb +3 -3
  93. data/lib/voom/presenters/dsl/components/input.rb +2 -2
  94. data/lib/voom/presenters/dsl/components/list.rb +12 -10
  95. data/lib/voom/presenters/dsl/components/lists/action.rb +8 -9
  96. data/lib/voom/presenters/dsl/components/lists/actions.rb +8 -8
  97. data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
  98. data/lib/voom/presenters/dsl/components/lists/line.rb +14 -17
  99. data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
  100. data/lib/voom/presenters/dsl/components/menu.rb +10 -12
  101. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +9 -3
  102. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +0 -1
  103. data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
  104. data/lib/voom/presenters/dsl/components/mixins/chips.rb +1 -2
  105. data/lib/voom/presenters/dsl/components/mixins/common.rb +20 -14
  106. data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
  107. data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
  108. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +1 -2
  109. data/lib/voom/presenters/dsl/components/mixins/event.rb +3 -3
  110. data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
  111. data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  112. data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
  113. data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
  114. data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
  115. data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
  116. data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
  117. data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
  118. data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
  119. data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
  120. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +15 -0
  121. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +5 -3
  122. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +1 -4
  123. data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
  124. data/lib/voom/presenters/dsl/components/mixins/typography.rb +43 -13
  125. data/lib/voom/presenters/dsl/components/page.rb +0 -1
  126. data/lib/voom/presenters/dsl/components/radio_button.rb +1 -1
  127. data/lib/voom/presenters/dsl/components/rich_text_area.rb +26 -0
  128. data/lib/voom/presenters/dsl/components/select.rb +4 -5
  129. data/lib/voom/presenters/dsl/components/slider.rb +39 -0
  130. data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
  131. data/lib/voom/presenters/dsl/components/stepper.rb +106 -0
  132. data/lib/voom/presenters/dsl/components/switch.rb +1 -1
  133. data/lib/voom/presenters/dsl/components/tab_bar.rb +53 -0
  134. data/lib/voom/presenters/dsl/components/table.rb +99 -27
  135. data/lib/voom/presenters/dsl/components/text_area.rb +4 -3
  136. data/lib/voom/presenters/dsl/components/text_field.rb +8 -12
  137. data/lib/voom/presenters/dsl/components/time_field.rb +1 -1
  138. data/lib/voom/presenters/dsl/components/toggle_base.rb +2 -2
  139. data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
  140. data/lib/voom/presenters/dsl/components/typography.rb +4 -5
  141. data/lib/voom/presenters/dsl/definer.rb +2 -2
  142. data/lib/voom/presenters/dsl/definition.rb +6 -4
  143. data/lib/voom/presenters/dsl/user_interface.rb +17 -21
  144. data/lib/voom/presenters/errors/parameter_validation.rb +1 -1
  145. data/lib/voom/presenters/helpers.rb +5 -5
  146. data/lib/voom/presenters/helpers/date.rb +3 -3
  147. data/lib/voom/presenters/helpers/rails.rb +7 -2
  148. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  149. data/lib/voom/presenters/helpers/route.rb +6 -0
  150. data/lib/voom/presenters/helpers/time.rb +1 -1
  151. data/lib/voom/presenters/namespace.rb +12 -0
  152. data/lib/voom/presenters/settings.rb +58 -37
  153. data/lib/voom/presenters/version.rb +1 -1
  154. data/lib/voom/presenters/web_client/app.rb +50 -20
  155. data/lib/voom/presenters/web_client/markdown_render.rb +24 -11
  156. data/lib/voom/presenters/web_client/router.rb +17 -52
  157. data/lib/voom/serializer.rb +2 -2
  158. data/lib/voom/trace.rb +1 -1
  159. data/presenters.gemspec +2 -1
  160. data/public/style-bundle.js +2 -2
  161. data/scripts/bump.sh +1 -0
  162. data/scripts/changelog.sh +5 -0
  163. data/scripts/deploy-demo.sh +1 -0
  164. data/scripts/release.sh +1 -1
  165. data/scripts/tag.sh +5 -0
  166. data/views/mdc/.babelrc +8 -0
  167. data/views/mdc/.eslintrc.yml +23 -0
  168. data/views/mdc/assets/js/app.js +19 -6
  169. data/views/mdc/assets/js/components/base-component.js +25 -2
  170. data/views/mdc/assets/js/components/base-container.js +47 -0
  171. data/views/mdc/assets/js/components/button.js +3 -10
  172. data/views/mdc/assets/js/components/cards.js +11 -0
  173. data/views/mdc/assets/js/components/checkboxes.js +30 -7
  174. data/views/mdc/assets/js/components/chips.js +38 -5
  175. data/views/mdc/assets/js/components/content.js +13 -0
  176. data/views/mdc/assets/js/components/data-tables.js +38 -0
  177. data/views/mdc/assets/js/components/datetime.js +61 -21
  178. data/views/mdc/assets/js/components/dialogs.js +25 -19
  179. data/views/mdc/assets/js/components/events.js +13 -3
  180. data/views/mdc/assets/js/components/events/base.js +13 -3
  181. data/views/mdc/assets/js/components/events/errors.js +1 -1
  182. data/views/mdc/assets/js/components/events/posts.js +53 -13
  183. data/views/mdc/assets/js/components/events/removes.js +20 -0
  184. data/views/mdc/assets/js/components/events/replaces.js +35 -36
  185. data/views/mdc/assets/js/components/events/stepper.js +23 -0
  186. data/views/mdc/assets/js/components/events/toggle_visibility.js +15 -11
  187. data/views/mdc/assets/js/components/file-inputs.js +29 -0
  188. data/views/mdc/assets/js/components/forms.js +8 -59
  189. data/views/mdc/assets/js/components/grid.js +20 -0
  190. data/views/mdc/assets/js/components/hidden-fields.js +33 -0
  191. data/views/mdc/assets/js/components/icon-toggles.js +7 -14
  192. data/views/mdc/assets/js/components/initialize.js +20 -1
  193. data/views/mdc/assets/js/components/lists.js +1 -1
  194. data/views/mdc/assets/js/components/menus.js +12 -13
  195. data/views/mdc/assets/js/components/mixins/visibility-observer.js +34 -0
  196. data/views/mdc/assets/js/components/radios.js +39 -0
  197. data/views/mdc/assets/js/components/rich-text-area.js +43 -0
  198. data/views/mdc/assets/js/components/selects.js +24 -23
  199. data/views/mdc/assets/js/components/sliders.js +56 -0
  200. data/views/mdc/assets/js/components/snackbar.js +14 -23
  201. data/views/mdc/assets/js/components/steppers.js +48 -0
  202. data/views/mdc/assets/js/components/switches.js +24 -23
  203. data/views/mdc/assets/js/components/tab-bars.js +14 -0
  204. data/views/mdc/assets/js/components/text-fields.js +37 -35
  205. data/views/mdc/assets/js/config.js +27 -0
  206. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  207. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  208. data/views/mdc/assets/js/utils/config.js +73 -0
  209. data/views/mdc/assets/js/utils/config.test.js +59 -0
  210. data/views/mdc/assets/js/utils/urls.js +5 -2
  211. data/views/mdc/assets/scss/app.scss +11 -3
  212. data/views/mdc/assets/scss/components/button.scss +17 -2
  213. data/views/mdc/assets/scss/components/card.scss +8 -3
  214. data/views/mdc/assets/scss/components/checkbox.scss +0 -4
  215. data/views/mdc/assets/scss/components/content.scss +11 -0
  216. data/views/mdc/assets/scss/components/data-table.scss +80 -0
  217. data/views/mdc/assets/scss/components/datetime.scss +6 -0
  218. data/views/mdc/assets/scss/components/fab.scss +2 -1
  219. data/views/mdc/assets/scss/components/file-input.scss +22 -0
  220. data/views/mdc/assets/scss/components/grid.scss +59 -3
  221. data/views/mdc/assets/scss/components/image.scss +6 -0
  222. data/views/mdc/assets/scss/components/list.scss +13 -0
  223. data/views/mdc/assets/scss/components/menu.scss +1 -0
  224. data/views/mdc/assets/scss/components/radio.scss +4 -0
  225. data/views/mdc/assets/scss/components/rich-text-area.scss +37 -0
  226. data/views/mdc/assets/scss/components/slider.scss +1 -0
  227. data/views/mdc/assets/scss/components/snackbar.scss +1 -5
  228. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  229. data/views/mdc/assets/scss/components/switch.scss +4 -5
  230. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  231. data/views/mdc/assets/scss/components/textfield.scss +8 -1
  232. data/views/mdc/assets/scss/components/typography.scss +4 -0
  233. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +2 -2
  234. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  235. data/views/mdc/assets/scss/styles.scss +3 -2
  236. data/views/mdc/assets/scss/theme.scss +6 -0
  237. data/views/mdc/body/header.erb +1 -0
  238. data/views/mdc/body/snackbar.erb +1 -1
  239. data/views/mdc/components/actions/clear.rb +11 -0
  240. data/views/mdc/components/actions/delete.rb +11 -0
  241. data/views/mdc/components/actions/dialog.rb +11 -0
  242. data/views/mdc/components/actions/loads.rb +11 -0
  243. data/views/mdc/components/actions/navigates.rb +11 -0
  244. data/views/mdc/components/actions/post.rb +17 -0
  245. data/views/mdc/components/actions/remove.rb +10 -0
  246. data/views/mdc/components/actions/replaces.rb +12 -0
  247. data/views/mdc/components/actions/snackbar.rb +10 -0
  248. data/views/mdc/components/actions/stepper.rb +10 -0
  249. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  250. data/views/mdc/components/actions/update.rb +10 -0
  251. data/views/mdc/components/button.erb +9 -6
  252. data/views/mdc/components/buttons/button.erb +10 -5
  253. data/views/mdc/components/buttons/fab.erb +8 -2
  254. data/views/mdc/components/buttons/icon.erb +9 -2
  255. data/views/mdc/components/buttons/image.erb +9 -4
  256. data/views/mdc/components/{display.erb → caption.erb} +0 -0
  257. data/views/mdc/components/card.erb +6 -3
  258. data/views/mdc/components/checkbox.erb +21 -9
  259. data/views/mdc/components/chip.erb +12 -3
  260. data/views/mdc/components/content.erb +6 -1
  261. data/views/mdc/components/datetime.erb +21 -13
  262. data/views/mdc/components/dialog.erb +4 -1
  263. data/views/mdc/components/event.erb +5 -9
  264. data/views/mdc/components/file_input.erb +13 -0
  265. data/views/mdc/components/form.erb +19 -5
  266. data/views/mdc/components/google_map.erb +9 -0
  267. data/views/mdc/components/grid.erb +18 -4
  268. data/views/mdc/components/headline.erb +2 -0
  269. data/views/mdc/components/hidden_field.erb +6 -1
  270. data/views/mdc/components/icon_toggle.erb +1 -1
  271. data/views/mdc/components/list.erb +5 -2
  272. data/views/mdc/components/list/actions/switch.erb +1 -1
  273. data/views/mdc/components/list/line.erb +7 -6
  274. data/views/mdc/components/menu.erb +8 -12
  275. data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
  276. data/views/mdc/components/radio_button.erb +20 -10
  277. data/views/mdc/components/rich_text_area.erb +19 -0
  278. data/views/mdc/components/select.erb +7 -3
  279. data/views/mdc/components/slider.erb +41 -0
  280. data/views/mdc/components/snackbar.erb +2 -6
  281. data/views/mdc/components/stepper.erb +47 -0
  282. data/views/mdc/components/stepper/step.erb +33 -0
  283. data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
  284. data/views/mdc/components/switch.erb +27 -12
  285. data/views/mdc/components/tab_bar.erb +29 -0
  286. data/views/mdc/components/table.erb +4 -2
  287. data/views/mdc/components/table/checkbox.erb +17 -0
  288. data/views/mdc/components/table/header.erb +13 -4
  289. data/views/mdc/components/table/pagination.erb +14 -23
  290. data/views/mdc/components/table/row.erb +3 -1
  291. data/views/mdc/components/text_area.erb +17 -7
  292. data/views/mdc/components/text_field.erb +31 -13
  293. data/views/mdc/components/typography.erb +2 -2
  294. data/views/mdc/layout.erb +33 -31
  295. data/views/mdc/package-lock.json +11019 -6996
  296. data/views/mdc/package.json +46 -27
  297. data/views/mdc/webpack.config.js +1 -0
  298. metadata +112 -13
  299. data/app/demo/events/actions/autocomplete.pom +0 -32
  300. data/lib/voom/presenters/dsl/components/action.rb +0 -35
  301. data/views/mdc/assets/js/components/events/autocomplete.js +0 -96
  302. data/views/mdc/assets/js/material.js +0 -3996
  303. data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
  304. data/views/mdc/components/modal.erb +0 -15
  305. data/views/mdc/components/static.erb +0 -7
@@ -0,0 +1,47 @@
1
+ import {VBaseComponent} from "./base-component";
2
+
3
+ export class VBaseContainer extends VBaseComponent {
4
+ constructor(element, mdcComponent) {
5
+ super(element, mdcComponent);
6
+ }
7
+
8
+ inputs() {
9
+ return this.element.querySelectorAll('.v-input')
10
+ }
11
+
12
+ // Called to collect data for submission
13
+ prepareSubmit(params) {
14
+ for (let input of this.inputs()) {
15
+ if (input.vComponent && input.vComponent.prepareSubmit) {
16
+ input.vComponent.prepareSubmit(params);
17
+ }
18
+ }
19
+ }
20
+
21
+ clear() {
22
+ for (const input of this.inputs()) {
23
+ if (input.vComponent && input.vComponent.clear) {
24
+ input.vComponent.clear();
25
+ }
26
+ }
27
+ }
28
+
29
+ // Called whenever a container is about to be submitted.
30
+ // returns true on success
31
+ // returns on failure return an error object that can be processed by VErrors:
32
+ // { email: ["email must be filled", "email must be from your domain"] }
33
+ // { :page: ["must be filled"] }
34
+ validate(form, params) {
35
+ console.log("Form validate", form, params);
36
+ var errors = [];
37
+ for (let input of this.inputs()) {
38
+ if (input.vComponent && input.vComponent.validate) {
39
+ var result = input.vComponent.validate(form, params);
40
+ if (result !== true) {
41
+ errors.push(result);
42
+ }
43
+ }
44
+ }
45
+ return errors;
46
+ }
47
+ }
@@ -1,15 +1,8 @@
1
1
  import {MDCRipple} from '@material/ripple';
2
+ import {VBaseComponent} from "./base-component";
3
+ import {hookupComponents} from "./base-component";
2
4
 
3
5
  export function initButtons() {
4
6
  console.log('\tButtons');
5
-
6
- var rippleButtons = document.querySelectorAll('.v-js-ripple-button');
7
- if(rippleButtons) {
8
- for (var i = 0; i < rippleButtons.length; i++) {
9
- var button = rippleButtons[i];
10
- if(!button.mdcComponent) {
11
- button.mdcComponent = new MDCRipple(button);
12
- }
13
- }
14
- }
7
+ hookupComponents('.v-js-ripple-button', VBaseComponent, MDCRipple);
15
8
  }
@@ -1,3 +1,14 @@
1
+ import {VBaseContainer} from "./base-container";
2
+ import {hookupComponents} from "./base-component";
3
+
1
4
  export function initCards() {
2
5
  console.log('\tCards');
6
+ hookupComponents('.v-card', VCard, null);
3
7
  }
8
+
9
+ export class VCard extends VBaseContainer {
10
+ constructor(element, mdcComponent) {
11
+ super(element, mdcComponent);
12
+ }
13
+ }
14
+
@@ -1,15 +1,38 @@
1
1
  import {MDCCheckbox} from '@material/checkbox';
2
+ import {eventHandlerMixin} from "./mixins/event-handler";
3
+ import {VBaseComponent, hookupComponents} from './base-component';
2
4
 
3
5
  export function initCheckboxes() {
4
6
  console.log('\tCheckboxes');
7
+ hookupComponents('.v-checkbox', VCheckbox, MDCCheckbox);
8
+ }
5
9
 
6
- var components = document.querySelectorAll('.mdc-checkbox');
7
- if (components) {
8
- for (var i = 0; i < components.length; i++) {
9
- var component = components[i];
10
- if (!component.mdcComponent) {
11
- component.mdcComponent = MDCCheckbox.attachTo(component);
12
- }
10
+ export class VCheckbox extends eventHandlerMixin(VBaseComponent) {
11
+ constructor(element, mdcComponent) {
12
+ super(element, mdcComponent);
13
+ this.input = element.querySelector('input');
14
+ this.mdcComponent.indeterminate = (this.input.dataset.indeterminate === 'true');
15
+ }
16
+
17
+ prepareSubmit(params) {
18
+ if(this.input.checked) {
19
+ params.push([this.name(), this.value()]);
13
20
  }
14
21
  }
22
+
23
+ name(){
24
+ return this.input.name;
25
+ }
26
+
27
+ value(){
28
+ return this.input.value;
29
+ }
30
+
31
+ clear(){
32
+ this.input.checked = false
33
+ }
34
+
35
+ setValue(value){
36
+ this.input.value = value;
37
+ }
15
38
  }
@@ -1,12 +1,45 @@
1
1
  import {MDCChip} from '@material/chips';
2
+ import {MDCChipSet} from '@material/chips';
3
+ import {eventHandlerMixin} from "./mixins/event-handler";
4
+ import {VBaseComponent, hookupComponents} from './base-component';
2
5
 
3
6
  export function initChips() {
4
7
  console.log('\tChips');
5
- var components = document.querySelectorAll('.mdc-chip');
6
- for (var i = 0; i < components.length; i++) {
7
- var component = components[i];
8
- if(!component.mdcComponent) {
9
- component.mdcComponent = MDCChip.attachTo(component);
8
+ hookupComponents('.v-chip', VChip, MDCChip);
9
+ hookupComponents('.v-chip-set', VChipSet, MDCChipSet);
10
+ }
11
+
12
+ export class VChip extends eventHandlerMixin(VBaseComponent) {
13
+ constructor(element, mdcComponent) {
14
+ super(element, mdcComponent);
15
+ }
16
+
17
+ // Called to collect data for submission
18
+ prepareSubmit(params) {
19
+ if(this.value() !== ''){
20
+ params.push([this.name(), this.value()]);
10
21
  }
11
22
  }
23
+
24
+ name(){
25
+ return this.element.getAttribute('data-name');
26
+ }
27
+
28
+ value(){
29
+ return this.element.getAttribute('data-value');
30
+ }
31
+
32
+ clear(){
33
+ console.log('\tChip clear is a no-op');
34
+ }
35
+
36
+ setValue(value){
37
+ this.element.setAttribute('data-value', value);
38
+ }
39
+ }
40
+
41
+ export class VChipSet extends eventHandlerMixin(VBaseComponent) {
42
+ constructor(element, mdcComponent) {
43
+ super(element, mdcComponent);
44
+ }
12
45
  }
@@ -0,0 +1,13 @@
1
+ import {VBaseContainer} from "./base-container";
2
+ import {hookupComponents} from "./base-component";
3
+
4
+ export function initContent() {
5
+ console.log('\tContent');
6
+ hookupComponents('.v-content', VContent, null);
7
+ }
8
+
9
+ export class VContent extends VBaseContainer {
10
+ constructor(element, mdcComponent) {
11
+ super(element, mdcComponent);
12
+ }
13
+ }
@@ -0,0 +1,38 @@
1
+
2
+ function createSelectAllHandler(component, target, listElements) {
3
+ return function() {
4
+ for (let element of listElements) {
5
+ element.checked = target.checked;
6
+ }
7
+ }
8
+ }
9
+
10
+ function createTableRowSelectHandler(component, listElements, selectAll) {
11
+ return function() {
12
+ let checked = 0;
13
+ let unchecked = 0;
14
+ for (let element of listElements) {
15
+ element.checked ? checked++ : unchecked++;
16
+ }
17
+ selectAll.indeterminate = (checked && unchecked);
18
+ selectAll.checked = (checked && !unchecked);
19
+ }
20
+ }
21
+
22
+ export function initTables() {
23
+ console.log('\tTables');
24
+ let components = document.querySelectorAll('.mdl-data-table');
25
+ if (components) {
26
+ for (let component of components) {
27
+ let selectAllRow = component.querySelector('.v-checkbox--select-control');
28
+ let selectableRows = component.querySelectorAll('.v-table-item--selectable-checkbox');
29
+ if (selectAllRow && selectableRows) {
30
+ selectAllRow.addEventListener('change', createSelectAllHandler(component, selectAllRow, selectableRows));
31
+
32
+ for (let element of selectableRows) {
33
+ element.addEventListener('change', createTableRowSelectHandler(component, selectableRows, selectAllRow));
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
@@ -1,26 +1,19 @@
1
- import flatpickr from "flatpickr";
2
- import {VTextField} from './text-fields';
3
- import {MDCTextField} from '@material/textfield';
4
-
5
-
6
- export function initDateTime() {
7
- console.log('\tDateTime');
8
- let components = document.querySelectorAll('.v-datetime');
9
- for (let i = 0; i < components.length; i++) {
10
- let component = components[i];
11
- if (!component.vComponent) {
12
- component.vComponent = new VDateTime(component, new MDCTextField(component));
13
- }
14
- }
15
- }
16
-
1
+ import flatpickr from 'flatpickr';
2
+ import { MDCTextField } from '@material/textfield';
3
+ import { VTextField } from './text-fields';
4
+ import { hookupComponents } from './base-component';
5
+ import appConfig from '../config';
17
6
 
18
7
  export class VDateTime extends VTextField {
19
8
  constructor(element, mdcComponent) {
20
9
  super(element, mdcComponent);
21
- let config = JSON.parse(element.dataset.config);
22
- config.altInput = true;
23
- let type = element.dataset.type;
10
+
11
+ const type = element.dataset.type;
12
+ const config = Object.assign(
13
+ {},
14
+ appConfig.get('component.datetime.flatpickr', {}),
15
+ JSON.parse(element.dataset.config),
16
+ );
24
17
 
25
18
  if (type === 'datetime') {
26
19
  config.enableTime = true;
@@ -28,13 +21,60 @@ export class VDateTime extends VTextField {
28
21
  config.enableTime = true;
29
22
  config.noCalendar = true;
30
23
  }
24
+
25
+ config.onOpen = function onOpen(selectedDates, dateStr, instance) {
26
+ instance.mdc_text_field.foundation_.activateFocus();
27
+ };
28
+ config.onClose = function onClose(selectedDates, dateStr, instance) {
29
+ instance.mdc_text_field.foundation_.deactivateFocus();
30
+ };
31
+
31
32
  this.fp = flatpickr(this.input, config);
33
+ this.fp.mdc_text_field = mdcComponent;
34
+
35
+ element.addEventListener('click', () => this.toggle());
36
+ // element.addEventListener('change', () => this.checkDefaults());
32
37
  }
33
38
 
34
39
  clear() {
35
- this.fp.clear();
40
+ if (this.fp.input.value !== '') {
41
+ this.fp.clear();
42
+ }
43
+
44
+ this.mdcComponent.foundation_.deactivateFocus();
45
+ }
46
+
47
+ open() {
48
+ this.fp.open();
49
+ }
50
+
51
+ close() {
52
+ this.fp.close();
36
53
  }
37
- }
38
54
 
55
+ toggle() {
56
+ this.fp.toggle();
57
+ }
39
58
 
59
+ // checkDefaults() {
60
+ // if(this.fp.config.mode = 'range'){
61
+ // if(this.fp.selectedDates[1]){
62
+ // // If we are in range mode and the endDate is defined as the beginning of the day, default it to be the
63
+ // // end of the day.
64
+ // let endDate = this.fp.selectedDates[1];
65
+ // if(endDate.getHours() == 0 && endDate.getMinutes() == 0 && endDate.getSeconds() == 0 && endDate.getMilliseconds() == 0){
66
+ // endDate.setHours(23);
67
+ // endDate.setMinutes(59);
68
+ // endDate.setSeconds(59);
69
+ // endDate.getMilliseconds(9999);
70
+ // this.fp.setDate(this.fp.selectedDates)
71
+ // }
72
+ // }
73
+ // }
74
+ // }
75
+ }
40
76
 
77
+ export function initDateTime() {
78
+ console.log('\tDateTime');
79
+ hookupComponents('.v-datetime', VDateTime, MDCTextField);
80
+ }
@@ -1,30 +1,36 @@
1
1
  // This is used to get a proper binding of the actionData
2
2
  // https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example
3
+ import {VBaseContainer} from "./base-container";
4
+ import {hookupComponents} from "./base-component";
5
+ import {MDCTextField} from "@material/textfield";
6
+ import {VDateTime} from "./datetime";
7
+
8
+ export function initDialogs() {
9
+ console.log('\tDialogs');
10
+ hookupComponents('.v-dialog', VDialog, null);
11
+ }
12
+
3
13
  function createDialogHandler(dialog) {
4
14
  return function () {
5
15
  dialog.close();
6
16
  };
7
17
  }
8
18
 
9
- export function initDialogs() {
10
- console.log('\tDialogs');
11
-
12
- var dialogs = document.querySelectorAll('.v-js-dialog');
13
- if (dialogs) {
14
- for (var i = 0; i < dialogs.length; i++) {
15
- var dialog = dialogs[i];
16
- var dialogButtons = dialog.querySelectorAll('button:not([disabled])');
17
- for (var j = 0; j != dialogButtons.length; j++) {
18
- var dialogButton = dialogButtons[j];
19
- if (!dialogButton.dialog) {
20
- dialogButton.dialog = dialog;
21
- var buttonEvents = dialogButton.dataset.events;
22
- // If the dialog button does not have any events tied to it,
23
- // then close the dialog on click, otherwise let the events handlers
24
- // take care of the close.
25
- if (!buttonEvents) {
26
- dialogButton.addEventListener('click', createDialogHandler(dialog));
27
- }
19
+ export class VDialog extends VBaseContainer {
20
+ constructor(element) {
21
+ super(element);
22
+ let dialog = element;
23
+ var dialogButtons = dialog.querySelectorAll('button:not([disabled])');
24
+ for (var j = 0; j != dialogButtons.length; j++) {
25
+ var dialogButton = dialogButtons[j];
26
+ if (!dialogButton.dialog) {
27
+ dialogButton.dialog = dialog;
28
+ var buttonEvents = dialogButton.dataset.events;
29
+ // If the dialog button does not have any events tied to it,
30
+ // then close the dialog on click, otherwise let the events handlers
31
+ // take care of the close.
32
+ if (!buttonEvents) {
33
+ dialogButton.addEventListener('click', createDialogHandler(dialog));
28
34
  }
29
35
  }
30
36
  }
@@ -5,9 +5,10 @@ import {VDialog} from './events/dialog';
5
5
  import {VErrors} from './events/errors';
6
6
  import {VToggleVisibility} from './events/toggle_visibility';
7
7
  import {VSnackbarEvent} from './events/snackbar';
8
- import {VAutoComplete} from './events/autocomplete';
9
8
  import {VNavigates} from './events/navigates';
10
9
  import {VClears} from './events/clears';
10
+ import {VRemoves} from './events/removes';
11
+ import {VStepperEvent} from './events/stepper';
11
12
 
12
13
  export class VEvents {
13
14
  //[[type, url, target, params]]
@@ -50,6 +51,8 @@ export class VEvents {
50
51
  }
51
52
 
52
53
  }).catch(function (results) {
54
+ console.log("If you got here it may not be what you think:", results);
55
+
53
56
  var result = results.pop();
54
57
  new VErrors(event).displayErrors(result);
55
58
  });
@@ -76,14 +79,16 @@ export class VEvents {
76
79
  return new VDialog(options, params, event);
77
80
  case 'toggle_visibility':
78
81
  return new VToggleVisibility(options, params, event);
82
+ case 'remove':
83
+ return new VRemoves(options, params, event);
79
84
  case 'snackbar':
80
85
  return new VSnackbarEvent(options, params, event);
81
- case 'autocomplete':
82
- return new VAutoComplete(options, url, params, event);
83
86
  case 'navigates':
84
87
  return new VNavigates(options, params, event);
85
88
  case 'clear':
86
89
  return new VClears(options, params, event);
90
+ case 'stepper':
91
+ return new VStepperEvent(options, params, event);
87
92
  default:
88
93
  throw action_type + ' is not supported.';
89
94
  }
@@ -95,6 +100,7 @@ export class VEvents {
95
100
  // https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example
96
101
  function createEventHandler(actionsData) {
97
102
  return function (event) {
103
+ event.stopPropagation();
98
104
  new VEvents(actionsData, event).call();
99
105
  };
100
106
  }
@@ -112,6 +118,10 @@ export function initEvents() {
112
118
  var eventOptions = eventData[2];
113
119
  var actionsData = eventData[1];
114
120
  var eventHandler = createEventHandler(actionsData);
121
+ // allow overide of event handler by component
122
+ if (eventElem.vComponent && eventElem.vComponent.createEventHandler) {
123
+ eventHandler = eventElem.vComponent.createEventHandler(actionsData);
124
+ }
115
125
  // Delegate to the component if possible
116
126
  if (eventElem.vComponent && eventElem.vComponent.initEventListener) {
117
127
  eventElem.vComponent.initEventListener(eventName, eventHandler);