@sd-angular/core 19.0.0-beta.87 → 19.0.0-beta.88

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-upload-file.mjs","sources":["../../../projects/sd-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sd-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sd-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.html","../../../projects/sd-angular/components/upload-file/sd-angular-core-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Contract cấu hình cho cơ chế upload file của sd-angular.\r\n *\r\n * Cách dùng phổ biến:\r\n * - Portal có thể provide cấu hình mặc định ở tầng global.\r\n * - Mỗi module có thể provide thêm cấu hình riêng (thường với `multi: true`).\r\n * - Khi có nhiều cấu hình cùng lúc, dùng `key` để chọn đúng provider.\r\n *\r\n * Luồng xử lý:\r\n * 1) `upload`: upload file mới, trả về danh sách id/key.\r\n * 2) `details`: lấy metadata để render danh sách file từ id/key.\r\n * 3) `download` (optional): tải file theo id/key.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface ISdUploadFileConfiguration<TArgs = any> {\r\n /**\r\n * Định danh cấu hình upload.\r\n * Bắt buộc khi app có nhiều provider upload để tránh mapping nhầm.\r\n */\r\n key?: string;\r\n\r\n /** Upload file và trả về danh sách id/key dùng cho lưu trữ. */\r\n upload: SdUploadFileFuncUpload<TArgs>;\r\n\r\n /** Nhận danh sách id/key và trả về dữ liệu hiển thị file trong UI. */\r\n details: SdUploadFileFuncDetails<TArgs>;\r\n\r\n /** Tùy chọn: tải file về theo id/key. */\r\n download?: SdUploadFileFuncDownload<TArgs>;\r\n}\r\n\r\n/**\r\n * Token DI cho upload configuration.\r\n * Khuyến nghị provide dạng `multi: true` để hỗ trợ nhiều nguồn upload trong cùng app/module.\r\n */\r\nexport const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\r\n\r\n/** Hàm upload file và trả về danh sách id/key tương ứng. */\r\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\r\n\r\n/** Hàm lấy thông tin file phục vụ hiển thị từ danh sách id/key. */\r\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\r\n\r\n/** Hàm tải file theo id/key. */\r\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\r\n\r\nexport interface SdUploadFileDetail {\r\n /** Định danh file được backend trả về sau upload. */\r\n idOrKey: string;\r\n\r\n /** URL truy cập file (CDN hoặc direct URL). */\r\n cdn: string;\r\n\r\n /** Tên hiển thị file. */\r\n name?: string;\r\n\r\n /** Đuôi file: png, jpg, pdf... */\r\n extension?: string;\r\n\r\n /** Dung lượng file tính theo MB (nếu backend có trả về). */\r\n size?: number;\r\n}\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output, ViewChild } 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 SdUploadFileFuncDownload,\n SdUploadFileFuncDetails,\n SdUploadFileFuncUpload,\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 #configuration = inject<ISdUploadFileConfiguration | ISdUploadFileConfiguration[]>(\n SD_UPLOAD_FILE_CONFIGURATION,\n { optional: true }\n );\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 key = input<string | undefined>(undefined);\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 uploadInput = input<SdUploadFileFuncUpload<any> | undefined>(undefined, { alias: 'upload' });\n readonly details = input<SdUploadFileFuncDetails<any>>();\n readonly downloadInput = input<SdUploadFileFuncDownload<any> | undefined>(undefined, { alias: 'download' });\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 this.#validateDuplicateConfigKeys();\n\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 #getConfigurations = (): ISdUploadFileConfiguration[] => {\n const config = this.#configuration;\n if (!config) {\n return [];\n }\n return Array.isArray(config) ? config : [config];\n };\n\n #validateDuplicateConfigKeys = (): void => {\n const configurations = this.#getConfigurations();\n if (!configurations.length) {\n return;\n }\n\n const seen = new Set<string>();\n for (const cfg of configurations) {\n const key = cfg.key;\n const normalizedKey = key === undefined ? '__undefined__' : key;\n if (seen.has(normalizedKey)) {\n const label = key === undefined ? 'undefined' : key;\n throw new Error(`[sd-upload-file] Duplicate upload configuration key detected: ${label}`);\n }\n seen.add(normalizedKey);\n }\n };\n\n #getSelectedConfig = (): ISdUploadFileConfiguration | undefined => {\n const configurations = this.#getConfigurations();\n if (!configurations.length) {\n return undefined;\n }\n\n const key = this.key();\n return configurations.find(cfg => cfg.key === key);\n };\n\n #getUploadHandler = (): SdUploadFileFuncUpload<any> | undefined => {\n return this.uploadInput() || this.#getSelectedConfig()?.upload;\n };\n\n #getDetailsHandler = (): SdUploadFileFuncDetails<any> | undefined => {\n return this.details() || this.#getSelectedConfig()?.details;\n };\n\n #getDownloadHandler = (): SdUploadFileFuncDownload<any> | undefined => {\n return this.downloadInput() || this.#getSelectedConfig()?.download;\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 const uploadHandler = this.#getUploadHandler();\n if (uploadHandler) {\n idOrKeys = await uploadHandler(uploadedFiles, this.args()).then(results => {\n for (const uploadedFile of uploadedFiles) {\n this.#uploadFileService.remove(uploadedFile);\n }\n return results;\n });\n } else {\n const key = this.key();\n this.#notifyService.error(\n key === undefined\n ? 'Vui lòng inject SD_UPLOAD_FILE_CONFIGURATION hoặc truyền [upload] trực tiếp vào component'\n : `Không tìm thấy upload configuration theo key='${key}'. Vui lòng kiểm tra providers hoặc truyền [upload] trực tiếp`\n );\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.#getDownloadHandler()?.(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 detailsHandler = this.#getDetailsHandler();\n if (idOrKeys.length && detailsHandler) {\n detailsList = await detailsHandler(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":"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"}
1
+ {"version":3,"file":"sd-angular-core-components-upload-file.mjs","sources":["../../../projects/sd-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sd-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sd-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sd-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sd-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sd-angular/components/upload-file/src/upload-file.component.html","../../../projects/sd-angular/components/upload-file/sd-angular-core-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Contract cấu hình cho cơ chế upload file của sd-angular.\r\n *\r\n * Cách dùng phổ biến:\r\n * - Portal có thể provide cấu hình mặc định ở tầng global.\r\n * - Mỗi module có thể provide thêm cấu hình riêng (thường với `multi: true`).\r\n * - Khi có nhiều cấu hình cùng lúc, dùng `key` để chọn đúng provider.\r\n *\r\n * Luồng xử lý:\r\n * 1) `upload`: upload file mới, trả về danh sách id/key.\r\n * 2) `details`: lấy metadata để render danh sách file từ id/key.\r\n * 3) `download` (optional): tải file theo id/key.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface ISdUploadFileConfiguration<TArgs = any> {\r\n /**\r\n * Định danh cấu hình upload.\r\n * Bắt buộc khi app có nhiều provider upload để tránh mapping nhầm.\r\n */\r\n key?: string;\r\n\r\n /** Upload file và trả về danh sách id/key dùng cho lưu trữ. */\r\n upload: SdUploadFileFuncUpload<TArgs>;\r\n\r\n /** Nhận danh sách id/key và trả về dữ liệu hiển thị file trong UI. */\r\n details: SdUploadFileFuncDetails<TArgs>;\r\n\r\n /** Tùy chọn: tải file về theo id/key. */\r\n download?: SdUploadFileFuncDownload<TArgs>;\r\n}\r\n\r\n/**\r\n * Token DI cho upload configuration.\r\n * Khuyến nghị provide dạng `multi: true` để hỗ trợ nhiều nguồn upload trong cùng app/module.\r\n */\r\nexport const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\r\n\r\n/** Hàm upload file và trả về danh sách id/key tương ứng. */\r\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\r\n\r\n/** Hàm lấy thông tin file phục vụ hiển thị từ danh sách id/key. */\r\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\r\n\r\n/** Hàm tải file theo id/key. */\r\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\r\n\r\nexport interface SdUploadFileDetail {\r\n /** Định danh file được backend trả về sau upload. */\r\n idOrKey: string;\r\n\r\n /** URL truy cập file (CDN hoặc direct URL). */\r\n cdn: string;\r\n\r\n /** Tên hiển thị file. */\r\n name?: string;\r\n\r\n /** Đuôi file: png, jpg, pdf... */\r\n extension?: string;\r\n\r\n /** Dung lượng file tính theo MB (nếu backend có trả về). */\r\n size?: number;\r\n}\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output, ViewChild } 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 SdUploadFileFuncDownload,\n SdUploadFileFuncDetails,\n SdUploadFileFuncUpload,\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 #configuration = inject<ISdUploadFileConfiguration | ISdUploadFileConfiguration[]>(\n SD_UPLOAD_FILE_CONFIGURATION,\n { optional: true }\n );\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 key = input<string | undefined>(undefined);\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 uploadInput = input<SdUploadFileFuncUpload<any> | undefined>(undefined, { alias: 'upload' });\n readonly details = input<SdUploadFileFuncDetails<any>>();\n readonly downloadInput = input<SdUploadFileFuncDownload<any> | undefined>(undefined, { alias: 'download' });\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 this.#validateDuplicateConfigurationKeys();\n\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 #getConfigurations = (): ISdUploadFileConfiguration[] => {\n const config = this.#configuration;\n if (!config) {\n return [];\n }\n return Array.isArray(config) ? config : [config];\n };\n\n #validateDuplicateConfigurationKeys = (): void => {\n const configurations = this.#getConfigurations();\n if (!configurations.length) {\n return;\n }\n\n const seen = new Set<string>();\n for (const configuration of configurations) {\n const key = configuration.key;\n const normalizedKey = key === undefined ? '__undefined__' : key;\n if (seen.has(normalizedKey)) {\n const label = key === undefined ? 'undefined' : key;\n throw new Error(`[sd-upload-file] Duplicate upload configuration key detected: ${label}`);\n }\n seen.add(normalizedKey);\n }\n };\n\n #getSelectedConfiguration = (): ISdUploadFileConfiguration | undefined => {\n const configurations = this.#getConfigurations();\n if (!configurations.length) {\n return undefined;\n }\n const key = this.key();\n return configurations.find(configuration => configuration.key === key);\n };\n\n #getUploadHandler = (): SdUploadFileFuncUpload<any> | undefined => {\n return this.uploadInput() || this.#getSelectedConfiguration()?.upload;\n };\n\n #getDetailsHandler = (): SdUploadFileFuncDetails<any> | undefined => {\n return this.details() || this.#getSelectedConfiguration()?.details;\n };\n\n #getDownloadHandler = (): SdUploadFileFuncDownload<any> | undefined => {\n return this.downloadInput() || this.#getSelectedConfiguration()?.download;\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 const uploadHandler = this.#getUploadHandler();\n if (uploadHandler) {\n idOrKeys = await uploadHandler(uploadedFiles, this.args()).then(results => {\n for (const uploadedFile of uploadedFiles) {\n this.#uploadFileService.remove(uploadedFile);\n }\n return results;\n });\n } else {\n const key = this.key();\n this.#notifyService.error(\n key === undefined\n ? 'Vui lòng inject SD_UPLOAD_FILE_CONFIGURATION hoặc truyền [upload] trực tiếp vào component'\n : `Không tìm thấy upload configuration theo key='${key}'. Vui lòng kiểm tra providers hoặc truyền [upload] trực tiếp`\n );\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.#getDownloadHandler()?.(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 detailsHandler = this.#getDetailsHandler();\n if (idOrKeys.length && detailsHandler) {\n detailsList = await detailsHandler(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":"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"}
@@ -312,7 +312,10 @@ class SdSelect {
312
312
  return formValue.some((e) => e === value);
313
313
  return formValue === value;
314
314
  });
315
- if (items.length <= this.limit())
315
+ // Khi filtered mode bật và multiple=true, luôn đẩy item đã chọn lên trên
316
+ // để user dễ nhìn thấy selection hiện tại, kể cả dataset chưa vượt limit.
317
+ const shouldPinSelectedFirst = this.filtered() && this.multiple() && isArray;
318
+ if (!shouldPinSelectedFirst && items.length <= this.limit())
316
319
  return filteredList;
317
320
  return filteredList.sort((current, next) => {
318
321
  const value1 = hasFields ? this.itemValue(current) : current;