From df4df8a73e5119f1e71286abd3f36a45a8f71da4 Mon Sep 17 00:00:00 2001 From: Barbie Date: Thu, 8 Oct 2026 02:56:30 +0000 Subject: [PATCH] WEB-1270: Register Azerbaijani locale data --- src/app/core/utils/dates.spec.ts | 21 ++++++++++++++++++++- src/app/core/utils/dates.ts | 11 +++++++++-- src/app/pipes/date-format.pipe.ts | 1 + src/app/web-app.component.ts | 2 ++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/app/core/utils/dates.spec.ts b/src/app/core/utils/dates.spec.ts index 5193181921..58235abd64 100644 --- a/src/app/core/utils/dates.spec.ts +++ b/src/app/core/utils/dates.spec.ts @@ -1,7 +1,10 @@ import { TestBed } from '@angular/core/testing'; -import { DatePipe } from '@angular/common'; +import { DatePipe, registerLocaleData } from '@angular/common'; +import localeEN from '@angular/common/locales/en'; import { Dates } from './dates'; +registerLocaleData(localeEN); + describe('Dates', () => { let service: Dates; @@ -99,4 +102,20 @@ describe('Dates', () => { }); }); }); + + describe('formatDate', () => { + it('should fall back to moment formatting for a valid date when locale is unregistered', () => { + localStorage.setItem('mifosXLanguage', JSON.stringify({ name: 'xx', code: 'xx' })); + const date = new Date(2025, 0, 15); + const result = service.formatDate(date, 'yyyy-MM-dd'); + expect(result).toBe('2025-01-15'); + localStorage.removeItem('mifosXLanguage'); + }); + + it('should throw for an invalid timestamp instead of returning "Invalid date"', () => { + localStorage.setItem('mifosXLanguage', JSON.stringify({ name: 'xx', code: 'xx' })); + expect(() => service.formatDate('not-a-date', 'yyyy-MM-dd')).toThrow(); + localStorage.removeItem('mifosXLanguage'); + }); + }); }); diff --git a/src/app/core/utils/dates.ts b/src/app/core/utils/dates.ts index 2bc9a95bc9..e819c26996 100644 --- a/src/app/core/utils/dates.ts +++ b/src/app/core/utils/dates.ts @@ -39,8 +39,15 @@ export class Dates { } public formatDate(timestamp: any, dateFormat: string): string { - const datePipe: DatePipe = new DatePipe(this.language.code); - return datePipe.transform(timestamp, dateFormat); + try { + const datePipe: DatePipe = new DatePipe(this.language.code); + return datePipe.transform(timestamp, dateFormat); + } catch (e) { + if (moment(timestamp).isValid()) { + return this.formatDateAsString(timestamp, dateFormat); + } + throw e; + } } public formatDateAsString(value: Date, dateFormat: string): string { diff --git a/src/app/pipes/date-format.pipe.ts b/src/app/pipes/date-format.pipe.ts index 4582f26215..339265c962 100644 --- a/src/app/pipes/date-format.pipe.ts +++ b/src/app/pipes/date-format.pipe.ts @@ -14,6 +14,7 @@ import { Subscription } from 'rxjs'; import moment from 'moment'; // Load moment.js locale data for all supported languages +import 'moment/locale/az'; // Azerbaijani import 'moment/locale/ne'; // Nepali import 'moment/locale/es'; // Spanish import 'moment/locale/de'; // German diff --git a/src/app/web-app.component.ts b/src/app/web-app.component.ts index c27ff94439..4e59d7a909 100644 --- a/src/app/web-app.component.ts +++ b/src/app/web-app.component.ts @@ -46,6 +46,7 @@ import { ThemingService } from './shared/theme-toggle/theming.service'; const log = new Logger('MifosX'); import { registerLocaleData } from '@angular/common'; +import localeAZ from '@angular/common/locales/az'; import localeCS from '@angular/common/locales/cs'; import localeEN from '@angular/common/locales/en'; import localeES from '@angular/common/locales/es'; @@ -60,6 +61,7 @@ import localePT from '@angular/common/locales/pt'; import localeSW from '@angular/common/locales/sw'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; +registerLocaleData(localeAZ); registerLocaleData(localeCS); registerLocaleData(localeEN); registerLocaleData(localeES);