@sdcorejs/angular 21.1.5 → 21.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/assets/scss/core/menu.scss +18 -0
- package/assets/scss/core/utilities/_misc.scss +15 -0
- package/assets/scss/sd-core.scss +1 -0
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
- package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
- package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +58 -19
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
- package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +557 -255
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components.mjs +6 -1
- package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
- package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +234 -64
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +209 -42
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-models.mjs +279 -6
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
- package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
- package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
- package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
- package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +510 -68
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
- package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
- package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
- package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +441 -135
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
- package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
- package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
- package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
- package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
- package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
- package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
- package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
- package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services.mjs +0 -1
- package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
- package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
- package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular.mjs +17 -10
- package/fesm2022/sdcorejs-angular.mjs.map +1 -1
- package/package.json +40 -25
- package/types/sdcorejs-angular-components-anchor.d.ts +3 -1
- package/types/sdcorejs-angular-components-badge.d.ts +1 -0
- package/types/sdcorejs-angular-components-ckeditor-styles.d.ts +1 -1
- package/types/sdcorejs-angular-components-form-generic.d.ts +44 -33
- package/types/sdcorejs-angular-components-import-excel.d.ts +1 -0
- package/types/sdcorejs-angular-components-mini-editor.d.ts +1 -1
- package/types/sdcorejs-angular-components-modal-resizable.d.ts +92 -0
- package/types/sdcorejs-angular-components-modal.d.ts +3 -2
- package/types/sdcorejs-angular-components-org-chart.d.ts +6 -0
- package/types/sdcorejs-angular-components-preview.d.ts +1 -0
- package/types/sdcorejs-angular-components-query-bar.d.ts +55 -17
- package/types/sdcorejs-angular-components-query-builder.d.ts +150 -98
- package/types/sdcorejs-angular-components-section.d.ts +3 -0
- package/types/sdcorejs-angular-components-tab-router.d.ts +19 -19
- package/types/sdcorejs-angular-components-table.d.ts +252 -110
- package/types/sdcorejs-angular-components-tree.d.ts +48 -30
- package/types/sdcorejs-angular-components-upload-file.d.ts +6 -3
- package/types/sdcorejs-angular-components.d.ts +6 -1
- package/types/sdcorejs-angular-configurations.d.ts +1 -2
- package/types/sdcorejs-angular-forms-autocomplete.d.ts +5 -2
- package/types/sdcorejs-angular-forms-chip-calendar.d.ts +10 -0
- package/types/sdcorejs-angular-forms-date-range.d.ts +14 -2
- package/types/sdcorejs-angular-forms-date.d.ts +21 -3
- package/types/sdcorejs-angular-forms-datetime.d.ts +13 -2
- package/types/sdcorejs-angular-forms-entity-picker.d.ts +9 -3
- package/types/sdcorejs-angular-forms-input-color.d.ts +4 -0
- package/types/sdcorejs-angular-forms-input-number.d.ts +3 -0
- package/types/sdcorejs-angular-forms-input.d.ts +3 -0
- package/types/sdcorejs-angular-forms-models.d.ts +146 -5
- package/types/sdcorejs-angular-forms-select.d.ts +27 -4
- package/types/sdcorejs-angular-forms-switch.d.ts +7 -1
- package/types/sdcorejs-angular-forms-textarea.d.ts +5 -3
- package/types/sdcorejs-angular-forms-time-range.d.ts +22 -1
- package/types/sdcorejs-angular-forms-tree-select.d.ts +36 -5
- package/types/sdcorejs-angular-forms.d.ts +22 -13
- package/types/sdcorejs-angular-i18n.d.ts +99 -16
- package/types/sdcorejs-angular-interceptors.d.ts +13 -3
- package/types/sdcorejs-angular-modules-auth.d.ts +1 -1
- package/types/sdcorejs-angular-modules-keycloak.d.ts +1 -0
- package/types/sdcorejs-angular-modules-layout.d.ts +103 -28
- package/types/sdcorejs-angular-modules-permission.d.ts +66 -4
- package/types/sdcorejs-angular-pipes.d.ts +27 -5
- package/types/sdcorejs-angular-services-api.d.ts +21 -1
- package/types/sdcorejs-angular-services-cache.d.ts +11 -1
- package/types/sdcorejs-angular-services-notify.d.ts +1 -1
- package/types/sdcorejs-angular-services.d.ts +0 -1
- package/types/sdcorejs-angular-utilities-extensions.d.ts +83 -61
- package/types/sdcorejs-angular-utilities-models.d.ts +2 -76
- package/types/sdcorejs-angular.d.ts +11 -2
- package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
- package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-models.mjs +0 -6
- package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
- package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
- package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
- package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
- package/types/sdcorejs-angular-components-base.d.ts +0 -11
- package/types/sdcorejs-angular-components-document-builder.d.ts +0 -252
- package/types/sdcorejs-angular-models.d.ts +0 -2
- package/types/sdcorejs-angular-services-docx.d.ts +0 -27
- package/types/sdcorejs-angular-services-license.d.ts +0 -12
|
@@ -3,9 +3,9 @@ import { CommonModule } from '@angular/common';
|
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { Pipe, Injectable, Input, Component } from '@angular/core';
|
|
5
5
|
import { SdBadge } from '@sdcorejs/angular/components/badge';
|
|
6
|
-
import { DateUtilities } from '@sdcorejs/
|
|
6
|
+
import { DateUtilities } from '@sdcorejs/utils/fns';
|
|
7
7
|
import { EMPTY_STR } from '@sdcorejs/utils/constants';
|
|
8
|
-
import {
|
|
8
|
+
import { SdTranslatePipe } from '@sdcorejs/angular/i18n';
|
|
9
9
|
|
|
10
10
|
class ViewDateTimePipe {
|
|
11
11
|
transform(value) {
|
|
@@ -34,11 +34,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
34
34
|
class SdHistoryItem {
|
|
35
35
|
items = [];
|
|
36
36
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdHistoryItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SdHistoryItem, isStandalone: true, selector: "sd-history", inputs: { items: "items" }, ngImport: i0, template: "<div class=\"sd-history\">\n <div class=\"history-container\">\n <div class=\"history-line\"></div>\n <div *ngFor=\"let item of items; let i = index\" class=\"history-item\">\n <div class=\"dot\"></div>\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"title-wrapper\">\n <span class=\"title\">{{ item.title }}</span>\n <span class=\"status\">\n @if (item?.status) {\n <sd-badge\n [icon]=\"item.status?.icon\"\n [title]=\"item.status?.title\"\n [color]=\"item.status?.color\"></sd-badge>\n }\n </span>\n </div>\n <span class=\"date\">{{ item?.date | viewDateTime }}</span>\n </div>\n <div class=\"meta\">\n @if (item?.actor) {\n <span>{{ 'core.component.history.by' |
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SdHistoryItem, isStandalone: true, selector: "sd-history", inputs: { items: "items" }, ngImport: i0, template: "<div class=\"sd-history\">\n <div class=\"history-container\">\n <div class=\"history-line\"></div>\n <div *ngFor=\"let item of items; let i = index\" class=\"history-item\">\n <div class=\"dot\"></div>\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"title-wrapper\">\n <span class=\"title\">{{ item.title }}</span>\n <span class=\"status\">\n @if (item?.status) {\n <sd-badge\n [icon]=\"item.status?.icon\"\n [title]=\"item.status?.title\"\n [color]=\"item.status?.color\"></sd-badge>\n }\n </span>\n </div>\n <span class=\"date\">{{ item?.date | viewDateTime }}</span>\n </div>\n <div class=\"meta\">\n @if (item?.actor) {\n <span>{{ 'core.component.history.by' | sdTranslate }} <strong>@{{ item.actor }}</strong></span>\n }\n @if (item?.source) {\n <span> · {{ item.source }}</span>\n }\n </div>\n <div class=\"description\">\n {{ item?.description }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".sd-history{padding:16px}.history-container{position:relative;padding-left:20px;font-size:14px;line-height:20px;min-width:470px;max-width:100%}.history-line{position:absolute;left:8px;top:0;bottom:0;width:2px;background-color:#94b0ff}.history-item{position:relative;margin-bottom:16px;padding-left:10px}.history-item .dot{position:absolute;left:-16px;top:12px;width:12px;height:12px;background-color:#94b0ff;border-radius:50%}.history-item .card{background:#fff;border-radius:6px;box-shadow:0 2px 4px #0000001a;padding:8px 8px 8px 16px}.history-item .card .header{display:flex;justify-content:space-between;align-items:center}.history-item .card .header .title-wrapper{display:flex;align-items:flex-start;padding-right:8px}.history-item .card .header .title{margin-right:8px;color:#757575}.history-item .card .header .status{display:flex;align-items:center}.history-item .card .header .status sd-icon{margin-right:4px}.history-item .card .header .date{color:#757575;font-size:12px;line-height:16px}.history-item .card .meta{color:#757575}.history-item .card .meta strong{color:#000}.history-item .card .meta{margin-top:4px}.history-item .card .description{margin-top:4px;color:#000;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: SdBadge, selector: "sd-badge", inputs: ["type", "color", "primary", "secondary", "success", "info", "warning", "error", "fontSet", "title", "description", "tooltip", "icon", "size"], outputs: ["click"] }, { kind: "pipe", type: ViewDateTimePipe, name: "viewDateTime" }, { kind: "pipe", type: SdTranslatePipe, name: "sdTranslate" }] });
|
|
38
38
|
}
|
|
39
39
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdHistoryItem, decorators: [{
|
|
40
40
|
type: Component,
|
|
41
|
-
args: [{ selector: 'sd-history', imports: [CommonModule, SdBadge, ViewDateTimePipe,
|
|
41
|
+
args: [{ selector: 'sd-history', imports: [CommonModule, SdBadge, ViewDateTimePipe, SdTranslatePipe], template: "<div class=\"sd-history\">\n <div class=\"history-container\">\n <div class=\"history-line\"></div>\n <div *ngFor=\"let item of items; let i = index\" class=\"history-item\">\n <div class=\"dot\"></div>\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"title-wrapper\">\n <span class=\"title\">{{ item.title }}</span>\n <span class=\"status\">\n @if (item?.status) {\n <sd-badge\n [icon]=\"item.status?.icon\"\n [title]=\"item.status?.title\"\n [color]=\"item.status?.color\"></sd-badge>\n }\n </span>\n </div>\n <span class=\"date\">{{ item?.date | viewDateTime }}</span>\n </div>\n <div class=\"meta\">\n @if (item?.actor) {\n <span>{{ 'core.component.history.by' | sdTranslate }} <strong>@{{ item.actor }}</strong></span>\n }\n @if (item?.source) {\n <span> · {{ item.source }}</span>\n }\n </div>\n <div class=\"description\">\n {{ item?.description }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".sd-history{padding:16px}.history-container{position:relative;padding-left:20px;font-size:14px;line-height:20px;min-width:470px;max-width:100%}.history-line{position:absolute;left:8px;top:0;bottom:0;width:2px;background-color:#94b0ff}.history-item{position:relative;margin-bottom:16px;padding-left:10px}.history-item .dot{position:absolute;left:-16px;top:12px;width:12px;height:12px;background-color:#94b0ff;border-radius:50%}.history-item .card{background:#fff;border-radius:6px;box-shadow:0 2px 4px #0000001a;padding:8px 8px 8px 16px}.history-item .card .header{display:flex;justify-content:space-between;align-items:center}.history-item .card .header .title-wrapper{display:flex;align-items:flex-start;padding-right:8px}.history-item .card .header .title{margin-right:8px;color:#757575}.history-item .card .header .status{display:flex;align-items:center}.history-item .card .header .status sd-icon{margin-right:4px}.history-item .card .header .date{color:#757575;font-size:12px;line-height:16px}.history-item .card .meta{color:#757575}.history-item .card .meta strong{color:#000}.history-item .card .meta{margin-top:4px}.history-item .card .description{margin-top:4px;color:#000;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}\n"] }]
|
|
42
42
|
}], propDecorators: { items: [{
|
|
43
43
|
type: Input
|
|
44
44
|
}] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-components-history.mjs","sources":["../../../projects/sdcorejs-angular/components/history/pipes/view-date.pipe.ts","../../../projects/sdcorejs-angular/components/history/src/history.component.ts","../../../projects/sdcorejs-angular/components/history/src/history.component.html","../../../projects/sdcorejs-angular/components/history/sdcorejs-angular-components-history.ts"],"sourcesContent":["import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-history.mjs","sources":["../../../projects/sdcorejs-angular/components/history/pipes/view-date.pipe.ts","../../../projects/sdcorejs-angular/components/history/src/history.component.ts","../../../projects/sdcorejs-angular/components/history/src/history.component.html","../../../projects/sdcorejs-angular/components/history/sdcorejs-angular-components-history.ts"],"sourcesContent":["import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\n\n@Pipe({\n name: 'viewDateTime',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class ViewDateTimePipe implements PipeTransform {\n transform(value: any): string {\n if (!value || !DateUtilities.isDate(value)) {\n return EMPTY_STR;\n }\n return DateUtilities.toFormat(value, 'HH:mm dd/MM/yyyy');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdHistoryItemType } from '../models/history.model';\nimport { ViewDateTimePipe } from '../pipes/view-date.pipe';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-history',\n imports: [CommonModule, SdBadge, ViewDateTimePipe, SdTranslatePipe],\n templateUrl: './history.component.html',\n styleUrl: './history.component.scss',\n})\nexport class SdHistoryItem {\n @Input() items: SdHistoryItemType[] = [];\n}\n","<div class=\"sd-history\">\n <div class=\"history-container\">\n <div class=\"history-line\"></div>\n <div *ngFor=\"let item of items; let i = index\" class=\"history-item\">\n <div class=\"dot\"></div>\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"title-wrapper\">\n <span class=\"title\">{{ item.title }}</span>\n <span class=\"status\">\n @if (item?.status) {\n <sd-badge\n [icon]=\"item.status?.icon\"\n [title]=\"item.status?.title\"\n [color]=\"item.status?.color\"></sd-badge>\n }\n </span>\n </div>\n <span class=\"date\">{{ item?.date | viewDateTime }}</span>\n </div>\n <div class=\"meta\">\n @if (item?.actor) {\n <span>{{ 'core.component.history.by' | sdTranslate }} <strong>@{{ item.actor }}</strong></span>\n }\n @if (item?.source) {\n <span> · {{ item.source }}</span>\n }\n </div>\n <div class=\"description\">\n {{ item?.description }}\n </div>\n </div>\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;MAWa,gBAAgB,CAAA;AAC3B,IAAA,SAAS,CAAC,KAAU,EAAA;QAClB,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AAC1C,YAAA,OAAO,SAAS;QAClB;QACA,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IAC1D;wGANW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;kBACA,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCGY,aAAa,CAAA;IACf,KAAK,GAAwB,EAAE;wGAD7B,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECb1B,qsCAmCA,EAAA,MAAA,EAAA,CAAA,8wCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BY,YAAY,4JAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,aAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,IAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA;;4FAIvD,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,YAAY,EAAA,OAAA,EACb,CAAC,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,qsCAAA,EAAA,MAAA,EAAA,CAAA,8wCAAA,CAAA,EAAA;;sBAKlE;;;AEdH;;AAEG;;;;"}
|
|
@@ -15,12 +15,12 @@ import { MatMenuModule } from '@angular/material/menu';
|
|
|
15
15
|
import { SdModal } from '@sdcorejs/angular/components/modal';
|
|
16
16
|
import { SdExcelService } from '@sdcorejs/angular/services/excel';
|
|
17
17
|
import { SdNotifyService } from '@sdcorejs/angular/services/notify';
|
|
18
|
-
import { DateUtilities, NumberUtilities } from '@sdcorejs/
|
|
18
|
+
import { DateUtilities, NumberUtilities } from '@sdcorejs/utils/fns';
|
|
19
19
|
import { SdLoadingService } from '@sdcorejs/angular/services/loading';
|
|
20
20
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
21
21
|
import { MatProgressSpinner } from '@angular/material/progress-spinner';
|
|
22
22
|
import { SdBadge } from '@sdcorejs/angular/components/badge';
|
|
23
|
-
import { I18nService,
|
|
23
|
+
import { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';
|
|
24
24
|
import { SdIcon } from '@sdcorejs/angular/modules/icon';
|
|
25
25
|
|
|
26
26
|
class ColumnHiddenPipe {
|
|
@@ -432,6 +432,14 @@ class SdImportExcel {
|
|
|
432
432
|
this.#paginator.pageIndex = 0;
|
|
433
433
|
this.#reload();
|
|
434
434
|
};
|
|
435
|
+
// why: vùng trạng thái rỗng nay là role="button" + tabindex="0" nên Enter/Space phải tải file
|
|
436
|
+
// mẫu đúng như click. preventDefault để Space không cuộn trang.
|
|
437
|
+
onDownloadTemplateKeydown = (event) => {
|
|
438
|
+
if (event.target !== event.currentTarget)
|
|
439
|
+
return;
|
|
440
|
+
event.preventDefault();
|
|
441
|
+
void this.downloadTemplate();
|
|
442
|
+
};
|
|
435
443
|
downloadTemplate = async () => {
|
|
436
444
|
const sheets = [];
|
|
437
445
|
if (Array.isArray(this.option?.sheets)) {
|
|
@@ -543,7 +551,7 @@ class SdImportExcel {
|
|
|
543
551
|
this.sdClosed.emit();
|
|
544
552
|
};
|
|
545
553
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdImportExcel, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
546
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SdImportExcel, isStandalone: true, selector: "sd-import-excel", inputs: { option: "option" }, outputs: { sdClosed: "sdClosed" }, providers: [ColumnHiddenPipe], viewQueries: [{ propertyName: "modal", first: true, predicate: SdModal, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "@if (option) {\n <sd-modal [title]=\"option.title || ('core.component.import-excel.title' | translate)\" (sdClosed)=\"onClosed()\" #modal>\n <div class=\"d-flex align-items-center mb-12\" style=\"min-height: 32px\">\n @if (excelItems.length) {\n <div class=\"d-flex\">\n <sd-button class=\"mr-2\" (click)=\"view('ALL')\" icon=\"cached\" [title]=\"'core.component.import-excel.see-all' | translate\" size=\"sm\" type=\"outline\"></sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('SUCCESS')\"\n icon=\"done\"\n title=\"{{ numberOfSuccess }}\"\n [tooltip]=\"'core.component.import-excel.valid-rows' | translate\"\n size=\"sm\"\n color=\"success\">\n </sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('WARNING')\"\n icon=\"warning\"\n title=\"{{ numberOfWarning }}\"\n [tooltip]=\"'core.component.import-excel.error-rows' | translate\"\n size=\"sm\"\n color=\"warning\">\n </sd-button>\n\n <sd-button\n (click)=\"view('ERROR')\"\n icon=\"error\"\n title=\"{{ numberOfError }}\"\n color=\"error\"\n [tooltip]=\"'core.component.import-excel.warning-rows' | translate\"\n size=\"sm\">\n </sd-button>\n </div>\n }\n </div>\n\n <div class=\"sd-box border rounded\">\n <div class=\"sd-box-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"sd-table\">\n <thead>\n <tr>\n <th class=\"text-center c-sticky-left\" style=\"width: 50px\">#</th>\n @if (filteredItems.length) {\n <th class=\"text-center\" style=\"min-width: 250px; width: 250px\">{{ 'core.component.import-excel.status' | translate }}</th>\n }\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <th [ngStyle]=\"{ 'min-width': column.width || '300px', width: column.width || '300px' }\" [matTooltip]=\"column.title\">\n <span class=\"c-ellipsis\">\n {{ column.title }}\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n\n <tbody>\n @if (viewItems.length) {\n @for (item of viewItems; track item.meta.excelIndex) {\n <tr>\n <td class=\"text-center c-sticky-left px-4\">\n <sd-badge\n type=\"tag\"\n [title]=\"item.meta.excelIndex\"\n [success]=\"!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [warning]=\"!!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [error]=\"!!item.meta.errorMessages.length\" />\n </td>\n\n <td style=\"min-width: 250px; width: 250px\">\n <div\n class=\"text-wrap\"\n [innerHTML]=\"\n item.meta.errorMessages[0] || item.meta.warningMessages[0] || ('<span class=\\'text-success\\'>' + ('core.component.import-excel.valid-data' | translate) + '</span>')\n \"></div>\n </td>\n\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <td\n class=\"align-middle\"\n [ngClass]=\"{\n 'bg-warning-light': item.meta.warning[column.field] && !item.meta.error[column.field],\n 'bg-error-light': item.meta.error[column.field]\n }\"\n [matTooltip]=\"item.meta.error[column.field] || item.meta.warning[column.field]\"\n [ngStyle]=\"{ 'min-width': column.width || '300px' }\"\n matTooltipPosition=\"above\">\n <div class=\"c-ellipsis\">\n @if (column.type !== 'array') {\n <span [innerHTML]=\"item | columnTransform: column | async\"></span>\n }\n\n @if (column.type === 'array') {\n @let arrayItems = item.data[column.field]?.split(column.divideString);\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>{{ arrayItems?.length || 0 }} {{ column.unitString }}</span>\n\n @if (arrayItems?.length) {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n class=\"c-mat-menu\"\n style=\"width: 24px; height: 24px; line-height: 24px\">\n <sd-icon style=\"font-size: 18px\" name=\"open_in_new\"></sd-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n <div\n class=\"px-3 py-2\"\n style=\"max-width: 300px; max-height: 250px; overflow: auto\"\n (click)=\"$event.stopPropagation()\"\n aria-hidden=\"true\">\n @for (val of arrayItems; track $index) {\n <div class=\"border-bottom py-2 text-wrap\" [innerHTML]=\"val\"></div>\n }\n </div>\n </mat-menu>\n }\n </div>\n }\n </div>\n </td>\n }\n }\n </tr>\n }\n } @else {\n <tr>\n <td [attr.colspan]=\"option.columns.length + 2\" class=\"p-0 border-0 bg-white\">\n <div\n class=\"empty-state-wrapper\"\n (click)=\"downloadTemplate()\"\n [matTooltip]=\"'core.component.import-excel.download-template-tooltip' | translate\"\n aria-hidden=\"true\">\n <sd-icon class=\"empty-icon\" name=\"cloud_download\"></sd-icon>\n\n <h4>{{ 'core.component.import-excel.no-data-upload' | translate }}</h4>\n <span class=\"text-small text-link\"> {{ 'core.component.import-excel.click-here-template' | translate }} </span>\n\n @if (isDownloadTemplate) {\n <div class=\"mt-3\">\n <mat-spinner diameter=\"24\" mode=\"indeterminate\"></mat-spinner>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"sd-box-footer border-top\">\n <div class=\"d-flex align-items-center justify-content-end\">\n <mat-paginator [length]=\"filteredItems.length || 0\" hidePageSize showFirstLastButtons></mat-paginator>\n </div>\n </div>\n </div>\n <sd-button sdFooterLeft (click)=\"upload()\" prefixIcon=\"file_upload\" [title]=\"'core.component.import-excel.upload' | translate\" size=\"sm\" color=\"info\" [loading]=\"uploading\">\n </sd-button>\n <div class=\"d-flex align-items-center\" sdFooterRight>\n @if (filteredItems.length) {\n <sd-button class=\"mr-4\" (click)=\"export()\" prefixIcon=\"get_app\" [title]=\"'core.component.import-excel.download' | translate\" size=\"sm\" color=\"success\" type=\"outline\">\n </sd-button>\n }\n <sd-button\n (click)=\"accept()\"\n [title]=\"'core.component.import-excel.confirm-save' | translate\"\n [disabled]=\"(numberOfSuccess === 0 && numberOfWarning === 0) || numberOfError > 0 || isUploaded\"\n color=\"primary\"\n type=\"fill\"\n size=\"sm\">\n </sd-button>\n </div>\n </sd-modal>\n}\n", styles: [".table-responsive{position:relative;min-height:50vh;height:50vh;overflow:auto;border:1px solid #dee2e6}.sd-table{width:100%;border-collapse:collapse;margin-bottom:0;font-size:14px}.sd-table thead th{position:sticky;top:0;background-color:#f8f9fa;border-bottom:2px solid #dee2e6;border-top:1px solid #dee2e6;padding:8px 6px;white-space:nowrap;z-index:10;font-weight:600}.sd-table thead th.c-sticky-left{z-index:20}.sd-table tbody td{vertical-align:middle;padding:6px;border-top:1px solid #dee2e6}.sd-table tbody tr:nth-of-type(odd){background-color:#0000000a}.sd-table tbody tr:nth-of-type(2n){background-color:#fff}.sd-table tbody tr:hover,.sd-table tbody tr:hover .c-sticky-left{background-color:#ececec}.sd-table tbody tr:nth-of-type(odd) .c-sticky-left{background-color:#f2f2f2}.sd-table tbody tr:nth-of-type(2n) .c-sticky-left{background-color:#fff}.c-sticky-left{position:sticky;left:0;border-right:1px solid #dee2e6!important;border-left:none!important;z-index:5}.empty-state-wrapper{height:100%;min-height:40vh;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;background-color:#f8f9fa;border:2px dashed #cbd5e0;border-radius:8px;margin:16px;transition:all .2s ease-in-out;color:#6c757d}.empty-state-wrapper:hover{background-color:var(--sd-primary-light, #d7e3ff);border-color:var(--sd-primary, #005cbb);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .empty-icon{transform:scale(1.1);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .text-link{text-decoration:underline}.empty-state-wrapper .empty-icon{font-size:64px;height:64px;width:64px;margin-bottom:16px;color:#a0aec0;transition:transform .2s}.empty-state-wrapper h4{font-weight:500;margin-bottom:4px}.c-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding:0 4px}.c-mat-menu{border:none;min-width:unset;padding:0 8px}.c-mat-menu sd-icon{font-size:18px;width:18px;height:18px;line-height:18px;vertical-align:middle}.cursor-pointer{cursor:pointer}:host ::ng-deep .mat-paginator-container{min-height:36px;height:36px;padding:0 8px}:host ::ng-deep .mat-paginator-range-label{margin:0 10px}:host ::ng-deep .mat-icon-button{width:32px;height:32px;line-height:32px}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i3.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "size", "fontSet", "title", "width", "tooltip", "prefixIcon", "suffixIcon", "disabled", "loading", "block", "htmlType"], outputs: ["click"] }, { kind: "component", type: SdModal, selector: "sd-modal", inputs: ["autoId", "title", "color", "width", "height", "view", "modalClass", "lazyLoadContent", "hideClose", "disableBackdropClose", "beforeClose"], outputs: ["sdClosed", "sdCloseError"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: SdBadge, selector: "sd-badge", inputs: ["type", "color", "primary", "secondary", "success", "info", "warning", "error", "fontSet", "title", "description", "tooltip", "icon", "size"], outputs: ["click"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: ColumnTransformPipe, name: "columnTransform" }, { kind: "pipe", type: ColumnHiddenPipe, name: "columnHidden" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
554
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SdImportExcel, isStandalone: true, selector: "sd-import-excel", inputs: { option: "option" }, outputs: { sdClosed: "sdClosed" }, providers: [ColumnHiddenPipe], viewQueries: [{ propertyName: "modal", first: true, predicate: SdModal, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "@if (option) {\n <sd-modal [title]=\"option.title || ('core.component.import-excel.title' | sdTranslate)\" (sdClosed)=\"onClosed()\" #modal>\n <div class=\"d-flex align-items-center mb-12\" style=\"min-height: 32px\">\n @if (excelItems.length) {\n <div class=\"d-flex\">\n <sd-button class=\"mr-2\" (click)=\"view('ALL')\" icon=\"cached\" [title]=\"'core.component.import-excel.see-all' | sdTranslate\" size=\"sm\" type=\"outline\"></sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('SUCCESS')\"\n icon=\"done\"\n title=\"{{ numberOfSuccess }}\"\n [tooltip]=\"'core.component.import-excel.valid-rows' | sdTranslate\"\n size=\"sm\"\n color=\"success\">\n </sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('WARNING')\"\n icon=\"warning\"\n title=\"{{ numberOfWarning }}\"\n [tooltip]=\"'core.component.import-excel.error-rows' | sdTranslate\"\n size=\"sm\"\n color=\"warning\">\n </sd-button>\n\n <sd-button\n (click)=\"view('ERROR')\"\n icon=\"error\"\n title=\"{{ numberOfError }}\"\n color=\"error\"\n [tooltip]=\"'core.component.import-excel.warning-rows' | sdTranslate\"\n size=\"sm\">\n </sd-button>\n </div>\n }\n </div>\n\n <div class=\"sd-box border rounded\">\n <div class=\"sd-box-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"sd-table\">\n <thead>\n <tr>\n <th class=\"text-center c-sticky-left\" style=\"width: 50px\">#</th>\n @if (filteredItems.length) {\n <th class=\"text-center\" style=\"min-width: 250px; width: 250px\">{{ 'core.component.import-excel.status' | sdTranslate }}</th>\n }\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <th [ngStyle]=\"{ 'min-width': column.width || '300px', width: column.width || '300px' }\" [matTooltip]=\"column.title\">\n <span class=\"c-ellipsis\">\n {{ column.title }}\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n\n <tbody>\n @if (viewItems.length) {\n @for (item of viewItems; track item.meta.excelIndex) {\n <tr>\n <td class=\"text-center c-sticky-left px-4\">\n <sd-badge\n type=\"tag\"\n [title]=\"item.meta.excelIndex\"\n [success]=\"!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [warning]=\"!!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [error]=\"!!item.meta.errorMessages.length\" />\n </td>\n\n <td style=\"min-width: 250px; width: 250px\">\n <div\n class=\"text-wrap\"\n [innerHTML]=\"\n item.meta.errorMessages[0] || item.meta.warningMessages[0] || ('<span class=\\'text-success\\'>' + ('core.component.import-excel.valid-data' | sdTranslate) + '</span>')\n \"></div>\n </td>\n\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <td\n class=\"align-middle\"\n [ngClass]=\"{\n 'bg-warning-light': item.meta.warning[column.field] && !item.meta.error[column.field],\n 'bg-error-light': item.meta.error[column.field]\n }\"\n [matTooltip]=\"item.meta.error[column.field] || item.meta.warning[column.field]\"\n [ngStyle]=\"{ 'min-width': column.width || '300px' }\"\n matTooltipPosition=\"above\">\n <div class=\"c-ellipsis\">\n @if (column.type !== 'array') {\n <span [innerHTML]=\"item | columnTransform: column | async\"></span>\n }\n\n @if (column.type === 'array') {\n @let arrayItems = item.data[column.field]?.split(column.divideString);\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>{{ arrayItems?.length || 0 }} {{ column.unitString }}</span>\n\n @if (arrayItems?.length) {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n class=\"c-mat-menu\"\n style=\"width: 24px; height: 24px; line-height: 24px\">\n <sd-icon style=\"font-size: 18px\" name=\"open_in_new\"></sd-icon>\n </button>\n\n <!-- why: b\u1ECF aria-hidden=\"true\" \u2014 panel n\u00E0y CH\u00CDNH L\u00C0 n\u1ED9i dung c\u1EE7a\n menu (danh s\u00E1ch gi\u00E1 tr\u1ECB); \u1EA9n n\u00F3 \u0111i th\u00EC menu m\u1EDF ra r\u1ED7ng v\u1EDBi\n screen reader. role=\"group\" m\u00F4 t\u1EA3 \u0111\u00FAng v\u00E0 gi\u1EEF panel kh\u00F4ng\n nh\u1EADn tabindex; stopPropagation ch\u1EC9 \u0111\u1EC3 menu kh\u00F4ng t\u1EF1 \u0111\u00F3ng. -->\n <mat-menu #menu=\"matMenu\">\n <div\n class=\"px-3 py-2\"\n role=\"group\"\n style=\"max-width: 300px; max-height: 250px; overflow: auto\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\">\n @for (val of arrayItems; track $index) {\n <div class=\"border-bottom py-2 text-wrap\" [innerHTML]=\"val\"></div>\n }\n </div>\n </mat-menu>\n }\n </div>\n }\n </div>\n </td>\n }\n }\n </tr>\n }\n } @else {\n <tr>\n <td [attr.colspan]=\"option.columns.length + 2\" class=\"p-0 border-0 bg-white\">\n <!-- why: b\u1ECF aria-hidden=\"true\" \u2014 \u0111\u00E2y v\u1EEBa l\u00E0 TH\u00D4NG B\u00C1O tr\u1EA1ng th\u00E1i r\u1ED7ng v\u1EEBa l\u00E0\n control t\u1EA3i file m\u1EABu. aria-hidden xo\u00E1 c\u1EA3 th\u00F4ng b\u00E1o l\u1EABn control kh\u1ECFi\n accessibility tree. Nay role=\"button\" + tabindex=\"0\" + Enter/Space; live\n region ri\u00EAng cho spinner t\u1EA3i m\u1EABu (ti\u1EBFn tr\u00ECnh b\u1EA5t \u0111\u1ED3ng b\u1ED9). -->\n <div\n class=\"empty-state-wrapper\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'core.component.import-excel.download-template-tooltip' | sdTranslate\"\n (click)=\"downloadTemplate()\"\n (keydown.enter)=\"onDownloadTemplateKeydown($event)\"\n (keydown.space)=\"onDownloadTemplateKeydown($event)\"\n [matTooltip]=\"'core.component.import-excel.download-template-tooltip' | sdTranslate\">\n <sd-icon class=\"empty-icon\" name=\"cloud_download\"></sd-icon>\n\n <h4>{{ 'core.component.import-excel.no-data-upload' | sdTranslate }}</h4>\n <span class=\"text-small text-link\"> {{ 'core.component.import-excel.click-here-template' | sdTranslate }} </span>\n\n @if (isDownloadTemplate) {\n <div class=\"mt-3\" role=\"status\" aria-live=\"polite\" [attr.aria-label]=\"'core.component.import-excel.loading' | sdTranslate\">\n <mat-spinner diameter=\"24\" mode=\"indeterminate\"></mat-spinner>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"sd-box-footer border-top\">\n <div class=\"d-flex align-items-center justify-content-end\">\n <mat-paginator [length]=\"filteredItems.length || 0\" hidePageSize showFirstLastButtons></mat-paginator>\n </div>\n </div>\n </div>\n <sd-button sdFooterLeft (click)=\"upload()\" prefixIcon=\"file_upload\" [title]=\"'core.component.import-excel.upload' | sdTranslate\" size=\"sm\" color=\"info\" [loading]=\"uploading\">\n </sd-button>\n <div class=\"d-flex align-items-center\" sdFooterRight>\n @if (filteredItems.length) {\n <sd-button class=\"mr-4\" (click)=\"export()\" prefixIcon=\"get_app\" [title]=\"'core.component.import-excel.download' | sdTranslate\" size=\"sm\" color=\"success\" type=\"outline\">\n </sd-button>\n }\n <sd-button\n (click)=\"accept()\"\n [title]=\"'core.component.import-excel.confirm-save' | sdTranslate\"\n [disabled]=\"(numberOfSuccess === 0 && numberOfWarning === 0) || numberOfError > 0 || isUploaded\"\n color=\"primary\"\n type=\"fill\"\n size=\"sm\">\n </sd-button>\n </div>\n </sd-modal>\n}\n", styles: [".table-responsive{position:relative;min-height:50vh;height:50vh;overflow:auto;border:1px solid #dee2e6}.sd-table{width:100%;border-collapse:collapse;margin-bottom:0;font-size:14px}.sd-table thead th{position:sticky;top:0;background-color:#f8f9fa;border-bottom:2px solid #dee2e6;border-top:1px solid #dee2e6;padding:8px 6px;white-space:nowrap;z-index:10;font-weight:600}.sd-table thead th.c-sticky-left{z-index:20}.sd-table tbody td{vertical-align:middle;padding:6px;border-top:1px solid #dee2e6}.sd-table tbody tr:nth-of-type(odd){background-color:#0000000a}.sd-table tbody tr:nth-of-type(2n){background-color:#fff}.sd-table tbody tr:hover,.sd-table tbody tr:hover .c-sticky-left{background-color:#ececec}.sd-table tbody tr:nth-of-type(odd) .c-sticky-left{background-color:#f2f2f2}.sd-table tbody tr:nth-of-type(2n) .c-sticky-left{background-color:#fff}.c-sticky-left{position:sticky;left:0;border-right:1px solid #dee2e6!important;border-left:none!important;z-index:5}.empty-state-wrapper{height:100%;min-height:40vh;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;background-color:#f8f9fa;border:2px dashed #cbd5e0;border-radius:8px;margin:16px;transition:all .2s ease-in-out;color:#6c757d}.empty-state-wrapper:hover{background-color:var(--sd-primary-light, #d7e3ff);border-color:var(--sd-primary, #005cbb);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .empty-icon{transform:scale(1.1);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .text-link{text-decoration:underline}.empty-state-wrapper .empty-icon{font-size:64px;height:64px;width:64px;margin-bottom:16px;color:#a0aec0;transition:transform .2s}.empty-state-wrapper h4{font-weight:500;margin-bottom:4px}.c-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding:0 4px}.c-mat-menu{border:none;min-width:unset;padding:0 8px}.c-mat-menu sd-icon{font-size:18px;width:18px;height:18px;line-height:18px;vertical-align:middle}.cursor-pointer{cursor:pointer}:host ::ng-deep .mat-paginator-container{min-height:36px;height:36px;padding:0 8px}:host ::ng-deep .mat-paginator-range-label{margin:0 10px}:host ::ng-deep .mat-icon-button{width:32px;height:32px;line-height:32px}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i3.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "size", "fontSet", "title", "width", "tooltip", "prefixIcon", "suffixIcon", "disabled", "loading", "block", "htmlType"], outputs: ["click"] }, { kind: "component", type: SdModal, selector: "sd-modal", inputs: ["autoId", "title", "color", "width", "height", "view", "modalClass", "lazyLoadContent", "hideClose", "disableBackdropClose", "beforeClose"], outputs: ["sdClosed", "sdCloseError"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: SdBadge, selector: "sd-badge", inputs: ["type", "color", "primary", "secondary", "success", "info", "warning", "error", "fontSet", "title", "description", "tooltip", "icon", "size"], outputs: ["click"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: ColumnTransformPipe, name: "columnTransform" }, { kind: "pipe", type: ColumnHiddenPipe, name: "columnHidden" }, { kind: "pipe", type: SdTranslatePipe, name: "sdTranslate" }] });
|
|
547
555
|
}
|
|
548
556
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdImportExcel, decorators: [{
|
|
549
557
|
type: Component,
|
|
@@ -562,8 +570,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
562
570
|
MatMenuModule,
|
|
563
571
|
MatProgressSpinner,
|
|
564
572
|
SdBadge,
|
|
565
|
-
|
|
566
|
-
], providers: [ColumnHiddenPipe], template: "@if (option) {\n <sd-modal [title]=\"option.title || ('core.component.import-excel.title' | translate)\" (sdClosed)=\"onClosed()\" #modal>\n <div class=\"d-flex align-items-center mb-12\" style=\"min-height: 32px\">\n @if (excelItems.length) {\n <div class=\"d-flex\">\n <sd-button class=\"mr-2\" (click)=\"view('ALL')\" icon=\"cached\" [title]=\"'core.component.import-excel.see-all' | translate\" size=\"sm\" type=\"outline\"></sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('SUCCESS')\"\n icon=\"done\"\n title=\"{{ numberOfSuccess }}\"\n [tooltip]=\"'core.component.import-excel.valid-rows' | translate\"\n size=\"sm\"\n color=\"success\">\n </sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('WARNING')\"\n icon=\"warning\"\n title=\"{{ numberOfWarning }}\"\n [tooltip]=\"'core.component.import-excel.error-rows' | translate\"\n size=\"sm\"\n color=\"warning\">\n </sd-button>\n\n <sd-button\n (click)=\"view('ERROR')\"\n icon=\"error\"\n title=\"{{ numberOfError }}\"\n color=\"error\"\n [tooltip]=\"'core.component.import-excel.warning-rows' | translate\"\n size=\"sm\">\n </sd-button>\n </div>\n }\n </div>\n\n <div class=\"sd-box border rounded\">\n <div class=\"sd-box-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"sd-table\">\n <thead>\n <tr>\n <th class=\"text-center c-sticky-left\" style=\"width: 50px\">#</th>\n @if (filteredItems.length) {\n <th class=\"text-center\" style=\"min-width: 250px; width: 250px\">{{ 'core.component.import-excel.status' | translate }}</th>\n }\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <th [ngStyle]=\"{ 'min-width': column.width || '300px', width: column.width || '300px' }\" [matTooltip]=\"column.title\">\n <span class=\"c-ellipsis\">\n {{ column.title }}\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n\n <tbody>\n @if (viewItems.length) {\n @for (item of viewItems; track item.meta.excelIndex) {\n <tr>\n <td class=\"text-center c-sticky-left px-4\">\n <sd-badge\n type=\"tag\"\n [title]=\"item.meta.excelIndex\"\n [success]=\"!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [warning]=\"!!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [error]=\"!!item.meta.errorMessages.length\" />\n </td>\n\n <td style=\"min-width: 250px; width: 250px\">\n <div\n class=\"text-wrap\"\n [innerHTML]=\"\n item.meta.errorMessages[0] || item.meta.warningMessages[0] || ('<span class=\\'text-success\\'>' + ('core.component.import-excel.valid-data' | translate) + '</span>')\n \"></div>\n </td>\n\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <td\n class=\"align-middle\"\n [ngClass]=\"{\n 'bg-warning-light': item.meta.warning[column.field] && !item.meta.error[column.field],\n 'bg-error-light': item.meta.error[column.field]\n }\"\n [matTooltip]=\"item.meta.error[column.field] || item.meta.warning[column.field]\"\n [ngStyle]=\"{ 'min-width': column.width || '300px' }\"\n matTooltipPosition=\"above\">\n <div class=\"c-ellipsis\">\n @if (column.type !== 'array') {\n <span [innerHTML]=\"item | columnTransform: column | async\"></span>\n }\n\n @if (column.type === 'array') {\n @let arrayItems = item.data[column.field]?.split(column.divideString);\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>{{ arrayItems?.length || 0 }} {{ column.unitString }}</span>\n\n @if (arrayItems?.length) {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n class=\"c-mat-menu\"\n style=\"width: 24px; height: 24px; line-height: 24px\">\n <sd-icon style=\"font-size: 18px\" name=\"open_in_new\"></sd-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n <div\n class=\"px-3 py-2\"\n style=\"max-width: 300px; max-height: 250px; overflow: auto\"\n (click)=\"$event.stopPropagation()\"\n aria-hidden=\"true\">\n @for (val of arrayItems; track $index) {\n <div class=\"border-bottom py-2 text-wrap\" [innerHTML]=\"val\"></div>\n }\n </div>\n </mat-menu>\n }\n </div>\n }\n </div>\n </td>\n }\n }\n </tr>\n }\n } @else {\n <tr>\n <td [attr.colspan]=\"option.columns.length + 2\" class=\"p-0 border-0 bg-white\">\n <div\n class=\"empty-state-wrapper\"\n (click)=\"downloadTemplate()\"\n [matTooltip]=\"'core.component.import-excel.download-template-tooltip' | translate\"\n aria-hidden=\"true\">\n <sd-icon class=\"empty-icon\" name=\"cloud_download\"></sd-icon>\n\n <h4>{{ 'core.component.import-excel.no-data-upload' | translate }}</h4>\n <span class=\"text-small text-link\"> {{ 'core.component.import-excel.click-here-template' | translate }} </span>\n\n @if (isDownloadTemplate) {\n <div class=\"mt-3\">\n <mat-spinner diameter=\"24\" mode=\"indeterminate\"></mat-spinner>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"sd-box-footer border-top\">\n <div class=\"d-flex align-items-center justify-content-end\">\n <mat-paginator [length]=\"filteredItems.length || 0\" hidePageSize showFirstLastButtons></mat-paginator>\n </div>\n </div>\n </div>\n <sd-button sdFooterLeft (click)=\"upload()\" prefixIcon=\"file_upload\" [title]=\"'core.component.import-excel.upload' | translate\" size=\"sm\" color=\"info\" [loading]=\"uploading\">\n </sd-button>\n <div class=\"d-flex align-items-center\" sdFooterRight>\n @if (filteredItems.length) {\n <sd-button class=\"mr-4\" (click)=\"export()\" prefixIcon=\"get_app\" [title]=\"'core.component.import-excel.download' | translate\" size=\"sm\" color=\"success\" type=\"outline\">\n </sd-button>\n }\n <sd-button\n (click)=\"accept()\"\n [title]=\"'core.component.import-excel.confirm-save' | translate\"\n [disabled]=\"(numberOfSuccess === 0 && numberOfWarning === 0) || numberOfError > 0 || isUploaded\"\n color=\"primary\"\n type=\"fill\"\n size=\"sm\">\n </sd-button>\n </div>\n </sd-modal>\n}\n", styles: [".table-responsive{position:relative;min-height:50vh;height:50vh;overflow:auto;border:1px solid #dee2e6}.sd-table{width:100%;border-collapse:collapse;margin-bottom:0;font-size:14px}.sd-table thead th{position:sticky;top:0;background-color:#f8f9fa;border-bottom:2px solid #dee2e6;border-top:1px solid #dee2e6;padding:8px 6px;white-space:nowrap;z-index:10;font-weight:600}.sd-table thead th.c-sticky-left{z-index:20}.sd-table tbody td{vertical-align:middle;padding:6px;border-top:1px solid #dee2e6}.sd-table tbody tr:nth-of-type(odd){background-color:#0000000a}.sd-table tbody tr:nth-of-type(2n){background-color:#fff}.sd-table tbody tr:hover,.sd-table tbody tr:hover .c-sticky-left{background-color:#ececec}.sd-table tbody tr:nth-of-type(odd) .c-sticky-left{background-color:#f2f2f2}.sd-table tbody tr:nth-of-type(2n) .c-sticky-left{background-color:#fff}.c-sticky-left{position:sticky;left:0;border-right:1px solid #dee2e6!important;border-left:none!important;z-index:5}.empty-state-wrapper{height:100%;min-height:40vh;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;background-color:#f8f9fa;border:2px dashed #cbd5e0;border-radius:8px;margin:16px;transition:all .2s ease-in-out;color:#6c757d}.empty-state-wrapper:hover{background-color:var(--sd-primary-light, #d7e3ff);border-color:var(--sd-primary, #005cbb);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .empty-icon{transform:scale(1.1);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .text-link{text-decoration:underline}.empty-state-wrapper .empty-icon{font-size:64px;height:64px;width:64px;margin-bottom:16px;color:#a0aec0;transition:transform .2s}.empty-state-wrapper h4{font-weight:500;margin-bottom:4px}.c-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding:0 4px}.c-mat-menu{border:none;min-width:unset;padding:0 8px}.c-mat-menu sd-icon{font-size:18px;width:18px;height:18px;line-height:18px;vertical-align:middle}.cursor-pointer{cursor:pointer}:host ::ng-deep .mat-paginator-container{min-height:36px;height:36px;padding:0 8px}:host ::ng-deep .mat-paginator-range-label{margin:0 10px}:host ::ng-deep .mat-icon-button{width:32px;height:32px;line-height:32px}\n"] }]
|
|
573
|
+
SdTranslatePipe,
|
|
574
|
+
], providers: [ColumnHiddenPipe], template: "@if (option) {\n <sd-modal [title]=\"option.title || ('core.component.import-excel.title' | sdTranslate)\" (sdClosed)=\"onClosed()\" #modal>\n <div class=\"d-flex align-items-center mb-12\" style=\"min-height: 32px\">\n @if (excelItems.length) {\n <div class=\"d-flex\">\n <sd-button class=\"mr-2\" (click)=\"view('ALL')\" icon=\"cached\" [title]=\"'core.component.import-excel.see-all' | sdTranslate\" size=\"sm\" type=\"outline\"></sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('SUCCESS')\"\n icon=\"done\"\n title=\"{{ numberOfSuccess }}\"\n [tooltip]=\"'core.component.import-excel.valid-rows' | sdTranslate\"\n size=\"sm\"\n color=\"success\">\n </sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('WARNING')\"\n icon=\"warning\"\n title=\"{{ numberOfWarning }}\"\n [tooltip]=\"'core.component.import-excel.error-rows' | sdTranslate\"\n size=\"sm\"\n color=\"warning\">\n </sd-button>\n\n <sd-button\n (click)=\"view('ERROR')\"\n icon=\"error\"\n title=\"{{ numberOfError }}\"\n color=\"error\"\n [tooltip]=\"'core.component.import-excel.warning-rows' | sdTranslate\"\n size=\"sm\">\n </sd-button>\n </div>\n }\n </div>\n\n <div class=\"sd-box border rounded\">\n <div class=\"sd-box-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"sd-table\">\n <thead>\n <tr>\n <th class=\"text-center c-sticky-left\" style=\"width: 50px\">#</th>\n @if (filteredItems.length) {\n <th class=\"text-center\" style=\"min-width: 250px; width: 250px\">{{ 'core.component.import-excel.status' | sdTranslate }}</th>\n }\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <th [ngStyle]=\"{ 'min-width': column.width || '300px', width: column.width || '300px' }\" [matTooltip]=\"column.title\">\n <span class=\"c-ellipsis\">\n {{ column.title }}\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n\n <tbody>\n @if (viewItems.length) {\n @for (item of viewItems; track item.meta.excelIndex) {\n <tr>\n <td class=\"text-center c-sticky-left px-4\">\n <sd-badge\n type=\"tag\"\n [title]=\"item.meta.excelIndex\"\n [success]=\"!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [warning]=\"!!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [error]=\"!!item.meta.errorMessages.length\" />\n </td>\n\n <td style=\"min-width: 250px; width: 250px\">\n <div\n class=\"text-wrap\"\n [innerHTML]=\"\n item.meta.errorMessages[0] || item.meta.warningMessages[0] || ('<span class=\\'text-success\\'>' + ('core.component.import-excel.valid-data' | sdTranslate) + '</span>')\n \"></div>\n </td>\n\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <td\n class=\"align-middle\"\n [ngClass]=\"{\n 'bg-warning-light': item.meta.warning[column.field] && !item.meta.error[column.field],\n 'bg-error-light': item.meta.error[column.field]\n }\"\n [matTooltip]=\"item.meta.error[column.field] || item.meta.warning[column.field]\"\n [ngStyle]=\"{ 'min-width': column.width || '300px' }\"\n matTooltipPosition=\"above\">\n <div class=\"c-ellipsis\">\n @if (column.type !== 'array') {\n <span [innerHTML]=\"item | columnTransform: column | async\"></span>\n }\n\n @if (column.type === 'array') {\n @let arrayItems = item.data[column.field]?.split(column.divideString);\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>{{ arrayItems?.length || 0 }} {{ column.unitString }}</span>\n\n @if (arrayItems?.length) {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n class=\"c-mat-menu\"\n style=\"width: 24px; height: 24px; line-height: 24px\">\n <sd-icon style=\"font-size: 18px\" name=\"open_in_new\"></sd-icon>\n </button>\n\n <!-- why: b\u1ECF aria-hidden=\"true\" \u2014 panel n\u00E0y CH\u00CDNH L\u00C0 n\u1ED9i dung c\u1EE7a\n menu (danh s\u00E1ch gi\u00E1 tr\u1ECB); \u1EA9n n\u00F3 \u0111i th\u00EC menu m\u1EDF ra r\u1ED7ng v\u1EDBi\n screen reader. role=\"group\" m\u00F4 t\u1EA3 \u0111\u00FAng v\u00E0 gi\u1EEF panel kh\u00F4ng\n nh\u1EADn tabindex; stopPropagation ch\u1EC9 \u0111\u1EC3 menu kh\u00F4ng t\u1EF1 \u0111\u00F3ng. -->\n <mat-menu #menu=\"matMenu\">\n <div\n class=\"px-3 py-2\"\n role=\"group\"\n style=\"max-width: 300px; max-height: 250px; overflow: auto\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\">\n @for (val of arrayItems; track $index) {\n <div class=\"border-bottom py-2 text-wrap\" [innerHTML]=\"val\"></div>\n }\n </div>\n </mat-menu>\n }\n </div>\n }\n </div>\n </td>\n }\n }\n </tr>\n }\n } @else {\n <tr>\n <td [attr.colspan]=\"option.columns.length + 2\" class=\"p-0 border-0 bg-white\">\n <!-- why: b\u1ECF aria-hidden=\"true\" \u2014 \u0111\u00E2y v\u1EEBa l\u00E0 TH\u00D4NG B\u00C1O tr\u1EA1ng th\u00E1i r\u1ED7ng v\u1EEBa l\u00E0\n control t\u1EA3i file m\u1EABu. aria-hidden xo\u00E1 c\u1EA3 th\u00F4ng b\u00E1o l\u1EABn control kh\u1ECFi\n accessibility tree. Nay role=\"button\" + tabindex=\"0\" + Enter/Space; live\n region ri\u00EAng cho spinner t\u1EA3i m\u1EABu (ti\u1EBFn tr\u00ECnh b\u1EA5t \u0111\u1ED3ng b\u1ED9). -->\n <div\n class=\"empty-state-wrapper\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'core.component.import-excel.download-template-tooltip' | sdTranslate\"\n (click)=\"downloadTemplate()\"\n (keydown.enter)=\"onDownloadTemplateKeydown($event)\"\n (keydown.space)=\"onDownloadTemplateKeydown($event)\"\n [matTooltip]=\"'core.component.import-excel.download-template-tooltip' | sdTranslate\">\n <sd-icon class=\"empty-icon\" name=\"cloud_download\"></sd-icon>\n\n <h4>{{ 'core.component.import-excel.no-data-upload' | sdTranslate }}</h4>\n <span class=\"text-small text-link\"> {{ 'core.component.import-excel.click-here-template' | sdTranslate }} </span>\n\n @if (isDownloadTemplate) {\n <div class=\"mt-3\" role=\"status\" aria-live=\"polite\" [attr.aria-label]=\"'core.component.import-excel.loading' | sdTranslate\">\n <mat-spinner diameter=\"24\" mode=\"indeterminate\"></mat-spinner>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"sd-box-footer border-top\">\n <div class=\"d-flex align-items-center justify-content-end\">\n <mat-paginator [length]=\"filteredItems.length || 0\" hidePageSize showFirstLastButtons></mat-paginator>\n </div>\n </div>\n </div>\n <sd-button sdFooterLeft (click)=\"upload()\" prefixIcon=\"file_upload\" [title]=\"'core.component.import-excel.upload' | sdTranslate\" size=\"sm\" color=\"info\" [loading]=\"uploading\">\n </sd-button>\n <div class=\"d-flex align-items-center\" sdFooterRight>\n @if (filteredItems.length) {\n <sd-button class=\"mr-4\" (click)=\"export()\" prefixIcon=\"get_app\" [title]=\"'core.component.import-excel.download' | sdTranslate\" size=\"sm\" color=\"success\" type=\"outline\">\n </sd-button>\n }\n <sd-button\n (click)=\"accept()\"\n [title]=\"'core.component.import-excel.confirm-save' | sdTranslate\"\n [disabled]=\"(numberOfSuccess === 0 && numberOfWarning === 0) || numberOfError > 0 || isUploaded\"\n color=\"primary\"\n type=\"fill\"\n size=\"sm\">\n </sd-button>\n </div>\n </sd-modal>\n}\n", styles: [".table-responsive{position:relative;min-height:50vh;height:50vh;overflow:auto;border:1px solid #dee2e6}.sd-table{width:100%;border-collapse:collapse;margin-bottom:0;font-size:14px}.sd-table thead th{position:sticky;top:0;background-color:#f8f9fa;border-bottom:2px solid #dee2e6;border-top:1px solid #dee2e6;padding:8px 6px;white-space:nowrap;z-index:10;font-weight:600}.sd-table thead th.c-sticky-left{z-index:20}.sd-table tbody td{vertical-align:middle;padding:6px;border-top:1px solid #dee2e6}.sd-table tbody tr:nth-of-type(odd){background-color:#0000000a}.sd-table tbody tr:nth-of-type(2n){background-color:#fff}.sd-table tbody tr:hover,.sd-table tbody tr:hover .c-sticky-left{background-color:#ececec}.sd-table tbody tr:nth-of-type(odd) .c-sticky-left{background-color:#f2f2f2}.sd-table tbody tr:nth-of-type(2n) .c-sticky-left{background-color:#fff}.c-sticky-left{position:sticky;left:0;border-right:1px solid #dee2e6!important;border-left:none!important;z-index:5}.empty-state-wrapper{height:100%;min-height:40vh;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;background-color:#f8f9fa;border:2px dashed #cbd5e0;border-radius:8px;margin:16px;transition:all .2s ease-in-out;color:#6c757d}.empty-state-wrapper:hover{background-color:var(--sd-primary-light, #d7e3ff);border-color:var(--sd-primary, #005cbb);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .empty-icon{transform:scale(1.1);color:var(--sd-primary, #005cbb)}.empty-state-wrapper:hover .text-link{text-decoration:underline}.empty-state-wrapper .empty-icon{font-size:64px;height:64px;width:64px;margin-bottom:16px;color:#a0aec0;transition:transform .2s}.empty-state-wrapper h4{font-weight:500;margin-bottom:4px}.c-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding:0 4px}.c-mat-menu{border:none;min-width:unset;padding:0 8px}.c-mat-menu sd-icon{font-size:18px;width:18px;height:18px;line-height:18px;vertical-align:middle}.cursor-pointer{cursor:pointer}:host ::ng-deep .mat-paginator-container{min-height:36px;height:36px;padding:0 8px}:host ::ng-deep .mat-paginator-range-label{margin:0 10px}:host ::ng-deep .mat-icon-button{width:32px;height:32px;line-height:32px}\n"] }]
|
|
567
575
|
}], ctorParameters: () => [], propDecorators: { option: [{
|
|
568
576
|
type: Input,
|
|
569
577
|
args: [{ required: true }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-components-import-excel.mjs","sources":["../../../projects/sdcorejs-angular/components/import-excel/src/pipes/columm-hidden.pipe.ts","../../../projects/sdcorejs-angular/components/import-excel/src/pipes/column-transform.pipe.ts","../../../projects/sdcorejs-angular/components/import-excel/src/import-excel.component.ts","../../../projects/sdcorejs-angular/components/import-excel/src/import-excel.component.html","../../../projects/sdcorejs-angular/components/import-excel/sdcorejs-angular-components-import-excel.ts"],"sourcesContent":["import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { SdUploadExcelColumn } from '../import-excel.model';\n@Pipe({\n name: 'columnHidden',\n})\n@Injectable()\nexport class ColumnHiddenPipe implements PipeTransform {\n constructor() {}\n transform(column: SdUploadExcelColumn): boolean {\n if (column.hidden === undefined) {\n return true;\n }\n if (typeof column.hidden === 'boolean') {\n return !column.hidden;\n }\n if (typeof column.hidden === 'function') {\n return !column.hidden();\n }\n return false;\n }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DateUtilities, NumberUtilities } from '@sdcorejs/angular/utilities';\nimport { SdImportExcelItem, SdUploadExcelColumn } from '../import-excel.model';\n\n@Pipe({\n name: 'columnTransform',\n standalone: true,\n})\nexport class ColumnTransformPipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n // Chuyển thành async để hỗ trợ Promise từ bên ngoài\n async transform(item: SdImportExcelItem, column: SdUploadExcelColumn): Promise<string | SafeHtml> {\n const { type, transform, field } = column;\n const value = item.data[field];\n\n // 1. Ưu tiên hiển thị dữ liệu gốc nếu có lỗi\n if (item.meta.error[field]) {\n return item.meta.origin[field] ?? value ?? '';\n }\n\n // 2. Custom Transform (Hỗ trợ cả Sync và Async)\n if (transform) {\n // await sẽ hoạt động đúng dù transform trả về value thường hay Promise\n const result = await transform(item.data, value);\n return result ?? '';\n }\n\n // 3. Xử lý logic hiển thị\n switch (type) {\n case 'number':\n return NumberUtilities.toVN(value) ?? '';\n\n case 'bool':\n if (typeof value === 'boolean') {\n const html = `<div class=\"text-center\"><input type=\"checkbox\" ${value ? 'checked' : ''} disabled></div>`;\n // Bắt buộc bypass security để hiển thị được input checkbox\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n return '';\n\n case 'date':\n return DateUtilities.toFormat(value, column.format || 'dd/MM/yyyy') ?? '';\n\n case 'datetime':\n return DateUtilities.toFormat(value, column.format || 'dd/MM/yyyy HH:mm') ?? '';\n\n default:\n return value ?? '';\n }\n }\n}\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewChild, inject, output } from '@angular/core';\n\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { Subscription } from 'rxjs';\nimport { ColumnHiddenPipe } from './pipes/columm-hidden.pipe';\nimport { SdImportExcelItem, SdImportExcelOption, SdImportExcelValidation } from './import-excel.model';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdExcelService, SdExcelSheet, SdExcelTemplate, SdExcelTemplateColumn } from '@sdcorejs/angular/services/excel';\nimport { SdNotifyService } from '@sdcorejs/angular/services/notify';\nimport { DateUtilities, NumberUtilities } from '@sdcorejs/angular/utilities';\nimport { SdLoadingService } from '@sdcorejs/angular/services/loading';\nimport { ColumnTransformPipe } from './pipes/column-transform.pipe';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-import-excel',\n templateUrl: './import-excel.component.html',\n styleUrl: './import-excel.component.scss',\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatSlideToggleModule,\n MatTooltipModule,\n MatPaginatorModule,\n MatSlideToggleModule,\n SdButton,\n SdModal,\n ColumnTransformPipe,\n ColumnHiddenPipe,\n MatMenuModule,\n MatProgressSpinner,\n SdBadge,\n TranslatePipe,\n ],\n providers: [ColumnHiddenPipe],\n})\nexport class SdImportExcel implements OnInit, OnDestroy {\n private ref = inject(ChangeDetectorRef);\n private excelService = inject(SdExcelService);\n private notifyService = inject(SdNotifyService);\n private columnHiddenPipe = inject(ColumnHiddenPipe);\n private loadingService = inject(SdLoadingService);\n\n @Input({ required: true }) option!: SdImportExcelOption;\n @ViewChild(SdModal) modal!: SdModal;\n excelItems: SdImportExcelItem[] = [];\n // originItems: SdExcelItem[] = [];\n hasDescription = false;\n\n showing: 'ALL' | 'SUCCESS' | 'WARNING' | 'ERROR' = 'ALL';\n filteredItems: SdImportExcelItem[] = [];\n viewItems: SdImportExcelItem[] = [];\n numberOfSuccess = 0;\n numberOfError = 0;\n numberOfWarning = 0;\n file?: File;\n #paginator!: MatPaginator;\n #paginatorSub?: Subscription;\n @ViewChild(MatPaginator) set paginator(paginator: MatPaginator) {\n if (paginator && this.#paginator !== paginator) {\n this.#paginator = paginator;\n this.#paginatorSub?.unsubscribe(); // Clear cũ\n this.#paginatorSub = paginator.page.subscribe(this.#reload);\n this.#subscription.add(this.#paginatorSub);\n }\n }\n #subscription = new Subscription();\n uploading = false;\n isUploaded = false;\n isDownloadTemplate = false;\n readonly sdClosed = output();\n readonly #i18n = inject(I18nService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {}\n\n ngOnInit() {\n this.isUploaded = false;\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n open = () => {\n this.#reset();\n this.modal.open();\n };\n\n close = () => {\n this.modal.close();\n };\n\n #reset = () => {\n this.excelItems = [];\n this.filteredItems = [];\n this.viewItems = [];\n this.numberOfSuccess = 0;\n this.numberOfError = 0;\n this.numberOfWarning = 0;\n this.showing = 'ALL';\n };\n\n #reload = () => {\n const pageIndex = this.#paginator.pageIndex;\n const pageSize = this.#paginator.pageSize;\n this.filteredItems = this.excelItems.filter(item => {\n const { errorMessages, warningMessages } = item.meta;\n if (this.showing === 'SUCCESS') {\n return !errorMessages.length && !warningMessages.length;\n } else if (this.showing === 'WARNING') {\n return !!warningMessages.length && !errorMessages.length;\n } else if (this.showing === 'ERROR') {\n return !!errorMessages.length;\n }\n return true;\n });\n this.viewItems = this.filteredItems.filter((item, index) => index >= pageIndex * pageSize && index < (pageIndex + 1) * pageSize);\n\n this.numberOfSuccess = this.excelItems.filter(this.#filterSuccess).length;\n this.numberOfError = this.excelItems.filter(this.#filterError).length;\n this.numberOfWarning = this.excelItems.filter(this.#filterWarning).length;\n };\n\n #filterError = (item: SdImportExcelItem) => !!item.meta.errorMessages.length;\n #filterWarning = (item: SdImportExcelItem) => item.meta.warningMessages.length && !item.meta.errorMessages.length;\n #filterSuccess = (item: SdImportExcelItem) => !item.meta.errorMessages.length && !item.meta.warningMessages.length;\n\n upload = async () => {\n try {\n const { transform, validateItem, validateItems } = this.option;\n const { items, file } = await this.excelService.upload();\n this.hasDescription = this.option.columns.some(e => !!e.description);\n const offset = this.hasDescription ? 2 : 1;\n items.splice(0, offset);\n if (items.length === 0) {\n this.notifyService.warning(this.#i18n.t('core.component.import-excel.no-data-in-file'));\n return;\n }\n const limit = this.option.limit || 1000;\n if (items.length > limit) {\n this.notifyService.warning(this.#i18n.t('core.component.import-excel.row-limit', { limit }));\n return;\n }\n this.#reset();\n this.excelItems = items.map<SdImportExcelItem>((data, idx) => ({\n data,\n meta: {\n excelIndex: idx + (this.hasDescription ? 4 : 3),\n origin: { ...data },\n error: {},\n warning: {},\n errorMessages: [],\n warningMessages: [],\n },\n }));\n\n if (transform) {\n const mappedItems = transform(this.excelItems);\n if (mappedItems instanceof Promise) {\n this.uploading = true;\n this.excelItems = await mappedItems.finally(() => (this.uploading = false));\n } else {\n this.excelItems = mappedItems || this.excelItems;\n }\n }\n this.file = file!;\n this.loadingService.start();\n const validatePromises = this.excelItems.map((item, idx) => this.#validate(item, idx));\n await Promise.all(validatePromises);\n\n // Nếu không có error thì tiếp tục validate từ option validate truyền vào\n\n if (!this.excelItems.some(this.#filterError) && validateItems) {\n const results = await validateItems(this.excelItems.map(e => e.data));\n results\n .filter(result => result.idx >= 0)\n .forEach(result => {\n if (result?.errorMessage) {\n this.excelItems[result.idx].meta.errorMessages.push(result.errorMessage);\n }\n if (result?.warningMessage) {\n this.excelItems[result.idx].meta.warningMessages.push(result.warningMessage);\n }\n });\n }\n\n this.#paginator.pageIndex = 0;\n this.#reload();\n this.ref.detectChanges();\n\n this.isUploaded = false;\n } catch (err: any) {\n this.notifyService.error(err);\n } finally {\n this.loadingService.stop();\n }\n };\n\n #validate = async (excelItem: SdImportExcelItem, idx: number) => {\n const {\n data: item,\n meta: { error, errorMessages },\n } = excelItem;\n const { validateItem } = this.option;\n for (const column of this.option.columns) {\n if (!this.columnHiddenPipe.transform(column)) {\n continue;\n }\n try {\n if (column.defaultValue !== undefined) {\n item[column.field] = item[column.field] ?? column.defaultValue;\n } else if (column.required && !item[column.field] && item[column.field] !== 0) {\n error[column.field] = this.#i18n.t('core.component.import-excel.required');\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.type === 'string') {\n const value = (item[column.field] || '').toString();\n if (column.minlength !== undefined && value.length < column.minlength) {\n error[column.field] = this.#i18n.t('core.component.import-excel.min-length', { min: column.minlength });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.maxlength !== undefined && value.length > column.maxlength) {\n error[column.field] = this.#i18n.t('core.component.import-excel.max-length', { max: column.maxlength });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n item[column.field] = value;\n } else if (column.type === 'number') {\n if (item[column.field]) {\n const value = +item[column.field];\n if (!NumberUtilities.isNumber(item[column.field])) {\n error[column.field] = this.#i18n.t('core.component.import-excel.not-a-number', { value: item[column.field] });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n item[column.field] = value;\n }\n if (!item[column.field] && item[column.field] !== 0) {\n item[column.field] = undefined;\n }\n if (column.min !== undefined && item[column.field] < column.min) {\n error[column.field] = this.#i18n.t('core.component.import-excel.below-min', { value: item[column.field], min: column.min });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.max !== undefined && item[column.field] > column.max) {\n error[column.field] = this.#i18n.t('core.component.import-excel.above-max', { value: item[column.field], max: column.max });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n } else if (column.type === 'bool') {\n if (\n item[column.field] === 0 ||\n item[column.field] === '0' ||\n item[column.field] === false ||\n item[column.field]?.toString()?.toLowerCase()?.trim() === 'false'\n ) {\n item[column.field] = false;\n } else if (\n item[column.field] === 1 ||\n item[column.field] === '1' ||\n item[column.field] === true ||\n item[column.field]?.toString()?.toLowerCase()?.trim() === 'true'\n ) {\n item[column.field] = true;\n } else if (item[column.field] === '') item[column.field] = undefined;\n\n if (typeof item[column.field] !== 'boolean' && item[column.field] !== undefined && item[column.field] !== null) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-bool');\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n }\n } else if (column.type === 'values') {\n if (item[column.field] && typeof item[column.field] !== 'number' && typeof item[column.field] !== 'string') {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-value', { value: item[column.field] });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.checkValueInArray && item[column.field] && !column.values.some(e => e.toString() === item[column.field].toString())) {\n error[column.field] = this.#i18n.t('core.component.import-excel.value-not-in-list', {\n value: item[column.field],\n list: column.values.join(),\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n } else if (column.type === 'date' || column.type === 'datetime' || column.type === 'time') {\n const { type, format } = column;\n const val = item[column.field];\n if (val instanceof Date) {\n item[column.field] = val.toISOString();\n continue;\n }\n if (format && item[column.field]) {\n if (typeof val !== 'string') {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (type === 'date' && !this.#isValidDate(format, val)) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (type === 'time' && !this.#isValidTime(format, val)) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (type === 'datetime' && !this.#isValidDateTime(format, val)) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n item[column.field] = DateUtilities.parseFrom(val, format);\n }\n if (item[column.field] && !DateUtilities.isDate(item[column.field])) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n }\n\n // Nếu pass validation từng column, kiểm tra validation theo hàm validateItem\n if (!errorMessages.length && validateItem) {\n const validation = await validateItem(\n item,\n idx,\n this.excelItems.map(e => e.data)\n );\n if (validation.errorMessage) excelItem.meta.errorMessages.push(validation.errorMessage);\n if (validation.warningMessage) excelItem.meta.warningMessages.push(validation.warningMessage);\n }\n } catch (ex: any) {\n error[column.field] = `${ex?.message || ex?.error || ex || this.#i18n.t('core.component.import-excel.generic-error')}`;\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n }\n }\n };\n\n #mapItem = (item: SdImportExcelItem) => {\n const { data } = item;\n return data;\n };\n\n accept = () => {\n this.option!.accept(\n this.excelItems.map(e => e.data),\n { file: this.file! }\n );\n this.isUploaded = true;\n };\n\n setValidation = (validations: SdImportExcelValidation[]) => {\n this.excelItems.forEach(e => {\n e.meta.errorMessages = [];\n e.meta.warningMessages = [];\n });\n if (Array.isArray(validations)) {\n validations.forEach(validation => {\n if (validation.errorMessage) {\n this.excelItems[validation.idx].meta.errorMessages = [validation.errorMessage];\n }\n if (validation.warningMessage) {\n this.excelItems[validation.idx].meta.warningMessages = [validation.warningMessage];\n }\n });\n }\n this.#reload();\n this.ref.detectChanges();\n };\n\n view = (showing: 'ALL' | 'SUCCESS' | 'WARNING' | 'ERROR' = 'ALL') => {\n this.showing = showing;\n this.#paginator.pageIndex = 0;\n this.#reload();\n };\n\n downloadTemplate = async () => {\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(this.option?.sheets)) {\n for (const sheet of this.option.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n if (Array.isArray(sheet.items)) {\n sheets.push({\n name: sheet.name,\n items: sheet.items,\n headers: sheet.headers,\n });\n } else {\n sheets.push({\n name: sheet.name,\n items: await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n }\n const columnNotHiddens = this.option.columns.filter(column => this.columnHiddenPipe.transform(column));\n const excelTemplate: SdExcelTemplate = {\n fileName: this.option.fileName || 'Template',\n columns: columnNotHiddens.map(column => {\n return {\n field: column.field,\n title: column.title,\n width: column.width,\n required: column.required,\n description: column.description,\n fontColor: column.fontColor,\n fill: column.fill,\n };\n }),\n sheets,\n };\n this.isDownloadTemplate = true;\n await this.excelService.generateTemplate(excelTemplate).finally(() => {\n this.isDownloadTemplate = false;\n });\n };\n\n export = async () => {\n this.loadingService.start();\n const columns: SdExcelTemplateColumn[] = [\n {\n field: 'sdMessage',\n title: this.#i18n.t('core.component.import-excel.message-column'),\n width: '250px',\n required: false,\n },\n ...this.option.columns.filter(column => this.columnHiddenPipe.transform(column)),\n ];\n await this.excelService\n .export({\n columns,\n items: this.filteredItems.map(e => {\n let result = {};\n for (const column of columns) {\n result = {\n ...result,\n [column.field]: e.meta.origin?.[column.field],\n };\n }\n return {\n ...result,\n sdMessage: (\n e.meta.errorMessages.join(', ') ||\n e.meta.warningMessages.join(', ') ||\n this.#i18n.t('core.component.import-excel.success')\n )\n ?.replace(/<strong>/g, '')\n .replace(/<\\/strong>/g, '')\n .replace(/<br>/g, '\\n'),\n };\n }),\n })\n .finally(this.loadingService.stop);\n };\n\n #isValidDate = (format: string, value: string) => {\n if (value?.length !== format?.length) {\n return false;\n }\n const regex =\n /^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[13-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$/;\n return regex.test(value);\n };\n\n #isValidTime = (format: string, value: string) => {\n if (value?.length !== format?.length) {\n return false;\n }\n return true;\n };\n\n #isValidDateTime = (format: string, value: string) => {\n if (value?.length !== format?.length) {\n return false;\n }\n const dates = value?.split(' ');\n if (dates.length !== 2) {\n return false;\n }\n const date = dates[0];\n if (!this.#isValidDate('dd/MM/yyyy', date)) {\n return false;\n }\n const time = dates[1];\n const regex = /^(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[0-5][0-9])$/;\n return regex.test(time);\n };\n onClosed = () => {\n this.sdClosed.emit();\n };\n}\n","@if (option) {\n <sd-modal [title]=\"option.title || ('core.component.import-excel.title' | translate)\" (sdClosed)=\"onClosed()\" #modal>\n <div class=\"d-flex align-items-center mb-12\" style=\"min-height: 32px\">\n @if (excelItems.length) {\n <div class=\"d-flex\">\n <sd-button class=\"mr-2\" (click)=\"view('ALL')\" icon=\"cached\" [title]=\"'core.component.import-excel.see-all' | translate\" size=\"sm\" type=\"outline\"></sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('SUCCESS')\"\n icon=\"done\"\n title=\"{{ numberOfSuccess }}\"\n [tooltip]=\"'core.component.import-excel.valid-rows' | translate\"\n size=\"sm\"\n color=\"success\">\n </sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('WARNING')\"\n icon=\"warning\"\n title=\"{{ numberOfWarning }}\"\n [tooltip]=\"'core.component.import-excel.error-rows' | translate\"\n size=\"sm\"\n color=\"warning\">\n </sd-button>\n\n <sd-button\n (click)=\"view('ERROR')\"\n icon=\"error\"\n title=\"{{ numberOfError }}\"\n color=\"error\"\n [tooltip]=\"'core.component.import-excel.warning-rows' | translate\"\n size=\"sm\">\n </sd-button>\n </div>\n }\n </div>\n\n <div class=\"sd-box border rounded\">\n <div class=\"sd-box-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"sd-table\">\n <thead>\n <tr>\n <th class=\"text-center c-sticky-left\" style=\"width: 50px\">#</th>\n @if (filteredItems.length) {\n <th class=\"text-center\" style=\"min-width: 250px; width: 250px\">{{ 'core.component.import-excel.status' | translate }}</th>\n }\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <th [ngStyle]=\"{ 'min-width': column.width || '300px', width: column.width || '300px' }\" [matTooltip]=\"column.title\">\n <span class=\"c-ellipsis\">\n {{ column.title }}\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n\n <tbody>\n @if (viewItems.length) {\n @for (item of viewItems; track item.meta.excelIndex) {\n <tr>\n <td class=\"text-center c-sticky-left px-4\">\n <sd-badge\n type=\"tag\"\n [title]=\"item.meta.excelIndex\"\n [success]=\"!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [warning]=\"!!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [error]=\"!!item.meta.errorMessages.length\" />\n </td>\n\n <td style=\"min-width: 250px; width: 250px\">\n <div\n class=\"text-wrap\"\n [innerHTML]=\"\n item.meta.errorMessages[0] || item.meta.warningMessages[0] || ('<span class=\\'text-success\\'>' + ('core.component.import-excel.valid-data' | translate) + '</span>')\n \"></div>\n </td>\n\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <td\n class=\"align-middle\"\n [ngClass]=\"{\n 'bg-warning-light': item.meta.warning[column.field] && !item.meta.error[column.field],\n 'bg-error-light': item.meta.error[column.field]\n }\"\n [matTooltip]=\"item.meta.error[column.field] || item.meta.warning[column.field]\"\n [ngStyle]=\"{ 'min-width': column.width || '300px' }\"\n matTooltipPosition=\"above\">\n <div class=\"c-ellipsis\">\n @if (column.type !== 'array') {\n <span [innerHTML]=\"item | columnTransform: column | async\"></span>\n }\n\n @if (column.type === 'array') {\n @let arrayItems = item.data[column.field]?.split(column.divideString);\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>{{ arrayItems?.length || 0 }} {{ column.unitString }}</span>\n\n @if (arrayItems?.length) {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n class=\"c-mat-menu\"\n style=\"width: 24px; height: 24px; line-height: 24px\">\n <sd-icon style=\"font-size: 18px\" name=\"open_in_new\"></sd-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n <div\n class=\"px-3 py-2\"\n style=\"max-width: 300px; max-height: 250px; overflow: auto\"\n (click)=\"$event.stopPropagation()\"\n aria-hidden=\"true\">\n @for (val of arrayItems; track $index) {\n <div class=\"border-bottom py-2 text-wrap\" [innerHTML]=\"val\"></div>\n }\n </div>\n </mat-menu>\n }\n </div>\n }\n </div>\n </td>\n }\n }\n </tr>\n }\n } @else {\n <tr>\n <td [attr.colspan]=\"option.columns.length + 2\" class=\"p-0 border-0 bg-white\">\n <div\n class=\"empty-state-wrapper\"\n (click)=\"downloadTemplate()\"\n [matTooltip]=\"'core.component.import-excel.download-template-tooltip' | translate\"\n aria-hidden=\"true\">\n <sd-icon class=\"empty-icon\" name=\"cloud_download\"></sd-icon>\n\n <h4>{{ 'core.component.import-excel.no-data-upload' | translate }}</h4>\n <span class=\"text-small text-link\"> {{ 'core.component.import-excel.click-here-template' | translate }} </span>\n\n @if (isDownloadTemplate) {\n <div class=\"mt-3\">\n <mat-spinner diameter=\"24\" mode=\"indeterminate\"></mat-spinner>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"sd-box-footer border-top\">\n <div class=\"d-flex align-items-center justify-content-end\">\n <mat-paginator [length]=\"filteredItems.length || 0\" hidePageSize showFirstLastButtons></mat-paginator>\n </div>\n </div>\n </div>\n <sd-button sdFooterLeft (click)=\"upload()\" prefixIcon=\"file_upload\" [title]=\"'core.component.import-excel.upload' | translate\" size=\"sm\" color=\"info\" [loading]=\"uploading\">\n </sd-button>\n <div class=\"d-flex align-items-center\" sdFooterRight>\n @if (filteredItems.length) {\n <sd-button class=\"mr-4\" (click)=\"export()\" prefixIcon=\"get_app\" [title]=\"'core.component.import-excel.download' | translate\" size=\"sm\" color=\"success\" type=\"outline\">\n </sd-button>\n }\n <sd-button\n (click)=\"accept()\"\n [title]=\"'core.component.import-excel.confirm-save' | translate\"\n [disabled]=\"(numberOfSuccess === 0 && numberOfWarning === 0) || numberOfError > 0 || isUploaded\"\n color=\"primary\"\n type=\"fill\"\n size=\"sm\">\n </sd-button>\n </div>\n </sd-modal>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-import-excel.mjs","sources":["../../../projects/sdcorejs-angular/components/import-excel/src/pipes/columm-hidden.pipe.ts","../../../projects/sdcorejs-angular/components/import-excel/src/pipes/column-transform.pipe.ts","../../../projects/sdcorejs-angular/components/import-excel/src/import-excel.component.ts","../../../projects/sdcorejs-angular/components/import-excel/src/import-excel.component.html","../../../projects/sdcorejs-angular/components/import-excel/sdcorejs-angular-components-import-excel.ts"],"sourcesContent":["import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { SdUploadExcelColumn } from '../import-excel.model';\n@Pipe({\n name: 'columnHidden',\n})\n@Injectable()\nexport class ColumnHiddenPipe implements PipeTransform {\n constructor() {}\n transform(column: SdUploadExcelColumn): boolean {\n if (column.hidden === undefined) {\n return true;\n }\n if (typeof column.hidden === 'boolean') {\n return !column.hidden;\n }\n if (typeof column.hidden === 'function') {\n return !column.hidden();\n }\n return false;\n }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DateUtilities, NumberUtilities } from '@sdcorejs/utils/fns';\nimport { SdImportExcelItem, SdUploadExcelColumn } from '../import-excel.model';\n\n@Pipe({\n name: 'columnTransform',\n standalone: true,\n})\nexport class ColumnTransformPipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n // Chuyển thành async để hỗ trợ Promise từ bên ngoài\n async transform(item: SdImportExcelItem, column: SdUploadExcelColumn): Promise<string | SafeHtml> {\n const { type, transform, field } = column;\n const value = item.data[field];\n\n // 1. Ưu tiên hiển thị dữ liệu gốc nếu có lỗi\n if (item.meta.error[field]) {\n return item.meta.origin[field] ?? value ?? '';\n }\n\n // 2. Custom Transform (Hỗ trợ cả Sync và Async)\n if (transform) {\n // await sẽ hoạt động đúng dù transform trả về value thường hay Promise\n const result = await transform(item.data, value);\n return result ?? '';\n }\n\n // 3. Xử lý logic hiển thị\n switch (type) {\n case 'number':\n return NumberUtilities.toVN(value) ?? '';\n\n case 'bool':\n if (typeof value === 'boolean') {\n const html = `<div class=\"text-center\"><input type=\"checkbox\" ${value ? 'checked' : ''} disabled></div>`;\n // Bắt buộc bypass security để hiển thị được input checkbox\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n return '';\n\n case 'date':\n return DateUtilities.toFormat(value, column.format || 'dd/MM/yyyy') ?? '';\n\n case 'datetime':\n return DateUtilities.toFormat(value, column.format || 'dd/MM/yyyy HH:mm') ?? '';\n\n default:\n return value ?? '';\n }\n }\n}\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewChild, inject, output } from '@angular/core';\n\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { Subscription } from 'rxjs';\nimport { ColumnHiddenPipe } from './pipes/columm-hidden.pipe';\nimport { SdImportExcelItem, SdImportExcelOption, SdImportExcelValidation } from './import-excel.model';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdExcelService, SdExcelSheet, SdExcelTemplate, SdExcelTemplateColumn } from '@sdcorejs/angular/services/excel';\nimport { SdNotifyService } from '@sdcorejs/angular/services/notify';\nimport { DateUtilities, NumberUtilities } from '@sdcorejs/utils/fns';\nimport { SdLoadingService } from '@sdcorejs/angular/services/loading';\nimport { ColumnTransformPipe } from './pipes/column-transform.pipe';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-import-excel',\n templateUrl: './import-excel.component.html',\n styleUrl: './import-excel.component.scss',\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatSlideToggleModule,\n MatTooltipModule,\n MatPaginatorModule,\n MatSlideToggleModule,\n SdButton,\n SdModal,\n ColumnTransformPipe,\n ColumnHiddenPipe,\n MatMenuModule,\n MatProgressSpinner,\n SdBadge,\n SdTranslatePipe,\n ],\n providers: [ColumnHiddenPipe],\n})\nexport class SdImportExcel implements OnInit, OnDestroy {\n private ref = inject(ChangeDetectorRef);\n private excelService = inject(SdExcelService);\n private notifyService = inject(SdNotifyService);\n private columnHiddenPipe = inject(ColumnHiddenPipe);\n private loadingService = inject(SdLoadingService);\n\n @Input({ required: true }) option!: SdImportExcelOption;\n @ViewChild(SdModal) modal!: SdModal;\n excelItems: SdImportExcelItem[] = [];\n // originItems: SdExcelItem[] = [];\n hasDescription = false;\n\n showing: 'ALL' | 'SUCCESS' | 'WARNING' | 'ERROR' = 'ALL';\n filteredItems: SdImportExcelItem[] = [];\n viewItems: SdImportExcelItem[] = [];\n numberOfSuccess = 0;\n numberOfError = 0;\n numberOfWarning = 0;\n file?: File;\n #paginator!: MatPaginator;\n #paginatorSub?: Subscription;\n @ViewChild(MatPaginator) set paginator(paginator: MatPaginator) {\n if (paginator && this.#paginator !== paginator) {\n this.#paginator = paginator;\n this.#paginatorSub?.unsubscribe(); // Clear cũ\n this.#paginatorSub = paginator.page.subscribe(this.#reload);\n this.#subscription.add(this.#paginatorSub);\n }\n }\n #subscription = new Subscription();\n uploading = false;\n isUploaded = false;\n isDownloadTemplate = false;\n readonly sdClosed = output();\n readonly #i18n = inject(I18nService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {}\n\n ngOnInit() {\n this.isUploaded = false;\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n open = () => {\n this.#reset();\n this.modal.open();\n };\n\n close = () => {\n this.modal.close();\n };\n\n #reset = () => {\n this.excelItems = [];\n this.filteredItems = [];\n this.viewItems = [];\n this.numberOfSuccess = 0;\n this.numberOfError = 0;\n this.numberOfWarning = 0;\n this.showing = 'ALL';\n };\n\n #reload = () => {\n const pageIndex = this.#paginator.pageIndex;\n const pageSize = this.#paginator.pageSize;\n this.filteredItems = this.excelItems.filter(item => {\n const { errorMessages, warningMessages } = item.meta;\n if (this.showing === 'SUCCESS') {\n return !errorMessages.length && !warningMessages.length;\n } else if (this.showing === 'WARNING') {\n return !!warningMessages.length && !errorMessages.length;\n } else if (this.showing === 'ERROR') {\n return !!errorMessages.length;\n }\n return true;\n });\n this.viewItems = this.filteredItems.filter((item, index) => index >= pageIndex * pageSize && index < (pageIndex + 1) * pageSize);\n\n this.numberOfSuccess = this.excelItems.filter(this.#filterSuccess).length;\n this.numberOfError = this.excelItems.filter(this.#filterError).length;\n this.numberOfWarning = this.excelItems.filter(this.#filterWarning).length;\n };\n\n #filterError = (item: SdImportExcelItem) => !!item.meta.errorMessages.length;\n #filterWarning = (item: SdImportExcelItem) => item.meta.warningMessages.length && !item.meta.errorMessages.length;\n #filterSuccess = (item: SdImportExcelItem) => !item.meta.errorMessages.length && !item.meta.warningMessages.length;\n\n upload = async () => {\n try {\n const { transform, validateItem, validateItems } = this.option;\n const { items, file } = await this.excelService.upload();\n this.hasDescription = this.option.columns.some(e => !!e.description);\n const offset = this.hasDescription ? 2 : 1;\n items.splice(0, offset);\n if (items.length === 0) {\n this.notifyService.warning(this.#i18n.t('core.component.import-excel.no-data-in-file'));\n return;\n }\n const limit = this.option.limit || 1000;\n if (items.length > limit) {\n this.notifyService.warning(this.#i18n.t('core.component.import-excel.row-limit', { limit }));\n return;\n }\n this.#reset();\n this.excelItems = items.map<SdImportExcelItem>((data, idx) => ({\n data,\n meta: {\n excelIndex: idx + (this.hasDescription ? 4 : 3),\n origin: { ...data },\n error: {},\n warning: {},\n errorMessages: [],\n warningMessages: [],\n },\n }));\n\n if (transform) {\n const mappedItems = transform(this.excelItems);\n if (mappedItems instanceof Promise) {\n this.uploading = true;\n this.excelItems = await mappedItems.finally(() => (this.uploading = false));\n } else {\n this.excelItems = mappedItems || this.excelItems;\n }\n }\n this.file = file!;\n this.loadingService.start();\n const validatePromises = this.excelItems.map((item, idx) => this.#validate(item, idx));\n await Promise.all(validatePromises);\n\n // Nếu không có error thì tiếp tục validate từ option validate truyền vào\n\n if (!this.excelItems.some(this.#filterError) && validateItems) {\n const results = await validateItems(this.excelItems.map(e => e.data));\n results\n .filter(result => result.idx >= 0)\n .forEach(result => {\n if (result?.errorMessage) {\n this.excelItems[result.idx].meta.errorMessages.push(result.errorMessage);\n }\n if (result?.warningMessage) {\n this.excelItems[result.idx].meta.warningMessages.push(result.warningMessage);\n }\n });\n }\n\n this.#paginator.pageIndex = 0;\n this.#reload();\n this.ref.detectChanges();\n\n this.isUploaded = false;\n } catch (err: any) {\n this.notifyService.error(err);\n } finally {\n this.loadingService.stop();\n }\n };\n\n #validate = async (excelItem: SdImportExcelItem, idx: number) => {\n const {\n data: item,\n meta: { error, errorMessages },\n } = excelItem;\n const { validateItem } = this.option;\n for (const column of this.option.columns) {\n if (!this.columnHiddenPipe.transform(column)) {\n continue;\n }\n try {\n if (column.defaultValue !== undefined) {\n item[column.field] = item[column.field] ?? column.defaultValue;\n } else if (column.required && !item[column.field] && item[column.field] !== 0) {\n error[column.field] = this.#i18n.t('core.component.import-excel.required');\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.type === 'string') {\n const value = (item[column.field] || '').toString();\n if (column.minlength !== undefined && value.length < column.minlength) {\n error[column.field] = this.#i18n.t('core.component.import-excel.min-length', { min: column.minlength });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.maxlength !== undefined && value.length > column.maxlength) {\n error[column.field] = this.#i18n.t('core.component.import-excel.max-length', { max: column.maxlength });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n item[column.field] = value;\n } else if (column.type === 'number') {\n if (item[column.field]) {\n const value = +item[column.field];\n if (!NumberUtilities.isNumber(item[column.field])) {\n error[column.field] = this.#i18n.t('core.component.import-excel.not-a-number', { value: item[column.field] });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n item[column.field] = value;\n }\n if (!item[column.field] && item[column.field] !== 0) {\n item[column.field] = undefined;\n }\n if (column.min !== undefined && item[column.field] < column.min) {\n error[column.field] = this.#i18n.t('core.component.import-excel.below-min', { value: item[column.field], min: column.min });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.max !== undefined && item[column.field] > column.max) {\n error[column.field] = this.#i18n.t('core.component.import-excel.above-max', { value: item[column.field], max: column.max });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n } else if (column.type === 'bool') {\n if (\n item[column.field] === 0 ||\n item[column.field] === '0' ||\n item[column.field] === false ||\n item[column.field]?.toString()?.toLowerCase()?.trim() === 'false'\n ) {\n item[column.field] = false;\n } else if (\n item[column.field] === 1 ||\n item[column.field] === '1' ||\n item[column.field] === true ||\n item[column.field]?.toString()?.toLowerCase()?.trim() === 'true'\n ) {\n item[column.field] = true;\n } else if (item[column.field] === '') item[column.field] = undefined;\n\n if (typeof item[column.field] !== 'boolean' && item[column.field] !== undefined && item[column.field] !== null) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-bool');\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n }\n } else if (column.type === 'values') {\n if (item[column.field] && typeof item[column.field] !== 'number' && typeof item[column.field] !== 'string') {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-value', { value: item[column.field] });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (column.checkValueInArray && item[column.field] && !column.values.some(e => e.toString() === item[column.field].toString())) {\n error[column.field] = this.#i18n.t('core.component.import-excel.value-not-in-list', {\n value: item[column.field],\n list: column.values.join(),\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n } else if (column.type === 'date' || column.type === 'datetime' || column.type === 'time') {\n const { type, format } = column;\n const val = item[column.field];\n if (val instanceof Date) {\n item[column.field] = val.toISOString();\n continue;\n }\n if (format && item[column.field]) {\n if (typeof val !== 'string') {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (type === 'date' && !this.#isValidDate(format, val)) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (type === 'time' && !this.#isValidTime(format, val)) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n if (type === 'datetime' && !this.#isValidDateTime(format, val)) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n item[column.field] = DateUtilities.parseFrom(val, format);\n }\n if (item[column.field] && !DateUtilities.isDate(item[column.field])) {\n error[column.field] = this.#i18n.t('core.component.import-excel.invalid-date-format', {\n value: val ?? '',\n format: column.format ?? '',\n });\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n continue;\n }\n }\n\n // Nếu pass validation từng column, kiểm tra validation theo hàm validateItem\n if (!errorMessages.length && validateItem) {\n const validation = await validateItem(\n item,\n idx,\n this.excelItems.map(e => e.data)\n );\n if (validation.errorMessage) excelItem.meta.errorMessages.push(validation.errorMessage);\n if (validation.warningMessage) excelItem.meta.warningMessages.push(validation.warningMessage);\n }\n } catch (ex: any) {\n error[column.field] = `${ex?.message || ex?.error || ex || this.#i18n.t('core.component.import-excel.generic-error')}`;\n errorMessages.push(`<strong>[${column.title || column.field}]</strong> ${error[column.field]}`);\n }\n }\n };\n\n #mapItem = (item: SdImportExcelItem) => {\n const { data } = item;\n return data;\n };\n\n accept = () => {\n this.option!.accept(\n this.excelItems.map(e => e.data),\n { file: this.file! }\n );\n this.isUploaded = true;\n };\n\n setValidation = (validations: SdImportExcelValidation[]) => {\n this.excelItems.forEach(e => {\n e.meta.errorMessages = [];\n e.meta.warningMessages = [];\n });\n if (Array.isArray(validations)) {\n validations.forEach(validation => {\n if (validation.errorMessage) {\n this.excelItems[validation.idx].meta.errorMessages = [validation.errorMessage];\n }\n if (validation.warningMessage) {\n this.excelItems[validation.idx].meta.warningMessages = [validation.warningMessage];\n }\n });\n }\n this.#reload();\n this.ref.detectChanges();\n };\n\n view = (showing: 'ALL' | 'SUCCESS' | 'WARNING' | 'ERROR' = 'ALL') => {\n this.showing = showing;\n this.#paginator.pageIndex = 0;\n this.#reload();\n };\n\n // why: vùng trạng thái rỗng nay là role=\"button\" + tabindex=\"0\" nên Enter/Space phải tải file\n // mẫu đúng như click. preventDefault để Space không cuộn trang.\n onDownloadTemplateKeydown = (event: KeyboardEvent) => {\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n void this.downloadTemplate();\n };\n\n downloadTemplate = async () => {\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(this.option?.sheets)) {\n for (const sheet of this.option.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n if (Array.isArray(sheet.items)) {\n sheets.push({\n name: sheet.name,\n items: sheet.items,\n headers: sheet.headers,\n });\n } else {\n sheets.push({\n name: sheet.name,\n items: await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n }\n const columnNotHiddens = this.option.columns.filter(column => this.columnHiddenPipe.transform(column));\n const excelTemplate: SdExcelTemplate = {\n fileName: this.option.fileName || 'Template',\n columns: columnNotHiddens.map(column => {\n return {\n field: column.field,\n title: column.title,\n width: column.width,\n required: column.required,\n description: column.description,\n fontColor: column.fontColor,\n fill: column.fill,\n };\n }),\n sheets,\n };\n this.isDownloadTemplate = true;\n await this.excelService.generateTemplate(excelTemplate).finally(() => {\n this.isDownloadTemplate = false;\n });\n };\n\n export = async () => {\n this.loadingService.start();\n const columns: SdExcelTemplateColumn[] = [\n {\n field: 'sdMessage',\n title: this.#i18n.t('core.component.import-excel.message-column'),\n width: '250px',\n required: false,\n },\n ...this.option.columns.filter(column => this.columnHiddenPipe.transform(column)),\n ];\n await this.excelService\n .export({\n columns,\n items: this.filteredItems.map(e => {\n let result = {};\n for (const column of columns) {\n result = {\n ...result,\n [column.field]: e.meta.origin?.[column.field],\n };\n }\n return {\n ...result,\n sdMessage: (\n e.meta.errorMessages.join(', ') ||\n e.meta.warningMessages.join(', ') ||\n this.#i18n.t('core.component.import-excel.success')\n )\n ?.replace(/<strong>/g, '')\n .replace(/<\\/strong>/g, '')\n .replace(/<br>/g, '\\n'),\n };\n }),\n })\n .finally(this.loadingService.stop);\n };\n\n #isValidDate = (format: string, value: string) => {\n if (value?.length !== format?.length) {\n return false;\n }\n const regex =\n /^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[13-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$/;\n return regex.test(value);\n };\n\n #isValidTime = (format: string, value: string) => {\n if (value?.length !== format?.length) {\n return false;\n }\n return true;\n };\n\n #isValidDateTime = (format: string, value: string) => {\n if (value?.length !== format?.length) {\n return false;\n }\n const dates = value?.split(' ');\n if (dates.length !== 2) {\n return false;\n }\n const date = dates[0];\n if (!this.#isValidDate('dd/MM/yyyy', date)) {\n return false;\n }\n const time = dates[1];\n const regex = /^(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[0-5][0-9])$/;\n return regex.test(time);\n };\n onClosed = () => {\n this.sdClosed.emit();\n };\n}\n","@if (option) {\n <sd-modal [title]=\"option.title || ('core.component.import-excel.title' | sdTranslate)\" (sdClosed)=\"onClosed()\" #modal>\n <div class=\"d-flex align-items-center mb-12\" style=\"min-height: 32px\">\n @if (excelItems.length) {\n <div class=\"d-flex\">\n <sd-button class=\"mr-2\" (click)=\"view('ALL')\" icon=\"cached\" [title]=\"'core.component.import-excel.see-all' | sdTranslate\" size=\"sm\" type=\"outline\"></sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('SUCCESS')\"\n icon=\"done\"\n title=\"{{ numberOfSuccess }}\"\n [tooltip]=\"'core.component.import-excel.valid-rows' | sdTranslate\"\n size=\"sm\"\n color=\"success\">\n </sd-button>\n\n <sd-button\n class=\"mr-2\"\n (click)=\"view('WARNING')\"\n icon=\"warning\"\n title=\"{{ numberOfWarning }}\"\n [tooltip]=\"'core.component.import-excel.error-rows' | sdTranslate\"\n size=\"sm\"\n color=\"warning\">\n </sd-button>\n\n <sd-button\n (click)=\"view('ERROR')\"\n icon=\"error\"\n title=\"{{ numberOfError }}\"\n color=\"error\"\n [tooltip]=\"'core.component.import-excel.warning-rows' | sdTranslate\"\n size=\"sm\">\n </sd-button>\n </div>\n }\n </div>\n\n <div class=\"sd-box border rounded\">\n <div class=\"sd-box-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"sd-table\">\n <thead>\n <tr>\n <th class=\"text-center c-sticky-left\" style=\"width: 50px\">#</th>\n @if (filteredItems.length) {\n <th class=\"text-center\" style=\"min-width: 250px; width: 250px\">{{ 'core.component.import-excel.status' | sdTranslate }}</th>\n }\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <th [ngStyle]=\"{ 'min-width': column.width || '300px', width: column.width || '300px' }\" [matTooltip]=\"column.title\">\n <span class=\"c-ellipsis\">\n {{ column.title }}\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n\n <tbody>\n @if (viewItems.length) {\n @for (item of viewItems; track item.meta.excelIndex) {\n <tr>\n <td class=\"text-center c-sticky-left px-4\">\n <sd-badge\n type=\"tag\"\n [title]=\"item.meta.excelIndex\"\n [success]=\"!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [warning]=\"!!item.meta.warningMessages.length && !item.meta.errorMessages.length\"\n [error]=\"!!item.meta.errorMessages.length\" />\n </td>\n\n <td style=\"min-width: 250px; width: 250px\">\n <div\n class=\"text-wrap\"\n [innerHTML]=\"\n item.meta.errorMessages[0] || item.meta.warningMessages[0] || ('<span class=\\'text-success\\'>' + ('core.component.import-excel.valid-data' | sdTranslate) + '</span>')\n \"></div>\n </td>\n\n @for (column of option.columns; track column.field) {\n @if (column | columnHidden) {\n <td\n class=\"align-middle\"\n [ngClass]=\"{\n 'bg-warning-light': item.meta.warning[column.field] && !item.meta.error[column.field],\n 'bg-error-light': item.meta.error[column.field]\n }\"\n [matTooltip]=\"item.meta.error[column.field] || item.meta.warning[column.field]\"\n [ngStyle]=\"{ 'min-width': column.width || '300px' }\"\n matTooltipPosition=\"above\">\n <div class=\"c-ellipsis\">\n @if (column.type !== 'array') {\n <span [innerHTML]=\"item | columnTransform: column | async\"></span>\n }\n\n @if (column.type === 'array') {\n @let arrayItems = item.data[column.field]?.split(column.divideString);\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>{{ arrayItems?.length || 0 }} {{ column.unitString }}</span>\n\n @if (arrayItems?.length) {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n class=\"c-mat-menu\"\n style=\"width: 24px; height: 24px; line-height: 24px\">\n <sd-icon style=\"font-size: 18px\" name=\"open_in_new\"></sd-icon>\n </button>\n\n <!-- why: bỏ aria-hidden=\"true\" — panel này CHÍNH LÀ nội dung của\n menu (danh sách giá trị); ẩn nó đi thì menu mở ra rỗng với\n screen reader. role=\"group\" mô tả đúng và giữ panel không\n nhận tabindex; stopPropagation chỉ để menu không tự đóng. -->\n <mat-menu #menu=\"matMenu\">\n <div\n class=\"px-3 py-2\"\n role=\"group\"\n style=\"max-width: 300px; max-height: 250px; overflow: auto\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\">\n @for (val of arrayItems; track $index) {\n <div class=\"border-bottom py-2 text-wrap\" [innerHTML]=\"val\"></div>\n }\n </div>\n </mat-menu>\n }\n </div>\n }\n </div>\n </td>\n }\n }\n </tr>\n }\n } @else {\n <tr>\n <td [attr.colspan]=\"option.columns.length + 2\" class=\"p-0 border-0 bg-white\">\n <!-- why: bỏ aria-hidden=\"true\" — đây vừa là THÔNG BÁO trạng thái rỗng vừa là\n control tải file mẫu. aria-hidden xoá cả thông báo lẫn control khỏi\n accessibility tree. Nay role=\"button\" + tabindex=\"0\" + Enter/Space; live\n region riêng cho spinner tải mẫu (tiến trình bất đồng bộ). -->\n <div\n class=\"empty-state-wrapper\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'core.component.import-excel.download-template-tooltip' | sdTranslate\"\n (click)=\"downloadTemplate()\"\n (keydown.enter)=\"onDownloadTemplateKeydown($event)\"\n (keydown.space)=\"onDownloadTemplateKeydown($event)\"\n [matTooltip]=\"'core.component.import-excel.download-template-tooltip' | sdTranslate\">\n <sd-icon class=\"empty-icon\" name=\"cloud_download\"></sd-icon>\n\n <h4>{{ 'core.component.import-excel.no-data-upload' | sdTranslate }}</h4>\n <span class=\"text-small text-link\"> {{ 'core.component.import-excel.click-here-template' | sdTranslate }} </span>\n\n @if (isDownloadTemplate) {\n <div class=\"mt-3\" role=\"status\" aria-live=\"polite\" [attr.aria-label]=\"'core.component.import-excel.loading' | sdTranslate\">\n <mat-spinner diameter=\"24\" mode=\"indeterminate\"></mat-spinner>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <div class=\"sd-box-footer border-top\">\n <div class=\"d-flex align-items-center justify-content-end\">\n <mat-paginator [length]=\"filteredItems.length || 0\" hidePageSize showFirstLastButtons></mat-paginator>\n </div>\n </div>\n </div>\n <sd-button sdFooterLeft (click)=\"upload()\" prefixIcon=\"file_upload\" [title]=\"'core.component.import-excel.upload' | sdTranslate\" size=\"sm\" color=\"info\" [loading]=\"uploading\">\n </sd-button>\n <div class=\"d-flex align-items-center\" sdFooterRight>\n @if (filteredItems.length) {\n <sd-button class=\"mr-4\" (click)=\"export()\" prefixIcon=\"get_app\" [title]=\"'core.component.import-excel.download' | sdTranslate\" size=\"sm\" color=\"success\" type=\"outline\">\n </sd-button>\n }\n <sd-button\n (click)=\"accept()\"\n [title]=\"'core.component.import-excel.confirm-save' | sdTranslate\"\n [disabled]=\"(numberOfSuccess === 0 && numberOfWarning === 0) || numberOfError > 0 || isUploaded\"\n color=\"primary\"\n type=\"fill\"\n size=\"sm\">\n </sd-button>\n </div>\n </sd-modal>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|