@flusys/ng-localization 9.2.1 → 9.2.2
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.
- package/fesm2022/{flusys-ng-localization-language-form.page-DB-cn7MO.mjs → flusys-ng-localization-language-form.page-BxEOncGj.mjs} +4 -4
- package/fesm2022/{flusys-ng-localization-language-form.page-DB-cn7MO.mjs.map → flusys-ng-localization-language-form.page-BxEOncGj.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-localization-language-list.page-CfM-mc9g.mjs → flusys-ng-localization-language-list.page-ADB1A-om.mjs} +4 -4
- package/fesm2022/{flusys-ng-localization-language-list.page-CfM-mc9g.mjs.map → flusys-ng-localization-language-list.page-ADB1A-om.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-localization-localization-container.page-CsrYVvth.mjs → flusys-ng-localization-localization-container.page-BMe6Szzt.mjs} +4 -4
- package/fesm2022/{flusys-ng-localization-localization-container.page-CsrYVvth.mjs.map → flusys-ng-localization-localization-container.page-BMe6Szzt.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs → flusys-ng-localization-translation-key-form.page-_rW1qDCE.mjs} +4 -4
- package/fesm2022/{flusys-ng-localization-translation-key-form.page-BCkDs0tt.mjs.map → flusys-ng-localization-translation-key-form.page-_rW1qDCE.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs → flusys-ng-localization-translation-key-list.page-5fvCbPgJ.mjs} +4 -4
- package/fesm2022/{flusys-ng-localization-translation-key-list.page-CGC5125Z.mjs.map → flusys-ng-localization-translation-key-list.page-5fvCbPgJ.mjs.map} +1 -1
- package/fesm2022/flusys-ng-localization.mjs +34 -34
- 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.
|
|
133
|
+
version: "22.2.2",
|
|
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.
|
|
141
|
+
version: "22.2.2",
|
|
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.
|
|
481
|
+
version: "22.2.2",
|
|
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-
|
|
643
|
+
//# sourceMappingURL=flusys-ng-localization-language-form.page-BxEOncGj.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-BxEOncGj.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.
|
|
103
|
+
version: "22.2.2",
|
|
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.
|
|
111
|
+
version: "22.2.2",
|
|
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.
|
|
481
|
+
version: "22.2.2",
|
|
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-
|
|
668
|
+
//# sourceMappingURL=flusys-ng-localization-language-list.page-ADB1A-om.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-ADB1A-om.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.
|
|
26
|
+
version: "22.2.2",
|
|
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.
|
|
34
|
+
version: "22.2.2",
|
|
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.
|
|
125
|
+
version: "22.2.2",
|
|
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-
|
|
168
|
+
//# sourceMappingURL=flusys-ng-localization-localization-container.page-BMe6Szzt.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-localization-localization-container.page-
|
|
1
|
+
{"version":3,"file":"flusys-ng-localization-localization-container.page-BMe6Szzt.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.
|
|
236
|
+
version: "22.2.2",
|
|
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.
|
|
244
|
+
version: "22.2.2",
|
|
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.
|
|
655
|
+
version: "22.2.2",
|
|
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-
|
|
872
|
+
//# sourceMappingURL=flusys-ng-localization-translation-key-form.page-_rW1qDCE.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-_rW1qDCE.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.
|
|
142
|
+
version: "22.2.2",
|
|
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.
|
|
150
|
+
version: "22.2.2",
|
|
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.
|
|
568
|
+
version: "22.2.2",
|
|
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-
|
|
751
|
+
//# sourceMappingURL=flusys-ng-localization-translation-key-list.page-5fvCbPgJ.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-5fvCbPgJ.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.
|
|
139
|
+
version: "22.2.2",
|
|
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.
|
|
147
|
+
version: "22.2.2",
|
|
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.
|
|
154
|
+
version: "22.2.2",
|
|
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.
|
|
177
|
+
version: "22.2.2",
|
|
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.
|
|
185
|
+
version: "22.2.2",
|
|
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.
|
|
192
|
+
version: "22.2.2",
|
|
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.
|
|
221
|
+
version: "22.2.2",
|
|
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.
|
|
229
|
+
version: "22.2.2",
|
|
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.
|
|
236
|
+
version: "22.2.2",
|
|
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.
|
|
320
|
+
version: "22.2.2",
|
|
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.
|
|
328
|
+
version: "22.2.2",
|
|
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.
|
|
335
|
+
version: "22.2.2",
|
|
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.
|
|
363
|
+
version: "22.2.2",
|
|
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.
|
|
371
|
+
version: "22.2.2",
|
|
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.
|
|
378
|
+
version: "22.2.2",
|
|
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.
|
|
393
|
+
version: "22.2.2",
|
|
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.
|
|
401
|
+
version: "22.2.2",
|
|
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.
|
|
408
|
+
version: "22.2.2",
|
|
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.
|
|
470
|
+
version: "22.2.2",
|
|
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.
|
|
478
|
+
version: "22.2.2",
|
|
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.
|
|
485
|
+
version: "22.2.2",
|
|
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.
|
|
512
|
+
version: "22.2.2",
|
|
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.
|
|
520
|
+
version: "22.2.2",
|
|
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.
|
|
577
|
+
version: "22.2.2",
|
|
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.
|
|
640
|
+
version: "22.2.2",
|
|
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.
|
|
648
|
+
version: "22.2.2",
|
|
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.
|
|
676
|
+
version: "22.2.2",
|
|
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-
|
|
736
|
+
loadComponent: () => import("./flusys-ng-localization-localization-container.page-BMe6Szzt.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-
|
|
744
|
+
loadComponent: () => import("./flusys-ng-localization-language-list.page-ADB1A-om.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-
|
|
749
|
+
loadComponent: () => import("./flusys-ng-localization-language-form.page-BxEOncGj.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-
|
|
754
|
+
loadComponent: () => import("./flusys-ng-localization-language-form.page-BxEOncGj.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-
|
|
764
|
+
loadComponent: () => import("./flusys-ng-localization-translation-key-list.page-5fvCbPgJ.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-
|
|
769
|
+
loadComponent: () => import("./flusys-ng-localization-translation-key-form.page-_rW1qDCE.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-
|
|
774
|
+
loadComponent: () => import("./flusys-ng-localization-translation-key-form.page-_rW1qDCE.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.
|
|
3
|
+
"version": "9.2.2",
|
|
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.
|
|
12
|
-
"@flusys/ng-layout": ">=9.2.
|
|
13
|
-
"@flusys/ng-shared": ">=9.2.
|
|
14
|
-
"@flusys/ng-ui": ">=9.2.
|
|
11
|
+
"@flusys/ng-core": ">=9.2.2",
|
|
12
|
+
"@flusys/ng-layout": ">=9.2.2",
|
|
13
|
+
"@flusys/ng-shared": ">=9.2.2",
|
|
14
|
+
"@flusys/ng-ui": ">=9.2.2",
|
|
15
15
|
"rxjs": "^7.8.0"
|
|
16
16
|
},
|
|
17
17
|
"sideEffects": false,
|