@flusys/ng-localization 9.2.1 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (12) hide show
  1. package/fesm2022/{flusys-ng-localization-language-form.page-DB-cn7MO.mjs → flusys-ng-localization-language-form.page-BvjWaeVE.mjs} +4 -4
  2. package/fesm2022/{flusys-ng-localization-language-form.page-DB-cn7MO.mjs.map → flusys-ng-localization-language-form.page-BvjWaeVE.mjs.map} +1 -1
  3. package/fesm2022/{flusys-ng-localization-language-list.page-CfM-mc9g.mjs → flusys-ng-localization-language-list.page-DZv1AxNS.mjs} +4 -4
  4. package/fesm2022/{flusys-ng-localization-language-list.page-CfM-mc9g.mjs.map → flusys-ng-localization-language-list.page-DZv1AxNS.mjs.map} +1 -1
  5. package/fesm2022/{flusys-ng-localization-localization-container.page-CsrYVvth.mjs → flusys-ng-localization-localization-container.page-ueg6COyQ.mjs} +4 -4
  6. package/fesm2022/{flusys-ng-localization-localization-container.page-CsrYVvth.mjs.map → flusys-ng-localization-localization-container.page-ueg6COyQ.mjs.map} +1 -1
  7. package/fesm2022/{flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs → flusys-ng-localization-translation-key-form.page-ByHsSfpB.mjs} +4 -4
  8. package/fesm2022/{flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs.map → flusys-ng-localization-translation-key-form.page-ByHsSfpB.mjs.map} +1 -1
  9. package/fesm2022/{flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs → flusys-ng-localization-translation-key-list.page-6egXWSfs.mjs} +4 -4
  10. package/fesm2022/{flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs.map → flusys-ng-localization-translation-key-list.page-6egXWSfs.mjs.map} +1 -1
  11. package/fesm2022/flusys-ng-localization.mjs +34 -34
  12. package/package.json +5 -5
@@ -130,7 +130,7 @@ var LanguageFormPage = class LanguageFormPage {
130
130
  }
131
131
  static ɵfac = i0.ɵɵngDeclareFactory({
132
132
  minVersion: "12.0.0",
133
- version: "22.2.1",
133
+ version: "22.2.3",
134
134
  ngImport: i0,
135
135
  type: LanguageFormPage,
136
136
  deps: [],
@@ -138,7 +138,7 @@ var LanguageFormPage = class LanguageFormPage {
138
138
  });
139
139
  static ɵcmp = i0.ɵɵngDeclareComponent({
140
140
  minVersion: "17.0.0",
141
- version: "22.2.1",
141
+ version: "22.2.3",
142
142
  type: LanguageFormPage,
143
143
  isStandalone: true,
144
144
  selector: "lib-language-form-page",
@@ -478,7 +478,7 @@ var LanguageFormPage = class LanguageFormPage {
478
478
  };
479
479
  i0.ɵɵngDeclareClassMetadata({
480
480
  minVersion: "12.0.0",
481
- version: "22.2.1",
481
+ version: "22.2.3",
482
482
  ngImport: i0,
483
483
  type: LanguageFormPage,
484
484
  decorators: [{
@@ -640,4 +640,4 @@ i0.ɵɵngDeclareClassMetadata({
640
640
  });
641
641
  export { LanguageFormPage };
642
642
 
643
- //# sourceMappingURL=flusys-ng-localization-language-form.page-DB-cn7MO.mjs.map
643
+ //# sourceMappingURL=flusys-ng-localization-language-form.page-BvjWaeVE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-localization-language-form.page-DB-cn7MO.mjs","names":[],"sources":["../../../projects/ng-localization/pages/language-form/language-form.page.ts"],"sourcesContent":["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 {\n CardComponent,\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n SelectComponent,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\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';\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: [\n CardComponent,\n InputTextDirective,\n SelectComponent,\n CheckboxComponent,\n FButtonDirective,\n UiIconComponent,\n FormsModule,\n FormField,\n TranslatePipe,\n ],\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 type=\"button\"\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 const code = model.code.trim();\n const name = model.name.trim();\n return (\n code.length > 0 &&\n code.length <= 10 &&\n name.length > 0 &&\n name.length <= 100\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.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 } else {\n this.router.navigate(['/localization/languages']);\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() || this.isSaving()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n const serial = parseInt(String(model.serial ?? ''), 10);\n\n const dto = {\n code: model.code.trim(),\n name: model.name.trim(),\n nativeName: model.nativeName?.trim() || undefined,\n direction: model.direction,\n serial: Number.isFinite(serial) ? serial : 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 error: () => undefined,\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/languages']);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-localization-language-form.page-BvjWaeVE.mjs","names":[],"sources":["../../../projects/ng-localization/pages/language-form/language-form.page.ts"],"sourcesContent":["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 {\n CardComponent,\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n SelectComponent,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\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';\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: [\n CardComponent,\n InputTextDirective,\n SelectComponent,\n CheckboxComponent,\n FButtonDirective,\n UiIconComponent,\n FormsModule,\n FormField,\n TranslatePipe,\n ],\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 type=\"button\"\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 const code = model.code.trim();\n const name = model.name.trim();\n return (\n code.length > 0 &&\n code.length <= 10 &&\n name.length > 0 &&\n name.length <= 100\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.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 } else {\n this.router.navigate(['/localization/languages']);\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() || this.isSaving()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n const serial = parseInt(String(model.serial ?? ''), 10);\n\n const dto = {\n code: model.code.trim(),\n name: model.name.trim(),\n nativeName: model.nativeName?.trim() || undefined,\n direction: model.direction,\n serial: Number.isFinite(serial) ? serial : 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 error: () => undefined,\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/languages']);\n }\n}\n"],"mappings":"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"}
@@ -100,7 +100,7 @@ var LanguageListPage = class LanguageListPage {
100
100
  }
101
101
  static ɵfac = i0.ɵɵngDeclareFactory({
102
102
  minVersion: "12.0.0",
103
- version: "22.2.1",
103
+ version: "22.2.3",
104
104
  ngImport: i0,
105
105
  type: LanguageListPage,
106
106
  deps: [],
@@ -108,7 +108,7 @@ var LanguageListPage = class LanguageListPage {
108
108
  });
109
109
  static ɵcmp = i0.ɵɵngDeclareComponent({
110
110
  minVersion: "17.0.0",
111
- version: "22.2.1",
111
+ version: "22.2.3",
112
112
  type: LanguageListPage,
113
113
  isStandalone: true,
114
114
  selector: "lib-language-list-page",
@@ -478,7 +478,7 @@ var LanguageListPage = class LanguageListPage {
478
478
  };
479
479
  i0.ɵɵngDeclareClassMetadata({
480
480
  minVersion: "12.0.0",
481
- version: "22.2.1",
481
+ version: "22.2.3",
482
482
  ngImport: i0,
483
483
  type: LanguageListPage,
484
484
  decorators: [{
@@ -665,4 +665,4 @@ i0.ɵɵngDeclareClassMetadata({
665
665
  });
666
666
  export { LanguageListPage };
667
667
 
668
- //# sourceMappingURL=flusys-ng-localization-language-list.page-CfM-mc9g.mjs.map
668
+ //# sourceMappingURL=flusys-ng-localization-language-list.page-DZv1AxNS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-localization-language-list.page-CfM-mc9g.mjs","names":[],"sources":["../../../projects/ng-localization/pages/language-list/language-list.page.ts"],"sourcesContent":["import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} 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: [\n FButtonDirective,\n UiIconComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n HasPermissionDirective,\n TranslatePipe,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\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.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 <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"languageService.searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\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 </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 onSearchChange(term: string): void {\n this.languageService.fetchList(term, {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n if (lang.isDefault) return;\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 error: () => undefined,\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n if (lang.isDefault || lang.isReadonly) return;\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 error: () => undefined,\n });\n },\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-localization-language-list.page-DZv1AxNS.mjs","names":[],"sources":["../../../projects/ng-localization/pages/language-list/language-list.page.ts"],"sourcesContent":["import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} 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: [\n FButtonDirective,\n UiIconComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n HasPermissionDirective,\n TranslatePipe,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\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.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 <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"languageService.searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\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 </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 onSearchChange(term: string): void {\n this.languageService.fetchList(term, {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n if (lang.isDefault) return;\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 error: () => undefined,\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n if (lang.isDefault || lang.isReadonly) return;\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 error: () => undefined,\n });\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ var LocalizationContainerPage = class LocalizationContainerPage {
23
23
  }, ...ngDevMode ? [{ debugName: "visibleTabs" }] : /* istanbul ignore next */ []);
24
24
  static ɵfac = i0.ɵɵngDeclareFactory({
25
25
  minVersion: "12.0.0",
26
- version: "22.2.1",
26
+ version: "22.2.3",
27
27
  ngImport: i0,
28
28
  type: LocalizationContainerPage,
29
29
  deps: [],
@@ -31,7 +31,7 @@ var LocalizationContainerPage = class LocalizationContainerPage {
31
31
  });
32
32
  static ɵcmp = i0.ɵɵngDeclareComponent({
33
33
  minVersion: "17.0.0",
34
- version: "22.2.1",
34
+ version: "22.2.3",
35
35
  type: LocalizationContainerPage,
36
36
  isStandalone: true,
37
37
  selector: "lib-localization-container",
@@ -122,7 +122,7 @@ var LocalizationContainerPage = class LocalizationContainerPage {
122
122
  };
123
123
  i0.ɵɵngDeclareClassMetadata({
124
124
  minVersion: "12.0.0",
125
- version: "22.2.1",
125
+ version: "22.2.3",
126
126
  ngImport: i0,
127
127
  type: LocalizationContainerPage,
128
128
  decorators: [{
@@ -165,4 +165,4 @@ i0.ɵɵngDeclareClassMetadata({
165
165
  });
166
166
  export { LocalizationContainerPage };
167
167
 
168
- //# sourceMappingURL=flusys-ng-localization-localization-container.page-CsrYVvth.mjs.map
168
+ //# sourceMappingURL=flusys-ng-localization-localization-container.page-ueg6COyQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-localization-localization-container.page-CsrYVvth.mjs","names":[],"sources":["../../../projects/ng-localization/pages/localization-container/localization-container.page.ts"],"sourcesContent":["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 const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n"],"mappings":";;;;AAoDA,IAAa,4BAAb,MAAa,0BAAyB;CACnB,sBAAsB,OAAO,0BAA0B;CAEvD,UAAkB,CACjC;EACE,IAAI;EACJ,UAAU;EACV,MAAM;EACN,OAAO;EACP,YAAY,qBAAqB;CAClC,GACD;EACE,IAAI;EACJ,UAAU;EACV,MAAM;EACN,OAAO;EACP,YAAY,4BAA4B;CACzC,CACF;CAEQ,cAAc,eAAc;EAEnC,IAAI,CADgB,KAAK,oBAAoB,YACxC,CAAA,CAAY,QAAQ,OAAO,CAAA;EAChC,OAAO,KAAK,QAAQ,QAAQ,QAAQ,KAAK,oBAAoB,cAAc,IAAI,UAAU,CAAC;CAC5F,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAxBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAyB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAzB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAyB,cAAA;EAAA,UAAA;EAAA,UAAA;EAAA,UAxB1B;;;;;;;;;;;;;;;;;;;;;;;EAsBT,UAAA;EAAA,QAAA,CAAA,iHAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MA9BS;IAAY,UAAA;IAAA,QAAA,CAAA,QAAA,kBAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAU,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,gBAAA;IAAA,UAAA,CAAA,kBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAiB;IAAa,UAAA;IAAA,QAAA,CAAA,QAAA,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAA5B;IAAa,MAAA;GAAA;EAAA;CAAA,CAAA;;AAgCxD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EAlCrC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAA4B,SAC7B;IAAC;IAAc;IAAY;IAAkB;IAAe;GAAa;GAAC,UAQzE;;;;;;;;;;;;;;;;;;;;;;;GAsBT,QAAA,CAAA,iHAAA;EAAA,CAAA"}
1
+ {"version":3,"file":"flusys-ng-localization-localization-container.page-ueg6COyQ.mjs","names":[],"sources":["../../../projects/ng-localization/pages/localization-container/localization-container.page.ts"],"sourcesContent":["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 const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n"],"mappings":";;;;AAoDA,IAAa,4BAAb,MAAa,0BAAyB;CACnB,sBAAsB,OAAO,0BAA0B;CAEvD,UAAkB,CACjC;EACE,IAAI;EACJ,UAAU;EACV,MAAM;EACN,OAAO;EACP,YAAY,qBAAqB;CAClC,GACD;EACE,IAAI;EACJ,UAAU;EACV,MAAM;EACN,OAAO;EACP,YAAY,4BAA4B;CACzC,CACF;CAEQ,cAAc,eAAc;EAEnC,IAAI,CADgB,KAAK,oBAAoB,YACxC,CAAA,CAAY,QAAQ,OAAO,CAAA;EAChC,OAAO,KAAK,QAAQ,QAAQ,QAAQ,KAAK,oBAAoB,cAAc,IAAI,UAAU,CAAC;CAC5F,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAxBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAyB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAzB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAyB,cAAA;EAAA,UAAA;EAAA,UAAA;EAAA,UAxB1B;;;;;;;;;;;;;;;;;;;;;;;EAsBT,UAAA;EAAA,QAAA,CAAA,iHAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MA9BS;IAAY,UAAA;IAAA,QAAA,CAAA,QAAA,kBAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAU,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,gBAAA;IAAA,UAAA,CAAA,kBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAiB;IAAa,UAAA;IAAA,QAAA,CAAA,QAAA,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAA5B;IAAa,MAAA;GAAA;EAAA;CAAA,CAAA;;AAgCxD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EAlCrC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAA4B,SAC7B;IAAC;IAAc;IAAY;IAAkB;IAAe;GAAa;GAAC,UAQzE;;;;;;;;;;;;;;;;;;;;;;;GAsBT,QAAA,CAAA,iHAAA;EAAA,CAAA"}
@@ -233,7 +233,7 @@ var TranslationKeyFormPage = class TranslationKeyFormPage {
233
233
  }
234
234
  static ɵfac = i0.ɵɵngDeclareFactory({
235
235
  minVersion: "12.0.0",
236
- version: "22.2.1",
236
+ version: "22.2.3",
237
237
  ngImport: i0,
238
238
  type: TranslationKeyFormPage,
239
239
  deps: [],
@@ -241,7 +241,7 @@ var TranslationKeyFormPage = class TranslationKeyFormPage {
241
241
  });
242
242
  static ɵcmp = i0.ɵɵngDeclareComponent({
243
243
  minVersion: "17.0.0",
244
- version: "22.2.1",
244
+ version: "22.2.3",
245
245
  type: TranslationKeyFormPage,
246
246
  isStandalone: true,
247
247
  selector: "lib-translation-key-form-page",
@@ -652,7 +652,7 @@ var TranslationKeyFormPage = class TranslationKeyFormPage {
652
652
  };
653
653
  i0.ɵɵngDeclareClassMetadata({
654
654
  minVersion: "12.0.0",
655
- version: "22.2.1",
655
+ version: "22.2.3",
656
656
  ngImport: i0,
657
657
  type: TranslationKeyFormPage,
658
658
  decorators: [{
@@ -869,4 +869,4 @@ i0.ɵɵngDeclareClassMetadata({
869
869
  });
870
870
  export { TranslationKeyFormPage };
871
871
 
872
- //# sourceMappingURL=flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs.map
872
+ //# sourceMappingURL=flusys-ng-localization-translation-key-form.page-ByHsSfpB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs","names":[],"sources":["../../../projects/ng-localization/pages/translation-key-form/translation-key-form.page.ts"],"sourcesContent":["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 {\n CardComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n ProgressSpinnerComponent,\n SelectComponent,\n TagComponent,\n TextareaDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\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';\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: [\n CardComponent,\n InputTextDirective,\n SelectComponent,\n TextareaDirective,\n ProgressSpinnerComponent,\n TagComponent,\n FButtonDirective,\n UiIconComponent,\n FormsModule,\n FormField,\n TranslatePipe,\n ],\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 type=\"button\"\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.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 error: () => undefined,\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 } else {\n this.router.navigate(['/localization/keys']);\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 const data = response.success ? response.data : undefined;\n if (!data) return;\n this.translations.update((list) => {\n const updated = [...list];\n data.forEach((t) => {\n const loaded = {\n languageId: t.languageId,\n value: t.value ?? '',\n translationId: t.id,\n };\n const index = updated.findIndex(\n (tr) => tr.languageId === t.languageId,\n );\n if (index >= 0) {\n updated[index] = loaded;\n } else {\n updated.push(loaded);\n }\n });\n return updated;\n });\n },\n error: () => undefined,\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() || this.isSaving()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const variables = Array.from(\n new Set(\n model.variables\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0),\n ),\n );\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.trim(),\n module: model.module.trim(),\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.existingKey.set(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.trim(),\n module: model.module.trim(),\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.isSaving.set(false),\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"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-localization-translation-key-form.page-ByHsSfpB.mjs","names":[],"sources":["../../../projects/ng-localization/pages/translation-key-form/translation-key-form.page.ts"],"sourcesContent":["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 {\n CardComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n ProgressSpinnerComponent,\n SelectComponent,\n TagComponent,\n TextareaDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\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';\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: [\n CardComponent,\n InputTextDirective,\n SelectComponent,\n TextareaDirective,\n ProgressSpinnerComponent,\n TagComponent,\n FButtonDirective,\n UiIconComponent,\n FormsModule,\n FormField,\n TranslatePipe,\n ],\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 type=\"button\"\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.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 error: () => undefined,\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 } else {\n this.router.navigate(['/localization/keys']);\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 const data = response.success ? response.data : undefined;\n if (!data) return;\n this.translations.update((list) => {\n const updated = [...list];\n data.forEach((t) => {\n const loaded = {\n languageId: t.languageId,\n value: t.value ?? '',\n translationId: t.id,\n };\n const index = updated.findIndex(\n (tr) => tr.languageId === t.languageId,\n );\n if (index >= 0) {\n updated[index] = loaded;\n } else {\n updated.push(loaded);\n }\n });\n return updated;\n });\n },\n error: () => undefined,\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() || this.isSaving()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const variables = Array.from(\n new Set(\n model.variables\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0),\n ),\n );\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.trim(),\n module: model.module.trim(),\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.existingKey.set(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.trim(),\n module: model.module.trim(),\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.isSaving.set(false),\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"],"mappings":"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"}
@@ -139,7 +139,7 @@ var TranslationKeyListPage = class TranslationKeyListPage {
139
139
  }
140
140
  static ɵfac = i0.ɵɵngDeclareFactory({
141
141
  minVersion: "12.0.0",
142
- version: "22.2.1",
142
+ version: "22.2.3",
143
143
  ngImport: i0,
144
144
  type: TranslationKeyListPage,
145
145
  deps: [],
@@ -147,7 +147,7 @@ var TranslationKeyListPage = class TranslationKeyListPage {
147
147
  });
148
148
  static ɵcmp = i0.ɵɵngDeclareComponent({
149
149
  minVersion: "17.0.0",
150
- version: "22.2.1",
150
+ version: "22.2.3",
151
151
  type: TranslationKeyListPage,
152
152
  isStandalone: true,
153
153
  selector: "lib-translation-key-list-page",
@@ -565,7 +565,7 @@ var TranslationKeyListPage = class TranslationKeyListPage {
565
565
  };
566
566
  i0.ɵɵngDeclareClassMetadata({
567
567
  minVersion: "12.0.0",
568
- version: "22.2.1",
568
+ version: "22.2.3",
569
569
  ngImport: i0,
570
570
  type: TranslationKeyListPage,
571
571
  decorators: [{
@@ -748,4 +748,4 @@ i0.ɵɵngDeclareClassMetadata({
748
748
  });
749
749
  export { TranslationKeyListPage };
750
750
 
751
- //# sourceMappingURL=flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs.map
751
+ //# sourceMappingURL=flusys-ng-localization-translation-key-list.page-6egXWSfs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs","names":[],"sources":["../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts"],"sourcesContent":["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 HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n SelectComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} 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 FButtonDirective,\n UiIconComponent,\n SelectComponent,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\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 icon=\"search\" />\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 private loadSeq = 0;\n private countsSeq = 0;\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 const seq = ++this.loadSeq;\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 (seq !== this.loadSeq) return;\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 if (seq === this.loadSeq) this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n const seq = ++this.countsSeq;\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (seq !== this.countsSeq) return;\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n error: () => undefined,\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 if (key.isReadonly) return;\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 error: () => undefined,\n });\n },\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-localization-translation-key-list.page-6egXWSfs.mjs","names":[],"sources":["../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts"],"sourcesContent":["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 HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n SelectComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} 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 FButtonDirective,\n UiIconComponent,\n SelectComponent,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\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 icon=\"search\" />\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 private loadSeq = 0;\n private countsSeq = 0;\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 const seq = ++this.loadSeq;\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 (seq !== this.loadSeq) return;\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 if (seq === this.loadSeq) this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n const seq = ++this.countsSeq;\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (seq !== this.countsSeq) return;\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n error: () => undefined,\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 if (key.isReadonly) return;\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 error: () => undefined,\n });\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -136,7 +136,7 @@ var LanguageApiService = class LanguageApiService extends ApiResourceService {
136
136
  }
137
137
  static ɵfac = i0.ɵɵngDeclareFactory({
138
138
  minVersion: "12.0.0",
139
- version: "22.2.1",
139
+ version: "22.2.3",
140
140
  ngImport: i0,
141
141
  type: LanguageApiService,
142
142
  deps: [],
@@ -144,14 +144,14 @@ var LanguageApiService = class LanguageApiService extends ApiResourceService {
144
144
  });
145
145
  static ɵprov = i0.ɵɵngDeclareService({
146
146
  minVersion: "22.0.0",
147
- version: "22.2.1",
147
+ version: "22.2.3",
148
148
  ngImport: i0,
149
149
  type: LanguageApiService
150
150
  });
151
151
  };
152
152
  i0.ɵɵngDeclareClassMetadata({
153
153
  minVersion: "12.0.0",
154
- version: "22.2.1",
154
+ version: "22.2.3",
155
155
  ngImport: i0,
156
156
  type: LanguageApiService,
157
157
  decorators: [{ type: Service }],
@@ -174,7 +174,7 @@ var LocalizationApiService = class LocalizationApiService {
174
174
  }
175
175
  static ɵfac = i0.ɵɵngDeclareFactory({
176
176
  minVersion: "12.0.0",
177
- version: "22.2.1",
177
+ version: "22.2.3",
178
178
  ngImport: i0,
179
179
  type: LocalizationApiService,
180
180
  deps: [],
@@ -182,14 +182,14 @@ var LocalizationApiService = class LocalizationApiService {
182
182
  });
183
183
  static ɵprov = i0.ɵɵngDeclareService({
184
184
  minVersion: "22.0.0",
185
- version: "22.2.1",
185
+ version: "22.2.3",
186
186
  ngImport: i0,
187
187
  type: LocalizationApiService
188
188
  });
189
189
  };
190
190
  i0.ɵɵngDeclareClassMetadata({
191
191
  minVersion: "12.0.0",
192
- version: "22.2.1",
192
+ version: "22.2.3",
193
193
  ngImport: i0,
194
194
  type: LocalizationApiService,
195
195
  decorators: [{ type: Service }]
@@ -218,7 +218,7 @@ var LocalizationInitializerService = class LocalizationInitializerService {
218
218
  }
219
219
  static ɵfac = i0.ɵɵngDeclareFactory({
220
220
  minVersion: "12.0.0",
221
- version: "22.2.1",
221
+ version: "22.2.3",
222
222
  ngImport: i0,
223
223
  type: LocalizationInitializerService,
224
224
  deps: [],
@@ -226,14 +226,14 @@ var LocalizationInitializerService = class LocalizationInitializerService {
226
226
  });
227
227
  static ɵprov = i0.ɵɵngDeclareService({
228
228
  minVersion: "22.0.0",
229
- version: "22.2.1",
229
+ version: "22.2.3",
230
230
  ngImport: i0,
231
231
  type: LocalizationInitializerService
232
232
  });
233
233
  };
234
234
  i0.ɵɵngDeclareClassMetadata({
235
235
  minVersion: "12.0.0",
236
- version: "22.2.1",
236
+ version: "22.2.3",
237
237
  ngImport: i0,
238
238
  type: LocalizationInitializerService,
239
239
  decorators: [{ type: Service }]
@@ -317,7 +317,7 @@ var LocalizationStateService = class LocalizationStateService {
317
317
  }
318
318
  static ɵfac = i0.ɵɵngDeclareFactory({
319
319
  minVersion: "12.0.0",
320
- version: "22.2.1",
320
+ version: "22.2.3",
321
321
  ngImport: i0,
322
322
  type: LocalizationStateService,
323
323
  deps: [],
@@ -325,14 +325,14 @@ var LocalizationStateService = class LocalizationStateService {
325
325
  });
326
326
  static ɵprov = i0.ɵɵngDeclareService({
327
327
  minVersion: "22.0.0",
328
- version: "22.2.1",
328
+ version: "22.2.3",
329
329
  ngImport: i0,
330
330
  type: LocalizationStateService
331
331
  });
332
332
  };
333
333
  i0.ɵɵngDeclareClassMetadata({
334
334
  minVersion: "12.0.0",
335
- version: "22.2.1",
335
+ version: "22.2.3",
336
336
  ngImport: i0,
337
337
  type: LocalizationStateService,
338
338
  decorators: [{ type: Service }],
@@ -360,7 +360,7 @@ var TranslationApiService = class TranslationApiService extends ApiResourceServi
360
360
  }
361
361
  static ɵfac = i0.ɵɵngDeclareFactory({
362
362
  minVersion: "12.0.0",
363
- version: "22.2.1",
363
+ version: "22.2.3",
364
364
  ngImport: i0,
365
365
  type: TranslationApiService,
366
366
  deps: [],
@@ -368,14 +368,14 @@ var TranslationApiService = class TranslationApiService extends ApiResourceServi
368
368
  });
369
369
  static ɵprov = i0.ɵɵngDeclareService({
370
370
  minVersion: "22.0.0",
371
- version: "22.2.1",
371
+ version: "22.2.3",
372
372
  ngImport: i0,
373
373
  type: TranslationApiService
374
374
  });
375
375
  };
376
376
  i0.ɵɵngDeclareClassMetadata({
377
377
  minVersion: "12.0.0",
378
- version: "22.2.1",
378
+ version: "22.2.3",
379
379
  ngImport: i0,
380
380
  type: TranslationApiService,
381
381
  decorators: [{ type: Service }],
@@ -390,7 +390,7 @@ var TranslationKeyApiService = class TranslationKeyApiService extends ApiResourc
390
390
  }
391
391
  static ɵfac = i0.ɵɵngDeclareFactory({
392
392
  minVersion: "12.0.0",
393
- version: "22.2.1",
393
+ version: "22.2.3",
394
394
  ngImport: i0,
395
395
  type: TranslationKeyApiService,
396
396
  deps: [],
@@ -398,14 +398,14 @@ var TranslationKeyApiService = class TranslationKeyApiService extends ApiResourc
398
398
  });
399
399
  static ɵprov = i0.ɵɵngDeclareService({
400
400
  minVersion: "22.0.0",
401
- version: "22.2.1",
401
+ version: "22.2.3",
402
402
  ngImport: i0,
403
403
  type: TranslationKeyApiService
404
404
  });
405
405
  };
406
406
  i0.ɵɵngDeclareClassMetadata({
407
407
  minVersion: "12.0.0",
408
- version: "22.2.1",
408
+ version: "22.2.3",
409
409
  ngImport: i0,
410
410
  type: TranslationKeyApiService,
411
411
  decorators: [{ type: Service }],
@@ -467,7 +467,7 @@ var TranslationLoaderService = class TranslationLoaderService {
467
467
  }
468
468
  static ɵfac = i0.ɵɵngDeclareFactory({
469
469
  minVersion: "12.0.0",
470
- version: "22.2.1",
470
+ version: "22.2.3",
471
471
  ngImport: i0,
472
472
  type: TranslationLoaderService,
473
473
  deps: [],
@@ -475,14 +475,14 @@ var TranslationLoaderService = class TranslationLoaderService {
475
475
  });
476
476
  static ɵprov = i0.ɵɵngDeclareService({
477
477
  minVersion: "22.0.0",
478
- version: "22.2.1",
478
+ version: "22.2.3",
479
479
  ngImport: i0,
480
480
  type: TranslationLoaderService
481
481
  });
482
482
  };
483
483
  i0.ɵɵngDeclareClassMetadata({
484
484
  minVersion: "12.0.0",
485
- version: "22.2.1",
485
+ version: "22.2.3",
486
486
  ngImport: i0,
487
487
  type: TranslationLoaderService,
488
488
  decorators: [{ type: Service }]
@@ -509,7 +509,7 @@ var LanguageSelectorComponent = class LanguageSelectorComponent {
509
509
  }
510
510
  static ɵfac = i0.ɵɵngDeclareFactory({
511
511
  minVersion: "12.0.0",
512
- version: "22.2.1",
512
+ version: "22.2.3",
513
513
  ngImport: i0,
514
514
  type: LanguageSelectorComponent,
515
515
  deps: [],
@@ -517,7 +517,7 @@ var LanguageSelectorComponent = class LanguageSelectorComponent {
517
517
  });
518
518
  static ɵcmp = i0.ɵɵngDeclareComponent({
519
519
  minVersion: "14.0.0",
520
- version: "22.2.1",
520
+ version: "22.2.3",
521
521
  type: LanguageSelectorComponent,
522
522
  isStandalone: true,
523
523
  selector: "lib-language-selector",
@@ -574,7 +574,7 @@ var LanguageSelectorComponent = class LanguageSelectorComponent {
574
574
  };
575
575
  i0.ɵɵngDeclareClassMetadata({
576
576
  minVersion: "12.0.0",
577
- version: "22.2.1",
577
+ version: "22.2.3",
578
578
  ngImport: i0,
579
579
  type: LanguageSelectorComponent,
580
580
  decorators: [{
@@ -637,7 +637,7 @@ var LanguageSelectorPanelComponent = class LanguageSelectorPanelComponent {
637
637
  }
638
638
  static ɵfac = i0.ɵɵngDeclareFactory({
639
639
  minVersion: "12.0.0",
640
- version: "22.2.1",
640
+ version: "22.2.3",
641
641
  ngImport: i0,
642
642
  type: LanguageSelectorPanelComponent,
643
643
  deps: [],
@@ -645,7 +645,7 @@ var LanguageSelectorPanelComponent = class LanguageSelectorPanelComponent {
645
645
  });
646
646
  static ɵcmp = i0.ɵɵngDeclareComponent({
647
647
  minVersion: "14.0.0",
648
- version: "22.2.1",
648
+ version: "22.2.3",
649
649
  type: LanguageSelectorPanelComponent,
650
650
  isStandalone: true,
651
651
  selector: "lib-language-selector-panel",
@@ -673,7 +673,7 @@ var LanguageSelectorPanelComponent = class LanguageSelectorPanelComponent {
673
673
  };
674
674
  i0.ɵɵngDeclareClassMetadata({
675
675
  minVersion: "12.0.0",
676
- version: "22.2.1",
676
+ version: "22.2.3",
677
677
  ngImport: i0,
678
678
  type: LanguageSelectorPanelComponent,
679
679
  decorators: [{
@@ -733,7 +733,7 @@ const LOCALIZATION_ROUTES = [{
733
733
  ...SHARED_MESSAGES
734
734
  }
735
735
  }) },
736
- loadComponent: () => import("./flusys-ng-localization-localization-container.page-CsrYVvth.mjs").then((m) => m.LocalizationContainerPage),
736
+ loadComponent: () => import("./flusys-ng-localization-localization-container.page-ueg6COyQ.mjs").then((m) => m.LocalizationContainerPage),
737
737
  children: [
738
738
  {
739
739
  path: "languages",
@@ -741,17 +741,17 @@ const LOCALIZATION_ROUTES = [{
741
741
  children: [
742
742
  {
743
743
  path: "",
744
- loadComponent: () => import("./flusys-ng-localization-language-list.page-CfM-mc9g.mjs").then((m) => m.LanguageListPage)
744
+ loadComponent: () => import("./flusys-ng-localization-language-list.page-DZv1AxNS.mjs").then((m) => m.LanguageListPage)
745
745
  },
746
746
  {
747
747
  path: "new",
748
748
  canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.CREATE)],
749
- loadComponent: () => import("./flusys-ng-localization-language-form.page-DB-cn7MO.mjs").then((m) => m.LanguageFormPage)
749
+ loadComponent: () => import("./flusys-ng-localization-language-form.page-BvjWaeVE.mjs").then((m) => m.LanguageFormPage)
750
750
  },
751
751
  {
752
752
  path: ":id",
753
753
  canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.UPDATE)],
754
- loadComponent: () => import("./flusys-ng-localization-language-form.page-DB-cn7MO.mjs").then((m) => m.LanguageFormPage)
754
+ loadComponent: () => import("./flusys-ng-localization-language-form.page-BvjWaeVE.mjs").then((m) => m.LanguageFormPage)
755
755
  }
756
756
  ]
757
757
  },
@@ -761,17 +761,17 @@ const LOCALIZATION_ROUTES = [{
761
761
  children: [
762
762
  {
763
763
  path: "",
764
- loadComponent: () => import("./flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs").then((m) => m.TranslationKeyListPage)
764
+ loadComponent: () => import("./flusys-ng-localization-translation-key-list.page-6egXWSfs.mjs").then((m) => m.TranslationKeyListPage)
765
765
  },
766
766
  {
767
767
  path: "new",
768
768
  canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.CREATE)],
769
- loadComponent: () => import("./flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs").then((m) => m.TranslationKeyFormPage)
769
+ loadComponent: () => import("./flusys-ng-localization-translation-key-form.page-ByHsSfpB.mjs").then((m) => m.TranslationKeyFormPage)
770
770
  },
771
771
  {
772
772
  path: ":id",
773
773
  canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.UPDATE)],
774
- loadComponent: () => import("./flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs").then((m) => m.TranslationKeyFormPage)
774
+ loadComponent: () => import("./flusys-ng-localization-translation-key-form.page-ByHsSfpB.mjs").then((m) => m.TranslationKeyFormPage)
775
775
  }
776
776
  ]
777
777
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/ng-localization",
3
- "version": "9.2.1",
3
+ "version": "9.3.0",
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": ">=9.2.1",
12
- "@flusys/ng-layout": ">=9.2.1",
13
- "@flusys/ng-shared": ">=9.2.1",
14
- "@flusys/ng-ui": ">=9.2.1",
11
+ "@flusys/ng-core": ">=9.3.0",
12
+ "@flusys/ng-layout": ">=9.3.0",
13
+ "@flusys/ng-shared": ">=9.3.0",
14
+ "@flusys/ng-ui": ">=9.3.0",
15
15
  "rxjs": "^7.8.0"
16
16
  },
17
17
  "sideEffects": false,