Skip to content

Commit 1859aab

Browse files
committed
chore: adding payroll date to breadcrumbs
1 parent f26f48e commit 1859aab

File tree

5 files changed

+158
-12
lines changed

5 files changed

+158
-12
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { describe, it, expect } from 'vitest'
2+
import { FlowBreadcrumbs } from './FlowBreadcrumbs'
3+
import { renderWithProviders } from '@/test-utils/renderWithProviders'
4+
5+
describe('FlowBreadcrumbs date formatting', () => {
6+
it('should render without errors when breadcrumbs have date string variables', () => {
7+
const breadcrumbs = [
8+
{
9+
id: 'configuration',
10+
label: 'breadcrumbLabel',
11+
namespace: 'Payroll.PayrollConfiguration',
12+
variables: {
13+
startDate: '2023-12-25',
14+
endDate: '2024-01-05',
15+
},
16+
},
17+
]
18+
19+
const { container } = renderWithProviders(
20+
<FlowBreadcrumbs breadcrumbs={breadcrumbs} currentBreadcrumbId="configuration" />,
21+
)
22+
23+
expect(container).toBeTruthy()
24+
})
25+
26+
it('should render without errors when breadcrumbs have no date variables', () => {
27+
const breadcrumbs = [
28+
{
29+
id: 'landing',
30+
label: 'labels.breadcrumbLabel',
31+
namespace: 'Payroll.PayrollLanding',
32+
},
33+
]
34+
35+
const { container } = renderWithProviders(
36+
<FlowBreadcrumbs breadcrumbs={breadcrumbs} currentBreadcrumbId="landing" />,
37+
)
38+
39+
expect(container).toBeTruthy()
40+
})
41+
42+
it('should render without errors when date strings are invalid', () => {
43+
const breadcrumbs = [
44+
{
45+
id: 'configuration',
46+
label: 'breadcrumbLabel',
47+
namespace: 'Payroll.PayrollConfiguration',
48+
variables: {
49+
startDate: 'invalid-date',
50+
endDate: '2024-01-05',
51+
},
52+
},
53+
]
54+
55+
const { container } = renderWithProviders(
56+
<FlowBreadcrumbs breadcrumbs={breadcrumbs} currentBreadcrumbId="configuration" />,
57+
)
58+
59+
expect(container).toBeTruthy()
60+
})
61+
62+
it('should render without errors when date variables are not strings', () => {
63+
const breadcrumbs = [
64+
{
65+
id: 'configuration',
66+
label: 'breadcrumbLabel',
67+
namespace: 'Payroll.PayrollConfiguration',
68+
variables: {
69+
startDate: new Date('2023-12-25'),
70+
endDate: new Date('2024-01-05'),
71+
},
72+
},
73+
]
74+
75+
const { container } = renderWithProviders(
76+
<FlowBreadcrumbs breadcrumbs={breadcrumbs} currentBreadcrumbId="configuration" />,
77+
)
78+
79+
expect(container).toBeTruthy()
80+
})
81+
})

src/components/Common/FlowBreadcrumbs/FlowBreadcrumbs.tsx

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@ import type { FlowBreadcrumbsProps } from './FlowBreadcrumbsTypes'
55
import { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'
66
import { componentEvents } from '@/shared/constants'
77
import { useI18n } from '@/i18n/I18n'
8+
import { useLocale } from '@/contexts/LocaleProvider/useLocale'
9+
import { formatDateForBreadcrumb } from '@/helpers/dateFormatting'
810

911
export function FlowBreadcrumbs({
1012
breadcrumbs,
1113
currentBreadcrumbId,
1214
onEvent,
1315
}: FlowBreadcrumbsProps) {
1416
const { Breadcrumbs } = useComponentContext()
17+
const { locale } = useLocale()
1518
const namespaces = breadcrumbs.reduce<Array<keyof CustomTypeOptions['resources']>>(
1619
(acc, breadcrumb) => {
1720
if (breadcrumb.namespace) {
@@ -23,26 +26,39 @@ export function FlowBreadcrumbs({
2326
)
2427
useI18n(namespaces)
2528
const { t } = useTranslation(namespaces)
26-
2729
const parsedBreadcrumbs = useMemo(
2830
() =>
2931
breadcrumbs.map(breadcrumb => {
32+
const formattedVariables = breadcrumb.variables
33+
? {
34+
...breadcrumb.variables,
35+
startDate:
36+
typeof breadcrumb.variables.startDate === 'string'
37+
? formatDateForBreadcrumb(breadcrumb.variables.startDate, locale)
38+
: breadcrumb.variables.startDate,
39+
endDate:
40+
typeof breadcrumb.variables.endDate === 'string'
41+
? formatDateForBreadcrumb(breadcrumb.variables.endDate, locale)
42+
: breadcrumb.variables.endDate,
43+
}
44+
: undefined
45+
3046
const translatedLabel = breadcrumb.namespace
3147
? (t(breadcrumb.label, {
3248
ns: breadcrumb.namespace,
3349
defaultValue: breadcrumb.label,
34-
...breadcrumb.variables,
50+
...formattedVariables,
3551
} as never) as unknown as string)
3652
: (t(breadcrumb.label, {
3753
defaultValue: breadcrumb.label,
38-
...breadcrumb.variables,
54+
...formattedVariables,
3955
} as never) as unknown as string)
4056
return {
4157
id: breadcrumb.id,
4258
label: translatedLabel,
4359
}
4460
}),
45-
[breadcrumbs, t],
61+
[breadcrumbs, t, locale],
4662
)
4763

4864
const handleBreadcrumbClick = (breadcrumbId: string) => {
@@ -54,7 +70,6 @@ export function FlowBreadcrumbs({
5470
})
5571
}
5672
}
57-
5873
return (
5974
<Breadcrumbs
6075
breadcrumbs={parsedBreadcrumbs}

src/helpers/breadcrumbHelpers.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,10 @@ export const updateBreadcrumbs = <
8181
const allBreadcrumbs = context.breadcrumbs ?? {}
8282
const trail = allBreadcrumbs[stateName] ?? []
8383
const resolvedTrail = trail.map(breadcrumb => {
84-
if (breadcrumb.id === stateName && variables) {
85-
return {
86-
...breadcrumb,
87-
variables: resolveBreadcrumbVariables(variables, context as Record<string, unknown>),
88-
}
84+
return {
85+
...breadcrumb,
86+
variables: resolveBreadcrumbVariables(variables, context as Record<string, unknown>),
8987
}
90-
return breadcrumb
9188
})
9289
return {
9390
...context,

src/helpers/dateFormatting.test.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { describe, it, expect } from 'vitest'
2-
import { parseDateStringToLocal, normalizeDateToLocal } from './dateFormatting'
2+
import {
3+
parseDateStringToLocal,
4+
normalizeDateToLocal,
5+
formatDateForBreadcrumb,
6+
} from './dateFormatting'
37

48
describe('parseDateStringToLocal', () => {
59
it('should parse valid YYYY-MM-DD date strings correctly in local timezone', () => {
@@ -40,3 +44,35 @@ describe('normalizeDateToLocal', () => {
4044
expect(normalizeDateToLocal(new Date('invalid-date'))).toBeNull()
4145
})
4246
})
47+
48+
describe('formatDateForBreadcrumb', () => {
49+
it('should format valid date string using locale', () => {
50+
const result = formatDateForBreadcrumb('2023-12-25', 'en-US')
51+
expect(result).toBeTruthy()
52+
expect(result).toContain('Dec')
53+
expect(result).toContain('25')
54+
expect(result).toContain('2023')
55+
})
56+
57+
it('should return empty string for undefined', () => {
58+
expect(formatDateForBreadcrumb(undefined, 'en-US')).toBe('')
59+
})
60+
61+
it('should return empty string for invalid date strings', () => {
62+
expect(formatDateForBreadcrumb('', 'en-US')).toBe('')
63+
expect(formatDateForBreadcrumb('invalid', 'en-US')).toBe('')
64+
expect(formatDateForBreadcrumb('2023-13-01', 'en-US')).toBe('')
65+
})
66+
67+
it('should format dates correctly for different locales', () => {
68+
const dateString = '2023-12-25'
69+
70+
const usFormat = formatDateForBreadcrumb(dateString, 'en-US')
71+
expect(usFormat).toBeTruthy()
72+
expect(usFormat).toContain('Dec')
73+
74+
const ukFormat = formatDateForBreadcrumb(dateString, 'en-GB')
75+
expect(ukFormat).toBeTruthy()
76+
expect(ukFormat).toContain('Dec')
77+
})
78+
})

src/helpers/dateFormatting.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,20 @@ export const normalizeDateToLocal = (date: Date | null): Date | null => {
7272

7373
return new Date(year, month - 1, day)
7474
}
75+
76+
/**
77+
* Formats a date string for breadcrumb display using locale-aware formatting.
78+
* Returns empty string if the date is invalid.
79+
*/
80+
export const formatDateForBreadcrumb = (dateString: string | undefined, locale: string): string => {
81+
if (!dateString) return ''
82+
83+
const date = parseDateStringToLocal(dateString)
84+
if (!date) return ''
85+
86+
return date.toLocaleDateString(locale, {
87+
month: 'short',
88+
day: 'numeric',
89+
year: 'numeric',
90+
})
91+
}

0 commit comments

Comments
 (0)