@sdcorejs/angular 19.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +723 -0
- package/assets/fonts/fonts.scss +116 -0
- package/assets/fonts/material-icons/material-icons-outlined-v110-latin-regular.woff2 +0 -0
- package/assets/fonts/material-icons/material-icons-v145-latin-regular.woff2 +0 -0
- package/assets/fonts/material-symbols/material-symbols-v29-latin-regular.woff2 +0 -0
- package/assets/fonts/roboto/roboto-v50-latin_vietnamese-500.woff2 +0 -0
- package/assets/fonts/roboto/roboto-v50-latin_vietnamese-600.woff2 +0 -0
- package/assets/fonts/roboto/roboto-v50-latin_vietnamese-italic.woff2 +0 -0
- package/assets/fonts/roboto/roboto-v50-latin_vietnamese-regular.woff2 +0 -0
- 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 +604 -0
- package/assets/scss/ckeditor5.scss +88 -0
- package/assets/scss/core/color.scss +74 -0
- package/assets/scss/core/form.scss +302 -0
- package/assets/scss/core/image.scss +35 -0
- package/assets/scss/core/scrollbar.scss +30 -0
- package/assets/scss/core/utilities/_base.scss +333 -0
- package/assets/scss/core/utilities/_border.scss +22 -0
- package/assets/scss/core/utilities/_display.scss +10 -0
- package/assets/scss/core/utilities/_elevation.scss +80 -0
- package/assets/scss/core/utilities/_flexbox.scss +54 -0
- package/assets/scss/core/utilities/_gap.scss +9 -0
- package/assets/scss/core/utilities/_grid.scss +143 -0
- package/assets/scss/core/utilities/_index.scss +17 -0
- package/assets/scss/core/utilities/_misc.scss +20 -0
- package/assets/scss/core/utilities/_overflow.scss +9 -0
- package/assets/scss/core/utilities/_position.scss +8 -0
- package/assets/scss/core/utilities/_sizing.scss +28 -0
- package/assets/scss/core/utilities/_spacing.scss +31 -0
- package/assets/scss/core/utilities/_typography.scss +99 -0
- package/assets/scss/sd-core.scss +17 -0
- package/assets/scss/themes/default.scss +45 -0
- package/assets/scss/themes/material-theme.scss +101 -0
- package/components/anchor/index.d.ts +1 -0
- package/components/anchor/src/components/anchor/anchor.component.d.ts +22 -0
- package/components/anchor/src/components/anchor-item/anchor-item.component.d.ts +13 -0
- package/components/anchor/src/components/anchor-nav/anchor-nav.component.d.ts +21 -0
- package/components/anchor/src/components/index.d.ts +2 -0
- package/components/anchor/src/index.d.ts +2 -0
- package/components/anchor/src/models/index.d.ts +1 -0
- package/components/anchor/src/models/sd-anchor.model.d.ts +7 -0
- package/components/autoid-inspector/index.d.ts +8 -0
- package/components/autoid-inspector/src/autoid-inspector.component.d.ts +55 -0
- package/components/autoid-inspector/src/models/autoid-element.model.d.ts +55 -0
- package/components/autoid-inspector/src/models/autoid-export-format.model.d.ts +6 -0
- package/components/autoid-inspector/src/models/autoid-inspector-config.model.d.ts +8 -0
- package/components/autoid-inspector/src/services/autoid-audit.service.d.ts +19 -0
- package/components/autoid-inspector/src/services/autoid-export.service.d.ts +21 -0
- package/components/autoid-inspector/src/services/autoid-highlight.service.d.ts +12 -0
- package/components/autoid-inspector/src/services/autoid-scanner.service.d.ts +23 -0
- package/components/avatar/index.d.ts +1 -0
- package/components/avatar/src/avatar.component.d.ts +19 -0
- package/components/badge/index.d.ts +1 -0
- package/components/badge/src/badge.component.d.ts +98 -0
- package/components/base/index.d.ts +1 -0
- package/components/base/src/base-secure.component.d.ts +8 -0
- package/components/button/index.d.ts +1 -0
- package/components/button/src/button.component.d.ts +42 -0
- package/components/chart/index.d.ts +4 -0
- package/components/chart/src/bar-chart.component.d.ts +18 -0
- package/components/chart/src/doughnut-chart.component.d.ts +16 -0
- package/components/chart/src/line-chart.component.d.ts +18 -0
- package/components/chart/src/pie-chart.component.d.ts +16 -0
- package/components/ckeditor-styles/index.d.ts +1 -0
- package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +25 -0
- package/components/code-editor/index.d.ts +1 -0
- package/components/code-editor/src/code-editor.component.d.ts +25 -0
- package/components/document-builder/index.d.ts +4 -0
- package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +16 -0
- package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +4 -0
- package/components/document-builder/src/components/index.d.ts +1 -0
- package/components/document-builder/src/document-builder.component.d.ts +53 -0
- package/components/document-builder/src/document-builder.config.d.ts +21 -0
- package/components/document-builder/src/document-builder.model.d.ts +41 -0
- package/components/document-builder/src/document-builder.utils.d.ts +10 -0
- package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
- package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +44 -0
- package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +57 -0
- package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +5 -0
- package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +4 -0
- package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +31 -0
- package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +5 -0
- package/components/document-builder/src/plugins/index.d.ts +11 -0
- package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +24 -0
- package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
- package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
- package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
- package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
- package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
- package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
- package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
- package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
- package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
- package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
- package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
- package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
- package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
- package/components/document-builder/src/plugins/table-custom/index.d.ts +34 -0
- package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +51 -0
- package/components/editor/index.d.ts +3 -0
- package/components/editor/src/configurations/editor.configuration.d.ts +12 -0
- package/components/editor/src/configurations/index.d.ts +1 -0
- package/components/editor/src/editor.component.d.ts +52 -0
- package/components/editor/src/models/editor.model.d.ts +10 -0
- package/components/editor/src/models/image-upload.plugin.model.d.ts +51 -0
- package/components/editor/src/models/index.d.ts +2 -0
- package/components/editor/src/plugins/image-upload/image-upload.plugin.d.ts +22 -0
- package/components/editor/src/plugins/image-upload/utils/batch.utils.d.ts +14 -0
- package/components/editor/src/plugins/image-upload/utils/index.d.ts +3 -0
- package/components/editor/src/plugins/image-upload/utils/style.utils.d.ts +3 -0
- package/components/editor/src/plugins/image-upload/utils/validate.utils.d.ts +4 -0
- package/components/form-generic/index.d.ts +4 -0
- package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +23 -0
- package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +17 -0
- package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +14 -0
- package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +33 -0
- package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +26 -0
- package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +27 -0
- package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +35 -0
- package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +41 -0
- package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +14 -0
- package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +36 -0
- package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +15 -0
- package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +17 -0
- package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +21 -0
- package/components/form-generic/src/components/form-builder/components/checkbox/control/checkbox-control.component.d.ts +8 -0
- package/components/form-generic/src/components/form-builder/components/checkbox/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +22 -0
- package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/chip-calendar/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +22 -0
- package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/chip-string/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +31 -0
- package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +21 -0
- package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +18 -0
- package/components/form-generic/src/components/form-builder/components/datetime/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +47 -0
- package/components/form-generic/src/components/form-builder/components/group/attribute/group-attribute.component.d.ts +23 -0
- package/components/form-generic/src/components/form-builder/components/group/index.d.ts +1 -0
- package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +35 -0
- package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +30 -0
- package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +20 -0
- package/components/form-generic/src/components/form-builder/components/html/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/index.d.ts +13 -0
- package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +22 -0
- package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +17 -0
- package/components/form-generic/src/components/form-builder/components/number/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +22 -0
- package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/radio/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +22 -0
- package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/select/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +22 -0
- package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +19 -0
- package/components/form-generic/src/components/form-builder/components/table/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +21 -0
- package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/textarea/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +21 -0
- package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/textfield/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +27 -0
- package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +16 -0
- package/components/form-generic/src/components/form-builder/components/upload/index.d.ts +2 -0
- package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +120 -0
- package/components/form-generic/src/components/form-builder/services/builder.service.d.ts +11 -0
- package/components/form-generic/src/components/form-builder/services/index.d.ts +1 -0
- package/components/form-generic/src/components/form-render/components/index.d.ts +2 -0
- package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +30 -0
- package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +30 -0
- package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +34 -0
- package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +32 -0
- package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +11 -0
- package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +30 -0
- package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +38 -0
- package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +43 -0
- package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +51 -0
- package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +30 -0
- package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +33 -0
- package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +36 -0
- package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +32 -0
- package/components/form-generic/src/components/form-render/components/variable/variable.component.d.ts +22 -0
- package/components/form-generic/src/components/form-render/form-render.component.d.ts +39 -0
- package/components/form-generic/src/components/index.d.ts +3 -0
- package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +43 -0
- package/components/form-generic/src/configurations/form-generic.configuration.d.ts +6 -0
- package/components/form-generic/src/configurations/form.configuration.d.ts +12 -0
- package/components/form-generic/src/configurations/index.d.ts +2 -0
- package/components/form-generic/src/models/form-generic-component.model.d.ts +318 -0
- package/components/form-generic/src/models/form-generic-definition-html.model.d.ts +28 -0
- package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +49 -0
- package/components/form-generic/src/models/form-generic-definition-table.model.d.ts +6 -0
- package/components/form-generic/src/models/form-generic-expression.model.d.ts +74 -0
- package/components/form-generic/src/models/form-generic-template.model.d.ts +6 -0
- package/components/form-generic/src/models/form-generic-validation.model.d.ts +30 -0
- package/components/form-generic/src/models/form-generic.model.d.ts +7 -0
- package/components/form-generic/src/models/form-render/form-render-args.model.d.ts +7 -0
- package/components/form-generic/src/models/form-render/form-render-entity.model.d.ts +3 -0
- package/components/form-generic/src/models/form-render/index.d.ts +2 -0
- package/components/form-generic/src/models/index.d.ts +8 -0
- package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +14 -0
- package/components/form-generic/src/pipes/expression-feel.pipe.d.ts +10 -0
- package/components/form-generic/src/pipes/expression-query.pipe.d.ts +10 -0
- package/components/form-generic/src/pipes/expression-view.pipe.d.ts +8 -0
- package/components/form-generic/src/pipes/html.pipe.d.ts +11 -0
- package/components/form-generic/src/pipes/hyperlink.pipe.d.ts +8 -0
- package/components/form-generic/src/pipes/index.d.ts +7 -0
- package/components/form-generic/src/pipes/when-expression.pipe.d.ts +13 -0
- package/components/form-generic/src/services/form-generic.service.d.ts +26 -0
- package/components/form-generic/src/services/form-render.service.d.ts +10 -0
- package/components/form-generic/src/services/index.d.ts +2 -0
- package/components/history/index.d.ts +1 -0
- package/components/history/models/history.model.d.ts +13 -0
- package/components/history/pipes/view-date.pipe.d.ts +8 -0
- package/components/history/src/history.component.d.ts +7 -0
- package/components/import-excel/index.d.ts +2 -0
- package/components/import-excel/src/import-excel.component.d.ts +47 -0
- package/components/import-excel/src/import-excel.model.d.ts +102 -0
- package/components/import-excel/src/pipes/columm-hidden.pipe.d.ts +10 -0
- package/components/import-excel/src/pipes/column-transform.pipe.d.ts +11 -0
- package/components/index.d.ts +23 -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/mini-editor/index.d.ts +2 -0
- package/components/mini-editor/src/mini-editor.component.d.ts +91 -0
- package/components/mini-editor/src/mini-editor.model.d.ts +44 -0
- package/components/modal/index.d.ts +1 -0
- package/components/modal/src/modal.component.d.ts +30 -0
- package/components/operator/index.d.ts +1 -0
- package/components/operator/src/operator.component.d.ts +34 -0
- package/components/preview/index.d.ts +4 -0
- package/components/preview/src/preview-image/preview-image.component.d.ts +88 -0
- package/components/preview/src/preview-image/preview-image.types.d.ts +53 -0
- package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +186 -0
- package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +84 -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 +87 -0
- package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +71 -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/query-builder/index.d.ts +1 -0
- package/components/query-builder/src/query-builder.component.d.ts +26 -0
- package/components/quick-action/index.d.ts +1 -0
- package/components/quick-action/src/quick-action.component.d.ts +9 -0
- package/components/section/index.d.ts +2 -0
- package/components/section/src/section-item/section-item.component.d.ts +7 -0
- package/components/section/src/section.component.d.ts +18 -0
- package/components/side-drawer/index.d.ts +1 -0
- package/components/side-drawer/src/side-drawer.component.d.ts +30 -0
- package/components/splitter/index.d.ts +3 -0
- package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +24 -0
- package/components/splitter/src/splitter-panel/splitter-panel.component.d.ts +16 -0
- package/components/splitter/src/splitter-state.service.d.ts +26 -0
- package/components/splitter/src/splitter.component.d.ts +28 -0
- package/components/splitter/src/splitter.models.d.ts +23 -0
- 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/index.d.ts +4 -0
- package/components/tab-router/src/actions/tab-router.action.d.ts +5 -0
- package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +22 -0
- package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +16 -0
- package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +15 -0
- package/components/tab-router/src/decorators/tab.decorator.d.ts +16 -0
- package/components/tab-router/src/events/tab-router.event.d.ts +11 -0
- package/components/tab-router/src/models/index.d.ts +1 -0
- package/components/tab-router/src/models/tab-router.model.d.ts +21 -0
- package/components/tab-router/src/pipes/tab-info.pipe.d.ts +11 -0
- package/components/tab-router/src/services/tab-decorator.service.d.ts +9 -0
- package/components/tab-router/src/services/tab-router.service.d.ts +27 -0
- package/components/table/index.d.ts +11 -0
- package/components/table/src/components/column-title/column-title.component.d.ts +10 -0
- package/components/table/src/components/command/desktop-command.component.d.ts +14 -0
- package/components/table/src/components/command/pipes/command.pipe.d.ts +30 -0
- package/components/table/src/components/command/pipes/filter.pipe.d.ts +35 -0
- package/components/table/src/components/config/config.component.d.ts +25 -0
- package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +24 -0
- package/components/table/src/components/desktop-cell/view/view.component.d.ts +24 -0
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +32 -0
- package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +27 -0
- package/components/table/src/components/filter/index.d.ts +3 -0
- package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +42 -0
- package/components/table/src/components/index.d.ts +3 -0
- package/components/table/src/components/popup-export/popup-export.component.d.ts +51 -0
- package/components/table/src/components/selector-action/action-filter.pipe.d.ts +34 -0
- package/components/table/src/components/selector-action/selector-action.component.d.ts +16 -0
- package/components/table/src/configurations/index.d.ts +1 -0
- package/components/table/src/configurations/table.configuration.d.ts +35 -0
- package/components/table/src/directives/index.d.ts +6 -0
- package/components/table/src/directives/sd-column-resize.directive.d.ts +13 -0
- package/components/table/src/directives/sd-table-cell-def.directive.d.ts +16 -0
- package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +16 -0
- package/components/table/src/directives/sd-table-expand-def.directive.d.ts +13 -0
- package/components/table/src/directives/sd-table-filter-def.directive.d.ts +14 -0
- package/components/table/src/directives/sd-table-footer-def.directive.d.ts +16 -0
- 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 +14 -0
- package/components/table/src/directives/sticky-shadow.directive.d.ts +17 -0
- package/components/table/src/models/index.d.ts +5 -0
- package/components/table/src/models/table-column.model.d.ts +119 -0
- package/components/table/src/models/table-command.model.d.ts +25 -0
- package/components/table/src/models/table-item.model.d.ts +65 -0
- package/components/table/src/models/table-option-config.model.d.ts +42 -0
- package/components/table/src/models/table-option-expand.model.d.ts +6 -0
- package/components/table/src/models/table-option-export.model.d.ts +42 -0
- package/components/table/src/models/table-option-group.model.d.ts +21 -0
- package/components/table/src/models/table-option-paginate.model.d.ts +7 -0
- package/components/table/src/models/table-option-reload.model.d.ts +7 -0
- package/components/table/src/models/table-option-selector.model.d.ts +105 -0
- package/components/table/src/models/table-option-sort.model.d.ts +3 -0
- package/components/table/src/models/table-option-style.model.d.ts +11 -0
- package/components/table/src/models/table-option-tree.model.d.ts +12 -0
- package/components/table/src/models/table-option.model.d.ts +181 -0
- package/components/table/src/pipes/filter-values.pipe.d.ts +8 -0
- package/components/table/src/pipes/index.d.ts +2 -0
- package/components/table/src/pipes/sd-group.pipe.d.ts +23 -0
- package/components/table/src/pipes/sd-tree.pipe.d.ts +9 -0
- package/components/table/src/pipes/selection-disabled.pipe.d.ts +9 -0
- package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +9 -0
- package/components/table/src/pipes/selection-visible.pipe.d.ts +9 -0
- package/components/table/src/services/column-width.util.d.ts +7 -0
- package/components/table/src/services/config.service.d.ts +21 -0
- package/components/table/src/services/index.d.ts +3 -0
- package/components/table/src/services/table-export/table-export.service.d.ts +26 -0
- package/components/table/src/services/table-filter/table-filter.model.d.ts +150 -0
- package/components/table/src/services/table-filter/table-filter.service.d.ts +20 -0
- package/components/table/src/services/table-format/table-format.service.d.ts +16 -0
- package/components/table/src/services/tree/tree.util.d.ts +14 -0
- package/components/table/src/table.component.d.ts +137 -0
- package/components/upload-file/index.d.ts +2 -0
- package/components/upload-file/src/components/preview/preview.component.d.ts +23 -0
- package/components/upload-file/src/configurations/index.d.ts +1 -0
- package/components/upload-file/src/configurations/upload-file.configuration.d.ts +50 -0
- package/components/upload-file/src/pipes/document.pipe.d.ts +8 -0
- package/components/upload-file/src/pipes/image.pipe.d.ts +8 -0
- package/components/upload-file/src/pipes/index.d.ts +2 -0
- package/components/upload-file/src/services/index.d.ts +2 -0
- package/components/upload-file/src/services/upload-file.model.d.ts +12 -0
- package/components/upload-file/src/services/upload-file.service.d.ts +10 -0
- package/components/upload-file/src/upload-file.component.d.ts +85 -0
- package/components/view/index.d.ts +1 -0
- package/components/view/src/view.component.d.ts +17 -0
- package/configurations/index.d.ts +1 -0
- package/configurations/src/sd-core.configuration.d.ts +10 -0
- package/directives/index.d.ts +6 -0
- package/directives/src/sd-desktop.directive.d.ts +7 -0
- package/directives/src/sd-hover-copy.directive.d.ts +16 -0
- package/directives/src/sd-href.directive.d.ts +9 -0
- package/directives/src/sd-mobile.directive.d.ts +7 -0
- package/directives/src/sd-scroll.directive.d.ts +14 -0
- package/directives/src/sd-tooltip.directive.d.ts +26 -0
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +197 -0
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +723 -0
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-avatar.mjs +103 -0
- package/fesm2022/sdcorejs-angular-components-avatar.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs +138 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-base.mjs +23 -0
- package/fesm2022/sdcorejs-angular-components-base.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-button.mjs +118 -0
- package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-chart.mjs +290 -0
- package/fesm2022/sdcorejs-angular-components-chart.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +38 -0
- package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs +128 -0
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs +5053 -0
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-editor.mjs +1079 -0
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +6715 -0
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-history.mjs +51 -0
- package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +583 -0
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-inform.mjs +190 -0
- package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +333 -0
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-modal.mjs +108 -0
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-operator.mjs +75 -0
- package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-preview.mjs +1987 -0
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +1430 -0
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +83 -0
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-quick-action.mjs +22 -0
- package/fesm2022/sdcorejs-angular-components-quick-action.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-section.mjs +64 -0
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +129 -0
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-splitter.mjs +649 -0
- package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-stepper.mjs +140 -0
- package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +605 -0
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-tab.mjs +145 -0
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-table.mjs +4524 -0
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +868 -0
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-view.mjs +48 -0
- package/fesm2022/sdcorejs-angular-components-view.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components.mjs +28 -0
- package/fesm2022/sdcorejs-angular-components.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-configurations.mjs +10 -0
- package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-directives.mjs +497 -0
- package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +454 -0
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +139 -0
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +364 -0
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +363 -0
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +354 -0
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-date.mjs +356 -0
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +748 -0
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-directives.mjs +67 -0
- package/fesm2022/sdcorejs-angular-forms-directives.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs +117 -0
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +438 -0
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-input.mjs +354 -0
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-label.mjs +51 -0
- package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-models.mjs +137 -0
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +190 -0
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-select.mjs +593 -0
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-switch.mjs +144 -0
- package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +300 -0
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms.mjs +48 -0
- package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-handlers.mjs +67 -0
- package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-i18n.mjs +2592 -0
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-interceptors.mjs +166 -0
- package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-models.mjs +6 -0
- package/fesm2022/sdcorejs-angular-models.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-auth.mjs +137 -0
- package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-authom.mjs +360 -0
- package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +127 -0
- package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +1633 -0
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-permission.mjs +249 -0
- package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules.mjs +10 -0
- package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-pipes.mjs +149 -0
- package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-api.mjs +235 -0
- package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-cache.mjs +161 -0
- package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +208 -0
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-docx.mjs +300 -0
- package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-excel.mjs +422 -0
- package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-license.mjs +104 -0
- package/fesm2022/sdcorejs-angular-services-license.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-loading.mjs +92 -0
- package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-notify.mjs +268 -0
- package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-storage.mjs +174 -0
- package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services.mjs +13 -0
- package/fesm2022/sdcorejs-angular-services.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-utilities-data-state.mjs +38 -0
- package/fesm2022/sdcorejs-angular-utilities-data-state.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +391 -0
- package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-utilities-models.mjs +55 -0
- package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-utilities.mjs +8 -0
- package/fesm2022/sdcorejs-angular-utilities.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular.mjs +19 -0
- package/fesm2022/sdcorejs-angular.mjs.map +1 -0
- package/forms/autocomplete/index.d.ts +1 -0
- package/forms/autocomplete/src/autocomplete.component.d.ts +93 -0
- package/forms/checkbox/index.d.ts +1 -0
- package/forms/checkbox/src/checkbox.component.d.ts +28 -0
- package/forms/chip/index.d.ts +1 -0
- package/forms/chip/src/chip.component.d.ts +71 -0
- package/forms/chip/src/index.d.ts +2 -0
- package/forms/chip/src/pipes/index.d.ts +1 -0
- package/forms/chip/src/pipes/removable-chip.pipe.d.ts +8 -0
- package/forms/chip-calendar/index.d.ts +1 -0
- package/forms/chip-calendar/src/chip-calendar.component.d.ts +71 -0
- package/forms/chip-calendar/src/pipes/index.d.ts +1 -0
- package/forms/chip-calendar/src/pipes/removable-chip.pipe.d.ts +8 -0
- package/forms/date/index.d.ts +1 -0
- package/forms/date/src/date.component.d.ts +79 -0
- package/forms/date-range/index.d.ts +1 -0
- package/forms/date-range/src/date-range.component.d.ts +81 -0
- package/forms/datetime/index.d.ts +1 -0
- package/forms/datetime/src/datetime.component.d.ts +89 -0
- package/forms/datetime/src/popup/sd-datetime-picker.component.d.ts +37 -0
- package/forms/datetime/src/popup/sd-time-spinner.component.d.ts +41 -0
- package/forms/directives/index.d.ts +4 -0
- package/forms/directives/src/item-def.directive.d.ts +13 -0
- package/forms/directives/src/label-def.directive.d.ts +9 -0
- package/forms/directives/src/suffix-def.directive.d.ts +9 -0
- package/forms/directives/src/view-def.directive.d.ts +14 -0
- package/forms/index.d.ts +17 -0
- package/forms/input/index.d.ts +1 -0
- package/forms/input/src/input.component.d.ts +84 -0
- package/forms/input-color/index.d.ts +1 -0
- package/forms/input-color/src/input-color.component.d.ts +32 -0
- package/forms/input-number/index.d.ts +1 -0
- package/forms/input-number/src/input-number.component.d.ts +95 -0
- package/forms/label/index.d.ts +1 -0
- package/forms/label/src/label.component.d.ts +13 -0
- package/forms/models/index.d.ts +6 -0
- package/forms/models/src/form-control-state.d.ts +23 -0
- package/forms/models/src/sd-custom-validator.model.d.ts +15 -0
- package/forms/models/src/sd-form-control.model.d.ts +21 -0
- package/forms/models/src/sd-form.configuration.d.ts +6 -0
- package/forms/models/src/sd-search.model.d.ts +7 -0
- package/forms/models/src/sd-selection-data.model.d.ts +7 -0
- package/forms/radio/index.d.ts +1 -0
- package/forms/radio/src/radio.component.d.ts +49 -0
- package/forms/select/index.d.ts +1 -0
- package/forms/select/src/select.component.d.ts +93 -0
- package/forms/src/forms.module.d.ts +14 -0
- package/forms/switch/index.d.ts +1 -0
- package/forms/switch/src/switch.component.d.ts +32 -0
- package/forms/textarea/index.d.ts +1 -0
- package/forms/textarea/src/textarea.component.d.ts +65 -0
- package/handlers/global-error.handler.d.ts +9 -0
- package/handlers/index.d.ts +1 -0
- package/i18n/index.d.ts +5 -0
- package/i18n/src/en.d.ts +449 -0
- package/i18n/src/i18n.messages.d.ts +2 -0
- package/i18n/src/i18n.pipe.d.ts +9 -0
- package/i18n/src/i18n.service.d.ts +14 -0
- package/i18n/src/i18n.token.d.ts +1 -0
- package/i18n/src/i18n.types.d.ts +31 -0
- package/i18n/src/ja.d.ts +2 -0
- package/i18n/src/ko.d.ts +2 -0
- package/i18n/src/vi.d.ts +2 -0
- package/i18n/src/zh.d.ts +2 -0
- package/index.d.ts +5 -0
- package/interceptors/index.d.ts +2 -0
- package/interceptors/no-internet/no-internet.interceptor.d.ts +14 -0
- package/interceptors/unauthorized/unauthorized.interceptor.d.ts +12 -0
- package/models/index.d.ts +1 -0
- package/models/src/language.model.d.ts +2 -0
- package/modules/auth/configurations/auth.configuration.d.ts +19 -0
- package/modules/auth/configurations/index.d.ts +1 -0
- package/modules/auth/guards/auth.guard.d.ts +11 -0
- package/modules/auth/guards/index.d.ts +2 -0
- package/modules/auth/guards/portal.guard.d.ts +11 -0
- package/modules/auth/index.d.ts +3 -0
- package/modules/auth/services/auth.model.d.ts +8 -0
- package/modules/auth/services/auth.service.d.ts +17 -0
- package/modules/auth/services/index.d.ts +2 -0
- package/modules/authom/authom.configuration.d.ts +17 -0
- package/modules/authom/authom.interceptor.d.ts +3 -0
- package/modules/authom/authom.module.d.ts +16 -0
- package/modules/authom/authom.service.d.ts +32 -0
- package/modules/authom/index.d.ts +35 -0
- package/modules/index.d.ts +5 -0
- package/modules/keycloak/index.d.ts +4 -0
- package/modules/keycloak/keycloak.configuration.d.ts +11 -0
- package/modules/keycloak/keycloak.interceptor.d.ts +2 -0
- package/modules/keycloak/keycloak.module.d.ts +18 -0
- package/modules/keycloak/keycloak.service.d.ts +14 -0
- package/modules/layout/components/index.d.ts +4 -0
- package/modules/layout/components/layout-main/layout-main.component.d.ts +12 -0
- package/modules/layout/components/page/page.component.d.ts +10 -0
- package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +35 -0
- package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +24 -0
- package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +21 -0
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +55 -0
- package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +22 -0
- package/modules/layout/components/sidebar-v1/main.component.d.ts +24 -0
- package/modules/layout/configurations/index.d.ts +1 -0
- package/modules/layout/configurations/layout.configuration.d.ts +67 -0
- package/modules/layout/index.d.ts +5 -0
- package/modules/layout/layout.module.d.ts +7 -0
- package/modules/layout/layout.routing.d.ts +2 -0
- package/modules/layout/modules/forbidden/forbidden.module.d.ts +8 -0
- package/modules/layout/modules/forbidden/forbidden.routing.d.ts +2 -0
- package/modules/layout/modules/forbidden/index.d.ts +1 -0
- package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +10 -0
- package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +33 -0
- package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +11 -0
- package/modules/layout/modules/home/home.module.d.ts +8 -0
- package/modules/layout/modules/home/home.routing.d.ts +7 -0
- package/modules/layout/modules/home/index.d.ts +1 -0
- package/modules/layout/modules/index.d.ts +3 -0
- package/modules/layout/modules/not-found/index.d.ts +1 -0
- package/modules/layout/modules/not-found/not-found.module.d.ts +8 -0
- package/modules/layout/modules/not-found/not-found.routing.d.ts +2 -0
- package/modules/layout/modules/not-found/pages/root/root.component.d.ts +10 -0
- package/modules/layout/pipes/high-light-search.pipe.d.ts +10 -0
- package/modules/layout/pipes/index.d.ts +3 -0
- package/modules/layout/pipes/menu-focus.pipe.d.ts +10 -0
- package/modules/layout/pipes/menu.pipe.d.ts +13 -0
- package/modules/layout/services/index.d.ts +3 -0
- package/modules/layout/services/layout.service.d.ts +10 -0
- package/modules/layout/services/menu/menu.model.d.ts +24 -0
- package/modules/layout/services/storage/storage.service.d.ts +13 -0
- package/modules/permission/index.d.ts +4 -0
- package/modules/permission/src/configurations/index.d.ts +1 -0
- package/modules/permission/src/configurations/permission.configuration.d.ts +63 -0
- package/modules/permission/src/directives/index.d.ts +1 -0
- package/modules/permission/src/directives/permission.directive.d.ts +9 -0
- package/modules/permission/src/guards/index.d.ts +1 -0
- package/modules/permission/src/guards/permission.guard.d.ts +14 -0
- package/modules/permission/src/services/index.d.ts +1 -0
- package/modules/permission/src/services/permission.service.d.ts +12 -0
- package/package.json +344 -0
- package/pipes/index.d.ts +4 -0
- package/pipes/src/empty.pipe.d.ts +7 -0
- package/pipes/src/format-number.pipe.d.ts +11 -0
- package/pipes/src/safe-html.pipe.d.ts +11 -0
- package/pipes/src/time-different.pipe.d.ts +13 -0
- package/public-api.d.ts +10 -0
- package/services/api/index.d.ts +4 -0
- package/services/api/src/api.model.d.ts +36 -0
- package/services/api/src/api.module.d.ts +6 -0
- package/services/api/src/api.service.d.ts +19 -0
- package/services/api/src/interceptors/api.interceptor.d.ts +9 -0
- package/services/cache/index.d.ts +2 -0
- package/services/cache/src/cache.model.d.ts +30 -0
- package/services/cache/src/cache.service.d.ts +9 -0
- package/services/confirm/index.d.ts +1 -0
- package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +46 -0
- package/services/confirm/src/lib/confirm.service.d.ts +55 -0
- package/services/confirm/src/public-api.d.ts +2 -0
- package/services/docx/index.d.ts +1 -0
- package/services/docx/src/lib/docx.model.d.ts +9 -0
- package/services/docx/src/lib/docx.service.d.ts +15 -0
- package/services/docx/src/lib/pandoc-core.d.ts +11 -0
- package/services/docx/src/public-api.d.ts +2 -0
- package/services/excel/index.d.ts +1 -0
- package/services/excel/src/lib/excel.model.d.ts +31 -0
- package/services/excel/src/lib/excel.service.d.ts +19 -0
- package/services/excel/src/public-api.d.ts +2 -0
- package/services/index.d.ts +8 -0
- package/services/license/index.d.ts +1 -0
- package/services/license/src/license.service.d.ts +10 -0
- package/services/loading/index.d.ts +1 -0
- package/services/loading/src/loading.service.d.ts +14 -0
- package/services/notify/index.d.ts +2 -0
- package/services/notify/src/components/toast/toast.component.d.ts +28 -0
- package/services/notify/src/components/toast-container.component.d.ts +8 -0
- package/services/notify/src/notify.model.d.ts +16 -0
- package/services/notify/src/notify.service.d.ts +20 -0
- package/services/storage/index.d.ts +2 -0
- package/services/storage/src/storage.model.d.ts +20 -0
- package/services/storage/src/storage.service.d.ts +10 -0
- package/utilities/data-state/index.d.ts +1 -0
- package/utilities/data-state/src/data-state.d.ts +11 -0
- package/utilities/extensions/index.d.ts +6 -0
- package/utilities/extensions/src/array.extension.d.ts +1 -0
- package/utilities/extensions/src/color.extension.d.ts +5 -0
- package/utilities/extensions/src/date.extension.d.ts +1 -0
- package/utilities/extensions/src/number.extension.d.ts +1 -0
- package/utilities/extensions/src/string.extension.d.ts +50 -0
- package/utilities/extensions/src/utility.extension.d.ts +31 -0
- package/utilities/index.d.ts +3 -0
- package/utilities/models/index.d.ts +12 -0
- package/utilities/models/src/color.model.d.ts +4 -0
- package/utilities/models/src/empty.model.d.ts +4 -0
- package/utilities/models/src/filter.model.d.ts +12 -0
- package/utilities/models/src/icon.model.d.ts +2 -0
- package/utilities/models/src/maybe-async.model.d.ts +10 -0
- package/utilities/models/src/nested-key-of.model.d.ts +4 -0
- package/utilities/models/src/operator.model.d.ts +13 -0
- package/utilities/models/src/order.model.d.ts +4 -0
- package/utilities/models/src/paging.model.d.ts +8 -0
- package/utilities/models/src/pattern.model.d.ts +21 -0
- package/utilities/models/src/size.model.d.ts +4 -0
- package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-autoid-inspector.mjs","sources":["../../../projects/sdcorejs-angular/components/autoid-inspector/src/models/autoid-inspector-config.model.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-scanner.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-audit.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-highlight.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-export.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/autoid-inspector.component.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/autoid-inspector.component.html","../../../projects/sdcorejs-angular/components/autoid-inspector/sdcorejs-angular-components-autoid-inspector.ts"],"sourcesContent":["export interface SdAutoidInspectorConfig {\n /** Selector phụ thêm cần audit (mặc định component đã cover sd-* form + sd-button). */\n extraRequireSelectors?: string[];\n /** Root scan, mặc định document.body. */\n root?: HTMLElement;\n}\n\n/** Selector mặc định coi là phải có data-autoid. */\nexport const SD_AUTOID_DEFAULT_REQUIRE_SELECTORS: ReadonlyArray<string> = [\n 'sd-input',\n 'sd-input-number',\n 'sd-textarea',\n 'sd-select',\n 'sd-autocomplete',\n 'sd-checkbox',\n 'sd-radio',\n 'sd-switch',\n 'sd-date',\n 'sd-datetime',\n 'sd-date-range',\n 'sd-chip',\n 'sd-chip-calendar',\n 'sd-button',\n];\n","import { Injectable } from '@angular/core';\nimport { SdAutoidElement, SdAutoidElementState } from '../models/autoid-element.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidScannerService {\n /** Quét toàn bộ element có [data-autoid] trong root, gắn thông tin name/tag/value/xpath. */\n scan(root: HTMLElement = document.body): SdAutoidElement[] {\n const nodes = root.querySelectorAll<HTMLElement>('[data-autoid]');\n const dupCount: Record<string, number> = {};\n nodes.forEach(n => {\n const id = n.getAttribute('data-autoid');\n if (!id) return;\n dupCount[id] = (dupCount[id] ?? 0) + 1;\n });\n\n const result: SdAutoidElement[] = [];\n let stt = 1;\n nodes.forEach(node => {\n const autoid = node.getAttribute('data-autoid');\n if (!autoid) return;\n const state = this.readState(node);\n const tableScope = this.resolveTableScope(node);\n result.push({\n stt: stt++,\n name: this.resolveName(node),\n autoid,\n tag: this.resolveSdTag(node),\n text: this.resolveText(node),\n xpath: `//*[@data-autoid=\"${autoid}\"]`,\n duplicate: dupCount[autoid] > 1,\n state,\n tableScope,\n });\n });\n return result;\n }\n\n /** Group element theo autoid để consumer lấy duplicate map. */\n groupByAutoid(elements: SdAutoidElement[]): Record<string, SdAutoidElement[]> {\n const map: Record<string, SdAutoidElement[]> = {};\n for (const el of elements) {\n (map[el.autoid] ??= []).push(el);\n }\n return map;\n }\n\n /**\n * Read the optional `data-*` E2E state attributes off the same node.\n * Only includes fields actually present on the DOM (skipped fields stay undefined).\n */\n private readState(node: HTMLElement): SdAutoidElementState {\n const get = (n: string): string | undefined => {\n const v = node.getAttribute(n);\n return v === null ? undefined : v;\n };\n return {\n disabled: get('data-disabled'),\n loading: get('data-loading'),\n empty: get('data-empty'),\n invalid: get('data-invalid'),\n opened: get('data-opened'),\n count: get('data-count'),\n dataValue: get('data-value'),\n required: get('data-required'),\n maxlength: get('data-maxlength'),\n minlength: get('data-minlength'),\n pattern: get('data-pattern'),\n errorMessage: get('data-error-message'),\n };\n }\n\n /**\n * If the node is inside an `<sd-table>` element, return that table's `data-autoid`.\n * Walks up via closest('sd-table') — skips the node itself if it IS the table.\n */\n private resolveTableScope(node: HTMLElement): string | undefined {\n // Skip self if the node itself is the sd-table host.\n const start = node.tagName.toLowerCase() === 'sd-table' ? node.parentElement : node;\n const table = start?.closest('sd-table') as HTMLElement | null;\n if (!table || table === node) return undefined;\n const id = table.getAttribute('data-autoid');\n return id ?? undefined;\n }\n\n private resolveName(node: HTMLElement): string {\n if (node.id) {\n // CSS.escape phòng id chứa ký tự đặc biệt làm vỡ selector.\n const sel = typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(node.id) : node.id;\n const label = document.querySelector(`label[for=\"${sel}\"]`);\n const text = label?.textContent?.trim();\n if (text) return text;\n }\n return node.getAttribute('aria-label')?.trim()\n ?? node.getAttribute('placeholder')?.trim()\n ?? node.getAttribute('title')?.trim()\n ?? '';\n }\n\n private resolveSdTag(node: HTMLElement): string {\n let cur: HTMLElement | null = node;\n while (cur) {\n const tag = cur.tagName.toLowerCase();\n if (tag.startsWith('sd-')) return tag;\n cur = cur.parentElement;\n }\n return node.tagName.toLowerCase();\n }\n\n private resolveText(node: HTMLElement): string {\n const input = node as HTMLInputElement;\n if (typeof input.value === 'string' && input.value) return input.value;\n return (node.textContent ?? '').trim().slice(0, 80);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SdAutoidElement, SdAutoidAuditResult, SdAutoidMissing } from '../models/autoid-element.model';\nimport { SD_AUTOID_DEFAULT_REQUIRE_SELECTORS } from '../models/autoid-inspector-config.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidAuditService {\n /**\n * Audit kết quả scan + DOM:\n * - duplicates: map autoid → count khi count > 1\n * - missing: element khớp selector yêu cầu nhưng KHÔNG có [data-autoid]\n */\n audit(\n elements: SdAutoidElement[],\n options: { requireSelectors?: ReadonlyArray<string>; root?: HTMLElement } = {}\n ): SdAutoidAuditResult {\n const requireSelectors = options.requireSelectors ?? SD_AUTOID_DEFAULT_REQUIRE_SELECTORS;\n const root = options.root ?? document.body;\n\n const duplicates: Record<string, number> = {};\n for (const el of elements) {\n if (el.duplicate) {\n duplicates[el.autoid] = (duplicates[el.autoid] ?? 0) + 1;\n }\n }\n\n const missing = this.findMissing(root, requireSelectors);\n\n return {\n total: elements.length,\n duplicates,\n duplicateCount: Object.keys(duplicates).length,\n missing,\n missingCount: missing.length,\n };\n }\n\n private findMissing(root: HTMLElement, selectors: ReadonlyArray<string>): SdAutoidMissing[] {\n if (!selectors.length) return [];\n const joined = selectors.join(',');\n const nodes = root.querySelectorAll<HTMLElement>(joined);\n const missing: SdAutoidMissing[] = [];\n\n nodes.forEach(node => {\n // Coi là missing khi element + mọi descendant đều không có data-autoid.\n // Lý do: sd-button render thành <button data-autoid=\"...\"> bên trong host\n // <sd-button>. Nếu chỉ check chính host sẽ false-positive cho mọi sd-button.\n if (node.hasAttribute('data-autoid')) return;\n if (node.querySelector('[data-autoid]')) return;\n\n missing.push({\n tag: node.tagName.toLowerCase(),\n selector: this.buildSelectorPath(node),\n outerHtmlPreview: this.shortHtml(node),\n nameHint: this.resolveNameHint(node),\n });\n });\n\n return missing;\n }\n\n private buildSelectorPath(node: HTMLElement): string {\n const parts: string[] = [];\n let cur: HTMLElement | null = node;\n let depth = 0;\n while (cur && depth < 4) {\n let part = cur.tagName.toLowerCase();\n if (cur.id) {\n part += `#${cur.id}`;\n parts.unshift(part);\n break;\n }\n const cls = (cur.getAttribute('class') ?? '').trim().split(/\\s+/).filter(Boolean).slice(0, 2);\n if (cls.length) part += `.${cls.join('.')}`;\n parts.unshift(part);\n cur = cur.parentElement;\n depth++;\n }\n return parts.join(' > ');\n }\n\n private shortHtml(node: HTMLElement): string {\n const html = node.outerHTML.replace(/\\s+/g, ' ');\n return html.length > 160 ? html.slice(0, 157) + '...' : html;\n }\n\n private resolveNameHint(node: HTMLElement): string {\n return node.getAttribute('label')\n ?? node.getAttribute('placeholder')\n ?? node.getAttribute('aria-label')\n ?? node.getAttribute('title')\n ?? '';\n }\n}\n","import { Injectable } from '@angular/core';\n\nconst ATTR = 'data-sd-autoid-highlight';\nconst SAVED_OUTLINE = 'data-sd-autoid-prev-outline';\nconst SAVED_OUTLINE_OFFSET = 'data-sd-autoid-prev-outline-offset';\nconst SAVED_BG = 'data-sd-autoid-prev-bg';\nconst SAVED_BORDER_RADIUS = 'data-sd-autoid-prev-radius';\n\n// Token màu lấy từ @sdcorejs/angular theme (--sd-*). Fallback hex áp dụng khi\n// consumer chưa import sd-core.scss. Dùng cùng bộ var với scss component để\n// nhất quán visual giữa highlight ok / duplicate / missing.\nconst COLOR_OK = 'var(--sd-success, #4CAF50)';\nconst COLOR_OK_BG = 'var(--sd-success-light, rgba(76, 175, 80, 0.12))';\nconst COLOR_DUP = 'var(--sd-error, #F82C13)';\nconst COLOR_DUP_BG = 'var(--sd-error-light, rgba(248, 44, 19, 0.12))';\nconst COLOR_MISSING = 'var(--sd-warning, #FF9600)';\nconst COLOR_MISSING_BG = 'var(--sd-warning-light, rgba(255, 150, 0, 0.12))';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidHighlightService {\n /** Apply outline cho mọi [data-autoid]: xanh nếu unique, đỏ nếu duplicate. Idempotent. */\n apply(root: HTMLElement = document.body): void {\n this.clear(root);\n const nodes = root.querySelectorAll<HTMLElement>('[data-autoid]');\n const count: Record<string, number> = {};\n nodes.forEach(n => {\n const id = n.getAttribute('data-autoid');\n if (!id) return;\n count[id] = (count[id] ?? 0) + 1;\n });\n\n // Để tránh apply 2 lần lên cùng 1 target khi nhiều [data-autoid] cùng\n // chia sẻ 1 sd-* host (vd 2 input lồng trong 1 sd-date-range).\n const visited = new Set<HTMLElement>();\n\n nodes.forEach(node => {\n const id = node.getAttribute('data-autoid');\n if (!id) return;\n\n // Highlight HOST sd-* (giống applyMissing) — outline ôm trọn card,\n // không hiển thị lệch trên input con / label fragment. Fallback về\n // chính node khi không tìm thấy sd-* ancestor (vd native button).\n const target = this.#resolveTarget(node);\n if (visited.has(target)) return;\n visited.add(target);\n\n const isDup = count[id] > 1;\n this.#paint(\n target,\n isDup ? COLOR_DUP : COLOR_OK,\n isDup ? COLOR_DUP_BG : COLOR_OK_BG,\n 'solid',\n isDup ? 'duplicate' : 'ok'\n );\n });\n }\n\n /** Highlight tập element không có autoid (missing) bằng outline cam dashed. */\n applyMissing(nodes: HTMLElement[]): void {\n nodes.forEach(node => {\n if (node.hasAttribute(ATTR)) return;\n this.#paint(node, COLOR_MISSING, COLOR_MISSING_BG, 'dashed', 'missing');\n });\n }\n\n /** Restore inline style như trước khi apply. */\n clear(root: HTMLElement = document.body): void {\n const nodes = root.querySelectorAll<HTMLElement>(`[${ATTR}]`);\n nodes.forEach(node => {\n node.style.outline = node.getAttribute(SAVED_OUTLINE) ?? '';\n node.style.outlineOffset = node.getAttribute(SAVED_OUTLINE_OFFSET) ?? '';\n node.style.backgroundColor = node.getAttribute(SAVED_BG) ?? '';\n node.style.borderRadius = node.getAttribute(SAVED_BORDER_RADIUS) ?? '';\n node.removeAttribute(SAVED_OUTLINE);\n node.removeAttribute(SAVED_OUTLINE_OFFSET);\n node.removeAttribute(SAVED_BG);\n node.removeAttribute(SAVED_BORDER_RADIUS);\n node.removeAttribute(ATTR);\n });\n }\n\n // ==========================================\n // HELPERS\n // ==========================================\n #resolveTarget(node: HTMLElement): HTMLElement {\n let cur: HTMLElement | null = node;\n while (cur) {\n if (cur.tagName.toLowerCase().startsWith('sd-')) return cur;\n cur = cur.parentElement;\n }\n return node;\n }\n\n #paint(\n node: HTMLElement,\n color: string,\n bg: string,\n style: 'solid' | 'dashed',\n marker: 'ok' | 'duplicate' | 'missing'\n ): void {\n // Backup full style cần restore để clear() đưa về nguyên trạng.\n node.setAttribute(SAVED_OUTLINE, node.style.outline ?? '');\n node.setAttribute(SAVED_OUTLINE_OFFSET, node.style.outlineOffset ?? '');\n node.setAttribute(SAVED_BG, node.style.backgroundColor ?? '');\n node.setAttribute(SAVED_BORDER_RADIUS, node.style.borderRadius ?? '');\n\n node.style.outline = `2px ${style} ${color}`;\n // outline-offset 2px tránh đè lên border của host (mat-form-field, button)\n // → highlight nằm gọn ngoài card thay vì cắt vào nội dung.\n node.style.outlineOffset = '2px';\n node.style.backgroundColor = bg;\n // Bo nhẹ để outline trông sạch trên host bo góc sẵn.\n if (!node.style.borderRadius) {\n node.style.borderRadius = '6px';\n }\n node.setAttribute(ATTR, marker);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SdAutoidElement, SdAutoidElementState } from '../models/autoid-element.model';\nimport { SdAutoidExportMeta } from '../models/autoid-export-format.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidExportService {\n toJson(elements: SdAutoidElement[]): string {\n return JSON.stringify(elements, null, 2);\n }\n\n toCsv(elements: SdAutoidElement[]): string {\n const header = 'STT,name,autoid,tag,table-scope,disabled,loading,empty,invalid,opened,count,data-value,text,xpath';\n const rows = elements.map(el =>\n [\n el.stt,\n this.q(el.name),\n this.q(el.autoid),\n this.q(el.tag),\n this.q(el.tableScope ?? ''),\n this.q(el.state.disabled ?? ''),\n this.q(el.state.loading ?? ''),\n this.q(el.state.empty ?? ''),\n this.q(el.state.invalid ?? ''),\n this.q(el.state.opened ?? ''),\n this.q(el.state.count ?? ''),\n this.q(el.state.dataValue ?? ''),\n this.q(el.text),\n this.q(el.xpath),\n ].join(',')\n );\n return [header, ...rows].join('\\n') + '\\n';\n }\n\n /** POM TypeScript skeleton — copy ngay vào file Playwright/Cypress. */\n toMarkdownPom(elements: SdAutoidElement[], meta: SdAutoidExportMeta): string {\n const className = this.toPascal(meta.pageTitle || 'AutoGenerated') + 'Page';\n const lines: string[] = [];\n lines.push(`# ${className}`);\n lines.push('');\n lines.push(`- Page: \\`${meta.pageUrl}\\``);\n lines.push(`- Generated: \\`${meta.timestamp}\\``);\n lines.push('');\n lines.push('```ts');\n lines.push(`export class ${className} {`);\n for (const el of elements) {\n const propName = this.toCamel(el.autoid);\n const nameHint = el.name ? ` ${el.name} —` : '';\n const stateSummary = this.buildStateSummary(el.state);\n const stateStr = stateSummary ? ` — ${stateSummary}` : '';\n lines.push(` /** ${el.tag}${nameHint}${stateStr} */`);\n lines.push(` readonly ${propName} = '${el.xpath}';`);\n }\n lines.push('}');\n lines.push('```');\n lines.push('');\n return lines.join('\\n');\n }\n\n /** Markdown reference table, group FIRST by tableScope (top-level first, then per table), then by tag. */\n toMarkdownTable(elements: SdAutoidElement[], meta: SdAutoidExportMeta): string {\n const lines: string[] = [];\n lines.push('# AutoId Reference');\n lines.push('');\n lines.push(`- Page: \\`${meta.pageUrl}\\``);\n lines.push(`- Generated: \\`${meta.timestamp}\\``);\n lines.push('');\n\n // Partition into top-level and per-table buckets.\n const topLevel = elements.filter(el => !el.tableScope);\n // Collect unique table scopes in insertion order (preserves DOM order).\n const tableScopes: string[] = [];\n for (const el of elements) {\n if (el.tableScope && !tableScopes.includes(el.tableScope)) {\n tableScopes.push(el.tableScope);\n }\n }\n tableScopes.sort();\n\n const renderTagGroup = (items: SdAutoidElement[]) => {\n const groups = new Map<string, SdAutoidElement[]>();\n for (const el of items) {\n const key = el.tag || '(no-tag)';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(el);\n }\n const sortedTags = [...groups.keys()].sort();\n for (const tag of sortedTags) {\n lines.push(`### ${tag}`);\n lines.push('');\n lines.push('| name | autoid | xpath | state | duplicate |');\n lines.push('|------|--------|-------|-------|-----------|');\n for (const el of groups.get(tag)!) {\n const stateSummary = this.buildStateSummary(el.state);\n lines.push(`| ${this.mdCell(el.name)} | \\`${el.autoid}\\` | \\`${el.xpath}\\` | ${this.mdCell(stateSummary)} | ${el.duplicate ? '⚠️' : ''} |`);\n }\n lines.push('');\n }\n };\n\n // Top-level section.\n lines.push('## Top-level');\n lines.push('');\n if (topLevel.length > 0) {\n renderTagGroup(topLevel);\n } else {\n lines.push('_(no top-level elements)_');\n lines.push('');\n }\n\n // Per-table sections.\n for (const scope of tableScopes) {\n lines.push(`## Inside table \\`${scope}\\``);\n lines.push('');\n const scopeItems = elements.filter(el => el.tableScope === scope);\n renderTagGroup(scopeItems);\n }\n\n return lines.join('\\n');\n }\n\n download(content: string, filename: string, mime: string): void {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n async copyToClipboard(content: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(content);\n return;\n }\n // Fallback cho browser cũ / context không có clipboard API.\n const ta = document.createElement('textarea');\n ta.value = content;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n\n /** Build a compact state summary string from defined state keys, e.g. \"disabled=false; empty=true\". */\n private buildStateSummary(state: SdAutoidElementState): string {\n const parts: string[] = [];\n if (state.disabled !== undefined) parts.push(`disabled=${state.disabled}`);\n if (state.loading !== undefined) parts.push(`loading=${state.loading}`);\n if (state.empty !== undefined) parts.push(`empty=${state.empty}`);\n if (state.invalid !== undefined) parts.push(`invalid=${state.invalid}`);\n if (state.opened !== undefined) parts.push(`opened=${state.opened}`);\n if (state.count !== undefined) parts.push(`count=${state.count}`);\n if (state.dataValue !== undefined) parts.push(`data-value=${state.dataValue}`);\n return parts.join('; ');\n }\n\n private q(v: string | number): string {\n const s = String(v ?? '').replace(/\"/g, '\"\"');\n return `\"${s}\"`;\n }\n\n private mdCell(s: string): string {\n return (s || '').replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ');\n }\n\n private toCamel(autoid: string): string {\n const parts = autoid.split(/[-_]/).filter(Boolean);\n return parts.map((p, i) => (i === 0 ? p : p[0].toUpperCase() + p.slice(1))).join('');\n }\n\n private toPascal(title: string): string {\n return title\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map(p => p[0].toUpperCase() + p.slice(1))\n .join('');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n HostListener,\n inject,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormsModule } from '@angular/forms';\n\nimport { SdAutoidElement, SdAutoidAuditResult } from './models/autoid-element.model';\nimport {\n SdAutoidInspectorConfig,\n SD_AUTOID_DEFAULT_REQUIRE_SELECTORS,\n} from './models/autoid-inspector-config.model';\nimport { SdAutoidExportMeta } from './models/autoid-export-format.model';\nimport { SdAutoidScannerService } from './services/autoid-scanner.service';\nimport { SdAutoidAuditService } from './services/autoid-audit.service';\nimport { SdAutoidHighlightService } from './services/autoid-highlight.service';\nimport { SdAutoidExportService } from './services/autoid-export.service';\n\ntype Segment = 'audit' | 'elements' | 'export';\n\n@Component({\n selector: 'sd-autoid-inspector',\n templateUrl: './autoid-inspector.component.html',\n styleUrls: ['./autoid-inspector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, FormsModule, MatIconModule, MatTooltipModule],\n})\nexport class SdAutoidInspector implements OnDestroy {\n // ==========================================\n // INPUTS\n // ==========================================\n enabled = input(true, { transform: booleanAttribute });\n config = input<SdAutoidInspectorConfig | undefined>(undefined);\n\n // ==========================================\n // STATE\n // ==========================================\n open = signal(false);\n segment = signal<Segment>('audit');\n filter = signal('');\n elements = signal<SdAutoidElement[]>([]);\n audit = signal<SdAutoidAuditResult | null>(null);\n copyOk = signal(false);\n // Default true để mở panel lần đầu là có highlight ngay. Đóng panel KHÔNG\n // tự tắt — user toggle qua nút trong tab Audit khi muốn nhìn DOM gốc.\n highlightOn = signal(true);\n // Ẩn tạm FAB — chỉ in-memory, reload trang sẽ hiện lại (theo thiết kế).\n dismissed = signal(false);\n\n filteredElements = computed(() => {\n const q = this.filter().trim().toLowerCase();\n if (!q) return this.elements();\n return this.elements().filter(\n el =>\n el.autoid.toLowerCase().includes(q) ||\n el.name.toLowerCase().includes(q) ||\n el.tag.toLowerCase().includes(q)\n );\n });\n\n /**\n * Elements not inside any sd-table — rendered in the main \"Top-level\" section.\n */\n readonly topLevelElements = computed(() =>\n this.filteredElements().filter(el => !el.tableScope)\n );\n\n /**\n * Map of `sd-table` autoid → its inner autoid elements. Tables themselves\n * stay in `topLevelElements` (the table's own autoid is top-level).\n */\n readonly tableGroups = computed(() => {\n const groups = new Map<string, SdAutoidElement[]>();\n for (const el of this.filteredElements()) {\n if (!el.tableScope) continue;\n if (!groups.has(el.tableScope)) groups.set(el.tableScope, []);\n groups.get(el.tableScope)!.push(el);\n }\n // Return a sorted array for stable rendering.\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([scope, items]) => ({ scope, items }));\n });\n\n // ==========================================\n // DATA-* ATTRIBUTE COMPUTEDS (for E2E selectors)\n // ==========================================\n readonly dataOpened = computed(() => (this.open() ? 'true' : 'false'));\n readonly dataHighlightOn = computed(() => (this.highlightOn() ? 'true' : 'false'));\n readonly dataSegment = computed(() => this.segment());\n readonly dataElementCount = computed(() => String(this.elements().length));\n readonly dataMissingCount = computed(() => String(this.audit()?.missingCount ?? 0));\n readonly dataDuplicateCount = computed(() => String(this.audit()?.duplicateCount ?? 0));\n\n // ==========================================\n // SERVICES\n // ==========================================\n #scanner = inject(SdAutoidScannerService);\n #auditSvc = inject(SdAutoidAuditService);\n #highlight = inject(SdAutoidHighlightService);\n #export = inject(SdAutoidExportService);\n\n // ==========================================\n // LIFECYCLE\n // ==========================================\n ngOnDestroy(): void {\n this.#highlight.clear(this.#root());\n }\n\n // ==========================================\n // ACTIONS\n // ==========================================\n togglePanel = (): void => {\n if (this.open()) {\n this.closePanel();\n } else {\n this.openPanel();\n }\n };\n\n openPanel = (): void => {\n if (!this.enabled()) return;\n this.refresh();\n this.open.set(true);\n };\n\n closePanel = (): void => {\n this.open.set(false);\n // Highlight được giữ lại để user vẫn thấy outline khi panel ẩn —\n // toggleHighlight trong tab Audit là cách duy nhất để clear.\n };\n\n refresh = (): void => {\n const root = this.#root();\n const elements = this.#scanner.scan(root);\n const result = this.#auditSvc.audit(elements, {\n root,\n requireSelectors: this.#requireSelectors(),\n });\n this.elements.set(elements);\n this.audit.set(result);\n this.#applyHighlightIfOn(result);\n };\n\n dismissFab = (event: Event): void => {\n event.stopPropagation();\n this.dismissed.set(true);\n if (this.open()) this.closePanel();\n };\n\n toggleHighlight = (): void => {\n const next = !this.highlightOn();\n this.highlightOn.set(next);\n if (next) {\n this.#applyHighlightIfOn(this.audit());\n } else {\n this.#highlight.clear(this.#root());\n }\n };\n\n setSegment = (seg: Segment): void => this.segment.set(seg);\n\n copyJson = async (): Promise<void> => {\n await this.#export.copyToClipboard(this.#export.toJson(this.elements()));\n this.#flashCopyOk();\n };\n\n copyXpath = async (autoid: string): Promise<void> => {\n await this.#export.copyToClipboard(`//*[@data-autoid=\"${autoid}\"]`);\n this.#flashCopyOk();\n };\n\n exportCsv = (): void => {\n this.#export.download(\n this.#export.toCsv(this.elements()),\n this.#filename('csv'),\n 'text/csv;charset=utf-8'\n );\n };\n\n exportJson = (): void => {\n this.#export.download(\n this.#export.toJson(this.elements()),\n this.#filename('json'),\n 'application/json'\n );\n };\n\n exportMdPom = (): void => {\n this.#export.download(\n this.#export.toMarkdownPom(this.elements(), this.#meta()),\n this.#filename('pom.md'),\n 'text/markdown'\n );\n };\n\n exportMdTable = (): void => {\n this.#export.download(\n this.#export.toMarkdownTable(this.elements(), this.#meta()),\n this.#filename('reference.md'),\n 'text/markdown'\n );\n };\n\n // ==========================================\n // KEYBOARD: Esc đóng panel\n // ==========================================\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open()) this.closePanel();\n }\n\n // ==========================================\n // HELPERS\n // ==========================================\n #root(): HTMLElement {\n return this.config()?.root ?? document.body;\n }\n\n #requireSelectors(): ReadonlyArray<string> {\n const extra = this.config()?.extraRequireSelectors ?? [];\n return [...SD_AUTOID_DEFAULT_REQUIRE_SELECTORS, ...extra];\n }\n\n #highlightMissing(result: SdAutoidAuditResult): void {\n if (!result.missing.length) return;\n const root = this.#root();\n const selector = this.#requireSelectors().join(',');\n const all = Array.from(root.querySelectorAll<HTMLElement>(selector));\n const missingNodes = all.filter(\n n => !n.hasAttribute('data-autoid') && !n.querySelector('[data-autoid]')\n );\n this.#highlight.applyMissing(missingNodes);\n }\n\n #applyHighlightIfOn(result: SdAutoidAuditResult | null): void {\n if (!this.highlightOn()) return;\n const root = this.#root();\n this.#highlight.apply(root);\n if (result) this.#highlightMissing(result);\n }\n\n #meta(): SdAutoidExportMeta {\n return {\n pageUrl: window.location.pathname + window.location.search,\n pageTitle: document.title || 'Page',\n timestamp: new Date().toISOString(),\n };\n }\n\n #filename(ext: string): string {\n const slug = (document.title || 'autoid')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return `${slug || 'autoid'}-${Date.now()}.${ext}`;\n }\n\n #flashCopyOk(): void {\n this.copyOk.set(true);\n setTimeout(() => this.copyOk.set(false), 1200);\n }\n}\n","@if (enabled() && !dismissed()) {\n <div class=\"sd-autoid-inspector__fab-wrap\">\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__fab\"\n data-autoid=\"sd-autoid-inspector-fab\"\n [attr.data-opened]=\"dataOpened()\"\n [matTooltip]=\"open() ? 'Đóng AutoId Inspector' : 'Mở AutoId Inspector'\"\n matTooltipPosition=\"left\"\n (click)=\"togglePanel()\">\n <mat-icon>{{ open() ? 'close' : 'tag' }}</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__fab-dismiss\"\n matTooltip=\"Ẩn tạm — reload trang để hiện lại\"\n matTooltipPosition=\"left\"\n aria-label=\"Ẩn tạm FAB\"\n (click)=\"dismissFab($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n}\n\n@if (enabled() && open()) {\n <div class=\"sd-autoid-inspector__backdrop\" (click)=\"closePanel()\"></div>\n <section class=\"sd-autoid-inspector__panel\"\n role=\"dialog\"\n aria-label=\"AutoId Inspector\"\n data-autoid=\"sd-autoid-inspector-panel\"\n [attr.data-segment]=\"dataSegment()\"\n [attr.data-highlight-on]=\"dataHighlightOn()\"\n [attr.data-element-count]=\"dataElementCount()\"\n [attr.data-missing-count]=\"dataMissingCount()\"\n [attr.data-duplicate-count]=\"dataDuplicateCount()\">\n <header class=\"sd-autoid-inspector__header\">\n <div class=\"sd-autoid-inspector__segments\">\n <button\n type=\"button\"\n [class.is-active]=\"segment() === 'audit'\"\n (click)=\"setSegment('audit')\">\n Audit\n @if (audit(); as a) {\n <span class=\"sd-autoid-inspector__badge\" [class.is-warn]=\"a.missingCount + a.duplicateCount > 0\">\n {{ a.missingCount + a.duplicateCount }}\n </span>\n }\n </button>\n <button\n type=\"button\"\n [class.is-active]=\"segment() === 'elements'\"\n (click)=\"setSegment('elements')\">\n Elements\n <span class=\"sd-autoid-inspector__badge\">{{ elements().length }}</span>\n </button>\n <button\n type=\"button\"\n [class.is-active]=\"segment() === 'export'\"\n (click)=\"setSegment('export')\">\n Export\n </button>\n </div>\n <div class=\"sd-autoid-inspector__actions\">\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn\"\n matTooltip=\"Quét lại\"\n (click)=\"refresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__close-btn\"\n matTooltip=\"Đóng\"\n aria-label=\"Đóng panel\"\n (click)=\"closePanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </header>\n\n @if (copyOk()) {\n <div class=\"sd-autoid-inspector__toast\">Đã copy ✓</div>\n }\n\n <div class=\"sd-autoid-inspector__body\">\n @switch (segment()) {\n @case ('audit') {\n <ng-container *ngTemplateOutlet=\"auditTpl\"></ng-container>\n }\n @case ('elements') {\n <ng-container *ngTemplateOutlet=\"elementsTpl\"></ng-container>\n }\n @case ('export') {\n <ng-container *ngTemplateOutlet=\"exportTpl\"></ng-container>\n }\n }\n </div>\n </section>\n\n <ng-template #auditTpl>\n @if (audit(); as a) {\n <div class=\"sd-autoid-inspector__audit-toolbar\">\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__toggle\"\n [class.is-on]=\"highlightOn()\"\n (click)=\"toggleHighlight()\">\n <mat-icon>{{ highlightOn() ? 'visibility' : 'visibility_off' }}</mat-icon>\n <span>Highlight DOM</span>\n <span class=\"sd-autoid-inspector__toggle-state\">{{ highlightOn() ? 'ON' : 'OFF' }}</span>\n </button>\n </div>\n <div class=\"sd-autoid-inspector__summary\">\n <div class=\"sd-autoid-inspector__stat is-info\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.total }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Tổng autoid</div>\n </div>\n <div class=\"sd-autoid-inspector__stat\" [class.is-error]=\"a.duplicateCount > 0\" [class.is-success]=\"a.duplicateCount === 0\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.duplicateCount }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Trùng</div>\n </div>\n <div class=\"sd-autoid-inspector__stat\" [class.is-warning]=\"a.missingCount > 0\" [class.is-success]=\"a.missingCount === 0\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.missingCount }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Thiếu</div>\n </div>\n </div>\n\n @if (a.duplicateCount > 0) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <mat-icon class=\"is-error\">error_outline</mat-icon>\n Autoid bị trùng\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr><th>Autoid</th><th>Số lần</th></tr>\n </thead>\n <tbody>\n @for (entry of a.duplicates | keyvalue; track entry.key) {\n <tr class=\"is-error\">\n <td><code>{{ entry.key }}</code></td>\n <td>{{ entry.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (a.missingCount > 0) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <mat-icon class=\"is-warning\">warning_amber</mat-icon>\n Element thiếu autoid\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr><th>Tag</th><th>Name hint</th><th>Selector</th></tr>\n </thead>\n <tbody>\n @for (m of a.missing; track $index) {\n <tr class=\"is-warning\">\n <td><code>{{ m.tag }}</code></td>\n <td>{{ m.nameHint }}</td>\n <td><code>{{ m.selector }}</code></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (a.duplicateCount === 0 && a.missingCount === 0) {\n <div class=\"sd-autoid-inspector__success-card\">\n <mat-icon>check_circle</mat-icon>\n <div>\n <strong>Không có element thiếu hoặc trùng autoid.</strong>\n <small>Trang đã đạt chuẩn convention autoid.</small>\n </div>\n </div>\n }\n }\n </ng-template>\n\n <ng-template #elementsTpl>\n <div class=\"sd-autoid-inspector__filter\">\n <mat-icon>search</mat-icon>\n <input\n type=\"text\"\n placeholder=\"Lọc theo autoid / name / tag\"\n [ngModel]=\"filter()\"\n (ngModelChange)=\"filter.set($event)\"/>\n @if (filter()) {\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn\"\n matTooltip=\"Xoá filter\"\n (click)=\"filter.set('')\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n\n <!-- Top-level elements (not inside any sd-table) -->\n <h4 class=\"sd-autoid-inspector__section-title\">\n Top-level elements\n <span class=\"sd-autoid-inspector__badge\">{{ topLevelElements().length }}</span>\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th class=\"is-num\">STT</th>\n <th>Name</th>\n <th>Autoid</th>\n <th>Tag</th>\n <th>State</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n @for (el of topLevelElements(); track el.autoid + $index) {\n <tr [class.is-error]=\"el.duplicate\">\n <td class=\"is-num\">{{ el.stt }}</td>\n <td>{{ el.name || '—' }}</td>\n <td>\n <div class=\"sd-autoid-inspector__autoid-cell\">\n <code>{{ el.autoid }}</code>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn is-primary\"\n matTooltip=\"Copy xpath\"\n (click)=\"copyXpath(el.autoid)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n </td>\n <td><span class=\"sd-autoid-inspector__tag-chip\">{{ el.tag }}</span></td>\n <td class=\"sd-autoid-inspector__state-cell\">\n @if (el.state.disabled !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-error]=\"el.state.disabled === 'true'\">\n disabled={{ el.state.disabled }}\n </span>\n }\n @if (el.state.loading !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-warning]=\"el.state.loading === 'true'\">\n loading={{ el.state.loading }}\n </span>\n }\n @if (el.state.empty !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-info]=\"el.state.empty === 'true'\">\n empty={{ el.state.empty }}\n </span>\n }\n @if (el.state.invalid !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-error]=\"el.state.invalid === 'true'\">\n invalid={{ el.state.invalid }}\n </span>\n }\n @if (el.state.opened !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-info]=\"el.state.opened === 'true'\">\n opened={{ el.state.opened }}\n </span>\n }\n @if (el.state.count !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n count={{ el.state.count }}\n </span>\n }\n @if (el.state.required !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-warning]=\"el.state.required === 'true'\">\n required={{ el.state.required }}\n </span>\n }\n @if (el.state.maxlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n maxlength={{ el.state.maxlength }}\n </span>\n }\n @if (el.state.minlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n minlength={{ el.state.minlength }}\n </span>\n }\n @if (el.state.pattern !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n pattern={{ el.state.pattern }}\n </span>\n }\n @if (el.state.errorMessage !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-error\">\n error: {{ el.state.errorMessage }}\n </span>\n }\n </td>\n <td class=\"sd-autoid-inspector__value\" [matTooltip]=\"el.state.dataValue || el.text || ''\">\n {{ el.state.dataValue || el.text || '—' }}\n </td>\n </tr>\n } @empty {\n <tr><td colspan=\"6\" class=\"sd-autoid-inspector__empty\">Không có kết quả.</td></tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- One section per sd-table group -->\n @for (group of tableGroups(); track group.scope) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <mat-icon class=\"is-info\">table_chart</mat-icon>\n Inside <code>{{ group.scope }}</code>\n <span class=\"sd-autoid-inspector__badge\">{{ group.items.length }}</span>\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th class=\"is-num\">STT</th>\n <th>Name</th>\n <th>Autoid</th>\n <th>Tag</th>\n <th>State</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n @for (el of group.items; track el.autoid + $index) {\n <tr [class.is-error]=\"el.duplicate\">\n <td class=\"is-num\">{{ el.stt }}</td>\n <td>{{ el.name || '—' }}</td>\n <td>\n <div class=\"sd-autoid-inspector__autoid-cell\">\n <code>{{ el.autoid }}</code>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn is-primary\"\n matTooltip=\"Copy xpath\"\n (click)=\"copyXpath(el.autoid)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n </td>\n <td><span class=\"sd-autoid-inspector__tag-chip\">{{ el.tag }}</span></td>\n <td class=\"sd-autoid-inspector__state-cell\">\n @if (el.state.disabled !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-error]=\"el.state.disabled === 'true'\">\n disabled={{ el.state.disabled }}\n </span>\n }\n @if (el.state.loading !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-warning]=\"el.state.loading === 'true'\">\n loading={{ el.state.loading }}\n </span>\n }\n @if (el.state.empty !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-info]=\"el.state.empty === 'true'\">\n empty={{ el.state.empty }}\n </span>\n }\n @if (el.state.invalid !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-error]=\"el.state.invalid === 'true'\">\n invalid={{ el.state.invalid }}\n </span>\n }\n @if (el.state.opened !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-info]=\"el.state.opened === 'true'\">\n opened={{ el.state.opened }}\n </span>\n }\n @if (el.state.count !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n count={{ el.state.count }}\n </span>\n }\n @if (el.state.required !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\"\n [class.is-warning]=\"el.state.required === 'true'\">\n required={{ el.state.required }}\n </span>\n }\n @if (el.state.maxlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n maxlength={{ el.state.maxlength }}\n </span>\n }\n @if (el.state.minlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n minlength={{ el.state.minlength }}\n </span>\n }\n @if (el.state.pattern !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\">\n pattern={{ el.state.pattern }}\n </span>\n }\n @if (el.state.errorMessage !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-error\">\n error: {{ el.state.errorMessage }}\n </span>\n }\n </td>\n <td class=\"sd-autoid-inspector__value\" [matTooltip]=\"el.state.dataValue || el.text || ''\">\n {{ el.state.dataValue || el.text || '—' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </ng-template>\n\n <ng-template #exportTpl>\n <div class=\"sd-autoid-inspector__export-grid\">\n <button type=\"button\" matTooltip=\"Copy JSON vào clipboard\" (click)=\"copyJson()\">\n <mat-icon>content_copy</mat-icon>\n <span>Copy JSON</span>\n <small>clipboard</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file JSON\" (click)=\"exportJson()\">\n <mat-icon>download</mat-icon>\n <span>JSON</span>\n <small>.json</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file CSV\" (click)=\"exportCsv()\">\n <mat-icon>table_view</mat-icon>\n <span>CSV</span>\n <small>.csv</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải MD POM skeleton — cho AI viết auto-test\" (click)=\"exportMdPom()\">\n <mat-icon>code</mat-icon>\n <span>MD POM</span>\n <small>AI test</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải MD reference table — group theo tag sd-*\" (click)=\"exportMdTable()\">\n <mat-icon>view_list</mat-icon>\n <span>MD Table</span>\n <small>reference</small>\n </button>\n </div>\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, signal, effect, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
class SdAvatar {
|
|
6
|
+
/**
|
|
7
|
+
* The source string to be used for the avatar.
|
|
8
|
+
* - If it matches a URL pattern, an image is displayed.
|
|
9
|
+
* - If it is a string representing a name, initials and a colored background are generated.
|
|
10
|
+
* - If undefined, it falls back to a neutral ? initial.
|
|
11
|
+
*/
|
|
12
|
+
src = input.required();
|
|
13
|
+
size = input(32);
|
|
14
|
+
#imageError = signal(false);
|
|
15
|
+
constructor() {
|
|
16
|
+
// Reset image error state whenever src changes
|
|
17
|
+
effect(() => {
|
|
18
|
+
this.src();
|
|
19
|
+
this.#imageError.set(false);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
isUrl = computed(() => {
|
|
23
|
+
// If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text
|
|
24
|
+
if (this.#imageError()) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const val = this.src() || '';
|
|
28
|
+
const urlPattern = /^(http|https|data:image|\/)/;
|
|
29
|
+
return urlPattern.test(val);
|
|
30
|
+
});
|
|
31
|
+
bgColor = computed(() => {
|
|
32
|
+
if (this.isUrl()) {
|
|
33
|
+
return 'transparent';
|
|
34
|
+
}
|
|
35
|
+
const val = this.src() || '';
|
|
36
|
+
if (!val) {
|
|
37
|
+
return '#bdc3c7';
|
|
38
|
+
}
|
|
39
|
+
return this.#generateColor(val);
|
|
40
|
+
});
|
|
41
|
+
initials = computed(() => {
|
|
42
|
+
if (this.isUrl()) {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
const val = this.src() || '';
|
|
46
|
+
if (!val) {
|
|
47
|
+
return '?';
|
|
48
|
+
}
|
|
49
|
+
return this.#getInitials(val);
|
|
50
|
+
});
|
|
51
|
+
handleError() {
|
|
52
|
+
this.#imageError.set(true);
|
|
53
|
+
}
|
|
54
|
+
#getInitials = (name) => {
|
|
55
|
+
const words = name.trim().split(' ').filter(Boolean);
|
|
56
|
+
if (!words.length)
|
|
57
|
+
return '';
|
|
58
|
+
if (words.length === 1)
|
|
59
|
+
return words[0][0].toUpperCase();
|
|
60
|
+
return (words[0][0] + words[words.length - 1][0]).toUpperCase();
|
|
61
|
+
};
|
|
62
|
+
#generateColor = (name) => {
|
|
63
|
+
const colors = [
|
|
64
|
+
'#1abc9c',
|
|
65
|
+
'#2ecc71',
|
|
66
|
+
'#3498db',
|
|
67
|
+
'#9b59b6',
|
|
68
|
+
'#34495e',
|
|
69
|
+
'#16a085',
|
|
70
|
+
'#27ae60',
|
|
71
|
+
'#2980b9',
|
|
72
|
+
'#8e44ad',
|
|
73
|
+
'#2c3e50',
|
|
74
|
+
'#f1c40f',
|
|
75
|
+
'#e67e22',
|
|
76
|
+
'#e74c3c',
|
|
77
|
+
'#95a5a6',
|
|
78
|
+
'#f39c12',
|
|
79
|
+
'#d35400',
|
|
80
|
+
'#c0392b',
|
|
81
|
+
'#bdc3c7',
|
|
82
|
+
'#7f8c8d',
|
|
83
|
+
];
|
|
84
|
+
let hash = 0;
|
|
85
|
+
for (let i = 0; i < name.length; i++) {
|
|
86
|
+
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
|
87
|
+
}
|
|
88
|
+
return colors[Math.abs(hash) % colors.length];
|
|
89
|
+
};
|
|
90
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAvatar, isStandalone: true, selector: "sd-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n", styles: [".sd-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;color:#fff;font-weight:500;-webkit-user-select:none;user-select:none;background-size:cover}.sd-avatar img{width:100%;height:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
92
|
+
}
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAvatar, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'sd-avatar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n", styles: [".sd-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;color:#fff;font-weight:500;-webkit-user-select:none;user-select:none;background-size:cover}.sd-avatar img{width:100%;height:100%;object-fit:cover}\n"] }]
|
|
96
|
+
}], ctorParameters: () => [] });
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Generated bundle index. Do not edit.
|
|
100
|
+
*/
|
|
101
|
+
|
|
102
|
+
export { SdAvatar };
|
|
103
|
+
//# sourceMappingURL=sdcorejs-angular-components-avatar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-avatar.mjs","sources":["../../../projects/sdcorejs-angular/components/avatar/src/avatar.component.ts","../../../projects/sdcorejs-angular/components/avatar/src/avatar.component.html","../../../projects/sdcorejs-angular/components/avatar/sdcorejs-angular-components-avatar.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, signal } from '@angular/core';\n\n@Component({\n selector: 'sd-avatar',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdAvatar {\n /**\n * The source string to be used for the avatar.\n * - If it matches a URL pattern, an image is displayed.\n * - If it is a string representing a name, initials and a colored background are generated.\n * - If undefined, it falls back to a neutral ? initial.\n */\n readonly src = input.required<string | undefined | null>();\n readonly size = input<number>(32);\n\n readonly #imageError = signal<boolean>(false);\n\n constructor() {\n // Reset image error state whenever src changes\n effect(() => {\n this.src();\n this.#imageError.set(false);\n });\n }\n\n readonly isUrl = computed(() => {\n // If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text\n if (this.#imageError()) {\n return false;\n }\n const val = this.src() || '';\n const urlPattern = /^(http|https|data:image|\\/)/;\n return urlPattern.test(val);\n });\n\n readonly bgColor = computed(() => {\n if (this.isUrl()) {\n return 'transparent';\n }\n const val = this.src() || '';\n if (!val) {\n return '#bdc3c7';\n }\n return this.#generateColor(val);\n });\n\n readonly initials = computed(() => {\n if (this.isUrl()) {\n return '';\n }\n const val = this.src() || '';\n if (!val) {\n return '?';\n }\n return this.#getInitials(val);\n });\n\n handleError() {\n this.#imageError.set(true);\n }\n\n #getInitials = (name: string): string => {\n const words = name.trim().split(' ').filter(Boolean);\n if (!words.length) return '';\n if (words.length === 1) return words[0][0].toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n };\n\n #generateColor = (name: string): string => {\n const colors = [\n '#1abc9c',\n '#2ecc71',\n '#3498db',\n '#9b59b6',\n '#34495e',\n '#16a085',\n '#27ae60',\n '#2980b9',\n '#8e44ad',\n '#2c3e50',\n '#f1c40f',\n '#e67e22',\n '#e74c3c',\n '#95a5a6',\n '#f39c12',\n '#d35400',\n '#c0392b',\n '#bdc3c7',\n '#7f8c8d',\n ];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n };\n}\n","<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as i1 from '@angular/common';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { input, booleanAttribute, EventEmitter, computed, Output, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import * as i2 from '@angular/material/tooltip';
|
|
7
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
8
|
+
|
|
9
|
+
/* eslint-disable @angular-eslint/no-input-rename */
|
|
10
|
+
class SdBadge {
|
|
11
|
+
defaultIcon = 'fiber_manual_record';
|
|
12
|
+
// ==========================================
|
|
13
|
+
// 1. SIGNAL INPUTS
|
|
14
|
+
// ==========================================
|
|
15
|
+
type = input('icon', {
|
|
16
|
+
transform: value => value || 'icon',
|
|
17
|
+
});
|
|
18
|
+
color = input('secondary', {
|
|
19
|
+
transform: value => value || 'secondary',
|
|
20
|
+
});
|
|
21
|
+
primary = input(false, { transform: booleanAttribute });
|
|
22
|
+
secondary = input(false, { transform: booleanAttribute });
|
|
23
|
+
success = input(false, { transform: booleanAttribute });
|
|
24
|
+
info = input(false, { transform: booleanAttribute });
|
|
25
|
+
warning = input(false, { transform: booleanAttribute });
|
|
26
|
+
error = input(false, { transform: booleanAttribute });
|
|
27
|
+
fontSet = input('material-icons', {
|
|
28
|
+
transform: value => value || 'material-icons',
|
|
29
|
+
});
|
|
30
|
+
title = input();
|
|
31
|
+
description = input();
|
|
32
|
+
tooltip = input();
|
|
33
|
+
icon = input();
|
|
34
|
+
size = input('sm', {
|
|
35
|
+
transform: value => value || 'sm',
|
|
36
|
+
});
|
|
37
|
+
// ==========================================
|
|
38
|
+
// 2. OUTPUT
|
|
39
|
+
// ==========================================
|
|
40
|
+
click = new EventEmitter();
|
|
41
|
+
onClick = (event) => {
|
|
42
|
+
event.stopPropagation();
|
|
43
|
+
this.click.emit(event);
|
|
44
|
+
};
|
|
45
|
+
// ==========================================
|
|
46
|
+
// 3. COMPUTED STATE
|
|
47
|
+
// ==========================================
|
|
48
|
+
effectiveColor = computed(() => {
|
|
49
|
+
if (this.primary())
|
|
50
|
+
return 'primary';
|
|
51
|
+
if (this.secondary())
|
|
52
|
+
return 'secondary';
|
|
53
|
+
if (this.success())
|
|
54
|
+
return 'success';
|
|
55
|
+
if (this.info())
|
|
56
|
+
return 'info';
|
|
57
|
+
if (this.warning())
|
|
58
|
+
return 'warning';
|
|
59
|
+
if (this.error())
|
|
60
|
+
return 'error';
|
|
61
|
+
return this.color();
|
|
62
|
+
});
|
|
63
|
+
baseColorClasses = computed(() => {
|
|
64
|
+
const c = this.effectiveColor();
|
|
65
|
+
return {
|
|
66
|
+
'c-primary': c === 'primary',
|
|
67
|
+
'c-secondary': c === 'secondary',
|
|
68
|
+
'c-info': c === 'info',
|
|
69
|
+
'c-success': c === 'success',
|
|
70
|
+
'c-warning': c === 'warning',
|
|
71
|
+
'c-error': c === 'error',
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
iconColorClasses = computed(() => {
|
|
75
|
+
const c = this.effectiveColor();
|
|
76
|
+
return {
|
|
77
|
+
'c-primary': c === 'primary',
|
|
78
|
+
'c-black400': c === 'secondary',
|
|
79
|
+
'c-info': c === 'info',
|
|
80
|
+
'c-success': c === 'success',
|
|
81
|
+
'c-warning': c === 'warning',
|
|
82
|
+
'c-error': c === 'error',
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
iconSizeAndFontClasses = computed(() => {
|
|
86
|
+
const s = this.size();
|
|
87
|
+
const f = this.fontSet();
|
|
88
|
+
return {
|
|
89
|
+
'c-sm': s === 'sm',
|
|
90
|
+
'c-md': s === 'md',
|
|
91
|
+
'c-lg': s === 'lg',
|
|
92
|
+
'material-icons': f === 'material-icons',
|
|
93
|
+
'material-icons-outlined': f === 'material-icons-outlined',
|
|
94
|
+
'material-icons-round': f === 'material-icons-round',
|
|
95
|
+
'material-icons-sharp': f === 'material-icons-sharp',
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
// why: size modifier cho container .c-badge (round + tag). Tách prefix c-badge--<size>
|
|
99
|
+
// để không đụng class .c-sm/.c-md/.c-lg đang dùng trên icon span.
|
|
100
|
+
containerSizeClasses = computed(() => {
|
|
101
|
+
const s = this.size();
|
|
102
|
+
return {
|
|
103
|
+
'c-badge--sm': s === 'sm',
|
|
104
|
+
'c-badge--md': s === 'md',
|
|
105
|
+
'c-badge--lg': s === 'lg',
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
// GỘP CLASS CHO BADGE TYPE = 'TAG' (cũng dùng lại cho 'ROUND' khi có icon)
|
|
109
|
+
tagIconCombinedClasses = computed(() => ({
|
|
110
|
+
...this.iconSizeAndFontClasses(),
|
|
111
|
+
...this.baseColorClasses(),
|
|
112
|
+
}));
|
|
113
|
+
// GỘP CLASS CHO CONTAINER round/tag (color tint + size modifier)
|
|
114
|
+
containerCombinedClasses = computed(() => ({
|
|
115
|
+
...this.baseColorClasses(),
|
|
116
|
+
...this.containerSizeClasses(),
|
|
117
|
+
}));
|
|
118
|
+
// GỘP CLASS CHO BADGE TYPE = 'ICON'
|
|
119
|
+
iconCombinedClasses = computed(() => ({
|
|
120
|
+
...this.iconSizeAndFontClasses(),
|
|
121
|
+
...this.iconColorClasses(),
|
|
122
|
+
}));
|
|
123
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
124
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdBadge, isStandalone: true, selector: "sd-badge", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, primary: { classPropertyName: "primary", publicName: "primary", isSignal: true, isRequired: false, transformFunction: null }, secondary: { classPropertyName: "secondary", publicName: "secondary", isSignal: true, isRequired: false, transformFunction: null }, success: { classPropertyName: "success", publicName: "success", isSignal: true, isRequired: false, transformFunction: null }, info: { classPropertyName: "info", publicName: "info", isSignal: true, isRequired: false, transformFunction: null }, warning: { classPropertyName: "warning", publicName: "warning", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, fontSet: { classPropertyName: "fontSet", publicName: "fontSet", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click" }, ngImport: i0, template: "@let badgeType = type();\n@let tt = tooltip();\n@let titleText = title();\n@let descText = description();\n@let iconName = icon() || defaultIcon;\n@let isPointer = click.observed;\n\n@if (badgeType === 'round') {\n <div\n class=\"c-badge\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [ngClass]=\"containerCombinedClasses()\"\n [class.c-badge--has-icon]=\"!!icon()\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n @if (icon()) {\n <span class=\"c-material-icon\" [ngClass]=\"tagIconCombinedClasses()\">\n {{ iconName }}\n </span>\n }\n <span class=\"c-badge-title\">{{ titleText }}</span>\n </div>\n} @else if (badgeType === 'tag') {\n <div\n class=\"c-badge c-badge--tag\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [ngClass]=\"containerCombinedClasses()\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n <div class=\"c-icon d-flex align-items-center\">\n @if (icon()) {\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\n {{ iconName }}\n </span>\n }\n <div class=\"d-flex flex-column align-items-start\">\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\n @if (descText) {\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\n }\n </div>\n </div>\n </div>\n} @else {\n <div\n class=\"d-flex\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [class.c-badge-icon]=\"badgeType === 'icon'\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n <div class=\"c-icon d-flex align-items-center\">\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\">\n {{ iconName }}\n </span>\n <div class=\"d-flex flex-column\">\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\n @if (descText) {\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\n }\n </div>\n </div>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-badge{border-radius:20px;padding:2px 10px;display:inline-block;text-align:center;overflow-wrap:break-word}.c-badge.c-badge--has-icon{display:inline-flex;align-items:center;gap:4px}.c-badge .c-material-icon{padding:0}.c-badge .c-material-icon.c-sm{font-size:16px;width:16px;height:16px;line-height:16px}.c-badge .c-material-icon.c-md{font-size:18px;width:18px;height:18px;line-height:18px}.c-badge .c-material-icon.c-lg{font-size:24px;width:24px;height:24px;line-height:24px}.c-badge.c-badge--sm:not(.c-badge--tag){padding:2px 10px}.c-badge.c-badge--md:not(.c-badge--tag){padding:4px 12px}.c-badge.c-badge--lg:not(.c-badge--tag){padding:6px 16px}.c-badge.c-badge--sm .c-badge-title{font-size:14px}.c-badge.c-badge--md .c-badge-title{font-size:16px}.c-badge.c-badge--lg .c-badge-title{font-size:18px}.c-badge.c-badge--sm .c-badge-description{font-size:12px}.c-badge.c-badge--md .c-badge-description{font-size:13px}.c-badge.c-badge--lg .c-badge-description{font-size:14px}.c-badge.c-primary{background:var(--sd-primary-light);color:var(--sd-primary)}.c-badge.c-primary.c-badge--tag{border:1px solid var(--sd-primary)}.c-badge.c-secondary{background:var(--sd-secondary-light);color:var(--sd-secondary)}.c-badge.c-secondary.c-badge--tag{border:1px solid var(--sd-secondary)}.c-badge.c-info{background:var(--sd-info-light);color:var(--sd-info)}.c-badge.c-info.c-badge--tag{border:1px solid var(--sd-info)}.c-badge.c-warning{background:var(--sd-warning-light);color:var(--sd-warning)}.c-badge.c-warning.c-badge--tag{border:1px solid var(--sd-warning)}.c-badge.c-success{background:var(--sd-success-light);color:var(--sd-success)}.c-badge.c-success.c-badge--tag{border:1px solid var(--sd-success)}.c-badge.c-error{background:var(--sd-error-light);color:var(--sd-error)}.c-badge.c-error.c-badge--tag{border:1px solid var(--sd-error)}.c-badge.c-badge--tag{border-radius:4px;padding:1px 7px}.c-badge.c-badge--tag.c-badge--sm{padding:1px 7px}.c-badge.c-badge--tag.c-badge--md{padding:2px 10px}.c-badge.c-badge--tag.c-badge--lg{padding:4px 12px}.c-badge-icon{min-width:50px}.c-badge-icon .c-material-icon{border-radius:50%;padding:2px 2px 2px 0}.c-badge-icon .c-material-icon.c-sm{width:20px;height:20px;font-size:16px}.c-badge-icon .c-material-icon.c-md{width:22px;height:22px;font-size:18px}.c-badge-icon .c-material-icon.c-lg{width:28px;height:28px;font-size:24px}.c-badge-icon .c-material-icon.c-primary{color:var(--sd-primary)}.c-badge-icon .c-material-icon.c-secondary{color:var(--sd-secondary)}.c-badge-icon .c-material-icon.c-black400{color:var(--sd-black400)}.c-badge-icon .c-material-icon.c-info{color:var(--sd-info)}.c-badge-icon .c-material-icon.c-success{color:var(--sd-success)}.c-badge-icon .c-material-icon.c-error{color:var(--sd-error)}.c-badge-icon .c-material-icon.c-warning{color:var(--sd-warning)}.c-badge-description{color:var(--sd-black400)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
125
|
+
}
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdBadge, decorators: [{
|
|
127
|
+
type: Component,
|
|
128
|
+
args: [{ selector: 'sd-badge', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule], template: "@let badgeType = type();\n@let tt = tooltip();\n@let titleText = title();\n@let descText = description();\n@let iconName = icon() || defaultIcon;\n@let isPointer = click.observed;\n\n@if (badgeType === 'round') {\n <div\n class=\"c-badge\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [ngClass]=\"containerCombinedClasses()\"\n [class.c-badge--has-icon]=\"!!icon()\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n @if (icon()) {\n <span class=\"c-material-icon\" [ngClass]=\"tagIconCombinedClasses()\">\n {{ iconName }}\n </span>\n }\n <span class=\"c-badge-title\">{{ titleText }}</span>\n </div>\n} @else if (badgeType === 'tag') {\n <div\n class=\"c-badge c-badge--tag\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [ngClass]=\"containerCombinedClasses()\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n <div class=\"c-icon d-flex align-items-center\">\n @if (icon()) {\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\n {{ iconName }}\n </span>\n }\n <div class=\"d-flex flex-column align-items-start\">\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\n @if (descText) {\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\n }\n </div>\n </div>\n </div>\n} @else {\n <div\n class=\"d-flex\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [class.c-badge-icon]=\"badgeType === 'icon'\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n <div class=\"c-icon d-flex align-items-center\">\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\">\n {{ iconName }}\n </span>\n <div class=\"d-flex flex-column\">\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\n @if (descText) {\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\n }\n </div>\n </div>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-badge{border-radius:20px;padding:2px 10px;display:inline-block;text-align:center;overflow-wrap:break-word}.c-badge.c-badge--has-icon{display:inline-flex;align-items:center;gap:4px}.c-badge .c-material-icon{padding:0}.c-badge .c-material-icon.c-sm{font-size:16px;width:16px;height:16px;line-height:16px}.c-badge .c-material-icon.c-md{font-size:18px;width:18px;height:18px;line-height:18px}.c-badge .c-material-icon.c-lg{font-size:24px;width:24px;height:24px;line-height:24px}.c-badge.c-badge--sm:not(.c-badge--tag){padding:2px 10px}.c-badge.c-badge--md:not(.c-badge--tag){padding:4px 12px}.c-badge.c-badge--lg:not(.c-badge--tag){padding:6px 16px}.c-badge.c-badge--sm .c-badge-title{font-size:14px}.c-badge.c-badge--md .c-badge-title{font-size:16px}.c-badge.c-badge--lg .c-badge-title{font-size:18px}.c-badge.c-badge--sm .c-badge-description{font-size:12px}.c-badge.c-badge--md .c-badge-description{font-size:13px}.c-badge.c-badge--lg .c-badge-description{font-size:14px}.c-badge.c-primary{background:var(--sd-primary-light);color:var(--sd-primary)}.c-badge.c-primary.c-badge--tag{border:1px solid var(--sd-primary)}.c-badge.c-secondary{background:var(--sd-secondary-light);color:var(--sd-secondary)}.c-badge.c-secondary.c-badge--tag{border:1px solid var(--sd-secondary)}.c-badge.c-info{background:var(--sd-info-light);color:var(--sd-info)}.c-badge.c-info.c-badge--tag{border:1px solid var(--sd-info)}.c-badge.c-warning{background:var(--sd-warning-light);color:var(--sd-warning)}.c-badge.c-warning.c-badge--tag{border:1px solid var(--sd-warning)}.c-badge.c-success{background:var(--sd-success-light);color:var(--sd-success)}.c-badge.c-success.c-badge--tag{border:1px solid var(--sd-success)}.c-badge.c-error{background:var(--sd-error-light);color:var(--sd-error)}.c-badge.c-error.c-badge--tag{border:1px solid var(--sd-error)}.c-badge.c-badge--tag{border-radius:4px;padding:1px 7px}.c-badge.c-badge--tag.c-badge--sm{padding:1px 7px}.c-badge.c-badge--tag.c-badge--md{padding:2px 10px}.c-badge.c-badge--tag.c-badge--lg{padding:4px 12px}.c-badge-icon{min-width:50px}.c-badge-icon .c-material-icon{border-radius:50%;padding:2px 2px 2px 0}.c-badge-icon .c-material-icon.c-sm{width:20px;height:20px;font-size:16px}.c-badge-icon .c-material-icon.c-md{width:22px;height:22px;font-size:18px}.c-badge-icon .c-material-icon.c-lg{width:28px;height:28px;font-size:24px}.c-badge-icon .c-material-icon.c-primary{color:var(--sd-primary)}.c-badge-icon .c-material-icon.c-secondary{color:var(--sd-secondary)}.c-badge-icon .c-material-icon.c-black400{color:var(--sd-black400)}.c-badge-icon .c-material-icon.c-info{color:var(--sd-info)}.c-badge-icon .c-material-icon.c-success{color:var(--sd-success)}.c-badge-icon .c-material-icon.c-error{color:var(--sd-error)}.c-badge-icon .c-material-icon.c-warning{color:var(--sd-warning)}.c-badge-description{color:var(--sd-black400)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}\n"] }]
|
|
129
|
+
}], propDecorators: { click: [{
|
|
130
|
+
type: Output
|
|
131
|
+
}] } });
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Generated bundle index. Do not edit.
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
export { SdBadge };
|
|
138
|
+
//# sourceMappingURL=sdcorejs-angular-components-badge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-badge.mjs","sources":["../../../projects/sdcorejs-angular/components/badge/src/badge.component.ts","../../../projects/sdcorejs-angular/components/badge/src/badge.component.html","../../../projects/sdcorejs-angular/components/badge/sdcorejs-angular-components-badge.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, booleanAttribute, computed, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Color, Size } from '@sdcorejs/utils/models';\nimport { MaterialIconFontSet, DefaultMaterialIconFontSet } from '@sdcorejs/angular/utilities/models';\n\n// Export các Type để dùng chung\nexport type SdBadgeType = 'tag' | 'round' | 'icon';\n\n@Component({\n selector: 'sd-badge',\n templateUrl: './badge.component.html',\n styleUrls: ['./badge.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule],\n})\nexport class SdBadge {\n defaultIcon = 'fiber_manual_record';\n\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n type = input<SdBadgeType, SdBadgeType | undefined | null>('icon', {\n transform: value => value || 'icon',\n });\n\n color = input<Color, Color | undefined | null>('secondary', {\n transform: value => value || 'secondary',\n });\n\n primary = input(false, { transform: booleanAttribute });\n secondary = input(false, { transform: booleanAttribute });\n success = input(false, { transform: booleanAttribute });\n info = input(false, { transform: booleanAttribute });\n warning = input(false, { transform: booleanAttribute });\n error = input(false, { transform: booleanAttribute });\n\n fontSet = input<MaterialIconFontSet, MaterialIconFontSet | undefined | null>('material-icons', {\n transform: value => value || 'material-icons',\n });\n\n title = input<string | number | undefined | null>();\n description = input<string | undefined | null>();\n tooltip = input<string | undefined | null>();\n icon = input<string | undefined | null>();\n\n size = input<Size, Size | undefined | null>('sm', {\n transform: value => value || 'sm',\n });\n\n // ==========================================\n // 2. OUTPUT\n // ==========================================\n @Output() click = new EventEmitter<Event>();\n\n onClick = (event: Event) => {\n event.stopPropagation();\n this.click.emit(event);\n };\n\n // ==========================================\n // 3. COMPUTED STATE\n // ==========================================\n\n effectiveColor = computed(() => {\n if (this.primary()) return 'primary';\n if (this.secondary()) return 'secondary';\n if (this.success()) return 'success';\n if (this.info()) return 'info';\n if (this.warning()) return 'warning';\n if (this.error()) return 'error';\n return this.color();\n });\n\n baseColorClasses = computed(() => {\n const c = this.effectiveColor();\n return {\n 'c-primary': c === 'primary',\n 'c-secondary': c === 'secondary',\n 'c-info': c === 'info',\n 'c-success': c === 'success',\n 'c-warning': c === 'warning',\n 'c-error': c === 'error',\n };\n });\n\n iconColorClasses = computed(() => {\n const c = this.effectiveColor();\n return {\n 'c-primary': c === 'primary',\n 'c-black400': c === 'secondary',\n 'c-info': c === 'info',\n 'c-success': c === 'success',\n 'c-warning': c === 'warning',\n 'c-error': c === 'error',\n };\n });\n\n iconSizeAndFontClasses = computed(() => {\n const s = this.size();\n const f = this.fontSet();\n return {\n 'c-sm': s === 'sm',\n 'c-md': s === 'md',\n 'c-lg': s === 'lg',\n 'material-icons': f === 'material-icons',\n 'material-icons-outlined': f === 'material-icons-outlined',\n 'material-icons-round': f === 'material-icons-round',\n 'material-icons-sharp': f === 'material-icons-sharp',\n };\n });\n\n // why: size modifier cho container .c-badge (round + tag). Tách prefix c-badge--<size>\n // để không đụng class .c-sm/.c-md/.c-lg đang dùng trên icon span.\n containerSizeClasses = computed(() => {\n const s = this.size();\n return {\n 'c-badge--sm': s === 'sm',\n 'c-badge--md': s === 'md',\n 'c-badge--lg': s === 'lg',\n };\n });\n\n // GỘP CLASS CHO BADGE TYPE = 'TAG' (cũng dùng lại cho 'ROUND' khi có icon)\n tagIconCombinedClasses = computed(() => ({\n ...this.iconSizeAndFontClasses(),\n ...this.baseColorClasses(),\n }));\n\n // GỘP CLASS CHO CONTAINER round/tag (color tint + size modifier)\n containerCombinedClasses = computed(() => ({\n ...this.baseColorClasses(),\n ...this.containerSizeClasses(),\n }));\n\n // GỘP CLASS CHO BADGE TYPE = 'ICON'\n iconCombinedClasses = computed(() => ({\n ...this.iconSizeAndFontClasses(),\n ...this.iconColorClasses(),\n }));\n}\n","@let badgeType = type();\n@let tt = tooltip();\n@let titleText = title();\n@let descText = description();\n@let iconName = icon() || defaultIcon;\n@let isPointer = click.observed;\n\n@if (badgeType === 'round') {\n <div\n class=\"c-badge\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [ngClass]=\"containerCombinedClasses()\"\n [class.c-badge--has-icon]=\"!!icon()\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n @if (icon()) {\n <span class=\"c-material-icon\" [ngClass]=\"tagIconCombinedClasses()\">\n {{ iconName }}\n </span>\n }\n <span class=\"c-badge-title\">{{ titleText }}</span>\n </div>\n} @else if (badgeType === 'tag') {\n <div\n class=\"c-badge c-badge--tag\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [ngClass]=\"containerCombinedClasses()\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n <div class=\"c-icon d-flex align-items-center\">\n @if (icon()) {\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\n {{ iconName }}\n </span>\n }\n <div class=\"d-flex flex-column align-items-start\">\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\n @if (descText) {\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\n }\n </div>\n </div>\n </div>\n} @else {\n <div\n class=\"d-flex\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"tt || ''\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [class.c-badge-icon]=\"badgeType === 'icon'\"\n [class.pointer]=\"isPointer\"\n (click)=\"onClick($event)\"\n aria-hidden=\"true\">\n <div class=\"c-icon d-flex align-items-center\">\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\">\n {{ iconName }}\n </span>\n <div class=\"d-flex flex-column\">\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\n @if (descText) {\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\n }\n </div>\n </div>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Directive } from '@angular/core';
|
|
3
|
+
import { SdLicenseService } from '@sdcorejs/angular/services/license';
|
|
4
|
+
|
|
5
|
+
// base.component.ts
|
|
6
|
+
class SdBaseSecureComponent {
|
|
7
|
+
licenseService = inject(SdLicenseService);
|
|
8
|
+
constructor() {
|
|
9
|
+
this.licenseService.enforceLicense();
|
|
10
|
+
}
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdBaseSecureComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
12
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.21", type: SdBaseSecureComponent, isStandalone: true, ngImport: i0 });
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdBaseSecureComponent, decorators: [{
|
|
15
|
+
type: Directive
|
|
16
|
+
}], ctorParameters: () => [] });
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generated bundle index. Do not edit.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export { SdBaseSecureComponent };
|
|
23
|
+
//# sourceMappingURL=sdcorejs-angular-components-base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-base.mjs","sources":["../../../projects/sdcorejs-angular/components/base/src/base-secure.component.ts","../../../projects/sdcorejs-angular/components/base/sdcorejs-angular-components-base.ts"],"sourcesContent":["// base.component.ts\nimport { Directive, inject } from '@angular/core';\nimport { SdLicenseService } from '@sdcorejs/angular/services/license';\n\n@Directive() // Dùng Directive cho abstract class trong Angular\nexport abstract class SdBaseSecureComponent {\n protected licenseService = inject(SdLicenseService);\n constructor() {\n this.licenseService.enforceLicense();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAAA;MAKsB,qBAAqB,CAAA;AAC/B,IAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACnD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE;IACtC;wGAJoB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAD1C;;;ACJD;;AAEG;;;;"}
|