@iamproperty/components 7.1.0--beta7 → 7.2.1--beta1

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 (382) hide show
  1. package/assets/css/components/actionbar.component.css +1 -0
  2. package/assets/css/components/actionbar.component.css.map +1 -0
  3. package/assets/css/components/actionbar.global.css +1 -1
  4. package/assets/css/components/actionbar.global.css.map +1 -1
  5. package/assets/css/components/address-lookup.css +1 -1
  6. package/assets/css/components/address-lookup.css.map +1 -1
  7. package/assets/css/components/barchart.component.css +1 -1
  8. package/assets/css/components/barchart.component.css.map +1 -1
  9. package/assets/css/components/bento-grid.component.css +1 -0
  10. package/assets/css/components/bento-grid.component.css.map +1 -0
  11. package/assets/css/components/card.component.css +1 -1
  12. package/assets/css/components/card.component.css.map +1 -1
  13. package/assets/css/components/carousel.component.css +1 -1
  14. package/assets/css/components/carousel.component.css.map +1 -1
  15. package/assets/css/components/carousel.config.css +1 -1
  16. package/assets/css/components/carousel.config.css.map +1 -1
  17. package/assets/css/components/charts.config.css +1 -1
  18. package/assets/css/components/charts.config.css.map +1 -1
  19. package/assets/css/components/charts.css +1 -1
  20. package/assets/css/components/charts.css.map +1 -1
  21. package/assets/css/components/charts.module.css +1 -1
  22. package/assets/css/components/charts.module.css.map +1 -1
  23. package/assets/css/components/collapsible-side.css +1 -1
  24. package/assets/css/components/collapsible-side.css.map +1 -1
  25. package/assets/css/components/doughnutchart.component.css +1 -0
  26. package/assets/css/components/doughnutchart.component.css.map +1 -0
  27. package/assets/css/components/fileupload.css.map +1 -1
  28. package/assets/css/components/header.css.map +1 -1
  29. package/assets/css/components/inline-edit.preload.css +1 -1
  30. package/assets/css/components/inline-edit.preload.css.map +1 -1
  31. package/assets/css/components/marketing.css.map +1 -1
  32. package/assets/css/components/menu.component.css +1 -0
  33. package/assets/css/components/menu.component.css.map +1 -0
  34. package/assets/css/components/menu.css +1 -0
  35. package/assets/css/components/menu.css.map +1 -0
  36. package/assets/css/components/multi-step.component.css.map +1 -1
  37. package/assets/css/components/multiselect.preload.css +1 -1
  38. package/assets/css/components/multiselect.preload.css.map +1 -1
  39. package/assets/css/components/nav.component.css +1 -0
  40. package/assets/css/components/nav.component.css.map +1 -0
  41. package/assets/css/components/nav.docs.css.map +1 -1
  42. package/assets/css/components/nav.global.css.map +1 -1
  43. package/assets/css/components/nav.old.css +1 -1
  44. package/assets/css/components/nav.old.css.map +1 -1
  45. package/assets/css/components/nav.preload.css +1 -1
  46. package/assets/css/components/nav.preload.css.map +1 -1
  47. package/assets/css/components/notification.css +1 -1
  48. package/assets/css/components/notification.css.map +1 -1
  49. package/assets/css/components/pagination.css +1 -1
  50. package/assets/css/components/pagination.css.map +1 -1
  51. package/assets/css/components/property-searchbar.css.map +1 -1
  52. package/assets/css/components/slider.css +1 -1
  53. package/assets/css/components/slider.css.map +1 -1
  54. package/assets/css/components/snapshot.css.map +1 -1
  55. package/assets/css/components/stepper.css.map +1 -1
  56. package/assets/css/components/table-basic.component.css +1 -0
  57. package/assets/css/components/table-basic.component.css.map +1 -0
  58. package/assets/css/components/table-basic.global.css +1 -0
  59. package/assets/css/components/table-basic.global.css.map +1 -0
  60. package/assets/css/components/table.component.css +1 -0
  61. package/assets/css/components/table.component.css.map +1 -0
  62. package/assets/css/components/table.global.css +1 -1
  63. package/assets/css/components/table.global.css.map +1 -1
  64. package/assets/css/components/tabs.component.css +1 -0
  65. package/assets/css/components/tabs.component.css.map +1 -0
  66. package/assets/css/components/tabs.config.css +1 -0
  67. package/assets/css/components/tabs.config.css.map +1 -0
  68. package/assets/css/components/tabs.css +1 -1
  69. package/assets/css/components/tabs.css.map +1 -1
  70. package/assets/css/components/testimonial.css.map +1 -1
  71. package/assets/css/components/timeline.css.map +1 -1
  72. package/assets/css/core.min.css +1 -1
  73. package/assets/css/core.min.css.map +1 -1
  74. package/assets/css/mobile-core.min.css +1 -0
  75. package/assets/css/mobile-core.min.css.map +1 -0
  76. package/assets/css/mobile.min.css +1 -0
  77. package/assets/css/mobile.min.css.map +1 -0
  78. package/assets/css/style.min.css +1 -1
  79. package/assets/css/style.min.css.map +1 -1
  80. package/assets/js/components/_global.js +0 -1
  81. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  82. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  83. package/assets/js/components/actionbar/actionbar.component.js +86 -8
  84. package/assets/js/components/actionbar/actionbar.component.min.js +19 -6
  85. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  86. package/assets/js/components/address-lookup/address-lookup.component.js +17 -18
  87. package/assets/js/components/address-lookup/address-lookup.component.min.js +5 -5
  88. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  89. package/assets/js/components/applied-filters/applied-filters.component.js +0 -1
  90. package/assets/js/components/applied-filters/applied-filters.component.min.js +4 -4
  91. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  92. package/assets/js/components/barchart/barchart.component.js +2 -3
  93. package/assets/js/components/barchart/barchart.component.min.js +8 -4
  94. package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
  95. package/assets/js/components/bento-grid/bento-grid.component.js +50 -0
  96. package/assets/js/components/bento-grid/bento-grid.component.min.js +15 -0
  97. package/assets/js/components/bento-grid/bento-grid.component.min.js.map +1 -0
  98. package/assets/js/components/card/card.component.js +10 -13
  99. package/assets/js/components/card/card.component.min.js +7 -7
  100. package/assets/js/components/card/card.component.min.js.map +1 -1
  101. package/assets/js/components/carousel/carousel.component.js +4 -5
  102. package/assets/js/components/carousel/carousel.component.min.js +4 -4
  103. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  104. package/assets/js/components/chart/chart.component.js +1 -5
  105. package/assets/js/components/collapsible-side/collapsible-side.component.js +4 -5
  106. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +4 -4
  107. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
  108. package/assets/js/components/doughnutchart/doughnutchart.component.js +70 -0
  109. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +25 -0
  110. package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -0
  111. package/assets/js/components/fileupload/fileupload.component.js +2 -3
  112. package/assets/js/components/fileupload/fileupload.component.min.js +6 -6
  113. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  114. package/assets/js/components/filter-card/filter-card.component.js +3 -4
  115. package/assets/js/components/filter-card/filter-card.component.min.js +4 -4
  116. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  117. package/assets/js/components/filterlist/filterlist.component.js +0 -1
  118. package/assets/js/components/filterlist/filterlist.component.min.js +3 -3
  119. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
  120. package/assets/js/components/header/header.component.js +0 -1
  121. package/assets/js/components/header/header.component.min.js +1 -1
  122. package/assets/js/components/header/header.component.min.js.map +1 -1
  123. package/assets/js/components/inline-edit/inline-edit.component.js +7 -8
  124. package/assets/js/components/inline-edit/inline-edit.component.min.js +4 -4
  125. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  126. package/assets/js/components/marketing/marketing.component.js +0 -1
  127. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  128. package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
  129. package/assets/js/components/menu/menu.component.js +200 -0
  130. package/assets/js/components/menu/menu.component.min.js +77 -0
  131. package/assets/js/components/menu/menu.component.min.js.map +1 -0
  132. package/assets/js/components/multi-step/multi-step.component.js +10 -10
  133. package/assets/js/components/multi-step/multi-step.component.min.js +13 -0
  134. package/assets/js/components/multi-step/multi-step.component.min.js.map +1 -0
  135. package/assets/js/components/multiselect/multiselect.component.js +10 -10
  136. package/assets/js/components/multiselect/multiselect.component.min.js +3 -3
  137. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  138. package/assets/js/components/nav/nav.component.js +7 -7
  139. package/assets/js/components/nav/nav.component.min.js +7 -7
  140. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  141. package/assets/js/components/notification/notification.component.js +3 -3
  142. package/assets/js/components/notification/notification.component.min.js +4 -4
  143. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  144. package/assets/js/components/pagination/pagination.component.js +14 -8
  145. package/assets/js/components/pagination/pagination.component.min.js +5 -5
  146. package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
  147. package/assets/js/components/record-card/record-card.component.js +6 -8
  148. package/assets/js/components/record-card/record-card.component.min.js +4 -4
  149. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  150. package/assets/js/components/search/search.component.js +9 -6
  151. package/assets/js/components/search/search.component.min.js +8 -5
  152. package/assets/js/components/search/search.component.min.js.map +1 -1
  153. package/assets/js/components/slider/slider.component.js +8 -8
  154. package/assets/js/components/slider/slider.component.min.js +5 -5
  155. package/assets/js/components/slider/slider.component.min.js.map +1 -1
  156. package/assets/js/components/table/table.component.js +36 -200
  157. package/assets/js/components/table/table.component.min.js +13 -23
  158. package/assets/js/components/table/table.component.min.js.map +1 -1
  159. package/assets/js/components/table-ajax/table-ajax.component.js +46 -0
  160. package/assets/js/components/table-ajax/table-ajax.component.min.js +22 -0
  161. package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -0
  162. package/assets/js/components/table-basic/table-basic.component.js +46 -0
  163. package/assets/js/components/table-basic/table-basic.component.min.js +22 -0
  164. package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -0
  165. package/assets/js/components/table-no-submit/table-no-submit.component.js +77 -0
  166. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +22 -0
  167. package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -0
  168. package/assets/js/components/table-submit/table-submit.component.js +55 -0
  169. package/assets/js/components/table-submit/table-submit.component.min.js +22 -0
  170. package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -0
  171. package/assets/js/components/tabs/tabs.component.js +3 -2
  172. package/assets/js/components/tabs/tabs.component.min.js +6 -4
  173. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  174. package/assets/js/components/video-card/video-card.component.js +4 -3
  175. package/assets/js/components/video-card/video-card.component.min.js +3 -3
  176. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  177. package/assets/js/modules/applied-filters.js +8 -9
  178. package/assets/js/modules/carousel.js +9 -10
  179. package/assets/js/modules/chart.js +5 -3
  180. package/assets/js/modules/chart.module.js +108 -1
  181. package/assets/js/modules/dialogs.js +6 -7
  182. package/assets/js/modules/drawer.js +1 -2
  183. package/assets/js/modules/dynamicEvents.js +7 -8
  184. package/assets/js/modules/fileupload.js +7 -7
  185. package/assets/js/modules/filterlist.js +3 -4
  186. package/assets/js/modules/form.js +12 -13
  187. package/assets/js/modules/helpers.js +7 -5
  188. package/assets/js/modules/inputs.js +6 -9
  189. package/assets/js/modules/nav.js +3 -4
  190. package/assets/js/modules/notification.js +2 -3
  191. package/assets/js/modules/orderablelist.js +0 -1
  192. package/assets/js/modules/table.js +604 -317
  193. package/assets/js/modules/tabs.js +46 -19
  194. package/assets/js/scripts.bundle.js +3 -3
  195. package/assets/js/scripts.bundle.js.map +1 -1
  196. package/assets/js/scripts.bundle.min.js +2 -2
  197. package/assets/js/scripts.bundle.min.js.map +1 -1
  198. package/assets/js/scripts.js +71 -6
  199. package/assets/js/tests/card.spec.js +14 -0
  200. package/assets/js/tests/carousel.spec.js +60 -0
  201. package/assets/js/tests/chart.spec.js +7 -5
  202. package/assets/js/tests/fileupload.spec.js +22 -0
  203. package/assets/js/tests/multistep.spec.js +68 -0
  204. package/assets/js/tests/table.spec.js +0 -31
  205. package/assets/sass/_bs_grid.scss +4 -1
  206. package/assets/sass/_components.scss +326 -100
  207. package/assets/sass/_corefiles.scss +42 -18
  208. package/assets/sass/_elements.scss +98 -18
  209. package/assets/sass/_example.scss +61 -0
  210. package/assets/sass/_func.scss +5 -13
  211. package/assets/sass/_functions/bs_utilities.scss +43 -39
  212. package/assets/sass/_functions/functions.scss +66 -52
  213. package/assets/sass/_functions/mixins.scss +84 -100
  214. package/assets/sass/_functions/utility-mixins.scss +56 -44
  215. package/assets/sass/_functions/variables.scss +90 -1659
  216. package/assets/sass/_functions/variables_old.scss +1701 -0
  217. package/assets/sass/_grid.scss +19 -5
  218. package/assets/sass/_tests/func.spec.scss +1 -37
  219. package/assets/sass/_tests/mixins.spec.scss +1 -77
  220. package/assets/sass/_tests/typography.spec.scss +1 -1
  221. package/assets/sass/_utilities.scss +15 -5
  222. package/assets/sass/_utility-mixins.scss +6 -1
  223. package/assets/sass/components/{actionbar.scss → actionbar.component.scss} +83 -16
  224. package/assets/sass/components/actionbar.global.scss +12 -68
  225. package/assets/sass/components/address-lookup.scss +6 -0
  226. package/assets/sass/components/barchart.component.scss +7 -20
  227. package/assets/sass/components/bento-grid.component.scss +91 -0
  228. package/assets/sass/components/carousel.config.scss +64 -58
  229. package/assets/sass/components/charts.config.scss +73 -67
  230. package/assets/sass/components/charts.module.scss +128 -97
  231. package/assets/sass/components/charts.scss +43 -42
  232. package/assets/sass/components/collapsible-side.scss +29 -27
  233. package/assets/sass/components/doughnutchart.component.scss +205 -0
  234. package/assets/sass/components/fileupload.scss +4 -3
  235. package/assets/sass/components/header.scss +5 -5
  236. package/assets/sass/components/inline-edit.preload.scss +108 -102
  237. package/assets/sass/components/menu.component.scss +101 -0
  238. package/assets/sass/components/menu.scss +21 -0
  239. package/assets/sass/components/multi-step.component.scss +5 -3
  240. package/assets/sass/components/multiselect.preload.scss +36 -30
  241. package/assets/sass/components/{nav.scss → nav.component.scss} +41 -21
  242. package/assets/sass/components/nav.docs.scss +1 -1
  243. package/assets/sass/components/nav.global.scss +13 -11
  244. package/assets/sass/components/nav.old.scss +21 -24
  245. package/assets/sass/components/nav.preload.scss +40 -34
  246. package/assets/sass/components/notification.scss +9 -5
  247. package/assets/sass/components/pagination.scss +7 -0
  248. package/assets/sass/components/property-searchbar.scss +7 -7
  249. package/assets/sass/components/slider.scss +2 -0
  250. package/assets/sass/components/snapshot.scss +2 -2
  251. package/assets/sass/components/stepper.scss +7 -7
  252. package/assets/sass/components/{table.scss → table-basic.component.scss} +25 -68
  253. package/assets/sass/components/table-basic.global.scss +355 -0
  254. package/assets/sass/components/table.component.scss +40 -0
  255. package/assets/sass/components/table.global.scss +215 -418
  256. package/assets/sass/components/tabs.component.scss +5 -0
  257. package/assets/sass/components/tabs.config.scss +27 -0
  258. package/assets/sass/components/tabs.scss +40 -4
  259. package/assets/sass/components/testimonial.scss +7 -7
  260. package/assets/sass/components/timeline.scss +1 -1
  261. package/assets/sass/core.scss +13 -4
  262. package/assets/sass/elements/admin-panel.scss +199 -185
  263. package/assets/sass/elements/badge-tag.scss +87 -81
  264. package/assets/sass/elements/brand.scss +67 -61
  265. package/assets/sass/elements/buttons--action.scss +55 -0
  266. package/assets/sass/elements/buttons--compact.scss +135 -0
  267. package/assets/sass/elements/buttons--global.scss +323 -0
  268. package/assets/sass/elements/buttons--secondary.scss +24 -0
  269. package/assets/sass/elements/buttons--tertiary.scss +57 -0
  270. package/assets/sass/elements/buttons.scss +29 -503
  271. package/assets/sass/elements/container.scss +157 -151
  272. package/assets/sass/elements/details.scss +147 -138
  273. package/assets/sass/elements/dialog.scss +36 -30
  274. package/assets/sass/elements/forms.scss +1061 -1047
  275. package/assets/sass/elements/icons.scss +23 -17
  276. package/assets/sass/elements/links.scss +131 -116
  277. package/assets/sass/elements/lists.scss +270 -264
  278. package/assets/sass/elements/media.scss +19 -13
  279. package/assets/sass/elements/modal.scss +336 -330
  280. package/assets/sass/elements/popover.scss +163 -152
  281. package/assets/sass/elements/progress.scss +173 -162
  282. package/assets/sass/elements/table.element.scss +116 -108
  283. package/assets/sass/elements/tooltips.scss +87 -80
  284. package/assets/sass/elements/type.scss +172 -160
  285. package/assets/sass/email.scss +0 -1
  286. package/assets/sass/error.scss +15 -13
  287. package/assets/sass/foundations/reboot.scss +176 -170
  288. package/assets/sass/foundations/root.scss +136 -125
  289. package/assets/sass/helpers/max-height.scss +2 -2
  290. package/assets/sass/main.scss +14 -6
  291. package/assets/sass/mobile-core.scss +14 -0
  292. package/assets/sass/mobile.scss +16 -0
  293. package/assets/sass/templates/auth.scss +88 -83
  294. package/assets/sass/templates/form.scss +68 -59
  295. package/assets/ts/components/_global.ts +2 -3
  296. package/assets/ts/components/actionbar/actionbar.component.ts +94 -2
  297. package/assets/ts/components/address-lookup/address-lookup.component.ts +21 -22
  298. package/assets/ts/components/applied-filters/applied-filters.component.ts +1 -2
  299. package/assets/ts/components/barchart/barchart.component.ts +3 -5
  300. package/assets/ts/components/bento-grid/README.md +31 -0
  301. package/assets/ts/components/bento-grid/bento-grid.component.ts +67 -0
  302. package/assets/ts/components/card/card.component.ts +13 -16
  303. package/assets/ts/components/carousel/carousel.component.ts +5 -7
  304. package/assets/ts/components/chart/chart.component.ts +4 -9
  305. package/assets/ts/components/collapsible-side/collapsible-side.component.ts +5 -6
  306. package/assets/ts/components/doughnutchart/doughnutchart.component.ts +85 -0
  307. package/assets/ts/components/fileupload/fileupload.component.ts +5 -6
  308. package/assets/ts/components/filter-card/filter-card.component.ts +4 -5
  309. package/assets/ts/components/filterlist/filterlist.component.ts +1 -2
  310. package/assets/ts/components/header/header.component.ts +1 -3
  311. package/assets/ts/components/inline-edit/inline-edit.component.ts +8 -11
  312. package/assets/ts/components/marketing/marketing.component.ts +1 -3
  313. package/assets/ts/components/menu/menu.component.ts +222 -0
  314. package/assets/ts/components/multi-step/multi-step.component.ts +19 -23
  315. package/assets/ts/components/multiselect/multiselect.component.ts +13 -14
  316. package/assets/ts/components/nav/nav.component.ts +8 -9
  317. package/assets/ts/components/notification/notification.component.ts +3 -3
  318. package/assets/ts/components/pagination/pagination.component.ts +24 -12
  319. package/assets/ts/components/record-card/record-card.component.ts +9 -11
  320. package/assets/ts/components/search/search.component.ts +12 -9
  321. package/assets/ts/components/slider/slider.component.ts +9 -10
  322. package/assets/ts/components/table/table.component.ts +50 -247
  323. package/assets/ts/components/table-ajax/table-ajax.component.ts +64 -0
  324. package/assets/ts/components/table-basic/README.md +40 -0
  325. package/assets/ts/components/table-basic/table-basic.component.ts +56 -0
  326. package/assets/ts/components/table-no-submit/table-no-submit.component.ts +134 -0
  327. package/assets/ts/components/table-submit/table-submit.component.ts +64 -0
  328. package/assets/ts/components/tabs/tabs.component.ts +4 -3
  329. package/assets/ts/components/video-card/video-card.component.ts +13 -12
  330. package/assets/ts/modules/applied-filters.ts +10 -11
  331. package/assets/ts/modules/card.module.ts +1 -1
  332. package/assets/ts/modules/carousel.ts +13 -15
  333. package/assets/ts/modules/chart.module.ts +152 -19
  334. package/assets/ts/modules/chart.ts +26 -24
  335. package/assets/ts/modules/dialogs.ts +10 -13
  336. package/assets/ts/modules/drawer.ts +1 -2
  337. package/assets/ts/modules/dynamicEvents.ts +12 -14
  338. package/assets/ts/modules/fileupload.ts +10 -10
  339. package/assets/ts/modules/filterlist.ts +6 -7
  340. package/assets/ts/modules/form.ts +16 -17
  341. package/assets/ts/modules/helpers.ts +24 -21
  342. package/assets/ts/modules/inputs.ts +15 -18
  343. package/assets/ts/modules/nav.ts +4 -5
  344. package/assets/ts/modules/notification.ts +7 -8
  345. package/assets/ts/modules/orderablelist.ts +3 -4
  346. package/assets/ts/modules/pagination.ts +1 -1
  347. package/assets/ts/modules/table.ts +726 -356
  348. package/assets/ts/modules/tabs.ts +59 -20
  349. package/assets/ts/scripts.ts +72 -6
  350. package/assets/ts/tests/card.spec.ts +19 -0
  351. package/assets/ts/tests/carousel.spec.ts +66 -0
  352. package/assets/ts/tests/chart.spec.ts +9 -6
  353. package/assets/ts/tests/fileupload.spec.ts +30 -0
  354. package/assets/ts/tests/multistep.spec.ts +78 -0
  355. package/assets/ts/tests/table.spec.ts +0 -38
  356. package/dist/components.es.js +1260 -1063
  357. package/dist/components.umd.js +468 -198
  358. package/package.json +44 -49
  359. package/src/components/BentoGrid/BentoGrid.vue +20 -0
  360. package/src/components/DoughnutChart/DoughnutChart.vue +23 -0
  361. package/src/components/FileUpload/FileUpload.vue +4 -1
  362. package/src/components/Menu/Menu.vue +22 -0
  363. package/src/components/Table/TableAjax.vue +34 -0
  364. package/src/components/Table/TableBasic.vue +34 -0
  365. package/src/components/Table/TableNoSubmit.vue +34 -0
  366. package/src/components/Table/TableSubmit.vue +34 -0
  367. package/src/components/Tabs/Tabs.vue +0 -4
  368. package/src/index.js +25 -19
  369. package/assets/css/components/actionbar.css +0 -1
  370. package/assets/css/components/actionbar.css.map +0 -1
  371. package/assets/css/components/nav.css +0 -1
  372. package/assets/css/components/nav.css.map +0 -1
  373. package/assets/css/components/table.css +0 -1
  374. package/assets/css/components/table.css.map +0 -1
  375. package/assets/js/components.bundle.js +0 -5
  376. package/assets/js/components.bundle.js.map +0 -1
  377. package/assets/js/components.js +0 -57
  378. package/assets/js/modules/file-upload.js +0 -32
  379. package/assets/ts/components.ts +0 -62
  380. package/assets/ts/modules/file-upload.ts +0 -52
  381. package/dist/style.css +0 -1
  382. package/src/components/Table/Table.spec.js +0 -47
@@ -7,13 +7,188 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- // @ts-nocheck
11
- import { zeroPad, isNumeric, ucfirst, resolvePath } from './helpers.js';
12
- // Basic functionality needed
10
+ import { zeroPad, isNumeric, ucfirst, resolvePath, uniqueID } from './helpers.js';
11
+ // #region Helpers
12
+ export const formatCell = (format, cellOutput) => {
13
+ switch (format) {
14
+ case 'datetime':
15
+ return (new Date(cellOutput).toLocaleDateString('en-gb', {
16
+ weekday: 'short',
17
+ year: '2-digit',
18
+ month: 'long',
19
+ day: 'numeric',
20
+ }) +
21
+ ' ' +
22
+ new Date(cellOutput).toLocaleTimeString('en-gb', { hour: '2-digit', minute: '2-digit' }));
23
+ case 'date':
24
+ return new Date(cellOutput).toLocaleDateString('en-gb', {
25
+ day: 'numeric',
26
+ month: 'long',
27
+ year: '2-digit',
28
+ });
29
+ case 'capitalise':
30
+ return (cellOutput = ucfirst(cellOutput));
31
+ }
32
+ };
33
+ const filterFilters = function (form) {
34
+ const filters = new Object();
35
+ // Filter
36
+ const filterInputs = Array.from(form.querySelectorAll('[data-filter]'));
37
+ filterInputs.forEach((filterInput) => {
38
+ // Ignore uncked radio inputs
39
+ if (filterInput.type == 'radio' && !filterInput.checked) {
40
+ return;
41
+ }
42
+ if (filterInput.type == 'checkbox' && !filterInput.checked) {
43
+ return;
44
+ }
45
+ if (filterInput && filterInput.value) {
46
+ const dataFilter = filterInput.getAttribute('data-filter');
47
+ let filterValue = filterInput.value;
48
+ if (filterInput.hasAttribute('data-date-from'))
49
+ filterValue += '-date-from';
50
+ if (filterInput.hasAttribute('data-date-to'))
51
+ filterValue += '-date-to';
52
+ if (!filters[dataFilter])
53
+ filters[dataFilter] = [];
54
+ filters[dataFilter].push(filterValue);
55
+ }
56
+ });
57
+ return filters;
58
+ };
59
+ export const moveAttributesToComponents = (component) => {
60
+ let form = document.createElement('form');
61
+ if (component.hasAttribute('data-filterby')) {
62
+ form = document.querySelector(`#${component.getAttribute('data-filterby')}`);
63
+ }
64
+ else if (component.closest('form')) {
65
+ form = component.closest('form');
66
+ }
67
+ else {
68
+ table.parentNode.insertBefore(form, table.nextSibling);
69
+ }
70
+ if (form.hasAttribute('data-ajax'))
71
+ component.setAttribute('data-ajax', form.getAttribute('data-ajax'));
72
+ if (form.hasAttribute('data-schema'))
73
+ component.setAttribute('data-schema', form.getAttribute('data-schema'));
74
+ };
75
+ export const paginateTable = (component, table, form, pagination, callback) => {
76
+ if (!form.querySelector('[name=show]'))
77
+ form.insertAdjacentHTML('beforeend', `<input name="show" type="hidden" value="${component.getAttribute('data-show')}" />`);
78
+ if (!form.querySelector('[name=page]'))
79
+ form.insertAdjacentHTML('beforeend', `<input name="page" type="hidden" value="${component.getAttribute('data-page')}" />`);
80
+ pagination.addEventListener('update-show', (event) => {
81
+ if (form.querySelector('[name=show]').value != event.detail.show) {
82
+ form.querySelector('[name=show]').value = event.detail.show;
83
+ const updateEvent = new CustomEvent('update-show', { detail: { show: event.detail.show } });
84
+ component.dispatchEvent(updateEvent);
85
+ updateAttributes(component, pagination);
86
+ callback();
87
+ }
88
+ });
89
+ pagination.addEventListener('update-page', (event) => {
90
+ if (form.querySelector('[name=page]').value != event.detail.page) {
91
+ form.querySelector('[name=page]').value = event.detail.page;
92
+ const updateEvent = new CustomEvent('update-page', { detail: { page: event.detail.page } });
93
+ component.dispatchEvent(updateEvent);
94
+ updateAttributes(component, pagination);
95
+ callback();
96
+ // scroll back to the top of the table
97
+ if (!component.hasAttribute('data-no-scroll')) {
98
+ const yOffset = -250;
99
+ const y = table.getBoundingClientRect().top + window.pageYOffset + yOffset;
100
+ window.scrollTo({ top: y, behavior: 'smooth' });
101
+ }
102
+ }
103
+ });
104
+ };
105
+ export const findForm = (component, table) => {
106
+ let form = document.createElement('form');
107
+ if (component.hasAttribute('data-filterby')) {
108
+ form = document.querySelector(`#${component.getAttribute('data-filterby')}`);
109
+ }
110
+ else if (component.closest('form')) {
111
+ form = component.closest('form');
112
+ }
113
+ else {
114
+ table.parentNode.insertBefore(form, table.nextSibling);
115
+ }
116
+ return form;
117
+ };
118
+ // #endregion
119
+ export const setupBasicTable = (component, table, form, pagination) => {
120
+ const tableWrapper = component.shadowRoot.querySelector('.table__wrapper');
121
+ if (!component.hasAttribute('data-total'))
122
+ component.setAttribute('data-total', component.querySelectorAll('tbody tr').length);
123
+ if (!component.hasAttribute('data-page'))
124
+ component.setAttribute('data-page', 1);
125
+ if (!component.hasAttribute('data-show'))
126
+ component.setAttribute('data-show', 5);
127
+ if (!component.hasAttribute('data-increment'))
128
+ component.setAttribute('data-increment', component.getAttribute('data-show'));
129
+ transferAttributes(component, pagination);
130
+ addDataAttributes(table);
131
+ createMobileButton(component, table);
132
+ // Max height
133
+ if (component.classList.contains('mh-sm'))
134
+ tableWrapper.classList.add('mh-sm');
135
+ if (component.classList.contains('mh-md'))
136
+ tableWrapper.classList.add('mh-md');
137
+ if (component.classList.contains('mh-lg'))
138
+ tableWrapper.classList.add('mh-lg');
139
+ if (component.classList.contains('table--cta')) {
140
+ getLargestLastColWidth(component, table);
141
+ getRowHeight(component, table);
142
+ }
143
+ };
144
+ // #region Basic table fnctions
145
+ export const transferAttributes = (component, pagination) => {
146
+ if (component.hasAttribute('data-total'))
147
+ pagination.setAttribute('data-total', component.getAttribute('data-total'));
148
+ if (component.hasAttribute('data-page'))
149
+ pagination.setAttribute('data-page', component.getAttribute('data-page'));
150
+ if (component.hasAttribute('data-show'))
151
+ pagination.setAttribute('data-show', component.getAttribute('data-show'));
152
+ if (component.hasAttribute('data-increment'))
153
+ pagination.setAttribute('data-increment', component.getAttribute('data-show'));
154
+ if (component.hasAttribute('data-page-jump'))
155
+ pagination.setAttribute('data-page-jump', 'true');
156
+ if (component.hasAttribute('data-per-page'))
157
+ pagination.setAttribute('data-per-page', 'true');
158
+ if (component.hasAttribute('data-item-count'))
159
+ pagination.setAttribute('data-item-count', 'true');
160
+ if (component.hasAttribute('data-loading'))
161
+ pagination.setAttribute('data-loading', 'true');
162
+ if (component.classList.contains('table--fullwidth'))
163
+ pagination.setAttribute('data-minimal', 'true');
164
+ };
165
+ export const updateAttributes = (component, pagination) => {
166
+ component.setAttribute('data-total', pagination.getAttribute('data-total'));
167
+ component.setAttribute('data-page', pagination.getAttribute('data-page'));
168
+ component.setAttribute('data-show', pagination.getAttribute('data-show'));
169
+ component.setAttribute('data-increment', pagination.getAttribute('data-show'));
170
+ };
171
+ export const paginateRows = (component) => {
172
+ const total = component.getAttribute('data-total');
173
+ const page = component.getAttribute('data-page');
174
+ const show = component.getAttribute('data-show');
175
+ const increment = component.getAttribute('data-increment');
176
+ const table = component.querySelector('table');
177
+ const end = page * show;
178
+ const start = end - show;
179
+ Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
180
+ if (index >= start && index < end) {
181
+ row.classList.add('show');
182
+ }
183
+ else {
184
+ row.classList.remove('show');
185
+ }
186
+ });
187
+ };
13
188
  export const addDataAttributes = (table) => {
14
189
  const colHeadings = Array.from(table.querySelectorAll('thead th'));
15
190
  const colRows = Array.from(table.querySelectorAll('tbody tr'));
16
- colRows.forEach((row, index) => {
191
+ colRows.forEach((row) => {
17
192
  const cells = Array.from(row.querySelectorAll('th, td'));
18
193
  const statuses = [
19
194
  '0',
@@ -36,7 +211,8 @@ export const addDataAttributes = (table) => {
36
211
  'on track',
37
212
  'not started',
38
213
  'warning',
39
- 'error',
214
+ 'successful',
215
+ 'failed',
40
216
  ];
41
217
  cells.forEach((cell, cellIndex) => {
42
218
  const heading = colHeadings[cellIndex];
@@ -58,37 +234,21 @@ export const addDataAttributes = (table) => {
58
234
  });
59
235
  });
60
236
  };
61
- export const getLargestLastColWidth = (table) => {
62
- let largestWidth = 0;
63
- Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
64
- const htmlStyles = window.getComputedStyle(document.querySelector('html'));
65
- const lastColChild = row.querySelector(':scope > *:last-child > *:first-child');
66
- if (lastColChild) {
67
- lastColChild.classList.add('text-nowrap');
68
- let responsiveWidth = lastColChild.offsetWidth / parseFloat(htmlStyles.fontSize);
69
- responsiveWidth += 1.7;
70
- largestWidth = largestWidth > responsiveWidth ? largestWidth : responsiveWidth;
71
- }
72
- });
73
- return largestWidth;
74
- };
75
- export const createMobileButton = (table, wrapper) => {
76
- if (wrapper.classList.contains('table--fullwidth') && !wrapper.hasAttribute('data-expandable'))
237
+ export const createMobileButton = (component, table) => {
238
+ if (component.classList.contains('table--fullwidth') && !component.hasAttribute('data-expandable'))
77
239
  return false;
78
- if (table.querySelectorAll('thead tr th').length < 4 && !wrapper.hasAttribute('data-expandable'))
240
+ if (table.querySelectorAll('thead tr th').length < 4 && !component.hasAttribute('data-expandable'))
79
241
  return false;
80
242
  //If the expand column already exists we don't need to add a new one.
81
- Array.from(table.querySelectorAll('thead tr')).forEach((row, index) => {
243
+ Array.from(table.querySelectorAll('thead tr')).forEach((row) => {
82
244
  if (!table.querySelectorAll('thead tr th.expand-button-heading').length) {
83
- row.insertAdjacentHTML('afterbegin', `<th class="th--fixed expand-button-heading"></th>`);
245
+ row.insertAdjacentHTML('afterbegin', `<th class="${component.hasAttribute('data-expandable') ? 'th--fixed ' : ''}expand-button-heading"></th>`);
84
246
  }
85
247
  });
86
248
  Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
87
249
  const preExpanded = row.getAttribute('data-view') === 'full' ? 'aria-expanded' : '';
88
- row.insertAdjacentHTML('afterbegin', `<td class="td--fixed td--expand"><button class="btn btn-compact btn-secondary" data-expand-button ${preExpanded}>Expand</button></td>`);
250
+ row.insertAdjacentHTML('afterbegin', `<td class="${component.hasAttribute('data-expandable') ? 'td--fixed ' : ''}td--expand"><button class="btn btn-compact btn-secondary btn-sm" data-expand-button ${preExpanded} data-index="${index}">Expand</button></td>`);
89
251
  });
90
- };
91
- export const addTableEventListeners = (table) => {
92
252
  table.addEventListener('click', (event) => {
93
253
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-expand-button]')) {
94
254
  const button = event.target.closest('[data-expand-button]');
@@ -99,25 +259,216 @@ export const addTableEventListeners = (table) => {
99
259
  else
100
260
  tableRow.setAttribute('data-view', 'full');
101
261
  button.blur();
262
+ component.dispatchEvent(new CustomEvent('row-expanded', { detail: { row: button.getAttribute('data-index') } }));
263
+ }
264
+ });
265
+ };
266
+ export const getLargestLastColWidth = (component, table) => {
267
+ let largestWidth = 0;
268
+ Array.from(table.querySelectorAll('tbody tr')).forEach((row) => {
269
+ const htmlStyles = window.getComputedStyle(document.querySelector('html'));
270
+ const lastColChild = row.querySelector(':scope > *:last-child > *:first-child');
271
+ if (lastColChild) {
272
+ lastColChild.classList.add('text-nowrap');
273
+ let responsiveWidth = lastColChild.offsetWidth / parseFloat(htmlStyles.fontSize);
274
+ responsiveWidth += 1.8;
275
+ largestWidth = largestWidth > responsiveWidth ? largestWidth : responsiveWidth;
102
276
  }
103
277
  });
278
+ component.style.setProperty('--cta-width', `${largestWidth}rem`);
279
+ };
280
+ export const getRowHeight = (component, table) => {
281
+ function outputsize() {
282
+ Array.from(table.querySelectorAll('tr')).forEach((row) => {
283
+ const rowHeight = row.offsetHeight;
284
+ row.style.setProperty('--row-height', `${rowHeight}px`);
285
+ });
286
+ }
287
+ new ResizeObserver(outputsize).observe(table);
104
288
  };
105
- // Filters
106
- export const createSearchDataList = (table, form) => {
107
- const searchInput = form.querySelector('input[data-search]');
289
+ // #endregion
290
+ export const setupAdvancedTable = (component, table) => {
291
+ if (component.querySelector('iam-actionbar[data-selectall]') ||
292
+ document.querySelector(`iam-actionbar[data-for='${component.getAttribute('id')}']`)) {
293
+ const actionbar = component.querySelector('iam-actionbar[data-selectall]')
294
+ ? component.querySelector('iam-actionbar[data-selectall]')
295
+ : document.querySelector(`iam-actionbar[data-for='${component.getAttribute('id')}']`);
296
+ addSelectboxes(component, table, actionbar);
297
+ }
298
+ component.querySelectorAll('.dialog__wrapper .btn-compact').forEach((btn) => {
299
+ btn.classList.add('btn-sm');
300
+ btn.classList.add('m-0');
301
+ const tr = btn.closest('tr');
302
+ const td = btn.closest('td');
303
+ const trChildren = Array.prototype.slice.call(tr.children);
304
+ const cellIndex = trChildren.indexOf(td);
305
+ td.classList.add('td--fixed');
306
+ table.querySelector(`thead tr th:nth-child(${cellIndex + 1})`).classList.add('th--fixed');
307
+ });
308
+ };
309
+ // #region Advanced table functions
310
+ export const addSelectboxes = (component, table, actionbar) => {
311
+ Array.from(table.querySelectorAll('thead tr')).forEach((row) => {
312
+ if (row.querySelector('.expand-button-heading'))
313
+ row.querySelector('.expand-button-heading').insertAdjacentHTML('afterend', `<th class="th--fixed"></th>`);
314
+ else
315
+ row.insertAdjacentHTML('afterbegin', `<th class="th--fixed"></th>`);
316
+ });
317
+ Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
318
+ row.setAttribute('data-index', index + 1);
319
+ if (!row.querySelector('.selectrow')) {
320
+ const rowID = `row${uniqueID(index)}`;
321
+ if (row.querySelector('.td--expand'))
322
+ row
323
+ .querySelector('.td--expand')
324
+ .insertAdjacentHTML('afterend', `<td class="td--fixed selectrow selected"><input type="checkbox" name="row" id="${rowID}" ${row.hasAttribute('data-selected') ? `checked="true"` : ''}/><label for="${rowID}"><span class="visually-hidden">Select row</span></label></td>`);
325
+ else
326
+ row.insertAdjacentHTML('afterbegin', `<td class="td--fixed selectrow selected"><input type="checkbox" name="row" id="${rowID}" ${row.hasAttribute('data-selected') ? `checked="true"` : ''}/><label for="${rowID}"><span class="visually-hidden">Select row</span></label></td>`);
327
+ }
328
+ });
329
+ table.addEventListener('change', (event) => {
330
+ if (event && event.target instanceof HTMLElement && event.target.closest('.selectrow input')) {
331
+ const input = event.target.closest('.selectrow input');
332
+ const row = event.target.closest('tr');
333
+ const count = table.querySelectorAll('.selectrow input[type="checkbox"]').length;
334
+ const countChecked = table.querySelectorAll('.selectrow input[type="checkbox"]:checked').length;
335
+ actionbar.setAttribute('data-selected', count == countChecked ? 'all' : countChecked);
336
+ const dispatchedEvent = new CustomEvent('row-selected', {
337
+ detail: {
338
+ rowIndex: row.getAttribute('data-index'),
339
+ checked: input.checked ? true : false,
340
+ },
341
+ });
342
+ component.dispatchEvent(dispatchedEvent);
343
+ }
344
+ });
345
+ actionbar.addEventListener('selected', (event) => {
346
+ if (event.detail.selected == '0') {
347
+ Array.from(table.querySelectorAll('.selectrow input[type="checkbox"]')).forEach((input) => {
348
+ input.checked = false;
349
+ });
350
+ const dispatchedEvent = new CustomEvent('all-rows-unselected');
351
+ component.dispatchEvent(dispatchedEvent);
352
+ }
353
+ else if (event.detail.selected == 'all') {
354
+ Array.from(table.querySelectorAll('.selectrow input[type="checkbox"]')).forEach((input) => {
355
+ input.checked = true;
356
+ });
357
+ const dispatchedEvent = new CustomEvent('all-rows-selected');
358
+ component.dispatchEvent(dispatchedEvent);
359
+ }
360
+ });
361
+ };
362
+ // Export CSV Data
363
+ export const addExportEventListeners = (button, table) => {
364
+ if (!button) {
365
+ return false;
366
+ }
367
+ button.addEventListener('click', () => {
368
+ exportAsCSV(table);
369
+ });
370
+ };
371
+ export const exportAsCSV = function (table) {
372
+ let csvData = [];
373
+ // Get each row data
374
+ const rows = table.getElementsByTagName('tr');
375
+ for (let i = 0; i < rows.length; i++) {
376
+ // Get each column data
377
+ const cols = rows[i].querySelectorAll('td,th');
378
+ // Stores each csv row data
379
+ const csvRow = [];
380
+ for (let j = 0; j < cols.length; j++) {
381
+ // Get the text data of each cell of a row and push it to csvrow
382
+ csvRow.push(`"${cols[j].textContent}"`);
383
+ }
384
+ // Combine each column value with comma
385
+ csvData.push(csvRow.join(','));
386
+ }
387
+ // Combine each row data with new line character
388
+ csvData = csvData.join('\n');
389
+ // Create CSV file object and feed our csvData into it
390
+ const CSVFile = new Blob([csvData], {
391
+ type: 'text/csv',
392
+ });
393
+ // Create to temporary link to initiate download process
394
+ const tempLink = document.createElement('a');
395
+ tempLink.download = 'export.csv';
396
+ const url = window.URL.createObjectURL(CSVFile);
397
+ tempLink.href = url;
398
+ // This link should not be displayed
399
+ tempLink.style.display = 'none';
400
+ document.body.appendChild(tempLink);
401
+ // Automatically click the link to trigger download
402
+ tempLink.click();
403
+ document.body.removeChild(tempLink);
404
+ };
405
+ // #endregion
406
+ export const setupNoSubmitTable = (component, table, form, pagination, savedTableBody) => {
407
+ sortViaHeaders(component, table);
408
+ createSearchDataList(component, table);
409
+ form.addEventListener('change', (event) => {
410
+ if (event && event.target instanceof HTMLElement && event.target.closest('[data-sort]')) {
411
+ sortTable(table, form, savedTableBody);
412
+ }
413
+ });
414
+ addFilterEventListeners(component, table, form, pagination, savedTableBody);
415
+ };
416
+ // #region No submit table functions
417
+ export const sortViaHeaders = (component, table) => {
418
+ table.addEventListener('click', (event) => {
419
+ if (event && event.target instanceof HTMLElement && event.target.closest('[data-sort]')) {
420
+ const heading = event.target.closest('[data-sort]');
421
+ heading.setAttribute('data-sort', 'true');
422
+ // Turn other headings off
423
+ Array.from(table.querySelectorAll('th[data-sort]')).forEach((element) => {
424
+ if (element != heading) {
425
+ element.setAttribute('data-sort', '');
426
+ element.removeAttribute('data-order-by');
427
+ heading.setAttribute('title', 'Click to sort ascending');
428
+ }
429
+ });
430
+ if (heading.hasAttribute('data-order-by') && heading.getAttribute('data-order-by') == 'asc') {
431
+ heading.setAttribute('data-order-by', 'desc');
432
+ heading.setAttribute('title', 'Click to sort ascending');
433
+ }
434
+ else {
435
+ heading.setAttribute('data-order-by', 'asc');
436
+ heading.setAttribute('title', 'Click to sort descending');
437
+ }
438
+ // dispath event
439
+ const dispatchedEvent = new CustomEvent('sort-by-heading', {
440
+ detail: {
441
+ heading: heading.textContent,
442
+ sortBy: heading.getAttribute('data-order-by'),
443
+ ref: heading.getAttribute('data-ref'),
444
+ },
445
+ });
446
+ component.dispatchEvent(dispatchedEvent);
447
+ const sortBy = heading.textContent.trim();
448
+ const order = heading.getAttribute('data-order-by');
449
+ if (!component.hasAttribute('data-submit')) {
450
+ // TODO
451
+ sortTableByValues(table, sortBy, order);
452
+ }
453
+ }
454
+ });
455
+ };
456
+ export const createSearchDataList = (component, table) => {
457
+ var _a;
458
+ const actionbar = component.querySelector('iam-actionbar');
459
+ if (!actionbar)
460
+ return false;
461
+ const searchInput = (_a = actionbar.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('input#search');
108
462
  if (!searchInput)
109
463
  return false;
110
464
  const searchID = searchInput.getAttribute('id');
111
- const searchableColumns = searchInput.getAttribute('data-search').split(',');
112
465
  const inputWrapper = searchInput.parentNode;
113
466
  const searchableTerms = {};
114
- searchableColumns.forEach((columnHeading, index) => {
115
- Array.from(table.querySelectorAll('td[data-label="' + columnHeading.trim() + '"]')).forEach((td, index) => {
116
- if (td.querySelector('.td__content'))
117
- searchableTerms[td.querySelector('.td__content').textContent] = td.querySelector('.td__content').textContent;
118
- else
119
- searchableTerms[td.textContent] = td.textContent;
120
- });
467
+ table.querySelectorAll('tbody td:not(.td--fixed)').forEach((td) => {
468
+ if (td.querySelector('.td__content'))
469
+ searchableTerms[td.querySelector('.td__content').textContent] = td.querySelector('.td__content').textContent;
470
+ else
471
+ searchableTerms[td.textContent] = td.textContent;
121
472
  });
122
473
  searchInput.setAttribute('list', `${searchID}_list`);
123
474
  searchInput.setAttribute('autocomplete', 'off');
@@ -127,23 +478,85 @@ export const createSearchDataList = (table, form) => {
127
478
  .map((term) => `<option value="${term}"></option>`)
128
479
  .join('')}`;
129
480
  };
130
- export const addFilterEventListeners = (table, form, pagination, wrapper, savedTableBody) => {
481
+ export const sortTable = (table, form, savedTableBody) => {
482
+ if (form.getAttribute('data-ajax')) {
483
+ return false;
484
+ }
485
+ const tbody = table.querySelector('tbody');
486
+ let selectedOption = form.querySelector(`input[type="radio"][data-sort]:checked`);
487
+ if (form.querySelector('select[data-sort]')) {
488
+ const select = form.querySelector('select[data-sort]');
489
+ selectedOption = form.querySelector(`select[data-sort] option:nth-child(${select.selectedIndex + 1})`);
490
+ }
491
+ const sortBy = selectedOption.getAttribute('data-sort');
492
+ const order = selectedOption.getAttribute('data-order');
493
+ const format = selectedOption.getAttribute('data-format');
494
+ if (!sortBy) {
495
+ tbody.innerHTML = savedTableBody.innerHTML;
496
+ addDataAttributes(table);
497
+ return false;
498
+ }
499
+ sortTableByValues(table, sortBy, order, format);
500
+ };
501
+ export const sortTableByValues = (table, sortBy, order, format = '') => {
502
+ const tbody = table.querySelector('tbody');
503
+ let orderArray = [];
504
+ if (!['asc', 'desc', 'descending'].includes(order)) {
505
+ orderArray = order.split(',');
506
+ }
507
+ // Create an array from the table rows, the index created is then used to sort the array
508
+ let tableArr = [];
509
+ Array.from(tbody.querySelectorAll('tr')).forEach((tableRow) => {
510
+ let rowIndex = tableRow
511
+ .querySelector('td[data-label="' + sortBy + '"], th[data-label="' + sortBy + '"]')
512
+ .textContent.trim();
513
+ if (tableRow.querySelector('[data-label="' + sortBy + '"] .td__content')) {
514
+ rowIndex = tableRow.querySelector('[data-label="' + sortBy + '"] .td__content').textContent.trim();
515
+ }
516
+ // If a predefined order set replace the search term with an ordered numeric value so it can be sorted
517
+ if (orderArray.length && orderArray.includes(rowIndex)) {
518
+ rowIndex = orderArray.indexOf(rowIndex);
519
+ }
520
+ if (isNumeric(rowIndex)) {
521
+ rowIndex = zeroPad(rowIndex, 10);
522
+ }
523
+ // If the sort format is date then lets transform the index to a sortable date (this is never displayed)
524
+ if (format && format == 'date') {
525
+ rowIndex = new Date(rowIndex);
526
+ }
527
+ const dataRow = {
528
+ index: rowIndex,
529
+ row: tableRow,
530
+ };
531
+ tableArr.push(dataRow);
532
+ });
533
+ // Sort array alphabetically
534
+ tableArr.sort((a, b) => (a.index > b.index ? 1 : -1));
535
+ // Reverse if descending
536
+ if (order == 'descending' || order == 'desc') {
537
+ tableArr = tableArr.reverse();
538
+ }
539
+ // Create a string to return and populate the tbody
540
+ let strTbody = '';
541
+ tableArr.forEach((tableRow) => {
542
+ strTbody += tableRow.row.outerHTML;
543
+ });
544
+ tbody.innerHTML = strTbody;
545
+ };
546
+ export const addFilterEventListeners = (component, table, form, pagination, savedTableBody) => {
131
547
  let timer;
132
548
  // Check what conditions are set on the table to see what the form actions are
133
549
  const formSubmit = function (event, paginate = false) {
134
- if (wrapper.hasAttribute('data-no-submit')) {
135
- return false;
136
- }
137
550
  if (form.classList.contains('processing'))
138
551
  return false;
139
- Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element, index) => {
552
+ Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element) => {
140
553
  const event = new Event('tags-set');
141
554
  element.dispatchEvent(event);
142
555
  });
143
556
  // Before submitting check if any duplicate checkboxes within the filters dialog needs to upset the original input
144
557
  if (event.type == 'submit') {
145
558
  form.classList.add('processing');
146
- Array.from(form.querySelectorAll('[data-duplicate]')).forEach((element, index) => {
559
+ Array.from(form.querySelectorAll('[data-duplicate]')).forEach((element) => {
147
560
  const id = element.getAttribute('data-duplicate');
148
561
  const input = document.getElementById(id);
149
562
  const card = document.querySelector(`[for="${id}"] iam-card`);
@@ -159,43 +572,44 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
159
572
  });
160
573
  form.classList.remove('processing');
161
574
  }
162
- if (form.hasAttribute('data-ajax')) {
163
- // Default back to page 1
164
- if (!paginate) {
165
- const paginationInput = form.querySelector('[data-pagination]');
166
- paginationInput.value = 1;
167
- wrapper.setAttribute('data-page', 1);
168
- }
169
- loadAjaxTable(table, form, pagination, wrapper);
170
- }
171
- else if (form.hasAttribute('data-submit')) {
172
- form.submit();
173
- }
174
- else {
175
- filterTable(table, form, wrapper);
176
- populateDataQueries(table, form);
177
- }
575
+ filterTable(component, table, form, pagination);
576
+ populateDataQueries(component, table, form);
577
+ /*
178
578
  // Pass post data back to the page
179
579
  if (form.hasAttribute('data-ajax-post')) {
180
- const formData = new FormData(form);
181
- const queryString = new URLSearchParams(formData).toString();
182
- const http = new XMLHttpRequest();
183
- http.open('GET', `${window.location.href}?ajax=true&${queryString}`);
184
- http.send();
580
+ const formData = new FormData(form);
581
+ const queryString = new URLSearchParams(formData).toString();
582
+ const http = new XMLHttpRequest();
583
+ http.open('GET', `${window.location.href}?ajax=true&${queryString}`);
584
+ http.send();
185
585
  }
586
+ */
186
587
  };
187
- if (form.querySelector('iam-actionbar[data-search]')) {
188
- form.querySelector('iam-actionbar[data-search]').addEventListener('search-submit', (event) => {
588
+ if (component.querySelector('iam-actionbar[data-search]')) {
589
+ component.querySelector('iam-actionbar[data-search]').addEventListener('search-submit', (event) => {
189
590
  if (form.querySelector('input[data-search]')) {
190
591
  form.querySelector('input[data-search]').value = event.detail.search;
191
592
  }
192
593
  else {
193
- form.insertAdjacentHTML('beforeend', `<input type="hidden" name="search" data-search="${form.querySelector('iam-actionbar[data-search]').getAttribute('data-search')}" value="${event.detail.search}"/>`);
594
+ form.insertAdjacentHTML('beforeend', `<input type="hidden" name="search" data-search="${component.querySelector('iam-actionbar[data-search]').getAttribute('data-search')}" value="${event.detail.search}"/>`);
194
595
  }
596
+ const submitEvent = new CustomEvent('search-submit', {
597
+ detail: event.details,
598
+ });
599
+ component.dispatchEvent(submitEvent);
195
600
  clearTimeout(timer);
196
601
  formSubmit(event);
197
602
  });
198
603
  }
604
+ if (component.querySelector('iam-actionbar') && !component.querySelector('iam-actionbar').closest('form')) {
605
+ component.querySelector('iam-actionbar').addEventListener('change', (event) => {
606
+ if (!form.querySelector('.duplicate-actionbar')) {
607
+ form.insertAdjacentHTML('beforeend', `<div class="duplicate-actionbar" style="visibility: hidden; pointer-events: none; position: absolute;"></div>`);
608
+ }
609
+ form.querySelector('.duplicate-actionbar').innerHTML = component.querySelector('iam-actionbar').innerHTML;
610
+ filterTable(component, table, form, pagination);
611
+ });
612
+ }
199
613
  form.addEventListener('keyup', (event) => {
200
614
  clearTimeout(timer);
201
615
  if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')) {
@@ -206,18 +620,12 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
206
620
  });
207
621
  form.addEventListener('change', (event) => {
208
622
  clearTimeout(timer);
209
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-sort]')) {
210
- if (!form.hasAttribute('data-submit')) {
211
- sortTable(table, form, savedTableBody);
212
- }
213
- formSubmit(event);
214
- }
215
623
  if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')) {
216
624
  formSubmit(event);
217
625
  }
218
626
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter][data-no-ajax]')) {
219
627
  // Allow for input fields to filter the current results without a new ajax call
220
- filterTable(table, form, wrapper);
628
+ filterTable(component, table, form, pagination);
221
629
  populateDataQueries(table, form);
222
630
  }
223
631
  else if (event &&
@@ -260,7 +668,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
260
668
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-clear]')) {
261
669
  form.classList.add('processing');
262
670
  // Make sure any applied filters have been removed
263
- Array.from(form.querySelectorAll('.applied-filters')).forEach((filters, index) => {
671
+ Array.from(form.querySelectorAll('.applied-filters')).forEach((filters) => {
264
672
  filters.innerHTML = '';
265
673
  });
266
674
  // Make sure cards are unlicked
@@ -320,9 +728,9 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
320
728
  const forms = [];
321
729
  const fields = [];
322
730
  // Collect the forms that we need to add an event listener for.
323
- Array.from(form.querySelectorAll('[data-mimic]')).forEach((input, index) => {
731
+ Array.from(form.querySelectorAll('[data-mimic]')).forEach((input) => {
324
732
  const mimicField = input.getAttribute('data-mimic');
325
- Array.from(document.querySelectorAll(`[name="${mimicField}"]`)).forEach((mimicInput, index) => {
733
+ Array.from(document.querySelectorAll(`[name="${mimicField}"]`)).forEach((mimicInput) => {
326
734
  const parentForm = mimicInput.closest('form');
327
735
  if (!forms.includes(parentForm)) {
328
736
  forms.push(parentForm);
@@ -333,7 +741,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
333
741
  });
334
742
  });
335
743
  // For each form add change listener
336
- forms.forEach((parentForm, index) => {
744
+ forms.forEach((parentForm) => {
337
745
  const updateMimicInput = function () {
338
746
  const mimickedAlready = [];
339
747
  const formData = new FormData(parentForm);
@@ -360,76 +768,15 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
360
768
  }
361
769
  }
362
770
  };
363
- parentForm.addEventListener('force', (event) => {
771
+ parentForm.addEventListener('force', () => {
364
772
  updateMimicInput();
365
773
  });
366
- parentForm.addEventListener('change', (event) => {
774
+ parentForm.addEventListener('change', () => {
367
775
  updateMimicInput();
368
776
  });
369
777
  });
370
778
  };
371
- export const sortTable = (table, form, savedTableBody) => {
372
- if (form.getAttribute('data-ajax')) {
373
- return false;
374
- }
375
- const tbody = table.querySelector('tbody');
376
- let selectedOption = form.querySelector(`input[type="radio"][data-sort]:checked`);
377
- if (form.querySelector('select[data-sort]')) {
378
- const select = form.querySelector('select[data-sort]');
379
- selectedOption = form.querySelector(`select[data-sort] option:nth-child(${select.selectedIndex + 1})`);
380
- }
381
- const sortBy = selectedOption.getAttribute('data-sort');
382
- const order = selectedOption.getAttribute('data-order');
383
- const format = selectedOption.getAttribute('data-format');
384
- if (!sortBy) {
385
- tbody.innerHTML = savedTableBody.innerHTML;
386
- addDataAttributes(table);
387
- return false;
388
- }
389
- let orderArray = [];
390
- if (!['asc', 'desc', 'descending'].includes(order)) {
391
- orderArray = order.split(',');
392
- }
393
- // Create an array from the table rows, the index created is then used to sort the array
394
- let tableArr = [];
395
- Array.from(tbody.querySelectorAll('tr')).forEach((tableRow, index) => {
396
- let rowIndex = tableRow
397
- .querySelector('td[data-label="' + sortBy + '"], th[data-label="' + sortBy + '"]')
398
- .textContent.trim();
399
- if (tableRow.querySelector('[data-label="' + sortBy + '"] .td__content')) {
400
- rowIndex = tableRow.querySelector('[data-label="' + sortBy + '"] .td__content').textContent.trim();
401
- }
402
- // If a predefined order set replace the search term with an ordered numeric value so it can be sorted
403
- if (orderArray.length && orderArray.includes(rowIndex)) {
404
- rowIndex = orderArray.indexOf(rowIndex);
405
- }
406
- if (isNumeric(rowIndex)) {
407
- rowIndex = zeroPad(rowIndex, 10);
408
- }
409
- // If the sort format is date then lets transform the index to a sortable date (this is never displayed)
410
- if (format && format == 'date') {
411
- rowIndex = new Date(rowIndex);
412
- }
413
- const dataRow = {
414
- index: rowIndex,
415
- row: tableRow,
416
- };
417
- tableArr.push(dataRow);
418
- });
419
- // Sort array alphabetically
420
- tableArr.sort((a, b) => (a.index > b.index ? 1 : -1));
421
- // Reverse if descending
422
- if (order == 'descending' || order == 'desc') {
423
- tableArr = tableArr.reverse();
424
- }
425
- // Create a string to return and populate the tbody
426
- let strTbody = '';
427
- tableArr.forEach((tableRow, index) => {
428
- strTbody += tableRow.row.outerHTML;
429
- });
430
- tbody.innerHTML = strTbody;
431
- };
432
- export const filterTable = (table, form, wrapper) => {
779
+ export const filterTable = (component, table, form, pagination) => {
433
780
  table.classList.remove('table--filtered');
434
781
  const filters = filterFilters(form);
435
782
  const searches = [];
@@ -437,7 +784,7 @@ export const filterTable = (table, form, wrapper) => {
437
784
  const page = form.querySelector('[data-pagination]') ? parseInt(form.querySelector('[data-pagination]').value) : 1;
438
785
  const showRows = form.querySelector('[data-show]') ? parseInt(form.querySelector('[data-show]').value) : 15;
439
786
  // Reset
440
- Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
787
+ Array.from(table.querySelectorAll('tbody tr')).forEach((row) => {
441
788
  row.classList.remove('filtered');
442
789
  row.classList.remove('filtered--matched');
443
790
  row.classList.remove('filtered--show');
@@ -446,18 +793,18 @@ export const filterTable = (table, form, wrapper) => {
446
793
  // Add search columns too
447
794
  if (form.querySelector('input[data-search]')) {
448
795
  const searchInput = form.querySelector('input[data-search]');
449
- const searchColumns = form.querySelector('input[data-search]').getAttribute('data-search').split(',');
450
- searchColumns.forEach((column, index) => {
451
- searches.push({ column: `${column.trim()}`, value: `${searchInput.value}` });
796
+ //const searchColumns = form.querySelector('input[data-search],[part="search-input"]').getAttribute('data-search').split(',');
797
+ table.querySelectorAll('thead tr th').forEach((column) => {
798
+ searches.push({ column: `${column.textContent.trim()}`, value: `${searchInput.value}` });
452
799
  });
453
800
  }
454
801
  //Display the filter count
455
- Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
802
+ Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element) => {
456
803
  element.innerHTML = '';
457
804
  element.parentNode.classList.remove('hover');
458
805
  });
459
806
  let filterCount = 0;
460
- Object.values(filters).forEach((filter, index) => {
807
+ Object.values(filters).forEach((filter) => {
461
808
  if (typeof filter == 'object' && Object.values(filter).length) {
462
809
  filterCount += Object.values(filter).length;
463
810
  }
@@ -466,7 +813,7 @@ export const filterTable = (table, form, wrapper) => {
466
813
  }
467
814
  });
468
815
  if (filterCount) {
469
- Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
816
+ Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element) => {
470
817
  element.innerHTML += `(${filterCount})`;
471
818
  element.parentNode.classList.add('hover');
472
819
  });
@@ -474,9 +821,9 @@ export const filterTable = (table, form, wrapper) => {
474
821
  // Filter the table
475
822
  table.classList.add('table--filtered');
476
823
  for (const [key, filterValue] of Object.entries(filters)) {
477
- Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
824
+ Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row) => {
478
825
  let isMatched = false;
479
- filterValue.forEach((filter, index) => {
826
+ filterValue.forEach((filter) => {
480
827
  const filterTd = row.querySelector(`[data-label="${key}"]`);
481
828
  if (filter.includes('-date-from')) {
482
829
  const fromDate = new Date(filter.replace('-date-from', ''));
@@ -566,9 +913,9 @@ export const filterTable = (table, form, wrapper) => {
566
913
  });
567
914
  }
568
915
  // Search whats left of the table after filtering
569
- Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
916
+ Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row) => {
570
917
  let isSearched = searches.length > 0 && searches[0].value.length >= 3 ? false : true;
571
- searches.forEach((search, index) => {
918
+ searches.forEach((search) => {
572
919
  const searchTd = row.querySelector(`[data-label="${search.column}"]`);
573
920
  if (searchTd &&
574
921
  search.value.length >= 3 &&
@@ -581,7 +928,7 @@ export const filterTable = (table, form, wrapper) => {
581
928
  }
582
929
  });
583
930
  // Work out what to display after pagination
584
- Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
931
+ Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row) => {
585
932
  matched++;
586
933
  row.classList.add('filtered--matched');
587
934
  // pagination bit
@@ -590,20 +937,20 @@ export const filterTable = (table, form, wrapper) => {
590
937
  row.classList.add('filtered--show');
591
938
  }
592
939
  });
593
- if (wrapper) {
594
- wrapper.setAttribute('data-total', matched);
595
- wrapper.setAttribute('data-show', showRows);
596
- wrapper.setAttribute('data-page', page);
940
+ if (pagination) {
941
+ pagination.setAttribute('data-total', matched);
942
+ pagination.setAttribute('data-show', showRows);
943
+ pagination.setAttribute('data-page', page);
597
944
  }
598
945
  };
599
- export const populateDataQueries = (table, form, wrapper) => {
946
+ export const populateDataQueries = (component, table, form) => {
600
947
  const dataQueries = Array.from(form.querySelectorAll('[data-query]'));
601
- dataQueries.forEach((queryElement, index) => {
948
+ dataQueries.forEach((queryElement) => {
602
949
  const query = queryElement.getAttribute('data-query');
603
950
  let numberOfMatchedRows = 0;
604
951
  if (query == 'total') {
605
- if (wrapper.hasAttribute('data-total'))
606
- numberOfMatchedRows = wrapper.getAttribute('data-total');
952
+ if (component.hasAttribute('data-total'))
953
+ numberOfMatchedRows = component.getAttribute('data-total');
607
954
  else
608
955
  numberOfMatchedRows = table.classList.contains('table--filtered')
609
956
  ? table.querySelectorAll('tbody tr').length
@@ -624,7 +971,7 @@ export const populateDataQueries = (table, form, wrapper) => {
624
971
  const queries = query.split(' && ');
625
972
  numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr:not(.filtered)`)).filter(function (row) {
626
973
  let matched = true;
627
- for (const [index, value] of Object.entries(queries)) {
974
+ for (const value of Object.entries(queries)) {
628
975
  const queryParts = value.split(' == ');
629
976
  if (!row.querySelector(`td[data-label="${queryParts[0]}"]`) ||
630
977
  row.querySelector(`td[data-label="${queryParts[0]}"]`).textContent != `${queryParts[1]}`)
@@ -647,149 +994,69 @@ export const populateDataQueries = (table, form, wrapper) => {
647
994
  }
648
995
  });
649
996
  };
650
- // Pagination
651
- export const addPaginationEventListeners = function (table, form, pagination, wrapper) {
652
- if (wrapper.hasAttribute('data-no-submit')) {
653
- return false;
654
- }
655
- pagination.addEventListener('update-page', (event) => {
656
- const paginationInput = form.querySelector('[data-pagination]');
657
- const newPage = event.detail.page;
658
- // Set the filter value
659
- paginationInput.value = newPage;
660
- form.dispatchEvent(new Event('paginate'));
661
- // Reset the data attribute
662
- wrapper.setAttribute('data-page', newPage);
663
- if (table.hasAttribute('data-show-history')) {
664
- const url = new URL(location);
665
- url.searchParams.set('page', newPage);
666
- history.pushState({ type: 'pagination', form: form.getAttribute('id'), page: newPage }, '', url);
667
- }
668
- // scroll back to the top of the table
669
- if (!wrapper.hasAttribute('data-no-scroll')) {
670
- const yOffset = -250;
671
- const y = table.getBoundingClientRect().top + window.pageYOffset + yOffset;
672
- window.scrollTo({ top: y, behavior: 'smooth' });
673
- }
674
- });
675
- pagination.addEventListener('update-show', (event) => {
676
- const showInput = form.querySelector('[data-show]');
677
- const showRows = event.detail.show;
678
- showInput.value = showRows;
679
- wrapper.setAttribute('data-show', showRows);
680
- form.dispatchEvent(new Event('submit'));
681
- });
682
- };
683
- // Export CSV Data
684
- export const addExportEventListeners = (button, table) => {
685
- if (!button) {
686
- return false;
997
+ // #endregion
998
+ export const setupSubmitTable = (component, table, form, pagination) => {
999
+ form.setAttribute('method', 'get');
1000
+ const actionbar = component.querySelector('iam-actionbar');
1001
+ if (actionbar) {
1002
+ actionbar.addEventListener('change', (event) => {
1003
+ form.submit();
1004
+ });
687
1005
  }
688
- button.addEventListener('click', (event) => {
689
- exportAsCSV(table);
690
- });
691
1006
  };
692
- export const exportAsCSV = function (table) {
693
- let csvData = [];
694
- // Get each row data
695
- const rows = table.getElementsByTagName('tr');
696
- for (let i = 0; i < rows.length; i++) {
697
- // Get each column data
698
- const cols = rows[i].querySelectorAll('td,th');
699
- // Stores each csv row data
700
- const csvRow = [];
701
- for (let j = 0; j < cols.length; j++) {
702
- // Get the text data of each cell of a row and push it to csvrow
703
- csvRow.push(`"${cols[j].textContent}"`);
704
- }
705
- // Combine each column value with comma
706
- csvData.push(csvRow.join(','));
707
- }
708
- // Combine each row data with new line character
709
- csvData = csvData.join('\n');
710
- // Create CSV file object and feed our csvData into it
711
- const CSVFile = new Blob([csvData], {
712
- type: 'text/csv',
1007
+ // #region submit tables functions
1008
+ // #endregion
1009
+ export const setupAjaxTable = (component, table, form, pagination) => {
1010
+ loadAjaxTable(component, table, form, pagination);
1011
+ const actionbar = component.querySelector('iam-actionbar');
1012
+ form.addEventListener('submit', (event) => {
1013
+ loadAjaxTable(component, table, form, pagination);
1014
+ event.preventDefault();
713
1015
  });
714
- // Create to temporary link to initiate download process
715
- const tempLink = document.createElement('a');
716
- tempLink.download = 'export.csv';
717
- const url = window.URL.createObjectURL(CSVFile);
718
- tempLink.href = url;
719
- // This link should not be displayed
720
- tempLink.style.display = 'none';
721
- document.body.appendChild(tempLink);
722
- // Automatically click the link to trigger download
723
- tempLink.click();
724
- document.body.removeChild(tempLink);
725
- };
726
- // After table is loaded
727
- export const makeTableFunctional = function (table, form, pagination, wrapper) {
728
- addDataAttributes(table);
729
- createMobileButton(table, wrapper);
730
- populateDataQueries(table, form, wrapper);
731
- // Work out the largest width of the CTA's in the last column
732
- if (wrapper && wrapper.classList.contains('table--cta')) {
733
- const largestWidth = getLargestLastColWidth(table);
734
- wrapper.style.setProperty('--cta-width', `${largestWidth}rem`);
735
- function outputsize() {
736
- Array.from(table.querySelectorAll('tr')).forEach((row, index) => {
737
- const rowHeight = row.offsetHeight;
738
- row.style.setProperty('--row-height', `${rowHeight}px`);
739
- });
740
- }
741
- new ResizeObserver(outputsize).observe(table);
1016
+ if (actionbar) {
1017
+ actionbar.addEventListener('change', (event) => {
1018
+ loadAjaxTable(component, table, form, pagination);
1019
+ });
742
1020
  }
743
1021
  };
744
- const filterFilters = function (form) {
745
- const filters = new Object();
746
- // Filter
747
- const filterInputs = Array.from(form.querySelectorAll('[data-filter]'));
748
- filterInputs.forEach((filterInput, index) => {
749
- // Ignore uncked radio inputs
750
- if (filterInput.type == 'radio' && !filterInput.checked) {
751
- return;
752
- }
753
- if (filterInput.type == 'checkbox' && !filterInput.checked) {
754
- return;
755
- }
756
- if (filterInput && filterInput.value) {
757
- const dataFilter = filterInput.getAttribute('data-filter');
758
- let filterValue = filterInput.value;
759
- if (filterInput.hasAttribute('data-date-from'))
760
- filterValue += '-date-from';
761
- if (filterInput.hasAttribute('data-date-to'))
762
- filterValue += '-date-to';
763
- if (!filters[dataFilter])
764
- filters[dataFilter] = [];
765
- filters[dataFilter].push(filterValue);
766
- }
767
- });
768
- return filters;
769
- };
770
- export const loadAjaxTable = function (table, form, pagination, wrapper) {
1022
+ // #region ajax tables functions
1023
+ export const loadAjaxTable = function (component, table, form, pagination) {
771
1024
  return __awaiter(this, void 0, void 0, function* () {
1025
+ // Add actionbar inputs into form
1026
+ if (component.querySelector('iam-actionbar') && !component.querySelector('iam-actionbar').closest('form')) {
1027
+ if (!form.querySelector('.duplicate-actionbar'))
1028
+ form.insertAdjacentHTML('beforeend', `<div class="duplicate-actionbar" style="visibility: hidden; pointer-events: none; position: absolute;"></div>`);
1029
+ form.querySelector('.duplicate-actionbar').innerHTML = component.querySelector('iam-actionbar').innerHTML;
1030
+ }
1031
+ // Add pagination inputs into form
1032
+ if (!form.querySelector('input[name=show]'))
1033
+ form.insertAdjacentHTML('beforeend', `<input name="show" type="hidden" value="${component.getAttribute('data-show')}" />`);
1034
+ if (!form.querySelector('input[name=page]'))
1035
+ form.insertAdjacentHTML('beforeend', `<input name="page" type="hidden" value="${component.getAttribute('data-page')}" />`);
1036
+ form.querySelector('input[name=page]').value = component.getAttribute('data-page');
1037
+ form.querySelector('input[name=show]').value = component.getAttribute('data-show');
1038
+ // Construct form data to send to api
772
1039
  const formData = new FormData(form);
773
1040
  const queryString = new URLSearchParams(formData).toString();
774
1041
  const columns = table.querySelectorAll('thead tr th:not(.expand-button-heading)');
775
1042
  const tbody = table.querySelector('tbody');
776
1043
  const ajaxURL = form.getAttribute('data-ajax');
777
- wrapper.classList.add('table--loading');
1044
+ component.classList.add('table--loading');
778
1045
  // Display the filter count
779
1046
  const filters = filterFilters(form);
780
- Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
1047
+ Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element) => {
781
1048
  element.innerHTML = '';
782
1049
  element.parentNode.classList.remove('hover');
783
1050
  });
784
1051
  let filterCount = 0;
785
- Object.values(filters).forEach((filter, index) => {
1052
+ Object.values(filters).forEach((filter) => {
786
1053
  if (typeof filter == 'object' && Object.values(filter).length)
787
1054
  filterCount += Object.values(filter).length;
788
1055
  else
789
1056
  filterCount++;
790
1057
  });
791
1058
  if (filterCount) {
792
- Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
1059
+ Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element) => {
793
1060
  element.innerHTML += `(${filterCount})`;
794
1061
  element.parentNode.classList.add('hover');
795
1062
  });
@@ -829,20 +1096,20 @@ export const loadAjaxTable = function (table, form, pagination, wrapper) {
829
1096
  const totalNumber = resolvePath(response, totalNumberSchema, 15);
830
1097
  const currentPage = resolvePath(response, currentPageSchema, 1);
831
1098
  const data = resolvePath(response, schema);
832
- const emptyMsg = wrapper.hasAttribute('data-empty-msg')
833
- ? wrapper.getAttribute('data-empty-msg')
1099
+ const emptyMsg = component.hasAttribute('data-empty-msg')
1100
+ ? component.getAttribute('data-empty-msg')
834
1101
  : 'No results found';
835
1102
  if (data) {
836
1103
  tbody.innerHTML = '';
837
- data.forEach((row, index) => {
1104
+ data.forEach((row) => {
838
1105
  const table_row = document.createElement('tr');
839
- columns.forEach((col, index) => {
1106
+ columns.forEach((col) => {
840
1107
  let cellOutput = '';
841
1108
  const table_cell = document.createElement('td');
842
1109
  // Add some data to help with the mobile layout design
843
1110
  table_cell.setAttribute('data-label', col.innerText);
844
1111
  if (col.getAttribute('data-output')) {
845
- var cellTemplate = col.getAttribute('data-output');
1112
+ const cellTemplate = col.getAttribute('data-output');
846
1113
  // Use a regex to replace {var} with actual values from the json data
847
1114
  cellOutput = cellTemplate.replace(new RegExp(/{(.*?)}/, 'gm'), function (matched) {
848
1115
  return resolvePath(row, matched.replace('{', '').replace('}', ''));
@@ -850,10 +1117,10 @@ export const loadAjaxTable = function (table, form, pagination, wrapper) {
850
1117
  }
851
1118
  // If an output array is defined then the content is going to made of of multiple values from an array
852
1119
  if (col.hasAttribute('data-output-array')) {
853
- var cellTemplate = col.getAttribute('data-output');
1120
+ const cellTemplate = col.getAttribute('data-output');
854
1121
  const arrValue = resolvePath(row, cellTemplate.replace('{', '').replace('}', ''));
855
1122
  cellOutput = '';
856
- arrValue.forEach((rowValue, i) => {
1123
+ arrValue.forEach((rowValue) => {
857
1124
  const cellTemplateValue = col.getAttribute('data-output-array');
858
1125
  let cellOutputValue = '';
859
1126
  // If we need to transform some of the data
@@ -881,12 +1148,11 @@ export const loadAjaxTable = function (table, form, pagination, wrapper) {
881
1148
  });
882
1149
  tbody.appendChild(table_row);
883
1150
  });
884
- createSearchDataList(table, form);
885
- // Add data to the pagination
886
- wrapper.setAttribute('data-total', parseInt(totalNumber));
887
- wrapper.setAttribute('data-page', parseInt(currentPage));
888
- makeTableFunctional(table, form, pagination, wrapper);
889
- Array.from(form.querySelectorAll('[data-ajax-query]')).forEach((queryElement, index) => {
1151
+ component.setAttribute('data-total', parseInt(totalNumber));
1152
+ component.setAttribute('data-page', parseInt(currentPage));
1153
+ pagination.setAttribute('data-total', totalNumber);
1154
+ pagination.setAttribute('data-page', currentPage);
1155
+ Array.from(form.querySelectorAll('[data-ajax-query]')).forEach((queryElement) => {
890
1156
  const totalNumber = resolvePath(response, queryElement.getAttribute('data-ajax-query'), '');
891
1157
  if (queryElement.hasAttribute('data-total'))
892
1158
  queryElement.setAttribute('data-total', totalNumber);
@@ -896,13 +1162,15 @@ export const loadAjaxTable = function (table, form, pagination, wrapper) {
896
1162
  if (parseInt(totalNumber) == 0) {
897
1163
  tbody.innerHTML = `<tr><td colspan="100%"><span>${emptyMsg}</span></td></tr>`;
898
1164
  }
899
- wrapper.classList.remove('table--loading');
1165
+ component.classList.remove('table--loading');
900
1166
  window.dataLayer = window.dataLayer || [];
901
1167
  window.dataLayer.push({
902
1168
  event: 'Ajax table loaded',
903
1169
  url: ajaxURL,
904
1170
  formData: queryString,
905
1171
  });
1172
+ setupBasicTable(component, table, form, pagination);
1173
+ setupAdvancedTable(component, table, form, pagination);
906
1174
  }
907
1175
  else {
908
1176
  tbody.innerHTML = '<tr><td colspan="100%"><span>Error loading table</span></td></tr>';
@@ -917,24 +1185,43 @@ export const loadAjaxTable = function (table, form, pagination, wrapper) {
917
1185
  }
918
1186
  });
919
1187
  };
920
- export const formatCell = (format, cellOutput) => {
921
- switch (format) {
922
- case 'datetime':
923
- return (new Date(cellOutput).toLocaleDateString('en-gb', {
924
- weekday: 'short',
925
- year: '2-digit',
926
- month: 'long',
927
- day: 'numeric',
928
- }) +
929
- ' ' +
930
- new Date(cellOutput).toLocaleTimeString('en-gb', { hour: '2-digit', minute: '2-digit' }));
931
- case 'date':
932
- return new Date(cellOutput).toLocaleDateString('en-gb', {
933
- day: 'numeric',
934
- month: 'long',
935
- year: '2-digit',
936
- });
937
- case 'capitalise':
938
- return (cellOutput = ucfirst(cellOutput));
1188
+ // #endregion
1189
+ /*
1190
+ // Pagination - still needed?
1191
+ export const addPaginationEventListeners = function (component, table, form, pagination): void | boolean {
1192
+
1193
+
1194
+ pagination.addEventListener('update-page', (event) => {
1195
+ const paginationInput = form.querySelector('[data-pagination]');
1196
+ const newPage = event.detail.page;
1197
+
1198
+ // Set the filter value
1199
+ paginationInput.value = newPage;
1200
+ form.dispatchEvent(new Event('paginate'));
1201
+
1202
+ // Reset the data attribute
1203
+ component.setAttribute('data-page', newPage);
1204
+
1205
+ if (table.hasAttribute('data-show-history')) {
1206
+ const url = new URL(location);
1207
+ url.searchParams.set('page', newPage);
1208
+ history.pushState({ type: 'pagination', form: form.getAttribute('id'), page: newPage }, '', url);
1209
+ }
1210
+
1211
+ // scroll back to the top of the table
1212
+ if (!component.hasAttribute('data-no-scroll')) {
1213
+ const yOffset = -250;
1214
+ const y = table.getBoundingClientRect().top + window.pageYOffset + yOffset;
1215
+ window.scrollTo({ top: y, behavior: 'smooth' });
939
1216
  }
1217
+ });
1218
+
1219
+ pagination.addEventListener('update-show', (event) => {
1220
+ const showInput = form.querySelector('[data-show]');
1221
+ const showRows = event.detail.show;
1222
+ showInput.value = showRows;
1223
+ component.setAttribute('data-show', showRows);
1224
+ form.dispatchEvent(new Event('submit'));
1225
+ });
940
1226
  };
1227
+ */