@iamproperty/components 7.0.0 → 7.1.0--beta2
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.css.map +1 -1
- package/assets/css/components/actionbar.global.css.map +1 -1
- package/assets/css/components/address-lookup.css.map +1 -1
- package/assets/css/components/applied-filters.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/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/card.module.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.map +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.map +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/filter-card.component.css.map +1 -1
- package/assets/css/components/header.css.map +1 -1
- package/assets/css/components/inline-edit.css.map +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/multi-step.component.css.map +1 -1
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/multiselect.preload.css.map +1 -1
- package/assets/css/components/nav.css +1 -1
- package/assets/css/components/nav.css.map +1 -1
- package/assets/css/components/nav.docs.css.map +1 -1
- package/assets/css/components/nav.global.css +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.map +1 -1
- package/assets/css/components/notification.css.map +1 -1
- package/assets/css/components/notification.global.css.map +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/property-searchbar.css +1 -1
- package/assets/css/components/property-searchbar.css.map +1 -1
- package/assets/css/components/record-card.component.css.map +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.css +1 -1
- package/assets/css/components/table.css.map +1 -1
- package/assets/css/components/table.global.css +1 -1
- package/assets/css/components/table.global.css.map +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 +1 -1
- package/assets/css/components/timeline.css.map +1 -1
- package/assets/css/components/video-card.component.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/_global.js +8 -8
- package/assets/js/components/accordion/accordion.component.js +13 -10
- package/assets/js/components/accordion/accordion.component.min.js +4 -4
- package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
- package/assets/js/components/actionbar/actionbar.component.js +97 -83
- package/assets/js/components/actionbar/actionbar.component.min.js +5 -5
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.js +30 -26
- package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.js +10 -6
- package/assets/js/components/applied-filters/applied-filters.component.min.js +3 -3
- package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
- package/assets/js/components/barchart/barchart.component.js +8 -7
- package/assets/js/components/barchart/barchart.component.min.js +4 -4
- package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
- package/assets/js/components/card/card.component.js +27 -12
- package/assets/js/components/card/card.component.min.js +3 -3
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +18 -12
- 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 +9 -8
- package/assets/js/components/collapsible-side/collapsible-side.component.js +20 -8
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
- package/assets/js/components/fileupload/fileupload.component.js +11 -7
- package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
- package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
- package/assets/js/components/filter-card/filter-card.component.js +19 -9
- package/assets/js/components/filter-card/filter-card.component.min.js +2 -2
- package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.js +10 -6
- 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 +8 -4
- 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 +43 -23
- 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 +11 -5
- 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/multi-step/multi-step.component.js +22 -19
- package/assets/js/components/multiselect/multiselect.component.js +62 -45
- package/assets/js/components/multiselect/multiselect.component.min.js +5 -5
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.js +57 -38
- package/assets/js/components/nav/nav.component.min.js +5 -5
- package/assets/js/components/nav/nav.component.min.js.map +1 -1
- package/assets/js/components/notification/notification.component.js +9 -5
- package/assets/js/components/notification/notification.component.min.js +5 -5
- package/assets/js/components/notification/notification.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.js +18 -14
- package/assets/js/components/pagination/pagination.component.min.js +2 -2
- package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
- package/assets/js/components/record-card/record-card.component.js +10 -8
- package/assets/js/components/record-card/record-card.component.min.js +2 -2
- package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
- package/assets/js/components/search/search.component.js +22 -17
- package/assets/js/components/search/search.component.min.js +4 -4
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/slider/slider.component.js +25 -21
- package/assets/js/components/slider/slider.component.min.js +3 -3
- package/assets/js/components/slider/slider.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.js +30 -24
- package/assets/js/components/table/table.component.min.js +7 -7
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.js +10 -6
- package/assets/js/components/tabs/tabs.component.min.js +3 -3
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
- package/assets/js/components/video-card/video-card.component.js +45 -33
- 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/components.bundle.js +1 -1
- package/assets/js/components.bundle.js.map +1 -1
- package/assets/js/components.js +35 -8
- package/assets/js/modules/applied-filters.js +20 -20
- package/assets/js/modules/carousel.js +65 -60
- package/assets/js/modules/chart.js +184 -134
- package/assets/js/modules/chart.module.js +74 -63
- package/assets/js/modules/data-layer.js +17 -17
- package/assets/js/modules/dialogs.js +47 -38
- package/assets/js/modules/drawer.js +1 -1
- package/assets/js/modules/dynamicEvents.js +24 -24
- package/assets/js/modules/file-upload.js +8 -9
- package/assets/js/modules/fileupload.js +5 -5
- package/assets/js/modules/filterlist.js +4 -4
- package/assets/js/modules/form.js +22 -18
- package/assets/js/modules/helpers.js +54 -44
- package/assets/js/modules/inputs.js +25 -21
- package/assets/js/modules/nav.js +3 -1
- package/assets/js/modules/notification.js +6 -6
- package/assets/js/modules/orderablelist.js +12 -12
- package/assets/js/modules/pagination.js +5 -5
- package/assets/js/modules/table.js +242 -181
- package/assets/js/modules/tabs.js +71 -60
- package/assets/js/modules/testimonial.js +11 -12
- package/assets/js/scripts.bundle.js +1 -1
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +1 -1
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/scripts.js +1 -1
- package/assets/js/tests/chart.spec.js +5 -5
- package/assets/js/tests/filterlist.spec.js +2 -2
- package/assets/js/tests/slider.spec.js +2 -2
- package/assets/js/tests/table.spec.js +2 -2
- package/assets/js/vendor/hibp.js +4 -4
- package/assets/sass/_components.scss +28 -40
- package/assets/sass/_corefiles.scss +22 -29
- package/assets/sass/_elements.scss +19 -19
- package/assets/sass/_fonts.scss +10 -7
- package/assets/sass/_func.scss +14 -14
- package/assets/sass/_functions/functions.scss +115 -90
- package/assets/sass/_functions/mixins.scss +72 -112
- package/assets/sass/_functions/utilities.scss +447 -393
- package/assets/sass/_functions/variables.scss +1357 -1371
- package/assets/sass/_print.scss +18 -16
- package/assets/sass/_tests/colours.spec.scss +15 -14
- package/assets/sass/_tests/func.spec.scss +1 -2
- package/assets/sass/_tests/mixins.spec.scss +9 -14
- package/assets/sass/_tests/typography.spec.scss +1 -2
- package/assets/sass/_utilities.scss +8 -12
- package/assets/sass/components/actionbar.global.scss +45 -64
- package/assets/sass/components/actionbar.scss +58 -84
- package/assets/sass/components/address-lookup.scss +9 -11
- package/assets/sass/components/applied-filters.scss +3 -7
- package/assets/sass/components/barchart.component.scss +68 -99
- package/assets/sass/components/card.component.scss +35 -50
- package/assets/sass/components/card.module.scss +34 -37
- package/assets/sass/components/carousel.component.scss +198 -177
- package/assets/sass/components/carousel.config.scss +13 -19
- package/assets/sass/components/charts.config.scss +16 -23
- package/assets/sass/components/charts.module.scss +139 -178
- package/assets/sass/components/charts.scss +173 -232
- package/assets/sass/components/collapsible-side.scss +65 -98
- package/assets/sass/components/fileupload.scss +17 -23
- package/assets/sass/components/filter-card.component.scss +21 -28
- package/assets/sass/components/header.scss +24 -37
- package/assets/sass/components/inline-edit.preload.scss +24 -45
- package/assets/sass/components/inline-edit.scss +4 -5
- package/assets/sass/components/marketing.scss +19 -14
- package/assets/sass/components/multi-step.component.scss +36 -42
- package/assets/sass/components/multiselect.preload.scss +9 -12
- package/assets/sass/components/multiselect.scss +20 -24
- package/assets/sass/components/nav.docs.scss +7 -15
- package/assets/sass/components/nav.global.scss +123 -177
- package/assets/sass/components/nav.old.scss +64 -135
- package/assets/sass/components/nav.preload.scss +11 -12
- package/assets/sass/components/nav.scss +126 -173
- package/assets/sass/components/notification.global.scss +2 -3
- package/assets/sass/components/notification.scss +17 -32
- package/assets/sass/components/pagination.scss +32 -44
- package/assets/sass/components/property-searchbar.scss +2 -6
- package/assets/sass/components/record-card.component.scss +42 -55
- package/assets/sass/components/slider.scss +38 -35
- package/assets/sass/components/snapshot.scss +4 -10
- package/assets/sass/components/stepper.scss +14 -22
- package/assets/sass/components/table.global.scss +130 -171
- package/assets/sass/components/table.scss +17 -27
- package/assets/sass/components/tabs.scss +23 -32
- package/assets/sass/components/testimonial.scss +6 -14
- package/assets/sass/components/timeline.scss +8 -12
- package/assets/sass/components/video-card.component.scss +9 -14
- package/assets/sass/components.reset.scss +5 -5
- package/assets/sass/core.scss +3 -3
- package/assets/sass/elements/admin-panel.scss +41 -45
- package/assets/sass/elements/badge-tag.scss +16 -26
- package/assets/sass/elements/brand.scss +13 -16
- package/assets/sass/elements/buttons.scss +80 -106
- package/assets/sass/elements/container.scss +24 -133
- package/assets/sass/elements/details.scss +30 -50
- package/assets/sass/elements/dialog.scss +4 -6
- package/assets/sass/elements/forms.scss +421 -437
- package/assets/sass/elements/icons.scss +3 -4
- package/assets/sass/elements/links.scss +17 -25
- package/assets/sass/elements/lists.scss +30 -47
- package/assets/sass/elements/media.scss +1 -4
- package/assets/sass/elements/modal.scss +54 -80
- package/assets/sass/elements/popover.scss +28 -45
- package/assets/sass/elements/progress.scss +30 -40
- package/assets/sass/elements/table.element.scss +10 -15
- package/assets/sass/elements/tooltips.scss +27 -49
- package/assets/sass/elements/type.scss +47 -53
- package/assets/sass/email.scss +7 -9
- package/assets/sass/error.scss +23 -20
- package/assets/sass/foundations/bs_grid.scss +0 -1
- package/assets/sass/foundations/grid.scss +120 -122
- package/assets/sass/foundations/reboot.scss +27 -35
- package/assets/sass/foundations/root.scss +21 -31
- package/assets/sass/helpers/dynamic.scss +5 -5
- package/assets/sass/helpers/line-clamp.scss +1 -2
- package/assets/sass/helpers/max-height.scss +28 -36
- package/assets/sass/helpers/wider-colours.scss +2 -5
- package/assets/sass/main.scss +4 -4
- package/assets/sass/templates/auth.scss +11 -18
- package/assets/sass/templates/form.scss +16 -29
- package/assets/ts/components/_global.ts +14 -17
- package/assets/ts/components/accordion/accordion.component.ts +23 -19
- package/assets/ts/components/actionbar/README.md +8 -7
- package/assets/ts/components/actionbar/actionbar.component.ts +170 -220
- package/assets/ts/components/address-lookup/address-lookup.component.ts +94 -130
- package/assets/ts/components/applied-filters/README.md +1 -1
- package/assets/ts/components/applied-filters/applied-filters.component.ts +16 -15
- package/assets/ts/components/barchart/barchart.component.ts +29 -26
- package/assets/ts/components/card/card.component.ts +56 -57
- package/assets/ts/components/carousel/README.md +8 -9
- package/assets/ts/components/carousel/carousel.component.ts +30 -33
- package/assets/ts/components/chart/README.md +1 -3
- package/assets/ts/components/chart/chart.component.ts +24 -36
- package/assets/ts/components/collapsible-side/README.md +1 -1
- package/assets/ts/components/collapsible-side/collapsible-side.component.ts +44 -57
- package/assets/ts/components/fileupload/README.md +3 -3
- package/assets/ts/components/fileupload/fileupload.component.ts +23 -28
- package/assets/ts/components/filter-card/filter-card.component.ts +32 -33
- package/assets/ts/components/filterlist/README.md +3 -3
- package/assets/ts/components/filterlist/filterlist.component.ts +18 -16
- package/assets/ts/components/header/README.md +8 -9
- package/assets/ts/components/header/header.component.ts +15 -16
- package/assets/ts/components/inline-edit/README.md +1 -0
- package/assets/ts/components/inline-edit/inline-edit.component.ts +71 -71
- package/assets/ts/components/marketing/marketing.component.ts +17 -16
- package/assets/ts/components/multi-step/multi-step.component.ts +114 -156
- package/assets/ts/components/multiselect/README.md +5 -5
- package/assets/ts/components/multiselect/multiselect.component.ts +116 -133
- package/assets/ts/components/nav/README.md +13 -13
- package/assets/ts/components/nav/nav.component.ts +171 -167
- package/assets/ts/components/notification/README.md +9 -9
- package/assets/ts/components/notification/notification.component.ts +33 -32
- package/assets/ts/components/pagination/README.md +12 -12
- package/assets/ts/components/pagination/pagination.component.ts +51 -69
- package/assets/ts/components/record-card/record-card.component.ts +24 -34
- package/assets/ts/components/search/README.md +6 -7
- package/assets/ts/components/search/search.component.ts +75 -91
- package/assets/ts/components/slider/slider.component.ts +62 -77
- package/assets/ts/components/table/README.md +8 -8
- package/assets/ts/components/table/table.component.ts +97 -134
- package/assets/ts/components/tabs/README.md +4 -4
- package/assets/ts/components/tabs/tabs.component.ts +16 -14
- package/assets/ts/components/video-card/video-card.component.ts +89 -93
- package/assets/ts/components.ts +44 -20
- package/assets/ts/html.d.ts +1 -7
- package/assets/ts/modules/applied-filters.ts +104 -135
- package/assets/ts/modules/card.module.ts +13 -18
- package/assets/ts/modules/carousel.ts +194 -195
- package/assets/ts/modules/chart.module.ts +201 -246
- package/assets/ts/modules/chart.ts +454 -472
- package/assets/ts/modules/data-layer.md +35 -31
- package/assets/ts/modules/data-layer.ts +18 -18
- package/assets/ts/modules/dialogs.ts +113 -117
- package/assets/ts/modules/drawer.ts +7 -9
- package/assets/ts/modules/dynamicEvents.ts +67 -100
- package/assets/ts/modules/file-upload.ts +43 -40
- package/assets/ts/modules/fileupload.ts +38 -60
- package/assets/ts/modules/filterlist.ts +14 -20
- package/assets/ts/modules/form.ts +126 -128
- package/assets/ts/modules/helpers.ts +114 -120
- package/assets/ts/modules/inputs.ts +88 -120
- package/assets/ts/modules/nav.ts +19 -18
- package/assets/ts/modules/notification.ts +28 -32
- package/assets/ts/modules/orderablelist.ts +90 -82
- package/assets/ts/modules/pagination.ts +14 -19
- package/assets/ts/modules/table.ts +516 -599
- package/assets/ts/modules/tabs.ts +120 -145
- package/assets/ts/modules/testimonial.ts +59 -64
- package/assets/ts/scripts.ts +7 -9
- package/assets/ts/tests/chart.spec.ts +11 -20
- package/assets/ts/tests/data-layer.spec.js +3 -4
- package/assets/ts/tests/filterlist.spec.ts +3 -6
- package/assets/ts/tests/slider.spec.ts +9 -15
- package/assets/ts/tests/table.spec.ts +7 -24
- package/assets/ts/vendor/hibp.ts +43 -43
- package/dist/components.es.js +280 -270
- package/dist/components.umd.js +67 -67
- package/dist/style.css +1 -1
- package/package.json +14 -4
- package/src/components/Accordion/Accordion.spec.js +25 -31
- package/src/components/Accordion/Accordion.vue +16 -19
- package/src/components/Accordion/AccordionItem.vue +39 -37
- package/src/components/Accordion/README.md +10 -12
- package/src/components/Actionbar/Actionbar.vue +15 -18
- package/src/components/Actionbar/README.md +8 -7
- package/src/components/AddressLookup/AddressLookup.vue +14 -16
- package/src/components/AppliedFilters/AppliedFilters.vue +14 -16
- package/src/components/Banner/Banner.spec.js +13 -15
- package/src/components/Banner/Banner.vue +19 -19
- package/src/components/Banner/README.md +8 -10
- package/src/components/BarChart/BarChart.vue +14 -16
- package/src/components/Card/Card.vue +13 -16
- package/src/components/Card/README.md +8 -8
- package/src/components/Carousel/Carousel.vue +15 -18
- package/src/components/Carousel/README.md +7 -7
- package/src/components/Chart/Chart.spec.js +64 -87
- package/src/components/Chart/Chart.vue +41 -40
- package/src/components/Chart/README.md +8 -9
- package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +8 -10
- package/src/components/CollapsibleSideMenu/README.md +1 -1
- package/src/components/FileUpload/FileUpload.vue +35 -40
- package/src/components/FileUpload/README.md +3 -3
- package/src/components/FilterCard/FilterCard.vue +14 -16
- package/src/components/Filterlist/Filterlist.vue +7 -9
- package/src/components/Filterlist/README.md +3 -3
- package/src/components/Header/Header.vue +23 -26
- package/src/components/Header/README.md +8 -9
- package/src/components/InlineEdit/InlineEdit.vue +26 -32
- package/src/components/Input/Input.vue +323 -233
- package/src/components/Input/README.md +11 -11
- package/src/components/Marketing/Marketing.vue +24 -27
- package/src/components/Marketing/README.md +7 -7
- package/src/components/MultiStep/MultiStep.vue +13 -15
- package/src/components/Multiselect/Multiselect.vue +14 -17
- package/src/components/Nav/Nav.vue +15 -29
- package/src/components/Nav/README.md +12 -12
- package/src/components/Nav-old/Nav.vue +88 -93
- package/src/components/Nav-old/README.md +11 -12
- package/src/components/NoteFeed/NoteFeed.vue +59 -56
- package/src/components/NoteFeed/README.md +6 -6
- package/src/components/Notification/Notification.vue +11 -15
- package/src/components/Notification/README.md +9 -9
- package/src/components/Pagination/Pagination.vue +14 -24
- package/src/components/Pagination/README.md +12 -12
- package/src/components/PropertySearchbar/PropertySearchbar.vue +191 -160
- package/src/components/PropertySearchbar/README.md +14 -15
- package/src/components/RecordCard/RecordCard.vue +14 -16
- package/src/components/Search/README.md +1 -1
- package/src/components/Search/Search.vue +13 -16
- package/src/components/Slider/Slider.vue +13 -16
- package/src/components/Snapshot/README.md +9 -10
- package/src/components/Snapshot/Snapshot.vue +15 -17
- package/src/components/Stepper/README.md +12 -13
- package/src/components/Stepper/Step.vue +22 -18
- package/src/components/Stepper/Stepper.spec.js +41 -46
- package/src/components/Stepper/Stepper.vue +17 -18
- package/src/components/Table/README.md +12 -11
- package/src/components/Table/Table.spec.js +17 -28
- package/src/components/Table/Table.vue +49 -48
- package/src/components/Tabs/README.md +8 -8
- package/src/components/Tabs/Tab.vue +21 -21
- package/src/components/Tabs/Tabs.vue +14 -17
- package/src/components/Testimonial/README.md +11 -12
- package/src/components/Testimonial/Testimonial.spec.js +22 -26
- package/src/components/Testimonial/Testimonial.vue +31 -25
- package/src/components/Timeline/README.md +3 -3
- package/src/components/Timeline/Timeline.spec.js +9 -11
- package/src/components/Timeline/Timeline.vue +10 -10
- package/src/components/VideoCard/VideoCard.vue +14 -16
- package/src/foundations/Logo/Logo.spec.js +30 -30
- package/src/foundations/Logo/Logo.vue +28 -28
- package/src/foundations/Logo/README.md +5 -4
- package/src/helpers/strings.js +11 -8
- package/src/index.js +27 -28
- package/src/vue-shim.d.ts +4 -4
|
@@ -1,184 +1,173 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import { zeroPad, isNumeric, ucfirst, resolvePath } from
|
|
2
|
+
import { zeroPad, isNumeric, ucfirst, resolvePath } from './helpers';
|
|
3
3
|
|
|
4
4
|
// Basic functionality needed
|
|
5
5
|
export const addDataAttributes = (table) => {
|
|
6
|
-
|
|
7
6
|
const colHeadings = Array.from(table.querySelectorAll('thead th'));
|
|
8
7
|
const colRows = Array.from(table.querySelectorAll('tbody tr'));
|
|
9
8
|
|
|
10
9
|
colRows.forEach((row, index) => {
|
|
11
|
-
|
|
12
10
|
const cells = Array.from(row.querySelectorAll('th, td'));
|
|
13
|
-
const statuses = [
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const statuses = [
|
|
12
|
+
'0',
|
|
13
|
+
'low',
|
|
14
|
+
'medium',
|
|
15
|
+
'high',
|
|
16
|
+
'unknown',
|
|
17
|
+
'n/a',
|
|
18
|
+
'pending',
|
|
19
|
+
'verified',
|
|
20
|
+
'due',
|
|
21
|
+
'overdue',
|
|
22
|
+
'incomplete',
|
|
23
|
+
'complete',
|
|
24
|
+
'completed',
|
|
25
|
+
'approval required',
|
|
26
|
+
'upcoming',
|
|
27
|
+
'requires approval',
|
|
28
|
+
'to do',
|
|
29
|
+
'on track',
|
|
30
|
+
'not started',
|
|
31
|
+
'warning',
|
|
32
|
+
'error',
|
|
33
|
+
];
|
|
16
34
|
|
|
35
|
+
cells.forEach((cell, cellIndex) => {
|
|
17
36
|
const heading = colHeadings[cellIndex];
|
|
18
|
-
if(typeof heading !=
|
|
19
|
-
|
|
20
|
-
let tempDiv = document.createElement("div");
|
|
37
|
+
if (typeof heading != 'undefined') {
|
|
38
|
+
const tempDiv = document.createElement('div');
|
|
21
39
|
tempDiv.innerHTML = heading.innerHTML;
|
|
22
|
-
|
|
23
|
-
cell.setAttribute('data-label',headingText);
|
|
40
|
+
const headingText = tempDiv.textContent || tempDiv.innerText || '';
|
|
41
|
+
cell.setAttribute('data-label', headingText);
|
|
24
42
|
|
|
25
|
-
if(heading.hasAttribute('data-td-class'))
|
|
26
|
-
cell.setAttribute('class',heading.getAttribute('data-td-class'))
|
|
43
|
+
if (heading.hasAttribute('data-td-class')) cell.setAttribute('class', heading.getAttribute('data-td-class'));
|
|
27
44
|
|
|
28
|
-
if(heading.hasAttribute('data-format')){
|
|
29
|
-
cell.setAttribute('data-format',heading.getAttribute('data-format'))
|
|
30
|
-
cell.innerHTML = formatCell(heading.getAttribute('data-format'),cell.textContent.trim()); //Make sure date format is consistent
|
|
45
|
+
if (heading.hasAttribute('data-format')) {
|
|
46
|
+
cell.setAttribute('data-format', heading.getAttribute('data-format'));
|
|
47
|
+
cell.innerHTML = formatCell(heading.getAttribute('data-format'), cell.textContent.trim()); //Make sure date format is consistent
|
|
31
48
|
}
|
|
32
49
|
|
|
33
|
-
if(statuses.includes(cell.textContent.trim().toLowerCase())){
|
|
34
|
-
cell.setAttribute('data-content',cell.textContent.trim().toLowerCase());
|
|
50
|
+
if (statuses.includes(cell.textContent.trim().toLowerCase())) {
|
|
51
|
+
cell.setAttribute('data-content', cell.textContent.trim().toLowerCase());
|
|
35
52
|
}
|
|
36
53
|
}
|
|
37
54
|
});
|
|
38
55
|
});
|
|
39
|
-
}
|
|
56
|
+
};
|
|
40
57
|
|
|
41
58
|
export const getLargestLastColWidth = (table) => {
|
|
42
|
-
|
|
43
59
|
let largestWidth = 0;
|
|
44
60
|
|
|
45
61
|
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
62
|
+
const htmlStyles = window.getComputedStyle(document.querySelector('html'));
|
|
63
|
+
const lastColChild = row.querySelector(':scope > *:last-child > *:first-child');
|
|
46
64
|
|
|
47
|
-
|
|
48
|
-
let lastColChild = row.querySelector(':scope > *:last-child > *:first-child');
|
|
49
|
-
|
|
50
|
-
if(lastColChild){
|
|
51
|
-
|
|
65
|
+
if (lastColChild) {
|
|
52
66
|
lastColChild.classList.add('text-nowrap');
|
|
53
|
-
let responsiveWidth = lastColChild.offsetWidth/parseFloat(htmlStyles.fontSize);
|
|
67
|
+
let responsiveWidth = lastColChild.offsetWidth / parseFloat(htmlStyles.fontSize);
|
|
54
68
|
responsiveWidth += 1.7;
|
|
55
69
|
largestWidth = largestWidth > responsiveWidth ? largestWidth : responsiveWidth;
|
|
56
70
|
}
|
|
57
71
|
});
|
|
58
72
|
|
|
59
73
|
return largestWidth;
|
|
60
|
-
}
|
|
74
|
+
};
|
|
61
75
|
|
|
62
76
|
export const createMobileButton = (table, wrapper) => {
|
|
77
|
+
if (wrapper.classList.contains('table--fullwidth') && !wrapper.hasAttribute('data-expandable')) return false;
|
|
63
78
|
|
|
64
|
-
if(
|
|
65
|
-
return false;
|
|
66
|
-
|
|
67
|
-
if(table.querySelectorAll('thead tr th').length < 4 && !wrapper.hasAttribute('data-expandable'))
|
|
68
|
-
return false;
|
|
79
|
+
if (table.querySelectorAll('thead tr th').length < 4 && !wrapper.hasAttribute('data-expandable')) return false;
|
|
69
80
|
|
|
70
81
|
//If the expand column already exists we don't need to add a new one.
|
|
71
|
-
Array.from(table.querySelectorAll('thead tr')).forEach((row,index) => {
|
|
72
|
-
if(!table.querySelectorAll('thead tr th.expand-button-heading').length){
|
|
73
|
-
row.insertAdjacentHTML(
|
|
74
|
-
'afterbegin',
|
|
75
|
-
`<th class="th--fixed expand-button-heading"></th>`
|
|
76
|
-
);
|
|
82
|
+
Array.from(table.querySelectorAll('thead tr')).forEach((row, index) => {
|
|
83
|
+
if (!table.querySelectorAll('thead tr th.expand-button-heading').length) {
|
|
84
|
+
row.insertAdjacentHTML('afterbegin', `<th class="th--fixed expand-button-heading"></th>`);
|
|
77
85
|
}
|
|
78
86
|
});
|
|
79
87
|
|
|
80
|
-
Array.from(table.querySelectorAll('tbody tr')).forEach((row,index) => {
|
|
88
|
+
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
81
89
|
const preExpanded = row.getAttribute('data-view') === 'full' ? 'aria-expanded' : '';
|
|
82
90
|
row.insertAdjacentHTML(
|
|
83
91
|
'afterbegin',
|
|
84
92
|
`<td class="td--fixed td--expand"><button class="btn btn-compact btn-secondary" data-expand-button ${preExpanded}>Expand</button></td>`
|
|
85
93
|
);
|
|
86
94
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
95
|
+
};
|
|
90
96
|
|
|
91
97
|
export const addTableEventListeners = (table) => {
|
|
92
|
-
|
|
93
98
|
table.addEventListener('click', (event) => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
let button = event.target.closest('[data-expand-button]');
|
|
98
|
-
let tableRow = button.closest('tr');
|
|
99
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-expand-button]')) {
|
|
100
|
+
const button = event.target.closest('[data-expand-button]');
|
|
101
|
+
const tableRow = button.closest('tr');
|
|
99
102
|
|
|
100
103
|
button.toggleAttribute('aria-expanded');
|
|
101
104
|
|
|
102
|
-
if(tableRow.getAttribute('data-view') ==
|
|
103
|
-
|
|
104
|
-
else
|
|
105
|
-
tableRow.setAttribute('data-view','full');
|
|
105
|
+
if (tableRow.getAttribute('data-view') == 'full') tableRow.setAttribute('data-view', 'default');
|
|
106
|
+
else tableRow.setAttribute('data-view', 'full');
|
|
106
107
|
|
|
107
108
|
button.blur();
|
|
108
|
-
}
|
|
109
|
+
}
|
|
109
110
|
});
|
|
110
|
-
}
|
|
111
|
+
};
|
|
111
112
|
|
|
112
113
|
// Filters
|
|
113
114
|
export const createSearchDataList = (table, form) => {
|
|
115
|
+
const searchInput = form.querySelector('input[data-search]');
|
|
114
116
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if(!searchInput)
|
|
118
|
-
return false;
|
|
117
|
+
if (!searchInput) return false;
|
|
119
118
|
|
|
120
119
|
const searchID = searchInput.getAttribute('id');
|
|
121
120
|
const searchableColumns = searchInput.getAttribute('data-search').split(',');
|
|
122
|
-
|
|
121
|
+
const inputWrapper = searchInput.parentNode;
|
|
123
122
|
|
|
124
|
-
|
|
123
|
+
const searchableTerms = {};
|
|
125
124
|
searchableColumns.forEach((columnHeading, index) => {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if(td.querySelector('.td__content'))
|
|
125
|
+
Array.from(table.querySelectorAll('td[data-label="' + columnHeading.trim() + '"]')).forEach((td, index) => {
|
|
126
|
+
if (td.querySelector('.td__content'))
|
|
130
127
|
searchableTerms[td.querySelector('.td__content').textContent] = td.querySelector('.td__content').textContent;
|
|
131
|
-
else
|
|
132
|
-
searchableTerms[td.textContent] = td.textContent;
|
|
128
|
+
else searchableTerms[td.textContent] = td.textContent;
|
|
133
129
|
});
|
|
134
130
|
});
|
|
135
131
|
|
|
136
|
-
searchInput.setAttribute('list'
|
|
137
|
-
searchInput.setAttribute('autocomplete','off');
|
|
132
|
+
searchInput.setAttribute('list', `${searchID}_list`);
|
|
133
|
+
searchInput.setAttribute('autocomplete', 'off');
|
|
138
134
|
|
|
139
|
-
if(!inputWrapper.querySelector('datalist'))
|
|
140
|
-
inputWrapper.innerHTML += `<datalist id="${searchID}_list"></datalist>`;
|
|
141
|
-
|
|
142
|
-
inputWrapper.querySelector('datalist').innerHTML = `${Object.keys(searchableTerms).map(term => `<option value="${term}"></option>`).join("")}`;
|
|
143
|
-
}
|
|
135
|
+
if (!inputWrapper.querySelector('datalist')) inputWrapper.innerHTML += `<datalist id="${searchID}_list"></datalist>`;
|
|
144
136
|
|
|
145
|
-
|
|
137
|
+
inputWrapper.querySelector('datalist').innerHTML = `${Object.keys(searchableTerms)
|
|
138
|
+
.map((term) => `<option value="${term}"></option>`)
|
|
139
|
+
.join('')}`;
|
|
140
|
+
};
|
|
146
141
|
|
|
147
|
-
|
|
142
|
+
export const addFilterEventListeners = (table, form, pagination, wrapper, savedTableBody) => {
|
|
143
|
+
let timer;
|
|
148
144
|
|
|
149
145
|
// Check what conditions are set on the table to see what the form actions are
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if(wrapper.hasAttribute('data-no-submit')){
|
|
146
|
+
const formSubmit = function (event, paginate = false) {
|
|
147
|
+
if (wrapper.hasAttribute('data-no-submit')) {
|
|
153
148
|
return false;
|
|
154
149
|
}
|
|
155
150
|
|
|
156
|
-
if(form.classList.contains('processing'))
|
|
157
|
-
return false;
|
|
158
|
-
|
|
159
|
-
Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element,index) => {
|
|
151
|
+
if (form.classList.contains('processing')) return false;
|
|
160
152
|
|
|
161
|
-
|
|
153
|
+
Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element, index) => {
|
|
154
|
+
const event = new Event('tags-set');
|
|
162
155
|
element.dispatchEvent(event);
|
|
163
156
|
});
|
|
164
157
|
|
|
165
158
|
// Before submitting check if any duplicate checkboxes within the filters dialog needs to upset the original input
|
|
166
|
-
if(event.type ==
|
|
159
|
+
if (event.type == 'submit') {
|
|
167
160
|
form.classList.add('processing');
|
|
168
|
-
Array.from(form.querySelectorAll('[data-duplicate]')).forEach((element,index) => {
|
|
169
|
-
|
|
161
|
+
Array.from(form.querySelectorAll('[data-duplicate]')).forEach((element, index) => {
|
|
170
162
|
const id = element.getAttribute('data-duplicate');
|
|
171
163
|
const input = document.getElementById(id);
|
|
172
164
|
const card = document.querySelector(`[for="${id}"] iam-card`);
|
|
173
165
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if(card){
|
|
178
|
-
let clickEvent = new Event('click');
|
|
166
|
+
if (input.checked != element.checked) {
|
|
167
|
+
if (card) {
|
|
168
|
+
const clickEvent = new Event('click');
|
|
179
169
|
card.dispatchEvent(clickEvent);
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
170
|
+
} else {
|
|
182
171
|
input.checked = element.checked;
|
|
183
172
|
}
|
|
184
173
|
}
|
|
@@ -186,188 +175,174 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
186
175
|
form.classList.remove('processing');
|
|
187
176
|
}
|
|
188
177
|
|
|
189
|
-
if(form.hasAttribute('data-ajax')){
|
|
190
|
-
|
|
178
|
+
if (form.hasAttribute('data-ajax')) {
|
|
191
179
|
// Default back to page 1
|
|
192
|
-
if(!paginate){
|
|
193
|
-
|
|
180
|
+
if (!paginate) {
|
|
181
|
+
const paginationInput = form.querySelector('[data-pagination]');
|
|
194
182
|
paginationInput.value = 1;
|
|
195
183
|
wrapper.setAttribute('data-page', 1);
|
|
196
184
|
}
|
|
197
185
|
|
|
198
|
-
loadAjaxTable(table, form, pagination,wrapper);
|
|
199
|
-
}
|
|
200
|
-
else if(form.hasAttribute('data-submit')){
|
|
186
|
+
loadAjaxTable(table, form, pagination, wrapper);
|
|
187
|
+
} else if (form.hasAttribute('data-submit')) {
|
|
201
188
|
form.submit();
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
189
|
+
} else {
|
|
204
190
|
filterTable(table, form, wrapper);
|
|
205
|
-
populateDataQueries(table,form);
|
|
191
|
+
populateDataQueries(table, form);
|
|
206
192
|
}
|
|
207
193
|
|
|
208
194
|
// Pass post data back to the page
|
|
209
|
-
if(form.hasAttribute('data-ajax-post')){
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
const http = new XMLHttpRequest()
|
|
195
|
+
if (form.hasAttribute('data-ajax-post')) {
|
|
196
|
+
const formData = new FormData(form);
|
|
197
|
+
const queryString = new URLSearchParams(formData).toString();
|
|
198
|
+
const http = new XMLHttpRequest();
|
|
214
199
|
http.open('GET', `${window.location.href}?ajax=true&${queryString}`);
|
|
215
200
|
http.send();
|
|
216
201
|
}
|
|
217
|
-
}
|
|
202
|
+
};
|
|
218
203
|
|
|
219
|
-
if(form.querySelector('iam-actionbar[data-search]')){
|
|
204
|
+
if (form.querySelector('iam-actionbar[data-search]')) {
|
|
220
205
|
form.querySelector('iam-actionbar[data-search]').addEventListener('search-submit', (event) => {
|
|
221
|
-
|
|
222
|
-
if(form.querySelector('input[data-search]')){
|
|
206
|
+
if (form.querySelector('input[data-search]')) {
|
|
223
207
|
form.querySelector('input[data-search]').value = event.detail.search;
|
|
208
|
+
} else {
|
|
209
|
+
form.insertAdjacentHTML(
|
|
210
|
+
'beforeend',
|
|
211
|
+
`<input type="hidden" name="search" data-search="${form.querySelector('iam-actionbar[data-search]').getAttribute('data-search')}" value="${event.detail.search}"/>`
|
|
212
|
+
);
|
|
224
213
|
}
|
|
225
|
-
|
|
226
|
-
form.insertAdjacentHTML('beforeend',`<input type="hidden" name="search" data-search="${form.querySelector('iam-actionbar[data-search]').getAttribute('data-search')}" value="${event.detail.search}"/>`);
|
|
227
|
-
}
|
|
228
|
-
|
|
214
|
+
|
|
229
215
|
clearTimeout(timer);
|
|
230
216
|
formSubmit(event);
|
|
231
217
|
});
|
|
232
218
|
}
|
|
233
219
|
|
|
234
|
-
|
|
235
220
|
form.addEventListener('keyup', (event) => {
|
|
236
|
-
|
|
237
221
|
clearTimeout(timer);
|
|
238
222
|
|
|
239
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')){
|
|
240
|
-
|
|
241
|
-
timer = setTimeout(function(){
|
|
223
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')) {
|
|
224
|
+
timer = setTimeout(function () {
|
|
242
225
|
formSubmit(event);
|
|
243
226
|
}, 500);
|
|
244
|
-
}
|
|
227
|
+
}
|
|
245
228
|
});
|
|
246
229
|
|
|
247
230
|
form.addEventListener('change', (event) => {
|
|
248
|
-
|
|
249
231
|
clearTimeout(timer);
|
|
250
|
-
|
|
251
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-sort]')){
|
|
252
|
-
|
|
253
|
-
if(!form.hasAttribute('data-submit')){
|
|
232
|
+
|
|
233
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-sort]')) {
|
|
234
|
+
if (!form.hasAttribute('data-submit')) {
|
|
254
235
|
sortTable(table, form, savedTableBody);
|
|
255
236
|
}
|
|
256
237
|
|
|
257
238
|
formSubmit(event);
|
|
258
239
|
}
|
|
259
240
|
|
|
260
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')){
|
|
261
|
-
|
|
241
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')) {
|
|
262
242
|
formSubmit(event);
|
|
263
243
|
}
|
|
264
244
|
|
|
265
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter][data-no-ajax]')){
|
|
245
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter][data-no-ajax]')) {
|
|
246
|
+
// Allow for input fields to filter the current results without a new ajax call
|
|
266
247
|
|
|
267
248
|
filterTable(table, form, wrapper);
|
|
268
|
-
populateDataQueries(table,form);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
|
|
249
|
+
populateDataQueries(table, form);
|
|
250
|
+
} else if (
|
|
251
|
+
event &&
|
|
252
|
+
event.target instanceof HTMLElement &&
|
|
253
|
+
event.target.closest('[data-filter]') &&
|
|
254
|
+
event.target.closest('form .dialog__wrapper > dialog')
|
|
255
|
+
) {
|
|
272
256
|
formSubmit(event);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
257
|
+
} else if (
|
|
258
|
+
event &&
|
|
259
|
+
event.target instanceof HTMLElement &&
|
|
260
|
+
event.target.closest('[data-filter]') &&
|
|
261
|
+
!event.target.closest('form dialog')
|
|
262
|
+
) {
|
|
276
263
|
formSubmit(event);
|
|
277
264
|
}
|
|
278
265
|
|
|
279
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-show]')){
|
|
280
|
-
|
|
266
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-show]')) {
|
|
281
267
|
formSubmit(event);
|
|
282
268
|
}
|
|
283
269
|
|
|
284
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-mimic]')){
|
|
285
|
-
|
|
270
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-mimic]')) {
|
|
286
271
|
formSubmit(event);
|
|
287
272
|
}
|
|
288
273
|
|
|
274
|
+
if (event && event.target instanceof HTMLElement && event.target.hasAttribute('id')) {
|
|
275
|
+
const id = event.target.getAttribute('id');
|
|
289
276
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
let id = event.target.getAttribute('id');
|
|
293
|
-
|
|
294
|
-
if(document.querySelector(`[data-duplicate="${id}"]`)){
|
|
277
|
+
if (document.querySelector(`[data-duplicate="${id}"]`)) {
|
|
295
278
|
document.querySelector(`[data-duplicate="${id}"]`).checked = event.target.checked;
|
|
296
279
|
}
|
|
297
280
|
}
|
|
298
281
|
});
|
|
299
282
|
|
|
300
|
-
|
|
301
283
|
form.addEventListener('click', (event) => {
|
|
302
|
-
|
|
303
284
|
clearTimeout(timer);
|
|
304
|
-
|
|
305
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('dialog button:not([type="button"])')){
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
let modal = button.closest('dialog');
|
|
285
|
+
|
|
286
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('dialog button:not([type="button"])')) {
|
|
287
|
+
const button = event.target.closest('dialog button:not([type="button"])');
|
|
288
|
+
const modal = button.closest('dialog');
|
|
309
289
|
|
|
310
290
|
modal.close();
|
|
311
291
|
}
|
|
312
292
|
|
|
313
293
|
// Prevent the form from submitting
|
|
314
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__close')){
|
|
315
|
-
|
|
294
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__close')) {
|
|
316
295
|
event.preventDefault();
|
|
317
296
|
event.stopPropagation();
|
|
318
297
|
}
|
|
319
298
|
|
|
320
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-clear]')){
|
|
321
|
-
|
|
299
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-clear]')) {
|
|
322
300
|
form.classList.add('processing');
|
|
323
301
|
// Make sure any applied filters have been removed
|
|
324
|
-
Array.from(form.querySelectorAll('.applied-filters')).forEach((filters,index) => {
|
|
325
|
-
filters.innerHTML =
|
|
302
|
+
Array.from(form.querySelectorAll('.applied-filters')).forEach((filters, index) => {
|
|
303
|
+
filters.innerHTML = '';
|
|
326
304
|
});
|
|
327
305
|
|
|
328
306
|
// Make sure cards are unlicked
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
for (let i = 0; i < frm_elements.length; i++)
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
case
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
{
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
let card = label.querySelector('iam-card');
|
|
351
|
-
let clickEvent = new Event('click');
|
|
352
|
-
card.dispatchEvent(clickEvent);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
input.checked = false;
|
|
307
|
+
const frm_elements = form.elements;
|
|
308
|
+
|
|
309
|
+
for (let i = 0; i < frm_elements.length; i++) {
|
|
310
|
+
const field_type = frm_elements[i].type.toLowerCase() ? frm_elements[i].type.toLowerCase() : 'text';
|
|
311
|
+
switch (field_type) {
|
|
312
|
+
case 'text':
|
|
313
|
+
case 'password':
|
|
314
|
+
case 'textarea':
|
|
315
|
+
frm_elements[i].value = '';
|
|
316
|
+
break;
|
|
317
|
+
case 'radio':
|
|
318
|
+
case 'checkbox':
|
|
319
|
+
if (frm_elements[i].checked) {
|
|
320
|
+
const input = frm_elements[i];
|
|
321
|
+
const id = input.getAttribute('id');
|
|
322
|
+
const label = document.querySelector(`[for="${id}"`);
|
|
323
|
+
|
|
324
|
+
if (label.querySelector('iam-card')) {
|
|
325
|
+
const card = label.querySelector('iam-card');
|
|
326
|
+
const clickEvent = new Event('click');
|
|
327
|
+
card.dispatchEvent(clickEvent);
|
|
356
328
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
case
|
|
329
|
+
|
|
330
|
+
input.checked = false;
|
|
331
|
+
}
|
|
332
|
+
break;
|
|
333
|
+
case 'select-one':
|
|
334
|
+
case 'select-multi':
|
|
335
|
+
frm_elements[i].selectedIndex = -1;
|
|
336
|
+
break;
|
|
337
|
+
case 'hidden':
|
|
363
338
|
default:
|
|
364
|
-
|
|
365
|
-
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
366
341
|
}
|
|
367
342
|
|
|
368
343
|
form.classList.remove('processing');
|
|
369
344
|
|
|
370
|
-
if(!form.hasAttribute('data-submit')){
|
|
345
|
+
if (!form.hasAttribute('data-submit')) {
|
|
371
346
|
sortTable(table, form, savedTableBody);
|
|
372
347
|
}
|
|
373
348
|
|
|
@@ -376,10 +351,9 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
376
351
|
});
|
|
377
352
|
|
|
378
353
|
form.addEventListener('submit', (event) => {
|
|
379
|
-
|
|
380
354
|
clearTimeout(timer);
|
|
381
355
|
|
|
382
|
-
if(!form.hasAttribute('data-submit')){
|
|
356
|
+
if (!form.hasAttribute('data-submit')) {
|
|
383
357
|
event.preventDefault();
|
|
384
358
|
}
|
|
385
359
|
|
|
@@ -387,82 +361,66 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
387
361
|
});
|
|
388
362
|
|
|
389
363
|
form.addEventListener('force', (event) => {
|
|
390
|
-
|
|
391
364
|
formSubmit(event);
|
|
392
365
|
});
|
|
393
366
|
|
|
394
367
|
form.addEventListener('paginate', (event) => {
|
|
395
|
-
|
|
396
|
-
formSubmit(event,true);
|
|
368
|
+
formSubmit(event, true);
|
|
397
369
|
});
|
|
398
370
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
371
|
// Mmimic fields
|
|
403
|
-
|
|
404
|
-
|
|
372
|
+
const forms = [];
|
|
373
|
+
const fields = [];
|
|
405
374
|
|
|
406
375
|
// Collect the forms that we need to add an event listener for.
|
|
407
376
|
Array.from(form.querySelectorAll('[data-mimic]')).forEach((input, index) => {
|
|
408
|
-
|
|
409
|
-
let mimicField = input.getAttribute('data-mimic');
|
|
377
|
+
const mimicField = input.getAttribute('data-mimic');
|
|
410
378
|
|
|
411
379
|
Array.from(document.querySelectorAll(`[name="${mimicField}"]`)).forEach((mimicInput, index) => {
|
|
380
|
+
const parentForm = mimicInput.closest('form');
|
|
412
381
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
if(!forms.includes(parentForm)){
|
|
382
|
+
if (!forms.includes(parentForm)) {
|
|
416
383
|
forms.push(parentForm);
|
|
417
384
|
}
|
|
418
385
|
|
|
419
|
-
if(!fields.includes(mimicField)){
|
|
386
|
+
if (!fields.includes(mimicField)) {
|
|
420
387
|
fields.push(mimicField);
|
|
421
388
|
}
|
|
422
|
-
|
|
423
389
|
});
|
|
424
390
|
});
|
|
425
391
|
|
|
426
|
-
|
|
427
392
|
// For each form add change listener
|
|
428
393
|
forms.forEach((parentForm, index) => {
|
|
394
|
+
const updateMimicInput = function () {
|
|
395
|
+
const mimickedAlready = [];
|
|
396
|
+
const formData = new FormData(parentForm);
|
|
429
397
|
|
|
430
|
-
const updateMimicInput = function(){
|
|
431
|
-
let mimickedAlready = [];
|
|
432
|
-
let formData = new FormData(parentForm);
|
|
433
|
-
|
|
434
398
|
let i = 1;
|
|
435
399
|
for (const [key, value] of formData) {
|
|
436
|
-
|
|
437
|
-
if(document.querySelector(`[data-mimic="${key}"]`) && !mimickedAlready.includes(key)){
|
|
438
|
-
|
|
400
|
+
if (document.querySelector(`[data-mimic="${key}"]`) && !mimickedAlready.includes(key)) {
|
|
439
401
|
mimickedAlready.push(key);
|
|
440
402
|
document.querySelector(`[data-mimic="${key}"]`).value = value;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
document.querySelector(`[data-mimic="${key}"]`).value += ","+value;
|
|
403
|
+
} else if (document.querySelector(`[data-mimic="${key}"]`))
|
|
404
|
+
document.querySelector(`[data-mimic="${key}"]`).value += ',' + value;
|
|
444
405
|
|
|
445
406
|
i++;
|
|
446
407
|
}
|
|
447
408
|
|
|
448
409
|
for (const value of mimickedAlready) {
|
|
449
|
-
const event = new Event(
|
|
410
|
+
const event = new Event('force');
|
|
450
411
|
form.dispatchEvent(event);
|
|
451
412
|
}
|
|
452
413
|
|
|
453
|
-
|
|
454
414
|
// Check for empties
|
|
455
415
|
for (const field of fields) {
|
|
456
|
-
if(!formData.has(field) && parentForm.querySelector(`[name="${field}"]`)){
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
const event = new Event("force");
|
|
416
|
+
if (!formData.has(field) && parentForm.querySelector(`[name="${field}"]`)) {
|
|
417
|
+
document.querySelector(`[data-mimic="${field}"]`).value = '';
|
|
418
|
+
|
|
419
|
+
const event = new Event('force');
|
|
461
420
|
form.dispatchEvent(event);
|
|
462
421
|
}
|
|
463
422
|
}
|
|
464
|
-
|
|
465
|
-
}
|
|
423
|
+
};
|
|
466
424
|
|
|
467
425
|
parentForm.addEventListener('force', (event) => {
|
|
468
426
|
updateMimicInput();
|
|
@@ -472,80 +430,76 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
472
430
|
updateMimicInput();
|
|
473
431
|
});
|
|
474
432
|
});
|
|
475
|
-
}
|
|
433
|
+
};
|
|
476
434
|
|
|
477
435
|
export const sortTable = (table, form, savedTableBody) => {
|
|
478
|
-
|
|
479
|
-
if(form.getAttribute('data-ajax')){
|
|
436
|
+
if (form.getAttribute('data-ajax')) {
|
|
480
437
|
return false;
|
|
481
438
|
}
|
|
482
439
|
|
|
483
|
-
|
|
484
|
-
|
|
440
|
+
const tbody = table.querySelector('tbody');
|
|
485
441
|
|
|
486
442
|
let selectedOption = form.querySelector(`input[type="radio"][data-sort]:checked`);
|
|
487
443
|
|
|
488
|
-
if(form.querySelector('select[data-sort]')){
|
|
489
|
-
|
|
490
|
-
let select = form.querySelector('select[data-sort]');
|
|
444
|
+
if (form.querySelector('select[data-sort]')) {
|
|
445
|
+
const select = form.querySelector('select[data-sort]');
|
|
491
446
|
selectedOption = form.querySelector(`select[data-sort] option:nth-child(${select.selectedIndex + 1})`);
|
|
492
447
|
}
|
|
493
448
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
449
|
+
const sortBy = selectedOption.getAttribute('data-sort');
|
|
450
|
+
const order = selectedOption.getAttribute('data-order');
|
|
451
|
+
const format = selectedOption.getAttribute('data-format');
|
|
497
452
|
|
|
498
|
-
if(!sortBy){
|
|
499
|
-
|
|
453
|
+
if (!sortBy) {
|
|
500
454
|
tbody.innerHTML = savedTableBody.innerHTML;
|
|
501
455
|
addDataAttributes(table);
|
|
502
456
|
return false;
|
|
503
457
|
}
|
|
504
458
|
|
|
505
459
|
let orderArray = [];
|
|
506
|
-
if(!['asc','desc','descending'].includes(order)){
|
|
460
|
+
if (!['asc', 'desc', 'descending'].includes(order)) {
|
|
507
461
|
orderArray = order.split(',');
|
|
508
462
|
}
|
|
509
463
|
|
|
510
464
|
// Create an array from the table rows, the index created is then used to sort the array
|
|
511
465
|
let tableArr = [];
|
|
512
466
|
Array.from(tbody.querySelectorAll('tr')).forEach((tableRow, index) => {
|
|
467
|
+
let rowIndex = tableRow
|
|
468
|
+
.querySelector('td[data-label="' + sortBy + '"], th[data-label="' + sortBy + '"]')
|
|
469
|
+
.textContent.trim();
|
|
513
470
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
if(tableRow.querySelector('[data-label="'+sortBy+'"] .td__content')){
|
|
517
|
-
rowIndex = tableRow.querySelector('[data-label="'+sortBy+'"] .td__content').textContent.trim();
|
|
471
|
+
if (tableRow.querySelector('[data-label="' + sortBy + '"] .td__content')) {
|
|
472
|
+
rowIndex = tableRow.querySelector('[data-label="' + sortBy + '"] .td__content').textContent.trim();
|
|
518
473
|
}
|
|
519
474
|
|
|
520
475
|
// If a predefined order set replace the search term with an ordered numeric value so it can be sorted
|
|
521
|
-
if(orderArray.length && orderArray.includes(rowIndex)){
|
|
476
|
+
if (orderArray.length && orderArray.includes(rowIndex)) {
|
|
522
477
|
rowIndex = orderArray.indexOf(rowIndex);
|
|
523
478
|
}
|
|
524
479
|
|
|
525
|
-
if(isNumeric(rowIndex)){
|
|
526
|
-
rowIndex = zeroPad(rowIndex,10);
|
|
480
|
+
if (isNumeric(rowIndex)) {
|
|
481
|
+
rowIndex = zeroPad(rowIndex, 10);
|
|
527
482
|
}
|
|
528
483
|
|
|
529
484
|
// If the sort format is date then lets transform the index to a sortable date (this is never displayed)
|
|
530
|
-
if(format && format ==
|
|
485
|
+
if (format && format == 'date') {
|
|
531
486
|
rowIndex = new Date(rowIndex);
|
|
532
487
|
}
|
|
533
|
-
|
|
488
|
+
|
|
534
489
|
const dataRow = {
|
|
535
490
|
index: rowIndex,
|
|
536
|
-
row: tableRow
|
|
537
|
-
}
|
|
491
|
+
row: tableRow,
|
|
492
|
+
};
|
|
538
493
|
tableArr.push(dataRow);
|
|
539
494
|
});
|
|
540
495
|
|
|
541
496
|
// Sort array alphabetically
|
|
542
|
-
tableArr.sort((a, b) => (a.index > b.index
|
|
497
|
+
tableArr.sort((a, b) => (a.index > b.index ? 1 : -1));
|
|
543
498
|
|
|
544
499
|
// Reverse if descending
|
|
545
|
-
if(order ==
|
|
500
|
+
if (order == 'descending' || order == 'desc') {
|
|
546
501
|
tableArr = tableArr.reverse();
|
|
547
502
|
}
|
|
548
|
-
|
|
549
503
|
|
|
550
504
|
// Create a string to return and populate the tbody
|
|
551
505
|
let strTbody = '';
|
|
@@ -553,35 +507,33 @@ export const sortTable = (table, form, savedTableBody) => {
|
|
|
553
507
|
strTbody += tableRow.row.outerHTML;
|
|
554
508
|
});
|
|
555
509
|
tbody.innerHTML = strTbody;
|
|
556
|
-
}
|
|
510
|
+
};
|
|
557
511
|
|
|
558
512
|
export const filterTable = (table, form, wrapper) => {
|
|
559
|
-
|
|
560
513
|
table.classList.remove('table--filtered');
|
|
561
514
|
|
|
562
|
-
|
|
563
|
-
|
|
515
|
+
const filters = filterFilters(form);
|
|
516
|
+
const searches = [];
|
|
564
517
|
let matched = 0;
|
|
565
|
-
|
|
566
|
-
|
|
518
|
+
const page = form.querySelector('[data-pagination]') ? parseInt(form.querySelector('[data-pagination]').value) : 1;
|
|
519
|
+
const showRows = form.querySelector('[data-show]') ? parseInt(form.querySelector('[data-show]').value) : 15;
|
|
567
520
|
|
|
568
521
|
// Reset
|
|
569
522
|
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
570
523
|
row.classList.remove('filtered');
|
|
571
524
|
row.classList.remove('filtered--matched');
|
|
572
525
|
row.classList.remove('filtered--show');
|
|
573
|
-
|
|
526
|
+
|
|
574
527
|
row.removeAttribute('data-filtered-by');
|
|
575
528
|
});
|
|
576
529
|
|
|
577
530
|
// Add search columns too
|
|
578
|
-
if(form.querySelector('input[data-search]')){
|
|
579
|
-
|
|
580
|
-
|
|
531
|
+
if (form.querySelector('input[data-search]')) {
|
|
532
|
+
const searchInput = form.querySelector('input[data-search]');
|
|
533
|
+
const searchColumns = form.querySelector('input[data-search]').getAttribute('data-search').split(',');
|
|
581
534
|
|
|
582
535
|
searchColumns.forEach((column, index) => {
|
|
583
|
-
|
|
584
|
-
searches.push({'column':`${column.trim()}`,'value':`${searchInput.value}`});
|
|
536
|
+
searches.push({ column: `${column.trim()}`, value: `${searchInput.value}` });
|
|
585
537
|
});
|
|
586
538
|
}
|
|
587
539
|
|
|
@@ -593,437 +545,393 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
593
545
|
|
|
594
546
|
let filterCount = 0;
|
|
595
547
|
Object.values(filters).forEach((filter, index) => {
|
|
596
|
-
|
|
597
|
-
if(typeof filter == "object" && Object.values(filter).length){
|
|
548
|
+
if (typeof filter == 'object' && Object.values(filter).length) {
|
|
598
549
|
filterCount += Object.values(filter).length;
|
|
599
|
-
}
|
|
600
|
-
else {
|
|
550
|
+
} else {
|
|
601
551
|
filterCount++;
|
|
602
552
|
}
|
|
603
|
-
|
|
604
553
|
});
|
|
605
554
|
|
|
606
|
-
if(filterCount) {
|
|
607
|
-
|
|
555
|
+
if (filterCount) {
|
|
608
556
|
Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
|
|
609
557
|
element.innerHTML += `(${filterCount})`;
|
|
610
558
|
element.parentNode.classList.add('hover');
|
|
611
559
|
});
|
|
612
560
|
}
|
|
613
|
-
|
|
561
|
+
|
|
614
562
|
// Filter the table
|
|
615
563
|
table.classList.add('table--filtered');
|
|
616
564
|
for (const [key, filterValue] of Object.entries(filters)) {
|
|
617
|
-
|
|
618
565
|
Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
|
|
619
|
-
|
|
620
566
|
let isMatched = false;
|
|
621
567
|
filterValue.forEach((filter, index) => {
|
|
568
|
+
const filterTd = row.querySelector(`[data-label="${key}"]`);
|
|
622
569
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
let fromDate = new Date(filter.replace('-date-from',''));
|
|
628
|
-
let checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
570
|
+
if (filter.includes('-date-from')) {
|
|
571
|
+
const fromDate = new Date(filter.replace('-date-from', ''));
|
|
572
|
+
const checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
629
573
|
|
|
630
574
|
fromDate.setHours(0, 0, 0, 0);
|
|
631
575
|
checkDate.setHours(0, 0, 0, 0);
|
|
632
576
|
|
|
633
|
-
if(checkDate < fromDate){
|
|
634
|
-
|
|
577
|
+
if (checkDate < fromDate) {
|
|
635
578
|
row.classList.add('less-than-from-date');
|
|
636
579
|
isMatched = false;
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
|
|
580
|
+
} else if (
|
|
581
|
+
!row.classList.contains('less-than-from-date') &&
|
|
582
|
+
!row.classList.contains('greater-than-to-date')
|
|
583
|
+
) {
|
|
640
584
|
isMatched = true;
|
|
641
585
|
}
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
let toDate = new Date(filter.replace('-date-to',''));
|
|
646
|
-
let checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
586
|
+
} else if (filter.includes('-date-to')) {
|
|
587
|
+
const toDate = new Date(filter.replace('-date-to', ''));
|
|
588
|
+
const checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
647
589
|
|
|
648
590
|
toDate.setHours(0, 0, 0, 0);
|
|
649
591
|
checkDate.setHours(0, 0, 0, 0);
|
|
650
592
|
|
|
651
|
-
if(checkDate > toDate){
|
|
652
|
-
|
|
593
|
+
if (checkDate > toDate) {
|
|
653
594
|
row.classList.add('greater-than-to-date');
|
|
654
595
|
isMatched = false;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
|
|
596
|
+
} else if (
|
|
597
|
+
!row.classList.contains('less-than-from-date') &&
|
|
598
|
+
!row.classList.contains('greater-than-to-date')
|
|
599
|
+
) {
|
|
658
600
|
isMatched = true;
|
|
659
601
|
}
|
|
660
602
|
}
|
|
661
|
-
|
|
603
|
+
|
|
662
604
|
// Dynamic values
|
|
663
|
-
if(filter && filter ==
|
|
605
|
+
if (filter && filter == '$today') {
|
|
664
606
|
filter = formatCell('date', new Date());
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
let yesterday = new Date();
|
|
607
|
+
} else if (filter && filter == '$yesterday') {
|
|
608
|
+
const yesterday = new Date();
|
|
669
609
|
yesterday.setDate(yesterday.getDate() - 1);
|
|
670
610
|
filter = formatCell('date', yesterday);
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
let sundayThisWeek = new Date(today.setDate(today.getDate() - today.getDay() + 7));
|
|
677
|
-
let checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
611
|
+
} else if (filter && (filter == '$thisWeek' || filter == '$lastWeek')) {
|
|
612
|
+
const today = new Date();
|
|
613
|
+
const mondayThisWeek = new Date(today.setDate(today.getDate() - (today.getDay() - 1)));
|
|
614
|
+
const sundayThisWeek = new Date(today.setDate(today.getDate() - today.getDay() + 7));
|
|
615
|
+
const checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
678
616
|
|
|
679
617
|
today.setHours(0, 0, 0, 0);
|
|
680
618
|
mondayThisWeek.setHours(0, 0, 0, 0);
|
|
681
619
|
sundayThisWeek.setHours(0, 0, 0, 0);
|
|
682
620
|
checkDate.setHours(0, 0, 0, 0);
|
|
683
621
|
|
|
684
|
-
if(filter ==
|
|
685
|
-
isMatched =
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
let sundayLastWeek = new Date(sundayThisWeek.setDate(sundayThisWeek.getDate() - 7));
|
|
622
|
+
if (filter == '$thisWeek') {
|
|
623
|
+
isMatched = checkDate >= mondayThisWeek && checkDate <= sundayThisWeek;
|
|
624
|
+
} else {
|
|
625
|
+
const mondayLastWeek = new Date(mondayThisWeek.setDate(mondayThisWeek.getDate() - 7));
|
|
626
|
+
const sundayLastWeek = new Date(sundayThisWeek.setDate(sundayThisWeek.getDate() - 7));
|
|
690
627
|
|
|
691
628
|
mondayLastWeek.setHours(0, 0, 0, 0);
|
|
692
629
|
sundayLastWeek.setHours(0, 0, 0, 0);
|
|
693
630
|
|
|
694
|
-
isMatched =
|
|
631
|
+
isMatched = checkDate >= mondayLastWeek && checkDate <= sundayLastWeek;
|
|
695
632
|
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
633
|
+
} else if (filter && filter == '$thisMonth') {
|
|
634
|
+
const today = new Date(),
|
|
635
|
+
year = today.getFullYear(),
|
|
636
|
+
month = today.getMonth();
|
|
700
637
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
638
|
+
const firstDayMonth = new Date(year, month, 1);
|
|
639
|
+
const lastDayMonth = new Date(year, month + 1, 0);
|
|
640
|
+
const checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
704
641
|
|
|
705
642
|
firstDayMonth.setHours(0, 0, 0, 0);
|
|
706
643
|
lastDayMonth.setHours(0, 0, 0, 0);
|
|
707
644
|
checkDate.setHours(0, 0, 0, 0);
|
|
708
645
|
|
|
709
|
-
isMatched =
|
|
710
|
-
}
|
|
711
|
-
|
|
646
|
+
isMatched = checkDate >= firstDayMonth && checkDate <= lastDayMonth;
|
|
647
|
+
} else if (filter && filter == '$lastMonth') {
|
|
648
|
+
const today = new Date(),
|
|
649
|
+
year = today.getFullYear(),
|
|
650
|
+
month = today.getMonth();
|
|
712
651
|
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
var lastDayLastMonth = new Date(year, month, 0);
|
|
717
|
-
let checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
652
|
+
const firstDayLastMonth = new Date(year, month - 1, 1);
|
|
653
|
+
const lastDayLastMonth = new Date(year, month, 0);
|
|
654
|
+
const checkDate = new Date(filterTd.textContent.toLowerCase());
|
|
718
655
|
|
|
719
656
|
firstDayLastMonth.setHours(0, 0, 0, 0);
|
|
720
657
|
lastDayLastMonth.setHours(0, 0, 0, 0);
|
|
721
658
|
checkDate.setHours(0, 0, 0, 0);
|
|
722
659
|
|
|
723
|
-
isMatched =
|
|
660
|
+
isMatched = checkDate >= firstDayLastMonth && checkDate <= lastDayLastMonth;
|
|
724
661
|
}
|
|
725
|
-
|
|
726
|
-
if(filterTd && filterTd.textContent.toLowerCase().includes(filter.replace('-',' ').toLowerCase())){
|
|
662
|
+
|
|
663
|
+
if (filterTd && filterTd.textContent.toLowerCase().includes(filter.replace('-', ' ').toLowerCase())) {
|
|
727
664
|
isMatched = true;
|
|
728
665
|
}
|
|
729
|
-
|
|
730
666
|
});
|
|
731
667
|
|
|
732
|
-
if(!isMatched) {
|
|
733
|
-
|
|
668
|
+
if (!isMatched) {
|
|
734
669
|
row.classList.add('filtered');
|
|
735
|
-
row.setAttribute('data-filtered-by',key)
|
|
670
|
+
row.setAttribute('data-filtered-by', key);
|
|
736
671
|
}
|
|
737
|
-
|
|
738
672
|
});
|
|
739
673
|
}
|
|
740
674
|
// Search whats left of the table after filtering
|
|
741
675
|
Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
|
|
742
|
-
|
|
743
676
|
let isSearched = searches.length > 0 && searches[0].value.length >= 3 ? false : true;
|
|
744
|
-
|
|
745
|
-
searches.forEach((search, index) => {
|
|
746
677
|
|
|
747
|
-
|
|
678
|
+
searches.forEach((search, index) => {
|
|
679
|
+
const searchTd = row.querySelector(`[data-label="${search.column}"]`);
|
|
748
680
|
|
|
749
|
-
if
|
|
681
|
+
if (
|
|
682
|
+
searchTd &&
|
|
683
|
+
search.value.length >= 3 &&
|
|
684
|
+
searchTd.textContent.toLowerCase().includes(search.value.toLowerCase())
|
|
685
|
+
) {
|
|
750
686
|
isSearched = true;
|
|
751
687
|
}
|
|
752
|
-
|
|
753
688
|
});
|
|
754
689
|
|
|
755
|
-
if(!isSearched){
|
|
690
|
+
if (!isSearched) {
|
|
756
691
|
row.classList.add('filtered');
|
|
757
692
|
}
|
|
758
693
|
});
|
|
759
694
|
|
|
760
695
|
// Work out what to display after pagination
|
|
761
696
|
Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
|
|
762
|
-
|
|
763
697
|
matched++;
|
|
764
698
|
|
|
765
699
|
row.classList.add('filtered--matched');
|
|
766
700
|
|
|
767
|
-
// pagination bit
|
|
768
|
-
|
|
769
|
-
if(matchesPage == parseInt(page)){
|
|
701
|
+
// pagination bit
|
|
702
|
+
const matchesPage = Math.ceil(matched / showRows);
|
|
703
|
+
if (matchesPage == parseInt(page)) {
|
|
770
704
|
row.classList.add('filtered--show');
|
|
771
705
|
}
|
|
772
706
|
});
|
|
773
707
|
|
|
774
|
-
if(wrapper){
|
|
775
|
-
wrapper.setAttribute('data-total',matched);
|
|
776
|
-
wrapper.setAttribute('data-show',showRows);
|
|
777
|
-
wrapper.setAttribute('data-page',page);
|
|
708
|
+
if (wrapper) {
|
|
709
|
+
wrapper.setAttribute('data-total', matched);
|
|
710
|
+
wrapper.setAttribute('data-show', showRows);
|
|
711
|
+
wrapper.setAttribute('data-page', page);
|
|
778
712
|
}
|
|
713
|
+
};
|
|
779
714
|
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
export const populateDataQueries = (table,form,wrapper) => {
|
|
783
|
-
|
|
715
|
+
export const populateDataQueries = (table, form, wrapper) => {
|
|
784
716
|
const dataQueries = Array.from(form.querySelectorAll('[data-query]'));
|
|
785
717
|
|
|
786
718
|
dataQueries.forEach((queryElement, index) => {
|
|
787
|
-
|
|
788
|
-
let query = queryElement.getAttribute('data-query');
|
|
719
|
+
const query = queryElement.getAttribute('data-query');
|
|
789
720
|
let numberOfMatchedRows = 0;
|
|
790
721
|
|
|
791
|
-
if(query == 'total'){
|
|
792
|
-
if(wrapper.hasAttribute('data-total'))
|
|
793
|
-
numberOfMatchedRows = wrapper.getAttribute('data-total');
|
|
722
|
+
if (query == 'total') {
|
|
723
|
+
if (wrapper.hasAttribute('data-total')) numberOfMatchedRows = wrapper.getAttribute('data-total');
|
|
794
724
|
else
|
|
795
|
-
numberOfMatchedRows = table.classList.contains('table--filtered')
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
725
|
+
numberOfMatchedRows = table.classList.contains('table--filtered')
|
|
726
|
+
? table.querySelectorAll('tbody tr').length
|
|
727
|
+
: table.querySelectorAll('tbody tr').length;
|
|
728
|
+
} else if (!query.includes(' == ') && query.includes(' & ')) {
|
|
729
|
+
const queries = query.split(' & ');
|
|
800
730
|
let selector = '';
|
|
801
731
|
|
|
802
|
-
queries.forEach(element => {
|
|
732
|
+
queries.forEach((element) => {
|
|
803
733
|
selector += `:not([data-filtered-by="${element}"])`;
|
|
804
734
|
});
|
|
805
|
-
|
|
806
|
-
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr${selector}`)).length;
|
|
807
|
-
}
|
|
808
|
-
else if(!query.includes(' == ')){
|
|
809
735
|
|
|
736
|
+
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr${selector}`)).length;
|
|
737
|
+
} else if (!query.includes(' == ')) {
|
|
810
738
|
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr:not([data-filtered-by="${query}"])`)).length;
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
let queries = query.split(' && ');
|
|
815
|
-
|
|
816
|
-
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr:not(.filtered)`)).filter(function(row){
|
|
739
|
+
} else if (query.includes(' && ')) {
|
|
740
|
+
const queries = query.split(' && ');
|
|
817
741
|
|
|
742
|
+
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr:not(.filtered)`)).filter(function (row) {
|
|
818
743
|
let matched = true;
|
|
819
744
|
|
|
820
745
|
for (const [index, value] of Object.entries(queries)) {
|
|
821
|
-
|
|
822
|
-
let queryParts = value.split(' == ');
|
|
746
|
+
const queryParts = value.split(' == ');
|
|
823
747
|
|
|
824
|
-
if
|
|
748
|
+
if (
|
|
749
|
+
!row.querySelector(`td[data-label="${queryParts[0]}"]`) ||
|
|
750
|
+
row.querySelector(`td[data-label="${queryParts[0]}"]`).textContent != `${queryParts[1]}`
|
|
751
|
+
)
|
|
825
752
|
matched = false;
|
|
826
753
|
}
|
|
827
754
|
|
|
828
755
|
return matched;
|
|
829
|
-
|
|
830
756
|
}).length;
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
757
|
+
} else {
|
|
758
|
+
const queryParts = query.split(' == ');
|
|
759
|
+
numberOfMatchedRows = Array.from(
|
|
760
|
+
table.querySelectorAll(
|
|
761
|
+
`tbody tr.filtered--matched td[data-label="${queryParts[0]}"], tbody tr[data-filtered-by="${queryParts[0]}"] td[data-label="${queryParts[0]}"]`
|
|
762
|
+
)
|
|
763
|
+
).filter(function (element) {
|
|
836
764
|
return element.textContent === queryParts[1];
|
|
837
765
|
}).length;
|
|
838
766
|
}
|
|
839
767
|
|
|
840
|
-
if(queryElement.hasAttribute('data-total')){
|
|
768
|
+
if (queryElement.hasAttribute('data-total')) {
|
|
841
769
|
queryElement.setAttribute('data-total', numberOfMatchedRows);
|
|
842
|
-
}
|
|
843
|
-
else {
|
|
770
|
+
} else {
|
|
844
771
|
queryElement.innerHTML = numberOfMatchedRows;
|
|
845
772
|
}
|
|
846
|
-
|
|
847
773
|
});
|
|
848
|
-
}
|
|
774
|
+
};
|
|
849
775
|
|
|
850
776
|
// Pagination
|
|
851
|
-
export const addPaginationEventListeners = function(table, form, pagination, wrapper){
|
|
852
|
-
|
|
853
|
-
if(wrapper.hasAttribute('data-no-submit')){
|
|
777
|
+
export const addPaginationEventListeners = function (table, form, pagination, wrapper) {
|
|
778
|
+
if (wrapper.hasAttribute('data-no-submit')) {
|
|
854
779
|
return false;
|
|
855
780
|
}
|
|
856
781
|
|
|
857
782
|
pagination.addEventListener('update-page', (event) => {
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
let newPage = event.detail.page;
|
|
783
|
+
const paginationInput = form.querySelector('[data-pagination]');
|
|
784
|
+
const newPage = event.detail.page;
|
|
861
785
|
|
|
862
786
|
// Set the filter value
|
|
863
787
|
paginationInput.value = newPage;
|
|
864
|
-
form.dispatchEvent(new Event(
|
|
788
|
+
form.dispatchEvent(new Event('paginate'));
|
|
865
789
|
|
|
866
790
|
// Reset the data attribute
|
|
867
|
-
wrapper.setAttribute('data-page',newPage);
|
|
791
|
+
wrapper.setAttribute('data-page', newPage);
|
|
868
792
|
|
|
869
|
-
if(table.hasAttribute('data-show-history')){
|
|
870
|
-
|
|
793
|
+
if (table.hasAttribute('data-show-history')) {
|
|
871
794
|
const url = new URL(location);
|
|
872
|
-
url.searchParams.set(
|
|
873
|
-
history.pushState({
|
|
795
|
+
url.searchParams.set('page', newPage);
|
|
796
|
+
history.pushState({ type: 'pagination', form: form.getAttribute('id'), page: newPage }, '', url);
|
|
874
797
|
}
|
|
875
798
|
|
|
876
799
|
// scroll back to the top of the table
|
|
877
|
-
if(!wrapper.hasAttribute('data-no-scroll')){
|
|
800
|
+
if (!wrapper.hasAttribute('data-no-scroll')) {
|
|
878
801
|
const yOffset = -250;
|
|
879
802
|
const y = table.getBoundingClientRect().top + window.pageYOffset + yOffset;
|
|
880
|
-
window.scrollTo({top: y, behavior: 'smooth'});
|
|
803
|
+
window.scrollTo({ top: y, behavior: 'smooth' });
|
|
881
804
|
}
|
|
882
805
|
});
|
|
883
806
|
|
|
884
807
|
pagination.addEventListener('update-show', (event) => {
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
let showRows = event.detail.show;
|
|
808
|
+
const showInput = form.querySelector('[data-show]');
|
|
809
|
+
const showRows = event.detail.show;
|
|
888
810
|
showInput.value = showRows;
|
|
889
811
|
wrapper.setAttribute('data-show', showRows);
|
|
890
|
-
form.dispatchEvent(new Event(
|
|
812
|
+
form.dispatchEvent(new Event('submit'));
|
|
891
813
|
});
|
|
892
|
-
}
|
|
814
|
+
};
|
|
893
815
|
|
|
894
816
|
// Export CSV Data
|
|
895
817
|
export const addExportEventListeners = (button, table) => {
|
|
896
|
-
|
|
897
|
-
if(!button){
|
|
818
|
+
if (!button) {
|
|
898
819
|
return false;
|
|
899
820
|
}
|
|
900
821
|
|
|
901
822
|
button.addEventListener('click', (event) => {
|
|
902
823
|
exportAsCSV(table);
|
|
903
824
|
});
|
|
904
|
-
}
|
|
825
|
+
};
|
|
905
826
|
|
|
906
|
-
export const exportAsCSV = function(table){
|
|
907
|
-
|
|
908
|
-
var csvData = [];
|
|
827
|
+
export const exportAsCSV = function (table) {
|
|
828
|
+
let csvData = [];
|
|
909
829
|
// Get each row data
|
|
910
|
-
|
|
911
|
-
for (
|
|
912
|
-
|
|
830
|
+
const rows = table.getElementsByTagName('tr');
|
|
831
|
+
for (let i = 0; i < rows.length; i++) {
|
|
913
832
|
// Get each column data
|
|
914
|
-
|
|
833
|
+
const cols = rows[i].querySelectorAll('td,th');
|
|
915
834
|
|
|
916
835
|
// Stores each csv row data
|
|
917
|
-
|
|
918
|
-
for (
|
|
919
|
-
|
|
836
|
+
const csvRow = [];
|
|
837
|
+
for (let j = 0; j < cols.length; j++) {
|
|
920
838
|
// Get the text data of each cell of a row and push it to csvrow
|
|
921
839
|
csvRow.push(`"${cols[j].textContent}"`);
|
|
922
840
|
}
|
|
923
841
|
|
|
924
842
|
// Combine each column value with comma
|
|
925
|
-
csvData.push(csvRow.join(
|
|
843
|
+
csvData.push(csvRow.join(','));
|
|
926
844
|
}
|
|
927
845
|
|
|
928
846
|
// Combine each row data with new line character
|
|
929
847
|
csvData = csvData.join('\n');
|
|
930
|
-
|
|
848
|
+
|
|
931
849
|
// Create CSV file object and feed our csvData into it
|
|
932
|
-
|
|
933
|
-
type:
|
|
850
|
+
const CSVFile = new Blob([csvData], {
|
|
851
|
+
type: 'text/csv',
|
|
934
852
|
});
|
|
935
853
|
|
|
936
854
|
// Create to temporary link to initiate download process
|
|
937
|
-
|
|
938
|
-
tempLink.download =
|
|
939
|
-
|
|
855
|
+
const tempLink = document.createElement('a');
|
|
856
|
+
tempLink.download = 'export.csv';
|
|
857
|
+
const url = window.URL.createObjectURL(CSVFile);
|
|
940
858
|
tempLink.href = url;
|
|
941
859
|
|
|
942
860
|
// This link should not be displayed
|
|
943
|
-
tempLink.style.display =
|
|
861
|
+
tempLink.style.display = 'none';
|
|
944
862
|
document.body.appendChild(tempLink);
|
|
945
863
|
|
|
946
864
|
// Automatically click the link to trigger download
|
|
947
865
|
tempLink.click();
|
|
948
866
|
document.body.removeChild(tempLink);
|
|
949
|
-
}
|
|
867
|
+
};
|
|
950
868
|
|
|
951
869
|
// After table is loaded
|
|
952
|
-
export const makeTableFunctional = function(table, form, pagination, wrapper){
|
|
953
|
-
|
|
870
|
+
export const makeTableFunctional = function (table, form, pagination, wrapper) {
|
|
954
871
|
addDataAttributes(table);
|
|
955
872
|
createMobileButton(table, wrapper);
|
|
956
873
|
populateDataQueries(table, form, wrapper);
|
|
957
|
-
|
|
958
|
-
// Work out the largest width of the CTA's in the last column
|
|
959
|
-
if(wrapper && wrapper.classList.contains('table--cta')){
|
|
960
874
|
|
|
875
|
+
// Work out the largest width of the CTA's in the last column
|
|
876
|
+
if (wrapper && wrapper.classList.contains('table--cta')) {
|
|
961
877
|
const largestWidth = getLargestLastColWidth(table);
|
|
962
|
-
wrapper.style.setProperty(
|
|
878
|
+
wrapper.style.setProperty('--cta-width', `${largestWidth}rem`);
|
|
963
879
|
|
|
964
880
|
function outputsize() {
|
|
965
|
-
|
|
966
881
|
Array.from(table.querySelectorAll('tr')).forEach((row, index) => {
|
|
967
|
-
|
|
968
|
-
row.style.setProperty(
|
|
882
|
+
const rowHeight = row.offsetHeight;
|
|
883
|
+
row.style.setProperty('--row-height', `${rowHeight}px`);
|
|
969
884
|
});
|
|
970
885
|
}
|
|
971
|
-
|
|
972
|
-
new ResizeObserver(outputsize).observe(table)
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
886
|
|
|
976
|
-
|
|
887
|
+
new ResizeObserver(outputsize).observe(table);
|
|
888
|
+
}
|
|
889
|
+
};
|
|
977
890
|
|
|
978
|
-
|
|
891
|
+
const filterFilters = function (form) {
|
|
892
|
+
const filters = new Object();
|
|
979
893
|
|
|
980
894
|
// Filter
|
|
981
|
-
|
|
895
|
+
const filterInputs = Array.from(form.querySelectorAll('[data-filter]'));
|
|
982
896
|
|
|
983
897
|
filterInputs.forEach((filterInput, index) => {
|
|
984
|
-
|
|
985
898
|
// Ignore uncked radio inputs
|
|
986
|
-
if(filterInput.type == 'radio' && !filterInput.checked){
|
|
899
|
+
if (filterInput.type == 'radio' && !filterInput.checked) {
|
|
987
900
|
return;
|
|
988
901
|
}
|
|
989
|
-
|
|
990
|
-
if(filterInput.type == 'checkbox' && !filterInput.checked){
|
|
902
|
+
|
|
903
|
+
if (filterInput.type == 'checkbox' && !filterInput.checked) {
|
|
991
904
|
return;
|
|
992
905
|
}
|
|
993
906
|
|
|
994
907
|
if (filterInput && filterInput.value) {
|
|
995
|
-
|
|
996
|
-
let dataFilter = filterInput.getAttribute('data-filter');
|
|
908
|
+
const dataFilter = filterInput.getAttribute('data-filter');
|
|
997
909
|
let filterValue = filterInput.value;
|
|
998
910
|
|
|
999
|
-
if(filterInput.hasAttribute('data-date-from'))
|
|
1000
|
-
|
|
911
|
+
if (filterInput.hasAttribute('data-date-from')) filterValue += '-date-from';
|
|
912
|
+
|
|
913
|
+
if (filterInput.hasAttribute('data-date-to')) filterValue += '-date-to';
|
|
1001
914
|
|
|
1002
|
-
if(
|
|
1003
|
-
filterValue += '-date-to'
|
|
915
|
+
if (!filters[dataFilter]) filters[dataFilter] = [];
|
|
1004
916
|
|
|
1005
|
-
if(!filters[dataFilter])
|
|
1006
|
-
filters[dataFilter] = new Array();
|
|
1007
|
-
|
|
1008
917
|
filters[dataFilter].push(filterValue);
|
|
1009
918
|
}
|
|
1010
919
|
});
|
|
1011
920
|
|
|
1012
921
|
return filters;
|
|
1013
|
-
}
|
|
922
|
+
};
|
|
1014
923
|
|
|
1015
|
-
export const loadAjaxTable = async function (table, form, pagination, wrapper){
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
let ajaxURL = form.getAttribute('data-ajax');
|
|
924
|
+
export const loadAjaxTable = async function (table, form, pagination, wrapper) {
|
|
925
|
+
const formData = new FormData(form);
|
|
926
|
+
const queryString = new URLSearchParams(formData).toString();
|
|
927
|
+
const columns = table.querySelectorAll('thead tr th:not(.expand-button-heading)');
|
|
928
|
+
const tbody = table.querySelector('tbody');
|
|
929
|
+
const ajaxURL = form.getAttribute('data-ajax');
|
|
1022
930
|
|
|
1023
931
|
wrapper.classList.add('table--loading');
|
|
1024
|
-
|
|
932
|
+
|
|
1025
933
|
// Display the filter count
|
|
1026
|
-
|
|
934
|
+
const filters = filterFilters(form);
|
|
1027
935
|
|
|
1028
936
|
Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
|
|
1029
937
|
element.innerHTML = '';
|
|
@@ -1032,15 +940,11 @@ export const loadAjaxTable = async function (table, form, pagination, wrapper){
|
|
|
1032
940
|
|
|
1033
941
|
let filterCount = 0;
|
|
1034
942
|
Object.values(filters).forEach((filter, index) => {
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
filterCount += Object.values(filter).length;
|
|
1038
|
-
else
|
|
1039
|
-
filterCount++;
|
|
943
|
+
if (typeof filter == 'object' && Object.values(filter).length) filterCount += Object.values(filter).length;
|
|
944
|
+
else filterCount++;
|
|
1040
945
|
});
|
|
1041
946
|
|
|
1042
|
-
if(filterCount) {
|
|
1043
|
-
|
|
947
|
+
if (filterCount) {
|
|
1044
948
|
Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
|
|
1045
949
|
element.innerHTML += `(${filterCount})`;
|
|
1046
950
|
element.parentNode.classList.add('hover');
|
|
@@ -1048,159 +952,172 @@ export const loadAjaxTable = async function (table, form, pagination, wrapper){
|
|
|
1048
952
|
}
|
|
1049
953
|
|
|
1050
954
|
// Setup controller vars if not already set
|
|
1051
|
-
if(!window.controller)
|
|
1052
|
-
window.controller = [];
|
|
955
|
+
if (!window.controller) window.controller = [];
|
|
1053
956
|
|
|
1054
957
|
// Abort if controller already present for this url
|
|
1055
|
-
if(window.controller[ajaxURL])
|
|
1056
|
-
window.controller[ajaxURL].abort();
|
|
958
|
+
if (window.controller[ajaxURL]) window.controller[ajaxURL].abort();
|
|
1057
959
|
|
|
1058
960
|
// Create a new controller so it can be aborted if new fetch made
|
|
1059
961
|
window.controller[ajaxURL] = new AbortController();
|
|
1060
962
|
const { signal } = controller[ajaxURL];
|
|
1061
963
|
|
|
1062
964
|
// Set loading on the pagination
|
|
1063
|
-
pagination.setAttribute('data-loading','true');
|
|
965
|
+
pagination.setAttribute('data-loading', 'true');
|
|
1064
966
|
form.classList.add('processing');
|
|
1065
967
|
|
|
1066
968
|
try {
|
|
1067
|
-
await fetch(ajaxURL+'?'+queryString, {
|
|
969
|
+
await fetch(ajaxURL + '?' + queryString, {
|
|
1068
970
|
signal: signal,
|
|
1069
971
|
method: 'get',
|
|
1070
972
|
credentials: 'same-origin',
|
|
1071
973
|
headers: new Headers({
|
|
1072
974
|
'Content-Type': 'application/json',
|
|
1073
975
|
Accept: 'application/json',
|
|
1074
|
-
'X-Requested-With': 'XMLHttpRequest'
|
|
1075
|
-
})
|
|
976
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
977
|
+
}),
|
|
1076
978
|
})
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
cellOutput = "";
|
|
1115
|
-
arrValue.forEach((rowValue, i) => {
|
|
1116
|
-
|
|
1117
|
-
let cellTemplateValue = col.getAttribute('data-output-array');
|
|
1118
|
-
let cellOutputValue = "";
|
|
1119
|
-
|
|
1120
|
-
// If we need to transform some of the data
|
|
1121
|
-
if(col.hasAttribute('data-output-array-property') && col.hasAttribute('data-output-array-transform')){
|
|
1122
|
-
|
|
1123
|
-
const propertyValue = resolvePath(rowValue, col.getAttribute('data-output-array-property'));
|
|
1124
|
-
const transforms = JSON.parse(col.getAttribute('data-output-array-transform'));
|
|
1125
|
-
const transformValue = transforms[propertyValue];
|
|
1126
|
-
|
|
1127
|
-
cellOutputValue = cellTemplateValue.replace(`{${col.getAttribute('data-output-array-property')}}`,transformValue);
|
|
1128
|
-
}
|
|
979
|
+
.then((response) => response.json())
|
|
980
|
+
.then((response) => {
|
|
981
|
+
const schema = form.hasAttribute('data-schema') ? form.getAttribute('data-schema') : 'data';
|
|
982
|
+
const totalNumberSchema = form.hasAttribute('data-schema-total')
|
|
983
|
+
? form.getAttribute('data-schema-total')
|
|
984
|
+
: 'meta.total';
|
|
985
|
+
const currentPageSchema = form.hasAttribute('data-schema-page')
|
|
986
|
+
? form.getAttribute('data-schema-page')
|
|
987
|
+
: 'meta.current_page';
|
|
988
|
+
|
|
989
|
+
const totalNumber = resolvePath(response, totalNumberSchema, 15);
|
|
990
|
+
const currentPage = resolvePath(response, currentPageSchema, 1);
|
|
991
|
+
const data = resolvePath(response, schema);
|
|
992
|
+
const emptyMsg = wrapper.hasAttribute('data-empty-msg')
|
|
993
|
+
? wrapper.getAttribute('data-empty-msg')
|
|
994
|
+
: 'No results found';
|
|
995
|
+
|
|
996
|
+
if (data) {
|
|
997
|
+
tbody.innerHTML = '';
|
|
998
|
+
|
|
999
|
+
data.forEach((row, index) => {
|
|
1000
|
+
const table_row = document.createElement('tr');
|
|
1001
|
+
|
|
1002
|
+
columns.forEach((col, index) => {
|
|
1003
|
+
let cellOutput = '';
|
|
1004
|
+
const table_cell = document.createElement('td');
|
|
1005
|
+
// Add some data to help with the mobile layout design
|
|
1006
|
+
table_cell.setAttribute('data-label', col.innerText);
|
|
1007
|
+
|
|
1008
|
+
if (col.getAttribute('data-output')) {
|
|
1009
|
+
var cellTemplate = col.getAttribute('data-output');
|
|
1010
|
+
// Use a regex to replace {var} with actual values from the json data
|
|
1011
|
+
cellOutput = cellTemplate.replace(new RegExp(/{(.*?)}/, 'gm'), function (matched) {
|
|
1012
|
+
return resolvePath(row, matched.replace('{', '').replace('}', ''));
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1129
1015
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1016
|
+
// If an output array is defined then the content is going to made of of multiple values from an array
|
|
1017
|
+
if (col.hasAttribute('data-output-array')) {
|
|
1018
|
+
var cellTemplate = col.getAttribute('data-output');
|
|
1019
|
+
const arrValue = resolvePath(row, cellTemplate.replace('{', '').replace('}', ''));
|
|
1020
|
+
|
|
1021
|
+
cellOutput = '';
|
|
1022
|
+
arrValue.forEach((rowValue, i) => {
|
|
1023
|
+
const cellTemplateValue = col.getAttribute('data-output-array');
|
|
1024
|
+
let cellOutputValue = '';
|
|
1025
|
+
|
|
1026
|
+
// If we need to transform some of the data
|
|
1027
|
+
if (
|
|
1028
|
+
col.hasAttribute('data-output-array-property') &&
|
|
1029
|
+
col.hasAttribute('data-output-array-transform')
|
|
1030
|
+
) {
|
|
1031
|
+
const propertyValue = resolvePath(rowValue, col.getAttribute('data-output-array-property'));
|
|
1032
|
+
const transforms = JSON.parse(col.getAttribute('data-output-array-transform'));
|
|
1033
|
+
const transformValue = transforms[propertyValue];
|
|
1034
|
+
|
|
1035
|
+
cellOutputValue = cellTemplateValue.replace(
|
|
1036
|
+
`{${col.getAttribute('data-output-array-property')}}`,
|
|
1037
|
+
transformValue
|
|
1038
|
+
);
|
|
1039
|
+
}
|
|
1134
1040
|
|
|
1041
|
+
cellOutputValue = cellOutputValue.replace(new RegExp(/{(.*?)}/, 'gm'), function (matched) {
|
|
1042
|
+
return resolvePath(rowValue, matched.replace('{', '').replace('}', ''));
|
|
1043
|
+
});
|
|
1044
|
+
cellOutput += cellOutputValue;
|
|
1045
|
+
});
|
|
1046
|
+
}
|
|
1135
1047
|
|
|
1136
|
-
|
|
1048
|
+
if (col.hasAttribute('data-transform')) {
|
|
1049
|
+
const transforms = JSON.parse(col.getAttribute('data-transform'));
|
|
1050
|
+
cellOutput = transforms[cellOutput];
|
|
1137
1051
|
|
|
1138
|
-
|
|
1139
|
-
|
|
1052
|
+
if (!cellOutput && col.hasAttribute('data-default')) cellOutput = col.getAttribute('data-default');
|
|
1053
|
+
}
|
|
1140
1054
|
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
}
|
|
1055
|
+
table_cell.innerHTML = cellOutput;
|
|
1056
|
+
table_row.appendChild(table_cell);
|
|
1057
|
+
});
|
|
1144
1058
|
|
|
1145
|
-
|
|
1146
|
-
table_row.appendChild(table_cell)
|
|
1059
|
+
tbody.appendChild(table_row);
|
|
1147
1060
|
});
|
|
1148
1061
|
|
|
1149
|
-
|
|
1150
|
-
|
|
1062
|
+
createSearchDataList(table, form);
|
|
1063
|
+
// Add data to the pagination
|
|
1064
|
+
wrapper.setAttribute('data-total', parseInt(totalNumber));
|
|
1065
|
+
wrapper.setAttribute('data-page', parseInt(currentPage));
|
|
1151
1066
|
|
|
1152
|
-
|
|
1153
|
-
// Add data to the pagination
|
|
1154
|
-
wrapper.setAttribute('data-total', parseInt(totalNumber));
|
|
1155
|
-
wrapper.setAttribute('data-page', parseInt(currentPage));
|
|
1067
|
+
makeTableFunctional(table, form, pagination, wrapper);
|
|
1156
1068
|
|
|
1157
|
-
|
|
1158
|
-
|
|
1069
|
+
Array.from(form.querySelectorAll('[data-ajax-query]')).forEach((queryElement, index) => {
|
|
1070
|
+
const totalNumber = resolvePath(response, queryElement.getAttribute('data-ajax-query'), '');
|
|
1159
1071
|
|
|
1160
|
-
|
|
1072
|
+
if (queryElement.hasAttribute('data-total')) queryElement.setAttribute('data-total', totalNumber);
|
|
1073
|
+
else queryElement.innerHTML = totalNumber;
|
|
1074
|
+
});
|
|
1161
1075
|
|
|
1162
|
-
|
|
1076
|
+
if (parseInt(totalNumber) == 0) {
|
|
1077
|
+
tbody.innerHTML = `<tr><td colspan="100%"><span>${emptyMsg}</span></td></tr>`;
|
|
1078
|
+
}
|
|
1163
1079
|
|
|
1164
|
-
|
|
1165
|
-
queryElement.setAttribute('data-total', totalNumber);
|
|
1166
|
-
else
|
|
1167
|
-
queryElement.innerHTML = totalNumber;
|
|
1168
|
-
});
|
|
1080
|
+
wrapper.classList.remove('table--loading');
|
|
1169
1081
|
|
|
1170
|
-
|
|
1171
|
-
|
|
1082
|
+
window.dataLayer = window.dataLayer || [];
|
|
1083
|
+
window.dataLayer.push({
|
|
1084
|
+
event: 'Ajax table loaded',
|
|
1085
|
+
url: ajaxURL,
|
|
1086
|
+
formData: queryString,
|
|
1087
|
+
});
|
|
1088
|
+
} else {
|
|
1089
|
+
tbody.innerHTML = '<tr><td colspan="100%"><span>Error loading table</span></td></tr>';
|
|
1172
1090
|
}
|
|
1173
1091
|
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
"event": "Ajax table loaded",
|
|
1179
|
-
"url": ajaxURL,
|
|
1180
|
-
"formData": queryString
|
|
1181
|
-
});
|
|
1182
|
-
}
|
|
1183
|
-
else {
|
|
1184
|
-
tbody.innerHTML = '<tr><td colspan="100%"><span>Error loading table</span></td></tr>';
|
|
1185
|
-
}
|
|
1186
|
-
|
|
1187
|
-
// Remove loading on the pagination
|
|
1188
|
-
pagination.removeAttribute('data-loading');
|
|
1189
|
-
form.classList.remove('processing');
|
|
1190
|
-
});
|
|
1092
|
+
// Remove loading on the pagination
|
|
1093
|
+
pagination.removeAttribute('data-loading');
|
|
1094
|
+
form.classList.remove('processing');
|
|
1095
|
+
});
|
|
1191
1096
|
} catch (error) {
|
|
1192
1097
|
console.log(error);
|
|
1193
1098
|
}
|
|
1194
|
-
}
|
|
1099
|
+
};
|
|
1195
1100
|
|
|
1196
1101
|
export const formatCell = (format, cellOutput) => {
|
|
1197
|
-
|
|
1198
1102
|
switch (format) {
|
|
1199
1103
|
case 'datetime':
|
|
1200
|
-
return
|
|
1104
|
+
return (
|
|
1105
|
+
new Date(cellOutput).toLocaleDateString('en-gb', {
|
|
1106
|
+
weekday: 'short',
|
|
1107
|
+
year: '2-digit',
|
|
1108
|
+
month: 'long',
|
|
1109
|
+
day: 'numeric',
|
|
1110
|
+
}) +
|
|
1111
|
+
' ' +
|
|
1112
|
+
new Date(cellOutput).toLocaleTimeString('en-gb', { hour: '2-digit', minute: '2-digit' })
|
|
1113
|
+
);
|
|
1201
1114
|
case 'date':
|
|
1202
|
-
return new Date(cellOutput).toLocaleDateString('en-gb', {
|
|
1115
|
+
return new Date(cellOutput).toLocaleDateString('en-gb', {
|
|
1116
|
+
day: 'numeric',
|
|
1117
|
+
month: 'long',
|
|
1118
|
+
year: '2-digit',
|
|
1119
|
+
});
|
|
1203
1120
|
case 'capitalise':
|
|
1204
|
-
return cellOutput = ucfirst(cellOutput);
|
|
1121
|
+
return (cellOutput = ucfirst(cellOutput));
|
|
1205
1122
|
}
|
|
1206
|
-
}
|
|
1123
|
+
};
|