@flusys/ng-localization 6.4.0 → 7.0.0-beta.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.
@@ -11,7 +11,7 @@ import { UiModule, MenuComponent, MessageService, ConfirmationService } from '@f
11
11
  import { LAYOUT_LANGUAGE_SELECTOR, LAYOUT_LANGUAGE_SELECTOR_PANEL } from '@flusys/ng-layout';
12
12
  import * as i2 from '@angular/forms';
13
13
  import { FormsModule } from '@angular/forms';
14
- import { form, required, maxLength, FormField } from '@angular/forms/signals';
14
+ import { form, required, maxLength, disabled, FormField } from '@angular/forms/signals';
15
15
  import { Router, ActivatedRoute, RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';
16
16
 
17
17
  const LOCALIZATION_CONFIG = new InjectionToken('LOCALIZATION_CONFIG');
@@ -46,6 +46,9 @@ const LOCALIZATION_MESSAGES = {
46
46
  'language.update.many.success': '{{count}} languages updated successfully',
47
47
  'language.delete.success': 'Language deleted successfully',
48
48
  'language.restore.success': 'Language restored successfully',
49
+ 'language.readonly.update.forbidden': 'Cannot modify code/name of readonly language "{{name}}"',
50
+ 'language.readonly.delete.forbidden': 'Cannot delete readonly language(s): {{names}}',
51
+ 'language.default.delete.forbidden': 'Cannot delete the default language(s): {{names}}. Set another language as default first.',
49
52
  'language.active.success': 'Active languages retrieved successfully',
50
53
  'language.set.default.success': 'Default language updated successfully',
51
54
  'language.get.default.success': 'Default language retrieved successfully',
@@ -96,8 +99,11 @@ const LOCALIZATION_MESSAGES = {
96
99
  'localization.language.empty': 'No languages configured. Add a language to get started.',
97
100
  'localization.language.confirm.set.default': 'Set "{{name}}" as the default language?',
98
101
  'localization.language.delete.title': 'Delete Language',
102
+ 'localization.language.default.delete.forbidden': 'Cannot delete the default language. Set another language as default first.',
103
+ 'localization.language.readonly.delete.forbidden': 'This is a system language and cannot be deleted',
99
104
  // pages/language-form/language-form.page.ts
100
105
  'localization.language.edit': 'Edit Language',
106
+ 'localization.language.readonly.edit.hint': 'This is a system language — its code, name, native name, and direction cannot be changed',
101
107
  'localization.placeholder.code': 'en',
102
108
  'localization.language.iso.code.hint': 'ISO 639-1 language code (e.g., en, ar, fr)',
103
109
  'localization.placeholder.name': 'English',
@@ -121,6 +127,8 @@ const LOCALIZATION_MESSAGES = {
121
127
  'localization.key.translations': 'Translations',
122
128
  'localization.key.empty': 'No translation keys found',
123
129
  'localization.key.delete.title': 'Delete Translation Key',
130
+ 'localization.key.readonly.delete.forbidden': 'This is a system translation key and cannot be deleted',
131
+ 'localization.key.readonly.edit.hint': 'This is a system key — its key name and module cannot be changed',
124
132
  // pages/translation-key-form/translation-key-form.page.ts
125
133
  'localization.key.edit': 'Edit Key',
126
134
  'localization.key.about': 'Key Information',
@@ -580,6 +588,8 @@ class LanguageFormPage {
580
588
  ...(ngDevMode ? [{ debugName: "existingLanguage" }] : /* istanbul ignore next */ []));
581
589
  isEditMode = computed(() => !!this.existingLanguage(), /* @ts-ignore */
582
590
  ...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
591
+ isReadonly = computed(() => this.existingLanguage()?.isReadonly ?? false, /* @ts-ignore */
592
+ ...(ngDevMode ? [{ debugName: "isReadonly" }] : /* istanbul ignore next */ []));
583
593
  translate(key, vars) {
584
594
  return this.translateAdapter?.translate(key, vars) ?? key;
585
595
  }
@@ -617,6 +627,9 @@ class LanguageFormPage {
617
627
  maxLength(f.name, 100, {
618
628
  message: this.translate('localization.validation.name.max.length'),
619
629
  });
630
+ disabled(f.code, { when: () => this.isReadonly() });
631
+ disabled(f.name, { when: () => this.isReadonly() });
632
+ disabled(f.nativeName, { when: () => this.isReadonly() });
620
633
  });
621
634
  isFormValid = computed(() => {
622
635
  const model = this.formModel();
@@ -780,8 +793,14 @@ class LanguageFormPage {
780
793
  [options]="directionOptions()"
781
794
  optionLabel="label"
782
795
  optionValue="value"
796
+ [disabled]="isReadonly()"
783
797
  class="w-full"
784
798
  />
799
+ @if (isReadonly()) {
800
+ <small class="text-muted-color">{{
801
+ 'localization.language.readonly.edit.hint' | translate
802
+ }}</small>
803
+ }
785
804
  </div>
786
805
 
787
806
  <!-- Display Order -->
@@ -918,8 +937,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
918
937
  [options]="directionOptions()"
919
938
  optionLabel="label"
920
939
  optionValue="value"
940
+ [disabled]="isReadonly()"
921
941
  class="w-full"
922
942
  />
943
+ @if (isReadonly()) {
944
+ <small class="text-muted-color">{{
945
+ 'localization.language.readonly.edit.hint' | translate
946
+ }}</small>
947
+ }
923
948
  </div>
924
949
 
925
950
  <!-- Display Order -->
@@ -1131,6 +1156,12 @@ class LanguageListPage {
1131
1156
  severity="contrast"
1132
1157
  />
1133
1158
  }
1159
+ @if (lang.isReadonly) {
1160
+ <f-tag
1161
+ [value]="'shared.read.only' | translate"
1162
+ severity="warn"
1163
+ />
1164
+ }
1134
1165
  </div>
1135
1166
  </td>
1136
1167
  <td>
@@ -1166,8 +1197,15 @@ class LanguageListPage {
1166
1197
  [text]="true"
1167
1198
  severity="danger"
1168
1199
  size="small"
1169
- [fTooltip]="'shared.delete' | translate"
1170
- [disabled]="lang.isDefault"
1200
+ [fTooltip]="
1201
+ (lang.isDefault
1202
+ ? 'localization.language.default.delete.forbidden'
1203
+ : lang.isReadonly
1204
+ ? 'localization.language.readonly.delete.forbidden'
1205
+ : 'shared.delete'
1206
+ ) | translate
1207
+ "
1208
+ [disabled]="lang.isDefault || lang.isReadonly"
1171
1209
  (click)="onDelete(lang)"
1172
1210
  >
1173
1211
  <ui-icon pButtonIcon name="trash"></ui-icon>
@@ -1270,6 +1308,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1270
1308
  severity="contrast"
1271
1309
  />
1272
1310
  }
1311
+ @if (lang.isReadonly) {
1312
+ <f-tag
1313
+ [value]="'shared.read.only' | translate"
1314
+ severity="warn"
1315
+ />
1316
+ }
1273
1317
  </div>
1274
1318
  </td>
1275
1319
  <td>
@@ -1305,8 +1349,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1305
1349
  [text]="true"
1306
1350
  severity="danger"
1307
1351
  size="small"
1308
- [fTooltip]="'shared.delete' | translate"
1309
- [disabled]="lang.isDefault"
1352
+ [fTooltip]="
1353
+ (lang.isDefault
1354
+ ? 'localization.language.default.delete.forbidden'
1355
+ : lang.isReadonly
1356
+ ? 'localization.language.readonly.delete.forbidden'
1357
+ : 'shared.delete'
1358
+ ) | translate
1359
+ "
1360
+ [disabled]="lang.isDefault || lang.isReadonly"
1310
1361
  (click)="onDelete(lang)"
1311
1362
  >
1312
1363
  <ui-icon pButtonIcon name="trash"></ui-icon>
@@ -1439,6 +1490,8 @@ class TranslationKeyFormPage {
1439
1490
  ...(ngDevMode ? [{ debugName: "existingKey" }] : /* istanbul ignore next */ []));
1440
1491
  isEditMode = computed(() => !!this.existingKey(), /* @ts-ignore */
1441
1492
  ...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
1493
+ isReadonly = computed(() => this.existingKey()?.isReadonly ?? false, /* @ts-ignore */
1494
+ ...(ngDevMode ? [{ debugName: "isReadonly" }] : /* istanbul ignore next */ []));
1442
1495
  languages = signal([], /* @ts-ignore */
1443
1496
  ...(ngDevMode ? [{ debugName: "languages" }] : /* istanbul ignore next */ []));
1444
1497
  modules = signal([], /* @ts-ignore */
@@ -1465,6 +1518,7 @@ class TranslationKeyFormPage {
1465
1518
  required(f.defaultMessage, {
1466
1519
  message: this.translate('localization.validation.default.message.required'),
1467
1520
  });
1521
+ disabled(f.key, { when: () => this.isReadonly() });
1468
1522
  });
1469
1523
  isFormValid = computed(() => {
1470
1524
  const model = this.formModel();
@@ -1730,11 +1784,20 @@ class TranslationKeyFormPage {
1730
1784
  optionLabel="label"
1731
1785
  optionValue="value"
1732
1786
  [editable]="true"
1787
+ [disabled]="isReadonly()"
1733
1788
  [placeholder]="'localization.key.select.module' | translate"
1734
1789
  class="w-full"
1735
1790
  />
1736
1791
  </div>
1737
1792
 
1793
+ @if (isReadonly()) {
1794
+ <div class="md:col-span-2 -mt-2">
1795
+ <small class="text-muted-color">{{
1796
+ 'localization.key.readonly.edit.hint' | translate
1797
+ }}</small>
1798
+ </div>
1799
+ }
1800
+
1738
1801
  <!-- Default Message -->
1739
1802
  <div class="flex flex-col gap-2 md:col-span-2">
1740
1803
  <label for="defaultMessage" class="font-medium"
@@ -1918,11 +1981,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1918
1981
  optionLabel="label"
1919
1982
  optionValue="value"
1920
1983
  [editable]="true"
1984
+ [disabled]="isReadonly()"
1921
1985
  [placeholder]="'localization.key.select.module' | translate"
1922
1986
  class="w-full"
1923
1987
  />
1924
1988
  </div>
1925
1989
 
1990
+ @if (isReadonly()) {
1991
+ <div class="md:col-span-2 -mt-2">
1992
+ <small class="text-muted-color">{{
1993
+ 'localization.key.readonly.edit.hint' | translate
1994
+ }}</small>
1995
+ </div>
1996
+ }
1997
+
1926
1998
  <!-- Default Message -->
1927
1999
  <div class="flex flex-col gap-2 md:col-span-2">
1928
2000
  <label for="defaultMessage" class="font-medium"
@@ -2279,7 +2351,15 @@ class TranslationKeyListPage {
2279
2351
  <f-tag [value]="key.module" severity="secondary" />
2280
2352
  </td>
2281
2353
  <td>
2282
- <div class="font-medium">{{ key.key }}</div>
2354
+ <div class="flex items-center gap-2">
2355
+ <span class="font-medium">{{ key.key }}</span>
2356
+ @if (key.isReadonly) {
2357
+ <f-tag
2358
+ [value]="'shared.read.only' | translate"
2359
+ severity="warn"
2360
+ />
2361
+ }
2362
+ </div>
2283
2363
  @if (key.description) {
2284
2364
  <small class="text-muted-color">{{ key.description }}</small>
2285
2365
  }
@@ -2316,7 +2396,13 @@ class TranslationKeyListPage {
2316
2396
  [text]="true"
2317
2397
  severity="danger"
2318
2398
  size="small"
2319
- [fTooltip]="'shared.delete' | translate"
2399
+ [disabled]="key.isReadonly"
2400
+ [fTooltip]="
2401
+ (key.isReadonly
2402
+ ? 'localization.key.readonly.delete.forbidden'
2403
+ : 'shared.delete'
2404
+ ) | translate
2405
+ "
2320
2406
  (click)="onDelete(key)"
2321
2407
  >
2322
2408
  <ui-icon pButtonIcon name="trash"></ui-icon>
@@ -2434,7 +2520,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
2434
2520
  <f-tag [value]="key.module" severity="secondary" />
2435
2521
  </td>
2436
2522
  <td>
2437
- <div class="font-medium">{{ key.key }}</div>
2523
+ <div class="flex items-center gap-2">
2524
+ <span class="font-medium">{{ key.key }}</span>
2525
+ @if (key.isReadonly) {
2526
+ <f-tag
2527
+ [value]="'shared.read.only' | translate"
2528
+ severity="warn"
2529
+ />
2530
+ }
2531
+ </div>
2438
2532
  @if (key.description) {
2439
2533
  <small class="text-muted-color">{{ key.description }}</small>
2440
2534
  }
@@ -2471,7 +2565,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
2471
2565
  [text]="true"
2472
2566
  severity="danger"
2473
2567
  size="small"
2474
- [fTooltip]="'shared.delete' | translate"
2568
+ [disabled]="key.isReadonly"
2569
+ [fTooltip]="
2570
+ (key.isReadonly
2571
+ ? 'localization.key.readonly.delete.forbidden'
2572
+ : 'shared.delete'
2573
+ ) | translate
2574
+ "
2475
2575
  (click)="onDelete(key)"
2476
2576
  >
2477
2577
  <ui-icon pButtonIcon name="trash"></ui-icon>
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-localization.mjs","sources":["../../../projects/ng-localization/interfaces/localization-config.interface.ts","../../../projects/ng-localization/constants/localization.constants.ts","../../../projects/ng-localization/constants/messages.ts","../../../projects/ng-localization/services/language-api.service.ts","../../../projects/ng-localization/services/localization-api.service.ts","../../../projects/ng-localization/services/localization-initializer.service.ts","../../../projects/ng-localization/services/localization-state.service.ts","../../../projects/ng-localization/services/translation-api.service.ts","../../../projects/ng-localization/services/translation-key-api.service.ts","../../../projects/ng-localization/services/translation-loader.service.ts","../../../projects/ng-localization/components/language-selector/language-selector.component.ts","../../../projects/ng-localization/components/language-selector-panel/language-selector-panel.component.ts","../../../projects/ng-localization/providers/localization.providers.ts","../../../projects/ng-localization/pages/language-form/language-form.page.ts","../../../projects/ng-localization/pages/language-list/language-list.page.ts","../../../projects/ng-localization/pages/localization-container/localization-container.page.ts","../../../projects/ng-localization/pages/translation-key-form/translation-key-form.page.ts","../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts","../../../projects/ng-localization/routes/localization.routes.ts","../../../projects/ng-localization/public-api.ts","../../../projects/ng-localization/flusys-ng-localization.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type LocalizationLoadStrategy = 'all' | 'modules';\n\n/** Localization system configuration */\nexport interface ILocalizationConfig {\n /** Default language code (e.g., 'en', 'ar') */\n defaultLanguageCode: string;\n /** Translation loading strategy (default: 'modules') */\n loadStrategy?: LocalizationLoadStrategy;\n /** Modules to load at app initialization (default: []) */\n initialModules?: string[];\n /** Show language selector in layout (default: false) */\n enableLayoutSelector?: boolean;\n}\n\nexport const LOCALIZATION_CONFIG = new InjectionToken<ILocalizationConfig>(\n 'LOCALIZATION_CONFIG',\n);\n\n/** Get localization config with sensible defaults applied */\nexport function getLocalizationConfig(\n overrides?: Partial<ILocalizationConfig>,\n): ILocalizationConfig {\n const defaults: ILocalizationConfig = {\n defaultLanguageCode: 'en',\n loadStrategy: 'all',\n initialModules: [],\n enableLayoutSelector: false,\n };\n\n return {\n ...defaults,\n ...overrides,\n defaultLanguageCode:\n overrides?.defaultLanguageCode || defaults.defaultLanguageCode,\n };\n}\n","export const STORAGE_KEYS = {\n CURRENT_LANGUAGE: 'flusys.language',\n} as const;\n","export const LOCALIZATION_MESSAGES: Record<string, string> = {\n // Language CRUD (API keys)\n 'language.create.success': 'Language created successfully',\n 'language.create.many.success': '{{count}} languages created successfully',\n 'language.get.success': 'Language retrieved successfully',\n 'language.get.by.ids.success': 'Languages retrieved successfully by Ids',\n 'language.get.by.filter.success':\n 'Languages retrieved successfully by filter',\n 'language.get.all.success': 'Languages retrieved successfully',\n 'language.update.success': 'Language updated successfully',\n 'language.update.many.success': '{{count}} languages updated successfully',\n 'language.delete.success': 'Language deleted successfully',\n 'language.restore.success': 'Language restored successfully',\n 'language.active.success': 'Active languages retrieved successfully',\n 'language.set.default.success': 'Default language updated successfully',\n 'language.get.default.success': 'Default language retrieved successfully',\n\n // Translation key CRUD (API keys)\n 'translation.key.create.success': 'Translation key created successfully',\n 'translation.key.create.many.success':\n '{{count}} translation keys created successfully',\n 'translation.key.get.success': 'Translation key retrieved successfully',\n 'translation.key.get.by.ids.success':\n 'Translation keys retrieved successfully by Ids',\n 'translation.key.get.by.filter.success':\n 'Translation keys retrieved successfully by filter',\n 'translation.key.get.all.success': 'Translation keys retrieved successfully',\n 'translation.key.update.success': 'Translation key updated successfully',\n 'translation.key.update.many.success':\n '{{count}} translation keys updated successfully',\n 'translation.key.delete.success': 'Translation key deleted successfully',\n 'translation.key.restore.success': 'Translation key restored successfully',\n 'translation.key.modules.success': 'Modules retrieved successfully',\n 'translation.key.readonly.delete.forbidden':\n 'Cannot delete readonly translation keys: {{keys}}',\n 'translation.key.readonly.update.forbidden':\n 'Cannot modify key or module of system translation keys',\n 'translation.key.duplicate.key.in.module':\n 'Translation key \"{{key}}\" already exists in module \"{{module}}\"',\n\n // Translation CRUD (API keys)\n 'translation.create.success': 'Translation created successfully',\n 'translation.create.many.success':\n '{{count}} translations created successfully',\n 'translation.get.success': 'Translation retrieved successfully',\n 'translation.get.by.ids.success':\n 'Translations retrieved successfully by Ids',\n 'translation.get.by.filter.success':\n 'Translations retrieved successfully by filter',\n 'translation.get.all.success': 'Translations retrieved successfully',\n 'translation.update.success': 'Translation updated successfully',\n 'translation.update.many.success':\n '{{count}} translations updated successfully',\n 'translation.delete.success': 'Translation deleted successfully',\n 'translation.restore.success': 'Translation restored successfully',\n 'translation.by.language.success': 'Translations retrieved successfully',\n\n // pages/localization-container/localization-container.page.ts\n 'localization.title': 'Localization',\n 'localization.subtitle': 'Manage languages and translations',\n 'localization.tabs.languages': 'Languages',\n 'localization.tabs.keys': 'Keys',\n\n // pages/language-list/language-list.page.ts\n 'localization.language.title': 'Languages',\n 'localization.language.subtitle':\n 'Manage available languages for your application',\n 'localization.language.new': 'Add Language',\n 'localization.language.code': 'Language Code',\n 'localization.language.name': 'Language Name',\n 'localization.language.native.name': 'Native Name',\n 'localization.language.direction': 'Text Direction',\n 'localization.language.rtl': 'RTL',\n 'localization.language.ltr': 'LTR',\n 'localization.language.default': 'Default',\n 'localization.language.set.default': 'Set as Default',\n 'localization.language.empty':\n 'No languages configured. Add a language to get started.',\n 'localization.language.confirm.set.default':\n 'Set \"{{name}}\" as the default language?',\n 'localization.language.delete.title': 'Delete Language',\n\n // pages/language-form/language-form.page.ts\n 'localization.language.edit': 'Edit Language',\n 'localization.placeholder.code': 'en',\n 'localization.language.iso.code.hint':\n 'ISO 639-1 language code (e.g., en, ar, fr)',\n 'localization.placeholder.name': 'English',\n 'localization.placeholder.native.name': 'English',\n 'localization.language.native.name.hint':\n 'Name in the native language (e.g., العربية for Arabic)',\n 'localization.language.display.order': 'Display Order',\n 'localization.language.direction.ltr': 'Left to Right (LTR)',\n 'localization.language.direction.rtl': 'Right to Left (RTL)',\n 'localization.validation.code.required': 'Language code is required',\n 'localization.validation.code.max.length':\n 'Language code must be at most 10 characters',\n 'localization.validation.name.required': 'Language name is required',\n 'localization.validation.name.max.length':\n 'Language name must be at most 100 characters',\n\n // pages/translation-key-list/translation-key-list.page.ts\n 'localization.key.title': 'Translation Keys',\n 'localization.key.subtitle': 'Manage translation keys for your application',\n 'localization.key.new': 'Add Key',\n 'localization.key.filter.module': 'Filter by module',\n 'localization.key.module': 'Module',\n 'localization.key.name': 'Key Name',\n 'localization.key.default.message': 'Default Message',\n 'localization.key.translations': 'Translations',\n 'localization.key.empty': 'No translation keys found',\n 'localization.key.delete.title': 'Delete Translation Key',\n\n // pages/translation-key-form/translation-key-form.page.ts\n 'localization.key.edit': 'Edit Key',\n 'localization.key.about': 'Key Information',\n 'localization.placeholder.key.name': 'button.submit',\n 'localization.key.select.module': 'Select or enter module',\n 'localization.placeholder.default.message': 'Enter default value (English)',\n 'localization.key.description': 'Description',\n 'localization.placeholder.key.description':\n 'Optional description for translators',\n 'localization.key.variables': 'Variables',\n 'localization.key.variables.placeholder': 'e.g., name, count, date',\n 'localization.key.variables.hint':\n 'Enter variable names used in this translation',\n 'localization.key.translations.section': 'Translations',\n 'localization.key.no.languages': 'No active languages configured',\n 'localization.key.enter.translation': 'Enter translation',\n 'localization.validation.key.required': 'Translation key is required',\n 'localization.validation.default.message.required':\n 'Default message is required',\n};\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LanguageApiService extends ApiResourceService<\n ICreateLanguageDto | IUpdateLanguageDto,\n ILanguage\n> {\n constructor() {\n super('language', 'localization');\n }\n\n setDefault(id: string): Observable<ISingleResponse<ILanguage>> {\n return this.http.post<ISingleResponse<ILanguage>>(\n `${this.baseUrl}/set-default`,\n { id },\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { IListResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationApiService {\n private readonly http = inject(HttpClient);\n private readonly appConfig = inject(APP_CONFIG);\n\n private get baseUrl(): string {\n return `${this.appConfig.apiBaseUrl}/localization`;\n }\n\n getActiveLanguages(): Observable<IListResponse<ILanguage>> {\n return this.http.post<IListResponse<ILanguage>>(`${this.baseUrl}/language/get-active`, {});\n }\n\n getTranslationsByLanguage(languageCode: string, modules?: string[]): Observable<ISingleResponse<ITranslationsMap>> {\n return this.http.post<ISingleResponse<ITranslationsMap>>(\n `${this.baseUrl}/translation/get-by-language`,\n { languageCode, ...(modules?.length ? { modules } : {}) },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom } from 'rxjs';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationInitializerService {\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async initialize(\n initialFallbackMessages?: Record<string, string>,\n ): Promise<void> {\n try {\n this.stateService.setLoading(true);\n if (initialFallbackMessages) {\n this.stateService.updateFallbackMessages(initialFallbackMessages);\n }\n const languagesResponse = await firstValueFrom(\n this.apiService.getActiveLanguages(),\n );\n if (languagesResponse.success && languagesResponse.data) {\n this.stateService.setAvailableLanguages(languagesResponse.data);\n\n const savedCode = this.stateService.getSavedLanguageCode();\n let selectedLanguage = languagesResponse.data.find(\n (l) => l.code === savedCode,\n );\n\n if (!selectedLanguage) {\n selectedLanguage = languagesResponse.data.find((l) => l.isDefault);\n }\n\n if (!selectedLanguage && languagesResponse.data.length > 0) {\n selectedLanguage = languagesResponse.data[0];\n }\n\n if (selectedLanguage) {\n this.stateService.setCurrentLanguage(selectedLanguage);\n }\n }\n } catch (error) {\n // Silently fail - use default language\n } finally {\n this.stateService.setLoading(false);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n computed,\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport { STORAGE_KEYS } from '../constants/localization.constants';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationStateService {\n private readonly platformService = inject(PlatformService);\n private readonly document = inject(DOCUMENT);\n private readonly appRef = inject(ApplicationRef);\n private readonly _loadedModules = new Set<string>();\n private readonly _currentLanguage = signal<ILanguage | null>(null);\n private readonly _availableLanguages = signal<ILanguage[]>([]);\n private readonly _translations = signal<ITranslationsMap>({});\n private readonly _fallbackMessages = signal<ITranslationsMap>({});\n private readonly _isLoading = signal<boolean>(false);\n\n readonly availableLanguages = this._availableLanguages.asReadonly();\n readonly translations = this._translations.asReadonly();\n readonly fallbackMessages = this._fallbackMessages.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n\n readonly currentLanguageCode = computed(\n () => this._currentLanguage()?.code ?? 'en',\n );\n\n constructor() {\n effect(() => {\n const language = this._currentLanguage();\n if (language && !this.platformService.isServer) {\n this.document.documentElement.dir = language.direction ?? 'ltr';\n this.document.documentElement.lang = language.code;\n localStorage.setItem(STORAGE_KEYS.CURRENT_LANGUAGE, language.code);\n }\n });\n\n effect(() => {\n this._translations();\n setTimeout(() => this.appRef.tick(), 0);\n });\n }\n\n setCurrentLanguage(language: ILanguage): void {\n this._currentLanguage.set(language);\n }\n\n setAvailableLanguages(languages: ILanguage[]): void {\n this._availableLanguages.set(languages);\n }\n\n setTranslations(translations: ITranslationsMap): void {\n this._translations.set(translations);\n }\n\n mergeTranslations(translations: ITranslationsMap): void {\n this._translations.update((current) => ({ ...current, ...translations }));\n }\n\n setLoading(loading: boolean): void {\n this._isLoading.set(loading);\n }\n\n getSavedLanguageCode(): string | null {\n if (this.platformService.isServer) return null;\n return localStorage.getItem(STORAGE_KEYS.CURRENT_LANGUAGE);\n }\n\n isModuleLoaded(module: string): boolean {\n return this._loadedModules.has(module);\n }\n\n markModuleLoaded(module: string): void {\n this._loadedModules.add(module);\n }\n\n getLoadedModules(): string[] {\n return Array.from(this._loadedModules);\n }\n\n clearLoadedModules(): void {\n this._loadedModules.clear();\n }\n\n updateFallbackMessages(messages: ITranslationsMap): void {\n this._fallbackMessages.update((current) => ({ ...current, ...messages }));\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IListResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ITranslation } from '../interfaces/translation.interface';\n\nexport interface ICreateTranslationDto {\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n isActive?: boolean;\n}\n\nexport interface IUpdateTranslationDto extends Partial<ICreateTranslationDto> {\n id: string;\n}\n\nexport interface IBulkUpdateTranslationDto {\n id?: string;\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationApiService extends ApiResourceService<\n ICreateTranslationDto | IUpdateTranslationDto,\n ITranslation\n> {\n constructor() {\n super('translation', 'localization');\n }\n\n getByKeyId(\n translationKeyId: string,\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/get-all`,\n {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { translationKeyId },\n sort: {},\n },\n );\n }\n\n getCounts(): Observable<ISingleResponse<Record<string, number>>> {\n return this.http.post<ISingleResponse<Record<string, number>>>(\n `${this.baseUrl}/get-counts`,\n {},\n );\n }\n\n bulkUpdate(\n translations: IBulkUpdateTranslationDto[],\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/update-many-values`,\n { translations },\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../interfaces/translation-key.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationKeyApiService extends ApiResourceService<\n ICreateTranslationKeyDto | IUpdateTranslationKeyDto,\n ITranslationKey\n> {\n constructor() {\n super('translation-key', 'localization');\n }\n\n getModules(): Observable<ISingleResponse<string[]>> {\n return this.http.post<ISingleResponse<string[]>>(\n `${this.baseUrl}/get-modules`,\n {},\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom, from, Observable } from 'rxjs';\nimport { LOCALIZATION_CONFIG } from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationLoaderService {\n private readonly DEFAULT_INITIAL_MODULES = ['shared', 'layout'];\n private readonly config = inject(LOCALIZATION_CONFIG, { optional: true });\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async loadTranslations(\n languageCode: string,\n clearModules = false,\n ): Promise<void> {\n const strategy = this.config?.loadStrategy ?? 'all';\n\n // Save currently loaded modules before clearing (for language switch)\n const previouslyLoadedModules = clearModules\n ? this.stateService.getLoadedModules()\n : [];\n\n if (clearModules) {\n this.stateService.clearLoadedModules();\n }\n\n this.stateService.setLoading(true);\n\n try {\n if (strategy === 'all') {\n await this.loadAndSetTranslations(languageCode);\n } else {\n const modules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n await this.loadAndSetTranslations(languageCode, modules);\n // Reload all previously loaded modules for the new language\n if (previouslyLoadedModules.length > 0) {\n await this.reloadModules(languageCode, previouslyLoadedModules);\n }\n }\n } finally {\n this.stateService.setLoading(false);\n }\n }\n\n private async loadAndSetTranslations(\n languageCode: string,\n modules?: string[],\n ): Promise<void> {\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(languageCode, modules),\n );\n if (response.success && response.data) {\n this.stateService.setTranslations(response.data);\n if (modules) {\n modules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n }\n\n private async reloadModules(\n languageCode: string,\n modules: string[],\n ): Promise<void> {\n const initialModules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n const additionalModules = modules.filter(\n (m) => !initialModules.includes(m),\n );\n\n if (additionalModules.length === 0) return;\n\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(\n languageCode,\n additionalModules,\n ),\n );\n\n if (response.success && response.data) {\n this.stateService.mergeTranslations(response.data);\n additionalModules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n\n loadTranslationsAsync(\n languageCode: string,\n clearModules = false,\n ): Observable<void> {\n return from(this.loadTranslations(languageCode, clearModules));\n }\n}\n","import { Component, DestroyRef, computed, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuItem, UiModule } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector',\n imports: [UiModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"menu.visible()\"\n (click)=\"menu.toggle($event)\"\n >\n <ui-icon name=\"globe\"></ui-icon>\n <span class=\"font-semibold\">{{\n selectedLanguage()?.nativeName ||\n selectedLanguage()?.name ||\n selectedLanguageCode()\n }}</span>\n </button>\n <f-menu\n #menu\n [model]=\"menuItems()\"\n [popup]=\"true\"\n class=\"absolute left-[0]\"\n [style]=\"{ 'inset-inline-end': '0' }\"\n />\n `,\n})\nexport class LanguageSelectorComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n readonly selectedLanguageCode = this.localizationState.currentLanguageCode;\n readonly selectedLanguage = computed(\n () =>\n this.languages().find((l) => l.code === this.selectedLanguageCode()) ??\n null,\n );\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector-panel',\n imports: [MenuComponent],\n host: {\n class: 'hidden absolute z-50 top-[24px] p-3 min-w-[180px]',\n style: 'inset-inline-end: 0;',\n },\n template: `<f-menu [model]=\"menuItems()\" />`,\n})\nexport class LanguageSelectorPanelComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _selectedLanguageCode = signal<string>(\n this.localizationState.currentLanguageCode(),\n );\n readonly selectedLanguageCode = this._selectedLanguageCode.asReadonly();\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n constructor() {\n effect(() => {\n const currentCode = this.localizationState.currentLanguageCode();\n if (currentCode !== this._selectedLanguageCode()) {\n this._selectedLanguageCode.set(currentCode);\n }\n });\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this._selectedLanguageCode.set(code);\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n provideAppInitializer,\n Provider,\n} from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_LANGUAGE_SELECTOR_PANEL,\n} from '@flusys/ng-layout';\nimport { LanguageSelectorPanelComponent } from '../components/language-selector-panel/language-selector-panel.component';\nimport { LanguageSelectorComponent } from '../components/language-selector/language-selector.component';\nimport {\n ILocalizationConfig,\n LOCALIZATION_CONFIG,\n} from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from '../services/localization-api.service';\nimport { LocalizationInitializerService } from '../services/localization-initializer.service';\nimport { LocalizationStateService } from '../services/localization-state.service';\n\nexport function provideLocalization(\n config: ILocalizationConfig,\n initialFallbackMessages?: Record<string, string>,\n): Array<Provider | EnvironmentProviders> {\n const providers: Array<Provider | EnvironmentProviders> = [\n // 1. Value/Existing Providers\n { provide: LOCALIZATION_CONFIG, useValue: config },\n {\n provide: LOCALIZATION_STATE_SERVICE,\n useExisting: LocalizationStateService,\n },\n { provide: LOCALIZATION_API_SERVICE, useExisting: LocalizationApiService },\n\n // 2. The Service itself\n LocalizationInitializerService,\n\n // 3. The modern Initializer\n provideAppInitializer(() => {\n const initializer = inject(LocalizationInitializerService);\n return initializer.initialize(initialFallbackMessages);\n }),\n ];\n\n if (config.enableLayoutSelector) {\n providers.push(\n {\n provide: LAYOUT_LANGUAGE_SELECTOR,\n useValue: LanguageSelectorComponent,\n },\n {\n provide: LAYOUT_LANGUAGE_SELECTOR_PANEL,\n useValue: LanguageSelectorPanelComponent,\n },\n );\n }\n\n return providers;\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { form, FormField, maxLength, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, from } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface ILanguageFormModel {\n code: string;\n name: string;\n nativeName: string;\n direction: 'ltr' | 'rtl';\n serial: string;\n isActive: boolean;\n isDefault: boolean;\n}\n\n@Component({\n selector: 'lib-language-form-page',\n imports: [UiModule, AngularModule, FormsModule, FormField, TranslatePipe],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.language.edit' | translate)\n : ('localization.language.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Language Code -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"code\" class=\"font-medium\"\n >{{ 'localization.language.code' | translate }} *</label\n >\n <input\n fInputText\n id=\"code\"\n [formField]=\"formTree.code\"\n [placeholder]=\"'localization.placeholder.code' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.iso.code.hint' | translate\n }}</small>\n </div>\n\n <!-- Language Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'localization.language.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'localization.placeholder.name' | translate\"\n />\n </div>\n\n <!-- Native Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"nativeName\" class=\"font-medium\">{{\n 'localization.language.native.name' | translate\n }}</label>\n <input\n fInputText\n id=\"nativeName\"\n [formField]=\"formTree.nativeName\"\n [placeholder]=\"'localization.placeholder.native.name' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.native.name.hint' | translate\n }}</small>\n </div>\n\n <!-- Text Direction -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"direction\" class=\"font-medium\"\n >{{ 'localization.language.direction' | translate }} *</label\n >\n <f-select\n id=\"direction\"\n [ngModel]=\"formModel().direction\"\n (ngModelChange)=\"updateDirection($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"directionOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n />\n </div>\n\n <!-- Display Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'localization.language.display.order' | translate\n }}</label>\n <input\n fInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"formTree.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Empty cell for alignment -->\n <div class=\"hidden md:block\"></div>\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <f-checkbox [formField]=\"formTree.isActive\" [label]=\"'shared.active' | translate\" />\n <f-checkbox [formField]=\"formTree.isDefault\" [label]=\"'localization.language.default' | translate\" />\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class LanguageFormPage {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly existingLanguage = signal<ILanguage | null>(null);\n readonly isEditMode = computed(() => !!this.existingLanguage());\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly directionOptions = computed(() => [\n {\n label: this.translate('localization.language.direction.ltr'),\n value: 'ltr',\n },\n {\n label: this.translate('localization.language.direction.rtl'),\n value: 'rtl',\n },\n ]);\n\n readonly formModel = signal<ILanguageFormModel>({\n code: '',\n name: '',\n nativeName: '',\n direction: 'ltr',\n serial: '',\n isActive: true,\n isDefault: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.code, {\n message: this.translate('localization.validation.code.required'),\n });\n maxLength(f.code, 10, {\n message: this.translate('localization.validation.code.max.length'),\n });\n required(f.name, {\n message: this.translate('localization.validation.name.required'),\n });\n maxLength(f.name, 100, {\n message: this.translate('localization.validation.name.max.length'),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.code.trim().length > 0 && model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadLanguage(id);\n }\n });\n }\n\n updateDirection(value: 'ltr' | 'rtl'): void {\n this.formModel.update((m) => ({ ...m, direction: value }));\n }\n\n loadLanguage(id: string): void {\n this.isSaving.set(true);\n from(this.languageService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingLanguage.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n },\n error: () => this.router.navigate(['/localization/languages']),\n });\n }\n\n private toFormModel(language: ILanguage): ILanguageFormModel {\n return {\n code: language.code,\n name: language.name,\n nativeName: language.nativeName ?? '',\n direction: language.direction ?? 'ltr',\n serial: language.serial?.toString() ?? '',\n isActive: language.isActive,\n isDefault: language.isDefault,\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const dto = {\n code: model.code,\n name: model.name,\n nativeName: model.nativeName || undefined,\n direction: model.direction,\n serial: model.serial ? parseInt(model.serial, 10) : undefined,\n isActive: model.isActive,\n isDefault: model.isDefault,\n };\n\n const operation$ = this.isEditMode()\n ? from(\n this.languageService.update({\n id: this.existingLanguage()!.id,\n ...dto,\n } as IUpdateLanguageDto),\n )\n : from(this.languageService.insert(dto as ICreateLanguageDto));\n\n operation$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.router.navigate(['/localization/languages']);\n }\n },\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/languages']);\n }\n}\n","import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport {\n AngularModule,\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\n\n@Component({\n selector: 'lib-language-list-page',\n imports: [AngularModule, UiModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.language.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.language.subtitle' | translate }}\n </p>\n </div>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'localization.language.new' | translate\n }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"languageService.data()\"\n [loading]=\"languageService.isLoading()\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'localization.language.code' | translate }}</th>\n <th>{{ 'localization.language.name' | translate }}</th>\n <th>{{ 'localization.language.native.name' | translate }}</th>\n <th>{{ 'localization.language.direction' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-lang>\n <tr>\n <td>\n <span class=\"uppercase font-semibold\">{{ lang.code }}</span>\n </td>\n <td>{{ lang.name }}</td>\n <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>\n <td>\n <f-tag\n [value]=\"\n lang.direction === 'rtl'\n ? ('localization.language.rtl' | translate)\n : ('localization.language.ltr' | translate)\n \"\n [severity]=\"lang.direction === 'rtl' ? 'warn' : 'info'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1 items-center\">\n <f-tag\n [value]=\"\n lang.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"lang.isActive ? 'success' : 'secondary'\"\n />\n @if (lang.isDefault) {\n <f-tag\n [value]=\"'localization.language.default' | translate\"\n severity=\"contrast\"\n />\n }\n </div>\n </td>\n <td>\n <div class=\"flex gap-1\">\n @if (!lang.isDefault) {\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n size=\"small\"\n [fTooltip]=\"\n 'localization.language.set.default' | translate\n \"\n (click)=\"onSetDefault(lang)\"\n >\n <ui-icon pButtonIcon name=\"star\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(lang.id)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"lang.isDefault\"\n (click)=\"onDelete(lang)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.language.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class LanguageListPage implements OnInit {\n readonly LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;\n\n private readonly router = inject(Router);\n readonly languageService = inject(LanguageApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.languageService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/languages/new']);\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'localization.language.confirm.set.default',\n { name: lang.name },\n ),\n header: this.translateService.translate(\n 'localization.language.set.default',\n ),\n icon: 'star',\n accept: () => {\n this.languageService\n .setDefault(lang.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate(\n 'localization.language.delete.title',\n ),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.languageService.delete({ id: lang.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n IconComponent,\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n TRANSLATION_KEY_PERMISSIONS,\n TranslatePipe,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n@Component({\n selector: 'lib-localization-container',\n imports: [RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe, IconComponent],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'localization.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'localization.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <lib-icon [icon]=\"tab.icon\"></lib-icon>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class LocalizationContainerPage {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n private readonly allTabs: ITab[] = [\n {\n id: 'languages',\n labelKey: 'localization.tabs.languages',\n icon: 'globe',\n route: 'languages',\n permission: LANGUAGE_PERMISSIONS.READ,\n },\n {\n id: 'keys',\n labelKey: 'localization.tabs.keys',\n icon: 'key',\n route: 'keys',\n permission: TRANSLATION_KEY_PERMISSIONS.READ,\n },\n ];\n\n readonly visibleTabs = computed(() => {\n // Explicitly track permissions signal for reactivity\n const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport {\n IBulkUpdateTranslationDto,\n TranslationApiService,\n} from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface ITranslationValue {\n languageId: string;\n value: string;\n translationId?: string;\n}\n\ninterface ITranslationKeyFormModel {\n key: string;\n module: string;\n defaultMessage: string;\n description: string;\n variables: string;\n}\n\n@Component({\n selector: 'lib-translation-key-form-page',\n imports: [UiModule, AngularModule, FormsModule, FormField, TranslatePipe],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.key.edit' | translate)\n : ('localization.key.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-6\">\n <!-- Key Info Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.about' | translate }}\n </h4>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Key Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"key\" class=\"font-medium\"\n >{{ 'localization.key.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"key\"\n [formField]=\"formTree.key\"\n [placeholder]=\"'localization.placeholder.key.name' | translate\"\n />\n </div>\n\n <!-- Module -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"module\" class=\"font-medium\"\n >{{ 'localization.key.module' | translate }} *</label\n >\n <f-select\n id=\"module\"\n [ngModel]=\"formModel().module\"\n (ngModelChange)=\"updateModule($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"moduleOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [editable]=\"true\"\n [placeholder]=\"'localization.key.select.module' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <!-- Default Message -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"defaultMessage\" class=\"font-medium\"\n >{{ 'localization.key.default.message' | translate }} *</label\n >\n <textarea\n fTextarea\n id=\"defaultMessage\"\n [formField]=\"formTree.defaultMessage\"\n [rows]=\"2\"\n [placeholder]=\"\n 'localization.placeholder.default.message' | translate\n \"\n ></textarea>\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'localization.key.description' | translate\n }}</label>\n <input\n fInputText\n id=\"description\"\n [formField]=\"formTree.description\"\n [placeholder]=\"\n 'localization.placeholder.key.description' | translate\n \"\n />\n </div>\n\n <!-- Variables -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"variables\" class=\"font-medium\">{{\n 'localization.key.variables' | translate\n }}</label>\n <input\n fInputText\n id=\"variables\"\n [formField]=\"formTree.variables\"\n [placeholder]=\"\n 'localization.key.variables.placeholder' | translate\n \"\n />\n <small class=\"text-muted-color\">{{\n 'localization.key.variables.hint' | translate\n }}</small>\n </div>\n </div>\n </div>\n\n <!-- Translations Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.translations.section' | translate }}\n </h4>\n @if (isLoadingLanguages()) {\n <div class=\"flex justify-center py-4\">\n <f-progressspinner strokeWidth=\"4\" />\n </div>\n } @else if (languages().length === 0) {\n <p class=\"text-muted-color text-center py-4\">\n {{ 'localization.key.no.languages' | translate }}\n </p>\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (lang of languages(); track lang.id) {\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex justify-between items-center\">\n <label class=\"font-medium\">\n {{ lang.name }}\n @if (lang.nativeName && lang.nativeName !== lang.name) {\n <span class=\"text-muted-color\"\n >({{ lang.nativeName }})</span\n >\n }\n </label>\n <f-tag\n [value]=\"lang.code\"\n severity=\"secondary\"\n class=\"uppercase\"\n />\n </div>\n <textarea\n fTextarea\n [ngModel]=\"getTranslationValue(lang.id)\"\n (ngModelChange)=\"setTranslationValue(lang.id, $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [rows]=\"2\"\n [placeholder]=\"\n formModel().defaultMessage ||\n ('localization.key.enter.translation' | translate)\n \"\n ></textarea>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class TranslationKeyFormPage implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly isLoadingLanguages = signal(false);\n readonly existingKey = signal<ITranslationKey | null>(null);\n readonly isEditMode = computed(() => !!this.existingKey());\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translations = signal<ITranslationValue[]>([]);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly moduleOptions = computed(() =>\n this.modules().map((m) => ({ label: m, value: m })),\n );\n\n readonly formModel = signal<ITranslationKeyFormModel>({\n key: '',\n module: '',\n defaultMessage: '',\n description: '',\n variables: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.key, {\n message: this.translate('localization.validation.key.required'),\n });\n required(f.defaultMessage, {\n message: this.translate(\n 'localization.validation.default.message.required',\n ),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.key.trim().length > 0 &&\n model.module.trim().length > 0 &&\n model.defaultMessage.trim().length > 0\n );\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadTranslationKey(id);\n }\n });\n }\n\n ngOnInit(): void {\n this.loadInitialData();\n }\n\n loadInitialData(): void {\n this.isLoadingLanguages.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingLanguages.set(false)),\n )\n .subscribe({\n next: ({ languages, modules }) => {\n if (languages.success && languages.data) {\n const activeLanguages = languages.data.filter((l) => l.isActive);\n this.languages.set(activeLanguages);\n this.initializeTranslations(activeLanguages);\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n },\n });\n }\n\n initializeTranslations(languages: ILanguage[]): void {\n const current = this.translations();\n if (current.length === 0) {\n this.translations.set(\n languages.map((lang) => ({ languageId: lang.id, value: '' })),\n );\n }\n }\n\n updateModule(value: string): void {\n this.formModel.update((m) => ({ ...m, module: value ?? '' }));\n }\n\n getTranslationValue(languageId: string): string {\n return (\n this.translations().find((t) => t.languageId === languageId)?.value ?? ''\n );\n }\n\n setTranslationValue(languageId: string, value: string): void {\n this.translations.update((list) => {\n const existing = list.find((t) => t.languageId === languageId);\n if (existing) {\n return list.map((t) =>\n t.languageId === languageId ? { ...t, value } : t,\n );\n }\n return [...list, { languageId, value }];\n });\n }\n\n loadTranslationKey(id: string): void {\n this.isSaving.set(true);\n from(this.translationKeyService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingKey.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n this.loadExistingTranslations(id);\n }\n },\n error: () => this.router.navigate(['/localization/keys']),\n });\n }\n\n loadExistingTranslations(keyId: string): void {\n this.translationService\n .getByKeyId(keyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translations.update((list) => {\n const updated = [...list];\n response.data!.forEach((t) => {\n const existing = updated.find(\n (tr) => tr.languageId === t.languageId,\n );\n if (existing) {\n existing.value = t.value;\n existing.translationId = t.id;\n } else {\n updated.push({\n languageId: t.languageId,\n value: t.value,\n translationId: t.id,\n });\n }\n });\n return updated;\n });\n }\n },\n });\n }\n\n private toFormModel(key: ITranslationKey): ITranslationKeyFormModel {\n return {\n key: key.key,\n module: key.module,\n defaultMessage: key.defaultMessage,\n description: key.description ?? '',\n variables: key.variables?.join(', ') ?? '',\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const variables = model.variables\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n\n if (this.isEditMode()) {\n this.updateKey(model, variables);\n } else {\n this.createKey(model, variables);\n }\n }\n\n private createKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const createDto: ICreateTranslationKeyDto = {\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.insert(createDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.saveTranslations(\n response.data.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private updateKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const updateDto: IUpdateTranslationKeyDto = {\n id: this.existingKey()!.id,\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.update(updateDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.saveTranslations(\n this.existingKey()!.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private saveTranslations(\n keyId: string,\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n const translationsToSave: IBulkUpdateTranslationDto[] = this.translations()\n .filter((t) => t.value?.trim())\n .map((t) => ({\n id: t.translationId,\n languageId: t.languageId,\n translationKeyId: keyId,\n value: t.value,\n isVerified: false,\n }));\n\n if (translationsToSave.length === 0) {\n this.onSaveSuccess(messageKey, messageVariables);\n return;\n }\n\n this.translationService\n .bulkUpdate(translationsToSave)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.onSaveSuccess(messageKey, messageVariables),\n error: () => this.onSaveSuccess(messageKey, messageVariables),\n });\n }\n\n private onSaveSuccess(\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: messageKey ? this.translate(messageKey, messageVariables) : '',\n });\n this.isSaving.set(false);\n this.router.navigate(['/localization/keys']);\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/keys']);\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { ITranslationKey } from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { TranslationApiService } from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\n\n@Component({\n selector: 'lib-translation-key-list-page',\n imports: [\n AngularModule,\n UiModule,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.key.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.key.subtitle' | translate }}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'localization.key.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col md:flex-row gap-4 mb-4\">\n <div class=\"flex-1\">\n <f-select\n [options]=\"moduleOptions()\"\n [ngModel]=\"selectedModule()\"\n (ngModelChange)=\"onModuleChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"'localization.key.filter.module' | translate\"\n [showClear]=\"true\"\n class=\"w-full\"\n />\n </div>\n <div class=\"flex-1\">\n <f-iconfield class=\"w-full\">\n <f-inputicon><ui-icon name=\"search\" /></f-inputicon>\n <input\n fInputText\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n </div>\n </div>\n\n <!-- Table -->\n <f-table\n [value]=\"filteredKeys()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"15\"\n [rowsPerPageOptions]=\"[10, 15, 25, 50]\"\n >\n <ng-template #header>\n <tr>\n <th style=\"width: 15%\">\n {{ 'localization.key.module' | translate }}\n </th>\n <th style=\"width: 25%\">\n {{ 'localization.key.name' | translate }}\n </th>\n <th style=\"width: 35%\">\n {{ 'localization.key.default.message' | translate }}\n </th>\n <th style=\"width: 10%\">\n {{ 'localization.key.translations' | translate }}\n </th>\n <th style=\"width: 15%\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-key>\n @let translationCount = getTranslationCount(key.id);\n @let languageCount = languages().length;\n <tr>\n <td>\n <f-tag [value]=\"key.module\" severity=\"secondary\" />\n </td>\n <td>\n <div class=\"font-medium\">{{ key.key }}</div>\n @if (key.description) {\n <small class=\"text-muted-color\">{{ key.description }}</small>\n }\n </td>\n <td>{{ key.defaultMessage }}</td>\n <td class=\"text-center\">\n <span\n class=\"text-sm\"\n [class.text-green-500]=\"translationCount === languageCount\"\n [class.text-orange-500]=\"\n translationCount < languageCount && translationCount > 0\n \"\n [class.text-muted-color]=\"translationCount === 0\"\n >\n {{ translationCount }}/{{ languageCount }}\n </span>\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(key)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(key)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.key.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n `,\n})\nexport class TranslationKeyListPage implements OnInit {\n readonly TRANSLATION_KEY_PERMISSIONS = TRANSLATION_KEY_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isLoading = signal(false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translationKeys = signal<ITranslationKey[]>([]);\n readonly translationCounts = signal<Map<string, number>>(new Map());\n readonly selectedModule = signal<string | null>(null);\n readonly searchTerm = signal('');\n\n readonly moduleOptions = computed(() => [\n { label: this.translateService.translate('shared.all'), value: null },\n ...this.modules().map((m) => ({ label: m, value: m })),\n ]);\n\n readonly filteredKeys = computed(() => {\n let keys = this.translationKeys();\n const module = this.selectedModule();\n const search = this.searchTerm().toLowerCase().trim();\n\n if (module) {\n keys = keys.filter((k) => k.module === module);\n }\n\n if (search) {\n keys = keys.filter(\n (k) =>\n k.key.toLowerCase().includes(search) ||\n k.defaultMessage.toLowerCase().includes(search) ||\n k.module.toLowerCase().includes(search),\n );\n }\n\n return keys;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n loadData(): void {\n this.isLoading.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n keys: from(\n this.translationKeyService.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n sort: { module: 'ASC', key: 'ASC' },\n }),\n ),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: ({ languages, modules, keys }) => {\n if (languages.success && languages.data) {\n this.languages.set(languages.data.filter((l) => l.isActive));\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n if (keys.success && keys.data) {\n this.translationKeys.set(keys.data);\n this.loadTranslationCounts();\n }\n this.isLoading.set(false);\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n });\n }\n\n getTranslationCount(keyId: string): number {\n return this.translationCounts().get(keyId) ?? 0;\n }\n\n onModuleChange(value: string | null): void {\n this.selectedModule.set(value);\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/keys/new']);\n }\n\n onEdit(key: ITranslationKey): void {\n this.router.navigate(['/localization/keys', key.id]);\n }\n\n onDelete(key: ITranslationKey): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate('localization.key.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.translationKeyService.delete({ id: key.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.loadData();\n }\n },\n });\n },\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { Routes } from '@angular/router';\nimport {\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n permissionGuard,\n SHARED_MESSAGES,\n resolveTranslationModule,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { LOCALIZATION_MESSAGES } from '../constants/messages';\n\n/**\n * Resolves which localization tab the current user should land on when\n * navigating to the bare `/localization` route. Mirrors the tab\n * visibility order in LocalizationContainerPage.visibleTabs so the\n * redirect never points at a tab the user can't actually see.\n */\nfunction resolveLocalizationDefaultTab(): string {\n const permissionValidator = inject(PermissionValidatorService);\n\n if (permissionValidator.hasPermission(LANGUAGE_PERMISSIONS.READ)) {\n return 'languages';\n }\n\n if (permissionValidator.hasPermission(TRANSLATION_KEY_PERMISSIONS.READ)) {\n return 'keys';\n }\n\n return 'languages';\n}\n\nexport const LOCALIZATION_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['localization'], fallbackMessages: { ...LOCALIZATION_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/localization-container/localization-container.page').then(\n (m) => m.LocalizationContainerPage,\n ),\n children: [\n // Languages Management\n {\n path: 'languages',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/language-list/language-list.page').then((m) => m.LanguageListPage),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n ],\n },\n\n // Translation Keys Management\n {\n path: 'keys',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/translation-key-list/translation-key-list.page').then(\n (m) => m.TranslationKeyListPage,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n ],\n },\n\n // Default redirect to the first tab the user has permission to see\n {\n path: '',\n redirectTo: () => resolveLocalizationDefaultTab(),\n pathMatch: 'full',\n },\n ],\n },\n];\n","// Interfaces\nexport * from './interfaces/language.interface';\nexport * from './interfaces/localization-config.interface';\nexport * from './interfaces/translation-key.interface';\nexport * from './interfaces/translation.interface';\n\n// Constants\nexport * from './constants/localization.constants';\nexport * from './constants/messages';\n\n// Services\nexport * from './services/language-api.service';\nexport * from './services/localization-api.service';\nexport * from './services/localization-initializer.service';\nexport * from './services/localization-state.service';\nexport * from './services/translation-api.service';\nexport * from './services/translation-key-api.service';\nexport * from './services/translation-loader.service';\n\n// Components\nexport * from './components/language-selector/language-selector.component';\n\n// Providers\nexport * from './providers/localization.providers';\n\n// Pages\nexport * from './pages/language-form/language-form.page';\nexport * from './pages/language-list/language-list.page';\nexport * from './pages/localization-container/localization-container.page';\nexport * from './pages/translation-key-form/translation-key-form.page';\nexport * from './pages/translation-key-list/translation-key-list.page';\n\n// Routes\nexport { LOCALIZATION_ROUTES } from './routes/localization.routes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-localization.mjs","sources":["../../../projects/ng-localization/interfaces/localization-config.interface.ts","../../../projects/ng-localization/constants/localization.constants.ts","../../../projects/ng-localization/constants/messages.ts","../../../projects/ng-localization/services/language-api.service.ts","../../../projects/ng-localization/services/localization-api.service.ts","../../../projects/ng-localization/services/localization-initializer.service.ts","../../../projects/ng-localization/services/localization-state.service.ts","../../../projects/ng-localization/services/translation-api.service.ts","../../../projects/ng-localization/services/translation-key-api.service.ts","../../../projects/ng-localization/services/translation-loader.service.ts","../../../projects/ng-localization/components/language-selector/language-selector.component.ts","../../../projects/ng-localization/components/language-selector-panel/language-selector-panel.component.ts","../../../projects/ng-localization/providers/localization.providers.ts","../../../projects/ng-localization/pages/language-form/language-form.page.ts","../../../projects/ng-localization/pages/language-list/language-list.page.ts","../../../projects/ng-localization/pages/localization-container/localization-container.page.ts","../../../projects/ng-localization/pages/translation-key-form/translation-key-form.page.ts","../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts","../../../projects/ng-localization/routes/localization.routes.ts","../../../projects/ng-localization/public-api.ts","../../../projects/ng-localization/flusys-ng-localization.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type LocalizationLoadStrategy = 'all' | 'modules';\n\n/** Localization system configuration */\nexport interface ILocalizationConfig {\n /** Default language code (e.g., 'en', 'ar') */\n defaultLanguageCode: string;\n /** Translation loading strategy (default: 'modules') */\n loadStrategy?: LocalizationLoadStrategy;\n /** Modules to load at app initialization (default: []) */\n initialModules?: string[];\n /** Show language selector in layout (default: false) */\n enableLayoutSelector?: boolean;\n}\n\nexport const LOCALIZATION_CONFIG = new InjectionToken<ILocalizationConfig>(\n 'LOCALIZATION_CONFIG',\n);\n\n/** Get localization config with sensible defaults applied */\nexport function getLocalizationConfig(\n overrides?: Partial<ILocalizationConfig>,\n): ILocalizationConfig {\n const defaults: ILocalizationConfig = {\n defaultLanguageCode: 'en',\n loadStrategy: 'all',\n initialModules: [],\n enableLayoutSelector: false,\n };\n\n return {\n ...defaults,\n ...overrides,\n defaultLanguageCode:\n overrides?.defaultLanguageCode || defaults.defaultLanguageCode,\n };\n}\n","export const STORAGE_KEYS = {\n CURRENT_LANGUAGE: 'flusys.language',\n} as const;\n","export const LOCALIZATION_MESSAGES: Record<string, string> = {\n // Language CRUD (API keys)\n 'language.create.success': 'Language created successfully',\n 'language.create.many.success': '{{count}} languages created successfully',\n 'language.get.success': 'Language retrieved successfully',\n 'language.get.by.ids.success': 'Languages retrieved successfully by Ids',\n 'language.get.by.filter.success':\n 'Languages retrieved successfully by filter',\n 'language.get.all.success': 'Languages retrieved successfully',\n 'language.update.success': 'Language updated successfully',\n 'language.update.many.success': '{{count}} languages updated successfully',\n 'language.delete.success': 'Language deleted successfully',\n 'language.restore.success': 'Language restored successfully',\n 'language.readonly.update.forbidden':\n 'Cannot modify code/name of readonly language \"{{name}}\"',\n 'language.readonly.delete.forbidden': 'Cannot delete readonly language(s): {{names}}',\n 'language.default.delete.forbidden':\n 'Cannot delete the default language(s): {{names}}. Set another language as default first.',\n 'language.active.success': 'Active languages retrieved successfully',\n 'language.set.default.success': 'Default language updated successfully',\n 'language.get.default.success': 'Default language retrieved successfully',\n\n // Translation key CRUD (API keys)\n 'translation.key.create.success': 'Translation key created successfully',\n 'translation.key.create.many.success':\n '{{count}} translation keys created successfully',\n 'translation.key.get.success': 'Translation key retrieved successfully',\n 'translation.key.get.by.ids.success':\n 'Translation keys retrieved successfully by Ids',\n 'translation.key.get.by.filter.success':\n 'Translation keys retrieved successfully by filter',\n 'translation.key.get.all.success': 'Translation keys retrieved successfully',\n 'translation.key.update.success': 'Translation key updated successfully',\n 'translation.key.update.many.success':\n '{{count}} translation keys updated successfully',\n 'translation.key.delete.success': 'Translation key deleted successfully',\n 'translation.key.restore.success': 'Translation key restored successfully',\n 'translation.key.modules.success': 'Modules retrieved successfully',\n 'translation.key.readonly.delete.forbidden':\n 'Cannot delete readonly translation keys: {{keys}}',\n 'translation.key.readonly.update.forbidden':\n 'Cannot modify key or module of system translation keys',\n 'translation.key.duplicate.key.in.module':\n 'Translation key \"{{key}}\" already exists in module \"{{module}}\"',\n\n // Translation CRUD (API keys)\n 'translation.create.success': 'Translation created successfully',\n 'translation.create.many.success':\n '{{count}} translations created successfully',\n 'translation.get.success': 'Translation retrieved successfully',\n 'translation.get.by.ids.success':\n 'Translations retrieved successfully by Ids',\n 'translation.get.by.filter.success':\n 'Translations retrieved successfully by filter',\n 'translation.get.all.success': 'Translations retrieved successfully',\n 'translation.update.success': 'Translation updated successfully',\n 'translation.update.many.success':\n '{{count}} translations updated successfully',\n 'translation.delete.success': 'Translation deleted successfully',\n 'translation.restore.success': 'Translation restored successfully',\n 'translation.by.language.success': 'Translations retrieved successfully',\n\n // pages/localization-container/localization-container.page.ts\n 'localization.title': 'Localization',\n 'localization.subtitle': 'Manage languages and translations',\n 'localization.tabs.languages': 'Languages',\n 'localization.tabs.keys': 'Keys',\n\n // pages/language-list/language-list.page.ts\n 'localization.language.title': 'Languages',\n 'localization.language.subtitle':\n 'Manage available languages for your application',\n 'localization.language.new': 'Add Language',\n 'localization.language.code': 'Language Code',\n 'localization.language.name': 'Language Name',\n 'localization.language.native.name': 'Native Name',\n 'localization.language.direction': 'Text Direction',\n 'localization.language.rtl': 'RTL',\n 'localization.language.ltr': 'LTR',\n 'localization.language.default': 'Default',\n 'localization.language.set.default': 'Set as Default',\n 'localization.language.empty':\n 'No languages configured. Add a language to get started.',\n 'localization.language.confirm.set.default':\n 'Set \"{{name}}\" as the default language?',\n 'localization.language.delete.title': 'Delete Language',\n 'localization.language.default.delete.forbidden':\n 'Cannot delete the default language. Set another language as default first.',\n 'localization.language.readonly.delete.forbidden':\n 'This is a system language and cannot be deleted',\n\n // pages/language-form/language-form.page.ts\n 'localization.language.edit': 'Edit Language',\n 'localization.language.readonly.edit.hint':\n 'This is a system language — its code, name, native name, and direction cannot be changed',\n 'localization.placeholder.code': 'en',\n 'localization.language.iso.code.hint':\n 'ISO 639-1 language code (e.g., en, ar, fr)',\n 'localization.placeholder.name': 'English',\n 'localization.placeholder.native.name': 'English',\n 'localization.language.native.name.hint':\n 'Name in the native language (e.g., العربية for Arabic)',\n 'localization.language.display.order': 'Display Order',\n 'localization.language.direction.ltr': 'Left to Right (LTR)',\n 'localization.language.direction.rtl': 'Right to Left (RTL)',\n 'localization.validation.code.required': 'Language code is required',\n 'localization.validation.code.max.length':\n 'Language code must be at most 10 characters',\n 'localization.validation.name.required': 'Language name is required',\n 'localization.validation.name.max.length':\n 'Language name must be at most 100 characters',\n\n // pages/translation-key-list/translation-key-list.page.ts\n 'localization.key.title': 'Translation Keys',\n 'localization.key.subtitle': 'Manage translation keys for your application',\n 'localization.key.new': 'Add Key',\n 'localization.key.filter.module': 'Filter by module',\n 'localization.key.module': 'Module',\n 'localization.key.name': 'Key Name',\n 'localization.key.default.message': 'Default Message',\n 'localization.key.translations': 'Translations',\n 'localization.key.empty': 'No translation keys found',\n 'localization.key.delete.title': 'Delete Translation Key',\n 'localization.key.readonly.delete.forbidden':\n 'This is a system translation key and cannot be deleted',\n 'localization.key.readonly.edit.hint':\n 'This is a system key — its key name and module cannot be changed',\n\n // pages/translation-key-form/translation-key-form.page.ts\n 'localization.key.edit': 'Edit Key',\n 'localization.key.about': 'Key Information',\n 'localization.placeholder.key.name': 'button.submit',\n 'localization.key.select.module': 'Select or enter module',\n 'localization.placeholder.default.message': 'Enter default value (English)',\n 'localization.key.description': 'Description',\n 'localization.placeholder.key.description':\n 'Optional description for translators',\n 'localization.key.variables': 'Variables',\n 'localization.key.variables.placeholder': 'e.g., name, count, date',\n 'localization.key.variables.hint':\n 'Enter variable names used in this translation',\n 'localization.key.translations.section': 'Translations',\n 'localization.key.no.languages': 'No active languages configured',\n 'localization.key.enter.translation': 'Enter translation',\n 'localization.validation.key.required': 'Translation key is required',\n 'localization.validation.default.message.required':\n 'Default message is required',\n};\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LanguageApiService extends ApiResourceService<\n ICreateLanguageDto | IUpdateLanguageDto,\n ILanguage\n> {\n constructor() {\n super('language', 'localization');\n }\n\n setDefault(id: string): Observable<ISingleResponse<ILanguage>> {\n return this.http.post<ISingleResponse<ILanguage>>(\n `${this.baseUrl}/set-default`,\n { id },\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { IListResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationApiService {\n private readonly http = inject(HttpClient);\n private readonly appConfig = inject(APP_CONFIG);\n\n private get baseUrl(): string {\n return `${this.appConfig.apiBaseUrl}/localization`;\n }\n\n getActiveLanguages(): Observable<IListResponse<ILanguage>> {\n return this.http.post<IListResponse<ILanguage>>(`${this.baseUrl}/language/get-active`, {});\n }\n\n getTranslationsByLanguage(languageCode: string, modules?: string[]): Observable<ISingleResponse<ITranslationsMap>> {\n return this.http.post<ISingleResponse<ITranslationsMap>>(\n `${this.baseUrl}/translation/get-by-language`,\n { languageCode, ...(modules?.length ? { modules } : {}) },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom } from 'rxjs';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationInitializerService {\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async initialize(\n initialFallbackMessages?: Record<string, string>,\n ): Promise<void> {\n try {\n this.stateService.setLoading(true);\n if (initialFallbackMessages) {\n this.stateService.updateFallbackMessages(initialFallbackMessages);\n }\n const languagesResponse = await firstValueFrom(\n this.apiService.getActiveLanguages(),\n );\n if (languagesResponse.success && languagesResponse.data) {\n this.stateService.setAvailableLanguages(languagesResponse.data);\n\n const savedCode = this.stateService.getSavedLanguageCode();\n let selectedLanguage = languagesResponse.data.find(\n (l) => l.code === savedCode,\n );\n\n if (!selectedLanguage) {\n selectedLanguage = languagesResponse.data.find((l) => l.isDefault);\n }\n\n if (!selectedLanguage && languagesResponse.data.length > 0) {\n selectedLanguage = languagesResponse.data[0];\n }\n\n if (selectedLanguage) {\n this.stateService.setCurrentLanguage(selectedLanguage);\n }\n }\n } catch (error) {\n // Silently fail - use default language\n } finally {\n this.stateService.setLoading(false);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n computed,\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport { STORAGE_KEYS } from '../constants/localization.constants';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationStateService {\n private readonly platformService = inject(PlatformService);\n private readonly document = inject(DOCUMENT);\n private readonly appRef = inject(ApplicationRef);\n private readonly _loadedModules = new Set<string>();\n private readonly _currentLanguage = signal<ILanguage | null>(null);\n private readonly _availableLanguages = signal<ILanguage[]>([]);\n private readonly _translations = signal<ITranslationsMap>({});\n private readonly _fallbackMessages = signal<ITranslationsMap>({});\n private readonly _isLoading = signal<boolean>(false);\n\n readonly availableLanguages = this._availableLanguages.asReadonly();\n readonly translations = this._translations.asReadonly();\n readonly fallbackMessages = this._fallbackMessages.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n\n readonly currentLanguageCode = computed(\n () => this._currentLanguage()?.code ?? 'en',\n );\n\n constructor() {\n effect(() => {\n const language = this._currentLanguage();\n if (language && !this.platformService.isServer) {\n this.document.documentElement.dir = language.direction ?? 'ltr';\n this.document.documentElement.lang = language.code;\n localStorage.setItem(STORAGE_KEYS.CURRENT_LANGUAGE, language.code);\n }\n });\n\n effect(() => {\n this._translations();\n setTimeout(() => this.appRef.tick(), 0);\n });\n }\n\n setCurrentLanguage(language: ILanguage): void {\n this._currentLanguage.set(language);\n }\n\n setAvailableLanguages(languages: ILanguage[]): void {\n this._availableLanguages.set(languages);\n }\n\n setTranslations(translations: ITranslationsMap): void {\n this._translations.set(translations);\n }\n\n mergeTranslations(translations: ITranslationsMap): void {\n this._translations.update((current) => ({ ...current, ...translations }));\n }\n\n setLoading(loading: boolean): void {\n this._isLoading.set(loading);\n }\n\n getSavedLanguageCode(): string | null {\n if (this.platformService.isServer) return null;\n return localStorage.getItem(STORAGE_KEYS.CURRENT_LANGUAGE);\n }\n\n isModuleLoaded(module: string): boolean {\n return this._loadedModules.has(module);\n }\n\n markModuleLoaded(module: string): void {\n this._loadedModules.add(module);\n }\n\n getLoadedModules(): string[] {\n return Array.from(this._loadedModules);\n }\n\n clearLoadedModules(): void {\n this._loadedModules.clear();\n }\n\n updateFallbackMessages(messages: ITranslationsMap): void {\n this._fallbackMessages.update((current) => ({ ...current, ...messages }));\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IListResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ITranslation } from '../interfaces/translation.interface';\n\nexport interface ICreateTranslationDto {\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n isActive?: boolean;\n}\n\nexport interface IUpdateTranslationDto extends Partial<ICreateTranslationDto> {\n id: string;\n}\n\nexport interface IBulkUpdateTranslationDto {\n id?: string;\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationApiService extends ApiResourceService<\n ICreateTranslationDto | IUpdateTranslationDto,\n ITranslation\n> {\n constructor() {\n super('translation', 'localization');\n }\n\n getByKeyId(\n translationKeyId: string,\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/get-all`,\n {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { translationKeyId },\n sort: {},\n },\n );\n }\n\n getCounts(): Observable<ISingleResponse<Record<string, number>>> {\n return this.http.post<ISingleResponse<Record<string, number>>>(\n `${this.baseUrl}/get-counts`,\n {},\n );\n }\n\n bulkUpdate(\n translations: IBulkUpdateTranslationDto[],\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/update-many-values`,\n { translations },\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../interfaces/translation-key.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationKeyApiService extends ApiResourceService<\n ICreateTranslationKeyDto | IUpdateTranslationKeyDto,\n ITranslationKey\n> {\n constructor() {\n super('translation-key', 'localization');\n }\n\n getModules(): Observable<ISingleResponse<string[]>> {\n return this.http.post<ISingleResponse<string[]>>(\n `${this.baseUrl}/get-modules`,\n {},\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom, from, Observable } from 'rxjs';\nimport { LOCALIZATION_CONFIG } from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationLoaderService {\n private readonly DEFAULT_INITIAL_MODULES = ['shared', 'layout'];\n private readonly config = inject(LOCALIZATION_CONFIG, { optional: true });\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async loadTranslations(\n languageCode: string,\n clearModules = false,\n ): Promise<void> {\n const strategy = this.config?.loadStrategy ?? 'all';\n\n // Save currently loaded modules before clearing (for language switch)\n const previouslyLoadedModules = clearModules\n ? this.stateService.getLoadedModules()\n : [];\n\n if (clearModules) {\n this.stateService.clearLoadedModules();\n }\n\n this.stateService.setLoading(true);\n\n try {\n if (strategy === 'all') {\n await this.loadAndSetTranslations(languageCode);\n } else {\n const modules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n await this.loadAndSetTranslations(languageCode, modules);\n // Reload all previously loaded modules for the new language\n if (previouslyLoadedModules.length > 0) {\n await this.reloadModules(languageCode, previouslyLoadedModules);\n }\n }\n } finally {\n this.stateService.setLoading(false);\n }\n }\n\n private async loadAndSetTranslations(\n languageCode: string,\n modules?: string[],\n ): Promise<void> {\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(languageCode, modules),\n );\n if (response.success && response.data) {\n this.stateService.setTranslations(response.data);\n if (modules) {\n modules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n }\n\n private async reloadModules(\n languageCode: string,\n modules: string[],\n ): Promise<void> {\n const initialModules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n const additionalModules = modules.filter(\n (m) => !initialModules.includes(m),\n );\n\n if (additionalModules.length === 0) return;\n\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(\n languageCode,\n additionalModules,\n ),\n );\n\n if (response.success && response.data) {\n this.stateService.mergeTranslations(response.data);\n additionalModules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n\n loadTranslationsAsync(\n languageCode: string,\n clearModules = false,\n ): Observable<void> {\n return from(this.loadTranslations(languageCode, clearModules));\n }\n}\n","import { Component, DestroyRef, computed, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuItem, UiModule } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector',\n imports: [UiModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"menu.visible()\"\n (click)=\"menu.toggle($event)\"\n >\n <ui-icon name=\"globe\"></ui-icon>\n <span class=\"font-semibold\">{{\n selectedLanguage()?.nativeName ||\n selectedLanguage()?.name ||\n selectedLanguageCode()\n }}</span>\n </button>\n <f-menu\n #menu\n [model]=\"menuItems()\"\n [popup]=\"true\"\n class=\"absolute left-[0]\"\n [style]=\"{ 'inset-inline-end': '0' }\"\n />\n `,\n})\nexport class LanguageSelectorComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n readonly selectedLanguageCode = this.localizationState.currentLanguageCode;\n readonly selectedLanguage = computed(\n () =>\n this.languages().find((l) => l.code === this.selectedLanguageCode()) ??\n null,\n );\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector-panel',\n imports: [MenuComponent],\n host: {\n class: 'hidden absolute z-50 top-[24px] p-3 min-w-[180px]',\n style: 'inset-inline-end: 0;',\n },\n template: `<f-menu [model]=\"menuItems()\" />`,\n})\nexport class LanguageSelectorPanelComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _selectedLanguageCode = signal<string>(\n this.localizationState.currentLanguageCode(),\n );\n readonly selectedLanguageCode = this._selectedLanguageCode.asReadonly();\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n constructor() {\n effect(() => {\n const currentCode = this.localizationState.currentLanguageCode();\n if (currentCode !== this._selectedLanguageCode()) {\n this._selectedLanguageCode.set(currentCode);\n }\n });\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this._selectedLanguageCode.set(code);\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n provideAppInitializer,\n Provider,\n} from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_LANGUAGE_SELECTOR_PANEL,\n} from '@flusys/ng-layout';\nimport { LanguageSelectorPanelComponent } from '../components/language-selector-panel/language-selector-panel.component';\nimport { LanguageSelectorComponent } from '../components/language-selector/language-selector.component';\nimport {\n ILocalizationConfig,\n LOCALIZATION_CONFIG,\n} from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from '../services/localization-api.service';\nimport { LocalizationInitializerService } from '../services/localization-initializer.service';\nimport { LocalizationStateService } from '../services/localization-state.service';\n\nexport function provideLocalization(\n config: ILocalizationConfig,\n initialFallbackMessages?: Record<string, string>,\n): Array<Provider | EnvironmentProviders> {\n const providers: Array<Provider | EnvironmentProviders> = [\n // 1. Value/Existing Providers\n { provide: LOCALIZATION_CONFIG, useValue: config },\n {\n provide: LOCALIZATION_STATE_SERVICE,\n useExisting: LocalizationStateService,\n },\n { provide: LOCALIZATION_API_SERVICE, useExisting: LocalizationApiService },\n\n // 2. The Service itself\n LocalizationInitializerService,\n\n // 3. The modern Initializer\n provideAppInitializer(() => {\n const initializer = inject(LocalizationInitializerService);\n return initializer.initialize(initialFallbackMessages);\n }),\n ];\n\n if (config.enableLayoutSelector) {\n providers.push(\n {\n provide: LAYOUT_LANGUAGE_SELECTOR,\n useValue: LanguageSelectorComponent,\n },\n {\n provide: LAYOUT_LANGUAGE_SELECTOR_PANEL,\n useValue: LanguageSelectorPanelComponent,\n },\n );\n }\n\n return providers;\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport {\n disabled,\n form,\n FormField,\n maxLength,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, from } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface ILanguageFormModel {\n code: string;\n name: string;\n nativeName: string;\n direction: 'ltr' | 'rtl';\n serial: string;\n isActive: boolean;\n isDefault: boolean;\n}\n\n@Component({\n selector: 'lib-language-form-page',\n imports: [UiModule, AngularModule, FormsModule, FormField, TranslatePipe],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.language.edit' | translate)\n : ('localization.language.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Language Code -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"code\" class=\"font-medium\"\n >{{ 'localization.language.code' | translate }} *</label\n >\n <input\n fInputText\n id=\"code\"\n [formField]=\"formTree.code\"\n [placeholder]=\"'localization.placeholder.code' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.iso.code.hint' | translate\n }}</small>\n </div>\n\n <!-- Language Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'localization.language.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'localization.placeholder.name' | translate\"\n />\n </div>\n\n <!-- Native Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"nativeName\" class=\"font-medium\">{{\n 'localization.language.native.name' | translate\n }}</label>\n <input\n fInputText\n id=\"nativeName\"\n [formField]=\"formTree.nativeName\"\n [placeholder]=\"'localization.placeholder.native.name' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.native.name.hint' | translate\n }}</small>\n </div>\n\n <!-- Text Direction -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"direction\" class=\"font-medium\"\n >{{ 'localization.language.direction' | translate }} *</label\n >\n <f-select\n id=\"direction\"\n [ngModel]=\"formModel().direction\"\n (ngModelChange)=\"updateDirection($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"directionOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [disabled]=\"isReadonly()\"\n class=\"w-full\"\n />\n @if (isReadonly()) {\n <small class=\"text-muted-color\">{{\n 'localization.language.readonly.edit.hint' | translate\n }}</small>\n }\n </div>\n\n <!-- Display Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'localization.language.display.order' | translate\n }}</label>\n <input\n fInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"formTree.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Empty cell for alignment -->\n <div class=\"hidden md:block\"></div>\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <f-checkbox [formField]=\"formTree.isActive\" [label]=\"'shared.active' | translate\" />\n <f-checkbox [formField]=\"formTree.isDefault\" [label]=\"'localization.language.default' | translate\" />\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class LanguageFormPage {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly existingLanguage = signal<ILanguage | null>(null);\n readonly isEditMode = computed(() => !!this.existingLanguage());\n readonly isReadonly = computed(() => this.existingLanguage()?.isReadonly ?? false);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly directionOptions = computed(() => [\n {\n label: this.translate('localization.language.direction.ltr'),\n value: 'ltr',\n },\n {\n label: this.translate('localization.language.direction.rtl'),\n value: 'rtl',\n },\n ]);\n\n readonly formModel = signal<ILanguageFormModel>({\n code: '',\n name: '',\n nativeName: '',\n direction: 'ltr',\n serial: '',\n isActive: true,\n isDefault: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.code, {\n message: this.translate('localization.validation.code.required'),\n });\n maxLength(f.code, 10, {\n message: this.translate('localization.validation.code.max.length'),\n });\n required(f.name, {\n message: this.translate('localization.validation.name.required'),\n });\n maxLength(f.name, 100, {\n message: this.translate('localization.validation.name.max.length'),\n });\n disabled(f.code, { when: () => this.isReadonly() });\n disabled(f.name, { when: () => this.isReadonly() });\n disabled(f.nativeName, { when: () => this.isReadonly() });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.code.trim().length > 0 && model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadLanguage(id);\n }\n });\n }\n\n updateDirection(value: 'ltr' | 'rtl'): void {\n this.formModel.update((m) => ({ ...m, direction: value }));\n }\n\n loadLanguage(id: string): void {\n this.isSaving.set(true);\n from(this.languageService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingLanguage.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n },\n error: () => this.router.navigate(['/localization/languages']),\n });\n }\n\n private toFormModel(language: ILanguage): ILanguageFormModel {\n return {\n code: language.code,\n name: language.name,\n nativeName: language.nativeName ?? '',\n direction: language.direction ?? 'ltr',\n serial: language.serial?.toString() ?? '',\n isActive: language.isActive,\n isDefault: language.isDefault,\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const dto = {\n code: model.code,\n name: model.name,\n nativeName: model.nativeName || undefined,\n direction: model.direction,\n serial: model.serial ? parseInt(model.serial, 10) : undefined,\n isActive: model.isActive,\n isDefault: model.isDefault,\n };\n\n const operation$ = this.isEditMode()\n ? from(\n this.languageService.update({\n id: this.existingLanguage()!.id,\n ...dto,\n } as IUpdateLanguageDto),\n )\n : from(this.languageService.insert(dto as ICreateLanguageDto));\n\n operation$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.router.navigate(['/localization/languages']);\n }\n },\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/languages']);\n }\n}\n","import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport {\n AngularModule,\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\n\n@Component({\n selector: 'lib-language-list-page',\n imports: [AngularModule, UiModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.language.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.language.subtitle' | translate }}\n </p>\n </div>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'localization.language.new' | translate\n }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"languageService.data()\"\n [loading]=\"languageService.isLoading()\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'localization.language.code' | translate }}</th>\n <th>{{ 'localization.language.name' | translate }}</th>\n <th>{{ 'localization.language.native.name' | translate }}</th>\n <th>{{ 'localization.language.direction' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-lang>\n <tr>\n <td>\n <span class=\"uppercase font-semibold\">{{ lang.code }}</span>\n </td>\n <td>{{ lang.name }}</td>\n <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>\n <td>\n <f-tag\n [value]=\"\n lang.direction === 'rtl'\n ? ('localization.language.rtl' | translate)\n : ('localization.language.ltr' | translate)\n \"\n [severity]=\"lang.direction === 'rtl' ? 'warn' : 'info'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1 items-center\">\n <f-tag\n [value]=\"\n lang.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"lang.isActive ? 'success' : 'secondary'\"\n />\n @if (lang.isDefault) {\n <f-tag\n [value]=\"'localization.language.default' | translate\"\n severity=\"contrast\"\n />\n }\n @if (lang.isReadonly) {\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"warn\"\n />\n }\n </div>\n </td>\n <td>\n <div class=\"flex gap-1\">\n @if (!lang.isDefault) {\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n size=\"small\"\n [fTooltip]=\"\n 'localization.language.set.default' | translate\n \"\n (click)=\"onSetDefault(lang)\"\n >\n <ui-icon pButtonIcon name=\"star\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(lang.id)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"\n (lang.isDefault\n ? 'localization.language.default.delete.forbidden'\n : lang.isReadonly\n ? 'localization.language.readonly.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n [disabled]=\"lang.isDefault || lang.isReadonly\"\n (click)=\"onDelete(lang)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.language.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class LanguageListPage implements OnInit {\n readonly LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;\n\n private readonly router = inject(Router);\n readonly languageService = inject(LanguageApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.languageService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/languages/new']);\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'localization.language.confirm.set.default',\n { name: lang.name },\n ),\n header: this.translateService.translate(\n 'localization.language.set.default',\n ),\n icon: 'star',\n accept: () => {\n this.languageService\n .setDefault(lang.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate(\n 'localization.language.delete.title',\n ),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.languageService.delete({ id: lang.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n IconComponent,\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n TRANSLATION_KEY_PERMISSIONS,\n TranslatePipe,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n@Component({\n selector: 'lib-localization-container',\n imports: [RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe, IconComponent],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'localization.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'localization.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <lib-icon [icon]=\"tab.icon\"></lib-icon>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class LocalizationContainerPage {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n private readonly allTabs: ITab[] = [\n {\n id: 'languages',\n labelKey: 'localization.tabs.languages',\n icon: 'globe',\n route: 'languages',\n permission: LANGUAGE_PERMISSIONS.READ,\n },\n {\n id: 'keys',\n labelKey: 'localization.tabs.keys',\n icon: 'key',\n route: 'keys',\n permission: TRANSLATION_KEY_PERMISSIONS.READ,\n },\n ];\n\n readonly visibleTabs = computed(() => {\n // Explicitly track permissions signal for reactivity\n const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { disabled, form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport {\n IBulkUpdateTranslationDto,\n TranslationApiService,\n} from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface ITranslationValue {\n languageId: string;\n value: string;\n translationId?: string;\n}\n\ninterface ITranslationKeyFormModel {\n key: string;\n module: string;\n defaultMessage: string;\n description: string;\n variables: string;\n}\n\n@Component({\n selector: 'lib-translation-key-form-page',\n imports: [UiModule, AngularModule, FormsModule, FormField, TranslatePipe],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.key.edit' | translate)\n : ('localization.key.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-6\">\n <!-- Key Info Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.about' | translate }}\n </h4>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Key Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"key\" class=\"font-medium\"\n >{{ 'localization.key.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"key\"\n [formField]=\"formTree.key\"\n [placeholder]=\"'localization.placeholder.key.name' | translate\"\n />\n </div>\n\n <!-- Module -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"module\" class=\"font-medium\"\n >{{ 'localization.key.module' | translate }} *</label\n >\n <f-select\n id=\"module\"\n [ngModel]=\"formModel().module\"\n (ngModelChange)=\"updateModule($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"moduleOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [editable]=\"true\"\n [disabled]=\"isReadonly()\"\n [placeholder]=\"'localization.key.select.module' | translate\"\n class=\"w-full\"\n />\n </div>\n\n @if (isReadonly()) {\n <div class=\"md:col-span-2 -mt-2\">\n <small class=\"text-muted-color\">{{\n 'localization.key.readonly.edit.hint' | translate\n }}</small>\n </div>\n }\n\n <!-- Default Message -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"defaultMessage\" class=\"font-medium\"\n >{{ 'localization.key.default.message' | translate }} *</label\n >\n <textarea\n fTextarea\n id=\"defaultMessage\"\n [formField]=\"formTree.defaultMessage\"\n [rows]=\"2\"\n [placeholder]=\"\n 'localization.placeholder.default.message' | translate\n \"\n ></textarea>\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'localization.key.description' | translate\n }}</label>\n <input\n fInputText\n id=\"description\"\n [formField]=\"formTree.description\"\n [placeholder]=\"\n 'localization.placeholder.key.description' | translate\n \"\n />\n </div>\n\n <!-- Variables -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"variables\" class=\"font-medium\">{{\n 'localization.key.variables' | translate\n }}</label>\n <input\n fInputText\n id=\"variables\"\n [formField]=\"formTree.variables\"\n [placeholder]=\"\n 'localization.key.variables.placeholder' | translate\n \"\n />\n <small class=\"text-muted-color\">{{\n 'localization.key.variables.hint' | translate\n }}</small>\n </div>\n </div>\n </div>\n\n <!-- Translations Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.translations.section' | translate }}\n </h4>\n @if (isLoadingLanguages()) {\n <div class=\"flex justify-center py-4\">\n <f-progressspinner strokeWidth=\"4\" />\n </div>\n } @else if (languages().length === 0) {\n <p class=\"text-muted-color text-center py-4\">\n {{ 'localization.key.no.languages' | translate }}\n </p>\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (lang of languages(); track lang.id) {\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex justify-between items-center\">\n <label class=\"font-medium\">\n {{ lang.name }}\n @if (lang.nativeName && lang.nativeName !== lang.name) {\n <span class=\"text-muted-color\"\n >({{ lang.nativeName }})</span\n >\n }\n </label>\n <f-tag\n [value]=\"lang.code\"\n severity=\"secondary\"\n class=\"uppercase\"\n />\n </div>\n <textarea\n fTextarea\n [ngModel]=\"getTranslationValue(lang.id)\"\n (ngModelChange)=\"setTranslationValue(lang.id, $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [rows]=\"2\"\n [placeholder]=\"\n formModel().defaultMessage ||\n ('localization.key.enter.translation' | translate)\n \"\n ></textarea>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class TranslationKeyFormPage implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly isLoadingLanguages = signal(false);\n readonly existingKey = signal<ITranslationKey | null>(null);\n readonly isEditMode = computed(() => !!this.existingKey());\n readonly isReadonly = computed(() => this.existingKey()?.isReadonly ?? false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translations = signal<ITranslationValue[]>([]);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly moduleOptions = computed(() =>\n this.modules().map((m) => ({ label: m, value: m })),\n );\n\n readonly formModel = signal<ITranslationKeyFormModel>({\n key: '',\n module: '',\n defaultMessage: '',\n description: '',\n variables: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.key, {\n message: this.translate('localization.validation.key.required'),\n });\n required(f.defaultMessage, {\n message: this.translate(\n 'localization.validation.default.message.required',\n ),\n });\n disabled(f.key, { when: () => this.isReadonly() });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.key.trim().length > 0 &&\n model.module.trim().length > 0 &&\n model.defaultMessage.trim().length > 0\n );\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadTranslationKey(id);\n }\n });\n }\n\n ngOnInit(): void {\n this.loadInitialData();\n }\n\n loadInitialData(): void {\n this.isLoadingLanguages.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingLanguages.set(false)),\n )\n .subscribe({\n next: ({ languages, modules }) => {\n if (languages.success && languages.data) {\n const activeLanguages = languages.data.filter((l) => l.isActive);\n this.languages.set(activeLanguages);\n this.initializeTranslations(activeLanguages);\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n },\n });\n }\n\n initializeTranslations(languages: ILanguage[]): void {\n const current = this.translations();\n if (current.length === 0) {\n this.translations.set(\n languages.map((lang) => ({ languageId: lang.id, value: '' })),\n );\n }\n }\n\n updateModule(value: string): void {\n this.formModel.update((m) => ({ ...m, module: value ?? '' }));\n }\n\n getTranslationValue(languageId: string): string {\n return (\n this.translations().find((t) => t.languageId === languageId)?.value ?? ''\n );\n }\n\n setTranslationValue(languageId: string, value: string): void {\n this.translations.update((list) => {\n const existing = list.find((t) => t.languageId === languageId);\n if (existing) {\n return list.map((t) =>\n t.languageId === languageId ? { ...t, value } : t,\n );\n }\n return [...list, { languageId, value }];\n });\n }\n\n loadTranslationKey(id: string): void {\n this.isSaving.set(true);\n from(this.translationKeyService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingKey.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n this.loadExistingTranslations(id);\n }\n },\n error: () => this.router.navigate(['/localization/keys']),\n });\n }\n\n loadExistingTranslations(keyId: string): void {\n this.translationService\n .getByKeyId(keyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translations.update((list) => {\n const updated = [...list];\n response.data!.forEach((t) => {\n const existing = updated.find(\n (tr) => tr.languageId === t.languageId,\n );\n if (existing) {\n existing.value = t.value;\n existing.translationId = t.id;\n } else {\n updated.push({\n languageId: t.languageId,\n value: t.value,\n translationId: t.id,\n });\n }\n });\n return updated;\n });\n }\n },\n });\n }\n\n private toFormModel(key: ITranslationKey): ITranslationKeyFormModel {\n return {\n key: key.key,\n module: key.module,\n defaultMessage: key.defaultMessage,\n description: key.description ?? '',\n variables: key.variables?.join(', ') ?? '',\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const variables = model.variables\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n\n if (this.isEditMode()) {\n this.updateKey(model, variables);\n } else {\n this.createKey(model, variables);\n }\n }\n\n private createKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const createDto: ICreateTranslationKeyDto = {\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.insert(createDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.saveTranslations(\n response.data.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private updateKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const updateDto: IUpdateTranslationKeyDto = {\n id: this.existingKey()!.id,\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.update(updateDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.saveTranslations(\n this.existingKey()!.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private saveTranslations(\n keyId: string,\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n const translationsToSave: IBulkUpdateTranslationDto[] = this.translations()\n .filter((t) => t.value?.trim())\n .map((t) => ({\n id: t.translationId,\n languageId: t.languageId,\n translationKeyId: keyId,\n value: t.value,\n isVerified: false,\n }));\n\n if (translationsToSave.length === 0) {\n this.onSaveSuccess(messageKey, messageVariables);\n return;\n }\n\n this.translationService\n .bulkUpdate(translationsToSave)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.onSaveSuccess(messageKey, messageVariables),\n error: () => this.onSaveSuccess(messageKey, messageVariables),\n });\n }\n\n private onSaveSuccess(\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: messageKey ? this.translate(messageKey, messageVariables) : '',\n });\n this.isSaving.set(false);\n this.router.navigate(['/localization/keys']);\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/keys']);\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { ITranslationKey } from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { TranslationApiService } from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\n\n@Component({\n selector: 'lib-translation-key-list-page',\n imports: [\n AngularModule,\n UiModule,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.key.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.key.subtitle' | translate }}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'localization.key.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col md:flex-row gap-4 mb-4\">\n <div class=\"flex-1\">\n <f-select\n [options]=\"moduleOptions()\"\n [ngModel]=\"selectedModule()\"\n (ngModelChange)=\"onModuleChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"'localization.key.filter.module' | translate\"\n [showClear]=\"true\"\n class=\"w-full\"\n />\n </div>\n <div class=\"flex-1\">\n <f-iconfield class=\"w-full\">\n <f-inputicon><ui-icon name=\"search\" /></f-inputicon>\n <input\n fInputText\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n </div>\n </div>\n\n <!-- Table -->\n <f-table\n [value]=\"filteredKeys()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"15\"\n [rowsPerPageOptions]=\"[10, 15, 25, 50]\"\n >\n <ng-template #header>\n <tr>\n <th style=\"width: 15%\">\n {{ 'localization.key.module' | translate }}\n </th>\n <th style=\"width: 25%\">\n {{ 'localization.key.name' | translate }}\n </th>\n <th style=\"width: 35%\">\n {{ 'localization.key.default.message' | translate }}\n </th>\n <th style=\"width: 10%\">\n {{ 'localization.key.translations' | translate }}\n </th>\n <th style=\"width: 15%\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-key>\n @let translationCount = getTranslationCount(key.id);\n @let languageCount = languages().length;\n <tr>\n <td>\n <f-tag [value]=\"key.module\" severity=\"secondary\" />\n </td>\n <td>\n <div class=\"flex items-center gap-2\">\n <span class=\"font-medium\">{{ key.key }}</span>\n @if (key.isReadonly) {\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"warn\"\n />\n }\n </div>\n @if (key.description) {\n <small class=\"text-muted-color\">{{ key.description }}</small>\n }\n </td>\n <td>{{ key.defaultMessage }}</td>\n <td class=\"text-center\">\n <span\n class=\"text-sm\"\n [class.text-green-500]=\"translationCount === languageCount\"\n [class.text-orange-500]=\"\n translationCount < languageCount && translationCount > 0\n \"\n [class.text-muted-color]=\"translationCount === 0\"\n >\n {{ translationCount }}/{{ languageCount }}\n </span>\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(key)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [disabled]=\"key.isReadonly\"\n [fTooltip]=\"\n (key.isReadonly\n ? 'localization.key.readonly.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n (click)=\"onDelete(key)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.key.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n `,\n})\nexport class TranslationKeyListPage implements OnInit {\n readonly TRANSLATION_KEY_PERMISSIONS = TRANSLATION_KEY_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isLoading = signal(false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translationKeys = signal<ITranslationKey[]>([]);\n readonly translationCounts = signal<Map<string, number>>(new Map());\n readonly selectedModule = signal<string | null>(null);\n readonly searchTerm = signal('');\n\n readonly moduleOptions = computed(() => [\n { label: this.translateService.translate('shared.all'), value: null },\n ...this.modules().map((m) => ({ label: m, value: m })),\n ]);\n\n readonly filteredKeys = computed(() => {\n let keys = this.translationKeys();\n const module = this.selectedModule();\n const search = this.searchTerm().toLowerCase().trim();\n\n if (module) {\n keys = keys.filter((k) => k.module === module);\n }\n\n if (search) {\n keys = keys.filter(\n (k) =>\n k.key.toLowerCase().includes(search) ||\n k.defaultMessage.toLowerCase().includes(search) ||\n k.module.toLowerCase().includes(search),\n );\n }\n\n return keys;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n loadData(): void {\n this.isLoading.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n keys: from(\n this.translationKeyService.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n sort: { module: 'ASC', key: 'ASC' },\n }),\n ),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: ({ languages, modules, keys }) => {\n if (languages.success && languages.data) {\n this.languages.set(languages.data.filter((l) => l.isActive));\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n if (keys.success && keys.data) {\n this.translationKeys.set(keys.data);\n this.loadTranslationCounts();\n }\n this.isLoading.set(false);\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n });\n }\n\n getTranslationCount(keyId: string): number {\n return this.translationCounts().get(keyId) ?? 0;\n }\n\n onModuleChange(value: string | null): void {\n this.selectedModule.set(value);\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/keys/new']);\n }\n\n onEdit(key: ITranslationKey): void {\n this.router.navigate(['/localization/keys', key.id]);\n }\n\n onDelete(key: ITranslationKey): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate('localization.key.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.translationKeyService.delete({ id: key.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.loadData();\n }\n },\n });\n },\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { Routes } from '@angular/router';\nimport {\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n permissionGuard,\n SHARED_MESSAGES,\n resolveTranslationModule,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { LOCALIZATION_MESSAGES } from '../constants/messages';\n\n/**\n * Resolves which localization tab the current user should land on when\n * navigating to the bare `/localization` route. Mirrors the tab\n * visibility order in LocalizationContainerPage.visibleTabs so the\n * redirect never points at a tab the user can't actually see.\n */\nfunction resolveLocalizationDefaultTab(): string {\n const permissionValidator = inject(PermissionValidatorService);\n\n if (permissionValidator.hasPermission(LANGUAGE_PERMISSIONS.READ)) {\n return 'languages';\n }\n\n if (permissionValidator.hasPermission(TRANSLATION_KEY_PERMISSIONS.READ)) {\n return 'keys';\n }\n\n return 'languages';\n}\n\nexport const LOCALIZATION_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['localization'], fallbackMessages: { ...LOCALIZATION_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/localization-container/localization-container.page').then(\n (m) => m.LocalizationContainerPage,\n ),\n children: [\n // Languages Management\n {\n path: 'languages',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/language-list/language-list.page').then((m) => m.LanguageListPage),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n ],\n },\n\n // Translation Keys Management\n {\n path: 'keys',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/translation-key-list/translation-key-list.page').then(\n (m) => m.TranslationKeyListPage,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n ],\n },\n\n // Default redirect to the first tab the user has permission to see\n {\n path: '',\n redirectTo: () => resolveLocalizationDefaultTab(),\n pathMatch: 'full',\n },\n ],\n },\n];\n","// Interfaces\nexport * from './interfaces/language.interface';\nexport * from './interfaces/localization-config.interface';\nexport * from './interfaces/translation-key.interface';\nexport * from './interfaces/translation.interface';\n\n// Constants\nexport * from './constants/localization.constants';\nexport * from './constants/messages';\n\n// Services\nexport * from './services/language-api.service';\nexport * from './services/localization-api.service';\nexport * from './services/localization-initializer.service';\nexport * from './services/localization-state.service';\nexport * from './services/translation-api.service';\nexport * from './services/translation-key-api.service';\nexport * from './services/translation-loader.service';\n\n// Components\nexport * from './components/language-selector/language-selector.component';\n\n// Providers\nexport * from './providers/localization.providers';\n\n// Pages\nexport * from './pages/language-form/language-form.page';\nexport * from './pages/language-list/language-list.page';\nexport * from './pages/localization-container/localization-container.page';\nexport * from './pages/translation-key-form/translation-key-form.page';\nexport * from './pages/translation-key-list/translation-key-list.page';\n\n// Routes\nexport { LOCALIZATION_ROUTES } from './routes/localization.routes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/ng-localization",
3
- "version": "6.4.0",
3
+ "version": "7.0.0-beta.1",
4
4
  "description": "Localization module for multi-language support in FLUSYS Angular apps",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,10 +8,10 @@
8
8
  "@angular/core": ">=22.0.0",
9
9
  "@angular/forms": ">=22.0.0",
10
10
  "@angular/router": ">=22.0.0",
11
- "@flusys/ng-core": ">=6.4.0",
12
- "@flusys/ng-layout": ">=6.4.0",
13
- "@flusys/ng-shared": ">=6.4.0",
14
- "@flusys/ng-ui": ">=6.4.0",
11
+ "@flusys/ng-core": ">=7.0.0-beta.1",
12
+ "@flusys/ng-layout": ">=7.0.0-beta.1",
13
+ "@flusys/ng-shared": ">=7.0.0-beta.1",
14
+ "@flusys/ng-ui": ">=7.0.0-beta.1",
15
15
  "rxjs": "^7.8.0"
16
16
  },
17
17
  "sideEffects": false,
@@ -15,6 +15,7 @@ interface ILanguage {
15
15
  direction: 'ltr' | 'rtl' | null;
16
16
  isActive: boolean;
17
17
  isDefault: boolean;
18
+ isReadonly: boolean;
18
19
  serial: number | null;
19
20
  createdAt: string;
20
21
  updatedAt: string;
@@ -238,6 +239,7 @@ declare class LanguageFormPage {
238
239
  readonly isSaving: _angular_core.WritableSignal<boolean>;
239
240
  readonly existingLanguage: _angular_core.WritableSignal<ILanguage | null>;
240
241
  readonly isEditMode: _angular_core.Signal<boolean>;
242
+ readonly isReadonly: _angular_core.Signal<boolean>;
241
243
  private translate;
242
244
  readonly directionOptions: _angular_core.Signal<{
243
245
  label: string;
@@ -320,6 +322,7 @@ declare class TranslationKeyFormPage implements OnInit {
320
322
  readonly isLoadingLanguages: _angular_core.WritableSignal<boolean>;
321
323
  readonly existingKey: _angular_core.WritableSignal<ITranslationKey | null>;
322
324
  readonly isEditMode: _angular_core.Signal<boolean>;
325
+ readonly isReadonly: _angular_core.Signal<boolean>;
323
326
  readonly languages: _angular_core.WritableSignal<ILanguage[]>;
324
327
  readonly modules: _angular_core.WritableSignal<string[]>;
325
328
  readonly translations: _angular_core.WritableSignal<ITranslationValue[]>;