@sd-angular/core 19.0.0-beta.57 → 19.0.0-beta.58
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/upload-file/src/configurations/upload-file.configuration.d.ts +1 -1
- package/components/upload-file/src/services/upload-file.service.d.ts +0 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs +34 -42
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/package.json +64 -64
- package/sd-angular-core-19.0.0-beta.58.tgz +0 -0
- package/sd-angular-core-19.0.0-beta.57.tgz +0 -0
|
@@ -4,7 +4,7 @@ export interface ISdUploadFileConfiguration<TArgs = any> {
|
|
|
4
4
|
details: SdUploadFileFuncDetails<TArgs>;
|
|
5
5
|
download?: SdUploadFileFuncDownload<TArgs>;
|
|
6
6
|
}
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const SD_UPLOAD_FILE_CONFIGURATION: InjectionToken<ISdUploadFileConfiguration<any>>;
|
|
8
8
|
export type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;
|
|
9
9
|
export type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;
|
|
10
10
|
export type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;
|
|
@@ -4,7 +4,7 @@ import * as i4 from '@angular/cdk/drag-drop';
|
|
|
4
4
|
import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
|
|
5
5
|
import * as i1 from '@angular/common';
|
|
6
6
|
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { NgForm, FormGroup
|
|
7
|
+
import { NgForm, FormGroup } from '@angular/forms';
|
|
8
8
|
import * as i2 from '@angular/material/button';
|
|
9
9
|
import { MatButtonModule } from '@angular/material/button';
|
|
10
10
|
import * as i3 from '@angular/material/icon';
|
|
@@ -21,7 +21,7 @@ import { SdButton } from '@sd-angular/core/components/button';
|
|
|
21
21
|
import { SdModal } from '@sd-angular/core/components/modal';
|
|
22
22
|
import { SdUtilities } from '@sd-angular/core/utilities';
|
|
23
23
|
|
|
24
|
-
const
|
|
24
|
+
const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken('sd.upload-file.configuration');
|
|
25
25
|
|
|
26
26
|
class PreviewComponent {
|
|
27
27
|
cd;
|
|
@@ -123,11 +123,8 @@ const IsImage = (extension) => {
|
|
|
123
123
|
return IMAGE_EXTENSIONS.includes(extension?.toLowerCase());
|
|
124
124
|
};
|
|
125
125
|
|
|
126
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
127
|
-
// import { sha1 } from 'object-hash';
|
|
128
126
|
class UploadFileService {
|
|
129
127
|
#cache = {};
|
|
130
|
-
constructor() { }
|
|
131
128
|
#hash = (file) => {
|
|
132
129
|
if (!file) {
|
|
133
130
|
return null;
|
|
@@ -174,7 +171,7 @@ class UploadFileService {
|
|
|
174
171
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: UploadFileService, decorators: [{
|
|
175
172
|
type: Injectable,
|
|
176
173
|
args: [{ providedIn: 'root' }]
|
|
177
|
-
}]
|
|
174
|
+
}] });
|
|
178
175
|
|
|
179
176
|
/* eslint-disable @angular-eslint/no-input-rename */
|
|
180
177
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
@@ -183,7 +180,7 @@ class SdUploadFile {
|
|
|
183
180
|
// ─── Injected Services ────────────────────────────────────────────────
|
|
184
181
|
#notifyService = inject(SdNotifyService);
|
|
185
182
|
#confirmService = inject(SdConfirmService);
|
|
186
|
-
#uploadFileConfig = inject(
|
|
183
|
+
#uploadFileConfig = inject(SD_UPLOAD_FILE_CONFIGURATION, { optional: true });
|
|
187
184
|
#uploadFileService = inject(UploadFileService);
|
|
188
185
|
#destroyRef = inject(DestroyRef);
|
|
189
186
|
// ─── Internal State ───────────────────────────────────────────────────
|
|
@@ -193,7 +190,6 @@ class SdUploadFile {
|
|
|
193
190
|
#canvas2 = `C${uuid.v4()}`;
|
|
194
191
|
#name = uuid.v4();
|
|
195
192
|
#formGroup;
|
|
196
|
-
#currentDropContainer;
|
|
197
193
|
formControl = new SdFormControl();
|
|
198
194
|
// ─── Signals (state) ──────────────────────────────────────────────────
|
|
199
195
|
previewFiles = signal([]);
|
|
@@ -336,7 +332,6 @@ class SdUploadFile {
|
|
|
336
332
|
}
|
|
337
333
|
}
|
|
338
334
|
#bindDropEvents(dropContainer) {
|
|
339
|
-
this.#currentDropContainer = dropContainer;
|
|
340
335
|
dropContainer.addEventListener('dragover', (evt) => {
|
|
341
336
|
evt.preventDefault();
|
|
342
337
|
dropContainer.style.opacity = 0.9;
|
|
@@ -365,18 +360,18 @@ class SdUploadFile {
|
|
|
365
360
|
this.formControl.markAsTouched();
|
|
366
361
|
this.formControl.setValue(this.model() || []);
|
|
367
362
|
};
|
|
368
|
-
#updateValidator = () => {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
};
|
|
363
|
+
// #updateValidator = () => {
|
|
364
|
+
// this.formControl.clearValidators();
|
|
365
|
+
// this.formControl.clearAsyncValidators();
|
|
366
|
+
// const validators: ValidatorFn[] = [];
|
|
367
|
+
// const asyncValidators: AsyncValidatorFn[] = [];
|
|
368
|
+
// if (this.required()) {
|
|
369
|
+
// validators.push(Validators.required);
|
|
370
|
+
// }
|
|
371
|
+
// this.formControl.setValidators(validators);
|
|
372
|
+
// this.formControl.setAsyncValidators(asyncValidators);
|
|
373
|
+
// this.formControl.updateValueAndValidity();
|
|
374
|
+
// };
|
|
380
375
|
#validate = async (file) => {
|
|
381
376
|
if (this.type() === 'image') {
|
|
382
377
|
if (file.type.split('/')[0] !== 'image') {
|
|
@@ -616,12 +611,17 @@ class SdUploadFile {
|
|
|
616
611
|
const uploadedFiles = items.map(e => e?.file).filter(file => !!file);
|
|
617
612
|
let idOrKeys = [];
|
|
618
613
|
if (uploadedFiles.length) {
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
614
|
+
if (this.#uploadFileConfig) {
|
|
615
|
+
idOrKeys = await this.#uploadFileConfig.upload(uploadedFiles, this.args()).then(results => {
|
|
616
|
+
for (const uploadedFile of uploadedFiles) {
|
|
617
|
+
this.#uploadFileService.remove(uploadedFile);
|
|
618
|
+
}
|
|
619
|
+
return results;
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
this.#notifyService.error(`Vui lòng inject SD_UPLOAD_FILE_CONFIGURATION`);
|
|
624
|
+
}
|
|
625
625
|
}
|
|
626
626
|
let idx = 0;
|
|
627
627
|
for (const item of items) {
|
|
@@ -679,20 +679,12 @@ class SdUploadFile {
|
|
|
679
679
|
}
|
|
680
680
|
const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key));
|
|
681
681
|
let detailsList = [];
|
|
682
|
-
const
|
|
683
|
-
if (idOrKeys.length) {
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
});
|
|
689
|
-
}
|
|
690
|
-
else if (this.#uploadFileConfig.details) {
|
|
691
|
-
detailsList = await this.#uploadFileConfig.details(idOrKeys, this.args()).catch(error => {
|
|
692
|
-
console.error(error);
|
|
693
|
-
return [];
|
|
694
|
-
});
|
|
695
|
-
}
|
|
682
|
+
const details = this.details() || this.#uploadFileConfig?.details;
|
|
683
|
+
if (idOrKeys.length && details) {
|
|
684
|
+
detailsList = await details(idOrKeys, this.args()).catch(error => {
|
|
685
|
+
console.error(error);
|
|
686
|
+
return [];
|
|
687
|
+
});
|
|
696
688
|
}
|
|
697
689
|
const results = [];
|
|
698
690
|
for (const key of keys.filter(val => !!val)) {
|
|
@@ -808,5 +800,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
|
|
|
808
800
|
* Generated bundle index. Do not edit.
|
|
809
801
|
*/
|
|
810
802
|
|
|
811
|
-
export {
|
|
803
|
+
export { SD_UPLOAD_FILE_CONFIGURATION, SdUploadFile };
|
|
812
804
|
//# sourceMappingURL=sd-angular-core-components-upload-file.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-upload-file.mjs","sources":["../../../projects/sd-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sd-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sd-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.html","../../../projects/sd-angular/components/upload-file/sd-angular-core-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface ISdUploadFileConfiguration<TArgs = any> {\r\n upload: SdUploadFileFuncUpload<TArgs>;\r\n details: SdUploadFileFuncDetails<TArgs>;\r\n download?: SdUploadFileFuncDownload<TArgs>;\r\n}\r\n\r\nexport const SD_UPLOAD_FILE_CONFIG = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\r\n\r\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\r\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\r\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\r\n\r\nexport interface SdUploadFileDetail {\r\n idOrKey: string;\r\n cdn: string; // Đường dẫn file\r\n name?: string; // Tên file nếu có\r\n extension?: string; // png, jpg\r\n size?: number; // Dung lượng file theo đơn vị Mb\r\n}\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output, ViewChild } from '@angular/core';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdModal } from '@sd-angular/core/components/modal';\r\nimport { PreviewFile } from '../../services';\r\nimport { MatIcon } from \"@angular/material/icon\";\r\n\r\n@Component({\r\n selector: 'preview',\r\n templateUrl: './preview.component.html',\r\n styleUrl: './preview.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [SdModal, SdButton, CommonModule, MatIcon],\r\n})\r\nexport class PreviewComponent {\r\n @ViewChild(SdModal) modal!: SdModal;\r\n @Output() download = new EventEmitter<PreviewFile>();\r\n @Output() close = new EventEmitter<void>();\r\n\r\n title: string = 'Xem ảnh';\r\n thumbnailPosition: 'right' | 'left' | 'bottom' | 'top' = 'right';\r\n activeIndex = 0;\r\n previewFiles: PreviewFile[] = [];\r\n constructor(private cd: ChangeDetectorRef) {}\r\n\r\n // Nên sử dụng urlOrFiles ở tham số khi open thay vì dùng @Input để component sử dụng sẽ chỉ cần map ở hàm khi gọi open thay vì phải mất công map mọi lúc để binding vào @Input\r\n open = async (previewFiles: PreviewFile[] | undefined | null, index?: number) => {\r\n if (!Array.isArray(previewFiles) || previewFiles.length === 0) {\r\n return;\r\n }\r\n this.previewFiles = previewFiles;\r\n this.activeIndex = index || 0;\r\n this.modal?.open();\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClickThumbnailImage = (index: number) => {\r\n this.activeIndex = index;\r\n this.cd.markForCheck();\r\n };\r\n\r\n updateCurrentImage = (direction: 1 | -1) => {\r\n this.activeIndex = (this.activeIndex + direction + this.previewFiles.length) % this.previewFiles.length;\r\n this.#scrollView(this.activeIndex, direction === 1 ? 'start' : 'end');\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClose = () => {\r\n this.close.emit();\r\n };\r\n\r\n #scrollView = (index: number, type?: 'center' | 'end' | 'nearest' | 'start') => {\r\n const nameId: string = 'thumbnailImage' + index;\r\n const element = document.getElementById(nameId);\r\n if (!element) {\r\n return;\r\n }\r\n const blockType: ScrollLogicalPosition = type || 'start';\r\n element.scrollIntoView({ behavior: 'smooth', block: blockType });\r\n };\r\n\r\n onDownload = (previewFile: PreviewFile) => {\r\n this.download.emit(previewFile);\r\n this.cd.markForCheck();\r\n };\r\n}\r\n","<sd-modal [title]=\"title\" (sdClosed)=\"close.emit()\" #modal>\r\n <div class=\"p-16\" style=\"overflow: hidden; height: 100%\">\r\n <div style=\"gap: 8px\" class=\"image-gallery\">\r\n <div class=\"thumbnail-container\">\r\n @for (file of previewFiles; track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n class=\"thumbnail-wrapper\"\r\n [class.c-img-error]=\"file.isImgError\"\r\n (click)=\"onClickThumbnailImage(i)\"\r\n [ngStyle]=\"{\r\n border: activeIndex === i ? '2px solid #2962ff' : 'none'\r\n }\">\r\n @if(file.isImgError) {\r\n <img fill alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else if (file.isPreviewImage && (file.previewSrc || file.src)) {\r\n <img fill [src]=\"file.previewSrc || file.src\" alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else {\r\n <img\r\n class=\"thumbnail-img file\"\r\n [class]=\"{\r\n png: file.extension === 'png',\r\n jpg: file.extension === 'jpg',\r\n pdf: file.extension === 'pdf',\r\n doc: file.extension === 'doc',\r\n docx: file.extension === 'docx',\r\n xls: file.extension === 'xls',\r\n xlsx: file.extension === 'xlsx',\r\n ppt: file.extension === 'ppt',\r\n pptx: file.extension === 'pptx',\r\n csv: file.extension === 'csv',\r\n psd: file.extension === 'psd',\r\n xml: file.extension === 'xml',\r\n zip: file.extension === 'zip'\r\n }\"\r\n alt=\"thumbnail\" />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div class=\"main-image-container\" #mainImage>\r\n @let selectedFile = previewFiles[activeIndex];\r\n @if(selectedFile) {\r\n @if(selectedFile.isImgError) {\r\n <div class=\"c-img-error\">\r\n <mat-icon>warning_amber</mat-icon>\r\n <div class=\"T14R\">Có lỗi xảy ra</div>\r\n </div>\r\n } @else if (selectedFile.isPreviewImage && (selectedFile.previewSrc || selectedFile.src)) {\r\n <img fill priority [src]=\"selectedFile.previewSrc || selectedFile.src\" class=\"main-image\" alt=\"Main display image\" />\r\n } @else {\r\n <img\r\n class=\"main-document file\"\r\n [class]=\"{\r\n png: selectedFile.extension === 'png',\r\n jpg: selectedFile.extension === 'jpg',\r\n pdf: selectedFile.extension === 'pdf',\r\n doc: selectedFile.extension === 'doc',\r\n docx: selectedFile.extension === 'docx',\r\n xls: selectedFile.extension === 'xls',\r\n xlsx: selectedFile.extension === 'xlsx',\r\n ppt: selectedFile.extension === 'ppt',\r\n pptx: selectedFile.extension === 'pptx',\r\n csv: selectedFile.extension === 'csv',\r\n psd: selectedFile.extension === 'psd',\r\n xml: selectedFile.extension === 'xml',\r\n zip: selectedFile.extension === 'zip'\r\n }\"\r\n alt=\"Main display image\" />\r\n @if(selectedFile.fileName) {\r\n <div class=\"T14M\">{{selectedFile.fileName}}</div>\r\n }\r\n <sd-button title=\"Tải file\" (click)=\"onDownload(selectedFile)\" type=\"fill\" color=\"primary\"></sd-button>\r\n }\r\n }\r\n <sd-button prefixIcon=\"arrow_forward_ios\" class=\"next-icon\" (click)=\"updateCurrentImage(1)\"></sd-button>\r\n <sd-button prefixIcon=\"arrow_back_ios_new\" class=\"back-icon\" (click)=\"updateCurrentImage(-1)\"></sd-button>\r\n </div>\r\n </div>\r\n </div>\r\n</sd-modal>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterImage',\r\n standalone: true,\r\n})\r\nexport class FilterImagePipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => e.isPreviewImage && (e.file || e.src));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterDocument',\r\n standalone: true,\r\n})\r\nexport class FilterDocumentPipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => !e.isPreviewImage || (!e.file && !e.src));\r\n }\r\n}\r\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'heic', 'heif'];\r\nexport const IsImage = (extension: string | undefined | null) => {\r\n if (!extension) {\r\n return false;\r\n }\r\n return IMAGE_EXTENSIONS.includes(extension?.toLowerCase());\r\n};\r\n\r\nexport interface PreviewFile {\r\n idOrKey?: string | number;\r\n file?: File | null;\r\n src?: string | null;\r\n previewSrc: string | ArrayBuffer | null;\r\n isPreviewImage: boolean; // Chỉ preview nếu là ảnh, ngoại trừ định dạng ảnh TIFF (fileType: TIFF hoặc mimeType: image/tiff) do thẻ img không hỗ trợ\r\n fileName?: string | null;\r\n fileSize?: number | null;\r\n extension?: string | null;\r\n isImgError?: boolean;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Injectable } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n// import { sha1 } from 'object-hash';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UploadFileService {\r\n #cache: Record<string, File> = {};\r\n\r\n constructor() {}\r\n\r\n #hash = (file: File) => {\r\n if (!file) {\r\n return null;\r\n }\r\n return SdUtilities.hash(file);\r\n };\r\n\r\n isHashedKey = (key: string) => {\r\n if (!key) {\r\n return false;\r\n }\r\n return !!this.#cache[key];\r\n };\r\n\r\n get = (key: string) => {\r\n if (!this.isHashedKey(key)) {\r\n return null;\r\n }\r\n return this.#cache[key];\r\n };\r\n\r\n add = (file: File) => {\r\n const key = this.#hash(file);\r\n if (key) {\r\n this.#cache[key] = file;\r\n }\r\n return key;\r\n };\r\n\r\n remove = (fileOrKey: File | string) => {\r\n if (!fileOrKey) {\r\n return;\r\n }\r\n if (typeof fileOrKey === 'string') {\r\n if (this.isHashedKey(fileOrKey)) {\r\n delete this.#cache[fileOrKey];\r\n }\r\n return;\r\n }\r\n const key = this.#hash(fileOrKey);\r\n if (key) {\r\n delete this.#cache[key];\r\n }\r\n };\r\n}\r\n","/* eslint-disable @angular-eslint/no-input-rename */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Input,\n afterNextRender,\n computed,\n contentChild,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidatorFn, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { SdLabelDefDirective } from '@sd-angular/core/forms/directives';\nimport { SdLabel } from '@sd-angular/core/forms/label';\nimport { SdFormControl } from '@sd-angular/core/forms/models';\nimport { SdFormatNumberPipe } from '@sd-angular/core/pipes';\nimport { SdConfirmService, SdNotifyService } from '@sd-angular/core/services';\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\nimport { Subject } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport * as uuid from 'uuid';\nimport { PreviewComponent } from './components/preview/preview.component';\nimport {\n ISdUploadFileConfiguration,\n SD_UPLOAD_FILE_CONFIG,\n SdUploadFileDetail,\n SdUploadFileFuncDetails,\n} from './configurations';\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\nimport { IsImage, PreviewFile, UploadFileService } from './services';\n\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\n@Component({\n selector: 'sd-upload-file',\n templateUrl: './upload-file.component.html',\n styleUrls: ['./upload-file.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n DragDropModule,\n SdLabel,\n PreviewComponent,\n FilterImagePipe,\n FilterDocumentPipe,\n SdFormatNumberPipe,\n MatProgressSpinner,\n ],\n})\nexport class SdUploadFile<TArgs = any> {\n // ─── Injected Services ────────────────────────────────────────────────\n readonly #notifyService = inject(SdNotifyService);\n readonly #confirmService = inject(SdConfirmService);\n readonly #uploadFileConfig = inject<ISdUploadFileConfiguration>(SD_UPLOAD_FILE_CONFIG);\n readonly #uploadFileService = inject(UploadFileService);\n readonly #destroyRef = inject(DestroyRef);\n\n // ─── Internal State ───────────────────────────────────────────────────\n readonly id = `I${uuid.v4()}`;\n readonly #isMobileOrTablet = SdUtilities.isMobile();\n readonly #canvas1 = `C${uuid.v4()}`;\n readonly #canvas2 = `C${uuid.v4()}`;\n #name = uuid.v4();\n #formGroup?: FormGroup;\n #currentDropContainer: any;\n\n readonly formControl = new SdFormControl();\n\n // ─── Signals (state) ──────────────────────────────────────────────────\n readonly previewFiles = signal<PreviewFile[]>([]);\n readonly selectedFile = signal<PreviewFile | null | undefined>(undefined);\n\n // ─── Query Signals ────────────────────────────────────────────────────\n readonly previewFileComponent = viewChild(PreviewComponent);\n readonly dropElements = viewChildren<ElementRef>('dropElement');\n readonly sdLabelDef = contentChild(SdLabelDefDirective);\n\n // ─── Input Signals ────────────────────────────────────────────────────\n readonly args = input<TArgs>();\n readonly label = input<string>();\n readonly description = input<string>();\n readonly previewWidth = input<string>('50px');\n readonly previewHeight = input<string>('50px');\n readonly align = input<'left' | 'center'>('left');\n readonly details = input<SdUploadFileFuncDetails<any>>();\n readonly imageValidator = input<(image: HTMLImageElement) => string>();\n readonly maxSize = input<number>();\n readonly maxWidth = input<number>();\n readonly maxHeight = input<number>();\n readonly scaleToPixel = input<number>();\n\n // ─── Inputs with transform (null/undefined → default value) ─────────\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n\n readonly nameInput = input<string, string | undefined>(uuid.v4(), {\n alias: 'name',\n transform: (val): string => val || uuid.v4(),\n });\n\n readonly required = input<boolean, boolean | '' | undefined | null>(false, {\n alias: 'required',\n transform: (val): boolean => val === '' || !!val,\n });\n\n readonly type = input<'image' | 'document' | 'file', 'image' | 'document' | 'file' | undefined | null>('file', {\n alias: 'type',\n transform: (val): 'image' | 'document' | 'file' => val || 'file',\n });\n\n readonly helperText = input<string | undefined>(undefined, { alias: 'helperText' });\n\n readonly max = input<number, number | undefined | null>(10, {\n alias: 'max',\n transform: (val): number => val ?? 10,\n });\n\n readonly maxOfImage = input<number, number | undefined | null>(3, {\n alias: 'maxOfImage',\n transform: (val): number => val ?? 3,\n });\n\n readonly extensions = input<string[], string[] | undefined | null>([], {\n alias: 'extensions',\n transform: (val): string[] => val?.filter(Boolean) ?? [],\n });\n\n readonly disabled = input<boolean, boolean | '' | undefined | null>(false, {\n alias: 'disabled',\n transform: (val): boolean => val === '' || !!val,\n });\n\n // ─── Computed ─────────────────────────────────────────────────────────\n readonly generatedDescription = computed(() => {\n const desc = this.description();\n if (desc) return desc;\n const exts = this.extensions();\n const maxSz = this.maxSize();\n if (exts.length && maxSz) {\n return `Định dạng: ${exts.join(', ')} và tối đa: ${maxSz}MB`;\n } else if (exts.length) {\n return `Định dạng: ${exts.join(', ')}`;\n } else if (maxSz) {\n return `Tối đa: ${maxSz}MB`;\n }\n return undefined;\n });\n\n // ─── Output Signals ───────────────────────────────────────────────────\n readonly loaded = output<PreviewFile[]>();\n readonly filesChanged = output<(string | File)[]>();\n\n // ─── Model Signal (two-way binding support: [(model)]) ────────────────\n readonly model = model<(string | number)[]>([]);\n\n constructor() {\n // Sync form group & register form control\n afterNextRender(() => {\n this.#formGroup = this.form();\n this.#name = this.nameInput();\n this.#formGroup?.addControl(this.#name, this.formControl);\n\n // Drag & drop setup\n if (!this.#isMobileOrTablet) {\n this.#setupDropContainer();\n }\n });\n\n // Reactive sync for model changes\n effect(() => {\n const values = this.model() || [];\n this.formControl.setValue(values);\n\n if (Array.isArray(values)) {\n this.#details(values).then(previewFiles => {\n this.previewFiles.set(previewFiles);\n this.filesChanged.emit(\n this.previewFiles()\n .map(e => e.file || e.idOrKey || e.src)\n .filter(val => !!val) as (string | File)[]\n );\n this.#preview();\n });\n } else {\n this.previewFiles.set([]);\n }\n });\n\n // Reactive disabled state via effect (runs whenever disabled input changes)\n effect(() => {\n if (this.disabled()) {\n this.formControl.disable();\n } else {\n this.formControl.enable();\n }\n });\n\n // Cleanup on destroy\n this.#destroyRef.onDestroy(() => {\n this.#revokePreviewBlobURLs();\n this.#formGroup?.removeControl(this.#name);\n });\n }\n\n\n // ─── Drop container setup ─────────────────────────────────────────────\n #setupDropContainer() {\n const dropEls = this.dropElements();\n if (dropEls?.length > 0) {\n const dropContainer = dropEls[0].nativeElement;\n this.#bindDropEvents(dropContainer);\n }\n }\n\n #bindDropEvents(dropContainer: HTMLElement) {\n this.#currentDropContainer = dropContainer;\n dropContainer.addEventListener('dragover', (evt: Event) => {\n evt.preventDefault();\n (dropContainer as any).style.opacity = 0.9;\n dropContainer.style.border = '2px solid grey';\n });\n dropContainer.addEventListener('dragenter', (evt: Event) => {\n evt.preventDefault();\n });\n dropContainer.addEventListener('dragleave', () => {\n (dropContainer as any).style.opacity = 0.6;\n dropContainer.style.border = '2px dashed grey';\n });\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\n evt.preventDefault();\n (dropContainer as any).style.opacity = 0.6;\n dropContainer.style.border = '2px dashed grey';\n const files: File[] = [];\n for (const file of evt.dataTransfer?.files || []) {\n files.push(file);\n }\n await this.#uploadFile(files);\n });\n }\n\n // ─── Private Methods ──────────────────────────────────────────────────\n #touch = () => {\n this.formControl.markAsTouched();\n this.formControl.setValue(this.model() || []);\n };\n\n #updateValidator = () => {\n this.formControl.clearValidators();\n this.formControl.clearAsyncValidators();\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n if (this.required()) {\n validators.push(Validators.required);\n }\n this.formControl.setValidators(validators);\n this.formControl.setAsyncValidators(asyncValidators);\n this.formControl.updateValueAndValidity();\n };\n\n\n #validate = async (file: File): Promise<string | null> => {\n if (this.type() === 'image') {\n if (file.type.split('/')[0] !== 'image') {\n return `[${file.name}] Tệp tải lên không phải là ảnh`;\n }\n }\n const exts = this.extensions();\n if (exts?.length) {\n const lastDot = file.name.lastIndexOf('.');\n const extension = file.name.substring(lastDot + 1);\n if (!exts.some(e => e.toUpperCase() === extension.toUpperCase())) {\n return `[${file.name}] Tệp tải lên không đúng định dạng: ${exts.join(', ')}`;\n }\n }\n const maxSz = this.maxSize();\n if (maxSz) {\n if (maxSz * 1024 * 1024 < file.size) {\n return `[${file.name}] Kích thước tệp tối đa: ${maxSz} MB`;\n }\n }\n if (this.type() === 'image' && (this.maxWidth() || this.maxHeight() || this.imageValidator())) {\n const message: string | null = await new Promise(resolve => {\n const URL = window.URL || window.webkitURL;\n const img = new Image();\n img.onload = () => {\n const mw = this.maxWidth();\n const mh = this.maxHeight();\n const imgVal = this.imageValidator();\n if (mw && img.width > mw) {\n resolve(`[${file.name}] Max image width ${mw}px`);\n return;\n }\n if (mh && img.height > mh) {\n resolve(`[${file.name}] Max image height ${mh}px`);\n return;\n }\n if (imgVal) {\n resolve(imgVal(img));\n return;\n }\n resolve(null);\n };\n img.src = URL.createObjectURL(file);\n });\n if (message) {\n return message;\n }\n }\n return null;\n };\n\n #preview = () => {\n for (const previewFile of this.previewFiles().filter(e => e.file)) {\n const reader = new FileReader();\n reader.onload = evt => {\n previewFile.previewSrc = evt.target!.result;\n previewFile.isPreviewImage =\n previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\n // trigger signal update\n this.previewFiles.set([...this.previewFiles()]);\n };\n reader.readAsDataURL(previewFile.file!);\n }\n };\n\n // ─── Public Event Handlers ────────────────────────────────────────────\n onUpload = () => {\n SdUtilities.upload({\n maxSizeInMb: this.maxSize(),\n extensions: this.extensions(),\n multiple: this.max() > 1,\n })\n .then(async result => {\n if (result) {\n if (Array.isArray(result)) {\n await this.#uploadFile(result);\n } else {\n await this.#uploadFile([result]);\n }\n }\n })\n .catch(error => {\n console.error(error);\n this.#notifyService.error(error?.message || 'Có lỗi xảy ra trong quá trình tải lên tệp');\n });\n };\n\n #uploadFile = async (originFiles: File[]) => {\n const currentModel = [...(this.model() || [])];\n if (originFiles.length + currentModel.length > this.max()) {\n this.#notifyService.warning(`Bạn đã chọn quá nhiều file. Vui lòng kiểm tra lại số lượng`);\n return;\n }\n for (let file of originFiles) {\n const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\n if (isImage && (this.scaleToPixel() ?? 0) > 0) {\n file = await this.#resize(file!);\n }\n const message = await this.#validate(file!);\n if (message) {\n this.#notifyService.warning(message);\n return;\n }\n const hashedKey = this.#uploadFileService.add(file);\n if (hashedKey) {\n currentModel.push(hashedKey);\n }\n }\n this.model.set(currentModel);\n this.#touch();\n };\n\n onRemove = (file: PreviewFile) => {\n const files = this.previewFiles();\n const idx = files.indexOf(file);\n if (idx >= 0) {\n this.#confirmService\n .confirm('Bạn có muốn xóa file này không? Thao tác này không thể hoàn tác', {\n title: 'Xác nhận xóa?',\n yesTitle: 'Xác nhận',\n noTitle: 'Hủy',\n yesButtonColor: 'primary',\n noButtonColor: 'primary',\n })\n .then(() => {\n const updated = [...files];\n updated.splice(idx, 1);\n this.previewFiles.set(updated);\n const currentModel = [...(this.model() || [])];\n currentModel.splice(idx, 1);\n this.model.set(currentModel);\n this.filesChanged.emit(\n this.previewFiles()\n .map(e => e.file || e.idOrKey || e.src)\n .filter(val => !!val) as (string | File)[]\n );\n this.#touch();\n });\n }\n };\n\n onDrop = (event: CdkDragDrop<string[]>) => {\n const currentModel = [...(this.model() || [])];\n moveItemInArray(currentModel, event.previousIndex, event.currentIndex);\n this.model.set(currentModel);\n this.#touch();\n };\n\n onImgError = (previewFile: PreviewFile) => {\n previewFile.isImgError = true;\n this.previewFiles.set([...this.previewFiles()]);\n };\n\n onSelect = (file: PreviewFile) => {\n if (!this.#isMobileOrTablet) {\n return;\n }\n this.selectedFile.set(this.selectedFile() !== file ? file : null);\n };\n\n // ─── Resize ───────────────────────────────────────────────────────────\n #resize = async (file: File): Promise<File> => {\n if (!this.scaleToPixel()) {\n return file;\n }\n const lastDot = file.name.lastIndexOf('.');\n if (lastDot === -1) {\n return file;\n }\n return await new Promise((resolve, reject) => {\n const URL = window.URL || window.webkitURL;\n const img = new Image();\n img.onload = () => {\n try {\n if (img.width * img.height <= this.scaleToPixel()!) {\n return resolve(file);\n }\n const canvas1 = document.createElement('canvas');\n canvas1.setAttribute('id', this.#canvas1);\n const ctx1 = canvas1.getContext('2d');\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel()!);\n canvas1.width = width;\n canvas1.height = height;\n\n const canvas2 = document.createElement('canvas');\n canvas2.setAttribute('id', this.#canvas2);\n const ctx2 = canvas2.getContext('2d');\n canvas2.width = width;\n canvas2.height = height;\n ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\n ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\n ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\n canvas1.toBlob(blob => {\n resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\n });\n } catch (err) {\n reject(err);\n } finally {\n document.getElementById(this.#canvas1)?.remove();\n document.getElementById(this.#canvas2)?.remove();\n }\n };\n img.src = URL.createObjectURL(file);\n });\n };\n\n #scale = (width: number, height: number, scaleToPixcel: number) => {\n if (!width || !height || !scaleToPixcel) {\n return { width, height };\n }\n const ratio = width / height;\n for (let i = 0; i < width; i++) {\n width -= i;\n height = Math.trunc(width / ratio);\n if (width * height <= scaleToPixcel) {\n break;\n }\n }\n return { width, height };\n };\n\n #blobToFile = (blob: Blob, fileName: string): File => {\n const temp: any = blob;\n temp.lastModifiedDate = new Date();\n temp.name = fileName;\n return blob as File;\n };\n\n // ─── Public API ───────────────────────────────────────────────────────\n /**\n * Lấy danh sách các File từ previewFiles (chưa upload).\n */\n getFiles = async () => {\n const items = this.previewFiles()?.filter(val => !!val) || [];\n return items.map(e => e?.file).filter(file => !!file);\n };\n\n /**\n * Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys.\n * HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER.\n */\n upload = async () => {\n const items = this.previewFiles()?.filter(val => !!val) || [];\n if (!Array.isArray(items)) {\n this.model.set([]);\n return;\n }\n const results: (string | number)[] = [];\n const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\n let idOrKeys: string[] = [];\n if (uploadedFiles.length) {\n idOrKeys = await this.#uploadFileConfig.upload(uploadedFiles, this.args()).then(results => {\n for (const uploadedFile of uploadedFiles) {\n this.#uploadFileService.remove(uploadedFile);\n }\n return results;\n });\n }\n let idx = 0;\n for (const item of items) {\n if (!item.file) {\n if (item.idOrKey) {\n results.push(item.idOrKey);\n }\n } else {\n if (idOrKeys?.[idx]) {\n results.push(idOrKeys[idx]);\n idx++;\n }\n }\n }\n this.model.set(results);\n };\n\n /**\n * Mở popup preview ảnh.\n */\n preview = async () => {\n this.previewFileComponent()?.open(this.previewFiles());\n };\n\n /**\n * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\n * * Ưu tiên:\n * 1. Tải xuống từ thuộc tính `file`.\n * 2. Tải xuống từ thuộc tính `src`.\n * 3. Gọi hàm download dựa vào `idOrKey`.\n *\n * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\n */\n onDownload = (previewFile: PreviewFile) => {\n if (previewFile.file || previewFile.src) {\n SdUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\n return;\n }\n if (previewFile.idOrKey) {\n this.#uploadFileConfig?.download?.(previewFile.idOrKey, this.args());\n return;\n }\n console.error('Invalid preview file', previewFile);\n };\n\n isLastVisibleOverlay(fileIndex: number): boolean {\n return this.formControl.disabled && fileIndex === this.maxOfImage() - 1 && this.previewFiles().length > this.maxOfImage();\n }\n\n // ─── Details ──────────────────────────────────────────────────────────\n /**\n * Khi binding model, đầu vào thường là id/key/cdn,\n * cần render ra ảnh/tệp tương ứng.\n */\n #details = async (keys: (string | number)[]) => {\n if (!Array.isArray(keys) || !keys.length) {\n return [];\n }\n const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\n let detailsList: SdUploadFileDetail[] = [];\n const detailsFn = this.details();\n if (idOrKeys.length) {\n if (detailsFn) {\n detailsList = await detailsFn(idOrKeys, this.args()).catch(error => {\n console.error(error);\n return [];\n });\n } else if (this.#uploadFileConfig.details) {\n detailsList = await this.#uploadFileConfig.details(idOrKeys, this.args()).catch(error => {\n console.error(error);\n return [];\n });\n }\n }\n const results: PreviewFile[] = [];\n for (const key of keys.filter(val => !!val)) {\n if (this.#isCdn(key)) {\n const cdn = key?.toString();\n const extension = this.#getExtension(cdn);\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\n results.push({\n idOrKey: cdn,\n fileName: cdn,\n file: null,\n previewSrc: null,\n src: cdn,\n isPreviewImage,\n extension,\n });\n } else if (this.#isHashedKey(key)) {\n const hashedKey = key?.toString();\n const file = this.#uploadFileService.get(hashedKey)!;\n const lastDot = file.name.lastIndexOf('.');\n const extension = file.name.substring(lastDot + 1);\n const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\n results.push({\n file,\n isPreviewImage,\n previewSrc: null,\n src: null,\n fileName: file.name,\n fileSize: file.size,\n extension,\n });\n } else {\n const detail = detailsList.find(e => e.idOrKey === key);\n if (detail) {\n const { idOrKey, cdn, name, size } = detail;\n const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\n results.push({\n idOrKey: idOrKey || cdn,\n fileName: name,\n fileSize: size,\n file: null,\n previewSrc: null,\n src: cdn,\n isPreviewImage,\n extension,\n });\n }\n }\n }\n return results;\n };\n\n // ─── Helpers ──────────────────────────────────────────────────────────\n #isCdn = (idOrKey: string | number) => {\n if (typeof idOrKey !== 'string') return false;\n return idOrKey.startsWith('http');\n };\n\n #isHashedKey = (idOrKey: string | number) => {\n if (typeof idOrKey !== 'string') return false;\n return this.#uploadFileService.isHashedKey(idOrKey);\n };\n\n #getExtension = (cdn: string | undefined) => {\n if (!cdn) return undefined;\n const baseSrc = cdn?.split?.('?')?.[0];\n const lastDot = baseSrc?.lastIndexOf?.('.');\n if (lastDot > 0) {\n return baseSrc.substring(lastDot + 1);\n }\n return undefined;\n };\n\n /**\n * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\n * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\n */\n #revokePreviewBlobURLs = (): void => {\n const files = this.previewFiles();\n if (!Array.isArray(files) || !files?.length) return;\n files.forEach(p => {\n if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\n URL.revokeObjectURL(p.previewSrc);\n }\n if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\n URL.revokeObjectURL(p.src);\n }\n });\n };\n}\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\n @if (!!sdLabelDef()?.templateRef) {\n <ng-container *ngTemplateOutlet=\"sdLabelDef()?.templateRef!\"> </ng-container>\n } @else if (label()) {\n <sd-label [label]=\"label()!\" [description]=\"generatedDescription()\" [helperText]=\"helperText()\" [required]=\"required()\"></sd-label>\n }\n <div\n cdkDropList\n (cdkDropListDropped)=\"onDrop($event)\"\n cdkDropListOrientation=\"horizontal\"\n class=\"d-flex\"\n [class.justify-content-center]=\"align() === 'center'\"\n [class.justify-content-start]=\"align() === 'left'\">\n @if (previewFiles().length < max() && !formControl.disabled) {\n <div\n class=\"d-flex justify-content-center align-items-center pointer c-area-upload\"\n [style.width]=\"previewWidth()\"\n [style.height]=\"previewHeight()\"\n (click)=\"onUpload()\"\n aria-hidden=\"true\"\n #dropElement>\n <mat-icon class=\"c-upload\" fontSet=\"material-icons-outlined\"> file_upload </mat-icon>\n </div>\n }\n @let previewImages = previewFiles() | filterImage;\n @for (image of previewImages; track $index; let idx = $index) {\n @if (!formControl.disabled || idx < maxOfImage()) {\n <div class=\"c-area c-view\" [class.c-loading]=\"!image.previewSrc && !image.src\" [class.c-area-error]=\"image.isImgError\" [style.width]=\"previewWidth()\" [style.height]=\"previewHeight()\" cdkDrag>\n <div class=\"c-drag-placeholder\" [style.width]=\"previewWidth()\" [style.height]=\"previewHeight()\" *cdkDragPlaceholder></div>\n <div *cdkDragPreview [style]=\"{ width: previewWidth(), height: previewHeight() }\" class=\"c-drag-preview\">\n <div class=\"c-container\">\n <mat-icon>image</mat-icon>\n </div>\n </div>\n <div class=\"c-preview\">\n <div\n class=\"c-img-container\"\n [class.c-disabled]=\"formControl.disabled\"\n [class.c-selected]=\"selectedFile() === image\"\n [class.has-overlay]=\"idx === maxOfImage() - 1 && formControl.disabled\"\n (click)=\"onSelect(image)\"\n aria-hidden=\"true\">\n @if (image.isImgError) {\n <img class=\"c-img-error\" alt=\"Image Error\" [style.max-height]=\"previewHeight()\" />\n } @else if(image.previewSrc) {\n <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"previewHeight()\" (error)=\"onImgError(image)\" />\n } @else if(image.src) {\n <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"previewHeight()\" (error)=\"onImgError(image)\" />\n } @else {\n <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\n }\n @if (idx === maxOfImage() - 1 && formControl.disabled && previewImages.length > maxOfImage()) {\n <div class=\"c-overlay-count\" (click)=\"preview()\">\n <div class=\"c-overlay-text\">+{{ previewImages.length - maxOfImage() }}</div>\n </div>\n }\n <div class=\"c-action\">\n <mat-icon class=\"c-zoom\" fontSet=\"material-icons-outlined\" (click)=\"preview()\">zoom_in</mat-icon>\n </div>\n @if (!formControl.disabled) {\n <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n @let previewDocuments = previewFiles() | filterDocument;\n @for (document of previewDocuments; track $index) {\n <div class=\"c-document-container\">\n <img\n [style.max-height]=\"previewHeight()\"\n class=\"c-document-image\"\n [class]=\"{\n png: document.extension === 'png',\n jpg: document.extension === 'jpg',\n pdf: document.extension === 'pdf',\n doc: document.extension === 'doc',\n docx: document.extension === 'docx',\n xls: document.extension === 'xls',\n xlsx: document.extension === 'xlsx',\n ppt: document.extension === 'ppt',\n pptx: document.extension === 'pptx',\n csv: document.extension === 'csv',\n psd: document.extension === 'psd',\n xml: document.extension === 'xml',\n zip: document.extension === 'zip',\n tiff: document.extension === 'tiff'\n }\"\n alt=\"Preview\" />\n <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\n @if (document.fileSize) {\n <span class=\"T12R text-black400\"> - </span>\n <span class=\"T12R text-black400 flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\n }\n\n @if (!formControl.disabled) {\n <mat-icon class=\"c-close\" (click)=\"onRemove(document)\">close</mat-icon>\n }\n </div>\n }\n @if (!formControl.disabled && formControl.touched && formControl.errors?.['required']) {\n <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ 'Vui lòng tải lên tệp/ảnh' }}</div>\n }\n</div>\n<preview (download)=\"onDownload($event)\"></preview>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SdUtilities"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-upload-file.mjs","sources":["../../../projects/sd-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sd-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sd-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.html","../../../projects/sd-angular/components/upload-file/sd-angular-core-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface ISdUploadFileConfiguration<TArgs = any> {\r\n upload: SdUploadFileFuncUpload<TArgs>;\r\n details: SdUploadFileFuncDetails<TArgs>;\r\n download?: SdUploadFileFuncDownload<TArgs>;\r\n}\r\n\r\nexport const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\r\n\r\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\r\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\r\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\r\n\r\nexport interface SdUploadFileDetail {\r\n idOrKey: string;\r\n cdn: string; // Đường dẫn file\r\n name?: string; // Tên file nếu có\r\n extension?: string; // png, jpg\r\n size?: number; // Dung lượng file theo đơn vị Mb\r\n}\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output, ViewChild } from '@angular/core';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdModal } from '@sd-angular/core/components/modal';\r\nimport { PreviewFile } from '../../services';\r\nimport { MatIcon } from \"@angular/material/icon\";\r\n\r\n@Component({\r\n selector: 'preview',\r\n templateUrl: './preview.component.html',\r\n styleUrl: './preview.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [SdModal, SdButton, CommonModule, MatIcon],\r\n})\r\nexport class PreviewComponent {\r\n @ViewChild(SdModal) modal!: SdModal;\r\n @Output() download = new EventEmitter<PreviewFile>();\r\n @Output() close = new EventEmitter<void>();\r\n\r\n title: string = 'Xem ảnh';\r\n thumbnailPosition: 'right' | 'left' | 'bottom' | 'top' = 'right';\r\n activeIndex = 0;\r\n previewFiles: PreviewFile[] = [];\r\n constructor(private cd: ChangeDetectorRef) {}\r\n\r\n // Nên sử dụng urlOrFiles ở tham số khi open thay vì dùng @Input để component sử dụng sẽ chỉ cần map ở hàm khi gọi open thay vì phải mất công map mọi lúc để binding vào @Input\r\n open = async (previewFiles: PreviewFile[] | undefined | null, index?: number) => {\r\n if (!Array.isArray(previewFiles) || previewFiles.length === 0) {\r\n return;\r\n }\r\n this.previewFiles = previewFiles;\r\n this.activeIndex = index || 0;\r\n this.modal?.open();\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClickThumbnailImage = (index: number) => {\r\n this.activeIndex = index;\r\n this.cd.markForCheck();\r\n };\r\n\r\n updateCurrentImage = (direction: 1 | -1) => {\r\n this.activeIndex = (this.activeIndex + direction + this.previewFiles.length) % this.previewFiles.length;\r\n this.#scrollView(this.activeIndex, direction === 1 ? 'start' : 'end');\r\n this.cd.markForCheck();\r\n };\r\n\r\n onClose = () => {\r\n this.close.emit();\r\n };\r\n\r\n #scrollView = (index: number, type?: 'center' | 'end' | 'nearest' | 'start') => {\r\n const nameId: string = 'thumbnailImage' + index;\r\n const element = document.getElementById(nameId);\r\n if (!element) {\r\n return;\r\n }\r\n const blockType: ScrollLogicalPosition = type || 'start';\r\n element.scrollIntoView({ behavior: 'smooth', block: blockType });\r\n };\r\n\r\n onDownload = (previewFile: PreviewFile) => {\r\n this.download.emit(previewFile);\r\n this.cd.markForCheck();\r\n };\r\n}\r\n","<sd-modal [title]=\"title\" (sdClosed)=\"close.emit()\" #modal>\r\n <div class=\"p-16\" style=\"overflow: hidden; height: 100%\">\r\n <div style=\"gap: 8px\" class=\"image-gallery\">\r\n <div class=\"thumbnail-container\">\r\n @for (file of previewFiles; track $index; let i = $index) {\r\n <button\r\n type=\"button\"\r\n class=\"thumbnail-wrapper\"\r\n [class.c-img-error]=\"file.isImgError\"\r\n (click)=\"onClickThumbnailImage(i)\"\r\n [ngStyle]=\"{\r\n border: activeIndex === i ? '2px solid #2962ff' : 'none'\r\n }\">\r\n @if(file.isImgError) {\r\n <img fill alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else if (file.isPreviewImage && (file.previewSrc || file.src)) {\r\n <img fill [src]=\"file.previewSrc || file.src\" alt=\"thumbnail\" class=\"thumbnail-img\" />\r\n } @else {\r\n <img\r\n class=\"thumbnail-img file\"\r\n [class]=\"{\r\n png: file.extension === 'png',\r\n jpg: file.extension === 'jpg',\r\n pdf: file.extension === 'pdf',\r\n doc: file.extension === 'doc',\r\n docx: file.extension === 'docx',\r\n xls: file.extension === 'xls',\r\n xlsx: file.extension === 'xlsx',\r\n ppt: file.extension === 'ppt',\r\n pptx: file.extension === 'pptx',\r\n csv: file.extension === 'csv',\r\n psd: file.extension === 'psd',\r\n xml: file.extension === 'xml',\r\n zip: file.extension === 'zip'\r\n }\"\r\n alt=\"thumbnail\" />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div class=\"main-image-container\" #mainImage>\r\n @let selectedFile = previewFiles[activeIndex];\r\n @if(selectedFile) {\r\n @if(selectedFile.isImgError) {\r\n <div class=\"c-img-error\">\r\n <mat-icon>warning_amber</mat-icon>\r\n <div class=\"T14R\">Có lỗi xảy ra</div>\r\n </div>\r\n } @else if (selectedFile.isPreviewImage && (selectedFile.previewSrc || selectedFile.src)) {\r\n <img fill priority [src]=\"selectedFile.previewSrc || selectedFile.src\" class=\"main-image\" alt=\"Main display image\" />\r\n } @else {\r\n <img\r\n class=\"main-document file\"\r\n [class]=\"{\r\n png: selectedFile.extension === 'png',\r\n jpg: selectedFile.extension === 'jpg',\r\n pdf: selectedFile.extension === 'pdf',\r\n doc: selectedFile.extension === 'doc',\r\n docx: selectedFile.extension === 'docx',\r\n xls: selectedFile.extension === 'xls',\r\n xlsx: selectedFile.extension === 'xlsx',\r\n ppt: selectedFile.extension === 'ppt',\r\n pptx: selectedFile.extension === 'pptx',\r\n csv: selectedFile.extension === 'csv',\r\n psd: selectedFile.extension === 'psd',\r\n xml: selectedFile.extension === 'xml',\r\n zip: selectedFile.extension === 'zip'\r\n }\"\r\n alt=\"Main display image\" />\r\n @if(selectedFile.fileName) {\r\n <div class=\"T14M\">{{selectedFile.fileName}}</div>\r\n }\r\n <sd-button title=\"Tải file\" (click)=\"onDownload(selectedFile)\" type=\"fill\" color=\"primary\"></sd-button>\r\n }\r\n }\r\n <sd-button prefixIcon=\"arrow_forward_ios\" class=\"next-icon\" (click)=\"updateCurrentImage(1)\"></sd-button>\r\n <sd-button prefixIcon=\"arrow_back_ios_new\" class=\"back-icon\" (click)=\"updateCurrentImage(-1)\"></sd-button>\r\n </div>\r\n </div>\r\n </div>\r\n</sd-modal>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterImage',\r\n standalone: true,\r\n})\r\nexport class FilterImagePipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => e.isPreviewImage && (e.file || e.src));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { IsImage, PreviewFile } from '../services';\r\n@Pipe({\r\n name: 'filterDocument',\r\n standalone: true,\r\n})\r\nexport class FilterDocumentPipe implements PipeTransform {\r\n transform(files: PreviewFile[]) {\r\n return files.filter(e => !e.isPreviewImage || (!e.file && !e.src));\r\n }\r\n}\r\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'heic', 'heif'];\r\nexport const IsImage = (extension: string | undefined | null) => {\r\n if (!extension) {\r\n return false;\r\n }\r\n return IMAGE_EXTENSIONS.includes(extension?.toLowerCase());\r\n};\r\n\r\nexport interface PreviewFile {\r\n idOrKey?: string | number;\r\n file?: File | null;\r\n src?: string | null;\r\n previewSrc: string | ArrayBuffer | null;\r\n isPreviewImage: boolean; // Chỉ preview nếu là ảnh, ngoại trừ định dạng ảnh TIFF (fileType: TIFF hoặc mimeType: image/tiff) do thẻ img không hỗ trợ\r\n fileName?: string | null;\r\n fileSize?: number | null;\r\n extension?: string | null;\r\n isImgError?: boolean;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UploadFileService {\r\n #cache: Record<string, File> = {};\r\n\r\n #hash = (file: File) => {\r\n if (!file) {\r\n return null;\r\n }\r\n return SdUtilities.hash(file);\r\n };\r\n\r\n isHashedKey = (key: string) => {\r\n if (!key) {\r\n return false;\r\n }\r\n return !!this.#cache[key];\r\n };\r\n\r\n get = (key: string) => {\r\n if (!this.isHashedKey(key)) {\r\n return null;\r\n }\r\n return this.#cache[key];\r\n };\r\n\r\n add = (file: File) => {\r\n const key = this.#hash(file);\r\n if (key) {\r\n this.#cache[key] = file;\r\n }\r\n return key;\r\n };\r\n\r\n remove = (fileOrKey: File | string) => {\r\n if (!fileOrKey) {\r\n return;\r\n }\r\n if (typeof fileOrKey === 'string') {\r\n if (this.isHashedKey(fileOrKey)) {\r\n delete this.#cache[fileOrKey];\r\n }\r\n return;\r\n }\r\n const key = this.#hash(fileOrKey);\r\n if (key) {\r\n delete this.#cache[key];\r\n }\r\n };\r\n}\r\n","/* eslint-disable @angular-eslint/no-input-rename */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n computed,\n contentChild,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { FormGroup, NgForm } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { SdLabelDefDirective } from '@sd-angular/core/forms/directives';\nimport { SdLabel } from '@sd-angular/core/forms/label';\nimport { SdFormControl } from '@sd-angular/core/forms/models';\nimport { SdFormatNumberPipe } from '@sd-angular/core/pipes';\nimport { SdConfirmService, SdNotifyService } from '@sd-angular/core/services';\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\nimport * as uuid from 'uuid';\nimport { PreviewComponent } from './components/preview/preview.component';\nimport {\n ISdUploadFileConfiguration,\n SD_UPLOAD_FILE_CONFIGURATION,\n SdUploadFileDetail,\n SdUploadFileFuncDetails,\n} from './configurations';\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\nimport { IsImage, PreviewFile, UploadFileService } from './services';\n\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\n@Component({\n selector: 'sd-upload-file',\n templateUrl: './upload-file.component.html',\n styleUrls: ['./upload-file.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n DragDropModule,\n SdLabel,\n PreviewComponent,\n FilterImagePipe,\n FilterDocumentPipe,\n SdFormatNumberPipe,\n MatProgressSpinner,\n ],\n})\nexport class SdUploadFile<TArgs = any> {\n // ─── Injected Services ────────────────────────────────────────────────\n readonly #notifyService = inject(SdNotifyService);\n readonly #confirmService = inject(SdConfirmService);\n readonly #uploadFileConfig = inject<ISdUploadFileConfiguration>(SD_UPLOAD_FILE_CONFIGURATION, { optional: true });\n readonly #uploadFileService = inject(UploadFileService);\n readonly #destroyRef = inject(DestroyRef);\n\n // ─── Internal State ───────────────────────────────────────────────────\n readonly id = `I${uuid.v4()}`;\n readonly #isMobileOrTablet = SdUtilities.isMobile();\n readonly #canvas1 = `C${uuid.v4()}`;\n readonly #canvas2 = `C${uuid.v4()}`;\n #name = uuid.v4();\n #formGroup?: FormGroup;\n\n readonly formControl = new SdFormControl();\n\n // ─── Signals (state) ──────────────────────────────────────────────────\n readonly previewFiles = signal<PreviewFile[]>([]);\n readonly selectedFile = signal<PreviewFile | null | undefined>(undefined);\n\n // ─── Query Signals ────────────────────────────────────────────────────\n readonly previewFileComponent = viewChild(PreviewComponent);\n readonly dropElements = viewChildren<ElementRef>('dropElement');\n readonly sdLabelDef = contentChild(SdLabelDefDirective);\n\n // ─── Input Signals ────────────────────────────────────────────────────\n readonly args = input<TArgs>();\n readonly label = input<string>();\n readonly description = input<string>();\n readonly previewWidth = input<string>('50px');\n readonly previewHeight = input<string>('50px');\n readonly align = input<'left' | 'center'>('left');\n readonly details = input<SdUploadFileFuncDetails<any>>();\n readonly imageValidator = input<(image: HTMLImageElement) => string>();\n readonly maxSize = input<number>();\n readonly maxWidth = input<number>();\n readonly maxHeight = input<number>();\n readonly scaleToPixel = input<number>();\n\n // ─── Inputs with transform (null/undefined → default value) ─────────\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n\n readonly nameInput = input<string, string | undefined>(uuid.v4(), {\n alias: 'name',\n transform: (val): string => val || uuid.v4(),\n });\n\n readonly required = input<boolean, boolean | '' | undefined | null>(false, {\n alias: 'required',\n transform: (val): boolean => val === '' || !!val,\n });\n\n readonly type = input<'image' | 'document' | 'file', 'image' | 'document' | 'file' | undefined | null>('file', {\n alias: 'type',\n transform: (val): 'image' | 'document' | 'file' => val || 'file',\n });\n\n readonly helperText = input<string | undefined>(undefined, { alias: 'helperText' });\n\n readonly max = input<number, number | undefined | null>(10, {\n alias: 'max',\n transform: (val): number => val ?? 10,\n });\n\n readonly maxOfImage = input<number, number | undefined | null>(3, {\n alias: 'maxOfImage',\n transform: (val): number => val ?? 3,\n });\n\n readonly extensions = input<string[], string[] | undefined | null>([], {\n alias: 'extensions',\n transform: (val): string[] => val?.filter(Boolean) ?? [],\n });\n\n readonly disabled = input<boolean, boolean | '' | undefined | null>(false, {\n alias: 'disabled',\n transform: (val): boolean => val === '' || !!val,\n });\n\n // ─── Computed ─────────────────────────────────────────────────────────\n readonly generatedDescription = computed(() => {\n const desc = this.description();\n if (desc) return desc;\n const exts = this.extensions();\n const maxSz = this.maxSize();\n if (exts.length && maxSz) {\n return `Định dạng: ${exts.join(', ')} và tối đa: ${maxSz}MB`;\n } else if (exts.length) {\n return `Định dạng: ${exts.join(', ')}`;\n } else if (maxSz) {\n return `Tối đa: ${maxSz}MB`;\n }\n return undefined;\n });\n\n // ─── Output Signals ───────────────────────────────────────────────────\n readonly loaded = output<PreviewFile[]>();\n readonly filesChanged = output<(string | File)[]>();\n\n // ─── Model Signal (two-way binding support: [(model)]) ────────────────\n readonly model = model<(string | number)[]>([]);\n\n constructor() {\n // Sync form group & register form control\n afterNextRender(() => {\n this.#formGroup = this.form();\n this.#name = this.nameInput();\n this.#formGroup?.addControl(this.#name, this.formControl);\n\n // Drag & drop setup\n if (!this.#isMobileOrTablet) {\n this.#setupDropContainer();\n }\n });\n\n // Reactive sync for model changes\n effect(() => {\n const values = this.model() || [];\n this.formControl.setValue(values);\n\n if (Array.isArray(values)) {\n this.#details(values).then(previewFiles => {\n this.previewFiles.set(previewFiles);\n this.filesChanged.emit(\n this.previewFiles()\n .map(e => e.file || e.idOrKey || e.src)\n .filter(val => !!val) as (string | File)[]\n );\n this.#preview();\n });\n } else {\n this.previewFiles.set([]);\n }\n });\n\n // Reactive disabled state via effect (runs whenever disabled input changes)\n effect(() => {\n if (this.disabled()) {\n this.formControl.disable();\n } else {\n this.formControl.enable();\n }\n });\n\n // Cleanup on destroy\n this.#destroyRef.onDestroy(() => {\n this.#revokePreviewBlobURLs();\n this.#formGroup?.removeControl(this.#name);\n });\n }\n\n\n // ─── Drop container setup ─────────────────────────────────────────────\n #setupDropContainer() {\n const dropEls = this.dropElements();\n if (dropEls?.length > 0) {\n const dropContainer = dropEls[0].nativeElement;\n this.#bindDropEvents(dropContainer);\n }\n }\n\n #bindDropEvents(dropContainer: HTMLElement) {\n dropContainer.addEventListener('dragover', (evt: Event) => {\n evt.preventDefault();\n (dropContainer as any).style.opacity = 0.9;\n dropContainer.style.border = '2px solid grey';\n });\n dropContainer.addEventListener('dragenter', (evt: Event) => {\n evt.preventDefault();\n });\n dropContainer.addEventListener('dragleave', () => {\n (dropContainer as any).style.opacity = 0.6;\n dropContainer.style.border = '2px dashed grey';\n });\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\n evt.preventDefault();\n (dropContainer as any).style.opacity = 0.6;\n dropContainer.style.border = '2px dashed grey';\n const files: File[] = [];\n for (const file of evt.dataTransfer?.files || []) {\n files.push(file);\n }\n await this.#uploadFile(files);\n });\n }\n\n // ─── Private Methods ──────────────────────────────────────────────────\n #touch = () => {\n this.formControl.markAsTouched();\n this.formControl.setValue(this.model() || []);\n };\n\n // #updateValidator = () => {\n // this.formControl.clearValidators();\n // this.formControl.clearAsyncValidators();\n // const validators: ValidatorFn[] = [];\n // const asyncValidators: AsyncValidatorFn[] = [];\n // if (this.required()) {\n // validators.push(Validators.required);\n // }\n // this.formControl.setValidators(validators);\n // this.formControl.setAsyncValidators(asyncValidators);\n // this.formControl.updateValueAndValidity();\n // };\n\n\n #validate = async (file: File): Promise<string | null> => {\n if (this.type() === 'image') {\n if (file.type.split('/')[0] !== 'image') {\n return `[${file.name}] Tệp tải lên không phải là ảnh`;\n }\n }\n const exts = this.extensions();\n if (exts?.length) {\n const lastDot = file.name.lastIndexOf('.');\n const extension = file.name.substring(lastDot + 1);\n if (!exts.some(e => e.toUpperCase() === extension.toUpperCase())) {\n return `[${file.name}] Tệp tải lên không đúng định dạng: ${exts.join(', ')}`;\n }\n }\n const maxSz = this.maxSize();\n if (maxSz) {\n if (maxSz * 1024 * 1024 < file.size) {\n return `[${file.name}] Kích thước tệp tối đa: ${maxSz} MB`;\n }\n }\n if (this.type() === 'image' && (this.maxWidth() || this.maxHeight() || this.imageValidator())) {\n const message: string | null = await new Promise(resolve => {\n const URL = window.URL || window.webkitURL;\n const img = new Image();\n img.onload = () => {\n const mw = this.maxWidth();\n const mh = this.maxHeight();\n const imgVal = this.imageValidator();\n if (mw && img.width > mw) {\n resolve(`[${file.name}] Max image width ${mw}px`);\n return;\n }\n if (mh && img.height > mh) {\n resolve(`[${file.name}] Max image height ${mh}px`);\n return;\n }\n if (imgVal) {\n resolve(imgVal(img));\n return;\n }\n resolve(null);\n };\n img.src = URL.createObjectURL(file);\n });\n if (message) {\n return message;\n }\n }\n return null;\n };\n\n #preview = () => {\n for (const previewFile of this.previewFiles().filter(e => e.file)) {\n const reader = new FileReader();\n reader.onload = evt => {\n previewFile.previewSrc = evt.target!.result;\n previewFile.isPreviewImage =\n previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\n // trigger signal update\n this.previewFiles.set([...this.previewFiles()]);\n };\n reader.readAsDataURL(previewFile.file!);\n }\n };\n\n // ─── Public Event Handlers ────────────────────────────────────────────\n onUpload = () => {\n SdUtilities.upload({\n maxSizeInMb: this.maxSize(),\n extensions: this.extensions(),\n multiple: this.max() > 1,\n })\n .then(async result => {\n if (result) {\n if (Array.isArray(result)) {\n await this.#uploadFile(result);\n } else {\n await this.#uploadFile([result]);\n }\n }\n })\n .catch(error => {\n console.error(error);\n this.#notifyService.error(error?.message || 'Có lỗi xảy ra trong quá trình tải lên tệp');\n });\n };\n\n #uploadFile = async (originFiles: File[]) => {\n const currentModel = [...(this.model() || [])];\n if (originFiles.length + currentModel.length > this.max()) {\n this.#notifyService.warning(`Bạn đã chọn quá nhiều file. Vui lòng kiểm tra lại số lượng`);\n return;\n }\n for (let file of originFiles) {\n const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\n if (isImage && (this.scaleToPixel() ?? 0) > 0) {\n file = await this.#resize(file!);\n }\n const message = await this.#validate(file!);\n if (message) {\n this.#notifyService.warning(message);\n return;\n }\n const hashedKey = this.#uploadFileService.add(file);\n if (hashedKey) {\n currentModel.push(hashedKey);\n }\n }\n this.model.set(currentModel);\n this.#touch();\n };\n\n onRemove = (file: PreviewFile) => {\n const files = this.previewFiles();\n const idx = files.indexOf(file);\n if (idx >= 0) {\n this.#confirmService\n .confirm('Bạn có muốn xóa file này không? Thao tác này không thể hoàn tác', {\n title: 'Xác nhận xóa?',\n yesTitle: 'Xác nhận',\n noTitle: 'Hủy',\n yesButtonColor: 'primary',\n noButtonColor: 'primary',\n })\n .then(() => {\n const updated = [...files];\n updated.splice(idx, 1);\n this.previewFiles.set(updated);\n const currentModel = [...(this.model() || [])];\n currentModel.splice(idx, 1);\n this.model.set(currentModel);\n this.filesChanged.emit(\n this.previewFiles()\n .map(e => e.file || e.idOrKey || e.src)\n .filter(val => !!val) as (string | File)[]\n );\n this.#touch();\n });\n }\n };\n\n onDrop = (event: CdkDragDrop<string[]>) => {\n const currentModel = [...(this.model() || [])];\n moveItemInArray(currentModel, event.previousIndex, event.currentIndex);\n this.model.set(currentModel);\n this.#touch();\n };\n\n onImgError = (previewFile: PreviewFile) => {\n previewFile.isImgError = true;\n this.previewFiles.set([...this.previewFiles()]);\n };\n\n onSelect = (file: PreviewFile) => {\n if (!this.#isMobileOrTablet) {\n return;\n }\n this.selectedFile.set(this.selectedFile() !== file ? file : null);\n };\n\n // ─── Resize ───────────────────────────────────────────────────────────\n #resize = async (file: File): Promise<File> => {\n if (!this.scaleToPixel()) {\n return file;\n }\n const lastDot = file.name.lastIndexOf('.');\n if (lastDot === -1) {\n return file;\n }\n return await new Promise((resolve, reject) => {\n const URL = window.URL || window.webkitURL;\n const img = new Image();\n img.onload = () => {\n try {\n if (img.width * img.height <= this.scaleToPixel()!) {\n return resolve(file);\n }\n const canvas1 = document.createElement('canvas');\n canvas1.setAttribute('id', this.#canvas1);\n const ctx1 = canvas1.getContext('2d');\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel()!);\n canvas1.width = width;\n canvas1.height = height;\n\n const canvas2 = document.createElement('canvas');\n canvas2.setAttribute('id', this.#canvas2);\n const ctx2 = canvas2.getContext('2d');\n canvas2.width = width;\n canvas2.height = height;\n ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\n ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\n ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\n canvas1.toBlob(blob => {\n resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\n });\n } catch (err) {\n reject(err);\n } finally {\n document.getElementById(this.#canvas1)?.remove();\n document.getElementById(this.#canvas2)?.remove();\n }\n };\n img.src = URL.createObjectURL(file);\n });\n };\n\n #scale = (width: number, height: number, scaleToPixcel: number) => {\n if (!width || !height || !scaleToPixcel) {\n return { width, height };\n }\n const ratio = width / height;\n for (let i = 0; i < width; i++) {\n width -= i;\n height = Math.trunc(width / ratio);\n if (width * height <= scaleToPixcel) {\n break;\n }\n }\n return { width, height };\n };\n\n #blobToFile = (blob: Blob, fileName: string): File => {\n const temp: any = blob;\n temp.lastModifiedDate = new Date();\n temp.name = fileName;\n return blob as File;\n };\n\n // ─── Public API ───────────────────────────────────────────────────────\n /**\n * Lấy danh sách các File từ previewFiles (chưa upload).\n */\n getFiles = async () => {\n const items = this.previewFiles()?.filter(val => !!val) || [];\n return items.map(e => e?.file).filter(file => !!file);\n };\n\n /**\n * Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys.\n * HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER.\n */\n upload = async () => {\n const items = this.previewFiles()?.filter(val => !!val) || [];\n if (!Array.isArray(items)) {\n this.model.set([]);\n return;\n }\n const results: (string | number)[] = [];\n const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\n let idOrKeys: string[] = [];\n if (uploadedFiles.length) {\n if (this.#uploadFileConfig) {\n idOrKeys = await this.#uploadFileConfig.upload(uploadedFiles, this.args()).then(results => {\n for (const uploadedFile of uploadedFiles) {\n this.#uploadFileService.remove(uploadedFile);\n }\n return results;\n });\n } else {\n this.#notifyService.error(`Vui lòng inject SD_UPLOAD_FILE_CONFIGURATION`);\n }\n }\n let idx = 0;\n for (const item of items) {\n if (!item.file) {\n if (item.idOrKey) {\n results.push(item.idOrKey);\n }\n } else {\n if (idOrKeys?.[idx]) {\n results.push(idOrKeys[idx]);\n idx++;\n }\n }\n }\n this.model.set(results);\n };\n\n /**\n * Mở popup preview ảnh.\n */\n preview = async () => {\n this.previewFileComponent()?.open(this.previewFiles());\n };\n\n /**\n * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\n * * Ưu tiên:\n * 1. Tải xuống từ thuộc tính `file`.\n * 2. Tải xuống từ thuộc tính `src`.\n * 3. Gọi hàm download dựa vào `idOrKey`.\n *\n * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\n */\n onDownload = (previewFile: PreviewFile) => {\n if (previewFile.file || previewFile.src) {\n SdUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\n return;\n }\n if (previewFile.idOrKey) {\n this.#uploadFileConfig?.download?.(previewFile.idOrKey, this.args());\n return;\n }\n console.error('Invalid preview file', previewFile);\n };\n\n isLastVisibleOverlay(fileIndex: number): boolean {\n return this.formControl.disabled && fileIndex === this.maxOfImage() - 1 && this.previewFiles().length > this.maxOfImage();\n }\n\n // ─── Details ──────────────────────────────────────────────────────────\n /**\n * Khi binding model, đầu vào thường là id/key/cdn,\n * cần render ra ảnh/tệp tương ứng.\n */\n #details = async (keys: (string | number)[]) => {\n if (!Array.isArray(keys) || !keys.length) {\n return [];\n }\n const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\n let detailsList: SdUploadFileDetail[] = [];\n const details = this.details() || this.#uploadFileConfig?.details;\n if (idOrKeys.length && details) {\n detailsList = await details(idOrKeys, this.args()).catch(error => {\n console.error(error);\n return [];\n });\n }\n const results: PreviewFile[] = [];\n for (const key of keys.filter(val => !!val)) {\n if (this.#isCdn(key)) {\n const cdn = key?.toString();\n const extension = this.#getExtension(cdn);\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\n results.push({\n idOrKey: cdn,\n fileName: cdn,\n file: null,\n previewSrc: null,\n src: cdn,\n isPreviewImage,\n extension,\n });\n } else if (this.#isHashedKey(key)) {\n const hashedKey = key?.toString();\n const file = this.#uploadFileService.get(hashedKey)!;\n const lastDot = file.name.lastIndexOf('.');\n const extension = file.name.substring(lastDot + 1);\n const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\n results.push({\n file,\n isPreviewImage,\n previewSrc: null,\n src: null,\n fileName: file.name,\n fileSize: file.size,\n extension,\n });\n } else {\n const detail = detailsList.find(e => e.idOrKey === key);\n if (detail) {\n const { idOrKey, cdn, name, size } = detail;\n const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\n const isPreviewImage = this.type() === 'image' || IsImage(extension);\n results.push({\n idOrKey: idOrKey || cdn,\n fileName: name,\n fileSize: size,\n file: null,\n previewSrc: null,\n src: cdn,\n isPreviewImage,\n extension,\n });\n }\n }\n }\n return results;\n };\n\n // ─── Helpers ──────────────────────────────────────────────────────────\n #isCdn = (idOrKey: string | number) => {\n if (typeof idOrKey !== 'string') return false;\n return idOrKey.startsWith('http');\n };\n\n #isHashedKey = (idOrKey: string | number) => {\n if (typeof idOrKey !== 'string') return false;\n return this.#uploadFileService.isHashedKey(idOrKey);\n };\n\n #getExtension = (cdn: string | undefined) => {\n if (!cdn) return undefined;\n const baseSrc = cdn?.split?.('?')?.[0];\n const lastDot = baseSrc?.lastIndexOf?.('.');\n if (lastDot > 0) {\n return baseSrc.substring(lastDot + 1);\n }\n return undefined;\n };\n\n /**\n * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\n * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\n */\n #revokePreviewBlobURLs = (): void => {\n const files = this.previewFiles();\n if (!Array.isArray(files) || !files?.length) return;\n files.forEach(p => {\n if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\n URL.revokeObjectURL(p.previewSrc);\n }\n if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\n URL.revokeObjectURL(p.src);\n }\n });\n };\n}\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\n @if (!!sdLabelDef()?.templateRef) {\n <ng-container *ngTemplateOutlet=\"sdLabelDef()?.templateRef!\"> </ng-container>\n } @else if (label()) {\n <sd-label [label]=\"label()!\" [description]=\"generatedDescription()\" [helperText]=\"helperText()\" [required]=\"required()\"></sd-label>\n }\n <div\n cdkDropList\n (cdkDropListDropped)=\"onDrop($event)\"\n cdkDropListOrientation=\"horizontal\"\n class=\"d-flex\"\n [class.justify-content-center]=\"align() === 'center'\"\n [class.justify-content-start]=\"align() === 'left'\">\n @if (previewFiles().length < max() && !formControl.disabled) {\n <div\n class=\"d-flex justify-content-center align-items-center pointer c-area-upload\"\n [style.width]=\"previewWidth()\"\n [style.height]=\"previewHeight()\"\n (click)=\"onUpload()\"\n aria-hidden=\"true\"\n #dropElement>\n <mat-icon class=\"c-upload\" fontSet=\"material-icons-outlined\"> file_upload </mat-icon>\n </div>\n }\n @let previewImages = previewFiles() | filterImage;\n @for (image of previewImages; track $index; let idx = $index) {\n @if (!formControl.disabled || idx < maxOfImage()) {\n <div class=\"c-area c-view\" [class.c-loading]=\"!image.previewSrc && !image.src\" [class.c-area-error]=\"image.isImgError\" [style.width]=\"previewWidth()\" [style.height]=\"previewHeight()\" cdkDrag>\n <div class=\"c-drag-placeholder\" [style.width]=\"previewWidth()\" [style.height]=\"previewHeight()\" *cdkDragPlaceholder></div>\n <div *cdkDragPreview [style]=\"{ width: previewWidth(), height: previewHeight() }\" class=\"c-drag-preview\">\n <div class=\"c-container\">\n <mat-icon>image</mat-icon>\n </div>\n </div>\n <div class=\"c-preview\">\n <div\n class=\"c-img-container\"\n [class.c-disabled]=\"formControl.disabled\"\n [class.c-selected]=\"selectedFile() === image\"\n [class.has-overlay]=\"idx === maxOfImage() - 1 && formControl.disabled\"\n (click)=\"onSelect(image)\"\n aria-hidden=\"true\">\n @if (image.isImgError) {\n <img class=\"c-img-error\" alt=\"Image Error\" [style.max-height]=\"previewHeight()\" />\n } @else if(image.previewSrc) {\n <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"previewHeight()\" (error)=\"onImgError(image)\" />\n } @else if(image.src) {\n <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"previewHeight()\" (error)=\"onImgError(image)\" />\n } @else {\n <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\n }\n @if (idx === maxOfImage() - 1 && formControl.disabled && previewImages.length > maxOfImage()) {\n <div class=\"c-overlay-count\" (click)=\"preview()\">\n <div class=\"c-overlay-text\">+{{ previewImages.length - maxOfImage() }}</div>\n </div>\n }\n <div class=\"c-action\">\n <mat-icon class=\"c-zoom\" fontSet=\"material-icons-outlined\" (click)=\"preview()\">zoom_in</mat-icon>\n </div>\n @if (!formControl.disabled) {\n <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n @let previewDocuments = previewFiles() | filterDocument;\n @for (document of previewDocuments; track $index) {\n <div class=\"c-document-container\">\n <img\n [style.max-height]=\"previewHeight()\"\n class=\"c-document-image\"\n [class]=\"{\n png: document.extension === 'png',\n jpg: document.extension === 'jpg',\n pdf: document.extension === 'pdf',\n doc: document.extension === 'doc',\n docx: document.extension === 'docx',\n xls: document.extension === 'xls',\n xlsx: document.extension === 'xlsx',\n ppt: document.extension === 'ppt',\n pptx: document.extension === 'pptx',\n csv: document.extension === 'csv',\n psd: document.extension === 'psd',\n xml: document.extension === 'xml',\n zip: document.extension === 'zip',\n tiff: document.extension === 'tiff'\n }\"\n alt=\"Preview\" />\n <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\n @if (document.fileSize) {\n <span class=\"T12R text-black400\"> - </span>\n <span class=\"T12R text-black400 flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\n }\n\n @if (!formControl.disabled) {\n <mat-icon class=\"c-close\" (click)=\"onRemove(document)\">close</mat-icon>\n }\n </div>\n }\n @if (!formControl.disabled && formControl.touched && formControl.errors?.['required']) {\n <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ 'Vui lòng tải lên tệp/ảnh' }}</div>\n }\n</div>\n<preview (download)=\"onDownload($event)\"></preview>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SdUtilities"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;MASa,4BAA4B,GAAG,IAAI,cAAc,CAA6B,8BAA8B;;MCK5G,gBAAgB,CAAA;AASP,IAAA,EAAA;AARA,IAAA,KAAK;AACf,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAe;AAC1C,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;IAE1C,KAAK,GAAW,SAAS;IACzB,iBAAiB,GAAwC,OAAO;IAChE,WAAW,GAAG,CAAC;IACf,YAAY,GAAkB,EAAE;AAChC,IAAA,WAAA,CAAoB,EAAqB,EAAA;QAArB,IAAA,CAAA,EAAE,GAAF,EAAE;IAAsB;;AAG5C,IAAA,IAAI,GAAG,OAAO,YAA8C,EAAE,KAAc,KAAI;AAC9E,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7D;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAClB,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,KAAa,KAAI;AACxC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,kBAAkB,GAAG,CAAC,SAAiB,KAAI;QACzC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AACvG,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,KAAK,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AACrE,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;IAED,OAAO,GAAG,MAAK;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,KAAa,EAAE,IAA6C,KAAI;AAC7E,QAAA,MAAM,MAAM,GAAW,gBAAgB,GAAG,KAAK;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AACA,QAAA,MAAM,SAAS,GAA0B,IAAI,IAAI,OAAO;AACxD,QAAA,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClE,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/B,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;wGAlDU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAChB,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfpB,48HAiFA,EAAA,MAAA,EAAA,CAAA,yq6DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDrEY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEvC,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAAA,eAAA,EAGF,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAA,QAAA,EAAA,48HAAA,EAAA,MAAA,EAAA,CAAA,yq6DAAA,CAAA,EAAA;sFAG/B,KAAK,EAAA,CAAA;sBAAxB,SAAS;uBAAC,OAAO;gBACR,QAAQ,EAAA,CAAA;sBAAjB;gBACS,KAAK,EAAA,CAAA;sBAAd;;;MEXU,eAAe,CAAA;AAC1B,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE;wGAHW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,kBAAkB,CAAA;AAC7B,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE;wGAHW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACLD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AACxD,MAAM,OAAO,GAAG,CAAC,SAAoC,KAAI;IAC9D,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,KAAK;IACd;IACA,OAAO,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AAC5D,CAAC;;MCFY,iBAAiB,CAAA;IAC5B,MAAM,GAAyB,EAAE;AAEjC,IAAA,KAAK,GAAG,CAAC,IAAU,KAAI;QACrB,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,GAAW,KAAI;QAC5B,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,KAAK;QACd;QACA,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC3B,IAAA,CAAC;AAED,IAAA,GAAG,GAAG,CAAC,GAAW,KAAI;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACzB,IAAA,CAAC;AAED,IAAA,GAAG,GAAG,CAAC,IAAU,KAAI;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;QACzB;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,SAAwB,KAAI;QACpC,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AACA,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;AAC/B,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/B;YACA;QACF;QACA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,GAAG,EAAE;AACP,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACzB;AACF,IAAA,CAAC;wGA9CU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACHlC;AACA;AAyCA;MAmBa,YAAY,CAAA;;AAEd,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC1C,iBAAiB,GAAG,MAAM,CAA6B,4BAA4B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxG,IAAA,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGhC,IAAA,EAAE,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;AACpB,IAAA,iBAAiB,GAAGA,aAAW,CAAC,QAAQ,EAAE;AAC1C,IAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;AAC1B,IAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;AACnC,IAAA,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE;AACjB,IAAA,UAAU;AAED,IAAA,WAAW,GAAG,IAAI,aAAa,EAAE;;AAGjC,IAAA,YAAY,GAAG,MAAM,CAAgB,EAAE,CAAC;AACxC,IAAA,YAAY,GAAG,MAAM,CAAiC,SAAS,CAAC;;AAGhE,IAAA,oBAAoB,GAAG,SAAS,CAAC,gBAAgB,CAAC;AAClD,IAAA,YAAY,GAAG,YAAY,CAAa,aAAa,CAAC;AACtD,IAAA,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC;;IAG9C,IAAI,GAAG,KAAK,EAAS;IACrB,KAAK,GAAG,KAAK,EAAU;IACvB,WAAW,GAAG,KAAK,EAAU;AAC7B,IAAA,YAAY,GAAG,KAAK,CAAS,MAAM,CAAC;AACpC,IAAA,aAAa,GAAG,KAAK,CAAS,MAAM,CAAC;AACrC,IAAA,KAAK,GAAG,KAAK,CAAoB,MAAM,CAAC;IACxC,OAAO,GAAG,KAAK,EAAgC;IAC/C,cAAc,GAAG,KAAK,EAAuC;IAC7D,OAAO,GAAG,KAAK,EAAU;IACzB,QAAQ,GAAG,KAAK,EAAU;IAC1B,SAAS,GAAG,KAAK,EAAU;IAC3B,YAAY,GAAG,KAAK,EAAU;;AAGvC,IAAA,IAAI,GAAG,KAAK,CAA6B,SAAS,EAAE;AAClD,QAAA,SAAS,EAAE,CAAC,GAAQ,KAA2B;AAC7C,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,SAAS;;YAE1B,IAAI,GAAG,YAAY,MAAM;gBAAE,OAAO,GAAG,CAAC,IAAI;;YAE1C,IAAI,GAAG,YAAY,SAAS;AAAE,gBAAA,OAAO,GAAG;;AAExC,YAAA,IAAI,GAAG,EAAE,IAAI,YAAY,SAAS;gBAAE,OAAO,GAAG,CAAC,IAAI;AACnD,YAAA,OAAO,SAAS;QAClB,CAAC;AACF,KAAA,CAAC;AAEO,IAAA,SAAS,GAAG,KAAK,CAA6B,IAAI,CAAC,EAAE,EAAE,EAAE;AAChE,QAAA,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE;AAC7C,KAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,KAAK,CAA2C,KAAK,EAAE;AACzE,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG;AACjD,KAAA,CAAC;AAEO,IAAA,IAAI,GAAG,KAAK,CAAkF,MAAM,EAAE;AAC7G,QAAA,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,CAAC,GAAG,KAAoC,GAAG,IAAI,MAAM;AACjE,KAAA,CAAC;IAEO,UAAU,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAE1E,IAAA,GAAG,GAAG,KAAK,CAAoC,EAAE,EAAE;AAC1D,QAAA,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,EAAE;AACtC,KAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAoC,CAAC,EAAE;AAChE,QAAA,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,CAAC;AACrC,KAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAwC,EAAE,EAAE;AACrE,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,SAAS,EAAE,CAAC,GAAG,KAAe,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;AACzD,KAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,KAAK,CAA2C,KAAK,EAAE;AACzE,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG;AACjD,KAAA,CAAC;;AAGO,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;YACxB,OAAO,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,YAAA,EAAe,KAAK,CAAA,EAAA,CAAI;QAC9D;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACtB,OAAO,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACxC;aAAO,IAAI,KAAK,EAAE;YAChB,OAAO,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI;QAC7B;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC,CAAC;;IAGO,MAAM,GAAG,MAAM,EAAiB;IAChC,YAAY,GAAG,MAAM,EAAqB;;AAG1C,IAAA,KAAK,GAAG,KAAK,CAAsB,EAAE,CAAC;AAE/C,IAAA,WAAA,GAAA;;QAEE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;;AAGzD,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC3B,IAAI,CAAC,mBAAmB,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;AAEjC,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,IAAG;AACxC,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;oBACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,YAAY;AACd,yBAAA,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;yBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAsB,CAC7C;oBACD,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5B;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAC5C,QAAA,CAAC,CAAC;IACJ;;IAIA,mBAAmB,GAAA;AACjB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,IAAI,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;QACrC;IACF;AAEA,IAAA,eAAe,CAAC,aAA0B,EAAA;QACxC,aAAa,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,GAAU,KAAI;YACxD,GAAG,CAAC,cAAc,EAAE;AACnB,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB;AAC/C,QAAA,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAU,KAAI;YACzD,GAAG,CAAC,cAAc,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAK;AAC9C,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB;AAChD,QAAA,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAc,KAAI;YAC9D,GAAG,CAAC,cAAc,EAAE;AACnB,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB;YAC9C,MAAM,KAAK,GAAW,EAAE;YACxB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE;AAChD,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB;AACA,YAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;;IAGA,MAAM,GAAG,MAAK;AACZ,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/C,IAAA,CAAC;;;;;;;;;;;;;AAgBD,IAAA,SAAS,GAAG,OAAO,IAAU,KAA4B;AACvD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;AACvC,gBAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,iCAAiC;YACvD;QACF;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,IAAI,EAAE,MAAM,EAAE;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE;AAChE,gBAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,oCAAA,EAAuC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;YAC9E;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5B,IAAI,KAAK,EAAE;YACT,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACnC,gBAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAA,yBAAA,EAA4B,KAAK,KAAK;YAC5D;QACF;QACA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE;YAC7F,MAAM,OAAO,GAAkB,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS;AAC1C,gBAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,gBAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,oBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC1B,oBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;AAC3B,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;oBACpC,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE;wBACxB,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA,kBAAA,EAAqB,EAAE,CAAA,EAAA,CAAI,CAAC;wBACjD;oBACF;oBACA,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;wBACzB,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA,mBAAA,EAAsB,EAAE,CAAA,EAAA,CAAI,CAAC;wBAClD;oBACF;oBACA,IAAI,MAAM,EAAE;AACV,wBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACpB;oBACF;oBACA,OAAO,CAAC,IAAI,CAAC;AACf,gBAAA,CAAC;gBACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,YAAA,CAAC,CAAC;YACF,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,OAAO;YAChB;QACF;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,QAAQ,GAAG,MAAK;AACd,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;AACjE,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,GAAG,IAAG;gBACpB,WAAW,CAAC,UAAU,GAAG,GAAG,CAAC,MAAO,CAAC,MAAM;AAC3C,gBAAA,WAAW,CAAC,cAAc;oBACxB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY;;AAE7F,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACjD,YAAA,CAAC;AACD,YAAA,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAK,CAAC;QACzC;AACF,IAAA,CAAC;;IAGD,QAAQ,GAAG,MAAK;QACdA,aAAW,CAAC,MAAM,CAAC;AACjB,YAAA,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;SACzB;AACE,aAAA,IAAI,CAAC,OAAM,MAAM,KAAG;YACnB,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,oBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAChC;qBAAO;oBACL,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;gBAClC;YACF;AACF,QAAA,CAAC;aACA,KAAK,CAAC,KAAK,IAAG;AACb,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YACpB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,2CAA2C,CAAC;AAC1F,QAAA,CAAC,CAAC;AACN,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,OAAO,WAAmB,KAAI;AAC1C,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA,0DAAA,CAA4D,CAAC;YACzF;QACF;AACA,QAAA,KAAK,IAAI,IAAI,IAAI,WAAW,EAAE;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;AACjF,YAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC7C,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAK,CAAC;YAClC;YACA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAK,CAAC;YAC3C,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;gBACpC;YACF;YACA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,IAAI,SAAS,EAAE;AACb,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE;AACf,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAiB,KAAI;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,YAAA,IAAI,CAAC;iBACF,OAAO,CAAC,iEAAiE,EAAE;AAC1E,gBAAA,KAAK,EAAE,eAAe;AACtB,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,cAAc,EAAE,SAAS;AACzB,gBAAA,aAAa,EAAE,SAAS;aACzB;iBACA,IAAI,CAAC,MAAK;AACT,gBAAA,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1B,gBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9B,gBAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,gBAAA,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,YAAY;AACd,qBAAA,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;qBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAsB,CAC7C;gBACD,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,CAAC,CAAC;QACN;AACF,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,KAA4B,KAAI;AACxC,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE;AACf,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,WAAW,CAAC,UAAU,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACjD,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAiB,KAAI;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B;QACF;QACA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACnE,IAAA,CAAC;;AAGD,IAAA,OAAO,GAAG,OAAO,IAAU,KAAmB;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE;AAClB,YAAA,OAAO,IAAI;QACb;QACA,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS;AAC1C,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,gBAAA,IAAI;AACF,oBAAA,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAG,EAAE;AAClD,wBAAA,OAAO,OAAO,CAAC,IAAI,CAAC;oBACtB;oBACA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAG,CAAC;AAClF,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK;AACrB,oBAAA,OAAO,CAAC,MAAM,GAAG,MAAM;oBAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACrC,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK;AACrB,oBAAA,OAAO,CAAC,MAAM,GAAG,MAAM;AACvB,oBAAA,IAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;oBACzD,IAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AACzE,oBAAA,IAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;AAC9G,oBAAA,OAAO,CAAC,MAAM,CAAC,IAAI,IAAG;wBACpB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA,IAAA,CAAM,CAAC,CAAC;AAC5E,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,GAAG,EAAE;oBACZ,MAAM,CAAC,GAAG,CAAC;gBACb;wBAAU;oBACR,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;oBAChD,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;gBAClD;AACF,YAAA,CAAC;YACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,aAAqB,KAAI;QAChE,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B;AACA,QAAA,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAK,IAAI,CAAC;YACV,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAClC,YAAA,IAAI,KAAK,GAAG,MAAM,IAAI,aAAa,EAAE;gBACnC;YACF;QACF;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;AAC1B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,IAAU,EAAE,QAAgB,KAAU;QACnD,MAAM,IAAI,GAAQ,IAAI;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,QAAA,OAAO,IAAY;AACrB,IAAA,CAAC;;AAGD;;AAEG;IACH,QAAQ,GAAG,YAAW;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;AACvD,IAAA,CAAC;AAED;;;AAGG;IACH,MAAM,GAAG,YAAW;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;QACF;QACA,MAAM,OAAO,GAAwB,EAAE;QACvC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;QACpE,IAAI,QAAQ,GAAa,EAAE;AAC3B,QAAA,IAAI,aAAa,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAC1B,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAG;AACxF,oBAAA,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;AACxC,wBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC9C;AACA,oBAAA,OAAO,OAAO;AAChB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA,4CAAA,CAA8C,CAAC;YAC3E;QACF;QACA,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC5B;YACF;iBAAO;AACL,gBAAA,IAAI,QAAQ,GAAG,GAAG,CAAC,EAAE;oBACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAA,GAAG,EAAE;gBACP;YACF;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,IAAA,CAAC;AAED;;AAEG;IACH,OAAO,GAAG,YAAW;QACnB,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACxD,IAAA,CAAC;AAED;;;;;;;;AAQG;AACH,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;QACxC,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,EAAE;AACvC,YAAAA,aAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAK,IAAI,WAAW,CAAC,GAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;YACjF;QACF;AACA,QAAA,IAAI,WAAW,CAAC,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACpE;QACF;AACA,QAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,WAAW,CAAC;AACpD,IAAA,CAAC;AAED,IAAA,oBAAoB,CAAC,SAAiB,EAAA;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;IAC3H;;AAGA;;;AAGG;AACH,IAAA,QAAQ,GAAG,OAAO,IAAyB,KAAI;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAwB;QACjH,IAAI,WAAW,GAAyB,EAAE;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,OAAO;AACjE,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE;AAC9B,YAAA,WAAW,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AAC/D,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,CAAC;QACJ;QACA,MAAM,OAAO,GAAkB,EAAE;AACjC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;AAC3C,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AACpB,gBAAA,MAAM,GAAG,GAAG,GAAG,EAAE,QAAQ,EAAE;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzC,gBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC;AACX,oBAAA,OAAO,EAAE,GAAG;AACZ,oBAAA,QAAQ,EAAE,GAAG;AACb,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,GAAG,EAAE,GAAG;oBACR,cAAc;oBACd,SAAS;AACV,iBAAA,CAAC;YACJ;AAAO,iBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AACjC,gBAAA,MAAM,SAAS,GAAG,GAAG,EAAE,QAAQ,EAAE;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAE;gBACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;AAClD,gBAAA,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC;gBAChH,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,cAAc;AACd,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,GAAG,EAAE,IAAI;oBACT,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS;AACV,iBAAA,CAAC;YACJ;iBAAO;AACL,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;gBACvD,IAAI,MAAM,EAAE;oBACV,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM;AAC3C,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzF,oBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;oBACpE,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO,EAAE,OAAO,IAAI,GAAG;AACvB,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,IAAI,EAAE,IAAI;AACV,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,GAAG,EAAE,GAAG;wBACR,cAAc;wBACd,SAAS;AACV,qBAAA,CAAC;gBACJ;YACF;QACF;AACA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC;;AAGD,IAAA,MAAM,GAAG,CAAC,OAAwB,KAAI;QACpC,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AAC7C,QAAA,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;AACnC,IAAA,CAAC;AAED,IAAA,YAAY,GAAG,CAAC,OAAwB,KAAI;QAC1C,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC7C,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC;AACrD,IAAA,CAAC;AAED,IAAA,aAAa,GAAG,CAAC,GAAuB,KAAI;AAC1C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;AAC1B,QAAA,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,WAAW,GAAG,GAAG,CAAC;AAC3C,QAAA,IAAI,OAAO,GAAG,CAAC,EAAE;YACf,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;QACvC;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED;;;AAGG;IACH,sBAAsB,GAAG,MAAW;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE;AAC7C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;AAChB,YAAA,IAAI,OAAO,CAAC,EAAE,UAAU,KAAK,QAAQ,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC1E,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;YACnC;AACA,YAAA,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC5D,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;wGA3nBU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAyBY,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAFZ,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpF5D,85KA6GA,EAAA,MAAA,EAAA,CAAA,w2pcAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5DI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,mLACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChB,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGT,YAAY,EAAA,UAAA,EAAA,CAAA;kBAlBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,OAAO;wBACP,gBAAgB;wBAChB,eAAe;wBACf,kBAAkB;wBAClB,kBAAkB;wBAClB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,85KAAA,EAAA,MAAA,EAAA,CAAA,w2pcAAA,CAAA,EAAA;;;AE3DH;;AAEG;;;;"}
|
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.58",
|
|
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",
|
|
@@ -30,30 +30,30 @@
|
|
|
30
30
|
"types": "./index.d.ts",
|
|
31
31
|
"default": "./fesm2022/sd-angular-core.mjs"
|
|
32
32
|
},
|
|
33
|
-
"./
|
|
34
|
-
"types": "./
|
|
35
|
-
"default": "./fesm2022/sd-angular-core-
|
|
33
|
+
"./components": {
|
|
34
|
+
"types": "./components/index.d.ts",
|
|
35
|
+
"default": "./fesm2022/sd-angular-core-components.mjs"
|
|
36
36
|
},
|
|
37
37
|
"./configurations": {
|
|
38
38
|
"types": "./configurations/index.d.ts",
|
|
39
39
|
"default": "./fesm2022/sd-angular-core-configurations.mjs"
|
|
40
40
|
},
|
|
41
|
-
"./
|
|
42
|
-
"types": "./
|
|
43
|
-
"default": "./fesm2022/sd-angular-core-
|
|
41
|
+
"./directives": {
|
|
42
|
+
"types": "./directives/index.d.ts",
|
|
43
|
+
"default": "./fesm2022/sd-angular-core-directives.mjs"
|
|
44
44
|
},
|
|
45
45
|
"./forms": {
|
|
46
46
|
"types": "./forms/index.d.ts",
|
|
47
47
|
"default": "./fesm2022/sd-angular-core-forms.mjs"
|
|
48
48
|
},
|
|
49
|
-
"./handlers": {
|
|
50
|
-
"types": "./handlers/index.d.ts",
|
|
51
|
-
"default": "./fesm2022/sd-angular-core-handlers.mjs"
|
|
52
|
-
},
|
|
53
49
|
"./guards": {
|
|
54
50
|
"types": "./guards/index.d.ts",
|
|
55
51
|
"default": "./fesm2022/sd-angular-core-guards.mjs"
|
|
56
52
|
},
|
|
53
|
+
"./handlers": {
|
|
54
|
+
"types": "./handlers/index.d.ts",
|
|
55
|
+
"default": "./fesm2022/sd-angular-core-handlers.mjs"
|
|
56
|
+
},
|
|
57
57
|
"./interceptors": {
|
|
58
58
|
"types": "./interceptors/index.d.ts",
|
|
59
59
|
"default": "./fesm2022/sd-angular-core-interceptors.mjs"
|
|
@@ -98,6 +98,10 @@
|
|
|
98
98
|
"types": "./components/button/index.d.ts",
|
|
99
99
|
"default": "./fesm2022/sd-angular-core-components-button.mjs"
|
|
100
100
|
},
|
|
101
|
+
"./components/history": {
|
|
102
|
+
"types": "./components/history/index.d.ts",
|
|
103
|
+
"default": "./fesm2022/sd-angular-core-components-history.mjs"
|
|
104
|
+
},
|
|
101
105
|
"./components/code-editor": {
|
|
102
106
|
"types": "./components/code-editor/index.d.ts",
|
|
103
107
|
"default": "./fesm2022/sd-angular-core-components-code-editor.mjs"
|
|
@@ -106,18 +110,14 @@
|
|
|
106
110
|
"types": "./components/document-builder/index.d.ts",
|
|
107
111
|
"default": "./fesm2022/sd-angular-core-components-document-builder.mjs"
|
|
108
112
|
},
|
|
109
|
-
"./components/
|
|
110
|
-
"types": "./components/
|
|
111
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
113
|
+
"./components/mini-editor": {
|
|
114
|
+
"types": "./components/mini-editor/index.d.ts",
|
|
115
|
+
"default": "./fesm2022/sd-angular-core-components-mini-editor.mjs"
|
|
112
116
|
},
|
|
113
117
|
"./components/import-excel": {
|
|
114
118
|
"types": "./components/import-excel/index.d.ts",
|
|
115
119
|
"default": "./fesm2022/sd-angular-core-components-import-excel.mjs"
|
|
116
120
|
},
|
|
117
|
-
"./components/mini-editor": {
|
|
118
|
-
"types": "./components/mini-editor/index.d.ts",
|
|
119
|
-
"default": "./fesm2022/sd-angular-core-components-mini-editor.mjs"
|
|
120
|
-
},
|
|
121
121
|
"./components/modal": {
|
|
122
122
|
"types": "./components/modal/index.d.ts",
|
|
123
123
|
"default": "./fesm2022/sd-angular-core-components-modal.mjs"
|
|
@@ -138,17 +138,21 @@
|
|
|
138
138
|
"types": "./components/section/index.d.ts",
|
|
139
139
|
"default": "./fesm2022/sd-angular-core-components-section.mjs"
|
|
140
140
|
},
|
|
141
|
+
"./components/tab-router": {
|
|
142
|
+
"types": "./components/tab-router/index.d.ts",
|
|
143
|
+
"default": "./fesm2022/sd-angular-core-components-tab-router.mjs"
|
|
144
|
+
},
|
|
141
145
|
"./components/side-drawer": {
|
|
142
146
|
"types": "./components/side-drawer/index.d.ts",
|
|
143
147
|
"default": "./fesm2022/sd-angular-core-components-side-drawer.mjs"
|
|
144
148
|
},
|
|
145
|
-
"./components/
|
|
146
|
-
"types": "./components/
|
|
147
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
149
|
+
"./components/table": {
|
|
150
|
+
"types": "./components/table/index.d.ts",
|
|
151
|
+
"default": "./fesm2022/sd-angular-core-components-table.mjs"
|
|
148
152
|
},
|
|
149
|
-
"./components/
|
|
150
|
-
"types": "./components/
|
|
151
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
153
|
+
"./components/view": {
|
|
154
|
+
"types": "./components/view/index.d.ts",
|
|
155
|
+
"default": "./fesm2022/sd-angular-core-components-view.mjs"
|
|
152
156
|
},
|
|
153
157
|
"./components/workflow": {
|
|
154
158
|
"types": "./components/workflow/index.d.ts",
|
|
@@ -158,14 +162,14 @@
|
|
|
158
162
|
"types": "./forms/autocomplete/index.d.ts",
|
|
159
163
|
"default": "./fesm2022/sd-angular-core-forms-autocomplete.mjs"
|
|
160
164
|
},
|
|
161
|
-
"./components/view": {
|
|
162
|
-
"types": "./components/view/index.d.ts",
|
|
163
|
-
"default": "./fesm2022/sd-angular-core-components-view.mjs"
|
|
164
|
-
},
|
|
165
165
|
"./forms/checkbox": {
|
|
166
166
|
"types": "./forms/checkbox/index.d.ts",
|
|
167
167
|
"default": "./fesm2022/sd-angular-core-forms-checkbox.mjs"
|
|
168
168
|
},
|
|
169
|
+
"./forms/chip-calendar": {
|
|
170
|
+
"types": "./forms/chip-calendar/index.d.ts",
|
|
171
|
+
"default": "./fesm2022/sd-angular-core-forms-chip-calendar.mjs"
|
|
172
|
+
},
|
|
169
173
|
"./forms/chip": {
|
|
170
174
|
"types": "./forms/chip/index.d.ts",
|
|
171
175
|
"default": "./fesm2022/sd-angular-core-forms-chip.mjs"
|
|
@@ -174,18 +178,14 @@
|
|
|
174
178
|
"types": "./forms/date/index.d.ts",
|
|
175
179
|
"default": "./fesm2022/sd-angular-core-forms-date.mjs"
|
|
176
180
|
},
|
|
177
|
-
"./forms/
|
|
178
|
-
"types": "./forms/
|
|
179
|
-
"default": "./fesm2022/sd-angular-core-forms-
|
|
181
|
+
"./forms/datetime": {
|
|
182
|
+
"types": "./forms/datetime/index.d.ts",
|
|
183
|
+
"default": "./fesm2022/sd-angular-core-forms-datetime.mjs"
|
|
180
184
|
},
|
|
181
185
|
"./forms/date-range": {
|
|
182
186
|
"types": "./forms/date-range/index.d.ts",
|
|
183
187
|
"default": "./fesm2022/sd-angular-core-forms-date-range.mjs"
|
|
184
188
|
},
|
|
185
|
-
"./forms/datetime": {
|
|
186
|
-
"types": "./forms/datetime/index.d.ts",
|
|
187
|
-
"default": "./fesm2022/sd-angular-core-forms-datetime.mjs"
|
|
188
|
-
},
|
|
189
189
|
"./forms/directives": {
|
|
190
190
|
"types": "./forms/directives/index.d.ts",
|
|
191
191
|
"default": "./fesm2022/sd-angular-core-forms-directives.mjs"
|
|
@@ -194,29 +194,25 @@
|
|
|
194
194
|
"types": "./forms/input/index.d.ts",
|
|
195
195
|
"default": "./fesm2022/sd-angular-core-forms-input.mjs"
|
|
196
196
|
},
|
|
197
|
-
"./forms/input-number": {
|
|
198
|
-
"types": "./forms/input-number/index.d.ts",
|
|
199
|
-
"default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
|
|
200
|
-
},
|
|
201
197
|
"./forms/label": {
|
|
202
198
|
"types": "./forms/label/index.d.ts",
|
|
203
199
|
"default": "./fesm2022/sd-angular-core-forms-label.mjs"
|
|
204
200
|
},
|
|
201
|
+
"./forms/input-number": {
|
|
202
|
+
"types": "./forms/input-number/index.d.ts",
|
|
203
|
+
"default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
|
|
204
|
+
},
|
|
205
205
|
"./forms/models": {
|
|
206
206
|
"types": "./forms/models/index.d.ts",
|
|
207
207
|
"default": "./fesm2022/sd-angular-core-forms-models.mjs"
|
|
208
208
|
},
|
|
209
|
-
"./forms/select": {
|
|
210
|
-
"types": "./forms/select/index.d.ts",
|
|
211
|
-
"default": "./fesm2022/sd-angular-core-forms-select.mjs"
|
|
212
|
-
},
|
|
213
209
|
"./forms/radio": {
|
|
214
210
|
"types": "./forms/radio/index.d.ts",
|
|
215
211
|
"default": "./fesm2022/sd-angular-core-forms-radio.mjs"
|
|
216
212
|
},
|
|
217
|
-
"./forms/
|
|
218
|
-
"types": "./forms/
|
|
219
|
-
"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"
|
|
220
216
|
},
|
|
221
217
|
"./forms/textarea": {
|
|
222
218
|
"types": "./forms/textarea/index.d.ts",
|
|
@@ -226,18 +222,22 @@
|
|
|
226
222
|
"types": "./guards/permission/index.d.ts",
|
|
227
223
|
"default": "./fesm2022/sd-angular-core-guards-permission.mjs"
|
|
228
224
|
},
|
|
225
|
+
"./forms/switch": {
|
|
226
|
+
"types": "./forms/switch/index.d.ts",
|
|
227
|
+
"default": "./fesm2022/sd-angular-core-forms-switch.mjs"
|
|
228
|
+
},
|
|
229
229
|
"./modules/auth": {
|
|
230
230
|
"types": "./modules/auth/index.d.ts",
|
|
231
231
|
"default": "./fesm2022/sd-angular-core-modules-auth.mjs"
|
|
232
232
|
},
|
|
233
|
-
"./modules/keycloak": {
|
|
234
|
-
"types": "./modules/keycloak/index.d.ts",
|
|
235
|
-
"default": "./fesm2022/sd-angular-core-modules-keycloak.mjs"
|
|
236
|
-
},
|
|
237
233
|
"./modules/layout": {
|
|
238
234
|
"types": "./modules/layout/index.d.ts",
|
|
239
235
|
"default": "./fesm2022/sd-angular-core-modules-layout.mjs"
|
|
240
236
|
},
|
|
237
|
+
"./modules/keycloak": {
|
|
238
|
+
"types": "./modules/keycloak/index.d.ts",
|
|
239
|
+
"default": "./fesm2022/sd-angular-core-modules-keycloak.mjs"
|
|
240
|
+
},
|
|
241
241
|
"./modules/permission": {
|
|
242
242
|
"types": "./modules/permission/index.d.ts",
|
|
243
243
|
"default": "./fesm2022/sd-angular-core-modules-permission.mjs"
|
|
@@ -250,14 +250,14 @@
|
|
|
250
250
|
"types": "./services/cache/index.d.ts",
|
|
251
251
|
"default": "./fesm2022/sd-angular-core-services-cache.mjs"
|
|
252
252
|
},
|
|
253
|
-
"./services/docx": {
|
|
254
|
-
"types": "./services/docx/index.d.ts",
|
|
255
|
-
"default": "./fesm2022/sd-angular-core-services-docx.mjs"
|
|
256
|
-
},
|
|
257
253
|
"./services/confirm": {
|
|
258
254
|
"types": "./services/confirm/index.d.ts",
|
|
259
255
|
"default": "./fesm2022/sd-angular-core-services-confirm.mjs"
|
|
260
256
|
},
|
|
257
|
+
"./services/docx": {
|
|
258
|
+
"types": "./services/docx/index.d.ts",
|
|
259
|
+
"default": "./fesm2022/sd-angular-core-services-docx.mjs"
|
|
260
|
+
},
|
|
261
261
|
"./services/excel": {
|
|
262
262
|
"types": "./services/excel/index.d.ts",
|
|
263
263
|
"default": "./fesm2022/sd-angular-core-services-excel.mjs"
|
|
@@ -266,22 +266,22 @@
|
|
|
266
266
|
"types": "./services/firebase/index.d.ts",
|
|
267
267
|
"default": "./fesm2022/sd-angular-core-services-firebase.mjs"
|
|
268
268
|
},
|
|
269
|
-
"./services/license": {
|
|
270
|
-
"types": "./services/license/index.d.ts",
|
|
271
|
-
"default": "./fesm2022/sd-angular-core-services-license.mjs"
|
|
272
|
-
},
|
|
273
269
|
"./services/loading": {
|
|
274
270
|
"types": "./services/loading/index.d.ts",
|
|
275
271
|
"default": "./fesm2022/sd-angular-core-services-loading.mjs"
|
|
276
272
|
},
|
|
277
|
-
"./services/
|
|
278
|
-
"types": "./services/
|
|
279
|
-
"default": "./fesm2022/sd-angular-core-services-
|
|
273
|
+
"./services/license": {
|
|
274
|
+
"types": "./services/license/index.d.ts",
|
|
275
|
+
"default": "./fesm2022/sd-angular-core-services-license.mjs"
|
|
280
276
|
},
|
|
281
277
|
"./services/storage": {
|
|
282
278
|
"types": "./services/storage/index.d.ts",
|
|
283
279
|
"default": "./fesm2022/sd-angular-core-services-storage.mjs"
|
|
284
280
|
},
|
|
281
|
+
"./services/notify": {
|
|
282
|
+
"types": "./services/notify/index.d.ts",
|
|
283
|
+
"default": "./fesm2022/sd-angular-core-services-notify.mjs"
|
|
284
|
+
},
|
|
285
285
|
"./utilities/extensions": {
|
|
286
286
|
"types": "./utilities/extensions/index.d.ts",
|
|
287
287
|
"default": "./fesm2022/sd-angular-core-utilities-extensions.mjs"
|
|
@@ -290,9 +290,9 @@
|
|
|
290
290
|
"types": "./utilities/models/index.d.ts",
|
|
291
291
|
"default": "./fesm2022/sd-angular-core-utilities-models.mjs"
|
|
292
292
|
},
|
|
293
|
-
"./components/
|
|
294
|
-
"types": "./components/
|
|
295
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
293
|
+
"./components/upload-file": {
|
|
294
|
+
"types": "./components/upload-file/index.d.ts",
|
|
295
|
+
"default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
298
|
}
|
|
Binary file
|
|
Binary file
|