@watermarkinsights/ripple 5.12.0-9 → 5.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{chartFunctions-7314b414.js → chartFunctions-a1981e06.js} +31 -11
- package/dist/cjs/{functions-5ac8a62f.js → functions-4b187487.js} +1587 -370
- package/dist/{esm/app-globals-f3dbaf3e.js → cjs/global-4e034486.js} +2 -7
- package/dist/cjs/index-e86c28b6.js +2649 -0
- package/dist/cjs/{intl-07aaf53c.js → intl-7fd0760e.js} +104 -1
- package/dist/cjs/loader.cjs.js +3 -4
- package/dist/cjs/priv-calendar.cjs.entry.js +5 -6
- package/dist/cjs/priv-chart-popover.cjs.entry.js +5 -6
- package/dist/cjs/priv-navigator-button.cjs.entry.js +3 -4
- package/dist/cjs/priv-navigator-item.cjs.entry.js +3 -4
- package/dist/cjs/priv-option-list.cjs.entry.js +14 -52
- package/dist/cjs/ripple.cjs.js +11 -12
- package/dist/cjs/wm-action-menu_2.cjs.entry.js +6 -8
- package/dist/cjs/wm-button.cjs.entry.js +4 -5
- package/dist/cjs/wm-chart-slice.cjs.entry.js +1 -1
- package/dist/cjs/wm-chart.cjs.entry.js +15 -9
- package/dist/cjs/wm-date-range.cjs.entry.js +21 -11
- package/dist/cjs/wm-datepicker.cjs.entry.js +8 -9
- package/dist/cjs/wm-file-list.cjs.entry.js +3 -4
- package/dist/cjs/wm-file.cjs.entry.js +4 -5
- package/dist/cjs/wm-input.cjs.entry.js +5 -6
- package/dist/cjs/wm-line-chart.cjs.entry.js +18 -18
- package/dist/cjs/wm-modal-pss_3.cjs.entry.js +10 -13
- package/dist/cjs/wm-modal_3.cjs.entry.js +13 -16
- package/dist/cjs/wm-navigation_3.cjs.entry.js +10 -13
- package/dist/cjs/wm-navigator.cjs.entry.js +3 -4
- package/dist/cjs/wm-nested-select.cjs.entry.js +16 -56
- package/dist/cjs/wm-optgroup.cjs.entry.js +4 -5
- package/dist/cjs/wm-option_2.cjs.entry.js +11 -25
- package/dist/cjs/wm-pagination.cjs.entry.js +65 -14
- package/dist/cjs/wm-progress-indicator_3.cjs.entry.js +7 -9
- package/dist/cjs/wm-search.cjs.entry.js +6 -7
- package/dist/cjs/wm-snackbar.cjs.entry.js +13 -9
- package/dist/cjs/wm-tab-item_3.cjs.entry.js +14 -12
- package/dist/cjs/wm-tag-input.cjs.entry.js +29 -24
- package/dist/cjs/wm-tag-option.cjs.entry.js +2 -2
- package/dist/cjs/wm-textarea.cjs.entry.js +5 -6
- package/dist/cjs/wm-timepicker.cjs.entry.js +5 -6
- package/dist/cjs/wm-toggletip.cjs.entry.js +6 -7
- package/dist/cjs/wm-uploader.cjs.entry.js +6 -7
- package/dist/cjs/wm-wrapper.cjs.entry.js +1 -1
- package/dist/collection/collection-manifest.json +2 -2
- package/dist/collection/components/charts/chartFunctions.js +29 -9
- package/dist/collection/components/charts/chartFunctions.spec.js +16 -0
- package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.e2e.js +81 -0
- package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.js +2 -2
- package/dist/collection/components/charts/screenshots.e2e.js +96 -0
- package/dist/collection/components/charts/wm-chart/wm-chart.e2e.js +213 -0
- package/dist/collection/components/charts/wm-chart/wm-chart.js +10 -3
- package/dist/collection/components/charts/wm-chart/wm-chart.spec.js +37 -0
- package/dist/collection/components/charts/wm-line-chart/wm-line-chart.e2e.js +176 -0
- package/dist/collection/components/charts/wm-line-chart/wm-line-chart.js +14 -13
- package/dist/collection/components/charts/wm-line-chart/wm-line-chart.spec.js +163 -0
- package/dist/collection/components/charts/wm-progress-monitor/wm-progress-indicator.js +1 -1
- package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.e2e.js +69 -0
- package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.js +1 -1
- package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.spec.js +79 -0
- package/dist/collection/components/datepickers/priv-calendar/priv-calendar.js +2 -2
- package/dist/collection/components/datepickers/priv-calendar/priv-calendar.spec.js +89 -0
- package/dist/collection/components/datepickers/wm-date-range.e2e.js +443 -0
- package/dist/collection/components/datepickers/wm-date-range.js +26 -19
- package/dist/collection/components/datepickers/wm-date-range.spec.js +22 -0
- package/dist/collection/components/datepickers/wm-datepicker.e2e.js +382 -0
- package/dist/collection/components/datepickers/wm-datepicker.js +13 -17
- package/dist/collection/components/datepickers/wm-datepicker.spec.js +21 -0
- package/dist/collection/components/selects/priv-option-list/priv-option-list.js +16 -55
- package/dist/collection/components/selects/wm-nested-select/wm-nested-select.js +17 -56
- package/dist/collection/components/selects/wm-optgroup/wm-optgroup.js +1 -1
- package/dist/collection/components/selects/wm-option/wm-option.e2e.js +22 -0
- package/dist/collection/components/selects/wm-option/wm-option.js +1 -1
- package/dist/collection/components/selects/wm-option/wm-option.spec.js +63 -0
- package/dist/collection/components/selects/wm-select/wm-select.e2e.js +521 -0
- package/dist/collection/components/selects/wm-select/wm-select.js +10 -22
- package/dist/collection/components/selects/wm-select/wm-select.spec.js +271 -0
- package/dist/collection/components/wm-action-menu/wm-action-menu.e2e.js +200 -0
- package/dist/collection/components/wm-action-menu/wm-action-menu.js +1 -1
- package/dist/collection/components/wm-action-menu/wm-action-menu.spec.js +48 -0
- package/dist/collection/components/wm-button/wm-button.e2e.js +55 -0
- package/dist/collection/components/wm-button/wm-button.js +1 -1
- package/dist/collection/components/wm-button/wm-button.spec.js +74 -0
- package/dist/collection/components/wm-file/wm-file.js +1 -1
- package/dist/collection/components/wm-file/wm-file.spec.js +194 -0
- package/dist/collection/components/wm-file-list/wm-file-list.js +1 -1
- package/dist/collection/components/wm-file-list/wm-file-list.spec.js +69 -0
- package/dist/collection/components/wm-input/wm-input.e2e.js +32 -0
- package/dist/collection/components/wm-input/wm-input.js +1 -1
- package/dist/collection/components/wm-input/wm-input.spec.js +173 -0
- package/dist/collection/components/wm-menuitem/wm-menuitem.e2e.js +23 -0
- package/dist/collection/components/wm-menuitem/wm-menuitem.js +1 -1
- package/dist/collection/components/wm-menuitem/wm-menuitem.spec.js +54 -0
- package/dist/collection/components/wm-modal/wm-modal-footer.css +9 -16
- package/dist/collection/components/wm-modal/wm-modal-footer.js +1 -1
- package/dist/collection/components/wm-modal/wm-modal-footer.spec.js +11 -0
- package/dist/collection/components/wm-modal/wm-modal-header.css +1 -3
- package/dist/collection/components/wm-modal/wm-modal-header.js +1 -1
- package/dist/collection/components/wm-modal/wm-modal-header.spec.js +8 -0
- package/dist/collection/components/wm-modal/wm-modal.css +3 -2
- package/dist/collection/components/wm-modal/wm-modal.e2e.js +104 -0
- package/dist/collection/components/wm-modal/wm-modal.js +2 -2
- package/dist/collection/components/wm-modal/wm-modal.spec.js +30 -0
- package/dist/collection/components/wm-modal-pss/wm-modal-pss-footer.js +1 -1
- package/dist/collection/components/wm-modal-pss/wm-modal-pss-header.js +1 -1
- package/dist/collection/components/wm-modal-pss/wm-modal-pss.js +2 -2
- package/dist/collection/components/wm-navigation/wm-navigation-hamburger.js +1 -1
- package/dist/collection/components/wm-navigation/wm-navigation-item.js +1 -1
- package/dist/collection/components/wm-navigation/wm-navigation.e2e.js +102 -0
- package/dist/collection/components/wm-navigation/wm-navigation.js +2 -2
- package/dist/collection/components/wm-navigation/wm-navigation.spec.js +91 -0
- package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.e2e.js +50 -0
- package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +1 -1
- package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +1 -1
- package/dist/collection/components/wm-navigator/wm-navigator.e2e.js +209 -0
- package/dist/collection/components/wm-navigator/wm-navigator.spec.js +177 -0
- package/dist/collection/components/wm-pagination/wm-pagination.e2e.js +312 -0
- package/dist/collection/components/wm-pagination/wm-pagination.js +63 -11
- package/dist/collection/components/wm-search/wm-search.e2e.js +76 -0
- package/dist/collection/components/wm-search/wm-search.js +4 -5
- package/dist/collection/components/wm-search/wm-search.spec.js +71 -0
- package/dist/collection/components/wm-snackbar/wm-snackbar.e2e.js +112 -0
- package/dist/collection/components/wm-snackbar/wm-snackbar.js +10 -5
- package/dist/collection/components/wm-snackbar/wm-snackbar.spec.js +9 -0
- package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +1 -1
- package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +8 -3
- package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +1 -1
- package/dist/collection/components/wm-tabs/wm-tabs.e2e.js +91 -0
- package/dist/collection/components/wm-tabs/wm-tabs.spec.js +12 -0
- package/dist/collection/components/wm-tag-input/wm-tag-input.e2e.js +204 -0
- package/dist/collection/components/wm-tag-input/wm-tag-input.js +25 -19
- package/dist/collection/components/wm-tag-input/wm-tag-input.spec.js +195 -0
- package/dist/collection/components/wm-textarea/wm-textarea.e2e.js +41 -0
- package/dist/collection/components/wm-textarea/wm-textarea.js +1 -1
- package/dist/collection/components/wm-textarea/wm-textarea.spec.js +79 -0
- package/dist/collection/components/wm-timepicker/wm-timepicker.e2e.js +163 -0
- package/dist/collection/components/wm-timepicker/wm-timepicker.js +8 -11
- package/dist/collection/components/wm-timepicker/wm-timepicker.spec.js +147 -0
- package/dist/collection/components/wm-toggletip/wm-toggletip.css +0 -1
- package/dist/collection/components/wm-toggletip/wm-toggletip.e2e.js +69 -0
- package/dist/collection/components/wm-toggletip/wm-toggletip.js +2 -2
- package/dist/collection/components/wm-toggletip/wm-toggletip.spec.js +21 -0
- package/dist/collection/components/wm-uploader/wm-uploader.e2e.js +70 -0
- package/dist/collection/components/wm-uploader/wm-uploader.js +2 -2
- package/dist/collection/components/wm-uploader/wm-uploader.spec.js +234 -0
- package/dist/collection/global/functions.spec.js +126 -0
- package/dist/collection/global/intl.js +102 -0
- package/dist/collection/lang/lang.spec.js +20 -0
- package/dist/collection/lang/piglatin.js +9 -1
- package/dist/esm/{chartFunctions-1478f4db.js → chartFunctions-9099c7e9.js} +31 -11
- package/dist/esm/{functions-f53b3537.js → functions-00e1916b.js} +1588 -371
- package/dist/{cjs/app-globals-b8352f28.js → esm/global-c76064cb.js} +1 -10
- package/dist/esm/index-558b5a82.js +2618 -0
- package/dist/esm/{intl-6426ba51.js → intl-a6f16883.js} +104 -2
- package/dist/esm/loader.js +4 -5
- package/dist/esm/priv-calendar.entry.js +5 -6
- package/dist/esm/priv-chart-popover.entry.js +5 -6
- package/dist/esm/priv-navigator-button.entry.js +3 -4
- package/dist/esm/priv-navigator-item.entry.js +3 -4
- package/dist/esm/priv-option-list.entry.js +14 -52
- package/dist/esm/ripple.js +12 -13
- package/dist/esm/wm-action-menu_2.entry.js +6 -8
- package/dist/esm/wm-button.entry.js +4 -5
- package/dist/esm/wm-chart-slice.entry.js +1 -1
- package/dist/esm/wm-chart.entry.js +15 -9
- package/dist/esm/wm-date-range.entry.js +21 -11
- package/dist/esm/wm-datepicker.entry.js +8 -9
- package/dist/esm/wm-file-list.entry.js +3 -4
- package/dist/esm/wm-file.entry.js +4 -5
- package/dist/esm/wm-input.entry.js +5 -6
- package/dist/esm/wm-line-chart.entry.js +18 -18
- package/dist/esm/wm-modal-pss_3.entry.js +10 -13
- package/dist/esm/wm-modal_3.entry.js +13 -16
- package/dist/esm/wm-navigation_3.entry.js +10 -13
- package/dist/esm/wm-navigator.entry.js +3 -4
- package/dist/esm/wm-nested-select.entry.js +16 -56
- package/dist/esm/wm-optgroup.entry.js +4 -5
- package/dist/esm/wm-option_2.entry.js +11 -25
- package/dist/esm/wm-pagination.entry.js +65 -14
- package/dist/esm/wm-progress-indicator_3.entry.js +7 -9
- package/dist/esm/wm-search.entry.js +6 -7
- package/dist/esm/wm-snackbar.entry.js +13 -9
- package/dist/esm/wm-tab-item_3.entry.js +14 -12
- package/dist/esm/wm-tag-input.entry.js +29 -24
- package/dist/esm/wm-tag-option.entry.js +2 -2
- package/dist/esm/wm-textarea.entry.js +5 -6
- package/dist/esm/wm-timepicker.entry.js +5 -6
- package/dist/esm/wm-toggletip.entry.js +6 -7
- package/dist/esm/wm-uploader.entry.js +6 -7
- package/dist/esm/wm-wrapper.entry.js +1 -1
- package/dist/esm-es5/chartFunctions-9099c7e9.js +1 -0
- package/dist/esm-es5/functions-00e1916b.js +1 -0
- package/dist/esm-es5/global-c76064cb.js +1 -0
- package/dist/esm-es5/index-558b5a82.js +1 -0
- package/dist/esm-es5/intl-a6f16883.js +1 -0
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/priv-calendar.entry.js +1 -1
- package/dist/esm-es5/priv-chart-popover.entry.js +1 -1
- package/dist/esm-es5/priv-navigator-button.entry.js +1 -1
- package/dist/esm-es5/priv-navigator-item.entry.js +1 -1
- package/dist/esm-es5/priv-option-list.entry.js +1 -1
- package/dist/esm-es5/ripple.js +1 -1
- package/dist/esm-es5/wm-action-menu_2.entry.js +1 -1
- package/dist/esm-es5/wm-button.entry.js +1 -1
- package/dist/esm-es5/wm-chart-slice.entry.js +1 -1
- package/dist/esm-es5/wm-chart.entry.js +1 -1
- package/dist/esm-es5/wm-date-range.entry.js +1 -1
- package/dist/esm-es5/wm-datepicker.entry.js +1 -1
- package/dist/esm-es5/wm-file-list.entry.js +1 -1
- package/dist/esm-es5/wm-file.entry.js +1 -1
- package/dist/esm-es5/wm-input.entry.js +1 -1
- package/dist/esm-es5/wm-line-chart.entry.js +1 -1
- package/dist/esm-es5/wm-modal-pss_3.entry.js +1 -1
- package/dist/esm-es5/wm-modal_3.entry.js +1 -1
- package/dist/esm-es5/wm-navigation_3.entry.js +1 -1
- package/dist/esm-es5/wm-navigator.entry.js +1 -1
- package/dist/esm-es5/wm-nested-select.entry.js +1 -1
- package/dist/esm-es5/wm-optgroup.entry.js +1 -1
- package/dist/esm-es5/wm-option_2.entry.js +1 -1
- package/dist/esm-es5/wm-pagination.entry.js +1 -1
- package/dist/esm-es5/wm-progress-indicator_3.entry.js +1 -1
- package/dist/esm-es5/wm-search.entry.js +1 -1
- package/dist/esm-es5/wm-snackbar.entry.js +1 -1
- package/dist/esm-es5/wm-tab-item_3.entry.js +1 -1
- package/dist/esm-es5/wm-tag-input.entry.js +1 -1
- package/dist/esm-es5/wm-tag-option.entry.js +1 -1
- package/dist/esm-es5/wm-textarea.entry.js +1 -1
- package/dist/esm-es5/wm-timepicker.entry.js +1 -1
- package/dist/esm-es5/wm-toggletip.entry.js +1 -1
- package/dist/esm-es5/wm-uploader.entry.js +1 -1
- package/dist/esm-es5/wm-wrapper.entry.js +1 -1
- package/dist/loader/cdn.js +2 -1
- package/dist/loader/index.cjs.js +2 -1
- package/dist/loader/index.d.ts +0 -3
- package/dist/loader/index.es2017.js +2 -1
- package/dist/loader/index.js +2 -1
- package/dist/ripple/p-05ae54d7.entry.js +1 -0
- package/dist/ripple/{p-fdfa3579.system.entry.js → p-0d89d63c.system.entry.js} +1 -1
- package/dist/ripple/p-118c47eb.system.entry.js +1 -0
- package/dist/ripple/{p-658f146a.system.entry.js → p-1a4b6b02.system.entry.js} +1 -1
- package/dist/ripple/{p-a0edf336.system.entry.js → p-1a4b7504.system.entry.js} +1 -1
- package/dist/ripple/{p-165b5d3d.system.entry.js → p-1a71d867.system.entry.js} +1 -1
- package/dist/ripple/p-1a951dfb.entry.js +1 -0
- package/dist/ripple/{p-28f9e202.system.entry.js → p-1c8f550f.system.entry.js} +1 -1
- package/dist/ripple/p-1f751b87.js +1 -0
- package/dist/ripple/p-1fac5bf9.js +1 -0
- package/dist/ripple/{p-03fafb82.entry.js → p-20a8f732.system.entry.js} +1 -1
- package/dist/ripple/{p-3b5d106d.entry.js → p-249b56fb.entry.js} +1 -1
- package/dist/ripple/p-249d13a1.system.entry.js +1 -0
- package/dist/ripple/p-26906899.entry.js +1 -0
- package/dist/ripple/{p-486b3b56.system.entry.js → p-28119645.system.entry.js} +1 -1
- package/dist/ripple/{p-a2544443.system.js → p-2f37f3ee.system.js} +1 -1
- package/dist/ripple/{p-823d7b4e.system.entry.js → p-32bf3f5b.system.entry.js} +1 -1
- package/dist/ripple/{p-20b137a3.system.entry.js → p-335c03d3.system.entry.js} +1 -1
- package/dist/ripple/p-363b534b.entry.js +1 -0
- package/dist/ripple/p-393e4636.js +1 -0
- package/dist/ripple/p-39f79d71.system.entry.js +1 -0
- package/dist/ripple/{p-ff60375d.system.entry.js → p-3a231f4b.system.entry.js} +1 -1
- package/dist/ripple/{p-55f8aa05.entry.js → p-3d4bb85f.entry.js} +1 -1
- package/dist/ripple/p-4228de00.entry.js +1 -0
- package/dist/ripple/{p-13b1d775.entry.js → p-48e09589.entry.js} +1 -1
- package/dist/ripple/p-4f8fe1d1.system.js +1 -0
- package/dist/ripple/{p-02e60a11.system.entry.js → p-522ecb7d.system.entry.js} +1 -1
- package/dist/ripple/{p-ee825214.entry.js → p-54d6f0f9.entry.js} +1 -1
- package/dist/ripple/p-568c595f.js +2 -0
- package/dist/ripple/p-56aeee6e.system.entry.js +1 -0
- package/dist/ripple/p-5e6a4f70.system.js +1 -0
- package/dist/ripple/{p-82819500.system.entry.js → p-5f082360.system.entry.js} +1 -1
- package/dist/ripple/p-5f5fe905.js +1 -0
- package/dist/ripple/p-617c2c75.entry.js +1 -0
- package/dist/ripple/{p-4fbe205e.system.entry.js → p-6524c53e.system.entry.js} +1 -1
- package/dist/ripple/{p-043901ab.system.entry.js → p-65d26233.system.entry.js} +1 -1
- package/dist/ripple/p-6834a6d3.entry.js +1 -0
- package/dist/ripple/{p-81ac8d49.entry.js → p-68e04222.entry.js} +1 -1
- package/dist/ripple/{p-f778baf4.system.entry.js → p-68fddfaa.system.entry.js} +1 -1
- package/dist/ripple/{p-e2fbed8c.system.entry.js → p-694903e6.system.entry.js} +1 -1
- package/dist/ripple/p-73ca2f26.system.js +1 -0
- package/dist/ripple/{p-1f174e18.system.entry.js → p-7b6a65f8.system.entry.js} +1 -1
- package/dist/ripple/{p-a9a7731b.system.entry.js → p-7b7e1eb5.system.entry.js} +1 -1
- package/dist/ripple/{p-cd0cc88d.entry.js → p-88ebddd7.entry.js} +1 -1
- package/dist/ripple/{p-791513e7.entry.js → p-8c1d27a7.entry.js} +1 -1
- package/dist/ripple/{p-ccae5bec.entry.js → p-8e9c24f3.entry.js} +1 -1
- package/dist/ripple/{p-b16f07f1.system.entry.js → p-8f836507.system.entry.js} +1 -1
- package/dist/ripple/p-94495341.entry.js +1 -0
- package/dist/ripple/{p-76f9acec.entry.js → p-958331bf.entry.js} +1 -1
- package/dist/ripple/p-9872623b.entry.js +1 -0
- package/dist/ripple/{p-e6e36701.system.entry.js → p-9ab3c088.system.entry.js} +1 -1
- package/dist/ripple/p-9aedd599.entry.js +1 -0
- package/dist/ripple/p-9b848151.entry.js +1 -0
- package/dist/ripple/{p-3376581a.system.entry.js → p-a04ef164.system.entry.js} +1 -1
- package/dist/ripple/{p-02bd68af.system.entry.js → p-a78bb423.system.entry.js} +1 -1
- package/dist/ripple/{p-0d163672.system.entry.js → p-a880d9a0.system.entry.js} +1 -1
- package/dist/ripple/p-ab8d78cc.system.js +2 -0
- package/dist/ripple/p-adc254e6.entry.js +1 -0
- package/dist/ripple/p-b165d61a.entry.js +1 -0
- package/dist/ripple/p-b39377c7.entry.js +1 -0
- package/dist/ripple/p-b9bca547.entry.js +1 -0
- package/dist/ripple/p-bae2c236.entry.js +1 -0
- package/dist/ripple/{p-8634abad.system.entry.js → p-c53f3704.system.entry.js} +1 -1
- package/dist/ripple/p-c56ff16f.entry.js +1 -0
- package/dist/ripple/{p-94fbf6f6.system.entry.js → p-c8cf09a2.system.entry.js} +1 -1
- package/dist/ripple/p-cbdceb6e.entry.js +1 -0
- package/dist/ripple/p-cc813406.system.js +1 -0
- package/dist/ripple/{p-529f179c.system.entry.js → p-d20a0f0c.system.entry.js} +1 -1
- package/dist/ripple/p-d6111226.entry.js +1 -0
- package/dist/ripple/{p-f28106ea.entry.js → p-da68c87c.entry.js} +1 -1
- package/dist/ripple/{p-e8cfa832.entry.js → p-ddef82fa.system.entry.js} +1 -1
- package/dist/ripple/p-dee6d5a3.entry.js +1 -0
- package/dist/ripple/p-e55d5371.entry.js +1 -0
- package/dist/ripple/{p-7959c4bd.system.entry.js → p-e8c22f01.system.entry.js} +1 -1
- package/dist/ripple/p-f555831b.entry.js +1 -0
- package/dist/ripple/{p-226217d3.system.entry.js → p-f5c40e9e.system.entry.js} +1 -1
- package/dist/ripple/p-f9cade98.entry.js +1 -0
- package/dist/ripple/{p-fc7965e4.system.entry.js → p-fa09191b.system.entry.js} +1 -1
- package/dist/ripple/{p-233f14ec.system.entry.js → p-fdfca58b.entry.js} +1 -1
- package/dist/ripple/ripple.esm.js +1 -1
- package/dist/ripple/ripple.js +1 -1
- package/dist/types/components/selects/priv-option-list/priv-option-list.d.ts +0 -6
- package/dist/types/components/wm-pagination/wm-pagination.d.ts +6 -0
- package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +1 -0
- package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +1 -0
- package/dist/types/components/wm-tag-input/wm-tag-input.d.ts +2 -1
- package/dist/types/global/intl.d.ts +22 -0
- package/dist/types/stencil-public-runtime.d.ts +10 -3
- package/package.json +2 -2
- package/dist/cjs/index-788526f5.js +0 -1859
- package/dist/esm/index-130e07bb.js +0 -1828
- package/dist/esm-es5/app-globals-f3dbaf3e.js +0 -1
- package/dist/esm-es5/chartFunctions-1478f4db.js +0 -1
- package/dist/esm-es5/functions-f53b3537.js +0 -1
- package/dist/esm-es5/index-130e07bb.js +0 -1
- package/dist/esm-es5/intl-6426ba51.js +0 -1
- package/dist/ripple/p-243a7a17.system.entry.js +0 -1
- package/dist/ripple/p-263e42e0.entry.js +0 -1
- package/dist/ripple/p-27ff3a85.js +0 -1
- package/dist/ripple/p-2c8153c1.entry.js +0 -1
- package/dist/ripple/p-368e9ee9.entry.js +0 -1
- package/dist/ripple/p-3a2a3b70.entry.js +0 -1
- package/dist/ripple/p-45b5d2d2.entry.js +0 -1
- package/dist/ripple/p-49e24926.entry.js +0 -1
- package/dist/ripple/p-50294e3f.entry.js +0 -1
- package/dist/ripple/p-53400bc4.system.entry.js +0 -1
- package/dist/ripple/p-58734b13.entry.js +0 -1
- package/dist/ripple/p-59cc46a6.entry.js +0 -1
- package/dist/ripple/p-5c62e26d.entry.js +0 -1
- package/dist/ripple/p-6136d0d7.entry.js +0 -1
- package/dist/ripple/p-66141f19.entry.js +0 -1
- package/dist/ripple/p-713ea307.entry.js +0 -1
- package/dist/ripple/p-727175e1.system.entry.js +0 -1
- package/dist/ripple/p-73056e10.system.js +0 -1
- package/dist/ripple/p-7a1bb29b.js +0 -1
- package/dist/ripple/p-864158de.system.entry.js +0 -1
- package/dist/ripple/p-8c95493c.js +0 -1
- package/dist/ripple/p-94dc80a0.entry.js +0 -1
- package/dist/ripple/p-9b739280.entry.js +0 -1
- package/dist/ripple/p-a280d710.entry.js +0 -1
- package/dist/ripple/p-b78d8ab1.system.js +0 -1
- package/dist/ripple/p-c550716e.js +0 -1
- package/dist/ripple/p-cef8a45b.system.js +0 -2
- package/dist/ripple/p-d530c703.entry.js +0 -1
- package/dist/ripple/p-d96291e7.entry.js +0 -1
- package/dist/ripple/p-d9da0502.js +0 -2
- package/dist/ripple/p-e973024a.entry.js +0 -1
- package/dist/ripple/p-ed24dc42.entry.js +0 -1
- package/dist/ripple/p-ef75bf23.system.entry.js +0 -1
- package/dist/ripple/p-f471ee29.system.js +0 -1
- package/dist/ripple/p-f66480de.entry.js +0 -1
- package/dist/ripple/p-f9a71cf6.entry.js +0 -1
- package/dist/ripple/p-ffbb9fc0.system.js +0 -1
|
@@ -275,13 +275,13 @@ export class Timepicker {
|
|
|
275
275
|
return this.times.map((time, index) => (h("li", { id: `option${index + 1}`, "data-time": time, role: "option", onClick: () => this.handleOptionClick(time) }, this.reformatTimeInternal("12", time))));
|
|
276
276
|
}
|
|
277
277
|
render() {
|
|
278
|
-
return (h(Host, {
|
|
278
|
+
return (h(Host, { onBlur: () => this.close(false) }, h("div", { class: `wrapper label-${this.labelPosition} ${!!this.errorMessage ? "invalid" : ""}`, ref: (t) => (this.tpWrapper = t) }, h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { id: "label", class: "label", htmlFor: "time-input" }, this.label, this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))), h("div", null, h("div", { class: "inner-wrapper" }, h("input", { id: "time-input", "aria-label": this.label, "aria-describedby": "error", ref: (el) => (this.inputEl = el), onBlur: () => this.handleInputBlur(), onInput: () => (this.value = this.inputEl.value), disabled: this.isDisabled, "aria-required": this.requiredField ? "true" : null, placeholder: this.timeFormat, autocomplete: "off", value: this.value, onFocus: () => this.tpWrapper.classList.add("focus") }), h("button", { id: "btn", ref: (el) => (this.buttonEl = el), disabled: this.isDisabled, "aria-controls": "list", "aria-expanded": this.isExpanded ? "true" : "false", "aria-label": this.buttonAriaLabel, "aria-describedby": "time-input", onClick: () => (this.isExpanded ? this.close() : this.open()),
|
|
279
279
|
// This addresses an issue in Safari, where clicking buttons does not focus them
|
|
280
280
|
// if the button does not receive focus when clicked, Timepicker incorrectly emits a blur event
|
|
281
281
|
onMouseDown: (ev) => {
|
|
282
282
|
ev.preventDefault();
|
|
283
283
|
this.buttonEl.focus();
|
|
284
|
-
} }, h("span", {
|
|
284
|
+
} }, h("span", { class: "svg-icon svg-time" })), h("ul", { class: `options ${this.isExpanded ? "open" : ""} ${this.openUp ? "upwards" : ""}`, id: "list", role: "listbox", "aria-labelledby": "label", "aria-describedby": this.isExpanded ? "collapsed" : null, tabindex: -1, ref: (el) => (this.optionsEl = el) }, this.renderOptions())), h("div", { id: "error", class: "error" }, this.errorMessage)), h("div", { id: "live-polite", class: "sr-only", "aria-live": "polite", "aria-atomic": "true", ref: (el) => (this.liveRegionEl = el) }))));
|
|
285
285
|
}
|
|
286
286
|
static get is() { return "wm-timepicker"; }
|
|
287
287
|
static get encapsulation() { return "shadow"; }
|
|
@@ -468,9 +468,8 @@ export class Timepicker {
|
|
|
468
468
|
"complexType": {
|
|
469
469
|
"signature": "(input: string) => Promise<boolean>",
|
|
470
470
|
"parameters": [{
|
|
471
|
-
"
|
|
472
|
-
"
|
|
473
|
-
"docs": ""
|
|
471
|
+
"tags": [],
|
|
472
|
+
"text": ""
|
|
474
473
|
}],
|
|
475
474
|
"references": {
|
|
476
475
|
"Promise": {
|
|
@@ -489,13 +488,11 @@ export class Timepicker {
|
|
|
489
488
|
"complexType": {
|
|
490
489
|
"signature": "(format: \"12\" | \"24\", time: TimeFormat12 | TimeFormat24) => Promise<string>",
|
|
491
490
|
"parameters": [{
|
|
492
|
-
"
|
|
493
|
-
"
|
|
494
|
-
"docs": ""
|
|
491
|
+
"tags": [],
|
|
492
|
+
"text": ""
|
|
495
493
|
}, {
|
|
496
|
-
"
|
|
497
|
-
"
|
|
498
|
-
"docs": ""
|
|
494
|
+
"tags": [],
|
|
495
|
+
"text": ""
|
|
499
496
|
}],
|
|
500
497
|
"references": {
|
|
501
498
|
"Promise": {
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { newSpecPage } from "@stencil/core/testing";
|
|
2
|
+
import { Timepicker } from "./wm-timepicker";
|
|
3
|
+
describe("timepicker", () => {
|
|
4
|
+
let page;
|
|
5
|
+
// let timepicker: any;
|
|
6
|
+
beforeEach(async () => {
|
|
7
|
+
page = await newSpecPage({
|
|
8
|
+
components: [Timepicker],
|
|
9
|
+
html: "<wm-timepicker label='timepicker'></wm-timepicker>",
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
it("builds", async () => {
|
|
13
|
+
expect(page.root).toMatchSnapshot();
|
|
14
|
+
});
|
|
15
|
+
it("prevents user actions when disabled", async () => {
|
|
16
|
+
await page.setContent(`<wm-timepicker label='timepicker' disabled></wm-timepicker>`);
|
|
17
|
+
const input = await page.root.shadowRoot.querySelector("input");
|
|
18
|
+
const button = await page.root.shadowRoot.querySelector("button");
|
|
19
|
+
expect(input).toHaveAttribute("disabled");
|
|
20
|
+
expect(button).toHaveAttribute("disabled");
|
|
21
|
+
});
|
|
22
|
+
it("validates input", async () => {
|
|
23
|
+
const timepicker = new Timepicker();
|
|
24
|
+
// user passes hour
|
|
25
|
+
expect(await timepicker.isValidTime("0")).toBe(true);
|
|
26
|
+
expect(await timepicker.isValidTime("24")).toBe(true);
|
|
27
|
+
expect(await timepicker.isValidTime("8p")).toBe(true);
|
|
28
|
+
expect(await timepicker.isValidTime("12 a")).toBe(true);
|
|
29
|
+
expect(await timepicker.isValidTime("02am")).toBe(true);
|
|
30
|
+
expect(await timepicker.isValidTime("8:")).toBe(true);
|
|
31
|
+
// user passes hour and minutes
|
|
32
|
+
expect(await timepicker.isValidTime("1223")).toBe(true);
|
|
33
|
+
expect(await timepicker.isValidTime("927a")).toBe(true);
|
|
34
|
+
expect(await timepicker.isValidTime("12:12pm")).toBe(true);
|
|
35
|
+
expect(await timepicker.isValidTime("3:45 am")).toBe(true);
|
|
36
|
+
// rejected
|
|
37
|
+
expect(await timepicker.isValidTime("6f")).toBe(false);
|
|
38
|
+
expect(await timepicker.isValidTime("12m")).toBe(false);
|
|
39
|
+
expect(await timepicker.isValidTime("a")).toBe(false);
|
|
40
|
+
expect(await timepicker.isValidTime("92")).toBe(false);
|
|
41
|
+
expect(await timepicker.isValidTime("88:88")).toBe(false);
|
|
42
|
+
expect(await timepicker.isValidTime("999pm")).toBe(false);
|
|
43
|
+
expect(await timepicker.isValidTime("o1236")).toBe(false);
|
|
44
|
+
expect(await timepicker.isValidTime("12:45fm")).toBe(false);
|
|
45
|
+
expect(await timepicker.isValidTime("12342")).toBe(false);
|
|
46
|
+
expect(await timepicker.isValidTime("123:")).toBe(false);
|
|
47
|
+
expect(await timepicker.isValidTime("3:123")).toBe(false);
|
|
48
|
+
expect(await timepicker.isValidTime("4:60 pm")).toBe(false);
|
|
49
|
+
// weird edge cases
|
|
50
|
+
expect(await timepicker.isValidTime("17am")).toBe(false);
|
|
51
|
+
expect(await timepicker.isValidTime("17pm")).toBe(false);
|
|
52
|
+
// this is not caught by the regex, so we handle it later
|
|
53
|
+
expect(await timepicker.isValidTime("0pm")).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it("reformats", async () => {
|
|
56
|
+
const timepicker = new Timepicker();
|
|
57
|
+
expect(await timepicker.reformatTime("12", "00:00")).toBe("12:00 AM");
|
|
58
|
+
//@ts-ignore
|
|
59
|
+
expect(await timepicker.reformatTime("12", "12:00am")).toBe("12:00 AM");
|
|
60
|
+
//@ts-ignore
|
|
61
|
+
expect(await timepicker.reformatTime("12", "12:00pm")).toBe("12:00 PM");
|
|
62
|
+
expect(await timepicker.reformatTime("12", "24:00")).toBe("12:00 AM");
|
|
63
|
+
expect(await timepicker.reformatTime("12", "17:00")).toBe("05:00 PM");
|
|
64
|
+
expect(await timepicker.reformatTime("12", "7:00 am")).toBe("07:00 AM");
|
|
65
|
+
expect(await timepicker.reformatTime("12", "7 : 35")).toBe("07:35 AM");
|
|
66
|
+
expect(await timepicker.reformatTime("24", "0:00")).toBe("00:00");
|
|
67
|
+
//@ts-ignore
|
|
68
|
+
expect(await timepicker.reformatTime("24", "12:00am")).toBe("00:00");
|
|
69
|
+
//@ts-ignore
|
|
70
|
+
expect(await timepicker.reformatTime("24", "12:00pm")).toBe("12:00");
|
|
71
|
+
expect(await timepicker.reformatTime("24", "24:00")).toBe("00:00");
|
|
72
|
+
//@ts-ignore
|
|
73
|
+
expect(await timepicker.reformatTime("24", "1700")).toBe("17:00");
|
|
74
|
+
//@ts-ignore
|
|
75
|
+
expect(await timepicker.reformatTime("24", "700a")).toBe("07:00");
|
|
76
|
+
expect(await timepicker.reformatTime("24", "7 :00 pm")).toBe("19:00");
|
|
77
|
+
expect(await timepicker.reformatTime("24", "17: 35")).toBe("17:35");
|
|
78
|
+
});
|
|
79
|
+
it("finds nearest time interval", async () => {
|
|
80
|
+
const timepicker = new Timepicker();
|
|
81
|
+
expect(await timepicker.findNearestTimeInterval("00:07")).toBe("00:00");
|
|
82
|
+
expect(await timepicker.findNearestTimeInterval("01:08")).toBe("01:15");
|
|
83
|
+
expect(await timepicker.findNearestTimeInterval("01:15")).toBe("01:15");
|
|
84
|
+
expect(await timepicker.findNearestTimeInterval("02:22")).toBe("02:15");
|
|
85
|
+
expect(await timepicker.findNearestTimeInterval("03:23")).toBe("03:30");
|
|
86
|
+
expect(await timepicker.findNearestTimeInterval("03:30")).toBe("03:30");
|
|
87
|
+
expect(await timepicker.findNearestTimeInterval("04:37")).toBe("04:30");
|
|
88
|
+
expect(await timepicker.findNearestTimeInterval("15:38")).toBe("15:45");
|
|
89
|
+
expect(await timepicker.findNearestTimeInterval("15:45")).toBe("15:45");
|
|
90
|
+
expect(await timepicker.findNearestTimeInterval("16:52")).toBe("16:45");
|
|
91
|
+
expect(await timepicker.findNearestTimeInterval("17:53")).toBe("18:00");
|
|
92
|
+
expect(await timepicker.findNearestTimeInterval("18:00")).toBe("18:00");
|
|
93
|
+
expect(await timepicker.findNearestTimeInterval("23:59")).toBe("00:00");
|
|
94
|
+
// edge case regarding leading zeroes
|
|
95
|
+
expect(await timepicker.findNearestTimeInterval("09:59")).toBe("10:00");
|
|
96
|
+
});
|
|
97
|
+
it("splits time", () => {
|
|
98
|
+
const timepicker = new Timepicker();
|
|
99
|
+
expect(timepicker.splitTime("5:37")).toStrictEqual([5, "37", undefined]);
|
|
100
|
+
expect(timepicker.splitTime("5:37 am")).toStrictEqual([5, "37", "am"]);
|
|
101
|
+
expect(timepicker.splitTime("09:00")).toStrictEqual([9, "00", undefined]);
|
|
102
|
+
expect(timepicker.splitTime("13:52")).toStrictEqual([13, "52", undefined]);
|
|
103
|
+
// edge case
|
|
104
|
+
//@ts-ignore
|
|
105
|
+
expect(timepicker.splitTime("0pm")).toStrictEqual([0, "00", "AM"]);
|
|
106
|
+
});
|
|
107
|
+
it("generates times", () => {
|
|
108
|
+
const timepicker = new Timepicker();
|
|
109
|
+
//prettier-ignore
|
|
110
|
+
expect(timepicker.generateTimeIntervals()).toStrictEqual([
|
|
111
|
+
"00:00", "00:15", "00:30", "00:45",
|
|
112
|
+
"01:00", "01:15", "01:30", "01:45",
|
|
113
|
+
"02:00", "02:15", "02:30", "02:45",
|
|
114
|
+
"03:00", "03:15", "03:30", "03:45",
|
|
115
|
+
"04:00", "04:15", "04:30", "04:45",
|
|
116
|
+
"05:00", "05:15", "05:30", "05:45",
|
|
117
|
+
"06:00", "06:15", "06:30", "06:45",
|
|
118
|
+
"07:00", "07:15", "07:30", "07:45",
|
|
119
|
+
"08:00", "08:15", "08:30", "08:45",
|
|
120
|
+
"09:00", "09:15", "09:30", "09:45",
|
|
121
|
+
"10:00", "10:15", "10:30", "10:45",
|
|
122
|
+
"11:00", "11:15", "11:30", "11:45",
|
|
123
|
+
"12:00", "12:15", "12:30", "12:45",
|
|
124
|
+
"13:00", "13:15", "13:30", "13:45",
|
|
125
|
+
"14:00", "14:15", "14:30", "14:45",
|
|
126
|
+
"15:00", "15:15", "15:30", "15:45",
|
|
127
|
+
"16:00", "16:15", "16:30", "16:45",
|
|
128
|
+
"17:00", "17:15", "17:30", "17:45",
|
|
129
|
+
"18:00", "18:15", "18:30", "18:45",
|
|
130
|
+
"19:00", "19:15", "19:30", "19:45",
|
|
131
|
+
"20:00", "20:15", "20:30", "20:45",
|
|
132
|
+
"21:00", "21:15", "21:30", "21:45",
|
|
133
|
+
"22:00", "22:15", "22:30", "22:45",
|
|
134
|
+
"23:00", "23:15", "23:30", "23:45",
|
|
135
|
+
]);
|
|
136
|
+
});
|
|
137
|
+
it("renders error", async () => {
|
|
138
|
+
await page.setContent(`<wm-timepicker label='timepicker' error-message="There is an error."></wm-timepicker>`);
|
|
139
|
+
const errorEl = page.root.shadowRoot.querySelector(".error");
|
|
140
|
+
expect(errorEl.textContent).toBe("There is an error.");
|
|
141
|
+
});
|
|
142
|
+
it("sets input to required", async () => {
|
|
143
|
+
await page.setContent(`<wm-timepicker label='timepicker' required-field='true'></wm-timepicker>`);
|
|
144
|
+
const input = await page.root.shadowRoot.querySelector("input");
|
|
145
|
+
expect(input).toEqualAttribute("aria-required", "true");
|
|
146
|
+
});
|
|
147
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { newE2EPage } from "@stencil/core/testing";
|
|
2
|
+
import { AxePuppeteer } from "@axe-core/puppeteer";
|
|
3
|
+
describe("wm-toggletip", () => {
|
|
4
|
+
let page;
|
|
5
|
+
beforeEach(async () => {
|
|
6
|
+
page = await newE2EPage();
|
|
7
|
+
});
|
|
8
|
+
it("passes Axe checks", async () => {
|
|
9
|
+
await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
|
|
10
|
+
<wm-toggletip label='More information' tooltip='Further explanation'>Click me</wm-toggletip>
|
|
11
|
+
</main></body></html>`);
|
|
12
|
+
const results = await new AxePuppeteer(page).analyze();
|
|
13
|
+
expect(results.violations.length).toBe(0);
|
|
14
|
+
});
|
|
15
|
+
it("delegates focus", async () => {
|
|
16
|
+
await page.setContent("<wm-toggletip label='label' tooltip='Text'></wm-toggletip>");
|
|
17
|
+
const component = await page.find("wm-toggletip");
|
|
18
|
+
component.focus();
|
|
19
|
+
await page.waitForChanges();
|
|
20
|
+
let activeElNodeName = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.nodeName);
|
|
21
|
+
expect(activeElNodeName).toBe("BUTTON");
|
|
22
|
+
});
|
|
23
|
+
// Enter or click opens tooltip, no change in focus
|
|
24
|
+
// Tab, escape close tooltip
|
|
25
|
+
it("opens and closes properly", async () => {
|
|
26
|
+
await page.setContent(`<wm-toggletip label='More information' tooltip='Further explanation'></wm-toggletip>`);
|
|
27
|
+
const toggletip = await page.find("wm-toggletip >>> .toggletip");
|
|
28
|
+
await page.keyboard.press("Tab");
|
|
29
|
+
await page.waitForChanges();
|
|
30
|
+
await page.keyboard.press("Enter");
|
|
31
|
+
await page.waitForChanges();
|
|
32
|
+
expect(toggletip).not.toHaveClass("hidden");
|
|
33
|
+
// check focus remains on button
|
|
34
|
+
const activeElNodeName = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.nodeName);
|
|
35
|
+
expect(activeElNodeName).toEqual("BUTTON");
|
|
36
|
+
await page.keyboard.press("Escape");
|
|
37
|
+
await page.waitForChanges();
|
|
38
|
+
expect(toggletip).toHaveClass("hidden");
|
|
39
|
+
await page.click("wm-toggletip");
|
|
40
|
+
await page.waitForChanges();
|
|
41
|
+
expect(toggletip).not.toHaveClass("hidden");
|
|
42
|
+
await page.keyboard.press("Tab");
|
|
43
|
+
await page.waitForChanges();
|
|
44
|
+
expect(toggletip).toHaveClass("hidden");
|
|
45
|
+
await page.keyboard.press("Enter");
|
|
46
|
+
await page.waitForChanges();
|
|
47
|
+
await page.mouse.click(-10, -10);
|
|
48
|
+
await page.waitForChanges();
|
|
49
|
+
expect(toggletip).toHaveClass("hidden");
|
|
50
|
+
});
|
|
51
|
+
// test to make sure liveregion is updated properly
|
|
52
|
+
it("updates liveregion", async () => {
|
|
53
|
+
await page.setContent(`<wm-toggletip label='More information' tooltip='Further explanation'></wm-toggletip>`);
|
|
54
|
+
await page.keyboard.press("Tab");
|
|
55
|
+
await page.waitForChanges();
|
|
56
|
+
await page.keyboard.press("Enter");
|
|
57
|
+
await page.waitForChanges();
|
|
58
|
+
const liveRegion = await page.find("wm-toggletip >>> .live-region");
|
|
59
|
+
expect(liveRegion.textContent).toBe("Further explanation");
|
|
60
|
+
});
|
|
61
|
+
it("renders a tooltip", async () => {
|
|
62
|
+
await page.setContent(`<html lang='en'><head><title>Page</title></head><body><div id="tooltip-container"><div id="wm-tooltip" popover="manual" class="wm-tooltip" aria-hidden="true"></div></div><main><h1>Title</h1>
|
|
63
|
+
<wm-toggletip label='More information' tooltip='Further explanation'>Click me</wm-toggletip>
|
|
64
|
+
</main></body></html>`);
|
|
65
|
+
await page.click("wm-toggletip");
|
|
66
|
+
const tooltip = await page.find("#wm-tooltip");
|
|
67
|
+
expect(tooltip.textContent).toEqual("More information");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -162,9 +162,9 @@ export class Toggletip {
|
|
|
162
162
|
}, 10);
|
|
163
163
|
}
|
|
164
164
|
render() {
|
|
165
|
-
return (h(Host, {
|
|
165
|
+
return (h(Host, { class: `size-${this.targetSize}` }, h("button", { class: "button", type: "button", "aria-label": this.label, popoverTarget: "toggletip", popoverTargetAction: "toggle", onClick: () => this.open(),
|
|
166
166
|
// In order to position the tooltip identically to the toggletip, its presence is determined by these four events
|
|
167
|
-
onMouseEnter: () => !this.isOpen && showTooltip(this.toggletipPosition, this.el, this.tooltipMessage), onMouseLeave: () => hideTooltip(), onFocus: () => !this.isOpen && showTooltip(this.toggletipPosition, this.el, this.tooltipMessage), onBlur: () => this.handleBlur() }, h("div", {
|
|
167
|
+
onMouseEnter: () => !this.isOpen && showTooltip(this.toggletipPosition, this.el, this.tooltipMessage), onMouseLeave: () => hideTooltip(), onFocus: () => !this.isOpen && showTooltip(this.toggletipPosition, this.el, this.tooltipMessage), onBlur: () => this.handleBlur() }, h("div", { class: "svg-icon svg-info" })), h("div", { popover: "", ref: (el) => (this.toggletipEl = el), class: `toggletip ${this.targetSize} ${this.isHidden ? "hidden" : ""}`, id: "toggletip" }, this.tooltip), h("div", { ref: (el) => (this.liveRegionEl = el), class: "live-region sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true" })));
|
|
168
168
|
}
|
|
169
169
|
static get is() { return "wm-toggletip"; }
|
|
170
170
|
static get encapsulation() { return "shadow"; }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { newSpecPage } from "@stencil/core/testing";
|
|
2
|
+
import { Toggletip } from "./wm-toggletip";
|
|
3
|
+
describe("toggletip", () => {
|
|
4
|
+
let page;
|
|
5
|
+
beforeEach(async () => {
|
|
6
|
+
page = await newSpecPage({
|
|
7
|
+
components: [Toggletip],
|
|
8
|
+
html: `<wm-toggletip label="More information" tooltip="Further explanation"></wm-toggletip>`,
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
it("builds", async () => {
|
|
12
|
+
expect(page.root).toMatchSnapshot();
|
|
13
|
+
});
|
|
14
|
+
it("has proper aria roles & attributes", async () => {
|
|
15
|
+
const liveRegion = page.root.shadowRoot.querySelector(".live-region");
|
|
16
|
+
const button = page.root.shadowRoot.querySelector("button");
|
|
17
|
+
expect(liveRegion).toEqualAttribute("role", "status");
|
|
18
|
+
expect(button).toEqualAttribute("type", "button");
|
|
19
|
+
expect(button).toEqualAttribute("aria-label", "More information");
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { newE2EPage } from "@stencil/core/testing";
|
|
2
|
+
import { AxePuppeteer } from "@axe-core/puppeteer";
|
|
3
|
+
describe("wm-uploader", () => {
|
|
4
|
+
let page, input, label;
|
|
5
|
+
beforeEach(async () => {
|
|
6
|
+
page = await newE2EPage();
|
|
7
|
+
await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
|
|
8
|
+
<wm-uploader button-text="Upload new document">
|
|
9
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="2020-01-28T22:29:10.397Z"></wm-file>
|
|
10
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2019-02-14T12:21:05.397Z"></wm-file>
|
|
11
|
+
</wm-uploader>
|
|
12
|
+
</main></body></html>`);
|
|
13
|
+
input = await page.find("wm-uploader >>> input[type='file']");
|
|
14
|
+
label = await page.find("wm-uploader >>> label");
|
|
15
|
+
await page.waitForChanges();
|
|
16
|
+
});
|
|
17
|
+
it("passes Axe checks", async () => {
|
|
18
|
+
const results = await new AxePuppeteer(page).analyze();
|
|
19
|
+
expect(results.violations.length).toBe(0);
|
|
20
|
+
});
|
|
21
|
+
it("renders the component", async () => {
|
|
22
|
+
expect(input).not.toBeNull();
|
|
23
|
+
expect(label).not.toBeNull();
|
|
24
|
+
});
|
|
25
|
+
it("focuses previous file when deleting with the keyboard", async () => {
|
|
26
|
+
page = await newE2EPage();
|
|
27
|
+
await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
|
|
28
|
+
<wm-uploader button-text="Upload new document">
|
|
29
|
+
<wm-file id="file1" name="First file" type="pdf" file-actions="preview delete"></wm-file>
|
|
30
|
+
<wm-file id="file2" name="Second file" type="pdf" file-actions="delete"></wm-file>
|
|
31
|
+
</wm-uploader>
|
|
32
|
+
</main></body></html>`);
|
|
33
|
+
await page.waitForChanges();
|
|
34
|
+
let fileEls = await page.findAll("wm-file");
|
|
35
|
+
let secondFileEl = fileEls[1];
|
|
36
|
+
// inital check of file count
|
|
37
|
+
expect(fileEls.length).toBe(2);
|
|
38
|
+
// user must be tabbing for these changes to occur
|
|
39
|
+
await page.keyboard.press("Tab");
|
|
40
|
+
await page.keyboard.press("Tab");
|
|
41
|
+
await page.keyboard.press("Tab");
|
|
42
|
+
await page.keyboard.press("Tab");
|
|
43
|
+
await page.keyboard.press("Enter");
|
|
44
|
+
await page.waitForChanges();
|
|
45
|
+
// check focused element is last file, delete button
|
|
46
|
+
let activeElId = await page.evaluate(() => document.activeElement.id);
|
|
47
|
+
expect(activeElId).toBe("file2");
|
|
48
|
+
let activeElButtonType = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.classList[0]);
|
|
49
|
+
expect(activeElButtonType).toBe("delete-button");
|
|
50
|
+
let mockFileDeleteEvent = new CustomEvent("wmFileDelete");
|
|
51
|
+
//@ts-ignore
|
|
52
|
+
mockFileDeleteEvent.target = secondFileEl;
|
|
53
|
+
secondFileEl.dispatchEvent(mockFileDeleteEvent);
|
|
54
|
+
await page.evaluate(() => { var _a; return (_a = document.getElementById("file2")) === null || _a === void 0 ? void 0 : _a.remove(); });
|
|
55
|
+
await page.waitForChanges();
|
|
56
|
+
// confirm file has been removed
|
|
57
|
+
fileEls = await page.findAll("wm-file");
|
|
58
|
+
expect(fileEls.length).toBe(1);
|
|
59
|
+
// check focused element is last file, delete button
|
|
60
|
+
activeElId = await page.evaluate(() => document.activeElement.id);
|
|
61
|
+
expect(activeElId).toBe("file1");
|
|
62
|
+
activeElButtonType = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.classList[0]);
|
|
63
|
+
expect(activeElButtonType).toBe("delete-button");
|
|
64
|
+
});
|
|
65
|
+
// it("disables the button dynamically", async () => {
|
|
66
|
+
// disabled when maxed out
|
|
67
|
+
// disabled while a file is uploading
|
|
68
|
+
// not disabled after upload
|
|
69
|
+
// });
|
|
70
|
+
});
|
|
@@ -300,9 +300,9 @@ export class Uploader {
|
|
|
300
300
|
return (h("div", { class: `drop-area -${this.dropArea}`, ref: (el) => (this.dropAreaEl = el), onDragEnter: (ev) => this.handleDragEnter(ev), onDragOver: (ev) => this.handleDragOver(ev), onDragLeave: (ev) => this.handleDragLeave(ev), onDrop: (ev) => this.handleDrop(ev) }, this.dropArea == "page" && (h("div", { ref: (el) => (this.dropOverlayEl = el), class: "drop-overlay", popover: "manual" }, h("span", { class: "upload-arrow" }), h("span", null, "Drop to Upload")))));
|
|
301
301
|
}
|
|
302
302
|
render() {
|
|
303
|
-
return (h(Host, {
|
|
303
|
+
return (h(Host, { class: `-${this.dropArea}` }, this.uploaderType == "drop" && this.renderDropArea(), this.label && this.renderLabel(), this.renderHeader(), this.renderListContainer(), h("div", { ref: (el) => (this.assertiveLiveRegionEl = el), class: "live-region sr-only", "aria-live": "assertive" // since it's directly linked to the action the user took, it should be read in priority. With polite, some messages get dismissed in favor of the page title
|
|
304
304
|
,
|
|
305
|
-
"aria-atomic": "true" }), h("div", {
|
|
305
|
+
"aria-atomic": "true" }), h("div", { ref: (el) => (this.politeLiveRegionEl = el), class: "live-region sr-only", "aria-live": "polite", "aria-atomic": "true" })));
|
|
306
306
|
}
|
|
307
307
|
static get is() { return "wm-uploader"; }
|
|
308
308
|
static get encapsulation() { return "shadow"; }
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
jest.mock("../../global/services/http-service");
|
|
2
|
+
import { newSpecPage } from "@stencil/core/testing";
|
|
3
|
+
import { Uploader } from "./wm-uploader";
|
|
4
|
+
import { File } from "../wm-file/wm-file";
|
|
5
|
+
// mock ResizeObserver
|
|
6
|
+
global.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
7
|
+
observe: jest.fn(),
|
|
8
|
+
unobserve: jest.fn(),
|
|
9
|
+
disconnect: jest.fn(),
|
|
10
|
+
}));
|
|
11
|
+
// mock MutationObserver
|
|
12
|
+
global.MutationObserver = jest.fn().mockImplementation(() => ({
|
|
13
|
+
observe: jest.fn(),
|
|
14
|
+
unobserve: jest.fn(),
|
|
15
|
+
disconnect: jest.fn(),
|
|
16
|
+
}));
|
|
17
|
+
describe("wm-uploader", () => {
|
|
18
|
+
let html, page;
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
html = `<wm-uploader
|
|
21
|
+
id="uploader1"
|
|
22
|
+
button-text="Upload new document"
|
|
23
|
+
max-size="200 MB"
|
|
24
|
+
max-files="5"
|
|
25
|
+
>
|
|
26
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
|
|
27
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
28
|
+
</wm-uploader>`;
|
|
29
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
30
|
+
await page.waitForChanges();
|
|
31
|
+
});
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
html = undefined;
|
|
34
|
+
page = undefined;
|
|
35
|
+
});
|
|
36
|
+
it("has necessary aria properties", async () => {
|
|
37
|
+
let inputEl = page.root.shadowRoot.querySelector("input");
|
|
38
|
+
expect(inputEl).toEqualAttribute("aria-describedby", "file-count max-size accepted-types");
|
|
39
|
+
html = `<wm-uploader
|
|
40
|
+
id="uploader1"
|
|
41
|
+
button-text="Upload new document"
|
|
42
|
+
label="example label"
|
|
43
|
+
required-field="true"
|
|
44
|
+
></wm-uploader>`;
|
|
45
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
46
|
+
await page.waitForChanges();
|
|
47
|
+
inputEl = page.root.shadowRoot.querySelector("input");
|
|
48
|
+
expect(inputEl).toEqualAttribute("aria-label", "example label, Upload new document");
|
|
49
|
+
expect(inputEl).toEqualAttribute("aria-required", "true");
|
|
50
|
+
html = `<wm-uploader
|
|
51
|
+
id="uploader1"
|
|
52
|
+
button-text="Upload new document"
|
|
53
|
+
required-field="true"
|
|
54
|
+
></wm-uploader>`;
|
|
55
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
56
|
+
await page.waitForChanges();
|
|
57
|
+
inputEl = page.root.shadowRoot.querySelector("input");
|
|
58
|
+
expect(inputEl).toEqualAttribute("aria-label", "Upload new document");
|
|
59
|
+
html = `<wm-uploader
|
|
60
|
+
id="uploader1"
|
|
61
|
+
button-text="Upload new document"
|
|
62
|
+
label="Upload new document"
|
|
63
|
+
required-field="true"
|
|
64
|
+
></wm-uploader>`;
|
|
65
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
66
|
+
await page.waitForChanges();
|
|
67
|
+
inputEl = page.root.shadowRoot.querySelector("input");
|
|
68
|
+
expect(inputEl).toEqualAttribute("aria-label", "Upload new document");
|
|
69
|
+
});
|
|
70
|
+
it("renders button text based on button-text prop", () => {
|
|
71
|
+
const labelEl = page.root.shadowRoot.querySelector("label");
|
|
72
|
+
expect(labelEl.textContent).toBe("Upload new document");
|
|
73
|
+
});
|
|
74
|
+
it("uploads files", async () => {
|
|
75
|
+
const input = page.root.shadowRoot.querySelector("input");
|
|
76
|
+
// fake files which the components uploadFiles() function will process
|
|
77
|
+
// @ts-ignore
|
|
78
|
+
input.files = {
|
|
79
|
+
length: 2,
|
|
80
|
+
0: {
|
|
81
|
+
lastModified: 1562163068000,
|
|
82
|
+
lastModifiedDate: new Date(1562163068000),
|
|
83
|
+
name: "third_file.pdf",
|
|
84
|
+
size: 104857600,
|
|
85
|
+
type: "application/pdf",
|
|
86
|
+
webkitRelativePath: "",
|
|
87
|
+
},
|
|
88
|
+
1: {
|
|
89
|
+
lastModified: 1562062469000,
|
|
90
|
+
lastModifiedDate: new Date(1562062469000),
|
|
91
|
+
name: "fourth file.jpg",
|
|
92
|
+
size: 123456,
|
|
93
|
+
type: "image/jpeg",
|
|
94
|
+
webkitRelativePath: "",
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
// triggering the change event will run validations and emit event wmUploaderFilesSelected
|
|
98
|
+
const ev = new Event("change");
|
|
99
|
+
let validFiles = [];
|
|
100
|
+
page.root.addEventListener("wmUploaderFilesSelected", (ev) => (validFiles = ev.detail));
|
|
101
|
+
input.dispatchEvent(ev);
|
|
102
|
+
await page.waitForChanges();
|
|
103
|
+
expect(validFiles[0].name).toBe("third_file.pdf");
|
|
104
|
+
expect(validFiles[1].size).toBe(123456);
|
|
105
|
+
});
|
|
106
|
+
it("disables button when upload is in progress", async () => {
|
|
107
|
+
html = `<wm-uploader id="uploader1">
|
|
108
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB" progress="30"></wm-file>
|
|
109
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
110
|
+
</wm-uploader>`;
|
|
111
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
112
|
+
await page.waitForChanges();
|
|
113
|
+
const labelEl = page.root.shadowRoot.querySelector("label");
|
|
114
|
+
expect(labelEl).toHaveClass("disabled");
|
|
115
|
+
});
|
|
116
|
+
it("renders max-files text, if set", async () => {
|
|
117
|
+
let html, page;
|
|
118
|
+
html = `<wm-uploader
|
|
119
|
+
id="uploader1"
|
|
120
|
+
button-text="Upload new document"
|
|
121
|
+
></wm-uploader>`;
|
|
122
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
123
|
+
await page.waitForChanges();
|
|
124
|
+
let fileCountEl = page.root.shadowRoot.querySelector("#file-count");
|
|
125
|
+
expect(fileCountEl).toBeFalsy();
|
|
126
|
+
html = `<wm-uploader
|
|
127
|
+
id="uploader1"
|
|
128
|
+
max-files="3"
|
|
129
|
+
>
|
|
130
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
|
|
131
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
132
|
+
</wm-uploader>`;
|
|
133
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
134
|
+
await page.waitForChanges();
|
|
135
|
+
fileCountEl = page.root.shadowRoot.querySelector("#file-count");
|
|
136
|
+
expect(fileCountEl).toBeTruthy();
|
|
137
|
+
expect(fileCountEl.textContent).toBe("2 of 3 Files");
|
|
138
|
+
});
|
|
139
|
+
it("renders max-size text, if set", async () => {
|
|
140
|
+
let html, page;
|
|
141
|
+
html = `<wm-uploader
|
|
142
|
+
id="uploader1"
|
|
143
|
+
button-text="Upload new document"
|
|
144
|
+
></wm-uploader>`;
|
|
145
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
146
|
+
await page.waitForChanges();
|
|
147
|
+
let maxSizeEl = page.root.shadowRoot.querySelector("#max-size");
|
|
148
|
+
expect(maxSizeEl).toBeFalsy();
|
|
149
|
+
html = `<wm-uploader
|
|
150
|
+
id="uploader1"
|
|
151
|
+
max-size="25 MB"
|
|
152
|
+
button-text="Upload new document"
|
|
153
|
+
></wm-uploader>`;
|
|
154
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
155
|
+
await page.waitForChanges();
|
|
156
|
+
maxSizeEl = page.root.shadowRoot.querySelector("#max-size");
|
|
157
|
+
expect(maxSizeEl).toBeTruthy();
|
|
158
|
+
expect(maxSizeEl.textContent).toBe("Maximum file size 25 MB");
|
|
159
|
+
});
|
|
160
|
+
it("announces error when max-files has been reached and button clicked", async () => {
|
|
161
|
+
html = `<wm-uploader
|
|
162
|
+
id="uploader1"
|
|
163
|
+
max-files="2"
|
|
164
|
+
>
|
|
165
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
|
|
166
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
167
|
+
</wm-uploader>`;
|
|
168
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
169
|
+
await page.waitForChanges();
|
|
170
|
+
const input = page.root.shadowRoot.querySelector("input");
|
|
171
|
+
input.click();
|
|
172
|
+
await page.waitForChanges();
|
|
173
|
+
const liveRegion = page.root.shadowRoot.querySelector(".live-region").textContent;
|
|
174
|
+
expect(liveRegion).toBe("The maximum number of files has been reached");
|
|
175
|
+
});
|
|
176
|
+
it("singularizes the accepted file types message", async () => {
|
|
177
|
+
let message = page.root.shadowRoot.querySelector("#accepted-types").textContent;
|
|
178
|
+
expect(message).toBe("Accepted file types: .pdf, .txt, .log, .xml, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .gif, .jpg, .jpeg, .png, .csv");
|
|
179
|
+
html = `<wm-uploader
|
|
180
|
+
id="uploader1"
|
|
181
|
+
file-types="jpeg"
|
|
182
|
+
button-text="Upload new document"
|
|
183
|
+
files='[{"id": "file1", "name": "File retrieved from server", "type": "pdf", "lastUpdated": "1/28/2020"},{"id": "file2", "name": "Second file", "type": "jpeg", "lastUpdated": "2/14/2019"}]'
|
|
184
|
+
></wm-uploader>`;
|
|
185
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
186
|
+
await page.waitForChanges();
|
|
187
|
+
message = page.root.shadowRoot.querySelector("#accepted-types").textContent;
|
|
188
|
+
expect(message).toBe("Accepted file type: .jpeg");
|
|
189
|
+
});
|
|
190
|
+
it("provides wm-files with the proper show-info", async () => {
|
|
191
|
+
// defaults to time
|
|
192
|
+
let infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
|
|
193
|
+
expect(infoEl.textContent).toBe("1/28/2020");
|
|
194
|
+
// size
|
|
195
|
+
html = `<wm-uploader
|
|
196
|
+
id="uploader1"
|
|
197
|
+
button-text="Upload new document"
|
|
198
|
+
show-info="size"
|
|
199
|
+
>
|
|
200
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
|
|
201
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
202
|
+
</wm-uploader>`;
|
|
203
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
204
|
+
await page.waitForChanges();
|
|
205
|
+
infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
|
|
206
|
+
expect(infoEl.textContent).toBe("28 KB");
|
|
207
|
+
// time
|
|
208
|
+
html = `<wm-uploader
|
|
209
|
+
id="uploader1"
|
|
210
|
+
button-text="Upload new document"
|
|
211
|
+
show-info="time"
|
|
212
|
+
>
|
|
213
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
|
|
214
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
215
|
+
</wm-uploader>`;
|
|
216
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
217
|
+
await page.waitForChanges();
|
|
218
|
+
infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
|
|
219
|
+
expect(infoEl.textContent).toBe("1/28/2020");
|
|
220
|
+
// none
|
|
221
|
+
html = `<wm-uploader
|
|
222
|
+
id="uploader1"
|
|
223
|
+
button-text="Upload new document"
|
|
224
|
+
show-info="none"
|
|
225
|
+
>
|
|
226
|
+
<wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
|
|
227
|
+
<wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
|
|
228
|
+
</wm-uploader>`;
|
|
229
|
+
page = await newSpecPage({ components: [Uploader, File], html });
|
|
230
|
+
await page.waitForChanges();
|
|
231
|
+
infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
|
|
232
|
+
expect(infoEl).toBe(null);
|
|
233
|
+
});
|
|
234
|
+
});
|