@flusys/ng-localization 9.1.0-rc.1 → 9.1.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/translation-key-form/translation-key-form.page.ts","../../../projects/ng-localization/pages/translation-key-list/translation-key-list.page.ts","../../../projects/ng-localization/routes/localization.routes.ts","../../../projects/ng-localization/public-api.ts","../../../projects/ng-localization/flusys-ng-localization.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type LocalizationLoadStrategy = 'all' | 'modules';\n\n/** Localization system configuration */\nexport interface ILocalizationConfig {\n /** Default language code (e.g., 'en', 'ar') */\n defaultLanguageCode: string;\n /** Translation loading strategy (default: 'modules') */\n loadStrategy?: LocalizationLoadStrategy;\n /** Modules to load at app initialization (default: []) */\n initialModules?: string[];\n /** Show language selector in layout (default: false) */\n enableLayoutSelector?: boolean;\n}\n\nexport const LOCALIZATION_CONFIG = new InjectionToken<ILocalizationConfig>(\n 'LOCALIZATION_CONFIG',\n);\n\n/** Get localization config with sensible defaults applied */\nexport function getLocalizationConfig(\n overrides?: Partial<ILocalizationConfig>,\n): ILocalizationConfig {\n const defaults: ILocalizationConfig = {\n defaultLanguageCode: 'en',\n loadStrategy: 'all',\n initialModules: [],\n enableLayoutSelector: false,\n };\n\n return {\n ...defaults,\n ...overrides,\n defaultLanguageCode:\n overrides?.defaultLanguageCode || defaults.defaultLanguageCode,\n };\n}\n","export const STORAGE_KEYS = {\n CURRENT_LANGUAGE: 'flusys.language',\n} as const;\n","export const LOCALIZATION_MESSAGES: Record<string, string> = {\n // Language CRUD (API keys)\n 'language.create.success': 'Language created successfully',\n 'language.create.many.success': '{{count}} languages created successfully',\n 'language.get.success': 'Language retrieved successfully',\n 'language.get.by.ids.success': 'Languages retrieved successfully by Ids',\n 'language.get.by.filter.success':\n 'Languages retrieved successfully by filter',\n 'language.get.all.success': 'Languages retrieved successfully',\n 'language.update.success': 'Language updated successfully',\n 'language.update.many.success': '{{count}} languages updated successfully',\n 'language.delete.success': 'Language deleted successfully',\n 'language.restore.success': 'Language restored successfully',\n 'language.readonly.update.forbidden':\n 'Cannot modify code/name of readonly language \"{{name}}\"',\n 'language.readonly.delete.forbidden': 'Cannot delete readonly language(s): {{names}}',\n 'language.default.delete.forbidden':\n 'Cannot delete the default language(s): {{names}}. Set another language as default first.',\n 'language.active.success': 'Active languages retrieved successfully',\n 'language.set.default.success': 'Default language updated successfully',\n 'language.get.default.success': 'Default language retrieved successfully',\n\n // Translation key CRUD (API keys)\n 'translation.key.create.success': 'Translation key created successfully',\n 'translation.key.create.many.success':\n '{{count}} translation keys created successfully',\n 'translation.key.get.success': 'Translation key retrieved successfully',\n 'translation.key.get.by.ids.success':\n 'Translation keys retrieved successfully by Ids',\n 'translation.key.get.by.filter.success':\n 'Translation keys retrieved successfully by filter',\n 'translation.key.get.all.success': 'Translation keys retrieved successfully',\n 'translation.key.update.success': 'Translation key updated successfully',\n 'translation.key.update.many.success':\n '{{count}} translation keys updated successfully',\n 'translation.key.delete.success': 'Translation key deleted successfully',\n 'translation.key.restore.success': 'Translation key restored successfully',\n 'translation.key.modules.success': 'Modules retrieved successfully',\n 'translation.key.readonly.delete.forbidden':\n 'Cannot delete readonly translation keys: {{keys}}',\n 'translation.key.readonly.update.forbidden':\n 'Cannot modify key or module of system translation keys',\n 'translation.key.duplicate.key.in.module':\n 'Translation key \"{{key}}\" already exists in module \"{{module}}\"',\n\n // Translation CRUD (API keys)\n 'translation.create.success': 'Translation created successfully',\n 'translation.create.many.success':\n '{{count}} translations created successfully',\n 'translation.get.success': 'Translation retrieved successfully',\n 'translation.get.by.ids.success':\n 'Translations retrieved successfully by Ids',\n 'translation.get.by.filter.success':\n 'Translations retrieved successfully by filter',\n 'translation.get.all.success': 'Translations retrieved successfully',\n 'translation.update.success': 'Translation updated successfully',\n 'translation.update.many.success':\n '{{count}} translations updated successfully',\n 'translation.delete.success': 'Translation deleted successfully',\n 'translation.restore.success': 'Translation restored successfully',\n 'translation.by.language.success': 'Translations retrieved successfully',\n\n // pages/localization-container/localization-container.page.ts\n 'localization.title': 'Localization',\n 'localization.subtitle': 'Manage languages and translations',\n 'localization.tabs.languages': 'Languages',\n 'localization.tabs.keys': 'Keys',\n\n // pages/language-list/language-list.page.ts\n 'localization.language.title': 'Languages',\n 'localization.language.subtitle':\n 'Manage available languages for your application',\n 'localization.language.new': 'Add Language',\n 'localization.language.code': 'Language Code',\n 'localization.language.name': 'Language Name',\n 'localization.language.native.name': 'Native Name',\n 'localization.language.direction': 'Text Direction',\n 'localization.language.rtl': 'RTL',\n 'localization.language.ltr': 'LTR',\n 'localization.language.default': 'Default',\n 'localization.language.set.default': 'Set as Default',\n 'localization.language.empty':\n 'No languages configured. Add a language to get started.',\n 'localization.language.confirm.set.default':\n 'Set \"{{name}}\" as the default language?',\n 'localization.language.delete.title': 'Delete Language',\n 'localization.language.default.delete.forbidden':\n 'Cannot delete the default language. Set another language as default first.',\n 'localization.language.readonly.delete.forbidden':\n 'This is a system language and cannot be deleted',\n\n // pages/language-form/language-form.page.ts\n 'localization.language.edit': 'Edit Language',\n 'localization.language.readonly.edit.hint':\n 'This is a system language — its code, name, native name, and direction cannot be changed',\n 'localization.placeholder.code': 'en',\n 'localization.language.iso.code.hint':\n 'ISO 639-1 language code (e.g., en, ar, fr)',\n 'localization.placeholder.name': 'English',\n 'localization.placeholder.native.name': 'English',\n 'localization.language.native.name.hint':\n 'Name in the native language (e.g., العربية for Arabic)',\n 'localization.language.display.order': 'Display Order',\n 'localization.language.direction.ltr': 'Left to Right (LTR)',\n 'localization.language.direction.rtl': 'Right to Left (RTL)',\n 'localization.validation.code.required': 'Language code is required',\n 'localization.validation.code.max.length':\n 'Language code must be at most 10 characters',\n 'localization.validation.name.required': 'Language name is required',\n 'localization.validation.name.max.length':\n 'Language name must be at most 100 characters',\n\n // pages/translation-key-list/translation-key-list.page.ts\n 'localization.key.title': 'Translation Keys',\n 'localization.key.subtitle': 'Manage translation keys for your application',\n 'localization.key.new': 'Add Key',\n 'localization.key.filter.module': 'Filter by module',\n 'localization.key.module': 'Module',\n 'localization.key.name': 'Key Name',\n 'localization.key.default.message': 'Default Message',\n 'localization.key.translations': 'Translations',\n 'localization.key.empty': 'No translation keys found',\n 'localization.key.delete.title': 'Delete Translation Key',\n 'localization.key.readonly.delete.forbidden':\n 'This is a system translation key and cannot be deleted',\n 'localization.key.readonly.edit.hint':\n 'This is a system key — its key name and module cannot be changed',\n\n // pages/translation-key-form/translation-key-form.page.ts\n 'localization.key.edit': 'Edit Key',\n 'localization.key.about': 'Key Information',\n 'localization.placeholder.key.name': 'button.submit',\n 'localization.key.select.module': 'Select or enter module',\n 'localization.placeholder.default.message': 'Enter default value (English)',\n 'localization.key.description': 'Description',\n 'localization.placeholder.key.description':\n 'Optional description for translators',\n 'localization.key.variables': 'Variables',\n 'localization.key.variables.placeholder': 'e.g., name, count, date',\n 'localization.key.variables.hint':\n 'Enter variable names used in this translation',\n 'localization.key.translations.section': 'Translations',\n 'localization.key.no.languages': 'No active languages configured',\n 'localization.key.enter.translation': 'Enter translation',\n 'localization.validation.key.required': 'Translation key is required',\n 'localization.validation.default.message.required':\n 'Default message is required',\n};\n","import { Service } 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@Service()\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, Service } 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@Service()\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, Service } 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@Service()\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 { ApplicationRef, computed, effect, inject, signal, Service } 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@Service()\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 { Service } 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@Service()\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 { Service } 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@Service()\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, Service } 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@Service()\nexport class TranslationLoaderService {\n private readonly DEFAULT_INITIAL_MODULES = ['shared', 'layout'];\n private readonly config = inject(LOCALIZATION_CONFIG, { optional: true });\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async loadTranslations(\n languageCode: string,\n clearModules = false,\n ): Promise<void> {\n const strategy = this.config?.loadStrategy ?? 'all';\n\n // Save currently loaded modules before clearing (for language switch)\n const previouslyLoadedModules = clearModules\n ? this.stateService.getLoadedModules()\n : [];\n\n if (clearModules) {\n this.stateService.clearLoadedModules();\n }\n\n this.stateService.setLoading(true);\n\n try {\n if (strategy === 'all') {\n await this.loadAndSetTranslations(languageCode);\n } else {\n const modules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n await this.loadAndSetTranslations(languageCode, modules);\n // Reload all previously loaded modules for the new language\n if (previouslyLoadedModules.length > 0) {\n await this.reloadModules(languageCode, previouslyLoadedModules);\n }\n }\n } finally {\n this.stateService.setLoading(false);\n }\n }\n\n private async loadAndSetTranslations(\n languageCode: string,\n modules?: string[],\n ): Promise<void> {\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(languageCode, modules),\n );\n if (response.success && response.data) {\n this.stateService.setTranslations(response.data);\n if (modules) {\n modules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n }\n\n private async reloadModules(\n languageCode: string,\n modules: string[],\n ): Promise<void> {\n const initialModules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n const additionalModules = modules.filter(\n (m) => !initialModules.includes(m),\n );\n\n if (additionalModules.length === 0) return;\n\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(\n languageCode,\n additionalModules,\n ),\n );\n\n if (response.success && response.data) {\n this.stateService.mergeTranslations(response.data);\n additionalModules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n\n loadTranslationsAsync(\n languageCode: string,\n clearModules = false,\n ): Observable<void> {\n return from(this.loadTranslations(languageCode, clearModules));\n }\n}\n","import { Component, DestroyRef, computed, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem, UiIconComponent } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector',\n imports: [MenuComponent, UiIconComponent],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"menu.visible()\"\n (click)=\"menu.toggle($event)\"\n >\n <ui-icon name=\"globe\"></ui-icon>\n <span class=\"font-semibold\">{{\n selectedLanguage()?.nativeName ||\n selectedLanguage()?.name ||\n selectedLanguageCode()\n }}</span>\n </button>\n <f-menu\n #menu\n [model]=\"menuItems()\"\n [popup]=\"true\"\n class=\"absolute left-[0]\"\n [style]=\"{ 'inset-inline-end': '0' }\"\n />\n `,\n})\nexport class LanguageSelectorComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n readonly selectedLanguageCode = this.localizationState.currentLanguageCode;\n readonly selectedLanguage = computed(\n () =>\n this.languages().find((l) => l.code === this.selectedLanguageCode()) ??\n null,\n );\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector-panel',\n imports: [MenuComponent],\n host: {\n class: 'hidden absolute z-50 top-[24px] p-3 min-w-[180px]',\n style: 'inset-inline-end: 0;',\n },\n template: `<f-menu [model]=\"menuItems()\" />`,\n})\nexport class LanguageSelectorPanelComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _selectedLanguageCode = signal<string>(\n this.localizationState.currentLanguageCode(),\n );\n readonly selectedLanguageCode = this._selectedLanguageCode.asReadonly();\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n constructor() {\n effect(() => {\n const currentCode = this.localizationState.currentLanguageCode();\n if (currentCode !== this._selectedLanguageCode()) {\n this._selectedLanguageCode.set(currentCode);\n }\n });\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this._selectedLanguageCode.set(code);\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n provideAppInitializer,\n Provider,\n} from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_LANGUAGE_SELECTOR_PANEL,\n} from '@flusys/ng-layout';\nimport { LanguageSelectorPanelComponent } from '../components/language-selector-panel/language-selector-panel.component';\nimport { LanguageSelectorComponent } from '../components/language-selector/language-selector.component';\nimport {\n ILocalizationConfig,\n LOCALIZATION_CONFIG,\n} from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from '../services/localization-api.service';\nimport { LocalizationInitializerService } from '../services/localization-initializer.service';\nimport { LocalizationStateService } from '../services/localization-state.service';\n\nexport function provideLocalization(\n config: ILocalizationConfig,\n initialFallbackMessages?: Record<string, string>,\n): Array<Provider | EnvironmentProviders> {\n const providers: Array<Provider | EnvironmentProviders> = [\n // 1. Value/Existing Providers\n { provide: LOCALIZATION_CONFIG, useValue: config },\n {\n provide: LOCALIZATION_STATE_SERVICE,\n useExisting: LocalizationStateService,\n },\n { provide: LOCALIZATION_API_SERVICE, useExisting: LocalizationApiService },\n\n // 2. The Service itself\n LocalizationInitializerService,\n\n // 3. The modern Initializer\n provideAppInitializer(() => {\n const initializer = inject(LocalizationInitializerService);\n return initializer.initialize(initialFallbackMessages);\n }),\n ];\n\n if (config.enableLayoutSelector) {\n providers.push(\n {\n provide: LAYOUT_LANGUAGE_SELECTOR,\n useValue: LanguageSelectorComponent,\n },\n {\n provide: LAYOUT_LANGUAGE_SELECTOR_PANEL,\n useValue: LanguageSelectorPanelComponent,\n },\n );\n }\n\n return providers;\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport {\n disabled,\n form,\n FormField,\n maxLength,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n CardComponent,\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n SelectComponent,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, from } from 'rxjs';\nimport {\n ICreateLanguageDto,\n ILanguage,\n IUpdateLanguageDto,\n} from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\n\ninterface ILanguageFormModel {\n code: string;\n name: string;\n nativeName: string;\n direction: 'ltr' | 'rtl';\n serial: string;\n isActive: boolean;\n isDefault: boolean;\n}\n\n@Component({\n selector: 'lib-language-form-page',\n imports: [\n CardComponent,\n InputTextDirective,\n SelectComponent,\n CheckboxComponent,\n FButtonDirective,\n UiIconComponent,\n FormsModule,\n FormField,\n TranslatePipe,\n ],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.language.edit' | translate)\n : ('localization.language.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Language Code -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"code\" class=\"font-medium\"\n >{{ 'localization.language.code' | translate }} *</label\n >\n <input\n fInputText\n id=\"code\"\n [formField]=\"formTree.code\"\n [placeholder]=\"'localization.placeholder.code' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.iso.code.hint' | translate\n }}</small>\n </div>\n\n <!-- Language Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'localization.language.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'localization.placeholder.name' | translate\"\n />\n </div>\n\n <!-- Native Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"nativeName\" class=\"font-medium\">{{\n 'localization.language.native.name' | translate\n }}</label>\n <input\n fInputText\n id=\"nativeName\"\n [formField]=\"formTree.nativeName\"\n [placeholder]=\"'localization.placeholder.native.name' | translate\"\n />\n <small class=\"text-muted-color\">{{\n 'localization.language.native.name.hint' | translate\n }}</small>\n </div>\n\n <!-- Text Direction -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"direction\" class=\"font-medium\"\n >{{ 'localization.language.direction' | translate }} *</label\n >\n <f-select\n id=\"direction\"\n [ngModel]=\"formModel().direction\"\n (ngModelChange)=\"updateDirection($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"directionOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [disabled]=\"isReadonly()\"\n class=\"w-full\"\n />\n @if (isReadonly()) {\n <small class=\"text-muted-color\">{{\n 'localization.language.readonly.edit.hint' | translate\n }}</small>\n }\n </div>\n\n <!-- Display Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'localization.language.display.order' | translate\n }}</label>\n <input\n fInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"formTree.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Empty cell for alignment -->\n <div class=\"hidden md:block\"></div>\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <f-checkbox [formField]=\"formTree.isActive\" [label]=\"'shared.active' | translate\" />\n <f-checkbox [formField]=\"formTree.isDefault\" [label]=\"'localization.language.default' | translate\" />\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class LanguageFormPage {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly existingLanguage = signal<ILanguage | null>(null);\n readonly isEditMode = computed(() => !!this.existingLanguage());\n readonly isReadonly = computed(() => this.existingLanguage()?.isReadonly ?? false);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly directionOptions = computed(() => [\n {\n label: this.translate('localization.language.direction.ltr'),\n value: 'ltr',\n },\n {\n label: this.translate('localization.language.direction.rtl'),\n value: 'rtl',\n },\n ]);\n\n readonly formModel = signal<ILanguageFormModel>({\n code: '',\n name: '',\n nativeName: '',\n direction: 'ltr',\n serial: '',\n isActive: true,\n isDefault: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.code, {\n message: this.translate('localization.validation.code.required'),\n });\n maxLength(f.code, 10, {\n message: this.translate('localization.validation.code.max.length'),\n });\n required(f.name, {\n message: this.translate('localization.validation.name.required'),\n });\n maxLength(f.name, 100, {\n message: this.translate('localization.validation.name.max.length'),\n });\n disabled(f.code, { when: () => this.isReadonly() });\n disabled(f.name, { when: () => this.isReadonly() });\n disabled(f.nativeName, { when: () => this.isReadonly() });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n 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 { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\n\n@Component({\n selector: 'lib-language-list-page',\n imports: [\n FButtonDirective,\n UiIconComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n HasPermissionDirective,\n TranslatePipe,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.language.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.language.subtitle' | translate }}\n </p>\n </div>\n <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"languageService.searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'localization.language.new' | translate\n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"languageService.data()\"\n [loading]=\"languageService.isLoading()\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'localization.language.code' | translate }}</th>\n <th>{{ 'localization.language.name' | translate }}</th>\n <th>{{ 'localization.language.native.name' | translate }}</th>\n <th>{{ 'localization.language.direction' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-lang>\n <tr>\n <td>\n <span class=\"uppercase font-semibold\">{{ lang.code }}</span>\n </td>\n <td>{{ lang.name }}</td>\n <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>\n <td>\n <f-tag\n [value]=\"\n lang.direction === 'rtl'\n ? ('localization.language.rtl' | translate)\n : ('localization.language.ltr' | translate)\n \"\n [severity]=\"lang.direction === 'rtl' ? 'warn' : 'info'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1 items-center\">\n <f-tag\n [value]=\"\n lang.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"lang.isActive ? 'success' : 'secondary'\"\n />\n @if (lang.isDefault) {\n <f-tag\n [value]=\"'localization.language.default' | translate\"\n severity=\"contrast\"\n />\n }\n @if (lang.isReadonly) {\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"warn\"\n />\n }\n </div>\n </td>\n <td>\n <div class=\"flex gap-1\">\n @if (!lang.isDefault) {\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n size=\"small\"\n [fTooltip]=\"\n 'localization.language.set.default' | translate\n \"\n (click)=\"onSetDefault(lang)\"\n >\n <ui-icon pButtonIcon name=\"star\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(lang.id)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"\n (lang.isDefault\n ? 'localization.language.default.delete.forbidden'\n : lang.isReadonly\n ? 'localization.language.readonly.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n [disabled]=\"lang.isDefault || lang.isReadonly\"\n (click)=\"onDelete(lang)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.language.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class LanguageListPage implements OnInit {\n readonly LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;\n\n private readonly router = inject(Router);\n readonly languageService = inject(LanguageApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.languageService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/languages/new']);\n }\n\n onSearchChange(term: string): void {\n this.languageService.fetchList(term, {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'localization.language.confirm.set.default',\n { name: lang.name },\n ),\n header: this.translateService.translate(\n 'localization.language.set.default',\n ),\n icon: 'star',\n accept: () => {\n this.languageService\n .setDefault(lang.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate(\n 'localization.language.delete.title',\n ),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.languageService.delete({ id: lang.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n IconComponent,\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n TRANSLATION_KEY_PERMISSIONS,\n TranslatePipe,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n@Component({\n selector: 'lib-localization-container',\n imports: [RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe, IconComponent],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'localization.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'localization.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <lib-icon [icon]=\"tab.icon\"></lib-icon>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class LocalizationContainerPage {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n private readonly allTabs: ITab[] = [\n {\n id: 'languages',\n labelKey: 'localization.tabs.languages',\n icon: 'globe',\n route: 'languages',\n permission: LANGUAGE_PERMISSIONS.READ,\n },\n {\n id: 'keys',\n labelKey: 'localization.tabs.keys',\n icon: 'key',\n route: 'keys',\n permission: TRANSLATION_KEY_PERMISSIONS.READ,\n },\n ];\n\n readonly visibleTabs = computed(() => {\n // Explicitly track permissions signal for reactivity\n const permissions = this.permissionValidator.permissions();\n if (!permissions.length) return [];\n return this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission));\n });\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { disabled, form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n CardComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n ProgressSpinnerComponent,\n SelectComponent,\n TagComponent,\n TextareaDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport {\n ICreateTranslationKeyDto,\n ITranslationKey,\n IUpdateTranslationKeyDto,\n} from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport {\n IBulkUpdateTranslationDto,\n TranslationApiService,\n} from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\n\ninterface ITranslationValue {\n languageId: string;\n value: string;\n translationId?: string;\n}\n\ninterface ITranslationKeyFormModel {\n key: string;\n module: string;\n defaultMessage: string;\n description: string;\n variables: string;\n}\n\n@Component({\n selector: 'lib-translation-key-form-page',\n imports: [\n CardComponent,\n InputTextDirective,\n SelectComponent,\n TextareaDirective,\n ProgressSpinnerComponent,\n TagComponent,\n FButtonDirective,\n UiIconComponent,\n FormsModule,\n FormField,\n TranslatePipe,\n ],\n providers: [MessageService],\n template: `\n <f-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{\n isEditMode()\n ? ('localization.key.edit' | translate)\n : ('localization.key.new' | translate)\n }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-6\">\n <!-- Key Info Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.about' | translate }}\n </h4>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Key Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"key\" class=\"font-medium\"\n >{{ 'localization.key.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"key\"\n [formField]=\"formTree.key\"\n [placeholder]=\"'localization.placeholder.key.name' | translate\"\n />\n </div>\n\n <!-- Module -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"module\" class=\"font-medium\"\n >{{ 'localization.key.module' | translate }} *</label\n >\n <f-select\n id=\"module\"\n [ngModel]=\"formModel().module\"\n (ngModelChange)=\"updateModule($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"moduleOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [editable]=\"true\"\n [disabled]=\"isReadonly()\"\n [placeholder]=\"'localization.key.select.module' | translate\"\n class=\"w-full\"\n />\n </div>\n\n @if (isReadonly()) {\n <div class=\"md:col-span-2 -mt-2\">\n <small class=\"text-muted-color\">{{\n 'localization.key.readonly.edit.hint' | translate\n }}</small>\n </div>\n }\n\n <!-- Default Message -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"defaultMessage\" class=\"font-medium\"\n >{{ 'localization.key.default.message' | translate }} *</label\n >\n <textarea\n fTextarea\n id=\"defaultMessage\"\n [formField]=\"formTree.defaultMessage\"\n [rows]=\"2\"\n [placeholder]=\"\n 'localization.placeholder.default.message' | translate\n \"\n ></textarea>\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'localization.key.description' | translate\n }}</label>\n <input\n fInputText\n id=\"description\"\n [formField]=\"formTree.description\"\n [placeholder]=\"\n 'localization.placeholder.key.description' | translate\n \"\n />\n </div>\n\n <!-- Variables -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"variables\" class=\"font-medium\">{{\n 'localization.key.variables' | translate\n }}</label>\n <input\n fInputText\n id=\"variables\"\n [formField]=\"formTree.variables\"\n [placeholder]=\"\n 'localization.key.variables.placeholder' | translate\n \"\n />\n <small class=\"text-muted-color\">{{\n 'localization.key.variables.hint' | translate\n }}</small>\n </div>\n </div>\n </div>\n\n <!-- Translations Section -->\n <div class=\"p-4 surface-ground rounded-lg\">\n <h4 class=\"font-semibold mt-0 mb-4\">\n {{ 'localization.key.translations.section' | translate }}\n </h4>\n @if (isLoadingLanguages()) {\n <div class=\"flex justify-center py-4\">\n <f-progressspinner strokeWidth=\"4\" />\n </div>\n } @else if (languages().length === 0) {\n <p class=\"text-muted-color text-center py-4\">\n {{ 'localization.key.no.languages' | translate }}\n </p>\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (lang of languages(); track lang.id) {\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex justify-between items-center\">\n <label class=\"font-medium\">\n {{ lang.name }}\n @if (lang.nativeName && lang.nativeName !== lang.name) {\n <span class=\"text-muted-color\"\n >({{ lang.nativeName }})</span\n >\n }\n </label>\n <f-tag\n [value]=\"lang.code\"\n severity=\"secondary\"\n class=\"uppercase\"\n />\n </div>\n <textarea\n fTextarea\n [ngModel]=\"getTranslationValue(lang.id)\"\n (ngModelChange)=\"setTranslationValue(lang.id, $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [rows]=\"2\"\n [placeholder]=\"\n formModel().defaultMessage ||\n ('localization.key.enter.translation' | translate)\n \"\n ></textarea>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 pt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isSaving()\"\n >\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-card>\n `,\n})\nexport class TranslationKeyFormPage implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private loadTriggered = false;\n\n readonly isSaving = signal(false);\n readonly isLoadingLanguages = signal(false);\n readonly existingKey = signal<ITranslationKey | null>(null);\n readonly isEditMode = computed(() => !!this.existingKey());\n readonly isReadonly = computed(() => this.existingKey()?.isReadonly ?? false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translations = signal<ITranslationValue[]>([]);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly moduleOptions = computed(() =>\n this.modules().map((m) => ({ label: m, value: m })),\n );\n\n readonly formModel = signal<ITranslationKeyFormModel>({\n key: '',\n module: '',\n defaultMessage: '',\n description: '',\n variables: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.key, {\n message: this.translate('localization.validation.key.required'),\n });\n required(f.defaultMessage, {\n message: this.translate(\n 'localization.validation.default.message.required',\n ),\n });\n disabled(f.key, { when: () => this.isReadonly() });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.key.trim().length > 0 &&\n model.module.trim().length > 0 &&\n model.defaultMessage.trim().length > 0\n );\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.loadTriggered) return;\n\n this.loadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadTranslationKey(id);\n }\n });\n }\n\n ngOnInit(): void {\n this.isLoadingLanguages.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingLanguages.set(false)),\n )\n .subscribe({\n next: ({ languages, modules }) => {\n if (languages.success && languages.data) {\n const activeLanguages = languages.data.filter((l) => l.isActive);\n this.languages.set(activeLanguages);\n this.initializeTranslations(activeLanguages);\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n },\n });\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 HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n SelectComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { forkJoin, from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { ITranslationKey } from '../../interfaces/translation-key.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\nimport { TranslationApiService } from '../../services/translation-api.service';\nimport { TranslationKeyApiService } from '../../services/translation-key-api.service';\n\n@Component({\n selector: 'lib-translation-key-list-page',\n imports: [\n FButtonDirective,\n UiIconComponent,\n SelectComponent,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold m-0\">\n {{ 'localization.key.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.key.subtitle' | translate }}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'localization.key.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col md:flex-row gap-4 mb-4\">\n <div class=\"flex-1\">\n <f-select\n [options]=\"moduleOptions()\"\n [ngModel]=\"selectedModule()\"\n (ngModelChange)=\"onModuleChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"'localization.key.filter.module' | translate\"\n [showClear]=\"true\"\n class=\"w-full\"\n />\n </div>\n <div class=\"flex-1\">\n <f-iconfield class=\"w-full\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n </div>\n </div>\n\n <!-- Table -->\n <f-table\n [value]=\"filteredKeys()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"15\"\n [rowsPerPageOptions]=\"[10, 15, 25, 50]\"\n >\n <ng-template #header>\n <tr>\n <th style=\"width: 15%\">\n {{ 'localization.key.module' | translate }}\n </th>\n <th style=\"width: 25%\">\n {{ 'localization.key.name' | translate }}\n </th>\n <th style=\"width: 35%\">\n {{ 'localization.key.default.message' | translate }}\n </th>\n <th style=\"width: 10%\">\n {{ 'localization.key.translations' | translate }}\n </th>\n <th style=\"width: 15%\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-key>\n @let translationCount = getTranslationCount(key.id);\n @let languageCount = languages().length;\n <tr>\n <td>\n <f-tag [value]=\"key.module\" severity=\"secondary\" />\n </td>\n <td>\n <div class=\"flex items-center gap-2\">\n <span class=\"font-medium\">{{ key.key }}</span>\n @if (key.isReadonly) {\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"warn\"\n />\n }\n </div>\n @if (key.description) {\n <small class=\"text-muted-color\">{{ key.description }}</small>\n }\n </td>\n <td>{{ key.defaultMessage }}</td>\n <td class=\"text-center\">\n <span\n class=\"text-sm\"\n [class.text-green-500]=\"translationCount === languageCount\"\n [class.text-orange-500]=\"\n translationCount < languageCount && translationCount > 0\n \"\n [class.text-muted-color]=\"translationCount === 0\"\n >\n {{ translationCount }}/{{ languageCount }}\n </span>\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(key)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"TRANSLATION_KEY_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [disabled]=\"key.isReadonly\"\n [fTooltip]=\"\n (key.isReadonly\n ? 'localization.key.readonly.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n (click)=\"onDelete(key)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.key.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n `,\n})\nexport class TranslationKeyListPage implements OnInit {\n readonly TRANSLATION_KEY_PERMISSIONS = TRANSLATION_KEY_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly languageService = inject(LanguageApiService);\n private readonly translationKeyService = inject(TranslationKeyApiService);\n private readonly translationService = inject(TranslationApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isLoading = signal(false);\n readonly languages = signal<ILanguage[]>([]);\n readonly modules = signal<string[]>([]);\n readonly translationKeys = signal<ITranslationKey[]>([]);\n readonly translationCounts = signal<Map<string, number>>(new Map());\n readonly selectedModule = signal<string | null>(null);\n readonly searchTerm = signal('');\n\n readonly moduleOptions = computed(() => [\n { label: this.translateService.translate('shared.all'), value: null },\n ...this.modules().map((m) => ({ label: m, value: m })),\n ]);\n\n readonly filteredKeys = computed(() => {\n let keys = this.translationKeys();\n const module = this.selectedModule();\n const search = this.searchTerm().toLowerCase().trim();\n\n if (module) {\n keys = keys.filter((k) => k.module === module);\n }\n\n if (search) {\n keys = keys.filter(\n (k) =>\n k.key.toLowerCase().includes(search) ||\n k.defaultMessage.toLowerCase().includes(search) ||\n k.module.toLowerCase().includes(search),\n );\n }\n\n return keys;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n loadData(): void {\n this.isLoading.set(true);\n\n forkJoin({\n languages: from(\n this.languageService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n }),\n ),\n modules: this.translationKeyService.getModules(),\n keys: from(\n this.translationKeyService.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n sort: { module: 'ASC', key: 'ASC' },\n }),\n ),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: ({ languages, modules, keys }) => {\n if (languages.success && languages.data) {\n this.languages.set(languages.data.filter((l) => l.isActive));\n }\n if (modules.success && modules.data) {\n this.modules.set(modules.data);\n }\n if (keys.success && keys.data) {\n this.translationKeys.set(keys.data);\n this.loadTranslationCounts();\n }\n this.isLoading.set(false);\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n loadTranslationCounts(): void {\n this.translationService\n .getCounts()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.translationCounts.set(new Map(Object.entries(response.data)));\n }\n },\n });\n }\n\n getTranslationCount(keyId: string): number {\n return this.translationCounts().get(keyId) ?? 0;\n }\n\n onModuleChange(value: string | null): void {\n this.selectedModule.set(value);\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/keys/new']);\n }\n\n onEdit(key: ITranslationKey): void {\n this.router.navigate(['/localization/keys', key.id]);\n }\n\n onDelete(key: ITranslationKey): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate('localization.key.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.translationKeyService.delete({ id: key.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.loadData();\n }\n },\n });\n },\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { Routes } from '@angular/router';\nimport {\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n permissionGuard,\n SHARED_MESSAGES,\n resolveTranslationModule,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { LOCALIZATION_MESSAGES } from '../constants/messages';\n\n/**\n * Resolves which localization tab the current user should land on when\n * navigating to the bare `/localization` route. Mirrors the tab\n * visibility order in LocalizationContainerPage.visibleTabs so the\n * redirect never points at a tab the user can't actually see.\n */\nfunction resolveLocalizationDefaultTab(): string {\n const permissionValidator = inject(PermissionValidatorService);\n\n if (permissionValidator.hasPermission(LANGUAGE_PERMISSIONS.READ)) {\n return 'languages';\n }\n\n if (permissionValidator.hasPermission(TRANSLATION_KEY_PERMISSIONS.READ)) {\n return 'keys';\n }\n\n return 'languages';\n}\n\nexport const LOCALIZATION_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['localization'], fallbackMessages: { ...LOCALIZATION_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/localization-container/localization-container.page').then(\n (m) => m.LocalizationContainerPage,\n ),\n children: [\n // Languages Management\n {\n path: 'languages',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/language-list/language-list.page').then((m) => m.LanguageListPage),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n ],\n },\n\n // Translation Keys Management\n {\n path: 'keys',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/translation-key-list/translation-key-list.page').then(\n (m) => m.TranslationKeyListPage,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n ],\n },\n\n // Default redirect to the first tab the user has permission to see\n {\n path: '',\n redirectTo: () => resolveLocalizationDefaultTab(),\n pathMatch: 'full',\n },\n ],\n },\n];\n","// Interfaces\nexport * from './interfaces/language.interface';\nexport * from './interfaces/localization-config.interface';\nexport * from './interfaces/translation-key.interface';\nexport * from './interfaces/translation.interface';\n\n// Constants\nexport * from './constants/localization.constants';\nexport * from './constants/messages';\n\n// Services\nexport * from './services/language-api.service';\nexport * from './services/localization-api.service';\nexport * from './services/localization-initializer.service';\nexport * from './services/localization-state.service';\nexport * from './services/translation-api.service';\nexport * from './services/translation-key-api.service';\nexport * from './services/translation-loader.service';\n\n// Components\nexport * from './components/language-selector/language-selector.component';\n\n// Providers\nexport * from './providers/localization.providers';\n\n// Pages\nexport * from './pages/language-form/language-form.page';\nexport * from './pages/language-list/language-list.page';\nexport * from './pages/localization-container/localization-container.page';\nexport * from './pages/translation-key-form/translation-key-form.page';\nexport * from './pages/translation-key-list/translation-key-list.page';\n\n// Routes\nexport { LOCALIZATION_ROUTES } from './routes/localization.routes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-localization.mjs","names":[],"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/routes/localization.routes.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type LocalizationLoadStrategy = 'all' | 'modules';\n\n/** Localization system configuration */\nexport interface ILocalizationConfig {\n /** Default language code (e.g., 'en', 'ar') */\n defaultLanguageCode: string;\n /** Translation loading strategy (default: 'modules') */\n loadStrategy?: LocalizationLoadStrategy;\n /** Modules to load at app initialization (default: []) */\n initialModules?: string[];\n /** Show language selector in layout (default: false) */\n enableLayoutSelector?: boolean;\n}\n\nexport const LOCALIZATION_CONFIG = new InjectionToken<ILocalizationConfig>(\n 'LOCALIZATION_CONFIG',\n);\n\n/** Get localization config with sensible defaults applied */\nexport function getLocalizationConfig(\n overrides?: Partial<ILocalizationConfig>,\n): ILocalizationConfig {\n const defaults: ILocalizationConfig = {\n defaultLanguageCode: 'en',\n loadStrategy: 'all',\n initialModules: [],\n enableLayoutSelector: false,\n };\n\n return {\n ...defaults,\n ...overrides,\n defaultLanguageCode:\n overrides?.defaultLanguageCode || defaults.defaultLanguageCode,\n };\n}\n","export const STORAGE_KEYS = {\n CURRENT_LANGUAGE: 'flusys.language',\n} as const;\n","export const LOCALIZATION_MESSAGES: Record<string, string> = {\n // Language CRUD (API keys)\n 'language.create.success': 'Language created successfully',\n 'language.create.many.success': '{{count}} languages created successfully',\n 'language.get.success': 'Language retrieved successfully',\n 'language.get.by.ids.success': 'Languages retrieved successfully by Ids',\n 'language.get.by.filter.success':\n 'Languages retrieved successfully by filter',\n 'language.get.all.success': 'Languages retrieved successfully',\n 'language.update.success': 'Language updated successfully',\n 'language.update.many.success': '{{count}} languages updated successfully',\n 'language.delete.success': 'Language deleted successfully',\n 'language.restore.success': 'Language restored successfully',\n 'language.readonly.update.forbidden':\n 'Cannot modify code/name of readonly language \"{{name}}\"',\n 'language.readonly.delete.forbidden': 'Cannot delete readonly language(s): {{names}}',\n 'language.default.delete.forbidden':\n 'Cannot delete the default language(s): {{names}}. Set another language as default first.',\n 'language.active.success': 'Active languages retrieved successfully',\n 'language.set.default.success': 'Default language updated successfully',\n 'language.get.default.success': 'Default language retrieved successfully',\n\n // Translation key CRUD (API keys)\n 'translation.key.create.success': 'Translation key created successfully',\n 'translation.key.create.many.success':\n '{{count}} translation keys created successfully',\n 'translation.key.get.success': 'Translation key retrieved successfully',\n 'translation.key.get.by.ids.success':\n 'Translation keys retrieved successfully by Ids',\n 'translation.key.get.by.filter.success':\n 'Translation keys retrieved successfully by filter',\n 'translation.key.get.all.success': 'Translation keys retrieved successfully',\n 'translation.key.update.success': 'Translation key updated successfully',\n 'translation.key.update.many.success':\n '{{count}} translation keys updated successfully',\n 'translation.key.delete.success': 'Translation key deleted successfully',\n 'translation.key.restore.success': 'Translation key restored successfully',\n 'translation.key.modules.success': 'Modules retrieved successfully',\n 'translation.key.readonly.delete.forbidden':\n 'Cannot delete readonly translation keys: {{keys}}',\n 'translation.key.readonly.update.forbidden':\n 'Cannot modify key or module of system translation keys',\n 'translation.key.duplicate.key.in.module':\n 'Translation key \"{{key}}\" already exists in module \"{{module}}\"',\n\n // Translation CRUD (API keys)\n 'translation.create.success': 'Translation created successfully',\n 'translation.create.many.success':\n '{{count}} translations created successfully',\n 'translation.get.success': 'Translation retrieved successfully',\n 'translation.get.by.ids.success':\n 'Translations retrieved successfully by Ids',\n 'translation.get.by.filter.success':\n 'Translations retrieved successfully by filter',\n 'translation.get.all.success': 'Translations retrieved successfully',\n 'translation.update.success': 'Translation updated successfully',\n 'translation.update.many.success':\n '{{count}} translations updated successfully',\n 'translation.delete.success': 'Translation deleted successfully',\n 'translation.restore.success': 'Translation restored successfully',\n 'translation.by.language.success': 'Translations retrieved successfully',\n\n // pages/localization-container/localization-container.page.ts\n 'localization.title': 'Localization',\n 'localization.subtitle': 'Manage languages and translations',\n 'localization.tabs.languages': 'Languages',\n 'localization.tabs.keys': 'Keys',\n\n // pages/language-list/language-list.page.ts\n 'localization.language.title': 'Languages',\n 'localization.language.subtitle':\n 'Manage available languages for your application',\n 'localization.language.new': 'Add Language',\n 'localization.language.code': 'Language Code',\n 'localization.language.name': 'Language Name',\n 'localization.language.native.name': 'Native Name',\n 'localization.language.direction': 'Text Direction',\n 'localization.language.rtl': 'RTL',\n 'localization.language.ltr': 'LTR',\n 'localization.language.default': 'Default',\n 'localization.language.set.default': 'Set as Default',\n 'localization.language.empty':\n 'No languages configured. Add a language to get started.',\n 'localization.language.confirm.set.default':\n 'Set \"{{name}}\" as the default language?',\n 'localization.language.delete.title': 'Delete Language',\n 'localization.language.default.delete.forbidden':\n 'Cannot delete the default language. Set another language as default first.',\n 'localization.language.readonly.delete.forbidden':\n 'This is a system language and cannot be deleted',\n\n // pages/language-form/language-form.page.ts\n 'localization.language.edit': 'Edit Language',\n 'localization.language.readonly.edit.hint':\n 'This is a system language — its code, name, native name, and direction cannot be changed',\n 'localization.placeholder.code': 'en',\n 'localization.language.iso.code.hint':\n 'ISO 639-1 language code (e.g., en, ar, fr)',\n 'localization.placeholder.name': 'English',\n 'localization.placeholder.native.name': 'English',\n 'localization.language.native.name.hint':\n 'Name in the native language (e.g., العربية for Arabic)',\n 'localization.language.display.order': 'Display Order',\n 'localization.language.direction.ltr': 'Left to Right (LTR)',\n 'localization.language.direction.rtl': 'Right to Left (RTL)',\n 'localization.validation.code.required': 'Language code is required',\n 'localization.validation.code.max.length':\n 'Language code must be at most 10 characters',\n 'localization.validation.name.required': 'Language name is required',\n 'localization.validation.name.max.length':\n 'Language name must be at most 100 characters',\n\n // pages/translation-key-list/translation-key-list.page.ts\n 'localization.key.title': 'Translation Keys',\n 'localization.key.subtitle': 'Manage translation keys for your application',\n 'localization.key.new': 'Add Key',\n 'localization.key.filter.module': 'Filter by module',\n 'localization.key.module': 'Module',\n 'localization.key.name': 'Key Name',\n 'localization.key.default.message': 'Default Message',\n 'localization.key.translations': 'Translations',\n 'localization.key.empty': 'No translation keys found',\n 'localization.key.delete.title': 'Delete Translation Key',\n 'localization.key.readonly.delete.forbidden':\n 'This is a system translation key and cannot be deleted',\n 'localization.key.readonly.edit.hint':\n 'This is a system key — its key name and module cannot be changed',\n\n // pages/translation-key-form/translation-key-form.page.ts\n 'localization.key.edit': 'Edit Key',\n 'localization.key.about': 'Key Information',\n 'localization.placeholder.key.name': 'button.submit',\n 'localization.key.select.module': 'Select or enter module',\n 'localization.placeholder.default.message': 'Enter default value (English)',\n 'localization.key.description': 'Description',\n 'localization.placeholder.key.description':\n 'Optional description for translators',\n 'localization.key.variables': 'Variables',\n 'localization.key.variables.placeholder': 'e.g., name, count, date',\n 'localization.key.variables.hint':\n 'Enter variable names used in this translation',\n 'localization.key.translations.section': 'Translations',\n 'localization.key.no.languages': 'No active languages configured',\n 'localization.key.enter.translation': 'Enter translation',\n 'localization.validation.key.required': 'Translation key is required',\n 'localization.validation.default.message.required':\n 'Default message is required',\n};\n","import { Service } 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@Service()\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, Service } 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@Service()\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, Service } 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@Service()\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 { ApplicationRef, computed, effect, inject, signal, Service } 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@Service()\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 { Service } 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@Service()\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 { Service } 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@Service()\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, Service } 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@Service()\nexport class TranslationLoaderService {\n private readonly DEFAULT_INITIAL_MODULES = ['shared', 'layout'];\n private readonly config = inject(LOCALIZATION_CONFIG, { optional: true });\n apiService: LocalizationApiService = inject(LOCALIZATION_API_SERVICE, {\n optional: false,\n }) as LocalizationApiService;\n\n stateService: LocalizationStateService = inject(LOCALIZATION_STATE_SERVICE, {\n optional: false,\n }) as unknown as LocalizationStateService;\n\n async loadTranslations(\n languageCode: string,\n clearModules = false,\n ): Promise<void> {\n const strategy = this.config?.loadStrategy ?? 'all';\n\n // Save currently loaded modules before clearing (for language switch)\n const previouslyLoadedModules = clearModules\n ? this.stateService.getLoadedModules()\n : [];\n\n if (clearModules) {\n this.stateService.clearLoadedModules();\n }\n\n this.stateService.setLoading(true);\n\n try {\n if (strategy === 'all') {\n await this.loadAndSetTranslations(languageCode);\n } else {\n const modules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n await this.loadAndSetTranslations(languageCode, modules);\n // Reload all previously loaded modules for the new language\n if (previouslyLoadedModules.length > 0) {\n await this.reloadModules(languageCode, previouslyLoadedModules);\n }\n }\n } finally {\n this.stateService.setLoading(false);\n }\n }\n\n private async loadAndSetTranslations(\n languageCode: string,\n modules?: string[],\n ): Promise<void> {\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(languageCode, modules),\n );\n if (response.success && response.data) {\n this.stateService.setTranslations(response.data);\n if (modules) {\n modules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n }\n\n private async reloadModules(\n languageCode: string,\n modules: string[],\n ): Promise<void> {\n const initialModules =\n this.config?.initialModules ?? this.DEFAULT_INITIAL_MODULES;\n const additionalModules = modules.filter(\n (m) => !initialModules.includes(m),\n );\n\n if (additionalModules.length === 0) return;\n\n const response = await firstValueFrom(\n this.apiService.getTranslationsByLanguage(\n languageCode,\n additionalModules,\n ),\n );\n\n if (response.success && response.data) {\n this.stateService.mergeTranslations(response.data);\n additionalModules.forEach((m) => this.stateService.markModuleLoaded(m));\n }\n }\n\n loadTranslationsAsync(\n languageCode: string,\n clearModules = false,\n ): Observable<void> {\n return from(this.loadTranslations(languageCode, clearModules));\n }\n}\n","import { Component, DestroyRef, computed, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem, UiIconComponent } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector',\n imports: [MenuComponent, UiIconComponent],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"menu.visible()\"\n (click)=\"menu.toggle($event)\"\n >\n <ui-icon name=\"globe\"></ui-icon>\n <span class=\"font-semibold\">{{\n selectedLanguage()?.nativeName ||\n selectedLanguage()?.name ||\n selectedLanguageCode()\n }}</span>\n </button>\n <f-menu\n #menu\n [model]=\"menuItems()\"\n [popup]=\"true\"\n class=\"absolute left-[0]\"\n [style]=\"{ 'inset-inline-end': '0' }\"\n />\n `,\n})\nexport class LanguageSelectorComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n readonly selectedLanguageCode = this.localizationState.currentLanguageCode;\n readonly selectedLanguage = computed(\n () =>\n this.languages().find((l) => l.code === this.selectedLanguageCode()) ??\n null,\n );\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MenuComponent, MenuItem } from '@flusys/ng-ui';\nimport { LocalizationStateService } from '../../services/localization-state.service';\nimport { TranslationLoaderService } from '../../services/translation-loader.service';\n\n@Component({\n selector: 'lib-language-selector-panel',\n imports: [MenuComponent],\n host: {\n class: 'hidden absolute z-50 top-[24px] p-3 min-w-[180px]',\n style: 'inset-inline-end: 0;',\n },\n template: `<f-menu [model]=\"menuItems()\" />`,\n})\nexport class LanguageSelectorPanelComponent {\n private readonly localizationState = inject(LocalizationStateService);\n private readonly translationLoader = inject(TranslationLoaderService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly languages = this.localizationState.availableLanguages;\n\n private readonly _selectedLanguageCode = signal<string>(\n this.localizationState.currentLanguageCode(),\n );\n readonly selectedLanguageCode = this._selectedLanguageCode.asReadonly();\n\n readonly menuItems = computed<MenuItem[]>(() =>\n this.languages().map((lang) => ({\n label: lang.nativeName || lang.name,\n badge: lang.code.toUpperCase(),\n selected: lang.code === this.selectedLanguageCode(),\n command: () => this.onLanguageSelect(lang.code),\n })),\n );\n\n constructor() {\n effect(() => {\n const currentCode = this.localizationState.currentLanguageCode();\n if (currentCode !== this._selectedLanguageCode()) {\n this._selectedLanguageCode.set(currentCode);\n }\n });\n }\n\n onLanguageSelect(code: string): void {\n const language = this.languages().find((l) => l.code === code);\n if (language) {\n this._selectedLanguageCode.set(code);\n this.localizationState.setCurrentLanguage(language);\n this.translationLoader\n .loadTranslationsAsync(code, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n provideAppInitializer,\n Provider,\n} from '@angular/core';\nimport {\n LOCALIZATION_API_SERVICE,\n LOCALIZATION_STATE_SERVICE,\n} from '@flusys/ng-core';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_LANGUAGE_SELECTOR_PANEL,\n} from '@flusys/ng-layout';\nimport { LanguageSelectorPanelComponent } from '../components/language-selector-panel/language-selector-panel.component';\nimport { LanguageSelectorComponent } from '../components/language-selector/language-selector.component';\nimport {\n ILocalizationConfig,\n LOCALIZATION_CONFIG,\n} from '../interfaces/localization-config.interface';\nimport { LocalizationApiService } from '../services/localization-api.service';\nimport { LocalizationInitializerService } from '../services/localization-initializer.service';\nimport { LocalizationStateService } from '../services/localization-state.service';\n\nexport function provideLocalization(\n config: ILocalizationConfig,\n initialFallbackMessages?: Record<string, string>,\n): Array<Provider | EnvironmentProviders> {\n const providers: Array<Provider | EnvironmentProviders> = [\n // 1. Value/Existing Providers\n { provide: LOCALIZATION_CONFIG, useValue: config },\n {\n provide: LOCALIZATION_STATE_SERVICE,\n useExisting: LocalizationStateService,\n },\n { provide: LOCALIZATION_API_SERVICE, useExisting: LocalizationApiService },\n\n // 2. The Service itself\n LocalizationInitializerService,\n\n // 3. The modern Initializer\n provideAppInitializer(() => {\n const initializer = inject(LocalizationInitializerService);\n return initializer.initialize(initialFallbackMessages);\n }),\n ];\n\n if (config.enableLayoutSelector) {\n providers.push(\n {\n provide: LAYOUT_LANGUAGE_SELECTOR,\n useValue: LanguageSelectorComponent,\n },\n {\n provide: LAYOUT_LANGUAGE_SELECTOR_PANEL,\n useValue: LanguageSelectorPanelComponent,\n },\n );\n }\n\n return providers;\n}\n","import { inject } from '@angular/core';\nimport { Routes } from '@angular/router';\nimport {\n LANGUAGE_PERMISSIONS,\n PermissionValidatorService,\n permissionGuard,\n SHARED_MESSAGES,\n resolveTranslationModule,\n TRANSLATION_KEY_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { LOCALIZATION_MESSAGES } from '../constants/messages';\n\n/**\n * Resolves which localization tab the current user should land on when\n * navigating to the bare `/localization` route. Mirrors the tab\n * visibility order in LocalizationContainerPage.visibleTabs so the\n * redirect never points at a tab the user can't actually see.\n */\nfunction resolveLocalizationDefaultTab(): string {\n const permissionValidator = inject(PermissionValidatorService);\n\n if (permissionValidator.hasPermission(LANGUAGE_PERMISSIONS.READ)) {\n return 'languages';\n }\n\n if (permissionValidator.hasPermission(TRANSLATION_KEY_PERMISSIONS.READ)) {\n return 'keys';\n }\n\n return 'languages';\n}\n\nexport const LOCALIZATION_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['localization'], fallbackMessages: { ...LOCALIZATION_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/localization-container/localization-container.page').then(\n (m) => m.LocalizationContainerPage,\n ),\n children: [\n // Languages Management\n {\n path: 'languages',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/language-list/language-list.page').then((m) => m.LanguageListPage),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(LANGUAGE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/language-form/language-form.page').then((m) => m.LanguageFormPage),\n },\n ],\n },\n\n // Translation Keys Management\n {\n path: 'keys',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/translation-key-list/translation-key-list.page').then(\n (m) => m.TranslationKeyListPage,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(TRANSLATION_KEY_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/translation-key-form/translation-key-form.page').then(\n (m) => m.TranslationKeyFormPage,\n ),\n },\n ],\n },\n\n // Default redirect to the first tab the user has permission to see\n {\n path: '',\n redirectTo: () => resolveLocalizationDefaultTab(),\n pathMatch: 'full',\n },\n ],\n },\n];\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/ng-localization",
3
- "version": "9.1.0-rc.1",
3
+ "version": "9.1.1",
4
4
  "description": "Localization module for multi-language support in FLUSYS Angular apps",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,10 +8,10 @@
8
8
  "@angular/core": ">=22.0.0",
9
9
  "@angular/forms": ">=22.0.0",
10
10
  "@angular/router": ">=22.0.0",
11
- "@flusys/ng-core": ">=9.1.0-rc.1",
12
- "@flusys/ng-layout": ">=9.1.0-rc.1",
13
- "@flusys/ng-shared": ">=9.1.0-rc.1",
14
- "@flusys/ng-ui": ">=9.1.0-rc.1",
11
+ "@flusys/ng-core": ">=9.1.1",
12
+ "@flusys/ng-layout": ">=9.1.1",
13
+ "@flusys/ng-shared": ">=9.1.1",
14
+ "@flusys/ng-ui": ">=9.1.1",
15
15
  "rxjs": "^7.8.0"
16
16
  },
17
17
  "sideEffects": false,