@tapsellorg/angular-material-library
Version:
Angular library for Tapsell
1 lines • 74 kB
Source Map (JSON)
{"version":3,"file":"tapsellorg-angular-material-library-src-lib-common.mjs","sources":["../../projects/pegah-library/src/lib/common/array-join/array-join.pipe.ts","../../projects/pegah-library/src/lib/common/replace-with/replace-with.pipe.ts","../../projects/pegah-library/src/lib/common/replace-with/replace-with.module.ts","../../projects/pegah-library/src/lib/common/array-join/array-join.module.ts","../../projects/pegah-library/src/lib/common/array-split/array-split.pipe.ts","../../projects/pegah-library/src/lib/common/array-split/array-split.module.ts","../../projects/pegah-library/src/lib/common/utils/string.utils.ts","../../projects/pegah-library/src/lib/common/utils/array.utils.ts","../../projects/pegah-library/src/lib/common/utils/misc.utils.ts","../../projects/pegah-library/src/lib/common/utils/file.utils.ts","../../projects/pegah-library/src/lib/common/utils/object.utils.ts","../../projects/pegah-library/src/lib/common/utils/observed-property-decorator.ts","../../projects/pegah-library/src/lib/common/utils/component-mixins.ts","../../projects/pegah-library/src/lib/common/utils/debounce-decorator.ts","../../projects/pegah-library/src/lib/common/safe/safe.pipe.ts","../../projects/pegah-library/src/lib/common/short-number/short-number.pipe.ts","../../projects/pegah-library/src/lib/common/safe/safe.module.ts","../../projects/pegah-library/src/lib/common/enum-to-array/enum-to-array.pipe.ts","../../projects/pegah-library/src/lib/common/enum-to-array/enum-to-array.module.ts","../../projects/pegah-library/src/lib/common/short-number/short-number.module.ts","../../projects/pegah-library/src/lib/common/error-handler/config.ts","../../projects/pegah-library/src/lib/common/error-handler/error-handler.service.ts","../../projects/pegah-library/src/lib/common/error-handler/error-handler.interceptor.ts","../../projects/pegah-library/src/lib/common/trailing-slash-interceptor/trailing-slash.interceptor.ts","../../projects/pegah-library/src/lib/common/cache-interceptor/config.ts","../../projects/pegah-library/src/lib/common/cache-interceptor/cache-controller.service.ts","../../projects/pegah-library/src/lib/common/cache-interceptor/cache.interceptor.ts","../../projects/pegah-library/src/lib/common/tab-title/token.ts","../../projects/pegah-library/src/lib/common/tab-title/tab-title.service.ts","../../projects/pegah-library/src/lib/common/material-global-options/material-global-options.ts","../../projects/pegah-library/src/lib/common/storage/storage-factory.ts","../../projects/pegah-library/src/lib/common/utils/url.utils.ts","../../projects/pegah-library/src/lib/common/dark-mode/dark-mode.service.ts","../../projects/pegah-library/src/lib/common/automatic-inner-outer-link/automatic-inner-outer-link.directive.ts","../../projects/pegah-library/src/lib/common/automatic-inner-outer-link/automatic-inner-outer-link.module.ts","../../projects/pegah-library/src/lib/common/tapsellorg-angular-material-library-src-lib-common.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'pghArrayJoin',\n pure: true,\n standalone: false,\n})\nexport class PghArrayJoinPipe implements PipeTransform {\n transform(value: any[], customField?: string | number | null, joinWith: string = ','): string {\n if (!value) return '';\n if (!Array.isArray(value)) {\n throw new Error('pghArrayJoin: value is not an array');\n }\n return (value ?? [])\n .filter(v => !!v)\n .map(v => (customField ? v[customField] : v))\n .filter(v => !!v)\n .join(`${joinWith} `);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'pghReplaceWith',\n standalone: false,\n})\nexport class PghReplaceWithPipe implements PipeTransform {\n transform(\n value: string | boolean | undefined | number,\n dictionary: Map<string | boolean | undefined | number, string>,\n ): string {\n return (dictionary.get(value) as string) ?? 'تعریف نشده';\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghReplaceWithPipe } from './replace-with.pipe';\n\n@NgModule({\n declarations: [PghReplaceWithPipe],\n imports: [CommonModule],\n exports: [PghReplaceWithPipe],\n})\nexport class PghReplaceWithModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghArrayJoinPipe } from './array-join.pipe';\n\n@NgModule({\n declarations: [PghArrayJoinPipe],\n exports: [PghArrayJoinPipe],\n imports: [CommonModule],\n})\nexport class PghArrayJoinModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'pghArraySplit',\n pure: true,\n standalone: false,\n})\nexport class PghArraySplitPipe implements PipeTransform {\n transform(value: string, splitBy: string = ''): any[] {\n if (typeof value !== 'string') {\n throw new Error('pghArraySplit: value is not a string');\n }\n return (value ?? '').split(splitBy);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghArraySplitPipe } from './array-split.pipe';\n\n@NgModule({\n declarations: [PghArraySplitPipe],\n imports: [CommonModule],\n exports: [PghArraySplitPipe],\n})\nexport class PghArraySplitModule {}\n","// @dynamic\nexport class StringUtils {\n static copyToClipboard(str: string) {\n const el = document.createElement('textarea');\n el.value = str;\n el.setAttribute('readonly', '');\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.append(el);\n el.select();\n document.execCommand('copy');\n el.remove();\n }\n\n private static engNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n private static perNumbers = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];\n static convertPersianNumbersToEnglish(theText: string) {\n return this.stringReplaceBulk(theText, StringUtils.perNumbers, StringUtils.engNumbers);\n }\n\n static convertEnglishNumbersToPersian(theText: string) {\n return this.stringReplaceBulk(theText, StringUtils.engNumbers, StringUtils.perNumbers);\n }\n\n static convertToTwoCharactersNumber = (num: number) =>\n num.toString().length < 2 ? `0${num}` : num;\n\n static stringReplaceBulk(\n str: string | undefined | null,\n findArray: string[],\n replaceArray: (string | number)[],\n ) {\n if (!str) return '';\n const regex: string[] = [];\n const map: any = {};\n findArray.forEach((fItem, index) => {\n regex.push(fItem.replace(/([#$()*+,.?[\\\\\\]^{|}-])/g, '\\\\$1'));\n map[fItem] = replaceArray[index];\n });\n const regexStr = regex.join('|');\n str = str.replace(new RegExp(regexStr, 'g'), matched => map[matched] as string);\n return str;\n }\n\n static persianNimFasele() {\n return ''; // nim fasele dare!\n }\n\n static capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static getNameTwoLettersAbbr(\n firstName: string | undefined,\n lastName: string | undefined,\n username: string,\n ): string {\n return (\n firstName\n ? `${firstName.charAt(0)}`\n : lastName\n ? `${lastName.charAt(0)}`\n : `${username.charAt(0)}`\n ).toUpperCase();\n }\n\n static splitColumnedTextToObj<T extends Record<string, true>>(\n text: string | undefined,\n ): Partial<T> {\n if (!text) return {};\n return text.split(':').reduce<Partial<T>>((result, key) => ({ ...result, [key]: true }), {});\n }\n}\n","class ArrayUtilsClass {\n removeDuplicates<T>(array: T[], uniqueBy: (item: T) => number | string | boolean) {\n const uniqueIds = Array.from(new Set(array.map(uniqueBy)));\n\n return array.filter(s => {\n const index = uniqueIds.findIndex(type => uniqueBy(s) === type);\n if (index !== -1) {\n uniqueIds.splice(index, 1);\n return true;\n }\n return false;\n });\n }\n arraysAreSame(arr1: any[], arr2: any[]): boolean {\n if (arr1 === arr2) return true;\n if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;\n if (arr1.length !== arr2.length) return false;\n\n const sortedArr1 = arr1.concat().sort();\n const sortedArr2 = arr2.concat().sort();\n\n return sortedArr1.every((_x, i) => sortedArr1[i] === sortedArr2[i]);\n }\n convertArrayToKeyValue<T extends any, V extends any>(\n arr: T[],\n keyGetter: (x: T) => string,\n valueGetter: (x: T) => V,\n ): Record<string, V> {\n return arr.reduce<Record<string, any>>((res, x) => {\n const key = keyGetter(x);\n const value = valueGetter(x);\n return { ...res, [key]: value };\n }, {});\n }\n\n searchStringInArray<T>(\n array: T[],\n _term: string,\n valueFunc: (x: T) => string | number | null | undefined,\n ): T[] {\n const term = _term ? _term.toLowerCase().replace(/\\s+/g, ' ') : '';\n return array.filter(item =>\n (valueFunc(item) ?? '').toString().toLowerCase().replace(/\\s+/g, ' ').includes(term),\n );\n }\n}\n\nexport const ArrayUtils = new ArrayUtilsClass();\n","export class MiscUtils {\n private static colorsTheme: { primary?: string; accent?: string } = {};\n\n static readonly ALL_MATERIAL_COLORS = [\n 'var(--red)',\n 'var(--green)',\n 'var(--blue)',\n 'var(--orange)',\n 'var(--purple)',\n 'var(--pink)',\n 'var(--teal)',\n 'var(--yellow)',\n 'var(--brown)',\n 'var(--lime)',\n 'var(--cyan)',\n ];\n static readonly RANDOM_COLORS = [\n '#9966cc',\n '#800000',\n '#c95911',\n '#4169e1',\n '#1a9c8c',\n '#cea100',\n '#006400',\n '#ff69b4',\n '#003366',\n '#d52f12',\n '#e75480',\n '#36454f',\n '#279a13',\n '#999225',\n '#f88379',\n '#a78500',\n '#66023c',\n '#36454f',\n '#8f8b66',\n '#008080',\n '#cd7f32',\n '#b38b6d',\n '#612302',\n ];\n static getThemeColor(type: 'primary' | 'accent'): string {\n return `var(--${type})`;\n }\n}\n","export class FileUtils {\n // static retrieveImageBase64(file: File) {\n // const reader = new FileReader();\n // reader.readAsDataURL(file);\n // reader.onload = () => {\n // const base64 = reader.result as string;\n // };\n // reader.onerror = error => {};\n // }\n\n static defaultFilename = 'tapsell-file';\n\n static async urlToFile(url: string, filename?: string) {\n const res = await fetch(url);\n const blob = await res.blob();\n return new File([blob], filename || this.defaultFilename, { type: blob.type });\n }\n\n private static base64ToBlob(file: string) {\n // Split into two parts\n const parts = file.split(';base64,');\n // Hold the content type\n const imageType = parts[0].split(':')[1];\n // Decode Base64 string\n const decodedData = window.atob(parts[1]);\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length);\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i);\n }\n // Return BLOB image after conversion\n return new Blob([uInt8Array], { type: imageType });\n }\n\n static base64ToFile(file: string, filename?: string) {\n const blob = FileUtils.base64ToBlob(file);\n return new File([blob], filename || this.defaultFilename, { type: blob.type });\n }\n\n static blobToFile(blob: Blob, filename?: string) {\n return new File([blob], filename || this.defaultFilename, { type: blob.type });\n }\n\n static fileOrBlobToBase64(file: File | Blob | undefined) {\n if (!file) return;\n return new Promise<string>((resolve, _) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(file);\n });\n }\n\n static fileNameExtension(fileName: string): string {\n return fileName.split('.').pop() ?? '';\n }\n\n static convertFileListToArray(_files: FileList) {\n const files: File[] = [];\n for (let i = 0; i < _files.length; i++) {\n const file = _files[i];\n files.push(file);\n }\n return files;\n }\n\n static downloadFile(file: File) {\n const urlCreator = window.URL || window.webkitURL,\n link = document.createElement('a'),\n url = urlCreator.createObjectURL(file);\n\n link.setAttribute('download', file.name);\n link.setAttribute('href', url);\n document.body.appendChild(link);\n\n link.click();\n link.remove();\n urlCreator.revokeObjectURL(url);\n }\n}\n","export type AnyObject = Record<string, any>;\n\nclass ObjectUtilsClass {\n convertObjToArrValues<T>(obj: Record<string, T>) {\n return Object.keys(obj).map(key => obj[key]);\n }\n convertObjToArrKeyValue<T>(obj: Record<string, T>) {\n return Object.keys(obj).map(key => ({ key, value: obj[key] }));\n }\n\n cloneObjWithKeys<T extends AnyObject>(obj: T, keys: (keyof T)[]) {\n return keys.reduce((res, k) => ({ ...res, [k]: obj[k] }), {});\n }\n\n removeNullKeysFromObject<T extends AnyObject>(obj: T) {\n return this.objectFilter(obj, (key, value) => value == null);\n }\n\n objectFilter<T extends AnyObject>(obj: T, keyFilterer: (key: keyof T, value: any) => boolean) {\n Object.keys(obj).forEach(key => {\n if (keyFilterer(key, obj[key])) {\n delete obj[key];\n }\n });\n return obj;\n }\n\n isObject(item: any) {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n\n /**\n * Deep merge two objects.\n */\n mergeDeep(target: AnyObject, ...sources: AnyObject[]): AnyObject {\n if (!sources.length) return target;\n const source = sources.shift() ?? ({} as AnyObject);\n\n if (ObjectUtils.isObject(target) && ObjectUtils.isObject(source)) {\n Object.keys(source).forEach(key => {\n if (ObjectUtils.isObject(source[key])) {\n if (!target[key]) {\n target[key] = {};\n }\n ObjectUtils.mergeDeep(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n });\n }\n\n return ObjectUtils.mergeDeep(target, ...sources);\n }\n\n isEqualObject(obj1: AnyObject, obj2: AnyObject): boolean {\n if (!ObjectUtils.isObject(obj1) || !ObjectUtils.isObject(obj2)) return false;\n if (Object.keys(obj1).length !== Object.keys(obj2).length) return false;\n\n return Object.keys(obj1).every(key => obj1[key] === obj2[key]);\n }\n}\n\nexport const ObjectUtils = new ObjectUtilsClass();\n","import { startWith } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\n/**\n * @deprecated Use BehaviorSubject instead. Use its `.next()` and `.value`\n * @param obs\n * @constructor\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function ObservedBy(obs: string) {\n return function (target: any, propertyName: string) {\n let store: Subject<any> = target[propertyName];\n\n const setter = (newVal: any) => {\n store = newVal;\n (target[`_${obs}`] as Subject<any>).next(newVal);\n };\n\n delete target[propertyName];\n // if (delete target[propertyName]) {\n // Create new property with getter and setter\n Object.defineProperty(target, propertyName, {\n get: () => store,\n set: setter,\n enumerable: true,\n configurable: true,\n });\n // }\n };\n}\n\n/**\n * @deprecated Use BehaviorSubject instead. Use its `.next()` and `.value`\n * @param store\n * @constructor\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function Observing(store: string) {\n return function (target: any, propertyName: string) {\n let subject: Subject<any> = target[propertyName] || new Subject<any>();\n\n if (delete target[propertyName]) {\n // observable (getter)\n Object.defineProperty(target, propertyName, {\n get: () => subject.pipe(startWith(target[store])),\n set: () => {},\n enumerable: true,\n configurable: true,\n });\n // Subject\n Object.defineProperty(target, `_${propertyName}`, {\n get: () => subject,\n set: _subject => {\n subject = _subject;\n },\n enumerable: true,\n configurable: true,\n });\n }\n };\n}\n","import { Subject } from 'rxjs';\nimport { OnDestroy } from '@angular/core';\n\ntype Constructor<T = {}> = new (...args: any[]) => T;\n\nexport function withDestroy<T extends Constructor>(base: T = class {} as any) {\n return class extends base implements OnDestroy {\n _destroyed$ = new Subject();\n ngOnDestroy() {\n this._destroyed$.next(undefined);\n this._destroyed$.complete();\n }\n };\n}\n","/**\n * Debounce a method\n */\n\nexport function pghDebounceTime(ms: number) {\n return function (target: any, key: any, descriptor: any) {\n const map = new WeakMap();\n const originalMethod = descriptor.value;\n\n descriptor.value = function () {\n let debounced = map.get(this);\n if (!debounced) {\n debounced = debounceFn(() => originalMethod.apply(this, arguments), ms);\n map.set(this, debounced);\n }\n debounced();\n };\n return descriptor;\n };\n}\n\nconst debounceFn = (func: Function, ms: number) => {\n let timeout: number;\n\n return function () {\n clearTimeout(timeout);\n timeout = window.setTimeout(func, ms);\n };\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport {\n DomSanitizer,\n SafeHtml,\n SafeStyle,\n SafeScript,\n SafeUrl,\n SafeResourceUrl,\n} from '@angular/platform-browser';\n\n@Pipe({\n name: 'pghSafe',\n pure: true,\n standalone: false,\n})\nexport class PghSafePipe implements PipeTransform {\n constructor(private readonly sanitizer: DomSanitizer) {}\n\n transform(\n value: string,\n type: 'html' | 'style' | 'script' | 'url' | 'resourceUrl',\n ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\n switch (type) {\n case 'html':\n return this.sanitizer.bypassSecurityTrustHtml(value);\n case 'style':\n return this.sanitizer.bypassSecurityTrustStyle(value);\n case 'script':\n return this.sanitizer.bypassSecurityTrustScript(value);\n case 'url':\n return this.sanitizer.bypassSecurityTrustUrl(value);\n case 'resourceUrl':\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\n default:\n throw new Error(`Invalid safe type: ${type}`);\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'pghShortNumber',\n standalone: false,\n})\nexport class PghShortNumberPipe implements PipeTransform {\n transform(number: number, args?: any): any {\n if (isNaN(number)) return null;\n if (number === null) return null;\n if (number === 0) return 0;\n\n const isNegative = number < 0;\n if (isNegative) number = number * -1;\n\n const suffixes = ['', 'K', 'M', 'B', 'T', 'Q'];\n\n const exp = Math.floor(Math.log(number) / Math.log(1000));\n return (isNegative ? '-' : '') + (number / Math.pow(1000, exp)).toFixed(args) + suffixes[exp];\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghSafePipe } from './safe.pipe';\n\n@NgModule({\n declarations: [PghSafePipe],\n imports: [CommonModule],\n exports: [PghSafePipe],\n})\nexport class PghSafeModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'pghEnumToArray',\n standalone: false,\n})\nexport class PghEnumToArrayPipe<D> implements PipeTransform {\n transform(object: Record<string, D>): { key: string; value: D }[] {\n return Object.keys(object)\n .filter(key => isNaN(+key))\n .map(key => ({ key: key, value: object[key] }));\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghEnumToArrayPipe } from './enum-to-array.pipe';\n\n@NgModule({\n declarations: [PghEnumToArrayPipe],\n imports: [CommonModule],\n exports: [PghEnumToArrayPipe],\n})\nexport class PghEnumToArrayModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghShortNumberPipe } from './short-number.pipe';\n\n@NgModule({\n declarations: [PghShortNumberPipe],\n imports: [CommonModule],\n exports: [PghShortNumberPipe],\n})\nexport class PghShortNumberModule {}\n","import { InjectionToken } from '@angular/core';\nimport { PghErrorHandler } from './model';\n\nexport const PGH_ERROR_HANDLER_OPTIONS = new InjectionToken<PghErrorHandler<Record<string, any>>>(\n 'PGH_ERROR_DEFINER',\n {\n providedIn: 'root',\n factory: () => ({ SERVER_ERRORS: [], UNHANDLED_ERROR_MESSAGE: 'یک خطای ناشناخته رخ داده است' }),\n },\n);\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ErrorToastMessageGetter, PghErrorHandler, PghErrorHandlerResult } from './model';\nimport { PGH_ERROR_HANDLER_OPTIONS } from './config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PghErrorHandlerService {\n private static isHttpErrorResponse(error: any): error is HttpErrorResponse {\n return error instanceof HttpErrorResponse || (error.error && typeof error.status === 'number');\n }\n private static getToastMessageOfErrorDef(\n textOrFunc: string | ErrorToastMessageGetter<any> | undefined | null,\n response: HttpErrorResponse,\n ) {\n return (\n textOrFunc &&\n (typeof textOrFunc === 'string' ? textOrFunc : textOrFunc(response.error, response))\n );\n }\n\n constructor(\n private router: Router,\n @Inject(PGH_ERROR_HANDLER_OPTIONS) private errorDefiner: PghErrorHandler<any>,\n ) {}\n\n handleError(response: HttpErrorResponse): PghErrorHandlerResult {\n if (!PghErrorHandlerService.isHttpErrorResponse(response)) {\n return { isHandled: false, message: this.errorDefiner.UNHANDLED_ERROR_MESSAGE };\n }\n\n const errorDef = this.matchErrorDefinition(response);\n let message: string | undefined;\n\n if (errorDef) {\n const errorToastMessage = PghErrorHandlerService.getToastMessageOfErrorDef(\n errorDef.message,\n response,\n );\n\n if (errorToastMessage) {\n message = errorToastMessage;\n }\n errorDef.callback?.(response.error, response);\n\n return { isHandled: errorDef.isHandled, message, action: errorDef.action };\n }\n\n message = this.errorDefiner.UNHANDLED_ERROR_MESSAGE;\n return { isHandled: false, message };\n }\n\n private matchErrorDefinition(response: HttpErrorResponse) {\n return this.errorDefiner.SERVER_ERRORS.find(\n ({ condition }) =>\n (condition.status == null || condition.status === response.status) &&\n (condition.pathEndsWith == null || response.url?.endsWith(condition.pathEndsWith)) &&\n (condition.response == null ||\n Object.keys(condition.response).every(\n k => response.error[k] === condition.response?.[k],\n )) &&\n (condition.custom == null || condition.custom(response.error, response)),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n} from '@angular/common/http';\nimport { EMPTY, Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { PghErrorHandlerService } from './error-handler.service';\nimport { PghNotifService } from '@tapsellorg/angular-material-library/notif';\n\n@Injectable()\nexport class PghErrorHandlerInterceptor implements HttpInterceptor {\n constructor(\n private pghErrorHandlerService: PghErrorHandlerService,\n private pghNotifService: PghNotifService,\n ) {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n catchError((response: HttpErrorResponse) => {\n const { isHandled, message, action } = this.pghErrorHandlerService.handleError(response);\n if (message) {\n const snack = this.pghNotifService.error(message, { action: action?.buttonName });\n if (action?.afterClick) {\n snack.onAction().subscribe(() => action!.afterClick!(response.error, response));\n }\n }\n if (isHandled) {\n return EMPTY;\n }\n return throwError(response);\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class PghTrailingSlashInterceptor implements HttpInterceptor {\n private static isSlashNeeded(request: HttpRequest<unknown>) {\n return (\n request.url.endsWith('/') || request.url.includes('?') || request.url.match(/\\.[\\w\\d]+$/)\n );\n }\n\n constructor() {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n return PghTrailingSlashInterceptor.isSlashNeeded(request)\n ? next.handle(request)\n : next.handle(request.clone({ url: `${request.url}/` }));\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { PghCacheInterceptorOptions } from './models';\n\nexport const PGH_CACHE_INTERCEPTOR_OPTIONS = new InjectionToken<PghCacheInterceptorOptions>(\n 'PGH_CACHE_INTERCEPTOR_OPTIONS',\n {\n providedIn: 'root',\n factory: () => ({}),\n },\n);\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CacheControllerService {\n clearCache$ = new Subject<unknown>();\n constructor() {}\n clearAllCache() {\n this.clearCache$.next(null);\n }\n}\n","import {\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n HttpResponse,\n} from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { tap, finalize, share } from 'rxjs/operators';\nimport { PGH_CACHE_INTERCEPTOR_OPTIONS } from './config';\nimport { PghCacheInterceptorOptions } from './models';\nimport { CacheControllerService } from './cache-controller.service';\n\n@Injectable()\nexport class CacheInterceptor implements HttpInterceptor {\n readonly CACHE_EXPIRE_TIME = 5 * 60 * 1000;\n readonly cachedResponses = new Map<\n string,\n { response: HttpResponse<unknown>; savedTime: number }\n >();\n readonly pendingRequests = new Map<string, Observable<HttpEvent<unknown>>>();\n\n constructor(\n @Inject(PGH_CACHE_INTERCEPTOR_OPTIONS) private options: PghCacheInterceptorOptions,\n private cacheControllerService: CacheControllerService,\n ) {\n this.cacheControllerService.clearCache$.subscribe(() => {\n this.cachedResponses.clear();\n });\n }\n\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (\n !this.options.forceEnableCacheIf?.(req) &&\n (req.method !== 'GET' || this.options.disableCacheIf?.(req))\n ) {\n return next.handle(req);\n }\n\n // Check if there is a pending response for this request\n const cachedObservable = this.pendingRequests.get(req.urlWithParams);\n if (cachedObservable) {\n return cachedObservable;\n }\n\n // Check if there is a cached response for this request\n const cachedResponse = this.cachedResponses.get(req.urlWithParams);\n if (cachedResponse && cachedResponse.savedTime < Date.now() - this.CACHE_EXPIRE_TIME) {\n return of(cachedResponse.response.clone());\n }\n\n const sharedReqObservable = next.handle(req).pipe(\n tap(event => {\n if (event instanceof HttpResponse) {\n this.cachedResponses.set(req.urlWithParams, {\n response: event.clone(),\n savedTime: Date.now(),\n });\n }\n }),\n finalize(() => {\n this.pendingRequests.delete(req.urlWithParams);\n }),\n share(),\n );\n\n this.pendingRequests.set(req.urlWithParams, sharedReqObservable);\n\n return sharedReqObservable;\n }\n}\n\n// TODO: expire cache after 5 minutes\n","import { InjectionToken } from '@angular/core';\n\nexport const PGH_PRODUCT_TITLE = new InjectionToken<string>('PGH_PRODUCT_TITLE', {\n providedIn: 'root',\n factory: () => 'tapsell',\n});\n","import { Injectable, Inject } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { mergeMap, map, filter } from 'rxjs/operators';\nimport { PGH_PRODUCT_TITLE } from './token';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PghTabTitleService {\n constructor(\n private titleService: Title,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n @Inject(PGH_PRODUCT_TITLE) private PRODUCT_TITLE: string,\n ) {\n this.setupAllPageTitle();\n }\n\n public setupAllPageTitle(): void {\n this.router.events\n .pipe(\n filter(event => event instanceof NavigationEnd),\n map(() => this.activatedRoute),\n map(route => {\n while (route.firstChild) route = route.firstChild;\n return route;\n }),\n filter(route => route.outlet === 'primary'),\n mergeMap(route => route.data),\n )\n\n .subscribe(({ title }) => {\n this.setTitle(title);\n });\n }\n\n setTitle(title: string) {\n const currentTitle: string = `${title} - ${this.PRODUCT_TITLE}`;\n this.titleService.setTitle(title ? currentTitle : this.PRODUCT_TITLE);\n }\n}\n","import { MAT_RIPPLE_GLOBAL_OPTIONS, RippleGlobalOptions } from '@angular/material/core';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';\nimport { DEFAULT_CURRENCY_CODE, LOCALE_ID } from '@angular/core';\nimport { MAT_TABS_CONFIG, MatTabsConfig } from '@angular/material/tabs';\nimport { MAT_RADIO_DEFAULT_OPTIONS, MatRadioDefaultOptions } from '@angular/material/radio';\nimport {\n MAT_CHECKBOX_DEFAULT_OPTIONS,\n MatCheckboxDefaultOptions,\n} from '@angular/material/checkbox';\nimport { MAT_SNACK_BAR_DEFAULT_OPTIONS, MatSnackBarConfig } from '@angular/material/snack-bar';\nimport {\n MAT_PAGINATOR_DEFAULT_OPTIONS,\n MatPaginatorDefaultOptions,\n} from '@angular/material/paginator';\n\nexport const PGH_MAT_GLOBAL_OPTIONS = [\n { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { appearance: 'outline' } },\n { provide: LOCALE_ID, useValue: 'fa-IR' },\n { provide: DEFAULT_CURRENCY_CODE, useValue: 'IRR' },\n {\n provide: MAT_TABS_CONFIG,\n useValue: { animationDuration: '0ms' } as MatTabsConfig,\n },\n {\n provide: MAT_RADIO_DEFAULT_OPTIONS,\n useValue: { color: 'primary' } as MatRadioDefaultOptions,\n },\n {\n provide: MAT_CHECKBOX_DEFAULT_OPTIONS,\n useValue: { color: 'primary' } as MatCheckboxDefaultOptions,\n },\n {\n provide: MAT_SNACK_BAR_DEFAULT_OPTIONS,\n useValue: {\n duration: 3000,\n direction: 'rtl',\n horizontalPosition: 'start',\n } as MatSnackBarConfig,\n },\n {\n provide: MAT_RIPPLE_GLOBAL_OPTIONS,\n useValue: { animation: { enterDuration: 150, exitDuration: 100 } } as RippleGlobalOptions,\n },\n {\n provide: MAT_PAGINATOR_DEFAULT_OPTIONS,\n useValue: {\n pageSizeOptions: [15, 25, 50, 100],\n showFirstLastButtons: true,\n pageSize: 25,\n } as MatPaginatorDefaultOptions,\n },\n];\n","import { PghStorageFactoryModel } from './models';\n\n// @dynamic\nexport class PghStorageFactory implements PghStorageFactoryModel {\n storage?: PghStorageFactoryModel;\n static readonly KEY_PREFIX = '_pgh-';\n inMemoryStorage: Record<string, string> = {};\n\n constructor(getStorage?: () => PghStorageFactoryModel) {\n this.storage = getStorage?.();\n this.checkStorageSupport();\n }\n\n static localStorageFactory = () => {\n try {\n return new PghStorageFactory(() => localStorage);\n } catch (e) {\n return new PghStorageFactory();\n }\n };\n\n private checkStorageSupport() {\n if (!this.storage) return;\n\n try {\n const testKey = '__pgh_rand__';\n this.storage.setItem(testKey, testKey);\n this.storage.removeItem(testKey);\n } catch (_) {\n this.storage = undefined;\n }\n }\n\n clear(): void {\n if (this.storage) {\n this.storage.clear();\n } else {\n this.inMemoryStorage = {};\n }\n }\n\n private static getPrefixedName(name: string) {\n return `${PghStorageFactory.KEY_PREFIX}${name}`;\n }\n getItem(name: string): string | null {\n if (this.storage) {\n const prefixedName = PghStorageFactory.getPrefixedName(name);\n return this.storage.getItem(prefixedName);\n }\n if (this.inMemoryStorage.hasOwnProperty(name)) {\n return this.inMemoryStorage[name];\n }\n return null;\n }\n\n key(index: number): string | null {\n if (this.storage) {\n return this.storage.key(index);\n } else {\n return Object.keys(this.inMemoryStorage)[index] || null;\n }\n }\n\n removeItem(name: string): void {\n if (this.storage) {\n const prefixedName = PghStorageFactory.getPrefixedName(name);\n this.storage.removeItem(prefixedName);\n } else {\n delete this.inMemoryStorage[name];\n }\n }\n\n setItem(name: string, value: string): void {\n if (this.storage) {\n const prefixedName = PghStorageFactory.getPrefixedName(name);\n this.storage.setItem(prefixedName, value);\n } else {\n this.inMemoryStorage[name] = String(value); // not everyone uses TypeScript\n }\n }\n\n get length(): number {\n if (this.storage) {\n return this.storage.length;\n } else {\n return Object.keys(this.inMemoryStorage).length;\n }\n }\n}\n","// @dynamic\n\nimport { Router } from '@angular/router';\n\nexport class UrlUtils {\n private static concatTwoPaths(path1: string | number = '', path2: string | number = '') {\n path1 = (path1 || '').toString();\n path2 = (path2 || '').toString();\n path1 = this.removeTrailingSlashes(path1);\n path2 = this.removeTrailingSlashes(path2);\n\n let result = path2 ? `${path1}/${path2}` : `${path1}`;\n // result = result.replace(/\\/\\//g, '/');\n result = this.removeTrailingSlashes(result);\n return result;\n }\n static concatPaths(...paths: (string | number | undefined)[]): string {\n return paths.reduce<string>((res, p) => UrlUtils.concatTwoPaths(res, p), '');\n }\n\n static removeTrailingSlashes(path: string): string {\n return (path || '').replace(/^\\/+|\\/+$/g, '');\n }\n\n static mergeParamsToUrl(url: string, params: Record<string, string>): string {\n const urlObject = new URL(url);\n const urlParams = urlObject.searchParams;\n Object.keys(params).forEach(k => {\n urlParams.set(k, params[k]);\n });\n return urlObject.toString();\n }\n\n static removeOrigin(url: string): string {\n const matchProtocolDomainHost = /^[a-zA-Z]{3,5}\\:\\/{2}[a-zA-Z0-9_.:-]+\\//;\n return url.replace(matchProtocolDomainHost, '');\n }\n\n static removeQueryParams(router: Router, paramsToRemove: string[]): void {\n const url = new URL(location.href);\n const params: Record<string, string> = {};\n\n url.searchParams.forEach((value, key) => {\n if (!paramsToRemove.includes(key)) params[key] = value;\n });\n\n // `[url.pathname]` is used instead of `[]` because when the function is executing,\n // the navigation is not complete yet, and we will always end up in the root path.\n // So, we have to manually provide the path data.\n router.navigate([url.pathname], { queryParams: params });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { PghStorageFactory } from '../storage/storage-factory';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PghDarkModeService {\n private readonly isEnabledStorageKey = 'IS_DARK_MODE_ENABLED';\n private readonly htmlElement: HTMLHtmlElement = document.getElementsByTagName('html')[0];\n private localStorageFactory = PghStorageFactory.localStorageFactory();\n isDarkModeEnabled = false;\n\n constructor() {\n this.setupDarkModeToggle();\n }\n\n private setupDarkModeToggle() {\n const isDarkModeEnabled = this.getDarkModeEnabled();\n this.setDarkMode(isDarkModeEnabled, { store: false });\n }\n\n private getUserDevicePreference(): boolean {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n private getDarkModeEnabled() {\n const isStorageDarkModeEnabled = this.localStorageFactory.getItem(this.isEnabledStorageKey);\n\n return isStorageDarkModeEnabled == null\n ? this.getUserDevicePreference()\n : isStorageDarkModeEnabled === 'true';\n }\n\n toggleDarkMode() {\n this.setDarkMode(!this.isDarkModeEnabled);\n }\n\n private setDarkMode(isDarkModeEnabled: boolean, { store } = { store: true }) {\n this.isDarkModeEnabled = isDarkModeEnabled;\n\n if (store) {\n this.storeDarkModeInStorage();\n }\n this.enableDarkTheme();\n }\n\n private storeDarkModeInStorage() {\n this.localStorageFactory.setItem(\n this.isEnabledStorageKey,\n this.isDarkModeEnabled ? 'true' : 'false',\n );\n }\n\n private enableDarkTheme() {\n this.htmlElement.setAttribute('dark', `${this.isDarkModeEnabled}`);\n }\n}\n","import { Directive, ElementRef, HostListener } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { UrlUtils } from '../utils/url.utils';\n\n@Directive({\n selector: 'a[pghAutomaticInnerOuterLink]',\n standalone: false,\n})\nexport class PghAutomaticInnerOuterLinkDirective {\n constructor(private router: Router, private elementRef: ElementRef<HTMLAnchorElement>) {}\n\n @HostListener('click', ['$event'])\n onLinkClick(event: MouseEvent) {\n event.preventDefault();\n const { href } = this.elementRef.nativeElement;\n if (!href) return;\n\n const hostName = this.elementRef.nativeElement.hostname;\n const isInternalLink = hostName === window.location.hostname;\n\n if (isInternalLink) {\n const url = UrlUtils.removeOrigin(href);\n this.router.navigateByUrl(url).then();\n } else {\n window.open(href, '_blank');\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PghAutomaticInnerOuterLinkDirective } from './automatic-inner-outer-link.directive';\n\n@NgModule({\n declarations: [PghAutomaticInnerOuterLinkDirective],\n imports: [CommonModule],\n exports: [PghAutomaticInnerOuterLinkDirective],\n})\nexport class PghAutomaticInnerOuterLinkModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.PghErrorHandlerService","i2","i1.CacheControllerService","i1"],"mappings":"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