{"version":3,"file":"uofx-app-components-file.mjs","sources":["../../../projects/uofx-app-pack/file/src/file.interface.ts","../../../projects/uofx-app-pack/file/src/api/service/file.service.ts","../../../projects/uofx-app-pack/file/src/controller/file-upload.controller.ts","../../../projects/uofx-app-pack/file/src/filesize-format/filesize-format.pipe.ts","../../../projects/uofx-app-pack/file/src/file-item/file-item.component.ts","../../../projects/uofx-app-pack/file/src/file-item/file-item.component.html","../../../projects/uofx-app-pack/file/src/file-upload.component.ts","../../../projects/uofx-app-pack/file/src/file-upload.component.html","../../../projects/uofx-app-pack/file/src/file-viewer/file-viewer.component.ts","../../../projects/uofx-app-pack/file/src/file-viewer/file-viewer.component.html","../../../projects/uofx-app-pack/file/src/file-upload.module.ts","../../../projects/uofx-app-pack/file/src/plugin-helper/file.plugin.service.ts","../../../projects/uofx-app-pack/file/uofx-app-components-file.ts"],"sourcesContent":["import { UofxCADViewStatus, UofxFileModel, UofxFileViewStatus } from '@uofx/app-components/file-helper';\r\n\r\n/** 由UofxFileModel轉換成上傳元件所需的model */\r\nexport interface UofxFileUploadFileItem {\r\n  /* 檔案id */\r\n  id?: string;\r\n  /** 檔案url */\r\n  url?: string;\r\n  /** 圖片 url */\r\n  imgUrl?: string;\r\n  /** [前端專用]下載url */\r\n  downloadUrl?: string;\r\n  /** 是否為新上傳還沒submit的檔案 */\r\n  isNewUpload?: boolean;\r\n  /** 檔案名稱 */\r\n  fileName: string;\r\n  /* 檔案大小 */\r\n  fileSize: number;\r\n  /** [前端專用]上傳回傳的錯誤訊息 */\r\n  errorMessage?: string;\r\n  /** 上傳進度 */\r\n  uploadProgressValue?: number;\r\n  /** 上傳部門 & 人 */\r\n  uploadBy?: string;\r\n  /** 下載進度 */\r\n  downloadProgressValue?: number;\r\n  /** 下載後的存放位置 */\r\n  downloadLocalPath?: string;\r\n  /** 上傳的檔案超過系統總容量 */\r\n  uploadOverLimit?: boolean;\r\n  /** 開啟viewer預覽的url */\r\n  pdfUrl?: string;\r\n  /** 綁token的下載url */\r\n  rawUrl?: string;\r\n  /** 縮圖 */\r\n  screenShotUrl?: string;\r\n  /** 檔案icon */\r\n  fileIcon?: string;\r\n  /** 轉檔失敗的traceId */\r\n  traceId?: string;\r\n  /** [前端專用] 是否為檔案url */\r\n  isFileUrl?: boolean;\r\n  /** 開cad viewer需要的base64 */\r\n  cadUrl?: string;\r\n  /** cad檔案轉檔失敗後的traceId */\r\n  cadTraceId?: string;\r\n  /** 透過cad按鈕上傳的檔案 */\r\n  isFromCad?: boolean;\r\n\r\n  /** cad檔案轉檔狀態 */\r\n  cadViewStatus?: UofxCADViewStatus;\r\n  /** 檔案轉檔狀態 */\r\n  viewStatus?: UofxFileViewStatus;\r\n\r\n  /** 上傳中事件 */\r\n  onUploadProgress?: (p: number) => void;\r\n  onDownLoadProgress?: (p: number) => void;\r\n}\r\n\r\n/** 檔案列表 */\r\nexport interface UofxFileGroupModel {\r\n  /** file group id(Id allow null) */\r\n  id?: string;\r\n  /** 檔案上傳的大小限制 (單位: byte) */\r\n  fileGroupLimits?: number;\r\n  /** 已使用的檔案大小 (單位: byte) */\r\n  fileGroupUsedSize?: number;\r\n  /** 上傳檔案的模組 */\r\n  module: string;\r\n  /** 上傳檔案的子分類 */\r\n  sub: string;\r\n  /** 檔案清單 */\r\n  files: Array<UofxFileModel>;\r\n}\r\n\r\n/** 檔案動作類型 */\r\nexport enum UofxFileActionType {\r\n  /** 新增 */\r\n  Add,\r\n  /** 下載 */\r\n  Download,\r\n  /** 觀看 */\r\n  View,\r\n  /** 更新 */\r\n  Update,\r\n}\r\n\r\n/** 上傳模組 */\r\nexport enum UofxFileUploadModuleType {\r\n  Base = 'Base',\r\n  Bpm = 'Bpm',\r\n  Eip = 'Eip',\r\n  Plugin = 'Plugin',\r\n  External = 'External',\r\n}\r\n\r\n/** 點擊檔案時的事件 */\r\nexport enum UofxFileClickAction {\r\n  /** 點擊刪除以外的地方 */\r\n  File = 'file',\r\n  /** 點擊刪除 */\r\n  Delete = 'delete',\r\n}\r\n\r\n/** 檢查特定檔案是否轉檔完成的response model */\r\nexport interface UofxCheckFileConvertModel {\r\n  /** 拋給後端檢查的檔案是否都轉檔完成 (只要檔案是成功或失敗，都視為轉檔完成，後端回傳true) */\r\n  convertCompleted: boolean;\r\n  /**\r\n   * 拋給後端檢查的檔案結果 (若檔案轉檔完成一定會拿到pdfUrl跟traceId其中一個)\r\n   * -\r\n   * 1. 成功：會有pdfUrl\r\n   * 2. 失敗：會有traceId\r\n   */\r\n  files: Array<UofxFileModel>;\r\n}\r\n\r\n// #region File Ui Interface\r\nexport type UofxFileButtonType = 'default';\r\n\r\nexport interface UofxFileButtons {\r\n  [key: string]: UofxFileButton;\r\n}\r\n\r\nexport interface UofxFileButton {\r\n  text: string;\r\n  icon?: string;\r\n}\r\n// #endregion\r\n","import { FileUploadRequestModel, GlobFileUploadLimitModel } from '../model/file.model';\r\nimport { Observable, of } from 'rxjs';\r\nimport {\r\n  UofxCheckFileConvertModel,\r\n  UofxFileActionType,\r\n  UofxFileGroupModel,\r\n  UofxFileUploadFileItem,\r\n} from '../../file.interface';\r\n\r\nimport { AppCurrentUser } from '@uofx/app-components';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { UofxFileModel } from '@uofx/app-components/file-helper';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UofxFileService {\r\n  constructor(private http: HttpClient) {}\r\n\r\n  /** 檔案上傳到Temp */\r\n  public uploadToTemp(model: FileUploadRequestModel) {\r\n    const form = new FormData();\r\n    form.append('id', model.id);\r\n    form.append('chunkFile', model.chunkFile);\r\n    form.append('chunkTotalCount', model.chunkTotalCount.toString());\r\n    form.append('chunkNumber', model.chunkNumber.toString());\r\n    form.append('chunkSize', model.chunkSize.toString());\r\n    form.append('module', model.module);\r\n    form.append('subModule', model.subModule);\r\n    form.append('fileName', model.fileName);\r\n    form.append('length', model.length.toString());\r\n    form.append('isViewPdf', model.isViewPdf.toString());\r\n\r\n    return this.http.post<UofxFileModel>(`~/api/app/base/file/tmp`, form).pipe(map((result) => result));\r\n  }\r\n\r\n  /**\r\n   * 取得檔案列表\r\n   * @param fileGroupId fileGroupId\r\n   * @returns FileListModel\r\n   */\r\n  loadFileList(fileGroupId: string): Observable<Array<UofxFileModel>> {\r\n    return this.http\r\n      .get<UofxFileGroupModel>(`~/api/app/base/file/grp/${fileGroupId}`)\r\n      .pipe(map((result) => (result && result.files ? result.files : [])));\r\n  }\r\n\r\n  /** 取得上傳元件上傳限制 */\r\n  getFileUploadLimit(): Observable<GlobFileUploadLimitModel> {\r\n    if (AppCurrentUser.Profile.corpId) {\r\n      const url = `~/api/app/base/file/upload/limit/ ${AppCurrentUser.Profile.corpId}`;\r\n      return this.http.get<GlobFileUploadLimitModel>(url);\r\n    } else {\r\n      // 1GB\r\n      return of({\r\n        checkLimit: false,\r\n        uploadSize: 1073741824,\r\n        remainingSize: 0,\r\n      });\r\n    }\r\n  }\r\n\r\n  /** 將某份檔案清單丟給後端檢查是否轉檔完成 */\r\n  checkFileConvert(model: Array<UofxFileUploadFileItem>) {\r\n    return this.http.post<UofxCheckFileConvertModel>('~/api/app/base/file/convert/check', model);\r\n  }\r\n\r\n  /**\r\n   * 紀錄檔案使用動作\r\n   * @param {string} fileId 檔案id\r\n   * @param {UofxFileActionType} actType 動作類型\r\n   * @memberof UofxCADViewerService\r\n   */\r\n  recordFileAction(fileId: string, actType: UofxFileActionType) {\r\n    const urlParams = `${fileId}/${actType}`;\r\n    return this.http.get(`~/api/app/base/file/userecord/${urlParams}`);\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { deepCopy, Guid } from '@uofx/core';\r\nimport { ErrorModel } from '@uofx/error-code';\r\nimport { FileUploadRequestModel, FileUploadViewerInfo } from '../api/model/file.model';\r\nimport { UofxFileService } from '../api/service/file.service';\r\nimport { UofxFileGroupModel, UofxFileUploadFileItem } from '../file.interface';\r\nimport { UofxFileDownloadHelper, UofxFileModel } from '@uofx/app-components/file-helper';\r\n\r\n@Injectable()\r\nexport class UofxFileUploadController {\r\n  cancelUploadIds: Array<string> = [];\r\n\r\n  constructor(\r\n    private _service: UofxFileService,\r\n    private downloadHelper: UofxFileDownloadHelper\r\n  ) {}\r\n\r\n  /** @public 取消上傳 */\r\n  public cancelUpload(fileId: string) {\r\n    this.cancelUploadIds.push(fileId);\r\n  }\r\n\r\n  /** @public 上傳檔案 */\r\n  public uploadFile(\r\n    file: Blob,\r\n    fileItem: UofxFileUploadFileItem,\r\n    module: string,\r\n    subModule: string,\r\n    chunkSize: number,\r\n    viewerInfo: FileUploadViewerInfo\r\n  ): Promise<UofxFileUploadFileItem> {\r\n    // create api request model\r\n    const model = <FileUploadRequestModel>{\r\n      id: fileItem.id,\r\n      chunkTotalCount: Math.trunc(file.size / chunkSize) + 1,\r\n      chunkSize,\r\n      module,\r\n      subModule,\r\n      fileName: fileItem.fileName,\r\n      length: file.size,\r\n      isViewPdf: viewerInfo.isViewPdf,\r\n      enableWatermark: viewerInfo.enableWatermark,\r\n    };\r\n\r\n    return new Promise((resolve) => {\r\n      this.chunkUpload(model, file, fileItem).finally(() => {\r\n        resolve(fileItem);\r\n      });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @internal 分段上傳\r\n   * @param {FileUploadRequestModel} model 上傳檔案的資訊\r\n   * @param {Blob} file 檔案\r\n   * @param {UofxFileUploadFileItem} fileItem 上傳元件所需的model\r\n   * @return {*}  {Promise<FileUploadResponsesModel>}\r\n   * @memberof UofxFileUploadController\r\n   */\r\n  chunkUpload(model: FileUploadRequestModel, file: Blob, fileItem: UofxFileUploadFileItem): Promise<UofxFileModel> {\r\n    return new Promise((resolve, reject) => {\r\n      const onUpload = (offset) => {\r\n        // 不在清單代表檔案已經被刪除了\r\n        if (this.cancelUploadIds.includes(fileItem.id)) return;\r\n        const blob = file.slice(offset, model.chunkSize + offset);\r\n        const index = Math.trunc(offset / model.chunkSize) + 1;\r\n        // set model\r\n        model.chunkFile = blob;\r\n        model.chunkNumber = index;\r\n        // set upload progress\r\n        if (model.chunkTotalCount === 1) {\r\n          // 故意留0.5看起來有上傳進度\r\n          fileItem.onUploadProgress(0.5);\r\n        } else {\r\n          fileItem.onUploadProgress(model.chunkNumber / model.chunkTotalCount);\r\n        }\r\n\r\n        // 檔案上傳到Temp\r\n        this._service.uploadToTemp(model).subscribe({\r\n          next: (res) => {\r\n            if (model.chunkNumber >= model.chunkTotalCount) {\r\n              const convertFileUrl = this.downloadHelper.getDownloadUrl(res.fileName, res.url, res.rawUrl);\r\n\r\n              fileItem.onUploadProgress(1);\r\n\r\n              fileItem.id = res.id;\r\n              fileItem.url = res.url;\r\n              fileItem.rawUrl = res.rawUrl;\r\n              fileItem.downloadUrl = convertFileUrl.downloadUrl;\r\n              fileItem.isFileUrl = convertFileUrl.isFileUrl;\r\n\r\n              resolve(res);\r\n            } else {\r\n              // 更新進度條\r\n              offset += blob.size;\r\n              onUpload(offset);\r\n            }\r\n          },\r\n          error: (error) => {\r\n            fileItem.errorMessage = this._errorMessage(error);\r\n            fileItem.onUploadProgress(1);\r\n            reject(error);\r\n          },\r\n        });\r\n      };\r\n      onUpload(0);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 轉換成UofxFileGroupModel\r\n   * @param {string} fileGroupId File Group ID\r\n   * @param {string} module 上傳檔案的模組\r\n   * @param {number} totalSize  檔案上傳的大小限制 (單位: byte)\r\n   * @param {Array<UofxFileUploadFileItem>} resultFileList 檔案列表\r\n   * @param {string} [subModule=''] 上傳檔案的子分類\r\n   * @returns\r\n   * @memberof UofxFileUploadController\r\n   */\r\n  public convertToUofxFileGroupModel(\r\n    fileGroupId: string,\r\n    module: string,\r\n    totalSize: number,\r\n    resultFileList: Array<UofxFileUploadFileItem>,\r\n    subModule = ''\r\n  ) {\r\n    const hasFile = resultFileList.length > 0;\r\n\r\n    if (!fileGroupId) {\r\n      // 新增狀態沒有檔案就直接回傳null\r\n      if (!hasFile) return null;\r\n\r\n      // 新增的狀態代表沒有 fileGroupId，那必須有檔案才提供 fileGroupId\r\n      if (hasFile) fileGroupId = Guid.makeNew().toString();\r\n    }\r\n\r\n    const existList = this._mapToUofFileSaveModel(deepCopy(resultFileList));\r\n    const model = <UofxFileGroupModel>{\r\n      fileGroupLimits: totalSize,\r\n      module,\r\n      sub: subModule,\r\n      id: fileGroupId,\r\n      files: existList,\r\n    };\r\n\r\n    return model;\r\n  }\r\n\r\n  /**\r\n   * 轉換成api的 UofxFileModel\r\n   * @param {Array<UofxFileUploadFileItem>} fileList 上傳元件所需的model\r\n   * @return {*} {Array<UofxFileModel>}\r\n   * @memberof UofxFileUploadController\r\n   */\r\n  _mapToUofFileSaveModel(fileList: Array<UofxFileUploadFileItem>) {\r\n    if (!fileList) return null;\r\n    // 要排除有錯誤的檔案\r\n    const vaildList = fileList.filter((p) => !p.errorMessage);\r\n    return vaildList.map(\r\n      (item) =>\r\n        <UofxFileModel>{\r\n          id: item.id,\r\n          fileName: item.fileName,\r\n          length: item.fileSize,\r\n          url: item.url,\r\n          rawUrl: item.rawUrl,\r\n          isNewUpload: item.isNewUpload,\r\n          pdfUrl: item.pdfUrl,\r\n          traceId: item.traceId,\r\n          viewStatus: item.viewStatus,\r\n        }\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 取得檔案列表\r\n   * @param fileGroupId fileGroupId\r\n   * @returns FileListModel\r\n   */\r\n  loadFileList(fileGroupId: string) {\r\n    return this._service.loadFileList(fileGroupId);\r\n  }\r\n\r\n  /** @internal 錯誤訊息 */\r\n  _errorMessage(error: any): string {\r\n    let response = '';\r\n    error.codes.forEach((item) => {\r\n      const itemErrors = [\r\n        ErrorModel.File.CMN.E01,\r\n        ErrorModel.File.CMN.E02,\r\n        ErrorModel.File.CMN.E03,\r\n        ErrorModel.File.CMN.E06,\r\n        ErrorModel.File.CMN.E07,\r\n        ErrorModel.File.CMN.E10,\r\n        ErrorModel.File.CMN.E11,\r\n        ErrorModel.File.CMN.E13,\r\n      ];\r\n      const errorI18n = this._convertErrorCodeToi18nKey(item);\r\n      if (itemErrors.includes(item)) response = errorI18n;\r\n    });\r\n\r\n    return response;\r\n  }\r\n\r\n  /** @internal Error 轉換成 i18n Key */\r\n  _convertErrorCodeToi18nKey(errorCode: string): string {\r\n    // *UKEY:\"global.file-upload.error.E01\"\r\n    // *UKEY:\"global.file-upload.error.E02\"\r\n    // *UKEY:\"global.file-upload.error.E03\"\r\n    // *UKEY:\"global.file-upload.error.E04\"\r\n    // *UKEY:\"global.file-upload.error.E05\"\r\n    // *UKEY:\"global.file-upload.error.E06\"\r\n    // *UKEY:\"global.file-upload.error.E07\"\r\n    // *UKEY:\"global.file-upload.error.E10\"\r\n    // *UKEY:\"global.file-upload.error.E11\"\r\n    // *UKEY:\"global.file-upload.error.E13\"\r\n    // *UKEY:\"global.file-upload.error.other\"\r\n    const logicError = 'global.file-upload.error.';\r\n    if (errorCode === ErrorModel.File.CMN.E01) return logicError + 'E01';\r\n    else if (errorCode === ErrorModel.File.CMN.E02) return logicError + 'E02';\r\n    else if (errorCode === ErrorModel.File.CMN.E03) return logicError + 'E03';\r\n    else if (errorCode === ErrorModel.File.CMN.E04) return logicError + 'E04';\r\n    else if (errorCode === ErrorModel.File.CMN.E05) return logicError + 'E05';\r\n    else if (errorCode === ErrorModel.File.CMN.E06) return logicError + 'E06';\r\n    else if (errorCode === ErrorModel.File.CMN.E07) return logicError + 'E07';\r\n    else if (errorCode === ErrorModel.File.CMN.E10) return logicError + 'E10';\r\n    else if (errorCode === ErrorModel.File.CMN.E11) return logicError + 'E11';\r\n    else if (errorCode === ErrorModel.File.CMN.E13) return logicError + 'E13';\r\n    else return logicError + 'other';\r\n  }\r\n}\r\n\r\n/** https://github.com/ionic-team/capacitor/issues/1564 */\r\nexport function getFileReader(): FileReader {\r\n  const fileReader = new FileReader();\r\n  const zoneOriginalInstance = (fileReader as any).__zone_symbol__originalInstance;\r\n  return zoneOriginalInstance || fileReader;\r\n}\r\n\r\nexport function delay(ms: number) {\r\n  return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({ name: 'filesizeFormat' })\r\nexport class UofxFileSizeFormatPipe implements PipeTransform {\r\n  /** 檔案大小單位 */\r\n  private units = ['Bytes', 'KB', 'MB', 'GB'];\r\n\r\n  // 1.除了GB外，其他都不顯示小數點\r\n  // 2.顯示邏輯\r\n  //  (1) 小於1KB(>1024 bytes)，顯示 N Bytes\r\n  //  (2) 大於等於1KB(>1048576 bytes)且小於1MB時直接顯示KB(無條件進位) 例如：96.2KB → 97KB\r\n  //  (3) 大於等於1MB(>1073741824 bytes)且小於1GB時直接顯示MB(無條件進位) 例如：2.4MB → 3MB\r\n  //  (4) 大於等於1GB(>1073741824 bytes)直接顯示GB(小數點顯示1位) 例如：1.4GB 、2.5GB\r\n  /**\r\n   * 取得格式化之後的檔案大小字串\r\n   * @param value 檔案大小\r\n   */\r\n  transform(value: number): string {\r\n    value = !value || value < 0 ? 0 : value;\r\n    return this._transFileSize(value, 0);\r\n  }\r\n\r\n  /**\r\n   * @internal 取得格式化之後的檔案大小字串\r\n   * @param size 檔案大小\r\n   * @param unit 檔案大小單位\r\n   */\r\n  _transFileSize(size: number, unit = 0): string {\r\n    if (size < 1024) {\r\n      if (unit < this.units.length - 1) {\r\n        return Math.ceil(size) + this.units[unit];\r\n      } else {\r\n        size = Math.ceil(size * 10);\r\n        return size / 10 + this.units[this.units.length - 1];\r\n      }\r\n    } else {\r\n      return this._transFileSize(size / 1024, ++unit);\r\n    }\r\n  }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { UofxFileDownloadHelper } from '@uofx/app-components/file-helper';\r\n\r\nimport { UofxFileClickAction, UofxFileUploadFileItem } from '../file.interface';\r\n\r\n@Component({\r\n  selector: 'uofx-file-item',\r\n  templateUrl: './file-item.component.html',\r\n  styleUrls: ['./file-item.component.scss'],\r\n})\r\nexport class UofxFileItemComponent {\r\n  /** 檔案 */\r\n  @Input() fileItem: UofxFileUploadFileItem;\r\n  /** 上傳的項目要顯示Disable，檔案無法下載 */\r\n  @Input() fileItemDisable = false;\r\n  /** 顯示較少內容 */\r\n  @Input() ellipseInfo = false;\r\n  /** 是否為網頁模式 */\r\n  @Input() isWebMode = false;\r\n  /** 進度條 */\r\n  @Input() uploadProgressValue = 0;\r\n  /** 不允許刪除 */\r\n  @Input() disallowDelete = false;\r\n  /** 是否用於pdf viewer (用於文件檢視器) */\r\n  @Input() pdfViewerUsed = false;\r\n  /** 點擊檔案時的事件 */\r\n  @Output() fileItemClick = new EventEmitter<UofxFileClickAction>();\r\n\r\n  /** 網頁模式下載檔案用 */\r\n  get webDownloadUrl() {\r\n    if (!this.fileItem || !this.fileItem.downloadUrl) return '';\r\n    else return this.fileHelpLogic.formatUrl(this.fileItem.downloadUrl);\r\n  }\r\n\r\n  constructor(private fileHelpLogic: UofxFileDownloadHelper) {}\r\n\r\n  /** 刪除 */\r\n  onRemoveClick() {\r\n    this.fileItemClick.emit(UofxFileClickAction.Delete);\r\n  }\r\n\r\n  /** 下載檔案或是檢視 */\r\n  onFileClick() {\r\n    this.fileItemClick.emit(UofxFileClickAction.File);\r\n  }\r\n}\r\n","<ng-container>\r\n  <!-- 檔案資訊，新上傳的檔案底是灰底的 -->\r\n  <div\r\n    class=\"file-item\"\r\n    [ngClass]=\"{ 'upload-error': fileItem.errorMessage, disable: fileItemDisable, newUpload: fileItem.isNewUpload }\">\r\n    <div class=\"d-flex align-items-center\" (click)=\"onFileClick()\">\r\n      <!-- 縮圖 or 預設icon -->\r\n      <img *ngIf=\"fileItem.screenShotUrl\" [src]=\"fileItem.screenShotUrl\" [width]=\"32\" [height]=\"32\" />\r\n      <uofx-icon *ngIf=\"!fileItem.screenShotUrl\" size=\"24\" [name]=\"fileItem.fileIcon\"></uofx-icon>\r\n\r\n      <!-- 檔名 -->\r\n      <div class=\"file-info-container\">\r\n        <span class=\"text-d-b1-r\" [ngClass]=\"{ 'ellipsis-info': ellipseInfo }\">\r\n          {{ fileItem.fileName }} ( {{ fileItem.fileSize | filesizeFormat }} )\r\n        </span>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- 刪除按鈕 -->\r\n    <div *ngIf=\"!disallowDelete\" class=\"delete-button display-center\" (click)=\"onRemoveClick()\">\r\n      <uofx-icon slot=\"icon-only\" size=\"24.5\" color=\"bk-400\" name=\"close-circle\"> </uofx-icon>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- 錯誤訊息 (紅字) -->\r\n  <div *ngIf=\"fileItem.errorMessage\" class=\"error-msg\">\r\n    {{ fileItem.errorMessage | translate }}\r\n  </div>\r\n\r\n  <!--上傳進度條-->\r\n  <ion-progress-bar\r\n    #progressbar\r\n    class=\"upload-progress-bar\"\r\n    *ngIf=\"!fileItem.errorMessage && fileItem.uploadProgressValue && fileItem.uploadProgressValue !== 1\"\r\n    [type]=\"'ios'\"\r\n    [value]=\"fileItem.uploadProgressValue\">\r\n  </ion-progress-bar>\r\n</ng-container>\r\n","import {\r\n  ChangeDetectorRef,\r\n  Component,\r\n  computed,\r\n  ContentChild,\r\n  EventEmitter,\r\n  forwardRef,\r\n  inject,\r\n  Input,\r\n  NgZone,\r\n  OnChanges,\r\n  OnInit,\r\n  Output,\r\n  signal,\r\n  SimpleChanges,\r\n  TemplateRef,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ModalController } from '@ionic/angular';\r\nimport { UofxToastController } from '@uofx/app-components';\r\nimport { UofxCADViewerDialog } from '@uofx/app-components/cad-viewer';\r\nimport {\r\n  UofxCADViewStatus,\r\n  UofxFileDownloadHelper,\r\n  UofxFileModel,\r\n  UofxFileViewStatus,\r\n} from '@uofx/app-components/file-helper';\r\nimport { UofxFullscreenViewerDialog, UofxWatermarkSettingModel } from '@uofx/app-components/pdf';\r\nimport {\r\n  UofxFileDirectory,\r\n  UofxFileOpenerPlugin,\r\n  UofxFilePickerFilesOptions,\r\n  UofxFilePickerPlugin,\r\n  UofxFilePlugin,\r\n  UofxFileTransferPlugin,\r\n} from '@uofx/app-native';\r\nimport { Guid, InputBoolean, UofxI18NService } from '@uofx/core';\r\nimport { MCORE_CONFIG } from '@uofx/core/mcore-config';\r\nimport { FileUploadViewerInfo } from './api/model/file.model';\r\nimport { UofxFileService } from './api/service/file.service';\r\nimport { UofxFileUploadController } from './controller/file-upload.controller';\r\nimport {\r\n  UofxFileActionType,\r\n  UofxFileButton,\r\n  UofxFileButtons,\r\n  UofxFileButtonType,\r\n  UofxFileClickAction,\r\n  UofxFileGroupModel,\r\n  UofxFileUploadFileItem,\r\n  UofxFileUploadModuleType,\r\n} from './file.interface';\r\n\r\n@Component({\r\n  selector: 'uofx-file-upload',\r\n  templateUrl: './file-upload.component.html',\r\n  styleUrls: ['./file-upload.component.scss'],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => UofxFileUploadComponent),\r\n      multi: true,\r\n    },\r\n  ],\r\n})\r\nexport class UofxFileUploadComponent implements OnInit, OnChanges, ControlValueAccessor {\r\n  /** 模組名稱，例: Bpm，會影響檔案上傳實際存放的位置 */\r\n  @Input() module: UofxFileUploadModuleType;\r\n  /** 上傳檔案的子分類 */\r\n  @Input() subModule: string;\r\n  /** [外掛模組] Plugin 代號 */\r\n  @Input() pluginCode: string;\r\n  /** 允許上傳的檔案類型，範例：'.doc,.xlsx' */\r\n  @Input() allowExtensions = '';\r\n  /** 觀看模式，不會顯示上傳鈕也不能編輯 */\r\n  @Input() @InputBoolean() readonly = false;\r\n  /** Disable狀態，會顯示按鈕跟檔案列表但不能選擇新檔案 */\r\n  @Input() @InputBoolean() disabled = false;\r\n  /** 允許選擇多筆檔案 */\r\n  @Input() @InputBoolean() allowMultiple = true;\r\n  /** 檔案列表簡要模式，只會顯示二個檔案，超過的會用數量顯示 */\r\n  @Input() @InputBoolean() shortMode = false;\r\n  /** 是否用於pdf viewer (用於文件檢視器) */\r\n  @Input() @InputBoolean() pdfViewerUsed = false;\r\n  /** 是否啟用浮水印 (用於文件檢視器) */\r\n  @Input() @InputBoolean() enableWatermark = false;\r\n  /** 是否允許viewer內點擊下載pdf檔案(預設為true) */\r\n  @Input() @InputBoolean() enabledDownloadPdf = true;\r\n  /** 是否允許下載原始檔(預設為true) */\r\n  @Input() @InputBoolean() allowDownloadFile = true;\r\n  /** 是否紀錄檔案動作 */\r\n  @Input() @InputBoolean() recordFileAction = false;\r\n\r\n  /**\r\n   * 上傳按鈕\r\n   * -\r\n   * 系統提供三種按鈕類型:\r\n   * - `default`: 預設按鈕 \"選擇檔案\"\r\n   * - `attachment`: 附件按鈕 \"附件\"\r\n   * - 自訂按鈕: 需提供 `UofxFileButton` 類型並指定 `style`, `text`, `icon`\r\n   */\r\n  @Input() set headerButton(value: InputHeaderButtonsType) {\r\n    const allowButtonSet = ['default'];\r\n    // 檢查 value 是否為有效的按鈕設定\r\n    const isValidButton = (btn: any) =>\r\n      (typeof btn === 'string' && allowButtonSet.includes(btn)) || (typeof btn === 'object' && btn?.text);\r\n\r\n    // 若未給值或所有按鈕設定皆無效，預設給 default button\r\n    if (!value || !isValidButton(value)) {\r\n      value = 'default';\r\n    }\r\n\r\n    if (typeof value === 'string') {\r\n      this.displayHeaderButton.set(this.SYS_BUTTONS[value]);\r\n    } else {\r\n      this.displayHeaderButton.set(value);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 元件不顯示樣式 (用於各頁面/元件自己實作檔案樣式)\r\n   * -\r\n   * 實作時，需透過fileList傳單一檔案進來，再自己viewChild拿轉好的資訊 (resultFileList[0])\r\n   */\r\n  @Input() liteMode = false;\r\n\r\n  /**\r\n   * 從檔案元件開的pdfViewer，也套用浮水印設定\r\n   * -\r\n   * 檔案元件開pdf會走simpleOpen(不加密)，原先這條路也不會設定浮水印，但因應dms檔案，需另開一條路讓simpleOpen也吃浮水印\r\n   *\r\n   * 現況開pdf的三條路：\r\n   * 1. 文件檢視器 (加密、吃浮水印)\r\n   * 2. 檔案元件 (不加密、不吃浮水印)\r\n   * 3. simpleOpenWithWatermark (不加密、吃浮水印)\r\n   */\r\n  @Input() simpleOpenWithWatermark = false;\r\n\r\n  /** 已上傳檔案清單 */\r\n  @Input() set existList(value: Array<UofxFileModel>) {\r\n    this.resultFileList.set(this.mapToUofxFileModel(value));\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /** 本次已上傳的檔案 */\r\n  @Output() fileChanged = new EventEmitter<Array<UofxFileModel>>();\r\n  /** 新增的檔案 */\r\n  @Output() newFile = new EventEmitter<UofxFileUploadFileItem>();\r\n\r\n  //#region 自訂內容 TemplateRef\r\n  @ContentChild('header', { descendants: false }) headerTemplate: TemplateRef<any> | undefined;\r\n  //#endregion\r\n\r\n  /** 系統提供的按鈕 */\r\n  readonly SYS_BUTTONS: UofxFileButtons = {\r\n    default: {\r\n      // *UKEY:\"'global.file.upload.btn.add-file'\"\r\n      text: 'global.file.upload.btn.add-file',\r\n      icon: 'attach',\r\n    },\r\n    // attachment: {\r\n    //   text: 'global.comm.button.attachment',\r\n    //   icon: 'attach',\r\n    // },\r\n  };\r\n\r\n  /** File Group Id */\r\n  fileGroupId: string;\r\n  /** 單一檔案上傳限制 (bytes) */\r\n  uploadSize: number;\r\n  /** 剩餘容量 (bytes)，-1表示不限制 */\r\n  remainingSize: number;\r\n  /** 檔案切割大小(預設 1MB) */\r\n  uofChunkSize = 1024 * 1024 * 1;\r\n  /** 所有檔案 (signal) */\r\n  // resultFileList: Array<UofxFileUploadFileItem> = [];\r\n  resultFileList = signal<Array<UofxFileUploadFileItem>>([]);\r\n  /** 錯誤提示 */\r\n  errorTip = '';\r\n  // *UKEY:\"global.file.upload.btn.more-info\"\r\n  /** 字詞-更多資訊 */\r\n  moreInfoText = 'global.file.upload.btn.more-info';\r\n  // *UKEY:\"global.file.upload.btn.reduce-info\"\r\n  /** 字詞-較少資訊 */\r\n  reduceInfoText = 'global.file.upload.btn.reduce-info';\r\n  /** 是否為顯示\"較少資訊\"的狀態 */\r\n  isReduceInfo = false;\r\n  /** 是否為網頁模式 */\r\n  isWebMode = false;\r\n  /** 停止上傳檔案 */\r\n  stopUpload = false;\r\n  /** 按鈕名稱 */\r\n  btnName: string;\r\n\r\n  /** 支援格式顯示，範例: .doc .docx .xls .xlsx */\r\n  get supportTypes(): string {\r\n    return this.allowExtensions.replace(/,/g, ' ');\r\n  }\r\n\r\n  /** 實際上要顯示於 UI 的按鈕 */\r\n  displayHeaderButton = signal<UofxFileButton>(this.SYS_BUTTONS['default']);\r\n  /** 是否為外掛模組上傳 */\r\n  isPluginUpload = computed(() => this.module === UofxFileUploadModuleType.Plugin);\r\n  /** 是否允許上傳 */\r\n  isValidUpload = signal<boolean>(true);\r\n\r\n  private mcoreConfig = inject(MCORE_CONFIG);\r\n\r\n  constructor(\r\n    private _uofFile: UofxFilePlugin,\r\n    private _ft: UofxFileTransferPlugin,\r\n    private _fileOpener: UofxFileOpenerPlugin,\r\n    private _filePicker: UofxFilePickerPlugin,\r\n    private _i18n: UofxI18NService,\r\n    private _zone: NgZone,\r\n    private _fileUploadCtrl: UofxFileUploadController,\r\n    private cdr: ChangeDetectorRef,\r\n    private fileService: UofxFileService,\r\n    private downloadHelper: UofxFileDownloadHelper,\r\n    private modalCtrl: ModalController,\r\n    private toastCtrl: UofxToastController\r\n  ) {\r\n    this.isWebMode = this.mcoreConfig.IsMock;\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes.readonly && changes.readonly.currentValue === false) {\r\n      this.getFileUploadLimit();\r\n      this._checkModuleSetting();\r\n    }\r\n  }\r\n\r\n  ngOnInit() {\r\n    this._checkModuleSetting();\r\n  }\r\n\r\n  /** @internal 檢查 Module 是否設定正確 */\r\n  _checkModuleSetting() {\r\n    // 唯獨不必檢查\r\n    if (this.readonly) return;\r\n\r\n    // ***此處為開發階段顯示的錯誤訊息，不進行翻譯***\r\n    const moduleTypes = Object.values(UofxFileUploadModuleType);\r\n    let isValidUpload = false;\r\n\r\n    if (!this.module) {\r\n      this.errorTip = '需要設定 Module';\r\n    } else if (this.module && !moduleTypes.includes(this.module)) {\r\n      this.errorTip = `設定的 Module 不正確，外掛模組請設定為 Plugin`;\r\n    } else if (this.isPluginUpload()) {\r\n      if (!this.pluginCode || this.pluginCode.trim() === '') {\r\n        this.errorTip = '外掛模組需要設定 pluginCode';\r\n      } else {\r\n        isValidUpload = true;\r\n        // 外掛模組的 subModule 直接使用 pluginCode\r\n        this.subModule = this.pluginCode;\r\n      }\r\n    } else {\r\n      isValidUpload = true;\r\n    }\r\n\r\n    this.isValidUpload.set(isValidUpload);\r\n    return isValidUpload;\r\n  }\r\n\r\n  //#region Public Methods\r\n  /**\r\n   * 重製上傳元件\r\n   *\r\n   * @param {boolean} [emitChange=true] - 是否發出變更事件\r\n   * @memberof UofxFileUploadComponent\r\n   */\r\n  public reset(emitChange: boolean = true) {\r\n    this.fileGroupId = null;\r\n    this.resultFileList.set([]);\r\n    this.errorTip = '';\r\n    if (emitChange) this._emitFileChanged();\r\n  }\r\n\r\n  /** @public 載入檔案清單(請先傳入fileGroupId) */\r\n  public loadFileList(fileGroupId: string) {\r\n    if (fileGroupId) {\r\n      this.fileGroupId = fileGroupId;\r\n      this._fileUploadCtrl.loadFileList(this.fileGroupId).subscribe({\r\n        next: (res) => {\r\n          this.resultFileList.set(this.mapToUofxFileModel(res));\r\n          this._emitFileChanged();\r\n        },\r\n      });\r\n    } else {\r\n      this.reset();\r\n    }\r\n  }\r\n\r\n  /** @public 建立 file item，為初始準備上傳狀態 */\r\n  public createFileItem(fileName: string, fileSize: number): UofxFileUploadFileItem {\r\n    const fileItem: UofxFileUploadFileItem = {\r\n      id: Guid.makeNew().toString(),\r\n      isNewUpload: true,\r\n      fileName,\r\n      fileSize,\r\n      fileIcon: this.downloadHelper.getFileIconName(fileName, false),\r\n      uploadProgressValue: 0,\r\n      onUploadProgress: (n: number) => {\r\n        fileItem.uploadProgressValue = n;\r\n        // 上傳元件在表單欄位的時候，進度條會失效所以要用detectChanges\r\n        this.cdr.detectChanges();\r\n      },\r\n    };\r\n    return fileItem;\r\n  }\r\n  // #endregion\r\n\r\n  onChooseFileClick(fileInput: HTMLInputElement) {\r\n    if (this.isWebMode) {\r\n      fileInput.value = '';\r\n      fileInput.click();\r\n    } else {\r\n      this.appAddFile();\r\n    }\r\n  }\r\n\r\n  /** 新增檔案(網頁版) */\r\n  onFileChanged(filesElement: HTMLInputElement) {\r\n    const files = filesElement.files;\r\n\r\n    const file = files[0] as File;\r\n    if (!file || !this.validUploadFile(file.size, file.name)) return;\r\n    const fileItem = this.createFileItem(file.name, file.size);\r\n    this.addFileItem(fileItem);\r\n\r\n    this._fileUploadCtrl\r\n      .uploadFile(file, fileItem, this.module, this.subModule, this.uofChunkSize, <FileUploadViewerInfo>{\r\n        isViewPdf: this.pdfViewerUsed,\r\n        enableWatermark: this.enableWatermark,\r\n      })\r\n      .finally(() => {\r\n        this._emitFileChanged();\r\n        // 清掉的檔案沒辦法立刻再被選取，要先選擇其他檔案，這裡把value清空是為了修正這個問題\r\n        filesElement.value = '';\r\n      });\r\n  }\r\n\r\n  /** 開啟檔案選取頁面(透過 ionic plugin) */\r\n  appAddFile() {\r\n    const options: UofxFilePickerFilesOptions = {\r\n      accept: this.allowExtensions,\r\n    };\r\n    this._filePicker\r\n      .getFiles(options)\r\n      .then((res) => {\r\n        const file = res.files[0];\r\n        if (this.validUploadFile(file.size, file.name)) {\r\n          const fileItem = this.createFileItem(file.name, file.size);\r\n          this.addFileItem(fileItem);\r\n\r\n          this._fileUploadCtrl\r\n            .uploadFile(file.blob, fileItem, this.module, this.subModule, this.uofChunkSize, <FileUploadViewerInfo>{\r\n              isViewPdf: this.pdfViewerUsed,\r\n              enableWatermark: this.enableWatermark,\r\n            })\r\n            .finally(() => {\r\n              // 上傳完才會產生downloadUrl，所以要發更新事件\r\n              this._emitFileChanged();\r\n            });\r\n        }\r\n      })\r\n      .catch((error) => {\r\n        this.errorTip = error.message;\r\n      });\r\n  }\r\n\r\n  /** @internal 取得檔案上傳大小限制 */\r\n  getFileUploadLimit(callback?: () => void) {\r\n    this.fileService.getFileUploadLimit().subscribe({\r\n      next: (res) => {\r\n        this.uploadSize = res.uploadSize;\r\n        if (res.checkLimit) {\r\n          this.remainingSize = res.remainingSize;\r\n        }\r\n        this.cdr.detectChanges();\r\n      },\r\n      complete: () => {\r\n        if (callback) callback();\r\n      },\r\n    });\r\n  }\r\n\r\n  /** 檔案每個項目上的點擊事件邏輯 */\r\n  onFileItemClick(action: UofxFileClickAction, item: UofxFileUploadFileItem, title: string = null) {\r\n    if (action === UofxFileClickAction.File) {\r\n      this.fileClickLogic(item, title);\r\n    } else if (action === UofxFileClickAction.Delete) {\r\n      this.removeFile(item);\r\n    }\r\n  }\r\n\r\n  /** 移除檔案 */\r\n  removeFile(item: UofxFileUploadFileItem) {\r\n    this._onTouched();\r\n    this._fileUploadCtrl.cancelUpload(item.id);\r\n    this.resultFileList.set(this.resultFileList().filter((r) => r.id !== item.id));\r\n    this._emitFileChanged();\r\n\r\n    /**\r\n     * 刪掉以後就可以新增其它檔案的情境\r\n     * -\r\n     * 1. 移除的是超過限制系統上限的檔案\r\n     * 2. 限制只能傳一份，刪除後列表為空\r\n     */\r\n    if (item.uploadOverLimit || (!this.allowMultiple && this.resultFileList().length === 0)) this.stopUpload = false;\r\n  }\r\n\r\n  /** 點擊檔案要執行的邏輯 (刪除以外) */\r\n  fileClickLogic(item: UofxFileUploadFileItem, title: string = null) {\r\n    this._onTouched();\r\n    // 有pdfUrl且轉檔成功 打開pdf viewer (return結束)\r\n    if (!item.isFromCad && item.pdfUrl && item.viewStatus === UofxFileViewStatus.ConvertSuccess) {\r\n      this.openFullscreenViewer(item, title);\r\n      this.recordAction(item.id, UofxFileActionType.View);\r\n      return;\r\n    }\r\n\r\n    // 有cadUrl且轉檔成功 打開cad viewer (return結束)\r\n    if (item.isFromCad && item.cadUrl && item.cadViewStatus === UofxCADViewStatus.ConvertSuccess) {\r\n      this.openFullscreenCadViewer(item, title);\r\n      this.recordAction(item.id, UofxFileActionType.View);\r\n      return;\r\n    }\r\n    this.executeDownloadFile(item);\r\n  }\r\n\r\n  /** 紀錄檔案動作 */\r\n  recordAction(fileId: string, action: UofxFileActionType) {\r\n    if (!this.recordFileAction) return;\r\n    this.fileService.recordFileAction(fileId, action).subscribe();\r\n  }\r\n\r\n  /** 處理下載檔案相關 */\r\n  executeDownloadFile(item: UofxFileUploadFileItem) {\r\n    /**\r\n     * 跳toast條件：\r\n     * 1. 不是圖片 & 不允許下載檔案 (圖片一律可以下載)\r\n     * 2. 沒有downloadUrl\r\n     */\r\n    if ((!this.allowDownloadFile && item.isFileUrl) || !item.downloadUrl) {\r\n      this.fileClickToast(item);\r\n      return;\r\n    }\r\n\r\n    // 區分是否為web或app模式進行不同處理\r\n    if (this.isWebMode) {\r\n      // 區分是否為圖片做不同處理\r\n      item.isFileUrl\r\n        ? (this.downloadHelper.webModeDownloadFile(item.downloadUrl, item.fileName),\r\n          this.recordAction(item.id, UofxFileActionType.Download))\r\n        : (this.downloadHelper.previewImage(item.downloadUrl), this.recordAction(item.id, UofxFileActionType.View));\r\n    } else {\r\n      this.downloadFile(item);\r\n    }\r\n  }\r\n\r\n  /** 點擊檔案無法下載，根據轉檔狀態跳不同提示 */\r\n  fileClickToast(item: UofxFileUploadFileItem) {\r\n    // *UKEY:\"global.file.upload.view-status-converting\"\r\n    // *UKEY:\"global.file.upload.view-status-convert-fail\"\r\n    // *UKEY:\"global.file.upload.view-status-over-page-limit\"\r\n    // *UKEY:\"global.file.upload.view-status-not-support\"\r\n    const status = item.viewStatus ?? item.cadViewStatus;\r\n    switch (status) {\r\n      case UofxCADViewStatus.Converting:\r\n      case UofxFileViewStatus.Converting:\r\n        this.showToast('global.file.upload.view-status-converting');\r\n        break;\r\n      case UofxFileViewStatus.ConvertFail:\r\n      case UofxCADViewStatus.ConvertFail:\r\n        this.showToast('global.file.upload.view-status-convert-fail', item.traceId ?? item.cadTraceId);\r\n        break;\r\n      case UofxFileViewStatus.OverPageLimit:\r\n        this.showToast('global.file.upload.view-status-over-page-limit');\r\n        break;\r\n      case UofxFileViewStatus.NotSupport:\r\n      case UofxCADViewStatus.NotSupport:\r\n        this.showToast('global.file.upload.view-status-not-support');\r\n        break;\r\n    }\r\n  }\r\n\r\n  /** 顯示提示Toast */\r\n  showToast(statusKey: string, id?: string) {\r\n    const message = this._i18n.trans(statusKey, { id });\r\n    this.toastCtrl.show({ message });\r\n  }\r\n\r\n  /** 開啟滿版pdf viewer */\r\n  async openFullscreenViewer(item: UofxFileUploadFileItem, title: string = null) {\r\n    const modal = await this.modalCtrl.create({\r\n      component: UofxFullscreenViewerDialog,\r\n      componentProps: {\r\n        title,\r\n        simpleOpen: true,\r\n        simpleOpenWithWatermark: this.simpleOpenWithWatermark,\r\n        watermarkSetting: <UofxWatermarkSettingModel>{\r\n          enabledWatermark: this.enableWatermark,\r\n        },\r\n        file: <UofxFileModel>{\r\n          id: item.id,\r\n          fileName: item.fileName,\r\n          pdfUrl: item.pdfUrl,\r\n          url: item.url,\r\n        },\r\n        downloadUrl: item.downloadUrl,\r\n        allowDownloadFile: this.allowDownloadFile,\r\n        enabledDownloadPdf: this.enabledDownloadPdf,\r\n      },\r\n    });\r\n    await modal.present();\r\n  }\r\n\r\n  /** 開啟滿版cad viewer */\r\n  async openFullscreenCadViewer(item: UofxFileUploadFileItem, title: string = null) {\r\n    const modal = await this.modalCtrl.create({\r\n      component: UofxCADViewerDialog,\r\n      componentProps: {\r\n        title,\r\n        fileId: item.id,\r\n        fileName: item.fileName,\r\n        urn: item.cadUrl,\r\n        downloadUrl: item.downloadUrl,\r\n        url: item.url,\r\n        allowDownloadFile: this.allowDownloadFile,\r\n      },\r\n    });\r\n    await modal.present();\r\n  }\r\n\r\n  /** [App mode]下載檔案 */\r\n  async downloadFile(item: UofxFileUploadFileItem) {\r\n    // 沒有網址列就不下載\r\n    if (!item.downloadUrl) return;\r\n\r\n    // 初始設定\r\n    item.errorMessage = null;\r\n    item.downloadProgressValue = 0;\r\n    item.onDownLoadProgress = (n: number) => {\r\n      this._zone.run(() => {\r\n        item.downloadProgressValue = n;\r\n      });\r\n    };\r\n\r\n    // 暫定都透過瀏覽器下載\r\n    this.downloadByBrowser(item);\r\n  }\r\n\r\n  /** [App mode]開啟外部瀏覽器下載 */\r\n  downloadByBrowser(item: UofxFileUploadFileItem) {\r\n    this.downloadHelper\r\n      .downloadRawFileInAppBrowser(false, item.downloadUrl, item.url)\r\n      .then(() => {\r\n        this.recordAction(item.id, UofxFileActionType.Download);\r\n      })\r\n      .catch((error) => {\r\n        item.errorMessage = error.message;\r\n      });\r\n  }\r\n\r\n  /** 在 app 中進行下載 */\r\n  async downloadByApp(item: UofxFileUploadFileItem) {\r\n    // 如果已下載過則直接開啟檔案\r\n    if (item.downloadLocalPath) {\r\n      this.openFile(item);\r\n      return;\r\n    }\r\n\r\n    // 下載存放位置\r\n    const savePath = await this._uofFile.getUri({\r\n      directory: UofxFileDirectory.Cache,\r\n      path: item.fileName,\r\n    });\r\n\r\n    // 下載進度條\r\n    this._ft.onprogress = function (progressEvent) {\r\n      const c = progressEvent.loaded / progressEvent.total;\r\n      item.onDownLoadProgress(c);\r\n    }.bind(this);\r\n\r\n    // 開始下載\r\n    const fileEntry = await this._ft.download(item.downloadUrl, savePath);\r\n    item.downloadLocalPath = fileEntry.nativeURL;\r\n\r\n    // 開啟檔案\r\n    this.openFile(item);\r\n  }\r\n\r\n  /** 用系統預設的 app 開啟檔案 */\r\n  async openFile(item: UofxFileUploadFileItem) {\r\n    if (!item.downloadLocalPath) return;\r\n    const info = await this._uofFile.info({ path: item.downloadLocalPath });\r\n    this._fileOpener.showOpenWithDialog(info.uri, info.mimeType);\r\n  }\r\n\r\n  /** @public 取得要上傳的FileGroup */\r\n  public _getFileSaveModel() {\r\n    const fileGroupModel = this._fileUploadCtrl.convertToUofxFileGroupModel(\r\n      this.fileGroupId,\r\n      this.module,\r\n      this.remainingSize,\r\n      this.resultFileList(),\r\n      this.subModule\r\n    );\r\n\r\n    if (!this.fileGroupId && fileGroupModel) this.fileGroupId = fileGroupModel.id;\r\n\r\n    return fileGroupModel;\r\n  }\r\n\r\n  /**\r\n   * @public 是否有檔案正在上傳\r\n   *\r\n   * @param {boolean} [showMsg=true] 是否顯示上傳中訊息，預設為 true\r\n   * @memberof UofxFileUploadComponent\r\n   */\r\n  public hasFileUploading(showMsg = true): boolean {\r\n    const list = this.resultFileList();\r\n    if (list?.length > 0) {\r\n      const uploadingFile = list.some((r) => r.uploadProgressValue !== undefined && r.uploadProgressValue !== 1);\r\n      if (showMsg && uploadingFile) this.errorTip = this._i18n.trans('global.file.upload.file-uploading');\r\n      else this.errorTip = null;\r\n      return uploadingFile;\r\n    } else {\r\n      this.errorTip = null;\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /** @public 是否有檔案有錯誤 */\r\n  public hasFileError(): boolean {\r\n    return this.resultFileList().filter((x) => x.errorMessage).length > 0;\r\n  }\r\n\r\n  /** @public 是否有檔案正在上傳中或有錯誤 */\r\n  public hasFileUploadingOrError() {\r\n    return this.hasFileUploading() || this.hasFileError();\r\n  }\r\n\r\n  /** @public 是否有檔案還在轉檔中 */\r\n  public hasFileConverting() {\r\n    const list = this.resultFileList();\r\n    if (list) {\r\n      const convertingFile = list.some((x) => !x.errorMessage && !x.pdfUrl && !x.traceId);\r\n      if (convertingFile) this.errorTip = this._i18n.trans('global.file.upload.file-converting');\r\n      return convertingFile;\r\n    } else {\r\n      this.errorTip = null;\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /** 驗證上傳檔案的正確性 */\r\n  validUploadFile(fileSize: number, fileName: string) {\r\n    this.errorTip = '';\r\n\r\n    if (!this.checkExtensions(fileName)) return false;\r\n    if (!this.checkUploadedSize(fileSize, fileName)) return false;\r\n\r\n    return true;\r\n  }\r\n\r\n  /** 檢查檔案類別是否正確 */\r\n  checkExtensions(fileName: string) {\r\n    // *UKEY:\"global.file.upload.file-type-not-allowed\"\r\n\r\n    let isValid = true;\r\n\r\n    // 判斷檔案類別是否正確\r\n    const extensions = fileName.split('.');\r\n    const isValidExtensions = this.allowExtensions\r\n      .split(',')\r\n      .indexOf(`.${extensions[extensions.length - 1].toLowerCase()}`);\r\n    if (this.allowExtensions && isValidExtensions === -1) {\r\n      this.errorTip = this._i18n.trans('global.file.upload.file-type-not-allowed', { value: `.${this.supportTypes}` });\r\n      isValid = false;\r\n    }\r\n    return isValid;\r\n  }\r\n\r\n  /** 檢查檔案上傳大小限制 */\r\n  checkUploadedSize(fileSize: number, fileName: string) {\r\n    // *UKEY:\"global.file.upload.error.over-limit\"\r\n    // *UKEY:\"global.file.upload.error.file-too-large\"\r\n\r\n    let isVaild = true;\r\n    let errorMessage;\r\n    const uploadedTotalSize = this.getUploadedTotalSize();\r\n\r\n    // 同時發生[單一檔案大小超過限制]和[超過總容量上限]，只需要顯示[超過總容量上限]的錯誤訊息。\r\n    // 超出檔案大小總上限  (已經有錯誤就不執行)\r\n    if (fileSize + uploadedTotalSize > this.remainingSize) {\r\n      errorMessage = this._i18n.trans('global.file.upload.error.over-limit');\r\n      this.stopUpload = true;\r\n      isVaild = false;\r\n    } else if (fileSize > this.uploadSize) {\r\n      // 超出單一檔案上限  (已經有錯誤就不執行)\r\n      errorMessage = this._i18n.trans('global.file.upload.error.file-too-large');\r\n      isVaild = false;\r\n    }\r\n\r\n    if (!isVaild) {\r\n      const fileItem: UofxFileUploadFileItem = {\r\n        isNewUpload: true,\r\n        uploadOverLimit: true,\r\n        fileName,\r\n        fileSize,\r\n        uploadProgressValue: 0,\r\n        errorMessage,\r\n      };\r\n      this.addFileItem(fileItem);\r\n    }\r\n\r\n    return isVaild;\r\n  }\r\n\r\n  /** 新增上傳檔案 item */\r\n  addFileItem(fileItem: UofxFileUploadFileItem) {\r\n    const list = this.resultFileList();\r\n    this.resultFileList.set([fileItem, ...list]);\r\n\r\n    this.newFile.emit(fileItem);\r\n    this.stopUploadIfSingleFileAllowed();\r\n    this._emitFileChanged();\r\n  }\r\n\r\n  /** 新增檔案後，若限制只能上傳一份檔案，將上傳按鈕disabled */\r\n  stopUploadIfSingleFileAllowed() {\r\n    if (!this.allowMultiple && this.resultFileList().length > 0) {\r\n      this.stopUpload = true;\r\n    }\r\n  }\r\n\r\n  /** 已上傳的檔案大小 */\r\n  getUploadedTotalSize() {\r\n    let size = 0;\r\n    this.resultFileList().forEach((file) => {\r\n      if (!file.errorMessage && file.isNewUpload) size += file.fileSize;\r\n    });\r\n    return size;\r\n  }\r\n\r\n  /** 轉成上傳元件的檔案model */\r\n  mapToUofxFileModel(fileList: Array<UofxFileModel>) {\r\n    if (!fileList) return [];\r\n\r\n    return fileList.map((file) => {\r\n      const convertFileUrl = this.downloadHelper.getDownloadUrl(file.fileName, file.url, file.rawUrl);\r\n\r\n      return <UofxFileUploadFileItem>{\r\n        id: file.id,\r\n        fileSize: file.length,\r\n        fileName: file.fileName,\r\n        url: file.url,\r\n        rawUrl: file.rawUrl,\r\n        downloadUrl: convertFileUrl.downloadUrl,\r\n        uploadBy: file.uploader,\r\n        errorMessage: file.errorMessage,\r\n        pdfUrl: file.pdfUrl,\r\n        screenShotUrl: this.downloadHelper.formatUrl(file.screenShotUrl),\r\n        fileIcon: this.downloadHelper.getFileIconName(file.fileName, file.isFromCad),\r\n        traceId: file.traceId,\r\n        isFileUrl: convertFileUrl.isFileUrl,\r\n        viewStatus: file.viewStatus,\r\n        cadUrl: file.cadUrl,\r\n        cadTraceId: file.cadTraceId,\r\n        cadViewStatus: file.cadViewStatus,\r\n        isFromCad: file.isFromCad,\r\n      };\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 更新從後端取得的最新轉檔相關資訊到檔案物件上\r\n   * @param {Array<UofxFileModel>} resultFiles 從後端檢查取得的最新結果\r\n   */\r\n  updateConvertInfo(resultFiles: Array<UofxFileModel>) {\r\n    const list = this.resultFileList();\r\n    resultFiles.forEach((resFile) => {\r\n      const file = list.find((item) => item.url === resFile.url);\r\n      if (file) {\r\n        file.pdfUrl = resFile?.pdfUrl;\r\n        file.traceId = resFile?.traceId;\r\n        file.screenShotUrl = this.downloadHelper.formatUrl(resFile?.screenShotUrl);\r\n        file.viewStatus = resFile?.viewStatus;\r\n        if (file.traceId) {\r\n          file.errorMessage = this._i18n.trans('global.file.upload.convert-error', { traceId: file.traceId });\r\n        }\r\n        if (resFile.viewStatus === UofxFileViewStatus.OverPageLimit) {\r\n          file.errorMessage = this._i18n.trans('global.file.upload.convert-page-limit-error');\r\n        }\r\n      }\r\n    });\r\n    this.resultFileList.set([...list]);\r\n    this._emitFileChanged();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /** 檔案顯示更多資訊按鈕 */\r\n  // TODO 未來有記上傳檔案的人員是誰的時候要顯示更多資訊\r\n  onMoreInfoClick() {\r\n    this.isReduceInfo = !this.isReduceInfo;\r\n  }\r\n\r\n  _emitFileChanged() {\r\n    const saveModel = this._getFileSaveModel();\r\n    this._onChange(saveModel);\r\n    this.fileChanged.emit(saveModel?.files);\r\n  }\r\n\r\n  _onChange: (value: UofxFileGroupModel) => void = () => {};\r\n  _onTouched: () => void = () => {};\r\n\r\n  // ControlValueAccessor 實作\r\n  /** @public 寫入值 */\r\n  writeValue(value: UofxFileGroupModel): void {\r\n    if (!value) return;\r\n    const { id, files } = value;\r\n    this.fileGroupId = id;\r\n    this.resultFileList.set(this.mapToUofxFileModel(files));\r\n    this._checkTempUrl();\r\n  }\r\n\r\n  /** 檢查是否有暫存區的 url */\r\n  _checkTempUrl() {\r\n    if (this.isPluginUpload() && this.fileGroupId) {\r\n      // 外掛模組需要重新取得的檔案 url\r\n      this.fileService.loadFileList(this.fileGroupId).subscribe({\r\n        next: (res) => {\r\n          this.resultFileList.set(this.mapToUofxFileModel(res));\r\n          this._emitFileChanged();\r\n        },\r\n      });\r\n    }\r\n  }\r\n\r\n  /** @public 註冊變更事件 */\r\n  registerOnChange(fn: (value: UofxFileGroupModel) => void): void {\r\n    this._onChange = fn;\r\n  }\r\n  /** @public 註冊觸碰事件 */\r\n  registerOnTouched(fn: () => void): void {\r\n    this._onTouched = fn;\r\n  }\r\n  /** @public 設定 disabled 狀態 */\r\n  setDisabledState(isDisabled: boolean): void {\r\n    // 不實作\r\n  }\r\n}\r\n\r\n/** 可設定的 Header Button 類型 */\r\ntype InputHeaderButtonsType = UofxFileButtonType | UofxFileButton;\r\n","<ng-container *ngIf=\"!liteMode\">\r\n  <!-- 檔案新增按鈕 -->\r\n  <div *ngIf=\"!readonly\" class=\"upload-btn\">\r\n    <input #file [type]=\"'file'\" [accept]=\"allowExtensions\" (change)=\"onFileChanged(file)\" style=\"display: none\" />\r\n    <!-- 上傳按鈕 -->\r\n    <ion-button\r\n      class=\"uofx-btn-3rd\"\r\n      [attr.disabled]=\"disabled || stopUpload || !isValidUpload()\"\r\n      (click)=\"onChooseFileClick(file)\">\r\n      <uofx-icon *ngIf=\"displayHeaderButton().icon\" size=\"25\" [name]=\"displayHeaderButton().icon\"></uofx-icon>\r\n      <span [translate]=\"displayHeaderButton().text\"></span>\r\n    </ion-button>\r\n    <!-- 套入自訂的 headerTemplate -->\r\n    <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n  </div>\r\n  <div class=\"errorTip margin-top\" *ngIf=\"errorTip\">{{ errorTip }}</div>\r\n  <!-- 檔案列表 -->\r\n  <div class=\"file-list margin-top\" [ngClass]=\"{ 'short-list': shortMode }\" *ngIf=\"resultFileList()?.length > 0\">\r\n    <!-- 簡要列表 -->\r\n    <ng-container *ngIf=\"shortMode && resultFileList()?.length > 1; else intactListTemplate\">\r\n      <ng-container *ngFor=\"let i of [0, 1]\">\r\n        <ng-container *ngTemplateOutlet=\"fileItemTemplate; context: { $implicit: resultFileList()[i] }\"> </ng-container>\r\n      </ng-container>\r\n      <span *ngIf=\"resultFileList()?.length > 2\" class=\"file-list-amount\"\r\n        >{{ '+' }}{{ resultFileList().length - 2 }}</span\r\n      >\r\n    </ng-container>\r\n\r\n    <!-- 完整列表 -->\r\n    <ng-template #intactListTemplate>\r\n      <ng-container *ngFor=\"let fileItem of resultFileList()\">\r\n        <ng-container *ngTemplateOutlet=\"fileItemTemplate; context: { $implicit: fileItem }\"> </ng-container>\r\n      </ng-container>\r\n    </ng-template>\r\n  </div>\r\n\r\n  <!-- 檔案 template -->\r\n  <ng-template #fileItemTemplate let-fileItem>\r\n    <uofx-file-item\r\n      [isWebMode]=\"isWebMode\"\r\n      [ellipseInfo]=\"shortMode\"\r\n      [fileItem]=\"fileItem\"\r\n      [fileItemDisable]=\"!readonly && disabled\"\r\n      [disallowDelete]=\"readonly || disabled\"\r\n      [pdfViewerUsed]=\"pdfViewerUsed\"\r\n      [uploadProgressValue]=\"fileItem.uploadProgressValue\"\r\n      (fileItemClick)=\"onFileItemClick($event, fileItem)\">\r\n    </uofx-file-item>\r\n  </ng-template>\r\n</ng-container>\r\n","import { Subject, Subscription } from 'rxjs';\r\n\r\nimport {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnDestroy,\r\n  Output,\r\n  ViewChild,\r\n} from '@angular/core';\r\nimport { UofxFileModel, UofxFileViewStatus } from '@uofx/app-components/file-helper';\r\nimport { UofxWatermarkSettingModel } from '@uofx/app-components/pdf';\r\nimport { UofxConsole, deepCopy } from '@uofx/core';\r\n\r\nimport { UofxFileService } from '../api/service/file.service';\r\nimport { UofxFileUploadComponent } from '../file-upload.component';\r\nimport {\r\n  UofxFileButton,\r\n  UofxFileGroupModel,\r\n  UofxFileUploadFileItem,\r\n  UofxFileUploadModuleType,\r\n} from '../file.interface';\r\n\r\n@Component({\r\n  selector: 'uofx-file-viewer',\r\n  templateUrl: './file-viewer.component.html',\r\n  styleUrls: ['./file-viewer.component.scss'],\r\n})\r\nexport class UofxFileViewerComponent implements AfterViewInit, OnDestroy {\r\n  @ViewChild('fileUploadObj') fileUploadObj: UofxFileUploadComponent;\r\n\r\n  /** 是否可以編輯 */\r\n  @Input() editable = true;\r\n  /** 檔案上傳的模組 */\r\n  @Input() fileUploadModule: string | UofxFileUploadModuleType = UofxFileUploadModuleType.Bpm;\r\n  /** 檔案file group (來自api) */\r\n  @Input() value: UofxFileGroupModel;\r\n  /** 文件檢視器高度 */\r\n  @Input() viewerHeight = null;\r\n  /** pdf浮水印的相關設定 */\r\n  @Input() watermarkSetting: UofxWatermarkSettingModel = null;\r\n  /** 是否允許viewer內點擊下載檔案 */\r\n  @Input() enabledDownloadPdf = false;\r\n  /** 允許選擇多筆檔案 */\r\n  @Input() allowMultiple = true;\r\n  /** 顯示 tab */\r\n  @Input() showTab = true;\r\n  /** 支援轉檔的副檔名 */\r\n  @Input() allowExtensions = '.ppt,.pptx,.doc,.docx,.odt,.ott,.pdf,.txt,.xls,.xlsx,.numbers,.csv';\r\n  /** 檔案選項變更時的emitter */\r\n  @Output() changeFiles = new EventEmitter();\r\n\r\n  readonly headerButton: UofxFileButton = {\r\n    text: 'global.file-viewer.upload-btn.add-pdf',\r\n    icon: 'attach',\r\n  };\r\n\r\n  /** 要顯示的檔案 */\r\n  file: UofxFileModel;\r\n  /** 用於當前元件操作的file list物件，不可直接拿api取得的fileList來操作，會導致資料有誤 */\r\n  tempFileList: Array<UofxFileModel> = [];\r\n  /** 目前選擇在第幾份檔案 */\r\n  currentCount: number = 1;\r\n  /** 總共有幾份檔案 */\r\n  totalCount: number = 0;\r\n  /** 目前選取的檔案是第幾個 */\r\n  selectedValue = 0;\r\n  /** 用來更換pdf的subject */\r\n  openPdfSubject = new Subject<UofxFileModel>();\r\n  /** 檢查檔案是否轉檔完成的訂閱 */\r\n  checkFileSub$: Subscription;\r\n  /** 是否正在檢查檔案轉檔狀態 */\r\n  isCheckingFiles = false;\r\n  segmentScroll = false;\r\n  /** pdf是否正在開啟中 */\r\n  isPdfOpening = false;\r\n  /** 有重載檔案的需求，但pdf開啟中，所以等開啟完成時再處理 */\r\n  reloadAfterOpen = false;\r\n\r\n  constructor(\r\n    private fileService: UofxFileService,\r\n    private cdr: ChangeDetectorRef\r\n  ) {}\r\n\r\n  ngAfterViewInit() {\r\n    this.initValue();\r\n\r\n    // 等待資料渲染後再執行segment scrollable，否則會表單會被捲到該欄位的位置。\r\n    setTimeout(() => {\r\n      this.segmentScroll = true;\r\n    }, 500);\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.openPdfSubject?.complete();\r\n    this.checkFileSub$?.unsubscribe();\r\n  }\r\n\r\n  /** @internal 檔案有變更時，更新檔案tab及viewer */\r\n  onFileChanged() {\r\n    this.canDoCheckFiles().then((isUpdateViewer: boolean) => {\r\n      if (isUpdateViewer) {\r\n        // 只把有 url & pdfUrl & 檔案轉檔狀態\"轉檔成功\" 的檔案丟給 pdf-viewer\r\n        this.tempFileList =\r\n          this.value?.files.filter((item) => item.url && item.pdfUrl && this.isConvertEnd(item.viewStatus)) ?? [];\r\n        this.initWhenFileChanged();\r\n      }\r\n    });\r\n    this.changeFiles.emit(this.value);\r\n  }\r\n\r\n  /** @internal 檔案tab change事件 */\r\n  onSegmentChange(args: CustomEvent) {\r\n    this.currentCount = +args.detail.value + 1;\r\n    const selectedFile = this.tempFileList[+args.detail.value];\r\n    this.openPdfSubject.next(selectedFile);\r\n  }\r\n\r\n  /** 開啟pdf前的事件 */\r\n  onBeforeOpenPdf() {\r\n    this.isPdfOpening = true;\r\n  }\r\n\r\n  /** 開啟pdf後的事件 */\r\n  onAfterOpenPdf() {\r\n    this.isPdfOpening = false;\r\n\r\n    if (this.reloadAfterOpen) {\r\n      this.reloadAfterOpen = false;\r\n      this.openPdfSubject.next(this.tempFileList[0]);\r\n    }\r\n  }\r\n\r\n  /** 第一次產生此component要初始化的參數 */\r\n  private initValue() {\r\n    this.tempFileList = this.value?.files ?? [];\r\n    if (\r\n      this.tempFileList &&\r\n      this.tempFileList.length > 0 &&\r\n      this.tempFileList[0].url &&\r\n      this.tempFileList[0].url !== ''\r\n    ) {\r\n      this.file = deepCopy(this.tempFileList[0]);\r\n      this.initFileCountInfo();\r\n    }\r\n  }\r\n\r\n  /** 檔案變更時要做的邏輯 */\r\n  private initWhenFileChanged() {\r\n    if (\r\n      this.tempFileList &&\r\n      this.tempFileList.length > 0 &&\r\n      this.tempFileList[0].url &&\r\n      this.tempFileList[0].url !== ''\r\n    ) {\r\n      this.initFileCountInfo();\r\n      this.reloadFirstFile();\r\n      this.initTab();\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n  /** 重載第一份檔案 */\r\n  private reloadFirstFile() {\r\n    if (this.isPdfOpening) {\r\n      this.reloadAfterOpen = true;\r\n    } else {\r\n      this.openPdfSubject.next(this.tempFileList[0]);\r\n    }\r\n  }\r\n\r\n  /** 初始化檔案數量資訊 */\r\n  private initFileCountInfo() {\r\n    this.currentCount = 1;\r\n    this.totalCount = this.tempFileList.length;\r\n  }\r\n\r\n  /** 初始化tab */\r\n  private initTab() {\r\n    // 有檔案並且selectedValue並非為0才執行，為了避免viewer載入兩次 (onFileChanged & onSegmentChange各一次)\r\n    if (this.tempFileList.length > 0 && +this.selectedValue !== 0) {\r\n      this.selectedValue = 0;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 確認是否可以執行 API 檢查檔案狀態\r\n   *\r\n   * @private\r\n   * @return {*} {Promise<boolean>}\r\n   * @memberof UofxFileViewerComponent\r\n   */\r\n  private canDoCheckFiles() {\r\n    return new Promise<boolean>((resolve) => {\r\n      // API 執行條件\r\n      // -\r\n      // 1.沒有檢查進行中\r\n      // 2.所有檔案上傳完成\r\n      // 3.有檔案轉檔中\r\n      // -\r\n      // 刪除檔案也會觸發此方法，因為檔案清單會被更新，\r\n      // 所以檢查上述狀態皆為 false，但還是需要更新 viewer。\r\n\r\n      // 如果正在檢查中，則不再重複執行\r\n      if (this.isCheckingFiles) return resolve(false);\r\n\r\n      // 如果還有檔案在上傳中\r\n      if (this.fileUploadObj.hasFileUploading(false)) return resolve(true);\r\n\r\n      // 如果所有檔案都是處理完的狀態，卻發生更新，有可能是刪除檔案，回傳 true，更新 viewer\r\n      if (this.isAllFileCheckFinish()) return resolve(true);\r\n\r\n      // 檢查檔案是否都轉檔完成\r\n      this.doCheckFiles(resolve);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 取得需要被檢查的檔案清單\r\n   *\r\n   * @private\r\n   * @return {*}  {Array<UofxFileUploadFileItem>}\r\n   * @memberof UofxFileViewerComponent\r\n   */\r\n  private getCheckFiles(): Array<UofxFileUploadFileItem> {\r\n    /**\r\n     * 要被檢查的檔案清單\r\n     * -\r\n     * 1. 有 errorMessage 代表可能前端或後端已經回傳錯誤\r\n     * 2. 有 pdfUrl 代表後端已經處理完畢且有可下載的檔案\r\n     * 3. 有 traceId 代表後端已經處理完畢且有可追蹤的錯誤代碼\r\n     * 4. 檢查 viewStatus 是否已經轉檔結束\r\n     */\r\n    return this.fileUploadObj\r\n      .resultFileList()\r\n      .filter((item) => !item.errorMessage && !item.pdfUrl && !item.traceId && !this.isConvertEnd(item.viewStatus));\r\n  }\r\n\r\n  /**\r\n   * 檢查所有檔案是否都已經轉檔完成\r\n   *\r\n   * @private\r\n   * @return {*}  {boolean}\r\n   * @memberof UofxFileViewerComponent\r\n   */\r\n  private isAllFileCheckFinish(): boolean {\r\n    // 沒有檔案 或 檔案清單為空，代表沒有檔案需要處理\r\n    const checkFiles = this.getCheckFiles();\r\n    return !checkFiles || checkFiles.length === 0;\r\n  }\r\n\r\n  /**\r\n   * 呼叫 API 檢查檔案並處理結果\r\n   *\r\n   * @private\r\n   * @param {((value: boolean | PromiseLike<boolean>) => void)} resolve\r\n   * @return {*}  {void}\r\n   * @memberof UofxFileViewerComponent\r\n   */\r\n  private doCheckFiles(resolve: (value: boolean | PromiseLike<boolean>) => void): void {\r\n    this.isCheckingFiles = true;\r\n\r\n    // 呼叫 API 檢查檔案是否轉檔完成\r\n    UofxConsole.log('Start to check files !');\r\n    const checkFiles = this.getCheckFiles();\r\n    this.checkFileSub$ = this.fileService.checkFileConvert(checkFiles).subscribe({\r\n      next: (res) => {\r\n        // 更新最新的轉檔相關資訊到檔案物件上\r\n        this.fileUploadObj.updateConvertInfo(res.files);\r\n        // 所有檔案皆完成，則結束 interval 並更新 viewer\r\n        if (res.convertCompleted) {\r\n          // 再次確認所有檔案已完成\r\n          const isAllFileCheckFinish = this.isAllFileCheckFinish();\r\n          if (!isAllFileCheckFinish) {\r\n            // 如果有其他新增的檔案還在轉檔中，則等待 3 秒後再進行下一次檢查\r\n            UofxConsole.log('Some files are still converting, checking again after 3 seconds !');\r\n            this.checkAfter3Seconds(resolve);\r\n            return;\r\n          }\r\n\r\n          UofxConsole.log('Check files completed !');\r\n          // 檢查完成後清掉轉檔中的訊息\r\n          this.fileUploadObj.errorTip = null;\r\n          // 重置檢查狀態\r\n          this.isCheckingFiles = false;\r\n          // 轉檔完成，更新 viewer\r\n          resolve(true);\r\n        } else {\r\n          // 有檔案還在轉檔中，則等待 3 秒後再進行下一次檢查\r\n          UofxConsole.log('Files are still converting, checking again after 3 seconds !');\r\n          this.checkAfter3Seconds(resolve);\r\n        }\r\n      },\r\n      error: (err) => {\r\n        UofxConsole.error('Error checking files:', err);\r\n        // 輸出錯誤訊息後，等待 3 秒後再進行下一次檢查\r\n        this.checkAfter3Seconds(resolve);\r\n      },\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 檢查檔案轉檔狀態，並在 3 秒後再次檢查\r\n   *\r\n   * @private\r\n   * @param {((value: boolean | PromiseLike<boolean>) => void)} resolve\r\n   * @memberof UofxFileViewerComponent\r\n   */\r\n  private checkAfter3Seconds(resolve: (value: boolean | PromiseLike<boolean>) => void): void {\r\n    // 每 3 秒檢查一次檔案轉檔狀態\r\n    setTimeout(() => {\r\n      this.doCheckFiles(resolve);\r\n    }, 3000);\r\n  }\r\n\r\n  /**\r\n   * 取得檔案轉檔狀態是否已經結束\r\n   *\r\n   * @private\r\n   * @param {UofxFileViewStatus} viewStatus\r\n   * @return {*}  {boolean}\r\n   * @memberof UofxFileViewerComponent\r\n   */\r\n  private isConvertEnd(viewStatus: UofxFileViewStatus): boolean {\r\n    return !(viewStatus === undefined || viewStatus === UofxFileViewStatus.Converting);\r\n  }\r\n}\r\n","<!-- [translate]=\"'global.file-viewer.upload-btn.add-pdf'\" -->\r\n<uofx-file-upload\r\n  *ngIf=\"editable\"\r\n  #fileUploadObj\r\n  [(ngModel)]=\"value\"\r\n  [module]=\"fileUploadModule\"\r\n  [readonly]=\"!editable\"\r\n  [disabled]=\"!editable\"\r\n  [allowExtensions]=\"allowExtensions\"\r\n  [pdfViewerUsed]=\"true\"\r\n  [allowMultiple]=\"allowMultiple\"\r\n  [enableWatermark]=\"watermarkSetting && watermarkSetting.enabledWatermark\"\r\n  [enabledDownloadPdf]=\"enabledDownloadPdf\"\r\n  [headerButton]=\"headerButton\"\r\n  (fileChanged)=\"onFileChanged()\">\r\n</uofx-file-upload>\r\n\r\n<div [hidden]=\"!tempFileList || tempFileList.length === 0\">\r\n  <ng-container *ngIf=\"showTab\">\r\n    <!-- 第{{currentCount}}份，共{{totalCount}}份 -->\r\n    <div class=\"margin-vertical\">\r\n      <span\r\n        [innerHTML]=\"\r\n          'global.file-viewer.pdf-count' | translate: { currentCount: currentCount, totalCount: totalCount }\r\n        \">\r\n      </span>\r\n    </div>\r\n    <!-- 檔案tab -->\r\n    <ion-segment\r\n      mode=\"md\"\r\n      [disabled]=\"isPdfOpening\"\r\n      [scrollable]=\"segmentScroll\"\r\n      [(ngModel)]=\"selectedValue\"\r\n      (ionChange)=\"onSegmentChange($event)\">\r\n      <ion-segment-button *ngFor=\"let file of tempFileList; let i = index\" [value]=\"i\">\r\n        <ion-label>{{ file.fileName }}</ion-label>\r\n      </ion-segment-button>\r\n    </ion-segment>\r\n  </ng-container>\r\n\r\n  <!-- 文件檢視器 -->\r\n  <uofx-pdf-viewer\r\n    [file]=\"file\"\r\n    [viewerHeight]=\"viewerHeight\"\r\n    [watermarkSetting]=\"watermarkSetting\"\r\n    [enabledDownloadPdf]=\"enabledDownloadPdf\"\r\n    [openPdfSubject]=\"openPdfSubject\"\r\n    [editable]=\"editable\"\r\n    (beforeOpenPdf)=\"onBeforeOpenPdf()\"\r\n    (afterOpenPdf)=\"onAfterOpenPdf()\">\r\n  </uofx-pdf-viewer>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { IonicModule } from '@ionic/angular';\r\nimport { UofxToastController, UofxTranslateModule } from '@uofx/app-components';\r\nimport { UofxCadViewerModule } from '@uofx/app-components/cad-viewer';\r\nimport { UofxFileHelperModule } from '@uofx/app-components/file-helper';\r\nimport { UofxIconModule } from '@uofx/app-components/icon';\r\nimport { UofxModalModule } from '@uofx/app-components/modal';\r\nimport { UofxPdfLogic, UofxPdfService, UofxPdfViewerModule } from '@uofx/app-components/pdf';\r\n\r\nimport { UofxFileUploadController } from './controller/file-upload.controller';\r\nimport { UofxFileItemComponent } from './file-item/file-item.component';\r\nimport { UofxFileUploadComponent } from './file-upload.component';\r\nimport { UofxFileViewerComponent } from './file-viewer/file-viewer.component';\r\nimport { UofxFileSizeFormatPipe } from './filesize-format/filesize-format.pipe';\r\n\r\nconst BASE_COMPONENTS = [UofxFileItemComponent];\r\nconst COMPONENTS = [UofxFileItemComponent, UofxFileItemComponent, UofxFileUploadComponent, UofxFileViewerComponent];\r\nconst PIPES = [UofxFileSizeFormatPipe];\r\n\r\n@NgModule({\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    IonicModule,\r\n\r\n    UofxCadViewerModule,\r\n    UofxFileHelperModule,\r\n    UofxModalModule,\r\n    UofxIconModule,\r\n    UofxPdfViewerModule,\r\n    UofxTranslateModule,\r\n  ],\r\n  exports: [...COMPONENTS, ...PIPES],\r\n  declarations: [...BASE_COMPONENTS, ...COMPONENTS, ...PIPES],\r\n  providers: [UofxToastController, UofxFileUploadController, UofxPdfLogic, UofxPdfService],\r\n})\r\nexport class UofxFileUploadModule {}\r\n","import { Injectable, inject } from '@angular/core';\r\n\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { UofxFileGroupModel } from '../file.interface';\r\n\r\n@Injectable()\r\nexport class UofxFilePluginService {\r\n  private http = inject(HttpClient);\r\n\r\n  /**\r\n   * 提交上傳的檔案\r\n   * @param {UofxFileGroupModel} fileGroup 上傳檔案的 File Group\r\n   * @return {*}  {Observable<void>}\r\n   * @memberof UofxFilePluginService\r\n   */\r\n  submitFile(fileGroup: UofxFileGroupModel): Observable<void> {\r\n    const url = `~/api/app/base/file/sumt/${fileGroup?.module}`;\r\n    return this.http.post<void>(url, fileGroup);\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.UofxFileService","i1","i2","i3","i4","i5","i6.UofxFileSizeFormatPipe","i3.UofxFileUploadController","i4.UofxFileService","i6","i9","i10.UofxFileItemComponent","i6.UofxFileUploadComponent"],"mappings":"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"}