@sdcorejs/angular 19.1.6 → 19.2.1
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/api-contract-builder/index.d.ts +8 -0
- package/components/api-contract-builder/src/api-contract-builder.component.d.ts +123 -0
- package/components/api-contract-builder/src/api-contract.configuration.d.ts +41 -0
- package/components/api-contract-builder/src/api-contract.expression.d.ts +43 -0
- package/components/api-contract-builder/src/api-contract.model.d.ts +167 -0
- package/components/api-contract-builder/src/api-contract.samples.d.ts +25 -0
- package/components/api-contract-builder/src/api-contract.schema.d.ts +126 -0
- package/components/api-contract-builder/src/api-contract.serializer.d.ts +17 -0
- package/components/api-contract-builder/src/api-contract.validation.d.ts +12 -0
- package/components/api-contract-builder/src/components/api-contract-diagnostic-list.component.d.ts +18 -0
- package/components/api-contract-builder/src/components/api-contract-node-drawer.component.d.ts +130 -0
- package/components/api-contract-builder/src/components/api-contract-node-editor.component.d.ts +35 -0
- package/components/api-contract-builder/src/components/api-contract-node-summary.component.d.ts +41 -0
- package/components/api-contract-builder/src/components/api-contract-record-editor.component.d.ts +36 -0
- package/components/api-contract-builder/src/components/api-contract-source-editor.component.d.ts +86 -0
- package/components/api-contract-builder/src/components/api-contract-suggestion.model.d.ts +17 -0
- package/components/badge/src/badge.component.d.ts +2 -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 +7 -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 +5 -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-api-contract-builder.mjs +3411 -0
- package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs.map +1 -0
- 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 +27 -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-operator.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-operator.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 +33 -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 +555 -267
- 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 +7 -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 +895 -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 +342 -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 +170 -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 +16 -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 -29
- 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-tree-select.mjs","sources":["../../../projects/sdcorejs-angular/forms/tree-select/src/tree-select.component.ts","../../../projects/sdcorejs-angular/forms/tree-select/src/tree-select.component.html","../../../projects/sdcorejs-angular/forms/tree-select/sdcorejs-angular-forms-tree-select.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport {\n SdTree,\n SdTreeComponentOption,\n SdTreeDataSource,\n SdTreeItem,\n SdTreeItemContext,\n SdTreeLoadErrorEvent,\n SdTreeNode,\n SdTreeOption,\n SdTreeSelectionEvent,\n} from '@sdcorejs/angular/components/tree';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport {\n SdFormControl,\n SdViewed,\n SdViewedInput,\n sdViewedTransform,\n ɵSdFormControlParent,\n ɵsdCoerceFormGroup,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { NestedKeyOf } from '@sdcorejs/utils/models';\n\nexport type SdTreeSelectModel<TKey> = TKey | TKey[] | null | undefined;\n\nexport type SdTreeSelectTemplateContext<T> = SdTreeItemContext<T>;\n\n@Directive({ selector: 'ng-template[sdTreeSelectNode]', standalone: true })\nexport class SdTreeSelectNodeTemplateDirective<T> {\n readonly template = inject<TemplateRef<SdTreeSelectTemplateContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _directive: SdTreeSelectNodeTemplateDirective<T>,\n _context: unknown\n ): _context is SdTreeSelectTemplateContext<T> {\n return true;\n }\n}\n\n@Component({\n selector: 'sd-tree-select',\n standalone: true,\n imports: [TranslatePipe, SdModal, SdTree],\n templateUrl: './tree-select.component.html',\n styleUrl: './tree-select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.sd-viewed]': 'connectorState().isViewed',\n '[attr.data-disabled]': 'formControl.disabled',\n },\n})\nexport class SdTreeSelect<T = unknown, TKey = string | number> {\n readonly #i18n = inject(I18nService);\n readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n readonly modal = viewChild(SdModal);\n readonly treeComponent = viewChild(SdTree<T>);\n readonly nodeTemplate = contentChild(SdTreeSelectNodeTemplateDirective<T>);\n\n readonly autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `forms-tree-select-${this.autoIdInput()}` : undefined));\n readonly name = input<string>(Utilities.generateUuid());\n readonly form = input<FormGroup | undefined, ɵSdFormControlParent>(undefined, { transform: ɵsdCoerceFormGroup });\n readonly label = input<string | undefined>();\n readonly placeholder = input<string | null | undefined>();\n readonly modalTitle = input<string | null | undefined>();\n readonly ariaLabel = input<string | undefined>();\n readonly items = input<SdTreeDataSource<SdTreeItem<T>>>([]);\n readonly tree = input<SdTreeOption<T>>({ loadType: 'static' });\n readonly valueField = input<NestedKeyOf<T> | undefined>();\n readonly keySelector = input<((item: T) => TKey) | undefined>();\n readonly displayField = input<NestedKeyOf<T> | undefined>();\n readonly displayWith = input<((item: T) => string) | undefined>();\n readonly compareWith = input<(left: TKey, right: TKey) => boolean>(Object.is);\n readonly disabledNode = input<((item: T, selectedItems: T[]) => boolean) | undefined>();\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly cascade = input<'independent' | 'descendants'>('independent');\n readonly required = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n readonly model = model<SdTreeSelectModel<TKey>>(undefined);\n readonly sdChange = output<SdTreeSelectModel<TKey>>();\n readonly sdLoadError = output<SdTreeLoadErrorEvent<T>>();\n\n readonly formControl = new SdFormControl();\n readonly #connector = ɵsdFormControlConnector<SdTreeSelectModel<TKey>, SdTreeSelectModel<TKey>>({\n form: this.form,\n name: this.name,\n control: computed<AbstractControl<SdTreeSelectModel<TKey>>>(() => this.formControl),\n model: this.model,\n writeModel: value => {\n this.model.set(value);\n this.sdChange.emit(value);\n },\n modelToControl: value => value,\n controlToModel: value => value,\n required: this.required,\n disabled: this.disabled,\n readonly: this.readonly,\n viewed: this.viewed,\n });\n\n readonly connectorState = this.#connector.state;\n readonly draftKeys = signal<TKey[]>([]);\n readonly modelKeys = computed(() => normalizeTreeSelectKeys(this.model(), this.multiple()));\n readonly effectivePlaceholder = computed(() => this.placeholder() ?? this.#i18n.t('core.form.tree-select.placeholder'));\n readonly effectiveModalTitle = computed(() => this.modalTitle() ?? this.#i18n.t('core.form.tree-select.modal-title'));\n readonly loadedEntities = computed(() => {\n const tree = this.treeComponent();\n if (tree) return flattenNodes(tree.rootNodes()).map(node => node.data);\n const source = this.items();\n return Array.isArray(source) ? flattenItems(source).map(item => item.data) : [];\n });\n readonly selectedEntities = computed(() => this.#entitiesForKeys(this.modelKeys()));\n readonly draftEntities = computed(() => this.#entitiesForKeys(this.draftKeys()));\n readonly displayText = computed(() =>\n this.modelKeys()\n .map(key => {\n const item = this.loadedEntities().find(candidate => this.compareWith()(this.keyOf(candidate), key));\n return item ? this.displayEntity(item) : String(key);\n })\n .join(', ')\n );\n\n readonly treeOption = computed<SdTreeComponentOption<T>>(\n () =>\n ({\n autoId: this.autoId(),\n items: this.items(),\n tree: this.tree(),\n selectedItems: this.draftEntities(),\n itemTemplate: this.nodeTemplate()?.template,\n selector: {\n visible: true,\n single: !this.multiple(),\n cascade: this.cascade(),\n disabled: (item, selectedItems) => !!this.disabledNode()?.(item, selectedItems),\n },\n }) as SdTreeComponentOption<T>\n );\n\n open(): void {\n if (this.formControl.disabled || this.readonly() || this.connectorState().isViewed) return;\n this.draftKeys.set([...this.modelKeys()]);\n this.modal()?.open();\n }\n\n applySelection(): void {\n const keys = [...this.draftKeys()];\n const value: SdTreeSelectModel<TKey> = this.multiple() ? keys : (keys[0] ?? null);\n this.formControl.setValue(value);\n this.formControl.markAsDirty();\n this.formControl.markAsTouched();\n this.modal()?.close();\n }\n\n cancel(): void {\n this.modal()?.close();\n }\n\n clear(event?: Event): void {\n event?.stopPropagation();\n if (this.formControl.disabled || this.readonly()) return;\n this.formControl.setValue(this.multiple() ? [] : null);\n this.formControl.markAsDirty();\n this.formControl.markAsTouched();\n }\n\n onModalClosed(): void {\n queueMicrotask(() => this.trigger()?.nativeElement.focus());\n }\n\n onTreeSelection(event: SdTreeSelectionEvent<T>): void {\n const loadedKeys = this.loadedEntities().map(item => this.keyOf(item));\n const hiddenKeys = this.draftKeys().filter(key => !loadedKeys.some(value => this.compareWith()(value, key)));\n if (!this.multiple()) {\n this.draftKeys.set(event.selected ? [this.keyOf(event.item)] : []);\n return;\n }\n\n const selectedLoadedKeys = event.selectedItems.map(item => this.keyOf(item));\n this.draftKeys.set(dedupeKeys([...hiddenKeys, ...selectedLoadedKeys], this.compareWith()));\n }\n\n filter(value: string): void {\n this.treeComponent()?.filter(value);\n }\n\n retry(): void {\n this.treeComponent()?.retry();\n }\n\n keyOf(item: T): TKey {\n const selector = this.keySelector();\n if (selector) return selector(item);\n return readPath(item, this.valueField() as string | undefined) as TKey;\n }\n\n displayEntity(item: T): string {\n const selector = this.displayWith();\n if (selector) return selector(item);\n const value = readPath(item, this.displayField() as string | undefined);\n return value == null ? '' : String(value);\n }\n\n #entitiesForKeys(keys: readonly TKey[]): T[] {\n return keys\n .map(key => this.loadedEntities().find(item => this.compareWith()(this.keyOf(item), key)))\n .filter((item): item is T => item !== undefined);\n }\n}\n\nfunction flattenNodes<T>(nodes: readonly SdTreeNode<T>[]): SdTreeNode<T>[] {\n return nodes.flatMap(node => [node, ...flattenNodes(node.children)]);\n}\n\nfunction flattenItems<T>(items: readonly SdTreeItem<T>[]): SdTreeItem<T>[] {\n return items.flatMap(item => [item, ...flattenItems(item.children ?? [])]);\n}\n\nfunction dedupeKeys<TKey>(keys: readonly TKey[], compare: (left: TKey, right: TKey) => boolean): TKey[] {\n return keys.reduce<TKey[]>((result, key) => {\n if (!result.some(value => compare(value, key))) result.push(key);\n return result;\n }, []);\n}\n\nfunction readPath(value: unknown, path: string | undefined): unknown {\n if (!path) return value;\n return path.split('.').reduce<unknown>((current, segment) => {\n if (typeof current !== 'object' || current === null) return undefined;\n return (current as Record<string, unknown>)[segment];\n }, value);\n}\n\nexport function normalizeTreeSelectKeys<TKey>(value: SdTreeSelectModel<TKey>, multiple: boolean): TKey[] {\n if (value == null) return [];\n if (Array.isArray(value)) return multiple ? [...value] : value.slice(0, 1);\n return [value as TKey];\n}\n","<div class=\"sd-tree-select__control\">\n @if (connectorState().isViewed) {\n <div data-tree-select-view class=\"sd-tree-select__view\">{{ displayText() || '—' }}</div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-tree-select-trigger\n class=\"sd-tree-select__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 <span [class.sd-tree-select__placeholder]=\"!displayText()\">{{ displayText() || effectivePlaceholder() }}</span>\n </button>\n @if (clearable() && modelKeys().length > 0 && !formControl.disabled && !readonly()) {\n <button\n type=\"button\"\n class=\"sd-tree-select__clear\"\n [attr.aria-label]=\"'core.form.tree-select.clear' | translate\"\n (click)=\"clear($event)\">\n ×\n </button>\n }\n }\n</div>\n\n<sd-modal [autoId]=\"autoId()\" [title]=\"effectiveModalTitle()\" width=\"md\" (sdClosed)=\"onModalClosed()\">\n <div class=\"sd-tree-select__body\">\n <label class=\"sd-tree-select__search\">\n <span class=\"visually-hidden\">{{ 'core.form.tree-select.search' | translate }}</span>\n <input type=\"search\" [placeholder]=\"'core.form.tree-select.search' | translate\" (input)=\"filter($any($event.target).value)\" />\n </label>\n <sd-tree [option]=\"treeOption()\" (selectChange)=\"onTreeSelection($event)\" (loadError)=\"sdLoadError.emit($event)\" />\n </div>\n <button type=\"button\" sdFooterRight data-tree-select-cancel (click)=\"cancel()\">{{ 'core.form.tree-select.cancel' | translate }}</button>\n <button type=\"button\" sdFooterRight data-tree-select-apply (click)=\"applySelection()\">\n {{ 'core.form.tree-select.apply' | translate }}\n </button>\n</sd-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdCoerceFormGroup","ɵsdFormControlConnector"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-forms-tree-select.mjs","sources":["../../../projects/sdcorejs-angular/forms/tree-select/src/tree-select.component.ts","../../../projects/sdcorejs-angular/forms/tree-select/src/tree-select.component.html","../../../projects/sdcorejs-angular/forms/tree-select/sdcorejs-angular-forms-tree-select.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { AbstractControl, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport {\n SdTree,\n SdTreeComponentOption,\n SdTreeDataSource,\n SdTreeItem,\n SdTreeItemContext,\n SdTreeLoadErrorEvent,\n SdTreeNode,\n SdTreeOption,\n SdTreeSelectionEvent,\n} from '@sdcorejs/angular/components/tree';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n SdViewed,\n SdViewedInput,\n sdFormControlState,\n sdViewedTransform,\n ɵSdFormControlParent,\n ɵsdCoerceFormGroup,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { NestedKeyOf, Size } from '@sdcorejs/utils/models';\n\nexport type SdTreeSelectModel<TKey> = TKey | TKey[] | null | undefined;\n\nexport type SdTreeSelectTemplateContext<T> = SdTreeItemContext<T>;\n\n@Directive({ selector: 'ng-template[sdTreeSelectNode]', standalone: true })\nexport class SdTreeSelectNodeTemplateDirective<T> {\n readonly template = inject<TemplateRef<SdTreeSelectTemplateContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _directive: SdTreeSelectNodeTemplateDirective<T>,\n _context: unknown\n ): _context is SdTreeSelectTemplateContext<T> {\n return true;\n }\n}\n\n@Component({\n selector: 'sd-tree-select',\n standalone: true,\n imports: [\n MatFormFieldModule,\n MatInputModule,\n MatTooltipModule,\n ReactiveFormsModule,\n SdButton,\n SdIcon,\n SdInput,\n SdLabel,\n SdModal,\n SdTranslatePipe,\n SdTree,\n SdView,\n ],\n templateUrl: './tree-select.component.html',\n styleUrl: './tree-select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.sd-viewed]': 'connectorState().isViewed',\n '[attr.data-disabled]': 'formControl.disabled',\n },\n})\nexport class SdTreeSelect<T = unknown, TKey = string | number> {\n readonly #i18n = inject(I18nService);\n readonly #formConfiguration = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly trigger = viewChild<ElementRef<HTMLInputElement>>('trigger');\n readonly modal = viewChild(SdModal);\n readonly treeComponent = viewChild(SdTree<T>);\n readonly nodeTemplate = contentChild(SdTreeSelectNodeTemplateDirective<T>);\n\n readonly errorId = `sd-tree-select-error-${Utilities.generateUuid()}`;\n\n readonly autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `forms-tree-select-${this.autoIdInput()}` : undefined));\n readonly name = input<string>(Utilities.generateUuid());\n readonly form = input<FormGroup | undefined, ɵSdFormControlParent>(undefined, { transform: ɵsdCoerceFormGroup });\n readonly label = input<string | undefined>();\n readonly helperText = input<string | undefined>();\n readonly placeholder = input<string | null | undefined>();\n readonly modalTitle = input<string | null | undefined>();\n readonly ariaLabel = input<string | undefined>();\n readonly size = input<Size>('md');\n readonly appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n readonly appearance = computed(() => this.appearanceInput() ?? this.#formConfiguration?.appearance ?? 'outline');\n readonly hideInlineError = input(false, { transform: booleanAttribute });\n readonly items = input<SdTreeDataSource<SdTreeItem<T>>>([]);\n readonly tree = input<SdTreeOption<T>>({ loadType: 'static' });\n readonly valueField = input<NestedKeyOf<T> | undefined>();\n readonly keySelector = input<((item: T) => TKey) | undefined>();\n readonly displayField = input<NestedKeyOf<T> | undefined>();\n readonly displayWith = input<((item: T) => string) | undefined>();\n readonly compareWith = input<(left: TKey, right: TKey) => boolean>(Object.is);\n readonly disabledNode = input<((item: T, selectedItems: T[]) => boolean) | undefined>();\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly cascade = input<'independent' | 'descendants'>('independent');\n readonly required = input(false, { transform: booleanAttribute });\n /** Component-local error text. Set it to force the control invalid and render the message. */\n readonly inlineError = input<string | undefined>();\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n readonly model = model<SdTreeSelectModel<TKey>>(undefined);\n readonly sdChange = output<SdTreeSelectModel<TKey>>();\n readonly loadError = output<SdTreeLoadErrorEvent<T>>();\n\n readonly formControl = new SdFormControl();\n readonly #state = sdFormControlState(computed(() => this.formControl));\n // why: `[required]` đã gắn Validators.required từ trước nhưng template không render message nào —\n // tree-select bắt buộc mà bỏ trống chặn submit hoàn toàn im lặng. Map errors → text rồi đưa vào\n // connector qua `validationError`; connector tự gate theo touched/dirty.\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n // Chưa có key riêng cho tree-select trong catalog i18n → dùng chung message của select.\n if (errors['required']) return this.#i18n.t('core.form.select.required');\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n readonly #connector = ɵsdFormControlConnector<SdTreeSelectModel<TKey>, SdTreeSelectModel<TKey>>({\n form: this.form,\n name: this.name,\n control: computed<AbstractControl<SdTreeSelectModel<TKey>>>(() => this.formControl),\n model: this.model,\n writeModel: value => {\n this.model.set(value);\n this.sdChange.emit(value);\n },\n modelToControl: value => value,\n controlToModel: value => value,\n validators: computed(() => (this.inlineError() ? [SdInlineErrorValidator] : null)),\n required: this.required,\n disabled: this.disabled,\n readonly: this.readonly,\n viewed: this.viewed,\n validationError: this.errorMessage,\n });\n\n readonly connectorState = this.#connector.state;\n /** Interaction-gated validation message; `undefined` until the control is touched/dirty. */\n readonly visibleErrorMessage = computed(() => this.connectorState().validationError);\n /**\n * Text-only control backing the readonly trigger; `formControl` above holds the real keys.\n *\n * why: phải là một `FormControl` THẬT chứ không phải `[value]`. `MatInput.ngDoCheck` chỉ gọi\n * `updateErrorState()` khi có `NgControl` — không có nó thì `errorState` đứng yên ở `false`, mà\n * `<mat-error>`, viền đỏ và `aria-invalid` đều bám vào cờ đó, nên field bắt buộc bỏ trống lại im\n * lặng y như bug cũ. Trạng thái disabled cũng chảy qua control này (MatInput tự đồng bộ\n * `disabled` từ `ngControl` mỗi vòng CD, nên bind `[disabled]` trên template sẽ bị ghi đè).\n */\n readonly displayControl = new FormControl<string>('', { nonNullable: true });\n\n /**\n * why: MatInput đã có `NgControl`, nhưng control đó là ô TEXT — nó không biết gì về `required`\n * hay validator của tree-select. Matcher nối thẳng `errorState` của Material vào message đã gate\n * theo tương tác của connector.\n */\n readonly errorStateMatcher: ErrorStateMatcher = { isErrorState: () => !!this.visibleErrorMessage() };\n readonly draftKeys = signal<TKey[]>([]);\n readonly modelKeys = computed(() => normalizeTreeSelectKeys(this.model(), this.multiple()));\n readonly effectivePlaceholder = computed(() => this.placeholder() ?? this.#i18n.t('core.form.tree-select.placeholder'));\n readonly effectiveModalTitle = computed(() => this.modalTitle() ?? this.#i18n.t('core.form.tree-select.modal-title'));\n readonly loadedEntities = computed(() => {\n const tree = this.treeComponent();\n if (tree) return flattenNodes(tree.rootNodes()).map(node => node.data);\n const source = this.items();\n return Array.isArray(source) ? flattenItems(source).map(item => item.data) : [];\n });\n readonly selectedEntities = computed(() => this.#entitiesForKeys(this.modelKeys()));\n readonly draftEntities = computed(() => this.#entitiesForKeys(this.draftKeys()));\n readonly displayText = computed(() =>\n this.modelKeys()\n .map(key => {\n const item = this.loadedEntities().find(candidate => this.compareWith()(this.keyOf(candidate), key));\n return item ? this.displayEntity(item) : String(key);\n })\n .join(', ')\n );\n\n readonly treeOption = computed<SdTreeComponentOption<T>>(\n () =>\n ({\n autoId: this.autoId(),\n items: this.items(),\n tree: this.tree(),\n selectedItems: this.draftEntities(),\n itemTemplate: this.nodeTemplate()?.template,\n selector: {\n visible: true,\n single: !this.multiple(),\n cascade: this.cascade(),\n disabled: (item, selectedItems) => !!this.disabledNode()?.(item, selectedItems),\n },\n }) as SdTreeComponentOption<T>\n );\n\n constructor() {\n effect(() => {\n const text = this.displayText();\n void this.#state();\n const disabled = this.formControl.disabled;\n untracked(() => {\n if (this.displayControl.value !== text) this.displayControl.setValue(text, { emitEvent: false });\n if (disabled !== this.displayControl.disabled) {\n if (disabled) this.displayControl.disable({ emitEvent: false });\n else this.displayControl.enable({ emitEvent: false });\n }\n });\n });\n }\n\n open(event?: Event): void {\n if (this.formControl.disabled || this.readonly() || this.connectorState().isViewed) return;\n // why: Space trên <input readonly> không gõ được ký tự nào nhưng vẫn cuộn trang — chặn để\n // phím Space chỉ còn nghĩa \"mở popup\", đúng như trên trigger <button> trước đây.\n event?.preventDefault();\n this.draftKeys.set([...this.modelKeys()]);\n this.modal()?.open();\n }\n\n applySelection(): void {\n const keys = [...this.draftKeys()];\n const value: SdTreeSelectModel<TKey> = this.multiple() ? keys : (keys[0] ?? null);\n this.formControl.setValue(value);\n this.formControl.markAsDirty();\n this.formControl.markAsTouched();\n this.modal()?.close();\n }\n\n cancel(): void {\n this.modal()?.close();\n }\n\n clear(event?: Event): void {\n event?.stopPropagation();\n if (this.formControl.disabled || this.readonly()) return;\n this.formControl.setValue(this.multiple() ? [] : null);\n this.formControl.markAsDirty();\n this.formControl.markAsTouched();\n }\n\n onModalClosed(): void {\n queueMicrotask(() => this.trigger()?.nativeElement.focus());\n }\n\n onTreeSelection(event: SdTreeSelectionEvent<T>): void {\n const loadedKeys = this.loadedEntities().map(item => this.keyOf(item));\n const hiddenKeys = this.draftKeys().filter(key => !loadedKeys.some(value => this.compareWith()(value, key)));\n if (!this.multiple()) {\n this.draftKeys.set(event.selected ? [this.keyOf(event.item)] : []);\n return;\n }\n\n const selectedLoadedKeys = event.selectedItems.map(item => this.keyOf(item));\n this.draftKeys.set(dedupeKeys([...hiddenKeys, ...selectedLoadedKeys], this.compareWith()));\n }\n\n filter(value: string): void {\n this.treeComponent()?.filter(value);\n }\n\n retry(): void {\n this.treeComponent()?.retry();\n }\n\n keyOf(item: T): TKey {\n const selector = this.keySelector();\n if (selector) return selector(item);\n return readPath(item, this.valueField() as string | undefined) as TKey;\n }\n\n displayEntity(item: T): string {\n const selector = this.displayWith();\n if (selector) return selector(item);\n const value = readPath(item, this.displayField() as string | undefined);\n return value == null ? '' : String(value);\n }\n\n #entitiesForKeys(keys: readonly TKey[]): T[] {\n return keys\n .map(key => this.loadedEntities().find(item => this.compareWith()(this.keyOf(item), key)))\n .filter((item): item is T => item !== undefined);\n }\n}\n\nfunction flattenNodes<T>(nodes: readonly SdTreeNode<T>[]): SdTreeNode<T>[] {\n return nodes.flatMap(node => [node, ...flattenNodes(node.children)]);\n}\n\nfunction flattenItems<T>(items: readonly SdTreeItem<T>[]): SdTreeItem<T>[] {\n return items.flatMap(item => [item, ...flattenItems(item.children ?? [])]);\n}\n\nfunction dedupeKeys<TKey>(keys: readonly TKey[], compare: (left: TKey, right: TKey) => boolean): TKey[] {\n return keys.reduce<TKey[]>((result, key) => {\n if (!result.some(value => compare(value, key))) result.push(key);\n return result;\n }, []);\n}\n\nfunction readPath(value: unknown, path: string | undefined): unknown {\n if (!path) return value;\n return path.split('.').reduce<unknown>((current, segment) => {\n if (typeof current !== 'object' || current === null) return undefined;\n return (current as Record<string, unknown>)[segment];\n }, value);\n}\n\nexport function normalizeTreeSelectKeys<TKey>(value: SdTreeSelectModel<TKey>, multiple: boolean): TKey[] {\n if (value == null) return [];\n if (Array.isArray(value)) return multiple ? [...value] : value.slice(0, 1);\n return [value as TKey];\n}\n","@let _errorMessage = visibleErrorMessage();\n@let _label = label();\n@let _appearance = appearance();\n@let _required = required();\n@let _helperText = helperText();\n@let _hideInlineError = hideInlineError();\n@let _displayText = displayText();\n@let _size = size();\n@let _autoId = autoId();\n@let _disabled = formControl.disabled;\n@let _readonly = readonly();\n\n@if (connectorState().isViewed) {\n <sd-view data-tree-select-view [label]=\"_label\" [value]=\"model()\" [display]=\"_displayText\"></sd-view>\n} @else {\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 <mat-form-field\n [class.sd-md]=\"_size === 'md'\"\n [class.sd-sm]=\"_size === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\">\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 <!-- why: trigger là <input matInput readonly> chứ không phải <button>. Bản cũ tự dựng khung\n viền riêng nên lệch hẳn khỏi sd-select (chiều cao, bo góc, vị trí label, chỗ để message).\n Dùng chính mat-form-field + matInput thì tree-select ăn nguyên bộ shell của các control\n Material khác; `readonly` chặn gõ và chặn bàn phím ảo mobile, click/Enter/Space mở modal. -->\n <input\n #trigger\n matInput\n readonly\n type=\"text\"\n data-tree-select-trigger\n class=\"sd-tree-select__trigger\"\n [formControl]=\"displayControl\"\n [placeholder]=\"effectivePlaceholder()\"\n [required]=\"_required\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"modal()?.isOpened() ?? false\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.data-autoId]=\"_autoId\"\n [attr.data-disabled]=\"_disabled ? 'true' : 'false'\"\n [attr.data-invalid]=\"_errorMessage ? 'true' : 'false'\"\n [attr.data-empty]=\"_displayText ? 'false' : 'true'\"\n [attr.data-required]=\"_required ? 'true' : 'false'\"\n [attr.data-error-message]=\"_errorMessage ?? null\"\n (click)=\"open()\"\n (keydown.enter)=\"open($event)\"\n (keydown.space)=\"open($event)\" />\n\n @if (_hideInlineError && _errorMessage) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage) {\n <mat-error [id]=\"errorId\" data-tree-select-error>{{ _errorMessage }}</mat-error>\n }\n\n <!-- why: clear thay CHỖ của icon mở popup (giống sd-select đổi caret ↔ ×), nên chỉ một trong\n hai hiện. Icon `account_tree` là dấu hiệu duy nhất phân biệt với sd-select. -->\n @if (clearable() && modelKeys().length > 0 && !_required && !_disabled && !_readonly) {\n <button\n type=\"button\"\n class=\"sd-clear-btn\"\n matSuffix\n [attr.data-autoId]=\"_autoId ? _autoId + '-clear' : null\"\n [attr.aria-label]=\"'core.form.tree-select.clear' | sdTranslate\"\n [title]=\"'core.form.tree-select.clear' | sdTranslate\"\n (click)=\"clear($event)\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n } @else {\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix name=\"account_tree\"></sd-icon>\n }\n </mat-form-field>\n}\n\n<sd-modal [autoId]=\"autoId()\" [title]=\"effectiveModalTitle()\" width=\"md\" (sdClosed)=\"onModalClosed()\">\n <div class=\"sd-tree-select__body\">\n <sd-input\n class=\"sd-tree-select__search\"\n hideInlineError\n clearable\n [size]=\"_size\"\n [label]=\"'core.form.tree-select.search' | sdTranslate\"\n [autoId]=\"autoIdInput() ? autoIdInput() + '-search' : undefined\"\n (sdChange)=\"filter($any($event) ?? '')\"></sd-input>\n\n <div class=\"sd-tree-select__tree\">\n <sd-tree [option]=\"treeOption()\" (selectChange)=\"onTreeSelection($event)\" (loadError)=\"loadError.emit($event)\" />\n </div>\n </div>\n\n <sd-button\n sdFooterRight\n data-tree-select-cancel\n type=\"outline\"\n color=\"secondary\"\n [autoId]=\"autoIdInput() ? autoIdInput() + '-cancel' : undefined\"\n [title]=\"'core.form.tree-select.cancel' | sdTranslate\"\n (click)=\"cancel()\"></sd-button>\n <sd-button\n sdFooterRight\n data-tree-select-apply\n type=\"fill\"\n color=\"primary\"\n [autoId]=\"autoIdInput() ? autoIdInput() + '-apply' : undefined\"\n [title]=\"'core.form.tree-select.apply' | sdTranslate\"\n (click)=\"applySelection()\"></sd-button>\n</sd-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdCoerceFormGroup","ɵsdFormControlConnector"],"mappings":"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"}
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import { SdSuffixDefDirective, SdLabelDefDirective, SdViewDefDirective, SdItemDefDefDirective } from '@sdcorejs/angular/forms/directives';
|
|
1
2
|
export * from '@sdcorejs/angular/forms/directives';
|
|
2
3
|
export * from '@sdcorejs/angular/forms/models';
|
|
4
|
+
import { SdLabel } from '@sdcorejs/angular/forms/label';
|
|
3
5
|
export * from '@sdcorejs/angular/forms/label';
|
|
4
6
|
import { SdInput } from '@sdcorejs/angular/forms/input';
|
|
5
7
|
export * from '@sdcorejs/angular/forms/input';
|
|
8
|
+
import { SdInputColor } from '@sdcorejs/angular/forms/input-color';
|
|
6
9
|
export * from '@sdcorejs/angular/forms/input-color';
|
|
10
|
+
import { SdInlineText } from '@sdcorejs/angular/forms/inline-text';
|
|
7
11
|
export * from '@sdcorejs/angular/forms/inline-text';
|
|
8
12
|
import { SdInputNumber } from '@sdcorejs/angular/forms/input-number';
|
|
9
13
|
export * from '@sdcorejs/angular/forms/input-number';
|
|
10
14
|
import { SdDate } from '@sdcorejs/angular/forms/date';
|
|
11
15
|
export * from '@sdcorejs/angular/forms/date';
|
|
16
|
+
import { SdDatetime } from '@sdcorejs/angular/forms/datetime';
|
|
12
17
|
export * from '@sdcorejs/angular/forms/datetime';
|
|
13
18
|
import { SdDateRange } from '@sdcorejs/angular/forms/date-range';
|
|
14
19
|
export * from '@sdcorejs/angular/forms/date-range';
|
|
@@ -16,30 +21,79 @@ import { SdTime } from '@sdcorejs/angular/forms/time';
|
|
|
16
21
|
export * from '@sdcorejs/angular/forms/time';
|
|
17
22
|
import { SdTimeRange } from '@sdcorejs/angular/forms/time-range';
|
|
18
23
|
export * from '@sdcorejs/angular/forms/time-range';
|
|
19
|
-
import { SdEntityPicker } from '@sdcorejs/angular/forms/entity-picker';
|
|
24
|
+
import { SdEntityPicker, SdEntityPickerSelectedTemplateDirective, SdEntityPickerRowTemplateDirective, SdEntityPickerDetailTemplateDirective } from '@sdcorejs/angular/forms/entity-picker';
|
|
20
25
|
export * from '@sdcorejs/angular/forms/entity-picker';
|
|
21
|
-
import { SdTreeSelect } from '@sdcorejs/angular/forms/tree-select';
|
|
26
|
+
import { SdTreeSelect, SdTreeSelectNodeTemplateDirective } from '@sdcorejs/angular/forms/tree-select';
|
|
22
27
|
export * from '@sdcorejs/angular/forms/tree-select';
|
|
23
|
-
import { SdSelect } from '@sdcorejs/angular/forms/select';
|
|
28
|
+
import { SdSelect, SdSelectFooterActionDirective } from '@sdcorejs/angular/forms/select';
|
|
24
29
|
export * from '@sdcorejs/angular/forms/select';
|
|
25
30
|
import { SdAutocomplete } from '@sdcorejs/angular/forms/autocomplete';
|
|
26
31
|
export * from '@sdcorejs/angular/forms/autocomplete';
|
|
32
|
+
import { SdSwitch } from '@sdcorejs/angular/forms/switch';
|
|
27
33
|
export * from '@sdcorejs/angular/forms/switch';
|
|
28
34
|
import { SdRadio } from '@sdcorejs/angular/forms/radio';
|
|
29
35
|
export * from '@sdcorejs/angular/forms/radio';
|
|
30
36
|
import { SdTextarea } from '@sdcorejs/angular/forms/textarea';
|
|
31
37
|
export * from '@sdcorejs/angular/forms/textarea';
|
|
38
|
+
import { SdChip } from '@sdcorejs/angular/forms/chip';
|
|
32
39
|
export * from '@sdcorejs/angular/forms/chip';
|
|
40
|
+
import { SdChipCalendar } from '@sdcorejs/angular/forms/chip-calendar';
|
|
33
41
|
export * from '@sdcorejs/angular/forms/chip-calendar';
|
|
42
|
+
import { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';
|
|
34
43
|
export * from '@sdcorejs/angular/forms/checkbox';
|
|
35
44
|
import * as i0 from '@angular/core';
|
|
36
45
|
import { NgModule } from '@angular/core';
|
|
37
46
|
|
|
47
|
+
// why: mọi control standalone re-export từ `forms/index.ts` PHẢI có mặt ở đây. Trước đây module
|
|
48
|
+
// chỉ khai 12/20 control (thiếu datetime / checkbox / switch / chip / chip-calendar / input-color /
|
|
49
|
+
// inline-text / label), nên consumer dùng NgModule chỉ import `SdFormsModule` vẫn không compile
|
|
50
|
+
// được một nửa thư viện ("is not a known element") dù package đã export class. Danh sách này bám
|
|
51
|
+
// 1:1 theo `forms/index.ts` — thêm entry point mới thì phải thêm cả ở đây.
|
|
52
|
+
const SD_FORM_CONTROLS = [
|
|
53
|
+
SdLabel,
|
|
54
|
+
SdInput,
|
|
55
|
+
SdInputColor,
|
|
56
|
+
SdInlineText,
|
|
57
|
+
SdInputNumber,
|
|
58
|
+
SdDate,
|
|
59
|
+
SdDatetime,
|
|
60
|
+
SdDateRange,
|
|
61
|
+
SdTime,
|
|
62
|
+
SdTimeRange,
|
|
63
|
+
SdEntityPicker,
|
|
64
|
+
SdTreeSelect,
|
|
65
|
+
SdSelect,
|
|
66
|
+
SdAutocomplete,
|
|
67
|
+
SdSwitch,
|
|
68
|
+
SdRadio,
|
|
69
|
+
SdTextarea,
|
|
70
|
+
SdChip,
|
|
71
|
+
SdChipCalendar,
|
|
72
|
+
SdCheckbox,
|
|
73
|
+
];
|
|
74
|
+
// why: các directive projection (`sdViewDef`, `sdLabelDef`, `sdItemDef`, `sdSuffixDef`, footer
|
|
75
|
+
// action của select, template của entity-picker/tree-select) là một phần API của chính các control
|
|
76
|
+
// trên — không export thì consumer NgModule dựng được control nhưng không tuỳ biến được nội dung.
|
|
77
|
+
const SD_FORM_DIRECTIVES = [
|
|
78
|
+
SdSuffixDefDirective,
|
|
79
|
+
SdLabelDefDirective,
|
|
80
|
+
SdViewDefDirective,
|
|
81
|
+
SdItemDefDefDirective,
|
|
82
|
+
SdSelectFooterActionDirective,
|
|
83
|
+
SdEntityPickerSelectedTemplateDirective,
|
|
84
|
+
SdEntityPickerRowTemplateDirective,
|
|
85
|
+
SdEntityPickerDetailTemplateDirective,
|
|
86
|
+
SdTreeSelectNodeTemplateDirective,
|
|
87
|
+
];
|
|
38
88
|
class SdFormsModule {
|
|
39
89
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
40
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.21", ngImport: i0, type: SdFormsModule, imports: [
|
|
90
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.21", ngImport: i0, type: SdFormsModule, imports: [SdLabel,
|
|
91
|
+
SdInput,
|
|
92
|
+
SdInputColor,
|
|
93
|
+
SdInlineText,
|
|
41
94
|
SdInputNumber,
|
|
42
95
|
SdDate,
|
|
96
|
+
SdDatetime,
|
|
43
97
|
SdDateRange,
|
|
44
98
|
SdTime,
|
|
45
99
|
SdTimeRange,
|
|
@@ -47,10 +101,26 @@ class SdFormsModule {
|
|
|
47
101
|
SdTreeSelect,
|
|
48
102
|
SdSelect,
|
|
49
103
|
SdAutocomplete,
|
|
104
|
+
SdSwitch,
|
|
50
105
|
SdRadio,
|
|
51
|
-
SdTextarea
|
|
106
|
+
SdTextarea,
|
|
107
|
+
SdChip,
|
|
108
|
+
SdChipCalendar,
|
|
109
|
+
SdCheckbox, SdSuffixDefDirective,
|
|
110
|
+
SdLabelDefDirective,
|
|
111
|
+
SdViewDefDirective,
|
|
112
|
+
SdItemDefDefDirective,
|
|
113
|
+
SdSelectFooterActionDirective,
|
|
114
|
+
SdEntityPickerSelectedTemplateDirective,
|
|
115
|
+
SdEntityPickerRowTemplateDirective,
|
|
116
|
+
SdEntityPickerDetailTemplateDirective,
|
|
117
|
+
SdTreeSelectNodeTemplateDirective], exports: [SdLabel,
|
|
118
|
+
SdInput,
|
|
119
|
+
SdInputColor,
|
|
120
|
+
SdInlineText,
|
|
52
121
|
SdInputNumber,
|
|
53
122
|
SdDate,
|
|
123
|
+
SdDatetime,
|
|
54
124
|
SdDateRange,
|
|
55
125
|
SdTime,
|
|
56
126
|
SdTimeRange,
|
|
@@ -58,54 +128,29 @@ class SdFormsModule {
|
|
|
58
128
|
SdTreeSelect,
|
|
59
129
|
SdSelect,
|
|
60
130
|
SdAutocomplete,
|
|
131
|
+
SdSwitch,
|
|
61
132
|
SdRadio,
|
|
62
|
-
SdTextarea
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
133
|
+
SdTextarea,
|
|
134
|
+
SdChip,
|
|
135
|
+
SdChipCalendar,
|
|
136
|
+
SdCheckbox, SdSuffixDefDirective,
|
|
137
|
+
SdLabelDefDirective,
|
|
138
|
+
SdViewDefDirective,
|
|
139
|
+
SdItemDefDefDirective,
|
|
140
|
+
SdSelectFooterActionDirective,
|
|
141
|
+
SdEntityPickerSelectedTemplateDirective,
|
|
142
|
+
SdEntityPickerRowTemplateDirective,
|
|
143
|
+
SdEntityPickerDetailTemplateDirective,
|
|
144
|
+
SdTreeSelectNodeTemplateDirective] });
|
|
145
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdFormsModule, imports: [SD_FORM_CONTROLS] });
|
|
75
146
|
}
|
|
76
147
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdFormsModule, decorators: [{
|
|
77
148
|
type: NgModule,
|
|
78
149
|
args: [{
|
|
79
|
-
imports: [
|
|
80
|
-
SdInput,
|
|
81
|
-
SdInputNumber,
|
|
82
|
-
SdDate,
|
|
83
|
-
SdDateRange,
|
|
84
|
-
SdTime,
|
|
85
|
-
SdTimeRange,
|
|
86
|
-
SdEntityPicker,
|
|
87
|
-
SdTreeSelect,
|
|
88
|
-
SdSelect,
|
|
89
|
-
SdAutocomplete,
|
|
90
|
-
SdRadio,
|
|
91
|
-
SdTextarea,
|
|
92
|
-
],
|
|
150
|
+
imports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],
|
|
93
151
|
declarations: [],
|
|
94
152
|
providers: [],
|
|
95
|
-
exports: [
|
|
96
|
-
SdInput,
|
|
97
|
-
SdInputNumber,
|
|
98
|
-
SdDate,
|
|
99
|
-
SdDateRange,
|
|
100
|
-
SdTime,
|
|
101
|
-
SdTimeRange,
|
|
102
|
-
SdEntityPicker,
|
|
103
|
-
SdTreeSelect,
|
|
104
|
-
SdSelect,
|
|
105
|
-
SdAutocomplete,
|
|
106
|
-
SdRadio,
|
|
107
|
-
SdTextarea,
|
|
108
|
-
],
|
|
153
|
+
exports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],
|
|
109
154
|
}]
|
|
110
155
|
}] });
|
|
111
156
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-forms.mjs","sources":["../../../projects/sdcorejs-angular/forms/src/forms.module.ts","../../../projects/sdcorejs-angular/forms/sdcorejs-angular-forms.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdAutocomplete } from '@sdcorejs/angular/forms/autocomplete';\nimport { SdRadio } from '@sdcorejs/angular/forms/radio';\nimport { SdTextarea } from '@sdcorejs/angular/forms/textarea';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdTime } from '@sdcorejs/angular/forms/time';\nimport { SdTimeRange } from '@sdcorejs/angular/forms/time-range';\nimport {
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-forms.mjs","sources":["../../../projects/sdcorejs-angular/forms/src/forms.module.ts","../../../projects/sdcorejs-angular/forms/sdcorejs-angular-forms.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputColor } from '@sdcorejs/angular/forms/input-color';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdSelect, SdSelectFooterActionDirective } from '@sdcorejs/angular/forms/select';\nimport { SdAutocomplete } from '@sdcorejs/angular/forms/autocomplete';\nimport { SdRadio } from '@sdcorejs/angular/forms/radio';\nimport { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';\nimport { SdSwitch } from '@sdcorejs/angular/forms/switch';\nimport { SdChip } from '@sdcorejs/angular/forms/chip';\nimport { SdChipCalendar } from '@sdcorejs/angular/forms/chip-calendar';\nimport { SdTextarea } from '@sdcorejs/angular/forms/textarea';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdTime } from '@sdcorejs/angular/forms/time';\nimport { SdTimeRange } from '@sdcorejs/angular/forms/time-range';\nimport {\n SdEntityPicker,\n SdEntityPickerDetailTemplateDirective,\n SdEntityPickerRowTemplateDirective,\n SdEntityPickerSelectedTemplateDirective,\n} from '@sdcorejs/angular/forms/entity-picker';\nimport { SdTreeSelect, SdTreeSelectNodeTemplateDirective } from '@sdcorejs/angular/forms/tree-select';\nimport { SdItemDefDefDirective, SdLabelDefDirective, SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\n\n// why: mọi control standalone re-export từ `forms/index.ts` PHẢI có mặt ở đây. Trước đây module\n// chỉ khai 12/20 control (thiếu datetime / checkbox / switch / chip / chip-calendar / input-color /\n// inline-text / label), nên consumer dùng NgModule chỉ import `SdFormsModule` vẫn không compile\n// được một nửa thư viện (\"is not a known element\") dù package đã export class. Danh sách này bám\n// 1:1 theo `forms/index.ts` — thêm entry point mới thì phải thêm cả ở đây.\nconst SD_FORM_CONTROLS = [\n SdLabel,\n SdInput,\n SdInputColor,\n SdInlineText,\n SdInputNumber,\n SdDate,\n SdDatetime,\n SdDateRange,\n SdTime,\n SdTimeRange,\n SdEntityPicker,\n SdTreeSelect,\n SdSelect,\n SdAutocomplete,\n SdSwitch,\n SdRadio,\n SdTextarea,\n SdChip,\n SdChipCalendar,\n SdCheckbox,\n];\n\n// why: các directive projection (`sdViewDef`, `sdLabelDef`, `sdItemDef`, `sdSuffixDef`, footer\n// action của select, template của entity-picker/tree-select) là một phần API của chính các control\n// trên — không export thì consumer NgModule dựng được control nhưng không tuỳ biến được nội dung.\nconst SD_FORM_DIRECTIVES = [\n SdSuffixDefDirective,\n SdLabelDefDirective,\n SdViewDefDirective,\n SdItemDefDefDirective,\n SdSelectFooterActionDirective,\n SdEntityPickerSelectedTemplateDirective,\n SdEntityPickerRowTemplateDirective,\n SdEntityPickerDetailTemplateDirective,\n SdTreeSelectNodeTemplateDirective,\n];\n\n@NgModule({\n imports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],\n declarations: [],\n providers: [],\n exports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],\n})\nexport class SdFormsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA;AACA;AACA;AACA;AACA;AACA,MAAM,gBAAgB,GAAG;IACvB,OAAO;IACP,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,MAAM;IACN,UAAU;IACV,WAAW;IACX,MAAM;IACN,WAAW;IACX,cAAc;IACd,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,UAAU;CACX;AAED;AACA;AACA;AACA,MAAM,kBAAkB,GAAG;IACzB,oBAAoB;IACpB,mBAAmB;IACnB,kBAAkB;IAClB,qBAAqB;IACrB,6BAA6B;IAC7B,uCAAuC;IACvC,kCAAkC;IAClC,qCAAqC;IACrC,iCAAiC;CAClC;MAQY,aAAa,CAAA;wGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YA3CxB,OAAO;YACP,OAAO;YACP,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,MAAM;YACN,UAAU;YACV,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,QAAQ;YACR,OAAO;YACP,UAAU;YACV,MAAM;YACN,cAAc;AACd,YAAA,UAAU,EAOV,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,qBAAqB;YACrB,6BAA6B;YAC7B,uCAAuC;YACvC,kCAAkC;YAClC,qCAAqC;AACrC,YAAA,iCAAiC,aAlCjC,OAAO;YACP,OAAO;YACP,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,MAAM;YACN,UAAU;YACV,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,QAAQ;YACR,OAAO;YACP,UAAU;YACV,MAAM;YACN,cAAc;AACd,YAAA,UAAU,EAOV,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,qBAAqB;YACrB,6BAA6B;YAC7B,uCAAuC;YACvC,kCAAkC;YAClC,qCAAqC;YACrC,iCAAiC,CAAA,EAAA,CAAA;AAStB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YALX,gBAAgB,CAAA,EAAA,CAAA;;4FAKlB,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC;AACrD,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,OAAO,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC;AACtD,iBAAA;;;AC5ED;;AAEG;;;;"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
1
2
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { inject, PLATFORM_ID, isDevMode, Injectable } from '@angular/core';
|
|
3
4
|
import { I18nService } from '@sdcorejs/angular/i18n';
|
|
4
5
|
|
|
5
6
|
// Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại
|
|
6
7
|
// Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],
|
|
7
8
|
class SdGlobalErrorHandler {
|
|
8
9
|
#i18n = inject(I18nService);
|
|
10
|
+
// why: `window.confirm` / `window.location.reload` không tồn tại khi render trên server. Gọi
|
|
11
|
+
// thẳng sẽ làm CHÍNH ErrorHandler ném lỗi, và lỗi gốc bị che mất hoàn toàn.
|
|
12
|
+
#isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
|
|
9
13
|
constructor() { }
|
|
10
14
|
handleError(error) {
|
|
11
15
|
// Lấy message lỗi an toàn
|
|
@@ -22,14 +26,25 @@ class SdGlobalErrorHandler {
|
|
|
22
26
|
// Kiểm tra xem lỗi có chứa từ khóa nào không
|
|
23
27
|
const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));
|
|
24
28
|
if (isChunkError) {
|
|
25
|
-
|
|
29
|
+
// why: đây là log chẩn đoán dài dòng cho dev (dump nguyên message đã lowercase) và nhánh này
|
|
30
|
+
// đã có UI riêng — hộp thoại xác nhận tải lại. Gate theo dev mode là hợp lý.
|
|
31
|
+
if (isDevMode())
|
|
32
|
+
console.warn('=> Chunk Load error detected:', errorMessage);
|
|
33
|
+
// why: trên server không có gì để reload — thoát sớm để lỗi gốc vẫn nổi lên nguyên vẹn.
|
|
34
|
+
if (!this.#isBrowser)
|
|
35
|
+
return;
|
|
26
36
|
const wantReload = window.confirm(this.#i18n.t('core.handler.global-error.update-title') + '\n\n' + this.#i18n.t('core.handler.global-error.update-body'));
|
|
27
37
|
if (wantReload) {
|
|
28
38
|
window.location.reload();
|
|
29
39
|
}
|
|
30
40
|
}
|
|
31
41
|
else {
|
|
32
|
-
//
|
|
42
|
+
// why: KHÔNG gate `console.error` theo `isDevMode()`. Đăng ký `ErrorHandler` này là THAY THẾ
|
|
43
|
+
// ErrorHandler mặc định của Angular — thứ vốn luôn log. Gate lại thì bản production nuốt sạch
|
|
44
|
+
// mọi lỗi ứng dụng: không còn gì trong console, không còn gì cho công cụ thu thập log của
|
|
45
|
+
// trình duyệt, và bug production trở nên vô hình. Log lỗi chính là toàn bộ giá trị chẩn đoán
|
|
46
|
+
// của một ErrorHandler; muốn giấu thì là việc của app (thay ErrorHandler khác), không phải
|
|
47
|
+
// hành vi mặc định của thư viện.
|
|
33
48
|
console.error('Application error:', error);
|
|
34
49
|
}
|
|
35
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-handlers.mjs","sources":["../../../projects/sdcorejs-angular/handlers/global-error.handler.ts","../../../projects/sdcorejs-angular/handlers/sdcorejs-angular-handlers.ts"],"sourcesContent":["import { ErrorHandler, inject, Injectable } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n// Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại\n// Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],\n@Injectable()\nexport class SdGlobalErrorHandler implements ErrorHandler {\n readonly #i18n = inject(I18nService);\n\n constructor() {}\n\n handleError(error: any): void {\n // Lấy message lỗi an toàn\n const errorMessage = this.#extractErrorMessage(error);\n\n // Danh sách các từ khóa nhận diện lỗi mất file JS/Chunk\n // Cần bao gồm nhiều biến thể do trình duyệt/bundler khác nhau\n const chunkErrorSignatures = [\n 'Loading chunk', // Webpack cũ\n 'Importing a module script failed', // Một số trình duyệt\n 'Failed to fetch dynamically imported module', // <-- Lỗi bạn đang gặp (Angular mới/Vite/Esbuild)\n 'error loading dynamically imported module', // Firefox/Safari biến thể\n 'missing source map', // Đôi khi đi kèm\n ];\n\n // Kiểm tra xem lỗi có chứa từ khóa nào không\n const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));\n\n if (isChunkError) {\n console.warn('=> Chunk Load error detected:', errorMessage);\n\n const wantReload = window.confirm(\n this.#i18n.t('core.handler.global-error.update-title') + '\\n\\n' + this.#i18n.t('core.handler.global-error.update-body')\n );\n\n if (wantReload) {\n window.location.reload();\n }\n } else {\n // Log lỗi
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-handlers.mjs","sources":["../../../projects/sdcorejs-angular/handlers/global-error.handler.ts","../../../projects/sdcorejs-angular/handlers/sdcorejs-angular-handlers.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { ErrorHandler, inject, Injectable, isDevMode, PLATFORM_ID } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n// Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại\n// Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],\n@Injectable()\nexport class SdGlobalErrorHandler implements ErrorHandler {\n readonly #i18n = inject(I18nService);\n\n // why: `window.confirm` / `window.location.reload` không tồn tại khi render trên server. Gọi\n // thẳng sẽ làm CHÍNH ErrorHandler ném lỗi, và lỗi gốc bị che mất hoàn toàn.\n readonly #isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n constructor() {}\n\n handleError(error: any): void {\n // Lấy message lỗi an toàn\n const errorMessage = this.#extractErrorMessage(error);\n\n // Danh sách các từ khóa nhận diện lỗi mất file JS/Chunk\n // Cần bao gồm nhiều biến thể do trình duyệt/bundler khác nhau\n const chunkErrorSignatures = [\n 'Loading chunk', // Webpack cũ\n 'Importing a module script failed', // Một số trình duyệt\n 'Failed to fetch dynamically imported module', // <-- Lỗi bạn đang gặp (Angular mới/Vite/Esbuild)\n 'error loading dynamically imported module', // Firefox/Safari biến thể\n 'missing source map', // Đôi khi đi kèm\n ];\n\n // Kiểm tra xem lỗi có chứa từ khóa nào không\n const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));\n\n if (isChunkError) {\n // why: đây là log chẩn đoán dài dòng cho dev (dump nguyên message đã lowercase) và nhánh này\n // đã có UI riêng — hộp thoại xác nhận tải lại. Gate theo dev mode là hợp lý.\n if (isDevMode()) console.warn('=> Chunk Load error detected:', errorMessage);\n\n // why: trên server không có gì để reload — thoát sớm để lỗi gốc vẫn nổi lên nguyên vẹn.\n if (!this.#isBrowser) return;\n\n const wantReload = window.confirm(\n this.#i18n.t('core.handler.global-error.update-title') + '\\n\\n' + this.#i18n.t('core.handler.global-error.update-body')\n );\n\n if (wantReload) {\n window.location.reload();\n }\n } else {\n // why: KHÔNG gate `console.error` theo `isDevMode()`. Đăng ký `ErrorHandler` này là THAY THẾ\n // ErrorHandler mặc định của Angular — thứ vốn luôn log. Gate lại thì bản production nuốt sạch\n // mọi lỗi ứng dụng: không còn gì trong console, không còn gì cho công cụ thu thập log của\n // trình duyệt, và bug production trở nên vô hình. Log lỗi chính là toàn bộ giá trị chẩn đoán\n // của một ErrorHandler; muốn giấu thì là việc của app (thay ErrorHandler khác), không phải\n // hành vi mặc định của thư viện.\n console.error('Application error:', error);\n }\n }\n\n // Hàm phụ trợ để lấy text lỗi từ object error bất kỳ\n #extractErrorMessage = (error: any): string => {\n if (!error) return '';\n\n // Nếu là chuỗi\n if (typeof error === 'string') return error.toLowerCase();\n\n // Nếu là Error Object chuẩn\n if (error.message) return error.message.toLowerCase();\n\n // Nếu lỗi nằm trong rejection (Promise)\n if (error.rejection) {\n return typeof error.rejection === 'string' ? error.rejection.toLowerCase() : (error.rejection.message || '').toLowerCase();\n }\n return '';\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA;AACA;MAEa,oBAAoB,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;IAI3B,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAE5D,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,WAAW,CAAC,KAAU,EAAA;;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;;;AAIrD,QAAA,MAAM,oBAAoB,GAAG;AAC3B,YAAA,eAAe;AACf,YAAA,kCAAkC;AAClC,YAAA,6CAA6C;AAC7C,YAAA,2CAA2C;AAC3C,YAAA,oBAAoB;SACrB;;QAGD,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAE3G,IAAI,YAAY,EAAE;;;AAGhB,YAAA,IAAI,SAAS,EAAE;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC;;YAG5E,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE;YAEtB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CACxH;YAED,IAAI,UAAU,EAAE;AACd,gBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC1B;QACF;aAAO;;;;;;;AAOL,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;QAC5C;IACF;;AAGA,IAAA,oBAAoB,GAAG,CAAC,KAAU,KAAY;AAC5C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;;QAGrB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK,CAAC,WAAW,EAAE;;QAGzD,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;;AAGrD,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,WAAW,EAAE;QAC5H;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;wGAnEU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACND;;AAEG;;;;"}
|