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
@@ -17,10 +17,20 @@ export class VBase extends VUrls {
17
17
 
18
18
  inputValues(form) {
19
19
  let params = [];
20
- // Let input component push parameters
20
+
21
+ // If tagged input is asked for. Fetch all the matching tag elements and then call any bound components
22
+ if (this.options.input_tag !== undefined) {
23
+ var taggedInputs = document.querySelectorAll('[data-input-tag=' + this.options.input_tag + ']');
24
+ for (let input of taggedInputs) {
25
+ if (input.vComponent && typeof input.vComponent.prepareSubmit === 'function') {
26
+ input.vComponent.prepareSubmit(params);
27
+ }
28
+ }
29
+ }
30
+ // Let input components push parameters
21
31
  let vComp = this.component();
22
- if (vComp) {
23
- vComp.prepareSubmit(form, params);
32
+ if (vComp && typeof vComp.prepareSubmit === 'function') {
33
+ vComp.prepareSubmit(params);
24
34
  }
25
35
  return params;
26
36
  }
@@ -64,7 +64,7 @@ export class VErrors {
64
64
  }
65
65
  for (var response of responseErrors) {
66
66
  var pageErrors = Object.values(this.normalizeErrors(response)).reduce(function (previous, value) {
67
- if (Array.isArray(value)) {
67
+ if (Array.isArray(value) && value.length > 0) {
68
68
  previous.push(value.join('<br/>'));
69
69
  }
70
70
  return previous;
@@ -1,5 +1,6 @@
1
1
  import {VSnackbar} from '../snackbar';
2
2
  import {VBase} from './base';
3
+ import appConfig from '../../config';
3
4
 
4
5
  // Replaces a given element with the contents of the call to the url.
5
6
  // parameters are appended.
@@ -17,13 +18,13 @@ export class VPosts extends VBase {
17
18
  let errors = this.validate();
18
19
  let method = this.method;
19
20
  if (errors.length > 0) {
20
- return new Promise(function (_, reject) {
21
+ return new Promise(function(_, reject) {
21
22
  results.push({
22
23
  action: 'posts',
23
24
  method: method,
24
25
  statusCode: 400,
25
26
  contentType: 'v/errors',
26
- content: errors
27
+ content: errors,
27
28
  });
28
29
  reject(results);
29
30
  });
@@ -33,7 +34,8 @@ export class VPosts extends VBase {
33
34
  var form = this.form();
34
35
  if (form) {
35
36
  FD = new FormData(form);
36
- } else {
37
+ }
38
+ else {
37
39
  FD = new FormData();
38
40
  }
39
41
  // Add params from presenter
@@ -49,20 +51,52 @@ export class VPosts extends VBase {
49
51
  var httpRequest = new XMLHttpRequest();
50
52
  var url = this.url;
51
53
  if (!httpRequest) {
52
- throw new Error('Cannot talk to server! Please upgrade your browser to one that supports XMLHttpRequest.');
54
+ throw new Error(
55
+ 'Cannot talk to server! Please upgrade your browser to one that supports XMLHttpRequest.');
53
56
  }
54
- return new Promise(function (resolve, reject) {
55
- httpRequest.onreadystatechange = function (event) {
57
+
58
+ let snackbarCallback = function(contentType, response) {
59
+ const snackbar = document.querySelector('.mdc-snackbar').vComponent;
60
+ if (contentType && contentType.indexOf('application/json') !== -1) {
61
+ const messages = JSON.parse(response).messages;
62
+ if (snackbar && messages && messages.snackbar) {
63
+ const message = messages.snackbar.join('<br/>');
64
+ if (message !== '') {
65
+ snackbar.display(message);
66
+ }
67
+ }
68
+ }
69
+ };
70
+
71
+ return new Promise(function(resolve, reject) {
72
+ httpRequest.onreadystatechange = function(event) {
56
73
  if (httpRequest.readyState === XMLHttpRequest.DONE) {
57
- console.log(httpRequest.status + ':' + this.getResponseHeader('content-type'));
74
+ const contentType = this.getResponseHeader('content-type');
75
+ console.log(httpRequest.status + ':' + contentType);
58
76
  if (httpRequest.status >= 200 && httpRequest.status < 300) {
59
77
  results.push({
60
78
  action: 'posts',
61
79
  method: this.method,
62
80
  statusCode: httpRequest.status,
63
- contentType: this.getResponseHeader('content-type'),
81
+ contentType: contentType,
82
+ content: httpRequest.responseText,
83
+ responseURL: httpRequest.responseURL,
84
+ });
85
+ snackbarCallback(contentType,
86
+ httpRequest.responseText);
87
+ resolve(results);
88
+ // Response is an html error page
89
+ } else if (contentType && contentType.indexOf('text/html') !== -1){
90
+ document.open(contentType);
91
+ document.write(httpRequest.responseText);
92
+ document.close();
93
+ results.push({
94
+ action: 'posts',
95
+ method: this.method,
96
+ statusCode: httpRequest.status,
97
+ contentType: contentType,
64
98
  content: httpRequest.responseText,
65
- responseURL: httpRequest.responseURL
99
+ responseURL: httpRequest.responseURL,
66
100
  });
67
101
  resolve(results);
68
102
  } else {
@@ -70,8 +104,8 @@ export class VPosts extends VBase {
70
104
  action: 'posts',
71
105
  method: this.method,
72
106
  statusCode: httpRequest.status,
73
- contentType: this.getResponseHeader('content-type'),
74
- content: httpRequest.responseText
107
+ contentType: contentType,
108
+ content: httpRequest.responseText,
75
109
  });
76
110
  reject(results);
77
111
  }
@@ -79,7 +113,13 @@ export class VPosts extends VBase {
79
113
  };
80
114
  // Set up our request
81
115
  httpRequest.open(method, url);
82
- console.log(method + ':' + url);
116
+
117
+ const headers = appConfig.get('request.headers.POST', {});
118
+
119
+ for (const [key, value] of Object.entries(headers)) {
120
+ httpRequest.setRequestHeader(key, value);
121
+ }
122
+
83
123
  // Send our FormData object; HTTP headers are set automatically
84
124
  httpRequest.send(FD);
85
125
  });
@@ -96,4 +136,4 @@ export class VPosts extends VBase {
96
136
  }
97
137
  return null;
98
138
  }
99
- }
139
+ }
@@ -0,0 +1,20 @@
1
+ export class VRemoves {
2
+ constructor(options, params, event) {
3
+ this.target = options.target;
4
+ this.ids = params.ids;
5
+ this.event = event;
6
+ }
7
+
8
+ call(results) {
9
+ let ids = this.ids;
10
+ var promiseObj = new Promise(function (resolve) {
11
+ results.push({action: 'removes', statusCode: 200});
12
+ for (const id of ids){
13
+ let elem = document.getElementById(id);
14
+ elem.parentNode.removeChild(elem);
15
+ }
16
+ resolve(results);
17
+ });
18
+ return promiseObj;
19
+ }
20
+ }
@@ -21,31 +21,31 @@ export class VReplaces extends VBase {
21
21
  throw new Error('Cannot talk to server! Please upgrade your browser to one that supports XMLHttpRequest.');
22
22
  }
23
23
  var elementId = this.element_id;
24
- var parentElement = this.parentElement();
24
+ var nodeToReplace = document.getElementById(elementId);
25
25
  var url = this.buildURL(this.url, this.params, this.inputValues(), [['grid_nesting', this.options.grid_nesting]]);
26
-
27
26
  let delayAmt = this.event instanceof InputEvent ? 500 : 0;
28
27
 
29
28
  var promiseObj = new Promise(function (resolve, reject) {
30
- clearTimeout(parentElement.vTimeout);
31
- parentElement.vTimeout = setTimeout(function(){
32
- httpRequest.onreadystatechange = function () {
33
- if (httpRequest.readyState === XMLHttpRequest.DONE) {
34
- console.log(httpRequest.status + ':' + this.getResponseHeader('content-type'));
35
- if (httpRequest.status === 200) {
36
- var nodeToReplace = document.getElementById(elementId);
37
- if (!nodeToReplace) {
38
- let msg = 'Unable to located node: \'' + elementId + '\'' +
39
- ' This usually the result of issuing a replaces action and specifying a element id that does not currently exist on the page.';
40
- console.error(msg);
41
- results.push({
42
- action: 'replaces',
43
- statusCode: 500,
44
- contentType: 'v/errors',
45
- content: {exception: msg}
46
- });
47
- reject(results);
48
- } else {
29
+ if (!nodeToReplace) {
30
+ let msg = 'Unable to located node: \'' + elementId + '\'' +
31
+ ' This usually the result of issuing a replaces action and specifying a element id that does not currently exist on the page.';
32
+ console.error(msg);
33
+ results.push({
34
+ action: 'replaces',
35
+ statusCode: 500,
36
+ contentType: 'v/errors',
37
+ content: {exception: msg}
38
+ });
39
+ reject(results);
40
+ }
41
+ else {
42
+ clearTimeout(nodeToReplace.vTimeout);
43
+ nodeToReplace.vTimeout = setTimeout(function(){
44
+ httpRequest.onreadystatechange = function () {
45
+ if (httpRequest.readyState === XMLHttpRequest.DONE) {
46
+ console.log(httpRequest.status + ':' + this.getResponseHeader('content-type'));
47
+ if (httpRequest.status === 200) {
48
+ let nodeToReplace = document.getElementById(elementId);
49
49
  nodeToReplace.outerHTML = httpRequest.responseText;
50
50
  var newNode = document.getElementById(elementId);
51
51
  initialize(newNode);
@@ -57,24 +57,23 @@ export class VReplaces extends VBase {
57
57
  content: httpRequest.responseText
58
58
  });
59
59
  resolve(results);
60
+ } else {
61
+ results.push({
62
+ action: 'replaces',
63
+ statusCode: httpRequest.status,
64
+ contentType: this.getResponseHeader('content-type'),
65
+ content: httpRequest.responseText
66
+ });
67
+ reject(results);
60
68
  }
61
- } else {
62
- results.push({
63
- action: 'replaces',
64
- statusCode: httpRequest.status,
65
- contentType: this.getResponseHeader('content-type'),
66
- content: httpRequest.responseText
67
- });
68
- reject(results);
69
69
  }
70
70
  }
71
- }
72
- console.log('GET:' + url);
73
- httpRequest.open('GET', url, true);
74
- httpRequest.setRequestHeader('X-NO-LAYOUT', true);
75
- httpRequest.send();
76
- }, delayAmt);
77
-
71
+ console.log('GET:' + url);
72
+ httpRequest.open('GET', url, true);
73
+ httpRequest.setRequestHeader('X-NO-LAYOUT', true);
74
+ httpRequest.send();
75
+ }, delayAmt);
76
+ }
78
77
  });
79
78
  return promiseObj;
80
79
  }
@@ -0,0 +1,23 @@
1
+ import {VBase} from './base';
2
+
3
+ export class VStepperEvent extends VBase {
4
+
5
+ constructor(options, params, event) {
6
+ super(options);
7
+ this.params = params;
8
+ this.event = event;
9
+ }
10
+
11
+ call(results) {
12
+ let parentElem = document.getElementById(this.params.stepper_id);
13
+ let component = parentElem.vComponent;
14
+ let nav_action = this.params.navigate;
15
+
16
+ let promiseObj = new Promise(function (resolve) {
17
+ component.navigate(nav_action);
18
+ results.push({action:'stepper', statusCode: 200});
19
+ resolve(results);
20
+ });
21
+ return promiseObj;
22
+ }
23
+ }
@@ -8,18 +8,22 @@ export class VToggleVisibility {
8
8
  call(results) {
9
9
  let targetId = this.targetId;
10
10
  let action = this.params.action;
11
+ let delayAmt = this.event instanceof FocusEvent ? 500 : 0;
12
+ let elem = document.getElementById(targetId);
11
13
  let promiseObj = new Promise(function (resolve) {
12
- console.log("Toggling visibility on: " + targetId);
13
- let elem = document.getElementById(targetId);
14
- if (action === 'show') {
15
- elem.classList.remove("v-hidden");
16
- } else if (action === 'hide') {
17
- elem.classList.add("v-hidden");
18
- } else {
19
- elem.classList.toggle("v-hidden");
20
- }
21
- results.push({action:'toggle_visibility', statusCode: 200});
22
- resolve(results);
14
+ clearTimeout(elem.vTimeout);
15
+ elem.vTimeout = setTimeout(function(){
16
+ console.log("Toggling visibility on: " + targetId);
17
+ if (action === 'show') {
18
+ elem.classList.remove("v-hidden");
19
+ } else if (action === 'hide') {
20
+ elem.classList.add("v-hidden");
21
+ } else {
22
+ elem.classList.toggle("v-hidden");
23
+ }
24
+ results.push({action:'toggle_visibility', statusCode: 200});
25
+ resolve(results);
26
+ }, delayAmt);
23
27
  });
24
28
  return promiseObj;
25
29
  }
@@ -0,0 +1,29 @@
1
+ import {VBaseContainer} from "./base-container";
2
+ import {VBaseComponent, hookupComponents} from "./base-component";
3
+ import {eventHandlerMixin} from "./mixins/event-handler";
4
+
5
+ export function initFileInputs() {
6
+ console.log('\tFile Inputs');
7
+ hookupComponents('.v-file-input', VFileInput, null);
8
+ }
9
+
10
+ export class VFileInput extends eventHandlerMixin(VBaseComponent) {
11
+ constructor(element, mdcComponent) {
12
+ super(element, mdcComponent);
13
+
14
+ this.input = element.querySelector('input[type=file]');
15
+ this.label = element.querySelector('label');
16
+
17
+ ['change', 'mouseup'].forEach((e) => {
18
+ element.addEventListener(e, () => this.handleFileSelection());
19
+ });
20
+ }
21
+
22
+ // From an example based on: https://www.quirksmode.org/dom/inputfile.html
23
+ handleFileSelection() {
24
+ if (!this.input.value) return;
25
+
26
+ var value = this.input.value.replace(/^.*[\\\/]/, '');
27
+ this.label.innerText = value;
28
+ }
29
+ }
@@ -1,65 +1,14 @@
1
+ import {eventHandlerMixin} from "./mixins/event-handler";
2
+ import {VBaseContainer} from "./base-container";
3
+ import {hookupComponents} from "./base-component";
4
+
1
5
  export function initForms() {
2
6
  console.log('\tForms');
3
-
4
- var components = document.querySelectorAll('.v-form');
5
- for (var i = 0; i < components.length; i++) {
6
- var component = components[i];
7
- if (!component.vComponent) {
8
- component.vComponent = new VForm(component);
9
- }
10
- }
7
+ hookupComponents('.v-form', VForm, null);
11
8
  }
12
9
 
13
- export class VForm {
14
- constructor(element) {
15
- this.element = element;
16
- }
17
-
18
- // Called whenever a form is about to be submitted.
19
- // returns true on success
20
- // returns on failure return an error object that can be processed by VErrors:
21
- // { email: ["email must be filled", "email must be from your domain"] }
22
- // { :page: ["must be filled"] }
23
- validate(form, params) {
24
- console.log("Form validate", form, params);
25
- var errors = [];
26
- for (let input of this.inputs()) {
27
- if (input.vComponent && input.vComponent.validate) {
28
- var result = input.vComponent.validate(form, params);
29
- if (result !== true) {
30
- errors.push(result);
31
- }
32
- }
33
- }
34
- return errors;
35
- }
36
-
37
- inputs() {
38
- return this.element.elements;
39
- }
40
-
41
- // Called to collect data for submission
42
- prepareSubmit(form, params) {
43
- for (let input of this.inputs()) {
44
- if (input.vComponent && input.vComponent.prepareSubmit) {
45
- input.vComponent.prepareSubmit(form, params);
46
- }
47
- }
48
- }
49
-
50
- initEventListener(eventName, eventHandler) {
51
- for (let input of this.inputs()) {
52
- if (input.vComponent && input.vComponent.initEventListener) {
53
- input.vComponent.initEventListener(eventName, eventHandler);
54
- }
55
- }
56
- }
57
-
58
- clear() {
59
- for (const input of this.inputs()) {
60
- if (input.vComponent && input.vComponent.clear) {
61
- input.vComponent.clear();
62
- }
63
- }
10
+ export class VForm extends eventHandlerMixin(VBaseContainer) {
11
+ constructor(element, mdcComponent) {
12
+ super(element, mdcComponent);
64
13
  }
65
14
  }
@@ -0,0 +1,20 @@
1
+ import {VBaseContainer} from "./base-container";
2
+ import {hookupComponents} from "./base-component";
3
+
4
+ export function initGrid() {
5
+ console.log('\tGrid');
6
+ hookupComponents('.v-grid', VGrid, null);
7
+ hookupComponents('.v-column', VColumn, null);
8
+ }
9
+
10
+ export class VGrid extends VBaseContainer {
11
+ constructor(element, mdcComponent) {
12
+ super(element, mdcComponent);
13
+ }
14
+ }
15
+
16
+ export class VColumn extends VBaseContainer {
17
+ constructor(element, mdcComponent) {
18
+ super(element, mdcComponent);
19
+ }
20
+ }