{"version":3,"file":"uofx-core.mjs","sources":["../../src/current-user/current-user.model.ts","../../src/utility/deep.ts","../../src/utility/storage/session.storage.ts","../../src/utility/storage/local.storage.ts","../../src/current-user/current-user.ts","../../src/router/router-helper.ts","../../src/mgmt-auth-guard/mgmt-auth-guard.ts","../../src/auth-guard/auth-guard.service.ts","../../src/auth-guard/auth-guard.ts","../../src/decorators/interface.ts","../../src/decorators/before-unload.decorator.ts","../../src/decorators/authorize.decorator.ts","../../src/i18n/i18n.interface.ts","../../src/i18n/i18n-config.service.ts","../../src/utility/console/console.ts","../../src/i18n/i18n-loader.service.ts","../../src/i18n/i18n.service.ts","../../src/i18n/i18n-guard.ts","../../src/router/router.ts","../../src/router/router-matcher.ts","../../src/plugin/plugin-setting.ts","../../src/utility/helper/helper.ts","../../src/utility/config/config.ts","../../src/utility/crypto.ts","../../src/utility/check.ts","../../src/utility/mock/mock.config.ts","../../src/utility/mock/mock.service.ts","../../src/utility/mock/status.error.ts","../../src/utility/mock/mock.interceptor.ts","../../src/utility/mock/mock.module.ts","../../src/utility/exception-keeper/exception-keeper.ts","../../src/utility/guid/guid.ts","../../src/utility/helper/path-helper.ts","../../src/utility/settings/setting.ts","../../src/utility/utility.model.ts","../../src/utility/lodash-expand/lodash-expand.ts","../../src/uofx-core.ts"],"sourcesContent":["/** 使用者基本資訊 */\r\nexport interface UserProfileModel {\r\n  /** 使用者id */\r\n  id?: string;\r\n  /** 帳號 */\r\n  account?: string;\r\n  /** 姓名 */\r\n  name?: string;\r\n  /** 公司 Id */\r\n  corpId?: string;\r\n  /** 公司名稱 */\r\n  corpName?: string;\r\n  /** 網域id */\r\n  domainId?: string;\r\n  /** 網域名稱 */\r\n  domainName?: string;\r\n  /** 大頭貼圖案 */\r\n  imageInfoUrl?: string;\r\n  /** 可使用的網域清單 */\r\n  domains?: Array<DomainModel>;\r\n  /** 登入的公司別識別碼 */\r\n  signinPathCode?: string;\r\n  /** 是否為公司第一位登入人員 */\r\n  isCorpFirstUserLogin?: boolean;\r\n  /** 需要導覽的地方 */\r\n  funcsFirstTime?: Array<FirstTimeTourModel>;\r\n  /** 是否使用UOF驗證登入 */\r\n  isUofDomainSignin?: boolean;\r\n  /** 語系 */\r\n  culture?: string;\r\n  /** 用於 URL 驗證登出後要去的地方 */\r\n  signOutUrl?: string;\r\n  /** 字體大小 */\r\n  fontSize?: number;\r\n}\r\n\r\n/** 登入偏好設定 / 記住登入資訊、使用者語系 */\r\nexport interface UserLoginModel {\r\n  /** 是否有勾選{記住登入資訊} */\r\n  isRememberAccount?: boolean;\r\n  /** 公司別 */\r\n  loginPathCode?: string;\r\n  /** 輸入的帳號 */\r\n  loginAccount?: string;\r\n  /** 所選網域 */\r\n  loginDomainId?: string;\r\n\r\n  /** 語系(登入後會更新成個人設定裡的語系) */\r\n  loginCulture?: string;\r\n  /** [重新登入頁使用] 重新登入後系統是否會自動重新整理頁面 */\r\n  isReload?: boolean;\r\n  /** 資料顯示模式 (grid or list) */\r\n  dataViewMode?: DataViewMode;\r\n}\r\n\r\n/** 授權相關資訊 */\r\nexport interface UserAuthModel {\r\n  /** token */\r\n  token?: string;\r\n  /** token 過期時間，單位為秒 */\r\n  tokenExp?: number;\r\n}\r\n\r\n/** 登入者的公司別資訊 */\r\nexport interface UserCorpsModel {\r\n  /** 管理者 */\r\n  admin?: Array<CorpInfoModel>;\r\n  /** 使用者 */\r\n  user?: Array<CorpInfoModel>;\r\n}\r\n\r\n/** 通知中心導頁參數 */\r\nexport interface UserNotifyModel {\r\n  /** 哪個功能 */\r\n  action: string;\r\n  /** 功能相對應的參數 */\r\n  payload: unknown;\r\n}\r\n\r\n/** 公司別資料 */\r\nexport interface CorpInfoModel {\r\n  /** Id */\r\n  corpId: string;\r\n  /** 代碼 */\r\n  code: string;\r\n  /** 登入識別碼 */\r\n  pathCode: string;\r\n  /** 名稱 */\r\n  name: string;\r\n}\r\n\r\n/** 網域下拉選單 item model */\r\nexport interface DomainModel {\r\n  /** id */\r\n  domainId: string;\r\n  /** 名稱 */\r\n  name: string;\r\n  /** 類型 */\r\n  domainType: DomainType;\r\n}\r\n\r\n/** 網域類型 */\r\nexport enum DomainType {\r\n  Uof = 0,\r\n  AD = 1,\r\n  /** Microsoft Entra ID */\r\n  MEID = 2,\r\n  /** 自訂登入 */\r\n  TAD = 3,\r\n}\r\n\r\n/** 第一次需要導覽的地方 */\r\nexport interface FirstTimeTourModel {\r\n  /** 要導覽的地方的func id */\r\n  funcId: string;\r\n  /** 是否為第一次需要導覽 */\r\n  isShowFirstTime: boolean;\r\n}\r\n\r\n/** 資料顯示模式的列舉 */\r\nexport enum DataViewMode {\r\n  /** 卡片模式 */\r\n  Grid = 'grid',\r\n  /** 列表模式 */\r\n  List = 'list',\r\n}\r\n","import extend from 'extend';\r\n\r\n/**\r\n * 深度複製物件\r\n **/\r\nexport function deepCopy(obj: any): any {\r\n  const result = extend(true, {}, { _: obj });\r\n  return result._;\r\n}\r\n/**\r\n *  * 深度合併物件\r\n *\r\n * @param original 原始物件\r\n * @param arrayProcessMethod\r\n * @param objects 目標物件\r\n * @returns\r\n */\r\nexport function deepMergeKey(original: any, arrayProcessMethod: boolean, ...objects: any[]): any {\r\n  if (Array.isArray(original) || typeof original !== 'object') return original;\r\n\r\n  const isObject = (v: any) => typeof v === 'object' || typeof v === 'function';\r\n\r\n  const merge = (target: any, obj: any) => {\r\n    Object.keys(obj)\r\n      .filter(key => key !== '__proto__' && Object.prototype.hasOwnProperty.call(obj, key))\r\n      .forEach(key => {\r\n        const fromValue = obj[key];\r\n        const toValue = target[key];\r\n        if (Array.isArray(toValue)) {\r\n          target[key] = arrayProcessMethod ? fromValue : [...toValue, ...fromValue];\r\n        } else if (fromValue != null && isObject(fromValue) && toValue != null && isObject(toValue)) {\r\n          target[key] = merge(toValue, fromValue);\r\n        } else {\r\n          target[key] = deepCopy(fromValue);\r\n        }\r\n      });\r\n    return target;\r\n  };\r\n\r\n  objects.filter(v => v != null && isObject(v)).forEach(v => merge(original, v));\r\n\r\n  return original;\r\n}\r\n\r\n/**\r\n *  * 深度合併物件\r\n *\r\n * @param original 原始物件\r\n * @param arrayProcessMethod\r\n * @param objects 目標物件\r\n * @returns\r\n */\r\nexport function deepMerge(original: any, ...objects: any[]): any {\r\n  return deepMergeKey(original, false, ...objects);\r\n}\r\n","export class SessionStorage {\r\n\r\n  static get(key: string): string {\r\n    const value = sessionStorage.getItem(key);\r\n    if (value) return sessionStorage.getItem(key);\r\n    else return null;\r\n  }\r\n\r\n  static set(key: string, value: string): void {\r\n    if (value) sessionStorage.setItem(key, value);\r\n    else this.remove(key);\r\n  }\r\n\r\n  static getObject(key: string) {\r\n    const value = sessionStorage.getItem(key);\r\n    if (value) return JSON.parse(sessionStorage.getItem(key));\r\n    else return null;\r\n  }\r\n\r\n  static setObject(key: string, value): void {\r\n    if (value) sessionStorage.setItem(key, JSON.stringify(value));\r\n    else this.remove(key);\r\n  }\r\n\r\n  static remove(key: string): void {\r\n    sessionStorage.removeItem(key);\r\n  }\r\n\r\n  static clear() {\r\n    sessionStorage.clear();\r\n  }\r\n}\r\n","export class LocalStorage {\r\n\r\n  static set(key: string, value: string): void {\r\n    localStorage.setItem(key, value);\r\n  }\r\n\r\n  static get(key: string): string {\r\n    return localStorage.getItem(key);\r\n  }\r\n\r\n  static setObject(key: string, value): void {\r\n    localStorage.setItem(key, JSON.stringify(value));\r\n  }\r\n\r\n  static getObject(key: string) {\r\n    return JSON.parse(localStorage.getItem(key));\r\n  }\r\n\r\n  static remove(key: string): void {\r\n    localStorage.removeItem(key);\r\n  }\r\n\r\n  static clear() {\r\n    localStorage.clear();\r\n  }\r\n}\r\n","import { UserAuthModel, UserLoginModel, UserCorpsModel, UserNotifyModel, UserProfileModel, DataViewMode } from './current-user.model';\r\nimport { deepMerge } from '../utility/deep';\r\nimport { SessionStorage } from '../utility/storage/session.storage';\r\nimport { LocalStorage } from '../utility/storage/local.storage';\r\n\r\n/** 用來存放當前登入者的資訊 */\r\nexport class CurrentUser {\r\n  /** 登入後轉址 Url */\r\n  public static ReturnUrl: string;\r\n\r\n  /** storage key 前綴 */\r\n  private static readonly KEY_PREFIX = 'UOFX';\r\n  /** 使用者公司資訊的 storage key */\r\n  public static readonly KEY_USER_CORPS = `${this.KEY_PREFIX}UC`;\r\n  /** 使用者資訊的 storage key */\r\n  public static readonly KEY_USER_INFO = `${this.KEY_PREFIX}UI`;\r\n  /** 登入設定的 storage key */\r\n  private static readonly KEY_LOGIN_SETTINGS = `${this.KEY_PREFIX}US`;\r\n\r\n  /** 使用者資訊 */\r\n  private static _profile: UserProfileModel = this._sessionStorageGet(this.KEY_USER_INFO) ?? null;\r\n  /** 授權相關資訊，token 只存在 memory */\r\n  private static _authInfo: UserAuthModel = this._sessionStorageGet(this.KEY_USER_INFO) ?? null;\r\n  /** 登入者的公司資訊 */\r\n  private static _corpsInfo: UserCorpsModel = this._sessionStorageGet(this.KEY_USER_CORPS) ?? null;\r\n  /** 登入偏好設定 */\r\n  private static _loginInfo: UserLoginModel = this._localStorageGet(this.KEY_LOGIN_SETTINGS) ?? null;\r\n  /** 使用者通用連結裡的內容 */\r\n  private static _notifyInfo: UserNotifyModel = null;\r\n\r\n  // #region ===== getters =====\r\n  /** 使用者資訊 */\r\n  static get Profile(): UserProfileModel {\r\n    return this._profile ?? <UserProfileModel>{};\r\n  }\r\n  /** 授權資訊 */\r\n  static get Auth(): UserAuthModel {\r\n    return this._authInfo ?? <UserAuthModel>{};\r\n  }\r\n  /** 登入者的公司資訊 */\r\n  static get Corps(): UserCorpsModel {\r\n    return this._corpsInfo ?? { admin: [], user: [] };\r\n  }\r\n  /** 登入偏好設定 */\r\n  static get LoginPreferences(): UserLoginModel {\r\n    const prefs = this._loginInfo ?? <UserLoginModel>{};\r\n    return {\r\n      ...prefs,\r\n      // 判斷是否有設定，預設為Grid模式\r\n      dataViewMode: prefs.dataViewMode ?? DataViewMode.Grid\r\n    };\r\n  }\r\n  /** 使用者通知中心導頁參數 */\r\n  static get Notify(): UserNotifyModel {\r\n    return this._notifyInfo ?? <UserNotifyModel>{};\r\n  }\r\n\r\n  /** 是否已登入 */\r\n  static get IsLoggedIn(): boolean {\r\n    return !!(this._profile?.account);\r\n  }\r\n  // #endregion\r\n\r\n  // #region ===== setters =====\r\n  /** 使用者資訊 */\r\n  static set Profile(info: UserProfileModel) {\r\n    this._setProfile(info);\r\n  }\r\n  /** 授權資訊 */\r\n  static set Auth(auth: UserAuthModel) {\r\n    this._setAuthInfo(auth);\r\n  }\r\n  /** 登入者的公司資訊 */\r\n  static set Corps(corps: UserCorpsModel) {\r\n    this._setCorps(corps);\r\n  }\r\n  /** 登入偏好設定 */\r\n  static set LoginPreferences(pref: UserLoginModel) {\r\n    this._setLoginPreferences(pref);\r\n  }\r\n  /** 使用者通知中心導頁參數 */\r\n  static set Notify(notify: UserNotifyModel) {\r\n    this._setNotify(notify);\r\n  }\r\n  // #endregion\r\n\r\n  /** 清除所有設定 */\r\n  static clear() {\r\n    this._clear();\r\n  }\r\n\r\n  // #region ===== private helpers =====\r\n  /** 使用者資訊 */\r\n  private static _setProfile(info: UserProfileModel) {\r\n    if (!info) {\r\n      this._sessionStorageRemove(this.KEY_USER_INFO);\r\n      this._profile = null;\r\n      return;\r\n    }\r\n\r\n    let original = this._profile ?? <UserProfileModel>{};\r\n\r\n    // 先取出 funcsFirstTime\r\n    const { funcsFirstTime, ...restInfo } = info;\r\n\r\n    // 只合併其他欄位\r\n    deepMerge(original, restInfo);\r\n\r\n    // 如果 info 有 funcsFirstTime，直接覆蓋\r\n    if (Array.isArray(funcsFirstTime)) {\r\n      original.funcsFirstTime = [...funcsFirstTime];\r\n    }\r\n    // 確保 token 不會被覆蓋\r\n    if (this._authInfo) {\r\n      const { token, tokenExp } = this._authInfo;\r\n      deepMerge(original, { token, tokenExp });\r\n    }\r\n    this._sessionStorageSet(this.KEY_USER_INFO, original);\r\n    this._profile = { ...original };\r\n  }\r\n\r\n  /** 授權相關資訊 */\r\n  private static _setAuthInfo(auth: UserAuthModel) {\r\n    if (!auth) {\r\n      this._authInfo = null;\r\n      return;\r\n    }\r\n    let original = this._profile ?? <UserProfileModel>{};\r\n    deepMerge(original, auth);\r\n    this._sessionStorageSet(this.KEY_USER_INFO, original);\r\n\r\n    const existingAuth = this._authInfo ?? <UserAuthModel>{};\r\n    const mergedAuth = deepMerge(existingAuth, auth);\r\n\r\n    this._authInfo = { ...mergedAuth };\r\n  }\r\n\r\n  /** 登入者的公司資訊 */\r\n  private static _setCorps(corps: UserCorpsModel) {\r\n    if (corps) {\r\n      this._sessionStorageSet(this.KEY_USER_CORPS, corps);\r\n      this._corpsInfo = corps;\r\n    } else {\r\n      this._sessionStorageRemove(this.KEY_USER_CORPS);\r\n      this._corpsInfo = null;\r\n    }\r\n  }\r\n\r\n  /** 登入偏好設定 */\r\n  private static _setLoginPreferences(pref: UserLoginModel) {\r\n    if (pref) {\r\n      const original = this._loginInfo ?? <UserLoginModel>{};\r\n      deepMerge(original, pref);\r\n      this._localStorageSet(this.KEY_LOGIN_SETTINGS, original);\r\n      this._loginInfo = { ...original };\r\n    } else {\r\n      this._localStorageRemove(this.KEY_LOGIN_SETTINGS);\r\n      this._loginInfo = null;\r\n    }\r\n  }\r\n\r\n  /** 使用者通用連結裡的內容 */\r\n  private static _setNotify(notify: UserNotifyModel) {\r\n    if (notify) {\r\n      const merged = deepMerge(this._notifyInfo ?? <UserNotifyModel>{}, notify);\r\n      this._notifyInfo = merged;\r\n    } else {\r\n      this._notifyInfo = null;\r\n    }\r\n  }\r\n\r\n  /** 清除所有設定 */\r\n  private static _clear() {\r\n    this._sessionStorageRemove(this.KEY_USER_INFO);\r\n    this._sessionStorageRemove(this.KEY_USER_CORPS);\r\n\r\n    this._profile = null;\r\n    this._authInfo = null;\r\n    this._corpsInfo = null;\r\n    this._notifyInfo = null;\r\n  }\r\n\r\n  /** 取得 sessionStorage 中的物件 */\r\n  private static _sessionStorageGet(key: string) { return SessionStorage.getObject(key); }\r\n  /** 設定 sessionStorage 中的物件 */\r\n  private static _sessionStorageSet(key: string, value: any) { SessionStorage.setObject(key, value); }\r\n  /** 移除 sessionStorage 中的物件 */\r\n  private static _sessionStorageRemove(key: string) { SessionStorage.remove(key); }\r\n\r\n  /** 取得 localStorage 中的物件 */\r\n  private static _localStorageGet(key: string) { return LocalStorage.getObject(key); }\r\n  /** 設定 localStorage 中的物件 */\r\n  private static _localStorageSet(key: string, value: any) { LocalStorage.setObject(key, value); }\r\n  /** 移除 localStorage 中的物件 */\r\n  private static _localStorageRemove(key: string) { LocalStorage.remove(key); }\r\n  // #endregion\r\n}\r\n","import { CurrentUser } from '../current-user/current-user';\r\nimport { UrlTree } from '@angular/router';\r\n\r\n/** 取得 router 保留字(一律轉小寫比對) */\r\nexport enum UofxRouterRootName {\r\n  /** 前台-管理者端 */\r\n  Admin = 'admin',\r\n  /** 前台-使用者端 */\r\n  User = 'user',\r\n  /** 狀態 */\r\n  Status = 'status',\r\n  /** 登入 */\r\n  Auth = 'auth',\r\n  Base = 'base',\r\n  Bpm = 'bpm',\r\n  Eip = 'eip',\r\n  Dms = 'dms',\r\n  /** 通用連結 */\r\n  UniversalLink = 'UniversalLink',\r\n  /** 後台 */\r\n  Mgmt = 'mgmt',\r\n  /** 外掛模組 */\r\n  Plugin = \"plugin\",\r\n}\r\n\r\n// @dynamic\r\nexport class UofxRouterHelper {\r\n  private static slashSymbol = '/';\r\n\r\n  /** 動態路由公司別識別碼 Param Name */\r\n  static pathCodeParamName = 'corpPathCode';\r\n  static pathCodes = [];\r\n  /** 取得所有的公司別識別碼 */\r\n  static get PathCodes(): Array<string> {\r\n    if (CurrentUser.Corps.user.length > 0) {\r\n      return CurrentUser.Corps.user.map(item => item.pathCode).map(item => item.toLocaleLowerCase());\r\n    } else return this.pathCodes;\r\n  }\r\n  static set PathCodes(pathCodes: Array<string>) {\r\n    this.pathCodes = pathCodes;\r\n  }\r\n\r\n  /** @internal 路由公司別登入識別碼 */\r\n  static routerPathCode = '';\r\n  /**  路由公司別登入識別碼 */\r\n  static get CurrentPathCode(): string {\r\n    return this.routerPathCode === '' ? CurrentUser.Profile.signinPathCode : this.routerPathCode;\r\n  }\r\n  static set CurrentPathCode(routerPathCode: string) {\r\n    this.routerPathCode = routerPathCode ? routerPathCode : '';\r\n  }\r\n\r\n  /** 如果 path code 對應的 公司別 id 和 自己重新輸入的 id 不一樣，重設資料 */\r\n  static resetUserInfoAfterPathCodeChanged() {\r\n    if (this.CurrentPathCode && CurrentUser.IsLoggedIn && CurrentUser.Corps.user.length > 0) {\r\n      const corp = CurrentUser.Corps.user.find(item => item.pathCode === this.CurrentPathCode);\r\n      if (corp && CurrentUser.Profile.corpId !== corp.corpId) {\r\n        CurrentUser.Profile = { corpId: corp.corpId, corpName: corp.name };\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 轉換回沒有公司識別碼的 URL\r\n   * @param routerUrl /ede/admin\r\n   * @returns /admin\r\n   */\r\n  static convertToNoPathCodeUrl(routerUrl: string): string {\r\n    if (this.CurrentPathCode) {\r\n      routerUrl = this._normalizationUrl(routerUrl);\r\n\r\n      if (routerUrl.startsWith(`${this.slashSymbol}${this.CurrentPathCode}`)) {\r\n        routerUrl = routerUrl.replace(`${this.slashSymbol}${this.CurrentPathCode}`, this.slashSymbol);\r\n      }\r\n    }\r\n\r\n    return this._normalizationUrl(routerUrl);\r\n  }\r\n\r\n  /**\r\n   * 轉換成另外一間公司別識別碼的 URL\r\n   * @param routerUrl 要轉換的原始 URL ex. /ede/login\r\n   * @param newPathCode 新的公司識別碼 ex. ede2\r\n   * @returns /ede2/login\r\n   */\r\n  static convertToNewPathCodeUrl(routerUrl: string, newPathCode: string): string {\r\n    if (routerUrl && newPathCode) {\r\n      routerUrl = UofxRouterHelper.convertToNoPathCodeUrl(routerUrl);\r\n      routerUrl = `${this.slashSymbol}${newPathCode}${routerUrl}`;\r\n    }\r\n\r\n    return this._normalizationUrl(routerUrl);\r\n  }\r\n\r\n  /**\r\n   * 移除重複 Url 斜線處理\r\n   * @param url 未處理前的 URL ex. /abc////123//456\r\n   * @returns /abc/123/456\r\n   */\r\n  static replaceDoubleSlashToSingle(url: string): string {\r\n    while (/\\/\\//g.test(url)) {\r\n      url = url.replace(/\\/\\//g, this.slashSymbol);\r\n    }\r\n    return url;\r\n  }\r\n\r\n  /** UofxRouter NavigateByUrl 處理 */\r\n  static overrideNavigateByUrl(url: string | UrlTree): string {\r\n    let resultUrl = '';\r\n\r\n    if (url instanceof UrlTree) {\r\n      // a [routerLink] call this\r\n      resultUrl = url.toString();\r\n    } else {\r\n      resultUrl = url;\r\n    }\r\n\r\n    resultUrl = this._normalizationUrl(resultUrl, false);\r\n\r\n    const isExclude = this._isExcludeRouter(resultUrl);\r\n    const haveInsert = this._needToInsertPathCode(resultUrl);\r\n\r\n    if (!isExclude && haveInsert) {\r\n      resultUrl = `/${this.CurrentPathCode}/${resultUrl}`;\r\n      resultUrl = this.replaceDoubleSlashToSingle(resultUrl);\r\n    }\r\n\r\n    return resultUrl;\r\n  }\r\n\r\n  /**\r\n   * @internal 是否為例外(保留字)不檢查的路由\r\n   * @param routerUrl /ede/admin\r\n   */\r\n  static _isExcludeRouter(routerUrl: string): boolean {\r\n    if (!routerUrl) return false;\r\n\r\n    routerUrl = this._normalizationUrl(routerUrl, false);\r\n\r\n    const paths = routerUrl.split(this.slashSymbol);\r\n\r\n    return (paths[0].toLocaleLowerCase() === UofxRouterRootName.Status);\r\n  }\r\n\r\n  /**\r\n   * @internal Url 是否需要附加 PathCode\r\n   * @param routerUrl /ede/admin\r\n   * @returns 如果不包含則回傳 true，包含則回傳 false\r\n   */\r\n  static _needToInsertPathCode(routerUrl: string): boolean {\r\n\r\n    if (!this.CurrentPathCode) return false;\r\n\r\n    routerUrl = this._normalizationUrl(routerUrl, false);\r\n\r\n    if (!routerUrl) return false;\r\n\r\n    const urls = routerUrl.split(this.slashSymbol);\r\n\r\n    return !this.PathCodes.includes(urls[0].toLocaleLowerCase());\r\n  }\r\n\r\n  /**\r\n   * @internal 移除 Url 開頭的斜線\r\n   * @param url 未處理前的 URL ex. /abc/123\r\n   * @returns abc/123\r\n   */\r\n  static _removeStartSlash(url: string): string {\r\n    if (url.startsWith(this.slashSymbol)) return url.substring(1, url.length);\r\n    else return url;\r\n  }\r\n\r\n  /**\r\n   * @internal 移除 URL 最後的斜線\r\n   * @param url 未處理前的 URL ex. /abc/123/\r\n   * @returns /abc/123\r\n   */\r\n  static _trimLastSlash(url: string): string {\r\n    if (url.length > 0 && url[url.length - 1] === this.slashSymbol)\r\n      return url.substring(0, url.length - 1);\r\n    else\r\n      return url;\r\n  }\r\n\r\n  /**\r\n   * @internal 正規化 URL\r\n   * @param url 未處理前的 URL ex. //abc/123//456/\r\n   * @param hasStartSlash 回傳 URL 第一位是否需包含, default : true\r\n   * @returns /abc/123/456 或 abc/123/456\r\n   */\r\n  static _normalizationUrl(url: string, hasStartSlash = true) {\r\n    if (!url) url = '';\r\n\r\n    url = this.replaceDoubleSlashToSingle(url);\r\n    url = `${hasStartSlash ? this.slashSymbol : ''}${this._removeStartSlash(url)}`;\r\n\r\n    return this._trimLastSlash(url);\r\n  }\r\n}\r\n","import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';\r\n\r\nimport { CurrentUser } from '../current-user/current-user';\r\nimport { Injectable } from '@angular/core';\r\nimport { UofxRouterHelper } from '../router/router-helper';\r\n\r\n/** 後台管理員站台使用: 目前只判斷有沒有token */\r\n\r\n@Injectable()\r\nexport class UofxMgmtAuthGuard {\r\n\r\n  private loginUrl = '/auth/login';\r\n\r\n  constructor(private router: Router) { }\r\n\r\n  public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {\r\n    return this._canActivateRoute(route, state);\r\n  }\r\n\r\n  public canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {\r\n    return this._canActivateRoute(route, state);\r\n  }\r\n\r\n  /** 路由權限檢查 */\r\n  _canActivateRoute(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {\r\n    const url: string = state.url;\r\n\r\n    UofxRouterHelper.resetUserInfoAfterPathCodeChanged();\r\n\r\n    // 檢查是否有 token\r\n    const token = (CurrentUser.Auth?.token) || undefined;\r\n    if (!token) {\r\n      this.router.navigate([this.loginUrl], { queryParams: { returnUrl: url } });\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n}\r\n","import { catchError, map } from 'rxjs/operators';\r\n\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { CurrentUser } from '../current-user/current-user';\r\nimport { CorpFuncsModel } from './auth-guard.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UofxAuthGuardService {\r\n\r\n  /** @internal 功能清單 */\r\n  _corpFuncs?: Array<CorpFuncsModel>;\r\n\r\n  /** 取得功能清單 */\r\n  get corpFuncs(): Array<CorpFuncsModel> {\r\n    return this._corpFuncs || [];\r\n  }\r\n\r\n  /** 設定功能清單(登入後設定值用) */\r\n  set corpFuncs(funcs: Array<CorpFuncsModel>) {\r\n    this._corpFuncs = funcs;\r\n  }\r\n\r\n  /** 是否有 管理者 權限(功能清單要先有資料) */\r\n  get isManager(): boolean {\r\n    if (!this._corpFuncs || !CurrentUser.Profile.corpId) return false;\r\n    return this._corpFuncs.find(item => item.corpId === CurrentUser.Profile.corpId).isManager;\r\n  }\r\n\r\n  /** 是否有 BPM管理者 權限 (功能清單要先有資料，目前僅供導覽使用) */\r\n  get isBpmManager(): boolean {\r\n    if (!this._corpFuncs || !CurrentUser.Profile.corpId) return false;\r\n    return this._corpFuncs.find(item => item.corpId === CurrentUser.Profile.corpId).isBpmManager;\r\n  }\r\n\r\n  /** 是否有 公司管理者 權限 (功能清單要先有資料，目前僅供導覽使用) */\r\n  get isCorpManager(): boolean {\r\n    if (!this._corpFuncs || !CurrentUser.Profile.corpId) return false;\r\n    return this._corpFuncs.find(item => item.corpId === CurrentUser.Profile.corpId).isCorpManager;\r\n  }\r\n\r\n\r\n  constructor(private http: HttpClient) { }\r\n\r\n\r\n  /** url 路由是否有存取權限(配合登入取得登入者資料才會有值) */\r\n  canActivate(corpId: string, functionIds?: Array<string>): boolean {\r\n    // 沒有功能清單直接拒絕\r\n    if (!functionIds || !functionIds.length) return false;\r\n\r\n    // 公司別沒有功能清單\r\n    const corpFuncs = this.corpFuncs.find(x => x.corpId === corpId);\r\n    if (!corpFuncs) return false;\r\n\r\n    return functionIds.some(funcId => corpFuncs.funcs.includes(funcId));\r\n  }\r\n\r\n  /** 讀取功能清單(by 登入者) */\r\n  loadCorpFuncs(): Promise<boolean> {\r\n    return new Promise(resolve => {\r\n      if (!CurrentUser.IsLoggedIn) {\r\n        resolve(false);\r\n        return;\r\n      }\r\n\r\n      if (this._corpFuncs) {\r\n        resolve(true);\r\n        return;\r\n      }\r\n\r\n      this._getUserFuncs(resolve);\r\n    });\r\n  }\r\n\r\n  /** 清除功能清單 */\r\n  clearCorpFuncs() {\r\n    this._corpFuncs = null;\r\n  }\r\n\r\n  /** 取得使用者清單 */\r\n  getCorpFuncByUser() {\r\n    return this.http.get<Array<CorpFuncsModel>>('~/api/desktop/base/user/prsnl/func')\r\n      .pipe(\r\n        map(result => {\r\n          this._corpFuncs = result;\r\n          return result;\r\n        }),\r\n        catchError(error => {\r\n          this._corpFuncs = null;\r\n          throw error;\r\n        })\r\n      );\r\n  }\r\n\r\n  /** @internal 取得使用者清單(by 登入者) */\r\n  _getUserFuncs(resolve: (value?: boolean | PromiseLike<boolean>) => void) {\r\n    this.getCorpFuncByUser().subscribe({\r\n      next: () => {\r\n        resolve(true);\r\n      },\r\n      error: error => {\r\n        // eslint-disable-next-line no-console\r\n        console.error('get auth gurads error!', error);\r\n        resolve(false);\r\n      }\r\n    });\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';\r\n\r\nimport { CurrentUser } from '../current-user/current-user';\r\nimport { UofxRouterHelper, UofxRouterRootName } from '../router/router-helper';\r\nimport { UofxAuthGuardService } from './auth-guard.service';\r\n\r\n@Injectable()\r\nexport class AuthGuard {\r\n\r\n  private loginUrl = '/auth/login';\r\n\r\n  constructor(private agService: UofxAuthGuardService, private router: Router) { }\r\n\r\n  public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {\r\n    return this._canActivateRoute(route, state);\r\n  }\r\n\r\n  public canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {\r\n    return this._canActivateRoute(route, state);\r\n  }\r\n\r\n  /** 路由權限檢查 */\r\n  _canActivateRoute(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {\r\n    let url: string = state.url;\r\n\r\n    UofxRouterHelper.resetUserInfoAfterPathCodeChanged();\r\n    url = UofxRouterHelper.convertToNoPathCodeUrl(url);\r\n\r\n    // 檢查是否有 token\r\n    const token = (CurrentUser.Profile && CurrentUser.Auth.token) || undefined;\r\n    if (!token) {\r\n      CurrentUser.Profile = undefined;\r\n      CurrentUser.Corps = undefined;\r\n      CurrentUser.ReturnUrl = url;\r\n      this.router.navigate([UofxRouterRootName.Auth]);\r\n      return false;\r\n    }\r\n\r\n    /**\r\n     * 下方此段邏輯重點\r\n     * 1. 守衛需要呼叫loadCorpFuncs重拿_corpFuncs，是因為如果網頁F5，auth-guard.service就會重載，此時_corpFuncs就會被初始化\r\n     * 2. 無論Page是否為匿名都會呼叫loadCorpFuncs，這樣可以確保_corpFuncs不會遺漏\r\n     * 3. loadCorpFuncs裡面會判斷是否已經有_corpFuncs，如果已經有的話就不會叫api拿權限資料，所以畫面正常操作的路由事實上並不會呼叫api拿權限\r\n     */\r\n    return new Promise(resolve => {\r\n      this.agService.loadCorpFuncs().then(() => {\r\n        const isAllowAnonymous = this._isAllowAnonymous(route);\r\n        if (isAllowAnonymous) return resolve(true);\r\n\r\n        const functionIds = this._getFunctionIds(route);\r\n        const result = this._checkActivate(url, functionIds);\r\n\r\n        return resolve(result);\r\n      });\r\n    });\r\n  }\r\n\r\n  /** 是否為允許匿名存取 */\r\n  _isAllowAnonymous(route: ActivatedRouteSnapshot): boolean {\r\n    // 沒有任何 component 直接略過 (代表只是單純路由)\r\n    if (!route.component) return true;\r\n\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const comp: any = route.component;\r\n    if (comp.allowAnonymous) return comp.allowAnonymous;\r\n\r\n    return false;\r\n  }\r\n\r\n  /** 取得 Function Ids */\r\n  _getFunctionIds(route: ActivatedRouteSnapshot): Array<string> {\r\n    if (!route.component) return null;\r\n\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const comp: any = route.component;\r\n    if (comp.functionIds && Array.isArray(comp.functionIds)) return comp.functionIds;\r\n\r\n    return null;\r\n  }\r\n\r\n  /** UnitTest 用 */\r\n  _getLocalPathName() {\r\n    // 特殊寫法，為了配合 Unit Test，如果直接在 Unit Test 端 spy location，會直接影響瀏覽器上面的測試\r\n    // 導致無窮迴圈，因此這邊公開此 function 讓單元測試 mock 此函數。\r\n    return location.pathname;\r\n  }\r\n\r\n  /** 檢查路由權限 */\r\n  _checkActivate(url: string, functionIds?: Array<string>): Promise<boolean> {\r\n    return new Promise(resolve => {\r\n      url = UofxRouterHelper.replaceDoubleSlashToSingle(url);\r\n      url = this._removeURLQueryString(url);\r\n\r\n      let isPluginFunction = false;\r\n      if (functionIds?.length > 0 && functionIds[0].startsWith('P-')) {\r\n        isPluginFunction = true;\r\n      }\r\n\r\n      if (!CurrentUser.IsLoggedIn) {\r\n        resolve(this._verifyAuth(url, functionIds));\r\n      } else if (isPluginFunction) {\r\n        resolve(true);\r\n      } else {\r\n        this.agService.loadCorpFuncs().then(status => {\r\n          if (status) {\r\n            resolve(this._verifyAuth(url, functionIds, true));\r\n          } else {\r\n            resolve(false);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  /** 移除 URL Query String (路由權限檢查 support query string) */\r\n  _removeURLQueryString(url: string) {\r\n    if (url.indexOf('?') !== -1) {\r\n      url = url.split('?')[0];\r\n    }\r\n    return url;\r\n  }\r\n\r\n  /** 驗證是否有權限 */\r\n  _verifyAuth(url: string, functionIds?: Array<string>, haveUser: boolean = false): boolean {\r\n    const result = this.agService.canActivate(CurrentUser.Profile.corpId, functionIds);\r\n    if (!result) {\r\n      this._redirectByNotLoginPageButHaveUser(url, haveUser);\r\n      this._redirectByNotLoginPageAndNotUser(url, haveUser);\r\n      this._redirectByLoginPageIsSelf(url);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /** 有使用者但非登入頁面的導頁處理 */\r\n  _redirectByNotLoginPageButHaveUser(url: string, haveUser: boolean) {\r\n    if (url.toLocaleLowerCase() !== this.loginUrl && haveUser)\r\n      this.router.navigate([UofxRouterRootName.Status, 403]);\r\n  }\r\n\r\n  /** 沒有使用者且非登入頁面的導頁處理 */\r\n  _redirectByNotLoginPageAndNotUser(url: string, haveUser: boolean) {\r\n    if (url.toLocaleLowerCase() !== this.loginUrl && !haveUser) {\r\n      CurrentUser.ReturnUrl = url;\r\n      this.router.navigate([UofxRouterRootName.Auth]);\r\n    }\r\n  }\r\n\r\n  /** 本身是登入頁面處理 */\r\n  _redirectByLoginPageIsSelf(url: string) {\r\n    if (url.toLocaleLowerCase() === this.loginUrl)\r\n      this.router.navigate([UofxRouterRootName.Auth], { queryParams: { sameUrl: url } });\r\n  }\r\n}\r\n\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ɵComponentDef, ɵComponentType } from '@angular/core';\r\n\r\nexport const ɵcmp = 'ɵcmp';\r\nexport const ɵfac = 'ɵfac';\r\n\r\nexport type ComponentType<T> = ɵComponentType<T>;\r\n\r\nexport interface ComponentDef<T> extends ɵComponentDef<T> {\r\n  onInit: (() => void) | null;\r\n  onDestroy: (() => void) | null;\r\n  ionViewWillEnter: (() => void) | null;\r\n  ionViewWillLeave: (() => void) | null;\r\n}\r\n\r\nexport function getComponentProp<T, K extends keyof T>(t: ComponentType<T>, key: string): T[K] {\r\n  if (t.hasOwnProperty(key)) {\r\n    if (t[key].hasOwnProperty('onInit')) {\r\n      return t[key];\r\n    } else {\r\n      return t.prototype;\r\n    }\r\n  }\r\n  throw new Error(`can not found component property ${t.name}`);\r\n}\r\n\r\n// 似乎升級 Angular 11 後，onInit 的位置又換了\r\n// 目前是 prototype 下的 ngOnInit\r\n/** 勾 ngOnInit event */\r\nexport function setCmpNgOnInit(cmp: ComponentDef<any>, init: () => void) {\r\n  let onInitKey = 'ngOnInit';\r\n  if (cmp.hasOwnProperty('onInit')) onInitKey = 'onInit';\r\n  else if (cmp.hasOwnProperty('ngOnInit')) onInitKey = 'ngOnInit';\r\n\r\n  const cmpOrginOnInit = cmp[onInitKey];\r\n  cmp[onInitKey] =  function (...args) {\r\n    init.call(this);\r\n    if (cmpOrginOnInit) cmpOrginOnInit.apply(this, args);\r\n  };\r\n}\r\n\r\n/** 勾 ngOnDestroy event */\r\nexport function setCmpNgOnDestroy(cmp: ComponentDef<any>, destroy: () => void) {\r\n  let onDestroyKey = 'ngOnDestroy';\r\n  if (cmp.hasOwnProperty('onDestroy')) onDestroyKey = 'onDestroy';\r\n  else if (cmp.hasOwnProperty('ngOnDestroy')) onDestroyKey = 'ngOnDestroy';\r\n\r\n  const cmpOrginOnDestroy = cmp[onDestroyKey];\r\n  cmp[onDestroyKey] =  function (...args) {\r\n    destroy.call(this);\r\n    if (cmpOrginOnDestroy) cmpOrginOnDestroy.apply(this, args);\r\n  };\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ComponentDef, ComponentType, getComponentProp, setCmpNgOnDestroy, setCmpNgOnInit, ɵcmp } from './interface';\r\n// Angular 9 Ivy AOT issue\r\n// https://medium.com/@gesteira2046/how-to-auto-unsubscribe-in-angular-9-da7647cc8b54\r\n\r\nexport function UofxRemindBeforeUnload(): any {\r\n  return (cmpType: ComponentType<any>) => {\r\n    const cmp: ComponentDef<typeof cmpType> = getComponentProp(cmpType, ɵcmp);\r\n    const BEFOREUNLOADEVENT = 'beforeunload';\r\n    const funcType = 'function';\r\n\r\n    function addListener() {\r\n      const handler = cmp[BEFOREUNLOADEVENT] = (event) => {\r\n        event.preventDefault();\r\n\r\n        const isFormDirty = typeof (this.isFormDirty) !== funcType ? false : this.isFormDirty();\r\n        const uofCanUnload = typeof (this.uofCanUnload) !== funcType ? true : this.uofCanUnload();\r\n\r\n        // 如果 Form 有被修改過，必須彈出提示，若無，則看 uofCanUnload 是否允許離開\r\n        if (isFormDirty === true || uofCanUnload === false) {\r\n          event.returnValue = 'Are you sure to leave this page?';\r\n        }\r\n      };\r\n      window.addEventListener(BEFOREUNLOADEVENT, handler);\r\n    }\r\n\r\n    function removeListener() {\r\n      window.removeEventListener(BEFOREUNLOADEVENT, cmp[BEFOREUNLOADEVENT]);\r\n    }\r\n\r\n    setCmpNgOnInit(cmp, addListener);\r\n    setCmpNgOnDestroy(cmp, removeListener);\r\n  };\r\n}\r\n","/** FuncId，若有新增需到 UofxAuthorize.md 中修改文件 */\r\n// @dynamic\r\nexport class FuncId {\r\n  static Bpm = class {\r\n    static User = class {\r\n      static readonly Lobby = 'BPM-USER-LOBBY';\r\n    };\r\n    static Scr = class {\r\n      /** 表單維護 */\r\n      static readonly Design = 'BPM-SCR-DESIGN';\r\n    };\r\n    static Field = class {\r\n      /** 自訂欄位 */\r\n      static readonly Design = 'BPM-FIELD-CUSTOM-DESIGN';\r\n    };\r\n    static Track = class {\r\n      /** 字軌維護 */\r\n      static readonly Design = 'BPM-TRACK-DESIGN';\r\n    };\r\n    static Config = class {\r\n      /** 模組設定 */\r\n      static readonly Design = 'BPM-SYS-CONFIG-SET';\r\n    };\r\n    /** 單據管理 */\r\n    static FormMgmt = class {\r\n      static readonly Design = 'BPM-FORM-MGMT';\r\n    };\r\n    /** 交接單據管理 */\r\n    static Handover = class {\r\n      static readonly Set = 'BPM-HANDOVER-SET';\r\n    };\r\n  };\r\n\r\n  static Base = class {\r\n    static Admin = class {\r\n      /** BASE管理者大廳BASE-ADMIN-LOBBY */\r\n      static readonly Lobby = 'BASE-ADMIN-LOBBY';\r\n    };\r\n    static User = class {\r\n      /** BASE使用者大廳-BASE-USER-LOBBY */\r\n      static readonly Lobby = 'BASE-USER-LOBBY';\r\n    };\r\n    static Show = class {\r\n      /** 顯示HELP */\r\n      static readonly Help = 'BASE-SHOW-HELP';\r\n      /** 顯示歡迎頁 */\r\n      static readonly Welcome = 'BASE-SHOW-WELCOME';\r\n      /** 顯示導引後台選單 */\r\n      static readonly Menu = 'BASE-SHOW-MENU';\r\n    };\r\n    /** 站內搜尋 BASE-SITE-SEARCH */\r\n    static readonly SiteSearch = 'BASE-SITE-SEARCH';\r\n  };\r\n\r\n  /** 管理者面板 */\r\n  static Brd = class {\r\n    static Org = class {\r\n      static Corp = class {\r\n        static readonly Manage = 'BRD-ORG-CORP-MANAGE';\r\n      };\r\n    };\r\n  };\r\n\r\n  static Org = class {\r\n    static Base = class {\r\n      /** 設定基礎資料 */\r\n      static readonly Set = 'ORG-BASE-SET';\r\n    };\r\n    static Corp = class {\r\n      static readonly Add = 'ORG-CORP-ADD';\r\n      static readonly Manage = 'ORG-CORP-MANAGE';\r\n    };\r\n    static Empl = class {\r\n      /** 組織人員維護 */\r\n      static readonly Edit = 'ORG-EMPL-EDIT';\r\n    };\r\n  };\r\n\r\n  static Sys = class {\r\n    static Config = class {\r\n      /** 系統設定 */\r\n      static readonly Set = 'SYS-CONFIG-SET';\r\n    };\r\n    static Online = class {\r\n      /** 線上人員管理 */\r\n      static readonly Manage = 'SYS-ONLINE-MANAGE';\r\n    };\r\n    static Login = class {\r\n      /** 登入登出記錄 */\r\n      static readonly Log = 'SYS-LOGIN-LOG';\r\n    };\r\n    static Api = class {\r\n      /** 金鑰管理 */\r\n      static readonly Manage = 'SYS-API-MANAGE';\r\n    };\r\n    static Webhook = class {\r\n      /** webhook 管理 */\r\n      static readonly Manage = 'SYS-WEBHOOK-CHANNEL';\r\n    };\r\n    /** 關於 */\r\n    static readonly About = 'SYS-ABOUT';\r\n    /** 活動日誌 */\r\n    static readonly ActiveLog = 'SYS-ACTIVE-LOG';\r\n    /** 功能管理 */\r\n    static readonly FunctionManage = 'SYS-FUNCTION-MANAGE';\r\n    /** 匯入產品資源包 */\r\n    static readonly ImportResource = 'SYS-IMPORT-RESOURCE';\r\n  };\r\n\r\n  static Eip = class {\r\n    /** 使用者端 */\r\n    static User = class {\r\n      /** 打卡記錄 */\r\n      static Punch = class {\r\n        /** 我的打卡記錄 EIP-USER-PUNCH-QUERY */\r\n        static readonly Self = 'EIP-USER-PUNCH-QUERY';\r\n      };\r\n      /** 我的問卷 */\r\n      static readonly Que = 'EIP-USER-QUESTIONNAIRE';\r\n    };\r\n    /** 公告管理 */\r\n    static Bulletin = class {\r\n      static readonly Set = 'EIP-BULLETIN-SET';\r\n    };\r\n    /** 活動看板 */\r\n    static EventBoard = class {\r\n      static readonly Set = 'EIP-EVENTBOARD-SET';\r\n    };\r\n    /** 影片管理 */\r\n    static Video = class {\r\n      static readonly Set = 'EIP-VIDEO-SET';\r\n    };\r\n    /** 常用捷徑 */\r\n    static Shortcut = class {\r\n      static readonly Set = 'EIP-SHORTCUT-SET';\r\n    };\r\n    /** 打卡管理 */\r\n    static Punch = class {\r\n      /** 出勤打卡管理 EIP-PUNCH-ATTENDANCE-MANAGE */\r\n      static readonly Rule = 'EIP-PUNCH-ATTENDANCE-MANAGE';\r\n      /** 打卡記錄查詢 EIP-PUNCH-QUERY */\r\n      static readonly Record = 'EIP-PUNCH-QUERY';\r\n    };\r\n    /** 問卷維護 */\r\n    static Que = class {\r\n      static readonly Set = 'EIP-QUESTIONNAIRE-SET';\r\n    };\r\n    /** 組織行事曆 */\r\n    static Calendar = class {\r\n      static readonly Set = 'EIP-CALENDAR-SET';\r\n    }\r\n  };\r\n\r\n  /** 文件中心 */\r\n  static DMS = class {\r\n    /** 文件庫管理 */\r\n    static Folder = class {\r\n      static readonly Manage = 'DMS-FOLDER-MANAGE';\r\n    }\r\n    static Doc = class {\r\n      /** 文件管理 */\r\n      static readonly Manage = 'DMS-DOC-MANAGE';\r\n      /** 文件字軌維護 */\r\n      static readonly Track = 'DMS-TRACK-MANAGE';\r\n      /** 文件清冊 */\r\n      static readonly Inventory = 'DMS-DOC-INVENTORY';\r\n      /** 銷毀紀錄 */\r\n      static readonly DestroyRecord = 'DMS-DESTROY-RECORD';\r\n    }\r\n  }\r\n\r\n  /** 串接服務 */\r\n  static Connection = class {\r\n    static Plugin = class {\r\n      /** Plugin管理 */\r\n      static readonly Manage = 'CONNECTION-PLUGIN-MANAGE';\r\n      /** Plugin頁面權限 */\r\n      static readonly PageManage = 'CONNECTION-PLUGIN-PAGE-MANAGE';\r\n    };\r\n    static External = class {\r\n      /** 外部連線設定 */\r\n      static readonly Conn = 'CONNECTION-EXTERNAL-CONN';\r\n      /** 外部資料來源 */\r\n      static readonly Program = 'CONNECTION-EXTERNAL-PROGRAM';\r\n    };\r\n    static Custom = class {\r\n      /** 表單驗證器 */\r\n      static readonly Validator = 'CONNECTION-CUSTOM-VALIDATOR';\r\n    };\r\n  };\r\n}\r\n\r\nexport function UofxAuthorize(auth: { functionIds?: Array<string>, allowAnonymous?: boolean; }): ClassDecorator {\r\n  return component => {\r\n    if (auth.allowAnonymous) {\r\n      component['allowAnonymous'] = true;\r\n    } else {\r\n      component['functionIds'] = auth.functionIds || [];\r\n    }\r\n  };\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/** 支援的語系列表 */\r\nexport const SUPPORT_LANGS = ['zh-TW', 'zh-CN', 'en-US', 'ja-JP', 'ko-KR', 'vi-VN', 'th-TH', 'id-ID'] as const;\r\n/** 支援的語系 */\r\nexport type SupportLang = typeof SUPPORT_LANGS[number];\r\n/** 語系顯示名稱 */\r\nexport const SUPPORT_LANG_NAMES: Record<SupportLang, string> = {\r\n  'zh-TW': '繁體中文',\r\n  'zh-CN': '简体中文',\r\n  'en-US': 'English',\r\n  'ja-JP': '日本語',\r\n  'ko-KR': '한국어',\r\n  'vi-VN': 'Tiếng Việt',\r\n  'th-TH': 'ไทย',\r\n  'id-ID': 'Bahasa Indonesia'\r\n};\r\n/** 預設語系 zh-TW */\r\nexport const DEFAULT_LANG: SupportLang = 'zh-TW';\r\n\r\n/** I18N 配置介面 */\r\nexport interface I18nConfig {\r\n  /** 預設語系 */\r\n  defaultLang: SupportLang;\r\n  /** 多語系來源 Url */\r\n  hostUrl: string;\r\n  /** 多語系來源版本 */\r\n  langVersion: string;\r\n  /** 是否為APP */\r\n  isApp: boolean;\r\n  /** 呼叫多語系api時是正式或開發環境 */\r\n  isI18nProdApi: boolean;\r\n}\r\n\r\n/**\r\n * I18N 配置注入\r\n *\r\n * 用於在應用程式中提供多語系配置。可在模組或元件中透過 `provide` 覆寫預設配置。\r\n *\r\n * @example\r\n * // 在 app.config.ts 或模組中提供自訂配置\r\n * import { I18N_CONFIG } from '@uofx/core';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n *   providers: [\r\n *     {\r\n *       provide: I18N_CONFIG,\r\n *       useValue: {\r\n *         defaultLang: 'zh-TW',\r\n *         hostUrl: 'https://api.example.com/i18n',\r\n *         langVersion: 'v1.0.0',\r\n *         isApp: false,\r\n *         isI18nProdApi: true\r\n *       }\r\n *     }\r\n *   ]\r\n * };\r\n *\r\n * @example\r\n * // 在服務中注入並使用配置\r\n * import { inject } from '@angular/core';\r\n * import { I18N_CONFIG } from '@uofx/core';\r\n *\r\n * export class MyService {\r\n *   private config = inject(I18N_CONFIG);\r\n *\r\n *   constructor() {\r\n *     console.log('預設語系:', this.config.defaultLang);\r\n *     console.log('API 網址:', this.config.hostUrl);\r\n *   }\r\n * }\r\n *\r\n * @example\r\n * // 使用 factory 提供動態配置\r\n * {\r\n *   provide: I18N_CONFIG,\r\n *   useFactory: () => {\r\n *     const isProd = environment.production;\r\n *     return {\r\n *       defaultLang: 'zh-TW',\r\n *       hostUrl: isProd ? 'https://prod.api.com' : 'https://dev.api.com',\r\n *       langVersion: '1.0.0',\r\n *       isApp: false,\r\n *       isI18nProdApi: isProd\r\n *     };\r\n *   }\r\n * }\r\n */\r\nexport const I18N_CONFIG = new InjectionToken<I18nConfig>('i18n-config', {\r\n  providedIn: 'root',\r\n  factory: () => {\r\n    return {\r\n      defaultLang: DEFAULT_LANG,\r\n      hostUrl: '',\r\n      langVersion: '',\r\n      isApp: false,\r\n      isI18nProdApi: false,\r\n    };\r\n  }\r\n});\r\n","import { I18N_CONFIG, SUPPORT_LANGS } from \"./i18n.interface\";\r\nimport { Injectable, inject } from \"@angular/core\";\r\n\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\n\r\n/**\r\n * I18N 配置檔服務\r\n *\r\n * 提供多語系相關的配置管理，包含：\r\n * - 多語系來源 URL 及版本\r\n * - 環境設定（App/Desktop、正式/開發環境）\r\n * - 支援的語系清單\r\n *\r\n * @example\r\n * // 在 app.module.ts 中進行設定\r\n * import { I18N_CONFIG, I18nConfig } from '@uofx/core';\r\n *\r\n * const i18nConfig: I18nConfig = {\r\n *   defaultLang: 'zh-TW',\r\n *   hostUrl: 'https://api.example.com/i18n',\r\n *   langVersion: 'v1.0.0',\r\n *   isApp: false,\r\n *   isI18nProdApi: true\r\n * };\r\n *\r\n * @NgModule({\r\n *   providers: [\r\n *     { provide: I18N_CONFIG, useValue: i18nConfig }\r\n *   ]\r\n * })\r\n * export class AppModule { }\r\n *\r\n * @example\r\n * // 在 Standalone 模式的 app.config.ts 中進行設定\r\n * import { ApplicationConfig } from '@angular/core';\r\n * import { I18N_CONFIG, I18nConfig } from '@uofx/core';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n *   providers: [\r\n *     {\r\n *       provide: I18N_CONFIG,\r\n *       useValue: {\r\n *         defaultLang: 'zh-TW',\r\n *         hostUrl: 'https://api.example.com/i18n',\r\n *         langVersion: 'v1.0.0',\r\n *         isApp: false,\r\n *         isI18nProdApi: true\r\n *       } as I18nConfig\r\n *     }\r\n *   ]\r\n * };\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class I18nConfigService {\r\n  private translate = inject(TranslateService);\r\n  private config = inject(I18N_CONFIG);\r\n\r\n  /** 多語系來源 URL */\r\n  private _hostUrl: string = this.config.hostUrl || '';\r\n  /** 多語系版本 */\r\n  private _langVersion: string = this.config.langVersion || '';\r\n  /** 是否為 App 環境 */\r\n  private _isApp: boolean = this.config.isApp || false;\r\n  /** 是否使用正式環境 API */\r\n  private _isI18nProdApi: boolean = this.config.isI18nProdApi || false;\r\n\r\n  /** 支援的語系清單 */\r\n  private SUPPORT_LANGS: Array<string> = [...SUPPORT_LANGS];\r\n\r\n  constructor() {\r\n    this.translate.setDefaultLang(this.config.defaultLang as string);\r\n    this.translate.use(this.config.defaultLang as string);\r\n  }\r\n\r\n  /** 取得或設定多語系來源 URL */\r\n  get hostUrl(): string {\r\n    return this._hostUrl;\r\n  }\r\n\r\n  set hostUrl(url: string) {\r\n    this._hostUrl = url;\r\n  }\r\n\r\n  /** 取得或設定多語系來源版本 */\r\n  get langVersion(): string {\r\n    return this._langVersion;\r\n  }\r\n\r\n  set langVersion(version: string) {\r\n    this._langVersion = version;\r\n  }\r\n\r\n  /** 是否為 App 環境 */\r\n  get isApp(): boolean {\r\n    return this._isApp;\r\n  }\r\n\r\n  /** 是否使用正式環境 API */\r\n  get isI18nProdApi(): boolean {\r\n    return this._isI18nProdApi;\r\n  }\r\n\r\n  /** 取得支援的語系清單 */\r\n  get supportLangs(): Array<string> {\r\n    return this.SUPPORT_LANGS;\r\n  }\r\n}\r\n","/* eslint-disable no-console */\r\n// @dynamic\r\nexport class UofxConsole {\r\n\r\n  private static debugModeKey = 'Uof Debug Mode';\r\n\r\n  private static get appName() {\r\n    return 'UOF X';\r\n  }\r\n\r\n  static get isDebugModeEnabled(): boolean {\r\n    return sessionStorage.getItem(this.debugModeKey) === 'on';\r\n  }\r\n\r\n  static enableDebugMode() {\r\n    sessionStorage.setItem(this.debugModeKey, 'on');\r\n    console.log('%c已開啟 Debug 模式', 'font-size: 2rem;');\r\n\r\n  }\r\n\r\n  static disableDebugMode() {\r\n    sessionStorage.removeItem(this.debugModeKey);\r\n    console.log('%c已關閉 Debug 模式', 'font-size: 2rem;');\r\n  }\r\n\r\n  static log(message: string, ...optionalParams: Array<unknown>) {\r\n    if (this.isDebugModeEnabled) {\r\n      message = `%c ${this.appName} %c ${message}%c`;\r\n      console.log(\r\n        message,\r\n        'background: #FF6128; color: #fff',\r\n        'color: #4389FA',\r\n        'color: inherit',\r\n        ...optionalParams\r\n      );\r\n    }\r\n  }\r\n\r\n  static error(message: string, ...optionalParams: Array<unknown>) {\r\n    if (this.isDebugModeEnabled) {\r\n      message = `%c ${this.appName} %c ${message}%c`;\r\n      console.log(\r\n        message,\r\n        'background: #FF6128; color: #fff',\r\n        'color: #FF777C',\r\n        'color: inherit',\r\n        ...optionalParams\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\nwindow['enableUofDebugMode'] = function() {\r\n  UofxConsole.enableDebugMode();\r\n};\r\n\r\nwindow['disableUofDebugMode'] = function() {\r\n  UofxConsole.disableDebugMode();\r\n};\r\n\r\nwindow['testDebugMode'] = function() {\r\n  if (UofxConsole.isDebugModeEnabled) {\r\n    UofxConsole.log('Test log');\r\n    UofxConsole.error('Test error');\r\n  } else {\r\n    console.log('%c尚未開啟 Debug 模式', 'font-size: 2rem;');\r\n  }\r\n};\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslateService, TranslateStore } from '@ngx-translate/core';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { forkJoin, of } from 'rxjs';\r\n\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { I18nConfigService } from './i18n-config.service';\r\nimport { UofxConsole } from '../utility/console/console';\r\n\r\n/** 多語系小工具提供的flag，值 \"1\" 代表啟動。 */\r\nconst LANG_HELPER_COOKIE = '__xhrHelper_hooked';\r\n\r\n/** 已載入的 i18n 資訊結構 */\r\ninterface LoadedI18nInfo {\r\n  /** 完整 URL */\r\n  url: string;\r\n  /** 取得的 i18n 前綴（API 用） */\r\n  i18nPrefix?: string;\r\n  /** 額外的多語系翻譯 key 前綴 (Plugin 用)*/\r\n  pluginNamespace?: string;\r\n}\r\n\r\n/** 載入翻譯的參數選項 */\r\ninterface LoadTranslateOptions {\r\n  /** 要載入的 URL 陣列 */\r\n  urls: Array<string>;\r\n  /** 儲存的目標語系 */\r\n  targetLang?: string;\r\n  /** Plugin 命名空間，作為翻譯 key 的前綴（選填） */\r\n  pluginNamespace?: string;\r\n}\r\n\r\n/** 從外掛載入翻譯的參數選項 */\r\nexport interface LoadTranslationFromPluginOptions {\r\n  /** 翻譯檔路徑陣列 */\r\n  i18nPaths: Array<string>;\r\n  /** Plugin 命名空間，作為翻譯 key 的前綴 */\r\n  pluginNamespace: string;\r\n  /** 儲存的目標語系 */\r\n  targetLang?: string;\r\n  /** 是否記錄至 loadedPaths，預設為 `true` */\r\n  recordPath?: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class I18nLoader {\r\n  private http = inject(HttpClient);\r\n  private translate = inject(TranslateService);\r\n  private transStore = inject(TranslateStore);\r\n  private configService = inject(I18nConfigService);\r\n\r\n  /** 已載入的 i18n 資訊 */\r\n  private loadedPaths: Array<LoadedI18nInfo> = [];\r\n\r\n  /**\r\n   * 載入指定前綴的 i18n 翻譯檔\r\n   *\r\n   * @param i18nPrefix 需載入的 i18n 前綴（字串或陣列），例如：'global' 或 ['global', 'common']\r\n   * @param lang 語系，預設使用當前語系\r\n   * @returns Promise<boolean> 無需載入或語系/前綴設定有誤時回傳 `false`；其餘情況皆回傳 `true`，不阻擋頁面進入\r\n   */\r\n  loadTranslationFromApi(i18nPrefix: string | string[], lang?: string): Promise<boolean> {\r\n    let targetLang = lang || this.translate.currentLang || this.translate.getDefaultLang();\r\n    const prefixList = Array.isArray(i18nPrefix) ? i18nPrefix : [i18nPrefix];\r\n    const enabledLangHelper = this.getCookie(LANG_HELPER_COOKIE);\r\n\r\n    // 1.檢查 prefix 清單\r\n    if (!this.isPrefixValid(prefixList)) return Promise.resolve(false);\r\n\r\n    // 2.檢查目標語系，無效時回退至繁體中文\r\n    if (!this.isLangValid(targetLang)) { targetLang = 'zh-TW'; }\r\n\r\n    let prefixesToLoad: string[] = [];\r\n\r\n    // 3.處理多語系小工具啟用情境\r\n    if (+enabledLangHelper === 1) {\r\n      // 多語系小工具啟用時，清空快取並重新載入所有前綴\r\n      this.loadedPaths = [];\r\n      prefixesToLoad = [...prefixList];\r\n      // global 在 startup.service 時只拿一次，因此使用小工具時每次需額外再拿 global\r\n      if (!prefixesToLoad.includes('global')) {\r\n        prefixesToLoad.push('global');\r\n      }\r\n    } else {\r\n      // 4.篩選出尚未載入的前綴\r\n      const loadedUrls = this.loadedPaths.map(path => path.url);\r\n      prefixesToLoad = prefixList.filter(prefix => !loadedUrls.includes(prefix));\r\n\r\n      if (prefixesToLoad.length === 0) {\r\n        return Promise.resolve(true);\r\n      }\r\n    }\r\n\r\n    // 5.產生 URL 清單，並移除已載入的 URL\r\n    const i18nUrls = this.generateI18nUrls(prefixesToLoad, targetLang);\r\n    const urlsToLoad = i18nUrls.filter(url => {\r\n      return !this.loadedPaths.some(loaded => loaded.url === url);\r\n    });\r\n\r\n    // 6.如果沒有 URL 需要載入，直接回傳成功\r\n    if (urlsToLoad.length === 0) {\r\n      return Promise.resolve(true);\r\n    }\r\n\r\n    // 7.載入翻譯檔\r\n    // loadTranslationsByUrls 回傳 true（全成功）或 false（部分 HTTP 失敗）\r\n    // 此處不會 reject，因為 urlsToLoad 已確保非空\r\n    return this.loadTranslationsByUrls({\r\n      urls: urlsToLoad\r\n    }).then(success => {\r\n      if (success) {\r\n        // 8.全部成功才記錄已載入的路徑\r\n        this.recordLoadedPaths(i18nUrls, undefined, prefixesToLoad);\r\n      }\r\n      return success;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 從外掛載入翻譯檔\r\n   *\r\n   * @param options 載入選項\r\n   * @param options.i18nPaths 翻譯檔路徑陣列\r\n   * @param options.keyPrefix 整合包代號，會轉為小寫作為前綴\r\n   * @param options.targetLang 儲存的目標語系\r\n   * @param options.recordPath 是否記錄至 loadedPaths，預設為 `true`\r\n   * @returns Promise<boolean> 語系設定有誤時回傳 `false`；其餘情況皆回傳 `true`，不阻擋頁面進入\r\n   */\r\n  loadTranslationFromPlugin(options: LoadTranslationFromPluginOptions): Promise<boolean> {\r\n    const { i18nPaths, pluginNamespace, targetLang, recordPath = true } = options;\r\n    let lang = targetLang || this.translate.currentLang;\r\n\r\n    // 1.檢查目標語系是否有效，無效時回退至繁體中文\r\n    if (!this.isLangValid(lang)) { lang = 'zh-TW'; }\r\n\r\n    // 2.檢查是否有提供 namespace（Plugin 翻譯必須有 namespace 作為前綴）\r\n    if (!pluginNamespace) {\r\n      UofxConsole.error('[I18nLoader]: Plugin 翻譯必須提供 pluginNamespace 作為前綴');\r\n      return Promise.resolve(false);\r\n    }\r\n\r\n    return this.loadTranslationsByUrls({\r\n      urls: i18nPaths,\r\n      pluginNamespace,\r\n      targetLang\r\n    }).then((success) => {\r\n      if (recordPath) {\r\n        // 記錄已載入的路徑（不論翻譯載入成功或失敗，均記錄以避免重複請求）\r\n        this.recordLoadedPaths(i18nPaths, pluginNamespace);\r\n      }\r\n      // Plugin 場景不阻擋頁面進入，不論結果一律回傳 true\r\n      return Promise.resolve(true);\r\n    }).catch(() => {\r\n      return Promise.resolve(false);\r\n    });\r\n  }\r\n\r\n\r\n  /**\r\n   * 從指定路徑載入翻譯檔案\r\n   *\r\n   * 此方法負責：\r\n   * 1. 發送 HTTP 請求取得翻譯資料\r\n   * 2. 將翻譯資料扁平化並加上前綴（如果有 pluginNamespace）\r\n   * 3. 合併至現有翻譯並更新 TranslateService\r\n   *\r\n   * Promise 回傳三種狀態：\r\n   * - `resolve(true)`：全部 URL 載入成功\r\n   * - `resolve(false)`：至少一個 URL 載入失敗，成功的翻譯仍會套用，錯誤已記錄至 console\r\n   * - `reject()`：配置錯誤（urls 為空陣列），代表呼叫端傳入資料有誤\r\n   *\r\n   * @param options 載入選項\r\n   * @param options.urls 要載入的 URL 陣列（不可為空，否則 reject）\r\n   * @param options.pluginNamespace Plugin 命名空間（選填），會作為翻譯 key 的前綴\r\n   * @param options.targetLang 儲存的目標語系（選填）\r\n   * @returns Promise<boolean> 全部成功 resolve `true`；部分失敗 resolve `false`；urls 為空 reject\r\n   */\r\n  private loadTranslationsByUrls(options: LoadTranslateOptions): Promise<boolean> {\r\n    const { urls, pluginNamespace } = options;\r\n\r\n    // 1.urls 為空屬於呼叫端配置錯誤，無法載入\r\n    if (!this.isUrlValid(urls)) return Promise.resolve(false);\r\n\r\n    // 2.準備請求清單\r\n    // 每個請求獨立處理錯誤（失敗回傳 null），forkJoin 結束後再統一判斷\r\n    const https = this.generateTranslationRequest(urls);\r\n    let targetLang = options.targetLang || this.translate.currentLang;\r\n\r\n    // 3.檢查目標語系，無效時回退至繁體中文\r\n    if (!this.isLangValid(targetLang)) { targetLang = 'zh-TW'; }\r\n\r\n    return new Promise(resolve => {\r\n      // 4.發送請求並處理結果\r\n      forkJoin(https)\r\n        .pipe(\r\n          map((langs: any[]) => {\r\n            // 5.合併現有翻譯與新載入的翻譯（null 視為空物件，確保成功的部分仍套用）\r\n            const hasError = langs.some(l => l === null);\r\n            const result = { ...this.transStore.translations[targetLang] };\r\n            const flatLangs = this.flattenLangs(langs.map(l => l ?? {}), pluginNamespace);\r\n            return { translations: Object.assign(result, ...flatLangs), hasError };\r\n          })\r\n        ).subscribe({\r\n          next: ({ translations, hasError }) => {\r\n            // 6.更新 TranslateService 的翻譯內容（即使部分失敗，仍套用已成功的翻譯）\r\n            this.translate.setTranslation(targetLang, translations);\r\n            // 7.有錯誤 resolve(false)，全部成功 resolve(true)，由呼叫端決定後續行為\r\n            resolve(!hasError);\r\n          }\r\n        });\r\n    });\r\n  }\r\n  /**\r\n   * 重新載入所有已載入的翻譯，從語系A切換至語系B。\r\n   *\r\n   * Promise 回傳三種狀態：\r\n   * - `resolve(true)`：切換成功，或無需切換（目前無已載入路徑、目標語系與目前相同）\r\n   * - `reject()`：配置錯誤（未提供目標語系、語系不支援）\r\n   * - HTTP 失敗：完全忽略，成功的翻譯仍套用，不影響切換結果\r\n   *\r\n   * @param toLang 目標語系（例如：'en-US'）\r\n   * @param isSwitchLang 是否切換至目標語系，預設為 `true`\r\n   * @returns Promise<boolean> 切換成功或無需切換 resolve `true`；配置錯誤 reject\r\n   */\r\n  reloadTranslations(toLang: string, isSwitchLang: boolean = true): Promise<boolean> {\r\n    // 1.檢查目標語系（含未提供及不支援的情境），無效時回退至繁體中文\r\n    if (!this.isLangValid(toLang)) { toLang = 'zh-TW'; }\r\n\r\n    // 3.檢查目標語系是否與目前語系相同\r\n    const fromLang = this.translate.currentLang;\r\n    if (fromLang === toLang) {\r\n      UofxConsole.error('[I18nLoader]: 目標語系與目前語系相同，無需重新載入');\r\n      return Promise.resolve(true);\r\n    }\r\n\r\n    // 4.檢查是否有需要重新載入的路徑\r\n    if (this.loadedPaths.length === 0) {\r\n      return Promise.resolve(true);\r\n    }\r\n\r\n    UofxConsole.log(`[I18nLoader]: 重新載入翻譯，從 ${fromLang} 切換至 ${toLang}`);\r\n\r\n    // 5.使用已載入的資訊重新產生目標語系的 URL\r\n    const newLoadedInfos: Array<LoadedI18nInfo> = this.loadedPaths.map(info => ({\r\n      url: info.url.replace(fromLang, toLang),\r\n      pluginNamespace: info.pluginNamespace,\r\n      i18nPrefix: info.i18nPrefix\r\n    }));\r\n\r\n    // 6.發送請求取得新語系的翻譯，每個請求獨立處理錯誤\r\n    const urls = newLoadedInfos.map(info => info.url);\r\n    const https = this.generateTranslationRequest(urls);\r\n\r\n    return new Promise(resolve => {\r\n      // 7.發送請求並處理結果\r\n      forkJoin(https)\r\n        .pipe(\r\n          map((langs: any[]) => {\r\n            // 8.合併現有翻譯與新載入的翻譯（null 視為空物件，確保成功的部分仍套用）\r\n            let result = {};\r\n            const flatLangs = langs.map((lang, index) => {\r\n              const pluginNamespace = newLoadedInfos[index].pluginNamespace;\r\n              return this.flattenLangs([lang ?? {}], pluginNamespace)[0];\r\n            });\r\n            return Object.assign(result, ...flatLangs);\r\n          })\r\n        ).subscribe({\r\n          next: translations => {\r\n            // 9.設定新語系的翻譯\r\n            this.translate.setTranslation(toLang, translations);\r\n\r\n            // 10.覆蓋舊的路徑記錄，並使用新語系\r\n            if (isSwitchLang) {\r\n              this.loadedPaths = newLoadedInfos;\r\n              this.translate.use(toLang);\r\n            }\r\n\r\n            // 11.不論翻譯是否全數成功，皆回傳 true，不阻擋語系切換\r\n            resolve(true);\r\n          }\r\n        });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 直接插入翻譯物件至 TranslateService，不透過 HTTP 載入。\r\n   *\r\n   * @param translations 要插入的翻譯物件（key-value 形式）\r\n   * @param pluginNamespace Plugin 命名空間（選填），會作為翻譯 key 的前綴\r\n   * @param targetLang 目標語系（選填），預設使用當前語系\r\n   */\r\n  insertTranslation(translations: Record<string, any>, pluginNamespace?: string, targetLang?: string): void {\r\n    const lang = targetLang || this.translate.currentLang || this.translate.getDefaultLang();\r\n\r\n    if (!this.isLangValid(lang)) {\r\n      UofxConsole.error('[I18nLoader]: insertTranslation 目標語系無效');\r\n      return;\r\n    }\r\n\r\n    const current = { ...this.transStore.translations[lang] };\r\n    const [flat] = this.flattenLangs([translations], pluginNamespace);\r\n    this.translate.setTranslation(lang, Object.assign(current, flat));\r\n  }\r\n\r\n\r\n  /**\r\n   * 記錄已載入的路徑資訊\r\n   *\r\n   * @param urls 載入的 URL 陣列\r\n   * @param pluginNamespace Plugin 命名空間（選填）\r\n   * @param i18nPrefixes i18n 前綴陣列（選填）\r\n  /**\r\n   *\r\n   *\r\n   * @private\r\n   * @param {string[]} urls\r\n   * @param {string} [pluginNamespace]\r\n   * @param {string[]} [i18nPrefixes]\r\n   * @memberof I18nLoader\r\n   */\r\n  private recordLoadedPaths(urls: string[], pluginNamespace?: string, i18nPrefixes?: string[]): void {\r\n    urls.forEach((url, index) => {\r\n      this.loadedPaths.push({\r\n        url,\r\n        pluginNamespace,\r\n        i18nPrefix: i18nPrefixes ? i18nPrefixes[index] : undefined\r\n      });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 轉換 HTTP GET 請求\r\n   *\r\n   * 載入失敗時回傳空物件並記錄錯誤，不拋出例外。\r\n   *\r\n   * @param urls 翻譯檔案的 URL 陣列\r\n   * @returns Observable 陣列，每個 Observable 回傳翻譯資料；失敗時回傳 `null`\r\n   */\r\n  private generateTranslationRequest(urls: string[]) {\r\n    return urls.map(url =>\r\n      this.http.get(url).pipe(\r\n        catchError(() => {\r\n          UofxConsole.error(`[I18nLoader]: 載入翻譯檔案失敗 ${url}`);\r\n          return of(null);\r\n        })\r\n      )\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 將多個語系物件攤平並加上 prefix\r\n   *\r\n   * @param langs 語系物件陣列\r\n   * @param pluginNamespace Plugin 命名空間（選填）\r\n   * @returns 攤平後的語系物件陣列\r\n   * @example\r\n   * // 無 pluginNamespace\r\n   * flattenLangs([{ 'button.ok': '確定'}, { 'button.cancel': '取消'}])\r\n   * // 結果: [{ 'button.ok': '確定'}, { 'button.cancel': '取消'}]\r\n   *\r\n   * // 有 pluginNamespace\r\n   * flattenLangs([{ 'button.ok': '確定'}, { 'button.cancel': '取消'}], 'common')\r\n   * // 結果: [{ 'common.button.ok': '確定'}, { 'common.button.cancel': '取消'}]\r\n   */\r\n  private flattenLangs(langs: any[], pluginNamespace?: string): any[] {\r\n    return langs.map(lang => {\r\n      if (!pluginNamespace) return lang;\r\n      const flat: any = {};\r\n      Object.keys(lang).forEach(key => {\r\n        flat[`${pluginNamespace}.${key}`] = lang[key];\r\n      });\r\n      return flat;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 根據前綴清單和語系產生 i18n URL 陣列\r\n   *\r\n   * @param prefixes i18n 前綴陣列，例如：['global', 'common']\r\n   * @param lang 語系，例如：'zh-TW'\r\n   * @returns i18n URL 陣列\r\n   */\r\n  private generateI18nUrls(prefixes: string[], lang: string): string[] {\r\n    const urls: string[] = [];\r\n    const hostUrl = this.configService.hostUrl;\r\n    const langVersion = this.configService.langVersion;\r\n    const isApp = this.configService.isApp;\r\n    const isI18nProdApi = this.configService.isI18nProdApi;\r\n\r\n    let baseUrl = '';\r\n    if (isI18nProdApi) {\r\n      // 1-1.正式環境：使用相對路徑 API\r\n      baseUrl = isApp\r\n        ? `~/api/app/base/trans/lang`\r\n        : `~/api/desktop/base/trans/lang`;\r\n    } else {\r\n      // 1-2.開發環境：使用小工具 URL\r\n      let url = hostUrl;\r\n      if (!url.endsWith('/')) url += '/';\r\n      baseUrl = `${url}trans/lang`;\r\n    }\r\n\r\n    // 2.組合完整 URL\r\n    // ~/api/app/base/trans/lang/zh-TW/global/1.0.0\r\n    // ~/api/desktop/base/trans/lang/zh-TW/global/1.0.0\r\n    // http://i18n/trans/lang/1.0.0/zh-TW/global\r\n    prefixes.forEach(prefix => {\r\n      const fullUrl = isI18nProdApi\r\n        ? `${baseUrl}/${lang}/${prefix}/${langVersion}`\r\n        : `${baseUrl}/${langVersion}/${lang}/${prefix}`;\r\n      urls.push(fullUrl);\r\n    });\r\n\r\n    return urls;\r\n  }\r\n\r\n  /**\r\n   * 取得指定名稱的 Cookie 值\r\n   *\r\n   * @param cookieName Cookie 名稱\r\n   * @returns Cookie 值，若不存在則回傳 `undefined`\r\n   */\r\n  private getCookie(cookieName: string): string | undefined {\r\n    const cookie: Record<string, string> = {};\r\n    document.cookie.split(';').forEach(el => {\r\n      const [key, value] = el.split('=');\r\n      cookie[key.trim()] = value;\r\n    });\r\n    return cookie[cookieName];\r\n  }\r\n\r\n  /**\r\n   * 檢查 i18n 前綴清單是否有效\r\n   *\r\n   * @param prefixes i18n 前綴陣列\r\n   * @returns 清單非空回傳 `true`，否則回傳 `false`\r\n   */\r\n  private isPrefixValid(prefixes: string[]): boolean {\r\n    if (prefixes.length === 0) {\r\n      UofxConsole.error('[I18nLoader]: i18nPrefix 清單為空，請確認傳入的前綴是否正確');\r\n      return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * 檢查 URL 陣列是否有效\r\n   *\r\n   * @param urls URL 陣列\r\n   * @returns 陣列非空回傳 `true`，否則回傳 `false`\r\n   */\r\n  private isUrlValid(urls: string[]): boolean {\r\n    if (urls.length === 0) {\r\n      UofxConsole.error('[I18nLoader]: urls 為空陣列，無法載入翻譯');\r\n      return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * 檢查目標語系是否有效\r\n   *\r\n   * @param lang 目標語系\r\n   * @returns 語系有效回傳 `true`，無效回傳 `false`\r\n   */\r\n  private isLangValid(lang: string): boolean {\r\n    // 1.檢查是否有提供目標語系\r\n    if (!lang) {\r\n      UofxConsole.error('[I18nLoader]: 目標語系未提供，無法重新載入翻譯');\r\n      return false;\r\n    }\r\n\r\n    // 2.檢查目標語系是否支援\r\n    if (!this.configService.supportLangs.includes(lang)) {\r\n      UofxConsole.error(`[I18nLoader]: 目標語系 ${lang} 不支援，無法重新載入翻譯`);\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\n\r\nimport { I18nConfigService } from \"./i18n-config.service\";\r\nimport { I18nLoader } from \"./i18n-loader.service\";\r\n\r\n// =======================\r\n// Uofx I18N Service\r\n// 無法統一名稱使用小寫 I18n，因為會導致外掛模組被強制更新才能正常使用多語系\r\n// =======================\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UofxI18NService {\r\n  private translate = inject(TranslateService);\r\n  private i18nLoader = inject(I18nLoader);\r\n  private i18nConfigService = inject(I18nConfigService);\r\n\r\n  /** 取得或設定多語系來源 URL */\r\n  get hostUrl(): string {\r\n    return this.i18nConfigService.hostUrl;\r\n  }\r\n  set hostUrl(url: string) {\r\n    this.i18nConfigService.hostUrl = url;\r\n  }\r\n\r\n  /** 取得或設定多語系來源版本 */\r\n  get langVersion(): string {\r\n    return this.i18nConfigService.langVersion;\r\n  }\r\n  set langVersion(version: string) {\r\n    this.i18nConfigService.langVersion = version;\r\n  }\r\n\r\n  /** 是否為 App 環境 */\r\n  get isApp(): boolean {\r\n    return this.i18nConfigService.isApp;\r\n  }\r\n\r\n  /** 是否使用多語系生產環境 API */\r\n  get isI18nProdApi(): boolean {\r\n    return this.i18nConfigService.isI18nProdApi;\r\n  }\r\n\r\n  /** 取得預設語系，預設語系由 I18nConfigService 提供 */\r\n  get defaultLang(): string {\r\n    return this.translate.defaultLang;\r\n  }\r\n\r\n  /** 取得或設定目前語系 */\r\n  get currentLang(): string {\r\n    return this.translate.currentLang;\r\n  }\r\n  set currentLang(lang: string) {\r\n    this.translate.use(lang);\r\n  }\r\n\r\n  /** 當語系切換時 */\r\n  get onLangChange() {\r\n    return this.translate.onLangChange;\r\n  }\r\n\r\n  /**\r\n   * 切換語系\r\n   * @param lang 目標語系\r\n   * @returns\r\n   */\r\n  switchLang(lang: string): Promise<boolean> {\r\n    return this.i18nLoader.reloadTranslations(lang);\r\n  }\r\n\r\n  /**\r\n   * 翻譯\r\n   * @param key 翻譯 key\r\n   * @param params 翻譯參數\r\n   * @returns\r\n   */\r\n  trans(key: string, params?: any): string {\r\n    return this.translate.instant(key, params);\r\n  }\r\n\r\n  /**\r\n   * 取得瀏覽器語系\r\n   *\r\n   * 若瀏覽器語系不在支援清單中，回傳預設語系\r\n   * @returns 支援的語系字串\r\n   */\r\n  getBrowserLang(): string {\r\n    const browserLang = this.translate.getBrowserCultureLang();\r\n    return this.i18nConfigService.supportLangs.includes(browserLang) ? browserLang : this.defaultLang;\r\n  }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Route, RouterStateSnapshot } from '@angular/router';\r\n\r\nimport { UofxConsole } from '../utility/console/console';\r\nimport { I18nLoader } from './i18n-loader.service';\r\n\r\n/**\r\n * I18N 路由守衛\r\n *\r\n * 用於在路由切換時自動載入對應的多語系翻譯檔。\r\n * 需在 route data 中定義 `i18nPrefix` 屬性。\r\n *\r\n * **設計原則**：此 Guard 的唯一目的是「等翻譯載入完成後再進入頁面」，\r\n * 無論翻譯載入成功或失敗，皆不阻擋路由導航（一律回傳 `true`）。\r\n * 翻譯載入失敗僅記錄錯誤訊息，不影響頁面進入。\r\n *\r\n * @example\r\n * // 在路由設定中使用\r\n * {\r\n *   path: 'my-page',\r\n *   component: MyPageComponent,\r\n *   canActivate: [I18nGuard],\r\n *   data: { i18nPrefix: 'myPage' }\r\n * }\r\n */\r\n@Injectable()\r\nexport class I18nGuard {\r\n  private i18nLoader = inject(I18nLoader);\r\n\r\n  /**\r\n   * 路由守衛：等待多語系翻譯載入完成後放行\r\n   *\r\n   * 不論翻譯載入結果為何，皆回傳 `true` 放行路由，不阻擋頁面進入。\r\n   *\r\n   * @param route 路由快照\r\n   * @param state 路由狀態\r\n   * @returns 永遠回傳 `true`\r\n   */\r\n  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {\r\n    return this.checkI18nConfig(route);\r\n  }\r\n\r\n  /**\r\n   * 檢查路由配置並載入對應的多語系翻譯\r\n   *\r\n   * 載入失敗時僅記錄錯誤，不阻擋路由導航。\r\n   *\r\n   * @param route 路由配置或快照\r\n   * @returns 載入一律回傳 `true`，但若未提供 i18nPrefix 回傳 `false`\r\n   */\r\n  private async checkI18nConfig(route: Route | ActivatedRouteSnapshot): Promise<boolean> {\r\n    if (!route.data || !route.data.i18nPrefix) {\r\n      UofxConsole.error('[I18nGuard]: 需要在 route data 中定義 i18nPrefix');\r\n      return false;\r\n    }\r\n\r\n    // 使用 I18nLoader 載入翻譯\r\n    // 無論 loadTranslationFromApi 回傳 true 或 false（翻譯失敗），\r\n    // Guard 一律回傳 true，確保不阻擋頁面進入\r\n    const prefixes = Array.isArray(route.data.i18nPrefix)\r\n      ? route.data.i18nPrefix\r\n      : [route.data.i18nPrefix];\r\n\r\n    await this.i18nLoader.loadTranslationFromApi(prefixes);\r\n    return true;\r\n  }\r\n\r\n}\r\n\r\n","import { Router, UrlTree, NavigationExtras } from '@angular/router';\r\nimport { UofxRouterHelper } from './router-helper';\r\n\r\nexport class UofxRouter extends Router {\r\n  constructor() {\r\n    super();\r\n  }\r\n\r\n  // navigate 內部會呼叫 navigateByUrl，所以此處不需實做\r\n  // navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> {\r\n  //   return super.navigate(commands, extras);\r\n  // }\r\n\r\n  navigateByUrl(url: string | UrlTree, extras?: NavigationExtras): Promise<boolean> {\r\n    const resultUrl = UofxRouterHelper.overrideNavigateByUrl(url);\r\n    return super.navigateByUrl(resultUrl, extras);\r\n  }\r\n}\r\n\r\nexport function UofxRouterFactory(): Router {\r\n  return new UofxRouter();\r\n}\r\n\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { Route, UrlSegment, UrlSegmentGroup } from '@angular/router';\r\nimport { UofxRouterHelper, UofxRouterRootName } from './router-helper';\r\n\r\n// https://medium.com/@brandontroberts/custom-route-matching-with-the-angular-router-fbdd48665483\r\n// @dynamic\r\nexport class UofxRouterMatcher {\r\n\r\n  /** 動態指定公司識別碼路由 */\r\n  static dynamicPathCode() {\r\n    return (segments: Array<UrlSegment>, segmentGroup: UrlSegmentGroup, route: Route) => {\r\n      let consumed: Array<UrlSegment> = [];\r\n      let posParams: { [key: string]: UrlSegment } = {};\r\n      let corpPathCodes = UofxRouterHelper.PathCodes;\r\n      const segmentsPachCode = segments.length > 0 ? segments[0].path.toLocaleLowerCase() : null;\r\n\r\n      if (segmentsPachCode === UofxRouterRootName.UniversalLink.toLocaleLowerCase()) {\r\n        // 如果是通用連結則不處理\r\n        return { consumed, posParams };\r\n      }\r\n\r\n      // 尚未登入前會由後端驗證輸入的path code合法性，所以如果來到前端了表示都已經是合法的了。\r\n      // 由於尚未登入所以前端corpPathCodes不會拿到任何資料所以將輸入的值當作可使用的值\r\n      if (corpPathCodes.length === 0 && segmentsPachCode) {\r\n        const findIndex = Object.keys(UofxRouterRootName).findIndex(key => UofxRouterRootName[key].toLocaleLowerCase() === segmentsPachCode);\r\n        if (findIndex === -1) {\r\n          corpPathCodes = [segmentsPachCode];\r\n          UofxRouterHelper.PathCodes = corpPathCodes;\r\n        }\r\n      }\r\n\r\n      if (segments.length > 0 && corpPathCodes.length > 0) {\r\n        // 如果url沒有pathcode則強制加回現有的\r\n        let corpPathCode = UofxRouterHelper.CurrentPathCode;\r\n        if (corpPathCodes.includes(segments[0].path.toLocaleLowerCase())) {\r\n          corpPathCode = segments[0].path;\r\n        }\r\n\r\n        const urlSeqment = new UrlSegment(corpPathCode, {});\r\n        UofxRouterHelper.CurrentPathCode = corpPathCode;\r\n        consumed = [urlSeqment];\r\n\r\n        const tempPosParams = {};\r\n        tempPosParams[UofxRouterHelper.pathCodeParamName] = urlSeqment;\r\n        posParams = tempPosParams;\r\n      }\r\n\r\n      return { consumed, posParams };\r\n    };\r\n  }\r\n\r\n  /** 404 路由處理 */\r\n  static notFound() {\r\n    return (segments: Array<UrlSegment>, segmentGroup: UrlSegmentGroup, route: Route) => {\r\n      if (segments.length === 0) return null;\r\n\r\n      let originUrl = '';\r\n      segments.forEach(item => { originUrl += `/${item.path}`; });\r\n      originUrl = UofxRouterHelper.replaceDoubleSlashToSingle(originUrl);\r\n\r\n      return {\r\n        consumed: segments,\r\n        posParams: {\r\n          origin: new UrlSegment('origin', { 'url': originUrl }),\r\n        }\r\n      };\r\n    };\r\n  }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const PLUGIN_CODE = new InjectionToken<string>('plugin-code');\r\nexport const PLUGIN_ENTRY_HOST = new InjectionToken<string>('plugin-entry-host');\r\n","import { booleanAttribute } from '@angular/core';\r\n\r\nexport class Helper {\r\n  /**\r\n   * 取得 <base href=\"{value}\"> 的 value\r\n   */\r\n  static getBaseHref() {\r\n    return document.getElementsByTagName('base')[0].attributes[0].nodeValue;\r\n  }\r\n\r\n  /**\r\n   *\r\n   * @static 目前只有用在大頭照的背景色\r\n   * @param {string} str 要轉換的字串\r\n   * @return {*}\r\n   * @memberof Helper\r\n   */\r\n  static hashCode(str: string) {\r\n    let hash = 0;\r\n    let chr = 0;\r\n    if (str.length === 0) return hash;\r\n    for (let i = 0; i < str.length; i++) {\r\n      chr = str.charCodeAt(i);\r\n      hash = ((hash << 5) - hash) + chr;\r\n      // Convert to 32bit integer\r\n      hash |= 0;\r\n    }\r\n    return hash;\r\n  }\r\n\r\n  /**\r\n   * 轉成布林值\r\n   * @param value 可以傳入布林或字串\r\n   */\r\n  static parseBoolean(value: unknown): boolean {\r\n    return booleanAttribute(value);\r\n  }\r\n\r\n  /**\r\n   * @static 是否為空物件，ex obj === {}\r\n   * @param {*} obj 要判斷的物件\r\n   * @return {*} {boolean}\r\n   * @memberof Helper\r\n   */\r\n  static isEmptyObject(obj: any) {\r\n    if (!obj) return false;\r\n    return Object.getOwnPropertyNames(obj).length === 0;\r\n  }\r\n\r\n  /**\r\n   * 加入api版號\r\n   * @static\r\n   * @param apiVersion 版號\r\n   * @param url 要加上版號的url\r\n   * @memberof Config\r\n   */\r\n  static addApiVersion(apiVersion: string, url: any): any {\r\n    if (!url) return url;\r\n    if (url.startsWith('api/desktop/')) {\r\n      return url.replace('api/desktop/', `api/desktop/v${apiVersion}/`);\r\n    } else if (url.startsWith('api/app/')) {\r\n      return url.replace('api/app/', `api/app/v${apiVersion}/`);\r\n    }\r\n    return url;\r\n  }\r\n\r\n  /**\r\n   * 取得真正的url\r\n   * @param url 要被轉換的網址, 使用~/ 開頭\r\n   */\r\n  static transUrl(url: string): string {\r\n    if (url && url.startsWith('~/')) {\r\n      return url.replace('~/', '');\r\n    }\r\n    return url;\r\n  }\r\n\r\n  /**\r\n   * 轉換成 Server 的 URL\r\n   * @deprecated 請改用 UofFileDownloadHelper\r\n   * @param url 要被轉換的網址, 使用~/ 開頭\r\n   */\r\n  static transToServerUrl(serverUrl: string, url: string): string {\r\n    if (url && url.startsWith('~/')) {\r\n      url = url.replace('~', serverUrl);\r\n    }\r\n    return this.replaceUrlDoubleSlash(url);\r\n  }\r\n\r\n  /**\r\n   * 置換掉雙斜線\r\n   * @param url 要被置換的網址\r\n   */\r\n  static replaceUrlDoubleSlash(url: string): string {\r\n    if (!url) return url;\r\n\r\n    const segmentUrl = url.split('://');\r\n    if (segmentUrl.length >= 2) url = segmentUrl[1];\r\n\r\n    // 處理掉雙斜線\r\n    const reg = new RegExp('\\/\\/', 'gi');\r\n    while (url.match(reg)) {\r\n      url = url.replace(reg, '/');\r\n    }\r\n\r\n    if (segmentUrl.length >= 2) url = `${segmentUrl[0]}://${url}`;\r\n\r\n    return url;\r\n  }\r\n\r\n  /**\r\n   * 放在url上需置換掉base64符號\r\n   * @description 用在放在url上的base64字串，會有+號，/號，=號，需轉換成-號，_號，去掉=號\r\n   * @param data 要被轉換的資料\r\n   * @return 轉換後的資料\r\n   */\r\n  static convertBase64UrlSymbol(data: string) {\r\n    // Convert '+' to '-'\r\n    // Convert '/' to '_'\r\n    // Remove ending '='\r\n    return data.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n  }\r\n}\r\n","import { Helper } from '../helper/helper';\r\nimport { LocalStorage } from '../storage/local.storage';\r\n\r\n/**\r\n * 全域系統設定值\r\n */\r\n// @dynamic\r\nexport class Config {\r\n  // #region Server Url\r\n\r\n  // eslint-disable-next-line @typescript-eslint/member-ordering\r\n  private static _serverUrl = '';\r\n  /** copyright 年份 */\r\n  private static _systemYear = null;\r\n  /** 主機 URL */\r\n  static set serverUrl(value: string) {\r\n    this._serverUrl = value;\r\n  }\r\n\r\n  /** 主機URL */\r\n  static get serverUrl(): string {\r\n    return this.getServerUrl();\r\n  }\r\n\r\n  /** copyright 年份 */\r\n  public static setSystemYear(year: number) {\r\n    this._systemYear = year;\r\n  }\r\n\r\n  /** copyright 年份 */\r\n  public static get systemYear() {\r\n    return this._systemYear;\r\n  }\r\n\r\n  // #endregion\r\n\r\n  private static get(key: string) {\r\n    return LocalStorage.getObject(key);\r\n  }\r\n  private static set(key: string, value) {\r\n    LocalStorage.setObject(key, value);\r\n  }\r\n\r\n  private static getServerUrl() {\r\n    const serverUrl = this._serverUrl + '/';\r\n    const symbol = '://';\r\n    const urls = serverUrl.split(symbol);\r\n\r\n    if (urls.length === 2) {\r\n      return `${urls[0]}${symbol}${Helper.replaceUrlDoubleSlash(urls[1])}`;\r\n    }\r\n\r\n    return Helper.replaceUrlDoubleSlash(serverUrl);\r\n  }\r\n}\r\n","import { AesModel } from './utility.model';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport * as forge from 'node-forge';\r\n\r\nexport class UofxCrypto {\r\n  // #region RSA加密相關\r\n\r\n  private static _serverPublicKey = '';\r\n\r\n  /** 設定 server 端的 public key */\r\n  public static set serverPublicKey(key: string) {\r\n    this._serverPublicKey = key;\r\n  }\r\n\r\n  /** 取得 server 端的 public key */\r\n  public static get serverPublicKey(): string {\r\n    return this._serverPublicKey;\r\n  }\r\n\r\n  /**\r\n   * 密碼加密\r\n   * @param password 密碼\r\n   * @param isManagement 後台註記\r\n   * @memberof UofxCrypto\r\n   */\r\n  static encryptBitBe(bitbe: string, isManagement: boolean = false) {\r\n    return this.encryptByPublicKey(this.createBitBePayload(bitbe, isManagement));\r\n  }\r\n\r\n  /**\r\n   * 加密資料用:透過 AES 加密內容，並使用 RSA 加密 AES key 與 iv\r\n   * @param info 欲加密的資訊\r\n   * @param isManagement 後台註記\r\n   * @memberof UofxCrypto\r\n   * @return 混合加密後的資料，包含 AES 加密的內容與 RSA 加密的 AES key 與 iv\r\n   */\r\n  static encryptData(info: string, isManagement: boolean = false): {\r\n    encAesKey: string;\r\n    encAesIv: string;\r\n    encData: any;\r\n  } {\r\n    const key = this.generateRandomAsciiSecret(32);\r\n    const iv = this.generateRandomAsciiSecret(16);\r\n    const config = {\r\n      iv: iv,\r\n      mode: CryptoJS.mode.CBC,\r\n      padding: CryptoJS.pad.Pkcs7\r\n    };\r\n    const encData = this.aesEncrypt(JSON.stringify(this.createBitBePayload(info, isManagement)), key, config);\r\n\r\n    return {\r\n      encData,\r\n      ...this.getAesModelWithRsaEncrypt(key, iv)\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 使用public key對資料進行RSA-OAEP加密\r\n   * -\r\n   * 使用forge進行RSA-OAEP加密；Reference: https://www.npmjs.com/package/node-forge\r\n   * @param {*} data 要被加密的資料\r\n   * @memberof UofxCrypto\r\n   */\r\n  static encryptByPublicKey(data: unknown) {\r\n    // 將 pem public key 轉成 forge 的 public key\r\n    const publicKey = forge.pki.publicKeyFromPem(UofxCrypto.serverPublicKey);\r\n\r\n    // 要加密的內容轉成字串\r\n    const strData = typeof (data) === 'object' && data !== null ? JSON.stringify(data) : String(data);\r\n\r\n    // 取得加密內容的buffer\r\n    const buffer = forge.util.createBuffer(strData, 'utf8');\r\n\r\n    // 進行 RSA-OAEP SHA-256 加密\r\n    const encrypted = publicKey.encrypt(\r\n      buffer.getBytes(),\r\n      'RSA-OAEP',\r\n      { md: forge.md.sha256.create() }\r\n    );\r\n\r\n    return forge.util.encode64(encrypted);\r\n  }\r\n\r\n  // #endregion\r\n\r\n  // #region AES加密相關 (https://www.npmjs.com/package/crypto-js)\r\n\r\n  /**\r\n   * 進行AES加密，並取得一個暗碼字串\r\n   * @static\r\n   * @param {unknown} encryptStr 要被加密的字串\r\n   * @param {string} key AES key\r\n   * @param {Record<string, unknown>} config AES相關設定 (iv、mode、padding...etc)\r\n   * @return {*} 回傳暗碼結果\r\n   * @memberof UofxCrypto\r\n   */\r\n  static aesEncrypt(encryptStr: string, key: string, config: Record<string, unknown>) {\r\n    key = CryptoJS.enc.Utf8.parse(key);\r\n    config['iv'] = CryptoJS.enc.Utf8.parse(config['iv']);\r\n    return CryptoJS.AES.encrypt(encryptStr, key, config).toString();\r\n  }\r\n\r\n  /**\r\n   * 進行AES解密，並取得明碼結果\r\n   * @static\r\n   * @param {string} decryptStr 要被解碼的暗碼字串\r\n   * @param {string} key AES key\r\n   * @param {Record<string, unknown>} config AES相關設定 (iv、mode、padding...etc)\r\n   * @return {*} 回傳明碼結果\r\n   * @memberof UofxCrypto\r\n   */\r\n  static aesDecrypt(decryptStr: string, key: string, config: Record<string, unknown>) {\r\n    return CryptoJS.AES.decrypt(decryptStr, key, config).toString(CryptoJS.enc.Utf8);\r\n  }\r\n\r\n  /**\r\n   * 取得有RSA加密過的AES model\r\n   * @static\r\n   * @param {string} key AES key\r\n   * @param {string} iv AES iv\r\n   * @return {*}\r\n   * @memberof UofxCrypto\r\n   */\r\n  static getAesModelWithRsaEncrypt(key: string, iv: string) {\r\n    return <AesModel>{\r\n      encAesKey: this.encryptByPublicKey(key),\r\n      encAesIv: this.encryptByPublicKey(iv)\r\n    };\r\n  }\r\n\r\n  /**\r\n   * pdf viewer檔案解密後的密碼\r\n   * @static\r\n   * @param {string} pdfPwd 從後端取得的暗碼\r\n   * @param {string} key AES key\r\n   * @param {string} iv AES iv\r\n   * @return {*} 解密後的明碼\r\n   * @memberof UofxCrypto\r\n   */\r\n  static decryptPdfPwd(pdfPwd: string, key: string, iv: string) {\r\n    const config = {\r\n      iv: CryptoJS.enc.Utf8.parse(iv),\r\n      mode: CryptoJS.mode.CBC,\r\n      padding: CryptoJS.pad.Pkcs7\r\n    };\r\n    return this.aesDecrypt(pdfPwd, CryptoJS.enc.Utf8.parse(key), config);\r\n  }\r\n\r\n  /**\r\n   * @private 建立被加密的內容\r\n   * @static\r\n   * @param {string} info 要被加密的資訊\r\n   * @param {boolean} isManagement 後台註記\r\n   * @return {*}\r\n   * @memberof UofxCrypto\r\n   */\r\n  private static createBitBePayload(info: string, isManagement: boolean) {\r\n    const expiredDate = new Date();\r\n    expiredDate.setHours(expiredDate.getHours() + 12);\r\n    return {\r\n      bitbe: info,\r\n      isManagement,\r\n      expired: expiredDate.getTime()\r\n    };\r\n  }\r\n\r\n  /**\r\n   * @private 產生可直接給 aesEncrypt 以 Utf8.parse 使用的隨機 ASCII 字串\r\n   * @static\r\n   * @param {number} length 要產生的字串長度\r\n   * @return {*}  {string} 產生的隨機 ASCII 字串\r\n   * @memberof UofxCrypto\r\n   */\r\n  private static generateRandomAsciiSecret(length: number): string {\r\n    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n    const randomBytes = forge.random.getBytesSync(length);\r\n    let result = '';\r\n\r\n    for (let index = 0; index < length; index++) {\r\n      result += chars.charAt(randomBytes.charCodeAt(index) % chars.length);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  // #endregion\r\n}\r\n","import { Input, booleanAttribute, numberAttribute } from \"@angular/core\";\r\n\r\nexport function InputNumber() {\r\n  return function (target: any, propertyKey: string) {\r\n    Input({ transform: numberAttribute })(target, propertyKey);\r\n  };\r\n}\r\n\r\nexport function InputBoolean() {\r\n  return function (target: any, propertyKey: string) {\r\n    Input({ transform: booleanAttribute })(target, propertyKey);\r\n  };\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface MockConfig {\r\n  /**\r\n   * 规则定义数据\r\n   */\r\n  data: any;\r\n  /**\r\n   * 请求延迟，单位：毫秒，默认：`300`\r\n   */\r\n  delay?: number;\r\n  /**\r\n   * 是否强制所有请求都Mock，默认：`false`，`true` 表示当请求的URL不存在时直接返回 404 错误，`false` 表示未命中时发送真实HTTP请求\r\n   */\r\n  force?: boolean;\r\n  /**\r\n   * 是否打印 Mock 请求信息，弥补浏览器无Network信息，默认：`true`\r\n   */\r\n  log?: boolean;\r\n  /**\r\n   * 是否拦截命中后继续调用后续拦截器的 `intercept` 方法，默认：`true`\r\n   */\r\n  executeOtherInterceptors?: boolean;\r\n}\r\n\r\n\r\nexport const MOCK_DEFAULT_CONFIG: MockConfig = {\r\n  data: null,\r\n  delay: 300,\r\n  force: false,\r\n  log: true,\r\n  executeOtherInterceptors: true,\r\n};\r\n\r\nexport const MOCK_CONFIG = new InjectionToken<MockConfig>('mock-config', {\r\n  providedIn: 'root',\r\n  factory: MOCK_CONFIG_FACTORY,\r\n});\r\n\r\nexport function MOCK_CONFIG_FACTORY(): MockConfig {\r\n  return { data: null };\r\n}\r\n","import { Injectable, OnDestroy, Optional, Inject } from '@angular/core';\r\nimport { MockCachedRule, MockRule } from './interface';\r\nimport { MOCK_DEFAULT_CONFIG, MockConfig, MOCK_CONFIG } from './mock.config';\r\nimport { deepMerge } from '../deep';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MockService implements OnDestroy {\r\n  private cached: MockCachedRule[] = [];\r\n  readonly config: MockConfig;\r\n\r\n  constructor(@Optional() @Inject(MOCK_CONFIG) mockConfig?: MockConfig) {\r\n    this.config = MOCK_DEFAULT_CONFIG;\r\n    deepMerge(this.config, mockConfig);\r\n    this.applyMock();\r\n    delete this.config.data;\r\n  }\r\n\r\n  // #region parse rule\r\n\r\n  private applyMock(): void {\r\n    this.cached = [];\r\n    try {\r\n      this.realApplyMock();\r\n    } catch (e) {\r\n      this.outputError(e);\r\n    }\r\n  }\r\n\r\n  private realApplyMock(): void {\r\n    const data = this.config.data;\r\n    if (!data) return;\r\n    Object.keys(data).forEach((key: string) => {\r\n      const rules = data[key];\r\n      if (!rules) return;\r\n      Object.keys(rules).forEach((ruleKey: string) => {\r\n        const value = rules[ruleKey];\r\n        if (!(typeof value === 'function' || typeof value === 'object' || typeof value === 'string')) {\r\n          throw Error(`mock value of [${key}-${ruleKey}] should be function or object or string, but got ${typeof value}`);\r\n        }\r\n        const rule = this.genRule(ruleKey, value);\r\n        if (['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'PATCH', 'OPTIONS'].indexOf(rule.method) === -1) {\r\n          throw Error(`method of ${key}-${ruleKey} is not valid`);\r\n        }\r\n        const item = this.cached.find(w => w.url === rule.url && w.method === rule.method);\r\n        if (item) {\r\n          item.callback = rule.callback;\r\n        } else {\r\n          this.cached.push(rule);\r\n        }\r\n      });\r\n    });\r\n    // regular ordering\r\n    this.cached.sort((a, b) => (b.matcher || '').toString().length - (a.matcher || '').toString().length);\r\n  }\r\n\r\n  private genRule(key: string, callback: any): MockCachedRule {\r\n    let method = 'GET';\r\n    let url = key;\r\n\r\n    if (key.indexOf(' ') > -1) {\r\n      const splited = key.split(' ');\r\n      method = splited[0].toLowerCase();\r\n      url = splited[1];\r\n    }\r\n\r\n    let martcher: RegExp | null = null;\r\n    let segments: string[] = [];\r\n    if (~url.indexOf(':')) {\r\n      segments = url!\r\n        .split('/')\r\n        .filter(segment => segment.startsWith(':'))\r\n        .map(v => v.substring(1));\r\n      const reStr = url!\r\n        .split('/')\r\n        .map(segment => (segment.startsWith(':') ? `([^/]+)` : segment))\r\n        .join('/');\r\n      martcher = new RegExp(`^${reStr}`, 'i');\r\n    } else if (/(\\([^)]+\\))/i.test(url)) {\r\n      martcher = new RegExp(url, 'i');\r\n    }\r\n\r\n    return {\r\n      url,\r\n      matcher: martcher,\r\n      segments,\r\n      callback,\r\n      method: method.toUpperCase(),\r\n    };\r\n  }\r\n\r\n  //TODO 原本的Souce code 會用ng-zorro-antd的NzSafeAny，但目前專案不使用ng-zorro，所以先mark掉換參數的類型\r\n  // private outputError(error: NzSafeAny): void {\r\n  //   const filePath = error.message.split(': ')[0];\r\n  //   const errors = (error.stack as string)\r\n  //     .split('\\n')\r\n  //     .filter(line => line.trim().indexOf('at ') !== 0)\r\n  //     .map(line => line.replace(`${filePath}: `, ''));\r\n  //   errors.splice(1, 0, '');\r\n\r\n  //   console.group();\r\n  //   console.warn(`==========Failed to parse mock config.==========`);\r\n  //   console.log(errors.join('\\n'));\r\n  //   console.groupEnd();\r\n\r\n  //   throw error;\r\n  // }\r\n\r\n  private outputError(error: any): void {\r\n    const filePath = error.message.split(': ')[0];\r\n    const errors = (error.stack as string)\r\n      .split('\\n')\r\n      .filter(line => line.trim().indexOf('at ') !== 0)\r\n      .map(line => line.replace(`${filePath}: `, ''));\r\n    errors.splice(1, 0, '');\r\n\r\n    console.group();\r\n    console.warn(`==========Failed to parse mock config.==========`);\r\n    console.log(errors.join('\\n'));\r\n    console.groupEnd();\r\n\r\n    throw error;\r\n  }\r\n\r\n  // #endregion\r\n\r\n  getRule(method: string, url: string): MockRule | null {\r\n    method = (method || 'GET').toUpperCase();\r\n    //TODO 原本的Souce code 會用ng-zorro-antd的NzSafeAny，但目前專案不使用ng-zorro，所以先mark掉換參數的類型\r\n    //  const params: NzSafeAny = {};\r\n    const params: any = {};\r\n    const list = this.cached.filter(w => w.method === method && (w.matcher ? w.matcher.test(url) : w.url === url));\r\n    if (list.length === 0) return null;\r\n    const ret = list.find(w => w.url === url) || list[0];\r\n    if (ret.matcher) {\r\n      const execArr = ret.matcher.exec(url);\r\n      execArr!.slice(1).map((value: string, index: number) => {\r\n        params[ret.segments[index]] = value;\r\n      });\r\n    }\r\n    return {\r\n      url,\r\n      method: ret.method,\r\n      params,\r\n      callback: ret.callback,\r\n    };\r\n  }\r\n\r\n  clearCache(): void {\r\n    this.cached = [];\r\n  }\r\n\r\n  get rules(): MockCachedRule[] {\r\n    return this.cached;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.clearCache();\r\n  }\r\n}\r\n","export class MockStatusError {\r\n  statusText: string;\r\n  constructor(public status: number, public error?: any) {}\r\n}\r\n","import { Observable, of, throwError } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\n\r\nimport {\r\n  HTTP_INTERCEPTORS,\r\n  HttpBackend,\r\n  HttpErrorResponse,\r\n  HttpEvent,\r\n  HttpHandler,\r\n  HttpInterceptor,\r\n  HttpRequest,\r\n  HttpResponse,\r\n  HttpResponseBase,\r\n} from '@angular/common/http';\r\nimport { Injectable, Injector } from '@angular/core';\r\n\r\nimport { deepCopy } from '../deep';\r\nimport { MockRequest } from './interface';\r\nimport { MockService } from './mock.service';\r\nimport { MockStatusError } from './status.error';\r\n\r\nclass HttpMockInterceptorHandler implements HttpHandler {\r\n  constructor(private next: HttpHandler, private interceptor: HttpInterceptor) { }\r\n\r\n  handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\r\n    return this.interceptor.intercept(req, this.next);\r\n  }\r\n}\r\n\r\n@Injectable()\r\nexport class MockInterceptor implements HttpInterceptor {\r\n  constructor(private injector: Injector) { }\r\n\r\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n    const src = this.injector.get(MockService);\r\n    const config = src.config;\r\n    const rule = src.getRule(req.method, req.url.split('?')[0]);\r\n    if (!rule && !config.force) {\r\n      return next.handle(req);\r\n    }\r\n\r\n    let res: any;\r\n    switch (typeof rule!.callback) {\r\n      case 'function':\r\n        const mockRequest: MockRequest = {\r\n          original: req,\r\n          body: req.body,\r\n          queryString: {},\r\n          headers: {},\r\n          params: rule!.params,\r\n        };\r\n        const urlParams = req.url.split('?');\r\n        if (urlParams.length > 1) {\r\n          urlParams[1].split('&').forEach(item => {\r\n            const itemArr = item.split('=');\r\n            const key = itemArr[0];\r\n            const value = itemArr[1];\r\n            // is array\r\n            if (Object.keys(mockRequest.queryString).includes(key)) {\r\n              if (!Array.isArray(mockRequest.queryString[key])) {\r\n                mockRequest.queryString[key] = [mockRequest.queryString[key]];\r\n              }\r\n              mockRequest.queryString[key].push(value);\r\n            } else {\r\n              mockRequest.queryString[key] = value;\r\n            }\r\n          });\r\n        }\r\n        req.params.keys().forEach(key => (mockRequest.queryString[key] = req.params.get(key)));\r\n        req.headers.keys().forEach(key => (mockRequest.headers[key] = req.headers.get(key)));\r\n\r\n        try {\r\n          res = rule!.callback.call(this, mockRequest);\r\n        } catch (e) {\r\n          res = new HttpErrorResponse({\r\n            url: req.url,\r\n            headers: req.headers,\r\n            status: e instanceof MockStatusError ? e.status : 400,\r\n            statusText: e.statusText || 'Unknown Error',\r\n            error: e.error,\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        res = rule!.callback;\r\n        break;\r\n    }\r\n\r\n    if (!(res instanceof HttpResponseBase)) {\r\n      res = new HttpResponse({\r\n        status: 200,\r\n        url: req.url,\r\n        body: res,\r\n      });\r\n    }\r\n\r\n    if (res.body) {\r\n      res.body = deepCopy(res.body);\r\n    }\r\n\r\n    if (config.log) {\r\n      console.log(`%c🚀${req.method} ${req.urlWithParams}`, 'background:#000;color:#bada55', req, res);\r\n    }\r\n\r\n    const res$ = res instanceof HttpErrorResponse ? throwError(res) : of(res);\r\n\r\n    if (config.executeOtherInterceptors) {\r\n      const interceptors = this.injector.get(HTTP_INTERCEPTORS, []);\r\n      const lastInterceptors = interceptors.slice(interceptors.indexOf(this) + 1);\r\n      if (lastInterceptors.length > 0) {\r\n        const chain = lastInterceptors.reduceRight((_next, _interceptor) => new HttpMockInterceptorHandler(_next, _interceptor), {\r\n          handle: () => res$,\r\n        } as HttpBackend);\r\n        return chain.handle(req).pipe(delay(config.delay!));\r\n      }\r\n    }\r\n\r\n    return res$.pipe(delay(config.delay!));\r\n  }\r\n}\r\n","import { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { ModuleWithProviders, NgModule } from '@angular/core';\r\n\r\nimport { MockInterceptor } from './mock.interceptor';\r\n\r\n@NgModule({})\r\nexport class MockModule {\r\n  static forRoot(): ModuleWithProviders<MockModule> {\r\n    return {\r\n      ngModule: MockModule,\r\n      providers: [{ provide: HTTP_INTERCEPTORS, useClass: MockInterceptor, multi: true }],\r\n    };\r\n  }\r\n\r\n  static forChild(): ModuleWithProviders<MockModule> {\r\n    return {\r\n      ngModule: MockModule,\r\n      providers: [{ provide: HTTP_INTERCEPTORS, useClass: MockInterceptor, multi: true }],\r\n    };\r\n  }\r\n}\r\n","import { LocalStorage } from '../storage/local.storage';\r\nimport { ExceptionModel } from '../utility.model';\r\n\r\n// @dynamic\r\nexport class UofxExceptionKeeper {\r\n  private static readonly KEY_PREFIX = 'UOFX';\r\n  private static readonly  KEY_EXCEPTION = `${this.KEY_PREFIX}EXCEP`;\r\n\r\n  private static readonly limits = 20;\r\n\r\n  static keep(exception: ExceptionModel) {\r\n\r\n    if (!exception) return;\r\n\r\n    const tmp = LocalStorage.getObject(this.KEY_EXCEPTION);\r\n    let exctptions: Array<ExceptionModel> = [];\r\n\r\n    if (tmp) {\r\n      exctptions = tmp;\r\n    }\r\n\r\n    exctptions.push(exception);\r\n\r\n    if (exctptions.length > this.limits) {\r\n      exctptions.shift();\r\n    }\r\n\r\n    LocalStorage.setObject(this.KEY_EXCEPTION, exctptions);\r\n  }\r\n\r\n  static getAll(): Array<ExceptionModel> {\r\n    return <Array<ExceptionModel>>LocalStorage.getObject(this.KEY_EXCEPTION);\r\n  }\r\n}\r\n","/** https://typescriptbcl.codeplex.com/SourceControl/latest#TypeScript.BCL/System/Guid.ts */\r\n// @dynamic\r\nexport class Guid {\r\n\r\n  constructor(public guid: string) { }\r\n\r\n  /** 產生 Guid 物件 */\r\n  public static makeNew(): Guid {\r\n    return this.makePrefixCharNew('');\r\n  }\r\n\r\n  /**\r\n   * 產生固定第一個字元的 Guid 物件\r\n   * @param prefixChar 前置字元(Options)，若字串長度超過一，只抓取第一個字元\r\n   */\r\n  public static makePrefixCharNew(prefixChar: string = 'A'): Guid {\r\n    let uuid = this.raw();\r\n    if (prefixChar) uuid = `${prefixChar[0]}${uuid.substring(1)}`;\r\n    return new Guid(uuid);\r\n  }\r\n\r\n  /** 取得 Guid 字串格式 */\r\n  private static raw(): string {\r\n    return [\r\n      createPart(4),\r\n      createPart(2),\r\n      createPart(2),\r\n      createPart(2),\r\n      createPart(6)\r\n    ].join('-');\r\n\r\n    function createPart(length) {\r\n      let uuidpart = '';\r\n      for (let i = 0; i < length; i++) {\r\n        let uuidchar = parseInt((Math.random() * 256).toString(), 10).toString(16);\r\n        if (uuidchar.length === 1) {\r\n          uuidchar = '0' + uuidchar;\r\n        }\r\n        uuidpart += uuidchar;\r\n      }\r\n      return uuidpart.toUpperCase();\r\n    }\r\n  }\r\n\r\n  public toString(): string {\r\n    return this.guid;\r\n  }\r\n}\r\n","/**\r\n * 路徑處理工具類別\r\n * 支援一般路徑和 URL 路徑（http://, https:// 等）\r\n * @example\r\n * PathHelper.join('a', 'b', 'c') => 'a/b/c'\r\n * PathHelper.join('http://example.com', 'api', 'users') => 'http://example.com/api/users'\r\n * PathHelper.joinPathWithLeadingSlash('a', 'b') => '/a/b'\r\n * PathHelper.removeLeadingSlash('/abc/def') => 'abc/def'\r\n */\r\nexport class PathHelper {\r\n  private static readonly slashSymbol = '/';\r\n\r\n  /**\r\n   * 連接多個路徑片段，自動處理斜線\r\n   * @param paths 路徑片段\r\n   * @returns 連接後的路徑\r\n   * @example\r\n   * join('a', 'b', 'c') => 'a/b/c'\r\n   * join('a/', '/b/', '/c') => 'a/b/c'\r\n   * join('/a', 'b', 'c/') => '/a/b/c'\r\n   * join('', 'a', '', 'b') => 'a/b'\r\n   * join('http://example.com', 'api', 'users') => 'http://example.com/api/users'\r\n   */\r\n  static join(...paths: string[]): string {\r\n    if (!paths || paths.length === 0) return '';\r\n\r\n    // 過濾空字串\r\n    const validPaths = paths.filter(p => p !== null && p !== undefined && p !== '');\r\n    if (validPaths.length === 0) return '';\r\n\r\n    // 記錄第一個路徑是否有開頭斜線\r\n    const hasLeadingSlash = validPaths[0].startsWith(this.slashSymbol);\r\n\r\n    // 記錄最後一個路徑是否有結尾斜線\r\n    const hasTrailingSlash = validPaths[validPaths.length - 1].endsWith(this.slashSymbol);\r\n\r\n    // 移除所有路徑的開頭和結尾斜線，然後連接\r\n    const cleanedPaths = validPaths.map(p => this.trimSlashes(p)).filter(p => p !== '');\r\n\r\n    let result = cleanedPaths.join(this.slashSymbol);\r\n\r\n    // 移除重複的斜線\r\n    result = this.removeDoubleSlashes(result);\r\n\r\n    // 根據原始情況決定是否要加上開頭/結尾斜線\r\n    if (hasLeadingSlash) {\r\n      result = this.slashSymbol + result;\r\n    }\r\n\r\n    if (hasTrailingSlash && result !== this.slashSymbol) {\r\n      result = result + this.slashSymbol;\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * 連接多個路徑片段，並確保開頭有斜線\r\n   * @param paths 路徑片段\r\n   * @returns 連接後的路徑（開頭有斜線）\r\n   * @example\r\n   * joinPathWithLeadingSlash('a', 'b', 'c') => '/a/b/c'\r\n   * joinPathWithLeadingSlash('/a', 'b') => '/a/b'\r\n   */\r\n  static joinPathWithLeadingSlash(...paths: string[]): string {\r\n    const result = this.join(...paths);\r\n    return result.startsWith(this.slashSymbol) ? result : this.slashSymbol + result;\r\n  }\r\n\r\n  /**\r\n   * 連接多個路徑片段，不包含開頭斜線\r\n   * @param paths 路徑片段\r\n   * @returns 連接後的路徑（不含開頭斜線）\r\n   * @example\r\n   * joinPathWithoutLeadingSlash('/a', 'b', 'c') => 'a/b/c'\r\n   * joinPathWithoutLeadingSlash('a', 'b') => 'a/b'\r\n   */\r\n  static joinPathWithoutLeadingSlash(...paths: string[]): string {\r\n    const result = this.join(...paths);\r\n    return this.removeLeadingSlash(result);\r\n  }\r\n\r\n  /**\r\n   * 移除路徑開頭的斜線\r\n   * @param path 路徑\r\n   * @returns 移除開頭斜線後的路徑\r\n   * @example\r\n   * removeLeadingSlash('/abc/def') => 'abc/def'\r\n   * removeLeadingSlash('abc/def') => 'abc/def'\r\n   */\r\n  static removeLeadingSlash(path: string): string {\r\n    if (!path) return '';\r\n    return path.startsWith(this.slashSymbol) ? path.substring(1) : path;\r\n  }\r\n\r\n  /**\r\n   * 移除路徑結尾的斜線\r\n   * @param path 路徑\r\n   * @returns 移除結尾斜線後的路徑\r\n   * @example\r\n   * removeTrailingSlash('abc/def/') => 'abc/def'\r\n   * removeTrailingSlash('abc/def') => 'abc/def'\r\n   */\r\n  static removeTrailingSlash(path: string): string {\r\n    if (!path || path.length === 0) return '';\r\n    return path.endsWith(this.slashSymbol) ? path.substring(0, path.length - 1) : path;\r\n  }\r\n\r\n  /**\r\n   * 移除路徑開頭和結尾的斜線\r\n   * @param path 路徑\r\n   * @returns 移除開頭和結尾斜線後的路徑\r\n   * @example\r\n   * trimSlashes('/abc/def/') => 'abc/def'\r\n   * trimSlashes('abc/def') => 'abc/def'\r\n   */\r\n  static trimSlashes(path: string): string {\r\n    if (!path) return '';\r\n    return this.removeTrailingSlash(this.removeLeadingSlash(path));\r\n  }\r\n\r\n  /**\r\n   * 移除路徑中重複的斜線\r\n   * @param path 路徑\r\n   * @returns 移除重複斜線後的路徑\r\n   * @example\r\n   * removeDoubleSlashes('a//b///c') => 'a/b/c'\r\n   * removeDoubleSlashes('/a//b/') => '/a/b/'\r\n   * removeDoubleSlashes('http://example.com//api') => 'http://example.com/api'\r\n   */\r\n  static removeDoubleSlashes(path: string): string {\r\n    if (!path) return '';\r\n\r\n    // 檢測 URL 協議（如 http://, https://, ftp:// 等）\r\n    const protocolMatch = path.match(/^([a-zA-Z][a-zA-Z0-9+.-]*:\\/\\/)/);\r\n    let protocol = '';\r\n    let pathWithoutProtocol = path;\r\n\r\n    if (protocolMatch) {\r\n      protocol = protocolMatch[1];\r\n      pathWithoutProtocol = path.substring(protocol.length);\r\n    }\r\n\r\n    // 移除路徑部分的重複斜線\r\n    while (/\\/\\//g.test(pathWithoutProtocol)) {\r\n      pathWithoutProtocol = pathWithoutProtocol.replace(/\\/\\//g, this.slashSymbol);\r\n    }\r\n\r\n    return protocol + pathWithoutProtocol;\r\n  }\r\n\r\n  /**\r\n   * 正規化路徑\r\n   * @param path 路徑\r\n   * @param options 選項\r\n   * @param options.leadingSlash 是否保留開頭斜線，預設 true\r\n   * @param options.trailingSlash 是否保留結尾斜線，預設 false\r\n   * @returns 正規化後的路徑\r\n   * @example\r\n   * normalizePath('//a//b//c//') => '/a/b/c'\r\n   * normalizePath('//a//b//c//', { leadingSlash: false }) => 'a/b/c'\r\n   * normalizePath('//a//b//c//', { trailingSlash: true }) => '/a/b/c/'\r\n   */\r\n  static normalizePath(\r\n    path: string,\r\n    options: { leadingSlash?: boolean; trailingSlash?: boolean } = {}\r\n  ): string {\r\n    if (!path) return '';\r\n\r\n    const { leadingSlash = true, trailingSlash = false } = options;\r\n\r\n    // 移除重複斜線\r\n    path = this.removeDoubleSlashes(path);\r\n\r\n    // 處理開頭斜線\r\n    const hasLeadingSlash = path.startsWith(this.slashSymbol);\r\n    if (leadingSlash && !hasLeadingSlash) {\r\n      path = this.slashSymbol + path;\r\n    } else if (!leadingSlash && hasLeadingSlash) {\r\n      path = this.removeLeadingSlash(path);\r\n    }\r\n\r\n    // 處理結尾斜線\r\n    const hasTrailingSlash = path.endsWith(this.slashSymbol);\r\n    if (trailingSlash && !hasTrailingSlash && path !== this.slashSymbol) {\r\n      path = path + this.slashSymbol;\r\n    } else if (!trailingSlash && hasTrailingSlash) {\r\n      path = this.removeTrailingSlash(path);\r\n    }\r\n\r\n    return path;\r\n  }\r\n\r\n  /**\r\n   * 確保路徑有開頭斜線\r\n   * @param path 路徑\r\n   * @returns 有開頭斜線的路徑\r\n   * @example\r\n   * ensureLeadingSlash('abc/def') => '/abc/def'\r\n   * ensureLeadingSlash('/abc/def') => '/abc/def'\r\n   */\r\n  static ensureLeadingSlash(path: string): string {\r\n    if (!path) return this.slashSymbol;\r\n    return path.startsWith(this.slashSymbol) ? path : this.slashSymbol + path;\r\n  }\r\n\r\n  /**\r\n   * 確保路徑有結尾斜線\r\n   * @param path 路徑\r\n   * @returns 有結尾斜線的路徑\r\n   * @example\r\n   * ensureTrailingSlash('abc/def') => 'abc/def/'\r\n   * ensureTrailingSlash('abc/def/') => 'abc/def/'\r\n   */\r\n  static ensureTrailingSlash(path: string): string {\r\n    if (!path) return this.slashSymbol;\r\n    return path.endsWith(this.slashSymbol) ? path : path + this.slashSymbol;\r\n  }\r\n}\r\n","import { CurrentUser } from \"../../current-user/current-user\";\r\n\r\n/** 外掛模組:用來存放當前登入者的資訊 */\r\nexport class Settings {\r\n  /** 使用者資訊 */\r\n  public static get UserInfo(): UofxUserProfileModel {\r\n    const info = CurrentUser.Profile\r\n    return {\r\n      account: info.account,\r\n      name: info.name,\r\n      corpId: info.corpId,\r\n      corpName: info.corpName,\r\n      corpCode: info.signinPathCode,\r\n      culture: info.culture\r\n    };\r\n  }\r\n}\r\n\r\n/** 使用者基本資訊 */\r\ninterface UofxUserProfileModel {\r\n  /** 帳號 */\r\n  account: string;\r\n  /** 姓名 */\r\n  name: string;\r\n  /** 公司 Id */\r\n  corpId: string;\r\n  /** 公司名稱 */\r\n  corpName: string;\r\n  /** 公司代號 */\r\n  corpCode: string;\r\n  /** 語系 */\r\n  culture: string;\r\n}\r\n","export class ExceptionModel {\r\n\r\n  time: Date;\r\n  message;\r\n  type: string;\r\n  url: string;\r\n  eventId: string;\r\n\r\n  constructor(type: string, message, eventId?: string) {\r\n    this.type = type;\r\n    this.message = message;\r\n    this.url = window.location.href;\r\n    this.eventId = eventId;\r\n    this.time = new Date();\r\n  }\r\n}\r\n\r\nexport enum ErrorType {\r\n  /** 未分類的錯誤 */\r\n  Msic = 'Msic',\r\n  /** 無狀態的錯誤 */\r\n  NoStatus = 'NoStatus',\r\n  /** 500 錯誤 */\r\n  Exception = 'Exception',\r\n  /** 400 未知的錯誤 */\r\n  Unknown = 'Unknown',\r\n  /** 400 商業邏輯錯誤 */\r\n  DidBadRequest = 'DidBadRequest',\r\n  /** 400 後端 Model 驗證錯誤 */\r\n  InvalidModelState = 'InvalidModelState'\r\n}\r\n\r\n/** Msic Error Code */\r\nexport enum MsicErrorCode {\r\n  /** 逾時 */\r\n  NetworkTimeout,\r\n  /** 離線 */\r\n  ClientNetworkOffline,\r\n  /** ServerCORS */\r\n  ServerCORSNotEnabled,\r\n  /** 未預期的錯誤 */\r\n  Unknown\r\n}\r\n\r\n/** 錯誤訊息 model */\r\nexport interface ErrorMessageModel {\r\n  /** 類型 */\r\n  type: ErrorType;\r\n  /** 多重商業邏輯錯誤 */\r\n  codes: Array<string>;\r\n  /** 進階商業邏輯錯誤 */\r\n  moreErrors?: Array<ErrorExModel>;\r\n  /** 錯誤代碼(全域錯誤處理，商業邏輯並不會有此類型) */\r\n  code: string | MsicErrorCode;\r\n  /** 錯誤訊息(全域錯誤處理，商業邏輯並不會有此類型) */\r\n  message: string;\r\n  /** event ID，可以透過ID查詢Log得知錯誤原因*/\r\n  errorId?: string;\r\n}\r\n\r\n/** 額外的錯誤訊息 */\r\nexport interface ErrorExModel {\r\n  /** 錯誤代碼 */\r\n  error: string;\r\n  expandoObject;\r\n}\r\n\r\n/** 帶有額外資訊的警告 */\r\nexport interface WarningExModel {\r\n  /** 警告代碼 */\r\n  warning: string;\r\n  /** 額外資訊 */\r\n  expandoObject: any;\r\n}\r\n\r\nexport interface FormDirtyConfirm {\r\n  /** 實作 Form 是否 Dirty 的判斷，設定為 true，離開前會出現提示 */\r\n  isFormDirty(): boolean;\r\n}\r\n\r\nexport interface UofCanUnload {\r\n  /** 此 function 提供給 before-unload.decorator.ts 使用 */\r\n  uofCanUnload(): boolean;\r\n}\r\n\r\n/**\r\n * AES加密的key & iv model\r\n * -\r\n * key & iv若會用來跟後端互相傳遞，需做RSA加密\r\n */\r\nexport interface AesModel {\r\n  /** aes的key */\r\n  encAesKey: string;\r\n  /** aes的iv */\r\n  encAesIv: string;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport * as _ from 'lodash';\r\n\r\n/**\r\n * 啟用 Array.prototype 的 Lodash 擴充方法\r\n * 讓陣列可以直接使用 lodash 方法，如 `users._sortBy('age')._take(5)`\r\n *\r\n * 注意：此擴充只包含原生 Array 沒有的方法，避免重複：\r\n * - 原生已有：filter, map, find, findIndex, reverse, flat, flatMap, includes, every, some, reduce, reduceRight, forEach, slice, concat, join\r\n * - 此擴充提供：_sortBy, _orderBy, _uniq, _uniqBy, _groupBy, _keyBy, _take, _drop, _chunk, _compact, _flatten, _flattenDeep, _shuffle, _sampleSize, _difference, _intersection, _union, _pluck, _findLast, _sumBy, _meanBy, _maxBy, _minBy, _countBy, _partition, _first, _last, _nth, _sample\r\n *\r\n * @example\r\n * ```typescript\r\n * import { enableArrayExpand } from '@uofx/core';\r\n *\r\n * // 在 app 初始化時呼叫一次\r\n * enableArrayExpand();\r\n *\r\n * // 之後可直接使用\r\n * const result = [1, 2, 3, 4, 5]\r\n *   .filter(x => x > 2)   // 原生 filter\r\n *   .map(x => x * 2)      // 原生 map\r\n *   ._take(2);            // lodash take\r\n *\r\n * // 物件陣列\r\n * const names = users\r\n *   ._sortBy('age')\r\n *   .filter(u => u.active)\r\n *   ._pluck('name');\r\n * ```\r\n */\r\nexport function enableArrayExpand(): void {\r\n  const proto = Array.prototype as any;\r\n\r\n  // ==================== Collection Methods ====================\r\n\r\n  if (!proto._sortBy) {\r\n    Object.defineProperty(proto, '_sortBy', {\r\n      value: function <T, K>(this: T[], iteratees: ((value: T) => K) | keyof T | Array<((value: T) => K) | keyof T>): T[] {\r\n        return _.sortBy(this, iteratees as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._orderBy) {\r\n    Object.defineProperty(proto, '_orderBy', {\r\n      value: function <T, K>(this: T[], iteratees: Array<((value: T) => K) | keyof T>, orders?: Array<'asc' | 'desc'>): T[] {\r\n        return _.orderBy(this, iteratees as any, orders);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._uniq) {\r\n    Object.defineProperty(proto, '_uniq', {\r\n      value: function <T>(this: T[]): T[] { return _.uniq(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._uniqBy) {\r\n    Object.defineProperty(proto, '_uniqBy', {\r\n      value: function <T, K>(this: T[], iteratee: ((value: T) => K) | keyof T): T[] {\r\n        return _.uniqBy(this, iteratee as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._groupBy) {\r\n    Object.defineProperty(proto, '_groupBy', {\r\n      value: function <T, K extends string | number>(this: T[], iteratee: ((value: T) => K) | keyof T): Record<K, T[]> {\r\n        return _.groupBy(this, iteratee as any) as Record<K, T[]>;\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._keyBy) {\r\n    Object.defineProperty(proto, '_keyBy', {\r\n      value: function <T, K extends string | number>(this: T[], iteratee: ((value: T) => K) | keyof T): Record<K, T> {\r\n        return _.keyBy(this, iteratee as any) as Record<K, T>;\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._take) {\r\n    Object.defineProperty(proto, '_take', {\r\n      value: function <T>(this: T[], n: number): T[] { return _.take(this, n); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._takeRight) {\r\n    Object.defineProperty(proto, '_takeRight', {\r\n      value: function <T>(this: T[], n: number): T[] { return _.takeRight(this, n); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._drop) {\r\n    Object.defineProperty(proto, '_drop', {\r\n      value: function <T>(this: T[], n: number): T[] { return _.drop(this, n); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._dropRight) {\r\n    Object.defineProperty(proto, '_dropRight', {\r\n      value: function <T>(this: T[], n: number): T[] { return _.dropRight(this, n); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._chunk) {\r\n    Object.defineProperty(proto, '_chunk', {\r\n      value: function <T>(this: T[], size: number): T[][] { return _.chunk(this, size); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._compact) {\r\n    Object.defineProperty(proto, '_compact', {\r\n      value: function <T>(this: T[]): NonNullable<T>[] { return _.compact(this) as NonNullable<T>[]; },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._flatten) {\r\n    Object.defineProperty(proto, '_flatten', {\r\n      value: function <T>(this: T[]): any[] { return _.flatten(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._flattenDeep) {\r\n    Object.defineProperty(proto, '_flattenDeep', {\r\n      value: function <T>(this: T[]): any[] { return _.flattenDeep(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._shuffle) {\r\n    Object.defineProperty(proto, '_shuffle', {\r\n      value: function <T>(this: T[]): T[] { return _.shuffle(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._sampleSize) {\r\n    Object.defineProperty(proto, '_sampleSize', {\r\n      value: function <T>(this: T[], n: number): T[] { return _.sampleSize(this, n); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._difference) {\r\n    Object.defineProperty(proto, '_difference', {\r\n      value: function <T>(this: T[], ...arrays: T[][]): T[] { return _.difference(this, ...arrays); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._differenceBy) {\r\n    Object.defineProperty(proto, '_differenceBy', {\r\n      value: function <T, K>(this: T[], array: T[], iteratee: ((value: T) => K) | keyof T): T[] {\r\n        return _.differenceBy(this, array, iteratee as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._intersection) {\r\n    Object.defineProperty(proto, '_intersection', {\r\n      value: function <T>(this: T[], ...arrays: T[][]): T[] { return _.intersection(this, ...arrays); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._union) {\r\n    Object.defineProperty(proto, '_union', {\r\n      value: function <T>(this: T[], ...arrays: T[][]): T[] { return _.union(this, ...arrays); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._pluck) {\r\n    Object.defineProperty(proto, '_pluck', {\r\n      value: function <T, K extends keyof T>(this: T[], key: K): T[K][] { return _.map(this, key); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  // ==================== Search Methods ====================\r\n\r\n  if (!proto._findLast) {\r\n    Object.defineProperty(proto, '_findLast', {\r\n      value: function <T>(this: T[], predicate: (value: T, index: number, array: T[]) => boolean): T | undefined {\r\n        return _.findLast(this, predicate);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  // ==================== Aggregation Methods ====================\r\n\r\n  if (!proto._sumBy) {\r\n    Object.defineProperty(proto, '_sumBy', {\r\n      value: function <T>(this: T[], iteratee: ((value: T) => number) | keyof T): number {\r\n        return _.sumBy(this, iteratee as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._meanBy) {\r\n    Object.defineProperty(proto, '_meanBy', {\r\n      value: function <T>(this: T[], iteratee: ((value: T) => number) | keyof T): number {\r\n        return _.meanBy(this, iteratee as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._maxBy) {\r\n    Object.defineProperty(proto, '_maxBy', {\r\n      value: function <T>(this: T[], iteratee: ((value: T) => number) | keyof T): T | undefined {\r\n        return _.maxBy(this, iteratee as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._minBy) {\r\n    Object.defineProperty(proto, '_minBy', {\r\n      value: function <T>(this: T[], iteratee: ((value: T) => number) | keyof T): T | undefined {\r\n        return _.minBy(this, iteratee as any);\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._countBy) {\r\n    Object.defineProperty(proto, '_countBy', {\r\n      value: function <T, K extends string | number>(this: T[], iteratee?: ((value: T) => K) | keyof T): Record<K, number> {\r\n        return _.countBy(this, iteratee as any) as Record<K, number>;\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._partition) {\r\n    Object.defineProperty(proto, '_partition', {\r\n      value: function <T>(this: T[], predicate: (value: T, index: number, array: T[]) => boolean): [T[], T[]] {\r\n        return _.partition(this, predicate) as [T[], T[]];\r\n      },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  // ==================== Utility Methods ====================\r\n\r\n  if (!proto._first) {\r\n    Object.defineProperty(proto, '_first', {\r\n      value: function <T>(this: T[]): T | undefined { return _.first(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._last) {\r\n    Object.defineProperty(proto, '_last', {\r\n      value: function <T>(this: T[]): T | undefined { return _.last(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._nth) {\r\n    Object.defineProperty(proto, '_nth', {\r\n      value: function <T>(this: T[], n: number): T | undefined { return _.nth(this, n); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n\r\n  if (!proto._sample) {\r\n    Object.defineProperty(proto, '_sample', {\r\n      value: function <T>(this: T[]): T | undefined { return _.sample(this); },\r\n      writable: false, enumerable: false, configurable: true\r\n    });\r\n  }\r\n}\r\n\r\n// TypeScript 型別擴充宣告\r\ndeclare global {\r\n  interface Array<T> {\r\n    // Collection Methods\r\n    /** Lodash sortBy - 排序 */\r\n    _sortBy<K>(iteratees: ((value: T) => K) | keyof T | Array<((value: T) => K) | keyof T>): T[];\r\n    /** Lodash orderBy - 多欄位排序 */\r\n    _orderBy<K>(iteratees: Array<((value: T) => K) | keyof T>, orders?: Array<'asc' | 'desc'>): T[];\r\n    /** Lodash uniq - 去除重複元素 */\r\n    _uniq(): T[];\r\n    /** Lodash uniqBy - 根據迭代器去除重複元素 */\r\n    _uniqBy<K>(iteratee: ((value: T) => K) | keyof T): T[];\r\n    /** Lodash groupBy - 分組 */\r\n    _groupBy<K extends string | number>(iteratee: ((value: T) => K) | keyof T): Record<K, T[]>;\r\n    /** Lodash keyBy - 建立鍵值對物件 */\r\n    _keyBy<K extends string | number>(iteratee: ((value: T) => K) | keyof T): Record<K, T>;\r\n    /** Lodash take - 取得前 n 個元素 */\r\n    _take(n: number): T[];\r\n    /** Lodash takeRight - 取得後 n 個元素 */\r\n    _takeRight(n: number): T[];\r\n    /** Lodash drop - 跳過前 n 個元素 */\r\n    _drop(n: number): T[];\r\n    /** Lodash dropRight - 跳過後 n 個元素 */\r\n    _dropRight(n: number): T[];\r\n    /** Lodash chunk - 分割成指定大小的區塊 */\r\n    _chunk(size: number): T[][];\r\n    /** Lodash compact - 移除 falsy 值 */\r\n    _compact(): NonNullable<T>[];\r\n    /** Lodash flatten - 攤平陣列一層 */\r\n    _flatten<U = T extends (infer R)[] ? R : T>(): U[];\r\n    /** Lodash flattenDeep - 深度攤平陣列 */\r\n    _flattenDeep<U = T>(): U[];\r\n    /** Lodash shuffle - 隨機打亂陣列 */\r\n    _shuffle(): T[];\r\n    /** Lodash sampleSize - 隨機取樣多個 */\r\n    _sampleSize(n: number): T[];\r\n    /** Lodash difference - 差集 */\r\n    _difference(...arrays: T[][]): T[];\r\n    /** Lodash differenceBy - 根據迭代器計算差集 */\r\n    _differenceBy<K>(array: T[], iteratee: ((value: T) => K) | keyof T): T[];\r\n    /** Lodash intersection - 交集 */\r\n    _intersection(...arrays: T[][]): T[];\r\n    /** Lodash union - 聯集 */\r\n    _union(...arrays: T[][]): T[];\r\n    /** 根據屬性路徑提取值 */\r\n    _pluck<K extends keyof T>(key: K): T[K][];\r\n\r\n    // Search Methods\r\n    /** Lodash findLast - 尋找符合條件的最後一個元素 */\r\n    _findLast(predicate: (value: T, index: number, array: T[]) => boolean): T | undefined;\r\n\r\n    // Aggregation Methods\r\n    /** Lodash sumBy - 根據迭代器計算總和 */\r\n    _sumBy(iteratee: ((value: T) => number) | keyof T): number;\r\n    /** Lodash meanBy - 根據迭代器計算平均值 */\r\n    _meanBy(iteratee: ((value: T) => number) | keyof T): number;\r\n    /** Lodash maxBy - 根據迭代器取得最大值 */\r\n    _maxBy(iteratee: ((value: T) => number) | keyof T): T | undefined;\r\n    /** Lodash minBy - 根據迭代器取得最小值 */\r\n    _minBy(iteratee: ((value: T) => number) | keyof T): T | undefined;\r\n    /** Lodash countBy - 計數 */\r\n    _countBy<K extends string | number>(iteratee?: ((value: T) => K) | keyof T): Record<K, number>;\r\n    /** Lodash partition - 根據條件分割成兩組 */\r\n    _partition(predicate: (value: T, index: number, array: T[]) => boolean): [T[], T[]];\r\n\r\n    // Utility Methods\r\n    /** Lodash first - 取得第一個元素 */\r\n    _first(): T | undefined;\r\n    /** Lodash last - 取得最後一個元素 */\r\n    _last(): T | undefined;\r\n    /** Lodash nth - 取得第 n 個元素 */\r\n    _nth(n: number): T | undefined;\r\n    /** Lodash sample - 隨機取樣 */\r\n    _sample(): T | undefined;\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.UofxAuthGuardService","i2"],"mappings":"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"}