@sd-angular/core 19.0.0-beta.99 → 19.0.3
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 +9 -11
- package/assets/images/coming-soon.svg +23 -0
- package/assets/images/data-empty.svg +21 -0
- package/assets/images/expired.svg +22 -0
- package/assets/images/file-error.svg +28 -0
- package/assets/images/filter-empty.svg +20 -0
- package/assets/images/filter-required.svg +21 -0
- package/assets/images/forbidden.svg +15 -0
- package/assets/images/image-error.svg +27 -0
- package/assets/images/maintenance.svg +23 -0
- package/assets/images/not-found.svg +20 -0
- package/assets/images/offline.svg +20 -0
- package/assets/images/submitted.svg +18 -0
- package/assets/images/success.svg +18 -0
- package/assets/images/unauthorized.svg +22 -0
- package/assets/images/unknown-error.svg +18 -0
- package/assets/scss/README.md +433 -353
- package/assets/scss/core/_inline-edit.scss +105 -0
- package/assets/scss/core/form.scss +58 -1
- package/assets/scss/core/image.scss +35 -0
- package/assets/scss/core/utilities/_base.scss +6 -6
- package/assets/scss/core/utilities/_grid.scss +4 -3
- package/assets/scss/core/utilities/_index.scss +1 -1
- package/assets/scss/core/utilities/_sizing.scss +2 -2
- package/assets/scss/sd-core.scss +1 -2
- package/components/autoid-inspector/src/autoid-inspector.component.d.ts +18 -0
- package/components/autoid-inspector/src/models/autoid-element.model.d.ts +45 -1
- package/components/autoid-inspector/src/models/autoid-export-format.model.d.ts +19 -0
- package/components/autoid-inspector/src/services/autoid-export.service.d.ts +10 -2
- package/components/autoid-inspector/src/services/autoid-scanner.service.d.ts +26 -3
- package/components/badge/src/badge.component.d.ts +20 -3
- package/components/button/src/button.component.d.ts +2 -1
- package/components/ckeditor-styles/index.d.ts +1 -0
- package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +25 -0
- package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +12 -13
- package/components/form-generic/src/models/form-generic-component.model.d.ts +5 -6
- package/components/form-generic/src/models/form-generic-expression.model.d.ts +1 -1
- package/components/history/models/history.model.d.ts +2 -2
- package/components/index.d.ts +2 -0
- package/components/inform/index.d.ts +2 -0
- package/components/inform/src/inform-action.directive.d.ts +9 -0
- package/components/inform/src/inform.component.d.ts +59 -0
- package/components/modal/src/modal.component.d.ts +2 -1
- package/components/modal-resizable/index.d.ts +1 -0
- package/components/modal-resizable/src/modal-resizable.component.d.ts +29 -0
- package/components/operator/index.d.ts +1 -0
- package/components/operator/src/operator.component.d.ts +34 -0
- package/components/query-bar/index.d.ts +2 -0
- package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +28 -0
- package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +67 -0
- package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +73 -0
- package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +37 -0
- package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +76 -0
- package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +67 -0
- package/components/query-bar/src/components/popover-chip/popover-chip.component.d.ts +35 -0
- package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +39 -0
- package/components/query-bar/src/query-bar.component.d.ts +137 -0
- package/components/query-bar/src/query-bar.model.d.ts +136 -0
- package/components/section/src/section.component.d.ts +2 -1
- package/components/stepper/index.d.ts +2 -0
- package/components/stepper/src/step.component.d.ts +17 -0
- package/components/stepper/src/stepper.component.d.ts +33 -0
- package/components/tab/index.d.ts +2 -0
- package/components/tab/src/tab-group.component.d.ts +37 -0
- package/components/tab/src/tab.component.d.ts +13 -0
- package/components/tab-router/src/decorators/tab.decorator.d.ts +2 -2
- package/components/tab-router/src/models/tab-router.model.d.ts +2 -2
- package/components/table/index.d.ts +1 -0
- package/components/table/src/components/column-title/column-title.component.d.ts +1 -1
- package/components/table/src/components/config/config.component.d.ts +3 -1
- package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +3 -3
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +3 -7
- package/components/table/src/components/selector-action/selector-action.component.d.ts +3 -1
- package/components/table/src/configurations/table.configuration.d.ts +3 -3
- package/components/table/src/directives/index.d.ts +1 -0
- package/components/table/src/directives/sd-table-cell-def.directive.d.ts +12 -4
- package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +12 -4
- package/components/table/src/directives/sd-table-expand-def.directive.d.ts +10 -4
- package/components/table/src/directives/sd-table-filter-def.directive.d.ts +3 -3
- package/components/table/src/directives/sd-table-footer-def.directive.d.ts +12 -4
- package/components/table/src/directives/sd-table-group-def.directive.d.ts +44 -0
- package/components/table/src/directives/sd-table-title-def.directive.d.ts +10 -4
- package/components/table/src/models/index.d.ts +1 -0
- package/components/table/src/models/table-column.model.d.ts +13 -13
- package/components/table/src/models/table-command.model.d.ts +3 -2
- package/components/table/src/models/table-item.model.d.ts +19 -4
- package/components/table/src/models/table-option-export.model.d.ts +3 -3
- package/components/table/src/models/table-option-group.model.d.ts +19 -2
- package/components/table/src/models/table-option-selector.model.d.ts +17 -1
- package/components/table/src/models/table-option-tree.model.d.ts +96 -8
- package/components/table/src/models/table-option.model.d.ts +11 -2
- package/components/table/src/pipes/sd-group.pipe.d.ts +15 -1
- package/components/table/src/services/table-filter/table-filter.model.d.ts +9 -9
- package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
- package/components/table/src/services/tree/tree.util.d.ts +43 -2
- package/components/table/src/table.component.d.ts +36 -11
- package/components/view/src/view.component.d.ts +35 -1
- package/directives/src/sd-desktop.directive.d.ts +2 -4
- package/directives/src/sd-mobile.directive.d.ts +2 -4
- package/fesm2022/sd-angular-core-components-anchor.mjs +75 -49
- package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-autoid-inspector.mjs +254 -29
- package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-avatar.mjs +2 -2
- package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-badge.mjs +18 -3
- package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs +2 -2
- package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-ckeditor-styles.mjs +38 -0
- package/fesm2022/sd-angular-core-components-ckeditor-styles.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-document-builder.mjs +10 -8
- package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-editor.mjs +3 -2
- package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-form-generic.mjs +149 -235
- package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-history.mjs +3 -2
- package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-inform.mjs +190 -0
- package/fesm2022/sd-angular-core-components-inform.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-mini-editor.mjs +4 -3
- package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-modal-resizable.mjs +158 -0
- package/fesm2022/sd-angular-core-components-modal-resizable.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-modal.mjs +2 -2
- package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-operator.mjs +77 -0
- package/fesm2022/sd-angular-core-components-operator.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-preview.mjs +4 -4
- package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-query-bar.mjs +1384 -0
- package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-quick-action.mjs +2 -2
- package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-side-drawer.mjs +2 -2
- package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-splitter.mjs +5 -2
- package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-stepper.mjs +140 -0
- package/fesm2022/sd-angular-core-components-stepper.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-tab-router.mjs +3 -3
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab.mjs +145 -0
- package/fesm2022/sd-angular-core-components-tab.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-table.mjs +576 -222
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs +23 -23
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-view.mjs +44 -9
- package/fesm2022/sd-angular-core-components-view.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components.mjs +2 -0
- package/fesm2022/sd-angular-core-components.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs +19 -21
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs +38 -14
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-checkbox.mjs +97 -87
- package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +92 -61
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip.mjs +89 -52
- package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date-range.mjs +63 -10
- package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date.mjs +39 -15
- package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +33 -14
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-directives.mjs +18 -24
- package/fesm2022/sd-angular-core-forms-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-inline-text.mjs +167 -0
- package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -0
- package/fesm2022/sd-angular-core-forms-input-color.mjs +119 -0
- package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -0
- package/fesm2022/sd-angular-core-forms-input-number.mjs +66 -14
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs +86 -29
- package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-models.mjs +44 -2
- package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-radio.mjs +130 -175
- package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +66 -23
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-switch.mjs +95 -98
- package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs +33 -12
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-i18n.mjs +65 -0
- package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-auth.mjs +4 -4
- package/fesm2022/sd-angular-core-modules-auth.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-authom.mjs +1 -1
- package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-layout.mjs +23 -23
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-permission.mjs +3 -3
- package/fesm2022/sd-angular-core-modules-permission.mjs.map +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs +2 -2
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-api.mjs +3 -3
- package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-cache.mjs +3 -2
- package/fesm2022/sd-angular-core-services-cache.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-excel.mjs +6 -5
- package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-notify.mjs +18 -5
- package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-storage.mjs +2 -2
- package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
- package/forms/autocomplete/src/autocomplete.component.d.ts +24 -10
- package/forms/checkbox/src/checkbox.component.d.ts +21 -20
- package/forms/chip/src/chip.component.d.ts +25 -20
- package/forms/chip-calendar/src/chip-calendar.component.d.ts +27 -22
- package/forms/date/src/date.component.d.ts +23 -9
- package/forms/date-range/src/date-range.component.d.ts +28 -5
- package/forms/datetime/src/datetime.component.d.ts +21 -8
- package/forms/directives/src/item-def.directive.d.ts +10 -5
- package/forms/directives/src/label-def.directive.d.ts +3 -2
- package/forms/directives/src/suffix-def.directive.d.ts +3 -2
- package/forms/directives/src/view-def.directive.d.ts +9 -9
- package/forms/inline-text/index.d.ts +1 -0
- package/forms/inline-text/src/inline-text.component.d.ts +76 -0
- package/forms/input/src/input.component.d.ts +31 -13
- package/forms/input-color/index.d.ts +1 -0
- package/forms/input-color/src/input-color.component.d.ts +34 -0
- package/forms/input-number/src/input-number.component.d.ts +25 -9
- package/forms/models/index.d.ts +1 -0
- package/forms/models/src/sd-custom-validator.model.d.ts +13 -1
- package/forms/models/src/sd-viewed.d.ts +38 -0
- package/forms/radio/src/radio.component.d.ts +37 -38
- package/forms/select/src/select.component.d.ts +36 -14
- package/forms/switch/src/switch.component.d.ts +22 -23
- package/forms/textarea/src/textarea.component.d.ts +18 -8
- package/i18n/src/en.d.ts +11 -0
- package/modules/auth/configurations/auth.configuration.d.ts +4 -4
- package/modules/layout/configurations/layout.configuration.d.ts +3 -3
- package/modules/permission/src/configurations/permission.configuration.d.ts +3 -3
- package/package.json +92 -56
- package/sd-angular-core-19.0.3.tgz +0 -0
- package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +3 -3
- package/services/confirm/src/lib/confirm.service.d.ts +9 -9
- package/services/notify/src/components/toast/toast.component.d.ts +4 -0
- package/utilities/models/src/icon.model.d.ts +1 -1
- package/assets/scss/bootstrap-4.6.2/_alert.scss +0 -52
- package/assets/scss/bootstrap-4.6.2/_badge.scss +0 -54
- package/assets/scss/bootstrap-4.6.2/_breadcrumb.scss +0 -42
- package/assets/scss/bootstrap-4.6.2/_button-group.scss +0 -163
- package/assets/scss/bootstrap-4.6.2/_buttons.scss +0 -142
- package/assets/scss/bootstrap-4.6.2/_card.scss +0 -286
- package/assets/scss/bootstrap-4.6.2/_carousel.scss +0 -200
- package/assets/scss/bootstrap-4.6.2/_close.scss +0 -40
- package/assets/scss/bootstrap-4.6.2/_code.scss +0 -48
- package/assets/scss/bootstrap-4.6.2/_custom-forms.scss +0 -526
- package/assets/scss/bootstrap-4.6.2/_dropdown.scss +0 -192
- package/assets/scss/bootstrap-4.6.2/_forms.scss +0 -347
- package/assets/scss/bootstrap-4.6.2/_functions.scss +0 -190
- package/assets/scss/bootstrap-4.6.2/_grid.scss +0 -73
- package/assets/scss/bootstrap-4.6.2/_images.scss +0 -42
- package/assets/scss/bootstrap-4.6.2/_input-group.scss +0 -211
- package/assets/scss/bootstrap-4.6.2/_jumbotron.scss +0 -17
- package/assets/scss/bootstrap-4.6.2/_list-group.scss +0 -154
- package/assets/scss/bootstrap-4.6.2/_media.scss +0 -8
- package/assets/scss/bootstrap-4.6.2/_mixins.scss +0 -47
- package/assets/scss/bootstrap-4.6.2/_modal.scss +0 -240
- package/assets/scss/bootstrap-4.6.2/_nav.scss +0 -125
- package/assets/scss/bootstrap-4.6.2/_navbar.scss +0 -332
- package/assets/scss/bootstrap-4.6.2/_pagination.scss +0 -74
- package/assets/scss/bootstrap-4.6.2/_popover.scss +0 -170
- package/assets/scss/bootstrap-4.6.2/_print.scss +0 -132
- package/assets/scss/bootstrap-4.6.2/_progress.scss +0 -47
- package/assets/scss/bootstrap-4.6.2/_reboot.scss +0 -484
- package/assets/scss/bootstrap-4.6.2/_root.scss +0 -19
- package/assets/scss/bootstrap-4.6.2/_spinners.scss +0 -65
- package/assets/scss/bootstrap-4.6.2/_tables.scss +0 -185
- package/assets/scss/bootstrap-4.6.2/_toasts.scss +0 -46
- package/assets/scss/bootstrap-4.6.2/_tooltip.scss +0 -115
- package/assets/scss/bootstrap-4.6.2/_transitions.scss +0 -26
- package/assets/scss/bootstrap-4.6.2/_type.scss +0 -125
- package/assets/scss/bootstrap-4.6.2/_utilities.scss +0 -18
- package/assets/scss/bootstrap-4.6.2/_variables.scss +0 -1150
- package/assets/scss/bootstrap-4.6.2/bootstrap-grid.scss +0 -30
- package/assets/scss/bootstrap-4.6.2/bootstrap-reboot.scss +0 -12
- package/assets/scss/bootstrap-4.6.2/bootstrap.scss +0 -44
- package/assets/scss/bootstrap-4.6.2/mixins/_alert.scss +0 -13
- package/assets/scss/bootstrap-4.6.2/mixins/_background-variant.scss +0 -23
- package/assets/scss/bootstrap-4.6.2/mixins/_badge.scss +0 -17
- package/assets/scss/bootstrap-4.6.2/mixins/_border-radius.scss +0 -76
- package/assets/scss/bootstrap-4.6.2/mixins/_box-shadow.scss +0 -20
- package/assets/scss/bootstrap-4.6.2/mixins/_breakpoints.scss +0 -123
- package/assets/scss/bootstrap-4.6.2/mixins/_buttons.scss +0 -110
- package/assets/scss/bootstrap-4.6.2/mixins/_caret.scss +0 -62
- package/assets/scss/bootstrap-4.6.2/mixins/_clearfix.scss +0 -7
- package/assets/scss/bootstrap-4.6.2/mixins/_deprecate.scss +0 -10
- package/assets/scss/bootstrap-4.6.2/mixins/_float.scss +0 -14
- package/assets/scss/bootstrap-4.6.2/mixins/_forms.scss +0 -195
- package/assets/scss/bootstrap-4.6.2/mixins/_gradients.scss +0 -45
- package/assets/scss/bootstrap-4.6.2/mixins/_grid-framework.scss +0 -80
- package/assets/scss/bootstrap-4.6.2/mixins/_grid.scss +0 -69
- package/assets/scss/bootstrap-4.6.2/mixins/_hover.scss +0 -37
- package/assets/scss/bootstrap-4.6.2/mixins/_image.scss +0 -36
- package/assets/scss/bootstrap-4.6.2/mixins/_list-group.scss +0 -21
- package/assets/scss/bootstrap-4.6.2/mixins/_lists.scss +0 -7
- package/assets/scss/bootstrap-4.6.2/mixins/_nav-divider.scss +0 -11
- package/assets/scss/bootstrap-4.6.2/mixins/_pagination.scss +0 -22
- package/assets/scss/bootstrap-4.6.2/mixins/_reset-text.scss +0 -17
- package/assets/scss/bootstrap-4.6.2/mixins/_resize.scss +0 -6
- package/assets/scss/bootstrap-4.6.2/mixins/_screen-reader.scss +0 -34
- package/assets/scss/bootstrap-4.6.2/mixins/_size.scss +0 -7
- package/assets/scss/bootstrap-4.6.2/mixins/_table-row.scss +0 -39
- package/assets/scss/bootstrap-4.6.2/mixins/_text-emphasis.scss +0 -17
- package/assets/scss/bootstrap-4.6.2/mixins/_text-hide.scss +0 -11
- package/assets/scss/bootstrap-4.6.2/mixins/_text-truncate.scss +0 -8
- package/assets/scss/bootstrap-4.6.2/mixins/_transition.scss +0 -26
- package/assets/scss/bootstrap-4.6.2/mixins/_visibility.scss +0 -8
- package/assets/scss/bootstrap-4.6.2/utilities/_align.scss +0 -8
- package/assets/scss/bootstrap-4.6.2/utilities/_background.scss +0 -19
- package/assets/scss/bootstrap-4.6.2/utilities/_borders.scss +0 -75
- package/assets/scss/bootstrap-4.6.2/utilities/_clearfix.scss +0 -3
- package/assets/scss/bootstrap-4.6.2/utilities/_display.scss +0 -26
- package/assets/scss/bootstrap-4.6.2/utilities/_embed.scss +0 -39
- package/assets/scss/bootstrap-4.6.2/utilities/_flex.scss +0 -51
- package/assets/scss/bootstrap-4.6.2/utilities/_float.scss +0 -11
- package/assets/scss/bootstrap-4.6.2/utilities/_interactions.scss +0 -5
- package/assets/scss/bootstrap-4.6.2/utilities/_overflow.scss +0 -5
- package/assets/scss/bootstrap-4.6.2/utilities/_position.scss +0 -32
- package/assets/scss/bootstrap-4.6.2/utilities/_screenreaders.scss +0 -11
- package/assets/scss/bootstrap-4.6.2/utilities/_shadows.scss +0 -6
- package/assets/scss/bootstrap-4.6.2/utilities/_sizing.scss +0 -20
- package/assets/scss/bootstrap-4.6.2/utilities/_spacing.scss +0 -73
- package/assets/scss/bootstrap-4.6.2/utilities/_stretched-link.scss +0 -19
- package/assets/scss/bootstrap-4.6.2/utilities/_text.scss +0 -72
- package/assets/scss/bootstrap-4.6.2/utilities/_visibility.scss +0 -13
- package/assets/scss/bootstrap-4.6.2/vendor/_rfs.scss +0 -228
- package/assets/scss/core/bootstrap.scss +0 -13
- package/components/table/index.d.ts.map +0 -1
- package/components/table/sd-angular-core-components-table.d.ts.map +0 -1
- package/components/table/src/components/column-title/column-title.component.d.ts.map +0 -1
- package/components/table/src/components/command/desktop-command.component.d.ts.map +0 -1
- package/components/table/src/components/command/pipes/command.pipe.d.ts.map +0 -1
- package/components/table/src/components/command/pipes/filter.pipe.d.ts.map +0 -1
- package/components/table/src/components/config/config.component.d.ts.map +0 -1
- package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts.map +0 -1
- package/components/table/src/components/desktop-cell/view/view.component.d.ts.map +0 -1
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts.map +0 -1
- package/components/table/src/components/filter/external-filter/external-filter.component.d.ts.map +0 -1
- package/components/table/src/components/filter/index.d.ts.map +0 -1
- package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts.map +0 -1
- package/components/table/src/components/index.d.ts.map +0 -1
- package/components/table/src/components/popup-export/popup-export.component.d.ts.map +0 -1
- package/components/table/src/components/selector-action/action-filter.pipe.d.ts.map +0 -1
- package/components/table/src/components/selector-action/selector-action.component.d.ts.map +0 -1
- package/components/table/src/configurations/index.d.ts.map +0 -1
- package/components/table/src/configurations/table.configuration.d.ts.map +0 -1
- package/components/table/src/directives/index.d.ts.map +0 -1
- package/components/table/src/directives/sd-column-resize.directive.d.ts.map +0 -1
- package/components/table/src/directives/sd-table-cell-def.directive.d.ts.map +0 -1
- package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts.map +0 -1
- package/components/table/src/directives/sd-table-expand-def.directive.d.ts.map +0 -1
- package/components/table/src/directives/sd-table-filter-def.directive.d.ts.map +0 -1
- package/components/table/src/directives/sd-table-footer-def.directive.d.ts.map +0 -1
- package/components/table/src/directives/sd-table-title-def.directive.d.ts.map +0 -1
- package/components/table/src/directives/sticky-shadow.directive.d.ts.map +0 -1
- package/components/table/src/models/index.d.ts.map +0 -1
- package/components/table/src/models/table-column.model.d.ts.map +0 -1
- package/components/table/src/models/table-command.model.d.ts.map +0 -1
- package/components/table/src/models/table-item.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-config.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-expand.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-export.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-group.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-paginate.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-reload.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-selector.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-sort.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-style.model.d.ts.map +0 -1
- package/components/table/src/models/table-option-tree.model.d.ts.map +0 -1
- package/components/table/src/models/table-option.model.d.ts.map +0 -1
- package/components/table/src/pipes/filter-values.pipe.d.ts.map +0 -1
- package/components/table/src/pipes/index.d.ts.map +0 -1
- package/components/table/src/pipes/sd-group.pipe.d.ts.map +0 -1
- package/components/table/src/pipes/sd-tree.pipe.d.ts.map +0 -1
- package/components/table/src/pipes/selection-disabled.pipe.d.ts.map +0 -1
- package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts.map +0 -1
- package/components/table/src/pipes/selection-visible.pipe.d.ts.map +0 -1
- package/components/table/src/services/column-width.util.d.ts.map +0 -1
- package/components/table/src/services/config.service.d.ts.map +0 -1
- package/components/table/src/services/index.d.ts.map +0 -1
- package/components/table/src/services/table-export/table-export.service.d.ts.map +0 -1
- package/components/table/src/services/table-filter/table-filter.model.d.ts.map +0 -1
- package/components/table/src/services/table-filter/table-filter.service.d.ts.map +0 -1
- package/components/table/src/services/table-format/table-format.service.d.ts.map +0 -1
- package/components/table/src/services/tree/tree.util.d.ts.map +0 -1
- package/components/table/src/table.component.d.ts.map +0 -1
- package/sd-angular-core-19.0.0-beta.99.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-upload-file.mjs","sources":["../../../projects/sd-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sd-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sd-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.html","../../../projects/sd-angular/components/upload-file/sd-angular-core-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Contract cấu hình cho cơ chế upload file của sd-angular.\r\n *\r\n * Cách dùng phổ biến:\r\n * - Portal có thể provide cấu hình mặc định ở tầng global.\r\n * - Mỗi module có thể provide thêm cấu hình riêng (thường với `multi: true`).\r\n * - Khi có nhiều cấu hình cùng lúc, dùng `key` để chọn đúng provider.\r\n *\r\n * Luồng xử lý:\r\n * 1) `upload`: upload file mới, trả về danh sách id/key.\r\n * 2) `details`: lấy metadata để render danh sách file từ id/key.\r\n * 3) `download` (optional): tải file theo id/key.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface ISdUploadFileConfiguration<TArgs = any> {\r\n /**\r\n * Định danh cấu hình upload.\r\n * Bắt buộc khi app có nhiều provider upload để tránh mapping nhầm.\r\n */\r\n key?: string;\r\n\r\n /** Upload file và trả về danh sách id/key dùng cho lưu trữ. */\r\n upload: SdUploadFileFuncUpload<TArgs>;\r\n\r\n /** Nhận danh sách id/key và trả về dữ liệu hiển thị file trong UI. */\r\n details: SdUploadFileFuncDetails<TArgs>;\r\n\r\n /** Tùy chọn: tải file về theo id/key. */\r\n download?: SdUploadFileFuncDownload<TArgs>;\r\n}\r\n\r\n/**\r\n * Token DI cho upload configuration.\r\n * Khuyến nghị provide dạng `multi: true` để hỗ trợ nhiều nguồn upload trong cùng app/module.\r\n */\r\nexport const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\r\n\r\n/** Hàm upload file và trả về danh sách id/key tương ứng. */\r\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\r\n\r\n/** Hàm lấy thông tin file phục vụ hiển thị từ danh sách id/key. */\r\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\r\n\r\n/** Hàm tải file theo id/key. */\r\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\r\n\r\nexport interface SdUploadFileDetail {\r\n /** Định danh file được backend trả về sau upload. */\r\n idOrKey: string;\r\n\r\n /** URL truy cập file (CDN hoặc direct URL). */\r\n cdn: string;\r\n\r\n /** Tên hiển thị file. */\r\n name?: string;\r\n\r\n /** Đuôi file: png, jpg, pdf... */\r\n extension?: string;\r\n\r\n /** Dung lượng file tính theo MB (nếu backend có trả về). */\r\n size?: number;\r\n}\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output, ViewChild, inject } from '@angular/core';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdModal } from '@sd-angular/core/components/modal';\r\nimport { PreviewFile } from '../../services';\r\nimport { MatIcon } from \"@angular/material/icon\";\r\nimport { I18nService, TranslatePipe } from '@sd-angular/core/i18n';\r\n\r\n@Component({\r\n selector: 'preview',\r\n templateUrl: './preview.component.html',\r\n styleUrl: './preview.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [SdModal, SdButton, CommonModule, MatIcon, TranslatePipe],\r\n})\r\nexport class PreviewComponent {\r\n @ViewChild(SdModal) modal!: SdModal;\r\n @Output() download = new EventEmitter<PreviewFile>();\r\n @Output() close = new EventEmitter<void>();\r\n\r\n readonly #i18n = inject(I18nService);\r\n title: string = this.#i18n.t('core.component.upload-file.preview-title');\r\n thumbnailPosition: 'right' | 'left' | 'bottom' | 'top' = 'right';\r\n activeIndex = 0;\r\n previewFiles: PreviewFile[] = [];\r\n constructor(private cd: ChangeDetectorRef) {}\r\n\r\n // Nên sử dụng urlOrFiles ở tham số khi open thay vì dùng @Input để component sử dụng sẽ chỉ cần map ở hàm khi gọi open thay vì phải mất công map mọi lúc để binding vào @Input\r\n open = async (previewFiles: PreviewFile[] | undefined | null, index?: number) => {\r\n if (!Array.isArray(previewFiles) || previewFiles.length === 0) {\r\n return;\r\n }\r\n this.previewFiles = previewFiles;\r\n this.activeIndex = index || 0;\r\n this.modal?.open();\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClickThumbnailImage = (index: number) => {\r\n this.activeIndex = index;\r\n this.cd.markForCheck();\r\n };\r\n\r\n updateCurrentImage = (direction: 1 | -1) => {\r\n this.activeIndex = (this.activeIndex + direction + this.previewFiles.length) % this.previewFiles.length;\r\n this.#scrollView(this.activeIndex, direction === 1 ? 'start' : 'end');\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClose = () => {\r\n this.close.emit();\r\n };\r\n\r\n #scrollView = (index: number, type?: 'center' | 'end' | 'nearest' | 'start') => {\r\n const nameId: string = 'thumbnailImage' + index;\r\n const element = document.getElementById(nameId);\r\n if (!element) {\r\n return;\r\n }\r\n const blockType: ScrollLogicalPosition = type || 'start';\r\n element.scrollIntoView({ behavior: 'smooth', block: blockType });\r\n };\r\n\r\n onDownload = (previewFile: PreviewFile) => {\r\n this.download.emit(previewFile);\r\n this.cd.markForCheck();\r\n };\r\n}\r\n","<sd-modal [title]=\"title\" (sdClosed)=\"close.emit()\" #modal>\r\n <div class=\"p-16\" style=\"overflow: hidden; height: 100%\">\r\n <div style=\"gap: 8px\" class=\"image-gallery\">\r\n <div class=\"thumbnail-container\">\r\n @for (file of previewFiles; track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n class=\"thumbnail-wrapper\"\r\n [class.c-img-error]=\"file.isImgError\"\r\n (click)=\"onClickThumbnailImage(i)\"\r\n [ngStyle]=\"{\r\n border: activeIndex === i ? '2px solid #2962ff' : 'none'\r\n }\">\r\n @if(file.isImgError) {\r\n <img fill alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else if (file.isPreviewImage && (file.previewSrc || file.src)) {\r\n <img fill [src]=\"file.previewSrc || file.src\" alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else {\r\n <img\r\n class=\"thumbnail-img file\"\r\n [class]=\"{\r\n png: file.extension === 'png',\r\n jpg: file.extension === 'jpg',\r\n pdf: file.extension === 'pdf',\r\n doc: file.extension === 'doc',\r\n docx: file.extension === 'docx',\r\n xls: file.extension === 'xls',\r\n xlsx: file.extension === 'xlsx',\r\n ppt: file.extension === 'ppt',\r\n pptx: file.extension === 'pptx',\r\n csv: file.extension === 'csv',\r\n psd: file.extension === 'psd',\r\n xml: file.extension === 'xml',\r\n zip: file.extension === 'zip'\r\n }\"\r\n alt=\"thumbnail\" />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div class=\"main-image-container\" #mainImage>\r\n @let selectedFile = previewFiles[activeIndex];\r\n @if(selectedFile) {\r\n @if(selectedFile.isImgError) {\r\n <div class=\"c-img-error\">\r\n <mat-icon>warning_amber</mat-icon>\r\n <div class=\"T14R\">{{ 'core.component.upload-file.error-occurred' | translate }}</div>\r\n </div>\r\n } @else if (selectedFile.isPreviewImage && (selectedFile.previewSrc || selectedFile.src)) {\r\n <img fill priority [src]=\"selectedFile.previewSrc || selectedFile.src\" class=\"main-image\" alt=\"Main display image\" />\r\n } @else {\r\n <img\r\n class=\"main-document file\"\r\n [class]=\"{\r\n png: selectedFile.extension === 'png',\r\n jpg: selectedFile.extension === 'jpg',\r\n pdf: selectedFile.extension === 'pdf',\r\n doc: selectedFile.extension === 'doc',\r\n docx: selectedFile.extension === 'docx',\r\n xls: selectedFile.extension === 'xls',\r\n xlsx: selectedFile.extension === 'xlsx',\r\n ppt: selectedFile.extension === 'ppt',\r\n pptx: selectedFile.extension === 'pptx',\r\n csv: selectedFile.extension === 'csv',\r\n psd: selectedFile.extension === 'psd',\r\n xml: selectedFile.extension === 'xml',\r\n zip: selectedFile.extension === 'zip'\r\n }\"\r\n alt=\"Main display image\" />\r\n @if(selectedFile.fileName) {\r\n <div class=\"T14M\">{{selectedFile.fileName}}</div>\r\n }\r\n <sd-button [title]=\"'core.component.upload-file.upload' | translate\" (click)=\"onDownload(selectedFile)\" type=\"fill\" color=\"primary\"></sd-button>\r\n }\r\n }\r\n <sd-button prefixIcon=\"arrow_forward_ios\" class=\"next-icon\" (click)=\"updateCurrentImage(1)\"></sd-button>\r\n <sd-button prefixIcon=\"arrow_back_ios_new\" class=\"back-icon\" (click)=\"updateCurrentImage(-1)\"></sd-button>\r\n </div>\r\n </div>\r\n </div>\r\n</sd-modal>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterImage',\r\n standalone: true,\r\n})\r\nexport class FilterImagePipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => e.isPreviewImage && (e.file || e.src));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterDocument',\r\n standalone: true,\r\n})\r\nexport class FilterDocumentPipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => !e.isPreviewImage || (!e.file && !e.src));\r\n }\r\n}\r\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'heic', 'heif'];\r\nexport const IsImage = (extension: string | undefined | null) => {\r\n if (!extension) {\r\n return false;\r\n }\r\n return IMAGE_EXTENSIONS.includes(extension?.toLowerCase());\r\n};\r\n\r\nexport interface PreviewFile {\r\n idOrKey?: string | number;\r\n file?: File | null;\r\n src?: string | null;\r\n previewSrc: string | ArrayBuffer | null;\r\n isPreviewImage: boolean; // Chỉ preview nếu là ảnh, ngoại trừ định dạng ảnh TIFF (fileType: TIFF hoặc mimeType: image/tiff) do thẻ img không hỗ trợ\r\n fileName?: string | null;\r\n fileSize?: number | null;\r\n extension?: string | null;\r\n isImgError?: boolean;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UploadFileService {\r\n #cache: Record<string, File> = {};\r\n\r\n #hash = (file: File) => {\r\n if (!file) {\r\n return null;\r\n }\r\n return SdUtilities.hash(file);\r\n };\r\n\r\n isHashedKey = (key: string) => {\r\n if (!key) {\r\n return false;\r\n }\r\n return !!this.#cache[key];\r\n };\r\n\r\n get = (key: string) => {\r\n if (!this.isHashedKey(key)) {\r\n return null;\r\n }\r\n return this.#cache[key];\r\n };\r\n\r\n add = (file: File) => {\r\n const key = this.#hash(file);\r\n if (key) {\r\n this.#cache[key] = file;\r\n }\r\n return key;\r\n };\r\n\r\n remove = (fileOrKey: File | string) => {\r\n if (!fileOrKey) {\r\n return;\r\n }\r\n if (typeof fileOrKey === 'string') {\r\n if (this.isHashedKey(fileOrKey)) {\r\n delete this.#cache[fileOrKey];\r\n }\r\n return;\r\n }\r\n const key = this.#hash(fileOrKey);\r\n if (key) {\r\n delete this.#cache[key];\r\n }\r\n };\r\n}\r\n","/* eslint-disable @angular-eslint/no-input-rename */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n contentChild,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n viewChildren\r\n} from '@angular/core';\r\nimport { FormGroup, NgForm } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\nimport { SdLabelDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdFormatNumberPipe } from '@sd-angular/core/pipes';\r\nimport { SdConfirmService, SdNotifyService } from '@sd-angular/core/services';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { sdIsEmpty } from '@sd-angular/core/utilities/data-state';\r\nimport * as uuid from 'uuid';\r\nimport { PreviewComponent } from './components/preview/preview.component';\r\nimport {\r\n ISdUploadFileConfiguration,\r\n SD_UPLOAD_FILE_CONFIGURATION,\r\n SdUploadFileDetail,\r\n SdUploadFileFuncDownload,\r\n SdUploadFileFuncDetails,\r\n SdUploadFileFuncUpload,\r\n} from './configurations';\r\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\r\nimport { IsImage, PreviewFile, UploadFileService } from './services';\r\nimport { I18nService, TranslatePipe } from '@sd-angular/core/i18n';\r\n\r\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\r\n@Component({\r\n selector: 'sd-upload-file',\r\n templateUrl: './upload-file.component.html',\r\n styleUrls: ['./upload-file.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n DragDropModule,\r\n SdLabel,\r\n PreviewComponent,\r\n FilterImagePipe,\r\n FilterDocumentPipe,\r\n SdFormatNumberPipe,\r\n MatProgressSpinner, TranslatePipe],\r\n})\r\nexport class SdUploadFile<TArgs = any> {\r\n // ─── Injected Services ────────────────────────────────────────────────\r\n readonly #notifyService = inject(SdNotifyService);\r\n readonly #confirmService = inject(SdConfirmService);\r\n readonly #configuration = inject<ISdUploadFileConfiguration | ISdUploadFileConfiguration[]>(\r\n SD_UPLOAD_FILE_CONFIGURATION,\r\n { optional: true }\r\n );\r\n readonly #uploadFileService = inject(UploadFileService);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #i18n = inject(I18nService);\r\n\r\n // ─── Internal State ───────────────────────────────────────────────────\r\n readonly id = `I${uuid.v4()}`;\r\n readonly #isMobileOrTablet = SdUtilities.isMobile();\r\n readonly #canvas1 = `C${uuid.v4()}`;\r\n readonly #canvas2 = `C${uuid.v4()}`;\r\n #name = uuid.v4();\r\n #formGroup?: FormGroup;\r\n\r\n readonly formControl = new SdFormControl();\r\n\r\n // ─── Signals (state) ──────────────────────────────────────────────────\r\n readonly previewFiles = signal<PreviewFile[]>([]);\r\n readonly selectedFile = signal<PreviewFile | null | undefined>(undefined);\r\n\r\n // ─── Query Signals ────────────────────────────────────────────────────\r\n readonly previewFileComponent = viewChild(PreviewComponent);\r\n readonly dropElements = viewChildren<ElementRef>('dropElement');\r\n readonly sdLabelDef = contentChild(SdLabelDefDirective);\r\n\r\n // ─── Input Signals ────────────────────────────────────────────────────\r\n // autoId prefix `upload-file-`. Mỗi nút remove dùng index-based suffix để ổn định khi filename trùng nhau.\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `components-upload-file-${this.autoIdInput()}` : undefined));\r\n readonly removeAutoId = (index: number): string | undefined =>\r\n (this.autoId() ? `${this.autoId()}-remove-${index}` : undefined);\r\n\r\n // ─── E2E data attributes ──────────────────────────────────────────────\r\n readonly dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'));\r\n readonly dataEmpty = computed(() => (sdIsEmpty(this.previewFiles()) ? 'true' : 'false'));\r\n readonly dataCount = computed(() => String(this.previewFiles()?.length ?? 0));\r\n\r\n readonly args = input<TArgs>();\r\n readonly label = input<string>();\r\n readonly key = input<string | undefined>(undefined);\r\n readonly description = input<string>();\r\n readonly previewWidth = input<string>('50px');\r\n readonly previewHeight = input<string>('50px');\r\n readonly align = input<'left' | 'center'>('left');\r\n readonly uploadInput = input<SdUploadFileFuncUpload<any> | undefined>(undefined, { alias: 'upload' });\r\n readonly details = input<SdUploadFileFuncDetails<any>>();\r\n readonly downloadInput = input<SdUploadFileFuncDownload<any> | undefined>(undefined, { alias: 'download' });\r\n readonly imageValidator = input<(image: HTMLImageElement) => string>();\r\n readonly maxSize = input<number>();\r\n readonly maxWidth = input<number>();\r\n readonly maxHeight = input<number>();\r\n readonly scaleToPixel = input<number>();\r\n\r\n // ─── Inputs with transform (null/undefined → default value) ─────────\r\n form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\r\n if (val instanceof NgForm) return val.form;\r\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\r\n if (val instanceof FormGroup) return val;\r\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n\r\n readonly nameInput = input<string, string | undefined>(uuid.v4(), {\r\n alias: 'name',\r\n transform: (val): string => val || uuid.v4(),\r\n });\r\n\r\n readonly required = input<boolean, boolean | '' | undefined | null>(false, {\r\n alias: 'required',\r\n transform: (val): boolean => val === '' || !!val,\r\n });\r\n\r\n readonly type = input<'image' | 'document' | 'file', 'image' | 'document' | 'file' | undefined | null>('file', {\r\n alias: 'type',\r\n transform: (val): 'image' | 'document' | 'file' => val || 'file',\r\n });\r\n\r\n readonly helperText = input<string | undefined>(undefined, { alias: 'helperText' });\r\n\r\n readonly max = input<number, number | undefined | null>(10, {\r\n alias: 'max',\r\n transform: (val): number => val ?? 10,\r\n });\r\n\r\n readonly maxOfImage = input<number, number | undefined | null>(3, {\r\n alias: 'maxOfImage',\r\n transform: (val): number => val ?? 3,\r\n });\r\n\r\n readonly extensions = input<string[], string[] | undefined | null>([], {\r\n alias: 'extensions',\r\n transform: (val): string[] => val?.filter(Boolean) ?? [],\r\n });\r\n\r\n readonly disabled = input<boolean, boolean | '' | undefined | null>(false, {\r\n alias: 'disabled',\r\n transform: (val): boolean => val === '' || !!val,\r\n });\r\n\r\n // ─── Computed ─────────────────────────────────────────────────────────\r\n readonly generatedDescription = computed(() => {\r\n const desc = this.description();\r\n if (desc) return desc;\r\n const exts = this.extensions();\r\n const maxSz = this.maxSize();\r\n if (exts.length && maxSz) {\r\n return this.#i18n.t('core.component.upload-file.desc-format-and-size', { exts: exts.join(', '), maxSize: maxSz });\r\n } else if (exts.length) {\r\n return this.#i18n.t('core.component.upload-file.desc-format', { exts: exts.join(', ') });\r\n } else if (maxSz) {\r\n return this.#i18n.t('core.component.upload-file.desc-max-size', { maxSize: maxSz });\r\n }\r\n return undefined;\r\n });\r\n\r\n // ─── Output Signals ───────────────────────────────────────────────────\r\n readonly loaded = output<PreviewFile[]>();\r\n readonly filesChanged = output<(string | File)[]>();\r\n\r\n // ─── Model Signal (two-way binding support: [(model)]) ────────────────\r\n readonly model = model<(string | number)[]>([]);\r\n\r\n constructor() {\r\n this.#validateDuplicateConfigurationKeys();\r\n\r\n // Sync form group & register form control\r\n afterNextRender(() => {\r\n this.#formGroup = this.form();\r\n this.#name = this.nameInput();\r\n this.#formGroup?.addControl(this.#name, this.formControl);\r\n\r\n // Drag & drop setup\r\n if (!this.#isMobileOrTablet) {\r\n this.#setupDropContainer();\r\n }\r\n });\r\n\r\n // Reactive sync for model changes\r\n effect(() => {\r\n const values = this.model() || [];\r\n this.formControl.setValue(values);\r\n\r\n if (Array.isArray(values)) {\r\n this.#details(values).then(previewFiles => {\r\n this.previewFiles.set(previewFiles);\r\n this.filesChanged.emit(\r\n this.previewFiles()\r\n .map(e => e.file || e.idOrKey || e.src)\r\n .filter(val => !!val) as (string | File)[]\r\n );\r\n this.#preview();\r\n });\r\n } else {\r\n this.previewFiles.set([]);\r\n }\r\n });\r\n\r\n // Reactive disabled state via effect (runs whenever disabled input changes)\r\n effect(() => {\r\n if (this.disabled()) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n });\r\n\r\n // Cleanup on destroy\r\n this.#destroyRef.onDestroy(() => {\r\n this.#revokePreviewBlobURLs();\r\n this.#formGroup?.removeControl(this.#name);\r\n });\r\n }\r\n\r\n\r\n // ─── Drop container setup ─────────────────────────────────────────────\r\n #setupDropContainer() {\r\n const dropEls = this.dropElements();\r\n if (dropEls?.length > 0) {\r\n const dropContainer = dropEls[0].nativeElement;\r\n this.#bindDropEvents(dropContainer);\r\n }\r\n }\r\n\r\n #bindDropEvents(dropContainer: HTMLElement) {\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n (dropContainer as any).style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', () => {\r\n (dropContainer as any).style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n (dropContainer as any).style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n const files: File[] = [];\r\n for (const file of evt.dataTransfer?.files || []) {\r\n files.push(file);\r\n }\r\n await this.#uploadFile(files);\r\n });\r\n }\r\n\r\n // ─── Private Methods ──────────────────────────────────────────────────\r\n #touch = () => {\r\n this.formControl.markAsTouched();\r\n this.formControl.setValue(this.model() || []);\r\n };\r\n\r\n #getConfigurations = (): ISdUploadFileConfiguration[] => {\r\n const config = this.#configuration;\r\n if (!config) {\r\n return [];\r\n }\r\n return Array.isArray(config) ? config : [config];\r\n };\r\n\r\n #validateDuplicateConfigurationKeys = (): void => {\r\n const configurations = this.#getConfigurations();\r\n if (!configurations.length) {\r\n return;\r\n }\r\n\r\n const seen = new Set<string>();\r\n for (const configuration of configurations) {\r\n const key = configuration.key;\r\n const normalizedKey = key === undefined ? '__undefined__' : key;\r\n if (seen.has(normalizedKey)) {\r\n const label = key === undefined ? 'undefined' : key;\r\n throw new Error(`[sd-upload-file] Duplicate upload configuration key detected: ${label}`);\r\n }\r\n seen.add(normalizedKey);\r\n }\r\n };\r\n\r\n #getSelectedConfiguration = (): ISdUploadFileConfiguration | undefined => {\r\n const configurations = this.#getConfigurations();\r\n if (!configurations.length) {\r\n return undefined;\r\n }\r\n const key = this.key();\r\n return configurations.find(configuration => configuration.key === key);\r\n };\r\n\r\n #getUploadHandler = (): SdUploadFileFuncUpload<any> | undefined => {\r\n return this.uploadInput() || this.#getSelectedConfiguration()?.upload;\r\n };\r\n\r\n #getDetailsHandler = (): SdUploadFileFuncDetails<any> | undefined => {\r\n return this.details() || this.#getSelectedConfiguration()?.details;\r\n };\r\n\r\n #getDownloadHandler = (): SdUploadFileFuncDownload<any> | undefined => {\r\n return this.downloadInput() || this.#getSelectedConfiguration()?.download;\r\n };\r\n\r\n // #updateValidator = () => {\r\n // this.formControl.clearValidators();\r\n // this.formControl.clearAsyncValidators();\r\n // const validators: ValidatorFn[] = [];\r\n // const asyncValidators: AsyncValidatorFn[] = [];\r\n // if (this.required()) {\r\n // validators.push(Validators.required);\r\n // }\r\n // this.formControl.setValidators(validators);\r\n // this.formControl.setAsyncValidators(asyncValidators);\r\n // this.formControl.updateValueAndValidity();\r\n // };\r\n\r\n\r\n #validate = async (file: File): Promise<string | null> => {\r\n if (this.type() === 'image') {\r\n if (file.type.split('/')[0] !== 'image') {\r\n return this.#i18n.t('core.component.upload-file.not-image', { name: file.name });\r\n }\r\n }\r\n const exts = this.extensions();\r\n if (exts?.length) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n if (!exts.some(e => e.toUpperCase() === extension.toUpperCase())) {\r\n return this.#i18n.t('core.component.upload-file.invalid-format', { name: file.name, exts: exts.join(', ') });\r\n }\r\n }\r\n const maxSz = this.maxSize();\r\n if (maxSz) {\r\n if (maxSz * 1024 * 1024 < file.size) {\r\n return this.#i18n.t('core.component.upload-file.size-exceeded', { name: file.name, maxSize: maxSz });\r\n }\r\n }\r\n if (this.type() === 'image' && (this.maxWidth() || this.maxHeight() || this.imageValidator())) {\r\n const message: string | null = await new Promise(resolve => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n const mw = this.maxWidth();\r\n const mh = this.maxHeight();\r\n const imgVal = this.imageValidator();\r\n if (mw && img.width > mw) {\r\n resolve(`[${file.name}] Max image width ${mw}px`);\r\n return;\r\n }\r\n if (mh && img.height > mh) {\r\n resolve(`[${file.name}] Max image height ${mh}px`);\r\n return;\r\n }\r\n if (imgVal) {\r\n resolve(imgVal(img));\r\n return;\r\n }\r\n resolve(null);\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n if (message) {\r\n return message;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n #preview = () => {\r\n for (const previewFile of this.previewFiles().filter(e => e.file)) {\r\n const reader = new FileReader();\r\n reader.onload = evt => {\r\n previewFile.previewSrc = evt.target!.result;\r\n previewFile.isPreviewImage =\r\n previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\r\n // trigger signal update\r\n this.previewFiles.set([...this.previewFiles()]);\r\n };\r\n reader.readAsDataURL(previewFile.file!);\r\n }\r\n };\r\n\r\n // ─── Public Event Handlers ────────────────────────────────────────────\r\n onUpload = () => {\r\n SdUtilities.upload({\r\n maxSizeInMb: this.maxSize(),\r\n extensions: this.extensions(),\r\n multiple: this.max() > 1,\r\n })\r\n .then(async result => {\r\n if (result) {\r\n if (Array.isArray(result)) {\r\n await this.#uploadFile(result);\r\n } else {\r\n await this.#uploadFile([result]);\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n console.error(error);\r\n this.#notifyService.error(error?.message || this.#i18n.t('core.component.upload-file.upload-failed'));\r\n });\r\n };\r\n\r\n #uploadFile = async (originFiles: File[]) => {\r\n const currentModel = [...(this.model() || [])];\r\n if (originFiles.length + currentModel.length > this.max()) {\r\n this.#notifyService.warning(this.#i18n.t('core.component.upload-file.too-many-files'));\r\n return;\r\n }\r\n for (let file of originFiles) {\r\n const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\r\n if (isImage && (this.scaleToPixel() ?? 0) > 0) {\r\n file = await this.#resize(file!);\r\n }\r\n const message = await this.#validate(file!);\r\n if (message) {\r\n this.#notifyService.warning(message);\r\n return;\r\n }\r\n const hashedKey = this.#uploadFileService.add(file);\r\n if (hashedKey) {\r\n currentModel.push(hashedKey);\r\n }\r\n }\r\n this.model.set(currentModel);\r\n this.#touch();\r\n };\r\n\r\n onRemove = (file: PreviewFile) => {\r\n const files = this.previewFiles();\r\n const idx = files.indexOf(file);\r\n if (idx >= 0) {\r\n this.#confirmService\r\n .confirm(this.#i18n.t('core.component.upload-file.confirm-delete-message'), {\r\n title: this.#i18n.t('core.component.upload-file.confirm-delete-title'),\r\n yesTitle: this.#i18n.t('core.component.upload-file.confirm-yes'),\r\n noTitle: this.#i18n.t('core.component.upload-file.confirm-no'),\r\n yesButtonColor: 'primary',\r\n noButtonColor: 'primary',\r\n })\r\n .then(() => {\r\n const updated = [...files];\r\n updated.splice(idx, 1);\r\n this.previewFiles.set(updated);\r\n const currentModel = [...(this.model() || [])];\r\n currentModel.splice(idx, 1);\r\n this.model.set(currentModel);\r\n this.filesChanged.emit(\r\n this.previewFiles()\r\n .map(e => e.file || e.idOrKey || e.src)\r\n .filter(val => !!val) as (string | File)[]\r\n );\r\n this.#touch();\r\n });\r\n }\r\n };\r\n\r\n onDrop = (event: CdkDragDrop<string[]>) => {\r\n const currentModel = [...(this.model() || [])];\r\n moveItemInArray(currentModel, event.previousIndex, event.currentIndex);\r\n this.model.set(currentModel);\r\n this.#touch();\r\n };\r\n\r\n onImgError = (previewFile: PreviewFile) => {\r\n previewFile.isImgError = true;\r\n this.previewFiles.set([...this.previewFiles()]);\r\n };\r\n\r\n onSelect = (file: PreviewFile) => {\r\n if (!this.#isMobileOrTablet) {\r\n return;\r\n }\r\n this.selectedFile.set(this.selectedFile() !== file ? file : null);\r\n };\r\n\r\n // ─── Resize ───────────────────────────────────────────────────────────\r\n #resize = async (file: File): Promise<File> => {\r\n if (!this.scaleToPixel()) {\r\n return file;\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n return file;\r\n }\r\n return await new Promise((resolve, reject) => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n try {\r\n if (img.width * img.height <= this.scaleToPixel()!) {\r\n return resolve(file);\r\n }\r\n const canvas1 = document.createElement('canvas');\r\n canvas1.setAttribute('id', this.#canvas1);\r\n const ctx1 = canvas1.getContext('2d');\r\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel()!);\r\n canvas1.width = width;\r\n canvas1.height = height;\r\n\r\n const canvas2 = document.createElement('canvas');\r\n canvas2.setAttribute('id', this.#canvas2);\r\n const ctx2 = canvas2.getContext('2d');\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\r\n ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\r\n ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\r\n canvas1.toBlob(blob => {\r\n resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\r\n });\r\n } catch (err) {\r\n reject(err);\r\n } finally {\r\n document.getElementById(this.#canvas1)?.remove();\r\n document.getElementById(this.#canvas2)?.remove();\r\n }\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n };\r\n\r\n #scale = (width: number, height: number, scaleToPixcel: number) => {\r\n if (!width || !height || !scaleToPixcel) {\r\n return { width, height };\r\n }\r\n const ratio = width / height;\r\n for (let i = 0; i < width; i++) {\r\n width -= i;\r\n height = Math.trunc(width / ratio);\r\n if (width * height <= scaleToPixcel) {\r\n break;\r\n }\r\n }\r\n return { width, height };\r\n };\r\n\r\n #blobToFile = (blob: Blob, fileName: string): File => {\r\n const temp: any = blob;\r\n temp.lastModifiedDate = new Date();\r\n temp.name = fileName;\r\n return blob as File;\r\n };\r\n\r\n // ─── Public API ───────────────────────────────────────────────────────\r\n /**\r\n * Lấy danh sách các File từ previewFiles (chưa upload).\r\n */\r\n getFiles = async () => {\r\n const items = this.previewFiles()?.filter(val => !!val) || [];\r\n return items.map(e => e?.file).filter(file => !!file);\r\n };\r\n\r\n /**\r\n * Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys.\r\n * HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER.\r\n */\r\n upload = async () => {\r\n const items = this.previewFiles()?.filter(val => !!val) || [];\r\n if (!Array.isArray(items)) {\r\n this.model.set([]);\r\n return;\r\n }\r\n const results: (string | number)[] = [];\r\n const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\r\n let idOrKeys: string[] = [];\r\n if (uploadedFiles.length) {\r\n const uploadHandler = this.#getUploadHandler();\r\n if (uploadHandler) {\r\n idOrKeys = await uploadHandler(uploadedFiles, this.args()).then(results => {\r\n for (const uploadedFile of uploadedFiles) {\r\n this.#uploadFileService.remove(uploadedFile);\r\n }\r\n return results;\r\n });\r\n } else {\r\n const key = this.key();\r\n this.#notifyService.error(\r\n key === undefined\r\n ? this.#i18n.t('core.component.upload-file.no-configuration')\r\n : this.#i18n.t('core.component.upload-file.no-configuration-key', { key })\r\n );\r\n }\r\n }\r\n let idx = 0;\r\n for (const item of items) {\r\n if (!item.file) {\r\n if (item.idOrKey) {\r\n results.push(item.idOrKey);\r\n }\r\n } else {\r\n if (idOrKeys?.[idx]) {\r\n results.push(idOrKeys[idx]);\r\n idx++;\r\n }\r\n }\r\n }\r\n this.model.set(results);\r\n };\r\n\r\n /**\r\n * Mở popup preview ảnh.\r\n */\r\n preview = async () => {\r\n this.previewFileComponent()?.open(this.previewFiles());\r\n };\r\n\r\n /**\r\n * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\r\n * * Ưu tiên:\r\n * 1. Tải xuống từ thuộc tính `file`.\r\n * 2. Tải xuống từ thuộc tính `src`.\r\n * 3. Gọi hàm download dựa vào `idOrKey`.\r\n *\r\n * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\r\n */\r\n onDownload = (previewFile: PreviewFile) => {\r\n if (previewFile.file || previewFile.src) {\r\n SdUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\r\n return;\r\n }\r\n if (previewFile.idOrKey) {\r\n this.#getDownloadHandler()?.(previewFile.idOrKey, this.args());\r\n return;\r\n }\r\n console.error('Invalid preview file', previewFile);\r\n };\r\n\r\n isLastVisibleOverlay(fileIndex: number): boolean {\r\n return this.formControl.disabled && fileIndex === this.maxOfImage() - 1 && this.previewFiles().length > this.maxOfImage();\r\n }\r\n\r\n // ─── Details ──────────────────────────────────────────────────────────\r\n /**\r\n * Khi binding model, đầu vào thường là id/key/cdn,\r\n * cần render ra ảnh/tệp tương ứng.\r\n */\r\n #details = async (keys: (string | number)[]) => {\r\n if (!Array.isArray(keys) || !keys.length) {\r\n return [];\r\n }\r\n const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\r\n let detailsList: SdUploadFileDetail[] = [];\r\n const detailsHandler = this.#getDetailsHandler();\r\n if (idOrKeys.length && detailsHandler) {\r\n detailsList = await detailsHandler(idOrKeys, this.args()).catch(error => {\r\n console.error(error);\r\n return [];\r\n });\r\n }\r\n const results: PreviewFile[] = [];\r\n for (const key of keys.filter(val => !!val)) {\r\n if (this.#isCdn(key)) {\r\n const cdn = key?.toString();\r\n const extension = this.#getExtension(cdn);\r\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: cdn,\r\n fileName: cdn,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n } else if (this.#isHashedKey(key)) {\r\n const hashedKey = key?.toString();\r\n const file = this.#uploadFileService.get(hashedKey)!;\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\r\n results.push({\r\n file,\r\n isPreviewImage,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n extension,\r\n });\r\n } else {\r\n const detail = detailsList.find(e => e.idOrKey === key);\r\n if (detail) {\r\n const { idOrKey, cdn, name, size } = detail;\r\n const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\r\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: idOrKey || cdn,\r\n fileName: name,\r\n fileSize: size,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n }\r\n }\r\n }\r\n return results;\r\n };\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────\r\n #isCdn = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') return false;\r\n return idOrKey.startsWith('http');\r\n };\r\n\r\n #isHashedKey = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') return false;\r\n return this.#uploadFileService.isHashedKey(idOrKey);\r\n };\r\n\r\n #getExtension = (cdn: string | undefined) => {\r\n if (!cdn) return undefined;\r\n const baseSrc = cdn?.split?.('?')?.[0];\r\n const lastDot = baseSrc?.lastIndexOf?.('.');\r\n if (lastDot > 0) {\r\n return baseSrc.substring(lastDot + 1);\r\n }\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\r\n * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\r\n */\r\n #revokePreviewBlobURLs = (): void => {\r\n const files = this.previewFiles();\r\n if (!Array.isArray(files) || !files?.length) return;\r\n files.forEach(p => {\r\n if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.previewSrc);\r\n }\r\n if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.src);\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\r\n @if (!!sdLabelDef()?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef()?.templateRef!\"> </ng-container>\r\n } @else if (label()) {\r\n <sd-label [label]=\"label()!\" [description]=\"generatedDescription()\" [helperText]=\"helperText()\" [required]=\"required()\"></sd-label>\r\n }\r\n <div\r\n cdkDropList\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"d-flex\"\r\n [class.justify-content-center]=\"align() === 'center'\"\r\n [class.justify-content-start]=\"align() === 'left'\">\r\n @if (previewFiles().length < max() && !formControl.disabled) {\r\n <div\r\n class=\"d-flex justify-content-center align-items-center cursor-pointer c-area-upload\"\r\n [style.width]=\"previewWidth()\"\r\n [style.height]=\"previewHeight()\"\r\n (click)=\"onUpload()\"\r\n aria-hidden=\"true\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-count]=\"dataCount()\"\r\n #dropElement>\r\n <mat-icon class=\"c-upload\" fontSet=\"material-icons-outlined\"> file_upload </mat-icon>\r\n </div>\r\n }\r\n @let previewImages = previewFiles() | filterImage;\r\n @for (image of previewImages; track $index; let idx = $index) {\r\n @if (!formControl.disabled || idx < maxOfImage()) {\r\n <div class=\"c-area c-view\" [class.c-loading]=\"!image.previewSrc && !image.src\" [class.c-area-error]=\"image.isImgError\" [style.width]=\"previewWidth()\" [style.height]=\"previewHeight()\" cdkDrag>\r\n <div class=\"c-drag-placeholder\" [style.width]=\"previewWidth()\" [style.height]=\"previewHeight()\" *cdkDragPlaceholder></div>\r\n <div *cdkDragPreview [style]=\"{ width: previewWidth(), height: previewHeight() }\" class=\"c-drag-preview\">\r\n <div class=\"c-container\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"c-preview\">\r\n <div\r\n class=\"c-img-container\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n [class.c-selected]=\"selectedFile() === image\"\r\n [class.has-overlay]=\"idx === maxOfImage() - 1 && formControl.disabled\"\r\n (click)=\"onSelect(image)\"\r\n aria-hidden=\"true\">\r\n @if (image.isImgError) {\r\n <img class=\"c-img-error\" alt=\"Image Error\" [style.max-height]=\"previewHeight()\" />\r\n } @else if(image.previewSrc) {\r\n <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"previewHeight()\" (error)=\"onImgError(image)\" />\r\n } @else if(image.src) {\r\n <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"previewHeight()\" (error)=\"onImgError(image)\" />\r\n } @else {\r\n <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\r\n }\r\n @if (idx === maxOfImage() - 1 && formControl.disabled && previewImages.length > maxOfImage()) {\r\n <div class=\"c-overlay-count\" (click)=\"preview()\">\r\n <div class=\"c-overlay-text\">+{{ previewImages.length - maxOfImage() }}</div>\r\n </div>\r\n }\r\n <div class=\"c-action\">\r\n <mat-icon class=\"c-zoom\" fontSet=\"material-icons-outlined\" (click)=\"preview()\">zoom_in</mat-icon>\r\n </div>\r\n @if (!formControl.disabled) {\r\n <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\" [attr.data-autoId]=\"removeAutoId(idx)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n @let previewDocuments = previewFiles() | filterDocument;\r\n @for (document of previewDocuments; track $index; let docIdx = $index) {\r\n <div class=\"c-document-container\">\r\n <img\r\n [style.max-height]=\"previewHeight()\"\r\n class=\"c-document-image\"\r\n [class]=\"{\r\n png: document.extension === 'png',\r\n jpg: document.extension === 'jpg',\r\n pdf: document.extension === 'pdf',\r\n doc: document.extension === 'doc',\r\n docx: document.extension === 'docx',\r\n xls: document.extension === 'xls',\r\n xlsx: document.extension === 'xlsx',\r\n ppt: document.extension === 'ppt',\r\n pptx: document.extension === 'pptx',\r\n csv: document.extension === 'csv',\r\n psd: document.extension === 'psd',\r\n xml: document.extension === 'xml',\r\n zip: document.extension === 'zip',\r\n tiff: document.extension === 'tiff'\r\n }\"\r\n alt=\"Preview\" />\r\n <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\r\n @if (document.fileSize) {\r\n <span class=\"T12R text-black400\"> - </span>\r\n <span class=\"T12R text-black400 flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\r\n }\r\n\r\n @if (!formControl.disabled) {\r\n <mat-icon class=\"c-close\" (click)=\"onRemove(document)\" [attr.data-autoId]=\"removeAutoId(docIdx)\">close</mat-icon>\r\n }\r\n </div>\r\n }\r\n @if (!formControl.disabled && formControl.touched && formControl.errors?.['required']) {\r\n <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ ('core.component.upload-file.please-upload' | translate) }}</div>\r\n }\r\n</div>\r\n<preview (download)=\"onDownload($event)\"></preview>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SdUtilities"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-upload-file.mjs","sources":["../../../projects/sd-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sd-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sd-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.html","../../../projects/sd-angular/components/upload-file/sd-angular-core-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Contract cấu hình cho cơ chế upload file của sd-angular.\r\n *\r\n * Cách dùng phổ biến:\r\n * - Portal có thể provide cấu hình mặc định ở tầng global.\r\n * - Mỗi module có thể provide thêm cấu hình riêng (thường với `multi: true`).\r\n * - Khi có nhiều cấu hình cùng lúc, dùng `key` để chọn đúng provider.\r\n *\r\n * Luồng xử lý:\r\n * 1) `upload`: upload file mới, trả về danh sách id/key.\r\n * 2) `details`: lấy metadata để render danh sách file từ id/key.\r\n * 3) `download` (optional): tải file theo id/key.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface ISdUploadFileConfiguration<TArgs = any> {\r\n /**\r\n * Định danh cấu hình upload.\r\n * Bắt buộc khi app có nhiều provider upload để tránh mapping nhầm.\r\n */\r\n key?: string;\r\n\r\n /** Upload file và trả về danh sách id/key dùng cho lưu trữ. */\r\n upload: SdUploadFileFuncUpload<TArgs>;\r\n\r\n /** Nhận danh sách id/key và trả về dữ liệu hiển thị file trong UI. */\r\n details: SdUploadFileFuncDetails<TArgs>;\r\n\r\n /** Tùy chọn: tải file về theo id/key. */\r\n download?: SdUploadFileFuncDownload<TArgs>;\r\n}\r\n\r\n/**\r\n * Token DI cho upload configuration.\r\n * Khuyến nghị provide dạng `multi: true` để hỗ trợ nhiều nguồn upload trong cùng app/module.\r\n */\r\nexport const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\r\n\r\n/** Hàm upload file và trả về danh sách id/key tương ứng. */\r\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\r\n\r\n/** Hàm lấy thông tin file phục vụ hiển thị từ danh sách id/key. */\r\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\r\n\r\n/** Hàm tải file theo id/key. */\r\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\r\n\r\nexport interface SdUploadFileDetail {\r\n /** Định danh file được backend trả về sau upload. */\r\n idOrKey: string;\r\n\r\n /** URL truy cập file (CDN hoặc direct URL). */\r\n cdn: string;\r\n\r\n /** Tên hiển thị file. */\r\n name?: string;\r\n\r\n /** Đuôi file: png, jpg, pdf... */\r\n extension?: string;\r\n\r\n /** Dung lượng file tính theo MB (nếu backend có trả về). */\r\n size?: number;\r\n}\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output, ViewChild, inject } from '@angular/core';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdModal } from '@sd-angular/core/components/modal';\r\nimport { PreviewFile } from '../../services';\r\nimport { MatIcon } from \"@angular/material/icon\";\r\nimport { I18nService, TranslatePipe } from '@sd-angular/core/i18n';\r\n\r\n@Component({\r\n selector: 'preview',\r\n templateUrl: './preview.component.html',\r\n styleUrl: './preview.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [SdModal, SdButton, CommonModule, MatIcon, TranslatePipe],\r\n})\r\nexport class PreviewComponent {\r\n @ViewChild(SdModal) modal!: SdModal;\r\n @Output() download = new EventEmitter<PreviewFile>();\r\n @Output() close = new EventEmitter<void>();\r\n\r\n readonly #i18n = inject(I18nService);\r\n title: string = this.#i18n.t('core.component.upload-file.preview-title');\r\n thumbnailPosition: 'right' | 'left' | 'bottom' | 'top' = 'right';\r\n activeIndex = 0;\r\n previewFiles: PreviewFile[] = [];\r\n constructor(private cd: ChangeDetectorRef) {}\r\n\r\n // Nên sử dụng urlOrFiles ở tham số khi open thay vì dùng @Input để component sử dụng sẽ chỉ cần map ở hàm khi gọi open thay vì phải mất công map mọi lúc để binding vào @Input\r\n open = async (previewFiles: PreviewFile[] | undefined | null, index?: number) => {\r\n if (!Array.isArray(previewFiles) || previewFiles.length === 0) {\r\n return;\r\n }\r\n this.previewFiles = previewFiles;\r\n this.activeIndex = index || 0;\r\n this.modal?.open();\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClickThumbnailImage = (index: number) => {\r\n this.activeIndex = index;\r\n this.cd.markForCheck();\r\n };\r\n\r\n updateCurrentImage = (direction: 1 | -1) => {\r\n this.activeIndex = (this.activeIndex + direction + this.previewFiles.length) % this.previewFiles.length;\r\n this.#scrollView(this.activeIndex, direction === 1 ? 'start' : 'end');\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClose = () => {\r\n this.close.emit();\r\n };\r\n\r\n #scrollView = (index: number, type?: 'center' | 'end' | 'nearest' | 'start') => {\r\n const nameId: string = 'thumbnailImage' + index;\r\n const element = document.getElementById(nameId);\r\n if (!element) {\r\n return;\r\n }\r\n const blockType: ScrollLogicalPosition = type || 'start';\r\n element.scrollIntoView({ behavior: 'smooth', block: blockType });\r\n };\r\n\r\n onDownload = (previewFile: PreviewFile) => {\r\n this.download.emit(previewFile);\r\n this.cd.markForCheck();\r\n };\r\n}\r\n","<sd-modal [title]=\"title\" (sdClosed)=\"close.emit()\" #modal>\r\n <div class=\"p-16\" style=\"overflow: hidden; height: 100%\">\r\n <div style=\"gap: 8px\" class=\"image-gallery\">\r\n <div class=\"thumbnail-container\">\r\n @for (file of previewFiles; track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n class=\"thumbnail-wrapper\"\r\n [class.c-image-error]=\"file.isImgError\"\r\n (click)=\"onClickThumbnailImage(i)\"\r\n [ngStyle]=\"{\r\n border: activeIndex === i ? '2px solid #2962ff' : 'none'\r\n }\">\r\n @if(file.isImgError) {\r\n <img fill alt=\"thumbnail\" class=\"thumbnail-img sd-image-image-error\" style=\"width: 24px; height: 24px; justify-self: center;\" />\r\n } @else if (file.isPreviewImage && (file.previewSrc || file.src)) {\r\n <img fill [src]=\"file.previewSrc || file.src\" alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else {\r\n <img\r\n class=\"thumbnail-img file\"\r\n [class]=\"{\r\n png: file.extension === 'png',\r\n jpg: file.extension === 'jpg',\r\n pdf: file.extension === 'pdf',\r\n doc: file.extension === 'doc',\r\n docx: file.extension === 'docx',\r\n xls: file.extension === 'xls',\r\n xlsx: file.extension === 'xlsx',\r\n ppt: file.extension === 'ppt',\r\n pptx: file.extension === 'pptx',\r\n csv: file.extension === 'csv',\r\n psd: file.extension === 'psd',\r\n xml: file.extension === 'xml',\r\n zip: file.extension === 'zip'\r\n }\"\r\n alt=\"thumbnail\" />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div class=\"main-image-container\" #mainImage>\r\n @let selectedFile = previewFiles[activeIndex];\r\n @if(selectedFile) {\r\n @if(selectedFile.isImgError) {\r\n <div class=\"c-image-error\">\r\n <mat-icon>warning_amber</mat-icon>\r\n <div class=\"T14R\">{{ 'core.component.upload-file.error-occurred' | translate }}</div>\r\n </div>\r\n } @else if (selectedFile.isPreviewImage && (selectedFile.previewSrc || selectedFile.src)) {\r\n <img fill priority [src]=\"selectedFile.previewSrc || selectedFile.src\" class=\"main-image\" alt=\"Main display image\" />\r\n } @else {\r\n <img\r\n class=\"main-document file\"\r\n [class]=\"{\r\n png: selectedFile.extension === 'png',\r\n jpg: selectedFile.extension === 'jpg',\r\n pdf: selectedFile.extension === 'pdf',\r\n doc: selectedFile.extension === 'doc',\r\n docx: selectedFile.extension === 'docx',\r\n xls: selectedFile.extension === 'xls',\r\n xlsx: selectedFile.extension === 'xlsx',\r\n ppt: selectedFile.extension === 'ppt',\r\n pptx: selectedFile.extension === 'pptx',\r\n csv: selectedFile.extension === 'csv',\r\n psd: selectedFile.extension === 'psd',\r\n xml: selectedFile.extension === 'xml',\r\n zip: selectedFile.extension === 'zip'\r\n }\"\r\n alt=\"Main display image\" />\r\n @if(selectedFile.fileName) {\r\n <div class=\"T14M\">{{selectedFile.fileName}}</div>\r\n }\r\n <sd-button [title]=\"'core.component.upload-file.upload' | translate\" (click)=\"onDownload(selectedFile)\" type=\"fill\" color=\"primary\"></sd-button>\r\n }\r\n }\r\n <sd-button prefixIcon=\"arrow_forward_ios\" class=\"next-icon\" (click)=\"updateCurrentImage(1)\"></sd-button>\r\n <sd-button prefixIcon=\"arrow_back_ios_new\" class=\"back-icon\" (click)=\"updateCurrentImage(-1)\"></sd-button>\r\n </div>\r\n </div>\r\n </div>\r\n</sd-modal>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterImage',\r\n standalone: true,\r\n})\r\nexport class FilterImagePipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => e.isPreviewImage && (e.file || e.src));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterDocument',\r\n standalone: true,\r\n})\r\nexport class FilterDocumentPipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => !e.isPreviewImage || (!e.file && !e.src));\r\n }\r\n}\r\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'heic', 'heif'];\r\nexport const IsImage = (extension: string | undefined | null) => {\r\n if (!extension) {\r\n return false;\r\n }\r\n return IMAGE_EXTENSIONS.includes(extension?.toLowerCase());\r\n};\r\n\r\nexport interface PreviewFile {\r\n idOrKey?: string | number;\r\n file?: File | null;\r\n src?: string | null;\r\n previewSrc: string | ArrayBuffer | null;\r\n isPreviewImage: boolean; // Chỉ preview nếu là ảnh, ngoại trừ định dạng ảnh TIFF (fileType: TIFF hoặc mimeType: image/tiff) do thẻ img không hỗ trợ\r\n fileName?: string | null;\r\n fileSize?: number | null;\r\n extension?: string | null;\r\n isImgError?: boolean;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Utilities } from '@sdcorejs/utils/fns';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UploadFileService {\r\n #cache: Record<string, File> = {};\r\n\r\n #hash = (file: File) => {\r\n if (!file) {\r\n return null;\r\n }\r\n return Utilities.hash(file);\r\n };\r\n\r\n isHashedKey = (key: string) => {\r\n if (!key) {\r\n return false;\r\n }\r\n return !!this.#cache[key];\r\n };\r\n\r\n get = (key: string) => {\r\n if (!this.isHashedKey(key)) {\r\n return null;\r\n }\r\n return this.#cache[key];\r\n };\r\n\r\n add = (file: File) => {\r\n const key = this.#hash(file);\r\n if (key) {\r\n this.#cache[key] = file;\r\n }\r\n return key;\r\n };\r\n\r\n remove = (fileOrKey: File | string) => {\r\n if (!fileOrKey) {\r\n return;\r\n }\r\n if (typeof fileOrKey === 'string') {\r\n if (this.isHashedKey(fileOrKey)) {\r\n delete this.#cache[fileOrKey];\r\n }\r\n return;\r\n }\r\n const key = this.#hash(fileOrKey);\r\n if (key) {\r\n delete this.#cache[key];\r\n }\r\n };\r\n}\r\n","/* eslint-disable @angular-eslint/no-input-rename */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n contentChild,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n viewChildren\r\n} from '@angular/core';\r\nimport { FormGroup, NgForm, Validators } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\nimport { SdLabelDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdFormatNumberPipe } from '@sd-angular/core/pipes';\r\nimport { SdConfirmService, SdNotifyService } from '@sd-angular/core/services';\r\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\r\nimport { sdIsEmpty } from '@sd-angular/core/utilities/data-state';\r\nimport * as uuid from 'uuid';\r\nimport { PreviewComponent } from './components/preview/preview.component';\r\nimport {\r\n ISdUploadFileConfiguration,\r\n SD_UPLOAD_FILE_CONFIGURATION,\r\n SdUploadFileDetail,\r\n SdUploadFileFuncDownload,\r\n SdUploadFileFuncDetails,\r\n SdUploadFileFuncUpload,\r\n} from './configurations';\r\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\r\nimport { IsImage, PreviewFile, UploadFileService } from './services';\r\nimport { I18nService, TranslatePipe } from '@sd-angular/core/i18n';\r\n\r\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\r\n@Component({\r\n selector: 'sd-upload-file',\r\n templateUrl: './upload-file.component.html',\r\n styleUrls: ['./upload-file.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n DragDropModule,\r\n SdLabel,\r\n PreviewComponent,\r\n FilterImagePipe,\r\n FilterDocumentPipe,\r\n SdFormatNumberPipe,\r\n MatProgressSpinner, TranslatePipe],\r\n})\r\nexport class SdUploadFile<TArgs = any> {\r\n // ─── Injected Services ────────────────────────────────────────────────\r\n readonly #notifyService = inject(SdNotifyService);\r\n readonly #confirmService = inject(SdConfirmService);\r\n readonly #configuration = inject<ISdUploadFileConfiguration | ISdUploadFileConfiguration[]>(\r\n SD_UPLOAD_FILE_CONFIGURATION,\r\n { optional: true }\r\n );\r\n readonly #uploadFileService = inject(UploadFileService);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #i18n = inject(I18nService);\r\n\r\n // ─── Internal State ───────────────────────────────────────────────────\r\n readonly id = `I${uuid.v4()}`;\r\n readonly #isMobileOrTablet = BrowserUtilities.isMobile();\r\n readonly #canvas1 = `C${uuid.v4()}`;\r\n readonly #canvas2 = `C${uuid.v4()}`;\r\n #name = uuid.v4();\r\n #formGroup?: FormGroup;\r\n\r\n readonly formControl = new SdFormControl();\r\n\r\n // ─── Signals (state) ──────────────────────────────────────────────────\r\n readonly previewFiles = signal<PreviewFile[]>([]);\r\n readonly selectedFile = signal<PreviewFile | null | undefined>(undefined);\r\n\r\n // ─── Query Signals ────────────────────────────────────────────────────\r\n readonly previewFileComponent = viewChild(PreviewComponent);\r\n readonly dropElements = viewChildren<ElementRef>('dropElement');\r\n readonly sdLabelDef = contentChild(SdLabelDefDirective);\r\n\r\n // ─── Input Signals ────────────────────────────────────────────────────\r\n // autoId prefix `upload-file-`. Mỗi nút remove dùng index-based suffix để ổn định khi filename trùng nhau.\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `components-upload-file-${this.autoIdInput()}` : undefined));\r\n readonly removeAutoId = (index: number): string | undefined =>\r\n (this.autoId() ? `${this.autoId()}-remove-${index}` : undefined);\r\n\r\n // ─── E2E data attributes ──────────────────────────────────────────────\r\n readonly dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'));\r\n readonly dataEmpty = computed(() => (sdIsEmpty(this.previewFiles()) ? 'true' : 'false'));\r\n readonly dataCount = computed(() => String(this.previewFiles()?.length ?? 0));\r\n\r\n readonly args = input<TArgs>();\r\n readonly label = input<string>();\r\n readonly key = input<string | undefined>(undefined);\r\n readonly description = input<string>();\r\n readonly previewWidth = input<string>('50px');\r\n readonly previewHeight = input<string>('50px');\r\n readonly align = input<'left' | 'center'>('left');\r\n readonly uploadInput = input<SdUploadFileFuncUpload<any> | undefined>(undefined, { alias: 'upload' });\r\n readonly details = input<SdUploadFileFuncDetails<any>>();\r\n readonly downloadInput = input<SdUploadFileFuncDownload<any> | undefined>(undefined, { alias: 'download' });\r\n readonly imageValidator = input<(image: HTMLImageElement) => string>();\r\n readonly maxSize = input<number>();\r\n readonly maxWidth = input<number>();\r\n readonly maxHeight = input<number>();\r\n readonly scaleToPixel = input<number>();\r\n\r\n // ─── Inputs with transform (null/undefined → default value) ─────────\r\n form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\r\n if (val instanceof NgForm) return val.form;\r\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\r\n if (val instanceof FormGroup) return val;\r\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n\r\n readonly nameInput = input<string, string | undefined>(uuid.v4(), {\r\n alias: 'name',\r\n transform: (val): string => val || uuid.v4(),\r\n });\r\n\r\n readonly required = input<boolean, boolean | '' | undefined | null>(false, {\r\n alias: 'required',\r\n transform: (val): boolean => val === '' || !!val,\r\n });\r\n\r\n readonly type = input<'image' | 'document' | 'file', 'image' | 'document' | 'file' | undefined | null>('file', {\r\n alias: 'type',\r\n transform: (val): 'image' | 'document' | 'file' => val || 'file',\r\n });\r\n\r\n readonly helperText = input<string | undefined>(undefined, { alias: 'helperText' });\r\n\r\n readonly max = input<number, number | undefined | null>(10, {\r\n alias: 'max',\r\n transform: (val): number => val ?? 10,\r\n });\r\n\r\n readonly maxOfImage = input<number, number | undefined | null>(3, {\r\n alias: 'maxOfImage',\r\n transform: (val): number => val ?? 3,\r\n });\r\n\r\n readonly extensions = input<string[], string[] | undefined | null>([], {\r\n alias: 'extensions',\r\n transform: (val): string[] => val?.filter(Boolean) ?? [],\r\n });\r\n\r\n readonly disabled = input<boolean, boolean | '' | undefined | null>(false, {\r\n alias: 'disabled',\r\n transform: (val): boolean => val === '' || !!val,\r\n });\r\n\r\n // ─── Computed ─────────────────────────────────────────────────────────\r\n readonly generatedDescription = computed(() => {\r\n const desc = this.description();\r\n if (desc) return desc;\r\n const exts = this.extensions();\r\n const maxSz = this.maxSize();\r\n if (exts.length && maxSz) {\r\n return this.#i18n.t('core.component.upload-file.desc-format-and-size', { exts: exts.join(', '), maxSize: maxSz });\r\n } else if (exts.length) {\r\n return this.#i18n.t('core.component.upload-file.desc-format', { exts: exts.join(', ') });\r\n } else if (maxSz) {\r\n return this.#i18n.t('core.component.upload-file.desc-max-size', { maxSize: maxSz });\r\n }\r\n return undefined;\r\n });\r\n\r\n // ─── Output Signals ───────────────────────────────────────────────────\r\n readonly loaded = output<PreviewFile[]>();\r\n readonly filesChanged = output<(string | File)[]>();\r\n\r\n // ─── Model Signal (two-way binding support: [(model)]) ────────────────\r\n readonly model = model<(string | number)[]>([]);\r\n\r\n constructor() {\r\n this.#validateDuplicateConfigurationKeys();\r\n\r\n // Sync form group & register form control\r\n afterNextRender(() => {\r\n this.#formGroup = this.form();\r\n this.#name = this.nameInput();\r\n this.#formGroup?.addControl(this.#name, this.formControl);\r\n\r\n // Drag & drop setup\r\n if (!this.#isMobileOrTablet) {\r\n this.#setupDropContainer();\r\n }\r\n });\r\n\r\n // Reactive sync for model changes\r\n effect(() => {\r\n const values = this.model() || [];\r\n this.formControl.setValue(values);\r\n\r\n if (Array.isArray(values)) {\r\n this.#details(values).then(previewFiles => {\r\n this.previewFiles.set(previewFiles);\r\n this.filesChanged.emit(\r\n this.previewFiles()\r\n .map(e => e.file || e.idOrKey || e.src)\r\n .filter(val => !!val) as (string | File)[]\r\n );\r\n this.#preview();\r\n });\r\n } else {\r\n this.previewFiles.set([]);\r\n }\r\n });\r\n\r\n // Reactive disabled state via effect (runs whenever disabled input changes)\r\n effect(() => {\r\n if (this.disabled()) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n });\r\n\r\n // why: required() là signal input — phải đăng ký validator qua effect để bắt thay\r\n // đổi runtime. Validators.required nhận biết array rỗng (length === 0) là empty\r\n // nên file array hoạt động đúng. updateValueAndValidity để chip lỗi xuất hiện\r\n // ngay khi required toggle true mà chưa upload file nào.\r\n effect(() => {\r\n if (this.required()) {\r\n this.formControl.setValidators(Validators.required);\r\n } else {\r\n this.formControl.clearValidators();\r\n }\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n });\r\n\r\n // Cleanup on destroy\r\n this.#destroyRef.onDestroy(() => {\r\n this.#revokePreviewBlobURLs();\r\n this.#formGroup?.removeControl(this.#name);\r\n });\r\n }\r\n\r\n\r\n // ─── Drop container setup ─────────────────────────────────────────────\r\n #setupDropContainer() {\r\n const dropEls = this.dropElements();\r\n if (dropEls?.length > 0) {\r\n const dropContainer = dropEls[0].nativeElement;\r\n this.#bindDropEvents(dropContainer);\r\n }\r\n }\r\n\r\n #bindDropEvents(dropContainer: HTMLElement) {\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n (dropContainer as any).style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', () => {\r\n (dropContainer as any).style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n (dropContainer as any).style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n const files: File[] = [];\r\n for (const file of evt.dataTransfer?.files || []) {\r\n files.push(file);\r\n }\r\n await this.#uploadFile(files);\r\n });\r\n }\r\n\r\n // ─── Private Methods ──────────────────────────────────────────────────\r\n #touch = () => {\r\n this.formControl.markAsTouched();\r\n this.formControl.setValue(this.model() || []);\r\n };\r\n\r\n #getConfigurations = (): ISdUploadFileConfiguration[] => {\r\n const config = this.#configuration;\r\n if (!config) {\r\n return [];\r\n }\r\n return Array.isArray(config) ? config : [config];\r\n };\r\n\r\n #validateDuplicateConfigurationKeys = (): void => {\r\n const configurations = this.#getConfigurations();\r\n if (!configurations.length) {\r\n return;\r\n }\r\n\r\n const seen = new Set<string>();\r\n for (const configuration of configurations) {\r\n const key = configuration.key;\r\n const normalizedKey = key === undefined ? '__undefined__' : key;\r\n if (seen.has(normalizedKey)) {\r\n const label = key === undefined ? 'undefined' : key;\r\n throw new Error(`[sd-upload-file] Duplicate upload configuration key detected: ${label}`);\r\n }\r\n seen.add(normalizedKey);\r\n }\r\n };\r\n\r\n #getSelectedConfiguration = (): ISdUploadFileConfiguration | undefined => {\r\n const configurations = this.#getConfigurations();\r\n if (!configurations.length) {\r\n return undefined;\r\n }\r\n const key = this.key();\r\n return configurations.find(configuration => configuration.key === key);\r\n };\r\n\r\n #getUploadHandler = (): SdUploadFileFuncUpload<any> | undefined => {\r\n return this.uploadInput() || this.#getSelectedConfiguration()?.upload;\r\n };\r\n\r\n #getDetailsHandler = (): SdUploadFileFuncDetails<any> | undefined => {\r\n return this.details() || this.#getSelectedConfiguration()?.details;\r\n };\r\n\r\n #getDownloadHandler = (): SdUploadFileFuncDownload<any> | undefined => {\r\n return this.downloadInput() || this.#getSelectedConfiguration()?.download;\r\n };\r\n\r\n #validate = async (file: File): Promise<string | null> => {\r\n if (this.type() === 'image') {\r\n if (file.type.split('/')[0] !== 'image') {\r\n return this.#i18n.t('core.component.upload-file.not-image', { name: file.name });\r\n }\r\n }\r\n const exts = this.extensions();\r\n if (exts?.length) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n if (!exts.some(e => e.toUpperCase() === extension.toUpperCase())) {\r\n return this.#i18n.t('core.component.upload-file.invalid-format', { name: file.name, exts: exts.join(', ') });\r\n }\r\n }\r\n const maxSz = this.maxSize();\r\n if (maxSz) {\r\n if (maxSz * 1024 * 1024 < file.size) {\r\n return this.#i18n.t('core.component.upload-file.size-exceeded', { name: file.name, maxSize: maxSz });\r\n }\r\n }\r\n if (this.type() === 'image' && (this.maxWidth() || this.maxHeight() || this.imageValidator())) {\r\n const message: string | null = await new Promise(resolve => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n const mw = this.maxWidth();\r\n const mh = this.maxHeight();\r\n const imgVal = this.imageValidator();\r\n if (mw && img.width > mw) {\r\n resolve(`[${file.name}] Max image width ${mw}px`);\r\n return;\r\n }\r\n if (mh && img.height > mh) {\r\n resolve(`[${file.name}] Max image height ${mh}px`);\r\n return;\r\n }\r\n if (imgVal) {\r\n resolve(imgVal(img));\r\n return;\r\n }\r\n resolve(null);\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n if (message) {\r\n return message;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n #preview = () => {\r\n for (const previewFile of this.previewFiles().filter(e => e.file)) {\r\n const reader = new FileReader();\r\n reader.onload = evt => {\r\n previewFile.previewSrc = evt.target!.result;\r\n previewFile.isPreviewImage =\r\n previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\r\n // trigger signal update\r\n this.previewFiles.set([...this.previewFiles()]);\r\n };\r\n reader.readAsDataURL(previewFile.file!);\r\n }\r\n };\r\n\r\n // ─── Public Event Handlers ────────────────────────────────────────────\r\n onUpload = () => {\r\n BrowserUtilities.upload({\r\n maxSizeInMb: this.maxSize(),\r\n extensions: this.extensions(),\r\n multiple: this.max() > 1,\r\n })\r\n .then(async result => {\r\n if (result) {\r\n if (Array.isArray(result)) {\r\n await this.#uploadFile(result);\r\n } else {\r\n await this.#uploadFile([result]);\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n console.error(error);\r\n this.#notifyService.error(error?.message || this.#i18n.t('core.component.upload-file.upload-failed'));\r\n });\r\n };\r\n\r\n #uploadFile = async (originFiles: File[]) => {\r\n const currentModel = [...(this.model() || [])];\r\n if (originFiles.length + currentModel.length > this.max()) {\r\n this.#notifyService.warning(this.#i18n.t('core.component.upload-file.too-many-files'));\r\n return;\r\n }\r\n for (let file of originFiles) {\r\n const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\r\n if (isImage && (this.scaleToPixel() ?? 0) > 0) {\r\n file = await this.#resize(file!);\r\n }\r\n const message = await this.#validate(file!);\r\n if (message) {\r\n this.#notifyService.warning(message);\r\n return;\r\n }\r\n const hashedKey = this.#uploadFileService.add(file);\r\n if (hashedKey) {\r\n currentModel.push(hashedKey);\r\n }\r\n }\r\n this.model.set(currentModel);\r\n this.#touch();\r\n };\r\n\r\n onRemove = (file: PreviewFile) => {\r\n const files = this.previewFiles();\r\n const idx = files.indexOf(file);\r\n if (idx >= 0) {\r\n this.#confirmService\r\n .confirm(this.#i18n.t('core.component.upload-file.confirm-delete-message'), {\r\n title: this.#i18n.t('core.component.upload-file.confirm-delete-title'),\r\n yesTitle: this.#i18n.t('core.component.upload-file.confirm-yes'),\r\n noTitle: this.#i18n.t('core.component.upload-file.confirm-no'),\r\n yesButtonColor: 'primary',\r\n noButtonColor: 'primary',\r\n })\r\n .then(() => {\r\n const updated = [...files];\r\n updated.splice(idx, 1);\r\n this.previewFiles.set(updated);\r\n const currentModel = [...(this.model() || [])];\r\n currentModel.splice(idx, 1);\r\n this.model.set(currentModel);\r\n this.filesChanged.emit(\r\n this.previewFiles()\r\n .map(e => e.file || e.idOrKey || e.src)\r\n .filter(val => !!val) as (string | File)[]\r\n );\r\n this.#touch();\r\n });\r\n }\r\n };\r\n\r\n onDrop = (event: CdkDragDrop<string[]>) => {\r\n const currentModel = [...(this.model() || [])];\r\n moveItemInArray(currentModel, event.previousIndex, event.currentIndex);\r\n this.model.set(currentModel);\r\n this.#touch();\r\n };\r\n\r\n onImgError = (previewFile: PreviewFile) => {\r\n previewFile.isImgError = true;\r\n this.previewFiles.set([...this.previewFiles()]);\r\n };\r\n\r\n onSelect = (file: PreviewFile) => {\r\n if (!this.#isMobileOrTablet) {\r\n return;\r\n }\r\n this.selectedFile.set(this.selectedFile() !== file ? file : null);\r\n };\r\n\r\n // ─── Resize ───────────────────────────────────────────────────────────\r\n #resize = async (file: File): Promise<File> => {\r\n if (!this.scaleToPixel()) {\r\n return file;\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n return file;\r\n }\r\n return await new Promise((resolve, reject) => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n try {\r\n if (img.width * img.height <= this.scaleToPixel()!) {\r\n return resolve(file);\r\n }\r\n const canvas1 = document.createElement('canvas');\r\n canvas1.setAttribute('id', this.#canvas1);\r\n const ctx1 = canvas1.getContext('2d');\r\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel()!);\r\n canvas1.width = width;\r\n canvas1.height = height;\r\n\r\n const canvas2 = document.createElement('canvas');\r\n canvas2.setAttribute('id', this.#canvas2);\r\n const ctx2 = canvas2.getContext('2d');\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\r\n ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\r\n ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\r\n canvas1.toBlob(blob => {\r\n resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\r\n });\r\n } catch (err) {\r\n reject(err);\r\n } finally {\r\n document.getElementById(this.#canvas1)?.remove();\r\n document.getElementById(this.#canvas2)?.remove();\r\n }\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n };\r\n\r\n #scale = (width: number, height: number, scaleToPixcel: number) => {\r\n if (!width || !height || !scaleToPixcel) {\r\n return { width, height };\r\n }\r\n const ratio = width / height;\r\n for (let i = 0; i < width; i++) {\r\n width -= i;\r\n height = Math.trunc(width / ratio);\r\n if (width * height <= scaleToPixcel) {\r\n break;\r\n }\r\n }\r\n return { width, height };\r\n };\r\n\r\n #blobToFile = (blob: Blob, fileName: string): File => {\r\n const temp: any = blob;\r\n temp.lastModifiedDate = new Date();\r\n temp.name = fileName;\r\n return blob as File;\r\n };\r\n\r\n // ─── Public API ───────────────────────────────────────────────────────\r\n /**\r\n * Lấy danh sách các File từ previewFiles (chưa upload).\r\n */\r\n getFiles = async () => {\r\n const items = this.previewFiles()?.filter(val => !!val) || [];\r\n return items.map(e => e?.file).filter(file => !!file);\r\n };\r\n\r\n /**\r\n * Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys.\r\n * HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER.\r\n */\r\n upload = async () => {\r\n const items = this.previewFiles()?.filter(val => !!val) || [];\r\n if (!Array.isArray(items)) {\r\n this.model.set([]);\r\n return;\r\n }\r\n const results: (string | number)[] = [];\r\n const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\r\n let idOrKeys: string[] = [];\r\n if (uploadedFiles.length) {\r\n const uploadHandler = this.#getUploadHandler();\r\n if (uploadHandler) {\r\n idOrKeys = await uploadHandler(uploadedFiles, this.args()).then(results => {\r\n for (const uploadedFile of uploadedFiles) {\r\n this.#uploadFileService.remove(uploadedFile);\r\n }\r\n return results;\r\n });\r\n } else {\r\n const key = this.key();\r\n this.#notifyService.error(\r\n key === undefined\r\n ? this.#i18n.t('core.component.upload-file.no-configuration')\r\n : this.#i18n.t('core.component.upload-file.no-configuration-key', { key })\r\n );\r\n }\r\n }\r\n let idx = 0;\r\n for (const item of items) {\r\n if (!item.file) {\r\n if (item.idOrKey) {\r\n results.push(item.idOrKey);\r\n }\r\n } else {\r\n if (idOrKeys?.[idx]) {\r\n results.push(idOrKeys[idx]);\r\n idx++;\r\n }\r\n }\r\n }\r\n this.model.set(results);\r\n };\r\n\r\n /**\r\n * Mở popup preview ảnh.\r\n */\r\n preview = async () => {\r\n this.previewFileComponent()?.open(this.previewFiles());\r\n };\r\n\r\n /**\r\n * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\r\n * * Ưu tiên:\r\n * 1. Tải xuống từ thuộc tính `file`.\r\n * 2. Tải xuống từ thuộc tính `src`.\r\n * 3. Gọi hàm download dựa vào `idOrKey`.\r\n *\r\n * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\r\n */\r\n onDownload = (previewFile: PreviewFile) => {\r\n if (previewFile.file || previewFile.src) {\r\n BrowserUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\r\n return;\r\n }\r\n if (previewFile.idOrKey) {\r\n this.#getDownloadHandler()?.(previewFile.idOrKey, this.args());\r\n return;\r\n }\r\n console.error('Invalid preview file', previewFile);\r\n };\r\n\r\n isLastVisibleOverlay(fileIndex: number): boolean {\r\n return this.formControl.disabled && fileIndex === this.maxOfImage() - 1 && this.previewFiles().length > this.maxOfImage();\r\n }\r\n\r\n // ─── Details ──────────────────────────────────────────────────────────\r\n /**\r\n * Khi binding model, đầu vào thường là id/key/cdn,\r\n * cần render ra ảnh/tệp tương ứng.\r\n */\r\n #details = async (keys: (string | number)[]) => {\r\n if (!Array.isArray(keys) || !keys.length) {\r\n return [];\r\n }\r\n const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\r\n let detailsList: SdUploadFileDetail[] = [];\r\n const detailsHandler = this.#getDetailsHandler();\r\n if (idOrKeys.length && detailsHandler) {\r\n detailsList = await detailsHandler(idOrKeys, this.args()).catch(error => {\r\n console.error(error);\r\n return [];\r\n });\r\n }\r\n const results: PreviewFile[] = [];\r\n for (const key of keys.filter(val => !!val)) {\r\n if (this.#isCdn(key)) {\r\n const cdn = key?.toString();\r\n const extension = this.#getExtension(cdn);\r\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: cdn,\r\n fileName: cdn,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n } else if (this.#isHashedKey(key)) {\r\n const hashedKey = key?.toString();\r\n const file = this.#uploadFileService.get(hashedKey)!;\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\r\n results.push({\r\n file,\r\n isPreviewImage,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n extension,\r\n });\r\n } else {\r\n const detail = detailsList.find(e => e.idOrKey === key);\r\n if (detail) {\r\n const { idOrKey, cdn, name, size } = detail;\r\n const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\r\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: idOrKey || cdn,\r\n fileName: name,\r\n fileSize: size,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n }\r\n }\r\n }\r\n return results;\r\n };\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────\r\n #isCdn = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') return false;\r\n return idOrKey.startsWith('http');\r\n };\r\n\r\n #isHashedKey = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') return false;\r\n return this.#uploadFileService.isHashedKey(idOrKey);\r\n };\r\n\r\n #getExtension = (cdn: string | undefined) => {\r\n if (!cdn) return undefined;\r\n const baseSrc = cdn?.split?.('?')?.[0];\r\n const lastDot = baseSrc?.lastIndexOf?.('.');\r\n if (lastDot > 0) {\r\n return baseSrc.substring(lastDot + 1);\r\n }\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\r\n * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\r\n */\r\n #revokePreviewBlobURLs = (): void => {\r\n const files = this.previewFiles();\r\n if (!Array.isArray(files) || !files?.length) return;\r\n files.forEach(p => {\r\n if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.previewSrc);\r\n }\r\n if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.src);\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\r\n @let _sdLabelDef = sdLabelDef();\r\n @let _label = label();\r\n @let _align = align();\r\n @let _previewFiles = previewFiles();\r\n @let _previewWidth = previewWidth();\r\n @let _previewHeight = previewHeight();\r\n @let _maxOfImage = maxOfImage();\r\n @if (!!_sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"_sdLabelDef?.templateRef!\"> </ng-container>\r\n } @else if (_label) {\r\n <sd-label [label]=\"_label!\" [description]=\"generatedDescription()\" [helperText]=\"helperText()\" [required]=\"required()\"></sd-label>\r\n }\r\n <div\r\n cdkDropList\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"d-flex\"\r\n [class.justify-content-center]=\"_align === 'center'\"\r\n [class.justify-content-start]=\"_align === 'left'\">\r\n @if (_previewFiles.length < max() && !formControl.disabled) {\r\n <div\r\n class=\"d-flex justify-content-center align-items-center cursor-pointer c-area-upload\"\r\n [style.width]=\"_previewWidth\"\r\n [style.height]=\"_previewHeight\"\r\n (click)=\"onUpload()\"\r\n aria-hidden=\"true\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-count]=\"dataCount()\"\r\n #dropElement>\r\n <mat-icon class=\"c-upload\" fontSet=\"material-icons-outlined\"> file_upload </mat-icon>\r\n </div>\r\n }\r\n @let previewImages = _previewFiles | filterImage;\r\n @for (image of previewImages; track $index; let idx = $index) {\r\n @if (!formControl.disabled || idx < _maxOfImage) {\r\n <div class=\"c-area c-view\" [class.c-loading]=\"!image.previewSrc && !image.src\" [class.c-area-error]=\"image.isImgError\" [style.width]=\"_previewWidth\" [style.height]=\"_previewHeight\" cdkDrag>\r\n <div class=\"c-drag-placeholder\" [style.width]=\"_previewWidth\" [style.height]=\"_previewHeight\" *cdkDragPlaceholder></div>\r\n <div *cdkDragPreview [style]=\"{ width: _previewWidth, height: _previewHeight }\" class=\"c-drag-preview\">\r\n <div class=\"c-container\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"c-preview\">\r\n <div\r\n class=\"c-img-container\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n [class.c-selected]=\"selectedFile() === image\"\r\n [class.has-overlay]=\"idx === _maxOfImage - 1 && formControl.disabled\"\r\n (click)=\"onSelect(image)\"\r\n aria-hidden=\"true\">\r\n @if (image.isImgError) {\r\n <img class=\"sd-image-image-error\" alt=\"Image Error\" style=\"max-width: 100%;\" [style.max-height]=\"_previewHeight\" />\r\n } @else if(image.previewSrc) {\r\n <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"_previewHeight\" (error)=\"onImgError(image)\" />\r\n } @else if(image.src) {\r\n <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"_previewHeight\" (error)=\"onImgError(image)\" />\r\n } @else {\r\n <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\r\n }\r\n @if (idx === _maxOfImage - 1 && formControl.disabled && previewImages.length > _maxOfImage) {\r\n <div class=\"c-overlay-count\" (click)=\"preview()\">\r\n <div class=\"c-overlay-text\">+{{ previewImages.length - _maxOfImage }}</div>\r\n </div>\r\n }\r\n <div class=\"c-action\">\r\n <mat-icon class=\"c-zoom\" fontSet=\"material-icons-outlined\" (click)=\"preview()\">zoom_in</mat-icon>\r\n </div>\r\n @if (!formControl.disabled) {\r\n <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\" [attr.data-autoId]=\"removeAutoId(idx)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n @let previewDocuments = _previewFiles | filterDocument;\r\n @for (document of previewDocuments; track $index; let docIdx = $index) {\r\n <div class=\"c-document-container\">\r\n <img\r\n [style.max-height]=\"_previewHeight\"\r\n class=\"c-document-image\"\r\n [class]=\"{\r\n png: document.extension === 'png',\r\n jpg: document.extension === 'jpg',\r\n pdf: document.extension === 'pdf',\r\n doc: document.extension === 'doc',\r\n docx: document.extension === 'docx',\r\n xls: document.extension === 'xls',\r\n xlsx: document.extension === 'xlsx',\r\n ppt: document.extension === 'ppt',\r\n pptx: document.extension === 'pptx',\r\n csv: document.extension === 'csv',\r\n psd: document.extension === 'psd',\r\n xml: document.extension === 'xml',\r\n zip: document.extension === 'zip',\r\n tiff: document.extension === 'tiff'\r\n }\"\r\n alt=\"Preview\" />\r\n <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\r\n @if (document.fileSize) {\r\n <span class=\"T12R text-black400\"> - </span>\r\n <span class=\"T12R text-black400 flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\r\n }\r\n\r\n @if (!formControl.disabled) {\r\n <mat-icon class=\"c-close\" (click)=\"onRemove(document)\" [attr.data-autoId]=\"removeAutoId(docIdx)\">close</mat-icon>\r\n }\r\n </div>\r\n }\r\n @if (!formControl.disabled && formControl.touched && formControl.errors?.['required']) {\r\n <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ ('core.component.upload-file.please-upload' | translate) }}</div>\r\n }\r\n</div>\r\n<preview (download)=\"onDownload($event)\"></preview>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAiCA;;;AAGG;MACU,4BAA4B,GAAG,IAAI,cAAc,CAA6B,8BAA8B;;MCtB5G,gBAAgB,CAAA;AAUP,IAAA,EAAA;AATA,IAAA,KAAK;AACf,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAe;AAC1C,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;AAEjC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC;IACxE,iBAAiB,GAAwC,OAAO;IAChE,WAAW,GAAG,CAAC;IACf,YAAY,GAAkB,EAAE;AAChC,IAAA,WAAA,CAAoB,EAAqB,EAAA;QAArB,IAAA,CAAA,EAAE,GAAF,EAAE;IAAsB;;AAG5C,IAAA,IAAI,GAAG,OAAO,YAA8C,EAAE,KAAc,KAAI;AAC9E,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7D;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAClB,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,KAAa,KAAI;AACxC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,kBAAkB,GAAG,CAAC,SAAiB,KAAI;QACzC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AACvG,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,KAAK,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AACrE,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;IAED,OAAO,GAAG,MAAK;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,KAAa,EAAE,IAA6C,KAAI;AAC7E,QAAA,MAAM,MAAM,GAAW,gBAAgB,GAAG,KAAK;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AACA,QAAA,MAAM,SAAS,GAA0B,IAAI,IAAI,OAAO;AACxD,QAAA,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClE,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/B,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;wGAnDU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAChB,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBpB,qmIAiFA,EAAA,MAAA,EAAA,CAAA,03yNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpEY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,sIAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEtD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAAA,eAAA,EAGF,uBAAuB,CAAC,MAAM,WACtC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,qmIAAA,EAAA,MAAA,EAAA,CAAA,03yNAAA,CAAA,EAAA;sFAG9C,KAAK,EAAA,CAAA;sBAAxB,SAAS;uBAAC,OAAO;gBACR,QAAQ,EAAA,CAAA;sBAAjB;gBACS,KAAK,EAAA,CAAA;sBAAd;;;MEZU,eAAe,CAAA;AAC1B,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE;wGAHW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,kBAAkB,CAAA;AAC7B,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE;wGAHW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACLD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AACxD,MAAM,OAAO,GAAG,CAAC,SAAoC,KAAI;IAC9D,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,KAAK;IACd;IACA,OAAO,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AAC5D,CAAC;;MCFY,iBAAiB,CAAA;IAC5B,MAAM,GAAyB,EAAE;AAEjC,IAAA,KAAK,GAAG,CAAC,IAAU,KAAI;QACrB,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,GAAW,KAAI;QAC5B,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,KAAK;QACd;QACA,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC3B,IAAA,CAAC;AAED,IAAA,GAAG,GAAG,CAAC,GAAW,KAAI;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACzB,IAAA,CAAC;AAED,IAAA,GAAG,GAAG,CAAC,IAAU,KAAI;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;QACzB;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,SAAwB,KAAI;QACpC,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AACA,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;AAC/B,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/B;YACA;QACF;QACA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,GAAG,EAAE;AACP,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACzB;AACF,IAAA,CAAC;wGA9CU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACHlC;AACA;AA6CA;MAkBa,YAAY,CAAA;;AAEd,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC1C,cAAc,GAAG,MAAM,CAC9B,4BAA4B,EAC5B,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB;AACQ,IAAA,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;AAG3B,IAAA,EAAE,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;AACpB,IAAA,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,EAAE;AAC/C,IAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;AAC1B,IAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;AACnC,IAAA,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE;AACjB,IAAA,UAAU;AAED,IAAA,WAAW,GAAG,IAAI,aAAa,EAAE;;AAGjC,IAAA,YAAY,GAAG,MAAM,CAAgB,EAAE,CAAC;AACxC,IAAA,YAAY,GAAG,MAAM,CAAiC,SAAS,CAAC;;AAGhE,IAAA,oBAAoB,GAAG,SAAS,CAAC,gBAAgB,CAAC;AAClD,IAAA,YAAY,GAAG,YAAY,CAAa,aAAa,CAAC;AACtD,IAAA,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC;;;IAI9C,WAAW,GAAG,KAAK,CAA4B,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC9E,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAA,uBAAA,EAA0B,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,GAAG,SAAS,CAAC,CAAC;IAC1G,YAAY,GAAG,CAAC,KAAa,MACnC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,GAAG,SAAS,CAAC;;IAGzD,YAAY,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACnE,SAAS,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAC/E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;IAEpE,IAAI,GAAG,KAAK,EAAS;IACrB,KAAK,GAAG,KAAK,EAAU;AACvB,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,CAAC;IAC1C,WAAW,GAAG,KAAK,EAAU;AAC7B,IAAA,YAAY,GAAG,KAAK,CAAS,MAAM,CAAC;AACpC,IAAA,aAAa,GAAG,KAAK,CAAS,MAAM,CAAC;AACrC,IAAA,KAAK,GAAG,KAAK,CAAoB,MAAM,CAAC;IACxC,WAAW,GAAG,KAAK,CAA0C,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5F,OAAO,GAAG,KAAK,EAAgC;IAC/C,aAAa,GAAG,KAAK,CAA4C,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAClG,cAAc,GAAG,KAAK,EAAuC;IAC7D,OAAO,GAAG,KAAK,EAAU;IACzB,QAAQ,GAAG,KAAK,EAAU;IAC1B,SAAS,GAAG,KAAK,EAAU;IAC3B,YAAY,GAAG,KAAK,EAAU;;AAGvC,IAAA,IAAI,GAAG,KAAK,CAA6B,SAAS,EAAE;AAClD,QAAA,SAAS,EAAE,CAAC,GAAQ,KAA2B;AAC7C,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,SAAS;;YAE1B,IAAI,GAAG,YAAY,MAAM;gBAAE,OAAO,GAAG,CAAC,IAAI;;YAE1C,IAAI,GAAG,YAAY,SAAS;AAAE,gBAAA,OAAO,GAAG;;AAExC,YAAA,IAAI,GAAG,EAAE,IAAI,YAAY,SAAS;gBAAE,OAAO,GAAG,CAAC,IAAI;AACnD,YAAA,OAAO,SAAS;QAClB,CAAC;AACF,KAAA,CAAC;AAEO,IAAA,SAAS,GAAG,KAAK,CAA6B,IAAI,CAAC,EAAE,EAAE,EAAE;AAChE,QAAA,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE;AAC7C,KAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,KAAK,CAA2C,KAAK,EAAE;AACzE,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG;AACjD,KAAA,CAAC;AAEO,IAAA,IAAI,GAAG,KAAK,CAAkF,MAAM,EAAE;AAC7G,QAAA,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,CAAC,GAAG,KAAoC,GAAG,IAAI,MAAM;AACjE,KAAA,CAAC;IAEO,UAAU,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAE1E,IAAA,GAAG,GAAG,KAAK,CAAoC,EAAE,EAAE;AAC1D,QAAA,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,EAAE;AACtC,KAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAoC,CAAC,EAAE;AAChE,QAAA,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,CAAC;AACrC,KAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAwC,EAAE,EAAE;AACrE,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,SAAS,EAAE,CAAC,GAAG,KAAe,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;AACzD,KAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,KAAK,CAA2C,KAAK,EAAE;AACzE,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG;AACjD,KAAA,CAAC;;AAGO,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACnH;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F;aAAO,IAAI,KAAK,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACrF;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC,CAAC;;IAGO,MAAM,GAAG,MAAM,EAAiB;IAChC,YAAY,GAAG,MAAM,EAAqB;;AAG1C,IAAA,KAAK,GAAG,KAAK,CAAsB,EAAE,CAAC;AAE/C,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,mCAAmC,EAAE;;QAG1C,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;;AAGzD,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC3B,IAAI,CAAC,mBAAmB,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;AAEjC,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,IAAG;AACxC,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;oBACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,YAAY;AACd,yBAAA,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;yBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAsB,CAC7C;oBACD,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5B;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACF,QAAA,CAAC,CAAC;;;;;QAMF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;YACrD;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;YACpC;YACA,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAC5C,QAAA,CAAC,CAAC;IACJ;;IAIA,mBAAmB,GAAA;AACjB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,IAAI,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;QACrC;IACF;AAEA,IAAA,eAAe,CAAC,aAA0B,EAAA;QACxC,aAAa,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,GAAU,KAAI;YACxD,GAAG,CAAC,cAAc,EAAE;AACnB,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB;AAC/C,QAAA,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAU,KAAI;YACzD,GAAG,CAAC,cAAc,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAK;AAC9C,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB;AAChD,QAAA,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAc,KAAI;YAC9D,GAAG,CAAC,cAAc,EAAE;AACnB,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB;YAC9C,MAAM,KAAK,GAAW,EAAE;YACxB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE;AAChD,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB;AACA,YAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;;IAGA,MAAM,GAAG,MAAK;AACZ,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/C,IAAA,CAAC;IAED,kBAAkB,GAAG,MAAmC;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;QAClC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAClD,IAAA,CAAC;IAED,mCAAmC,GAAG,MAAW;AAC/C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YAC1B;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,YAAA,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG;AAC7B,YAAA,MAAM,aAAa,GAAG,GAAG,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG;AAC/D,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;AAC3B,gBAAA,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,GAAG,WAAW,GAAG,GAAG;AACnD,gBAAA,MAAM,IAAI,KAAK,CAAC,iEAAiE,KAAK,CAAA,CAAE,CAAC;YAC3F;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzB;AACF,IAAA,CAAC;IAED,yBAAyB,GAAG,MAA6C;AACvE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AAC1B,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,GAAG,KAAK,GAAG,CAAC;AACxE,IAAA,CAAC;IAED,iBAAiB,GAAG,MAA8C;QAChE,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM;AACvE,IAAA,CAAC;IAED,kBAAkB,GAAG,MAA+C;QAClE,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO;AACpE,IAAA,CAAC;IAED,mBAAmB,GAAG,MAAgD;QACpE,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ;AAC3E,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,OAAO,IAAU,KAA4B;AACvD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;AACvC,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAClF;QACF;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,IAAI,EAAE,MAAM,EAAE;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE;gBAChE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2CAA2C,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9G;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5B,IAAI,KAAK,EAAE;YACT,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;gBACnC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACtG;QACF;QACA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE;YAC7F,MAAM,OAAO,GAAkB,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS;AAC1C,gBAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,gBAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,oBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC1B,oBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;AAC3B,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;oBACpC,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE;wBACxB,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA,kBAAA,EAAqB,EAAE,CAAA,EAAA,CAAI,CAAC;wBACjD;oBACF;oBACA,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;wBACzB,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA,mBAAA,EAAsB,EAAE,CAAA,EAAA,CAAI,CAAC;wBAClD;oBACF;oBACA,IAAI,MAAM,EAAE;AACV,wBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACpB;oBACF;oBACA,OAAO,CAAC,IAAI,CAAC;AACf,gBAAA,CAAC;gBACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,YAAA,CAAC,CAAC;YACF,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,OAAO;YAChB;QACF;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,QAAQ,GAAG,MAAK;AACd,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;AACjE,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,GAAG,IAAG;gBACpB,WAAW,CAAC,UAAU,GAAG,GAAG,CAAC,MAAO,CAAC,MAAM;AAC3C,gBAAA,WAAW,CAAC,cAAc;oBACxB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY;;AAE7F,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACjD,YAAA,CAAC;AACD,YAAA,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAK,CAAC;QACzC;AACF,IAAA,CAAC;;IAGD,QAAQ,GAAG,MAAK;QACd,gBAAgB,CAAC,MAAM,CAAC;AACtB,YAAA,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;SACzB;AACE,aAAA,IAAI,CAAC,OAAM,MAAM,KAAG;YACnB,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,oBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAChC;qBAAO;oBACL,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;gBAClC;YACF;AACF,QAAA,CAAC;aACA,KAAK,CAAC,KAAK,IAAG;AACb,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;AACvG,QAAA,CAAC,CAAC;AACN,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,OAAO,WAAmB,KAAI;AAC1C,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC;YACtF;QACF;AACA,QAAA,KAAK,IAAI,IAAI,IAAI,WAAW,EAAE;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;AACjF,YAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC7C,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAK,CAAC;YAClC;YACA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAK,CAAC;YAC3C,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;gBACpC;YACF;YACA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,IAAI,SAAS,EAAE;AACb,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE;AACf,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAiB,KAAI;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,YAAA,IAAI,CAAC;iBACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mDAAmD,CAAC,EAAE;gBAC1E,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD,CAAC;gBACtE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC;gBAChE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC;AAC9D,gBAAA,cAAc,EAAE,SAAS;AACzB,gBAAA,aAAa,EAAE,SAAS;aACzB;iBACA,IAAI,CAAC,MAAK;AACT,gBAAA,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1B,gBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9B,gBAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,gBAAA,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,YAAY;AACd,qBAAA,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;qBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAsB,CAC7C;gBACD,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,CAAC,CAAC;QACN;AACF,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,KAA4B,KAAI;AACxC,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE;AACf,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,WAAW,CAAC,UAAU,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACjD,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAiB,KAAI;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B;QACF;QACA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACnE,IAAA,CAAC;;AAGD,IAAA,OAAO,GAAG,OAAO,IAAU,KAAmB;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE;AAClB,YAAA,OAAO,IAAI;QACb;QACA,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS;AAC1C,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,gBAAA,IAAI;AACF,oBAAA,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAG,EAAE;AAClD,wBAAA,OAAO,OAAO,CAAC,IAAI,CAAC;oBACtB;oBACA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAG,CAAC;AAClF,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK;AACrB,oBAAA,OAAO,CAAC,MAAM,GAAG,MAAM;oBAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACrC,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK;AACrB,oBAAA,OAAO,CAAC,MAAM,GAAG,MAAM;AACvB,oBAAA,IAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;oBACzD,IAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AACzE,oBAAA,IAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;AAC9G,oBAAA,OAAO,CAAC,MAAM,CAAC,IAAI,IAAG;wBACpB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA,IAAA,CAAM,CAAC,CAAC;AAC5E,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,GAAG,EAAE;oBACZ,MAAM,CAAC,GAAG,CAAC;gBACb;wBAAU;oBACR,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;oBAChD,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;gBAClD;AACF,YAAA,CAAC;YACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,aAAqB,KAAI;QAChE,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B;AACA,QAAA,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAK,IAAI,CAAC;YACV,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAClC,YAAA,IAAI,KAAK,GAAG,MAAM,IAAI,aAAa,EAAE;gBACnC;YACF;QACF;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;AAC1B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,IAAU,EAAE,QAAgB,KAAU;QACnD,MAAM,IAAI,GAAQ,IAAI;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,QAAA,OAAO,IAAY;AACrB,IAAA,CAAC;;AAGD;;AAEG;IACH,QAAQ,GAAG,YAAW;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;AACvD,IAAA,CAAC;AAED;;;AAGG;IACH,MAAM,GAAG,YAAW;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;QACF;QACA,MAAM,OAAO,GAAwB,EAAE;QACvC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;QACpE,IAAI,QAAQ,GAAa,EAAE;AAC3B,QAAA,IAAI,aAAa,CAAC,MAAM,EAAE;AACxB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE;YAC9C,IAAI,aAAa,EAAE;AACjB,gBAAA,QAAQ,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAG;AACxE,oBAAA,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;AACxC,wBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC9C;AACA,oBAAA,OAAO,OAAO;AAChB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,GAAG,KAAK;sBACJ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C;AAC5D,sBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD,EAAE,EAAE,GAAG,EAAE,CAAC,CAC7E;YACH;QACF;QACA,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC5B;YACF;iBAAO;AACL,gBAAA,IAAI,QAAQ,GAAG,GAAG,CAAC,EAAE;oBACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAA,GAAG,EAAE;gBACP;YACF;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,IAAA,CAAC;AAED;;AAEG;IACH,OAAO,GAAG,YAAW;QACnB,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACxD,IAAA,CAAC;AAED;;;;;;;;AAQG;AACH,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;QACxC,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,EAAE;AACvC,YAAA,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAK,IAAI,WAAW,CAAC,GAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;YACtF;QACF;AACA,QAAA,IAAI,WAAW,CAAC,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,mBAAmB,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9D;QACF;AACA,QAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,WAAW,CAAC;AACpD,IAAA,CAAC;AAED,IAAA,oBAAoB,CAAC,SAAiB,EAAA;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;IAC3H;;AAGA;;;AAGG;AACH,IAAA,QAAQ,GAAG,OAAO,IAAyB,KAAI;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAwB;QACjH,IAAI,WAAW,GAAyB,EAAE;AAC1C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,cAAc,EAAE;AACrC,YAAA,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AACtE,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,CAAC;QACJ;QACA,MAAM,OAAO,GAAkB,EAAE;AACjC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;AAC3C,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AACpB,gBAAA,MAAM,GAAG,GAAG,GAAG,EAAE,QAAQ,EAAE;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzC,gBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC;AACX,oBAAA,OAAO,EAAE,GAAG;AACZ,oBAAA,QAAQ,EAAE,GAAG;AACb,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,GAAG,EAAE,GAAG;oBACR,cAAc;oBACd,SAAS;AACV,iBAAA,CAAC;YACJ;AAAO,iBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AACjC,gBAAA,MAAM,SAAS,GAAG,GAAG,EAAE,QAAQ,EAAE;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAE;gBACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;AAClD,gBAAA,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC;gBAChH,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,cAAc;AACd,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,GAAG,EAAE,IAAI;oBACT,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS;AACV,iBAAA,CAAC;YACJ;iBAAO;AACL,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;gBACvD,IAAI,MAAM,EAAE;oBACV,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM;AAC3C,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzF,oBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;oBACpE,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO,EAAE,OAAO,IAAI,GAAG;AACvB,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,IAAI,EAAE,IAAI;AACV,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,GAAG,EAAE,GAAG;wBACR,cAAc;wBACd,SAAS;AACV,qBAAA,CAAC;gBACJ;YACF;QACF;AACA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC;;AAGD,IAAA,MAAM,GAAG,CAAC,OAAwB,KAAI;QACpC,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AAC7C,QAAA,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;AACnC,IAAA,CAAC;AAED,IAAA,YAAY,GAAG,CAAC,OAAwB,KAAI;QAC1C,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC7C,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC;AACrD,IAAA,CAAC;AAED,IAAA,aAAa,GAAG,CAAC,GAAuB,KAAI;AAC1C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;AAC1B,QAAA,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,WAAW,GAAG,GAAG,CAAC;AAC3C,QAAA,IAAI,OAAO,GAAG,CAAC,EAAE;YACf,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;QACvC;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED;;;AAGG;IACH,sBAAsB,GAAG,MAAW;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE;AAC7C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;AAChB,YAAA,IAAI,OAAO,CAAC,EAAE,UAAU,KAAK,QAAQ,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC1E,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;YACnC;AACA,YAAA,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC5D,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;wGAnsBU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA6BY,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAFZ,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3F5D,orMAwHA,EAAA,MAAA,EAAA,CAAA,s6ocAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChB,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAExB,YAAY,EAAA,UAAA,EAAA,CAAA;kBAjBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,OAAO;wBACP,gBAAgB;wBAChB,eAAe;wBACf,kBAAkB;wBAClB,kBAAkB;AAClB,wBAAA,kBAAkB,EAAE;AAAc,qBAAA,EAAA,QAAA,EAAA,orMAAA,EAAA,MAAA,EAAA,CAAA,s6ocAAA,CAAA,EAAA;;;AE9DtC;;AAEG;;;;"}
|
|
@@ -4,37 +4,72 @@ import { input, contentChild, computed, ChangeDetectionStrategy, Component } fro
|
|
|
4
4
|
import { SdHrefDirective } from '@sd-angular/core/directives';
|
|
5
5
|
import { SdEmptyPipe } from '@sd-angular/core/pipes';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* `<sd-view>` — pure read-only display of a value (text, hyperlink, or a custom template).
|
|
9
|
+
*
|
|
10
|
+
* Presentational proxy with no state of its own: the parent form control (`<sd-select>`,
|
|
11
|
+
* `<sd-input>`, …) computes the display string + resolved selection and passes them in;
|
|
12
|
+
* `<sd-view>` only decides WHICH template renders. It is the single rendering path for every
|
|
13
|
+
* "viewed" state across the form controls (DETAIL `viewed=true` and the `viewed='inline'`
|
|
14
|
+
* text face), so a custom `valueTemplate` (e.g. `sdViewDef` / `#sdValue`) looks identical in
|
|
15
|
+
* both. OnPush — re-renders only when an input signal changes.
|
|
16
|
+
*/
|
|
7
17
|
class SdView {
|
|
8
18
|
// ==========================================
|
|
9
19
|
// 1. SIGNAL INPUTS
|
|
10
20
|
// ==========================================
|
|
21
|
+
/** Optional label rendered above the value (omitted when a parent supplies its own label). */
|
|
11
22
|
label = input();
|
|
23
|
+
/** Raw selected value — NOT rendered directly; only exposed in the `valueTemplate` context as `value`. */
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
25
|
value = input();
|
|
13
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Display string — what shows when no custom value template is bound.
|
|
28
|
+
* why: `input.required()` forces the parent to bind `[display]` (compile error otherwise),
|
|
29
|
+
* so the component never has to guess a fallback string from `value`.
|
|
30
|
+
*/
|
|
14
31
|
display = input.required();
|
|
32
|
+
/** When set, the value renders as a link (`<a [sdHref]>`) instead of plain text. */
|
|
15
33
|
hyperlink = input();
|
|
16
|
-
|
|
34
|
+
/** Label template handed down by a parent control (wins over `label` + `#sdLabel`). */
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
36
|
labelTemplate = input();
|
|
37
|
+
/** Value template handed down by a parent control (wins over `display` + `#sdValue`). */
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
39
|
valueTemplate = input();
|
|
40
|
+
/**
|
|
41
|
+
* Resolved selected-item objects passed by the parent (e.g. `<sd-select>`).
|
|
42
|
+
* why: the parent owns option/lazy resolution — `<sd-view>` is a proxy and must NOT rebuild
|
|
43
|
+
* the list. Exposed in the value-template context so a "head +N" template can read `displayField`.
|
|
44
|
+
*/
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
selectedItems = input();
|
|
19
47
|
// ==========================================
|
|
20
|
-
// 2. SIGNAL QUERIES (
|
|
48
|
+
// 2. SIGNAL QUERIES (replace @ContentChild)
|
|
21
49
|
// ==========================================
|
|
22
|
-
|
|
50
|
+
/** `#sdLabel` template projected directly into `<sd-view>` (fallback when no `[labelTemplate]`). */
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
52
|
contentLabelTemplate = contentChild('sdLabel');
|
|
53
|
+
/** `#sdValue` template projected directly into `<sd-view>` (fallback when no `[valueTemplate]`). */
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
55
|
contentValueTemplate = contentChild('sdValue');
|
|
25
56
|
// ==========================================
|
|
26
|
-
// 3. COMPUTED SIGNALS (
|
|
57
|
+
// 3. COMPUTED SIGNALS (replace getters)
|
|
27
58
|
// ==========================================
|
|
28
|
-
|
|
29
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Effective label template: input from parent wins, else the projected `#sdLabel`.
|
|
61
|
+
* why: `computed` caches the choice so the template's `@if (activeLabelTemplate())` doesn't
|
|
62
|
+
* re-evaluate two content-child reads on every change-detection pass.
|
|
63
|
+
*/
|
|
30
64
|
activeLabelTemplate = computed(() => this.labelTemplate() ?? this.contentLabelTemplate());
|
|
65
|
+
/** Effective value template: input from parent wins, else the projected `#sdValue`. Cached for the same reason. */
|
|
31
66
|
activeValueTemplate = computed(() => this.valueTemplate() ?? this.contentValueTemplate());
|
|
32
67
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdView, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
33
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdView, isStandalone: true, selector: "sd-view", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: true, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: true, isRequired: false, transformFunction: null }, labelTemplate: { classPropertyName: "labelTemplate", publicName: "labelTemplate", isSignal: true, isRequired: false, transformFunction: null }, valueTemplate: { classPropertyName: "valueTemplate", publicName: "valueTemplate", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "contentLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "contentValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (activeLabelTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"activeLabelTemplate()!\"></ng-container>\r\n} @else {\r\n @if (label()) {\r\n <div class=\"T14R text-black400\">{{ label() }}</div>\r\n }\r\n}\r\n\r\n@if (activeValueTemplate()) {\r\n <ng-container
|
|
68
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdView, isStandalone: true, selector: "sd-view", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: true, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: true, isRequired: false, transformFunction: null }, labelTemplate: { classPropertyName: "labelTemplate", publicName: "labelTemplate", isSignal: true, isRequired: false, transformFunction: null }, valueTemplate: { classPropertyName: "valueTemplate", publicName: "valueTemplate", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "contentLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "contentValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (activeLabelTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"activeLabelTemplate()!\"></ng-container>\r\n} @else {\r\n @if (label()) {\r\n <div class=\"T14R text-black400\">{{ label() }}</div>\r\n }\r\n}\r\n\r\n<!--\r\n why: context ph\u1EA3i \u0111\u1EE7 cho M\u1ECCI consumer template (sdViewDef / #sdValue d\u00F9ng chung \u0111\u01B0\u1EDDng n\u00E0y):\r\n $implicit = display (cho `let-x`), value = gi\u00E1 tr\u1ECB th\u00F4, selectedItems = list item \u0111\u00E3 ch\u1ECDn\r\n (template \"head +N\"), selectedItem = item \u0111\u1EA7u (ti\u1EC7n cho single-select). Thi\u1EBFu key n\u00E0o l\u00E0\r\n template c\u1EE7a consumer m\u1EA5t bi\u1EBFn \u0111\u00F3 \u2192 \u0111\u1EEBng r\u00FAt g\u1ECDn.\r\n-->\r\n@if (activeValueTemplate()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n activeValueTemplate()!;\r\n context: {\r\n $implicit: display(),\r\n value: value(),\r\n selectedItems: selectedItems(),\r\n selectedItem: (selectedItems() ?? [])[0] ?? null,\r\n }\r\n \">\r\n </ng-container>\r\n} @else {\r\n @if (hyperlink(); as link) {\r\n <a [sdHref]=\"link\">{{ display() }}</a>\r\n } @else {\r\n <div class=\"T14M\">{{ display() | sdEmpty }}</div>\r\n }\r\n}", dependencies: [{ kind: "pipe", type: SdEmptyPipe, name: "sdEmpty" }, { kind: "directive", type: SdHrefDirective, selector: "a[sdHref]", inputs: ["sdHref"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
34
69
|
}
|
|
35
70
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdView, decorators: [{
|
|
36
71
|
type: Component,
|
|
37
|
-
args: [{ selector: 'sd-view', standalone: true, imports: [SdEmptyPipe, SdHrefDirective, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (activeLabelTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"activeLabelTemplate()!\"></ng-container>\r\n} @else {\r\n @if (label()) {\r\n <div class=\"T14R text-black400\">{{ label() }}</div>\r\n }\r\n}\r\n\r\n@if (activeValueTemplate()) {\r\n <ng-container
|
|
72
|
+
args: [{ selector: 'sd-view', standalone: true, imports: [SdEmptyPipe, SdHrefDirective, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (activeLabelTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"activeLabelTemplate()!\"></ng-container>\r\n} @else {\r\n @if (label()) {\r\n <div class=\"T14R text-black400\">{{ label() }}</div>\r\n }\r\n}\r\n\r\n<!--\r\n why: context ph\u1EA3i \u0111\u1EE7 cho M\u1ECCI consumer template (sdViewDef / #sdValue d\u00F9ng chung \u0111\u01B0\u1EDDng n\u00E0y):\r\n $implicit = display (cho `let-x`), value = gi\u00E1 tr\u1ECB th\u00F4, selectedItems = list item \u0111\u00E3 ch\u1ECDn\r\n (template \"head +N\"), selectedItem = item \u0111\u1EA7u (ti\u1EC7n cho single-select). Thi\u1EBFu key n\u00E0o l\u00E0\r\n template c\u1EE7a consumer m\u1EA5t bi\u1EBFn \u0111\u00F3 \u2192 \u0111\u1EEBng r\u00FAt g\u1ECDn.\r\n-->\r\n@if (activeValueTemplate()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n activeValueTemplate()!;\r\n context: {\r\n $implicit: display(),\r\n value: value(),\r\n selectedItems: selectedItems(),\r\n selectedItem: (selectedItems() ?? [])[0] ?? null,\r\n }\r\n \">\r\n </ng-container>\r\n} @else {\r\n @if (hyperlink(); as link) {\r\n <a [sdHref]=\"link\">{{ display() }}</a>\r\n } @else {\r\n <div class=\"T14M\">{{ display() | sdEmpty }}</div>\r\n }\r\n}" }]
|
|
38
73
|
}] });
|
|
39
74
|
|
|
40
75
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-view.mjs","sources":["../../../projects/sd-angular/components/view/src/view.component.ts","../../../projects/sd-angular/components/view/src/view.component.html","../../../projects/sd-angular/components/view/sd-angular-core-components-view.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-view.mjs","sources":["../../../projects/sd-angular/components/view/src/view.component.ts","../../../projects/sd-angular/components/view/src/view.component.html","../../../projects/sd-angular/components/view/sd-angular-core-components-view.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, TemplateRef, input, contentChild, computed } from '@angular/core';\nimport { SdHrefDirective } from '@sd-angular/core/directives';\nimport { SdEmptyPipe } from '@sd-angular/core/pipes';\n\n/**\n * `<sd-view>` — pure read-only display of a value (text, hyperlink, or a custom template).\n *\n * Presentational proxy with no state of its own: the parent form control (`<sd-select>`,\n * `<sd-input>`, …) computes the display string + resolved selection and passes them in;\n * `<sd-view>` only decides WHICH template renders. It is the single rendering path for every\n * \"viewed\" state across the form controls (DETAIL `viewed=true` and the `viewed='inline'`\n * text face), so a custom `valueTemplate` (e.g. `sdViewDef` / `#sdValue`) looks identical in\n * both. OnPush — re-renders only when an input signal changes.\n */\n@Component({\n selector: 'sd-view',\n standalone: true,\n imports: [SdEmptyPipe, SdHrefDirective, NgTemplateOutlet],\n templateUrl: './view.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdView {\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n\n /** Optional label rendered above the value (omitted when a parent supplies its own label). */\n label = input<string | null | undefined>();\n\n /** Raw selected value — NOT rendered directly; only exposed in the `valueTemplate` context as `value`. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value = input<any>();\n\n /**\n * Display string — what shows when no custom value template is bound.\n * why: `input.required()` forces the parent to bind `[display]` (compile error otherwise),\n * so the component never has to guess a fallback string from `value`.\n */\n display = input.required<string | null | undefined>();\n\n /** When set, the value renders as a link (`<a [sdHref]>`) instead of plain text. */\n hyperlink = input<string | null | undefined>();\n\n /** Label template handed down by a parent control (wins over `label` + `#sdLabel`). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n labelTemplate = input<TemplateRef<any> | undefined>();\n\n /** Value template handed down by a parent control (wins over `display` + `#sdValue`). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n valueTemplate = input<TemplateRef<any> | undefined>();\n\n /**\n * Resolved selected-item objects passed by the parent (e.g. `<sd-select>`).\n * why: the parent owns option/lazy resolution — `<sd-view>` is a proxy and must NOT rebuild\n * the list. Exposed in the value-template context so a \"head +N\" template can read `displayField`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selectedItems = input<any[] | undefined>();\n\n // ==========================================\n // 2. SIGNAL QUERIES (replace @ContentChild)\n // ==========================================\n\n /** `#sdLabel` template projected directly into `<sd-view>` (fallback when no `[labelTemplate]`). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contentLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n\n /** `#sdValue` template projected directly into `<sd-view>` (fallback when no `[valueTemplate]`). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contentValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n\n // ==========================================\n // 3. COMPUTED SIGNALS (replace getters)\n // ==========================================\n\n /**\n * Effective label template: input from parent wins, else the projected `#sdLabel`.\n * why: `computed` caches the choice so the template's `@if (activeLabelTemplate())` doesn't\n * re-evaluate two content-child reads on every change-detection pass.\n */\n activeLabelTemplate = computed(() => this.labelTemplate() ?? this.contentLabelTemplate());\n\n /** Effective value template: input from parent wins, else the projected `#sdValue`. Cached for the same reason. */\n activeValueTemplate = computed(() => this.valueTemplate() ?? this.contentValueTemplate());\n}\n","@if (activeLabelTemplate()) {\r\n <ng-container *ngTemplateOutlet=\"activeLabelTemplate()!\"></ng-container>\r\n} @else {\r\n @if (label()) {\r\n <div class=\"T14R text-black400\">{{ label() }}</div>\r\n }\r\n}\r\n\r\n<!--\r\n why: context phải đủ cho MỌI consumer template (sdViewDef / #sdValue dùng chung đường này):\r\n $implicit = display (cho `let-x`), value = giá trị thô, selectedItems = list item đã chọn\r\n (template \"head +N\"), selectedItem = item đầu (tiện cho single-select). Thiếu key nào là\r\n template của consumer mất biến đó → đừng rút gọn.\r\n-->\r\n@if (activeValueTemplate()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n activeValueTemplate()!;\r\n context: {\r\n $implicit: display(),\r\n value: value(),\r\n selectedItems: selectedItems(),\r\n selectedItem: (selectedItems() ?? [])[0] ?? null,\r\n }\r\n \">\r\n </ng-container>\r\n} @else {\r\n @if (hyperlink(); as link) {\r\n <a [sdHref]=\"link\">{{ display() }}</a>\r\n } @else {\r\n <div class=\"T14M\">{{ display() | sdEmpty }}</div>\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAKA;;;;;;;;;AASG;MAQU,MAAM,CAAA;;;;;IAMjB,KAAK,GAAG,KAAK,EAA6B;;;IAI1C,KAAK,GAAG,KAAK,EAAO;AAEpB;;;;AAIG;AACH,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA6B;;IAGrD,SAAS,GAAG,KAAK,EAA6B;;;IAI9C,aAAa,GAAG,KAAK,EAAgC;;;IAIrD,aAAa,GAAG,KAAK,EAAgC;AAErD;;;;AAIG;;IAEH,aAAa,GAAG,KAAK,EAAqB;;;;;;AAQ1C,IAAA,oBAAoB,GAAG,YAAY,CAAmB,SAAS,CAAC;;;AAIhE,IAAA,oBAAoB,GAAG,YAAY,CAAmB,SAAS,CAAC;;;;AAMhE;;;;AAIG;AACH,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;;AAGzF,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;wGA9D9E,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAM,+tCCtBnB,wuCAgCC,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EDdW,WAAW,EAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,0EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI7C,MAAM,EAAA,UAAA,EAAA,CAAA;kBAPlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAAA,UAAA,EACP,IAAI,EAAA,OAAA,EACP,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAExC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wuCAAA,EAAA;;;AEpBjD;;AAEG;;;;"}
|
|
@@ -3,9 +3,11 @@ export * from '@sd-angular/core/components/button';
|
|
|
3
3
|
export * from '@sd-angular/core/components/badge';
|
|
4
4
|
export * from '@sd-angular/core/components/tab-router';
|
|
5
5
|
export * from '@sd-angular/core/components/side-drawer';
|
|
6
|
+
export * from '@sd-angular/core/components/modal-resizable';
|
|
6
7
|
export * from '@sd-angular/core/components/modal';
|
|
7
8
|
export * from '@sd-angular/core/components/table';
|
|
8
9
|
export * from '@sd-angular/core/components/quick-action';
|
|
10
|
+
export * from '@sd-angular/core/components/query-bar';
|
|
9
11
|
export * from '@sd-angular/core/components/upload-file';
|
|
10
12
|
export * from '@sd-angular/core/components/section';
|
|
11
13
|
export * from '@sd-angular/core/components/anchor';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
|