@zeedhi/common 3.0.0 → 3.0.2
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/coverage/clover.xml +2570 -1531
- package/coverage/coverage-final.json +171 -158
- package/coverage/lcov-report/block-navigation.js +1 -1
- package/coverage/lcov-report/index.html +194 -44
- package/coverage/lcov-report/sorter.js +21 -7
- package/coverage/lcov-report/src/components/index.html +5 -5
- package/coverage/lcov-report/src/components/index.ts.html +244 -142
- package/coverage/lcov-report/src/components/tek-grid/columns-searcher.ts.html +2 -2
- package/coverage/lcov-report/src/components/tek-grid/dynamic-filter-datasource-factory.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/filter-helper.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/grid-filter-button.ts.html +6 -6
- package/coverage/lcov-report/src/components/tek-grid/grouped-data-manager.ts.html +6 -6
- package/coverage/lcov-report/src/components/tek-grid/grouped-data-selector.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/grouped-view-navigator.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/index.html +1 -1
- package/coverage/lcov-report/src/components/tek-grid/index.ts.html +19 -19
- package/coverage/lcov-report/src/components/tek-grid/interfaces.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/keymap-grouped.ts.html +2 -2
- package/coverage/lcov-report/src/components/tek-grid/layout-options.ts.html +6 -6
- package/coverage/lcov-report/src/components/tek-grid/tek-datasource/index.html +1 -1
- package/coverage/lcov-report/src/components/tek-grid/tek-datasource/index.ts.html +4 -4
- package/coverage/lcov-report/src/components/tek-grid/tek-datasource/interfaces.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/tek-datasource/tek-memory-datasource.ts.html +5 -5
- package/coverage/lcov-report/src/components/tek-grid/tek-datasource/tek-rest-datasource.ts.html +5 -5
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-column.ts.html +4 -4
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-columns-button/index.html +1 -1
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-columns-button/tek-grid-columns-button-controller.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-columns-button/tek-grid-columns-button.ts.html +6 -6
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-controller.ts.html +2 -2
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-events.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/export-options/button-option.ts.html +2 -2
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/export-options/index.html +1 -1
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/export-options/index.ts.html +4 -4
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/export-options/multi-option.ts.html +2 -2
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/index.html +1 -1
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/index.ts.html +3 -3
- package/coverage/lcov-report/src/components/tek-grid/tek-grid-toolbar-provider/tek-grid-toolbar-provider.ts.html +5 -5
- package/coverage/lcov-report/src/components/tek-grid/tek-grid.ts.html +22 -22
- package/coverage/lcov-report/src/components/zd-alert/alert.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-alert/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-badge/badge.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-badge/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-breadcrumbs/breadcrumbs.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-breadcrumbs/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-button/button.ts.html +36 -36
- package/coverage/lcov-report/src/components/zd-button/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-button-group/button-group.ts.html +113 -131
- package/coverage/lcov-report/src/components/zd-button-group/index.html +17 -17
- package/coverage/lcov-report/src/components/zd-card/card.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-card/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-carousel/carousel.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-carousel/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-checkbox/checkbox.ts.html +6 -6
- package/coverage/lcov-report/src/components/zd-checkbox/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-checkbox-multiple/checkbox-multiple.ts.html +77 -122
- package/coverage/lcov-report/src/components/zd-checkbox-multiple/index.html +17 -17
- package/coverage/lcov-report/src/components/zd-chip/chip.ts.html +352 -0
- package/coverage/lcov-report/src/components/zd-chip/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-code-viewer/code-viewer.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-code-viewer/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-col/col.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-col/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-collapse-card/collapse-card.ts.html +80 -68
- package/coverage/lcov-report/src/components/zd-collapse-card/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-component/child-not-found.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-component/component-render.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-component/component.ts.html +117 -69
- package/coverage/lcov-report/src/components/zd-component/index.html +9 -9
- package/coverage/lcov-report/src/components/zd-container/container.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-container/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-currency/currency.ts.html +259 -0
- package/coverage/lcov-report/src/components/zd-currency/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-date-input/date-input.ts.html +113 -98
- package/coverage/lcov-report/src/components/zd-date-input/index.html +5 -5
- package/coverage/lcov-report/src/components/zd-date-range/date-range.ts.html +2059 -0
- package/coverage/lcov-report/src/components/zd-date-range/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-dialog/dialog.ts.html +30 -30
- package/coverage/lcov-report/src/components/zd-dialog/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-divider/divider.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-divider/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-dropdown/dropdown.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-dropdown/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-footer/footer.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-footer/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-form/form.ts.html +288 -18
- package/coverage/lcov-report/src/components/zd-form/index.html +9 -9
- package/coverage/lcov-report/src/components/zd-frame/frame.ts.html +8 -8
- package/coverage/lcov-report/src/components/zd-frame/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-frame-page/frame-page.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-frame-page/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-grid/data-navigator.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-grid/data-selector.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-grid/grid-column.ts.html +10 -10
- package/coverage/lcov-report/src/components/zd-grid/grid-events.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-grid/grid.ts.html +84 -84
- package/coverage/lcov-report/src/components/zd-grid/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-grid/index.ts.html +12 -12
- package/coverage/lcov-report/src/components/zd-grid/iterable-table.ts.html +6 -6
- package/coverage/lcov-report/src/components/zd-grid/keymap-merger.ts.html +14 -14
- package/coverage/lcov-report/src/components/zd-grid/keymap-navigation.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-grid/table-action-builder.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-grid/view-navigator.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-grid-editable/data-editor-with-add.ts.html +6 -6
- package/coverage/lcov-report/src/components/zd-grid-editable/data-editor.ts.html +7 -7
- package/coverage/lcov-report/src/components/zd-grid-editable/errors/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-grid-editable/errors/index.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-grid-editable/errors/not-editing.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-grid-editable/errors/row-not-found.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-grid-editable/grid-column-editable.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-grid-editable/grid-editable-controller.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-grid-editable/grid-editable-events.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-grid-editable/grid-editable.ts.html +9 -9
- package/coverage/lcov-report/src/components/zd-grid-editable/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-grid-editable/index.ts.html +8 -8
- package/coverage/lcov-report/src/components/zd-grid-editable/keymap-editing.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-header/header.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-header/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-icon/icon.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-icon/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-image/image.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-image/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-increment/increment.ts.html +436 -0
- package/coverage/lcov-report/src/components/zd-increment/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-input/index.html +5 -5
- package/coverage/lcov-report/src/components/zd-input/input-factory.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-input/input.ts.html +73 -61
- package/coverage/lcov-report/src/components/zd-iterable/column-not-found.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-iterable/column.ts.html +6 -6
- package/coverage/lcov-report/src/components/zd-iterable/conditions-manager.ts.html +9 -9
- package/coverage/lcov-report/src/components/zd-iterable/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-iterable/iterable-columns-button-controller.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-iterable/iterable-columns-button.ts.html +6 -6
- package/coverage/lcov-report/src/components/zd-iterable/iterable-controller.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-iterable/iterable-page-component.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-iterable/iterable-page-info.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-iterable/iterable-page-size.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-iterable/iterable-pagination.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-iterable/iterable.ts.html +29 -29
- package/coverage/lcov-report/src/components/zd-iterable/search.ts.html +8 -8
- package/coverage/lcov-report/src/components/zd-iterable-component-render/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-iterable-component-render/iterable-component-render.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-layout/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-layout/layout.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-list/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-list/item-not-found.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-list/list-group.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-list/list-item.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-list/list.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-loading/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-loading/loading.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-login/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-login/login-button.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-login/login.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-main/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-main/main.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-master-detail/detail-not-found.ts.html +118 -0
- package/coverage/lcov-report/src/components/zd-master-detail/index.html +146 -0
- package/coverage/lcov-report/src/components/zd-master-detail/master-detail.ts.html +331 -0
- package/coverage/lcov-report/src/components/zd-master-detail/master-not-found.ts.html +118 -0
- package/coverage/lcov-report/src/components/zd-menu/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-menu/menu-button.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-menu/menu-group.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-menu/menu-link.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-menu/menu-separator.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-menu/menu.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-modal/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-modal/modal-close-button.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-modal/modal.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-month/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-month/month.ts.html +568 -0
- package/coverage/lcov-report/src/components/zd-number-input/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-number-input/number-input.ts.html +27 -27
- package/coverage/lcov-report/src/components/zd-password/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-password/password.ts.html +7 -7
- package/coverage/lcov-report/src/components/zd-progress/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-progress/progress.ts.html +262 -0
- package/coverage/lcov-report/src/components/zd-radio/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-radio/radio.ts.html +6 -6
- package/coverage/lcov-report/src/components/zd-row/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-row/row.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-select/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-select/select.ts.html +9 -9
- package/coverage/lcov-report/src/components/zd-select-multiple/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-select-multiple/select-multiple.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-svg-map/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-svg-map/svg-map.ts.html +475 -0
- package/coverage/lcov-report/src/components/zd-switch/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-switch/switch.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-table/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-table/table.ts.html +4 -4
- package/coverage/lcov-report/src/components/zd-tabs/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-tabs/tab-not-found.ts.html +2 -2
- package/coverage/lcov-report/src/components/zd-tabs/tab.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-tabs/tabs.ts.html +7 -7
- package/coverage/lcov-report/src/components/zd-tag/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-tag/tag.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-text/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-text/text.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-text-input/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-text-input/text-input.ts.html +22 -22
- package/coverage/lcov-report/src/components/zd-textarea/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-textarea/textarea.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-time/index.html +131 -0
- package/coverage/lcov-report/src/components/zd-time/time-format-selector.ts.html +157 -0
- package/coverage/lcov-report/src/components/zd-time/time.ts.html +1669 -0
- package/coverage/lcov-report/src/components/zd-toggleable/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-toggleable/toggleable.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-tooltip/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-tooltip/tooltip.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-tree/index.html +116 -0
- package/coverage/lcov-report/src/components/zd-tree/tree.ts.html +1849 -0
- package/coverage/lcov-report/src/components/zd-tree-grid/index.html +1 -1
- package/coverage/lcov-report/src/components/zd-tree-grid/index.ts.html +7 -7
- package/coverage/lcov-report/src/components/zd-tree-grid/iterable-tree.ts.html +9 -9
- package/coverage/lcov-report/src/components/zd-tree-grid/keymap-tree.ts.html +3 -3
- package/coverage/lcov-report/src/components/zd-tree-grid/tree-data-navigator.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-tree-grid/tree-data-selector.ts.html +5 -5
- package/coverage/lcov-report/src/components/zd-tree-grid/tree-grid.ts.html +108 -108
- package/coverage/lcov-report/src/error/delete-rows.ts.html +3 -3
- package/coverage/lcov-report/src/error/index.html +1 -1
- package/coverage/lcov-report/src/error/non-initialized.ts.html +3 -3
- package/coverage/lcov-report/src/error/tek-grid-delete-rows.ts.html +3 -3
- package/coverage/lcov-report/src/error/teknisa-common-error.ts.html +2 -2
- package/coverage/lcov-report/src/error/zeedhi-error.ts.html +3 -3
- package/coverage/lcov-report/src/index.html +1 -1
- package/coverage/lcov-report/src/index.ts.html +9 -27
- package/coverage/lcov-report/src/services/index.html +1 -1
- package/coverage/lcov-report/src/services/index.ts.html +5 -5
- package/coverage/lcov-report/src/services/zd-alert/alert-queue.ts.html +3 -3
- package/coverage/lcov-report/src/services/zd-alert/alert-replace.ts.html +3 -3
- package/coverage/lcov-report/src/services/zd-alert/alert-service.ts.html +5 -5
- package/coverage/lcov-report/src/services/zd-alert/alert-stack.ts.html +3 -3
- package/coverage/lcov-report/src/services/zd-alert/index.html +1 -1
- package/coverage/lcov-report/src/services/zd-alert/index.ts.html +6 -6
- package/coverage/lcov-report/src/services/zd-dialog/dialog-service.ts.html +4 -4
- package/coverage/lcov-report/src/services/zd-dialog/index.html +1 -1
- package/coverage/lcov-report/src/services/zd-loading/index.html +1 -1
- package/coverage/lcov-report/src/services/zd-loading/loading-service.ts.html +2 -2
- package/coverage/lcov-report/src/services/zd-modal/index.html +1 -1
- package/coverage/lcov-report/src/services/zd-modal/modal-service.ts.html +5 -5
- package/coverage/lcov-report/src/utils/data-value-out/data-value-out.ts.html +3 -3
- package/coverage/lcov-report/src/utils/data-value-out/index.html +1 -1
- package/coverage/lcov-report/src/utils/data-value-out/index.ts.html +3 -3
- package/coverage/lcov-report/src/utils/datasource-searcher/datasource-searcher.ts.html +3 -3
- package/coverage/lcov-report/src/utils/datasource-searcher/index.html +1 -1
- package/coverage/lcov-report/src/utils/datasource-searcher/index.ts.html +3 -3
- package/coverage/lcov-report/src/utils/icons/icons.ts.html +6 -6
- package/coverage/lcov-report/src/utils/icons/index.html +1 -1
- package/coverage/lcov-report/src/utils/index.html +1 -1
- package/coverage/lcov-report/src/utils/index.ts.html +11 -11
- package/coverage/lcov-report/src/utils/is-filled-object/index.html +1 -1
- package/coverage/lcov-report/src/utils/is-filled-object/is-filled-object.ts.html +3 -3
- package/coverage/lcov-report/src/utils/is-nil.ts.html +2 -2
- package/coverage/lcov-report/src/utils/omit/index.html +1 -1
- package/coverage/lcov-report/src/utils/omit/omit.ts.html +2 -2
- package/coverage/lcov-report/src/utils/theme/index.html +1 -1
- package/coverage/lcov-report/src/utils/theme/theme.ts.html +4 -4
- package/coverage/lcov-report/src/utils/tree-data-structure/index.html +7 -7
- package/coverage/lcov-report/src/utils/tree-data-structure/index.ts.html +3 -3
- package/coverage/lcov-report/src/utils/tree-data-structure/tree-data-structure.ts.html +90 -87
- package/coverage/lcov-report/src/utils/unique-by/index.html +1 -1
- package/coverage/lcov-report/src/utils/unique-by/unique-by.ts.html +3 -3
- package/coverage/lcov-report/tests/unit/components/zd-component/ComponentMock.ts.html +1 -1
- package/coverage/lcov-report/tests/unit/components/zd-component/index.html +1 -1
- package/coverage/lcov.info +3991 -2050
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/components/zd-date-range/date-range.d.ts +152 -0
- package/dist/types/components/zd-date-range/interfaces.d.ts +18 -0
- package/dist/types/components/zd-form/form.d.ts +15 -0
- package/dist/types/components/zd-form/interfaces.d.ts +3 -0
- package/dist/types/components/zd-input/input.d.ts +2 -0
- package/dist/types/components/zd-input/interfaces.d.ts +2 -0
- package/dist/types/components/zd-time/interfaces.d.ts +1 -1
- package/dist/types/components/zd-time/time.d.ts +6 -6
- package/dist/types/index.d.ts +1 -1
- package/dist/zd-common.js +634 -23
- package/dist/zd-common.min.js +634 -23
- package/package.json +3 -3
- package/src/components/index.ts +7 -5
- package/src/components/zd-date-range/date-range.ts +658 -0
- package/src/components/zd-date-range/interfaces.ts +19 -0
- package/src/components/zd-form/form.ts +91 -1
- package/src/components/zd-form/interfaces.ts +3 -0
- package/src/components/zd-input/input.ts +4 -0
- package/src/components/zd-input/interfaces.ts +2 -0
- package/src/components/zd-time/interfaces.ts +16 -16
- package/src/components/zd-time/time-format-selector.ts +13 -13
- package/src/components/zd-time/time.ts +510 -488
- package/src/index.ts +1 -8
- package/tests/unit/components/zd-date-range/date-range.spec.ts +1125 -0
- package/tests/unit/components/zd-form/form.spec.ts +30 -0
- package/tests/unit/components/zd-menu/menu-button.spec.ts +1 -1
|
@@ -0,0 +1,1125 @@
|
|
|
1
|
+
import { FormatterParserProvider, I18n, init } from '@zeedhi/core';
|
|
2
|
+
import times from 'lodash.times';
|
|
3
|
+
import { DateRange } from '../../../../src';
|
|
4
|
+
import dayjs from 'dayjs';
|
|
5
|
+
import utc from 'dayjs/plugin/utc';
|
|
6
|
+
|
|
7
|
+
jest.useFakeTimers();
|
|
8
|
+
|
|
9
|
+
describe('DateRange', () => {
|
|
10
|
+
describe('constructor()', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
jest.spyOn(window.navigator, 'language', 'get').mockReturnValue('pt-BR');
|
|
13
|
+
I18n.init({});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should create new date picker with default values', () => {
|
|
17
|
+
const instance = new DateRange({ name: 'date', component: 'ZdDateRange' });
|
|
18
|
+
expect(instance.appendIcon).toBe('calendar');
|
|
19
|
+
expect(instance.autocomplete).toBeFalsy();
|
|
20
|
+
expect(instance.dateFormat).toBe('MM-DD-YYYY');
|
|
21
|
+
expect(instance.displayFormat).toBe('MM-DD-YYYY');
|
|
22
|
+
expect(instance.dark).toBeFalsy();
|
|
23
|
+
expect(instance.color).toBe('primary');
|
|
24
|
+
expect(instance.firstDayOfWeek).toBe(0);
|
|
25
|
+
expect(instance.fullWidth).toBeFalsy();
|
|
26
|
+
expect(instance.light).toBeFalsy();
|
|
27
|
+
expect(instance.locale).toBe('pt-BR');
|
|
28
|
+
expect(instance.scrollable).toBeFalsy();
|
|
29
|
+
expect(instance.showWeek).toBeFalsy();
|
|
30
|
+
expect(instance.splitter).toBe(' ~ ');
|
|
31
|
+
expect(instance.width).toBe(248);
|
|
32
|
+
expect(instance.helperOptions).toEqual([]);
|
|
33
|
+
expect(instance.helperValue).toBe('');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should create new date picker replacing default values', () => {
|
|
37
|
+
const instance = new DateRange({
|
|
38
|
+
name: 'date',
|
|
39
|
+
component: 'ZdDateRange',
|
|
40
|
+
appendIcon: '',
|
|
41
|
+
autocomplete: true,
|
|
42
|
+
dateFormat: 'DD-MM-YYYY',
|
|
43
|
+
displayFormat: 'DD-MM-YYYY',
|
|
44
|
+
dark: true,
|
|
45
|
+
color: 'secondary',
|
|
46
|
+
firstDayOfWeek: 2,
|
|
47
|
+
fullWidth: true,
|
|
48
|
+
light: true,
|
|
49
|
+
locale: 'en-US',
|
|
50
|
+
scrollable: true,
|
|
51
|
+
showWeek: true,
|
|
52
|
+
splitter: ' <> ',
|
|
53
|
+
width: 200,
|
|
54
|
+
helperOptions: ['TODAY'],
|
|
55
|
+
helperValue: 'TODAY',
|
|
56
|
+
});
|
|
57
|
+
expect(instance.appendIcon).toBe('');
|
|
58
|
+
expect(instance.name).toBe('date');
|
|
59
|
+
expect(instance.component).toBe('ZdDateRange');
|
|
60
|
+
expect(instance.autocomplete).toBeTruthy();
|
|
61
|
+
expect(instance.dateFormat).toBe('DD-MM-YYYY');
|
|
62
|
+
expect(instance.displayFormat).toBe('DD-MM-YYYY');
|
|
63
|
+
expect(instance.dark).toBeTruthy();
|
|
64
|
+
expect(instance.color).toBe('secondary');
|
|
65
|
+
expect(instance.firstDayOfWeek).toBe(2);
|
|
66
|
+
expect(instance.fullWidth).toBeTruthy();
|
|
67
|
+
expect(instance.light).toBeTruthy();
|
|
68
|
+
expect(instance.locale).toBe('en-US');
|
|
69
|
+
expect(instance.scrollable).toBeTruthy();
|
|
70
|
+
expect(instance.showWeek).toBeTruthy();
|
|
71
|
+
expect(instance.splitter).toBe(' <> ');
|
|
72
|
+
expect(instance.width).toBe(200);
|
|
73
|
+
expect(instance.helperOptions).toEqual(['TODAY']);
|
|
74
|
+
expect(instance.helperValue).toBe('TODAY');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('formatter()', () => {
|
|
79
|
+
it('should return display value', () => {
|
|
80
|
+
const instance = new DateRange({
|
|
81
|
+
name: 'date',
|
|
82
|
+
component: 'DateRange',
|
|
83
|
+
displayFormat: 'DD/MM/YYYY',
|
|
84
|
+
});
|
|
85
|
+
expect(instance.formatter(['01-31-2020'])).toBe('31/01/2020');
|
|
86
|
+
expect(instance.formatter(['01-20-2020', '01-31-2020'])).toBe('20/01/2020 ~ 31/01/2020');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should return \'\' when value is empty', () => {
|
|
90
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
91
|
+
expect(instance.formatter([''])).toBe('');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('parser()', () => {
|
|
96
|
+
it('should return row value', () => {
|
|
97
|
+
const instance = new DateRange({
|
|
98
|
+
name: 'date',
|
|
99
|
+
component: 'DateRange',
|
|
100
|
+
displayFormat: 'DD/MM/YYYY',
|
|
101
|
+
});
|
|
102
|
+
expect(instance.parser('31/01/2020')).toStrictEqual(['01-31-2020']);
|
|
103
|
+
expect(instance.parser('20/01/2020 ~ 31/01/2020')).toStrictEqual(['01-20-2020', '01-31-2020']);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should return null when value is empty', () => {
|
|
107
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
108
|
+
expect(instance.parser('')).toStrictEqual([]);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe('displayValue', () => {
|
|
113
|
+
it('should return date formatted', () => {
|
|
114
|
+
const instance = new DateRange({
|
|
115
|
+
name: 'date',
|
|
116
|
+
component: 'DateRange',
|
|
117
|
+
displayFormat: 'DD/MM/YYYY',
|
|
118
|
+
});
|
|
119
|
+
instance.value = ['02-28-2020'];
|
|
120
|
+
expect(instance.displayValue).toBe('28/02/2020');
|
|
121
|
+
instance.displayValue = '28/02/2020';
|
|
122
|
+
expect(instance.value).toStrictEqual(['02-28-2020']);
|
|
123
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
124
|
+
|
|
125
|
+
instance.value = ['02-20-2020', '02-28-2020'];
|
|
126
|
+
expect(instance.displayValue).toBe('20/02/2020 ~ 28/02/2020');
|
|
127
|
+
instance.displayValue = '20/02/2020 ~ 28/02/2020';
|
|
128
|
+
expect(instance.value).toStrictEqual(['02-20-2020', '02-28-2020']);
|
|
129
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('should not call change event if the value is the same', () => {
|
|
133
|
+
const changeFn = jest.fn();
|
|
134
|
+
const instance = new DateRange({
|
|
135
|
+
name: 'date',
|
|
136
|
+
component: 'DateRange',
|
|
137
|
+
displayFormat: 'DD/MM/YYYY',
|
|
138
|
+
events: {
|
|
139
|
+
change: changeFn,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
144
|
+
instance.setDateValue('20/02/2020 ~ 28/02/2020');
|
|
145
|
+
expect(changeFn).toHaveBeenCalled();
|
|
146
|
+
changeFn.mockClear();
|
|
147
|
+
instance.setDateValue('20/02/2020 ~ 28/02/2020');
|
|
148
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('should return date formatted when both day and month are less than 12', () => {
|
|
152
|
+
const instance = new DateRange({
|
|
153
|
+
name: 'date',
|
|
154
|
+
component: 'Date',
|
|
155
|
+
displayFormat: 'DD/MM/YYYY',
|
|
156
|
+
});
|
|
157
|
+
instance.value = ['02-01-2020']; // MM-DD-YYYY
|
|
158
|
+
expect(instance.displayValue).toBe('01/02/2020');
|
|
159
|
+
instance.displayValue = '01/02/2020';
|
|
160
|
+
expect(instance.value).toStrictEqual(['02-01-2020']);
|
|
161
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
162
|
+
|
|
163
|
+
instance.value = ['01-02-2020']; // MM-DD-YYYY
|
|
164
|
+
expect(instance.displayValue).toBe('02/01/2020');
|
|
165
|
+
instance.displayValue = '02/01/2020';
|
|
166
|
+
expect(instance.value).toStrictEqual(['01-02-2020']);
|
|
167
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('when initial mask and complex displayFormat, should use mask on focus and use displayFormat on blur', () => {
|
|
171
|
+
const instance = new DateRange({
|
|
172
|
+
name: 'date',
|
|
173
|
+
component: 'Date',
|
|
174
|
+
dateFormat: 'DD/MM/YYYY',
|
|
175
|
+
displayFormat: 'MMMM DD, YYYY',
|
|
176
|
+
inputFormat: 'DD MM YYYY',
|
|
177
|
+
});
|
|
178
|
+
// set value directly
|
|
179
|
+
instance.value = ['10/12/2020', '11/12/2020']; // DD/MM/YYYY
|
|
180
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '11/12/2020']);
|
|
181
|
+
expect(instance.displayValue).toBe('10 12 2020 ~ 11 12 2020');
|
|
182
|
+
|
|
183
|
+
// multiple blur/focus calls should not change behavior
|
|
184
|
+
times(2, () => {
|
|
185
|
+
instance.blur(new Event('blur'), {});
|
|
186
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '11/12/2020']);
|
|
187
|
+
expect(instance.displayValue).toBe('December 10, 2020 ~ December 11, 2020');
|
|
188
|
+
|
|
189
|
+
instance.focus(new Event('focus'), {});
|
|
190
|
+
jest.runAllTimers();
|
|
191
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '11/12/2020']);
|
|
192
|
+
expect(instance.displayValue).toBe('10 12 2020 ~ 11 12 2020');
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('should order dates when blur event is called', () => {
|
|
197
|
+
const instance = new DateRange({
|
|
198
|
+
name: 'date',
|
|
199
|
+
component: 'Date',
|
|
200
|
+
dateFormat: 'DD/MM/YYYY',
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
instance.value = ['10/12/2020', '8/12/2020'];
|
|
204
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '8/12/2020']);
|
|
205
|
+
|
|
206
|
+
instance.blur(new Event('blur'), {});
|
|
207
|
+
expect(instance.value).toStrictEqual(['8/12/2020', '10/12/2020']);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('when initial mask and complex displayFormat, should behave the same when setting via value/displayValue', () => {
|
|
211
|
+
const instance = new DateRange({
|
|
212
|
+
name: 'date',
|
|
213
|
+
component: 'Date',
|
|
214
|
+
dateFormat: 'DD/MM/YYYY',
|
|
215
|
+
displayFormat: 'MMMM DD, YYYY',
|
|
216
|
+
mask: '## ## ####',
|
|
217
|
+
});
|
|
218
|
+
instance.value = ['08/12/2020', '09/12/2020']; // DD/MM/YYYY
|
|
219
|
+
expect(instance.value).toStrictEqual(['08/12/2020', '09/12/2020']);
|
|
220
|
+
expect(instance.displayValue).toBe('08 12 2020 ~ 09 12 2020');
|
|
221
|
+
|
|
222
|
+
instance.displayValue = '09 12 2020 ~ 10 12 2020'; // DD MM YYYY
|
|
223
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
224
|
+
expect(instance.displayValue).toBe('09 12 2020 ~ 10 12 2020');
|
|
225
|
+
|
|
226
|
+
instance.blur(new Event('blur'), {});
|
|
227
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
228
|
+
expect(instance.displayValue).toBe('December 09, 2020 ~ December 10, 2020');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('when initial mask is defined and simple displayFormat, should use displayFormat as mask fallback', () => {
|
|
232
|
+
const instance = new DateRange({
|
|
233
|
+
name: 'date',
|
|
234
|
+
component: 'Date',
|
|
235
|
+
dateFormat: 'DD/MM/YYYY',
|
|
236
|
+
displayFormat: 'MM/DD/YYYY',
|
|
237
|
+
mask: '## ## ####',
|
|
238
|
+
});
|
|
239
|
+
instance.value = ['08/12/2020', '09/12/2020']; // DD/MM/YYYY
|
|
240
|
+
expect(instance.value).toStrictEqual(['08/12/2020', '09/12/2020']);
|
|
241
|
+
expect(instance.displayValue).toBe('12 08 2020 ~ 12 09 2020');
|
|
242
|
+
|
|
243
|
+
instance.displayValue = '12 09 2020 ~ 12 10 2020'; // DD MM YYYY
|
|
244
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
245
|
+
expect(instance.displayValue).toBe('12 09 2020 ~ 12 10 2020');
|
|
246
|
+
|
|
247
|
+
instance.blur(new Event('blur'), {});
|
|
248
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
249
|
+
expect(instance.displayValue).toBe('12/09/2020 ~ 12/10/2020');
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('should display value with no delimiters', () => {
|
|
253
|
+
const instance = new DateRange({
|
|
254
|
+
name: 'date',
|
|
255
|
+
component: 'Date',
|
|
256
|
+
dateFormat: 'DD/MM/YYYY',
|
|
257
|
+
displayFormat: 'MMDDYYYY',
|
|
258
|
+
mask: '## ## ####',
|
|
259
|
+
});
|
|
260
|
+
instance.value = ['08/12/2020', '09/12/2020']; // DD/MM/YYYY
|
|
261
|
+
expect(instance.value).toStrictEqual(['08/12/2020', '09/12/2020']);
|
|
262
|
+
expect(instance.displayValue).toBe('12 08 2020 ~ 12 09 2020');
|
|
263
|
+
|
|
264
|
+
instance.displayValue = '12 09 2020 ~ 12 10 2020'; // DD MM YYYY
|
|
265
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
266
|
+
expect(instance.displayValue).toBe('12 09 2020 ~ 12 10 2020');
|
|
267
|
+
|
|
268
|
+
instance.blur(new Event('blur'), {});
|
|
269
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
270
|
+
expect(instance.displayValue).toBe('12092020 ~ 12102020');
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it('should use inputFormat on focus and use displayFormat on blur', () => {
|
|
274
|
+
const instance = new DateRange({
|
|
275
|
+
name: 'date',
|
|
276
|
+
component: 'Date',
|
|
277
|
+
dateFormat: 'DD/MM/YYYY',
|
|
278
|
+
displayFormat: 'MMMM DD, YYYY',
|
|
279
|
+
inputFormat: 'MM/DD/YYYY',
|
|
280
|
+
});
|
|
281
|
+
// set value directly
|
|
282
|
+
instance.value = ['10/12/2020', '11/12/2020']; // DD/MM/YYYY
|
|
283
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '11/12/2020']);
|
|
284
|
+
expect(instance.displayValue).toBe('12/10/2020 ~ 12/11/2020');
|
|
285
|
+
|
|
286
|
+
// multiple blur/focus calls should not change behavior
|
|
287
|
+
times(2, () => {
|
|
288
|
+
instance.blur(new Event('blur'), {});
|
|
289
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '11/12/2020']);
|
|
290
|
+
expect(instance.displayValue).toBe('December 10, 2020 ~ December 11, 2020');
|
|
291
|
+
|
|
292
|
+
instance.focus(new Event('focus'), {});
|
|
293
|
+
jest.runAllTimers();
|
|
294
|
+
expect(instance.value).toStrictEqual(['10/12/2020', '11/12/2020']);
|
|
295
|
+
expect(instance.displayValue).toBe('12/10/2020 ~ 12/11/2020');
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('using inputFormat should behave the same when setting via value/displayValue', () => {
|
|
300
|
+
const instance = new DateRange({
|
|
301
|
+
name: 'date',
|
|
302
|
+
component: 'Date',
|
|
303
|
+
dateFormat: 'DD/MM/YYYY',
|
|
304
|
+
displayFormat: 'MMMM DD, YYYY',
|
|
305
|
+
inputFormat: 'MM/DD/YYYY',
|
|
306
|
+
});
|
|
307
|
+
instance.value = ['08/12/2020', '09/12/2020']; // DD/MM/YYYY
|
|
308
|
+
expect(instance.value).toStrictEqual(['08/12/2020', '09/12/2020']);
|
|
309
|
+
expect(instance.displayValue).toBe('12/08/2020 ~ 12/09/2020');
|
|
310
|
+
|
|
311
|
+
instance.displayValue = '12/09/2020 ~ 12/10/2020'; // MM/DD/YYYY
|
|
312
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
313
|
+
expect(instance.displayValue).toBe('12/09/2020 ~ 12/10/2020');
|
|
314
|
+
|
|
315
|
+
instance.blur(new Event('blur'), {});
|
|
316
|
+
expect(instance.value).toStrictEqual(['09/12/2020', '10/12/2020']);
|
|
317
|
+
expect(instance.displayValue).toBe('December 09, 2020 ~ December 10, 2020');
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('using inputFormat, should not parse when value is invalid', () => {
|
|
321
|
+
const instance = new DateRange({
|
|
322
|
+
name: 'date',
|
|
323
|
+
component: 'Date',
|
|
324
|
+
dateFormat: 'DD/MM/YYYY',
|
|
325
|
+
displayFormat: 'MMMM DD, YYYY',
|
|
326
|
+
inputFormat: 'MM/DD/YYYY',
|
|
327
|
+
});
|
|
328
|
+
instance.displayValue = '09/1'; // MM/DD/YYYY
|
|
329
|
+
expect(instance.value).toStrictEqual(['09/1']);
|
|
330
|
+
expect(instance.displayValue).toBe('09/1');
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
describe('setDateValue()', () => {
|
|
335
|
+
it('should update displayValue when the value passed is valid', () => {
|
|
336
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
337
|
+
instance.setDateValue('01-01-2020 ~ 01-02-2020');
|
|
338
|
+
expect(instance.displayValue).toBe('');
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
it('should display only the first value position if second position equal \'\'', () => {
|
|
342
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
343
|
+
instance.setDateValue('01-01-2020 ~ ');
|
|
344
|
+
expect(instance.displayValue).toBe('');
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it('should clear displayValue when the value passed is empty', () => {
|
|
348
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
349
|
+
instance.setDateValue('01-01-2020 ~ 01-02-2020');
|
|
350
|
+
expect(instance.displayValue).toBe('01-01-2020 ~ 01-02-2020');
|
|
351
|
+
instance.setDateValue('');
|
|
352
|
+
expect(instance.displayValue).toBe('');
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it('shouldn\'t update displayValue when the value passed is invalid', () => {
|
|
356
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
357
|
+
instance.setDateValue('01-01-2020 ~ 01-02-2020');
|
|
358
|
+
expect(instance.displayValue).toBe('01-01-2020 ~ 01-02-2020');
|
|
359
|
+
instance.setDateValue('99-99-2020');
|
|
360
|
+
expect(instance.displayValue).toBe('01-01-2020 ~ 01-02-2020');
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it('should update dateValidation', () => {
|
|
364
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
365
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
366
|
+
instance.setDateValue('99-99-2020');
|
|
367
|
+
expect(instance.dateValidation()).toBe(I18n.translate('VALIDATION_INVALID_DATE'));
|
|
368
|
+
instance.setDateValue('01-01-2020');
|
|
369
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
370
|
+
instance.setDateValue('31-01-2020');
|
|
371
|
+
expect(instance.dateValidation()).toBe(I18n.translate('VALIDATION_INVALID_DATE'));
|
|
372
|
+
instance.setDateValue('');
|
|
373
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
it('should not call change event if the value is the same', () => {
|
|
377
|
+
const changeFn = jest.fn();
|
|
378
|
+
const instance = new DateRange({
|
|
379
|
+
name: 'date',
|
|
380
|
+
component: 'DateRange',
|
|
381
|
+
displayFormat: 'DD/MM/YYYY',
|
|
382
|
+
events: {
|
|
383
|
+
change: changeFn,
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
388
|
+
instance.setDateValue('28/02/2020 ~ 29/02/2020');
|
|
389
|
+
expect(changeFn).toHaveBeenCalled();
|
|
390
|
+
changeFn.mockClear();
|
|
391
|
+
instance.setDateValue('28/02/2020');
|
|
392
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
393
|
+
|
|
394
|
+
instance.setDateValue('');
|
|
395
|
+
expect(changeFn).toHaveBeenCalled();
|
|
396
|
+
changeFn.mockClear();
|
|
397
|
+
instance.setDateValue('');
|
|
398
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
describe('isValidDate()', () => {
|
|
403
|
+
it('should return true when date is valid', () => {
|
|
404
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
405
|
+
expect(instance.isValidDate('01/01/01', 'DD/MM/YY')).toBeTruthy();
|
|
406
|
+
expect(instance.isValidDate('01-01-01', 'DD/MM/YY')).toBeFalsy();
|
|
407
|
+
expect(instance.isValidDate('31/02/01', 'DD/MM/YY')).toBeFalsy();
|
|
408
|
+
expect(instance.isValidDate('31/13/01', 'DD/MM/YY')).toBeFalsy();
|
|
409
|
+
expect(instance.isValidDate('40/01/01', 'DD/MM/YY')).toBeFalsy();
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
it('should return true when date is valid with min/max value', () => {
|
|
413
|
+
const instance = new DateRange({
|
|
414
|
+
name: 'date',
|
|
415
|
+
component: 'Date',
|
|
416
|
+
dateFormat: 'MM/DD/YYYY',
|
|
417
|
+
max: '07/12/2023',
|
|
418
|
+
min: '07/02/2023',
|
|
419
|
+
});
|
|
420
|
+
expect(instance.isValidDate('07/11/2023', 'MM/DD/YYYY')).toBeTruthy();
|
|
421
|
+
expect(instance.isValidDate('07/12/2023', 'MM/DD/YYYY')).toBeTruthy();
|
|
422
|
+
expect(instance.isValidDate('07/02/2023', 'MM/DD/YYYY')).toBeTruthy();
|
|
423
|
+
expect(instance.isValidDate('07/13/2023', 'MM/DD/YYYY')).toBeFalsy();
|
|
424
|
+
expect(instance.isValidDate('07/01/2023', 'MM/DD/YYYY')).toBeFalsy();
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
describe('isoRangeValue', () => {
|
|
429
|
+
it('should return date in ISO format', () => {
|
|
430
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
431
|
+
instance.value = ['02-28-2020'];
|
|
432
|
+
expect(instance.isoRangeValue).toStrictEqual(['2020-02-28']);
|
|
433
|
+
instance.isoRangeValue = ['2020-02-28'];
|
|
434
|
+
expect(instance.value).toStrictEqual(['02-28-2020']);
|
|
435
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
it('should not call change event if the value is the same', () => {
|
|
439
|
+
const changeFn = jest.fn();
|
|
440
|
+
const instance = new DateRange({
|
|
441
|
+
name: 'date',
|
|
442
|
+
component: 'DateRange',
|
|
443
|
+
events: {
|
|
444
|
+
change: changeFn,
|
|
445
|
+
},
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
449
|
+
instance.isoRangeValue = ['2020-02-28'];
|
|
450
|
+
expect(changeFn).toHaveBeenCalled();
|
|
451
|
+
changeFn.mockClear();
|
|
452
|
+
instance.isoRangeValue = ['2020-02-28'];
|
|
453
|
+
expect(changeFn).not.toHaveBeenCalled();
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
describe('formatISODateRangeValue()', () => {
|
|
458
|
+
it('should return parsed value from dateFormat to isoFormat', () => {
|
|
459
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
460
|
+
|
|
461
|
+
expect(instance.formatISODateRangeValue('02-28-2020')).toStrictEqual(['2020-02-28']);
|
|
462
|
+
expect(instance.formatISODateRangeValue('')).toStrictEqual([]);
|
|
463
|
+
expect(instance.formatISODateRangeValue('02/31/2020')).toStrictEqual([]);
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
describe('parseISODateRangeValue()', () => {
|
|
468
|
+
it('should return parsed value from isoFormat to dateFormat', () => {
|
|
469
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
470
|
+
expect(instance.parseISODateRangeValue(['2020-02-28'])).toStrictEqual(['02-28-2020']);
|
|
471
|
+
expect(instance.parseISODateRangeValue([''])).toStrictEqual([]);
|
|
472
|
+
expect(instance.parseISODateRangeValue([])).toStrictEqual([]);
|
|
473
|
+
expect(instance.parseISODateRangeValue(['2020-02-31'])).toStrictEqual([]);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it('should return parsed ordened value from isoFormat to dateFormat', () => {
|
|
477
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
478
|
+
expect(instance.parseISODateRangeValue(['2020-02-28', '2020-02-25'])).toStrictEqual(['02-25-2020', '02-28-2020']);
|
|
479
|
+
expect(instance.parseISODateRangeValue(['2020-02-25', '2020-02-28'])).toStrictEqual(['02-25-2020', '02-28-2020']);
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
describe('dateValidation()', () => {
|
|
484
|
+
it('should return true when dateError is false', () => {
|
|
485
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
486
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
487
|
+
instance.setDateValue('01-01-2020');
|
|
488
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
it('should return \'Invalid date\' when dateError is true', () => {
|
|
492
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
493
|
+
expect(instance.dateValidation()).toBeTruthy();
|
|
494
|
+
instance.setDateValue('99/99/2020');
|
|
495
|
+
expect(instance.dateValidation()).toBe(I18n.translate('VALIDATION_INVALID_DATE'));
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
describe('click()', () => {
|
|
500
|
+
it('should execute click event', () => {
|
|
501
|
+
const eventFn = jest.fn();
|
|
502
|
+
const instance = new DateRange({
|
|
503
|
+
name: 'date',
|
|
504
|
+
component: 'ZdDateRange',
|
|
505
|
+
label: 'DatePicker',
|
|
506
|
+
events: {
|
|
507
|
+
click: eventFn,
|
|
508
|
+
},
|
|
509
|
+
});
|
|
510
|
+
const event = new Event('click');
|
|
511
|
+
instance.click(event, {});
|
|
512
|
+
expect(eventFn).toHaveBeenCalled();
|
|
513
|
+
instance.click();
|
|
514
|
+
expect(eventFn).toHaveBeenCalled();
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
it('shouldn\'t throw a error when field doesn\'t have click event', () => {
|
|
518
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
519
|
+
delete instance.events.click;
|
|
520
|
+
expect(() => { instance.click({} as Event, {}); }).not.toThrowError();
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
it('should toggle showDatePicker when event is not prevented', () => {
|
|
524
|
+
const instance = new DateRange({ name: 'date', component: 'DateRange' });
|
|
525
|
+
instance.showDatePicker = false;
|
|
526
|
+
instance.click({ defaultPrevented: false } as Event, {});
|
|
527
|
+
expect(instance.showDatePicker).toBeTruthy();
|
|
528
|
+
instance.click({ defaultPrevented: false } as Event, {});
|
|
529
|
+
expect(instance.showDatePicker).toBeFalsy();
|
|
530
|
+
instance.click({ defaultPrevented: true } as Event, {});
|
|
531
|
+
expect(instance.showDatePicker).toBeFalsy();
|
|
532
|
+
});
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
describe('blur()', () => {
|
|
536
|
+
it('should clear value, call event and hide date picker', () => {
|
|
537
|
+
const eventFn = jest.fn();
|
|
538
|
+
const instance = new DateRange({
|
|
539
|
+
name: 'date',
|
|
540
|
+
component: 'ZdDateRange',
|
|
541
|
+
showDatePicker: true,
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
instance.setDateValue('02-28-2020');
|
|
545
|
+
const input = document.createElement('input');
|
|
546
|
+
input.value = '01-01-2020';
|
|
547
|
+
instance.displayValue = '01-01-2020';
|
|
548
|
+
const event = new Event('blur');
|
|
549
|
+
input.dispatchEvent(event);
|
|
550
|
+
expect(() => { instance.blur(event, {}); }).not.toThrow();
|
|
551
|
+
expect(eventFn).not.toHaveBeenCalled();
|
|
552
|
+
expect(instance.value).toStrictEqual(['01-01-2020']);
|
|
553
|
+
expect(instance.showDatePicker).toBeFalsy();
|
|
554
|
+
|
|
555
|
+
instance.events = {
|
|
556
|
+
blur: eventFn,
|
|
557
|
+
};
|
|
558
|
+
instance.blur(new Event('blur'), {});
|
|
559
|
+
instance.displayValue = '';
|
|
560
|
+
expect(eventFn).toHaveBeenCalled();
|
|
561
|
+
expect(instance.value).toStrictEqual([]);
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
it('should remove date mask if initial mask is set and value is valid', () => {
|
|
565
|
+
const eventFn = jest.fn();
|
|
566
|
+
const instance = new DateRange({
|
|
567
|
+
name: 'date',
|
|
568
|
+
component: 'ZdDateRange',
|
|
569
|
+
mask: '## ## ####',
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
instance.value = ['12 21 2020', '12 22 2020'];
|
|
573
|
+
expect(eventFn).not.toHaveBeenCalled();
|
|
574
|
+
|
|
575
|
+
instance.events = {
|
|
576
|
+
blur: eventFn,
|
|
577
|
+
};
|
|
578
|
+
instance.blur(new Event('blur'), {});
|
|
579
|
+
|
|
580
|
+
expect(eventFn).toHaveBeenCalled();
|
|
581
|
+
expect(instance.mask).toBe<string>('## ## #### ~ ## ## ####');
|
|
582
|
+
});
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
describe('focus()', () => {
|
|
586
|
+
it('if initial mask and value is set, should assign initialMask to mask', () => {
|
|
587
|
+
const eventFn = jest.fn();
|
|
588
|
+
const instance = new DateRange({
|
|
589
|
+
name: 'date',
|
|
590
|
+
component: 'ZdDateRange',
|
|
591
|
+
mask: '## ## ####',
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
instance.mask = '';
|
|
595
|
+
instance.setDateValue('02-28-2020');
|
|
596
|
+
|
|
597
|
+
expect(eventFn).not.toHaveBeenCalled();
|
|
598
|
+
|
|
599
|
+
instance.events = {
|
|
600
|
+
focus: eventFn,
|
|
601
|
+
};
|
|
602
|
+
instance.focus(new Event('focus'), {});
|
|
603
|
+
|
|
604
|
+
jest.runAllTimers();
|
|
605
|
+
|
|
606
|
+
expect(eventFn).toHaveBeenCalled();
|
|
607
|
+
|
|
608
|
+
expect(instance.mask).toBe('## ## #### ~ ## ## ####');
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it('should change displayValue', () => {
|
|
612
|
+
const instance = new DateRange({
|
|
613
|
+
name: 'date',
|
|
614
|
+
component: 'ZdDateRange',
|
|
615
|
+
mask: '## ## ####',
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
instance.value = [];
|
|
619
|
+
instance.focus(new Event('focus'), {});
|
|
620
|
+
jest.runAllTimers();
|
|
621
|
+
expect(instance.displayValue).toBe('');
|
|
622
|
+
|
|
623
|
+
instance.value = ['01-01-2022'];
|
|
624
|
+
instance.focus(new Event('focus'), {});
|
|
625
|
+
jest.runAllTimers();
|
|
626
|
+
expect(instance.displayValue).toBe('01-01-2022');
|
|
627
|
+
|
|
628
|
+
instance.value = ['01-01-2022', '02-02-2022'];
|
|
629
|
+
instance.focus(new Event('focus'), {});
|
|
630
|
+
jest.runAllTimers();
|
|
631
|
+
expect(instance.displayValue).toBe('01-01-2022 ~ 02-02-2022');
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
it('if initial mask or value is not set, should not assign initialMask to mask', () => {
|
|
635
|
+
const eventFn = jest.fn();
|
|
636
|
+
const instance = new DateRange({
|
|
637
|
+
name: 'date',
|
|
638
|
+
component: 'ZdDateRange',
|
|
639
|
+
displayFormat: 'DD/MM/YYYY',
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
instance.setDateValue('21-12-2020');
|
|
643
|
+
|
|
644
|
+
expect(eventFn).not.toHaveBeenCalled();
|
|
645
|
+
|
|
646
|
+
instance.events = {
|
|
647
|
+
focus: eventFn,
|
|
648
|
+
};
|
|
649
|
+
instance.focus(new Event('focus'), {});
|
|
650
|
+
|
|
651
|
+
expect(eventFn).toHaveBeenCalled();
|
|
652
|
+
expect(instance.updateMask()).toBe<string>('##/##/#### ~ ##/##/####');
|
|
653
|
+
expect(instance.mask).toBe<string>('##/##/#### ~ ##/##/####');
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
describe('FormatterParserProvider', () => {
|
|
658
|
+
it('should return formatter function', () => {
|
|
659
|
+
const formatterFn = FormatterParserProvider.getFormatter('ZdDateRange');
|
|
660
|
+
expect(formatterFn).toBeInstanceOf(Function);
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
it('should format date', () => {
|
|
664
|
+
const formatterFn = FormatterParserProvider.getFormatter('ZdDateRange');
|
|
665
|
+
expect(formatterFn(['12-20-2019'])).toBe('12-20-2019');
|
|
666
|
+
expect(formatterFn(['20-12-2019'])).toBe('20-12-2019');
|
|
667
|
+
expect(formatterFn(['aaa'])).toBe('aaa');
|
|
668
|
+
expect(formatterFn(['20-12-2019', ''])).toBe('20-12-2019');
|
|
669
|
+
expect(formatterFn(['20/12/2019'], { dateFormat: 'DD/MM/YYYY', displayFormat: 'YYYY-MM-DD' })).toBe('2019-12-20');
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
it('when value is invalid and mask is set, should get same value', () => {
|
|
673
|
+
const formatterFn = FormatterParserProvider.getFormatter('ZdDateRange');
|
|
674
|
+
|
|
675
|
+
const formatted = formatterFn(['20/12'], {
|
|
676
|
+
dateFormat: 'DD/MM/YYYY',
|
|
677
|
+
displayFormat: 'YYYY-MM-DD',
|
|
678
|
+
mask: '####/##/##',
|
|
679
|
+
initialMask: '####/##/##',
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
expect(formatted).toBe('20/12');
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
it('when value is valid and mask is set, should get masked value', () => {
|
|
686
|
+
const formatterFn = FormatterParserProvider.getFormatter('ZdDateRange');
|
|
687
|
+
|
|
688
|
+
const formatted = formatterFn(['20/12/2020'], {
|
|
689
|
+
dateFormat: 'DD/MM/YYYY',
|
|
690
|
+
displayFormat: 'YYYY-MM-DD',
|
|
691
|
+
mask: '##/##/#### ~ ##/##/####',
|
|
692
|
+
initialMask: '##/##/#### ~ ##/##/####',
|
|
693
|
+
unitMask: '##/##/####',
|
|
694
|
+
splitter: ' ~ ',
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
expect(formatted).toBe('20/12/2020');
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
it('should return parser function', () => {
|
|
701
|
+
const parserFn = FormatterParserProvider.getParser('ZdDateRange');
|
|
702
|
+
expect(parserFn).toBeInstanceOf(Function);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
it('when formatted value is masked, should remove mask and parse using displayFormat mask', () => {
|
|
706
|
+
const instance = new DateRange({
|
|
707
|
+
name: 'datePicker',
|
|
708
|
+
component: 'ZdDateRange',
|
|
709
|
+
dateFormat: 'DD/MM/YYYY',
|
|
710
|
+
displayFormat: 'YYYY-MM-DD',
|
|
711
|
+
mask: '####/##/##',
|
|
712
|
+
});
|
|
713
|
+
const parsed = instance.parser('2019/12/20');
|
|
714
|
+
|
|
715
|
+
expect(parsed).toStrictEqual(['20/12/2019']);
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
it('when formatted value is masked and can\'t be masked using displayFmt mask, should parse using dateFmt mask', () => {
|
|
719
|
+
const instance = new DateRange({
|
|
720
|
+
name: 'datePicker',
|
|
721
|
+
component: 'ZdDateRange',
|
|
722
|
+
dateFormat: 'DD/MM/YYYY',
|
|
723
|
+
displayFormat: 'YYYY MMMM, Do',
|
|
724
|
+
mask: '##-##-####',
|
|
725
|
+
});
|
|
726
|
+
const parsed = instance.parser('20-12-2019');
|
|
727
|
+
|
|
728
|
+
expect(parsed).toStrictEqual(['20/12/2019']);
|
|
729
|
+
});
|
|
730
|
+
|
|
731
|
+
it('when formatted value is masked and can\'t use neither displayFmt or dateFmt mask, should not parse', () => {
|
|
732
|
+
const parserFn = FormatterParserProvider.getParser('ZdDateRange');
|
|
733
|
+
|
|
734
|
+
const parsed = parserFn('20-12-2019', {
|
|
735
|
+
dateFormat: 'Do/MM/YYYY',
|
|
736
|
+
displayFormat: 'YYYY MMMM, Do',
|
|
737
|
+
mask: '##-##-####',
|
|
738
|
+
});
|
|
739
|
+
|
|
740
|
+
expect(parsed).toStrictEqual(['20-12-2019']);
|
|
741
|
+
});
|
|
742
|
+
|
|
743
|
+
it('should parse date', () => {
|
|
744
|
+
const parserFn = FormatterParserProvider.getParser('ZdDateRange');
|
|
745
|
+
expect(parserFn('12-20-2019')).toStrictEqual(['12-20-2019']);
|
|
746
|
+
expect(parserFn('20-12-2019')).toStrictEqual(['20-12-2019']);
|
|
747
|
+
expect(parserFn('aaa')).toStrictEqual(['aaa']);
|
|
748
|
+
expect(parserFn('20-12-2019', {
|
|
749
|
+
dateFormat: 'Do/MM/YYYY',
|
|
750
|
+
mask: '##-##-#### ~ ##-##-####',
|
|
751
|
+
unitMask: '##-##-####',
|
|
752
|
+
})).toStrictEqual(['20-12-2019']);
|
|
753
|
+
expect(parserFn('2019-12-20', {
|
|
754
|
+
dateFormat: 'DD/MM/YYYY',
|
|
755
|
+
displayFormat: 'YYYY-MM-DD',
|
|
756
|
+
})).toStrictEqual(['20/12/2019']);
|
|
757
|
+
});
|
|
758
|
+
});
|
|
759
|
+
|
|
760
|
+
describe('togglePicker', () => {
|
|
761
|
+
it('should toggle showDatePicker value', () => {
|
|
762
|
+
const date = new DateRange({ name: 'date', component: 'ZdDateRange', showDatePicker: false });
|
|
763
|
+
|
|
764
|
+
date.togglePicker();
|
|
765
|
+
expect(date.showDatePicker).toBeTruthy();
|
|
766
|
+
|
|
767
|
+
date.togglePicker();
|
|
768
|
+
expect(date.showDatePicker).toBeFalsy();
|
|
769
|
+
});
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
describe('appendIconClick', () => {
|
|
773
|
+
beforeEach(() => {
|
|
774
|
+
init({
|
|
775
|
+
controllers: {
|
|
776
|
+
AppController: class AppController {
|
|
777
|
+
public appendIcon = 'icon';
|
|
778
|
+
},
|
|
779
|
+
},
|
|
780
|
+
});
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
it('should open datePicker', () => {
|
|
784
|
+
const date = new DateRange({ name: 'date', component: 'ZdDateRange', appendIcon: 'icon' });
|
|
785
|
+
|
|
786
|
+
expect(date.appendIcon).toBe('icon');
|
|
787
|
+
expect(date.showDatePicker).toBeFalsy();
|
|
788
|
+
date.appendIconClick({} as Event, {});
|
|
789
|
+
expect(date.showDatePicker).toBeTruthy();
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
it('should not open datePicker if click is defaultPrevented', () => {
|
|
793
|
+
const date = new DateRange({
|
|
794
|
+
name: 'date',
|
|
795
|
+
component: 'ZdDateRange',
|
|
796
|
+
events: {
|
|
797
|
+
click: ({ event }: any) => { event.defaultPrevented = true; },
|
|
798
|
+
},
|
|
799
|
+
});
|
|
800
|
+
|
|
801
|
+
expect(date.showDatePicker).toBeFalsy();
|
|
802
|
+
date.appendIconClick({} as Event, {});
|
|
803
|
+
expect(date.showDatePicker).toBeFalsy();
|
|
804
|
+
});
|
|
805
|
+
});
|
|
806
|
+
|
|
807
|
+
describe('updateMask', () => {
|
|
808
|
+
it('should not change mask when initial mask is empty string', () => {
|
|
809
|
+
const date = new DateRange({
|
|
810
|
+
name: 'date',
|
|
811
|
+
component: 'ZdDateRange',
|
|
812
|
+
mask: '',
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
expect(date.mask).toEqual('');
|
|
816
|
+
expect(date.updateMask()).toEqual('');
|
|
817
|
+
});
|
|
818
|
+
|
|
819
|
+
it('when no mask is set, should get mask based on displayFormat', () => {
|
|
820
|
+
const date = new DateRange({
|
|
821
|
+
name: 'date',
|
|
822
|
+
component: 'ZdDateRange',
|
|
823
|
+
displayFormat: 'DD MM YYYY',
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
expect(date.updateMask()).toBe('## ## #### ~ ## ## ####');
|
|
827
|
+
expect(date.mask).toBe('## ## #### ~ ## ## ####');
|
|
828
|
+
});
|
|
829
|
+
|
|
830
|
+
it('when initial mask is undefined but mask is set, should get mask based on displayFormat', () => {
|
|
831
|
+
const date = new DateRange({
|
|
832
|
+
name: 'date',
|
|
833
|
+
component: 'ZdDateRange',
|
|
834
|
+
displayFormat: 'DD MM YYYY',
|
|
835
|
+
});
|
|
836
|
+
|
|
837
|
+
date.mask = '#';
|
|
838
|
+
|
|
839
|
+
expect(date.updateMask()).toBe('## ## #### ~ ## ## ####');
|
|
840
|
+
expect(date.mask).toBe('## ## #### ~ ## ## ####');
|
|
841
|
+
});
|
|
842
|
+
|
|
843
|
+
it('when initial mask is set, should not get mask based on displayFormat', () => {
|
|
844
|
+
const date = new DateRange({
|
|
845
|
+
name: 'date',
|
|
846
|
+
component: 'ZdDateRange',
|
|
847
|
+
mask: '##-##-####',
|
|
848
|
+
displayFormat: 'DD MM YYYY',
|
|
849
|
+
});
|
|
850
|
+
|
|
851
|
+
expect(date.updateMask()).toBe('##-##-#### ~ ##-##-####');
|
|
852
|
+
expect(date.mask).toBe('##-##-#### ~ ##-##-####');
|
|
853
|
+
});
|
|
854
|
+
|
|
855
|
+
it('when initial mask is set and value is valid, should not remove masks', () => {
|
|
856
|
+
const date = new DateRange({
|
|
857
|
+
name: 'date',
|
|
858
|
+
component: 'ZdDateRange',
|
|
859
|
+
dateFormat: 'DD/MM/YYYY',
|
|
860
|
+
mask: '##-##-####',
|
|
861
|
+
displayFormat: 'DD MM YYYY',
|
|
862
|
+
});
|
|
863
|
+
|
|
864
|
+
expect(date.updateMask()).toBe('##-##-#### ~ ##-##-####');
|
|
865
|
+
expect(date.mask).toBe('##-##-#### ~ ##-##-####');
|
|
866
|
+
|
|
867
|
+
date.value = ['17/11/2020'];
|
|
868
|
+
|
|
869
|
+
expect(date.updateMask()).toBe('##-##-#### ~ ##-##-####');
|
|
870
|
+
expect(date.mask).toBe('##-##-#### ~ ##-##-####');
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
it('when initial mask is set and value is set but invalid, should not change mask', () => {
|
|
874
|
+
const date = new DateRange({
|
|
875
|
+
name: 'date',
|
|
876
|
+
component: 'ZdDateRange',
|
|
877
|
+
dateFormat: 'DD/MM/YYYY',
|
|
878
|
+
mask: '##-##-####',
|
|
879
|
+
displayFormat: 'DD MM YYYY',
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
expect(date.updateMask()).toBe('##-##-#### ~ ##-##-####');
|
|
883
|
+
expect(date.mask).toBe('##-##-#### ~ ##-##-####');
|
|
884
|
+
|
|
885
|
+
date.value = ['17/11'];
|
|
886
|
+
|
|
887
|
+
expect(date.updateMask()).toBe('##-##-#### ~ ##-##-####');
|
|
888
|
+
expect(date.mask).toBe('##-##-#### ~ ##-##-####');
|
|
889
|
+
});
|
|
890
|
+
});
|
|
891
|
+
|
|
892
|
+
describe('updateHelperHint', () => {
|
|
893
|
+
beforeEach(() => {
|
|
894
|
+
I18n.init({});
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
it('should update hint for CURRENT_WEEK', () => {
|
|
898
|
+
I18n.instance.language = 'pt-BR'; // simula português
|
|
899
|
+
const instance = new DateRange({
|
|
900
|
+
name: 'date',
|
|
901
|
+
component: 'ZdDateRange',
|
|
902
|
+
hint: 'hint',
|
|
903
|
+
persistentHint: false,
|
|
904
|
+
});
|
|
905
|
+
|
|
906
|
+
instance.updateHelperHint('CURRENT_WEEK');
|
|
907
|
+
expect(instance.hint).toBe('Semana Atual');
|
|
908
|
+
expect(instance.persistentHint).toBeTruthy();
|
|
909
|
+
|
|
910
|
+
instance.change();
|
|
911
|
+
expect(instance.hint).toBe('hint');
|
|
912
|
+
expect(instance.persistentHint).toBeFalsy();
|
|
913
|
+
});
|
|
914
|
+
|
|
915
|
+
it('should update hint for CURRENT_MONTH', () => {
|
|
916
|
+
I18n.instance.language = 'pt-BR'; // simula português
|
|
917
|
+
const instance = new DateRange({
|
|
918
|
+
name: 'date',
|
|
919
|
+
component: 'ZdDateRange',
|
|
920
|
+
hint: 'hint',
|
|
921
|
+
persistentHint: false,
|
|
922
|
+
});
|
|
923
|
+
|
|
924
|
+
instance.updateHelperHint('CURRENT_MONTH');
|
|
925
|
+
expect(instance.hint).toBe('Mês Atual');
|
|
926
|
+
expect(instance.persistentHint).toBeTruthy();
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
it('should reset hint when helper is empty', () => {
|
|
930
|
+
const instance = new DateRange({
|
|
931
|
+
name: 'date',
|
|
932
|
+
component: 'ZdDateRange',
|
|
933
|
+
hint: 'hint',
|
|
934
|
+
persistentHint: false,
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
instance.updateHelperHint('');
|
|
938
|
+
expect(instance.hint).toBe('hint');
|
|
939
|
+
expect(instance.persistentHint).toBeFalsy();
|
|
940
|
+
});
|
|
941
|
+
});
|
|
942
|
+
|
|
943
|
+
describe('getMaskValue', () => {
|
|
944
|
+
it('should return mask', () => {
|
|
945
|
+
const instance = new DateRange({
|
|
946
|
+
name: 'datePicker',
|
|
947
|
+
component: 'ZdDateRange',
|
|
948
|
+
dateFormat: 'DD/MM/YYYY',
|
|
949
|
+
displayFormat: 'YYYY-MM-DD',
|
|
950
|
+
mask: '####/##/##',
|
|
951
|
+
});
|
|
952
|
+
|
|
953
|
+
const maskValue = instance.getMaskValue();
|
|
954
|
+
expect(maskValue.length).toBe(23);
|
|
955
|
+
expect(maskValue[0]).toEqual(/\d/);
|
|
956
|
+
|
|
957
|
+
instance.mask = () => '##/##/## ~ ##/##/##';
|
|
958
|
+
const maskValue2 = instance.getMaskValue();
|
|
959
|
+
expect(maskValue2.length).toBe(19);
|
|
960
|
+
expect(maskValue2[0]).toEqual('#');
|
|
961
|
+
|
|
962
|
+
instance.value = ['01/01/2022', '02/02/2022'];
|
|
963
|
+
const maskValue21 = instance.getMaskValue();
|
|
964
|
+
expect(maskValue21.length).toBe(19);
|
|
965
|
+
expect(maskValue21[0]).toEqual('#');
|
|
966
|
+
|
|
967
|
+
instance.mask = '';
|
|
968
|
+
const maskValue3 = instance.getMaskValue();
|
|
969
|
+
expect(maskValue3.length).toBe(0);
|
|
970
|
+
|
|
971
|
+
instance.mask = [/\d/, /\d/, '-', /\d/, /\d/, '-', /\d/, /\d/, ' ~ ', /\d/, /\d/, '-', /\d/, /\d/, '-', /\d/, /\d/];
|
|
972
|
+
const maskValue4 = instance.getMaskValue();
|
|
973
|
+
expect(maskValue4.length).toBe(17);
|
|
974
|
+
});
|
|
975
|
+
});
|
|
976
|
+
|
|
977
|
+
describe('DateRange Tests', () => {
|
|
978
|
+
let dateInput: DateRange;
|
|
979
|
+
|
|
980
|
+
beforeEach(() => {
|
|
981
|
+
dateInput = new DateRange({ name: 'date', component: 'DateInput' });
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
describe('setNativeDate', () => {
|
|
985
|
+
it('should handle one date', () => {
|
|
986
|
+
const testDate = new Date(2025, 0, 15);
|
|
987
|
+
dateInput.dateFormat = 'YYYY-MM-DD';
|
|
988
|
+
dateInput.displayFormat = 'DD/MM/YYYY';
|
|
989
|
+
dateInput.setNativeDate([testDate]);
|
|
990
|
+
|
|
991
|
+
expect(dateInput.value).toEqual(['2025-01-15']);
|
|
992
|
+
expect(dateInput.displayValue).toBe('15/01/2025');
|
|
993
|
+
});
|
|
994
|
+
|
|
995
|
+
it('should handle two dates', () => {
|
|
996
|
+
const start = new Date(2025, 0, 1);
|
|
997
|
+
const end = new Date(2025, 0, 5);
|
|
998
|
+
dateInput.dateFormat = 'YYYY-MM-DD';
|
|
999
|
+
dateInput.displayFormat = 'DD/MM/YYYY';
|
|
1000
|
+
dateInput.setNativeDate([start, end]);
|
|
1001
|
+
|
|
1002
|
+
expect(dateInput.value).toEqual(['2025-01-01', '2025-01-05']);
|
|
1003
|
+
expect(dateInput.displayValue).toBe('01/01/2025 ~ 05/01/2025');
|
|
1004
|
+
});
|
|
1005
|
+
});
|
|
1006
|
+
|
|
1007
|
+
describe('getNativeDate', () => {
|
|
1008
|
+
it('should return Date objects array for set value', () => {
|
|
1009
|
+
const testDate = new Date(2025, 4, 22);
|
|
1010
|
+
dateInput.dateFormat = 'YYYY-MM-DD';
|
|
1011
|
+
dateInput.setNativeDate([testDate]);
|
|
1012
|
+
|
|
1013
|
+
const nativeDates = dateInput.getNativeDate();
|
|
1014
|
+
expect(nativeDates[0]).toEqual(testDate);
|
|
1015
|
+
});
|
|
1016
|
+
|
|
1017
|
+
it('should return empty array when no value is set', () => {
|
|
1018
|
+
dateInput.value = '';
|
|
1019
|
+
const nativeDates = dateInput.getNativeDate();
|
|
1020
|
+
expect(nativeDates).toEqual([]);
|
|
1021
|
+
});
|
|
1022
|
+
});
|
|
1023
|
+
});
|
|
1024
|
+
|
|
1025
|
+
describe('DateRange edge cases', () => {
|
|
1026
|
+
let dateInput: DateRange;
|
|
1027
|
+
|
|
1028
|
+
beforeEach(() => {
|
|
1029
|
+
dateInput = new DateRange({ name: 'date', component: 'DateInput' });
|
|
1030
|
+
});
|
|
1031
|
+
|
|
1032
|
+
it('should handle empty array and set value to empty', () => {
|
|
1033
|
+
dateInput.setNativeDate([]);
|
|
1034
|
+
expect(dateInput.value).toEqual([]);
|
|
1035
|
+
});
|
|
1036
|
+
});
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
dayjs.extend(utc);
|
|
1040
|
+
|
|
1041
|
+
describe('DateRange map format line 493 coverage', () => {
|
|
1042
|
+
it('should format dates and handle nulls internally', () => {
|
|
1043
|
+
const dateInput = new DateRange({
|
|
1044
|
+
name: 'date',
|
|
1045
|
+
component: 'DateInput',
|
|
1046
|
+
dateFormat: 'YYYY-MM-DD',
|
|
1047
|
+
});
|
|
1048
|
+
|
|
1049
|
+
const start = new Date(2025, 0, 1); // local 1 Jan 2025
|
|
1050
|
+
const end = new Date(2025, 0, 5); // local 5 Jan 2025
|
|
1051
|
+
|
|
1052
|
+
dateInput.setNativeDate([start, end]);
|
|
1053
|
+
|
|
1054
|
+
expect(dateInput.value).toEqual([
|
|
1055
|
+
dayjs(start).format('YYYY-MM-DD'),
|
|
1056
|
+
dayjs(end).format('YYYY-MM-DD'),
|
|
1057
|
+
]);
|
|
1058
|
+
|
|
1059
|
+
// apenas uma data
|
|
1060
|
+
dateInput.setNativeDate([start]);
|
|
1061
|
+
expect(dateInput.value).toEqual([dayjs(start).format('YYYY-MM-DD')]);
|
|
1062
|
+
|
|
1063
|
+
// array vazio
|
|
1064
|
+
dateInput.setNativeDate([]);
|
|
1065
|
+
expect(dateInput.value).toEqual([]);
|
|
1066
|
+
});
|
|
1067
|
+
});
|
|
1068
|
+
|
|
1069
|
+
describe('DateRange map format line 494 coverage', () => {
|
|
1070
|
+
it('should format dates and handle nulls internally', () => {
|
|
1071
|
+
const dateInput = new DateRange({
|
|
1072
|
+
name: 'date',
|
|
1073
|
+
component: 'DateInput',
|
|
1074
|
+
dateFormat: 'YYYY-MM-DD',
|
|
1075
|
+
});
|
|
1076
|
+
|
|
1077
|
+
const start = new Date(2025, 0, 1);
|
|
1078
|
+
const end = new Date(2025, 0, 5);
|
|
1079
|
+
|
|
1080
|
+
// Simula dateObject interno com null no meio
|
|
1081
|
+
(dateInput as any).dateObject = [dayjs(start), null, dayjs(end)];
|
|
1082
|
+
|
|
1083
|
+
const formatted = (dateInput as any).dateObject.map(
|
|
1084
|
+
(obj: any) => obj?.format('YYYY-MM-DD') || ''
|
|
1085
|
+
);
|
|
1086
|
+
|
|
1087
|
+
expect(formatted).toEqual([
|
|
1088
|
+
dayjs(start).format('YYYY-MM-DD'),
|
|
1089
|
+
'',
|
|
1090
|
+
dayjs(end).format('YYYY-MM-DD'),
|
|
1091
|
+
]);
|
|
1092
|
+
});
|
|
1093
|
+
});
|
|
1094
|
+
|
|
1095
|
+
describe('DateRange.getNativeDate', () => {
|
|
1096
|
+
it('should return formatted dates for valid dayjs objects', () => {
|
|
1097
|
+
const instance = new DateRange({ name: 'date', component: 'ZdDateRange' });
|
|
1098
|
+
const dayjsArray = [dayjs('2025-01-01'), dayjs('2025-01-05')];
|
|
1099
|
+
(instance as any).dateObject = dayjsArray;
|
|
1100
|
+
const nativeDates = dayjsArray.map((date) => date.toDate());
|
|
1101
|
+
expect(instance.getNativeDate()).toEqual(nativeDates);
|
|
1102
|
+
});
|
|
1103
|
+
|
|
1104
|
+
it('should skip null values', () => {
|
|
1105
|
+
const instance = new DateRange({ name: 'date', component: 'ZdDateRange' });
|
|
1106
|
+
const dayjsArray = [dayjs('2025-01-01'), null, dayjs('2025-01-05')];
|
|
1107
|
+
(instance as any).dateObject = dayjsArray;
|
|
1108
|
+
const nativeDates = dayjsArray.filter((date) => (date !== null)).map((date) => date.toDate());
|
|
1109
|
+
expect(instance.getNativeDate()).toEqual(nativeDates);
|
|
1110
|
+
});
|
|
1111
|
+
|
|
1112
|
+
it('should return empty array if all values are null', () => {
|
|
1113
|
+
const instance = new DateRange({ name: 'date', component: 'ZdDateRange' });
|
|
1114
|
+
(instance as any).dateObject = [null, null];
|
|
1115
|
+
expect(instance.getNativeDate()).toEqual([]);
|
|
1116
|
+
});
|
|
1117
|
+
|
|
1118
|
+
it('should return empty array if dateObject is empty', () => {
|
|
1119
|
+
const instance = new DateRange({ name: 'date', component: 'ZdDateRange' });
|
|
1120
|
+
(instance as any).dateObject = [];
|
|
1121
|
+
expect(instance.getNativeDate()).toEqual([]);
|
|
1122
|
+
});
|
|
1123
|
+
});
|
|
1124
|
+
|
|
1125
|
+
});
|