@heartlandone/vega 2.63.1 → 2.65.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/{app-globals-2d0b157e.js → app-globals-681a0ed4.js} +10 -10
- package/dist/cjs/{brand-switch-state-controller-slimmer-b83a4596.js → brand-switch-state-controller-slimmer-3d41b2a4.js} +1 -1
- package/dist/cjs/{child-nodes-event-prevent-slimmer-4e96270e.js → child-nodes-event-prevent-slimmer-feb072c4.js} +1 -1
- package/dist/cjs/{child-nodes-notify-observer-slimmer-34ac3bfc.js → child-nodes-notify-observer-slimmer-257fedb3.js} +1 -1
- package/dist/cjs/{code-block-cc740807.js → code-block-961d54e8.js} +13 -17
- package/dist/cjs/{component-value-history-controller-slimmer.abstract-0bb81172.js → component-value-history-controller-slimmer.abstract-c5b8b47b.js} +6 -6
- package/dist/cjs/{dark-mode-state-controller-slimmer-17022f93.js → dark-mode-state-controller-slimmer-8a87ec08.js} +1 -1
- package/dist/cjs/{dark-mode-style-controller-b1e9ec82.js → dark-mode-style-controller-27809ff8.js} +1 -1
- package/dist/cjs/{design-token-bf913c86.js → design-token-98652b67.js} +1 -1
- package/dist/cjs/{dom-node-subject-observer-factory-58e3c010.js → dom-node-subject-observer-factory-56609e5a.js} +1 -1
- package/dist/cjs/{dto-renderer-manager-424c5031.js → dto-renderer-manager-4b9d2560.js} +11 -6
- package/dist/cjs/{element-appender-slimmer-1d035b1f.js → element-appender-slimmer-1f46981b.js} +6 -6
- package/dist/cjs/{event-emit-slimmer-428d8802.js → event-emit-slimmer-3cefb326.js} +2 -2
- package/dist/cjs/{form-field-controller-slimmer-cc6e53a4.js → form-field-controller-slimmer-1e1123ea.js} +16 -8
- package/dist/cjs/{image-annotation-action-f831e09b.js → image-annotation-action-03b36f68.js} +5 -5
- package/dist/cjs/{index-00ba6623.js → index-58ea899e.js} +1 -0
- package/dist/cjs/{index-5505e8dd.js → index-f2fe26a0.js} +2 -2
- package/dist/cjs/index.cjs.js +16 -16
- package/dist/cjs/{inject-keyboard-manager-ad865c95.js → inject-keyboard-manager-51033b3f.js} +1 -1
- package/dist/cjs/{internal-vega-event-manager-28b957c8.js → internal-vega-event-manager-9b503f1a.js} +1 -1
- package/dist/cjs/{keyboard-manager-7f4e1f43.js → keyboard-manager-144907d7.js} +1 -1
- package/dist/cjs/{keyboard-manager-slimmer-138a90e5.js → keyboard-manager-slimmer-04c48756.js} +1 -1
- package/dist/cjs/{language-extension-cfe0eabd.js → language-extension-059d62f6.js} +2 -2
- package/dist/cjs/loader.cjs.js +15 -15
- package/dist/cjs/{public-rules-7e9b633d.js → public-rules-58e0218b.js} +8 -8
- package/dist/cjs/{range-44f08955.js → range-42732973.js} +2 -2
- package/dist/cjs/{responsive-format-facade-a7fbefc4.js → responsive-format-facade-29070d00.js} +5 -5
- package/dist/cjs/{rich-text-editor-required-rule-a0618c85.js → rich-text-editor-required-rule-ce4dd5fb.js} +1 -1
- package/dist/cjs/{static-subject-title-85732e0f.js → static-subject-title-5829a298.js} +0 -8
- package/dist/cjs/{string-input-formatter-slimmer-f6c7a255.js → string-input-formatter-slimmer-0d69ea76.js} +3 -3
- package/dist/cjs/{style-formatter-795451f2.js → style-formatter-f6723cb3.js} +1 -1
- package/dist/cjs/{sub-state-notify-slimmer-bb64fcfc.js → sub-state-notify-slimmer-066f2aa9.js} +2 -2
- package/dist/cjs/{sub-state-observer-slimmer-84175d61.js → sub-state-observer-slimmer-569e3297.js} +3 -3
- package/dist/cjs/{token-extension-4764d5f3.js → token-extension-260adb8a.js} +6 -6
- package/dist/cjs/{translation-cde4dce3.js → translation-f5adcb9f.js} +1 -1
- package/dist/cjs/{translation-slimmer-af399096.js → translation-slimmer-4b6239d1.js} +1 -1
- package/dist/cjs/{ui-4ce1fa08.js → ui-9e181079.js} +16 -3
- package/dist/cjs/vega-accordion.cjs.entry.js +14 -14
- package/dist/cjs/vega-app-footer.cjs.entry.js +4 -4
- package/dist/cjs/vega-app-header-button.cjs.entry.js +15 -15
- package/dist/cjs/vega-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/vega-banner.cjs.entry.js +5 -5
- package/dist/cjs/vega-bar-chart.cjs.entry.js +1 -1
- package/dist/cjs/vega-box.cjs.entry.js +14 -14
- package/dist/cjs/vega-brand-logo.cjs.entry.js +4 -4
- package/dist/cjs/vega-breadcrumb.cjs.entry.js +6 -6
- package/dist/cjs/vega-button-circle.cjs.entry.js +20 -17
- package/dist/cjs/vega-button-group_2.cjs.entry.js +9 -9
- package/dist/cjs/vega-button-link.cjs.entry.js +6 -6
- package/dist/cjs/vega-button.cjs.entry.js +20 -15
- package/dist/cjs/vega-calendar_4.cjs.entry.js +528 -226
- package/dist/cjs/vega-card.cjs.entry.js +13 -13
- package/dist/cjs/vega-carousel.cjs.entry.js +13 -13
- package/dist/cjs/vega-checkbox_2.cjs.entry.js +12 -12
- package/dist/cjs/vega-chip.cjs.entry.js +15 -15
- package/dist/cjs/vega-code-block.cjs.entry.js +16 -16
- package/dist/cjs/vega-color-picker.cjs.entry.js +10 -10
- package/dist/cjs/vega-combo-box.cjs.entry.js +13 -13
- package/dist/cjs/vega-counter-badge.cjs.entry.js +1 -1
- package/dist/cjs/vega-date-picker_2.cjs.entry.js +63 -26
- package/dist/cjs/vega-dialog_2.cjs.entry.js +16 -16
- package/dist/cjs/vega-divider.cjs.entry.js +13 -13
- package/dist/cjs/vega-dropdown_5.cjs.entry.js +24 -23
- package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
- package/dist/cjs/vega-field-error.cjs.entry.js +2 -2
- package/dist/cjs/vega-field-label.cjs.entry.js +5 -5
- package/dist/cjs/vega-file-uploader.cjs.entry.js +11 -11
- package/dist/cjs/vega-flag-icon.cjs.entry.js +13 -13
- package/dist/cjs/vega-flex.cjs.entry.js +14 -14
- package/dist/cjs/vega-font.cjs.entry.js +13 -13
- package/dist/cjs/vega-form.cjs.entry.js +636 -323
- package/dist/cjs/vega-grid.cjs.entry.js +13 -13
- package/dist/cjs/vega-hint.cjs.entry.js +1 -1
- package/dist/cjs/vega-icon.cjs.entry.js +13 -13
- package/dist/cjs/vega-image-uploader.cjs.entry.js +18 -18
- package/dist/cjs/vega-input-credit-card.cjs.entry.js +11 -11
- package/dist/cjs/vega-input-numeric.cjs.entry.js +14 -14
- package/dist/cjs/vega-input-phone-number.cjs.entry.js +15 -15
- package/dist/cjs/vega-input-range.cjs.entry.js +12 -12
- package/dist/cjs/vega-input-select.cjs.entry.js +17 -17
- package/dist/cjs/vega-input.cjs.entry.js +12 -12
- package/dist/cjs/{vega-internal-event-id-9647aaf8.js → vega-internal-event-id-6d4a2c53.js} +8 -0
- package/dist/cjs/vega-item-toggle.cjs.entry.js +5 -5
- package/dist/cjs/vega-left-nav_5.cjs.entry.js +45 -21
- package/dist/cjs/vega-line-chart.cjs.entry.js +1 -1
- package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +12 -12
- package/dist/cjs/vega-page-notification_2.cjs.entry.js +3 -3
- package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +6 -6
- package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +7 -7
- package/dist/cjs/vega-pagination.cjs.entry.js +15 -15
- package/dist/cjs/vega-pie-chart.cjs.entry.js +1 -1
- package/dist/cjs/vega-popover_2.cjs.entry.js +17 -17
- package/dist/cjs/vega-progress-tracker.cjs.entry.js +5 -5
- package/dist/cjs/vega-radio_2.cjs.entry.js +14 -14
- package/dist/cjs/vega-rich-text-content.cjs.entry.js +11 -11
- package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +25 -29
- package/dist/cjs/vega-section-title.cjs.entry.js +1 -1
- package/dist/cjs/vega-segment-control.cjs.entry.js +5 -5
- package/dist/cjs/vega-selection-chip_2.cjs.entry.js +17 -17
- package/dist/cjs/vega-selection-tile_2.cjs.entry.js +13 -13
- package/dist/cjs/vega-sidenav_3.cjs.entry.js +15 -15
- package/dist/cjs/vega-signature-capture.cjs.entry.js +17 -17
- package/dist/cjs/vega-skeleton.cjs.entry.js +1 -1
- package/dist/cjs/vega-slot-container.cjs.entry.js +1 -1
- package/dist/cjs/vega-stepper.cjs.entry.js +11 -11
- package/dist/cjs/vega-tab-group_2.cjs.entry.js +7 -7
- package/dist/cjs/vega-table_8.cjs.entry.js +17 -17
- package/dist/cjs/vega-text.cjs.entry.js +2 -2
- package/dist/cjs/vega-textarea.cjs.entry.js +11 -11
- package/dist/cjs/vega-time-picker_2.cjs.entry.js +20 -20
- package/dist/cjs/vega-toggle-switch.cjs.entry.js +10 -10
- package/dist/cjs/vega-tooltip_2.cjs.entry.js +15 -15
- package/dist/cjs/vega.cjs.js +15 -15
- package/dist/collection/components/vega-button/vega-button.js +9 -2
- package/dist/collection/components/vega-button-circle/vega-button-circle.js +8 -3
- package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-current-period-controller.js +7 -4
- package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-controller.js +21 -1
- package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-preivew-popover-controller.js +18 -1
- package/dist/collection/components/vega-calendar/slimmers/common/controllers/vega-calendar-post-operation-date-controller.js +14 -1
- package/dist/collection/components/vega-calendar/slimmers/common/helpers/repeat-pattern/calendar-event-repeat-pattern-factory.js +8 -9
- package/dist/collection/components/vega-calendar/slimmers/common/helpers/repeat-pattern/calendar-event-weekly-repeat-pattern.js +3 -1
- package/dist/collection/components/vega-calendar/slimmers/common/helpers/test/calendar-event-repeat-pattern-factory.test.js +34 -0
- package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-item-renderer.js +1 -1
- package/dist/collection/components/vega-calendar/slimmers/common/renderers/vega-calendar-event-preview-popover-renderer.js +7 -6
- package/dist/collection/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-time-marker-renderer.js +31 -5
- package/dist/collection/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-view-with-time-renderer.js +4 -1
- package/dist/collection/components/vega-calendar/slimmers/month-view/renderers/vega-calendar-month-event-renderer.js +11 -10
- package/dist/collection/components/vega-calendar/slimmers/month-view/renderers/vega-calendar-month-view-renderer.js +4 -1
- package/dist/collection/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.js +15 -5
- package/dist/collection/components/vega-calendar/vega-calendar.js +47 -1
- package/dist/collection/components/vega-date-picker/slimmers/renderers/vega-date-picker-calendar-renderer.js +37 -3
- package/dist/collection/components/vega-date-picker/vega-date-picker.js +6 -0
- package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +1 -1
- package/dist/collection/components/vega-dropdown/vega-dropdown-item/vega-dropdown-item.css +4 -8
- package/dist/collection/components/vega-dropdown/vega-dropdown.js +4 -0
- package/dist/collection/components/vega-form/slimmers/controllers/vega-form-field-controller.js +351 -0
- package/dist/collection/components/vega-form/slimmers/controllers/vega-form-reset-controller.js +99 -0
- package/dist/collection/components/vega-form/slimmers/controllers/vega-form-submit-controller.js +122 -0
- package/dist/collection/components/vega-form/slimmers/renderers/native-form-renderer.js +30 -0
- package/dist/collection/components/vega-form/vega-form.js +97 -335
- package/dist/collection/components/vega-modal/vega-modal.css +4 -1
- package/dist/collection/components/vega-nav/slimmers/vega-nav-observer-slimmer.js +8 -3
- package/dist/collection/components/vega-nav/vega-left-nav-link/slimmers/controllers/vega-left-nav-link-controller.js +21 -4
- package/dist/collection/components/vega-rich-text-editor/dto/annotations/link-annotation.js +1 -1
- package/dist/collection/components/vega-rich-text-editor/dto/annotations/link-group-annotation.js +5 -7
- package/dist/collection/components/vega-rich-text-editor/dto/blocks/text-block.js +3 -5
- package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +7 -2
- package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/vega-rich-text-editor-renderer.js +1 -5
- package/dist/collection/components/vega-rich-text-editor/test/dto/annotations.test.js +9 -1
- package/dist/collection/components/vega-rich-text-editor/test/dto/blocks/text-block.test.js +1 -1
- package/dist/collection/components/vega-rich-text-editor/test/dto/content-state.test.js +51 -40
- package/dist/collection/helpers/calendar/calendar-date.js +10 -8
- package/dist/collection/helpers/calendar/calendar-event.js +152 -16
- package/dist/collection/helpers/calendar/calendar-period/calendar-period.abstract.js +13 -4
- package/dist/collection/helpers/calendar/calendar-period/day-period.js +4 -4
- package/dist/collection/helpers/calendar/calendar-period/month-period.js +7 -6
- package/dist/collection/helpers/calendar/calendar-period/week-period.js +3 -3
- package/dist/collection/helpers/calendar/calendar-view-generator/week-view-generator.js +1 -1
- package/dist/collection/helpers/calendar/test/calendar-date.test.js +24 -0
- package/dist/collection/helpers/calendar/test/calendar-event.test.js +71 -0
- package/dist/collection/helpers/calendar/test/calendar-period/day-period.test.js +28 -0
- package/dist/collection/helpers/calendar/test/calendar-period/month-period.test.js +35 -0
- package/dist/collection/helpers/calendar/test/calendar-period/week-period.test.js +43 -0
- package/dist/collection/helpers/calendar/test/utils.test.js +29 -1
- package/dist/collection/helpers/calendar/utils.js +46 -0
- package/dist/collection/helpers/change-manager/subject/static-subject/static-subject-title.js +0 -3
- package/dist/collection/helpers/event-manager/event-id/vega-internal-event-id.js +4 -0
- package/dist/collection/helpers/validator/form-field-controller.js +13 -3
- package/dist/collection/utils/test/ui.test.js +55 -0
- package/dist/collection/utils/ui.js +16 -3
- package/dist/esm/{app-globals-2623304e.js → app-globals-1bacb762.js} +10 -10
- package/dist/esm/{brand-switch-state-controller-slimmer-d6e4d217.js → brand-switch-state-controller-slimmer-60249013.js} +1 -1
- package/dist/esm/{child-nodes-event-prevent-slimmer-7fe3dc57.js → child-nodes-event-prevent-slimmer-f32efdee.js} +1 -1
- package/dist/esm/{child-nodes-notify-observer-slimmer-78f77c2c.js → child-nodes-notify-observer-slimmer-b676cd2b.js} +1 -1
- package/dist/esm/{code-block-23e7f8d0.js → code-block-cb657afd.js} +13 -17
- package/dist/esm/{component-value-history-controller-slimmer.abstract-df25e4a1.js → component-value-history-controller-slimmer.abstract-65a83eaf.js} +6 -6
- package/dist/esm/{dark-mode-state-controller-slimmer-0c7d1c77.js → dark-mode-state-controller-slimmer-f2b4f8ed.js} +1 -1
- package/dist/esm/{dark-mode-style-controller-972e1f06.js → dark-mode-style-controller-b7e85b6a.js} +1 -1
- package/dist/esm/{design-token-0f439510.js → design-token-3889675a.js} +1 -1
- package/dist/esm/{dom-node-subject-observer-factory-c7bc3035.js → dom-node-subject-observer-factory-ed4b89f4.js} +1 -1
- package/dist/esm/{dto-renderer-manager-65b7b1b1.js → dto-renderer-manager-8cac8f0f.js} +11 -6
- package/dist/esm/{element-appender-slimmer-bf5ca501.js → element-appender-slimmer-31b21e1b.js} +6 -6
- package/dist/esm/{event-emit-slimmer-3922d816.js → event-emit-slimmer-000ca6a7.js} +2 -2
- package/dist/esm/{form-field-controller-slimmer-f7e8845b.js → form-field-controller-slimmer-24dbc255.js} +16 -8
- package/dist/esm/{image-annotation-action-af21ea8f.js → image-annotation-action-59ea166c.js} +5 -5
- package/dist/esm/{index-057d0f70.js → index-090d31ca.js} +1 -0
- package/dist/esm/{index-7fe93427.js → index-50b32f3d.js} +2 -2
- package/dist/esm/index.js +16 -16
- package/dist/esm/{inject-keyboard-manager-109817bf.js → inject-keyboard-manager-f7d92809.js} +1 -1
- package/dist/esm/{internal-vega-event-manager-cb06e987.js → internal-vega-event-manager-13e3ed3d.js} +1 -1
- package/dist/esm/{keyboard-manager-ab521d22.js → keyboard-manager-f4bbc452.js} +1 -1
- package/dist/esm/{keyboard-manager-slimmer-cae3a002.js → keyboard-manager-slimmer-a02cbc5f.js} +1 -1
- package/dist/esm/{language-extension-d355f9aa.js → language-extension-038014ac.js} +2 -2
- package/dist/esm/loader.js +15 -15
- package/dist/esm/{public-rules-1a5da7bf.js → public-rules-a42e6f59.js} +8 -8
- package/dist/esm/{range-fac2962c.js → range-c08d8de1.js} +2 -2
- package/dist/esm/{responsive-format-facade-2904b456.js → responsive-format-facade-d8ccc742.js} +5 -5
- package/dist/esm/{rich-text-editor-required-rule-bb94d680.js → rich-text-editor-required-rule-3a8f319c.js} +1 -1
- package/dist/esm/{static-subject-title-633b3474.js → static-subject-title-52f93124.js} +1 -5
- package/dist/esm/{string-input-formatter-slimmer-69117deb.js → string-input-formatter-slimmer-c64c7855.js} +3 -3
- package/dist/esm/{style-formatter-a724e38d.js → style-formatter-ab6a9248.js} +1 -1
- package/dist/esm/{sub-state-notify-slimmer-4252a90e.js → sub-state-notify-slimmer-8b3b15ee.js} +2 -2
- package/dist/esm/{sub-state-observer-slimmer-baa8853a.js → sub-state-observer-slimmer-2b98e2c9.js} +3 -3
- package/dist/esm/{token-extension-89eeef74.js → token-extension-f5bf06a5.js} +6 -6
- package/dist/esm/{translation-833d9ef4.js → translation-f10b1e19.js} +1 -1
- package/dist/esm/{translation-slimmer-c83b52c1.js → translation-slimmer-984c9ce6.js} +1 -1
- package/dist/esm/{ui-c20be16d.js → ui-bb99c0c2.js} +16 -3
- package/dist/esm/vega-accordion.entry.js +14 -14
- package/dist/esm/vega-app-footer.entry.js +4 -4
- package/dist/esm/vega-app-header-button.entry.js +15 -15
- package/dist/esm/vega-backdrop.entry.js +2 -2
- package/dist/esm/vega-banner.entry.js +5 -5
- package/dist/esm/vega-bar-chart.entry.js +1 -1
- package/dist/esm/vega-box.entry.js +14 -14
- package/dist/esm/vega-brand-logo.entry.js +4 -4
- package/dist/esm/vega-breadcrumb.entry.js +6 -6
- package/dist/esm/vega-button-circle.entry.js +20 -17
- package/dist/esm/vega-button-group_2.entry.js +9 -9
- package/dist/esm/vega-button-link.entry.js +6 -6
- package/dist/esm/vega-button.entry.js +20 -15
- package/dist/esm/vega-calendar_4.entry.js +529 -227
- package/dist/esm/vega-card.entry.js +13 -13
- package/dist/esm/vega-carousel.entry.js +13 -13
- package/dist/esm/vega-checkbox_2.entry.js +12 -12
- package/dist/esm/vega-chip.entry.js +15 -15
- package/dist/esm/vega-code-block.entry.js +16 -16
- package/dist/esm/vega-color-picker.entry.js +10 -10
- package/dist/esm/vega-combo-box.entry.js +13 -13
- package/dist/esm/vega-counter-badge.entry.js +1 -1
- package/dist/esm/vega-date-picker_2.entry.js +63 -26
- package/dist/esm/vega-dialog_2.entry.js +16 -16
- package/dist/esm/vega-divider.entry.js +13 -13
- package/dist/esm/vega-dropdown_5.entry.js +24 -23
- package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
- package/dist/esm/vega-field-error.entry.js +2 -2
- package/dist/esm/vega-field-label.entry.js +5 -5
- package/dist/esm/vega-file-uploader.entry.js +11 -11
- package/dist/esm/vega-flag-icon.entry.js +13 -13
- package/dist/esm/vega-flex.entry.js +14 -14
- package/dist/esm/vega-font.entry.js +13 -13
- package/dist/esm/vega-form.entry.js +636 -323
- package/dist/esm/vega-grid.entry.js +13 -13
- package/dist/esm/vega-hint.entry.js +1 -1
- package/dist/esm/vega-icon.entry.js +13 -13
- package/dist/esm/vega-image-uploader.entry.js +18 -18
- package/dist/esm/vega-input-credit-card.entry.js +11 -11
- package/dist/esm/vega-input-numeric.entry.js +14 -14
- package/dist/esm/vega-input-phone-number.entry.js +15 -15
- package/dist/esm/vega-input-range.entry.js +12 -12
- package/dist/esm/vega-input-select.entry.js +17 -17
- package/dist/esm/vega-input.entry.js +12 -12
- package/dist/esm/{vega-internal-event-id-5a143cd2.js → vega-internal-event-id-5c3e5f7f.js} +5 -1
- package/dist/esm/vega-item-toggle.entry.js +5 -5
- package/dist/esm/vega-left-nav_5.entry.js +45 -21
- package/dist/esm/vega-line-chart.entry.js +1 -1
- package/dist/esm/vega-loader-wrapper_2.entry.js +12 -12
- package/dist/esm/vega-page-notification_2.entry.js +3 -3
- package/dist/esm/vega-pagination-page-selector-mobile.entry.js +6 -6
- package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +7 -7
- package/dist/esm/vega-pagination.entry.js +15 -15
- package/dist/esm/vega-pie-chart.entry.js +1 -1
- package/dist/esm/vega-popover_2.entry.js +17 -17
- package/dist/esm/vega-progress-tracker.entry.js +5 -5
- package/dist/esm/vega-radio_2.entry.js +14 -14
- package/dist/esm/vega-rich-text-content.entry.js +11 -11
- package/dist/esm/vega-rich-text-editor_4.entry.js +25 -29
- package/dist/esm/vega-section-title.entry.js +1 -1
- package/dist/esm/vega-segment-control.entry.js +5 -5
- package/dist/esm/vega-selection-chip_2.entry.js +17 -17
- package/dist/esm/vega-selection-tile_2.entry.js +13 -13
- package/dist/esm/vega-sidenav_3.entry.js +15 -15
- package/dist/esm/vega-signature-capture.entry.js +17 -17
- package/dist/esm/vega-skeleton.entry.js +1 -1
- package/dist/esm/vega-slot-container.entry.js +1 -1
- package/dist/esm/vega-stepper.entry.js +11 -11
- package/dist/esm/vega-tab-group_2.entry.js +7 -7
- package/dist/esm/vega-table_8.entry.js +17 -17
- package/dist/esm/vega-text.entry.js +2 -2
- package/dist/esm/vega-textarea.entry.js +11 -11
- package/dist/esm/vega-time-picker_2.entry.js +20 -20
- package/dist/esm/vega-toggle-switch.entry.js +10 -10
- package/dist/esm/vega-tooltip_2.entry.js +15 -15
- package/dist/esm/vega.js +15 -15
- package/dist/sri/vega-sri-loader.js +147 -0
- package/dist/sri/vega-sri-manifest.json +698 -0
- package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-current-period-controller.d.ts +1 -0
- package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-controller.d.ts +6 -0
- package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-event-preivew-popover-controller.d.ts +5 -0
- package/dist/types/components/vega-calendar/slimmers/common/controllers/vega-calendar-post-operation-date-controller.d.ts +6 -0
- package/dist/types/components/vega-calendar/slimmers/common/helpers/repeat-pattern/calendar-event-repeat-pattern-factory.d.ts +3 -1
- package/dist/types/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-time-marker-renderer.d.ts +1 -0
- package/dist/types/components/vega-calendar/slimmers/day-view/renderers/vega-calendar-view-with-time-renderer.d.ts +1 -0
- package/dist/types/components/vega-calendar/slimmers/month-view/renderers/vega-calendar-month-view-renderer.d.ts +1 -0
- package/dist/types/components/vega-calendar/types.d.ts +5 -0
- package/dist/types/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.d.ts +3 -0
- package/dist/types/components/vega-calendar/vega-calendar.d.ts +17 -0
- package/dist/types/components/vega-date-picker/slimmers/renderers/vega-date-picker-calendar-renderer.d.ts +13 -0
- package/dist/types/components/vega-date-picker/vega-date-picker.d.ts +1 -0
- package/dist/types/components/vega-dropdown/vega-dropdown.d.ts +1 -0
- package/dist/types/components/vega-form/slimmers/controllers/vega-form-field-controller.d.ts +158 -0
- package/dist/types/components/vega-form/slimmers/controllers/vega-form-reset-controller.d.ts +43 -0
- package/dist/types/components/vega-form/slimmers/controllers/vega-form-submit-controller.d.ts +55 -0
- package/dist/types/components/vega-form/slimmers/renderers/native-form-renderer.d.ts +12 -0
- package/dist/types/components/vega-form/types.d.ts +13 -0
- package/dist/types/components/vega-form/vega-form.d.ts +28 -97
- package/dist/types/components/vega-nav/slimmers/vega-nav-observer-slimmer.d.ts +3 -0
- package/dist/types/components/vega-nav/vega-left-nav-link/slimmers/controllers/vega-left-nav-link-controller.d.ts +8 -0
- package/dist/types/components/vega-rich-text-editor/dto/annotations/link-group-annotation.d.ts +0 -1
- package/dist/types/components/vega-rich-text-editor/dto/blocks/text-block.d.ts +1 -2
- package/dist/types/components/vega-rich-text-editor/dto/content-state.d.ts +2 -1
- package/dist/types/components.d.ts +42 -1
- package/dist/types/helpers/calendar/calendar-date.d.ts +5 -3
- package/dist/types/helpers/calendar/calendar-event.d.ts +50 -1
- package/dist/types/helpers/calendar/calendar-period/calendar-period.abstract.d.ts +8 -1
- package/dist/types/helpers/calendar/calendar-period/day-period.d.ts +1 -1
- package/dist/types/helpers/calendar/calendar-period/month-period.d.ts +4 -3
- package/dist/types/helpers/calendar/calendar-period/week-period.d.ts +1 -1
- package/dist/types/helpers/calendar/utils.d.ts +22 -0
- package/dist/types/helpers/change-manager/subject/static-subject/static-subject-title.d.ts +1 -4
- package/dist/types/helpers/event-manager/event-id/vega-internal-event-id.d.ts +4 -0
- package/dist/types/types/components.type.d.ts +0 -1
- package/dist/types/utils/ui.d.ts +5 -1
- package/dist/vega/index.esm.js +1 -1
- package/dist/vega/p-050bb2ad.entry.js +1 -0
- package/dist/vega/{p-3cdbee7e.js → p-053eb64a.js} +1 -1
- package/dist/vega/{p-76c7538a.entry.js → p-0685cba6.entry.js} +1 -1
- package/dist/vega/{p-476cc642.entry.js → p-0b38a01f.entry.js} +1 -1
- package/dist/vega/{p-5e4fb663.entry.js → p-0bb3be0b.entry.js} +1 -1
- package/dist/vega/{p-e74c275a.entry.js → p-12d4488b.entry.js} +1 -1
- package/dist/vega/{p-5397648b.entry.js → p-13c6a04c.entry.js} +1 -1
- package/dist/vega/{p-b6c51409.entry.js → p-185dfdd4.entry.js} +1 -1
- package/dist/vega/{p-942fc9b9.js → p-199dc74b.js} +1 -1
- package/dist/vega/p-1bd5d806.entry.js +1 -0
- package/dist/vega/p-1eb5b772.entry.js +1 -0
- package/dist/vega/{p-2591f217.entry.js → p-1f061725.entry.js} +1 -1
- package/dist/vega/{p-64c281ec.entry.js → p-1f43f551.entry.js} +1 -1
- package/dist/vega/{p-1da54ff3.js → p-2033f86e.js} +1 -1
- package/dist/vega/{p-e513f041.js → p-228de113.js} +1 -1
- package/dist/vega/{p-f1436035.js → p-24cb0a7e.js} +1 -1
- package/dist/vega/{p-f92fc49b.entry.js → p-299e14b4.entry.js} +1 -1
- package/dist/vega/{p-da6369d4.entry.js → p-2d91799a.entry.js} +1 -1
- package/dist/vega/{p-0bc93777.entry.js → p-2f4f3744.entry.js} +1 -1
- package/dist/vega/{p-b32f7aac.entry.js → p-303efbfe.entry.js} +1 -1
- package/dist/vega/p-308aa2e3.js +1 -0
- package/dist/vega/{p-d15e70d7.entry.js → p-33837794.entry.js} +1 -1
- package/dist/vega/p-33c6fb3f.entry.js +1 -0
- package/dist/vega/{p-9b2d8516.entry.js → p-3494a5f1.entry.js} +1 -1
- package/dist/vega/{p-66199d68.js → p-378e5881.js} +1 -1
- package/dist/vega/{p-bf0ced3c.js → p-39482a1a.js} +1 -1
- package/dist/vega/p-39b4c838.js +1 -0
- package/dist/vega/{p-3be7bfee.entry.js → p-3b953a24.entry.js} +1 -1
- package/dist/vega/{p-2ee4def0.js → p-3c21b875.js} +1 -1
- package/dist/vega/p-43257678.js +1 -0
- package/dist/vega/{p-4c3075ef.js → p-45ead9fe.js} +1 -1
- package/dist/vega/{p-351405f2.entry.js → p-4897bedd.entry.js} +1 -1
- package/dist/vega/{p-02a4732a.js → p-4c192985.js} +1 -1
- package/dist/vega/{p-cc5a3a1b.entry.js → p-4dd6554e.entry.js} +1 -1
- package/dist/vega/{p-d4564bfd.js → p-521d1d07.js} +1 -1
- package/dist/vega/{p-57257de0.entry.js → p-5910be31.entry.js} +1 -1
- package/dist/vega/{p-9c309b85.entry.js → p-59d70a67.entry.js} +1 -1
- package/dist/vega/{p-20223e8e.entry.js → p-5cdcd08f.entry.js} +1 -1
- package/dist/vega/{p-589b7ea3.entry.js → p-5d36cc3f.entry.js} +1 -1
- package/dist/vega/{p-09cb98f3.entry.js → p-5e1c913d.entry.js} +1 -1
- package/dist/vega/p-5e2ef0b8.entry.js +1 -0
- package/dist/vega/p-5f377954.js +1 -1
- package/dist/vega/{p-81fbf18f.entry.js → p-5f854901.entry.js} +1 -1
- package/dist/vega/p-5fec05a2.js +1 -0
- package/dist/vega/p-63596567.entry.js +1 -0
- package/dist/vega/{p-92469fa1.entry.js → p-63a5bbf4.entry.js} +1 -1
- package/dist/vega/{p-89d2cf34.js → p-64c3d021.js} +1 -1
- package/dist/vega/{p-0b36f4ce.js → p-651fe4fc.js} +1 -1
- package/dist/vega/{p-26ef2066.entry.js → p-671afda4.entry.js} +1 -1
- package/dist/vega/{p-5970369e.entry.js → p-676bee73.entry.js} +1 -1
- package/dist/vega/{p-6180c1af.entry.js → p-6a4db686.entry.js} +1 -1
- package/dist/vega/{p-614e450a.entry.js → p-6ce1e9d4.entry.js} +1 -1
- package/dist/vega/{p-460429da.entry.js → p-6d371296.entry.js} +1 -1
- package/dist/vega/{p-bc0ae89a.entry.js → p-6f96dd01.entry.js} +1 -1
- package/dist/vega/{p-2d58cf34.entry.js → p-719354e7.entry.js} +1 -1
- package/dist/vega/{p-134ed822.entry.js → p-74e684fc.entry.js} +1 -1
- package/dist/vega/{p-969066d3.entry.js → p-78d607ca.entry.js} +1 -1
- package/dist/vega/p-7c594a9f.js +1 -0
- package/dist/vega/p-7cd2b93b.js +1 -0
- package/dist/vega/{p-8a484812.entry.js → p-833d81d0.entry.js} +1 -1
- package/dist/vega/{p-4f21faf1.js → p-840c09c7.js} +1 -1
- package/dist/vega/p-852fa2d2.entry.js +1 -0
- package/dist/vega/{p-4f5a2b0c.entry.js → p-85ad1c21.entry.js} +1 -1
- package/dist/vega/{p-b4d88fce.entry.js → p-8a5c123f.entry.js} +1 -1
- package/dist/vega/{p-5313d0bc.js → p-901ff5d3.js} +1 -1
- package/dist/vega/{p-2f88ba36.entry.js → p-9439077d.entry.js} +1 -1
- package/dist/vega/{p-c2377afa.js → p-99b1492c.js} +1 -1
- package/dist/vega/{p-40924882.entry.js → p-9d492a46.entry.js} +1 -1
- package/dist/vega/p-9e6db93d.entry.js +1 -0
- package/dist/vega/{p-427b2b55.entry.js → p-a082d41b.entry.js} +1 -1
- package/dist/vega/{p-27dfa896.js → p-a4912b85.js} +1 -1
- package/dist/vega/p-a528714c.js +1 -0
- package/dist/vega/{p-521ace2d.js → p-a5713178.js} +1 -1
- package/dist/vega/{p-7cd2fac8.entry.js → p-a6010b93.entry.js} +1 -1
- package/dist/vega/{p-b110b7bd.entry.js → p-a61e2108.entry.js} +1 -1
- package/dist/vega/{p-3fba9e77.entry.js → p-a69c9e42.entry.js} +1 -1
- package/dist/vega/{p-cfb2af9c.entry.js → p-ab3c4b43.entry.js} +1 -1
- package/dist/vega/{p-8175d8de.entry.js → p-ad2055f4.entry.js} +1 -1
- package/dist/vega/{p-0717073b.entry.js → p-ae598946.entry.js} +1 -1
- package/dist/vega/{p-743c5baf.js → p-b4c25109.js} +1 -1
- package/dist/vega/{p-2608b9fe.js → p-b510e4d7.js} +1 -1
- package/dist/vega/{p-2a1b3108.entry.js → p-b68a13df.entry.js} +1 -1
- package/dist/vega/{p-320cccc5.entry.js → p-ba24f7b9.entry.js} +1 -1
- package/dist/vega/{p-2b90fae6.js → p-bc9484a6.js} +1 -1
- package/dist/vega/{p-dcae53cf.entry.js → p-c12000ee.entry.js} +1 -1
- package/dist/vega/{p-25c831a4.entry.js → p-c1fa6088.entry.js} +2 -2
- package/dist/vega/{p-ab29f968.js → p-c241f615.js} +1 -1
- package/dist/vega/{p-6244b0ad.entry.js → p-c682d53c.entry.js} +1 -1
- package/dist/vega/{p-c61f8ca6.entry.js → p-c8a3fb7f.entry.js} +1 -1
- package/dist/vega/{p-0ec14fbc.entry.js → p-c96d28dc.entry.js} +1 -1
- package/dist/vega/p-cef9f638.js +1 -0
- package/dist/vega/{p-648134d2.entry.js → p-cf211582.entry.js} +1 -1
- package/dist/vega/p-d3137a6e.entry.js +1 -0
- package/dist/vega/p-d418ecc1.entry.js +1 -0
- package/dist/vega/p-d5d6dae6.js +1 -0
- package/dist/vega/p-d5ff8b7f.js +1 -0
- package/dist/vega/p-d9671d27.js +1 -0
- package/dist/vega/{p-7bad6577.entry.js → p-dabba918.entry.js} +1 -1
- package/dist/vega/{p-dadc6ab3.js → p-dc92fec6.js} +1 -1
- package/dist/vega/{p-36ae2dd3.entry.js → p-e5af5a4d.entry.js} +1 -1
- package/dist/vega/{p-b1054e18.entry.js → p-e853105a.entry.js} +1 -1
- package/dist/vega/{p-d72abacd.entry.js → p-e9b86dac.entry.js} +1 -1
- package/dist/vega/p-ebfc4323.entry.js +1 -0
- package/dist/vega/{p-81765b4b.entry.js → p-f83739d0.entry.js} +1 -1
- package/dist/vega/{p-6585cfd5.entry.js → p-fbc85265.entry.js} +1 -1
- package/dist/vega/{p-3ab20f9e.entry.js → p-fbd38139.entry.js} +1 -1
- package/dist/vega/{p-bdd9ef3b.js → p-fddca002.js} +1 -1
- package/dist/vega/{p-de1ee131.entry.js → p-fee972e6.entry.js} +1 -1
- package/dist/vega/{p-b73532c0.entry.js → p-fff13ed1.entry.js} +1 -1
- package/dist/vega/vega.esm.js +1 -1
- package/package.json +3 -2
- package/dist/vega/p-02b29c18.js +0 -1
- package/dist/vega/p-079f5d94.entry.js +0 -1
- package/dist/vega/p-0e3cd270.entry.js +0 -1
- package/dist/vega/p-0e954b9b.js +0 -1
- package/dist/vega/p-10454aa5.entry.js +0 -1
- package/dist/vega/p-258f9603.js +0 -1
- package/dist/vega/p-51d40b0d.entry.js +0 -1
- package/dist/vega/p-56ff8559.entry.js +0 -1
- package/dist/vega/p-575235c8.js +0 -1
- package/dist/vega/p-657446a3.entry.js +0 -1
- package/dist/vega/p-6908117a.js +0 -1
- package/dist/vega/p-846ae5fb.js +0 -1
- package/dist/vega/p-893d5dfa.js +0 -1
- package/dist/vega/p-8a6b820a.entry.js +0 -1
- package/dist/vega/p-8a877e12.js +0 -1
- package/dist/vega/p-9ffd2a96.entry.js +0 -1
- package/dist/vega/p-bb61f015.js +0 -1
- package/dist/vega/p-c7726252.js +0 -1
- package/dist/vega/p-d85b0bfa.entry.js +0 -1
- package/dist/vega/p-d87c3058.entry.js +0 -1
- package/dist/vega/p-e0729c4d.entry.js +0 -1
- package/dist/vega/p-e5cd6521.js +0 -1
- /package/dist/vega/{p-48a58baf.js → p-6b2342e0.js} +0 -0
|
@@ -2,7 +2,8 @@ import calendarEventRepeatPatternFactory from '../../components/vega-calendar/sl
|
|
|
2
2
|
import { generateUUID } from '../../utils/misc';
|
|
3
3
|
import { VegaInternalTranslation } from '../translation';
|
|
4
4
|
import { CalendarDate } from './calendar-date';
|
|
5
|
-
import { formatDisplayTime, WeekdayLongNames } from './utils';
|
|
5
|
+
import { formatDisplayTime, getSystemTimezone, WeekdayLongNames } from './utils';
|
|
6
|
+
import { LogUtility } from '../../utils/log';
|
|
6
7
|
const CalendarDateFormatReg = /^\d{1,2}\/\d{1,2}\/\d{4}/;
|
|
7
8
|
const CalendarTimeFormatReg = /^\d{1,2}:\d{1,2}/;
|
|
8
9
|
/** The `CalendarEvent` class in TypeScript represents a calendar event with methods to validate required fields, initialize dates and times, and determine if it is a group event. */
|
|
@@ -16,13 +17,15 @@ export class CalendarEvent {
|
|
|
16
17
|
* @param {string} eventKey If a value is not provided for `eventKey`, a UUID (Universally
|
|
17
18
|
* Unique Identifier) will be generated as a default value. This identifier is used to distinguish
|
|
18
19
|
* different events and can be helpful for tracking
|
|
20
|
+
* @param {string} timezone - Optional timezone identifier for timezone-aware date calculations
|
|
19
21
|
*/
|
|
20
|
-
constructor(eventOptions, eventKey) {
|
|
22
|
+
constructor(eventOptions, eventKey, timezone) {
|
|
21
23
|
// the default value is 1 when the event end date is same as start date
|
|
22
24
|
this._eventSpansDays = 1;
|
|
23
25
|
this.repeatPattern = null;
|
|
24
26
|
this._event = eventOptions;
|
|
25
27
|
this._eventKey = eventKey || generateUUID();
|
|
28
|
+
this._timezone = timezone || getSystemTimezone();
|
|
26
29
|
this.checkEventRequireField(eventOptions);
|
|
27
30
|
this.initDate(eventOptions);
|
|
28
31
|
this.initEventSpansDays();
|
|
@@ -202,7 +205,7 @@ export class CalendarEvent {
|
|
|
202
205
|
getEventDuration() {
|
|
203
206
|
const [startHour, startMinutes] = this.startTime.split(':');
|
|
204
207
|
const [endHour, endMinutes] = this.endTime.split(':');
|
|
205
|
-
const now = CalendarDate.from(new Date());
|
|
208
|
+
const now = CalendarDate.from(new Date(), this._timezone);
|
|
206
209
|
const startDate = new Date(now.year, now.month, now.date, Number(startHour), Number(startMinutes));
|
|
207
210
|
const endDate = new Date(now.year, now.month, now.date, Number(endHour) === 0 && Number(startHour) !== 0 ? 24 : Number(endHour), Number(endMinutes));
|
|
208
211
|
return (endDate.valueOf() - startDate.valueOf()) / (60 * 1000);
|
|
@@ -222,6 +225,17 @@ export class CalendarEvent {
|
|
|
222
225
|
}
|
|
223
226
|
return [];
|
|
224
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Refresh event dates and related properties when timezone changes
|
|
230
|
+
*
|
|
231
|
+
* @param {string} timezone - The new timezone to apply to the event
|
|
232
|
+
*/
|
|
233
|
+
updateTimezone(timezone) {
|
|
234
|
+
this._timezone = timezone;
|
|
235
|
+
this.initDate(this._event);
|
|
236
|
+
this.initEventSpansDays();
|
|
237
|
+
this.initRepeatPattern();
|
|
238
|
+
}
|
|
225
239
|
/**
|
|
226
240
|
* The function `convertTimeTo24Hour` converts a time string from 12-hour format to 24-hour format in TypeScript.
|
|
227
241
|
*
|
|
@@ -279,42 +293,164 @@ export class CalendarEvent {
|
|
|
279
293
|
*/
|
|
280
294
|
initDate(eventOptions) {
|
|
281
295
|
const { startDate, startTime, endDate, endTime } = eventOptions;
|
|
296
|
+
const originalDateParts = this.processStartDate(startDate, startTime || '');
|
|
297
|
+
this._startTime = this.formatTimeForDisplay(this._startDate, startTime || '');
|
|
298
|
+
this.processEndDate(endDate || '', endTime || '', originalDateParts);
|
|
299
|
+
this._endTime = this.formatTimeForDisplay(this._endDate, endTime || '');
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Process start date
|
|
303
|
+
*
|
|
304
|
+
* @param {string | Date} startDate - Start date (string or Date object)
|
|
305
|
+
* @param {string} startTime - Start time string
|
|
306
|
+
* @returns {DateParts | undefined} originalDateParts information
|
|
307
|
+
*/
|
|
308
|
+
processStartDate(startDate, startTime) {
|
|
309
|
+
let originalDateParts;
|
|
310
|
+
let tempDate;
|
|
282
311
|
if (startDate && typeof startDate === 'object') {
|
|
283
|
-
|
|
312
|
+
originalDateParts = {
|
|
313
|
+
year: startDate.getFullYear(),
|
|
314
|
+
month: startDate.getMonth(),
|
|
315
|
+
date: startDate.getDate(),
|
|
316
|
+
};
|
|
317
|
+
tempDate = startDate;
|
|
284
318
|
}
|
|
285
319
|
else if (startDate && typeof startDate === 'string') {
|
|
286
320
|
const [month, day, year] = startDate.split('/');
|
|
287
|
-
|
|
321
|
+
originalDateParts = {
|
|
322
|
+
year: Number(year),
|
|
323
|
+
month: Number(month) - 1,
|
|
324
|
+
date: Number(day),
|
|
325
|
+
};
|
|
326
|
+
tempDate = new Date(originalDateParts.year, originalDateParts.month, originalDateParts.date);
|
|
288
327
|
}
|
|
289
|
-
if (
|
|
290
|
-
|
|
328
|
+
if (startTime && originalDateParts && tempDate) {
|
|
329
|
+
const { timeHours, timeMinutes } = this.getCurrentHourAndMinutes(startTime);
|
|
330
|
+
tempDate = new Date(originalDateParts.year, originalDateParts.month, originalDateParts.date, timeHours, timeMinutes, 0);
|
|
291
331
|
}
|
|
292
|
-
|
|
293
|
-
this.
|
|
332
|
+
if (tempDate) {
|
|
333
|
+
this._startDate = this.convertDateToTimezone(tempDate);
|
|
294
334
|
}
|
|
335
|
+
return originalDateParts;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Process end date
|
|
339
|
+
*
|
|
340
|
+
* @param {string | Date} endDate - End date (string or Date object)
|
|
341
|
+
* @param {string} endTime - End time string
|
|
342
|
+
* @param {DateParts | undefined} fallbackDateParts - Default date parts to use when endDate is empty
|
|
343
|
+
*/
|
|
344
|
+
processEndDate(endDate, endTime, fallbackDateParts) {
|
|
345
|
+
let tempDate;
|
|
295
346
|
if (endDate && typeof endDate === 'object') {
|
|
296
|
-
|
|
347
|
+
tempDate = endDate;
|
|
297
348
|
}
|
|
298
349
|
else if (endDate && typeof endDate === 'string') {
|
|
299
350
|
const [month, day, year] = endDate.split('/');
|
|
300
|
-
|
|
351
|
+
tempDate = new Date(Number(year), Number(month) - 1, Number(day), 23, 59, 59);
|
|
301
352
|
}
|
|
302
353
|
else {
|
|
303
|
-
|
|
354
|
+
if (fallbackDateParts) {
|
|
355
|
+
tempDate = new Date(fallbackDateParts.year, fallbackDateParts.month, fallbackDateParts.date, 23, 59, 59);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (endTime && tempDate) {
|
|
359
|
+
const { timeHours, timeMinutes } = this.getCurrentHourAndMinutes(endTime, 23, 59);
|
|
360
|
+
tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), timeHours, timeMinutes, 59);
|
|
304
361
|
}
|
|
305
|
-
if (
|
|
306
|
-
this.
|
|
362
|
+
if (tempDate) {
|
|
363
|
+
this._endDate = this.convertDateToTimezone(tempDate);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Format time for display
|
|
368
|
+
*
|
|
369
|
+
* @param {Date} date - Date object
|
|
370
|
+
* @param {string} originalTime - Original time string
|
|
371
|
+
* @returns {string} Formatted time string
|
|
372
|
+
*/
|
|
373
|
+
formatTimeForDisplay(date, originalTime) {
|
|
374
|
+
const shouldUseOriginalTime = Boolean(originalTime) && this._timezone === getSystemTimezone();
|
|
375
|
+
if (shouldUseOriginalTime) {
|
|
376
|
+
const convertedTime = this.convertTimeTo24Hour(originalTime);
|
|
377
|
+
const [hour, minutes] = convertedTime.split(':');
|
|
378
|
+
return `${date.getHours().toString().padStart(hour.length, '0')}:${date
|
|
379
|
+
.getMinutes()
|
|
380
|
+
.toString()
|
|
381
|
+
.padStart(minutes.length, '0')}`;
|
|
307
382
|
}
|
|
308
383
|
else {
|
|
309
|
-
|
|
384
|
+
return `${date.getHours()}:${date.getMinutes()}`;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Parses a time string and extracts hour and minute values.
|
|
389
|
+
* If the time string is empty or invalid, returns the provided default values.
|
|
390
|
+
*
|
|
391
|
+
* @param {string} time - The time string to parse (e.g., "14:30", "2:30 PM")
|
|
392
|
+
* @param {number} defaultHours - Default hour value to use when time is empty (default: 0)
|
|
393
|
+
* @param {number} defaultMinutes - Default minute value to use when time is empty (default: 0)
|
|
394
|
+
* @returns {CalendarTimeHourMinutes} An object containing timeHours and timeMinutes as numbers
|
|
395
|
+
*/
|
|
396
|
+
getCurrentHourAndMinutes(time, defaultHours = 0, defaultMinutes = 0) {
|
|
397
|
+
let timeHours = defaultHours;
|
|
398
|
+
let timeMinutes = defaultMinutes;
|
|
399
|
+
if (time) {
|
|
400
|
+
const timeString = this.convertTimeTo24Hour(time).split(':');
|
|
401
|
+
timeHours = Number(timeString[0]);
|
|
402
|
+
timeMinutes = Number(timeString[1]);
|
|
403
|
+
}
|
|
404
|
+
return { timeHours, timeMinutes };
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Converts a Date object to the target timezone
|
|
408
|
+
*
|
|
409
|
+
* @param {Date} date - The Date object to convert
|
|
410
|
+
* @returns {Date} A Date object representing the date/time in the target timezone
|
|
411
|
+
*/
|
|
412
|
+
convertDateToTimezone(date) {
|
|
413
|
+
if (this._timezone && this._timezone !== getSystemTimezone()) {
|
|
414
|
+
try {
|
|
415
|
+
const targetFormatter = new Intl.DateTimeFormat([], {
|
|
416
|
+
timeZone: this._timezone,
|
|
417
|
+
year: 'numeric',
|
|
418
|
+
month: '2-digit',
|
|
419
|
+
day: '2-digit',
|
|
420
|
+
hour: '2-digit',
|
|
421
|
+
minute: '2-digit',
|
|
422
|
+
second: '2-digit',
|
|
423
|
+
hour12: false,
|
|
424
|
+
});
|
|
425
|
+
const targetParts = targetFormatter.formatToParts(date);
|
|
426
|
+
const getYear = targetParts.find((part) => part.type === 'year');
|
|
427
|
+
const getMonth = targetParts.find((part) => part.type === 'month');
|
|
428
|
+
const getDay = targetParts.find((part) => part.type === 'day');
|
|
429
|
+
const getHour = targetParts.find((part) => part.type === 'hour');
|
|
430
|
+
const getMinute = targetParts.find((part) => part.type === 'minute');
|
|
431
|
+
const getSecond = targetParts.find((part) => part.type === 'second');
|
|
432
|
+
if (getYear && getMonth && getDay && getHour && getMinute && getSecond) {
|
|
433
|
+
const year = parseInt(getYear.value, 10);
|
|
434
|
+
const month = parseInt(getMonth.value, 10);
|
|
435
|
+
const day = parseInt(getDay.value, 10);
|
|
436
|
+
const hour = parseInt(getHour.value, 10);
|
|
437
|
+
const minute = parseInt(getMinute.value, 10);
|
|
438
|
+
const second = parseInt(getSecond.value, 10);
|
|
439
|
+
return new Date(year, month - 1, day, hour, minute, second);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
LogUtility.warn('Invalid timezone:', this._timezone);
|
|
444
|
+
}
|
|
310
445
|
}
|
|
446
|
+
return date;
|
|
311
447
|
}
|
|
312
448
|
/**
|
|
313
449
|
* The function initializes a repeat pattern controller for a calendar event with specified start and end dates and repeat options.
|
|
314
450
|
*/
|
|
315
451
|
initRepeatPattern() {
|
|
316
452
|
if (this._event.repeatOptions && this._event.repeatOptions.frequency) {
|
|
317
|
-
this.repeatPattern = calendarEventRepeatPatternFactory.getPattern(this._startDate, this._event.repeatOptions);
|
|
453
|
+
this.repeatPattern = calendarEventRepeatPatternFactory.getPattern(this._startDate, this._event.repeatOptions, this._timezone);
|
|
318
454
|
}
|
|
319
455
|
}
|
|
320
456
|
/**
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { CalendarDate } from '../calendar-date';
|
|
2
|
-
import { getWeekdays } from '../utils';
|
|
2
|
+
import { getSystemTimezone, getWeekdays } from '../utils';
|
|
3
3
|
/**
|
|
4
4
|
* CalendarPeriod is an abstract class that represents a period of date for calendar.
|
|
5
5
|
*/
|
|
6
6
|
export class CalendarPeriod {
|
|
7
|
-
constructor(count, current) {
|
|
7
|
+
constructor(count, current, timezone) {
|
|
8
8
|
this._count = count;
|
|
9
|
-
this.
|
|
9
|
+
this._timezone = timezone || getSystemTimezone();
|
|
10
|
+
this._current = current ? current : CalendarDate.from(new Date(), this._timezone);
|
|
10
11
|
this.calculatePeriod(this._current);
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
@@ -57,6 +58,14 @@ export class CalendarPeriod {
|
|
|
57
58
|
get showWeekends() {
|
|
58
59
|
return this._showWeekends;
|
|
59
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* The timezone of the period.
|
|
63
|
+
*
|
|
64
|
+
* @type {string | undefined}
|
|
65
|
+
*/
|
|
66
|
+
get timezone() {
|
|
67
|
+
return this._timezone;
|
|
68
|
+
}
|
|
60
69
|
/**
|
|
61
70
|
* Go to a specific date.
|
|
62
71
|
*
|
|
@@ -72,7 +81,7 @@ export class CalendarPeriod {
|
|
|
72
81
|
* @returns {this} - The current period.
|
|
73
82
|
*/
|
|
74
83
|
now() {
|
|
75
|
-
return this.createBy(CalendarDate.from(new Date()));
|
|
84
|
+
return this.createBy(CalendarDate.from(new Date(), this._timezone));
|
|
76
85
|
}
|
|
77
86
|
/**
|
|
78
87
|
* Calculate the period start date and end date.
|
|
@@ -5,8 +5,8 @@ import { DateDirection, getClosestWorkday } from '../../../components/vega-calen
|
|
|
5
5
|
* Period of day.
|
|
6
6
|
*/
|
|
7
7
|
export class DayPeriod extends CalendarPeriod {
|
|
8
|
-
constructor(current, showWeekends) {
|
|
9
|
-
super(DayPeriod.DISPLAY_DATE_COUNT, current);
|
|
8
|
+
constructor(current, showWeekends, timezone) {
|
|
9
|
+
super(DayPeriod.DISPLAY_DATE_COUNT, current, timezone);
|
|
10
10
|
this._type = 'day';
|
|
11
11
|
this._showWeekends = true;
|
|
12
12
|
this._showWeekends = showWeekends === false ? false : true;
|
|
@@ -41,7 +41,7 @@ export class DayPeriod extends CalendarPeriod {
|
|
|
41
41
|
* @returns {this} - The current period.
|
|
42
42
|
*/
|
|
43
43
|
now() {
|
|
44
|
-
let calendarDate = CalendarDate.from(new Date());
|
|
44
|
+
let calendarDate = CalendarDate.from(new Date(), this.timezone);
|
|
45
45
|
if (this._showWeekends === false) {
|
|
46
46
|
calendarDate = getClosestWorkday(calendarDate);
|
|
47
47
|
}
|
|
@@ -51,7 +51,7 @@ export class DayPeriod extends CalendarPeriod {
|
|
|
51
51
|
* @inheritDoc
|
|
52
52
|
*/
|
|
53
53
|
createBy(current) {
|
|
54
|
-
return new DayPeriod(current, this._showWeekends);
|
|
54
|
+
return new DayPeriod(current, this._showWeekends, this.timezone);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
DayPeriod.DISPLAY_DATE_COUNT = 1;
|
|
@@ -5,8 +5,8 @@ import { getWeekdays } from '../utils';
|
|
|
5
5
|
* Period of month
|
|
6
6
|
*/
|
|
7
7
|
export class MonthPeriod extends CalendarPeriod {
|
|
8
|
-
constructor(current, showWeekends) {
|
|
9
|
-
super(MonthPeriod.DISPLAY_DATE_COUNT, current);
|
|
8
|
+
constructor(current, showWeekends, timezone) {
|
|
9
|
+
super(MonthPeriod.DISPLAY_DATE_COUNT, current, timezone);
|
|
10
10
|
this._type = 'month';
|
|
11
11
|
this._showWeekends = true;
|
|
12
12
|
this._showWeekends = showWeekends === false ? false : true;
|
|
@@ -17,12 +17,13 @@ export class MonthPeriod extends CalendarPeriod {
|
|
|
17
17
|
* @param {CalendarDate} [calendarDate] - The `calendarDate` parameter is an optional parameter of
|
|
18
18
|
* type `CalendarDate`. It represents a specific date in the calendar. If a `calendarDate` is
|
|
19
19
|
* provided, the function will use that date to determine the first day of the month. If no
|
|
20
|
-
* `calendarDate` is provided, the function
|
|
20
|
+
* `calendarDate` is provided, the function will use the current date considering timezone.
|
|
21
|
+
* @param {string} [timezone] - The timezone to use when no calendarDate is provided
|
|
21
22
|
* @returns {CalendarDate} A new `CalendarDate` object representing the first day of the month from the provided
|
|
22
23
|
* `calendarDate` parameter or the current date if no parameter is provided.
|
|
23
24
|
*/
|
|
24
|
-
static getMonthFirstDay(calendarDate) {
|
|
25
|
-
const date = calendarDate || CalendarDate.from(new Date());
|
|
25
|
+
static getMonthFirstDay(calendarDate, timezone) {
|
|
26
|
+
const date = calendarDate || CalendarDate.from(new Date(), timezone);
|
|
26
27
|
return new CalendarDate(date.year, date.month, 1);
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
@@ -58,7 +59,7 @@ export class MonthPeriod extends CalendarPeriod {
|
|
|
58
59
|
* @inheritDoc
|
|
59
60
|
*/
|
|
60
61
|
createBy(current) {
|
|
61
|
-
return new MonthPeriod(current, this._showWeekends);
|
|
62
|
+
return new MonthPeriod(current, this._showWeekends, this.timezone);
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
MonthPeriod.DISPLAY_DATE_COUNT = 6 * 7;
|
|
@@ -4,8 +4,8 @@ import { CalendarDate } from '../calendar-date';
|
|
|
4
4
|
* Period of the week
|
|
5
5
|
*/
|
|
6
6
|
export class WeekPeriod extends CalendarPeriod {
|
|
7
|
-
constructor(current, showWeekends) {
|
|
8
|
-
super(WeekPeriod.DISPLAY_DATE_COUNT, current);
|
|
7
|
+
constructor(current, showWeekends, timezone) {
|
|
8
|
+
super(WeekPeriod.DISPLAY_DATE_COUNT, current, timezone);
|
|
9
9
|
this._type = 'week';
|
|
10
10
|
this._showWeekends = true;
|
|
11
11
|
this._showWeekends = showWeekends === false ? false : true;
|
|
@@ -30,7 +30,7 @@ export class WeekPeriod extends CalendarPeriod {
|
|
|
30
30
|
* @inheritDoc
|
|
31
31
|
*/
|
|
32
32
|
createBy(current) {
|
|
33
|
-
return new WeekPeriod(current, this._showWeekends);
|
|
33
|
+
return new WeekPeriod(current, this._showWeekends, this.timezone);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
WeekPeriod.DISPLAY_DATE_COUNT = 7;
|
|
@@ -12,7 +12,7 @@ export class WeekViewGenerator extends CalendarViewGenerator {
|
|
|
12
12
|
const dates = this.generateDates(period);
|
|
13
13
|
const showWeekends = period.showWeekends;
|
|
14
14
|
let weekDays = this.generateWeekHead();
|
|
15
|
-
let dateItems = [dates.map(CalendarDate.from)];
|
|
15
|
+
let dateItems = [dates.map((date) => CalendarDate.from(date))];
|
|
16
16
|
if (showWeekends === false) {
|
|
17
17
|
weekDays = weekDays.slice(1, 6);
|
|
18
18
|
dateItems = dateItems.map((items) => items.slice(1, 6));
|
|
@@ -73,3 +73,27 @@ describe('calendar-date', () => {
|
|
|
73
73
|
expect(new CalendarDate(2024, 2, 10).getMonthName(true)).toBe('Feb');
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
|
+
describe('CalendarDate Timezone', () => {
|
|
77
|
+
it('should create calendar date', () => {
|
|
78
|
+
const calendarDate = new CalendarDate(2025, 10, 29);
|
|
79
|
+
expect(calendarDate.year).toBe(2025);
|
|
80
|
+
expect(calendarDate.month).toBe(10);
|
|
81
|
+
expect(calendarDate.date).toBe(29);
|
|
82
|
+
});
|
|
83
|
+
it('should check isToday with timezone', () => {
|
|
84
|
+
jest.useFakeTimers('modern');
|
|
85
|
+
jest.setSystemTime(new Date('2025-10-29T03:00:00Z'));
|
|
86
|
+
const calendarDate = new CalendarDate(2025, 10, 29);
|
|
87
|
+
expect(calendarDate.isToday('UTC')).toBe(true);
|
|
88
|
+
expect(calendarDate.isToday('Asia/Shanghai')).toBe(true);
|
|
89
|
+
expect(calendarDate.isToday('America/New_York')).toBe(false);
|
|
90
|
+
jest.useRealTimers();
|
|
91
|
+
});
|
|
92
|
+
it('should convert to Date object', () => {
|
|
93
|
+
const calendarDate = new CalendarDate(2025, 10, 29);
|
|
94
|
+
const dateObj = calendarDate.toDate();
|
|
95
|
+
expect(dateObj.getFullYear()).toBe(2025);
|
|
96
|
+
expect(dateObj.getMonth() + 1).toBe(10);
|
|
97
|
+
expect(dateObj.getDate()).toBe(29);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { CalendarDate } from '../calendar-date';
|
|
2
2
|
import { CalendarEvent } from '../calendar-event';
|
|
3
3
|
import { MonthPeriod } from '../calendar-period/month-period';
|
|
4
|
+
import { newSpecPage } from '@stencil/core/testing';
|
|
5
|
+
import { VegaCalendar } from '../../../components/vega-calendar/vega-calendar';
|
|
6
|
+
import { LogUtility } from '../../../utils/log';
|
|
4
7
|
const mockDate = new Date(2024, 5, 13, 13, 44);
|
|
5
8
|
const mockStringDate = '06/13/2024';
|
|
6
9
|
const rawEvent = {
|
|
@@ -188,3 +191,71 @@ describe('calendar-event', () => {
|
|
|
188
191
|
expect(calendarEvent11.generateRepeatString()).toBe('');
|
|
189
192
|
});
|
|
190
193
|
});
|
|
194
|
+
describe('calendar event with timezone', () => {
|
|
195
|
+
it('should display correct event start time after timezone conversion', async () => {
|
|
196
|
+
const testEvents = [
|
|
197
|
+
{
|
|
198
|
+
key: 'event1',
|
|
199
|
+
title: 'Test Event 1',
|
|
200
|
+
startDate: '10/29/2025',
|
|
201
|
+
endDate: '10/29/2025',
|
|
202
|
+
startTime: '09:00',
|
|
203
|
+
endTime: '17:00',
|
|
204
|
+
isAllDay: false,
|
|
205
|
+
},
|
|
206
|
+
];
|
|
207
|
+
const page = await newSpecPage({
|
|
208
|
+
components: [VegaCalendar],
|
|
209
|
+
html: `<vega-calendar timezone="UTC" view-mode="week"></vega-calendar>`,
|
|
210
|
+
});
|
|
211
|
+
const component = page.rootInstance;
|
|
212
|
+
const calendarElement = page.body.querySelector('vega-calendar');
|
|
213
|
+
calendarElement.events = testEvents;
|
|
214
|
+
await page.waitForChanges();
|
|
215
|
+
expect(component.calendarEvents).toHaveLength(1);
|
|
216
|
+
const calendarEvent = component.calendarEvents[0];
|
|
217
|
+
expect(calendarEvent.startTime).toBe('09:00');
|
|
218
|
+
calendarElement.timezone = 'Asia/Shanghai';
|
|
219
|
+
expect(calendarEvent.startTime).toBe('17:0');
|
|
220
|
+
expect(calendarEvent.endTime).toBe('1:0');
|
|
221
|
+
calendarElement.timezone = 'America/New_York';
|
|
222
|
+
expect(calendarEvent.startTime).toBe('5:0');
|
|
223
|
+
expect(calendarEvent.endTime).toBe('13:0');
|
|
224
|
+
});
|
|
225
|
+
it('should handle timezone conversion with invalid timezone gracefully', async () => {
|
|
226
|
+
const testEvents = [
|
|
227
|
+
{
|
|
228
|
+
key: 'event1',
|
|
229
|
+
title: 'Test Event 1',
|
|
230
|
+
startDate: '10/29/2025',
|
|
231
|
+
endDate: '10/29/2025',
|
|
232
|
+
startTime: '14:30',
|
|
233
|
+
endTime: '16:45',
|
|
234
|
+
isAllDay: false,
|
|
235
|
+
},
|
|
236
|
+
];
|
|
237
|
+
const page = await newSpecPage({
|
|
238
|
+
components: [VegaCalendar],
|
|
239
|
+
html: `<vega-calendar timezone="Invalid/Timezone"></vega-calendar>`,
|
|
240
|
+
});
|
|
241
|
+
const calendarElement = page.body.querySelector('vega-calendar');
|
|
242
|
+
calendarElement.events = testEvents;
|
|
243
|
+
spyOn(LogUtility, 'warn');
|
|
244
|
+
await page.waitForChanges();
|
|
245
|
+
expect(LogUtility.warn).toHaveBeenCalledWith('Invalid timezone:', 'Invalid/Timezone');
|
|
246
|
+
});
|
|
247
|
+
it('should not call updateTimezone when no calendar events exist during timezone change', async () => {
|
|
248
|
+
const page = await newSpecPage({
|
|
249
|
+
components: [VegaCalendar],
|
|
250
|
+
html: `<vega-calendar timezone="UTC"></vega-calendar>`,
|
|
251
|
+
});
|
|
252
|
+
const component = page.rootInstance;
|
|
253
|
+
expect(component.calendarEvents).toHaveLength(0);
|
|
254
|
+
const calendarElement = page.body.querySelector('vega-calendar');
|
|
255
|
+
calendarElement.timezone = 'Asia/Shanghai';
|
|
256
|
+
expect(() => {
|
|
257
|
+
component.watchTimezoneChange();
|
|
258
|
+
}).not.toThrow();
|
|
259
|
+
expect(component.postOperationDate).toBeDefined();
|
|
260
|
+
});
|
|
261
|
+
});
|
|
@@ -79,3 +79,31 @@ describe('day-period', () => {
|
|
|
79
79
|
expect(dayPeriod.current.date).toEqual(8);
|
|
80
80
|
});
|
|
81
81
|
});
|
|
82
|
+
describe('DayPeriod Timezone', () => {
|
|
83
|
+
beforeEach(() => {
|
|
84
|
+
jest.useFakeTimers('modern');
|
|
85
|
+
});
|
|
86
|
+
afterEach(() => {
|
|
87
|
+
jest.useRealTimers();
|
|
88
|
+
});
|
|
89
|
+
it('should create day period for a specific date', () => {
|
|
90
|
+
const dayPeriod = new DayPeriod(new CalendarDate(2025, 10, 29));
|
|
91
|
+
expect(dayPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
|
|
92
|
+
expect(dayPeriod.startDate).toEqual(new CalendarDate(2025, 10, 29));
|
|
93
|
+
expect(dayPeriod.endDate).toEqual(new CalendarDate(2025, 10, 29));
|
|
94
|
+
});
|
|
95
|
+
it('should create day period with timezone Asia/Shanghai', () => {
|
|
96
|
+
jest.setSystemTime(new Date('2025-10-29T16:00:00Z'));
|
|
97
|
+
const dayPeriod = new DayPeriod(undefined, true, 'Asia/Shanghai');
|
|
98
|
+
expect(dayPeriod.current).toEqual(new CalendarDate(2025, 10, 30));
|
|
99
|
+
expect(dayPeriod.startDate).toEqual(new CalendarDate(2025, 10, 30));
|
|
100
|
+
expect(dayPeriod.endDate).toEqual(new CalendarDate(2025, 10, 30));
|
|
101
|
+
});
|
|
102
|
+
it('should go to now with timezone America/Los_Angeles', () => {
|
|
103
|
+
jest.setSystemTime(new Date('2025-10-30T06:00:00Z'));
|
|
104
|
+
const nowPeriod = new DayPeriod(undefined, true, 'America/Los_Angeles');
|
|
105
|
+
expect(nowPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
|
|
106
|
+
expect(nowPeriod.startDate).toEqual(new CalendarDate(2025, 10, 29));
|
|
107
|
+
expect(nowPeriod.endDate).toEqual(new CalendarDate(2025, 10, 29));
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -66,3 +66,38 @@ describe('month-period', () => {
|
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
68
|
});
|
|
69
|
+
describe('MonthPeriod Timezone', () => {
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
jest.useFakeTimers('modern');
|
|
72
|
+
});
|
|
73
|
+
afterEach(() => {
|
|
74
|
+
jest.useRealTimers();
|
|
75
|
+
});
|
|
76
|
+
it('should create month period for a specific date', () => {
|
|
77
|
+
const monthPeriod = new MonthPeriod(new CalendarDate(2025, 10, 29));
|
|
78
|
+
expect(monthPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
|
|
79
|
+
expect(monthPeriod.startDate.month).toBe(9);
|
|
80
|
+
expect(monthPeriod.endDate.month).toBe(11);
|
|
81
|
+
});
|
|
82
|
+
it('should create month period with timezone Asia/Shanghai', () => {
|
|
83
|
+
jest.setSystemTime(new Date('2025-10-31T16:00:00Z'));
|
|
84
|
+
const monthPeriod = new MonthPeriod(undefined, true, 'Asia/Shanghai');
|
|
85
|
+
expect(monthPeriod.current).toEqual(new CalendarDate(2025, 11, 1));
|
|
86
|
+
expect(monthPeriod.startDate.month).toBe(10);
|
|
87
|
+
expect(monthPeriod.endDate.month).toBe(12);
|
|
88
|
+
});
|
|
89
|
+
it('should go to now with timezone America/Los_Angeles', () => {
|
|
90
|
+
jest.setSystemTime(new Date('2025-11-01T06:00:00Z'));
|
|
91
|
+
const monthPeriod = new MonthPeriod(undefined, true, 'America/Los_Angeles');
|
|
92
|
+
expect(monthPeriod.current).toEqual(new CalendarDate(2025, 10, 31));
|
|
93
|
+
expect(monthPeriod.startDate.month).toBe(9);
|
|
94
|
+
expect(monthPeriod.endDate.month).toBe(11);
|
|
95
|
+
});
|
|
96
|
+
it('should go to another month', () => {
|
|
97
|
+
const monthPeriod = new MonthPeriod(new CalendarDate(2025, 10, 29));
|
|
98
|
+
const nextMonth = monthPeriod.goTo(new CalendarDate(2025, 11, 1));
|
|
99
|
+
expect(nextMonth.current).toEqual(new CalendarDate(2025, 11, 1));
|
|
100
|
+
expect(nextMonth.startDate.month).toBe(10);
|
|
101
|
+
expect(nextMonth.endDate.month).toBe(12);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -58,3 +58,46 @@ describe('week-period', () => {
|
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
+
describe('WeekPeriod Timezone', () => {
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
jest.useFakeTimers('modern');
|
|
64
|
+
});
|
|
65
|
+
afterEach(() => {
|
|
66
|
+
jest.useRealTimers();
|
|
67
|
+
});
|
|
68
|
+
it('should create week period for a specific date', () => {
|
|
69
|
+
jest.setSystemTime(new Date('2025-10-29T12:00:00Z'));
|
|
70
|
+
const weekPeriod = new WeekPeriod();
|
|
71
|
+
expect(weekPeriod.current).toEqual(new CalendarDate(2025, 10, 29));
|
|
72
|
+
expect(weekPeriod.startDate).toEqual(new CalendarDate(2025, 10, 26));
|
|
73
|
+
expect(weekPeriod.endDate).toEqual(new CalendarDate(2025, 11, 1));
|
|
74
|
+
});
|
|
75
|
+
it('should create week period with timezone Asia/Shanghai', () => {
|
|
76
|
+
jest.setSystemTime(new Date('2025-10-27T16:00:00Z'));
|
|
77
|
+
const weekPeriod = new WeekPeriod(undefined, true, 'Asia/Shanghai');
|
|
78
|
+
expect(weekPeriod.current).toEqual(new CalendarDate(2025, 10, 28));
|
|
79
|
+
expect(weekPeriod.startDate).toEqual(new CalendarDate(2025, 10, 26));
|
|
80
|
+
expect(weekPeriod.endDate).toEqual(new CalendarDate(2025, 11, 1));
|
|
81
|
+
});
|
|
82
|
+
it('should go to a date in another week', () => {
|
|
83
|
+
const weekPeriod = new WeekPeriod(new CalendarDate(2025, 10, 29));
|
|
84
|
+
const nextWeek = weekPeriod.goTo(new CalendarDate(2025, 11, 4));
|
|
85
|
+
expect(nextWeek.current).toEqual(new CalendarDate(2025, 11, 4));
|
|
86
|
+
expect(nextWeek.startDate).toEqual(new CalendarDate(2025, 11, 2));
|
|
87
|
+
expect(nextWeek.endDate).toEqual(new CalendarDate(2025, 11, 8));
|
|
88
|
+
});
|
|
89
|
+
it('should go to now with timezone America/New_York', () => {
|
|
90
|
+
jest.setSystemTime(new Date('2025-11-02T04:00:00Z'));
|
|
91
|
+
const weekPeriod = new WeekPeriod(undefined, true, 'America/New_York');
|
|
92
|
+
const nowPeriod = weekPeriod.now();
|
|
93
|
+
expect(nowPeriod.current).toEqual(new CalendarDate(2025, 11, 2));
|
|
94
|
+
expect(nowPeriod.startDate).toEqual(new CalendarDate(2025, 11, 2));
|
|
95
|
+
expect(nowPeriod.endDate).toEqual(new CalendarDate(2025, 11, 8));
|
|
96
|
+
});
|
|
97
|
+
it('should handle week period at year boundary', () => {
|
|
98
|
+
const weekPeriod = new WeekPeriod(new CalendarDate(2025, 12, 31));
|
|
99
|
+
expect(weekPeriod.current).toEqual(new CalendarDate(2025, 12, 31));
|
|
100
|
+
expect(weekPeriod.startDate).toEqual(new CalendarDate(2025, 12, 28));
|
|
101
|
+
expect(weekPeriod.endDate).toEqual(new CalendarDate(2026, 1, 3));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getWeekdays } from '../utils';
|
|
1
|
+
import { getWeekdays, getCurrentDatePartsInTimezone, getSystemTimezone } from '../utils';
|
|
2
2
|
describe('utils', () => {
|
|
3
3
|
it('should return weekdays as expected by default', () => {
|
|
4
4
|
expect(getWeekdays()).toEqual([0, 1, 2, 3, 4, 5, 6]);
|
|
@@ -7,3 +7,31 @@ describe('utils', () => {
|
|
|
7
7
|
expect(getWeekdays(1)).toEqual([1, 2, 3, 4, 5, 6, 0]);
|
|
8
8
|
});
|
|
9
9
|
});
|
|
10
|
+
describe('timezone-utils', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
jest.useFakeTimers('modern');
|
|
13
|
+
jest.setSystemTime(new Date('2025-10-29T23:30:00Z'));
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
jest.useRealTimers();
|
|
17
|
+
});
|
|
18
|
+
it('should get correct date parts in UTC', () => {
|
|
19
|
+
const result = getCurrentDatePartsInTimezone('UTC', new Date('2025-10-29T23:30:00Z'));
|
|
20
|
+
expect(result.year).toBe(2025);
|
|
21
|
+
expect(result.month).toBe(10);
|
|
22
|
+
expect(result.date).toBe(29);
|
|
23
|
+
});
|
|
24
|
+
it('should get current date parts in specific timezone', () => {
|
|
25
|
+
const shanghaiParts = getCurrentDatePartsInTimezone('Asia/Shanghai', new Date('2025-10-29T23:30:00Z'));
|
|
26
|
+
expect(shanghaiParts.year).toBe(2025);
|
|
27
|
+
expect(shanghaiParts.month).toBe(10);
|
|
28
|
+
expect(shanghaiParts.date).toBe(30); // already next day
|
|
29
|
+
});
|
|
30
|
+
it('should fallback to system time for invalid timezone', () => {
|
|
31
|
+
const result = getCurrentDatePartsInTimezone('Invalid/Timezone', new Date('2025-10-29T23:30:00Z'));
|
|
32
|
+
const systemTimezoneResult = getCurrentDatePartsInTimezone(getSystemTimezone(), new Date('2025-10-29T23:30:00Z'));
|
|
33
|
+
expect(result.year).toBe(systemTimezoneResult.year);
|
|
34
|
+
expect(result.month).toBe(systemTimezoneResult.month);
|
|
35
|
+
expect(result.date).toBe(systemTimezoneResult.date);
|
|
36
|
+
});
|
|
37
|
+
});
|