@shival99/z-ui 1.8.13 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/assets/css/tailwind.css +7 -11
  2. package/fesm2022/shival99-z-ui-components-z-autocomplete.mjs +45 -71
  3. package/fesm2022/shival99-z-ui-components-z-autocomplete.mjs.map +1 -1
  4. package/fesm2022/shival99-z-ui-components-z-button.mjs +21 -11
  5. package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -1
  6. package/fesm2022/shival99-z-ui-components-z-calendar.mjs +61 -32
  7. package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
  8. package/fesm2022/shival99-z-ui-components-z-card.mjs +1 -1
  9. package/fesm2022/shival99-z-ui-components-z-card.mjs.map +1 -1
  10. package/fesm2022/shival99-z-ui-components-z-chat.mjs +429 -0
  11. package/fesm2022/shival99-z-ui-components-z-chat.mjs.map +1 -0
  12. package/fesm2022/shival99-z-ui-components-z-checkbox.mjs +1 -1
  13. package/fesm2022/shival99-z-ui-components-z-checkbox.mjs.map +1 -1
  14. package/fesm2022/shival99-z-ui-components-z-code.mjs +51 -21
  15. package/fesm2022/shival99-z-ui-components-z-code.mjs.map +1 -1
  16. package/fesm2022/shival99-z-ui-components-z-drawer.mjs +8 -3
  17. package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -1
  18. package/fesm2022/shival99-z-ui-components-z-editor.mjs +3 -3
  19. package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -1
  20. package/fesm2022/shival99-z-ui-components-z-empty.mjs.map +1 -1
  21. package/fesm2022/shival99-z-ui-components-z-filter.mjs +3 -3
  22. package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -1
  23. package/fesm2022/shival99-z-ui-components-z-gallery.mjs +169 -90
  24. package/fesm2022/shival99-z-ui-components-z-gallery.mjs.map +1 -1
  25. package/fesm2022/shival99-z-ui-components-z-icon.mjs +143 -360
  26. package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -1
  27. package/fesm2022/shival99-z-ui-components-z-input.mjs +131 -8
  28. package/fesm2022/shival99-z-ui-components-z-input.mjs.map +1 -1
  29. package/fesm2022/shival99-z-ui-components-z-loading.mjs +2 -2
  30. package/fesm2022/shival99-z-ui-components-z-loading.mjs.map +1 -1
  31. package/fesm2022/shival99-z-ui-components-z-menu.mjs +2 -2
  32. package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -1
  33. package/fesm2022/shival99-z-ui-components-z-modal.mjs +8 -3
  34. package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -1
  35. package/fesm2022/shival99-z-ui-components-z-pagination.mjs +1 -1
  36. package/fesm2022/shival99-z-ui-components-z-pagination.mjs.map +1 -1
  37. package/fesm2022/shival99-z-ui-components-z-popover.mjs +3 -3
  38. package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -1
  39. package/fesm2022/shival99-z-ui-components-z-select.mjs +31 -7
  40. package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -1
  41. package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +3 -3
  42. package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -1
  43. package/fesm2022/shival99-z-ui-components-z-steps.mjs +31 -29
  44. package/fesm2022/shival99-z-ui-components-z-steps.mjs.map +1 -1
  45. package/fesm2022/shival99-z-ui-components-z-switch.mjs +131 -15
  46. package/fesm2022/shival99-z-ui-components-z-switch.mjs.map +1 -1
  47. package/fesm2022/shival99-z-ui-components-z-table.mjs +57 -13
  48. package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -1
  49. package/fesm2022/shival99-z-ui-components-z-tabs.mjs +6 -6
  50. package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -1
  51. package/fesm2022/shival99-z-ui-components-z-tags.mjs +1 -1
  52. package/fesm2022/shival99-z-ui-components-z-tags.mjs.map +1 -1
  53. package/fesm2022/shival99-z-ui-components-z-timeline.mjs +6 -6
  54. package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -1
  55. package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +4 -4
  56. package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -1
  57. package/fesm2022/shival99-z-ui-components-z-upload.mjs +5 -4
  58. package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -1
  59. package/fesm2022/shival99-z-ui-i18n.mjs +12 -0
  60. package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -1
  61. package/fesm2022/shival99-z-ui-pipes.mjs +18 -0
  62. package/fesm2022/shival99-z-ui-pipes.mjs.map +1 -1
  63. package/fesm2022/shival99-z-ui-providers.mjs +30 -13
  64. package/fesm2022/shival99-z-ui-providers.mjs.map +1 -1
  65. package/fesm2022/shival99-z-ui-services.mjs +53 -29
  66. package/fesm2022/shival99-z-ui-services.mjs.map +1 -1
  67. package/fesm2022/z-ui.mjs +0 -4
  68. package/fesm2022/z-ui.mjs.map +1 -1
  69. package/package.json +6 -1
  70. package/types/shival99-z-ui-components-z-autocomplete.d.ts +25 -38
  71. package/types/shival99-z-ui-components-z-breadcrumb.d.ts +4 -4
  72. package/types/shival99-z-ui-components-z-button.d.ts +5 -4
  73. package/types/shival99-z-ui-components-z-chat.d.ts +148 -0
  74. package/types/shival99-z-ui-components-z-drawer.d.ts +3 -1
  75. package/types/shival99-z-ui-components-z-dropdown-menu.d.ts +2 -2
  76. package/types/shival99-z-ui-components-z-empty.d.ts +3 -3
  77. package/types/shival99-z-ui-components-z-filter.d.ts +2 -2
  78. package/types/shival99-z-ui-components-z-gallery.d.ts +6 -3
  79. package/types/shival99-z-ui-components-z-icon.d.ts +18 -304
  80. package/types/shival99-z-ui-components-z-input.d.ts +42 -1
  81. package/types/shival99-z-ui-components-z-modal.d.ts +4 -2
  82. package/types/shival99-z-ui-components-z-select.d.ts +5 -2
  83. package/types/shival99-z-ui-components-z-steps.d.ts +4 -4
  84. package/types/shival99-z-ui-components-z-switch.d.ts +25 -4
  85. package/types/shival99-z-ui-components-z-table.d.ts +2 -0
  86. package/types/shival99-z-ui-pipes.d.ts +2 -0
  87. package/types/shival99-z-ui-providers.d.ts +10 -16
  88. package/types/shival99-z-ui-services.d.ts +6 -1
  89. package/types/z-ui.d.ts +1 -2
@@ -4,8 +4,7 @@ import { provideEnvironmentNgxMask } from 'ngx-mask';
4
4
  import { provideScrollbarOptions } from 'ngx-scrollbar';
5
5
  import { HttpClient } from '@angular/common/http';
6
6
  import { TranslateService, provideTranslateService, TranslateLoader } from '@ngx-translate/core';
7
- import { Z_UI_TRANSLATIONS } from '@shival99/z-ui/i18n';
8
- import { of, forkJoin, map, firstValueFrom } from 'rxjs';
7
+ import { of, from, forkJoin, map, firstValueFrom } from 'rxjs';
9
8
  import { catchError } from 'rxjs/operators';
10
9
 
11
10
  /** Injection token for ZCacheService configuration */
@@ -146,20 +145,40 @@ function provideZTheme(config = {}) {
146
145
  }
147
146
 
148
147
  /* eslint-disable @stylistic/indent */
148
+ const DEFAULT_LANG = 'en';
149
+ const zuiTranslationsPromiseCache = new Map();
150
+ async function zLoadDefaultZUITranslations(lang) {
151
+ const module = await import('@shival99/z-ui/i18n');
152
+ return module.getZUITranslations(lang) ?? module.getZUITranslations(DEFAULT_LANG);
153
+ }
149
154
  class ZTranslateHttpLoader {
150
155
  _http;
151
156
  _prefix;
152
157
  _suffix;
153
158
  _includeZUI;
154
159
  _zuiOverridePath;
155
- _customZUI;
156
- constructor(_http, _prefix, _suffix, _includeZUI, _zuiOverridePath, _customZUI) {
160
+ _zuiLoader;
161
+ constructor(_http, _prefix, _suffix, _includeZUI, _zuiOverridePath, _zuiLoader = zLoadDefaultZUITranslations) {
157
162
  this._http = _http;
158
163
  this._prefix = _prefix;
159
164
  this._suffix = _suffix;
160
165
  this._includeZUI = _includeZUI;
161
166
  this._zuiOverridePath = _zuiOverridePath;
162
- this._customZUI = _customZUI;
167
+ this._zuiLoader = _zuiLoader;
168
+ }
169
+ _loadZUITranslations(lang) {
170
+ const cached = zuiTranslationsPromiseCache.get(lang);
171
+ if (cached) {
172
+ return cached;
173
+ }
174
+ const loadPromise = this._zuiLoader(lang).catch(async () => {
175
+ if (lang === DEFAULT_LANG) {
176
+ return {};
177
+ }
178
+ return this._zuiLoader(DEFAULT_LANG).catch(() => ({}));
179
+ });
180
+ zuiTranslationsPromiseCache.set(lang, loadPromise);
181
+ return loadPromise;
163
182
  }
164
183
  getTranslation(lang) {
165
184
  const userTranslations$ = this._http
@@ -168,23 +187,21 @@ class ZTranslateHttpLoader {
168
187
  if (!this._includeZUI) {
169
188
  return userTranslations$;
170
189
  }
171
- const zuiDefaults = Z_UI_TRANSLATIONS[lang] ?? Z_UI_TRANSLATIONS['en'] ?? {};
190
+ const zuiDefaults$ = from(this._loadZUITranslations(lang)).pipe(catchError(() => of({})));
172
191
  const zuiFileOverrides$ = this._zuiOverridePath
173
192
  ? this._http
174
193
  .get(`${this._zuiOverridePath}${lang}${this._suffix}`)
175
194
  .pipe(catchError(() => of({})))
176
195
  : of({});
177
- const inlineOverrides = this._customZUI?.[lang] ?? {};
178
- return forkJoin([of(zuiDefaults), zuiFileOverrides$, userTranslations$]).pipe(map(([defaults, fileOverrides, user]) => ({
196
+ return forkJoin([zuiDefaults$, zuiFileOverrides$, userTranslations$]).pipe(map(([defaults, fileOverrides, user]) => ({
179
197
  ...defaults,
180
198
  ...fileOverrides,
181
- ...inlineOverrides,
182
199
  ...user,
183
200
  })));
184
201
  }
185
202
  }
186
- function zCreateTranslateLoader(http, path = './assets/i18n/', extension = '.json', includeZUI = true, zuiOverridePath, customZUI) {
187
- return new ZTranslateHttpLoader(http, path, extension, includeZUI, zuiOverridePath, customZUI);
203
+ function zCreateTranslateLoader(http, path = './assets/i18n/', extension = '.json', includeZUI = true, zuiOverridePath, zuiLoader = zLoadDefaultZUITranslations) {
204
+ return new ZTranslateHttpLoader(http, path, extension, includeZUI, zuiOverridePath, zuiLoader);
188
205
  }
189
206
  function initializeTranslate(defaultLang) {
190
207
  const translate = inject(TranslateService);
@@ -193,13 +210,13 @@ function initializeTranslate(defaultLang) {
193
210
  return firstValueFrom(translate.use(savedLang));
194
211
  }
195
212
  function provideZTranslate(config = {}) {
196
- const { defaultLang = 'vi', translationPath = './assets/i18n/', fileExtension = '.json', includeZUITranslations = true, zuiOverridePath, customZUITranslations, } = config;
213
+ const { defaultLang = 'vi', translationPath = './assets/i18n/', fileExtension = '.json', includeZUITranslations = true, zuiOverridePath, zuiTranslationsLoader = zLoadDefaultZUITranslations, } = config;
197
214
  return makeEnvironmentProviders([
198
215
  provideTranslateService({
199
216
  fallbackLang: defaultLang,
200
217
  loader: {
201
218
  provide: TranslateLoader,
202
- useFactory: (http) => zCreateTranslateLoader(http, translationPath, fileExtension, includeZUITranslations, zuiOverridePath, customZUITranslations),
219
+ useFactory: (http) => zCreateTranslateLoader(http, translationPath, fileExtension, includeZUITranslations, zuiOverridePath, zuiTranslationsLoader),
203
220
  deps: [HttpClient],
204
221
  },
205
222
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"shival99-z-ui-providers.mjs","sources":["../../../../libs/core-ui/providers/z-cache.provider.ts","../../../../libs/core-ui/providers/z-indexdb.provider.ts","../../../../libs/core-ui/providers/z-ngx-mask.provider.ts","../../../../libs/core-ui/providers/z-scrollbar.provider.ts","../../../../libs/core-ui/providers/z-theme.provider.ts","../../../../libs/core-ui/providers/z-translate.provider.ts","../../../../libs/core-ui/providers/types/z-ngx-mask.types.ts","../../../../libs/core-ui/providers/shival99-z-ui-providers.ts"],"sourcesContent":["import {\n type EnvironmentProviders,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { type ZCacheConfig, ZCacheService } from '@shival99/z-ui/services';\n\n/** Injection token for ZCacheService configuration */\nexport const Z_CACHE_CONFIG = new InjectionToken<ZCacheConfig>('Z_CACHE_CONFIG');\n\n/**\n * Provide Z-Cache service with configuration\n * @param config - Cache configuration with prefix and encrypt options\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZCache({\n * prefix: 'myapp_',\n * encrypt: false, // Disable encryption for debugging\n * }),\n * ],\n * };\n * ```\n */\nexport function provideZCache(config: ZCacheConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: Z_CACHE_CONFIG,\n useValue: config,\n },\n provideEnvironmentInitializer(() => {\n const cacheConfig = inject(Z_CACHE_CONFIG);\n ZCacheService.configure(cacheConfig);\n }),\n ]);\n}\n","import { type EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { type ZIndexDbConfig, ZIndexDbService } from '@shival99/z-ui/services';\n\n/** Injection token for ZIndexDbService */\nexport const Z_INDEXDB_SERVICE = new InjectionToken<ZIndexDbService>('ZIndexDbService');\n\n/**\n * Provide Z-IndexDB service with configuration\n * @param config - IndexDB configuration with multi-store support\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZIndexDb({\n * dbName: 'MyApp',\n * version: 1,\n * stores: [\n * { name: 'cache', encrypt: true },\n * { name: 'userData', encrypt: true, protectedKeys: ['profile'] },\n * { name: 'settings', encrypt: false },\n * ],\n * defaultStore: 'cache',\n * protectedKeys: ['token'],\n * }),\n * ],\n * };\n * ```\n */\nexport function provideZIndexDb(config: ZIndexDbConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: Z_INDEXDB_SERVICE,\n useFactory: () => new ZIndexDbService(config),\n },\n {\n provide: ZIndexDbService,\n useExisting: Z_INDEXDB_SERVICE,\n },\n ]);\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { ZCacheService } from '@shival99/z-ui/services';\nimport { provideEnvironmentNgxMask } from 'ngx-mask';\nimport type { ZNgxMaskConfig } from './types/z-ngx-mask.types';\n\nconst LANG_CACHE_KEY = 'Z_LANGUAGE';\n\n/**\n * Get locale-specific mask configuration\n */\nfunction getMaskConfig(lang: string, config: ZNgxMaskConfig = {}) {\n const isVietnamese = lang === 'vi';\n\n return {\n validation: config.validation ?? true,\n thousandSeparator: isVietnamese ? ',' : '.',\n decimalMarker: (isVietnamese ? '.' : ',') as '.' | ',',\n allowNegativeNumbers: config.allowNegativeNumbers ?? true,\n };\n}\n\n/**\n * Provide Z-NgxMask with locale-aware configuration\n * @param config - Mask configuration\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZNgxMask({ lang: 'vi' }),\n * ],\n * };\n * ```\n */\nexport function provideZNgxMask(config: ZNgxMaskConfig = {}): EnvironmentProviders {\n const savedLang = typeof window !== 'undefined' ? ZCacheService.get<string>(LANG_CACHE_KEY) : null;\n const lang = config.lang ?? savedLang ?? 'vi';\n const maskConfig = getMaskConfig(lang, config);\n\n return makeEnvironmentProviders([provideEnvironmentNgxMask(maskConfig)]);\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideScrollbarOptions } from 'ngx-scrollbar';\n\n/**\n * Provides global scrollbar options for ngx-scrollbar\n * Use this in app.config.ts: providers: [provideZScrollbar()]\n */\nexport function provideZScrollbar(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideScrollbarOptions({\n visibility: 'hover',\n appearance: 'compact',\n withButtons: false,\n sensorThrottleTime: 200,\n }),\n ]);\n}\n","import { makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\nimport { type ZThemeConfig, Z_THEME_CONFIG } from '@shival99/z-ui/services';\n\n/**\n * Provide theme configuration for the application\n * @param config - Theme configuration with defaultTheme and defaultDarkMode\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZTheme({ defaultTheme: 'hospital', defaultDarkMode: false })\n * ]\n * };\n * ```\n */\nexport function provideZTheme(config: ZThemeConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: Z_THEME_CONFIG, useValue: config }]);\n}\n","/* eslint-disable @stylistic/indent */\nimport { HttpClient } from '@angular/common/http';\nimport { inject, makeEnvironmentProviders, provideAppInitializer, type EnvironmentProviders } from '@angular/core';\nimport {\n provideTranslateService,\n TranslateLoader,\n TranslateService,\n type TranslationObject,\n} from '@ngx-translate/core';\nimport { Z_UI_TRANSLATIONS, type ZUITranslations } from '@shival99/z-ui/i18n';\nimport { Z_LANG_CACHE_KEY, ZCacheService } from '@shival99/z-ui/services';\nimport { firstValueFrom, forkJoin, map, type Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport type { ZTranslateProviderConfig } from './types/z-translate.types';\n\nclass ZTranslateHttpLoader implements TranslateLoader {\n public constructor(\n private readonly _http: HttpClient,\n private readonly _prefix: string,\n private readonly _suffix: string,\n private readonly _includeZUI: boolean,\n private readonly _zuiOverridePath?: string,\n private readonly _customZUI?: Partial<Record<string, ZUITranslations>>\n ) {}\n\n public getTranslation(lang: string): Observable<TranslationObject> {\n const userTranslations$ = this._http\n .get<TranslationObject>(`${this._prefix}${lang}${this._suffix}`)\n .pipe(catchError(() => of({} as TranslationObject)));\n\n if (!this._includeZUI) {\n return userTranslations$;\n }\n\n const zuiDefaults = Z_UI_TRANSLATIONS[lang] ?? Z_UI_TRANSLATIONS['en'] ?? {};\n const zuiFileOverrides$ = this._zuiOverridePath\n ? this._http\n .get<ZUITranslations>(`${this._zuiOverridePath}${lang}${this._suffix}`)\n .pipe(catchError(() => of({} as ZUITranslations)))\n : of({} as ZUITranslations);\n\n const inlineOverrides = this._customZUI?.[lang] ?? {};\n\n return forkJoin([of(zuiDefaults), zuiFileOverrides$, userTranslations$]).pipe(\n map(\n ([defaults, fileOverrides, user]) =>\n ({\n ...defaults,\n ...fileOverrides,\n ...inlineOverrides,\n ...(user as Record<string, unknown>),\n }) as TranslationObject\n )\n );\n }\n}\n\nexport function zCreateTranslateLoader(\n http: HttpClient,\n path = './assets/i18n/',\n extension = '.json',\n includeZUI = true,\n zuiOverridePath?: string,\n customZUI?: Partial<Record<string, ZUITranslations>>\n): TranslateLoader {\n return new ZTranslateHttpLoader(http, path, extension, includeZUI, zuiOverridePath, customZUI);\n}\n\nfunction initializeTranslate(defaultLang: string): Promise<unknown> {\n const translate = inject(TranslateService);\n const savedLang = ZCacheService.get<string>(Z_LANG_CACHE_KEY) ?? defaultLang;\n translate.setFallbackLang(defaultLang);\n return firstValueFrom(translate.use(savedLang));\n}\n\nexport function provideZTranslate(config: ZTranslateProviderConfig = {}): EnvironmentProviders {\n const {\n defaultLang = 'vi',\n translationPath = './assets/i18n/',\n fileExtension = '.json',\n includeZUITranslations = true,\n zuiOverridePath,\n customZUITranslations,\n } = config;\n\n return makeEnvironmentProviders([\n provideTranslateService({\n fallbackLang: defaultLang,\n loader: {\n provide: TranslateLoader,\n useFactory: (http: HttpClient) =>\n zCreateTranslateLoader(\n http,\n translationPath,\n fileExtension,\n includeZUITranslations,\n zuiOverridePath,\n customZUITranslations\n ),\n deps: [HttpClient],\n },\n }),\n provideAppInitializer(() => initializeTranslate(defaultLang)),\n ]);\n}\n\nexport { Z_UI_TRANSLATIONS, mergeTranslations, getZUITranslations } from '@shival99/z-ui/i18n';\nexport type { ZUITranslations, ZUILanguage, ZUITranslationSet } from '@shival99/z-ui/i18n';\n","/**\n * Z-NgxMask Provider Types\n */\n\nexport interface ZNgxMaskConfig {\n /** Language code (vi, en, etc.) */\n lang?: string;\n /** Allow negative numbers */\n allowNegativeNumbers?: boolean;\n /** Enable validation */\n validation?: boolean;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shival99-z-ui-providers.mjs","sources":["../../../../libs/core-ui/providers/z-cache.provider.ts","../../../../libs/core-ui/providers/z-indexdb.provider.ts","../../../../libs/core-ui/providers/z-ngx-mask.provider.ts","../../../../libs/core-ui/providers/z-scrollbar.provider.ts","../../../../libs/core-ui/providers/z-theme.provider.ts","../../../../libs/core-ui/providers/z-translate.provider.ts","../../../../libs/core-ui/providers/types/z-ngx-mask.types.ts","../../../../libs/core-ui/providers/shival99-z-ui-providers.ts"],"sourcesContent":["import {\n type EnvironmentProviders,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { type ZCacheConfig, ZCacheService } from '@shival99/z-ui/services';\n\n/** Injection token for ZCacheService configuration */\nexport const Z_CACHE_CONFIG = new InjectionToken<ZCacheConfig>('Z_CACHE_CONFIG');\n\n/**\n * Provide Z-Cache service with configuration\n * @param config - Cache configuration with prefix and encrypt options\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZCache({\n * prefix: 'myapp_',\n * encrypt: false, // Disable encryption for debugging\n * }),\n * ],\n * };\n * ```\n */\nexport function provideZCache(config: ZCacheConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: Z_CACHE_CONFIG,\n useValue: config,\n },\n provideEnvironmentInitializer(() => {\n const cacheConfig = inject(Z_CACHE_CONFIG);\n ZCacheService.configure(cacheConfig);\n }),\n ]);\n}\n","import { type EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { type ZIndexDbConfig, ZIndexDbService } from '@shival99/z-ui/services';\n\n/** Injection token for ZIndexDbService */\nexport const Z_INDEXDB_SERVICE = new InjectionToken<ZIndexDbService>('ZIndexDbService');\n\n/**\n * Provide Z-IndexDB service with configuration\n * @param config - IndexDB configuration with multi-store support\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZIndexDb({\n * dbName: 'MyApp',\n * version: 1,\n * stores: [\n * { name: 'cache', encrypt: true },\n * { name: 'userData', encrypt: true, protectedKeys: ['profile'] },\n * { name: 'settings', encrypt: false },\n * ],\n * defaultStore: 'cache',\n * protectedKeys: ['token'],\n * }),\n * ],\n * };\n * ```\n */\nexport function provideZIndexDb(config: ZIndexDbConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: Z_INDEXDB_SERVICE,\n useFactory: () => new ZIndexDbService(config),\n },\n {\n provide: ZIndexDbService,\n useExisting: Z_INDEXDB_SERVICE,\n },\n ]);\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { ZCacheService } from '@shival99/z-ui/services';\nimport { provideEnvironmentNgxMask } from 'ngx-mask';\nimport type { ZNgxMaskConfig } from './types/z-ngx-mask.types';\n\nconst LANG_CACHE_KEY = 'Z_LANGUAGE';\n\n/**\n * Get locale-specific mask configuration\n */\nfunction getMaskConfig(lang: string, config: ZNgxMaskConfig = {}) {\n const isVietnamese = lang === 'vi';\n\n return {\n validation: config.validation ?? true,\n thousandSeparator: isVietnamese ? ',' : '.',\n decimalMarker: (isVietnamese ? '.' : ',') as '.' | ',',\n allowNegativeNumbers: config.allowNegativeNumbers ?? true,\n };\n}\n\n/**\n * Provide Z-NgxMask with locale-aware configuration\n * @param config - Mask configuration\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZNgxMask({ lang: 'vi' }),\n * ],\n * };\n * ```\n */\nexport function provideZNgxMask(config: ZNgxMaskConfig = {}): EnvironmentProviders {\n const savedLang = typeof window !== 'undefined' ? ZCacheService.get<string>(LANG_CACHE_KEY) : null;\n const lang = config.lang ?? savedLang ?? 'vi';\n const maskConfig = getMaskConfig(lang, config);\n\n return makeEnvironmentProviders([provideEnvironmentNgxMask(maskConfig)]);\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideScrollbarOptions } from 'ngx-scrollbar';\n\n/**\n * Provides global scrollbar options for ngx-scrollbar\n * Use this in app.config.ts: providers: [provideZScrollbar()]\n */\nexport function provideZScrollbar(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideScrollbarOptions({\n visibility: 'hover',\n appearance: 'compact',\n withButtons: false,\n sensorThrottleTime: 200,\n }),\n ]);\n}\n","import { makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\nimport { type ZThemeConfig, Z_THEME_CONFIG } from '@shival99/z-ui/services';\n\n/**\n * Provide theme configuration for the application\n * @param config - Theme configuration with defaultTheme and defaultDarkMode\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZTheme({ defaultTheme: 'hospital', defaultDarkMode: false })\n * ]\n * };\n * ```\n */\nexport function provideZTheme(config: ZThemeConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: Z_THEME_CONFIG, useValue: config }]);\n}\n","/* eslint-disable @stylistic/indent */\nimport { HttpClient } from '@angular/common/http';\nimport { inject, makeEnvironmentProviders, provideAppInitializer, type EnvironmentProviders } from '@angular/core';\nimport {\n provideTranslateService,\n TranslateLoader,\n TranslateService,\n type TranslationObject,\n} from '@ngx-translate/core';\nimport type { ZUITranslations } from '@shival99/z-ui/i18n';\nimport { Z_LANG_CACHE_KEY, ZCacheService } from '@shival99/z-ui/services';\nimport { firstValueFrom, forkJoin, from, map, type Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport type { ZTranslateProviderConfig, ZUITranslationsLoader } from './types/z-translate.types';\n\nconst DEFAULT_LANG = 'en';\nconst zuiTranslationsPromiseCache = new Map<string, Promise<ZUITranslations>>();\n\nasync function zLoadDefaultZUITranslations(lang: string): Promise<ZUITranslations> {\n const module = await import('@shival99/z-ui/i18n');\n return module.getZUITranslations(lang) ?? module.getZUITranslations(DEFAULT_LANG);\n}\n\nclass ZTranslateHttpLoader implements TranslateLoader {\n public constructor(\n private readonly _http: HttpClient,\n private readonly _prefix: string,\n private readonly _suffix: string,\n private readonly _includeZUI: boolean,\n private readonly _zuiOverridePath?: string,\n private readonly _zuiLoader: ZUITranslationsLoader = zLoadDefaultZUITranslations\n ) {}\n\n private _loadZUITranslations(lang: string): Promise<ZUITranslations> {\n const cached = zuiTranslationsPromiseCache.get(lang);\n if (cached) {\n return cached;\n }\n\n const loadPromise = this._zuiLoader(lang).catch(async () => {\n if (lang === DEFAULT_LANG) {\n return {};\n }\n return this._zuiLoader(DEFAULT_LANG).catch(() => ({}));\n });\n\n zuiTranslationsPromiseCache.set(lang, loadPromise);\n return loadPromise;\n }\n\n public getTranslation(lang: string): Observable<TranslationObject> {\n const userTranslations$ = this._http\n .get<TranslationObject>(`${this._prefix}${lang}${this._suffix}`)\n .pipe(catchError(() => of({} as TranslationObject)));\n\n if (!this._includeZUI) {\n return userTranslations$;\n }\n\n const zuiDefaults$ = from(this._loadZUITranslations(lang)).pipe(catchError(() => of({} as ZUITranslations)));\n const zuiFileOverrides$ = this._zuiOverridePath\n ? this._http\n .get<ZUITranslations>(`${this._zuiOverridePath}${lang}${this._suffix}`)\n .pipe(catchError(() => of({} as ZUITranslations)))\n : of({} as ZUITranslations);\n\n return forkJoin([zuiDefaults$, zuiFileOverrides$, userTranslations$]).pipe(\n map(\n ([defaults, fileOverrides, user]) =>\n ({\n ...defaults,\n ...fileOverrides,\n ...(user as Record<string, unknown>),\n }) as TranslationObject\n )\n );\n }\n}\n\nexport function zCreateTranslateLoader(\n http: HttpClient,\n path = './assets/i18n/',\n extension = '.json',\n includeZUI = true,\n zuiOverridePath?: string,\n zuiLoader: ZUITranslationsLoader = zLoadDefaultZUITranslations\n): TranslateLoader {\n return new ZTranslateHttpLoader(http, path, extension, includeZUI, zuiOverridePath, zuiLoader);\n}\n\nfunction initializeTranslate(defaultLang: string): Promise<unknown> {\n const translate = inject(TranslateService);\n const savedLang = ZCacheService.get<string>(Z_LANG_CACHE_KEY) ?? defaultLang;\n translate.setFallbackLang(defaultLang);\n return firstValueFrom(translate.use(savedLang));\n}\n\nexport function provideZTranslate(config: ZTranslateProviderConfig = {}): EnvironmentProviders {\n const {\n defaultLang = 'vi',\n translationPath = './assets/i18n/',\n fileExtension = '.json',\n includeZUITranslations = true,\n zuiOverridePath,\n zuiTranslationsLoader = zLoadDefaultZUITranslations,\n } = config;\n\n return makeEnvironmentProviders([\n provideTranslateService({\n fallbackLang: defaultLang,\n loader: {\n provide: TranslateLoader,\n useFactory: (http: HttpClient) =>\n zCreateTranslateLoader(\n http,\n translationPath,\n fileExtension,\n includeZUITranslations,\n zuiOverridePath,\n zuiTranslationsLoader\n ),\n deps: [HttpClient],\n },\n }),\n provideAppInitializer(() => initializeTranslate(defaultLang)),\n ]);\n}\n\nexport type { ZUITranslations, ZUILanguage, ZUITranslationSet } from '@shival99/z-ui/i18n';\n","/**\n * Z-NgxMask Provider Types\n */\n\nexport interface ZNgxMaskConfig {\n /** Language code (vi, en, etc.) */\n lang?: string;\n /** Allow negative numbers */\n allowNegativeNumbers?: boolean;\n /** Enable validation */\n validation?: boolean;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, InjectionToken, inject, signal, computed, PLATFORM_ID, effect } from '@angular/core';
2
+ import { Injectable, InjectionToken, inject, DestroyRef, signal, computed, PLATFORM_ID, effect } from '@angular/core';
3
3
  import { zFormatNumExcel, zConvertColorToArgb } from '@shival99/z-ui/utils';
4
4
  import * as ExcelJS from 'exceljs';
5
5
  import { saveAs } from 'file-saver';
@@ -7,6 +7,7 @@ import * as XLSX from 'xlsx';
7
7
  import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
8
8
  import { Router } from '@angular/router';
9
9
  import { firstValueFrom, from, switchMap, of, catchError, throwError, tap, map, defer, Subject, BehaviorSubject } from 'rxjs';
10
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
10
11
  import { TranslateService } from '@ngx-translate/core';
11
12
  import { DOCUMENT, isPlatformBrowser } from '@angular/common';
12
13
 
@@ -45,6 +46,23 @@ class ZCacheService {
45
46
  const prefixedKey = `${ZCacheService._prefix}${normalizedKey}`;
46
47
  return encrypt ? ZCacheService._encode(prefixedKey) : prefixedKey;
47
48
  }
49
+ static _decodeStorageKey(storageKey) {
50
+ const decoded = ZCacheService._decode(storageKey);
51
+ if (typeof decoded !== 'string') {
52
+ return null;
53
+ }
54
+ return decoded;
55
+ }
56
+ static _isManagedStorageKey(storageKey) {
57
+ if (storageKey.startsWith(ZCacheService._prefix)) {
58
+ return true;
59
+ }
60
+ const decoded = ZCacheService._decodeStorageKey(storageKey);
61
+ if (!decoded) {
62
+ return false;
63
+ }
64
+ return decoded.startsWith(ZCacheService._prefix);
65
+ }
48
66
  static _safeOperation(operation, fallback) {
49
67
  try {
50
68
  return operation();
@@ -96,10 +114,12 @@ class ZCacheService {
96
114
  static clear() {
97
115
  return ZCacheService._safeOperation(() => {
98
116
  const keysToRemove = [];
99
- const prefixEncoded = ZCacheService._encode(ZCacheService._prefix);
100
117
  for (let i = 0; i < localStorage.length; i++) {
101
118
  const key = localStorage.key(i);
102
- if (key?.startsWith(ZCacheService._prefix) || key?.startsWith(prefixEncoded)) {
119
+ if (!key) {
120
+ continue;
121
+ }
122
+ if (ZCacheService._isManagedStorageKey(key)) {
103
123
  keysToRemove.push(key);
104
124
  }
105
125
  }
@@ -113,26 +133,6 @@ class ZCacheService {
113
133
  return localStorage.getItem(_key) !== null;
114
134
  }, false);
115
135
  }
116
- static keys() {
117
- return ZCacheService._safeOperation(() => {
118
- const result = [];
119
- const prefixEncoded = ZCacheService._encode(ZCacheService._prefix);
120
- for (let i = 0; i < localStorage.length; i++) {
121
- const key = localStorage.key(i);
122
- if (key?.startsWith(ZCacheService._prefix)) {
123
- result.push(key.slice(ZCacheService._prefix.length));
124
- continue;
125
- }
126
- if (key?.startsWith(prefixEncoded)) {
127
- const decoded = ZCacheService._decode(key);
128
- if (decoded) {
129
- result.push(decoded.slice(ZCacheService._prefix.length));
130
- }
131
- }
132
- }
133
- return result;
134
- }, []);
135
- }
136
136
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ZCacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
137
137
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ZCacheService, providedIn: 'root' });
138
138
  }
@@ -1411,6 +1411,7 @@ const Z_LANG_CACHE_KEY = 'Z_LANGUAGE';
1411
1411
 
1412
1412
  class ZTranslateService {
1413
1413
  _translate = inject(TranslateService);
1414
+ _destroyRef = inject(DestroyRef);
1414
1415
  currentLang = signal('vi', ...(ngDevMode ? [{ debugName: "currentLang" }] : []));
1415
1416
  availableLangs = signal(['vi', 'en'], ...(ngDevMode ? [{ debugName: "availableLangs" }] : []));
1416
1417
  constructor() {
@@ -1418,17 +1419,39 @@ class ZTranslateService {
1418
1419
  }
1419
1420
  _initialize() {
1420
1421
  const currentLang = this._translate.getCurrentLang() || ZCacheService.get(Z_LANG_CACHE_KEY) || 'vi';
1421
- this.currentLang.set(currentLang);
1422
- document.documentElement.lang = currentLang;
1422
+ this._setCurrentLang(currentLang);
1423
+ this._syncAvailableLangs();
1424
+ this._bindTranslateEvents();
1423
1425
  }
1424
- use(lang) {
1425
- this._translate.use(lang);
1426
- ZCacheService.set(Z_LANG_CACHE_KEY, lang);
1426
+ _bindTranslateEvents() {
1427
+ this._translate.onLangChange.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(event => {
1428
+ if (!event.lang) {
1429
+ return;
1430
+ }
1431
+ this._setCurrentLang(event.lang);
1432
+ });
1433
+ }
1434
+ _setCurrentLang(lang) {
1427
1435
  this.currentLang.set(lang);
1436
+ ZCacheService.set(Z_LANG_CACHE_KEY, lang);
1428
1437
  document.documentElement.lang = lang;
1429
1438
  }
1439
+ _syncAvailableLangs() {
1440
+ const langs = this._translate.getLangs();
1441
+ if (langs.length) {
1442
+ this.availableLangs.set([...langs]);
1443
+ }
1444
+ }
1445
+ use(lang) {
1446
+ if (!lang || lang === this.currentLang()) {
1447
+ return;
1448
+ }
1449
+ void firstValueFrom(this._translate.use(lang)).catch(() => {
1450
+ // Keep current language when target language load fails.
1451
+ });
1452
+ }
1430
1453
  getLang() {
1431
- return this._translate.getCurrentLang() ?? 'vi';
1454
+ return this.currentLang();
1432
1455
  }
1433
1456
  getLocale() {
1434
1457
  return Z_LANG_TO_LOCALE[this.currentLang()] ?? 'vi-VN';
@@ -1486,6 +1509,7 @@ class ZTranslateService {
1486
1509
  }
1487
1510
  setTranslation(lang, translations, shouldMerge = true) {
1488
1511
  this._translate.setTranslation(lang, translations, shouldMerge);
1512
+ this._syncAvailableLangs();
1489
1513
  }
1490
1514
  getNgxTranslate() {
1491
1515
  return this._translate;