@siemens/element-ng 47.2.0 → 47.4.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/README.md +18 -6
- package/autocomplete/index.d.ts +8 -0
- package/autocomplete/package.json +3 -0
- package/autocomplete/si-autocomplete-listbox.directive.d.ts +31 -0
- package/autocomplete/si-autocomplete-option.directive.d.ts +31 -0
- package/autocomplete/si-autocomplete.directive.d.ts +14 -0
- package/autocomplete/si-autocomplete.model.d.ts +7 -0
- package/autocomplete/si-autocomplete.module.d.ts +9 -0
- package/badge/index.d.ts +5 -0
- package/badge/package.json +3 -0
- package/badge/si-badge.component.d.ts +17 -0
- package/breadcrumb/breadcrumb-item.model.d.ts +36 -0
- package/breadcrumb/index.d.ts +7 -0
- package/breadcrumb/package.json +3 -0
- package/breadcrumb/si-breadcrumb-item-template.directive.d.ts +10 -0
- package/breadcrumb/si-breadcrumb.component.d.ts +46 -0
- package/breadcrumb/si-breadcrumb.module.d.ts +7 -0
- package/card/index.d.ts +6 -0
- package/card/package.json +3 -0
- package/card/si-card.component.d.ts +79 -0
- package/card/si-card.module.d.ts +7 -0
- package/circle-status/index.d.ts +6 -0
- package/circle-status/package.json +3 -0
- package/circle-status/si-circle-status.component.d.ts +66 -0
- package/circle-status/si-circle-status.module.d.ts +7 -0
- package/column-selection-dialog/column-selection-editor/si-column-selection-editor.component.d.ts +23 -0
- package/column-selection-dialog/index.d.ts +6 -0
- package/column-selection-dialog/package.json +3 -0
- package/column-selection-dialog/si-column-selection-dialog.component.d.ts +114 -0
- package/column-selection-dialog/si-column-selection-dialog.service.d.ts +20 -0
- package/column-selection-dialog/si-column-selection-dialog.types.d.ts +68 -0
- package/common/models/status-type.model.d.ts +2 -2
- package/content-action-bar/index.d.ts +7 -0
- package/content-action-bar/package.json +3 -0
- package/content-action-bar/si-content-action-bar-toggle.component.d.ts +6 -0
- package/content-action-bar/si-content-action-bar.component.d.ts +72 -0
- package/content-action-bar/si-content-action-bar.model.d.ts +9 -0
- package/content-action-bar/si-content-action-bar.module.d.ts +7 -0
- package/date-range-filter/index.d.ts +8 -0
- package/date-range-filter/package.json +3 -0
- package/date-range-filter/si-date-range-calculation.service.d.ts +33 -0
- package/date-range-filter/si-date-range-filter.component.d.ts +248 -0
- package/date-range-filter/si-date-range-filter.module.d.ts +7 -0
- package/date-range-filter/si-date-range-filter.types.d.ts +40 -0
- package/date-range-filter/si-relative-date.component.d.ts +31 -0
- package/datepicker/components/si-calendar-body.component.d.ts +137 -0
- package/datepicker/components/si-calendar-date-cell.directive.d.ts +16 -0
- package/datepicker/components/si-calendar-direction-button.component.d.ts +18 -0
- package/datepicker/components/si-compare-adapter.d.ts +37 -0
- package/datepicker/components/si-day-selection.component.d.ts +76 -0
- package/datepicker/components/si-initial-focus.component.d.ts +74 -0
- package/datepicker/components/si-month-selection.component.d.ts +62 -0
- package/datepicker/components/si-year-selection.component.d.ts +65 -0
- package/datepicker/date-time-helper.d.ts +302 -0
- package/datepicker/index.d.ts +15 -0
- package/datepicker/package.json +3 -0
- package/datepicker/si-calendar-button.component.d.ts +49 -0
- package/datepicker/si-date-input.directive.d.ts +114 -0
- package/datepicker/si-date-range.component.d.ts +150 -0
- package/datepicker/si-datepicker-overlay.component.d.ts +82 -0
- package/datepicker/si-datepicker-overlay.directive.d.ts +104 -0
- package/datepicker/si-datepicker.component.d.ts +228 -0
- package/datepicker/si-datepicker.directive.d.ts +62 -0
- package/datepicker/si-datepicker.model.d.ts +129 -0
- package/datepicker/si-datepicker.module.d.ts +12 -0
- package/datepicker/si-timepicker.component.d.ts +214 -0
- package/electron-titlebar/electron.helpers.d.ts +5 -0
- package/electron-titlebar/index.d.ts +7 -0
- package/electron-titlebar/package.json +3 -0
- package/electron-titlebar/si-electron-titlebar.component.d.ts +72 -0
- package/electron-titlebar/si-electron-titlebar.module.d.ts +7 -0
- package/fesm2022/siemens-element-ng-application-header.mjs +2 -2
- package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-autocomplete.mjs +235 -0
- package/fesm2022/siemens-element-ng-autocomplete.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-badge.mjs +59 -0
- package/fesm2022/siemens-element-ng-badge.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-breadcrumb.mjs +302 -0
- package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-card.mjs +122 -0
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-circle-status.mjs +146 -0
- package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +369 -0
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-common.mjs +1 -1
- package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-content-action-bar.mjs +200 -0
- package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-date-range-filter.mjs +649 -0
- package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-datepicker.mjs +4231 -0
- package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs +142 -0
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-file-uploader.mjs +751 -0
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-filter-bar.mjs +153 -0
- package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-form.mjs +827 -0
- package/fesm2022/siemens-element-ng-form.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-icon-status.mjs +65 -0
- package/fesm2022/siemens-element-ng-icon-status.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-icon.mjs +22 -2
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-info-page.mjs +63 -0
- package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-inline-notification.mjs +4 -6
- package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +451 -0
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-language-switcher.mjs +90 -0
- package/fesm2022/siemens-element-ng-language-switcher.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-localization.mjs +306 -0
- package/fesm2022/siemens-element-ng-localization.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-number-input.mjs +267 -0
- package/fesm2022/siemens-element-ng-number-input.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-password-strength.mjs +177 -0
- package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-photo-upload.mjs +480 -0
- package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-pills-input.mjs +397 -0
- package/fesm2022/siemens-element-ng-pills-input.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-popover-next.mjs +259 -0
- package/fesm2022/siemens-element-ng-popover-next.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-popover.mjs +256 -0
- package/fesm2022/siemens-element-ng-popover.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-progressbar.mjs +83 -0
- package/fesm2022/siemens-element-ng-progressbar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-search-bar.mjs +193 -0
- package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-select.mjs +1166 -0
- package/fesm2022/siemens-element-ng-select.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-skip-links.mjs +117 -0
- package/fesm2022/siemens-element-ng-skip-links.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-slider.mjs +313 -0
- package/fesm2022/siemens-element-ng-slider.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-sort-bar.mjs +89 -0
- package/fesm2022/siemens-element-ng-sort-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-split.mjs +575 -0
- package/fesm2022/siemens-element-ng-split.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-status-toggle.mjs +196 -0
- package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-summary-widget.mjs +77 -0
- package/fesm2022/siemens-element-ng-summary-widget.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-system-banner.mjs +47 -0
- package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-tabs.mjs +395 -0
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-toast-notification.mjs +227 -0
- package/fesm2022/siemens-element-ng-toast-notification.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-typeahead.mjs +746 -0
- package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-unauthorized-page.mjs +76 -0
- package/fesm2022/siemens-element-ng-unauthorized-page.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-wizard.mjs +465 -0
- package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -0
- package/file-uploader/index.d.ts +8 -0
- package/file-uploader/package.json +3 -0
- package/file-uploader/si-file-dropzone.component.d.ts +106 -0
- package/file-uploader/si-file-uploader.component.d.ts +296 -0
- package/file-uploader/si-file-uploader.model.d.ts +12 -0
- package/file-uploader/si-file-uploader.module.d.ts +8 -0
- package/filter-bar/filter.d.ts +26 -0
- package/filter-bar/index.d.ts +8 -0
- package/filter-bar/package.json +3 -0
- package/filter-bar/si-filter-bar.component.d.ts +65 -0
- package/filter-bar/si-filter-bar.module.d.ts +7 -0
- package/filter-bar/si-filter-pill.component.d.ts +20 -0
- package/form/form-fieldset/si-form-fieldset.component.d.ts +40 -0
- package/form/index.d.ts +14 -0
- package/form/package.json +3 -0
- package/form/si-form-container/si-form-container.component.d.ts +155 -0
- package/form/si-form-item/si-form-field-native.control.d.ts +22 -0
- package/form/si-form-item/si-form-item.component.d.ts +90 -0
- package/form/si-form-item-control-input.directive.d.ts +18 -0
- package/form/si-form-item.control.d.ts +35 -0
- package/form/si-form-validation-error.model.d.ts +55 -0
- package/form/si-form-validation-error.provider.d.ts +11 -0
- package/form/si-form-validation-error.service.d.ts +42 -0
- package/form/si-form-validation-tooltip/si-form-validation-tooltip.component.d.ts +13 -0
- package/form/si-form-validation-tooltip/si-form-validation-tooltip.directive.d.ts +42 -0
- package/form/si-form.module.d.ts +25 -0
- package/icon/element-icons.d.ts +20 -0
- package/icon-status/index.d.ts +6 -0
- package/icon-status/package.json +3 -0
- package/icon-status/si-icon-status.component.d.ts +24 -0
- package/icon-status/si-icon-status.module.d.ts +7 -0
- package/info-page/index.d.ts +5 -0
- package/info-page/package.json +3 -0
- package/info-page/si-info-page.component.d.ts +38 -0
- package/inline-notification/si-inline-notification.component.d.ts +0 -2
- package/ip-input/address-utils.d.ts +28 -0
- package/ip-input/address-validators.d.ts +21 -0
- package/ip-input/index.d.ts +7 -0
- package/ip-input/package.json +3 -0
- package/ip-input/si-ip-input.directive.d.ts +53 -0
- package/ip-input/si-ip4-input.directive.d.ts +9 -0
- package/ip-input/si-ip6-input.directive.d.ts +10 -0
- package/language-switcher/index.d.ts +7 -0
- package/language-switcher/iso-language-value.d.ts +14 -0
- package/language-switcher/package.json +3 -0
- package/language-switcher/si-language-switcher.component.d.ts +32 -0
- package/language-switcher/si-language-switcher.module.d.ts +7 -0
- package/localization/index.d.ts +8 -0
- package/localization/package.json +3 -0
- package/localization/si-directionality.d.ts +41 -0
- package/localization/si-locale-id.d.ts +22 -0
- package/localization/si-locale-store.d.ts +16 -0
- package/localization/si-locale.service.d.ts +73 -0
- package/number-input/index.d.ts +6 -0
- package/number-input/package.json +3 -0
- package/number-input/si-number-input.component.d.ts +106 -0
- package/number-input/si-number-input.module.d.ts +7 -0
- package/package.json +163 -3
- package/password-strength/index.d.ts +7 -0
- package/password-strength/package.json +3 -0
- package/password-strength/si-password-strength.component.d.ts +25 -0
- package/password-strength/si-password-strength.directive.d.ts +54 -0
- package/password-strength/si-password-strength.module.d.ts +8 -0
- package/photo-upload/index.d.ts +6 -0
- package/photo-upload/package.json +3 -0
- package/photo-upload/si-image-cropper-style.component.d.ts +5 -0
- package/photo-upload/si-photo-upload.component.d.ts +298 -0
- package/pills-input/index.d.ts +9 -0
- package/pills-input/package.json +3 -0
- package/pills-input/si-input-pill.component.d.ts +9 -0
- package/pills-input/si-pills-input-csv.directive.d.ts +8 -0
- package/pills-input/si-pills-input-email.directive.d.ts +10 -0
- package/pills-input/si-pills-input-pattern-base.d.ts +19 -0
- package/pills-input/si-pills-input-value-handler.d.ts +12 -0
- package/pills-input/si-pills-input.component.d.ts +87 -0
- package/pills-input/si-pills-input.module.d.ts +9 -0
- package/popover/index.d.ts +6 -0
- package/popover/package.json +3 -0
- package/popover/si-popover.component.d.ts +26 -0
- package/popover/si-popover.directive.d.ts +89 -0
- package/popover/si-popover.module.d.ts +7 -0
- package/popover-next/index.d.ts +7 -0
- package/popover-next/package.json +3 -0
- package/popover-next/si-popover-description.directive.d.ts +7 -0
- package/popover-next/si-popover-next.directive.d.ts +61 -0
- package/popover-next/si-popover-title.directive.d.ts +7 -0
- package/popover-next/si-popover.component.d.ts +27 -0
- package/progressbar/index.d.ts +6 -0
- package/progressbar/package.json +3 -0
- package/progressbar/si-progressbar.component.d.ts +43 -0
- package/progressbar/si-progressbar.module.d.ts +7 -0
- package/search-bar/index.d.ts +6 -0
- package/search-bar/package.json +3 -0
- package/search-bar/si-search-bar.component.d.ts +87 -0
- package/search-bar/si-search-bar.module.d.ts +7 -0
- package/select/index.d.ts +18 -0
- package/select/options/si-select-complex-options.directive.d.ts +69 -0
- package/select/options/si-select-lazy-options.directive.d.ts +38 -0
- package/select/options/si-select-option.source.d.ts +49 -0
- package/select/options/si-select-options-strategy.base.d.ts +35 -0
- package/select/options/si-select-options-strategy.d.ts +37 -0
- package/select/options/si-select-simple-options.directive.d.ts +34 -0
- package/select/package.json +3 -0
- package/select/select-input/si-select-input.component.d.ts +43 -0
- package/select/select-list/si-select-list-has-filter.component.d.ts +20 -0
- package/select/select-list/si-select-list.base.d.ts +37 -0
- package/select/select-list/si-select-list.component.d.ts +15 -0
- package/select/select-option/si-select-option-row.component.d.ts +16 -0
- package/select/select-option/si-select-option.component.d.ts +9 -0
- package/select/selection/si-select-multi-value.directive.d.ts +26 -0
- package/select/selection/si-select-selection-strategy.d.ts +58 -0
- package/select/selection/si-select-single-value.directive.d.ts +26 -0
- package/select/si-select-action.directive.d.ts +12 -0
- package/select/si-select-actions.directive.d.ts +5 -0
- package/select/si-select-group-template.directive.d.ts +20 -0
- package/select/si-select-option-row-template.directive.d.ts +9 -0
- package/select/si-select-option-template.directive.d.ts +21 -0
- package/select/si-select.component.d.ts +96 -0
- package/select/si-select.module.d.ts +15 -0
- package/select/si-select.types.d.ts +65 -0
- package/skip-links/index.d.ts +5 -0
- package/skip-links/package.json +3 -0
- package/skip-links/si-skip-link-target.directive.d.ts +27 -0
- package/skip-links/si-skip-links.component.d.ts +9 -0
- package/skip-links/skip-link.service.d.ts +14 -0
- package/slider/index.d.ts +6 -0
- package/slider/package.json +3 -0
- package/slider/si-slider.component.d.ts +129 -0
- package/slider/si-slider.module.d.ts +7 -0
- package/sort-bar/index.d.ts +6 -0
- package/sort-bar/package.json +3 -0
- package/sort-bar/si-sort-bar.component.d.ts +42 -0
- package/sort-bar/si-sort-bar.module.d.ts +7 -0
- package/split/index.d.ts +8 -0
- package/split/package.json +3 -0
- package/split/si-split-part.component.d.ts +154 -0
- package/split/si-split.component.d.ts +48 -0
- package/split/si-split.interfaces.d.ts +17 -0
- package/split/si-split.module.d.ts +8 -0
- package/status-toggle/index.d.ts +6 -0
- package/status-toggle/package.json +3 -0
- package/status-toggle/si-status-toggle.component.d.ts +54 -0
- package/status-toggle/status-toggle.model.d.ts +26 -0
- package/summary-widget/index.d.ts +5 -0
- package/summary-widget/package.json +3 -0
- package/summary-widget/si-summary-widget.component.d.ts +44 -0
- package/system-banner/index.d.ts +5 -0
- package/system-banner/package.json +3 -0
- package/system-banner/system-banner.component.d.ts +23 -0
- package/tabs/index.d.ts +7 -0
- package/tabs/package.json +3 -0
- package/tabs/si-tab/index.d.ts +5 -0
- package/tabs/si-tab/si-tab.component.d.ts +58 -0
- package/tabs/si-tabs.module.d.ts +8 -0
- package/tabs/si-tabset/index.d.ts +5 -0
- package/tabs/si-tabset/si-tabset.component.d.ts +100 -0
- package/template-i18n.json +111 -1
- package/toast-notification/index.d.ts +6 -0
- package/toast-notification/package.json +3 -0
- package/toast-notification/si-toast-notification/si-toast-notification.component.d.ts +17 -0
- package/toast-notification/si-toast-notification-drawer/si-toast-notification-drawer.component.d.ts +9 -0
- package/toast-notification/si-toast-notification.service.d.ts +41 -0
- package/toast-notification/si-toast.model.d.ts +25 -0
- package/translate/si-translatable-keys.interface.d.ts +110 -0
- package/typeahead/index.d.ts +8 -0
- package/typeahead/package.json +3 -0
- package/typeahead/si-typeahead-item-template.directive.d.ts +7 -0
- package/typeahead/si-typeahead.component.d.ts +22 -0
- package/typeahead/si-typeahead.directive.d.ts +196 -0
- package/typeahead/si-typeahead.model.d.ts +60 -0
- package/typeahead/si-typeahead.module.d.ts +8 -0
- package/typeahead/si-typeahead.sorting.d.ts +10 -0
- package/unauthorized-page/index.d.ts +6 -0
- package/unauthorized-page/package.json +3 -0
- package/unauthorized-page/si-unauthorized-page.component.d.ts +35 -0
- package/unauthorized-page/si-unauthorized-page.module.d.ts +7 -0
- package/wizard/index.d.ts +7 -0
- package/wizard/package.json +3 -0
- package/wizard/si-wizard-step.component.d.ts +21 -0
- package/wizard/si-wizard.component.d.ts +196 -0
- package/wizard/si-wizard.module.d.ts +8 -0
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
import { CdkOption, CdkListbox } from '@angular/cdk/listbox';
|
|
2
|
+
import { DatePipe, NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { Injectable, input, booleanAttribute, output, signal, computed, ChangeDetectionStrategy, Component, Pipe, inject, model, NgModule } from '@angular/core';
|
|
5
|
+
import * as i1 from '@angular/forms';
|
|
6
|
+
import { FormsModule } from '@angular/forms';
|
|
7
|
+
import { SiCalendarButtonComponent, SiDatepickerComponent, SiDatepickerDirective } from '@siemens/element-ng/datepicker';
|
|
8
|
+
import { SiSearchBarComponent } from '@siemens/element-ng/search-bar';
|
|
9
|
+
import * as i2 from '@siemens/element-translate-ng/translate';
|
|
10
|
+
import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
|
|
11
|
+
import { SiNumberInputComponent } from '@siemens/element-ng/number-input';
|
|
12
|
+
import { SiSelectComponent, SiSelectSingleValueDirective, SiSelectSimpleOptionsDirective } from '@siemens/element-ng/select';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Copyright Siemens 2016 - 2025.
|
|
16
|
+
* SPDX-License-Identifier: MIT
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Service to transform and calculate with DateRangeFilter objects.
|
|
20
|
+
*/
|
|
21
|
+
class SiDateRangeCalculationService {
|
|
22
|
+
/**
|
|
23
|
+
* Calculates the start and end dates of a DateRangeFilter.
|
|
24
|
+
* @param filter - The date range filter object to be resolved.
|
|
25
|
+
* @param options - Options for time handling
|
|
26
|
+
* @returns The resolved result in form of a ResolvedDateRange object.
|
|
27
|
+
*/
|
|
28
|
+
resolveDateRangeFilter(filter, options) {
|
|
29
|
+
const ref = filter.point1 === 'now' ? new Date() : new Date(filter.point1);
|
|
30
|
+
const withTime = options?.withTime ?? true;
|
|
31
|
+
if (!withTime) {
|
|
32
|
+
this.removeTime(ref);
|
|
33
|
+
}
|
|
34
|
+
if (filter.point2 instanceof Date) {
|
|
35
|
+
const point2 = withTime ? filter.point2 : this.removeTime(new Date(filter.point2));
|
|
36
|
+
return this.normalize(ref, point2, options?.skipNormalization);
|
|
37
|
+
}
|
|
38
|
+
const offset = filter.point2;
|
|
39
|
+
switch (filter.range) {
|
|
40
|
+
case undefined:
|
|
41
|
+
case 'before':
|
|
42
|
+
return this.normalize(ref, this.datePlusOffset(ref, -offset), options?.skipNormalization);
|
|
43
|
+
case 'after':
|
|
44
|
+
return this.normalize(ref, this.datePlusOffset(ref, offset), options?.skipNormalization);
|
|
45
|
+
case 'within':
|
|
46
|
+
return this.normalize(this.datePlusOffset(ref, -offset), this.datePlusOffset(ref, offset), options?.skipNormalization);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
datePlusOffset(date, offset) {
|
|
50
|
+
return new Date(date.getTime() + offset);
|
|
51
|
+
}
|
|
52
|
+
normalize(date1, date2, skip) {
|
|
53
|
+
const valid = !isNaN(date1.getTime()) && !isNaN(date2.getTime());
|
|
54
|
+
return skip
|
|
55
|
+
? { start: date1, end: date2, valid }
|
|
56
|
+
: date1 < date2
|
|
57
|
+
? { start: date1, end: date2, valid }
|
|
58
|
+
: { start: date2, end: date1, valid };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Utility to reset the time attributes to 0 (hours/minutes/seconds/milliseconds).
|
|
62
|
+
*/
|
|
63
|
+
removeTime(date) {
|
|
64
|
+
date.setHours(0);
|
|
65
|
+
date.setMinutes(0);
|
|
66
|
+
date.setSeconds(0);
|
|
67
|
+
date.setMilliseconds(0);
|
|
68
|
+
return date;
|
|
69
|
+
}
|
|
70
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeCalculationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
71
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeCalculationService, providedIn: 'root' });
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeCalculationService, decorators: [{
|
|
74
|
+
type: Injectable,
|
|
75
|
+
args: [{ providedIn: 'root' }]
|
|
76
|
+
}] });
|
|
77
|
+
|
|
78
|
+
const ONE_MINUTE = 60 * 1000;
|
|
79
|
+
const ONE_DAY = ONE_MINUTE * 60 * 24;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Copyright Siemens 2016 - 2025.
|
|
83
|
+
* SPDX-License-Identifier: MIT
|
|
84
|
+
*/
|
|
85
|
+
class SiRelativeDateComponent {
|
|
86
|
+
/** @defaultValue 0 */
|
|
87
|
+
value = input(0);
|
|
88
|
+
/** @defaultValue false */
|
|
89
|
+
enableTimeSelection = input(false, { transform: booleanAttribute });
|
|
90
|
+
valueLabel = input.required();
|
|
91
|
+
unitLabel = input.required();
|
|
92
|
+
valueChange = output();
|
|
93
|
+
internalValue = signal(0);
|
|
94
|
+
offset = signal(0);
|
|
95
|
+
unit = signal('days');
|
|
96
|
+
fullOffsetList = [
|
|
97
|
+
{
|
|
98
|
+
type: 'option',
|
|
99
|
+
value: 'minutes',
|
|
100
|
+
label: $localize `:@@SI_DATE_RANGE_FILTER.MINUTES:Minutes`,
|
|
101
|
+
offset: ONE_MINUTE
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
type: 'option',
|
|
105
|
+
value: 'hours',
|
|
106
|
+
label: $localize `:@@SI_DATE_RANGE_FILTER.HOURS:Hours`,
|
|
107
|
+
offset: 60 * ONE_MINUTE
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'option',
|
|
111
|
+
value: 'days',
|
|
112
|
+
label: $localize `:@@SI_DATE_RANGE_FILTER.DAYS:Days`,
|
|
113
|
+
offset: ONE_DAY
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'option',
|
|
117
|
+
value: 'weeks',
|
|
118
|
+
label: $localize `:@@SI_DATE_RANGE_FILTER.WEEKS:Weeks`,
|
|
119
|
+
offset: 7 * ONE_DAY
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'option',
|
|
123
|
+
value: 'months',
|
|
124
|
+
label: $localize `:@@SI_DATE_RANGE_FILTER.MONTHS:Months`,
|
|
125
|
+
offset: 30 * ONE_DAY
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'option',
|
|
129
|
+
value: 'years',
|
|
130
|
+
label: $localize `:@@SI_DATE_RANGE_FILTER.YEARS:Years`,
|
|
131
|
+
offset: 365 * ONE_DAY
|
|
132
|
+
}
|
|
133
|
+
];
|
|
134
|
+
offsetList = computed(() => this.enableTimeSelection()
|
|
135
|
+
? this.fullOffsetList
|
|
136
|
+
: this.fullOffsetList.filter(item => item.offset >= ONE_DAY));
|
|
137
|
+
ngOnChanges(changes) {
|
|
138
|
+
const value = this.value();
|
|
139
|
+
if (changes.value && value !== this.internalValue()) {
|
|
140
|
+
this.internalValue.set(value);
|
|
141
|
+
this.calculateOffset();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
calculateOffset() {
|
|
145
|
+
const offsetList = this.offsetList();
|
|
146
|
+
let unit = '';
|
|
147
|
+
if (offsetList.length) {
|
|
148
|
+
this.offset.set(0);
|
|
149
|
+
unit = offsetList[0].value;
|
|
150
|
+
}
|
|
151
|
+
for (let i = offsetList.length - 1; i >= 0; i--) {
|
|
152
|
+
const item = offsetList[i];
|
|
153
|
+
const raw = this.internalValue() / item.offset;
|
|
154
|
+
const rounded = Math.round(raw);
|
|
155
|
+
if (rounded > 0 && Math.abs(raw - rounded) < 0.001) {
|
|
156
|
+
this.offset.set(rounded);
|
|
157
|
+
unit = item.value;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
this.changeUnit(unit);
|
|
162
|
+
}
|
|
163
|
+
updateValue(offset) {
|
|
164
|
+
this.offset.set(offset);
|
|
165
|
+
const item = this.offsetList().find(x => x.value === this.unit());
|
|
166
|
+
this.internalValue.set(offset * item.offset);
|
|
167
|
+
this.valueChange.emit(this.internalValue());
|
|
168
|
+
}
|
|
169
|
+
changeUnit(newUnit) {
|
|
170
|
+
this.unit.set(newUnit);
|
|
171
|
+
const item = this.offsetList().find(x => x.value === this.unit());
|
|
172
|
+
this.offset.set(Math.max(1, Math.round(this.internalValue() / item.offset)));
|
|
173
|
+
this.internalValue.set(this.offset() * item.offset);
|
|
174
|
+
this.valueChange.emit(this.internalValue());
|
|
175
|
+
}
|
|
176
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiRelativeDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
177
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.6", type: SiRelativeDateComponent, isStandalone: true, selector: "si-relative-date", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, enableTimeSelection: { classPropertyName: "enableTimeSelection", publicName: "enableTimeSelection", isSignal: true, isRequired: false, transformFunction: null }, valueLabel: { classPropertyName: "valueLabel", publicName: "valueLabel", isSignal: true, isRequired: true, transformFunction: null }, unitLabel: { classPropertyName: "unitLabel", publicName: "unitLabel", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<si-number-input\n class=\"form-control mb-4\"\n [aria-label]=\"valueLabel()\"\n [ngModel]=\"offset()\"\n (ngModelChange)=\"updateValue($event)\"\n/>\n<si-select\n class=\"form-control\"\n min=\"0\"\n [ariaLabel]=\"unitLabel()\"\n [options]=\"offsetList()\"\n [ngModel]=\"unit()\"\n (ngModelChange)=\"changeUnit($event)\"\n/>\n", styles: [".form-control{min-inline-size:0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SiNumberInputComponent, selector: "si-number-input", inputs: ["min", "max", "step", "value", "unit", "showButtons", "aria-label", "inputId", "disabled", "readonly", "placeholder"], outputs: ["valueChange"] }, { kind: "component", type: SiSelectComponent, selector: "si-select", inputs: ["id", "ariaLabel", "labelledby", "filterPlaceholder", "noResultsFoundLabel", "placeholder", "readonly", "hasFilter"], outputs: ["dropdownClose", "openChange"] }, { kind: "directive", type: SiSelectSingleValueDirective, selector: "si-select:not([multi])" }, { kind: "directive", type: SiSelectSimpleOptionsDirective, selector: "si-select[options]", inputs: ["options", "optionEqualCheckFn"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
178
|
+
}
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiRelativeDateComponent, decorators: [{
|
|
180
|
+
type: Component,
|
|
181
|
+
args: [{ selector: 'si-relative-date', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
182
|
+
FormsModule,
|
|
183
|
+
SiNumberInputComponent,
|
|
184
|
+
SiSelectComponent,
|
|
185
|
+
SiSelectSingleValueDirective,
|
|
186
|
+
SiSelectSimpleOptionsDirective
|
|
187
|
+
], template: "<si-number-input\n class=\"form-control mb-4\"\n [aria-label]=\"valueLabel()\"\n [ngModel]=\"offset()\"\n (ngModelChange)=\"updateValue($event)\"\n/>\n<si-select\n class=\"form-control\"\n min=\"0\"\n [ariaLabel]=\"unitLabel()\"\n [options]=\"offsetList()\"\n [ngModel]=\"unit()\"\n (ngModelChange)=\"changeUnit($event)\"\n/>\n", styles: [".form-control{min-inline-size:0}\n"] }]
|
|
188
|
+
}] });
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Copyright Siemens 2016 - 2025.
|
|
192
|
+
* SPDX-License-Identifier: MIT
|
|
193
|
+
*/
|
|
194
|
+
class PresetMatchFilterPipe {
|
|
195
|
+
transform(value, term) {
|
|
196
|
+
return !term ? true : value.toLowerCase().includes(term.toLowerCase());
|
|
197
|
+
}
|
|
198
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: PresetMatchFilterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
199
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: PresetMatchFilterPipe, isStandalone: true, name: "presetMatchFilter" });
|
|
200
|
+
}
|
|
201
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: PresetMatchFilterPipe, decorators: [{
|
|
202
|
+
type: Pipe,
|
|
203
|
+
args: [{ name: 'presetMatchFilter', pure: true }]
|
|
204
|
+
}] });
|
|
205
|
+
class SiDateRangeFilterComponent {
|
|
206
|
+
service = inject(SiDateRangeCalculationService);
|
|
207
|
+
/** The filter range object */
|
|
208
|
+
range = model.required();
|
|
209
|
+
/** List of preset time ranges. When not present or empty, the preset section won't show */
|
|
210
|
+
presetList = input();
|
|
211
|
+
/**
|
|
212
|
+
* Determines if there's a search field for the preset list
|
|
213
|
+
*
|
|
214
|
+
* @defaultValue true
|
|
215
|
+
*/
|
|
216
|
+
presetSearch = input(true, { transform: booleanAttribute });
|
|
217
|
+
/**
|
|
218
|
+
* Determines if time is selectable or only dates
|
|
219
|
+
*
|
|
220
|
+
* @defaultValue false
|
|
221
|
+
*/
|
|
222
|
+
enableTimeSelection = input(false, { transform: booleanAttribute });
|
|
223
|
+
/**
|
|
224
|
+
* Determines whether to show input fields or a date-range calendar in basic mode.
|
|
225
|
+
* When time selection is enabled, this has no effect and input fields are always shown.
|
|
226
|
+
*
|
|
227
|
+
* @defaultValue 'calendar'
|
|
228
|
+
*/
|
|
229
|
+
basicMode = input('calendar');
|
|
230
|
+
/**
|
|
231
|
+
* Reverses the order of the from/to fields
|
|
232
|
+
*
|
|
233
|
+
* @defaultValue false
|
|
234
|
+
*/
|
|
235
|
+
reverseInputFields = input(false, { transform: booleanAttribute });
|
|
236
|
+
/**
|
|
237
|
+
* Determines whether to show the 'Apply' button
|
|
238
|
+
*
|
|
239
|
+
* @defaultValue false
|
|
240
|
+
*/
|
|
241
|
+
showApplyButton = input(false, { transform: booleanAttribute });
|
|
242
|
+
/**
|
|
243
|
+
* Hides the advanced mode if input allows
|
|
244
|
+
*
|
|
245
|
+
* @defaultValue false
|
|
246
|
+
*/
|
|
247
|
+
hideAdvancedMode = input(false, { transform: booleanAttribute });
|
|
248
|
+
/**
|
|
249
|
+
* label for the "Reference point" title
|
|
250
|
+
*
|
|
251
|
+
* @defaultValue
|
|
252
|
+
* ```
|
|
253
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.REF_POINT:Reference point`
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
refLabel = input($localize `:@@SI_DATE_RANGE_FILTER.REF_POINT:Reference point`);
|
|
257
|
+
/**
|
|
258
|
+
* label for the "Reference point" title
|
|
259
|
+
*
|
|
260
|
+
* @defaultValue
|
|
261
|
+
* ```
|
|
262
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.FROM:From`
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
fromLabel = input($localize `:@@SI_DATE_RANGE_FILTER.FROM:From`);
|
|
266
|
+
/**
|
|
267
|
+
* label for the "Reference point" title
|
|
268
|
+
*
|
|
269
|
+
* @defaultValue
|
|
270
|
+
* ```
|
|
271
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.TO:To`
|
|
272
|
+
* ```
|
|
273
|
+
*/
|
|
274
|
+
toLabel = input($localize `:@@SI_DATE_RANGE_FILTER.TO:To`);
|
|
275
|
+
/**
|
|
276
|
+
* label for the "Range" title
|
|
277
|
+
*
|
|
278
|
+
* @defaultValue
|
|
279
|
+
* ```
|
|
280
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.RANGE:Range`
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
rangeLabel = input($localize `:@@SI_DATE_RANGE_FILTER.RANGE:Range`);
|
|
284
|
+
/**
|
|
285
|
+
* label for the "Today" checkbox
|
|
286
|
+
*
|
|
287
|
+
* @defaultValue
|
|
288
|
+
* ```
|
|
289
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.TODAY:Today`
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
todayLabel = input($localize `:@@SI_DATE_RANGE_FILTER.TODAY:Today`);
|
|
293
|
+
/**
|
|
294
|
+
* label for the "Now" checkbox
|
|
295
|
+
*
|
|
296
|
+
* @defaultValue
|
|
297
|
+
* ```
|
|
298
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.NOW:Now`
|
|
299
|
+
* ```
|
|
300
|
+
*/
|
|
301
|
+
nowLabel = input($localize `:@@SI_DATE_RANGE_FILTER.NOW:Now`);
|
|
302
|
+
/**
|
|
303
|
+
* label for "Date" field / radio button
|
|
304
|
+
*
|
|
305
|
+
* @defaultValue
|
|
306
|
+
* ```
|
|
307
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.DATE:Date`
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
dateLabel = input($localize `:@@SI_DATE_RANGE_FILTER.DATE:Date`);
|
|
311
|
+
/**
|
|
312
|
+
* label for the "Preview" title
|
|
313
|
+
*
|
|
314
|
+
* @defaultValue
|
|
315
|
+
* ```
|
|
316
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.PREVIEW:Preview`
|
|
317
|
+
* ```
|
|
318
|
+
*/
|
|
319
|
+
previewLabel = input($localize `:@@SI_DATE_RANGE_FILTER.PREVIEW:Preview`);
|
|
320
|
+
/**
|
|
321
|
+
* Placeholder for date fields
|
|
322
|
+
*
|
|
323
|
+
* @defaultValue
|
|
324
|
+
* ```
|
|
325
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.DATE_PLACEHOLDER:Select date`
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
datePlaceholder = input($localize `:@@SI_DATE_RANGE_FILTER.DATE_PLACEHOLDER:Select date`);
|
|
329
|
+
/**
|
|
330
|
+
* label for the "Before" toggle
|
|
331
|
+
*
|
|
332
|
+
* @defaultValue
|
|
333
|
+
* ```
|
|
334
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.BEFORE:Before`
|
|
335
|
+
* ```
|
|
336
|
+
*/
|
|
337
|
+
beforeLabel = input($localize `:@@SI_DATE_RANGE_FILTER.BEFORE:Before`);
|
|
338
|
+
/**
|
|
339
|
+
* label for the "After" toggle
|
|
340
|
+
*
|
|
341
|
+
* @defaultValue
|
|
342
|
+
* ```
|
|
343
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.AFTER:After`
|
|
344
|
+
* ```
|
|
345
|
+
*/
|
|
346
|
+
afterLabel = input($localize `:@@SI_DATE_RANGE_FILTER.AFTER:After`);
|
|
347
|
+
/**
|
|
348
|
+
* label for the "Within" toggle
|
|
349
|
+
*
|
|
350
|
+
* @defaultValue
|
|
351
|
+
* ```
|
|
352
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.WITHIN:Within`
|
|
353
|
+
* ```
|
|
354
|
+
*/
|
|
355
|
+
withinLabel = input($localize `:@@SI_DATE_RANGE_FILTER.WITHIN:Within`);
|
|
356
|
+
/**
|
|
357
|
+
* label for the "value" number input
|
|
358
|
+
*
|
|
359
|
+
* @defaultValue
|
|
360
|
+
* ```
|
|
361
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.VALUE:Value`
|
|
362
|
+
* ```
|
|
363
|
+
*/
|
|
364
|
+
valueLabel = input($localize `:@@SI_DATE_RANGE_FILTER.VALUE:Value`);
|
|
365
|
+
/**
|
|
366
|
+
* label for the "Unit" select
|
|
367
|
+
*
|
|
368
|
+
* @defaultValue
|
|
369
|
+
* ```
|
|
370
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.UNIT:Unit`
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
unitLabel = input($localize `:@@SI_DATE_RANGE_FILTER.UNIT:Unit`);
|
|
374
|
+
/**
|
|
375
|
+
* label for the "search" input
|
|
376
|
+
*
|
|
377
|
+
* @defaultValue
|
|
378
|
+
* ```
|
|
379
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.SEARCH:Search`
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
searchLabel = input($localize `:@@SI_DATE_RANGE_FILTER.SEARCH:Search`);
|
|
383
|
+
/**
|
|
384
|
+
* label for the "search" input
|
|
385
|
+
*
|
|
386
|
+
* @defaultValue
|
|
387
|
+
* ```
|
|
388
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.PRESETS:Presets`
|
|
389
|
+
* ```
|
|
390
|
+
*/
|
|
391
|
+
presetLabel = input($localize `:@@SI_DATE_RANGE_FILTER.PRESETS:Presets`);
|
|
392
|
+
/**
|
|
393
|
+
* label for the "advanced" switch
|
|
394
|
+
*
|
|
395
|
+
* @defaultValue
|
|
396
|
+
* ```
|
|
397
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.ADVANCED:Advanced`
|
|
398
|
+
* ```
|
|
399
|
+
*/
|
|
400
|
+
advancedLabel = input($localize `:@@SI_DATE_RANGE_FILTER.ADVANCED:Advanced`);
|
|
401
|
+
/**
|
|
402
|
+
* label for the "apply" switch
|
|
403
|
+
*
|
|
404
|
+
* @defaultValue
|
|
405
|
+
* ```
|
|
406
|
+
* $localize`:@@SI_DATE_RANGE_FILTER.APPLY:Apply`
|
|
407
|
+
* ```
|
|
408
|
+
*/
|
|
409
|
+
applyLabel = input($localize `:@@SI_DATE_RANGE_FILTER.APPLY:Apply`);
|
|
410
|
+
/** Event fired when the apply button has been clicked */
|
|
411
|
+
applyClicked = output();
|
|
412
|
+
/** Base configuration on how the dates should be displayed, parts of it may be overwritten internally. */
|
|
413
|
+
datepickerConfig = input();
|
|
414
|
+
advancedMode = false;
|
|
415
|
+
dateRange = { start: undefined, end: undefined };
|
|
416
|
+
point1Now = true;
|
|
417
|
+
point2Mode = 'duration';
|
|
418
|
+
point1date = this.getDateNow();
|
|
419
|
+
point2date = this.getDateNow();
|
|
420
|
+
point2offset = 0;
|
|
421
|
+
point2range = 'before';
|
|
422
|
+
calculatedRange = computed(() => this.resolve(this.range()));
|
|
423
|
+
pipeFormat = computed(() => this.enableTimeSelection()
|
|
424
|
+
? (this.datepickerConfig()?.dateTimeFormat ?? 'short')
|
|
425
|
+
: (this.datepickerConfig()?.dateFormat ?? 'shortDate'));
|
|
426
|
+
datepickerConfigInternal = computed(() => ({
|
|
427
|
+
...(this.datepickerConfig() ?? {}),
|
|
428
|
+
enableDateRange: false,
|
|
429
|
+
showTime: this.enableTimeSelection(),
|
|
430
|
+
mandatoryTime: this.enableTimeSelection()
|
|
431
|
+
}));
|
|
432
|
+
dateRangeConfig = computed(() => ({
|
|
433
|
+
...(this.datepickerConfig() ?? {}),
|
|
434
|
+
enableDateRange: true
|
|
435
|
+
}));
|
|
436
|
+
filteredPresetList = computed(() => {
|
|
437
|
+
const timeFilter = (item) => {
|
|
438
|
+
const timeOnly = item.type === 'custom' ? item.timeOnly : item.offset < ONE_DAY;
|
|
439
|
+
return this.enableTimeSelection() || !timeOnly;
|
|
440
|
+
};
|
|
441
|
+
return (this.presetList() ?? []).filter(timeFilter);
|
|
442
|
+
});
|
|
443
|
+
presetFilter = signal('');
|
|
444
|
+
inputMode = computed(() => this.basicMode() === 'input' || this.enableTimeSelection());
|
|
445
|
+
ngOnChanges(changes) {
|
|
446
|
+
if (changes.enableTimeSelection ||
|
|
447
|
+
changes.datepickerConfig ||
|
|
448
|
+
(changes.range && this.rangeChanged(changes.range.previousValue, changes.range.currentValue))) {
|
|
449
|
+
this.updateFromRange();
|
|
450
|
+
}
|
|
451
|
+
if ((changes.basicMode || changes.enableTimeSelection) &&
|
|
452
|
+
this.inputMode() &&
|
|
453
|
+
!this.advancedMode) {
|
|
454
|
+
this.point2Mode = 'date';
|
|
455
|
+
this.point2Changed();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
getDateNow() {
|
|
459
|
+
const now = new Date();
|
|
460
|
+
if (!this.enableTimeSelection()) {
|
|
461
|
+
this.service.removeTime(now);
|
|
462
|
+
}
|
|
463
|
+
return now;
|
|
464
|
+
}
|
|
465
|
+
rangeChanged(oldRange, newRange) {
|
|
466
|
+
return (!oldRange ||
|
|
467
|
+
oldRange.point1 !== newRange.point1 ||
|
|
468
|
+
oldRange.point2 !== newRange.point2 ||
|
|
469
|
+
oldRange.range !== newRange.range);
|
|
470
|
+
}
|
|
471
|
+
updateFromRange() {
|
|
472
|
+
const rangeVal = this.range();
|
|
473
|
+
this.point1Now = rangeVal.point1 === 'now';
|
|
474
|
+
this.point1date = rangeVal.point1 === 'now' ? this.getDateNow() : rangeVal.point1;
|
|
475
|
+
this.point2Mode = rangeVal.point2 instanceof Date ? 'date' : 'duration';
|
|
476
|
+
this.point2date = rangeVal.point2 instanceof Date ? rangeVal.point2 : this.getDateNow();
|
|
477
|
+
this.point2range = rangeVal.range ?? 'before';
|
|
478
|
+
this.point2offset =
|
|
479
|
+
rangeVal.point2 instanceof Date
|
|
480
|
+
? Math.round(this.point1date.getTime() - rangeVal.point2.getTime())
|
|
481
|
+
: rangeVal.point2;
|
|
482
|
+
if ((this.point1Now && this.basicMode() !== 'input') || this.point2Mode !== 'date') {
|
|
483
|
+
this.advancedMode = true;
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
this.advancedMode = false;
|
|
487
|
+
this.updateDateRange();
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
resolve(range, skipNormalization) {
|
|
491
|
+
return this.service.resolveDateRangeFilter(range, {
|
|
492
|
+
withTime: this.enableTimeSelection(),
|
|
493
|
+
skipNormalization
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
updateDateRange(range = this.range()) {
|
|
497
|
+
const calculatedRange = this.resolve(range);
|
|
498
|
+
this.dateRange.start = calculatedRange.start;
|
|
499
|
+
this.dateRange.end = calculatedRange.end;
|
|
500
|
+
}
|
|
501
|
+
updateOnModeChange() {
|
|
502
|
+
if (this.advancedMode) {
|
|
503
|
+
const calculatedRange = this.resolve(this.range());
|
|
504
|
+
this.point2Mode = 'duration';
|
|
505
|
+
this.point2range = 'after';
|
|
506
|
+
this.point2offset = Math.abs(calculatedRange.end.getTime() - calculatedRange.start.getTime());
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
this.updateSimpleMode(this.range());
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
updateSimpleMode(newRange) {
|
|
513
|
+
if (this.inputMode()) {
|
|
514
|
+
this.range.update(oldRange => ({
|
|
515
|
+
...oldRange,
|
|
516
|
+
point1: newRange.point1
|
|
517
|
+
}));
|
|
518
|
+
// input mode supports `now`, so point1 needs to remain unchanged
|
|
519
|
+
if (newRange.point1 === 'now') {
|
|
520
|
+
this.point1Now = true;
|
|
521
|
+
this.point1date = this.getDateNow();
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
this.point1Now = false;
|
|
525
|
+
this.point1date = newRange.point1;
|
|
526
|
+
}
|
|
527
|
+
const calculatedRange = this.resolve(newRange, true);
|
|
528
|
+
this.point2Mode = 'date';
|
|
529
|
+
this.point2date = calculatedRange.end;
|
|
530
|
+
this.range.update(oldRange => ({
|
|
531
|
+
...oldRange,
|
|
532
|
+
range: undefined,
|
|
533
|
+
point2: calculatedRange.end
|
|
534
|
+
}));
|
|
535
|
+
}
|
|
536
|
+
else {
|
|
537
|
+
this.point1Now = false;
|
|
538
|
+
this.updateDateRange(newRange);
|
|
539
|
+
this.updateFromDateRange();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
updateFromDateRange() {
|
|
543
|
+
this.point1date = this.range().point1 = this.dateRange.start ?? this.getDateNow();
|
|
544
|
+
this.point2date = this.range().point2 = this.dateRange.end ?? this.getDateNow();
|
|
545
|
+
this.range.update(oldRange => ({ ...oldRange, range: undefined }));
|
|
546
|
+
this.point2Mode = 'date';
|
|
547
|
+
this.point2offset = 0;
|
|
548
|
+
}
|
|
549
|
+
point1Changed() {
|
|
550
|
+
if (this.point1Now) {
|
|
551
|
+
this.range.update(oldRange => ({ ...oldRange, point1: 'now' }));
|
|
552
|
+
this.point1date = this.getDateNow();
|
|
553
|
+
if (this.point2Mode !== 'date') {
|
|
554
|
+
this.point2range ??= 'before';
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
this.range.update(oldRange => ({ ...oldRange, point1: this.point1date ?? new Date(NaN) }));
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
point2Changed() {
|
|
562
|
+
if (this.point2Mode === 'date') {
|
|
563
|
+
if (!(this.range().point2 instanceof Date)) {
|
|
564
|
+
const calculatedRange = this.resolve(this.range());
|
|
565
|
+
this.point2date =
|
|
566
|
+
this.point1date < calculatedRange.end ? calculatedRange.start : calculatedRange.end;
|
|
567
|
+
}
|
|
568
|
+
this.range.update(oldRange => ({
|
|
569
|
+
...oldRange,
|
|
570
|
+
range: undefined,
|
|
571
|
+
point2: this.point2date
|
|
572
|
+
}));
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
this.range.update(oldRange => ({
|
|
576
|
+
...oldRange,
|
|
577
|
+
range: this.point2range
|
|
578
|
+
}));
|
|
579
|
+
if (this.range().point2 instanceof Date) {
|
|
580
|
+
const calculatedRange = this.resolve(this.range());
|
|
581
|
+
this.point2offset = Math.round(calculatedRange.end.getTime() - calculatedRange.start.getTime());
|
|
582
|
+
}
|
|
583
|
+
this.range.update(oldRange => ({
|
|
584
|
+
...oldRange,
|
|
585
|
+
point2: this.point2offset
|
|
586
|
+
}));
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
selectPresetItem(item) {
|
|
590
|
+
const newRange = item.type === 'custom'
|
|
591
|
+
? item.calculate(item, this.range())
|
|
592
|
+
: { point1: 'now', range: 'before', point2: item.offset };
|
|
593
|
+
if (this.advancedMode) {
|
|
594
|
+
Object.assign(this.range(), newRange);
|
|
595
|
+
this.updateFromRange();
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
this.updateSimpleMode(newRange);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
602
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiDateRangeFilterComponent, isStandalone: true, selector: "si-date-range-filter", inputs: { range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: true, transformFunction: null }, presetList: { classPropertyName: "presetList", publicName: "presetList", isSignal: true, isRequired: false, transformFunction: null }, presetSearch: { classPropertyName: "presetSearch", publicName: "presetSearch", isSignal: true, isRequired: false, transformFunction: null }, enableTimeSelection: { classPropertyName: "enableTimeSelection", publicName: "enableTimeSelection", isSignal: true, isRequired: false, transformFunction: null }, basicMode: { classPropertyName: "basicMode", publicName: "basicMode", isSignal: true, isRequired: false, transformFunction: null }, reverseInputFields: { classPropertyName: "reverseInputFields", publicName: "reverseInputFields", isSignal: true, isRequired: false, transformFunction: null }, showApplyButton: { classPropertyName: "showApplyButton", publicName: "showApplyButton", isSignal: true, isRequired: false, transformFunction: null }, hideAdvancedMode: { classPropertyName: "hideAdvancedMode", publicName: "hideAdvancedMode", isSignal: true, isRequired: false, transformFunction: null }, refLabel: { classPropertyName: "refLabel", publicName: "refLabel", isSignal: true, isRequired: false, transformFunction: null }, fromLabel: { classPropertyName: "fromLabel", publicName: "fromLabel", isSignal: true, isRequired: false, transformFunction: null }, toLabel: { classPropertyName: "toLabel", publicName: "toLabel", isSignal: true, isRequired: false, transformFunction: null }, rangeLabel: { classPropertyName: "rangeLabel", publicName: "rangeLabel", isSignal: true, isRequired: false, transformFunction: null }, todayLabel: { classPropertyName: "todayLabel", publicName: "todayLabel", isSignal: true, isRequired: false, transformFunction: null }, nowLabel: { classPropertyName: "nowLabel", publicName: "nowLabel", isSignal: true, isRequired: false, transformFunction: null }, dateLabel: { classPropertyName: "dateLabel", publicName: "dateLabel", isSignal: true, isRequired: false, transformFunction: null }, previewLabel: { classPropertyName: "previewLabel", publicName: "previewLabel", isSignal: true, isRequired: false, transformFunction: null }, datePlaceholder: { classPropertyName: "datePlaceholder", publicName: "datePlaceholder", isSignal: true, isRequired: false, transformFunction: null }, beforeLabel: { classPropertyName: "beforeLabel", publicName: "beforeLabel", isSignal: true, isRequired: false, transformFunction: null }, afterLabel: { classPropertyName: "afterLabel", publicName: "afterLabel", isSignal: true, isRequired: false, transformFunction: null }, withinLabel: { classPropertyName: "withinLabel", publicName: "withinLabel", isSignal: true, isRequired: false, transformFunction: null }, valueLabel: { classPropertyName: "valueLabel", publicName: "valueLabel", isSignal: true, isRequired: false, transformFunction: null }, unitLabel: { classPropertyName: "unitLabel", publicName: "unitLabel", isSignal: true, isRequired: false, transformFunction: null }, searchLabel: { classPropertyName: "searchLabel", publicName: "searchLabel", isSignal: true, isRequired: false, transformFunction: null }, presetLabel: { classPropertyName: "presetLabel", publicName: "presetLabel", isSignal: true, isRequired: false, transformFunction: null }, advancedLabel: { classPropertyName: "advancedLabel", publicName: "advancedLabel", isSignal: true, isRequired: false, transformFunction: null }, applyLabel: { classPropertyName: "applyLabel", publicName: "applyLabel", isSignal: true, isRequired: false, transformFunction: null }, datepickerConfig: { classPropertyName: "datepickerConfig", publicName: "datepickerConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { range: "rangeChange", applyClicked: "applyClicked" }, usesOnChanges: true, ngImport: i0, template: "@if (presetList()?.length) {\n <div class=\"preset-select border-end\">\n @if (presetSearch()) {\n <si-search-bar\n colorVariant=\"base-0\"\n class=\"mx-6 mt-5 mb-6\"\n [placeholder]=\"searchLabel() | translate\"\n [showIcon]=\"true\"\n [(ngModel)]=\"presetFilter\"\n />\n }\n <ul class=\"overflow-auto\" cdkListbox [attr.aria-label]=\"presetLabel() | translate\">\n @for (item of filteredPresetList(); track $index) {\n @if (item.label | translate | presetMatchFilter: presetFilter()) {\n <li\n class=\"preset-item focus-inside px-8 py-5\"\n [cdkOption]=\"item.label\"\n (click)=\"selectPresetItem(item)\"\n (keydown.enter)=\"selectPresetItem(item)\"\n >\n {{ item.label | translate }}\n </li>\n }\n }\n </ul>\n </div>\n}\n<form class=\"main-form d-flex flex-column flex-fill\">\n @if (advancedMode || inputMode()) {\n <div class=\"advanced-form px-6 py-4\">\n @if (!reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n\n <div class=\"mb-8\">\n @if (point2Mode === 'date') {\n <ng-container *ngTemplateOutlet=\"formPoint2Date\" />\n }\n @if (point2Mode === 'duration') {\n <ng-container *ngTemplateOutlet=\"formPoint2Duration\" />\n }\n </div>\n\n @if (reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n </div>\n } @else {\n <si-datepicker\n [config]=\"dateRangeConfig()\"\n [focusedDate]=\"dateRange.end ?? dateRange.start\"\n [(dateRange)]=\"dateRange\"\n (dateRangeChange)=\"updateFromDateRange()\"\n />\n }\n\n @if (advancedMode || !hideAdvancedMode()) {\n <label class=\"form-switch form-check ms-6\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"advancedMode\"\n role=\"switch\"\n [(ngModel)]=\"advancedMode\"\n (ngModelChange)=\"updateOnModeChange()\"\n />\n <span class=\"form-check-label\">{{ advancedLabel() | translate }}</span>\n </label>\n }\n\n <div class=\"mt-4 mb-6 ms-6\">\n {{ previewLabel() | translate }}:\n <span class=\"preview\">\n @if (calculatedRange().valid) {\n {{ calculatedRange().start | date: pipeFormat() }} -\n {{ calculatedRange().end | date: pipeFormat() }}\n } @else {\n ?\n }\n </span>\n </div>\n</form>\n\n@if (showApplyButton()) {\n <div class=\"footer border-top px-6 py-5 d-flex\">\n <button type=\"button\" class=\"btn btn-primary ms-auto\" (click)=\"applyClicked.emit()\">\n {{ applyLabel() | translate }}\n </button>\n </div>\n}\n\n<ng-template #formReferencePoint>\n <div class=\"mb-8\">\n <label class=\"d-block\">\n <span class=\"form-label\">{{\n (advancedMode ? refLabel() : reverseInputFields() ? toLabel() : fromLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point1\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [disabled]=\"point1Now\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point1date\"\n (ngModelChange)=\"point1Changed()\"\n />\n </si-calendar-button>\n </label>\n <label class=\"ms-4 mt-4 text-nowrap form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"point1now\"\n [(ngModel)]=\"point1Now\"\n (ngModelChange)=\"point1Changed()\"\n />\n <span class=\"form-check-label\">{{\n (enableTimeSelection() ? nowLabel() : todayLabel()) | translate\n }}</span>\n </label>\n </div>\n</ng-template>\n\n<ng-template #formPoint2Date>\n <label class=\"d-block mb-4 bp-9\">\n <span class=\"form-label\">{{\n (reverseInputFields() ? fromLabel() : toLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point2\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [attr.aria-label]=\"dateLabel() | translate\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point2date\"\n (ngModelChange)=\"point2Changed()\"\n />\n </si-calendar-button>\n </label>\n</ng-template>\n\n<ng-template #formPoint2Duration>\n <div>\n <span class=\"form-label\">{{ rangeLabel() | translate }}</span>\n <si-relative-date\n class=\"d-block mb-4\"\n [unitLabel]=\"unitLabel() | translate\"\n [valueLabel]=\"valueLabel() | translate\"\n [enableTimeSelection]=\"enableTimeSelection()\"\n [(value)]=\"point2offset\"\n (valueChange)=\"point2Changed()\"\n />\n <div class=\"range-type ms-4\">\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"before\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ beforeLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"after\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ afterLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"within\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ withinLabel() | translate }}\n </span>\n </label>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:inline-grid;background:var(--element-base-1);grid-template-areas:\"preset main\" \"footer footer\"}.main-form{inline-size:348px;grid-area:main}.advanced-form{block-size:392px}.preset-select{display:flex;inline-size:200px;flex-direction:column;grid-area:preset}ul{flex:1 1 0;padding-inline-start:0;list-style:none}.preset-item{cursor:pointer;line-height:1.143}.preset-item:hover{background:var(--element-base-1-hover)}label{display:inline-flex;align-items:center}.form-check-input{inset-block-start:0}.element-zoom{rotate:45deg}.footer{grid-area:footer}\n"], dependencies: [{ kind: "directive", type: CdkOption, selector: "[cdkOption]", inputs: ["id", "cdkOption", "cdkOptionTypeaheadLabel", "cdkOptionDisabled", "tabindex"], exportAs: ["cdkOption"] }, { kind: "directive", type: CdkListbox, selector: "[cdkListbox]", inputs: ["id", "tabindex", "cdkListboxValue", "cdkListboxMultiple", "cdkListboxDisabled", "cdkListboxUseActiveDescendant", "cdkListboxOrientation", "cdkListboxCompareWith", "cdkListboxNavigationWrapDisabled", "cdkListboxNavigatesDisabledOptions"], outputs: ["cdkListboxValueChange"], exportAs: ["cdkListbox"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: PresetMatchFilterPipe, name: "presetMatchFilter" }, { kind: "component", type: SiCalendarButtonComponent, selector: "si-calendar-button", inputs: ["ariaLabel"] }, { kind: "component", type: SiDatepickerComponent, selector: "si-datepicker", inputs: ["focusedDate", "date", "dateRange", "dateRangeRole", "initialFocus", "disabledTime", "config", "previousLabel", "nextLabel", "calenderWeekLabel", "time12h", "rangeType", "minMonth", "maxMonth", "hideTimeToggle", "hideCalendar", "timepickerLabel", "activeHover"], outputs: ["focusedDateChange", "dateChange", "dateRangeChange", "disabledTimeChange", "configChange", "rangeTypeChange", "activeHoverChange"] }, { kind: "directive", type: SiDatepickerDirective, selector: "[siDatepicker]", inputs: ["autoClose", "triggeringInput"], exportAs: ["siDatepicker"] }, { kind: "component", type: SiRelativeDateComponent, selector: "si-relative-date", inputs: ["value", "enableTimeSelection", "valueLabel", "unitLabel"], outputs: ["valueChange"] }, { kind: "component", type: SiSearchBarComponent, selector: "si-search-bar", inputs: ["debounceTime", "prohibitedCharacters", "placeholder", "showIcon", "tabbable", "value", "readonly", "colorVariant", "disabled"], outputs: ["searchChange"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i2.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
603
|
+
}
|
|
604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterComponent, decorators: [{
|
|
605
|
+
type: Component,
|
|
606
|
+
args: [{ selector: 'si-date-range-filter', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
607
|
+
CdkOption,
|
|
608
|
+
CdkListbox,
|
|
609
|
+
DatePipe,
|
|
610
|
+
FormsModule,
|
|
611
|
+
NgTemplateOutlet,
|
|
612
|
+
PresetMatchFilterPipe,
|
|
613
|
+
SiCalendarButtonComponent,
|
|
614
|
+
SiDatepickerComponent,
|
|
615
|
+
SiDatepickerDirective,
|
|
616
|
+
SiRelativeDateComponent,
|
|
617
|
+
SiSearchBarComponent,
|
|
618
|
+
SiTranslateModule
|
|
619
|
+
], template: "@if (presetList()?.length) {\n <div class=\"preset-select border-end\">\n @if (presetSearch()) {\n <si-search-bar\n colorVariant=\"base-0\"\n class=\"mx-6 mt-5 mb-6\"\n [placeholder]=\"searchLabel() | translate\"\n [showIcon]=\"true\"\n [(ngModel)]=\"presetFilter\"\n />\n }\n <ul class=\"overflow-auto\" cdkListbox [attr.aria-label]=\"presetLabel() | translate\">\n @for (item of filteredPresetList(); track $index) {\n @if (item.label | translate | presetMatchFilter: presetFilter()) {\n <li\n class=\"preset-item focus-inside px-8 py-5\"\n [cdkOption]=\"item.label\"\n (click)=\"selectPresetItem(item)\"\n (keydown.enter)=\"selectPresetItem(item)\"\n >\n {{ item.label | translate }}\n </li>\n }\n }\n </ul>\n </div>\n}\n<form class=\"main-form d-flex flex-column flex-fill\">\n @if (advancedMode || inputMode()) {\n <div class=\"advanced-form px-6 py-4\">\n @if (!reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n\n <div class=\"mb-8\">\n @if (point2Mode === 'date') {\n <ng-container *ngTemplateOutlet=\"formPoint2Date\" />\n }\n @if (point2Mode === 'duration') {\n <ng-container *ngTemplateOutlet=\"formPoint2Duration\" />\n }\n </div>\n\n @if (reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n </div>\n } @else {\n <si-datepicker\n [config]=\"dateRangeConfig()\"\n [focusedDate]=\"dateRange.end ?? dateRange.start\"\n [(dateRange)]=\"dateRange\"\n (dateRangeChange)=\"updateFromDateRange()\"\n />\n }\n\n @if (advancedMode || !hideAdvancedMode()) {\n <label class=\"form-switch form-check ms-6\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"advancedMode\"\n role=\"switch\"\n [(ngModel)]=\"advancedMode\"\n (ngModelChange)=\"updateOnModeChange()\"\n />\n <span class=\"form-check-label\">{{ advancedLabel() | translate }}</span>\n </label>\n }\n\n <div class=\"mt-4 mb-6 ms-6\">\n {{ previewLabel() | translate }}:\n <span class=\"preview\">\n @if (calculatedRange().valid) {\n {{ calculatedRange().start | date: pipeFormat() }} -\n {{ calculatedRange().end | date: pipeFormat() }}\n } @else {\n ?\n }\n </span>\n </div>\n</form>\n\n@if (showApplyButton()) {\n <div class=\"footer border-top px-6 py-5 d-flex\">\n <button type=\"button\" class=\"btn btn-primary ms-auto\" (click)=\"applyClicked.emit()\">\n {{ applyLabel() | translate }}\n </button>\n </div>\n}\n\n<ng-template #formReferencePoint>\n <div class=\"mb-8\">\n <label class=\"d-block\">\n <span class=\"form-label\">{{\n (advancedMode ? refLabel() : reverseInputFields() ? toLabel() : fromLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point1\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [disabled]=\"point1Now\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point1date\"\n (ngModelChange)=\"point1Changed()\"\n />\n </si-calendar-button>\n </label>\n <label class=\"ms-4 mt-4 text-nowrap form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"point1now\"\n [(ngModel)]=\"point1Now\"\n (ngModelChange)=\"point1Changed()\"\n />\n <span class=\"form-check-label\">{{\n (enableTimeSelection() ? nowLabel() : todayLabel()) | translate\n }}</span>\n </label>\n </div>\n</ng-template>\n\n<ng-template #formPoint2Date>\n <label class=\"d-block mb-4 bp-9\">\n <span class=\"form-label\">{{\n (reverseInputFields() ? fromLabel() : toLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point2\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [attr.aria-label]=\"dateLabel() | translate\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point2date\"\n (ngModelChange)=\"point2Changed()\"\n />\n </si-calendar-button>\n </label>\n</ng-template>\n\n<ng-template #formPoint2Duration>\n <div>\n <span class=\"form-label\">{{ rangeLabel() | translate }}</span>\n <si-relative-date\n class=\"d-block mb-4\"\n [unitLabel]=\"unitLabel() | translate\"\n [valueLabel]=\"valueLabel() | translate\"\n [enableTimeSelection]=\"enableTimeSelection()\"\n [(value)]=\"point2offset\"\n (valueChange)=\"point2Changed()\"\n />\n <div class=\"range-type ms-4\">\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"before\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ beforeLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"after\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ afterLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"within\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ withinLabel() | translate }}\n </span>\n </label>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:inline-grid;background:var(--element-base-1);grid-template-areas:\"preset main\" \"footer footer\"}.main-form{inline-size:348px;grid-area:main}.advanced-form{block-size:392px}.preset-select{display:flex;inline-size:200px;flex-direction:column;grid-area:preset}ul{flex:1 1 0;padding-inline-start:0;list-style:none}.preset-item{cursor:pointer;line-height:1.143}.preset-item:hover{background:var(--element-base-1-hover)}label{display:inline-flex;align-items:center}.form-check-input{inset-block-start:0}.element-zoom{rotate:45deg}.footer{grid-area:footer}\n"] }]
|
|
620
|
+
}] });
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Copyright Siemens 2016 - 2025.
|
|
624
|
+
* SPDX-License-Identifier: MIT
|
|
625
|
+
*/
|
|
626
|
+
class SiDateRangeFilterModule {
|
|
627
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
628
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, imports: [SiDateRangeFilterComponent], exports: [SiDateRangeFilterComponent] });
|
|
629
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, imports: [SiDateRangeFilterComponent] });
|
|
630
|
+
}
|
|
631
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, decorators: [{
|
|
632
|
+
type: NgModule,
|
|
633
|
+
args: [{
|
|
634
|
+
imports: [SiDateRangeFilterComponent],
|
|
635
|
+
exports: [SiDateRangeFilterComponent]
|
|
636
|
+
}]
|
|
637
|
+
}] });
|
|
638
|
+
|
|
639
|
+
/**
|
|
640
|
+
* Copyright Siemens 2016 - 2025.
|
|
641
|
+
* SPDX-License-Identifier: MIT
|
|
642
|
+
*/
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Generated bundle index. Do not edit.
|
|
646
|
+
*/
|
|
647
|
+
|
|
648
|
+
export { ONE_DAY, ONE_MINUTE, PresetMatchFilterPipe, SiDateRangeCalculationService, SiDateRangeFilterComponent, SiDateRangeFilterModule };
|
|
649
|
+
//# sourceMappingURL=siemens-element-ng-date-range-filter.mjs.map
|