@sd-angular/core 19.0.0-beta.45 → 19.0.0-beta.47
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/components/code-editor/index.d.ts +1 -0
- package/components/code-editor/src/code-editor.component.d.ts +25 -0
- package/components/index.d.ts +1 -0
- package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +4 -1
- package/fesm2022/sd-angular-core-components-badge.mjs +2 -3
- package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-code-editor.mjs +129 -0
- package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-tab-router.mjs +15 -6
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components.mjs +1 -0
- package/fesm2022/sd-angular-core-components.mjs.map +1 -1
- package/forms/select/src/select.component.d.ts +1 -1
- package/package.json +41 -36
- package/sd-angular-core-19.0.0-beta.47.tgz +0 -0
- package/sd-angular-core-19.0.0-beta.45.tgz +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './src/code-editor.component';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SafeHtml } from '@angular/platform-browser';
|
|
2
|
+
import 'prismjs/components/prism-typescript';
|
|
3
|
+
import 'prismjs/components/prism-json';
|
|
4
|
+
import 'prismjs/components/prism-css';
|
|
5
|
+
import 'prismjs/components/prism-scss';
|
|
6
|
+
import 'prismjs/components/prism-markup';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export type CodeLanguage = 'html' | 'typescript' | 'json' | 'css' | 'scss';
|
|
9
|
+
export declare class SdCodeEditor {
|
|
10
|
+
#private;
|
|
11
|
+
valueModel: import("@angular/core").ModelSignal<any>;
|
|
12
|
+
language: import("@angular/core").InputSignal<CodeLanguage>;
|
|
13
|
+
maxHeight: import("@angular/core").InputSignal<string>;
|
|
14
|
+
viewed: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
15
|
+
copied: import("@angular/core").WritableSignal<boolean>;
|
|
16
|
+
textValue: import("@angular/core").WritableSignal<string>;
|
|
17
|
+
prismLang: import("@angular/core").Signal<CodeLanguage | "markup">;
|
|
18
|
+
private _lastEmittedValue;
|
|
19
|
+
constructor();
|
|
20
|
+
highlightedCode: import("@angular/core").Signal<SafeHtml>;
|
|
21
|
+
onTextChange(newText: string): void;
|
|
22
|
+
copyToClipboard(): void;
|
|
23
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SdCodeEditor, never>;
|
|
24
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SdCodeEditor, "sd-code-editor", never, { "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; }, never, never, true, never>;
|
|
25
|
+
}
|
package/components/index.d.ts
CHANGED
|
@@ -16,3 +16,4 @@ export * from '@sd-angular/core/components/import-excel';
|
|
|
16
16
|
export * from '@sd-angular/core/components/document-builder';
|
|
17
17
|
export * from '@sd-angular/core/components/mini-editor';
|
|
18
18
|
export * from '@sd-angular/core/components/view';
|
|
19
|
+
export * from '@sd-angular/core/components/code-editor';
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
|
|
2
2
|
import { SdTab, SdTabInfo } from '../../models';
|
|
3
3
|
import { SdTabRouterService } from '../../services/tab-router.service';
|
|
4
|
+
import { Router } from '@angular/router';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class SdTabRouterItemComponent implements OnInit, OnDestroy {
|
|
6
7
|
#private;
|
|
7
8
|
private cdRef;
|
|
8
9
|
private tabRouterService;
|
|
10
|
+
private router;
|
|
9
11
|
tab: SdTab;
|
|
10
12
|
tabInfo?: SdTabInfo;
|
|
11
|
-
constructor(cdRef: ChangeDetectorRef, tabRouterService: SdTabRouterService);
|
|
13
|
+
constructor(cdRef: ChangeDetectorRef, tabRouterService: SdTabRouterService, router: Router);
|
|
12
14
|
ngOnInit(): void;
|
|
13
15
|
ngOnDestroy(): void;
|
|
16
|
+
onTabClick: (event: Event) => void;
|
|
14
17
|
close: (event: Event) => void;
|
|
15
18
|
onMousedown: (event: MouseEvent) => void;
|
|
16
19
|
onMouseup: (event: MouseEvent) => void;
|
|
@@ -5,7 +5,6 @@ import { input, booleanAttribute, EventEmitter, computed, Output, ChangeDetectio
|
|
|
5
5
|
import { MatIconModule } from '@angular/material/icon';
|
|
6
6
|
import * as i2 from '@angular/material/tooltip';
|
|
7
7
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
8
|
-
import { DefaultMaterialIconFontSet } from '@sd-angular/core/utilities/models';
|
|
9
8
|
|
|
10
9
|
/* eslint-disable @angular-eslint/no-input-rename */
|
|
11
10
|
class SdBadge {
|
|
@@ -25,8 +24,8 @@ class SdBadge {
|
|
|
25
24
|
info = input(false, { transform: booleanAttribute });
|
|
26
25
|
warning = input(false, { transform: booleanAttribute });
|
|
27
26
|
error = input(false, { transform: booleanAttribute });
|
|
28
|
-
fontSet = input(
|
|
29
|
-
transform: (value) => value ||
|
|
27
|
+
fontSet = input('material-icons', {
|
|
28
|
+
transform: (value) => value || 'material-icons'
|
|
30
29
|
});
|
|
31
30
|
title = input();
|
|
32
31
|
description = input();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-badge.mjs","sources":["../../../projects/sd-angular/components/badge/src/badge.component.ts","../../../projects/sd-angular/components/badge/src/badge.component.html","../../../projects/sd-angular/components/badge/sd-angular-core-components-badge.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, booleanAttribute, computed, input } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdColor, SdSize } from '@sd-angular/core/utilities/models';\r\nimport { MaterialIconFontSet, DefaultMaterialIconFontSet } from '@sd-angular/core/utilities/models';\r\n\r\n// Export các Type để dùng chung\r\nexport type SdBadgeType = 'tag' | 'round' | 'icon';\r\n\r\n@Component({\r\n selector: 'sd-badge',\r\n templateUrl: './badge.component.html',\r\n styleUrls: ['./badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class SdBadge {\r\n defaultIcon = 'fiber_manual_record';\r\n\r\n // ==========================================\r\n // 1. SIGNAL INPUTS\r\n // ==========================================\r\n type = input<SdBadgeType, SdBadgeType | undefined | null>('icon', {\r\n transform: (value) => value || 'icon'\r\n });\r\n\r\n color = input<SdColor, SdColor | undefined | null>('secondary', {\r\n transform: (value) => value || 'secondary'\r\n });\r\n\r\n primary = input(false, { transform: booleanAttribute });\r\n secondary = input(false, { transform: booleanAttribute });\r\n success = input(false, { transform: booleanAttribute });\r\n info = input(false, { transform: booleanAttribute });\r\n warning = input(false, { transform: booleanAttribute });\r\n error = input(false, { transform: booleanAttribute });\r\n\r\n fontSet = input<MaterialIconFontSet, MaterialIconFontSet | undefined | null>(DefaultMaterialIconFontSet, {\r\n transform: (value) => value || DefaultMaterialIconFontSet\r\n });\r\n\r\n title = input<string | number | undefined | null>();\r\n description = input<string | undefined | null>();\r\n tooltip = input<string | undefined | null>();\r\n icon = input<string | undefined | null>();\r\n \r\n size = input<SdSize, SdSize | undefined | null>('sm', {\r\n transform: (value) => value || 'sm'\r\n });\r\n\r\n // ==========================================\r\n // 2. OUTPUT \r\n // ==========================================\r\n @Output() click = new EventEmitter<Event>();\r\n\r\n onClick = (event: Event) => {\r\n event.stopPropagation(); \r\n this.click.emit(event);\r\n };\r\n\r\n // ==========================================\r\n // 3. COMPUTED STATE \r\n // ==========================================\r\n \r\n effectiveColor = computed(() => {\r\n if (this.primary()) return 'primary';\r\n if (this.secondary()) return 'secondary';\r\n if (this.success()) return 'success';\r\n if (this.info()) return 'info';\r\n if (this.warning()) return 'warning';\r\n if (this.error()) return 'error';\r\n return this.color();\r\n });\r\n\r\n baseColorClasses = computed(() => {\r\n const c = this.effectiveColor();\r\n return {\r\n 'c-primary': c === 'primary',\r\n 'c-secondary': c === 'secondary',\r\n 'c-info': c === 'info',\r\n 'c-success': c === 'success',\r\n 'c-warning': c === 'warning',\r\n 'c-error': c === 'error',\r\n };\r\n });\r\n\r\n iconColorClasses = computed(() => {\r\n const c = this.effectiveColor();\r\n return {\r\n 'c-primary': c === 'primary',\r\n 'c-black400': c === 'secondary', \r\n 'c-info': c === 'info',\r\n 'c-success': c === 'success',\r\n 'c-warning': c === 'warning',\r\n 'c-error': c === 'error',\r\n };\r\n });\r\n\r\n iconSizeAndFontClasses = computed(() => {\r\n const s = this.size();\r\n const f = this.fontSet();\r\n return {\r\n 'c-xs': s === 'xs',\r\n 'c-sm': s === 'sm',\r\n 'c-md': s === 'md',\r\n 'c-lg': s === 'lg',\r\n 'material-icons': f === 'material-icons',\r\n 'material-icons-outlined': f === 'material-icons-outlined',\r\n 'material-icons-round': f === 'material-icons-round',\r\n 'material-icons-sharp': f === 'material-icons-sharp'\r\n };\r\n });\r\n\r\n // GỘP CLASS CHO BADGE TYPE = 'TAG'\r\n tagIconCombinedClasses = computed(() => ({\r\n ...this.iconSizeAndFontClasses(),\r\n ...this.baseColorClasses()\r\n }));\r\n\r\n // GỘP CLASS CHO BADGE TYPE = 'ICON'\r\n iconCombinedClasses = computed(() => ({\r\n ...this.iconSizeAndFontClasses(),\r\n ...this.iconColorClasses()\r\n }));\r\n}","@let badgeType = type();\r\n@let tt = tooltip();\r\n@let titleText = title();\r\n@let descText = description();\r\n@let iconName = icon() || defaultIcon;\r\n@let isPointer = click.observed;\r\n\r\n@if (badgeType === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ titleText }}\r\n </div>\r\n} @else if (badgeType === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon()) {\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"badgeType === 'icon'\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\"> \r\n {{ iconName }} \r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAAA;MAmBa,OAAO,CAAA;IAClB,WAAW,GAAG,qBAAqB;;;;AAKnC,IAAA,IAAI,GAAG,KAAK,CAA8C,MAAM,EAAE;QAChE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI;AAChC,KAAA,CAAC;AAEF,IAAA,KAAK,GAAG,KAAK,CAAsC,WAAW,EAAE;QAC9D,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI;AAChC,KAAA,CAAC;IAEF,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvD,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACzD,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvD,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACpD,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvD,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAErD,IAAA,OAAO,GAAG,KAAK,CAA8D,0BAA0B,EAAE;QACvG,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI;AAChC,KAAA,CAAC;IAEF,KAAK,GAAG,KAAK,EAAsC;IACnD,WAAW,GAAG,KAAK,EAA6B;IAChD,OAAO,GAAG,KAAK,EAA6B;IAC5C,IAAI,GAAG,KAAK,EAA6B;AAEzC,IAAA,IAAI,GAAG,KAAK,CAAoC,IAAI,EAAE;QACpD,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI;AAChC,KAAA,CAAC;;;;AAKQ,IAAA,KAAK,GAAG,IAAI,YAAY,EAAS;AAE3C,IAAA,OAAO,GAAG,CAAC,KAAY,KAAI;QACzB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,IAAA,CAAC;;;;AAMD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QAC7B,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,SAAS;QACpC,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,WAAW;QACxC,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,SAAS;QACpC,IAAI,IAAI,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,MAAM;QAC9B,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,SAAS;QACpC,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,OAAO;AAChC,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;AACrB,IAAA,CAAC,CAAC;AAEF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE;QAC/B,OAAO;YACL,WAAW,EAAE,CAAC,KAAK,SAAS;YAC5B,aAAa,EAAE,CAAC,KAAK,WAAW;YAChC,QAAQ,EAAE,CAAC,KAAK,MAAM;YACtB,WAAW,EAAE,CAAC,KAAK,SAAS;YAC5B,WAAW,EAAE,CAAC,KAAK,SAAS;YAC5B,SAAS,EAAE,CAAC,KAAK,OAAO;SACzB;AACH,IAAA,CAAC,CAAC;AAEF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE;QAC/B,OAAO;YACL,WAAW,EAAE,CAAC,KAAK,SAAS;YAC5B,YAAY,EAAE,CAAC,KAAK,WAAW;YAC/B,QAAQ,EAAE,CAAC,KAAK,MAAM;YACtB,WAAW,EAAE,CAAC,KAAK,SAAS;YAC5B,WAAW,EAAE,CAAC,KAAK,SAAS;YAC5B,SAAS,EAAE,CAAC,KAAK,OAAO;SACzB;AACH,IAAA,CAAC,CAAC;AAEF,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,OAAO;YACL,MAAM,EAAE,CAAC,KAAK,IAAI;YAClB,MAAM,EAAE,CAAC,KAAK,IAAI;YAClB,MAAM,EAAE,CAAC,KAAK,IAAI;YAClB,MAAM,EAAE,CAAC,KAAK,IAAI;YAClB,gBAAgB,EAAE,CAAC,KAAK,gBAAgB;YACxC,yBAAyB,EAAE,CAAC,KAAK,yBAAyB;YAC1D,sBAAsB,EAAE,CAAC,KAAK,sBAAsB;YACpD,sBAAsB,EAAE,CAAC,KAAK;SAC/B;AACH,IAAA,CAAC,CAAC;;AAGF,IAAA,sBAAsB,GAAG,QAAQ,CAAC,OAAO;QACvC,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAChC,GAAG,IAAI,CAAC,gBAAgB;AACzB,KAAA,CAAC,CAAC;;AAGH,IAAA,mBAAmB,GAAG,QAAQ,CAAC,OAAO;QACpC,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAChC,GAAG,IAAI,CAAC,gBAAgB;AACzB,KAAA,CAAC,CAAC;wGA3GQ,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,OAAO,6yDCnBpB,mpEAiEC,EAAA,MAAA,EAAA,CAAA,ohNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhDW,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,8BAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE5C,OAAO,EAAA,UAAA,EAAA,CAAA;kBARnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,eAAA,EAGH,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,mpEAAA,EAAA,MAAA,EAAA,CAAA,ohNAAA,CAAA,EAAA;8BAuC9C,KAAK,EAAA,CAAA;sBAAd;;;AExDH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-badge.mjs","sources":["../../../projects/sd-angular/components/badge/src/badge.component.ts","../../../projects/sd-angular/components/badge/src/badge.component.html","../../../projects/sd-angular/components/badge/sd-angular-core-components-badge.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, booleanAttribute, computed, input } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdColor, SdSize } from '@sd-angular/core/utilities/models';\r\nimport { MaterialIconFontSet, DefaultMaterialIconFontSet } from '@sd-angular/core/utilities/models';\r\n\r\n// Export các Type để dùng chung\r\nexport type SdBadgeType = 'tag' | 'round' | 'icon';\r\n\r\n@Component({\r\n selector: 'sd-badge',\r\n templateUrl: './badge.component.html',\r\n styleUrls: ['./badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class SdBadge {\r\n defaultIcon = 'fiber_manual_record';\r\n\r\n // ==========================================\r\n // 1. SIGNAL INPUTS\r\n // ==========================================\r\n type = input<SdBadgeType, SdBadgeType | undefined | null>('icon', {\r\n transform: (value) => value || 'icon'\r\n });\r\n\r\n color = input<SdColor, SdColor | undefined | null>('secondary', {\r\n transform: (value) => value || 'secondary'\r\n });\r\n\r\n primary = input(false, { transform: booleanAttribute });\r\n secondary = input(false, { transform: booleanAttribute });\r\n success = input(false, { transform: booleanAttribute });\r\n info = input(false, { transform: booleanAttribute });\r\n warning = input(false, { transform: booleanAttribute });\r\n error = input(false, { transform: booleanAttribute });\r\n\r\n fontSet = input<MaterialIconFontSet, MaterialIconFontSet | undefined | null>('material-icons', {\r\n transform: (value) => value || 'material-icons'\r\n });\r\n\r\n title = input<string | number | undefined | null>();\r\n description = input<string | undefined | null>();\r\n tooltip = input<string | undefined | null>();\r\n icon = input<string | undefined | null>();\r\n \r\n size = input<SdSize, SdSize | undefined | null>('sm', {\r\n transform: (value) => value || 'sm'\r\n });\r\n\r\n // ==========================================\r\n // 2. OUTPUT \r\n // ==========================================\r\n @Output() click = new EventEmitter<Event>();\r\n\r\n onClick = (event: Event) => {\r\n event.stopPropagation(); \r\n this.click.emit(event);\r\n };\r\n\r\n // ==========================================\r\n // 3. COMPUTED STATE \r\n // ==========================================\r\n \r\n effectiveColor = computed(() => {\r\n if (this.primary()) return 'primary';\r\n if (this.secondary()) return 'secondary';\r\n if (this.success()) return 'success';\r\n if (this.info()) return 'info';\r\n if (this.warning()) return 'warning';\r\n if (this.error()) return 'error';\r\n return this.color();\r\n });\r\n\r\n baseColorClasses = computed(() => {\r\n const c = this.effectiveColor();\r\n return {\r\n 'c-primary': c === 'primary',\r\n 'c-secondary': c === 'secondary',\r\n 'c-info': c === 'info',\r\n 'c-success': c === 'success',\r\n 'c-warning': c === 'warning',\r\n 'c-error': c === 'error',\r\n };\r\n });\r\n\r\n iconColorClasses = computed(() => {\r\n const c = this.effectiveColor();\r\n return {\r\n 'c-primary': c === 'primary',\r\n 'c-black400': c === 'secondary', \r\n 'c-info': c === 'info',\r\n 'c-success': c === 'success',\r\n 'c-warning': c === 'warning',\r\n 'c-error': c === 'error',\r\n };\r\n });\r\n\r\n iconSizeAndFontClasses = computed(() => {\r\n const s = this.size();\r\n const f = this.fontSet();\r\n return {\r\n 'c-xs': s === 'xs',\r\n 'c-sm': s === 'sm',\r\n 'c-md': s === 'md',\r\n 'c-lg': s === 'lg',\r\n 'material-icons': f === 'material-icons',\r\n 'material-icons-outlined': f === 'material-icons-outlined',\r\n 'material-icons-round': f === 'material-icons-round',\r\n 'material-icons-sharp': f === 'material-icons-sharp'\r\n };\r\n });\r\n\r\n // GỘP CLASS CHO BADGE TYPE = 'TAG'\r\n tagIconCombinedClasses = computed(() => ({\r\n ...this.iconSizeAndFontClasses(),\r\n ...this.baseColorClasses()\r\n }));\r\n\r\n // GỘP CLASS CHO BADGE TYPE = 'ICON'\r\n iconCombinedClasses = computed(() => ({\r\n ...this.iconSizeAndFontClasses(),\r\n ...this.iconColorClasses()\r\n }));\r\n}","@let badgeType = type();\r\n@let tt = tooltip();\r\n@let titleText = title();\r\n@let descText = description();\r\n@let iconName = icon() || defaultIcon;\r\n@let isPointer = click.observed;\r\n\r\n@if (badgeType === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ titleText }}\r\n </div>\r\n} @else if (badgeType === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon()) {\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"badgeType === 'icon'\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\"> \r\n {{ iconName }} \r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Clipboard } from '@angular/cdk/clipboard';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { inject, model, input, booleanAttribute, signal, computed, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
|
+
import * as i3 from '@angular/forms';
|
|
6
|
+
import { FormsModule } from '@angular/forms';
|
|
7
|
+
import * as i1 from '@angular/material/icon';
|
|
8
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
9
|
+
import * as i2 from '@angular/material/tooltip';
|
|
10
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
11
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
12
|
+
import * as Prism from 'prismjs';
|
|
13
|
+
import 'prismjs/components/prism-typescript';
|
|
14
|
+
import 'prismjs/components/prism-json';
|
|
15
|
+
import 'prismjs/components/prism-css';
|
|
16
|
+
import 'prismjs/components/prism-scss';
|
|
17
|
+
import 'prismjs/components/prism-markup';
|
|
18
|
+
|
|
19
|
+
class SdCodeEditor {
|
|
20
|
+
#clipboard = inject(Clipboard);
|
|
21
|
+
#sanitizer = inject(DomSanitizer);
|
|
22
|
+
// ==========================================
|
|
23
|
+
// 1. SIGNAL INPUTS & MODEL
|
|
24
|
+
// ==========================================
|
|
25
|
+
// Nhận bất kỳ kiểu dữ liệu nào (string, array, object)
|
|
26
|
+
valueModel = model(undefined, { alias: 'model' });
|
|
27
|
+
language = input('typescript');
|
|
28
|
+
maxHeight = input('500px');
|
|
29
|
+
// Trạng thái Viewed (true = Read Only, false = Editable)
|
|
30
|
+
viewed = input(false, { transform: booleanAttribute });
|
|
31
|
+
// ==========================================
|
|
32
|
+
// 2. INTERNAL STATE
|
|
33
|
+
// ==========================================
|
|
34
|
+
copied = signal(false);
|
|
35
|
+
// Chuỗi text nội bộ dùng để map với thẻ <textarea>
|
|
36
|
+
textValue = signal('');
|
|
37
|
+
prismLang = computed(() => this.language() === 'html' ? 'markup' : this.language());
|
|
38
|
+
// Cờ lưu vết để chống Loop (Vòng lặp vô tận khi bắn 2 chiều)
|
|
39
|
+
_lastEmittedValue = undefined;
|
|
40
|
+
constructor() {
|
|
41
|
+
// ==========================================
|
|
42
|
+
// EFFECT 1: Dữ liệu từ CHA truyền vào (Model -> TextValue)
|
|
43
|
+
// ==========================================
|
|
44
|
+
effect(() => {
|
|
45
|
+
const extVal = this.valueModel();
|
|
46
|
+
const lang = this.language();
|
|
47
|
+
untracked(() => {
|
|
48
|
+
// Nếu giá trị này do chính component bắn ra, bỏ qua để tránh loop
|
|
49
|
+
if (extVal === this._lastEmittedValue)
|
|
50
|
+
return;
|
|
51
|
+
if (typeof extVal === 'string') {
|
|
52
|
+
this.textValue.set(extVal);
|
|
53
|
+
}
|
|
54
|
+
else if (extVal !== undefined && extVal !== null) {
|
|
55
|
+
// Tự động format Object -> String nếu là JSON
|
|
56
|
+
if (lang === 'json') {
|
|
57
|
+
try {
|
|
58
|
+
this.textValue.set(JSON.stringify(extVal, null, 2));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
this.textValue.set('// Lỗi: Object có tham chiếu vòng (Circular Reference)');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.textValue.set(String(extVal));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.textValue.set('');
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// ==========================================
|
|
75
|
+
// EFFECT 2: PrismJS render (TextValue -> HTML MÀU)
|
|
76
|
+
// ==========================================
|
|
77
|
+
highlightedCode = computed(() => {
|
|
78
|
+
// Dùng khoảng trắng để giữ độ cao cho thẻ pre nếu rỗng
|
|
79
|
+
const rawCode = this.textValue() || ' ';
|
|
80
|
+
const langKey = this.prismLang();
|
|
81
|
+
const grammar = Prism.languages[langKey] || Prism.languages['markup'];
|
|
82
|
+
// Cộng thêm \n ở cuối để chống lỗi con trỏ textarea ăn lẹm dòng cuối
|
|
83
|
+
const highlightedString = Prism.highlight(rawCode, grammar, langKey) + '\n';
|
|
84
|
+
return this.#sanitizer.bypassSecurityTrustHtml(highlightedString);
|
|
85
|
+
});
|
|
86
|
+
// ==========================================
|
|
87
|
+
// EVENTS
|
|
88
|
+
// ==========================================
|
|
89
|
+
// Khi người dùng gõ vào Textarea (TextValue -> Model)
|
|
90
|
+
onTextChange(newText) {
|
|
91
|
+
this.textValue.set(newText);
|
|
92
|
+
let valToEmit = newText;
|
|
93
|
+
// Nếu ngôn ngữ là JSON, cố gắng trả về Object thật
|
|
94
|
+
if (this.language() === 'json') {
|
|
95
|
+
try {
|
|
96
|
+
valToEmit = JSON.parse(newText);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Nếu gõ dở ngoặc/sai cú pháp -> Trả về chuỗi String tạm
|
|
100
|
+
valToEmit = newText;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Ghi sổ và bắn ra ngoài
|
|
104
|
+
this._lastEmittedValue = valToEmit;
|
|
105
|
+
this.valueModel.set(valToEmit);
|
|
106
|
+
}
|
|
107
|
+
copyToClipboard() {
|
|
108
|
+
const rawCode = this.textValue();
|
|
109
|
+
if (!rawCode)
|
|
110
|
+
return;
|
|
111
|
+
if (this.#clipboard.copy(rawCode)) {
|
|
112
|
+
this.copied.set(true);
|
|
113
|
+
setTimeout(() => this.copied.set(false), 2000);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdCodeEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
117
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdCodeEditor, isStandalone: true, selector: "sd-code-editor", inputs: { valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange" }, ngImport: i0, template: "<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\r\n \r\n <div class=\"sd-code-header\">\r\n <div class=\"mac-dots\">\r\n <span class=\"dot red\"></span>\r\n <span class=\"dot yellow\"></span>\r\n <span class=\"dot green\"></span>\r\n </div>\r\n \r\n <div class=\"lang-badge\">\r\n {{ language().toUpperCase() }} \r\n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\r\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\r\n </span>\r\n </div>\r\n \r\n <button class=\"copy-btn\" [matTooltip]=\"copied() ? '\u0110\u00E3 copy!' : 'Copy code'\" (click)=\"copyToClipboard()\">\r\n <mat-icon [class.text-success]=\"copied()\">{{ copied() ? 'check' : 'content_copy' }}</mat-icon>\r\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\r\n <div class=\"editor-overlay-container\">\r\n \r\n @if (!viewed()) {\r\n <textarea \r\n class=\"code-textarea\"\r\n [ngModel]=\"textValue()\"\r\n (ngModelChange)=\"onTextChange($event)\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n autocorrect=\"off\"\r\n autocapitalize=\"off\">\r\n </textarea>\r\n }\r\n \r\n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.sd-code-wrapper{background-color:#1e1e1e;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px #00000026;margin:16px 0;font-family:Fira Code,Consolas,Monaco,monospace}.sd-code-wrapper .sd-code-header{display:flex;align-items:center;justify-content:space-between;background-color:#2d2d2d;padding:8px 16px;border-bottom:1px solid #404040}.sd-code-wrapper .sd-code-header .mac-dots{display:flex;gap:6px}.sd-code-wrapper .sd-code-header .mac-dots .dot{width:12px;height:12px;border-radius:50%}.sd-code-wrapper .sd-code-header .mac-dots .dot.red{background-color:#ff5f56}.sd-code-wrapper .sd-code-header .mac-dots .dot.yellow{background-color:#ffbd2e}.sd-code-wrapper .sd-code-header .mac-dots .dot.green{background-color:#27c93f}.sd-code-wrapper .sd-code-header .lang-badge{color:#858585;font-size:12px;font-weight:600;letter-spacing:.5px}.sd-code-wrapper .sd-code-header .copy-btn{display:flex;align-items:center;gap:4px;background:none;border:none;color:#ccc;cursor:pointer;font-size:13px;padding:4px 8px;border-radius:4px;transition:all .2s ease}.sd-code-wrapper .sd-code-header .copy-btn mat-icon{font-size:16px;width:16px;height:16px}.sd-code-wrapper .sd-code-header .copy-btn:hover{background-color:#404040;color:#fff}.sd-code-wrapper .sd-code-header .copy-btn .text-success{color:#27c93f!important}.sd-code-wrapper .sd-code-content{overflow-y:auto;position:relative}.sd-code-wrapper .sd-code-content::-webkit-scrollbar{width:8px;height:8px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb:hover{background:#777}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-track{background:#1e1e1e}.sd-code-wrapper .sd-code-content .editor-overlay-container{position:relative;min-height:100px}.sd-code-wrapper .sd-code-content .code-textarea,.sd-code-wrapper .sd-code-content .code-display{margin:0;padding:16px;border:0;width:100%;min-height:100%;font-family:inherit;font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-all;tab-size:2}.sd-code-wrapper .sd-code-content .code-textarea{position:absolute;top:0;left:0;z-index:2;background:transparent;color:transparent;caret-color:#fff;resize:none;outline:none;overflow:hidden}.sd-code-wrapper .sd-code-content .code-display{position:relative;z-index:1;pointer-events:none}.sd-code-wrapper .sd-code-content .code-display code{color:#d4d4d4;font-family:inherit}.sd-code-wrapper .token.comment,.sd-code-wrapper .token.block-comment,.sd-code-wrapper .token.prolog,.sd-code-wrapper .token.doctype,.sd-code-wrapper .token.cdata{color:#999}.sd-code-wrapper .token.punctuation{color:#ccc}.sd-code-wrapper .token.tag,.sd-code-wrapper .token.attr-name,.sd-code-wrapper .token.namespace,.sd-code-wrapper .token.deleted{color:#e2777a}.sd-code-wrapper .token.function-name{color:#6196cc}.sd-code-wrapper .token.boolean,.sd-code-wrapper .token.number,.sd-code-wrapper .token.function{color:#f08d49}.sd-code-wrapper .token.property,.sd-code-wrapper .token.class-name,.sd-code-wrapper .token.constant,.sd-code-wrapper .token.symbol{color:#f8c555}.sd-code-wrapper .token.selector,.sd-code-wrapper .token.important,.sd-code-wrapper .token.atrule,.sd-code-wrapper .token.keyword,.sd-code-wrapper .token.builtin{color:#cc99cd}.sd-code-wrapper .token.string,.sd-code-wrapper .token.char,.sd-code-wrapper .token.attr-value,.sd-code-wrapper .token.regex,.sd-code-wrapper .token.variable{color:#7ec699}.sd-code-wrapper .token.operator,.sd-code-wrapper .token.entity,.sd-code-wrapper .token.url{color:#67cdcc}.sd-code-wrapper .token.important,.sd-code-wrapper .token.bold{font-weight:700}.sd-code-wrapper .token.italic{font-style:italic}.sd-code-wrapper .token.entity{cursor:help}.sd-code-wrapper .token.inserted{color:green}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdCodeEditor, decorators: [{
|
|
120
|
+
type: Component,
|
|
121
|
+
args: [{ selector: 'sd-code-editor', standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\r\n \r\n <div class=\"sd-code-header\">\r\n <div class=\"mac-dots\">\r\n <span class=\"dot red\"></span>\r\n <span class=\"dot yellow\"></span>\r\n <span class=\"dot green\"></span>\r\n </div>\r\n \r\n <div class=\"lang-badge\">\r\n {{ language().toUpperCase() }} \r\n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\r\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\r\n </span>\r\n </div>\r\n \r\n <button class=\"copy-btn\" [matTooltip]=\"copied() ? '\u0110\u00E3 copy!' : 'Copy code'\" (click)=\"copyToClipboard()\">\r\n <mat-icon [class.text-success]=\"copied()\">{{ copied() ? 'check' : 'content_copy' }}</mat-icon>\r\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\r\n <div class=\"editor-overlay-container\">\r\n \r\n @if (!viewed()) {\r\n <textarea \r\n class=\"code-textarea\"\r\n [ngModel]=\"textValue()\"\r\n (ngModelChange)=\"onTextChange($event)\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n autocorrect=\"off\"\r\n autocapitalize=\"off\">\r\n </textarea>\r\n }\r\n \r\n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.sd-code-wrapper{background-color:#1e1e1e;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px #00000026;margin:16px 0;font-family:Fira Code,Consolas,Monaco,monospace}.sd-code-wrapper .sd-code-header{display:flex;align-items:center;justify-content:space-between;background-color:#2d2d2d;padding:8px 16px;border-bottom:1px solid #404040}.sd-code-wrapper .sd-code-header .mac-dots{display:flex;gap:6px}.sd-code-wrapper .sd-code-header .mac-dots .dot{width:12px;height:12px;border-radius:50%}.sd-code-wrapper .sd-code-header .mac-dots .dot.red{background-color:#ff5f56}.sd-code-wrapper .sd-code-header .mac-dots .dot.yellow{background-color:#ffbd2e}.sd-code-wrapper .sd-code-header .mac-dots .dot.green{background-color:#27c93f}.sd-code-wrapper .sd-code-header .lang-badge{color:#858585;font-size:12px;font-weight:600;letter-spacing:.5px}.sd-code-wrapper .sd-code-header .copy-btn{display:flex;align-items:center;gap:4px;background:none;border:none;color:#ccc;cursor:pointer;font-size:13px;padding:4px 8px;border-radius:4px;transition:all .2s ease}.sd-code-wrapper .sd-code-header .copy-btn mat-icon{font-size:16px;width:16px;height:16px}.sd-code-wrapper .sd-code-header .copy-btn:hover{background-color:#404040;color:#fff}.sd-code-wrapper .sd-code-header .copy-btn .text-success{color:#27c93f!important}.sd-code-wrapper .sd-code-content{overflow-y:auto;position:relative}.sd-code-wrapper .sd-code-content::-webkit-scrollbar{width:8px;height:8px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb:hover{background:#777}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-track{background:#1e1e1e}.sd-code-wrapper .sd-code-content .editor-overlay-container{position:relative;min-height:100px}.sd-code-wrapper .sd-code-content .code-textarea,.sd-code-wrapper .sd-code-content .code-display{margin:0;padding:16px;border:0;width:100%;min-height:100%;font-family:inherit;font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-all;tab-size:2}.sd-code-wrapper .sd-code-content .code-textarea{position:absolute;top:0;left:0;z-index:2;background:transparent;color:transparent;caret-color:#fff;resize:none;outline:none;overflow:hidden}.sd-code-wrapper .sd-code-content .code-display{position:relative;z-index:1;pointer-events:none}.sd-code-wrapper .sd-code-content .code-display code{color:#d4d4d4;font-family:inherit}.sd-code-wrapper .token.comment,.sd-code-wrapper .token.block-comment,.sd-code-wrapper .token.prolog,.sd-code-wrapper .token.doctype,.sd-code-wrapper .token.cdata{color:#999}.sd-code-wrapper .token.punctuation{color:#ccc}.sd-code-wrapper .token.tag,.sd-code-wrapper .token.attr-name,.sd-code-wrapper .token.namespace,.sd-code-wrapper .token.deleted{color:#e2777a}.sd-code-wrapper .token.function-name{color:#6196cc}.sd-code-wrapper .token.boolean,.sd-code-wrapper .token.number,.sd-code-wrapper .token.function{color:#f08d49}.sd-code-wrapper .token.property,.sd-code-wrapper .token.class-name,.sd-code-wrapper .token.constant,.sd-code-wrapper .token.symbol{color:#f8c555}.sd-code-wrapper .token.selector,.sd-code-wrapper .token.important,.sd-code-wrapper .token.atrule,.sd-code-wrapper .token.keyword,.sd-code-wrapper .token.builtin{color:#cc99cd}.sd-code-wrapper .token.string,.sd-code-wrapper .token.char,.sd-code-wrapper .token.attr-value,.sd-code-wrapper .token.regex,.sd-code-wrapper .token.variable{color:#7ec699}.sd-code-wrapper .token.operator,.sd-code-wrapper .token.entity,.sd-code-wrapper .token.url{color:#67cdcc}.sd-code-wrapper .token.important,.sd-code-wrapper .token.bold{font-weight:700}.sd-code-wrapper .token.italic{font-style:italic}.sd-code-wrapper .token.entity{cursor:help}.sd-code-wrapper .token.inserted{color:green}\n"] }]
|
|
122
|
+
}], ctorParameters: () => [] });
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Generated bundle index. Do not edit.
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
export { SdCodeEditor };
|
|
129
|
+
//# sourceMappingURL=sd-angular-core-components-code-editor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-code-editor.mjs","sources":["../../../projects/sd-angular/components/code-editor/src/code-editor.component.ts","../../../projects/sd-angular/components/code-editor/src/code-editor.component.html","../../../projects/sd-angular/components/code-editor/sd-angular-core-components-code-editor.ts"],"sourcesContent":["import { Clipboard } from '@angular/cdk/clipboard';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n untracked,\r\n ViewEncapsulation,\r\n booleanAttribute\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\nimport * as Prism from 'prismjs';\r\nimport 'prismjs/components/prism-typescript';\r\nimport 'prismjs/components/prism-json';\r\nimport 'prismjs/components/prism-css';\r\nimport 'prismjs/components/prism-scss';\r\nimport 'prismjs/components/prism-markup'; // HTML\r\n\r\nexport type CodeLanguage = 'html' | 'typescript' | 'json' | 'css' | 'scss';\r\n\r\n@Component({\r\n selector: 'sd-code-editor',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule, FormsModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './code-editor.component.html',\r\n styleUrls: ['./code-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None, // Bắt buộc để nhận màu Prism\r\n})\r\nexport class SdCodeEditor {\r\n #clipboard = inject(Clipboard);\r\n #sanitizer = inject(DomSanitizer);\r\n\r\n // ==========================================\r\n // 1. SIGNAL INPUTS & MODEL\r\n // ==========================================\r\n // Nhận bất kỳ kiểu dữ liệu nào (string, array, object)\r\n valueModel = model<any>(undefined, { alias: 'model' });\r\n \r\n language = input<CodeLanguage>('typescript');\r\n maxHeight = input<string>('500px');\r\n \r\n // Trạng thái Viewed (true = Read Only, false = Editable)\r\n viewed = input(false, { transform: booleanAttribute });\r\n\r\n // ==========================================\r\n // 2. INTERNAL STATE\r\n // ==========================================\r\n copied = signal<boolean>(false);\r\n \r\n // Chuỗi text nội bộ dùng để map với thẻ <textarea>\r\n textValue = signal<string>('');\r\n \r\n prismLang = computed(() => this.language() === 'html' ? 'markup' : this.language());\r\n\r\n // Cờ lưu vết để chống Loop (Vòng lặp vô tận khi bắn 2 chiều)\r\n private _lastEmittedValue: any = undefined;\r\n\r\n constructor() {\r\n // ==========================================\r\n // EFFECT 1: Dữ liệu từ CHA truyền vào (Model -> TextValue)\r\n // ==========================================\r\n effect(() => {\r\n const extVal = this.valueModel();\r\n const lang = this.language();\r\n \r\n untracked(() => {\r\n // Nếu giá trị này do chính component bắn ra, bỏ qua để tránh loop\r\n if (extVal === this._lastEmittedValue) return;\r\n\r\n if (typeof extVal === 'string') {\r\n this.textValue.set(extVal);\r\n } else if (extVal !== undefined && extVal !== null) {\r\n // Tự động format Object -> String nếu là JSON\r\n if (lang === 'json') {\r\n try {\r\n this.textValue.set(JSON.stringify(extVal, null, 2));\r\n } catch {\r\n this.textValue.set('// Lỗi: Object có tham chiếu vòng (Circular Reference)');\r\n }\r\n } else {\r\n this.textValue.set(String(extVal));\r\n }\r\n } else {\r\n this.textValue.set('');\r\n }\r\n });\r\n });\r\n }\r\n\r\n // ==========================================\r\n // EFFECT 2: PrismJS render (TextValue -> HTML MÀU)\r\n // ==========================================\r\n highlightedCode = computed<SafeHtml>(() => {\r\n // Dùng khoảng trắng để giữ độ cao cho thẻ pre nếu rỗng\r\n const rawCode = this.textValue() || ' '; \r\n const langKey = this.prismLang();\r\n const grammar = Prism.languages[langKey] || Prism.languages['markup'];\r\n \r\n // Cộng thêm \\n ở cuối để chống lỗi con trỏ textarea ăn lẹm dòng cuối\r\n const highlightedString = Prism.highlight(rawCode, grammar, langKey) + '\\n';\r\n return this.#sanitizer.bypassSecurityTrustHtml(highlightedString);\r\n });\r\n\r\n // ==========================================\r\n // EVENTS\r\n // ==========================================\r\n \r\n // Khi người dùng gõ vào Textarea (TextValue -> Model)\r\n onTextChange(newText: string) {\r\n this.textValue.set(newText);\r\n \r\n let valToEmit: any = newText;\r\n \r\n // Nếu ngôn ngữ là JSON, cố gắng trả về Object thật\r\n if (this.language() === 'json') {\r\n try {\r\n valToEmit = JSON.parse(newText);\r\n } catch {\r\n // Nếu gõ dở ngoặc/sai cú pháp -> Trả về chuỗi String tạm\r\n valToEmit = newText; \r\n }\r\n }\r\n \r\n // Ghi sổ và bắn ra ngoài\r\n this._lastEmittedValue = valToEmit;\r\n this.valueModel.set(valToEmit);\r\n }\r\n\r\n copyToClipboard() {\r\n const rawCode = this.textValue();\r\n if (!rawCode) return;\r\n \r\n if (this.#clipboard.copy(rawCode)) {\r\n this.copied.set(true);\r\n setTimeout(() => this.copied.set(false), 2000);\r\n }\r\n }\r\n}","<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\r\n \r\n <div class=\"sd-code-header\">\r\n <div class=\"mac-dots\">\r\n <span class=\"dot red\"></span>\r\n <span class=\"dot yellow\"></span>\r\n <span class=\"dot green\"></span>\r\n </div>\r\n \r\n <div class=\"lang-badge\">\r\n {{ language().toUpperCase() }} \r\n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\r\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\r\n </span>\r\n </div>\r\n \r\n <button class=\"copy-btn\" [matTooltip]=\"copied() ? 'Đã copy!' : 'Copy code'\" (click)=\"copyToClipboard()\">\r\n <mat-icon [class.text-success]=\"copied()\">{{ copied() ? 'check' : 'content_copy' }}</mat-icon>\r\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\r\n <div class=\"editor-overlay-container\">\r\n \r\n @if (!viewed()) {\r\n <textarea \r\n class=\"code-textarea\"\r\n [ngModel]=\"textValue()\"\r\n (ngModelChange)=\"onTextChange($event)\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n autocorrect=\"off\"\r\n autocapitalize=\"off\">\r\n </textarea>\r\n }\r\n \r\n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\r\n \r\n </div>\r\n </div>\r\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, Pipe, Input, ChangeDetectionStrategy, Component, HostListener, ViewChild, createNgModule } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/router';
|
|
4
|
-
import {
|
|
4
|
+
import { RouterEvent, RoutesRecognized, NavigationEnd, ActivatedRoute } from '@angular/router';
|
|
5
5
|
import * as i5 from '@angular/common';
|
|
6
6
|
import { CommonModule } from '@angular/common';
|
|
7
7
|
import * as i3 from '@angular/material/icon';
|
|
@@ -153,12 +153,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
|
|
|
153
153
|
class SdTabRouterItemComponent {
|
|
154
154
|
cdRef;
|
|
155
155
|
tabRouterService;
|
|
156
|
+
router;
|
|
156
157
|
tab;
|
|
157
158
|
#subsctiption = new Subscription();
|
|
158
159
|
tabInfo;
|
|
159
|
-
constructor(cdRef, tabRouterService) {
|
|
160
|
+
constructor(cdRef, tabRouterService, router) {
|
|
160
161
|
this.cdRef = cdRef;
|
|
161
162
|
this.tabRouterService = tabRouterService;
|
|
163
|
+
this.router = router;
|
|
162
164
|
}
|
|
163
165
|
ngOnInit() {
|
|
164
166
|
this.#subsctiption.add(this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {
|
|
@@ -174,6 +176,13 @@ class SdTabRouterItemComponent {
|
|
|
174
176
|
ngOnDestroy() {
|
|
175
177
|
this.#subsctiption.unsubscribe();
|
|
176
178
|
}
|
|
179
|
+
onTabClick = (event) => {
|
|
180
|
+
event.preventDefault();
|
|
181
|
+
this.router.navigate([this.tab.url], {
|
|
182
|
+
queryParams: this.tab.queryParams,
|
|
183
|
+
state: { switchTab: true },
|
|
184
|
+
});
|
|
185
|
+
};
|
|
177
186
|
close = (event) => {
|
|
178
187
|
event.preventDefault();
|
|
179
188
|
event.stopPropagation();
|
|
@@ -212,13 +221,13 @@ class SdTabRouterItemComponent {
|
|
|
212
221
|
this.tabRouterService.close(this.tab);
|
|
213
222
|
}
|
|
214
223
|
};
|
|
215
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdTabRouterItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: SdTabRouterService }], target: i0.ɵɵFactoryTarget.Component });
|
|
216
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdTabRouterItemComponent, isStandalone: true, selector: "sd-tab-router-item", inputs: { tab: "tab" }, ngImport: i0, template: "<a\n [
|
|
224
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdTabRouterItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: SdTabRouterService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
225
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdTabRouterItemComponent, isStandalone: true, selector: "sd-tab-router-item", inputs: { tab: "tab" }, ngImport: i0, template: "<a\r\n [href]=\"[tab.url]\"\r\n class=\"tab-router__item d-flex align-items-center gap-8\"\r\n [class.tab-router__item--active]=\"tab.isActive\"\r\n (click)=\"onTabClick($event)\"\r\n (mousedown)=\"onMousedown($event)\"\r\n (mouseup)=\"onMouseup($event)\">\r\n @let info = tabInfo | sdTabInfo: tab;\r\n @if (info) {\r\n <sd-badge\r\n style=\"overflow: hidden;white-space: nowrap;\"\r\n [icon]=\"info.icon\"\r\n [title]=\"info.icon\"\r\n [tooltip]=\"info.tooltip || info.name\"\r\n [title]=\"info.name\"\r\n [color]=\"info.color\"\r\n (click)=\"onTabClick($event)\"></sd-badge>\r\n <button\r\n aria-hidden=\"true\"\r\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\r\n (click)=\"close($event)\"\r\n (mousedown)=\"$event.stopPropagation()\">\r\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\r\n </button>\r\n }\r\n</a>\r\n", styles: [":host{display:block;overflow:hidden;position:relative;flex:1 1 64px;max-width:240px}:host:after{content:\"\";position:absolute;right:0;top:0;bottom:0;height:16px;width:1px;background:#dde0e5;margin:auto}:host:last-child:after{content:none}:host::ng-deep .tab-router__item sd-badge .c-badge-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:184px}.flex-1{flex:1}.tab-router__icon{background-color:#5c6bc0;width:16px;height:16px;line-height:16px;text-align:center;font-size:10px;color:#fff;border-radius:2px;text-transform:uppercase}.tab-router__icon .mat-icon{height:10px;width:10px;font-size:10px}.tab-router__close{color:#757575;outline:none;border:0;background:none;border-radius:50%;height:16px;width:16px}.tab-router__close:hover{background-color:#0000001f}.tab-router__close .mat-icon{font-size:12px;height:12px;width:12px}.tab-router__item{background:#f2f3f4;padding:8px;color:inherit;text-decoration:none;font-size:12px;line-height:16px;overflow:hidden}.tab-router__item:hover{background-color:#fff}.tab-router__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tab-router__item--active{border-radius:8px 8px 0 0;background-color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: SdTabInfoPipe, name: "sdTabInfo" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
217
226
|
}
|
|
218
227
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdTabRouterItemComponent, decorators: [{
|
|
219
228
|
type: Component,
|
|
220
|
-
args: [{ selector: 'sd-tab-router-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule,
|
|
221
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: SdTabRouterService }], propDecorators: { tab: [{
|
|
229
|
+
args: [{ selector: 'sd-tab-router-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, MatIconModule, SdBadge, SdTabInfoPipe], template: "<a\r\n [href]=\"[tab.url]\"\r\n class=\"tab-router__item d-flex align-items-center gap-8\"\r\n [class.tab-router__item--active]=\"tab.isActive\"\r\n (click)=\"onTabClick($event)\"\r\n (mousedown)=\"onMousedown($event)\"\r\n (mouseup)=\"onMouseup($event)\">\r\n @let info = tabInfo | sdTabInfo: tab;\r\n @if (info) {\r\n <sd-badge\r\n style=\"overflow: hidden;white-space: nowrap;\"\r\n [icon]=\"info.icon\"\r\n [title]=\"info.icon\"\r\n [tooltip]=\"info.tooltip || info.name\"\r\n [title]=\"info.name\"\r\n [color]=\"info.color\"\r\n (click)=\"onTabClick($event)\"></sd-badge>\r\n <button\r\n aria-hidden=\"true\"\r\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\r\n (click)=\"close($event)\"\r\n (mousedown)=\"$event.stopPropagation()\">\r\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\r\n </button>\r\n }\r\n</a>\r\n", styles: [":host{display:block;overflow:hidden;position:relative;flex:1 1 64px;max-width:240px}:host:after{content:\"\";position:absolute;right:0;top:0;bottom:0;height:16px;width:1px;background:#dde0e5;margin:auto}:host:last-child:after{content:none}:host::ng-deep .tab-router__item sd-badge .c-badge-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:184px}.flex-1{flex:1}.tab-router__icon{background-color:#5c6bc0;width:16px;height:16px;line-height:16px;text-align:center;font-size:10px;color:#fff;border-radius:2px;text-transform:uppercase}.tab-router__icon .mat-icon{height:10px;width:10px;font-size:10px}.tab-router__close{color:#757575;outline:none;border:0;background:none;border-radius:50%;height:16px;width:16px}.tab-router__close:hover{background-color:#0000001f}.tab-router__close .mat-icon{font-size:12px;height:12px;width:12px}.tab-router__item{background:#f2f3f4;padding:8px;color:inherit;text-decoration:none;font-size:12px;line-height:16px;overflow:hidden}.tab-router__item:hover{background-color:#fff}.tab-router__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tab-router__item--active{border-radius:8px 8px 0 0;background-color:#fff}\n"] }]
|
|
230
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: SdTabRouterService }, { type: i1.Router }], propDecorators: { tab: [{
|
|
222
231
|
type: Input,
|
|
223
232
|
args: [{ required: true }]
|
|
224
233
|
}] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-tab-router.mjs","sources":["../../../projects/sd-angular/components/tab-router/src/events/tab-router.event.ts","../../../projects/sd-angular/components/tab-router/src/services/tab-router.service.ts","../../../projects/sd-angular/components/tab-router/src/pipes/tab-info.pipe.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.html","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.html","../../../projects/sd-angular/components/tab-router/src/services/tab-decorator.service.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.html","../../../projects/sd-angular/components/tab-router/src/decorators/tab.decorator.ts","../../../projects/sd-angular/components/tab-router/sd-angular-core-components-tab-router.ts"],"sourcesContent":["import { SdTab } from '../models/tab-router.model';\n\nexport class SdTabBase {\n #tab: SdTab | undefined;\n\n constructor(tab: SdTab | undefined) {\n this.#tab = tab;\n }\n\n get tab(): SdTab | undefined {\n return this.#tab;\n }\n}\n\nexport class SdTabActivated extends SdTabBase {}\n\nexport class SdTabDeactivated extends SdTabBase {}\n\nexport declare type SdTabEvent = SdTabActivated | SdTabDeactivated;\n","import { Injectable, Type } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SdTabAction } from '../actions/tab-router.action';\r\nimport { SdTabComponentBuilder } from '../decorators/tab.decorator';\r\nimport { SdTabBase, SdTabEvent } from '../events/tab-router.event';\r\nimport { SdTab } from '../models/tab-router.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdTabRouterService {\r\n events = new BehaviorSubject<SdTabEvent>(new SdTabBase(undefined));\r\n actions = new BehaviorSubject<SdTabAction | undefined>(undefined);\r\n builders = new BehaviorSubject<SdTabComponentBuilder[]>([]);\r\n currentTabChanges = new BehaviorSubject<SdTab | undefined>(undefined);\r\n newTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n updateTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n #currentTab: SdTab | undefined = undefined;\r\n #componentBuilders: SdTabComponentBuilder[] = [];\r\n constructor() {}\r\n\r\n addBuilder = (builder: SdTabComponentBuilder) => {\r\n if (!this.#componentBuilders.some(e => e.component === builder.component)) {\r\n this.#componentBuilders.push(builder);\r\n this.builders.next(this.#componentBuilders);\r\n }\r\n };\r\n\r\n get currentTab() {\r\n return this.#currentTab;\r\n }\r\n\r\n get currentKey() {\r\n return this.#currentTab?.key || null;\r\n }\r\n\r\n // select = (tabOrKey: string | SdTab): void => {\r\n // const tab = this.#tabs.find(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key === tabOrKey;\r\n // }\r\n // return e.key === tabOrKey?.key;\r\n // });\r\n // if (tab) {\r\n // this.#currentTab = tab;\r\n // }\r\n // }\r\n\r\n // add = (tab: SdTab): void => {\r\n // if (!tab.key) {\r\n // this.notifyService.notify.warning('Tab key is required');\r\n // }\r\n // if (!tab.component) {\r\n // this.notifyService.notify.warning('Tab component is required');\r\n // }\r\n // const existedTab = this.#tabs.find(e => e.key === tab.key);\r\n // if (!existedTab) {\r\n // this.#tabs.push(tab);\r\n // this.select(tab);\r\n // } else {\r\n // this.select(existedTab);\r\n // }\r\n // }\r\n\r\n // remove = (tabOrKey: string | SdTab): void => {\r\n // this.#tabs = this.#tabs.filter(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key !== tabOrKey;\r\n // }\r\n // return e.key !== tabOrKey?.key;\r\n // });\r\n // }\r\n\r\n setCurrentTab = (tab: SdTab): void => {\r\n this.#currentTab = tab;\r\n this.currentTabChanges.next(tab);\r\n };\r\n\r\n pushEvent = (tab: SdTab, Event: Type<SdTabEvent>) => {\r\n this.events.next(new Event(tab));\r\n };\r\n\r\n setOptions = () => {};\r\n\r\n close = (tab?: SdTab) => {\r\n tab = tab || this.#currentTab;\r\n if (tab) {\r\n this.actions.next({\r\n type: 'close',\r\n tab,\r\n });\r\n }\r\n };\r\n\r\n // Gọi hàm này để thực hiện update tab\r\n updateTab = (tab: SdTab) => {};\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTab, SdTabInfo } from '../models/tab-router.model';\nimport { SdTabRouterService } from '../services/tab-router.service';\n@Pipe({\n name: 'sdTabInfo',\n standalone: true,\n})\nexport class SdTabInfoPipe implements PipeTransform {\n constructor(private tabRouterService: SdTabRouterService) {}\n transform(tabInfo: SdTabInfo | undefined | null, tab: SdTab): SdTabInfo {\n if (tabInfo) {\n return tabInfo;\n }\n const builders = this.tabRouterService.builders.getValue();\n const builder = builders.find(e => e.component === tab.component);\n if (builder) {\n const { url, params, queryParams, data } = tab;\n return {\n name: typeof builder.name === 'function' ? builder.name({ url, params, queryParams, data }) : builder.name,\n icon: typeof builder.icon === 'function' ? builder.icon({ url, params, queryParams }) : builder.icon,\n tooltip: typeof builder.tooltip === 'function' ? builder.tooltip({ url, params, queryParams }) : builder.tooltip,\n color: typeof builder.color === 'function' ? builder.color({ url, params, queryParams }) : builder.color,\n };\n }\n return {\n name: tab.url,\n icon: undefined,\n };\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, startWith } from 'rxjs/operators';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { SdBadge } from '@sd-angular/core/components/badge';\nimport { SdTab, SdTabInfo } from '../../models';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { RouterModule } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { SdTabInfoPipe } from '../../pipes/tab-info.pipe';\n\n@Component({\n selector: 'sd-tab-router-item',\n templateUrl: './tab-router-item.component.html',\n styleUrls: ['./tab-router-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, RouterModule, MatIconModule, SdBadge, SdTabInfoPipe],\n})\nexport class SdTabRouterItemComponent implements OnInit, OnDestroy {\n @Input({ required: true }) tab!: SdTab;\n\n #subsctiption: Subscription = new Subscription();\n tabInfo?: SdTabInfo;\n constructor(\n private cdRef: ChangeDetectorRef,\n private tabRouterService: SdTabRouterService\n ) {}\n\n ngOnInit(): void {\n this.#subsctiption.add(\n this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {\n this.cdRef.markForCheck();\n })\n );\n\n this.#subsctiption.add(\n this.tab.tabInfoChanges.pipe(startWith(null)).subscribe(tabInfo => {\n if (tabInfo) {\n this.tabInfo = tabInfo;\n this.cdRef.markForCheck();\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.#subsctiption.unsubscribe();\n }\n\n close = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.#closeTab();\n };\n\n onMousedown = (event: MouseEvent) => {\n if (event.button === 1) {\n event.preventDefault();\n }\n };\n\n onMouseup = (event: MouseEvent) => {\n if (event.button === 1) {\n event.preventDefault();\n event.stopPropagation();\n this.#closeTab();\n }\n };\n\n #closeTab = async () => {\n if (this.tab?.beforeClose) {\n //\n if (this.tab?.beforeClose()) {\n const result = this.tab?.beforeClose();\n if (typeof result === 'boolean') {\n if (result) {\n this.tabRouterService.close(this.tab);\n }\n } else {\n if (await result) {\n this.tabRouterService.close(this.tab);\n }\n }\n }\n } else {\n this.tabRouterService.close(this.tab);\n }\n };\n}\n","<a\n [routerLink]=\"[tab.url]\"\n [queryParams]=\"tab.queryParams\"\n [state]=\"{ switchTab: true }\"\n class=\"tab-router__item d-flex align-items-center\"\n style=\"gap: 8px\"\n [class.tab-router__item--active]=\"tab.isActive\"\n (mousedown)=\"onMousedown($event)\"\n (mouseup)=\"onMouseup($event)\">\n @let info = tabInfo | sdTabInfo: tab;\n @if (info) {\n <sd-badge\n style=\"overflow: hidden;white-space: nowrap;\"\n [icon]=\"info.icon\"\n [title]=\"info.icon\"\n [tooltip]=\"info.tooltip || info.name\"\n [title]=\"info.name\"\n [color]=\"info.color\"></sd-badge>\n <button\n aria-hidden=\"true\"\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\n (click)=\"close($event)\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\n </button>\n }\n</a>\n","import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, Input, ViewChild } from '@angular/core';\n\nimport { SdTab } from '../../models/tab-router.model';\nimport { SdTabRouterItemComponent } from '../tab-router-item/tab-router-item.component';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'sd-tab-router-nav',\n templateUrl: './tab-router-nav.component.html',\n styleUrls: ['./tab-router-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, DragDropModule, SdTabRouterItemComponent],\n})\nexport class SdTabRouterNavComponent {\n @ViewChild('tabRouterNav') tabRouterNav?: ElementRef;\n\n @Input() tabs: SdTab[] = [];\n mode: 'default' | 'compact' = 'default';\n\n constructor(\n private cdRef: ChangeDetectorRef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public elementRef: ElementRef<any>\n ) {}\n\n @HostListener('window:resize', ['$event'])\n onResize(): void {\n this.checkUI();\n }\n\n checkUI = () => {\n const width = this.tabRouterNav?.nativeElement.clientWidth;\n const nameWidth = (width - this.tabs!.length * 68) / this.tabs!.length;\n if (nameWidth <= 20) {\n this.mode = 'compact';\n } else {\n this.mode = 'default';\n }\n this.cdRef.markForCheck();\n };\n\n onDrop = (event: CdkDragDrop<SdTab[]>) => {\n moveItemInArray(this.tabs!, event.previousIndex, event.currentIndex);\n };\n}\n","<div\n #tabRouterNav\n cdkDropList\n cdkDropListLockAxis=\"x\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onDrop($event)\"\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\n [class.d-none]=\"tabs.length > 1\">\n <ng-container *ngFor=\"let tab of tabs\">\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef?.nativeElement\"></sd-tab-router-item>\n </ng-container>\n</div>\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SdTabRouterService } from './tab-router.service';\n@Injectable({\n providedIn: 'root',\n})\nexport class SdTabDecoratorService {\n static tabRouterService = new BehaviorSubject<SdTabRouterService | undefined>(undefined);\n constructor(tabRouterService: SdTabRouterService) {\n SdTabDecoratorService.tabRouterService.next(tabRouterService);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ChangeDetectorRef, Component, createNgModule, Injector, NgModuleRef, OnDestroy, Type, ViewChild } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Router, RouterEvent, RoutesRecognized } from '@angular/router';\nimport { SdTabActivated, SdTabDeactivated } from '../../events/tab-router.event';\n\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdNotifyService } from '@sd-angular/core/services/notify';\n// import hash from 'object-hash';\nimport { Subject, Subscription } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { SdTabAction } from '../../actions/tab-router.action';\nimport { SdTab } from '../../models';\nimport { SdTabDecoratorService } from '../../services/tab-decorator.service';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { SdTabRouterNavComponent } from '../tab-router-nav/tab-router-nav.component';\nimport { SdUtilities } from '@sd-angular/core/utilities';\n\n@Component({\n selector: 'sd-tab-router-outlet',\n templateUrl: './tab-router-outlet.component.html',\n styleUrls: ['./tab-router-outlet.component.scss'],\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule, SdTabRouterNavComponent],\n // changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTabRouterOutletComponent implements OnDestroy {\n @ViewChild('tabRouterNav') tabRouterNav?: SdTabRouterNavComponent;\n tabs: SdTab[] = [];\n\n #rootRoute?: ActivatedRoute;\n #subscription = new Subscription();\n #firstLoad = true;\n constructor(\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private cd: ChangeDetectorRef,\n private injector: Injector,\n private tabDecoratorService: SdTabDecoratorService, // KHÔNG XÓA\n private tabRouterService: SdTabRouterService,\n private sdNotifyService: SdNotifyService\n ) {\n this.#subscription.add(\n router.events\n .pipe(\n map((event: any) => (event instanceof RouterEvent ? event : event.routerEvent)),\n filter(event => {\n return event instanceof RoutesRecognized || event instanceof NavigationEnd;\n })\n )\n .subscribe(async (event: RoutesRecognized | NavigationEnd) => {\n if (this.#firstLoad && event instanceof NavigationEnd) {\n this.#firstLoad = false;\n const route = this.#getActivatedRouteSnapshot(this.activatedRoute.snapshot);\n this.#rootRoute = this.router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route);\n return;\n }\n if (!this.#firstLoad && event instanceof RoutesRecognized) {\n const route = this.#getActivatedRouteSnapshot(event.state.root);\n this.#rootRoute = this.router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route);\n }\n })\n );\n\n this.#subscription.add(\n tabRouterService.actions.subscribe((event: SdTabAction | undefined) => {\n if (event && event.type === 'close') {\n this.#closeTab(event.tab);\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n\n tabTrackBy = (index: number, tab: SdTab) => {\n return tab.key;\n };\n\n #closeTab = (tab: SdTab) => {\n const { isActive, key: activeKey } = tab;\n if (isActive) {\n const activeIndex = this.tabs.findIndex(({ key }) => key === activeKey);\n const nextTab = this.tabs[activeIndex + 1] || this.tabs[activeIndex - 1];\n if (nextTab) {\n const { url: nextUrl } = nextTab;\n const nextQueryParams = {\n ...(nextTab.queryParams || {}),\n };\n\n this.tabs = this.tabs.filter(({ key }) => key !== activeKey);\n this.router.navigate([nextUrl], {\n queryParams: nextQueryParams,\n state: {\n switchTab: true,\n },\n });\n } else {\n this.tabs = this.tabs.filter(({ key }) => key !== activeKey);\n this.router.navigateByUrl('/', {\n state: {\n switchTab: true,\n },\n });\n }\n } else {\n this.tabs = this.tabs.filter(({ key }) => key !== tab.key);\n this.tabRouterNav?.checkUI();\n this.cd.markForCheck();\n }\n };\n\n #activeRoute = async (fullUrl: string, route: ActivatedRouteSnapshot | null) => {\n if (!route?.component) {\n return;\n }\n const component = route.component as Type<any>;\n const queryParams = {\n ...(route.queryParams || {}),\n };\n const params = {\n ...(route.params || {}),\n };\n const data = {\n ...(route.data || {}),\n };\n\n const [url] = fullUrl.split('?');\n const key = SdUtilities.hash({ url, queryParams });\n let existedIndex = -1;\n let activatedIndex = -1;\n this.tabs.forEach((tab: SdTab, index: number) => {\n if (tab.key === key) {\n tab.isActive = true;\n existedIndex = index;\n } else {\n if (tab.isActive) {\n activatedIndex = index;\n this.tabRouterService.pushEvent(tab, SdTabDeactivated);\n }\n tab.isActive = false;\n }\n });\n\n const currentNavigation = this.router.getCurrentNavigation();\n // Switch tab sẽ ko re-render lại trang\n const switchTab = currentNavigation?.extras?.state?.['switchTab'];\n // Replace tab sẽ close trang hiện tại\n const replaceTab = currentNavigation?.extras?.state?.['replaceTab'];\n if (existedIndex >= 0) {\n const existedTab = this.tabs[existedIndex];\n if (replaceTab && activatedIndex >= 0) {\n if (activatedIndex >= 0) {\n this.tabs.splice(activatedIndex, 1);\n }\n }\n if (switchTab) {\n this.tabRouterService.setCurrentTab(existedTab);\n this.tabRouterService.pushEvent(existedTab, SdTabActivated);\n } else {\n if (typeof route?.parent?.routeConfig?.loadChildren === 'function') {\n const module = (await route.parent.routeConfig.loadChildren()) as Type<any>;\n const moduleRef = createNgModule(module, this.injector);\n const activatedRoute = this.#getActivatedRoute(this.#rootRoute!, component);\n const tab: SdTab = {\n key,\n component,\n injector: new SdOutletInjector(activatedRoute, moduleRef),\n isActive: true,\n url,\n params,\n queryParams,\n data,\n tabInfoChanges: new Subject(),\n };\n this.tabs[this.tabs.indexOf(existedTab)] = tab;\n }\n }\n } else {\n if (typeof route?.parent?.routeConfig?.loadChildren === 'function') {\n const module = (await route.parent.routeConfig.loadChildren()) as Type<any>;\n const moduleRef = createNgModule(module, this.injector);\n const activatedRoute = this.#getActivatedRoute(this.#rootRoute!, component);\n\n const tab: SdTab = {\n key,\n component,\n injector: new SdOutletInjector(activatedRoute, moduleRef),\n isActive: true,\n url,\n params,\n queryParams,\n data,\n tabInfoChanges: new Subject(),\n };\n\n this.tabRouterService.setCurrentTab(tab);\n if (activatedIndex >= 0 && replaceTab) {\n this.tabs.splice(activatedIndex, 1);\n }\n this.tabs.push(tab);\n // if (existedIndex >= 0 && !switchTab) {\n // this.tabs[existedIndex] = tab;\n // } else {\n // this.tabs.push(tab);\n // }\n }\n\n this.tabRouterNav?.checkUI();\n if (this.tabs.length > 10) {\n this.sdNotifyService.warning('Bạn đã mở quá nhiều tab. Vui lòng tắt các tab không dùng để hệ thống hoạt động tốt hơn.');\n }\n // if (this.tabs.length > 15) {\n // this.tabs.splice(0, this.tabs.length - 10);\n // }\n }\n // if (existedIndex >= 0 && switchTab) {\n // const existedTab = this.tabs[existedIndex];\n // this.tabRouterService.setCurrentTab(existedTab);\n // this.tabRouterService.pushEvent(existedTab, SdTabActivated);\n // } else {\n // if (typeof route?.parent?.routeConfig?.loadChildren === 'function') {\n // const module = await route.parent.routeConfig.loadChildren();\n // const factory = await this.compiler.compileModuleAsync(module);\n // const injector = factory.create(this.injector);\n // const activatedRoute = this.#getActivatedRoute(\n // this.#rootRoute,\n // component\n // );\n\n // const tab = {\n // key,\n // component,\n // injector: new SdOutletInjector(activatedRoute, injector),\n // isActive: true,\n // name: url,\n // url,\n // params,\n // queryParams,\n // data\n // };\n\n // this.tabRouterService.setCurrentTab(tab);\n // if (activatedIndex >= 0 && replaceTab) {\n // this.tabs.splice(activatedIndex, 1);\n // }\n // if (existedIndex >= 0 && !switchTab) {\n // this.tabs[existedIndex] = tab;\n // } else {\n // this.tabs.push(tab);\n // }\n // }\n\n // this.tabRouterNav?.checkUI();\n // if (this.tabs.length > 10) {\n // this.sdNotifyService.notify.warning(\n // 'Bạn đã mở quá nhiều tab. Vui lòng tắt các tab không dùng để hệ thống hoạt động tốt hơn.'\n // );\n // }\n // if (this.tabs.length > 15) {\n // this.tabs.splice(0, this.tabs.length - 10);\n // }\n // }\n this.cd.markForCheck();\n };\n\n #getActivatedRouteSnapshot = (activatedRouteSnapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot | null => {\n if (!activatedRouteSnapshot) {\n return null;\n }\n while (activatedRouteSnapshot.firstChild) {\n activatedRouteSnapshot = activatedRouteSnapshot.firstChild;\n }\n return activatedRouteSnapshot;\n };\n\n #getActivatedRoute = (activatedRoute: ActivatedRoute, component: any): ActivatedRoute | null => {\n if (!activatedRoute) {\n return null;\n }\n\n if (activatedRoute.component && activatedRoute.component === component) {\n return activatedRoute;\n }\n while (activatedRoute.firstChild) {\n activatedRoute = activatedRoute.firstChild;\n if (activatedRoute.component && activatedRoute.component === component) {\n return activatedRoute;\n }\n }\n return null;\n };\n}\n\nclass SdOutletInjector implements Injector {\n constructor(\n private route: ActivatedRoute | null,\n // private childContexts: ChildrenOutletContexts,\n private parent: NgModuleRef<Injector>\n ) {}\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute && this.route) {\n return this.route;\n }\n\n // if (token === ChildrenOutletContexts) {\n // return this.childContexts;\n // }\n\n return this.parent.injector.get(token, notFoundValue);\n }\n}\n","<sd-tab-router-nav [tabs]=\"tabs\" #tabRouterNav></sd-tab-router-nav>\n\n<div class=\"tab-router__list\">\n <ng-container *ngFor=\"let tab of tabs; trackBy: tabTrackBy\">\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\n <div class=\"tab-router__content\">\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </div>\n </div>\n </ng-container>\n</div>\n","import { Type } from '@angular/core';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { SdTabDecoratorService } from '../services/tab-decorator.service';\r\n\r\nexport interface SdTabComponentArgs {\r\n url?: string;\r\n params?: any;\r\n queryParams?: any;\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport declare interface SdTabComponentBuilder {\r\n component: Type<any>;\r\n name: string | ((args: SdTabComponentArgs) => string);\r\n icon?: string | ((args: SdTabComponentArgs) => string);\r\n tooltip?: string | ((args: SdTabComponentArgs) => string);\r\n color?: SdColor | ((args: SdTabComponentArgs) => SdColor);\r\n}\r\n\r\nexport function SdTabComponent<T>(builder: SdTabComponentBuilder) {\r\n return (constructor: T) => {\r\n SdTabDecoratorService.tabRouterService\r\n .pipe(\r\n filter(service => service !== undefined && service !== null),\r\n take(1)\r\n )\r\n .subscribe(service => {\r\n service.addBuilder(builder);\r\n });\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdTabRouterService","i2","i1","i2.SdTabDecoratorService","i3.SdTabRouterService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-tab-router.mjs","sources":["../../../projects/sd-angular/components/tab-router/src/events/tab-router.event.ts","../../../projects/sd-angular/components/tab-router/src/services/tab-router.service.ts","../../../projects/sd-angular/components/tab-router/src/pipes/tab-info.pipe.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.html","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.html","../../../projects/sd-angular/components/tab-router/src/services/tab-decorator.service.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.html","../../../projects/sd-angular/components/tab-router/src/decorators/tab.decorator.ts","../../../projects/sd-angular/components/tab-router/sd-angular-core-components-tab-router.ts"],"sourcesContent":["import { SdTab } from '../models/tab-router.model';\n\nexport class SdTabBase {\n #tab: SdTab | undefined;\n\n constructor(tab: SdTab | undefined) {\n this.#tab = tab;\n }\n\n get tab(): SdTab | undefined {\n return this.#tab;\n }\n}\n\nexport class SdTabActivated extends SdTabBase {}\n\nexport class SdTabDeactivated extends SdTabBase {}\n\nexport declare type SdTabEvent = SdTabActivated | SdTabDeactivated;\n","import { Injectable, Type } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SdTabAction } from '../actions/tab-router.action';\r\nimport { SdTabComponentBuilder } from '../decorators/tab.decorator';\r\nimport { SdTabBase, SdTabEvent } from '../events/tab-router.event';\r\nimport { SdTab } from '../models/tab-router.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdTabRouterService {\r\n events = new BehaviorSubject<SdTabEvent>(new SdTabBase(undefined));\r\n actions = new BehaviorSubject<SdTabAction | undefined>(undefined);\r\n builders = new BehaviorSubject<SdTabComponentBuilder[]>([]);\r\n currentTabChanges = new BehaviorSubject<SdTab | undefined>(undefined);\r\n newTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n updateTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n #currentTab: SdTab | undefined = undefined;\r\n #componentBuilders: SdTabComponentBuilder[] = [];\r\n constructor() {}\r\n\r\n addBuilder = (builder: SdTabComponentBuilder) => {\r\n if (!this.#componentBuilders.some(e => e.component === builder.component)) {\r\n this.#componentBuilders.push(builder);\r\n this.builders.next(this.#componentBuilders);\r\n }\r\n };\r\n\r\n get currentTab() {\r\n return this.#currentTab;\r\n }\r\n\r\n get currentKey() {\r\n return this.#currentTab?.key || null;\r\n }\r\n\r\n // select = (tabOrKey: string | SdTab): void => {\r\n // const tab = this.#tabs.find(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key === tabOrKey;\r\n // }\r\n // return e.key === tabOrKey?.key;\r\n // });\r\n // if (tab) {\r\n // this.#currentTab = tab;\r\n // }\r\n // }\r\n\r\n // add = (tab: SdTab): void => {\r\n // if (!tab.key) {\r\n // this.notifyService.notify.warning('Tab key is required');\r\n // }\r\n // if (!tab.component) {\r\n // this.notifyService.notify.warning('Tab component is required');\r\n // }\r\n // const existedTab = this.#tabs.find(e => e.key === tab.key);\r\n // if (!existedTab) {\r\n // this.#tabs.push(tab);\r\n // this.select(tab);\r\n // } else {\r\n // this.select(existedTab);\r\n // }\r\n // }\r\n\r\n // remove = (tabOrKey: string | SdTab): void => {\r\n // this.#tabs = this.#tabs.filter(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key !== tabOrKey;\r\n // }\r\n // return e.key !== tabOrKey?.key;\r\n // });\r\n // }\r\n\r\n setCurrentTab = (tab: SdTab): void => {\r\n this.#currentTab = tab;\r\n this.currentTabChanges.next(tab);\r\n };\r\n\r\n pushEvent = (tab: SdTab, Event: Type<SdTabEvent>) => {\r\n this.events.next(new Event(tab));\r\n };\r\n\r\n setOptions = () => {};\r\n\r\n close = (tab?: SdTab) => {\r\n tab = tab || this.#currentTab;\r\n if (tab) {\r\n this.actions.next({\r\n type: 'close',\r\n tab,\r\n });\r\n }\r\n };\r\n\r\n // Gọi hàm này để thực hiện update tab\r\n updateTab = (tab: SdTab) => {};\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTab, SdTabInfo } from '../models/tab-router.model';\nimport { SdTabRouterService } from '../services/tab-router.service';\n@Pipe({\n name: 'sdTabInfo',\n standalone: true,\n})\nexport class SdTabInfoPipe implements PipeTransform {\n constructor(private tabRouterService: SdTabRouterService) {}\n transform(tabInfo: SdTabInfo | undefined | null, tab: SdTab): SdTabInfo {\n if (tabInfo) {\n return tabInfo;\n }\n const builders = this.tabRouterService.builders.getValue();\n const builder = builders.find(e => e.component === tab.component);\n if (builder) {\n const { url, params, queryParams, data } = tab;\n return {\n name: typeof builder.name === 'function' ? builder.name({ url, params, queryParams, data }) : builder.name,\n icon: typeof builder.icon === 'function' ? builder.icon({ url, params, queryParams }) : builder.icon,\n tooltip: typeof builder.tooltip === 'function' ? builder.tooltip({ url, params, queryParams }) : builder.tooltip,\n color: typeof builder.color === 'function' ? builder.color({ url, params, queryParams }) : builder.color,\n };\n }\n return {\n name: tab.url,\n icon: undefined,\n };\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, startWith } from 'rxjs/operators';\r\n\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SdBadge } from '@sd-angular/core/components/badge';\r\nimport { SdTab, SdTabInfo } from '../../models';\r\nimport { SdTabRouterService } from '../../services/tab-router.service';\r\nimport { Router } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SdTabInfoPipe } from '../../pipes/tab-info.pipe';\r\n\r\n@Component({\r\n selector: 'sd-tab-router-item',\r\n templateUrl: './tab-router-item.component.html',\r\n styleUrls: ['./tab-router-item.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, SdBadge, SdTabInfoPipe],\r\n})\r\nexport class SdTabRouterItemComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) tab!: SdTab;\r\n\r\n #subsctiption: Subscription = new Subscription();\r\n tabInfo?: SdTabInfo;\r\n constructor(\r\n private cdRef: ChangeDetectorRef,\r\n private tabRouterService: SdTabRouterService,\r\n private router: Router\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.#subsctiption.add(\r\n this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {\r\n this.cdRef.markForCheck();\r\n })\r\n );\r\n\r\n this.#subsctiption.add(\r\n this.tab.tabInfoChanges.pipe(startWith(null)).subscribe(tabInfo => {\r\n if (tabInfo) {\r\n this.tabInfo = tabInfo;\r\n this.cdRef.markForCheck();\r\n }\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.#subsctiption.unsubscribe();\r\n }\r\n\r\n onTabClick = (event: Event) => {\r\n event.preventDefault();\r\n this.router.navigate([this.tab.url], {\r\n queryParams: this.tab.queryParams,\r\n state: { switchTab: true },\r\n });\r\n };\r\n\r\n close = (event: Event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.#closeTab();\r\n };\r\n\r\n onMousedown = (event: MouseEvent) => {\r\n if (event.button === 1) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n onMouseup = (event: MouseEvent) => {\r\n if (event.button === 1) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.#closeTab();\r\n }\r\n };\r\n\r\n #closeTab = async () => {\r\n if (this.tab?.beforeClose) {\r\n //\r\n if (this.tab?.beforeClose()) {\r\n const result = this.tab?.beforeClose();\r\n if (typeof result === 'boolean') {\r\n if (result) {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n } else {\r\n if (await result) {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n }\r\n }\r\n } else {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n };\r\n}\r\n","<a\r\n [href]=\"[tab.url]\"\r\n class=\"tab-router__item d-flex align-items-center gap-8\"\r\n [class.tab-router__item--active]=\"tab.isActive\"\r\n (click)=\"onTabClick($event)\"\r\n (mousedown)=\"onMousedown($event)\"\r\n (mouseup)=\"onMouseup($event)\">\r\n @let info = tabInfo | sdTabInfo: tab;\r\n @if (info) {\r\n <sd-badge\r\n style=\"overflow: hidden;white-space: nowrap;\"\r\n [icon]=\"info.icon\"\r\n [title]=\"info.icon\"\r\n [tooltip]=\"info.tooltip || info.name\"\r\n [title]=\"info.name\"\r\n [color]=\"info.color\"\r\n (click)=\"onTabClick($event)\"></sd-badge>\r\n <button\r\n aria-hidden=\"true\"\r\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\r\n (click)=\"close($event)\"\r\n (mousedown)=\"$event.stopPropagation()\">\r\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\r\n </button>\r\n }\r\n</a>\r\n","import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, Input, ViewChild } from '@angular/core';\n\nimport { SdTab } from '../../models/tab-router.model';\nimport { SdTabRouterItemComponent } from '../tab-router-item/tab-router-item.component';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'sd-tab-router-nav',\n templateUrl: './tab-router-nav.component.html',\n styleUrls: ['./tab-router-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, DragDropModule, SdTabRouterItemComponent],\n})\nexport class SdTabRouterNavComponent {\n @ViewChild('tabRouterNav') tabRouterNav?: ElementRef;\n\n @Input() tabs: SdTab[] = [];\n mode: 'default' | 'compact' = 'default';\n\n constructor(\n private cdRef: ChangeDetectorRef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public elementRef: ElementRef<any>\n ) {}\n\n @HostListener('window:resize', ['$event'])\n onResize(): void {\n this.checkUI();\n }\n\n checkUI = () => {\n const width = this.tabRouterNav?.nativeElement.clientWidth;\n const nameWidth = (width - this.tabs!.length * 68) / this.tabs!.length;\n if (nameWidth <= 20) {\n this.mode = 'compact';\n } else {\n this.mode = 'default';\n }\n this.cdRef.markForCheck();\n };\n\n onDrop = (event: CdkDragDrop<SdTab[]>) => {\n moveItemInArray(this.tabs!, event.previousIndex, event.currentIndex);\n };\n}\n","<div\n #tabRouterNav\n cdkDropList\n cdkDropListLockAxis=\"x\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onDrop($event)\"\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\n [class.d-none]=\"tabs.length > 1\">\n <ng-container *ngFor=\"let tab of tabs\">\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef?.nativeElement\"></sd-tab-router-item>\n </ng-container>\n</div>\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SdTabRouterService } from './tab-router.service';\n@Injectable({\n providedIn: 'root',\n})\nexport class SdTabDecoratorService {\n static tabRouterService = new BehaviorSubject<SdTabRouterService | undefined>(undefined);\n constructor(tabRouterService: SdTabRouterService) {\n SdTabDecoratorService.tabRouterService.next(tabRouterService);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ChangeDetectorRef, Component, createNgModule, Injector, NgModuleRef, OnDestroy, Type, ViewChild } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Router, RouterEvent, RoutesRecognized } from '@angular/router';\nimport { SdTabActivated, SdTabDeactivated } from '../../events/tab-router.event';\n\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdNotifyService } from '@sd-angular/core/services/notify';\n// import hash from 'object-hash';\nimport { Subject, Subscription } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { SdTabAction } from '../../actions/tab-router.action';\nimport { SdTab } from '../../models';\nimport { SdTabDecoratorService } from '../../services/tab-decorator.service';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { SdTabRouterNavComponent } from '../tab-router-nav/tab-router-nav.component';\nimport { SdUtilities } from '@sd-angular/core/utilities';\n\n@Component({\n selector: 'sd-tab-router-outlet',\n templateUrl: './tab-router-outlet.component.html',\n styleUrls: ['./tab-router-outlet.component.scss'],\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule, SdTabRouterNavComponent],\n // changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTabRouterOutletComponent implements OnDestroy {\n @ViewChild('tabRouterNav') tabRouterNav?: SdTabRouterNavComponent;\n tabs: SdTab[] = [];\n\n #rootRoute?: ActivatedRoute;\n #subscription = new Subscription();\n #firstLoad = true;\n constructor(\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private cd: ChangeDetectorRef,\n private injector: Injector,\n private tabDecoratorService: SdTabDecoratorService, // KHÔNG XÓA\n private tabRouterService: SdTabRouterService,\n private sdNotifyService: SdNotifyService\n ) {\n this.#subscription.add(\n router.events\n .pipe(\n map((event: any) => (event instanceof RouterEvent ? event : event.routerEvent)),\n filter(event => {\n return event instanceof RoutesRecognized || event instanceof NavigationEnd;\n })\n )\n .subscribe(async (event: RoutesRecognized | NavigationEnd) => {\n if (this.#firstLoad && event instanceof NavigationEnd) {\n this.#firstLoad = false;\n const route = this.#getActivatedRouteSnapshot(this.activatedRoute.snapshot);\n this.#rootRoute = this.router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route);\n return;\n }\n if (!this.#firstLoad && event instanceof RoutesRecognized) {\n const route = this.#getActivatedRouteSnapshot(event.state.root);\n this.#rootRoute = this.router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route);\n }\n })\n );\n\n this.#subscription.add(\n tabRouterService.actions.subscribe((event: SdTabAction | undefined) => {\n if (event && event.type === 'close') {\n this.#closeTab(event.tab);\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n\n tabTrackBy = (index: number, tab: SdTab) => {\n return tab.key;\n };\n\n #closeTab = (tab: SdTab) => {\n const { isActive, key: activeKey } = tab;\n if (isActive) {\n const activeIndex = this.tabs.findIndex(({ key }) => key === activeKey);\n const nextTab = this.tabs[activeIndex + 1] || this.tabs[activeIndex - 1];\n if (nextTab) {\n const { url: nextUrl } = nextTab;\n const nextQueryParams = {\n ...(nextTab.queryParams || {}),\n };\n\n this.tabs = this.tabs.filter(({ key }) => key !== activeKey);\n this.router.navigate([nextUrl], {\n queryParams: nextQueryParams,\n state: {\n switchTab: true,\n },\n });\n } else {\n this.tabs = this.tabs.filter(({ key }) => key !== activeKey);\n this.router.navigateByUrl('/', {\n state: {\n switchTab: true,\n },\n });\n }\n } else {\n this.tabs = this.tabs.filter(({ key }) => key !== tab.key);\n this.tabRouterNav?.checkUI();\n this.cd.markForCheck();\n }\n };\n\n #activeRoute = async (fullUrl: string, route: ActivatedRouteSnapshot | null) => {\n if (!route?.component) {\n return;\n }\n const component = route.component as Type<any>;\n const queryParams = {\n ...(route.queryParams || {}),\n };\n const params = {\n ...(route.params || {}),\n };\n const data = {\n ...(route.data || {}),\n };\n\n const [url] = fullUrl.split('?');\n const key = SdUtilities.hash({ url, queryParams });\n let existedIndex = -1;\n let activatedIndex = -1;\n this.tabs.forEach((tab: SdTab, index: number) => {\n if (tab.key === key) {\n tab.isActive = true;\n existedIndex = index;\n } else {\n if (tab.isActive) {\n activatedIndex = index;\n this.tabRouterService.pushEvent(tab, SdTabDeactivated);\n }\n tab.isActive = false;\n }\n });\n\n const currentNavigation = this.router.getCurrentNavigation();\n // Switch tab sẽ ko re-render lại trang\n const switchTab = currentNavigation?.extras?.state?.['switchTab'];\n // Replace tab sẽ close trang hiện tại\n const replaceTab = currentNavigation?.extras?.state?.['replaceTab'];\n if (existedIndex >= 0) {\n const existedTab = this.tabs[existedIndex];\n if (replaceTab && activatedIndex >= 0) {\n if (activatedIndex >= 0) {\n this.tabs.splice(activatedIndex, 1);\n }\n }\n if (switchTab) {\n this.tabRouterService.setCurrentTab(existedTab);\n this.tabRouterService.pushEvent(existedTab, SdTabActivated);\n } else {\n if (typeof route?.parent?.routeConfig?.loadChildren === 'function') {\n const module = (await route.parent.routeConfig.loadChildren()) as Type<any>;\n const moduleRef = createNgModule(module, this.injector);\n const activatedRoute = this.#getActivatedRoute(this.#rootRoute!, component);\n const tab: SdTab = {\n key,\n component,\n injector: new SdOutletInjector(activatedRoute, moduleRef),\n isActive: true,\n url,\n params,\n queryParams,\n data,\n tabInfoChanges: new Subject(),\n };\n this.tabs[this.tabs.indexOf(existedTab)] = tab;\n }\n }\n } else {\n if (typeof route?.parent?.routeConfig?.loadChildren === 'function') {\n const module = (await route.parent.routeConfig.loadChildren()) as Type<any>;\n const moduleRef = createNgModule(module, this.injector);\n const activatedRoute = this.#getActivatedRoute(this.#rootRoute!, component);\n\n const tab: SdTab = {\n key,\n component,\n injector: new SdOutletInjector(activatedRoute, moduleRef),\n isActive: true,\n url,\n params,\n queryParams,\n data,\n tabInfoChanges: new Subject(),\n };\n\n this.tabRouterService.setCurrentTab(tab);\n if (activatedIndex >= 0 && replaceTab) {\n this.tabs.splice(activatedIndex, 1);\n }\n this.tabs.push(tab);\n // if (existedIndex >= 0 && !switchTab) {\n // this.tabs[existedIndex] = tab;\n // } else {\n // this.tabs.push(tab);\n // }\n }\n\n this.tabRouterNav?.checkUI();\n if (this.tabs.length > 10) {\n this.sdNotifyService.warning('Bạn đã mở quá nhiều tab. Vui lòng tắt các tab không dùng để hệ thống hoạt động tốt hơn.');\n }\n // if (this.tabs.length > 15) {\n // this.tabs.splice(0, this.tabs.length - 10);\n // }\n }\n // if (existedIndex >= 0 && switchTab) {\n // const existedTab = this.tabs[existedIndex];\n // this.tabRouterService.setCurrentTab(existedTab);\n // this.tabRouterService.pushEvent(existedTab, SdTabActivated);\n // } else {\n // if (typeof route?.parent?.routeConfig?.loadChildren === 'function') {\n // const module = await route.parent.routeConfig.loadChildren();\n // const factory = await this.compiler.compileModuleAsync(module);\n // const injector = factory.create(this.injector);\n // const activatedRoute = this.#getActivatedRoute(\n // this.#rootRoute,\n // component\n // );\n\n // const tab = {\n // key,\n // component,\n // injector: new SdOutletInjector(activatedRoute, injector),\n // isActive: true,\n // name: url,\n // url,\n // params,\n // queryParams,\n // data\n // };\n\n // this.tabRouterService.setCurrentTab(tab);\n // if (activatedIndex >= 0 && replaceTab) {\n // this.tabs.splice(activatedIndex, 1);\n // }\n // if (existedIndex >= 0 && !switchTab) {\n // this.tabs[existedIndex] = tab;\n // } else {\n // this.tabs.push(tab);\n // }\n // }\n\n // this.tabRouterNav?.checkUI();\n // if (this.tabs.length > 10) {\n // this.sdNotifyService.notify.warning(\n // 'Bạn đã mở quá nhiều tab. Vui lòng tắt các tab không dùng để hệ thống hoạt động tốt hơn.'\n // );\n // }\n // if (this.tabs.length > 15) {\n // this.tabs.splice(0, this.tabs.length - 10);\n // }\n // }\n this.cd.markForCheck();\n };\n\n #getActivatedRouteSnapshot = (activatedRouteSnapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot | null => {\n if (!activatedRouteSnapshot) {\n return null;\n }\n while (activatedRouteSnapshot.firstChild) {\n activatedRouteSnapshot = activatedRouteSnapshot.firstChild;\n }\n return activatedRouteSnapshot;\n };\n\n #getActivatedRoute = (activatedRoute: ActivatedRoute, component: any): ActivatedRoute | null => {\n if (!activatedRoute) {\n return null;\n }\n\n if (activatedRoute.component && activatedRoute.component === component) {\n return activatedRoute;\n }\n while (activatedRoute.firstChild) {\n activatedRoute = activatedRoute.firstChild;\n if (activatedRoute.component && activatedRoute.component === component) {\n return activatedRoute;\n }\n }\n return null;\n };\n}\n\nclass SdOutletInjector implements Injector {\n constructor(\n private route: ActivatedRoute | null,\n // private childContexts: ChildrenOutletContexts,\n private parent: NgModuleRef<Injector>\n ) {}\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute && this.route) {\n return this.route;\n }\n\n // if (token === ChildrenOutletContexts) {\n // return this.childContexts;\n // }\n\n return this.parent.injector.get(token, notFoundValue);\n }\n}\n","<sd-tab-router-nav [tabs]=\"tabs\" #tabRouterNav></sd-tab-router-nav>\n\n<div class=\"tab-router__list\">\n <ng-container *ngFor=\"let tab of tabs; trackBy: tabTrackBy\">\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\n <div class=\"tab-router__content\">\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </div>\n </div>\n </ng-container>\n</div>\n","import { Type } from '@angular/core';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { SdTabDecoratorService } from '../services/tab-decorator.service';\r\n\r\nexport interface SdTabComponentArgs {\r\n url?: string;\r\n params?: any;\r\n queryParams?: any;\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport declare interface SdTabComponentBuilder {\r\n component: Type<any>;\r\n name: string | ((args: SdTabComponentArgs) => string);\r\n icon?: string | ((args: SdTabComponentArgs) => string);\r\n tooltip?: string | ((args: SdTabComponentArgs) => string);\r\n color?: SdColor | ((args: SdTabComponentArgs) => SdColor);\r\n}\r\n\r\nexport function SdTabComponent<T>(builder: SdTabComponentBuilder) {\r\n return (constructor: T) => {\r\n SdTabDecoratorService.tabRouterService\r\n .pipe(\r\n filter(service => service !== undefined && service !== null),\r\n take(1)\r\n )\r\n .subscribe(service => {\r\n service.addBuilder(builder);\r\n });\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdTabRouterService","i2","i1","i2.SdTabDecoratorService","i3.SdTabRouterService"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export * from '@sd-angular/core/components/import-excel';
|
|
|
16
16
|
export * from '@sd-angular/core/components/document-builder';
|
|
17
17
|
export * from '@sd-angular/core/components/mini-editor';
|
|
18
18
|
export * from '@sd-angular/core/components/view';
|
|
19
|
+
export * from '@sd-angular/core/components/code-editor';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
|
|
@@ -58,7 +58,7 @@ export declare class SdSelect implements OnInit, AfterViewInit, OnDestroy {
|
|
|
58
58
|
calculatedPanelWidth: import("@angular/core").WritableSignal<string | number>;
|
|
59
59
|
normalizedValue: import("@angular/core").Signal<string | number | boolean | (string | number | boolean)[] | null | undefined>;
|
|
60
60
|
filtered: import("@angular/core").Signal<boolean>;
|
|
61
|
-
delayTime: import("@angular/core").Signal<
|
|
61
|
+
delayTime: import("@angular/core").Signal<0 | 500>;
|
|
62
62
|
itemValue: (item: any) => any;
|
|
63
63
|
itemDisplay: (item: any) => any;
|
|
64
64
|
itemDisabled: (item: any) => boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sd-angular/core",
|
|
3
|
-
"version": "19.0.0-beta.
|
|
3
|
+
"version": "19.0.0-beta.47",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
6
6
|
"@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"mammoth": "^1.11.0",
|
|
17
17
|
"moment": "^2.30.1",
|
|
18
18
|
"keycloak-js": "^26.0.0",
|
|
19
|
+
"prismjs": "^1.30.0",
|
|
19
20
|
"tslib": "^2.8.0"
|
|
20
21
|
},
|
|
21
22
|
"sideEffects": false,
|
|
@@ -29,6 +30,10 @@
|
|
|
29
30
|
"types": "./index.d.ts",
|
|
30
31
|
"default": "./fesm2022/sd-angular-core.mjs"
|
|
31
32
|
},
|
|
33
|
+
"./directives": {
|
|
34
|
+
"types": "./directives/index.d.ts",
|
|
35
|
+
"default": "./fesm2022/sd-angular-core-directives.mjs"
|
|
36
|
+
},
|
|
32
37
|
"./components": {
|
|
33
38
|
"types": "./components/index.d.ts",
|
|
34
39
|
"default": "./fesm2022/sd-angular-core-components.mjs"
|
|
@@ -37,10 +42,6 @@
|
|
|
37
42
|
"types": "./configurations/index.d.ts",
|
|
38
43
|
"default": "./fesm2022/sd-angular-core-configurations.mjs"
|
|
39
44
|
},
|
|
40
|
-
"./directives": {
|
|
41
|
-
"types": "./directives/index.d.ts",
|
|
42
|
-
"default": "./fesm2022/sd-angular-core-directives.mjs"
|
|
43
|
-
},
|
|
44
45
|
"./forms": {
|
|
45
46
|
"types": "./forms/index.d.ts",
|
|
46
47
|
"default": "./fesm2022/sd-angular-core-forms.mjs"
|
|
@@ -77,25 +78,29 @@
|
|
|
77
78
|
"types": "./components/anchor/index.d.ts",
|
|
78
79
|
"default": "./fesm2022/sd-angular-core-components-anchor.mjs"
|
|
79
80
|
},
|
|
80
|
-
"./components/
|
|
81
|
-
"types": "./components/
|
|
82
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
81
|
+
"./components/badge": {
|
|
82
|
+
"types": "./components/badge/index.d.ts",
|
|
83
|
+
"default": "./fesm2022/sd-angular-core-components-badge.mjs"
|
|
83
84
|
},
|
|
84
85
|
"./components/avatar": {
|
|
85
86
|
"types": "./components/avatar/index.d.ts",
|
|
86
87
|
"default": "./fesm2022/sd-angular-core-components-avatar.mjs"
|
|
87
88
|
},
|
|
88
|
-
"./components/
|
|
89
|
-
"types": "./components/
|
|
90
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
89
|
+
"./components/anchor-v2": {
|
|
90
|
+
"types": "./components/anchor-v2/index.d.ts",
|
|
91
|
+
"default": "./fesm2022/sd-angular-core-components-anchor-v2.mjs"
|
|
92
|
+
},
|
|
93
|
+
"./components/button": {
|
|
94
|
+
"types": "./components/button/index.d.ts",
|
|
95
|
+
"default": "./fesm2022/sd-angular-core-components-button.mjs"
|
|
91
96
|
},
|
|
92
97
|
"./components/base": {
|
|
93
98
|
"types": "./components/base/index.d.ts",
|
|
94
99
|
"default": "./fesm2022/sd-angular-core-components-base.mjs"
|
|
95
100
|
},
|
|
96
|
-
"./components/
|
|
97
|
-
"types": "./components/
|
|
98
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
101
|
+
"./components/code-editor": {
|
|
102
|
+
"types": "./components/code-editor/index.d.ts",
|
|
103
|
+
"default": "./fesm2022/sd-angular-core-components-code-editor.mjs"
|
|
99
104
|
},
|
|
100
105
|
"./components/document-builder": {
|
|
101
106
|
"types": "./components/document-builder/index.d.ts",
|
|
@@ -117,14 +122,14 @@
|
|
|
117
122
|
"types": "./components/modal/index.d.ts",
|
|
118
123
|
"default": "./fesm2022/sd-angular-core-components-modal.mjs"
|
|
119
124
|
},
|
|
120
|
-
"./components/query-builder": {
|
|
121
|
-
"types": "./components/query-builder/index.d.ts",
|
|
122
|
-
"default": "./fesm2022/sd-angular-core-components-query-builder.mjs"
|
|
123
|
-
},
|
|
124
125
|
"./components/preview": {
|
|
125
126
|
"types": "./components/preview/index.d.ts",
|
|
126
127
|
"default": "./fesm2022/sd-angular-core-components-preview.mjs"
|
|
127
128
|
},
|
|
129
|
+
"./components/query-builder": {
|
|
130
|
+
"types": "./components/query-builder/index.d.ts",
|
|
131
|
+
"default": "./fesm2022/sd-angular-core-components-query-builder.mjs"
|
|
132
|
+
},
|
|
128
133
|
"./components/quick-action": {
|
|
129
134
|
"types": "./components/quick-action/index.d.ts",
|
|
130
135
|
"default": "./fesm2022/sd-angular-core-components-quick-action.mjs"
|
|
@@ -145,10 +150,6 @@
|
|
|
145
150
|
"types": "./components/table/index.d.ts",
|
|
146
151
|
"default": "./fesm2022/sd-angular-core-components-table.mjs"
|
|
147
152
|
},
|
|
148
|
-
"./components/upload-file": {
|
|
149
|
-
"types": "./components/upload-file/index.d.ts",
|
|
150
|
-
"default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
|
|
151
|
-
},
|
|
152
153
|
"./components/view": {
|
|
153
154
|
"types": "./components/view/index.d.ts",
|
|
154
155
|
"default": "./fesm2022/sd-angular-core-components-view.mjs"
|
|
@@ -165,6 +166,10 @@
|
|
|
165
166
|
"types": "./forms/chip/index.d.ts",
|
|
166
167
|
"default": "./fesm2022/sd-angular-core-forms-chip.mjs"
|
|
167
168
|
},
|
|
169
|
+
"./components/upload-file": {
|
|
170
|
+
"types": "./components/upload-file/index.d.ts",
|
|
171
|
+
"default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
|
|
172
|
+
},
|
|
168
173
|
"./forms/chip-calendar": {
|
|
169
174
|
"types": "./forms/chip-calendar/index.d.ts",
|
|
170
175
|
"default": "./fesm2022/sd-angular-core-forms-chip-calendar.mjs"
|
|
@@ -193,30 +198,30 @@
|
|
|
193
198
|
"types": "./forms/input-number/index.d.ts",
|
|
194
199
|
"default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
|
|
195
200
|
},
|
|
196
|
-
"./forms/models": {
|
|
197
|
-
"types": "./forms/models/index.d.ts",
|
|
198
|
-
"default": "./fesm2022/sd-angular-core-forms-models.mjs"
|
|
199
|
-
},
|
|
200
201
|
"./forms/label": {
|
|
201
202
|
"types": "./forms/label/index.d.ts",
|
|
202
203
|
"default": "./fesm2022/sd-angular-core-forms-label.mjs"
|
|
203
204
|
},
|
|
204
|
-
"./forms/
|
|
205
|
-
"types": "./forms/
|
|
206
|
-
"default": "./fesm2022/sd-angular-core-forms-
|
|
205
|
+
"./forms/models": {
|
|
206
|
+
"types": "./forms/models/index.d.ts",
|
|
207
|
+
"default": "./fesm2022/sd-angular-core-forms-models.mjs"
|
|
207
208
|
},
|
|
208
209
|
"./forms/radio": {
|
|
209
210
|
"types": "./forms/radio/index.d.ts",
|
|
210
211
|
"default": "./fesm2022/sd-angular-core-forms-radio.mjs"
|
|
211
212
|
},
|
|
212
|
-
"./forms/
|
|
213
|
-
"types": "./forms/
|
|
214
|
-
"default": "./fesm2022/sd-angular-core-forms-
|
|
213
|
+
"./forms/select": {
|
|
214
|
+
"types": "./forms/select/index.d.ts",
|
|
215
|
+
"default": "./fesm2022/sd-angular-core-forms-select.mjs"
|
|
215
216
|
},
|
|
216
217
|
"./forms/textarea": {
|
|
217
218
|
"types": "./forms/textarea/index.d.ts",
|
|
218
219
|
"default": "./fesm2022/sd-angular-core-forms-textarea.mjs"
|
|
219
220
|
},
|
|
221
|
+
"./forms/switch": {
|
|
222
|
+
"types": "./forms/switch/index.d.ts",
|
|
223
|
+
"default": "./fesm2022/sd-angular-core-forms-switch.mjs"
|
|
224
|
+
},
|
|
220
225
|
"./guards/permission": {
|
|
221
226
|
"types": "./guards/permission/index.d.ts",
|
|
222
227
|
"default": "./fesm2022/sd-angular-core-guards-permission.mjs"
|
|
@@ -249,14 +254,14 @@
|
|
|
249
254
|
"types": "./services/confirm/index.d.ts",
|
|
250
255
|
"default": "./fesm2022/sd-angular-core-services-confirm.mjs"
|
|
251
256
|
},
|
|
252
|
-
"./services/docx": {
|
|
253
|
-
"types": "./services/docx/index.d.ts",
|
|
254
|
-
"default": "./fesm2022/sd-angular-core-services-docx.mjs"
|
|
255
|
-
},
|
|
256
257
|
"./services/excel": {
|
|
257
258
|
"types": "./services/excel/index.d.ts",
|
|
258
259
|
"default": "./fesm2022/sd-angular-core-services-excel.mjs"
|
|
259
260
|
},
|
|
261
|
+
"./services/docx": {
|
|
262
|
+
"types": "./services/docx/index.d.ts",
|
|
263
|
+
"default": "./fesm2022/sd-angular-core-services-docx.mjs"
|
|
264
|
+
},
|
|
260
265
|
"./services/firebase": {
|
|
261
266
|
"types": "./services/firebase/index.d.ts",
|
|
262
267
|
"default": "./fesm2022/sd-angular-core-services-firebase.mjs"
|
|
Binary file
|
|
Binary file
|