@sdcorejs/angular 19.1.6 → 19.2.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 +10 -0
- package/assets/scss/core/menu.scss +18 -0
- package/assets/scss/core/utilities/_misc.scss +15 -0
- package/assets/scss/sd-core.scss +1 -0
- package/components/anchor/src/components/anchor/anchor.component.d.ts +3 -1
- package/components/badge/src/badge.component.d.ts +1 -0
- package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +1 -1
- package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -1
- package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +3 -1
- package/components/form-generic/src/components/form-render/components/item/components/checkbox/checkbox.component.d.ts +34 -0
- package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +1 -0
- package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +6 -1
- package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
- package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
- package/components/form-generic/src/models/form-generic-component.model.d.ts +8 -8
- package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +5 -5
- package/components/form-generic/src/models/form-generic-expression.model.d.ts +12 -12
- package/components/form-generic/src/models/index.d.ts +1 -0
- package/components/form-generic/src/services/form-generic.service.d.ts +2 -2
- package/components/import-excel/src/import-excel.component.d.ts +1 -0
- package/components/index.d.ts +6 -1
- package/components/mini-editor/src/mini-editor.model.d.ts +1 -1
- package/components/modal/src/modal.component.d.ts +3 -2
- package/components/modal-resizable/src/modal-resizable.component.d.ts +92 -0
- package/components/modal-resizable/src/modal-resizable.registry.d.ts +22 -0
- package/components/org-chart/src/org-chart.component.d.ts +6 -0
- package/components/preview/src/preview-image/preview-image.component.d.ts +1 -0
- package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +6 -2
- package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +4 -1
- package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +8 -0
- package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +2 -0
- package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +2 -0
- package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +3 -3
- package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +9 -4
- package/components/query-bar/src/query-bar.component.d.ts +32 -5
- package/components/query-bar/src/query-bar.model.d.ts +15 -12
- package/components/query-builder/src/query-builder.component.d.ts +76 -39
- package/components/query-builder/src/query-builder.model.d.ts +59 -52
- package/components/query-builder/src/query-builder.serializer.d.ts +15 -6
- package/components/section/src/section.component.d.ts +3 -0
- package/components/side-drawer/src/body-scroll-lock.service.d.ts +10 -0
- package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +1 -0
- package/components/tab-router/index.d.ts +2 -1
- package/components/tab-router/src/actions/tab-router.action.d.ts +2 -2
- package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +2 -2
- package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +3 -3
- package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -3
- package/components/tab-router/src/decorators/tab.decorator.d.ts +13 -1
- package/components/tab-router/src/events/tab-router.event.d.ts +3 -3
- package/components/tab-router/src/models/tab-router.model.d.ts +2 -2
- package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
- package/components/tab-router/src/services/tab-router.service.d.ts +9 -9
- package/components/table/index.d.ts +1 -0
- package/components/table/src/components/config/config.component.d.ts +6 -1
- package/components/table/src/components/desktop-cell/view/view.component.d.ts +1 -0
- package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +1 -1
- package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +1 -1
- package/components/table/src/components/selector-action/action-filter.pipe.d.ts +8 -1
- package/components/table/src/components/selector-action/selector-action.component.d.ts +2 -0
- package/components/table/src/directives/index.d.ts +1 -0
- package/components/table/src/directives/sd-table-command-header-def.directive.d.ts +24 -0
- package/components/table/src/models/table-column.model.d.ts +30 -13
- package/components/table/src/models/table-item.model.d.ts +30 -1
- package/components/table/src/models/table-option-selector.model.d.ts +5 -4
- package/components/table/src/models/table-option.model.d.ts +12 -0
- package/components/table/src/pipes/sd-group.pipe.d.ts +6 -2
- package/components/table/src/services/table-filter/table-filter.model.d.ts +15 -15
- package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
- package/components/table/src/services/table-format/table-format.service.d.ts +1 -1
- package/components/table/src/services/table-selection/selection-action.util.d.ts +24 -0
- package/components/table/src/services/table-selection/table-selection.util.d.ts +31 -0
- package/components/table/src/services/tree/tree.util.d.ts +3 -2
- package/components/table/src/table.component.d.ts +51 -5
- package/components/tree/src/tree-item-def.directive.d.ts +1 -1
- package/components/tree/src/tree.component.d.ts +16 -4
- package/components/tree/src/tree.model.d.ts +31 -25
- package/components/upload-file/src/configurations/upload-file.configuration.d.ts +2 -2
- package/components/upload-file/src/upload-file.component.d.ts +4 -1
- package/configurations/src/sd-core.configuration.d.ts +1 -2
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +36 -12
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
- package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
- package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +27 -17
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
- package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +541 -254
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components.mjs +6 -1
- package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
- package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +231 -60
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +95 -23
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +130 -26
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +39 -15
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-models.mjs +227 -6
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +135 -37
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
- package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
- package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
- package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
- package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +490 -68
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
- package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
- package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
- package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +332 -111
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
- package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
- package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
- package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
- package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
- package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
- package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
- package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
- package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services.mjs +0 -1
- package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
- package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
- package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular.mjs +17 -10
- package/fesm2022/sdcorejs-angular.mjs.map +1 -1
- package/forms/autocomplete/src/autocomplete.component.d.ts +5 -2
- package/forms/chip-calendar/src/chip-calendar.component.d.ts +10 -0
- package/forms/date/src/date.component.d.ts +13 -2
- package/forms/date-range/src/date-range.component.d.ts +13 -2
- package/forms/datetime/src/datetime.component.d.ts +13 -2
- package/forms/entity-picker/src/entity-picker.component.d.ts +9 -3
- package/forms/input/src/input.component.d.ts +3 -0
- package/forms/input-color/src/input-color.component.d.ts +4 -0
- package/forms/input-number/src/input-number.component.d.ts +3 -0
- package/forms/models/index.d.ts +3 -0
- package/forms/models/src/sd-form-control-connector.d.ts +12 -0
- package/forms/models/src/sd-model-facing-control.d.ts +43 -0
- package/forms/models/src/sd-search.model.d.ts +1 -1
- package/forms/models/src/sd-selection-data.model.d.ts +1 -1
- package/forms/models/src/sd-temporal-transform.d.ts +31 -0
- package/forms/models/src/sd-timer-scope.d.ts +29 -0
- package/forms/select/src/select.component.d.ts +27 -4
- package/forms/src/forms.module.d.ts +22 -13
- package/forms/switch/src/switch.component.d.ts +5 -0
- package/forms/textarea/src/textarea.component.d.ts +5 -3
- package/forms/time-range/src/time-range.component.d.ts +22 -1
- package/forms/tree-select/src/tree-select.component.d.ts +36 -5
- package/i18n/src/en.d.ts +90 -10
- package/i18n/src/i18n.messages.d.ts +1 -1
- package/i18n/src/i18n.pipe.d.ts +3 -3
- package/i18n/src/i18n.service.d.ts +2 -1
- package/i18n/src/i18n.types.d.ts +0 -3
- package/interceptors/no-internet/no-internet.interceptor.d.ts +11 -1
- package/modules/auth/services/auth.model.d.ts +1 -1
- package/modules/keycloak/keycloak.service.d.ts +1 -0
- package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +2 -0
- package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +3 -3
- package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +3 -3
- package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +3 -3
- package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +3 -3
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +8 -3
- package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -3
- package/modules/layout/components/sidebar-v2/main.component.d.ts +3 -3
- package/modules/layout/components/sidebar-v3/main.component.d.ts +3 -3
- package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +5 -0
- package/modules/layout/modules/not-found/pages/root/root.component.d.ts +5 -0
- package/modules/layout/services/layout.service.d.ts +21 -0
- package/modules/layout/services/storage/storage.service.d.ts +52 -7
- package/modules/permission/src/configurations/permission.configuration.d.ts +11 -0
- package/modules/permission/src/directives/permission.directive.d.ts +2 -1
- package/modules/permission/src/services/permission.service.d.ts +52 -1
- package/package.json +40 -33
- package/pipes/src/safe-html.pipe.d.ts +26 -4
- package/pipes/src/time-different.pipe.d.ts +1 -0
- package/public-api.d.ts +11 -10
- package/services/api/src/api-host.d.ts +15 -0
- package/services/api/src/api.model.d.ts +14 -0
- package/services/api/src/api.module.d.ts +6 -0
- package/services/cache/src/cache.model.d.ts +10 -0
- package/services/index.d.ts +0 -1
- package/services/notify/index.d.ts +1 -1
- package/utilities/extensions/index.d.ts +1 -5
- package/utilities/extensions/src/url-safety.d.ts +72 -0
- package/utilities/extensions/src/utility.extension.d.ts +9 -5
- package/utilities/models/index.d.ts +0 -10
- package/components/base/index.d.ts +0 -1
- package/components/base/src/base-secure.component.d.ts +0 -8
- package/components/document-builder/index.d.ts +0 -4
- package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +0 -15
- package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +0 -4
- package/components/document-builder/src/components/index.d.ts +0 -1
- package/components/document-builder/src/document-builder.component.d.ts +0 -53
- package/components/document-builder/src/document-builder.config.d.ts +0 -21
- package/components/document-builder/src/document-builder.model.d.ts +0 -41
- package/components/document-builder/src/document-builder.utils.d.ts +0 -10
- package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +0 -9
- package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +0 -44
- package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +0 -57
- package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +0 -5
- package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +0 -4
- package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +0 -31
- package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +0 -5
- package/components/document-builder/src/plugins/index.d.ts +0 -11
- package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +0 -24
- package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +0 -14
- package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +0 -25
- package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +0 -29
- package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +0 -35
- package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +0 -15
- package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +0 -54
- package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +0 -27
- package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +0 -16
- package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +0 -25
- package/components/document-builder/src/plugins/paste-handler/index.d.ts +0 -35
- package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +0 -31
- package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +0 -31
- package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +0 -29
- package/components/document-builder/src/plugins/paste-handler/types.d.ts +0 -30
- package/components/document-builder/src/plugins/table-custom/index.d.ts +0 -34
- package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +0 -51
- package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +0 -9
- package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
- package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-models.mjs +0 -6
- package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
- package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
- package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
- package/models/index.d.ts +0 -1
- package/models/src/language.model.d.ts +0 -2
- package/services/docx/index.d.ts +0 -1
- package/services/docx/src/lib/docx.model.d.ts +0 -9
- package/services/docx/src/lib/docx.service.d.ts +0 -14
- package/services/docx/src/lib/pandoc-core.d.ts +0 -11
- package/services/docx/src/public-api.d.ts +0 -2
- package/services/license/index.d.ts +0 -1
- package/services/license/src/license.service.d.ts +0 -9
- package/utilities/extensions/src/array.extension.d.ts +0 -1
- package/utilities/extensions/src/color.extension.d.ts +0 -5
- package/utilities/extensions/src/date.extension.d.ts +0 -1
- package/utilities/extensions/src/number.extension.d.ts +0 -1
- package/utilities/extensions/src/string.extension.d.ts +0 -50
- package/utilities/models/src/color.model.d.ts +0 -4
- package/utilities/models/src/empty.model.d.ts +0 -4
- package/utilities/models/src/filter.model.d.ts +0 -12
- package/utilities/models/src/maybe-async.model.d.ts +0 -10
- package/utilities/models/src/nested-key-of.model.d.ts +0 -4
- package/utilities/models/src/operator.model.d.ts +0 -13
- package/utilities/models/src/order.model.d.ts +0 -4
- package/utilities/models/src/paging.model.d.ts +0 -8
- package/utilities/models/src/pattern.model.d.ts +0 -21
- package/utilities/models/src/size.model.d.ts +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-forms-datetime.mjs","sources":["../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.html","../../../projects/sdcorejs-angular/forms/datetime/sdcorejs-angular-forms-datetime.ts"],"sourcesContent":["import { Platform } from '@angular/cdk/platform';\nimport { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n input,\n model,\n computed,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { isValid as isValidDate, parse as parseDate } from 'date-fns';\nimport { Subscription } from 'rxjs';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport {\n SD_DATE_FORMATS,\n SD_NATIVE_DATE_FORMATS,\n SdDateAdapter,\n SdDatetimePicker as SdMaterialDatetimePicker,\n SdDatetimePickerActions,\n SdDatetimePickerApply,\n SdDatetimePickerCancel,\n SdDatetimePickerNow,\n SdNativeDateAdapter,\n} from '@sdcorejs/angular-material-datetime';\n\ntype SdDatetimeModelValue = string | number | Date | undefined | null;\n\n/**\n * Thử parse `value` theo lần lượt nhiều format; trả về Date đầu tiên hợp lệ.\n * date-fns không hỗ trợ multi-format parse như moment(value, [fmt1, fmt2], true).\n */\nfunction parseFirstValid(value: string, formats: string[]): Date | null {\n for (const fmt of formats) {\n const d = parseDate(value, fmt, new Date());\n if (isValidDate(d)) return d;\n }\n return null;\n}\n\nfunction datetimeModelToControl(value: SdDatetimeModelValue, showSeconds: boolean): string | null {\n if (!DateUtilities.isDate(value)) return null;\n const normalized = DateUtilities.toFormat(value, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm');\n if (!normalized) return null;\n return DateUtilities.toFormat(normalized, showSeconds ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm') || null;\n}\n\nfunction datetimeControlToStored(value: string | null, showSeconds: boolean): string | null {\n if (!value) return null;\n const parsed = parseFirstValid(value, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n if (!parsed) return null;\n return DateUtilities.toFormat(parsed, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00') || null;\n}\n\nfunction normalizeDatetimeModel(value: SdDatetimeModelValue, showSeconds: boolean): string | null {\n if (!DateUtilities.isDate(value)) return null;\n return DateUtilities.toFormat(value, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00') || null;\n}\n\n@Component({\n selector: 'sd-datetime',\n templateUrl: './datetime.component.html',\n styleUrl: './datetime.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' },\n providers: [\n Platform,\n SdNativeDateAdapter,\n { provide: MAT_DATE_LOCALE, useValue: 'en-US' },\n { provide: DateAdapter, useExisting: SdNativeDateAdapter },\n { provide: SdDateAdapter, useExisting: SdNativeDateAdapter },\n { provide: MAT_DATE_FORMATS, useValue: SD_NATIVE_DATE_FORMATS },\n { provide: SD_DATE_FORMATS, useValue: SD_NATIVE_DATE_FORMATS },\n ],\n standalone: true,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatButtonModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n SdLabel,\n SdView,\n TranslatePipe,\n SdMaterialDatetimePicker,\n SdDatetimePickerActions,\n SdDatetimePickerApply,\n SdDatetimePickerCancel,\n SdDatetimePickerNow,\n ],\n})\nexport class SdDatetime implements OnDestroy, OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n private readonly dateTimePicker = viewChild<SdMaterialDatetimePicker<Date>>(SdMaterialDatetimePicker);\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-datetime-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (datetime overlay). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** Hiển thị thêm cột giây trong picker. Mặc định: chỉ HH:MM. */\n showSeconds = input(false, { transform: booleanAttribute });\n\n /** Whether to show the value-gated clear button in edit and inline modes. */\n clearable = input(false, { transform: booleanAttribute });\n\n // Tri-state `viewed` — shared primitive. In `'inline'` the datetime editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the overlay on click.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.open(), this.disabled);\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no editor). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Open the datetime overlay from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.datetime.required');\n if (errors['matDatepickerMin']) {\n const d = this.resolvedMin();\n return this.#i18n.t('core.form.datetime.min-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatepickerMax']) {\n const d = this.resolvedMax();\n return this.#i18n.t('core.form.datetime.max-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['date']) return errors['date'] as string;\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Min/max — chấp nhận 'TODAY', Date, hoặc string ISO\n minInput = input<any>(undefined, { alias: 'min' });\n minDateInput = input<any>(undefined, { alias: 'minDate' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput() ?? this.minDateInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n maxDateInput = input<any>(undefined, { alias: 'maxDate' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput() ?? this.maxDateInput()));\n\n valueModel = model<SdDatetimeModelValue>(undefined, { alias: 'model' });\n\n // viewed-mode: formControl.value là chuỗi display (dd/MM/yyyy HH:mm) nên DatePipe không parse được.\n // Lấy thẳng từ valueModel (nguồn dữ liệu thật) rồi convert sang Date cho DatePipe.\n viewedDate = computed<Date | null>(() => {\n const v = this.valueModel();\n if (v == null || !DateUtilities.isDate(v)) return null;\n const iso = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!iso) return null;\n const d = parseDate(iso, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(d) ? d : null;\n });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n\n // ==========================================\n // 5. INTERNAL STATE\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new SdFormControl();\n readonly #formConnector = ɵsdFormControlConnector<SdDatetimeModelValue, string | null>({\n form: this.form,\n name: this.name,\n control: computed<AbstractControl<string | null>>(() => this.formControl),\n model: this.valueModel,\n writeModel: value => {\n this.valueModel.set(value);\n this.sdChange.emit(value);\n },\n modelToControl: value => datetimeModelToControl(value, this.showSeconds()),\n controlToModel: value => (value ? (datetimeControlToStored(value, this.showSeconds()) ?? this.valueModel()) : null),\n modelEquals: (left, right) => normalizeDatetimeModel(left, this.showSeconds()) === normalizeDatetimeModel(right, this.showSeconds()),\n validators: computed(() => (this.inlineError() ? SdInlineErrorValidator : null)),\n required: this.required,\n disabled: this.disabled,\n viewed: this.viewed,\n validationError: computed(() => this.errorMessage()),\n });\n isFocused = false;\n isValid?: boolean;\n\n /** State popup — true khi picker package đang mở. */\n pickerOpened = computed(() => this.dateTimePicker()?.opened() ?? false);\n\n #subscription = new Subscription();\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n // ==========================================\n // 6. POPUP MANAGEMENT — package-backed Material datetime picker\n // ==========================================\n\n /** Mở popup chọn datetime, neo vào input. */\n open() {\n if (this.formControl.disabled || this.pickerOpened()) return;\n const picker = this.dateTimePicker();\n if (!picker) return;\n picker.setAnchor(this.inputRef()?.nativeElement ?? (this.elementRef.nativeElement as HTMLElement));\n // why: open() rebuilds the draft from committed state, so seed that state before opening.\n picker.setValue(this.#currentValueAsDate() ?? new Date());\n picker.open();\n this.ref.markForCheck();\n }\n\n /** Đóng popup (public — gọi từ template nếu cần). */\n close() {\n this.dateTimePicker()?.close();\n }\n\n onPickerConfirm(value: Date) {\n const display = DateUtilities.toFormat(value, this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm') || null;\n if (this.formControl.value !== display) {\n this.formControl.setValue(display);\n }\n }\n\n /** Lấy giá trị hiện tại dưới dạng native Date để truyền vào popup. */\n #currentValueAsDate(): Date | null {\n const v = this.valueModel();\n if (!v || !DateUtilities.isDate(v)) return null;\n const fmtted = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!fmtted) return null;\n const parsed = parseDate(fmtted, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(parsed) ? parsed : null;\n }\n\n // ==========================================\n // 7. PARSE/VALIDATE HELPERS\n // ==========================================\n #parseDateBoundary(val: any): Date | null {\n if (val === 'TODAY') return new Date();\n if (val && DateUtilities.isDate(val)) return new Date(val);\n return null;\n }\n\n // ==========================================\n // 8. INPUT EVENT HANDLERS\n // ==========================================\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n };\n\n onBlur = () => {\n this.isFocused = false;\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.inputRef()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.inputRef()?.nativeElement?.focus();\n this.open();\n }, 100);\n };\n\n focusInputElement() {\n this.inputRef()?.nativeElement?.focus();\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n const key = event.keyCode || event.charCode;\n const isShift = key === 16;\n\n if (event.ctrlKey && (key === 67 || key === 86)) return true;\n\n if (\n ((key >= 48 && key <= 57) ||\n key === 8 ||\n key <= 37 ||\n key <= 39 ||\n (key >= 96 && key <= 105) ||\n key === 191 ||\n key === 186 ||\n key === 59) &&\n !isShift\n ) {\n return true;\n }\n return false;\n };\n\n /**\n * Khi user gõ trực tiếp vào input và rời focus → validate format dd/MM/yyyy HH:mm\n * Hỗ trợ cả format có giây.\n */\n onConfirmInput = (event: any) => {\n const currentVal: string = event.target.value;\n const formControl: AbstractControl = this.formControl;\n const regexToMinutes = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]$/g;\n const regexToSecond = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]:[0-6][0-9]$/g;\n\n if (currentVal && !(regexToMinutes.test(currentVal) || regexToSecond.test(currentVal))) {\n setTimeout(() => {\n formControl.markAsDirty();\n formControl.markAsTouched();\n formControl.setErrors({ ...formControl.errors, date: this.#i18n.t('core.form.datetime.invalid-format') });\n }, 0);\n return;\n }\n\n setTimeout(() => {\n formControl.setErrors({ ...formControl.errors, date: null });\n this.formControl.updateValueAndValidity();\n }, 0);\n\n // Đồng bộ qua canonical control; connector sở hữu conversion và model/output timing.\n if (currentVal) {\n const parsed = parseFirstValid(currentVal, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n if (parsed) {\n const display = DateUtilities.toFormat(parsed, this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm');\n if (this.formControl.value !== display) {\n this.formControl.setValue(display);\n }\n }\n } else if (this.valueModel()) {\n this.formControl.setValue(null);\n }\n };\n\n clear = ($event: any) => {\n $event?.stopPropagation();\n if (this.formControl.value) {\n this.formControl.setValue(null);\n }\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!formControl.value;\n\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n\n@let _viewedDate = viewedDate();\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; datetime editor render ẩn (.sd-inline-editor) chỉ để mở overlay. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n class=\"c-form-field-datetime-input\"\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance || 'outline'\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n [id]=\"id\"\n (blur)=\"onConfirmInput($event)\"\n (keyup.enter)=\"onConfirmInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [formControl]=\"formControl\"\n [required]=\"_required\"\n [placeholder]=\"placeholder() || _label || ''\"\n [min]=\"_resolvedMin\"\n [max]=\"_resolvedMax\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n #input\n matInput />\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (clearable() && formControl.value && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n\n <span class=\"cursor-pointer sd-suffix-icon\" (click)=\"!formControl.disabled && open()\" matSuffix\n ><svg fill=\"currentColor\" viewBox=\"0 0 24 24\" fill=\"currentColor\" focusable=\"false\">\n <path\n d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\"></path></svg\n ></span>\n </mat-form-field>\n\n <sd-datetime-picker\n [showSeconds]=\"showSeconds()\"\n [disabled]=\"formControl.disabled\"\n [minDate]=\"_resolvedMin\"\n [maxDate]=\"_resolvedMax\"\n [startAt]=\"_viewedDate\"\n (applied)=\"onPickerConfirm($event)\">\n <sd-datetime-picker-actions>\n <button mat-button type=\"button\" sdDatetimePickerNow>\n <sd-icon name=\"schedule\"></sd-icon>\n <span>{{ 'core.form.datetime.now' | translate }}</span>\n </button>\n <button mat-button type=\"button\" sdDatetimePickerCancel>{{ 'core.common.cancel' | translate }}</button>\n <button mat-flat-button type=\"button\" sdDatetimePickerApply>{{ 'core.form.datetime.confirm' | translate }}</button>\n </sd-datetime-picker-actions>\n </sd-datetime-picker>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["parseDate","isValidDate","SdMaterialDatetimePicker","ɵsdFormControlConnector"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-forms-datetime.mjs","sources":["../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.html","../../../projects/sdcorejs-angular/forms/datetime/sdcorejs-angular-forms-datetime.ts"],"sourcesContent":["import { Platform } from '@angular/cdk/platform';\nimport { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n input,\n model,\n computed,\n OnDestroy,\n OnInit,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n contentChild,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n sdFormControlState,\n SdTemporalValueTransform,\n SdViewed,\n SdViewedInput,\n sdParseTransformedTemporal,\n sdSerializeTemporalValue,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n ɵsdModelFacingControl,\n ɵsdTimerScope,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { isValid as isValidDate, parse as parseDate } from 'date-fns';\nimport { Subscription } from 'rxjs';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport {\n SD_DATE_FORMATS,\n SD_NATIVE_DATE_FORMATS,\n SdDateAdapter,\n SdDatetimePicker as SdMaterialDatetimePicker,\n SdDatetimePickerActions,\n SdDatetimePickerApply,\n SdDatetimePickerCancel,\n SdDatetimePickerNow,\n SdNativeDateAdapter,\n} from '@sdcorejs/angular-material-datetime';\n\ntype SdDatetimeModelValue = string | number | Date | undefined | null;\n\n/**\n * Thử parse `value` theo lần lượt nhiều format; trả về Date đầu tiên hợp lệ.\n * date-fns không hỗ trợ multi-format parse như moment(value, [fmt1, fmt2], true).\n */\nfunction parseFirstValid(value: string, formats: string[]): Date | null {\n for (const fmt of formats) {\n const d = parseDate(value, fmt, new Date());\n if (isValidDate(d)) return d;\n }\n return null;\n}\n\n/**\n * why: `DateUtilities.isDate` nhận Date, timestamp, canonical `yyyy/MM/dd HH:mm[:ss]` và ISO, nhưng\n * KHÔNG nhận chuỗi RFC-1123 của `toUTCString()`. Không có nhánh dự phòng này thì\n * `<sd-datetime transform=\"UTCString\">` không đọc lại được chính output của nó.\n */\nfunction coerceDatetimeSource(value: SdDatetimeModelValue): SdDatetimeModelValue {\n if (DateUtilities.isDate(value)) return value;\n return sdParseTransformedTemporal(value) ?? value;\n}\n\nfunction datetimeModelToControl(value: SdDatetimeModelValue, showSeconds: boolean): string | null {\n const source = coerceDatetimeSource(value);\n if (!DateUtilities.isDate(source)) return null;\n const normalized = DateUtilities.toFormat(source, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm');\n if (!normalized) return null;\n return DateUtilities.toFormat(normalized, showSeconds ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm') || null;\n}\n\nfunction datetimeControlToStored(value: string | null, showSeconds: boolean): string | null {\n if (!value) return null;\n const parsed = parseFirstValid(value, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n if (!parsed) return null;\n return DateUtilities.toFormat(parsed, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00') || null;\n}\n\nfunction normalizeDatetimeModel(value: SdDatetimeModelValue, showSeconds: boolean): string | null {\n const source = coerceDatetimeSource(value);\n if (!DateUtilities.isDate(source)) return null;\n return DateUtilities.toFormat(source, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00') || null;\n}\n\n/** Parses the committed display string back to the local instant it denotes. */\nfunction datetimeControlToDate(value: string | null): Date | null {\n if (!value) return null;\n return parseFirstValid(value, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n}\n\n@Component({\n selector: 'sd-datetime',\n templateUrl: './datetime.component.html',\n styleUrl: './datetime.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' },\n providers: [\n Platform,\n SdNativeDateAdapter,\n { provide: MAT_DATE_LOCALE, useValue: 'en-US' },\n { provide: DateAdapter, useExisting: SdNativeDateAdapter },\n { provide: SdDateAdapter, useExisting: SdNativeDateAdapter },\n { provide: MAT_DATE_FORMATS, useValue: SD_NATIVE_DATE_FORMATS },\n { provide: SD_DATE_FORMATS, useValue: SD_NATIVE_DATE_FORMATS },\n ],\n standalone: true,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatButtonModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n SdLabel,\n SdView,\n SdTranslatePipe,\n SdMaterialDatetimePicker,\n SdDatetimePickerActions,\n SdDatetimePickerApply,\n SdDatetimePickerCancel,\n SdDatetimePickerNow,\n ],\n})\nexport class SdDatetime implements OnDestroy, OnInit {\n id = `I${Utilities.generateUuid()}`;\n /** why: id ổn định của <mat-error> để control trỏ `aria-describedby` sang — thông báo lỗi\n * phải đọc được từ chính control, không chỉ hiện ra màn hình. */\n readonly errorId = `${this.id}-error`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n private readonly dateTimePicker = viewChild<SdMaterialDatetimePicker<Date>>(SdMaterialDatetimePicker);\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n // why: focus + mở picker hoãn 100ms; handle phải bị clear khi destroy, nếu không open()\n // dựng overlay mồ côi trên view đã tháo.\n readonly #timers = ɵsdTimerScope();\n\n // ==========================================\n // 3. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-datetime-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (datetime overlay). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** Hiển thị thêm cột giây trong picker. Mặc định: chỉ HH:MM. */\n showSeconds = input(false, { transform: booleanAttribute });\n\n /** Whether to show the value-gated clear button in edit and inline modes. */\n clearable = input(false, { transform: booleanAttribute });\n\n // Tri-state `viewed` — shared primitive. In `'inline'` the datetime editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the overlay on click.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.open(), this.disabled);\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no editor). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Open the datetime overlay from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.datetime.required');\n if (errors['matDatepickerMin']) {\n const d = this.resolvedMin();\n return this.#i18n.t('core.form.datetime.min-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatepickerMax']) {\n const d = this.resolvedMax();\n return this.#i18n.t('core.form.datetime.max-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['date']) return errors['date'] as string;\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Min/max — chấp nhận 'TODAY', Date, hoặc string ISO\n minInput = input<any>(undefined, { alias: 'min' });\n minDateInput = input<any>(undefined, { alias: 'minDate' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput() ?? this.minDateInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n maxDateInput = input<any>(undefined, { alias: 'maxDate' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput() ?? this.maxDateInput()));\n\n /**\n * Output serialization strategy for the committed value. Affects `model` / `modelChange` /\n * `sdChange` and the registered form field only — the field keeps displaying\n * `dd/MM/yyyy HH:mm[:ss]` per `showSeconds`. Left unset, the canonical string is emitted.\n */\n transform = input<SdTemporalValueTransform | undefined>();\n\n valueModel = model<SdDatetimeModelValue>(undefined, { alias: 'model' });\n\n // viewed-mode: formControl.value là chuỗi display (dd/MM/yyyy HH:mm) nên DatePipe không parse được.\n // Lấy thẳng từ valueModel (nguồn dữ liệu thật) rồi convert sang Date cho DatePipe.\n viewedDate = computed<Date | null>(() => {\n const v = this.valueModel();\n if (v == null || !DateUtilities.isDate(v)) return null;\n const iso = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!iso) return null;\n const d = parseDate(iso, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(d) ? d : null;\n });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n\n // ==========================================\n // 5. INTERNAL STATE\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new SdFormControl();\n\n /** `true` khi text vừa nhập không phải datetime dd/MM/yyyy HH:mm(:ss) hợp lệ. */\n readonly #invalidFormat = signal(false);\n\n /**\n * why: lỗi format PHẢI đi qua pipeline validator. Trước đây nó bị nhét thẳng vào control bằng\n * `setErrors()` — tức là nằm NGOÀI pipeline — nên bất kỳ `updateValueAndValidity` nào chạy sau\n * (effect validators của connector, hay chính `setValue`) đều xoá sạch lỗi mà không ai hay biết.\n * Nhánh xoá lỗi cũ còn sai thêm một lần nữa: `setErrors({ ...errors, date: null })` để lại một\n * object errors KHÔNG rỗng, mà `AbstractControl._calculateStatus()` coi mọi object errors non-null\n * là INVALID → một datetime hoàn toàn hợp lệ vẫn bị đánh dấu invalid (và phát `statusChanges`\n * INVALID ra cho form cha) cho tới khi `updateValueAndValidity` kế tiếp che đi. Trả `null` từ\n * validator thì key `date` biến mất hẳn, không còn `date: null` treo lại.\n * Validator giữ identity ổn định (connector chỉ gắn 1 lần) và đọc cờ qua `untracked` để không\n * tự biến mình thành dependency reactive khi bị gọi trong effect/computed.\n */\n readonly #datetimeFormatValidator: ValidatorFn = () =>\n untracked(() => (this.#invalidFormat() ? { date: this.#i18n.t('core.form.datetime.invalid-format') } : null));\n\n readonly #validators = computed<readonly ValidatorFn[]>(() =>\n this.inlineError() ? [this.#datetimeFormatValidator, SdInlineErrorValidator] : [this.#datetimeFormatValidator]\n );\n\n /**\n * why: control gắn vào editor nên nó giữ CHUỖI HIỂN THỊ `dd/MM/yyyy HH:mm[:ss]` — không phải model.\n * Có `transform` thì consumer được hứa `form.get(name).value` bằng `model`, nên form phải nhận\n * control này. Không có transform thì `registered` trả null và form vẫn nhận control của editor.\n */\n readonly #modelFacing = ɵsdModelFacingControl<SdDatetimeModelValue>({\n active: computed(() => !!this.transform()),\n model: this.valueModel,\n writeModel: value => {\n this.valueModel.set(value);\n this.sdChange.emit(value);\n },\n source: computed<AbstractControl>(() => this.formControl),\n modelEquals: (left, right) => this.#modelsEqual(left, right),\n });\n /** Control registered in the parent form while a `transform` is active; holds the public model. */\n readonly modelControl = this.#modelFacing.control;\n\n /**\n * Serializes a committed datetime, applying the precision `showSeconds` already governs: seconds\n * are kept only when they are shown, and milliseconds are always dropped.\n */\n #serializeCommitted(display: string | null): SdDatetimeModelValue {\n const parsed = datetimeControlToDate(display);\n const transform = this.transform();\n if (!parsed || !transform) return display ? (datetimeControlToStored(display, this.showSeconds()) ?? this.valueModel()) : null;\n\n const seconds = this.showSeconds() ? parsed.getSeconds() : 0;\n const normalized = new Date(\n parsed.getFullYear(),\n parsed.getMonth(),\n parsed.getDate(),\n parsed.getHours(),\n parsed.getMinutes(),\n seconds,\n 0\n );\n return sdSerializeTemporalValue(normalized, transform) ?? this.valueModel();\n }\n\n /**\n * why: `normalizeDatetimeModel` gộp về canonical string, nên hai chuỗi transform khác nhau của\n * cùng một thời điểm so ra bằng nhau và `writeModel` bị bỏ qua — đổi `transform` lúc runtime rồi\n * commit lại sẽ không phát ra chuỗi mới. Khi có transform thì so nguyên văn.\n */\n #modelsEqual(left: SdDatetimeModelValue, right: SdDatetimeModelValue): boolean {\n if (this.transform()) return Object.is(left, right);\n return normalizeDatetimeModel(left, this.showSeconds()) === normalizeDatetimeModel(right, this.showSeconds());\n }\n\n readonly #formConnector = ɵsdFormControlConnector<SdDatetimeModelValue, string | null>({\n form: this.form,\n name: this.name,\n control: computed<AbstractControl<string | null>>(() => this.formControl),\n registeredControl: this.#modelFacing.registered,\n model: this.valueModel,\n writeModel: value => {\n this.valueModel.set(value);\n this.sdChange.emit(value);\n },\n modelToControl: value => datetimeModelToControl(value, this.showSeconds()),\n controlToModel: value => this.#serializeCommitted(value),\n modelEquals: (left, right) => this.#modelsEqual(left, right),\n validators: this.#validators,\n required: this.required,\n disabled: this.disabled,\n viewed: this.viewed,\n validationError: computed(() => this.errorMessage()),\n });\n isFocused = false;\n isValid?: boolean;\n\n /** State popup — true khi picker package đang mở. */\n pickerOpened = computed(() => this.dateTimePicker()?.opened() ?? false);\n\n #subscription = new Subscription();\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n // ==========================================\n // 6. POPUP MANAGEMENT — package-backed Material datetime picker\n // ==========================================\n\n /** Mở popup chọn datetime, neo vào input. */\n open() {\n if (this.formControl.disabled || this.pickerOpened()) return;\n const picker = this.dateTimePicker();\n if (!picker) return;\n picker.setAnchor(this.inputRef()?.nativeElement ?? (this.elementRef.nativeElement as HTMLElement));\n // why: open() rebuilds the draft from committed state, so seed that state before opening.\n picker.setValue(this.#currentValueAsDate() ?? new Date());\n picker.open();\n this.ref.markForCheck();\n }\n\n /** Đóng popup (public — gọi từ template nếu cần). */\n close() {\n this.dateTimePicker()?.close();\n }\n\n onPickerConfirm(value: Date) {\n // why: chọn được datetime từ picker nghĩa là text sai định dạng đã bị thay thế — cờ phải tắt.\n // Cờ chỉ được reset trong `onConfirmInput`, nên trước đây gõ bậy rồi chọn từ lịch để lại lỗi\n // `date` VĨNH VIỄN: control invalid + hiện \"Sai định dạng\" trên một giá trị hoàn toàn hợp lệ.\n // Đây là regression MỚI của việc đưa lỗi vào pipeline validator — bản `setErrors` cũ tình cờ\n // bị `updateValueAndValidity` kế tiếp xoá hộ.\n this.#setDatetimeError(false);\n const display = DateUtilities.toFormat(value, this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm') || null;\n if (this.formControl.value !== display) {\n this.formControl.setValue(display);\n }\n }\n\n /** Lấy giá trị hiện tại dưới dạng native Date để truyền vào popup. */\n #currentValueAsDate(): Date | null {\n const v = this.valueModel();\n if (!v || !DateUtilities.isDate(v)) return null;\n const fmtted = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!fmtted) return null;\n const parsed = parseDate(fmtted, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(parsed) ? parsed : null;\n }\n\n // ==========================================\n // 7. PARSE/VALIDATE HELPERS\n // ==========================================\n #parseDateBoundary(val: any): Date | null {\n if (val === 'TODAY') return new Date();\n if (val && DateUtilities.isDate(val)) return new Date(val);\n return null;\n }\n\n // ==========================================\n // 8. INPUT EVENT HANDLERS\n // ==========================================\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n };\n\n onBlur = () => {\n this.isFocused = false;\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.inputRef()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n // why: vẫn 100ms như cũ — chỉ scope handle theo DestroyRef.\n this.#timers.schedule(() => {\n this.inputRef()?.nativeElement?.focus();\n this.open();\n }, 100);\n };\n\n focusInputElement() {\n this.inputRef()?.nativeElement?.focus();\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n const key = event.keyCode || event.charCode;\n const isShift = key === 16;\n\n if (event.ctrlKey && (key === 67 || key === 86)) return true;\n\n if (\n ((key >= 48 && key <= 57) ||\n key === 8 ||\n key <= 37 ||\n key <= 39 ||\n (key >= 96 && key <= 105) ||\n key === 191 ||\n key === 186 ||\n key === 59) &&\n !isShift\n ) {\n return true;\n }\n return false;\n };\n\n /**\n * Khi user gõ trực tiếp vào input và rời focus → validate format dd/MM/yyyy HH:mm\n * Hỗ trợ cả format có giây.\n */\n onConfirmInput = (event: any) => {\n const currentVal: string = event.target.value;\n const formControl: AbstractControl = this.formControl;\n const regexToMinutes = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]$/g;\n const regexToSecond = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]:[0-6][0-9]$/g;\n\n if (currentVal && !(regexToMinutes.test(currentVal) || regexToSecond.test(currentVal))) {\n formControl.markAsDirty();\n formControl.markAsTouched();\n this.#setDatetimeError(true);\n return;\n }\n\n this.#setDatetimeError(false);\n\n // Đồng bộ qua canonical control; connector sở hữu conversion và model/output timing.\n if (currentVal) {\n const parsed = parseFirstValid(currentVal, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n if (parsed) {\n const display = DateUtilities.toFormat(parsed, this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm');\n if (this.formControl.value !== display) {\n this.formControl.setValue(display);\n }\n }\n } else if (this.valueModel()) {\n this.formControl.setValue(null);\n }\n };\n\n /**\n * Bật/tắt cờ format rồi chạy lại pipeline NGAY.\n * why: chạy lại đồng bộ để lỗi xuất hiện/biến mất đúng nhịp nhập, đồng thời phát `events` cho\n * `sdFormControlState` tick — connector gắn validator bằng `emitEvent: false` nên không tick hộ.\n * Early-return khi cờ không đổi để một datetime hợp lệ không bị phát thừa một vòng status.\n */\n #setDatetimeError(invalid: boolean): void {\n if (this.#invalidFormat() === invalid) return;\n this.#invalidFormat.set(invalid);\n this.formControl.updateValueAndValidity();\n }\n\n clear = ($event: any) => {\n $event?.stopPropagation();\n // why: phải tắt cờ TRƯỚC và NGOÀI nhánh `if` — sau khi gõ text sai, `onConfirmInput` return sớm\n // nên `formControl.value` vẫn là null; nhánh `if` không chạy và lỗi `date` sẽ treo lại trên một\n // field vừa được xoá trắng.\n this.#setDatetimeError(false);\n if (this.formControl.value) {\n this.formControl.setValue(null);\n }\n };\n}\n","@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _errorMessage = errorMessage();\r\n@let _helperText = helperText();\r\n@let _required = required();\r\n@let _isInline = isInline();\r\n@let _bare = _isInline;\r\n@let _hasValue = !!formControl.value;\r\n<!-- why: một cổng gate duy nhất cho <mat-error>, aria-invalid và aria-describedby — message\r\n hiện mà control không báo invalid thì screen reader không biết ô đang lỗi. -->\r\n@let _errorVisible = !!_errorMessage && formControl.touched;\r\n@let _showInlineError = !_hideInlineError && _errorVisible;\r\n\r\n@let _resolvedMin = resolvedMin();\r\n@let _resolvedMax = resolvedMax();\r\n\r\n@let _viewedDate = viewedDate();\r\n@if (isViewed()) {\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"_viewedDate\"\r\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n} @else {\r\n @if (_isInline) {\r\n <!-- why: inline — sd-view là \"mặt\" + trigger; datetime editor render ẩn (.sd-inline-editor) chỉ để mở overlay. -->\r\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"_viewedDate\"\r\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\r\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n }\r\n </span>\r\n }\r\n @if (!_appearance) {\r\n <ng-content select=\"[sdLabel]\">\r\n @if (_label) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n </ng-content>\r\n }\r\n\r\n <!-- why: div chỉ là hộp layout. aria-hidden=\"true\" cũ ẩn CẢ cây con — label, <input>,\r\n <mat-error>, nút clear, nút mở picker — khỏi accessibility tree. role=\"presentation\" chỉ\r\n vô hiệu hoá chính div, KHÔNG lan xuống con; (click) là tiện ích chuột mà bàn phím đã có\r\n qua Tab vào <input>. -->\r\n <div\r\n class=\"d-flex align-items-center\"\r\n role=\"presentation\"\r\n [class.sd-inline-editor]=\"_isInline\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\">\r\n <mat-form-field\r\n class=\"c-form-field-datetime-input\"\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [appearance]=\"_appearance || 'outline'\"\r\n [floatLabel]=\"floatLabel()\">\r\n @if (_appearance && _label) {\r\n <mat-label class=\"sd-form-field-label\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\r\n }\r\n </mat-label>\r\n }\r\n\r\n <!-- why: BỎ aria-hidden trên chính <input> — ô vẫn Tab tới được, aria-hidden chỉ khiến\r\n screen reader đọc ra khoảng lặng. -->\r\n <input\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-invalid]=\"dataInvalid()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\"\r\n [attr.data-required]=\"dataRequired()\"\r\n [attr.data-error-message]=\"dataErrorMessage()\"\r\n [id]=\"id\"\r\n (blur)=\"onConfirmInput($event)\"\r\n (keyup.enter)=\"onConfirmInput($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [autocomplete]=\"id\"\r\n autocorrect=\"off\"\r\n [formControl]=\"formControl\"\r\n [required]=\"_required\"\r\n [placeholder]=\"placeholder() || _label || ''\"\r\n [min]=\"_resolvedMin\"\r\n [max]=\"_resolvedMax\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [attr.aria-invalid]=\"_errorVisible ? 'true' : null\"\r\n [attr.aria-describedby]=\"_errorMessage ? errorId : null\"\r\n #input\r\n matInput />\r\n\r\n @if (_hideInlineError && _errorVisible) {\r\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\r\n @if (_hideInlineError && _errorVisible) {\r\n <span class=\"sd-visually-hidden\" [id]=\"errorId\" matSuffix>{{ _errorMessage }}</span>\r\r\n }\r\n\r\n @if (_showInlineError) {\r\n <mat-error [id]=\"errorId\">{{ _errorMessage }}</mat-error>\r\n }\r\n\r\n @if (clearable() && formControl.value && !_required && !formControl.disabled && !_bare) {\r\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n }\r\n\r\n <!-- why: <span (click)> không Tab tới được và không có tên; trước đây nó \"hợp lệ\" chỉ vì\r\n cả cụm bị aria-hidden nên lint bỏ qua. <button type=\"button\"> có sẵn Enter/Space +\r\n `disabled` thật; SVG để aria-hidden vì nó chỉ lặp lại nhãn của nút. -->\r\n <button\r\n type=\"button\"\r\n matSuffix\r\n class=\"cursor-pointer sd-suffix-icon sd-suffix-btn\"\r\n [disabled]=\"formControl.disabled\"\r\n [attr.aria-label]=\"'core.form.datetime.open-picker' | sdTranslate\"\r\n (click)=\"open()\">\r\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" focusable=\"false\">\r\n <path\r\n d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\"></path>\r\n </svg>\r\n </button>\r\n </mat-form-field>\r\n\r\n <sd-datetime-picker\r\n [showSeconds]=\"showSeconds()\"\r\n [disabled]=\"formControl.disabled\"\r\n [minDate]=\"_resolvedMin\"\r\n [maxDate]=\"_resolvedMax\"\r\n [startAt]=\"_viewedDate\"\r\n (applied)=\"onPickerConfirm($event)\">\r\n <sd-datetime-picker-actions>\r\n <button mat-button type=\"button\" sdDatetimePickerNow>\r\n <sd-icon name=\"schedule\"></sd-icon>\r\n <span>{{ 'core.form.datetime.now' | sdTranslate }}</span>\r\n </button>\r\n <button mat-button type=\"button\" sdDatetimePickerCancel>{{ 'core.common.cancel' | sdTranslate }}</button>\r\n <button mat-flat-button type=\"button\" sdDatetimePickerApply>{{ 'core.form.datetime.confirm' | sdTranslate }}</button>\r\n </sd-datetime-picker-actions>\r\n </sd-datetime-picker>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["parseDate","isValidDate","SdMaterialDatetimePicker","ɵsdTimerScope","ɵsdModelFacingControl","ɵsdFormControlConnector"],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ import { SdDataState } from '@sdcorejs/angular/components/data-state';
|
|
|
5
5
|
import { SdModal } from '@sdcorejs/angular/components/modal';
|
|
6
6
|
import { SdQueryBar } from '@sdcorejs/angular/components/query-bar';
|
|
7
7
|
import { SdTable } from '@sdcorejs/angular/components/table';
|
|
8
|
-
import { I18nService,
|
|
9
|
-
import { ɵsdCoerceFormGroup as _sdCoerceFormGroup, sdViewedTransform, SdFormControl, ɵsdFormControlConnector as _sdFormControlConnector } from '@sdcorejs/angular/forms/models';
|
|
8
|
+
import { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';
|
|
9
|
+
import { ɵsdCoerceFormGroup as _sdCoerceFormGroup, sdViewedTransform, SdFormControl, sdFormControlState, ɵsdFormControlConnector as _sdFormControlConnector, SdInlineErrorValidator } from '@sdcorejs/angular/forms/models';
|
|
10
10
|
import { Utilities } from '@sdcorejs/utils/fns';
|
|
11
11
|
|
|
12
12
|
class SdEntityPickerSelectedTemplateDirective {
|
|
@@ -53,6 +53,7 @@ class SdEntityPicker {
|
|
|
53
53
|
selectedTemplate = contentChild((SdEntityPickerSelectedTemplateDirective));
|
|
54
54
|
rowTemplate = contentChild((SdEntityPickerRowTemplateDirective));
|
|
55
55
|
detailTemplate = contentChild((SdEntityPickerDetailTemplateDirective));
|
|
56
|
+
errorId = `sd-entity-picker-error-${Utilities.generateUuid()}`;
|
|
56
57
|
autoIdInput = input(undefined, { alias: 'autoId' });
|
|
57
58
|
autoId = computed(() => (this.autoIdInput() ? `forms-entity-picker-${this.autoIdInput()}` : undefined));
|
|
58
59
|
name = input(Utilities.generateUuid());
|
|
@@ -73,6 +74,8 @@ class SdEntityPicker {
|
|
|
73
74
|
disabledEntity = input();
|
|
74
75
|
multiple = input(false, { transform: booleanAttribute });
|
|
75
76
|
required = input(false, { transform: booleanAttribute });
|
|
77
|
+
/** Component-local error text. Set it to force the control invalid and render the message. */
|
|
78
|
+
inlineError = input();
|
|
76
79
|
clearable = input(true, { transform: booleanAttribute });
|
|
77
80
|
disabled = input(false, { transform: booleanAttribute });
|
|
78
81
|
readonly = input(false, { transform: booleanAttribute });
|
|
@@ -81,8 +84,25 @@ class SdEntityPicker {
|
|
|
81
84
|
model = model(undefined);
|
|
82
85
|
sdChange = output();
|
|
83
86
|
sdAdd = output();
|
|
84
|
-
|
|
87
|
+
loadError = output();
|
|
85
88
|
formControl = new SdFormControl();
|
|
89
|
+
#state = sdFormControlState(computed(() => this.formControl));
|
|
90
|
+
// why: `[required]` đã gắn Validators.required từ trước nhưng template không render message nào —
|
|
91
|
+
// picker bắt buộc mà bỏ trống chặn submit hoàn toàn im lặng (chỉ `loadError` được hiển thị).
|
|
92
|
+
// Map errors → text rồi đưa vào connector qua `validationError`; connector tự gate theo
|
|
93
|
+
// touched/dirty nên message chỉ hiện sau khi người dùng đã tương tác.
|
|
94
|
+
errorMessage = computed(() => {
|
|
95
|
+
void this.#state();
|
|
96
|
+
const errors = this.formControl.errors;
|
|
97
|
+
if (!errors)
|
|
98
|
+
return undefined;
|
|
99
|
+
// Chưa có key riêng cho entity-picker trong catalog i18n → dùng chung message của select.
|
|
100
|
+
if (errors['required'])
|
|
101
|
+
return this.#i18n.t('core.form.select.required');
|
|
102
|
+
if (errors['inlineError'])
|
|
103
|
+
return this.inlineError();
|
|
104
|
+
return undefined;
|
|
105
|
+
});
|
|
86
106
|
#connector = _sdFormControlConnector({
|
|
87
107
|
form: this.form,
|
|
88
108
|
name: this.name,
|
|
@@ -94,14 +114,18 @@ class SdEntityPicker {
|
|
|
94
114
|
},
|
|
95
115
|
modelToControl: value => value,
|
|
96
116
|
controlToModel: value => value,
|
|
117
|
+
validators: computed(() => (this.inlineError() ? [SdInlineErrorValidator] : null)),
|
|
97
118
|
required: this.required,
|
|
98
119
|
disabled: this.disabled,
|
|
99
120
|
readonly: this.readonly,
|
|
100
121
|
viewed: this.viewed,
|
|
122
|
+
validationError: this.errorMessage,
|
|
101
123
|
});
|
|
102
124
|
connectorState = this.#connector.state;
|
|
125
|
+
/** Interaction-gated validation message; `undefined` until the control is touched/dirty. */
|
|
126
|
+
visibleErrorMessage = computed(() => this.connectorState().validationError);
|
|
103
127
|
draftKeys = signal([]);
|
|
104
|
-
|
|
128
|
+
loadErrorState = signal(null);
|
|
105
129
|
loading = signal(false);
|
|
106
130
|
hydrating = signal(false);
|
|
107
131
|
query = signal({ filters: [], logic: 'AND', search: '' });
|
|
@@ -175,15 +199,15 @@ class SdEntityPicker {
|
|
|
175
199
|
if (controller.signal.aborted)
|
|
176
200
|
return;
|
|
177
201
|
this.#mergeEntities(items);
|
|
178
|
-
if (this.
|
|
179
|
-
this.
|
|
202
|
+
if (this.loadErrorState() === this.#hydrationError)
|
|
203
|
+
this.loadErrorState.set(null);
|
|
180
204
|
this.#hydrationError = null;
|
|
181
205
|
})
|
|
182
206
|
.catch(error => {
|
|
183
207
|
if (!controller.signal.aborted && !isAbortError(error)) {
|
|
184
208
|
this.#hydrationError = error;
|
|
185
|
-
this.
|
|
186
|
-
this.
|
|
209
|
+
this.loadErrorState.set(error);
|
|
210
|
+
this.loadError.emit(error);
|
|
187
211
|
}
|
|
188
212
|
})
|
|
189
213
|
.finally(() => {
|
|
@@ -270,7 +294,7 @@ class SdEntityPicker {
|
|
|
270
294
|
signal: controller.signal,
|
|
271
295
|
};
|
|
272
296
|
this.loading.set(true);
|
|
273
|
-
this.
|
|
297
|
+
this.loadErrorState.set(null);
|
|
274
298
|
try {
|
|
275
299
|
const page = await Promise.resolve(provider.load(request));
|
|
276
300
|
if (controller.signal.aborted || version !== this.#loadVersion)
|
|
@@ -281,8 +305,8 @@ class SdEntityPicker {
|
|
|
281
305
|
catch (error) {
|
|
282
306
|
if (controller.signal.aborted || version !== this.#loadVersion || isAbortError(error))
|
|
283
307
|
return { items: [], total: 0 };
|
|
284
|
-
this.
|
|
285
|
-
this.
|
|
308
|
+
this.loadErrorState.set(error);
|
|
309
|
+
this.loadError.emit(error);
|
|
286
310
|
return { items: [], total: 0 };
|
|
287
311
|
}
|
|
288
312
|
finally {
|
|
@@ -291,7 +315,7 @@ class SdEntityPicker {
|
|
|
291
315
|
}
|
|
292
316
|
}
|
|
293
317
|
retry() {
|
|
294
|
-
this.
|
|
318
|
+
this.loadErrorState.set(null);
|
|
295
319
|
void this.table()?.reload();
|
|
296
320
|
}
|
|
297
321
|
add() {
|
|
@@ -343,15 +367,15 @@ class SdEntityPicker {
|
|
|
343
367
|
return keys.some(value => this.compareWith()(value, key));
|
|
344
368
|
}
|
|
345
369
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdEntityPicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
346
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdEntityPicker, isStandalone: true, selector: "sd-entity-picker", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, modalTitle: { classPropertyName: "modalTitle", publicName: "modalTitle", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, queryFields: { classPropertyName: "queryFields", publicName: "queryFields", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, keySelector: { classPropertyName: "keySelector", publicName: "keySelector", isSignal: true, isRequired: false, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, disabledEntity: { classPropertyName: "disabledEntity", publicName: "disabledEntity", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, addable: { classPropertyName: "addable", publicName: "addable", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { model: "modelChange", sdChange: "sdChange", sdAdd: "sdAdd", sdLoadError: "sdLoadError" }, host: { properties: { "class.sd-viewed": "connectorState().isViewed", "class.sd-inline": "connectorState().isInline", "attr.data-disabled": "formControl.disabled" } }, queries: [{ propertyName: "selectedTemplate", first: true, predicate: (SdEntityPickerSelectedTemplateDirective), descendants: true, isSignal: true }, { propertyName: "rowTemplate", first: true, predicate: (SdEntityPickerRowTemplateDirective), descendants: true, isSignal: true }, { propertyName: "detailTemplate", first: true, predicate: (SdEntityPickerDetailTemplateDirective), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "modal", first: true, predicate: SdModal, descendants: true, isSignal: true }, { propertyName: "table", first: true, predicate: (SdTable), descendants: true, isSignal: true }], ngImport: i0, template: "@let _selectedTemplate = selectedTemplate();\n@let _detailTemplate = detailTemplate();\n\n<div class=\"sd-entity-picker__control\">\n @if (connectorState().isViewed) {\n <div data-entity-picker-view class=\"sd-entity-picker__view\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n {{ displayText() || '\u2014' }}\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-entity-picker-trigger\n class=\"sd-entity-picker__trigger\"\n aria-haspopup=\"dialog\"\n [attr.aria-label]=\"ariaLabel() || label() || effectivePlaceholder()\"\n [attr.aria-expanded]=\"modal()?.isOpened() ?? false\"\n [disabled]=\"formControl.disabled || readonly()\"\n (click)=\"open()\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n <span [class.sd-entity-picker__placeholder]=\"!displayText()\">{{ displayText() || effectivePlaceholder() }}</span>\n }\n </button>\n @if (clearable() && modelKeys().length > 0 && !formControl.disabled && !readonly()) {\n <button\n type=\"button\"\n class=\"sd-entity-picker__clear\"\n [attr.aria-label]=\"'core.form.entity-picker.clear' | translate\"\n (click)=\"clear($event)\">\n \u00D7\n </button>\n }\n }\n</div>\n\n<sd-modal [autoId]=\"autoId()\" [title]=\"effectiveModalTitle()\" width=\"lg\" (sdClosed)=\"onModalClosed()\">\n <div class=\"sd-entity-picker__body\">\n <sd-query-bar\n [fields]=\"queryFields()\"\n [filters]=\"query().filters\"\n [search]=\"query().search ?? ''\"\n showSearch\n (queryChange)=\"onQueryChange($event)\" />\n\n @if (loadError()) {\n <sd-data-state state=\"error\" compact retryable (sdRetry)=\"retry()\"></sd-data-state>\n } @else {\n <sd-table [option]=\"tableOption()\"></sd-table>\n }\n\n @if (_detailTemplate) {\n <div class=\"sd-entity-picker__detail\">\n <ng-container [ngTemplateOutlet]=\"_detailTemplate.template\" [ngTemplateOutletContext]=\"detailTemplateContext()\"></ng-container>\n </div>\n }\n </div>\n\n @if (addable()) {\n <button type=\"button\" sdFooterLeft data-entity-picker-add (click)=\"add()\">{{ 'core.form.entity-picker.add' | translate }}</button>\n }\n <button type=\"button\" sdFooterRight data-entity-picker-cancel (click)=\"cancel()\">\n {{ 'core.form.entity-picker.cancel' | translate }}\n </button>\n <button type=\"button\" sdFooterRight data-entity-picker-apply (click)=\"applySelection()\">\n {{ 'core.form.entity-picker.apply' | translate }}\n </button>\n</sd-modal>\n", styles: [":host{display:block;min-width:0}.sd-entity-picker__control{display:flex;align-items:center;min-width:0;border:1px solid var(--sd-border, #d0d5dd);border-radius:6px;background:#fff}.sd-entity-picker__trigger,.sd-entity-picker__view{flex:1 1 auto;min-width:0;min-height:40px;padding:9px 12px;border:0;background:transparent;color:var(--sd-text, #2f3136);font:inherit;text-align:start}.sd-entity-picker__trigger{cursor:pointer}.sd-entity-picker__trigger:focus-visible{outline:2px solid var(--sd-primary, #1677ff);outline-offset:2px}.sd-entity-picker__trigger:disabled{cursor:default;opacity:.6}.sd-entity-picker__placeholder{color:var(--sd-text-secondary, #667085)}.sd-entity-picker__clear{flex:0 0 36px;min-height:36px;border:0;background:transparent;font:inherit;cursor:pointer}.sd-entity-picker__body{display:grid;gap:12px;min-height:320px}.sd-entity-picker__detail{padding:12px;border-top:1px solid var(--sd-border, #d0d5dd)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: SdModal, selector: "sd-modal", inputs: ["autoId", "title", "color", "width", "height", "view", "modalClass", "lazyLoadContent", "hideClose", "disableBackdropClose", "beforeClose"], outputs: ["sdClosed", "sdCloseError"] }, { kind: "component", type: SdQueryBar, selector: "sd-query-bar", inputs: ["option", "autoId", "fields", "filters", "logic", "search", "mode", "density", "showSearch", "showSavedFilters", "savedFiltersKey", "showLogicToggle", "showClearAll", "showOperatorOnChip"], outputs: ["filtersChange", "logicChange", "searchChange", "queryChange", "apply"] }, { kind: "component", type: SdTable, selector: "sd-table", inputs: ["autoId", "option"] }, { kind: "component", type: SdDataState, selector: "sd-data-state", inputs: ["state", "title", "message", "icon", "fontSet", "retryable", "retryLabel", "actionLabel", "compact", "fullPage"], outputs: ["sdRetry", "sdAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
370
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdEntityPicker, isStandalone: true, selector: "sd-entity-picker", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, modalTitle: { classPropertyName: "modalTitle", publicName: "modalTitle", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, queryFields: { classPropertyName: "queryFields", publicName: "queryFields", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, keySelector: { classPropertyName: "keySelector", publicName: "keySelector", isSignal: true, isRequired: false, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, disabledEntity: { classPropertyName: "disabledEntity", publicName: "disabledEntity", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, addable: { classPropertyName: "addable", publicName: "addable", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { model: "modelChange", sdChange: "sdChange", sdAdd: "sdAdd", loadError: "loadError" }, host: { properties: { "class.sd-viewed": "connectorState().isViewed", "class.sd-inline": "connectorState().isInline", "attr.data-disabled": "formControl.disabled" } }, queries: [{ propertyName: "selectedTemplate", first: true, predicate: (SdEntityPickerSelectedTemplateDirective), descendants: true, isSignal: true }, { propertyName: "rowTemplate", first: true, predicate: (SdEntityPickerRowTemplateDirective), descendants: true, isSignal: true }, { propertyName: "detailTemplate", first: true, predicate: (SdEntityPickerDetailTemplateDirective), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "modal", first: true, predicate: SdModal, descendants: true, isSignal: true }, { propertyName: "table", first: true, predicate: (SdTable), descendants: true, isSignal: true }], ngImport: i0, template: "@let _selectedTemplate = selectedTemplate();\n@let _detailTemplate = detailTemplate();\n@let _errorMessage = visibleErrorMessage();\n\n<div class=\"sd-entity-picker__control\">\n @if (connectorState().isViewed) {\n <div data-entity-picker-view class=\"sd-entity-picker__view\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n {{ displayText() || '\u2014' }}\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-entity-picker-trigger\n class=\"sd-entity-picker__trigger\"\n aria-haspopup=\"dialog\"\n [attr.aria-label]=\"ariaLabel() || label() || effectivePlaceholder()\"\n [attr.aria-expanded]=\"modal()?.isOpened() ?? false\"\n [attr.aria-invalid]=\"_errorMessage ? 'true' : null\"\n [attr.aria-describedby]=\"_errorMessage ? errorId : null\"\n [disabled]=\"formControl.disabled || readonly()\"\n (click)=\"open()\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n <span [class.sd-entity-picker__placeholder]=\"!displayText()\">{{ displayText() || effectivePlaceholder() }}</span>\n }\n </button>\n @if (clearable() && modelKeys().length > 0 && !formControl.disabled && !readonly()) {\n <button\n type=\"button\"\n class=\"sd-entity-picker__clear\"\n [attr.aria-label]=\"'core.form.entity-picker.clear' | sdTranslate\"\n (click)=\"clear($event)\">\n \u00D7\n </button>\n }\n }\n</div>\n\n@if (_errorMessage) {\n <div [id]=\"errorId\" data-entity-picker-error class=\"sd-entity-picker__error\" role=\"alert\">{{ _errorMessage }}</div>\n}\n\n<sd-modal [autoId]=\"autoId()\" [title]=\"effectiveModalTitle()\" width=\"lg\" (sdClosed)=\"onModalClosed()\">\n <div class=\"sd-entity-picker__body\">\n <sd-query-bar\n [fields]=\"queryFields()\"\n [filters]=\"query().filters\"\n [search]=\"query().search ?? ''\"\n showSearch\n (queryChange)=\"onQueryChange($event)\" />\n\n @if (loadErrorState()) {\n <sd-data-state state=\"error\" compact retryable (sdRetry)=\"retry()\"></sd-data-state>\n } @else {\n <sd-table [option]=\"tableOption()\"></sd-table>\n }\n\n @if (_detailTemplate) {\n <div class=\"sd-entity-picker__detail\">\n <ng-container [ngTemplateOutlet]=\"_detailTemplate.template\" [ngTemplateOutletContext]=\"detailTemplateContext()\"></ng-container>\n </div>\n }\n </div>\n\n @if (addable()) {\n <button type=\"button\" sdFooterLeft data-entity-picker-add (click)=\"add()\">{{ 'core.form.entity-picker.add' | sdTranslate }}</button>\n }\n <button type=\"button\" sdFooterRight data-entity-picker-cancel (click)=\"cancel()\">\n {{ 'core.form.entity-picker.cancel' | sdTranslate }}\n </button>\n <button type=\"button\" sdFooterRight data-entity-picker-apply (click)=\"applySelection()\">\n {{ 'core.form.entity-picker.apply' | sdTranslate }}\n </button>\n</sd-modal>\n", styles: [":host{display:block;min-width:0}.sd-entity-picker__control{display:flex;align-items:center;min-width:0;border:1px solid var(--sd-border, #d0d5dd);border-radius:6px;background:#fff}.sd-entity-picker__trigger,.sd-entity-picker__view{flex:1 1 auto;min-width:0;min-height:40px;padding:9px 12px;border:0;background:transparent;color:var(--sd-text, #2f3136);font:inherit;text-align:start}.sd-entity-picker__trigger{cursor:pointer}.sd-entity-picker__trigger:focus-visible{outline:2px solid var(--sd-primary, #1677ff);outline-offset:2px}.sd-entity-picker__trigger:disabled{cursor:default;opacity:.6}.sd-entity-picker__placeholder{color:var(--sd-text-secondary, #667085)}.sd-entity-picker__clear{flex:0 0 36px;min-height:36px;border:0;background:transparent;font:inherit;cursor:pointer}.sd-entity-picker__error{margin-top:4px;color:var(--sd-error, #d92d20);font-size:12px;line-height:16px}.sd-entity-picker__body{display:grid;gap:12px;min-height:320px}.sd-entity-picker__detail{padding:12px;border-top:1px solid var(--sd-border, #d0d5dd)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SdTranslatePipe, name: "sdTranslate" }, { kind: "component", type: SdModal, selector: "sd-modal", inputs: ["autoId", "title", "color", "width", "height", "view", "modalClass", "lazyLoadContent", "hideClose", "disableBackdropClose", "beforeClose"], outputs: ["sdClosed", "sdCloseError"] }, { kind: "component", type: SdQueryBar, selector: "sd-query-bar", inputs: ["option", "autoId", "fields", "filters", "logic", "search", "mode", "density", "showSearch", "showSavedFilters", "savedFiltersKey", "showLogicToggle", "showClearAll", "showOperatorOnChip"], outputs: ["filtersChange", "logicChange", "searchChange", "queryChange", "apply"] }, { kind: "component", type: SdTable, selector: "sd-table", inputs: ["autoId", "option"] }, { kind: "component", type: SdDataState, selector: "sd-data-state", inputs: ["state", "title", "message", "icon", "fontSet", "retryable", "retryLabel", "actionLabel", "compact", "fullPage"], outputs: ["sdRetry", "sdAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
347
371
|
}
|
|
348
372
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdEntityPicker, decorators: [{
|
|
349
373
|
type: Component,
|
|
350
|
-
args: [{ selector: 'sd-entity-picker', standalone: true, imports: [NgTemplateOutlet,
|
|
374
|
+
args: [{ selector: 'sd-entity-picker', standalone: true, imports: [NgTemplateOutlet, SdTranslatePipe, SdModal, SdQueryBar, SdTable, SdDataState], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
351
375
|
'[class.sd-viewed]': 'connectorState().isViewed',
|
|
352
376
|
'[class.sd-inline]': 'connectorState().isInline',
|
|
353
377
|
'[attr.data-disabled]': 'formControl.disabled',
|
|
354
|
-
}, template: "@let _selectedTemplate = selectedTemplate();\n@let _detailTemplate = detailTemplate();\n\n<div class=\"sd-entity-picker__control\">\n @if (connectorState().isViewed) {\n <div data-entity-picker-view class=\"sd-entity-picker__view\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n {{ displayText() || '\u2014' }}\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-entity-picker-trigger\n class=\"sd-entity-picker__trigger\"\n aria-haspopup=\"dialog\"\n [attr.aria-label]=\"ariaLabel() || label() || effectivePlaceholder()\"\n [attr.aria-expanded]=\"modal()?.isOpened() ?? false\"\n [disabled]=\"formControl.disabled || readonly()\"\n (click)=\"open()\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n <span [class.sd-entity-picker__placeholder]=\"!displayText()\">{{ displayText() || effectivePlaceholder() }}</span>\n }\n </button>\n @if (clearable() && modelKeys().length > 0 && !formControl.disabled && !readonly()) {\n <button\n type=\"button\"\n class=\"sd-entity-picker__clear\"\n [attr.aria-label]=\"'core.form.entity-picker.clear' |
|
|
378
|
+
}, template: "@let _selectedTemplate = selectedTemplate();\n@let _detailTemplate = detailTemplate();\n@let _errorMessage = visibleErrorMessage();\n\n<div class=\"sd-entity-picker__control\">\n @if (connectorState().isViewed) {\n <div data-entity-picker-view class=\"sd-entity-picker__view\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n {{ displayText() || '\u2014' }}\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-entity-picker-trigger\n class=\"sd-entity-picker__trigger\"\n aria-haspopup=\"dialog\"\n [attr.aria-label]=\"ariaLabel() || label() || effectivePlaceholder()\"\n [attr.aria-expanded]=\"modal()?.isOpened() ?? false\"\n [attr.aria-invalid]=\"_errorMessage ? 'true' : null\"\n [attr.aria-describedby]=\"_errorMessage ? errorId : null\"\n [disabled]=\"formControl.disabled || readonly()\"\n (click)=\"open()\">\n @if (_selectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"_selectedTemplate.template\" [ngTemplateOutletContext]=\"selectedTemplateContext()\"></ng-container>\n } @else {\n <span [class.sd-entity-picker__placeholder]=\"!displayText()\">{{ displayText() || effectivePlaceholder() }}</span>\n }\n </button>\n @if (clearable() && modelKeys().length > 0 && !formControl.disabled && !readonly()) {\n <button\n type=\"button\"\n class=\"sd-entity-picker__clear\"\n [attr.aria-label]=\"'core.form.entity-picker.clear' | sdTranslate\"\n (click)=\"clear($event)\">\n \u00D7\n </button>\n }\n }\n</div>\n\n@if (_errorMessage) {\n <div [id]=\"errorId\" data-entity-picker-error class=\"sd-entity-picker__error\" role=\"alert\">{{ _errorMessage }}</div>\n}\n\n<sd-modal [autoId]=\"autoId()\" [title]=\"effectiveModalTitle()\" width=\"lg\" (sdClosed)=\"onModalClosed()\">\n <div class=\"sd-entity-picker__body\">\n <sd-query-bar\n [fields]=\"queryFields()\"\n [filters]=\"query().filters\"\n [search]=\"query().search ?? ''\"\n showSearch\n (queryChange)=\"onQueryChange($event)\" />\n\n @if (loadErrorState()) {\n <sd-data-state state=\"error\" compact retryable (sdRetry)=\"retry()\"></sd-data-state>\n } @else {\n <sd-table [option]=\"tableOption()\"></sd-table>\n }\n\n @if (_detailTemplate) {\n <div class=\"sd-entity-picker__detail\">\n <ng-container [ngTemplateOutlet]=\"_detailTemplate.template\" [ngTemplateOutletContext]=\"detailTemplateContext()\"></ng-container>\n </div>\n }\n </div>\n\n @if (addable()) {\n <button type=\"button\" sdFooterLeft data-entity-picker-add (click)=\"add()\">{{ 'core.form.entity-picker.add' | sdTranslate }}</button>\n }\n <button type=\"button\" sdFooterRight data-entity-picker-cancel (click)=\"cancel()\">\n {{ 'core.form.entity-picker.cancel' | sdTranslate }}\n </button>\n <button type=\"button\" sdFooterRight data-entity-picker-apply (click)=\"applySelection()\">\n {{ 'core.form.entity-picker.apply' | sdTranslate }}\n </button>\n</sd-modal>\n", styles: [":host{display:block;min-width:0}.sd-entity-picker__control{display:flex;align-items:center;min-width:0;border:1px solid var(--sd-border, #d0d5dd);border-radius:6px;background:#fff}.sd-entity-picker__trigger,.sd-entity-picker__view{flex:1 1 auto;min-width:0;min-height:40px;padding:9px 12px;border:0;background:transparent;color:var(--sd-text, #2f3136);font:inherit;text-align:start}.sd-entity-picker__trigger{cursor:pointer}.sd-entity-picker__trigger:focus-visible{outline:2px solid var(--sd-primary, #1677ff);outline-offset:2px}.sd-entity-picker__trigger:disabled{cursor:default;opacity:.6}.sd-entity-picker__placeholder{color:var(--sd-text-secondary, #667085)}.sd-entity-picker__clear{flex:0 0 36px;min-height:36px;border:0;background:transparent;font:inherit;cursor:pointer}.sd-entity-picker__error{margin-top:4px;color:var(--sd-error, #d92d20);font-size:12px;line-height:16px}.sd-entity-picker__body{display:grid;gap:12px;min-height:320px}.sd-entity-picker__detail{padding:12px;border-top:1px solid var(--sd-border, #d0d5dd)}\n"] }]
|
|
355
379
|
}], ctorParameters: () => [] });
|
|
356
380
|
function normalizePickerKeys(value, multiple) {
|
|
357
381
|
if (value == null)
|