@flusys/ng-localization 5.5.0 → 6.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-localization.mjs","sources":["../../../projects/ng-localization/interfaces/localization-config.interface.ts","../../../projects/ng-localization/constants/localization.constants.ts","../../../projects/ng-localization/constants/messages.ts","../../../projects/ng-localization/services/language-api.service.ts","../../../projects/ng-localization/services/localization-api.service.ts","../../../projects/ng-localization/services/localization-initializer.service.ts","../../../projects/ng-localization/services/localization-state.service.ts","../../../projects/ng-localization/services/translation-api.service.ts","../../../projects/ng-localization/services/translation-key-api.service.ts","../../../projects/ng-localization/services/translation-loader.service.ts","../../../projects/ng-localization/components/language-selector/language-selector.component.ts","../../../projects/ng-localization/components/language-selector-panel/language-selector-panel.component.ts","../../../projects/ng-localization/providers/localization.providers.ts","../../../projects/ng-localization/pages/language-form/language-form.page.ts","../../../projects/ng-localization/pages/language-list/language-list.page.ts","../../../projects/ng-localization/pages/localization-container/localization-container.page.ts","../../../projects/ng-localization/pages/routes.ts","../../../projects/ng-localization/pages/translation-key-form/translation-key-form.page.ts","../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts","../../../projects/ng-localization/public-api.ts","../../../projects/ng-localization/flusys-ng-localization.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type LocalizationLoadStrategy = 'all' | 'modules';\n\n/** Localization system configuration */\nexport interface ILocalizationConfig {\n /** Default language code (e.g., 'en', 'ar') */\n defaultLanguageCode: string;\n /** Translation loading strategy (default: 'modules') */\n loadStrategy?: LocalizationLoadStrategy;\n /** Modules to load at app initialization (default: []) */\n initialModules?: string[];\n /** Show language selector in layout (default: false) */\n enableLayoutSelector?: boolean;\n}\n\nexport const LOCALIZATION_CONFIG = new InjectionToken<ILocalizationConfig>(\n 'LOCALIZATION_CONFIG',\n);\n\n/** Get localization config with sensible defaults applied */\nexport function getLocalizationConfig(\n overrides?: Partial<ILocalizationConfig>,\n): ILocalizationConfig {\n const defaults: ILocalizationConfig = {\n defaultLanguageCode: 'en',\n loadStrategy: 'all',\n initialModules: [],\n enableLayoutSelector: false,\n };\n\n return {\n ...defaults,\n ...overrides,\n defaultLanguageCode:\n overrides?.defaultLanguageCode || defaults.defaultLanguageCode,\n };\n}\n","export const STORAGE_KEYS = {\n CURRENT_LANGUAGE: 'flusys.language',\n} as const;\n","export const LOCALIZATION_MESSAGES: Record<string, string> = {\n // Language CRUD (API keys)\n 'language.create.success': 'Language created successfully',\n 'language.create.many.success': '{{count}} languages created successfully',\n 'language.get.success': 'Language retrieved successfully',\n 'language.get.by.ids.success': 'Languages retrieved successfully by Ids',\n 'language.get.by.filter.success':\n 'Languages retrieved successfully by filter',\n 'language.get.all.success': 'Languages retrieved successfully',\n 'language.update.success': 'Language updated successfully',\n 'language.update.many.success': '{{count}} languages updated successfully',\n 'language.delete.success': 'Language deleted successfully',\n 'language.restore.success': 'Language restored successfully',\n 'language.active.success': 'Active languages retrieved successfully',\n 'language.set.default.success': 'Default language updated successfully',\n 'language.get.default.success': 'Default language retrieved successfully',\n\n // Translation key CRUD (API keys)\n 'translation.key.create.success': 'Translation key created successfully',\n 'translation.key.create.many.success':\n '{{count}} translation keys created successfully',\n 'translation.key.get.success': 'Translation key retrieved successfully',\n 'translation.key.get.by.ids.success':\n 'Translation keys retrieved successfully by Ids',\n 'translation.key.get.by.filter.success':\n 'Translation keys retrieved successfully by filter',\n 'translation.key.get.all.success': 'Translation keys retrieved successfully',\n 'translation.key.update.success': 'Translation key updated successfully',\n 'translation.key.update.many.success':\n '{{count}} translation keys updated successfully',\n 'translation.key.delete.success': 'Translation key deleted successfully',\n 'translation.key.restore.success': 'Translation key restored successfully',\n 'translation.key.modules.success': 'Modules retrieved successfully',\n 'translation.key.readonly.delete.forbidden':\n 'Cannot delete readonly translation keys: {{keys}}',\n 'translation.key.readonly.update.forbidden':\n 'Cannot modify key or module of system translation keys',\n 'translation.key.duplicate.key.in.module':\n 'Translation key \"{{key}}\" already exists in module \"{{module}}\"',\n\n // Translation CRUD (API keys)\n 'translation.create.success': 'Translation created successfully',\n 'translation.create.many.success':\n '{{count}} translations created successfully',\n 'translation.get.success': 'Translation retrieved successfully',\n 'translation.get.by.ids.success':\n 'Translations retrieved successfully by Ids',\n 'translation.get.by.filter.success':\n 'Translations retrieved successfully by filter',\n 'translation.get.all.success': 'Translations retrieved successfully',\n 'translation.update.success': 'Translation updated successfully',\n 'translation.update.many.success':\n '{{count}} translations updated successfully',\n 'translation.delete.success': 'Translation deleted successfully',\n 'translation.restore.success': 'Translation restored successfully',\n 'translation.by.language.success': 'Translations retrieved successfully',\n\n // pages/localization-container/localization-container.page.ts\n 'localization.title': 'Localization',\n 'localization.subtitle': 'Manage languages and translations',\n 'localization.tabs.languages': 'Languages',\n 'localization.tabs.keys': 'Keys',\n\n // pages/language-list/language-list.page.ts\n 'localization.language.title': 'Languages',\n 'localization.language.subtitle':\n 'Manage available languages for your application',\n 'localization.language.new': 'Add Language',\n 'localization.language.code': 'Language Code',\n 'localization.language.name': 'Language Name',\n 'localization.language.native.name': 'Native Name',\n 'localization.language.direction': 'Text Direction',\n 'localization.language.rtl': 'RTL',\n 'localization.language.ltr': 'LTR',\n 'localization.language.default': 'Default',\n 'localization.language.set.default': 'Set as Default',\n 'localization.language.empty':\n 'No languages configured. Add a language to get started.',\n 'localization.language.confirm.set.default':\n 'Set \"{{name}}\" as the default language?',\n 'localization.language.delete.title': 'Delete Language',\n\n // pages/language-form/language-form.page.ts\n 'localization.language.edit': 'Edit Language',\n 'localization.placeholder.code': 'en',\n 'localization.language.iso.code.hint':\n 'ISO 639-1 language code (e.g., en, ar, fr)',\n 'localization.placeholder.name': 'English',\n 'localization.placeholder.native.name': 'English',\n 'localization.language.native.name.hint':\n 'Name in the native language (e.g., العربية for Arabic)',\n 'localization.language.display.order': 'Display Order',\n 'localization.language.direction.ltr': 'Left to Right (LTR)',\n 'localization.language.direction.rtl': 'Right to Left (RTL)',\n 'localization.validation.code.required': 'Language code is required',\n 'localization.validation.code.max.length':\n 'Language code must be at most 10 characters',\n 'localization.validation.name.required': 'Language name is required',\n 'localization.validation.name.max.length':\n 'Language name must be at most 100 characters',\n\n // pages/translation-key-list/translation-key-list.page.ts\n 'localization.key.title': 'Translation Keys',\n 'localization.key.subtitle': 'Manage translation keys for your application',\n 'localization.key.new': 'Add Key',\n 'localization.key.filter.module': 'Filter by module',\n 'localization.key.module': 'Module',\n 'localization.key.name': 'Key Name',\n 'localization.key.default.message': 'Default Message',\n 'localization.key.translations': 'Translations',\n 'localization.key.empty': 'No translation keys found',\n 'localization.key.delete.title': 'Delete Translation Key',\n\n // pages/translation-key-form/translation-key-form.page.ts\n 'localization.key.edit': 'Edit Key',\n 'localization.key.about': 'Key Information',\n 'localization.placeholder.key.name': 'button.submit',\n 'localization.key.select.module': 'Select or enter module',\n 'localization.placeholder.default.message': 'Enter default value (English)',\n 'localization.key.description': 'Description',\n 'localization.placeholder.key.description':\n 'Optional description for translators',\n 'localization.key.variables': 'Variables',\n 'localization.key.variables.placeholder': 'e.g., name, count, date',\n 'localization.key.variables.hint':\n 'Enter variable names used in this translation',\n 'localization.key.translations.section': 'Translations',\n 'localization.key.no.languages': 'No active languages configured',\n 'localization.key.enter.translation': 'Enter translation',\n 'localization.validation.key.required': 'Translation key is required',\n 'localization.validation.default.message.required':\n 'Default message is required',\n};\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LanguageApiService extends ApiResourceService<\n ICreateLanguageDto | IUpdateLanguageDto,\n ILanguage\n> {\n constructor() {\n super('language', 'localization');\n }\n\n setDefault(id: string): Observable<ISingleResponse<ILanguage>> {\n return this.http.post<ISingleResponse<ILanguage>>(\n `${this.baseUrl}/set-default`,\n { id },\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { IListResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationApiService {\n private readonly http = inject(HttpClient);\n private readonly appConfig = inject(APP_CONFIG);\n\n private get baseUrl(): string {\n return `${this.appConfig.apiBaseUrl}/localization`;\n }\n\n getActiveLanguages(): Observable<IListResponse<ILanguage>> {\n return this.http.post<IListResponse<ILanguage>>(`${this.baseUrl}/language/get-active`, {});\n }\n\n getTranslationsByLanguage(languageCode: string, modules?: string[]): Observable<ISingleResponse<ITranslationsMap>> {\n return this.http.post<ISingleResponse<ITranslationsMap>>(\n `${this.baseUrl}/translation/get-by-language`,\n { languageCode, ...(modules?.length ? { modules } : {}) },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom } from 'rxjs';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationInitializerService {\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async initialize(\n initialFallbackMessages?: Record<string, string>,\n ): Promise<void> {\n try {\n this.stateService.setLoading(true);\n if (initialFallbackMessages) {\n this.stateService.updateFallbackMessages(initialFallbackMessages);\n }\n const languagesResponse = await firstValueFrom(\n this.apiService.getActiveLanguages(),\n );\n if (languagesResponse.success && languagesResponse.data) {\n this.stateService.setAvailableLanguages(languagesResponse.data);\n\n const savedCode = this.stateService.getSavedLanguageCode();\n let selectedLanguage = languagesResponse.data.find(\n (l) => l.code === savedCode,\n );\n\n if (!selectedLanguage) {\n selectedLanguage = languagesResponse.data.find((l) => l.isDefault);\n }\n\n if (!selectedLanguage && languagesResponse.data.length > 0) {\n selectedLanguage = languagesResponse.data[0];\n }\n\n if (selectedLanguage) {\n this.stateService.setCurrentLanguage(selectedLanguage);\n }\n }\n } catch (error) {\n // Silently fail - use default language\n } finally {\n this.stateService.setLoading(false);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n computed,\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport { PrimeNG } from 'primeng/config';\nimport { STORAGE_KEYS } from '../constants/localization.constants';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationStateService {\n private readonly platformService = inject(PlatformService);\n private readonly document = inject(DOCUMENT);\n private readonly appRef = inject(ApplicationRef);\n private readonly primeNG = inject(PrimeNG);\n private readonly _loadedModules = new Set<string>();\n\n private readonly _currentLanguage = signal<ILanguage | null>(null);\n private readonly _availableLanguages = signal<ILanguage[]>([]);\n private readonly _translations = signal<ITranslationsMap>({});\n private readonly _fallbackMessages = signal<ITranslationsMap>({});\n private readonly _isLoading = signal<boolean>(false);\n\n readonly availableLanguages = this._availableLanguages.asReadonly();\n readonly translations = this._translations.asReadonly();\n readonly fallbackMessages = this._fallbackMessages.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n\n readonly currentLanguageCode = computed(\n () => this._currentLanguage()?.code ?? 'en',\n );\n\n constructor() {\n effect(() => {\n const language = this._currentLanguage();\n if (language && !this.platformService.isServer) {\n this.document.documentElement.dir = language.direction ?? 'ltr';\n this.document.documentElement.lang = language.code;\n localStorage.setItem(STORAGE_KEYS.CURRENT_LANGUAGE, language.code);\n }\n });\n\n // Trigger zoneless change detection when translations update\n effect(() => {\n this._translations();\n setTimeout(() => this.appRef.tick(), 0);\n });\n\n effect(() => {\n const translations = this._translations();\n const fallbacks = this._fallbackMessages();\n this.syncPrimeNGTranslations(translations, fallbacks);\n });\n }\n\n private dotToCamel(str: string): string {\n return str.replace(/\\.([a-z])/g, (_, c: string) => c.toUpperCase());\n }\n\n private readonly PRIMENG_NUMERIC_KEYS = new Set(['firstDayOfWeek']);\n\n private readonly PRIMENG_ARRAY_DEFAULTS: Record<string, string[]> = {\n dayNames: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n monthNames: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n monthNamesShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n };\n\n private syncPrimeNGTranslations(\n translations: ITranslationsMap,\n fallbacks: ITranslationsMap,\n ): void {\n const primeNGTranslations: Record<string, unknown> = {\n ...this.PRIMENG_ARRAY_DEFAULTS,\n };\n const ariaTranslations: Record<string, string> = {};\n const prefix = 'primeng.';\n const ariaPrefix = 'primeng.aria.';\n\n const allMessages = { ...fallbacks, ...translations };\n\n for (const [key, value] of Object.entries(allMessages)) {\n if (key.startsWith(ariaPrefix)) {\n const ariaKey = this.dotToCamel(key.substring(ariaPrefix.length));\n ariaTranslations[ariaKey] = value;\n } else if (key.startsWith(prefix)) {\n const primeKey = this.dotToCamel(key.substring(prefix.length));\n primeNGTranslations[primeKey] = this.PRIMENG_NUMERIC_KEYS.has(primeKey)\n ? parseInt(value, 10)\n : value;\n }\n }\n\n if (Object.keys(ariaTranslations).length > 0) {\n primeNGTranslations['aria'] = ariaTranslations;\n }\n\n this.primeNG.setTranslation(primeNGTranslations);\n }\n\n setCurrentLanguage(language: ILanguage): void {\n this._currentLanguage.set(language);\n }\n\n setAvailableLanguages(languages: ILanguage[]): void {\n this._availableLanguages.set(languages);\n }\n\n setTranslations(translations: ITranslationsMap): void {\n this._translations.set(translations);\n }\n\n mergeTranslations(translations: ITranslationsMap): void {\n this._translations.update((current) => ({ ...current, ...translations }));\n }\n\n setLoading(loading: boolean): void {\n this._isLoading.set(loading);\n }\n\n getSavedLanguageCode(): string | null {\n if (this.platformService.isServer) return null;\n return localStorage.getItem(STORAGE_KEYS.CURRENT_LANGUAGE);\n }\n\n isModuleLoaded(module: string): boolean {\n return this._loadedModules.has(module);\n }\n\n markModuleLoaded(module: string): void {\n this._loadedModules.add(module);\n }\n\n getLoadedModules(): string[] {\n return Array.from(this._loadedModules);\n }\n\n clearLoadedModules(): void {\n this._loadedModules.clear();\n }\n\n updateFallbackMessages(messages: ITranslationsMap): void {\n this._fallbackMessages.update((current) => ({ ...current, ...messages }));\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IListResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ITranslation } from '../interfaces/translation.interface';\n\nexport interface ICreateTranslationDto {\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n isActive?: boolean;\n}\n\nexport interface IUpdateTranslationDto extends Partial<ICreateTranslationDto> {\n id: string;\n}\n\nexport interface IBulkUpdateTranslationDto {\n id?: string;\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationApiService extends ApiResourceService<\n ICreateTranslationDto | IUpdateTranslationDto,\n ITranslation\n> {\n constructor() {\n super('translation', 'localization');\n }\n\n getByKeyId(\n translationKeyId: string,\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/get-all`,\n {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { translationKeyId },\n sort: {},\n },\n );\n }\n\n getCounts(): Observable<ISingleResponse<Record<string, number>>> {\n return this.http.post<ISingleResponse<Record<string, number>>>(\n `${this.baseUrl}/get-counts`,\n {},\n );\n }\n\n bulkUpdate(\n translations: IBulkUpdateTranslationDto[],\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/update-many-values`,\n { translations },\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../interfaces/translation-key.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationKeyApiService extends ApiResourceService<\n ICreateTranslationKeyDto | IUpdateTranslationKeyDto,\n ITranslationKey\n> {\n constructor() {\n super('translation-key', 'localization');\n }\n\n getModules(): Observable<ISingleResponse<string[]>> {\n return this.http.post<ISingleResponse<string[]>>(\n `${this.baseUrl}/get-modules`,\n {},\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom, from, Observable } from 'rxjs';\nimport { LOCALIZATION_CONFIG } from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationLoaderService {\n private readonly DEFAULT_INITIAL_MODULES = ['shared', 'layout'];\n private readonly config = inject(LOCALIZATION_CONFIG, { optional: true });\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async loadTranslations(\n languageCode: string,\n clearModules = false,\n ): Promise<void> {\n const strategy = this.config?.loadStrategy ?? 'all';\n\n // Save currently loaded modules before clearing (for language switch)\n const previouslyLoadedModules = clearModules\n ? this.stateService.getLoadedModules()\n : [];\n\n if (clearModules) {\n this.stateService.clearLoadedModules();\n }\n\n this.stateService.setLoading(true);\n\n try {\n if (strategy === 'all') {\n await this.loadAndSetTranslations(languageCode);\n } else {\n const modules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n await this.loadAndSetTranslations(languageCode, modules);\n // Reload all previously loaded modules for the new language\n if (previouslyLoadedModules.length > 0) {\n await this.reloadModules(languageCode, previouslyLoadedModules);\n }\n }\n } finally {\n this.stateService.setLoading(false);\n }\n }\n\n private async loadAndSetTranslations(\n languageCode: string,\n modules?: string[],\n ): Promise<void> {\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(languageCode, modules),\n );\n if (response.success && response.data) {\n this.stateService.setTranslations(response.data);\n if (modules) {\n modules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n }\n\n private async reloadModules(\n languageCode: string,\n modules: string[],\n ): Promise<void> {\n const initialModules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n const additionalModules = modules.filter(\n (m) => !initialModules.includes(m),\n );\n\n if (additionalModules.length === 0) return;\n\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(\n languageCode,\n additionalModules,\n ),\n );\n\n if (response.success && response.data) {\n this.stateService.mergeTranslations(response.data);\n additionalModules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n\n loadTranslationsAsync(\n languageCode: string,\n clearModules = false,\n ): Observable<void> {\n return from(this.loadTranslations(languageCode, clearModules));\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector',\n imports: [StyleClassModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\">\n <i class=\"pi pi-globe\"></i>\n <span class=\"font-semibold\">{{ selectedLanguage()?.nativeName || selectedLanguage()?.name || selectedLanguageCode() }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-3 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] min-w-[180px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\">\n <div class=\"flex flex-col\">\n @for (lang of languages(); track lang.id) {\n <button\n type=\"button\"\n class=\"flex items-center gap-3 px-3 py-2.5 rounded-border cursor-pointer transition-all duration-200 text-left w-full border-none bg-transparent hover:bg-emphasis\"\n [class.bg-primary-50]=\"lang.code === selectedLanguageCode()\"\n [class.text-primary]=\"lang.code === selectedLanguageCode()\"\n (click)=\"onLanguageSelect(lang.code)\">\n <span class=\"font-medium flex-1\">{{ lang.nativeName || lang.name }}</span>\n <span class=\"text-xs text-muted-color uppercase\">({{ lang.code }})</span>\n @if (lang.code === selectedLanguageCode()) {\n <i class=\"pi pi-check text-primary text-sm\"></i>\n }\n </button>\n }\n </div>\n </div>\n `,\n})\nexport class LanguageSelectorComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n readonly selectedLanguageCode = this.localizationState.currentLanguageCode;\n readonly selectedLanguage = computed(() => this.languages().find((l) => l.code === this.selectedLanguageCode()) ?? null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this._isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this.localizationState.setCurrentLanguage(language);\n this._isActive.set(false);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import { Component, DestroyRef, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector-panel',\n imports: [],\n host: {\n class:\n 'hidden absolute top-[3.25rem] z-50 p-3 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] min-w-[180px]',\n style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',\n },\n template: `\n <div class=\"flex flex-col\">\n @for (lang of languages(); track lang.id) {\n <button\n type=\"button\"\n class=\"flex items-center gap-3 px-3 py-2.5 rounded-border cursor-pointer transition-all duration-200 text-left w-full border-none bg-transparent hover:bg-emphasis\"\n [class.bg-primary-50]=\"lang.code === selectedLanguageCode()\"\n [class.text-primary]=\"lang.code === selectedLanguageCode()\"\n (click)=\"onLanguageSelect(lang.code)\">\n <span class=\"font-medium flex-1\">{{ lang.nativeName || lang.name }}</span>\n <span class=\"text-xs text-muted-color uppercase\">({{ lang.code }})</span>\n @if (lang.code === selectedLanguageCode()) {\n <i class=\"pi pi-check text-primary text-sm\"></i>\n }\n </button>\n }\n </div>\n `,\n})\nexport class LanguageSelectorPanelComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _selectedLanguageCode = signal<string>(this.localizationState.currentLanguageCode());\n readonly selectedLanguageCode = this._selectedLanguageCode.asReadonly();\n\n constructor() {\n effect(() => {\n const currentCode = this.localizationState.currentLanguageCode();\n if (currentCode !== this._selectedLanguageCode()) {\n this._selectedLanguageCode.set(currentCode);\n }\n });\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this._selectedLanguageCode.set(code);\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n provideAppInitializer,\n Provider,\n} from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_LANGUAGE_SELECTOR_PANEL,\n} from '@flusys/ng-layout';\nimport { LanguageSelectorPanelComponent } from '../components/language-selector-panel/language-selector-panel.component';\nimport { LanguageSelectorComponent } from '../components/language-selector/language-selector.component';\nimport {\n ILocalizationConfig,\n LOCALIZATION_CONFIG,\n} from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from '../services/localization-api.service';\nimport { LocalizationInitializerService } from '../services/localization-initializer.service';\nimport { LocalizationStateService } from '../services/localization-state.service';\n\nexport function provideLocalization(\n config: ILocalizationConfig,\n initialFallbackMessages?: Record<string, string>,\n): Array<Provider | EnvironmentProviders> {\n const providers: Array<Provider | EnvironmentProviders> = [\n // 1. Value/Existing Providers\n { provide: LOCALIZATION_CONFIG, useValue: config },\n {\n provide: LOCALIZATION_STATE_SERVICE,\n useExisting: LocalizationStateService,\n },\n { provide: LOCALIZATION_API_SERVICE, useExisting: LocalizationApiService },\n\n // 2. The Service itself\n LocalizationInitializerService,\n\n // 3. The modern Initializer\n provideAppInitializer(() => {\n const initializer = inject(LocalizationInitializerService);\n return initializer.initialize(initialFallbackMessages);\n }),\n ];\n\n if (config.enableLayoutSelector) {\n providers.push(\n {\n provide: LAYOUT_LANGUAGE_SELECTOR,\n useValue: LanguageSelectorComponent,\n },\n {\n provide: LAYOUT_LANGUAGE_SELECTOR_PANEL,\n useValue: LanguageSelectorPanelComponent,\n },\n );\n }\n\n return providers;\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { form, FormField, maxLength, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n AngularModule,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\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: [AngularModule, PrimeModule, FormsModule, FormField, TranslatePipe],\n template: `\n <p-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 pInputText\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 pInputText\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 pInputText\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 <p-select\n id=\"direction\"\n [ngModel]=\"formModel().direction\"\n (ngModelChange)=\"updateDirection($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"directionOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n />\n </div>\n\n <!-- Display Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'localization.language.display.order' | translate\n }}</label>\n <input\n pInputText\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 <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"formTree.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"formTree.isDefault\" />\n <span>{{ 'localization.language.default' | translate }}</span>\n </label>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n pButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n pButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <span pButtonIcon class=\"pi pi-spinner pi-spin\"></span>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </p-card>\n `,\n})\nexport class LanguageFormPage {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly existingLanguage = signal<ILanguage | null>(null);\n readonly isEditMode = computed(() => !!this.existingLanguage());\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly directionOptions = computed(() => [\n {\n label: this.translate('localization.language.direction.ltr'),\n value: 'ltr',\n },\n {\n label: this.translate('localization.language.direction.rtl'),\n value: 'rtl',\n },\n ]);\n\n readonly formModel = signal<ILanguageFormModel>({\n code: '',\n name: '',\n nativeName: '',\n direction: 'ltr',\n serial: '',\n isActive: true,\n isDefault: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.code, {\n message: this.translate('localization.validation.code.required'),\n });\n maxLength(f.code, 10, {\n message: this.translate('localization.validation.code.max.length'),\n });\n required(f.name, {\n message: this.translate('localization.validation.name.required'),\n });\n maxLength(f.name, 100, {\n message: this.translate('localization.validation.name.max.length'),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.code.trim().length > 0 && model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadLanguage(id);\n }\n });\n }\n\n updateDirection(value: 'ltr' | 'rtl'): void {\n this.formModel.update((m) => ({ ...m, direction: value }));\n }\n\n loadLanguage(id: string): void {\n this.isSaving.set(true);\n from(this.languageService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingLanguage.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n },\n error: () => this.router.navigate(['/localization/languages']),\n });\n }\n\n private toFormModel(language: ILanguage): ILanguageFormModel {\n return {\n code: language.code,\n name: language.name,\n nativeName: language.nativeName ?? '',\n direction: language.direction ?? 'ltr',\n serial: language.serial?.toString() ?? '',\n isActive: language.isActive,\n isDefault: language.isDefault,\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const dto = {\n code: model.code,\n name: model.name,\n nativeName: model.nativeName || undefined,\n direction: model.direction,\n serial: model.serial ? parseInt(model.serial, 10) : undefined,\n isActive: model.isActive,\n isDefault: model.isDefault,\n };\n\n const operation$ = this.isEditMode()\n ? from(\n this.languageService.update({\n id: this.existingLanguage()!.id,\n ...dto,\n } as IUpdateLanguageDto),\n )\n : from(this.languageService.insert(dto as ICreateLanguageDto));\n\n operation$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.router.navigate(['/localization/languages']);\n }\n },\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/languages']);\n }\n}\n","import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport {\n AngularModule,\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\n\n@Component({\n selector: 'lib-language-list-page',\n imports: [AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.language.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.language.subtitle' | translate }}\n </p>\n </div>\n <button\n pButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <span pButtonIcon class=\"pi pi-plus\"></span>\n <span pButtonLabel>{{ 'localization.language.new' | translate }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <p-table\n [value]=\"languageService.data()\"\n [loading]=\"languageService.isLoading()\"\n styleClass=\"p-datatable-sm\"\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 <p-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 <p-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 <p-tag\n [value]=\"'localization.language.default' | translate\"\n severity=\"contrast\"\n />\n }\n </div>\n </td>\n <td>\n <div class=\"flex gap-1\">\n @if (!lang.isDefault) {\n <button\n pButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n size=\"small\"\n [pTooltip]=\"\n 'localization.language.set.default' | translate\n \"\n (click)=\"onSetDefault(lang)\"\n >\n <span pButtonIcon class=\"pi pi-star\"></span>\n </button>\n }\n <button\n pButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [pTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(lang.id)\"\n >\n <span pButtonIcon class=\"pi pi-pencil\"></span>\n </button>\n <button\n pButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [pTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"lang.isDefault\"\n (click)=\"onDelete(lang)\"\n >\n <span pButtonIcon class=\"pi pi-trash\"></span>\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 </p-table>\n </div>\n </div>\n `,\n})\nexport class LanguageListPage implements OnInit {\n readonly LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;\n\n private readonly router = inject(Router);\n readonly languageService = inject(LanguageApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.languageService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/languages/new']);\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'localization.language.confirm.set.default',\n { name: lang.name },\n ),\n header: this.translateService.translate(\n 'localization.language.set.default',\n ),\n icon: 'pi pi-star',\n accept: () => {\n this.languageService\n .setDefault(lang.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate(\n 'localization.language.delete.title',\n ),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.languageService.delete({ id: lang.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n 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],\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 <i [class]=\"tab.icon\"></i>\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: 'pi pi-globe',\n route: 'languages',\n permission: LANGUAGE_PERMISSIONS.READ,\n },\n {\n id: 'keys',\n labelKey: 'localization.tabs.keys',\n icon: 'pi pi-key',\n route: 'keys',\n permission: TRANSLATION_KEY_PERMISSIONS.READ,\n },\n ];\n\n readonly visibleTabs = computed(() => {\n // Explicitly track permissions signal for reactivity\n const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n","import { Routes } from '@angular/router';\nimport { SHARED_MESSAGES, resolveTranslationModule } from '@flusys/ng-shared';\nimport { LOCALIZATION_MESSAGES } from '../constants/messages';\n\nexport const LOCALIZATION_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['localization'], fallbackMessages: { ...LOCALIZATION_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('./localization-container/localization-container.page').then(\n (m) => m.LocalizationContainerPage,\n ),\n children: [\n {\n path: 'languages',\n loadComponent: () =>\n import('./language-list/language-list.page').then((m) => m.LanguageListPage),\n },\n {\n path: 'languages/new',\n loadComponent: () =>\n import('./language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: 'languages/:id',\n loadComponent: () =>\n import('./language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: 'keys',\n loadComponent: () =>\n import('./translation-key-list/translation-key-list.page').then(\n (m) => m.TranslationKeyListPage,\n ),\n },\n {\n path: 'keys/new',\n loadComponent: () =>\n import('./translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: 'keys/:id',\n loadComponent: () =>\n import('./translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: '',\n redirectTo: 'languages',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n AngularModule,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\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: [AngularModule, PrimeModule, FormsModule, FormField, TranslatePipe],\n template: `\n <p-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 pInputText\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 <p-select\n id=\"module\"\n [ngModel]=\"formModel().module\"\n (ngModelChange)=\"updateModule($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"moduleOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [editable]=\"true\"\n [placeholder]=\"'localization.key.select.module' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <!-- Default Message -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"defaultMessage\" class=\"font-medium\"\n >{{ 'localization.key.default.message' | translate }} *</label\n >\n <textarea\n pInputTextarea\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 pInputText\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 pInputText\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 <p-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 <p-tag\n [value]=\"lang.code\"\n severity=\"secondary\"\n class=\"uppercase\"\n />\n </div>\n <textarea\n pInputTextarea\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 pButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n pButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <span pButtonIcon class=\"pi pi-spinner pi-spin\"></span>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </p-card>\n `,\n})\nexport class TranslationKeyFormPage implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly isLoadingLanguages = signal(false);\n readonly existingKey = signal<ITranslationKey | null>(null);\n readonly isEditMode = computed(() => !!this.existingKey());\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translations = signal<ITranslationValue[]>([]);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly moduleOptions = computed(() =>\n this.modules().map((m) => ({ label: m, value: m })),\n );\n\n readonly formModel = signal<ITranslationKeyFormModel>({\n key: '',\n module: '',\n defaultMessage: '',\n description: '',\n variables: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.key, {\n message: this.translate('localization.validation.key.required'),\n });\n required(f.defaultMessage, {\n message: this.translate(\n 'localization.validation.default.message.required',\n ),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.key.trim().length > 0 &&\n model.module.trim().length > 0 &&\n model.defaultMessage.trim().length > 0\n );\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadTranslationKey(id);\n }\n });\n }\n\n ngOnInit(): void {\n this.loadInitialData();\n }\n\n loadInitialData(): void {\n this.isLoadingLanguages.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingLanguages.set(false)),\n )\n .subscribe({\n next: ({ languages, modules }) => {\n if (languages.success && languages.data) {\n const activeLanguages = languages.data.filter((l) => l.isActive);\n this.languages.set(activeLanguages);\n this.initializeTranslations(activeLanguages);\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n },\n });\n }\n\n initializeTranslations(languages: ILanguage[]): void {\n const current = this.translations();\n if (current.length === 0) {\n this.translations.set(\n languages.map((lang) => ({ languageId: lang.id, value: '' })),\n );\n }\n }\n\n updateModule(value: string): void {\n this.formModel.update((m) => ({ ...m, module: value ?? '' }));\n }\n\n getTranslationValue(languageId: string): string {\n return (\n this.translations().find((t) => t.languageId === languageId)?.value ?? ''\n );\n }\n\n setTranslationValue(languageId: string, value: string): void {\n this.translations.update((list) => {\n const existing = list.find((t) => t.languageId === languageId);\n if (existing) {\n return list.map((t) =>\n t.languageId === languageId ? { ...t, value } : t,\n );\n }\n return [...list, { languageId, value }];\n });\n }\n\n loadTranslationKey(id: string): void {\n this.isSaving.set(true);\n from(this.translationKeyService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingKey.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n this.loadExistingTranslations(id);\n }\n },\n error: () => this.router.navigate(['/localization/keys']),\n });\n }\n\n loadExistingTranslations(keyId: string): void {\n this.translationService\n .getByKeyId(keyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translations.update((list) => {\n const updated = [...list];\n response.data!.forEach((t) => {\n const existing = updated.find(\n (tr) => tr.languageId === t.languageId,\n );\n if (existing) {\n existing.value = t.value;\n existing.translationId = t.id;\n } else {\n updated.push({\n languageId: t.languageId,\n value: t.value,\n translationId: t.id,\n });\n }\n });\n return updated;\n });\n }\n },\n });\n }\n\n private toFormModel(key: ITranslationKey): ITranslationKeyFormModel {\n return {\n key: key.key,\n module: key.module,\n defaultMessage: key.defaultMessage,\n description: key.description ?? '',\n variables: key.variables?.join(', ') ?? '',\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const variables = model.variables\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n\n if (this.isEditMode()) {\n this.updateKey(model, variables);\n } else {\n this.createKey(model, variables);\n }\n }\n\n private createKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const createDto: ICreateTranslationKeyDto = {\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.insert(createDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.saveTranslations(\n response.data.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private updateKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const updateDto: IUpdateTranslationKeyDto = {\n id: this.existingKey()!.id,\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.update(updateDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.saveTranslations(\n this.existingKey()!.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private saveTranslations(\n keyId: string,\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n const translationsToSave: IBulkUpdateTranslationDto[] = this.translations()\n .filter((t) => t.value?.trim())\n .map((t) => ({\n id: t.translationId,\n languageId: t.languageId,\n translationKeyId: keyId,\n value: t.value,\n isVerified: false,\n }));\n\n if (translationsToSave.length === 0) {\n this.onSaveSuccess(messageKey, messageVariables);\n return;\n }\n\n this.translationService\n .bulkUpdate(translationsToSave)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.onSaveSuccess(messageKey, messageVariables),\n error: () => this.onSaveSuccess(messageKey, messageVariables),\n });\n }\n\n private onSaveSuccess(\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: messageKey ? this.translate(messageKey, messageVariables) : '',\n });\n this.isSaving.set(false);\n this.router.navigate(['/localization/keys']);\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/keys']);\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n AngularModule,\n HasPermissionDirective,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { ITranslationKey } from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { TranslationApiService } from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\n\n@Component({\n selector: 'lib-translation-key-list-page',\n imports: [\n AngularModule,\n PrimeModule,\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 pButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <span pButtonIcon class=\"pi pi-plus\"></span>\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 <p-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 <p-iconfield class=\"w-full\">\n <p-inputicon class=\"pi pi-search\" />\n <input\n pInputText\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </p-iconfield>\n </div>\n </div>\n\n <!-- Table -->\n <p-table\n [value]=\"filteredKeys()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"15\"\n [rowsPerPageOptions]=\"[10, 15, 25, 50]\"\n class=\"p-datatable-sm\"\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 <p-tag [value]=\"key.module\" severity=\"secondary\" />\n </td>\n <td>\n <div class=\"font-medium\">{{ key.key }}</div>\n @if (key.description) {\n <small class=\"text-muted-color\">{{ key.description }}</small>\n }\n </td>\n <td>{{ key.defaultMessage }}</td>\n <td class=\"text-center\">\n <span\n class=\"text-sm\"\n [class.text-green-500]=\"translationCount === languageCount\"\n [class.text-orange-500]=\"\n translationCount < languageCount && translationCount > 0\n \"\n [class.text-muted-color]=\"translationCount === 0\"\n >\n {{ translationCount }}/{{ languageCount }}\n </span>\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n pButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [pTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(key)\"\n >\n <span pButtonIcon class=\"pi pi-pencil\"></span>\n </button>\n <button\n pButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [pTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(key)\"\n >\n <span pButtonIcon class=\"pi pi-trash\"></span>\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 </p-table>\n </div>\n `,\n})\nexport class TranslationKeyListPage implements OnInit {\n readonly TRANSLATION_KEY_PERMISSIONS = TRANSLATION_KEY_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isLoading = signal(false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translationKeys = signal<ITranslationKey[]>([]);\n readonly translationCounts = signal<Map<string, number>>(new Map());\n readonly selectedModule = signal<string | null>(null);\n readonly searchTerm = signal('');\n\n readonly moduleOptions = computed(() => [\n { label: this.translateService.translate('shared.all'), value: null },\n ...this.modules().map((m) => ({ label: m, value: m })),\n ]);\n\n readonly filteredKeys = computed(() => {\n let keys = this.translationKeys();\n const module = this.selectedModule();\n const search = this.searchTerm().toLowerCase().trim();\n\n if (module) {\n keys = keys.filter((k) => k.module === module);\n }\n\n if (search) {\n keys = keys.filter(\n (k) =>\n k.key.toLowerCase().includes(search) ||\n k.defaultMessage.toLowerCase().includes(search) ||\n k.module.toLowerCase().includes(search),\n );\n }\n\n return keys;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n loadData(): void {\n this.isLoading.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n keys: from(\n this.translationKeyService.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n sort: { module: 'ASC', key: 'ASC' },\n }),\n ),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: ({ languages, modules, keys }) => {\n if (languages.success && languages.data) {\n this.languages.set(languages.data.filter((l) => l.isActive));\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n if (keys.success && keys.data) {\n this.translationKeys.set(keys.data);\n this.loadTranslationCounts();\n }\n this.isLoading.set(false);\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n });\n }\n\n getTranslationCount(keyId: string): number {\n return this.translationCounts().get(keyId) ?? 0;\n }\n\n onModuleChange(value: string | null): void {\n this.selectedModule.set(value);\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/keys/new']);\n }\n\n onEdit(key: ITranslationKey): void {\n this.router.navigate(['/localization/keys', key.id]);\n }\n\n onDelete(key: ITranslationKey): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate('localization.key.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.translationKeyService.delete({ id: key.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.loadData();\n }\n },\n });\n },\n });\n }\n}\n","// Interfaces\nexport * from './interfaces/language.interface';\nexport * from './interfaces/localization-config.interface';\nexport * from './interfaces/translation-key.interface';\nexport * from './interfaces/translation.interface';\n\n// Constants\nexport * from './constants/localization.constants';\nexport * from './constants/messages';\n\n// Services\nexport * from './services/language-api.service';\nexport * from './services/localization-api.service';\nexport * from './services/localization-initializer.service';\nexport * from './services/localization-state.service';\nexport * from './services/translation-api.service';\nexport * from './services/translation-key-api.service';\nexport * from './services/translation-loader.service';\n\n// Components\nexport * from './components/language-selector/language-selector.component';\n\n// Providers\nexport * from './providers/localization.providers';\n\n// Pages\nexport * from './pages/language-form/language-form.page';\nexport * from './pages/language-list/language-list.page';\nexport * from './pages/localization-container/localization-container.page';\nexport * from './pages/routes';\nexport * from './pages/translation-key-form/translation-key-form.page';\nexport * from './pages/translation-key-list/translation-key-list.page';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i6","i5","i7","i8","i9"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flusys-ng-localization.mjs","sources":["../../../projects/ng-localization/interfaces/localization-config.interface.ts","../../../projects/ng-localization/constants/localization.constants.ts","../../../projects/ng-localization/constants/messages.ts","../../../projects/ng-localization/services/language-api.service.ts","../../../projects/ng-localization/services/localization-api.service.ts","../../../projects/ng-localization/services/localization-initializer.service.ts","../../../projects/ng-localization/services/localization-state.service.ts","../../../projects/ng-localization/services/translation-api.service.ts","../../../projects/ng-localization/services/translation-key-api.service.ts","../../../projects/ng-localization/services/translation-loader.service.ts","../../../projects/ng-localization/components/language-selector/language-selector.component.ts","../../../projects/ng-localization/components/language-selector-panel/language-selector-panel.component.ts","../../../projects/ng-localization/providers/localization.providers.ts","../../../projects/ng-localization/pages/language-form/language-form.page.ts","../../../projects/ng-localization/pages/language-list/language-list.page.ts","../../../projects/ng-localization/pages/localization-container/localization-container.page.ts","../../../projects/ng-localization/pages/routes.ts","../../../projects/ng-localization/pages/translation-key-form/translation-key-form.page.ts","../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts","../../../projects/ng-localization/public-api.ts","../../../projects/ng-localization/flusys-ng-localization.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type LocalizationLoadStrategy = 'all' | 'modules';\n\n/** Localization system configuration */\nexport interface ILocalizationConfig {\n /** Default language code (e.g., 'en', 'ar') */\n defaultLanguageCode: string;\n /** Translation loading strategy (default: 'modules') */\n loadStrategy?: LocalizationLoadStrategy;\n /** Modules to load at app initialization (default: []) */\n initialModules?: string[];\n /** Show language selector in layout (default: false) */\n enableLayoutSelector?: boolean;\n}\n\nexport const LOCALIZATION_CONFIG = new InjectionToken<ILocalizationConfig>(\n 'LOCALIZATION_CONFIG',\n);\n\n/** Get localization config with sensible defaults applied */\nexport function getLocalizationConfig(\n overrides?: Partial<ILocalizationConfig>,\n): ILocalizationConfig {\n const defaults: ILocalizationConfig = {\n defaultLanguageCode: 'en',\n loadStrategy: 'all',\n initialModules: [],\n enableLayoutSelector: false,\n };\n\n return {\n ...defaults,\n ...overrides,\n defaultLanguageCode:\n overrides?.defaultLanguageCode || defaults.defaultLanguageCode,\n };\n}\n","export const STORAGE_KEYS = {\n CURRENT_LANGUAGE: 'flusys.language',\n} as const;\n","export const LOCALIZATION_MESSAGES: Record<string, string> = {\n // Language CRUD (API keys)\n 'language.create.success': 'Language created successfully',\n 'language.create.many.success': '{{count}} languages created successfully',\n 'language.get.success': 'Language retrieved successfully',\n 'language.get.by.ids.success': 'Languages retrieved successfully by Ids',\n 'language.get.by.filter.success':\n 'Languages retrieved successfully by filter',\n 'language.get.all.success': 'Languages retrieved successfully',\n 'language.update.success': 'Language updated successfully',\n 'language.update.many.success': '{{count}} languages updated successfully',\n 'language.delete.success': 'Language deleted successfully',\n 'language.restore.success': 'Language restored successfully',\n 'language.active.success': 'Active languages retrieved successfully',\n 'language.set.default.success': 'Default language updated successfully',\n 'language.get.default.success': 'Default language retrieved successfully',\n\n // Translation key CRUD (API keys)\n 'translation.key.create.success': 'Translation key created successfully',\n 'translation.key.create.many.success':\n '{{count}} translation keys created successfully',\n 'translation.key.get.success': 'Translation key retrieved successfully',\n 'translation.key.get.by.ids.success':\n 'Translation keys retrieved successfully by Ids',\n 'translation.key.get.by.filter.success':\n 'Translation keys retrieved successfully by filter',\n 'translation.key.get.all.success': 'Translation keys retrieved successfully',\n 'translation.key.update.success': 'Translation key updated successfully',\n 'translation.key.update.many.success':\n '{{count}} translation keys updated successfully',\n 'translation.key.delete.success': 'Translation key deleted successfully',\n 'translation.key.restore.success': 'Translation key restored successfully',\n 'translation.key.modules.success': 'Modules retrieved successfully',\n 'translation.key.readonly.delete.forbidden':\n 'Cannot delete readonly translation keys: {{keys}}',\n 'translation.key.readonly.update.forbidden':\n 'Cannot modify key or module of system translation keys',\n 'translation.key.duplicate.key.in.module':\n 'Translation key \"{{key}}\" already exists in module \"{{module}}\"',\n\n // Translation CRUD (API keys)\n 'translation.create.success': 'Translation created successfully',\n 'translation.create.many.success':\n '{{count}} translations created successfully',\n 'translation.get.success': 'Translation retrieved successfully',\n 'translation.get.by.ids.success':\n 'Translations retrieved successfully by Ids',\n 'translation.get.by.filter.success':\n 'Translations retrieved successfully by filter',\n 'translation.get.all.success': 'Translations retrieved successfully',\n 'translation.update.success': 'Translation updated successfully',\n 'translation.update.many.success':\n '{{count}} translations updated successfully',\n 'translation.delete.success': 'Translation deleted successfully',\n 'translation.restore.success': 'Translation restored successfully',\n 'translation.by.language.success': 'Translations retrieved successfully',\n\n // pages/localization-container/localization-container.page.ts\n 'localization.title': 'Localization',\n 'localization.subtitle': 'Manage languages and translations',\n 'localization.tabs.languages': 'Languages',\n 'localization.tabs.keys': 'Keys',\n\n // pages/language-list/language-list.page.ts\n 'localization.language.title': 'Languages',\n 'localization.language.subtitle':\n 'Manage available languages for your application',\n 'localization.language.new': 'Add Language',\n 'localization.language.code': 'Language Code',\n 'localization.language.name': 'Language Name',\n 'localization.language.native.name': 'Native Name',\n 'localization.language.direction': 'Text Direction',\n 'localization.language.rtl': 'RTL',\n 'localization.language.ltr': 'LTR',\n 'localization.language.default': 'Default',\n 'localization.language.set.default': 'Set as Default',\n 'localization.language.empty':\n 'No languages configured. Add a language to get started.',\n 'localization.language.confirm.set.default':\n 'Set \"{{name}}\" as the default language?',\n 'localization.language.delete.title': 'Delete Language',\n\n // pages/language-form/language-form.page.ts\n 'localization.language.edit': 'Edit Language',\n 'localization.placeholder.code': 'en',\n 'localization.language.iso.code.hint':\n 'ISO 639-1 language code (e.g., en, ar, fr)',\n 'localization.placeholder.name': 'English',\n 'localization.placeholder.native.name': 'English',\n 'localization.language.native.name.hint':\n 'Name in the native language (e.g., العربية for Arabic)',\n 'localization.language.display.order': 'Display Order',\n 'localization.language.direction.ltr': 'Left to Right (LTR)',\n 'localization.language.direction.rtl': 'Right to Left (RTL)',\n 'localization.validation.code.required': 'Language code is required',\n 'localization.validation.code.max.length':\n 'Language code must be at most 10 characters',\n 'localization.validation.name.required': 'Language name is required',\n 'localization.validation.name.max.length':\n 'Language name must be at most 100 characters',\n\n // pages/translation-key-list/translation-key-list.page.ts\n 'localization.key.title': 'Translation Keys',\n 'localization.key.subtitle': 'Manage translation keys for your application',\n 'localization.key.new': 'Add Key',\n 'localization.key.filter.module': 'Filter by module',\n 'localization.key.module': 'Module',\n 'localization.key.name': 'Key Name',\n 'localization.key.default.message': 'Default Message',\n 'localization.key.translations': 'Translations',\n 'localization.key.empty': 'No translation keys found',\n 'localization.key.delete.title': 'Delete Translation Key',\n\n // pages/translation-key-form/translation-key-form.page.ts\n 'localization.key.edit': 'Edit Key',\n 'localization.key.about': 'Key Information',\n 'localization.placeholder.key.name': 'button.submit',\n 'localization.key.select.module': 'Select or enter module',\n 'localization.placeholder.default.message': 'Enter default value (English)',\n 'localization.key.description': 'Description',\n 'localization.placeholder.key.description':\n 'Optional description for translators',\n 'localization.key.variables': 'Variables',\n 'localization.key.variables.placeholder': 'e.g., name, count, date',\n 'localization.key.variables.hint':\n 'Enter variable names used in this translation',\n 'localization.key.translations.section': 'Translations',\n 'localization.key.no.languages': 'No active languages configured',\n 'localization.key.enter.translation': 'Enter translation',\n 'localization.validation.key.required': 'Translation key is required',\n 'localization.validation.default.message.required':\n 'Default message is required',\n};\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LanguageApiService extends ApiResourceService<\n ICreateLanguageDto | IUpdateLanguageDto,\n ILanguage\n> {\n constructor() {\n super('language', 'localization');\n }\n\n setDefault(id: string): Observable<ISingleResponse<ILanguage>> {\n return this.http.post<ISingleResponse<ILanguage>>(\n `${this.baseUrl}/set-default`,\n { id },\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { IListResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationApiService {\n private readonly http = inject(HttpClient);\n private readonly appConfig = inject(APP_CONFIG);\n\n private get baseUrl(): string {\n return `${this.appConfig.apiBaseUrl}/localization`;\n }\n\n getActiveLanguages(): Observable<IListResponse<ILanguage>> {\n return this.http.post<IListResponse<ILanguage>>(`${this.baseUrl}/language/get-active`, {});\n }\n\n getTranslationsByLanguage(languageCode: string, modules?: string[]): Observable<ISingleResponse<ITranslationsMap>> {\n return this.http.post<ISingleResponse<ITranslationsMap>>(\n `${this.baseUrl}/translation/get-by-language`,\n { languageCode, ...(modules?.length ? { modules } : {}) },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom } from 'rxjs';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationInitializerService {\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async initialize(\n initialFallbackMessages?: Record<string, string>,\n ): Promise<void> {\n try {\n this.stateService.setLoading(true);\n if (initialFallbackMessages) {\n this.stateService.updateFallbackMessages(initialFallbackMessages);\n }\n const languagesResponse = await firstValueFrom(\n this.apiService.getActiveLanguages(),\n );\n if (languagesResponse.success && languagesResponse.data) {\n this.stateService.setAvailableLanguages(languagesResponse.data);\n\n const savedCode = this.stateService.getSavedLanguageCode();\n let selectedLanguage = languagesResponse.data.find(\n (l) => l.code === savedCode,\n );\n\n if (!selectedLanguage) {\n selectedLanguage = languagesResponse.data.find((l) => l.isDefault);\n }\n\n if (!selectedLanguage && languagesResponse.data.length > 0) {\n selectedLanguage = languagesResponse.data[0];\n }\n\n if (selectedLanguage) {\n this.stateService.setCurrentLanguage(selectedLanguage);\n }\n }\n } catch (error) {\n // Silently fail - use default language\n } finally {\n this.stateService.setLoading(false);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n computed,\n effect,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport { STORAGE_KEYS } from '../constants/localization.constants';\nimport { ILanguage, ITranslationsMap } from '../interfaces/language.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationStateService {\n private readonly platformService = inject(PlatformService);\n private readonly document = inject(DOCUMENT);\n private readonly appRef = inject(ApplicationRef);\n private readonly _loadedModules = new Set<string>();\n private readonly _currentLanguage = signal<ILanguage | null>(null);\n private readonly _availableLanguages = signal<ILanguage[]>([]);\n private readonly _translations = signal<ITranslationsMap>({});\n private readonly _fallbackMessages = signal<ITranslationsMap>({});\n private readonly _isLoading = signal<boolean>(false);\n\n readonly availableLanguages = this._availableLanguages.asReadonly();\n readonly translations = this._translations.asReadonly();\n readonly fallbackMessages = this._fallbackMessages.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n\n readonly currentLanguageCode = computed(\n () => this._currentLanguage()?.code ?? 'en',\n );\n\n constructor() {\n effect(() => {\n const language = this._currentLanguage();\n if (language && !this.platformService.isServer) {\n this.document.documentElement.dir = language.direction ?? 'ltr';\n this.document.documentElement.lang = language.code;\n localStorage.setItem(STORAGE_KEYS.CURRENT_LANGUAGE, language.code);\n }\n });\n\n effect(() => {\n this._translations();\n setTimeout(() => this.appRef.tick(), 0);\n });\n }\n\n setCurrentLanguage(language: ILanguage): void {\n this._currentLanguage.set(language);\n }\n\n setAvailableLanguages(languages: ILanguage[]): void {\n this._availableLanguages.set(languages);\n }\n\n setTranslations(translations: ITranslationsMap): void {\n this._translations.set(translations);\n }\n\n mergeTranslations(translations: ITranslationsMap): void {\n this._translations.update((current) => ({ ...current, ...translations }));\n }\n\n setLoading(loading: boolean): void {\n this._isLoading.set(loading);\n }\n\n getSavedLanguageCode(): string | null {\n if (this.platformService.isServer) return null;\n return localStorage.getItem(STORAGE_KEYS.CURRENT_LANGUAGE);\n }\n\n isModuleLoaded(module: string): boolean {\n return this._loadedModules.has(module);\n }\n\n markModuleLoaded(module: string): void {\n this._loadedModules.add(module);\n }\n\n getLoadedModules(): string[] {\n return Array.from(this._loadedModules);\n }\n\n clearLoadedModules(): void {\n this._loadedModules.clear();\n }\n\n updateFallbackMessages(messages: ITranslationsMap): void {\n this._fallbackMessages.update((current) => ({ ...current, ...messages }));\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IListResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ITranslation } from '../interfaces/translation.interface';\n\nexport interface ICreateTranslationDto {\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n isActive?: boolean;\n}\n\nexport interface IUpdateTranslationDto extends Partial<ICreateTranslationDto> {\n id: string;\n}\n\nexport interface IBulkUpdateTranslationDto {\n id?: string;\n languageId: string;\n translationKeyId: string;\n value: string;\n isVerified?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationApiService extends ApiResourceService<\n ICreateTranslationDto | IUpdateTranslationDto,\n ITranslation\n> {\n constructor() {\n super('translation', 'localization');\n }\n\n getByKeyId(\n translationKeyId: string,\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/get-all`,\n {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { translationKeyId },\n sort: {},\n },\n );\n }\n\n getCounts(): Observable<ISingleResponse<Record<string, number>>> {\n return this.http.post<ISingleResponse<Record<string, number>>>(\n `${this.baseUrl}/get-counts`,\n {},\n );\n }\n\n bulkUpdate(\n translations: IBulkUpdateTranslationDto[],\n ): Observable<IListResponse<ITranslation>> {\n return this.http.post<IListResponse<ITranslation>>(\n `${this.baseUrl}/update-many-values`,\n { translations },\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../interfaces/translation-key.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationKeyApiService extends ApiResourceService<\n ICreateTranslationKeyDto | IUpdateTranslationKeyDto,\n ITranslationKey\n> {\n constructor() {\n super('translation-key', 'localization');\n }\n\n getModules(): Observable<ISingleResponse<string[]>> {\n return this.http.post<ISingleResponse<string[]>>(\n `${this.baseUrl}/get-modules`,\n {},\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport { firstValueFrom, from, Observable } from 'rxjs';\nimport { LOCALIZATION_CONFIG } from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from './localization-api.service';\nimport { LocalizationStateService } from './localization-state.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationLoaderService {\n private readonly DEFAULT_INITIAL_MODULES = ['shared', 'layout'];\n private readonly config = inject(LOCALIZATION_CONFIG, { optional: true });\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async loadTranslations(\n languageCode: string,\n clearModules = false,\n ): Promise<void> {\n const strategy = this.config?.loadStrategy ?? 'all';\n\n // Save currently loaded modules before clearing (for language switch)\n const previouslyLoadedModules = clearModules\n ? this.stateService.getLoadedModules()\n : [];\n\n if (clearModules) {\n this.stateService.clearLoadedModules();\n }\n\n this.stateService.setLoading(true);\n\n try {\n if (strategy === 'all') {\n await this.loadAndSetTranslations(languageCode);\n } else {\n const modules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n await this.loadAndSetTranslations(languageCode, modules);\n // Reload all previously loaded modules for the new language\n if (previouslyLoadedModules.length > 0) {\n await this.reloadModules(languageCode, previouslyLoadedModules);\n }\n }\n } finally {\n this.stateService.setLoading(false);\n }\n }\n\n private async loadAndSetTranslations(\n languageCode: string,\n modules?: string[],\n ): Promise<void> {\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(languageCode, modules),\n );\n if (response.success && response.data) {\n this.stateService.setTranslations(response.data);\n if (modules) {\n modules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n }\n\n private async reloadModules(\n languageCode: string,\n modules: string[],\n ): Promise<void> {\n const initialModules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n const additionalModules = modules.filter(\n (m) => !initialModules.includes(m),\n );\n\n if (additionalModules.length === 0) return;\n\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(\n languageCode,\n additionalModules,\n ),\n );\n\n if (response.success && response.data) {\n this.stateService.mergeTranslations(response.data);\n additionalModules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n\n loadTranslationsAsync(\n languageCode: string,\n clearModules = false,\n ): Observable<void> {\n return from(this.loadTranslations(languageCode, clearModules));\n }\n}\n","import { UiModule, MenuItem } from '@flusys/ng-ui';\nimport { Component, DestroyRef, computed, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector',\n imports: [UiModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"menu.visible()\"\n (click)=\"menu.toggle($event)\">\n <ui-icon name=\"globe\"></ui-icon>\n <span class=\"font-semibold\">{{ selectedLanguage()?.nativeName || selectedLanguage()?.name || selectedLanguageCode() }}</span>\n </button>\n <f-menu #menu [model]=\"menuItems()\" [popup]=\"true\" class=\"absolute top-[3.25rem]\" style=\"inset-inline-end: 0;\" />\n `,\n})\nexport class LanguageSelectorComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n readonly selectedLanguageCode = this.localizationState.currentLanguageCode;\n readonly selectedLanguage = computed(() => this.languages().find((l) => l.code === this.selectedLanguageCode()) ?? null);\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import { Component, DestroyRef, computed, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector-panel',\n imports: [MenuComponent],\n host: {\n class:\n 'hidden absolute top-[3.25rem] z-50 p-3 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] min-w-[180px]',\n style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',\n },\n template: `<f-menu [model]=\"menuItems()\" />`,\n})\nexport class LanguageSelectorPanelComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _selectedLanguageCode = signal<string>(this.localizationState.currentLanguageCode());\n readonly selectedLanguageCode = this._selectedLanguageCode.asReadonly();\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n constructor() {\n effect(() => {\n const currentCode = this.localizationState.currentLanguageCode();\n if (currentCode !== this._selectedLanguageCode()) {\n this._selectedLanguageCode.set(currentCode);\n }\n });\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this._selectedLanguageCode.set(code);\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n provideAppInitializer,\n Provider,\n} from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_LANGUAGE_SELECTOR_PANEL,\n} from '@flusys/ng-layout';\nimport { LanguageSelectorPanelComponent } from '../components/language-selector-panel/language-selector-panel.component';\nimport { LanguageSelectorComponent } from '../components/language-selector/language-selector.component';\nimport {\n ILocalizationConfig,\n LOCALIZATION_CONFIG,\n} from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from '../services/localization-api.service';\nimport { LocalizationInitializerService } from '../services/localization-initializer.service';\nimport { LocalizationStateService } from '../services/localization-state.service';\n\nexport function provideLocalization(\n config: ILocalizationConfig,\n initialFallbackMessages?: Record<string, string>,\n): Array<Provider | EnvironmentProviders> {\n const providers: Array<Provider | EnvironmentProviders> = [\n // 1. Value/Existing Providers\n { provide: LOCALIZATION_CONFIG, useValue: config },\n {\n provide: LOCALIZATION_STATE_SERVICE,\n useExisting: LocalizationStateService,\n },\n { provide: LOCALIZATION_API_SERVICE, useExisting: LocalizationApiService },\n\n // 2. The Service itself\n LocalizationInitializerService,\n\n // 3. The modern Initializer\n provideAppInitializer(() => {\n const initializer = inject(LocalizationInitializerService);\n return initializer.initialize(initialFallbackMessages);\n }),\n ];\n\n if (config.enableLayoutSelector) {\n providers.push(\n {\n provide: LAYOUT_LANGUAGE_SELECTOR,\n useValue: LanguageSelectorComponent,\n },\n {\n provide: LAYOUT_LANGUAGE_SELECTOR_PANEL,\n useValue: LanguageSelectorPanelComponent,\n },\n );\n }\n\n return providers;\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { form, FormField, maxLength, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, from } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface ILanguageFormModel {\n code: string;\n name: string;\n nativeName: string;\n direction: 'ltr' | 'rtl';\n serial: string;\n isActive: boolean;\n isDefault: boolean;\n}\n\n@Component({\n selector: 'lib-language-form-page',\n imports: [UiModule, AngularModule, FormsModule, FormField, TranslatePipe],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.language.edit' | translate)\n : ('localization.language.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Language Code -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"code\" class=\"font-medium\"\n >{{ 'localization.language.code' | translate }} *</label\n >\n <input\n fInputText\n id=\"code\"\n [formField]=\"formTree.code\"\n [placeholder]=\"'localization.placeholder.code' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.iso.code.hint' | translate\n }}</small>\n </div>\n\n <!-- Language Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'localization.language.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'localization.placeholder.name' | translate\"\n />\n </div>\n\n <!-- Native Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"nativeName\" class=\"font-medium\">{{\n 'localization.language.native.name' | translate\n }}</label>\n <input\n fInputText\n id=\"nativeName\"\n [formField]=\"formTree.nativeName\"\n [placeholder]=\"'localization.placeholder.native.name' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.native.name.hint' | translate\n }}</small>\n </div>\n\n <!-- Text Direction -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"direction\" class=\"font-medium\"\n >{{ 'localization.language.direction' | translate }} *</label\n >\n <f-select\n id=\"direction\"\n [ngModel]=\"formModel().direction\"\n (ngModelChange)=\"updateDirection($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"directionOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n />\n </div>\n\n <!-- Display Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'localization.language.display.order' | translate\n }}</label>\n <input\n fInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"formTree.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Empty cell for alignment -->\n <div class=\"hidden md:block\"></div>\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <f-checkbox [formField]=\"formTree.isActive\" [label]=\"'shared.active' | translate\" />\n <f-checkbox [formField]=\"formTree.isDefault\" [label]=\"'localization.language.default' | translate\" />\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class LanguageFormPage {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly existingLanguage = signal<ILanguage | null>(null);\n readonly isEditMode = computed(() => !!this.existingLanguage());\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly directionOptions = computed(() => [\n {\n label: this.translate('localization.language.direction.ltr'),\n value: 'ltr',\n },\n {\n label: this.translate('localization.language.direction.rtl'),\n value: 'rtl',\n },\n ]);\n\n readonly formModel = signal<ILanguageFormModel>({\n code: '',\n name: '',\n nativeName: '',\n direction: 'ltr',\n serial: '',\n isActive: true,\n isDefault: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.code, {\n message: this.translate('localization.validation.code.required'),\n });\n maxLength(f.code, 10, {\n message: this.translate('localization.validation.code.max.length'),\n });\n required(f.name, {\n message: this.translate('localization.validation.name.required'),\n });\n maxLength(f.name, 100, {\n message: this.translate('localization.validation.name.max.length'),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.code.trim().length > 0 && model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadLanguage(id);\n }\n });\n }\n\n updateDirection(value: 'ltr' | 'rtl'): void {\n this.formModel.update((m) => ({ ...m, direction: value }));\n }\n\n loadLanguage(id: string): void {\n this.isSaving.set(true);\n from(this.languageService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingLanguage.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n },\n error: () => this.router.navigate(['/localization/languages']),\n });\n }\n\n private toFormModel(language: ILanguage): ILanguageFormModel {\n return {\n code: language.code,\n name: language.name,\n nativeName: language.nativeName ?? '',\n direction: language.direction ?? 'ltr',\n serial: language.serial?.toString() ?? '',\n isActive: language.isActive,\n isDefault: language.isDefault,\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const dto = {\n code: model.code,\n name: model.name,\n nativeName: model.nativeName || undefined,\n direction: model.direction,\n serial: model.serial ? parseInt(model.serial, 10) : undefined,\n isActive: model.isActive,\n isDefault: model.isDefault,\n };\n\n const operation$ = this.isEditMode()\n ? from(\n this.languageService.update({\n id: this.existingLanguage()!.id,\n ...dto,\n } as IUpdateLanguageDto),\n )\n : from(this.languageService.insert(dto as ICreateLanguageDto));\n\n operation$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.router.navigate(['/localization/languages']);\n }\n },\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/languages']);\n }\n}\n","import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { ConfirmationService, MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-language-list-page',\n imports: [AngularModule, UiModule, HasPermissionDirective, TranslatePipe],\n providers: [ConfirmationService, MessageService],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.language.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.language.subtitle' | translate }}\n </p>\n </div>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'localization.language.new' | translate }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"languageService.data()\"\n [loading]=\"languageService.isLoading()\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'localization.language.code' | translate }}</th>\n <th>{{ 'localization.language.name' | translate }}</th>\n <th>{{ 'localization.language.native.name' | translate }}</th>\n <th>{{ 'localization.language.direction' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-lang>\n <tr>\n <td>\n <span class=\"uppercase font-semibold\">{{ lang.code }}</span>\n </td>\n <td>{{ lang.name }}</td>\n <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>\n <td>\n <f-tag\n [value]=\"\n lang.direction === 'rtl'\n ? ('localization.language.rtl' | translate)\n : ('localization.language.ltr' | translate)\n \"\n [severity]=\"lang.direction === 'rtl' ? 'warn' : 'info'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1 items-center\">\n <f-tag\n [value]=\"\n lang.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"lang.isActive ? 'success' : 'secondary'\"\n />\n @if (lang.isDefault) {\n <f-tag\n [value]=\"'localization.language.default' | translate\"\n severity=\"contrast\"\n />\n }\n </div>\n </td>\n <td>\n <div class=\"flex gap-1\">\n @if (!lang.isDefault) {\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n size=\"small\"\n [fTooltip]=\"\n 'localization.language.set.default' | translate\n \"\n (click)=\"onSetDefault(lang)\"\n >\n <ui-icon pButtonIcon name=\"star\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(lang.id)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"lang.isDefault\"\n (click)=\"onDelete(lang)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.language.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n\n <f-confirmdialog />\n <f-toast />\n `,\n})\nexport class LanguageListPage implements OnInit {\n readonly LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;\n\n private readonly router = inject(Router);\n readonly languageService = inject(LanguageApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.languageService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/languages/new']);\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'localization.language.confirm.set.default',\n { name: lang.name },\n ),\n header: this.translateService.translate(\n 'localization.language.set.default',\n ),\n icon: 'star',\n accept: () => {\n this.languageService\n .setDefault(lang.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate(\n 'localization.language.delete.title',\n ),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.languageService.delete({ id: lang.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n IconComponent,\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n TRANSLATION_KEY_PERMISSIONS,\n TranslatePipe,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n@Component({\n selector: 'lib-localization-container',\n imports: [RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe, IconComponent],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'localization.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'localization.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <lib-icon [icon]=\"tab.icon\"></lib-icon>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class LocalizationContainerPage {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n private readonly allTabs: ITab[] = [\n {\n id: 'languages',\n labelKey: 'localization.tabs.languages',\n icon: 'globe',\n route: 'languages',\n permission: LANGUAGE_PERMISSIONS.READ,\n },\n {\n id: 'keys',\n labelKey: 'localization.tabs.keys',\n icon: 'key',\n route: 'keys',\n permission: TRANSLATION_KEY_PERMISSIONS.READ,\n },\n ];\n\n readonly visibleTabs = computed(() => {\n // Explicitly track permissions signal for reactivity\n const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n","import { Routes } from '@angular/router';\nimport { SHARED_MESSAGES, resolveTranslationModule } from '@flusys/ng-shared';\nimport { LOCALIZATION_MESSAGES } from '../constants/messages';\n\nexport const LOCALIZATION_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['localization'], fallbackMessages: { ...LOCALIZATION_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('./localization-container/localization-container.page').then(\n (m) => m.LocalizationContainerPage,\n ),\n children: [\n {\n path: 'languages',\n loadComponent: () =>\n import('./language-list/language-list.page').then((m) => m.LanguageListPage),\n },\n {\n path: 'languages/new',\n loadComponent: () =>\n import('./language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: 'languages/:id',\n loadComponent: () =>\n import('./language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: 'keys',\n loadComponent: () =>\n import('./translation-key-list/translation-key-list.page').then(\n (m) => m.TranslationKeyListPage,\n ),\n },\n {\n path: 'keys/new',\n loadComponent: () =>\n import('./translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: 'keys/:id',\n loadComponent: () =>\n import('./translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: '',\n redirectTo: 'languages',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport {\n IBulkUpdateTranslationDto,\n TranslationApiService,\n} from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface ITranslationValue {\n languageId: string;\n value: string;\n translationId?: string;\n}\n\ninterface ITranslationKeyFormModel {\n key: string;\n module: string;\n defaultMessage: string;\n description: string;\n variables: string;\n}\n\n@Component({\n selector: 'lib-translation-key-form-page',\n imports: [UiModule, AngularModule, FormsModule, FormField, TranslatePipe],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.key.edit' | translate)\n : ('localization.key.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-6\">\n <!-- Key Info Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.about' | translate }}\n </h4>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Key Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"key\" class=\"font-medium\"\n >{{ 'localization.key.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"key\"\n [formField]=\"formTree.key\"\n [placeholder]=\"'localization.placeholder.key.name' | translate\"\n />\n </div>\n\n <!-- Module -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"module\" class=\"font-medium\"\n >{{ 'localization.key.module' | translate }} *</label\n >\n <f-select\n id=\"module\"\n [ngModel]=\"formModel().module\"\n (ngModelChange)=\"updateModule($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"moduleOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [editable]=\"true\"\n [placeholder]=\"'localization.key.select.module' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <!-- Default Message -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"defaultMessage\" class=\"font-medium\"\n >{{ 'localization.key.default.message' | translate }} *</label\n >\n <textarea\n fTextarea\n id=\"defaultMessage\"\n [formField]=\"formTree.defaultMessage\"\n [rows]=\"2\"\n [placeholder]=\"\n 'localization.placeholder.default.message' | translate\n \"\n ></textarea>\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'localization.key.description' | translate\n }}</label>\n <input\n fInputText\n id=\"description\"\n [formField]=\"formTree.description\"\n [placeholder]=\"\n 'localization.placeholder.key.description' | translate\n \"\n />\n </div>\n\n <!-- Variables -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"variables\" class=\"font-medium\">{{\n 'localization.key.variables' | translate\n }}</label>\n <input\n fInputText\n id=\"variables\"\n [formField]=\"formTree.variables\"\n [placeholder]=\"\n 'localization.key.variables.placeholder' | translate\n \"\n />\n <small class=\"text-muted-color\">{{\n 'localization.key.variables.hint' | translate\n }}</small>\n </div>\n </div>\n </div>\n\n <!-- Translations Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.translations.section' | translate }}\n </h4>\n @if (isLoadingLanguages()) {\n <div class=\"flex justify-center py-4\">\n <f-progressspinner strokeWidth=\"4\" />\n </div>\n } @else if (languages().length === 0) {\n <p class=\"text-muted-color text-center py-4\">\n {{ 'localization.key.no.languages' | translate }}\n </p>\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (lang of languages(); track lang.id) {\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex justify-between items-center\">\n <label class=\"font-medium\">\n {{ lang.name }}\n @if (lang.nativeName && lang.nativeName !== lang.name) {\n <span class=\"text-muted-color\"\n >({{ lang.nativeName }})</span\n >\n }\n </label>\n <f-tag\n [value]=\"lang.code\"\n severity=\"secondary\"\n class=\"uppercase\"\n />\n </div>\n <textarea\n fTextarea\n [ngModel]=\"getTranslationValue(lang.id)\"\n (ngModelChange)=\"setTranslationValue(lang.id, $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [rows]=\"2\"\n [placeholder]=\"\n formModel().defaultMessage ||\n ('localization.key.enter.translation' | translate)\n \"\n ></textarea>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class TranslationKeyFormPage implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly isLoadingLanguages = signal(false);\n readonly existingKey = signal<ITranslationKey | null>(null);\n readonly isEditMode = computed(() => !!this.existingKey());\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translations = signal<ITranslationValue[]>([]);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly moduleOptions = computed(() =>\n this.modules().map((m) => ({ label: m, value: m })),\n );\n\n readonly formModel = signal<ITranslationKeyFormModel>({\n key: '',\n module: '',\n defaultMessage: '',\n description: '',\n variables: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.key, {\n message: this.translate('localization.validation.key.required'),\n });\n required(f.defaultMessage, {\n message: this.translate(\n 'localization.validation.default.message.required',\n ),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.key.trim().length > 0 &&\n model.module.trim().length > 0 &&\n model.defaultMessage.trim().length > 0\n );\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadTranslationKey(id);\n }\n });\n }\n\n ngOnInit(): void {\n this.loadInitialData();\n }\n\n loadInitialData(): void {\n this.isLoadingLanguages.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingLanguages.set(false)),\n )\n .subscribe({\n next: ({ languages, modules }) => {\n if (languages.success && languages.data) {\n const activeLanguages = languages.data.filter((l) => l.isActive);\n this.languages.set(activeLanguages);\n this.initializeTranslations(activeLanguages);\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n },\n });\n }\n\n initializeTranslations(languages: ILanguage[]): void {\n const current = this.translations();\n if (current.length === 0) {\n this.translations.set(\n languages.map((lang) => ({ languageId: lang.id, value: '' })),\n );\n }\n }\n\n updateModule(value: string): void {\n this.formModel.update((m) => ({ ...m, module: value ?? '' }));\n }\n\n getTranslationValue(languageId: string): string {\n return (\n this.translations().find((t) => t.languageId === languageId)?.value ?? ''\n );\n }\n\n setTranslationValue(languageId: string, value: string): void {\n this.translations.update((list) => {\n const existing = list.find((t) => t.languageId === languageId);\n if (existing) {\n return list.map((t) =>\n t.languageId === languageId ? { ...t, value } : t,\n );\n }\n return [...list, { languageId, value }];\n });\n }\n\n loadTranslationKey(id: string): void {\n this.isSaving.set(true);\n from(this.translationKeyService.findById(id))\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isSaving.set(false)),\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingKey.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n this.loadExistingTranslations(id);\n }\n },\n error: () => this.router.navigate(['/localization/keys']),\n });\n }\n\n loadExistingTranslations(keyId: string): void {\n this.translationService\n .getByKeyId(keyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translations.update((list) => {\n const updated = [...list];\n response.data!.forEach((t) => {\n const existing = updated.find(\n (tr) => tr.languageId === t.languageId,\n );\n if (existing) {\n existing.value = t.value;\n existing.translationId = t.id;\n } else {\n updated.push({\n languageId: t.languageId,\n value: t.value,\n translationId: t.id,\n });\n }\n });\n return updated;\n });\n }\n },\n });\n }\n\n private toFormModel(key: ITranslationKey): ITranslationKeyFormModel {\n return {\n key: key.key,\n module: key.module,\n defaultMessage: key.defaultMessage,\n description: key.description ?? '',\n variables: key.variables?.join(', ') ?? '',\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n this.isSaving.set(true);\n const model = this.formModel();\n\n const variables = model.variables\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n\n if (this.isEditMode()) {\n this.updateKey(model, variables);\n } else {\n this.createKey(model, variables);\n }\n }\n\n private createKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const createDto: ICreateTranslationKeyDto = {\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.insert(createDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.saveTranslations(\n response.data.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private updateKey(\n model: ITranslationKeyFormModel,\n variables: string[],\n ): void {\n const updateDto: IUpdateTranslationKeyDto = {\n id: this.existingKey()!.id,\n key: model.key,\n module: model.module,\n defaultMessage: model.defaultMessage,\n description: model.description || undefined,\n variables: variables.length > 0 ? variables : undefined,\n };\n\n from(this.translationKeyService.update(updateDto))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.saveTranslations(\n this.existingKey()!.id,\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n );\n } else {\n this.isSaving.set(false);\n }\n },\n error: () => this.isSaving.set(false),\n });\n }\n\n private saveTranslations(\n keyId: string,\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n const translationsToSave: IBulkUpdateTranslationDto[] = this.translations()\n .filter((t) => t.value?.trim())\n .map((t) => ({\n id: t.translationId,\n languageId: t.languageId,\n translationKeyId: keyId,\n value: t.value,\n isVerified: false,\n }));\n\n if (translationsToSave.length === 0) {\n this.onSaveSuccess(messageKey, messageVariables);\n return;\n }\n\n this.translationService\n .bulkUpdate(translationsToSave)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.onSaveSuccess(messageKey, messageVariables),\n error: () => this.onSaveSuccess(messageKey, messageVariables),\n });\n }\n\n private onSaveSuccess(\n messageKey?: string,\n messageVariables?: Record<string, string | number>,\n ): void {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: messageKey ? this.translate(messageKey, messageVariables) : '',\n });\n this.isSaving.set(false);\n this.router.navigate(['/localization/keys']);\n }\n\n onCancel(): void {\n this.router.navigate(['/localization/keys']);\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { ConfirmationService, MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-translation-key-list-page',\n imports: [\n AngularModule,\n UiModule,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.key.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.key.subtitle' | translate }}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'localization.key.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col md:flex-row gap-4 mb-4\">\n <div class=\"flex-1\">\n <f-select\n [options]=\"moduleOptions()\"\n [ngModel]=\"selectedModule()\"\n (ngModelChange)=\"onModuleChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"'localization.key.filter.module' | translate\"\n [showClear]=\"true\"\n class=\"w-full\"\n />\n </div>\n <div class=\"flex-1\">\n <f-iconfield class=\"w-full\">\n <f-inputicon><ui-icon name=\"search\" /></f-inputicon>\n <input\n fInputText\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n </div>\n </div>\n\n <!-- Table -->\n <f-table\n [value]=\"filteredKeys()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"15\"\n [rowsPerPageOptions]=\"[10, 15, 25, 50]\"\n >\n <ng-template #header>\n <tr>\n <th style=\"width: 15%\">\n {{ 'localization.key.module' | translate }}\n </th>\n <th style=\"width: 25%\">\n {{ 'localization.key.name' | translate }}\n </th>\n <th style=\"width: 35%\">\n {{ 'localization.key.default.message' | translate }}\n </th>\n <th style=\"width: 10%\">\n {{ 'localization.key.translations' | translate }}\n </th>\n <th style=\"width: 15%\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-key>\n @let translationCount = getTranslationCount(key.id);\n @let languageCount = languages().length;\n <tr>\n <td>\n <f-tag [value]=\"key.module\" severity=\"secondary\" />\n </td>\n <td>\n <div class=\"font-medium\">{{ key.key }}</div>\n @if (key.description) {\n <small class=\"text-muted-color\">{{ key.description }}</small>\n }\n </td>\n <td>{{ key.defaultMessage }}</td>\n <td class=\"text-center\">\n <span\n class=\"text-sm\"\n [class.text-green-500]=\"translationCount === languageCount\"\n [class.text-orange-500]=\"\n translationCount < languageCount && translationCount > 0\n \"\n [class.text-muted-color]=\"translationCount === 0\"\n >\n {{ translationCount }}/{{ languageCount }}\n </span>\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(key)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(key)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.key.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n\n <f-confirmdialog />\n <f-toast />\n `,\n})\nexport class TranslationKeyListPage implements OnInit {\n readonly TRANSLATION_KEY_PERMISSIONS = TRANSLATION_KEY_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isLoading = signal(false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translationKeys = signal<ITranslationKey[]>([]);\n readonly translationCounts = signal<Map<string, number>>(new Map());\n readonly selectedModule = signal<string | null>(null);\n readonly searchTerm = signal('');\n\n readonly moduleOptions = computed(() => [\n { label: this.translateService.translate('shared.all'), value: null },\n ...this.modules().map((m) => ({ label: m, value: m })),\n ]);\n\n readonly filteredKeys = computed(() => {\n let keys = this.translationKeys();\n const module = this.selectedModule();\n const search = this.searchTerm().toLowerCase().trim();\n\n if (module) {\n keys = keys.filter((k) => k.module === module);\n }\n\n if (search) {\n keys = keys.filter(\n (k) =>\n k.key.toLowerCase().includes(search) ||\n k.defaultMessage.toLowerCase().includes(search) ||\n k.module.toLowerCase().includes(search),\n );\n }\n\n return keys;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n loadData(): void {\n this.isLoading.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n keys: from(\n this.translationKeyService.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n sort: { module: 'ASC', key: 'ASC' },\n }),\n ),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: ({ languages, modules, keys }) => {\n if (languages.success && languages.data) {\n this.languages.set(languages.data.filter((l) => l.isActive));\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n if (keys.success && keys.data) {\n this.translationKeys.set(keys.data);\n this.loadTranslationCounts();\n }\n this.isLoading.set(false);\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n });\n }\n\n getTranslationCount(keyId: string): number {\n return this.translationCounts().get(keyId) ?? 0;\n }\n\n onModuleChange(value: string | null): void {\n this.selectedModule.set(value);\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/keys/new']);\n }\n\n onEdit(key: ITranslationKey): void {\n this.router.navigate(['/localization/keys', key.id]);\n }\n\n onDelete(key: ITranslationKey): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate('localization.key.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.translationKeyService.delete({ id: key.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.loadData();\n }\n },\n });\n },\n });\n }\n}\n","// Interfaces\nexport * from './interfaces/language.interface';\nexport * from './interfaces/localization-config.interface';\nexport * from './interfaces/translation-key.interface';\nexport * from './interfaces/translation.interface';\n\n// Constants\nexport * from './constants/localization.constants';\nexport * from './constants/messages';\n\n// Services\nexport * from './services/language-api.service';\nexport * from './services/localization-api.service';\nexport * from './services/localization-initializer.service';\nexport * from './services/localization-state.service';\nexport * from './services/translation-api.service';\nexport * from './services/translation-key-api.service';\nexport * from './services/translation-loader.service';\n\n// Components\nexport * from './components/language-selector/language-selector.component';\n\n// Providers\nexport * from './providers/localization.providers';\n\n// Pages\nexport * from './pages/language-form/language-form.page';\nexport * from './pages/language-list/language-list.page';\nexport * from './pages/localization-container/localization-container.page';\nexport * from './pages/routes';\nexport * from './pages/translation-key-form/translation-key-form.page';\nexport * from './pages/translation-key-list/translation-key-list.page';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2"],"mappings":"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"}
|