@sd-angular/core 19.0.0-beta.35 → 19.0.0-beta.37

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.
Files changed (34) hide show
  1. package/assets/scss/core/grid.scss +40 -0
  2. package/assets/scss/sd-core.scss +1 -0
  3. package/components/button/src/button.component.d.ts +27 -27
  4. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +11 -10
  5. package/components/table/src/models/table-option-selector.model.d.ts +11 -10
  6. package/fesm2022/sd-angular-core-components-button.mjs +60 -96
  7. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  8. package/fesm2022/sd-angular-core-components-import-excel.mjs +1 -1
  9. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  10. package/fesm2022/sd-angular-core-components-preview.mjs +1 -1
  11. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  12. package/fesm2022/sd-angular-core-components-table.mjs +6 -6
  13. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  14. package/fesm2022/sd-angular-core-components-upload-file.mjs +1 -1
  15. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  16. package/fesm2022/sd-angular-core-components-workflow.mjs +11 -11
  17. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  18. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +75 -67
  19. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  20. package/fesm2022/sd-angular-core-forms-date-range.mjs +145 -245
  21. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  22. package/fesm2022/sd-angular-core-forms-select.mjs +79 -67
  23. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  24. package/fesm2022/sd-angular-core-modules-layout.mjs +2 -2
  25. package/fesm2022/sd-angular-core-services-confirm.mjs +1 -1
  26. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  27. package/forms/autocomplete/src/autocomplete.component.d.ts +8 -8
  28. package/forms/date-range/src/date-range.component.d.ts +28 -33
  29. package/forms/select/src/select.component.d.ts +6 -6
  30. package/package.json +35 -35
  31. package/sd-angular-core-19.0.0-beta.37.tgz +0 -0
  32. package/utilities/models/index.d.ts +1 -0
  33. package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
  34. package/sd-angular-core-19.0.0-beta.35.tgz +0 -0
@@ -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 */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n QueryList,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidatorFn, Validators } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\nimport { SdLabelDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdFormatNumberPipe } from '@sd-angular/core/pipes';\r\nimport { SdConfirmService, SdNotifyService } from '@sd-angular/core/services';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { startWith } from 'rxjs/operators';\r\nimport * as uuid from 'uuid';\r\nimport { PreviewComponent } from './components/preview/preview.component';\r\nimport { ISdUploadFileConfiguration, SD_UPLOAD_FILE_CONFIG, SdUploadFileDetail, SdUploadFileFuncDetails } from './configurations';\r\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\r\nimport { IsImage, PreviewFile, UploadFileService } from './services';\r\n\r\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\r\n@Component({\r\n selector: 'sd-upload-file',\r\n templateUrl: './upload-file.component.html',\r\n styleUrls: ['./upload-file.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n DragDropModule,\r\n SdLabel,\r\n PreviewComponent,\r\n FilterImagePipe,\r\n FilterDocumentPipe,\r\n SdFormatNumberPipe,\r\n MatProgressSpinner,\r\n ],\r\n})\r\nexport class SdUploadFile<TArgs = any> implements AfterViewInit, OnDestroy {\r\n @ViewChild(PreviewComponent) previewFile?: PreviewComponent;\r\n id = `I${uuid.v4()}`;\r\n #isMobileOrTablet = false;\r\n #canvas1 = `C${uuid.v4()}`;\r\n #canvas2 = `C${uuid.v4()}`;\r\n\r\n selectedFile?: PreviewFile | null;\r\n formControl = new SdFormControl();\r\n #form?: FormGroup;\r\n @Input('form') set _form(val: NgForm | FormGroup) {\r\n if (val) {\r\n if (val instanceof NgForm) {\r\n this.#form = val.form;\r\n } else {\r\n this.#form = val;\r\n }\r\n }\r\n }\r\n #name = uuid.v4();\r\n @Input('name') set _name(val: string | undefined) {\r\n if (val) {\r\n this.#name = val;\r\n }\r\n }\r\n @Input() args?: TArgs;\r\n @Input() label?: string;\r\n\r\n helperText?: string;\r\n @Input('helperText') set _helperText(val: string | undefined) {\r\n this.helperText = val;\r\n }\r\n\r\n @Input() description?: string;\r\n type: 'image' | 'document' | 'file' = 'file';\r\n @Input('type') set _type(type: 'image' | 'document' | 'file' | undefined | null) {\r\n this.type = type || 'file';\r\n }\r\n\r\n @Input() set disabled(val: boolean | '' | undefined | null) {\r\n val = val === '' || !!val;\r\n if (val) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n }\r\n // Validate\r\n required = false;\r\n @Input('required') set _required(val: boolean | '' | undefined | null) {\r\n this.required = val === '' || !!val;\r\n this.#updateValidator();\r\n }\r\n extensions: string[] = [];\r\n @Input('extensions') set _extensions(extensions: string[] | undefined | null) {\r\n this.extensions = extensions?.filter(val => !!val) || [];\r\n }\r\n max = 10;\r\n @Input({ alias: 'max' }) set _max(max: number | undefined | null) {\r\n this.max = max || 10;\r\n }\r\n\r\n maxOfImage = 3;\r\n @Input({ alias: 'maxOfImage' }) set _maxOfImage(value: number | undefined | null) {\r\n this.maxOfImage = value || this.maxOfImage;\r\n }\r\n @Input() maxSize?: number;\r\n @Input() maxWidth?: number;\r\n @Input() maxHeight?: number;\r\n @Input() scaleToPixel?: number;\r\n\r\n @Input() previewWidth = '50px';\r\n @Input() previewHeight = '50px';\r\n @Input() align: 'left' | 'center' = 'left';\r\n @Input() details?: SdUploadFileFuncDetails<any>; // Config details thay thế từ config details Injejct từ provide global\r\n @Input() imageValidator?: (image: HTMLImageElement) => string;\r\n\r\n // sd-upload-file sẽ xử lý hiển thị bằng previewFiles, khi người dùng thao tác upload/xóa/sửa sẽ không ảnh hưởng đến #model cho đến khi gọi hàm upload\r\n previewFiles: PreviewFile[] = [];\r\n #model: (string | number)[] = [];\r\n @Input() set model(model: (string | number | undefined | null)[] | undefined | null) {\r\n if (Array.isArray(model)) {\r\n if (this.#model !== model) {\r\n this.#model = model.filter(val => val !== undefined && val !== null);\r\n this.#changes.next(this.#model);\r\n }\r\n } else {\r\n this.#model = [];\r\n this.modelChange.emit(this.#model);\r\n this.#changes.next(this.#model);\r\n }\r\n }\r\n @Output() loaded = new EventEmitter<PreviewFile[]>();\r\n @Output() modelChange = new EventEmitter<(string | number)[]>();\r\n @Output() filesChanged = new EventEmitter<(string | File)[]>();\r\n @ViewChildren('dropElement') dropElements?: QueryList<ElementRef>;\r\n @ViewChild('canvas') canvas?: ElementRef;\r\n @ContentChild(SdLabelDefDirective) sdLabelDef?: SdLabelDefDirective;\r\n #subscription = new Subscription();\r\n #currentDropContainer: any;\r\n #changes = new Subject<(string | number)[]>();\r\n constructor(\r\n private ref: ChangeDetectorRef,\r\n private notifyService: SdNotifyService,\r\n private confirmService: SdConfirmService,\r\n @Inject(SD_UPLOAD_FILE_CONFIG) private readonly uploadFileConfig: ISdUploadFileConfiguration,\r\n private uploadFileService: UploadFileService\r\n ) {\r\n this.#isMobileOrTablet = SdUtilities.isMobile();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(\r\n this.#changes.pipe(startWith(this.#model)).subscribe(async values => {\r\n if (Array.isArray(values)) {\r\n this.previewFiles = await this.#details(values);\r\n this.filesChanged.emit(this.previewFiles.map(e => e.file || e.idOrKey || e.src).filter(val => !!val) as (string | File)[]);\r\n this.#preview();\r\n } else {\r\n this.previewFiles = [];\r\n }\r\n this.formControl.setValue(values);\r\n this.ref.markForCheck();\r\n })\r\n );\r\n if (!this.#isMobileOrTablet) {\r\n if (!!this.dropElements?.length && this.dropElements?.length > 0) {\r\n const dropContainer = this.dropElements?.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', () => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n const files: File[] = [];\r\n for (const file of evt.dataTransfer?.files || []) {\r\n files.push(file);\r\n }\r\n await this.#uploadFile(files);\r\n });\r\n }\r\n this.#subscription.add(\r\n this.dropElements!.changes.subscribe(() => {\r\n if (this.dropElements!.length > 0 && this.#currentDropContainer !== this.dropElements!.first.nativeElement) {\r\n const dropContainer = this.dropElements!.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', () => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n const files: File[] = [];\r\n for (const file of evt.dataTransfer?.files || []) {\r\n files.push(file);\r\n }\r\n await this.#uploadFile(files);\r\n });\r\n }\r\n })\r\n );\r\n }\r\n this.#form?.addControl(this.#name, this.formControl);\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n this.ref.markForCheck();\r\n })\r\n );\r\n this.#generateDescription();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#revokePreviewBlobURLs();\r\n this.#form?.removeControl(this.#name);\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n #generateDescription = () => {\r\n // Tự động generate description nếu chưa có\r\n if (!this.description) {\r\n if (this.extensions?.length && this.maxSize) {\r\n this.description = `Định dạng: ${this.extensions.join(', ')} và tối đa: ${this.maxSize}MB`;\r\n } else if (this.extensions?.length) {\r\n this.description = `Định dạng: ${this.extensions.join(', ')}`;\r\n } else if (this.maxSize) {\r\n this.description = `Tối đa: ${this.maxSize}MB`;\r\n }\r\n }\r\n };\r\n\r\n #touch = () => {\r\n // Ghi nhận form được touch khi có add/edit/remove file\r\n this.formControl.markAsTouched();\r\n // this.formControl.setValue(this.previewFiles);\r\n this.formControl.setValue(this.#model);\r\n this.ref.markForCheck();\r\n };\r\n\r\n #updateValidator = () => {\r\n this.formControl.clearValidators();\r\n this.formControl.clearAsyncValidators();\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n if (this.required) {\r\n validators.push(Validators.required);\r\n }\r\n this.formControl.setValidators(validators);\r\n this.formControl.setAsyncValidators(asyncValidators);\r\n this.formControl.updateValueAndValidity();\r\n };\r\n\r\n #validate = async (file: File): Promise<string | null> => {\r\n if (this.type === 'image') {\r\n if (file.type.split('/')[0] !== 'image') {\r\n return `[${file.name}] Tệp tải lên không phải là ảnh`;\r\n }\r\n }\r\n if (this.extensions?.length) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n if (!this.extensions.some(e => e.toUpperCase() === extension.toUpperCase())) {\r\n return `[${file.name}] Tệp tải lên không đúng định dạng: ${this.extensions.join(', ')}`;\r\n }\r\n }\r\n if (this.maxSize) {\r\n if (this.maxSize * 1024 * 1024 < file.size) {\r\n return `[${file.name}] Kích thước tệp tối đa: ${this.maxSize} MB`;\r\n }\r\n }\r\n if (this.type === 'image' && (this.maxWidth || this.maxHeight || this.imageValidator)) {\r\n const message: string | null = await new Promise(resolve => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n if (this.maxWidth && img.width > this.maxWidth) {\r\n resolve(`[${file.name}] Max image width ${this.maxWidth}px`);\r\n return;\r\n }\r\n if (this.maxHeight && img.height > this.maxHeight) {\r\n resolve(`[${file.name}] Max image height ${this.maxHeight}px`);\r\n return;\r\n }\r\n if (this.imageValidator) {\r\n resolve(this.imageValidator(img));\r\n return;\r\n }\r\n resolve(null);\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n if (message) {\r\n return message;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n #preview = () => {\r\n // let sum = 0;\r\n for (const previewFile of this.previewFiles.filter(e => e.file)) {\r\n const reader = new FileReader();\r\n reader.onload = evt => {\r\n previewFile.previewSrc = evt.target!.result;\r\n previewFile.isPreviewImage = previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\r\n this.ref.detectChanges();\r\n // sum++;\r\n // if (sum === this.previewFiles.filter(e => e.file).length) this.loaded.emit(this.previewFiles);\r\n };\r\n reader.readAsDataURL(previewFile.file!);\r\n }\r\n };\r\n\r\n onUpload = () => {\r\n SdUtilities.upload({\r\n maxSizeInMb: this.maxSize,\r\n extensions: this.extensions,\r\n multiple: this.max > 1,\r\n })\r\n .then(async result => {\r\n if (result) {\r\n if (Array.isArray(result)) {\r\n await this.#uploadFile(result);\r\n } else {\r\n await this.#uploadFile([result]);\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n console.error(error);\r\n this.notifyService.error(error?.message || 'Có lỗi xảy ra trong quá trình tải lên tệp');\r\n });\r\n };\r\n\r\n #uploadFile = async (originFiles: File[]) => {\r\n if (originFiles.length + this.#model.length > this.max) {\r\n this.notifyService.warning(`Bạn đã chọn quá nhiều file. Vui lòng kiểm tra lại số lượng`);\r\n return;\r\n }\r\n for (let file of originFiles) {\r\n const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\r\n if (isImage && this.scaleToPixel! > 0) {\r\n file = await this.#resize(file!);\r\n }\r\n const message = await this.#validate(file!);\r\n if (message) {\r\n this.notifyService.warning(message);\r\n return;\r\n }\r\n const hashedKey = this.uploadFileService.add(file);\r\n if (hashedKey) {\r\n this.#model.push(hashedKey);\r\n }\r\n }\r\n this.modelChange.emit([...this.#model]);\r\n this.#touch();\r\n };\r\n\r\n onRemove = (file: PreviewFile) => {\r\n const idx = this.previewFiles.indexOf(file);\r\n if (idx >= 0) {\r\n this.confirmService\r\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', {\r\n title: 'Xác nhận xóa?',\r\n yesTitle: 'Xác nhận',\r\n noTitle: 'Hủy',\r\n yesButtonColor: 'primary',\r\n noButtonColor: 'primary',\r\n })\r\n .then(() => {\r\n this.previewFiles.splice(idx, 1);\r\n this.#model.splice(idx, 1);\r\n this.modelChange.emit([...this.#model]);\r\n this.filesChanged.emit(this.previewFiles.map(e => e.file || e.idOrKey || e.src).filter(val => !!val) as (string | File)[]);\r\n this.#touch();\r\n });\r\n }\r\n };\r\n\r\n onDrop = (event: CdkDragDrop<string[]>) => {\r\n moveItemInArray(this.#model, event.previousIndex, event.currentIndex);\r\n this.modelChange.emit([...this.#model]);\r\n this.#touch();\r\n };\r\n\r\n onImgError = (previewFile: PreviewFile) => {\r\n previewFile.isImgError = true; // Đánh dấu ảnh lỗi\r\n };\r\n\r\n #resize = async (file: File): Promise<File> => {\r\n if (!this.scaleToPixel) {\r\n return file;\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n return file;\r\n }\r\n return await new Promise((resolve, reject) => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n try {\r\n if (img.width * img.height <= this.scaleToPixel!) {\r\n return resolve(file);\r\n }\r\n const canvas1 = document.createElement('canvas');\r\n canvas1.setAttribute('id', this.#canvas1);\r\n const ctx1 = canvas1.getContext('2d');\r\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel!);\r\n canvas1.width = width;\r\n canvas1.height = height;\r\n\r\n const canvas2 = document.createElement('canvas');\r\n canvas2.setAttribute('id', this.#canvas2);\r\n const ctx2 = canvas2.getContext('2d');\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\r\n ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\r\n ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\r\n canvas1.toBlob(blob => {\r\n resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\r\n });\r\n } catch (err) {\r\n reject(err);\r\n } finally {\r\n document.getElementById(this.#canvas1)?.remove();\r\n document.getElementById(this.#canvas2)?.remove();\r\n }\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n };\r\n\r\n #scale = (width: number, height: number, scaleToPixcel: number) => {\r\n if (!width || !height || !scaleToPixcel) {\r\n return {\r\n width,\r\n height,\r\n };\r\n }\r\n const ratio = width / height;\r\n for (let i = 0; i < width; i++) {\r\n width -= i;\r\n height = Math.trunc(width / ratio);\r\n if (width * height <= scaleToPixcel) {\r\n break;\r\n }\r\n }\r\n return {\r\n width,\r\n height,\r\n };\r\n };\r\n\r\n onSelect = (file: PreviewFile) => {\r\n if (!this.#isMobileOrTablet) {\r\n return;\r\n }\r\n if (this.selectedFile !== file) {\r\n this.selectedFile = file;\r\n } else {\r\n this.selectedFile = null;\r\n }\r\n };\r\n\r\n #blobToFile = (blob: Blob, fileName: string): File => {\r\n const temp: any = blob;\r\n temp.lastModifiedDate = new Date();\r\n temp.name = fileName;\r\n return blob as File;\r\n };\r\n\r\n // Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys\r\n // HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER\r\n\r\n getFiles = async () => {\r\n const items = this.previewFiles?.filter(val => !!val) || [];\r\n return items.map(e => e?.file).filter(file => !!file);\r\n };\r\n\r\n upload = async () => {\r\n const items = this.previewFiles?.filter(val => !!val) || [];\r\n if (!Array.isArray(items)) {\r\n this.#model = [];\r\n this.modelChange.emit(this.#model);\r\n return;\r\n }\r\n const results: (string | number)[] = [];\r\n const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\r\n let idOrKeys: string[] = [];\r\n if (uploadedFiles.length) {\r\n idOrKeys = await this.uploadFileConfig.upload(uploadedFiles, this.args).then(results => {\r\n for (const uploadedFile of uploadedFiles) {\r\n // Remove file sau khi đã upload thành công\r\n this.uploadFileService.remove(uploadedFile);\r\n }\r\n return results;\r\n });\r\n }\r\n let idx = 0;\r\n for (const item of items) {\r\n if (!item.file) {\r\n if (item.idOrKey) {\r\n results.push(item.idOrKey);\r\n }\r\n } else {\r\n if (idOrKeys?.[idx]) {\r\n results.push(idOrKeys[idx]);\r\n idx++;\r\n }\r\n }\r\n }\r\n this.#model = results;\r\n this.modelChange.emit(this.#model);\r\n };\r\n\r\n // Khi binding model, đầu vào thường là id/key/cdn, cần render ra ảnh/tệp tương ứng\r\n #details = async (keys: (string | number)[]) => {\r\n if (!Array.isArray(keys)) {\r\n return [];\r\n }\r\n if (!keys.length) {\r\n return [];\r\n }\r\n // Lấy những phần tử không phải là cdn và hashedKey\r\n const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\r\n let details: SdUploadFileDetail[] = [];\r\n if (idOrKeys.length) {\r\n // Nếu có details từ Input thì gọi, nếu không thì gọi details từ uploadFileConfig\r\n if (this.details) {\r\n details = await this.details(idOrKeys, this.args).catch(error => {\r\n console.error(error);\r\n return [];\r\n });\r\n } else if (this.uploadFileConfig.details) {\r\n details = await this.uploadFileConfig.details(idOrKeys, this.args).catch(error => {\r\n console.error(error);\r\n return [];\r\n });\r\n }\r\n }\r\n // Map thành preview file\r\n const results: PreviewFile[] = [];\r\n for (const key of keys.filter(val => !!val)) {\r\n if (this.#isCdn(key)) {\r\n const cdn = key?.toString();\r\n const extension = this.#getExtension(cdn);\r\n const isPreviewImage = this.type === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: cdn,\r\n fileName: cdn,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n } else if (this.#isHashedKey(key)) {\r\n const hashedKey = key?.toString();\r\n const file = this.uploadFileService.get(hashedKey)!;\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\r\n results.push({\r\n file,\r\n isPreviewImage,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n extension,\r\n });\r\n } else {\r\n const detail = details.find(e => e.idOrKey === key);\r\n if (detail) {\r\n const { idOrKey, cdn, name, size } = detail;\r\n const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\r\n const isPreviewImage = this.type === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: idOrKey || cdn,\r\n fileName: name,\r\n fileSize: size,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n }\r\n }\r\n }\r\n return results;\r\n };\r\n\r\n // Mở popup preview ảnh\r\n preview = async () => {\r\n this.previewFile?.open(this.previewFiles);\r\n };\r\n\r\n #isCdn = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') {\r\n return false;\r\n }\r\n return idOrKey.startsWith('http');\r\n };\r\n\r\n #isHashedKey = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') {\r\n return false;\r\n }\r\n return this.uploadFileService.isHashedKey(idOrKey);\r\n };\r\n\r\n #getExtension = (cdn: string | undefined) => {\r\n if (!cdn) {\r\n return undefined;\r\n }\r\n let extension = undefined;\r\n const baseSrc = cdn?.split?.('?')?.[0];\r\n const lastDot = baseSrc?.lastIndexOf?.('.');\r\n if (lastDot > 0) {\r\n extension = baseSrc.substring(lastDot + 1);\r\n }\r\n return extension;\r\n };\r\n /**\r\n * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\r\n * * Ưu tiên:\r\n * 1. Tải xuống từ thuộc tính `file`.\r\n * 2. Tải xuống từ thuộc tính `src`.\r\n * 3. Gọi hàm download dựa vào `idOrKey`.\r\n *\r\n * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\r\n */\r\n onDownload = (previewFile: PreviewFile) => {\r\n // 1. Ưu tiên tải xuống nếu có File/Src trực tiếp\r\n if (previewFile.file || previewFile.src) {\r\n SdUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\r\n return; // Kết thúc hàm\r\n }\r\n // 2. Cuối cùng, nếu không có cả file và src, gọi hàm download bằng idOrKey\r\n if (previewFile.idOrKey) {\r\n this.uploadFileConfig?.download?.(previewFile.idOrKey, this.args);\r\n return; // Kết thúc hàm\r\n }\r\n console.error('Invalid preview file', previewFile);\r\n };\r\n\r\n isLastVisibleOverlay(fileIndex: number): boolean {\r\n return this.formControl.disabled && fileIndex === this.maxOfImage - 1 && this.previewFiles.length > this.maxOfImage;\r\n }\r\n\r\n /**\r\n * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\r\n * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\r\n */\r\n #revokePreviewBlobURLs = (): void => {\r\n if (!Array.isArray(this.previewFiles) || !this.previewFiles?.length) {\r\n return;\r\n }\r\n this.previewFiles.forEach(p => {\r\n if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.previewSrc);\r\n }\r\n if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.src);\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\r\n @if (!!sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef?.templateRef!\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [description]=\"description\" [helperText]=\"helperText\" [required]=\"required\"></sd-label>\r\n }\r\n <div\r\n cdkDropList\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"d-flex\"\r\n [class.justify-content-center]=\"align === 'center'\"\r\n [class.justify-content-start]=\"align === 'left'\">\r\n @if (previewFiles.length < max && !formControl.disabled) {\r\n <div\r\n class=\"d-flex justify-content-center align-items-center pointer c-area-upload\"\r\n [style.width]=\"previewWidth\"\r\n [style.height]=\"previewHeight\"\r\n (click)=\"onUpload()\"\r\n aria-hidden=\"true\"\r\n #dropElement>\r\n <mat-icon class=\"c-upload\" fontSet=\"material-icons-outlined\"> file_upload </mat-icon>\r\n </div>\r\n }\r\n @let previewImages = previewFiles | filterImage;\r\n @for (image of previewImages; track $index; let idx = $index) {\r\n @if (!formControl.disabled || idx < maxOfImage) {\r\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>\r\n <div class=\"c-drag-placeholder\" [style.width]=\"previewWidth\" [style.height]=\"previewHeight\" *cdkDragPlaceholder></div>\r\n <div *cdkDragPreview [style]=\"{ width: previewWidth, height: previewHeight }\" class=\"c-drag-preview\">\r\n <div class=\"c-container\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"c-preview\">\r\n <div\r\n class=\"c-img-container\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n [class.c-selected]=\"selectedFile === image\"\r\n [class.has-overlay]=\"idx === maxOfImage - 1 && formControl.disabled\"\r\n (click)=\"onSelect(image)\"\r\n aria-hidden=\"true\">\r\n @if (image.isImgError) {\r\n <img class=\"c-img-error\" alt=\"Image Error\" [style.max-height]=\"previewHeight\" />\r\n } @else if(image.previewSrc) {\r\n <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"previewHeight\" (error)=\"onImgError(image)\" />\r\n } @else if(image.src) {\r\n <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"previewHeight\" (error)=\"onImgError(image)\" />\r\n } @else {\r\n <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\r\n }\r\n @if (idx === maxOfImage - 1 && formControl.disabled && previewImages.length > maxOfImage) {\r\n <div class=\"c-overlay-count\" (click)=\"preview()\">\r\n <div class=\"c-overlay-text\">+{{ previewImages.length - maxOfImage }}</div>\r\n </div>\r\n }\r\n <div class=\"c-action\">\r\n <mat-icon class=\"c-zoom\" fontSet=\"material-icons-outlined\" (click)=\"preview()\">zoom_in</mat-icon>\r\n </div>\r\n @if (!formControl.disabled) {\r\n <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n @let previewDocuments = previewFiles | filterDocument;\r\n @for (document of previewDocuments; track $index) {\r\n <div class=\"c-document-container\">\r\n <img\r\n [style.max-height]=\"previewHeight\"\r\n class=\"c-document-image\"\r\n [class]=\"{\r\n png: document.extension === 'png',\r\n jpg: document.extension === 'jpg',\r\n pdf: document.extension === 'pdf',\r\n doc: document.extension === 'doc',\r\n docx: document.extension === 'docx',\r\n xls: document.extension === 'xls',\r\n xlsx: document.extension === 'xlsx',\r\n ppt: document.extension === 'ppt',\r\n pptx: document.extension === 'pptx',\r\n csv: document.extension === 'csv',\r\n psd: document.extension === 'psd',\r\n xml: document.extension === 'xml',\r\n zip: document.extension === 'zip',\r\n tiff: document.extension === 'tiff'\r\n }\"\r\n alt=\"Preview\" />\r\n <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\r\n @if (document.fileSize) {\r\n <span class=\"T12R text-black400\"> - </span>\r\n <span class=\"T12R text-black400 flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\r\n }\r\n\r\n @if (!formControl.disabled) {\r\n <mat-icon class=\"c-close\" (click)=\"onRemove(document)\">close</mat-icon>\r\n }\r\n </div>\r\n }\r\n @if (!formControl.disabled && formControl.touched && formControl.errors?.['required']) {\r\n <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ 'Vui lòng tải lên tệp/ảnh' }}</div>\r\n }\r\n</div>\r\n<preview (download)=\"onDownload($event)\"></preview>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SdUtilities","i2.UploadFileService","i3"],"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_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 */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n QueryList,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidatorFn, Validators } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\nimport { SdLabelDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdFormatNumberPipe } from '@sd-angular/core/pipes';\r\nimport { SdConfirmService, SdNotifyService } from '@sd-angular/core/services';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { startWith } from 'rxjs/operators';\r\nimport * as uuid from 'uuid';\r\nimport { PreviewComponent } from './components/preview/preview.component';\r\nimport { ISdUploadFileConfiguration, SD_UPLOAD_FILE_CONFIG, SdUploadFileDetail, SdUploadFileFuncDetails } from './configurations';\r\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\r\nimport { IsImage, PreviewFile, UploadFileService } from './services';\r\n\r\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\r\n@Component({\r\n selector: 'sd-upload-file',\r\n templateUrl: './upload-file.component.html',\r\n styleUrls: ['./upload-file.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n DragDropModule,\r\n SdLabel,\r\n PreviewComponent,\r\n FilterImagePipe,\r\n FilterDocumentPipe,\r\n SdFormatNumberPipe,\r\n MatProgressSpinner,\r\n ],\r\n})\r\nexport class SdUploadFile<TArgs = any> implements AfterViewInit, OnDestroy {\r\n @ViewChild(PreviewComponent) previewFile?: PreviewComponent;\r\n id = `I${uuid.v4()}`;\r\n #isMobileOrTablet = false;\r\n #canvas1 = `C${uuid.v4()}`;\r\n #canvas2 = `C${uuid.v4()}`;\r\n\r\n selectedFile?: PreviewFile | null;\r\n formControl = new SdFormControl();\r\n #form?: FormGroup;\r\n @Input('form') set _form(val: NgForm | FormGroup) {\r\n if (val) {\r\n if (val instanceof NgForm) {\r\n this.#form = val.form;\r\n } else {\r\n this.#form = val;\r\n }\r\n }\r\n }\r\n #name = uuid.v4();\r\n @Input('name') set _name(val: string | undefined) {\r\n if (val) {\r\n this.#name = val;\r\n }\r\n }\r\n @Input() args?: TArgs;\r\n @Input() label?: string;\r\n\r\n helperText?: string;\r\n @Input('helperText') set _helperText(val: string | undefined) {\r\n this.helperText = val;\r\n }\r\n\r\n @Input() description?: string;\r\n type: 'image' | 'document' | 'file' = 'file';\r\n @Input('type') set _type(type: 'image' | 'document' | 'file' | undefined | null) {\r\n this.type = type || 'file';\r\n }\r\n\r\n @Input() set disabled(val: boolean | '' | undefined | null) {\r\n val = val === '' || !!val;\r\n if (val) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n }\r\n // Validate\r\n required = false;\r\n @Input('required') set _required(val: boolean | '' | undefined | null) {\r\n this.required = val === '' || !!val;\r\n this.#updateValidator();\r\n }\r\n extensions: string[] = [];\r\n @Input('extensions') set _extensions(extensions: string[] | undefined | null) {\r\n this.extensions = extensions?.filter(val => !!val) || [];\r\n }\r\n max = 10;\r\n @Input({ alias: 'max' }) set _max(max: number | undefined | null) {\r\n this.max = max || 10;\r\n }\r\n\r\n maxOfImage = 3;\r\n @Input({ alias: 'maxOfImage' }) set _maxOfImage(value: number | undefined | null) {\r\n this.maxOfImage = value || this.maxOfImage;\r\n }\r\n @Input() maxSize?: number;\r\n @Input() maxWidth?: number;\r\n @Input() maxHeight?: number;\r\n @Input() scaleToPixel?: number;\r\n\r\n @Input() previewWidth = '50px';\r\n @Input() previewHeight = '50px';\r\n @Input() align: 'left' | 'center' = 'left';\r\n @Input() details?: SdUploadFileFuncDetails<any>; // Config details thay thế từ config details Injejct từ provide global\r\n @Input() imageValidator?: (image: HTMLImageElement) => string;\r\n\r\n // sd-upload-file sẽ xử lý hiển thị bằng previewFiles, khi người dùng thao tác upload/xóa/sửa sẽ không ảnh hưởng đến #model cho đến khi gọi hàm upload\r\n previewFiles: PreviewFile[] = [];\r\n #model: (string | number)[] = [];\r\n @Input() set model(model: (string | number | undefined | null)[] | undefined | null) {\r\n if (Array.isArray(model)) {\r\n if (this.#model !== model) {\r\n this.#model = model.filter(val => val !== undefined && val !== null);\r\n this.#changes.next(this.#model);\r\n }\r\n } else {\r\n this.#model = [];\r\n this.modelChange.emit(this.#model);\r\n this.#changes.next(this.#model);\r\n }\r\n }\r\n @Output() loaded = new EventEmitter<PreviewFile[]>();\r\n @Output() modelChange = new EventEmitter<(string | number)[]>();\r\n @Output() filesChanged = new EventEmitter<(string | File)[]>();\r\n @ViewChildren('dropElement') dropElements?: QueryList<ElementRef>;\r\n @ViewChild('canvas') canvas?: ElementRef;\r\n @ContentChild(SdLabelDefDirective) sdLabelDef?: SdLabelDefDirective;\r\n #subscription = new Subscription();\r\n #currentDropContainer: any;\r\n #changes = new Subject<(string | number)[]>();\r\n constructor(\r\n private ref: ChangeDetectorRef,\r\n private notifyService: SdNotifyService,\r\n private confirmService: SdConfirmService,\r\n @Inject(SD_UPLOAD_FILE_CONFIG) private readonly uploadFileConfig: ISdUploadFileConfiguration,\r\n private uploadFileService: UploadFileService\r\n ) {\r\n this.#isMobileOrTablet = SdUtilities.isMobile();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(\r\n this.#changes.pipe(startWith(this.#model)).subscribe(async values => {\r\n if (Array.isArray(values)) {\r\n this.previewFiles = await this.#details(values);\r\n this.filesChanged.emit(this.previewFiles.map(e => e.file || e.idOrKey || e.src).filter(val => !!val) as (string | File)[]);\r\n this.#preview();\r\n } else {\r\n this.previewFiles = [];\r\n }\r\n this.formControl.setValue(values);\r\n this.ref.markForCheck();\r\n })\r\n );\r\n if (!this.#isMobileOrTablet) {\r\n if (!!this.dropElements?.length && this.dropElements?.length > 0) {\r\n const dropContainer = this.dropElements?.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', () => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n const files: File[] = [];\r\n for (const file of evt.dataTransfer?.files || []) {\r\n files.push(file);\r\n }\r\n await this.#uploadFile(files);\r\n });\r\n }\r\n this.#subscription.add(\r\n this.dropElements!.changes.subscribe(() => {\r\n if (this.dropElements!.length > 0 && this.#currentDropContainer !== this.dropElements!.first.nativeElement) {\r\n const dropContainer = this.dropElements!.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', () => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n const files: File[] = [];\r\n for (const file of evt.dataTransfer?.files || []) {\r\n files.push(file);\r\n }\r\n await this.#uploadFile(files);\r\n });\r\n }\r\n })\r\n );\r\n }\r\n this.#form?.addControl(this.#name, this.formControl);\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n this.ref.markForCheck();\r\n })\r\n );\r\n this.#generateDescription();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#revokePreviewBlobURLs();\r\n this.#form?.removeControl(this.#name);\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n #generateDescription = () => {\r\n // Tự động generate description nếu chưa có\r\n if (!this.description) {\r\n if (this.extensions?.length && this.maxSize) {\r\n this.description = `Định dạng: ${this.extensions.join(', ')} và tối đa: ${this.maxSize}MB`;\r\n } else if (this.extensions?.length) {\r\n this.description = `Định dạng: ${this.extensions.join(', ')}`;\r\n } else if (this.maxSize) {\r\n this.description = `Tối đa: ${this.maxSize}MB`;\r\n }\r\n }\r\n };\r\n\r\n #touch = () => {\r\n // Ghi nhận form được touch khi có add/edit/remove file\r\n this.formControl.markAsTouched();\r\n // this.formControl.setValue(this.previewFiles);\r\n this.formControl.setValue(this.#model);\r\n this.ref.markForCheck();\r\n };\r\n\r\n #updateValidator = () => {\r\n this.formControl.clearValidators();\r\n this.formControl.clearAsyncValidators();\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n if (this.required) {\r\n validators.push(Validators.required);\r\n }\r\n this.formControl.setValidators(validators);\r\n this.formControl.setAsyncValidators(asyncValidators);\r\n this.formControl.updateValueAndValidity();\r\n };\r\n\r\n #validate = async (file: File): Promise<string | null> => {\r\n if (this.type === 'image') {\r\n if (file.type.split('/')[0] !== 'image') {\r\n return `[${file.name}] Tệp tải lên không phải là ảnh`;\r\n }\r\n }\r\n if (this.extensions?.length) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n if (!this.extensions.some(e => e.toUpperCase() === extension.toUpperCase())) {\r\n return `[${file.name}] Tệp tải lên không đúng định dạng: ${this.extensions.join(', ')}`;\r\n }\r\n }\r\n if (this.maxSize) {\r\n if (this.maxSize * 1024 * 1024 < file.size) {\r\n return `[${file.name}] Kích thước tệp tối đa: ${this.maxSize} MB`;\r\n }\r\n }\r\n if (this.type === 'image' && (this.maxWidth || this.maxHeight || this.imageValidator)) {\r\n const message: string | null = await new Promise(resolve => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n if (this.maxWidth && img.width > this.maxWidth) {\r\n resolve(`[${file.name}] Max image width ${this.maxWidth}px`);\r\n return;\r\n }\r\n if (this.maxHeight && img.height > this.maxHeight) {\r\n resolve(`[${file.name}] Max image height ${this.maxHeight}px`);\r\n return;\r\n }\r\n if (this.imageValidator) {\r\n resolve(this.imageValidator(img));\r\n return;\r\n }\r\n resolve(null);\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n if (message) {\r\n return message;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n #preview = () => {\r\n // let sum = 0;\r\n for (const previewFile of this.previewFiles.filter(e => e.file)) {\r\n const reader = new FileReader();\r\n reader.onload = evt => {\r\n previewFile.previewSrc = evt.target!.result;\r\n previewFile.isPreviewImage = previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\r\n this.ref.detectChanges();\r\n // sum++;\r\n // if (sum === this.previewFiles.filter(e => e.file).length) this.loaded.emit(this.previewFiles);\r\n };\r\n reader.readAsDataURL(previewFile.file!);\r\n }\r\n };\r\n\r\n onUpload = () => {\r\n SdUtilities.upload({\r\n maxSizeInMb: this.maxSize,\r\n extensions: this.extensions,\r\n multiple: this.max > 1,\r\n })\r\n .then(async result => {\r\n if (result) {\r\n if (Array.isArray(result)) {\r\n await this.#uploadFile(result);\r\n } else {\r\n await this.#uploadFile([result]);\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n console.error(error);\r\n this.notifyService.error(error?.message || 'Có lỗi xảy ra trong quá trình tải lên tệp');\r\n });\r\n };\r\n\r\n #uploadFile = async (originFiles: File[]) => {\r\n if (originFiles.length + this.#model.length > this.max) {\r\n this.notifyService.warning(`Bạn đã chọn quá nhiều file. Vui lòng kiểm tra lại số lượng`);\r\n return;\r\n }\r\n for (let file of originFiles) {\r\n const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\r\n if (isImage && this.scaleToPixel! > 0) {\r\n file = await this.#resize(file!);\r\n }\r\n const message = await this.#validate(file!);\r\n if (message) {\r\n this.notifyService.warning(message);\r\n return;\r\n }\r\n const hashedKey = this.uploadFileService.add(file);\r\n if (hashedKey) {\r\n this.#model.push(hashedKey);\r\n }\r\n }\r\n this.modelChange.emit([...this.#model]);\r\n this.#touch();\r\n };\r\n\r\n onRemove = (file: PreviewFile) => {\r\n const idx = this.previewFiles.indexOf(file);\r\n if (idx >= 0) {\r\n this.confirmService\r\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', {\r\n title: 'Xác nhận xóa?',\r\n yesTitle: 'Xác nhận',\r\n noTitle: 'Hủy',\r\n yesButtonColor: 'primary',\r\n noButtonColor: 'primary',\r\n })\r\n .then(() => {\r\n this.previewFiles.splice(idx, 1);\r\n this.#model.splice(idx, 1);\r\n this.modelChange.emit([...this.#model]);\r\n this.filesChanged.emit(this.previewFiles.map(e => e.file || e.idOrKey || e.src).filter(val => !!val) as (string | File)[]);\r\n this.#touch();\r\n });\r\n }\r\n };\r\n\r\n onDrop = (event: CdkDragDrop<string[]>) => {\r\n moveItemInArray(this.#model, event.previousIndex, event.currentIndex);\r\n this.modelChange.emit([...this.#model]);\r\n this.#touch();\r\n };\r\n\r\n onImgError = (previewFile: PreviewFile) => {\r\n previewFile.isImgError = true; // Đánh dấu ảnh lỗi\r\n };\r\n\r\n #resize = async (file: File): Promise<File> => {\r\n if (!this.scaleToPixel) {\r\n return file;\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n return file;\r\n }\r\n return await new Promise((resolve, reject) => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n try {\r\n if (img.width * img.height <= this.scaleToPixel!) {\r\n return resolve(file);\r\n }\r\n const canvas1 = document.createElement('canvas');\r\n canvas1.setAttribute('id', this.#canvas1);\r\n const ctx1 = canvas1.getContext('2d');\r\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel!);\r\n canvas1.width = width;\r\n canvas1.height = height;\r\n\r\n const canvas2 = document.createElement('canvas');\r\n canvas2.setAttribute('id', this.#canvas2);\r\n const ctx2 = canvas2.getContext('2d');\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\r\n ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\r\n ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\r\n canvas1.toBlob(blob => {\r\n resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\r\n });\r\n } catch (err) {\r\n reject(err);\r\n } finally {\r\n document.getElementById(this.#canvas1)?.remove();\r\n document.getElementById(this.#canvas2)?.remove();\r\n }\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n };\r\n\r\n #scale = (width: number, height: number, scaleToPixcel: number) => {\r\n if (!width || !height || !scaleToPixcel) {\r\n return {\r\n width,\r\n height,\r\n };\r\n }\r\n const ratio = width / height;\r\n for (let i = 0; i < width; i++) {\r\n width -= i;\r\n height = Math.trunc(width / ratio);\r\n if (width * height <= scaleToPixcel) {\r\n break;\r\n }\r\n }\r\n return {\r\n width,\r\n height,\r\n };\r\n };\r\n\r\n onSelect = (file: PreviewFile) => {\r\n if (!this.#isMobileOrTablet) {\r\n return;\r\n }\r\n if (this.selectedFile !== file) {\r\n this.selectedFile = file;\r\n } else {\r\n this.selectedFile = null;\r\n }\r\n };\r\n\r\n #blobToFile = (blob: Blob, fileName: string): File => {\r\n const temp: any = blob;\r\n temp.lastModifiedDate = new Date();\r\n temp.name = fileName;\r\n return blob as File;\r\n };\r\n\r\n // Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys\r\n // HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER\r\n\r\n getFiles = async () => {\r\n const items = this.previewFiles?.filter(val => !!val) || [];\r\n return items.map(e => e?.file).filter(file => !!file);\r\n };\r\n\r\n upload = async () => {\r\n const items = this.previewFiles?.filter(val => !!val) || [];\r\n if (!Array.isArray(items)) {\r\n this.#model = [];\r\n this.modelChange.emit(this.#model);\r\n return;\r\n }\r\n const results: (string | number)[] = [];\r\n const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\r\n let idOrKeys: string[] = [];\r\n if (uploadedFiles.length) {\r\n idOrKeys = await this.uploadFileConfig.upload(uploadedFiles, this.args).then(results => {\r\n for (const uploadedFile of uploadedFiles) {\r\n // Remove file sau khi đã upload thành công\r\n this.uploadFileService.remove(uploadedFile);\r\n }\r\n return results;\r\n });\r\n }\r\n let idx = 0;\r\n for (const item of items) {\r\n if (!item.file) {\r\n if (item.idOrKey) {\r\n results.push(item.idOrKey);\r\n }\r\n } else {\r\n if (idOrKeys?.[idx]) {\r\n results.push(idOrKeys[idx]);\r\n idx++;\r\n }\r\n }\r\n }\r\n this.#model = results;\r\n this.modelChange.emit(this.#model);\r\n };\r\n\r\n // Khi binding model, đầu vào thường là id/key/cdn, cần render ra ảnh/tệp tương ứng\r\n #details = async (keys: (string | number)[]) => {\r\n if (!Array.isArray(keys)) {\r\n return [];\r\n }\r\n if (!keys.length) {\r\n return [];\r\n }\r\n // Lấy những phần tử không phải là cdn và hashedKey\r\n const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\r\n let details: SdUploadFileDetail[] = [];\r\n if (idOrKeys.length) {\r\n // Nếu có details từ Input thì gọi, nếu không thì gọi details từ uploadFileConfig\r\n if (this.details) {\r\n details = await this.details(idOrKeys, this.args).catch(error => {\r\n console.error(error);\r\n return [];\r\n });\r\n } else if (this.uploadFileConfig.details) {\r\n details = await this.uploadFileConfig.details(idOrKeys, this.args).catch(error => {\r\n console.error(error);\r\n return [];\r\n });\r\n }\r\n }\r\n // Map thành preview file\r\n const results: PreviewFile[] = [];\r\n for (const key of keys.filter(val => !!val)) {\r\n if (this.#isCdn(key)) {\r\n const cdn = key?.toString();\r\n const extension = this.#getExtension(cdn);\r\n const isPreviewImage = this.type === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: cdn,\r\n fileName: cdn,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n } else if (this.#isHashedKey(key)) {\r\n const hashedKey = key?.toString();\r\n const file = this.uploadFileService.get(hashedKey)!;\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\r\n results.push({\r\n file,\r\n isPreviewImage,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n extension,\r\n });\r\n } else {\r\n const detail = details.find(e => e.idOrKey === key);\r\n if (detail) {\r\n const { idOrKey, cdn, name, size } = detail;\r\n const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\r\n const isPreviewImage = this.type === 'image' || IsImage(extension);\r\n results.push({\r\n idOrKey: idOrKey || cdn,\r\n fileName: name,\r\n fileSize: size,\r\n file: null,\r\n previewSrc: null,\r\n src: cdn,\r\n isPreviewImage,\r\n extension,\r\n });\r\n }\r\n }\r\n }\r\n return results;\r\n };\r\n\r\n // Mở popup preview ảnh\r\n preview = async () => {\r\n this.previewFile?.open(this.previewFiles);\r\n };\r\n\r\n #isCdn = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') {\r\n return false;\r\n }\r\n return idOrKey.startsWith('http');\r\n };\r\n\r\n #isHashedKey = (idOrKey: string | number) => {\r\n if (typeof idOrKey !== 'string') {\r\n return false;\r\n }\r\n return this.uploadFileService.isHashedKey(idOrKey);\r\n };\r\n\r\n #getExtension = (cdn: string | undefined) => {\r\n if (!cdn) {\r\n return undefined;\r\n }\r\n let extension = undefined;\r\n const baseSrc = cdn?.split?.('?')?.[0];\r\n const lastDot = baseSrc?.lastIndexOf?.('.');\r\n if (lastDot > 0) {\r\n extension = baseSrc.substring(lastDot + 1);\r\n }\r\n return extension;\r\n };\r\n /**\r\n * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\r\n * * Ưu tiên:\r\n * 1. Tải xuống từ thuộc tính `file`.\r\n * 2. Tải xuống từ thuộc tính `src`.\r\n * 3. Gọi hàm download dựa vào `idOrKey`.\r\n *\r\n * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\r\n */\r\n onDownload = (previewFile: PreviewFile) => {\r\n // 1. Ưu tiên tải xuống nếu có File/Src trực tiếp\r\n if (previewFile.file || previewFile.src) {\r\n SdUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\r\n return; // Kết thúc hàm\r\n }\r\n // 2. Cuối cùng, nếu không có cả file và src, gọi hàm download bằng idOrKey\r\n if (previewFile.idOrKey) {\r\n this.uploadFileConfig?.download?.(previewFile.idOrKey, this.args);\r\n return; // Kết thúc hàm\r\n }\r\n console.error('Invalid preview file', previewFile);\r\n };\r\n\r\n isLastVisibleOverlay(fileIndex: number): boolean {\r\n return this.formControl.disabled && fileIndex === this.maxOfImage - 1 && this.previewFiles.length > this.maxOfImage;\r\n }\r\n\r\n /**\r\n * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\r\n * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\r\n */\r\n #revokePreviewBlobURLs = (): void => {\r\n if (!Array.isArray(this.previewFiles) || !this.previewFiles?.length) {\r\n return;\r\n }\r\n this.previewFiles.forEach(p => {\r\n if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.previewSrc);\r\n }\r\n if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\r\n URL.revokeObjectURL(p.src);\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\r\n @if (!!sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef?.templateRef!\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [description]=\"description\" [helperText]=\"helperText\" [required]=\"required\"></sd-label>\r\n }\r\n <div\r\n cdkDropList\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"d-flex\"\r\n [class.justify-content-center]=\"align === 'center'\"\r\n [class.justify-content-start]=\"align === 'left'\">\r\n @if (previewFiles.length < max && !formControl.disabled) {\r\n <div\r\n class=\"d-flex justify-content-center align-items-center pointer c-area-upload\"\r\n [style.width]=\"previewWidth\"\r\n [style.height]=\"previewHeight\"\r\n (click)=\"onUpload()\"\r\n aria-hidden=\"true\"\r\n #dropElement>\r\n <mat-icon class=\"c-upload\" fontSet=\"material-icons-outlined\"> file_upload </mat-icon>\r\n </div>\r\n }\r\n @let previewImages = previewFiles | filterImage;\r\n @for (image of previewImages; track $index; let idx = $index) {\r\n @if (!formControl.disabled || idx < maxOfImage) {\r\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>\r\n <div class=\"c-drag-placeholder\" [style.width]=\"previewWidth\" [style.height]=\"previewHeight\" *cdkDragPlaceholder></div>\r\n <div *cdkDragPreview [style]=\"{ width: previewWidth, height: previewHeight }\" class=\"c-drag-preview\">\r\n <div class=\"c-container\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"c-preview\">\r\n <div\r\n class=\"c-img-container\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n [class.c-selected]=\"selectedFile === image\"\r\n [class.has-overlay]=\"idx === maxOfImage - 1 && formControl.disabled\"\r\n (click)=\"onSelect(image)\"\r\n aria-hidden=\"true\">\r\n @if (image.isImgError) {\r\n <img class=\"c-img-error\" alt=\"Image Error\" [style.max-height]=\"previewHeight\" />\r\n } @else if(image.previewSrc) {\r\n <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"previewHeight\" (error)=\"onImgError(image)\" />\r\n } @else if(image.src) {\r\n <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"previewHeight\" (error)=\"onImgError(image)\" />\r\n } @else {\r\n <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\r\n }\r\n @if (idx === maxOfImage - 1 && formControl.disabled && previewImages.length > maxOfImage) {\r\n <div class=\"c-overlay-count\" (click)=\"preview()\">\r\n <div class=\"c-overlay-text\">+{{ previewImages.length - maxOfImage }}</div>\r\n </div>\r\n }\r\n <div class=\"c-action\">\r\n <mat-icon class=\"c-zoom\" fontSet=\"material-icons-outlined\" (click)=\"preview()\">zoom_in</mat-icon>\r\n </div>\r\n @if (!formControl.disabled) {\r\n <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n @let previewDocuments = previewFiles | filterDocument;\r\n @for (document of previewDocuments; track $index) {\r\n <div class=\"c-document-container\">\r\n <img\r\n [style.max-height]=\"previewHeight\"\r\n class=\"c-document-image\"\r\n [class]=\"{\r\n png: document.extension === 'png',\r\n jpg: document.extension === 'jpg',\r\n pdf: document.extension === 'pdf',\r\n doc: document.extension === 'doc',\r\n docx: document.extension === 'docx',\r\n xls: document.extension === 'xls',\r\n xlsx: document.extension === 'xlsx',\r\n ppt: document.extension === 'ppt',\r\n pptx: document.extension === 'pptx',\r\n csv: document.extension === 'csv',\r\n psd: document.extension === 'psd',\r\n xml: document.extension === 'xml',\r\n zip: document.extension === 'zip',\r\n tiff: document.extension === 'tiff'\r\n }\"\r\n alt=\"Preview\" />\r\n <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\r\n @if (document.fileSize) {\r\n <span class=\"T12R text-black400\"> - </span>\r\n <span class=\"T12R text-black400 flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\r\n }\r\n\r\n @if (!formControl.disabled) {\r\n <mat-icon class=\"c-close\" (click)=\"onRemove(document)\">close</mat-icon>\r\n }\r\n </div>\r\n }\r\n @if (!formControl.disabled && formControl.touched && formControl.errors?.['required']) {\r\n <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ 'Vui lòng tải lên tệp/ảnh' }}</div>\r\n }\r\n</div>\r\n<preview (download)=\"onDownload($event)\"></preview>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SdUtilities","i2.UploadFileService","i3"],"mappings":"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"}