@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.
- package/assets/css/components/actionbar.component.css +1 -0
- package/assets/css/components/actionbar.component.css.map +1 -0
- package/assets/css/components/actionbar.global.css +1 -1
- package/assets/css/components/actionbar.global.css.map +1 -1
- package/assets/css/components/address-lookup.css +1 -1
- package/assets/css/components/address-lookup.css.map +1 -1
- package/assets/css/components/barchart.component.css +1 -1
- package/assets/css/components/barchart.component.css.map +1 -1
- package/assets/css/components/bento-grid.component.css +1 -0
- package/assets/css/components/bento-grid.component.css.map +1 -0
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/carousel.component.css +1 -1
- package/assets/css/components/carousel.component.css.map +1 -1
- package/assets/css/components/carousel.config.css +1 -1
- package/assets/css/components/carousel.config.css.map +1 -1
- package/assets/css/components/charts.config.css +1 -1
- package/assets/css/components/charts.config.css.map +1 -1
- package/assets/css/components/charts.css +1 -1
- package/assets/css/components/charts.css.map +1 -1
- package/assets/css/components/charts.module.css +1 -1
- package/assets/css/components/charts.module.css.map +1 -1
- package/assets/css/components/collapsible-side.css +1 -1
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/doughnutchart.component.css +1 -0
- package/assets/css/components/doughnutchart.component.css.map +1 -0
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/header.css.map +1 -1
- package/assets/css/components/inline-edit.preload.css +1 -1
- package/assets/css/components/inline-edit.preload.css.map +1 -1
- package/assets/css/components/marketing.css.map +1 -1
- package/assets/css/components/menu.component.css +1 -0
- package/assets/css/components/menu.component.css.map +1 -0
- package/assets/css/components/menu.css +1 -0
- package/assets/css/components/menu.css.map +1 -0
- package/assets/css/components/multi-step.component.css.map +1 -1
- package/assets/css/components/multiselect.preload.css +1 -1
- package/assets/css/components/multiselect.preload.css.map +1 -1
- package/assets/css/components/nav.component.css +1 -0
- package/assets/css/components/nav.component.css.map +1 -0
- package/assets/css/components/nav.docs.css.map +1 -1
- package/assets/css/components/nav.global.css.map +1 -1
- package/assets/css/components/nav.old.css +1 -1
- package/assets/css/components/nav.old.css.map +1 -1
- package/assets/css/components/nav.preload.css +1 -1
- package/assets/css/components/nav.preload.css.map +1 -1
- package/assets/css/components/notification.css +1 -1
- package/assets/css/components/notification.css.map +1 -1
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/property-searchbar.css.map +1 -1
- package/assets/css/components/slider.css +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/snapshot.css.map +1 -1
- package/assets/css/components/stepper.css.map +1 -1
- package/assets/css/components/table-basic.component.css +1 -0
- package/assets/css/components/table-basic.component.css.map +1 -0
- package/assets/css/components/table-basic.global.css +1 -0
- package/assets/css/components/table-basic.global.css.map +1 -0
- package/assets/css/components/table.component.css +1 -0
- package/assets/css/components/table.component.css.map +1 -0
- package/assets/css/components/table.global.css +1 -1
- package/assets/css/components/table.global.css.map +1 -1
- package/assets/css/components/tabs.component.css +1 -0
- package/assets/css/components/tabs.component.css.map +1 -0
- package/assets/css/components/tabs.config.css +1 -0
- package/assets/css/components/tabs.config.css.map +1 -0
- package/assets/css/components/tabs.css +1 -1
- package/assets/css/components/tabs.css.map +1 -1
- package/assets/css/components/testimonial.css.map +1 -1
- package/assets/css/components/timeline.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/mobile-core.min.css +1 -0
- package/assets/css/mobile-core.min.css.map +1 -0
- package/assets/css/mobile.min.css +1 -0
- package/assets/css/mobile.min.css.map +1 -0
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/_global.js +0 -1
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
- package/assets/js/components/actionbar/actionbar.component.js +86 -8
- package/assets/js/components/actionbar/actionbar.component.min.js +19 -6
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.js +17 -18
- package/assets/js/components/address-lookup/address-lookup.component.min.js +5 -5
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.js +0 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +4 -4
- package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
- package/assets/js/components/barchart/barchart.component.js +2 -3
- package/assets/js/components/barchart/barchart.component.min.js +8 -4
- package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.js +50 -0
- package/assets/js/components/bento-grid/bento-grid.component.min.js +15 -0
- package/assets/js/components/bento-grid/bento-grid.component.min.js.map +1 -0
- package/assets/js/components/card/card.component.js +10 -13
- package/assets/js/components/card/card.component.min.js +7 -7
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +4 -5
- package/assets/js/components/carousel/carousel.component.min.js +4 -4
- package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
- package/assets/js/components/chart/chart.component.js +1 -5
- package/assets/js/components/collapsible-side/collapsible-side.component.js +4 -5
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +4 -4
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
- package/assets/js/components/doughnutchart/doughnutchart.component.js +70 -0
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +25 -0
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -0
- package/assets/js/components/fileupload/fileupload.component.js +2 -3
- package/assets/js/components/fileupload/fileupload.component.min.js +6 -6
- package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
- package/assets/js/components/filter-card/filter-card.component.js +3 -4
- package/assets/js/components/filter-card/filter-card.component.min.js +4 -4
- package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.js +0 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +3 -3
- package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
- package/assets/js/components/header/header.component.js +0 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js.map +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.js +7 -8
- package/assets/js/components/inline-edit/inline-edit.component.min.js +4 -4
- package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
- package/assets/js/components/marketing/marketing.component.js +0 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
- package/assets/js/components/menu/menu.component.js +200 -0
- package/assets/js/components/menu/menu.component.min.js +77 -0
- package/assets/js/components/menu/menu.component.min.js.map +1 -0
- package/assets/js/components/multi-step/multi-step.component.js +10 -10
- package/assets/js/components/multi-step/multi-step.component.min.js +13 -0
- package/assets/js/components/multi-step/multi-step.component.min.js.map +1 -0
- package/assets/js/components/multiselect/multiselect.component.js +10 -10
- package/assets/js/components/multiselect/multiselect.component.min.js +3 -3
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.js +7 -7
- package/assets/js/components/nav/nav.component.min.js +7 -7
- package/assets/js/components/nav/nav.component.min.js.map +1 -1
- package/assets/js/components/notification/notification.component.js +3 -3
- package/assets/js/components/notification/notification.component.min.js +4 -4
- package/assets/js/components/notification/notification.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.js +14 -8
- package/assets/js/components/pagination/pagination.component.min.js +5 -5
- package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
- package/assets/js/components/record-card/record-card.component.js +6 -8
- package/assets/js/components/record-card/record-card.component.min.js +4 -4
- package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
- package/assets/js/components/search/search.component.js +9 -6
- package/assets/js/components/search/search.component.min.js +8 -5
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/slider/slider.component.js +8 -8
- package/assets/js/components/slider/slider.component.min.js +5 -5
- package/assets/js/components/slider/slider.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.js +36 -200
- package/assets/js/components/table/table.component.min.js +13 -23
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.js +46 -0
- package/assets/js/components/table-ajax/table-ajax.component.min.js +22 -0
- package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -0
- package/assets/js/components/table-basic/table-basic.component.js +46 -0
- package/assets/js/components/table-basic/table-basic.component.min.js +22 -0
- package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -0
- package/assets/js/components/table-no-submit/table-no-submit.component.js +77 -0
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +22 -0
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -0
- package/assets/js/components/table-submit/table-submit.component.js +55 -0
- package/assets/js/components/table-submit/table-submit.component.min.js +22 -0
- package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -0
- package/assets/js/components/tabs/tabs.component.js +3 -2
- package/assets/js/components/tabs/tabs.component.min.js +6 -4
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
- package/assets/js/components/video-card/video-card.component.js +4 -3
- package/assets/js/components/video-card/video-card.component.min.js +3 -3
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/modules/applied-filters.js +8 -9
- package/assets/js/modules/carousel.js +9 -10
- package/assets/js/modules/chart.js +5 -3
- package/assets/js/modules/chart.module.js +108 -1
- package/assets/js/modules/dialogs.js +6 -7
- package/assets/js/modules/drawer.js +1 -2
- package/assets/js/modules/dynamicEvents.js +7 -8
- package/assets/js/modules/fileupload.js +7 -7
- package/assets/js/modules/filterlist.js +3 -4
- package/assets/js/modules/form.js +12 -13
- package/assets/js/modules/helpers.js +7 -5
- package/assets/js/modules/inputs.js +6 -9
- package/assets/js/modules/nav.js +3 -4
- package/assets/js/modules/notification.js +2 -3
- package/assets/js/modules/orderablelist.js +0 -1
- package/assets/js/modules/table.js +604 -317
- package/assets/js/modules/tabs.js +46 -19
- package/assets/js/scripts.bundle.js +3 -3
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/scripts.js +71 -6
- package/assets/js/tests/card.spec.js +14 -0
- package/assets/js/tests/carousel.spec.js +60 -0
- package/assets/js/tests/chart.spec.js +7 -5
- package/assets/js/tests/fileupload.spec.js +22 -0
- package/assets/js/tests/multistep.spec.js +68 -0
- package/assets/js/tests/table.spec.js +0 -31
- package/assets/sass/_bs_grid.scss +4 -1
- package/assets/sass/_components.scss +326 -100
- package/assets/sass/_corefiles.scss +42 -18
- package/assets/sass/_elements.scss +98 -18
- package/assets/sass/_example.scss +61 -0
- package/assets/sass/_func.scss +5 -13
- package/assets/sass/_functions/bs_utilities.scss +43 -39
- package/assets/sass/_functions/functions.scss +66 -52
- package/assets/sass/_functions/mixins.scss +84 -100
- package/assets/sass/_functions/utility-mixins.scss +56 -44
- package/assets/sass/_functions/variables.scss +90 -1659
- package/assets/sass/_functions/variables_old.scss +1701 -0
- package/assets/sass/_grid.scss +19 -5
- package/assets/sass/_tests/func.spec.scss +1 -37
- package/assets/sass/_tests/mixins.spec.scss +1 -77
- package/assets/sass/_tests/typography.spec.scss +1 -1
- package/assets/sass/_utilities.scss +15 -5
- package/assets/sass/_utility-mixins.scss +6 -1
- package/assets/sass/components/{actionbar.scss → actionbar.component.scss} +83 -16
- package/assets/sass/components/actionbar.global.scss +12 -68
- package/assets/sass/components/address-lookup.scss +6 -0
- package/assets/sass/components/barchart.component.scss +7 -20
- package/assets/sass/components/bento-grid.component.scss +91 -0
- package/assets/sass/components/carousel.config.scss +64 -58
- package/assets/sass/components/charts.config.scss +73 -67
- package/assets/sass/components/charts.module.scss +128 -97
- package/assets/sass/components/charts.scss +43 -42
- package/assets/sass/components/collapsible-side.scss +29 -27
- package/assets/sass/components/doughnutchart.component.scss +205 -0
- package/assets/sass/components/fileupload.scss +4 -3
- package/assets/sass/components/header.scss +5 -5
- package/assets/sass/components/inline-edit.preload.scss +108 -102
- package/assets/sass/components/menu.component.scss +101 -0
- package/assets/sass/components/menu.scss +21 -0
- package/assets/sass/components/multi-step.component.scss +5 -3
- package/assets/sass/components/multiselect.preload.scss +36 -30
- package/assets/sass/components/{nav.scss → nav.component.scss} +41 -21
- package/assets/sass/components/nav.docs.scss +1 -1
- package/assets/sass/components/nav.global.scss +13 -11
- package/assets/sass/components/nav.old.scss +21 -24
- package/assets/sass/components/nav.preload.scss +40 -34
- package/assets/sass/components/notification.scss +9 -5
- package/assets/sass/components/pagination.scss +7 -0
- package/assets/sass/components/property-searchbar.scss +7 -7
- package/assets/sass/components/slider.scss +2 -0
- package/assets/sass/components/snapshot.scss +2 -2
- package/assets/sass/components/stepper.scss +7 -7
- package/assets/sass/components/{table.scss → table-basic.component.scss} +25 -68
- package/assets/sass/components/table-basic.global.scss +355 -0
- package/assets/sass/components/table.component.scss +40 -0
- package/assets/sass/components/table.global.scss +215 -418
- package/assets/sass/components/tabs.component.scss +5 -0
- package/assets/sass/components/tabs.config.scss +27 -0
- package/assets/sass/components/tabs.scss +40 -4
- package/assets/sass/components/testimonial.scss +7 -7
- package/assets/sass/components/timeline.scss +1 -1
- package/assets/sass/core.scss +13 -4
- package/assets/sass/elements/admin-panel.scss +199 -185
- package/assets/sass/elements/badge-tag.scss +87 -81
- package/assets/sass/elements/brand.scss +67 -61
- package/assets/sass/elements/buttons--action.scss +55 -0
- package/assets/sass/elements/buttons--compact.scss +135 -0
- package/assets/sass/elements/buttons--global.scss +323 -0
- package/assets/sass/elements/buttons--secondary.scss +24 -0
- package/assets/sass/elements/buttons--tertiary.scss +57 -0
- package/assets/sass/elements/buttons.scss +29 -503
- package/assets/sass/elements/container.scss +157 -151
- package/assets/sass/elements/details.scss +147 -138
- package/assets/sass/elements/dialog.scss +36 -30
- package/assets/sass/elements/forms.scss +1061 -1047
- package/assets/sass/elements/icons.scss +23 -17
- package/assets/sass/elements/links.scss +131 -116
- package/assets/sass/elements/lists.scss +270 -264
- package/assets/sass/elements/media.scss +19 -13
- package/assets/sass/elements/modal.scss +336 -330
- package/assets/sass/elements/popover.scss +163 -152
- package/assets/sass/elements/progress.scss +173 -162
- package/assets/sass/elements/table.element.scss +116 -108
- package/assets/sass/elements/tooltips.scss +87 -80
- package/assets/sass/elements/type.scss +172 -160
- package/assets/sass/email.scss +0 -1
- package/assets/sass/error.scss +15 -13
- package/assets/sass/foundations/reboot.scss +176 -170
- package/assets/sass/foundations/root.scss +136 -125
- package/assets/sass/helpers/max-height.scss +2 -2
- package/assets/sass/main.scss +14 -6
- package/assets/sass/mobile-core.scss +14 -0
- package/assets/sass/mobile.scss +16 -0
- package/assets/sass/templates/auth.scss +88 -83
- package/assets/sass/templates/form.scss +68 -59
- package/assets/ts/components/_global.ts +2 -3
- package/assets/ts/components/actionbar/actionbar.component.ts +94 -2
- package/assets/ts/components/address-lookup/address-lookup.component.ts +21 -22
- package/assets/ts/components/applied-filters/applied-filters.component.ts +1 -2
- package/assets/ts/components/barchart/barchart.component.ts +3 -5
- package/assets/ts/components/bento-grid/README.md +31 -0
- package/assets/ts/components/bento-grid/bento-grid.component.ts +67 -0
- package/assets/ts/components/card/card.component.ts +13 -16
- package/assets/ts/components/carousel/carousel.component.ts +5 -7
- package/assets/ts/components/chart/chart.component.ts +4 -9
- package/assets/ts/components/collapsible-side/collapsible-side.component.ts +5 -6
- package/assets/ts/components/doughnutchart/doughnutchart.component.ts +85 -0
- package/assets/ts/components/fileupload/fileupload.component.ts +5 -6
- package/assets/ts/components/filter-card/filter-card.component.ts +4 -5
- package/assets/ts/components/filterlist/filterlist.component.ts +1 -2
- package/assets/ts/components/header/header.component.ts +1 -3
- package/assets/ts/components/inline-edit/inline-edit.component.ts +8 -11
- package/assets/ts/components/marketing/marketing.component.ts +1 -3
- package/assets/ts/components/menu/menu.component.ts +222 -0
- package/assets/ts/components/multi-step/multi-step.component.ts +19 -23
- package/assets/ts/components/multiselect/multiselect.component.ts +13 -14
- package/assets/ts/components/nav/nav.component.ts +8 -9
- package/assets/ts/components/notification/notification.component.ts +3 -3
- package/assets/ts/components/pagination/pagination.component.ts +24 -12
- package/assets/ts/components/record-card/record-card.component.ts +9 -11
- package/assets/ts/components/search/search.component.ts +12 -9
- package/assets/ts/components/slider/slider.component.ts +9 -10
- package/assets/ts/components/table/table.component.ts +50 -247
- package/assets/ts/components/table-ajax/table-ajax.component.ts +64 -0
- package/assets/ts/components/table-basic/README.md +40 -0
- package/assets/ts/components/table-basic/table-basic.component.ts +56 -0
- package/assets/ts/components/table-no-submit/table-no-submit.component.ts +134 -0
- package/assets/ts/components/table-submit/table-submit.component.ts +64 -0
- package/assets/ts/components/tabs/tabs.component.ts +4 -3
- package/assets/ts/components/video-card/video-card.component.ts +13 -12
- package/assets/ts/modules/applied-filters.ts +10 -11
- package/assets/ts/modules/card.module.ts +1 -1
- package/assets/ts/modules/carousel.ts +13 -15
- package/assets/ts/modules/chart.module.ts +152 -19
- package/assets/ts/modules/chart.ts +26 -24
- package/assets/ts/modules/dialogs.ts +10 -13
- package/assets/ts/modules/drawer.ts +1 -2
- package/assets/ts/modules/dynamicEvents.ts +12 -14
- package/assets/ts/modules/fileupload.ts +10 -10
- package/assets/ts/modules/filterlist.ts +6 -7
- package/assets/ts/modules/form.ts +16 -17
- package/assets/ts/modules/helpers.ts +24 -21
- package/assets/ts/modules/inputs.ts +15 -18
- package/assets/ts/modules/nav.ts +4 -5
- package/assets/ts/modules/notification.ts +7 -8
- package/assets/ts/modules/orderablelist.ts +3 -4
- package/assets/ts/modules/pagination.ts +1 -1
- package/assets/ts/modules/table.ts +726 -356
- package/assets/ts/modules/tabs.ts +59 -20
- package/assets/ts/scripts.ts +72 -6
- package/assets/ts/tests/card.spec.ts +19 -0
- package/assets/ts/tests/carousel.spec.ts +66 -0
- package/assets/ts/tests/chart.spec.ts +9 -6
- package/assets/ts/tests/fileupload.spec.ts +30 -0
- package/assets/ts/tests/multistep.spec.ts +78 -0
- package/assets/ts/tests/table.spec.ts +0 -38
- package/dist/components.es.js +1260 -1063
- package/dist/components.umd.js +468 -198
- package/package.json +44 -49
- package/src/components/BentoGrid/BentoGrid.vue +20 -0
- package/src/components/DoughnutChart/DoughnutChart.vue +23 -0
- package/src/components/FileUpload/FileUpload.vue +4 -1
- package/src/components/Menu/Menu.vue +22 -0
- package/src/components/Table/TableAjax.vue +34 -0
- package/src/components/Table/TableBasic.vue +34 -0
- package/src/components/Table/TableNoSubmit.vue +34 -0
- package/src/components/Table/TableSubmit.vue +34 -0
- package/src/components/Tabs/Tabs.vue +0 -4
- package/src/index.js +25 -19
- package/assets/css/components/actionbar.css +0 -1
- package/assets/css/components/actionbar.css.map +0 -1
- package/assets/css/components/nav.css +0 -1
- package/assets/css/components/nav.css.map +0 -1
- package/assets/css/components/table.css +0 -1
- package/assets/css/components/table.css.map +0 -1
- package/assets/js/components.bundle.js +0 -5
- package/assets/js/components.bundle.js.map +0 -1
- package/assets/js/components.js +0 -57
- package/assets/js/modules/file-upload.js +0 -32
- package/assets/ts/components.ts +0 -62
- package/assets/ts/modules/file-upload.ts +0 -52
- package/dist/style.css +0 -1
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
-
'
|
|
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
|
|
62
|
-
|
|
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 && !
|
|
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
|
|
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
|
-
//
|
|
106
|
-
export const
|
|
107
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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 (
|
|
188
|
-
|
|
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="${
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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', (
|
|
771
|
+
parentForm.addEventListener('force', () => {
|
|
364
772
|
updateMimicInput();
|
|
365
773
|
});
|
|
366
|
-
parentForm.addEventListener('change', (
|
|
774
|
+
parentForm.addEventListener('change', () => {
|
|
367
775
|
updateMimicInput();
|
|
368
776
|
});
|
|
369
777
|
});
|
|
370
778
|
};
|
|
371
|
-
export const
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
824
|
+
Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row) => {
|
|
478
825
|
let isMatched = false;
|
|
479
|
-
filterValue.forEach((filter
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
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
|
|
946
|
+
export const populateDataQueries = (component, table, form) => {
|
|
600
947
|
const dataQueries = Array.from(form.querySelectorAll('[data-query]'));
|
|
601
|
-
dataQueries.forEach((queryElement
|
|
948
|
+
dataQueries.forEach((queryElement) => {
|
|
602
949
|
const query = queryElement.getAttribute('data-query');
|
|
603
950
|
let numberOfMatchedRows = 0;
|
|
604
951
|
if (query == 'total') {
|
|
605
|
-
if (
|
|
606
|
-
numberOfMatchedRows =
|
|
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
|
|
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
|
-
//
|
|
651
|
-
export const
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
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
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
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
|
-
|
|
745
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
833
|
-
?
|
|
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
|
|
1104
|
+
data.forEach((row) => {
|
|
838
1105
|
const table_row = document.createElement('tr');
|
|
839
|
-
columns.forEach((col
|
|
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
|
-
|
|
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
|
-
|
|
1120
|
+
const cellTemplate = col.getAttribute('data-output');
|
|
854
1121
|
const arrValue = resolvePath(row, cellTemplate.replace('{', '').replace('}', ''));
|
|
855
1122
|
cellOutput = '';
|
|
856
|
-
arrValue.forEach((rowValue
|
|
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
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
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
|
-
|
|
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
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
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
|
+
*/
|