Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 commits
Select commit Hold shift + click to select a range
f2f36de
feat: add custom plural for note relationship attribute
henrikmv Jul 23, 2026
18351e9
feat: update name assignment in TrackedEntityTypeFactory to use trans…
henrikmv Jul 23, 2026
5a895cd
feat: metadata loading support custom plural labels based on server v…
henrikmv Jul 23, 2026
8cedb68
feat: add customTerminologyPlurals feature support
henrikmv Jul 23, 2026
433aa56
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21878…
henrikmv Jul 25, 2026
ab2685d
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21878…
henrikmv Aug 6, 2026
c479953
fix: separate base and plural fields for improved readability
henrikmv Aug 6, 2026
e5b4d74
feat: temp change helper function and stop capitalize
henrikmv Aug 7, 2026
302cc2b
feat: implement custom terminology handling with bootstrap
henrikmv Aug 7, 2026
823f4e1
fix: revert changes belonging to child branch
henrikmv Aug 7, 2026
9f8ccb6
Revert "fix: revert changes belonging to child branch"
henrikmv Aug 7, 2026
e81170c
feat: temp
henrikmv Aug 7, 2026
f29cb71
fix: clean up
henrikmv Aug 7, 2026
764e73b
fix: sonar qube
henrikmv Aug 7, 2026
df95c4d
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21635…
henrikmv Aug 7, 2026
f27e6b5
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21878…
henrikmv Aug 7, 2026
c3719e4
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21635_display-cust…
henrikmv Aug 7, 2026
9990864
fix: revert changes belonging to parent branch
henrikmv Aug 7, 2026
2e19a93
feat: code clean up
henrikmv Aug 7, 2026
52dbd2b
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21635_display-cust…
henrikmv Aug 7, 2026
0a0d90a
fix: type change
henrikmv Aug 7, 2026
aa4cd9c
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21635_display-cust…
henrikmv Aug 7, 2026
809aad6
feat: update terminology
henrikmv Aug 7, 2026
54d8332
feat: enhance API program fields with custom terminology support
henrikmv Aug 7, 2026
45eb553
feat: clean up
henrikmv Aug 7, 2026
d482cc2
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21635_display-cust…
henrikmv Aug 7, 2026
8fcc8ff
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21878…
henrikmv Aug 12, 2026
de452bc
feat: temp devin review
henrikmv Aug 12, 2026
6a8cd9c
fix: revert single event infrastructure
henrikmv Aug 12, 2026
56ac556
feat: update terminology handling across components
henrikmv Aug 12, 2026
718ae46
feat: enhance custom terminology handling and optimize location query…
henrikmv Aug 12, 2026
b52ffd8
feat: custom terminology context handling
henrikmv Aug 12, 2026
f3b34dc
fix: change approach
henrikmv Aug 12, 2026
2b92b9a
fix: complete clean up after revert
henrikmv Aug 12, 2026
d66e422
feat: update custom label handling and refactor label exports
henrikmv Aug 12, 2026
762f6bd
fix: correct capitalization in widget header and improve label resolu…
henrikmv Aug 12, 2026
ee3d687
fix: simplify label resolution logic by removing fallback for plural …
henrikmv Aug 13, 2026
8b7afbb
feat: new translate function
henrikmv Aug 15, 2026
458b7e7
feat: add terminology for enrollment sigular and plural
henrikmv Aug 15, 2026
cd907e7
feat: implement tLabel for custom label handling for enrollment
henrikmv Aug 15, 2026
aefeb4a
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21969_refine-conf…
henrikmv Aug 15, 2026
542e611
Merge remote-tracking branch 'origin/master' into hv/chore/DHIS2-2196…
henrikmv Aug 15, 2026
d485e1f
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21969_refine-conf…
henrikmv Aug 15, 2026
ad9b50a
Merge remote-tracking branch 'origin/master' into hv/chore/DHIS2-2196…
henrikmv Aug 17, 2026
74073a7
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Aug 17, 2026
d2b6bdf
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Aug 17, 2026
89b75c7
fix: temp clean up
henrikmv Aug 28, 2026
a2dd40f
feat: replace tLabel with tCustomTerm
henrikmv Aug 28, 2026
ff0098f
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Aug 28, 2026
7700527
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21635_display-cust…
henrikmv Aug 28, 2026
0bd1e28
feat: add plural support for custom labels in note, relationship, and…
henrikmv Aug 31, 2026
2c132ab
feat: implement custom plural terminology for notes across components
henrikmv Aug 31, 2026
cb9b195
feat: consolidate capitalizeFirstLetter utility and update imports
henrikmv Aug 31, 2026
5980f5e
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Aug 31, 2026
4a44f76
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Aug 31, 2026
3ac34d4
feat: relationships labels plural
henrikmv Aug 31, 2026
cf5eeec
fix: enrollment labels singular and plural
henrikmv Aug 31, 2026
0ee7129
feat: program stage labels singualr and plural
henrikmv Aug 31, 2026
f6b53b0
feat: attributes labels plural
henrikmv Aug 31, 2026
7c2aeb6
feat: replace "field" with custom terminology for attribute labels
henrikmv Aug 31, 2026
3ead8dd
fix: simplify interpolation handling in tCustomTerm function
henrikmv Aug 31, 2026
1a3f8fb
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Aug 31, 2026
531b87a
feat: follow-up labels singular
henrikmv Aug 31, 2026
09dc6c0
feat: organisation unit labels singular
henrikmv Sep 1, 2026
dbe93b4
feat: update programId handling in enrollment related actions and epics
henrikmv Sep 1, 2026
d00b1b9
fix: update plural label fallback to use singular label for default
henrikmv Sep 1, 2026
7792339
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 1, 2026
5f9ea49
feat: event labels singular and plural
henrikmv Sep 1, 2026
9d85281
feat: update data loading messages that can not use custom terminology
henrikmv Sep 1, 2026
7a8e01f
feat: relationship labels singular
henrikmv Sep 1, 2026
7a8a713
fix: sonar qube
henrikmv Sep 1, 2026
99d95e8
feat: note labels singular
henrikmv Sep 1, 2026
b1c62d2
feat: attributes labels singular
henrikmv Sep 1, 2026
3a5b9a0
feat: programStage labels singular
henrikmv Sep 2, 2026
a18315b
fix: update getTermLabel to correctly pass programId from options
henrikmv Sep 2, 2026
4a312cd
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 2, 2026
919a9b2
fix: update getTermLabel calls to use options object for programId
henrikmv Sep 2, 2026
dd9f4b4
fix: sonar qube
henrikmv Sep 2, 2026
15e9754
feat: event per stage labels singual and plural
henrikmv Sep 2, 2026
c728fb2
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 2, 2026
2e9a504
fix: remove duplicate customLabels definition
henrikmv Sep 2, 2026
770fa39
feat: add programId and stageId to useTermLabel calls across components
henrikmv Sep 2, 2026
e6385de
fix: remove unused displayTrackedEntityTypesLabel from CachedTrackedE…
henrikmv Sep 2, 2026
426a0f4
fix: add missing program id
henrikmv Sep 2, 2026
0e6a407
fix: enhance withCustomLabels to include programId and stageId in lab…
henrikmv Sep 2, 2026
203c99a
feat: integrating programId and stageId across components
henrikmv Sep 2, 2026
2827c8f
feat: update terminology usage to include programId for event and enr…
henrikmv Sep 2, 2026
226b2dc
fix: update TermLabelOptions to allow null values for programId and s…
henrikmv Sep 2, 2026
790e301
feat: implement customTerms for improved i18n handling and remove tCu…
henrikmv Sep 2, 2026
6921298
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21969_refine-conf…
henrikmv Sep 2, 2026
6ec8e1b
fix: replace tCustomTerm with customTerms
henrikmv Sep 2, 2026
5db6a53
fix: update error messages for clarity in feedback and validation
henrikmv Sep 2, 2026
98662ef
fix: use provided noItemsText and emptyListText props
henrikmv Sep 2, 2026
f942af9
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 2, 2026
e0ad0a1
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 2, 2026
6215640
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 2, 2026
6c9e94a
feat: global uppercase handler for custom term
henrikmv Sep 3, 2026
6ec5f52
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 3, 2026
53075b0
feat: replace customTerms.i18n with i18n
henrikmv Sep 3, 2026
ae38e9e
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 3, 2026
2627684
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 3, 2026
eb31c39
feat: adding missing event labels
henrikmv Sep 3, 2026
40cb0f5
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 3, 2026
0991fe5
fix: revert changes that belongs to child pr
henrikmv Sep 4, 2026
a19e674
fix: revert cypress test
henrikmv Sep 4, 2026
d8cb582
feat: clean up
henrikmv Sep 4, 2026
cff6516
feat: clean up and add comments
henrikmv Sep 4, 2026
3f3f263
fix: (sonar qube) optimize regex usage for extracting leading custom …
henrikmv Sep 4, 2026
7ab88ca
fix: clean up
henrikmv Sep 4, 2026
465c731
fix: (review) devin comments
henrikmv Sep 4, 2026
f905c14
feat: integrate i18n for report and scheduled date labels
henrikmv Sep 4, 2026
190c679
fix: clean up
henrikmv Sep 4, 2026
c9bc73c
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 4, 2026
7c666ec
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 4, 2026
736bcbe
fix: refine type definitions in withCustomLabels HOC
henrikmv Sep 4, 2026
e889aac
Merge branch 'master' into hv/chore/DHIS2-21969_refine-configurable-t…
henrikmv Sep 4, 2026
e43775f
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 4, 2026
0d4f9a0
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 4, 2026
dbedbb8
fix: update enrollment label to use dynamic terminology
henrikmv Sep 4, 2026
260021e
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 4, 2026
2264510
fix: clean up terminology
henrikmv Sep 4, 2026
281f50a
feat: enhance NotEnoughAttributesMessage to display custom attribute …
henrikmv Sep 4, 2026
729d81f
Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' into hv/…
henrikmv Sep 4, 2026
2b64083
Revert "Merge branch 'hv/feat/DHIS2-21635_display-custom-teminology' …
henrikmv Sep 5, 2026
a643950
Merge branch 'hv/feat/DHIS2-21878_plural-custom-terminology-note-rela…
henrikmv Sep 5, 2026
1edfb7f
Revert "Merge branch 'hv/feat/DHIS2-21878_plural-custom-terminology-n…
henrikmv Sep 5, 2026
2644b87
feat: add plural terminology for notes, relationships, and attributes
henrikmv Sep 5, 2026
4ef6416
Merge branch 'hv/feat/DHIS2-21878_plural-custom-terminology-notes-rel…
henrikmv Sep 5, 2026
d50c822
feat: implement custom labels for notes relationships and attributes …
henrikmv Sep 5, 2026
6eb3223
feat: update terminology to support plural labels for notes and relat…
henrikmv Sep 5, 2026
6809b0b
fix: simplify useProgram hook by removing unused fields and logic
henrikmv Sep 5, 2026
dd7848d
Revert "fix: simplify useProgram hook by removing unused fields and l…
henrikmv Sep 5, 2026
72c5033
feat: add getLabelFromProgram utility and update WidgetEnrollment for…
henrikmv Sep 5, 2026
f0c635a
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 5, 2026
8f145ca
Merge branch 'hv/feat/DHIS2-21878_plural-custom-terminology-notes-rel…
henrikmv Sep 6, 2026
791f4c7
fix: refine GetTermLabelFromProgramOptions type definition and update…
henrikmv Sep 6, 2026
c9d572b
fix: update enrollment label rendering example
henrikmv Sep 6, 2026
e04ffac
feat: refine terminology support by updating label handling and intro…
henrikmv Sep 6, 2026
906d642
fix: clean up
henrikmv Sep 6, 2026
120b2ff
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21969_refine-conf…
henrikmv Sep 6, 2026
7e8453e
Merge branch 'hv/feat/DHIS2-21878_plural-custom-terminology-notes-rel…
henrikmv Sep 6, 2026
28a6231
feat: add getTermLabelFromProgram
henrikmv Sep 6, 2026
2bf19f8
feat: use custom term hoc with correct pattern
henrikmv Sep 6, 2026
8e53c24
feat: refine terminology support by updating label keys to singular a…
henrikmv Sep 6, 2026
fb554a0
Merge branch 'hv/chore/DHIS2-21969_refine-configurable-terminology-su…
henrikmv Sep 6, 2026
1c16e9e
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21878_plural-custo…
henrikmv Sep 6, 2026
0278cd5
feat: update label keys to use singular and plural forms for improved…
henrikmv Sep 6, 2026
f312f01
feat: refine label configuration by updating field definitions and in…
henrikmv Sep 6, 2026
e6266bd
feat: update useTermLabel usage
henrikmv Sep 6, 2026
a73d352
feat: refactoring label handling and introducing constants for label …
henrikmv Sep 7, 2026
0af0b01
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21969_refine-conf…
henrikmv Sep 7, 2026
331da5e
feat: add consts to support plural of note, relationship, and attribu…
henrikmv Sep 7, 2026
e70c0c7
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21878_plural-custo…
henrikmv Sep 7, 2026
9f3ae6c
feat: refactor useTermLabel to utilise LabelKeys for improved termino…
henrikmv Sep 7, 2026
cb04bb6
feat: clean up
henrikmv Sep 7, 2026
0028520
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21878_plural-custo…
henrikmv Sep 7, 2026
f0a838b
Revert "Merge remote-tracking branch 'origin/hv/feat/DHIS2-21878_plur…
henrikmv Sep 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,290 changes: 663 additions & 627 deletions i18n/en.pot

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export const FEATURES = Object.freeze({
orgUnitReplaceOuQueryParam: 'orgUnitReplaceOuQueryParam',
enrollmentStatusReplaceProgramStatusQueryParam: 'enrollmentStatusReplaceProgramStatusQueryParam',
emptyValueFilter: 'emptyValueFilter',
customTerminologyPlurals: 'customTerminologyPlurals',
});

const MINOR_VERSION_SUPPORT = Object.freeze({
Expand All @@ -16,6 +17,7 @@ const MINOR_VERSION_SUPPORT = Object.freeze({
[FEATURES.orgUnitReplaceOuQueryParam]: 42,
[FEATURES.enrollmentStatusReplaceProgramStatusQueryParam]: 42,
[FEATURES.emptyValueFilter]: 42,
[FEATURES.customTerminologyPlurals]: 43,
});

export const hasAPISupportForFeature = (minorVersion: string | number, featureName: string) =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import i18n from '@dhis2/d2-i18n';

export function capitalizeFirstLetter(text: string) {
const first = text.charAt(0).toLocaleUpperCase();
const rest = text.slice(1);
return first + rest;
if (!text) return text;
const locale = (i18n as any).language ?? 'en';
try {
return text.charAt(0).toLocaleUpperCase(locale) + text.slice(1);
} catch {
return text.charAt(0).toUpperCase() + text.slice(1);
}
}
15 changes: 15 additions & 0 deletions src/core_modules/capture-core/HOC/withCustomLabels.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import * as React from 'react';
import { capitalizeFirstLetter } from 'capture-core-utils/string/capitalizeFirstLetter';
import { useTermLabel, type TermRequest } from '../metaData';

export const withCustomLabels =
(requests: ReadonlyArray<TermRequest>) =>
(InnerComponent: React.ComponentType<any>) =>
(props: any) => {
const { programId, stageId } = props;
const labels = useTermLabel(requests, { programId, stageId });
const capitalized = Object.fromEntries(
Object.entries(labels).map(([key, value]) => [key, capitalizeFirstLetter(value)]),
);
return <InnerComponent {...props} {...capitalized} />;
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import i18n from '@dhis2/d2-i18n';
import { useMemo } from 'react';
import { useSelector } from 'react-redux';
import { breadcrumbsKeys } from '../BulkDataEntryBreadcrumb';
import { LabelKeys, useTermLabel } from '../../../../metaData';

type Props = {
programId: string;
Expand All @@ -10,30 +11,35 @@ type Props = {
page: string;
};

const DefaultFilterLabels = {
default: i18n.t('Program overview'),
active: i18n.t('Active enrollments'),
complete: i18n.t('Completed enrollments'),
cancelled: i18n.t('Cancelled enrollments'),
};

const getWorkingListLabel = (selectedTemplate: any, selectedTemplateId: string) => {
const getWorkingListLabel = (
selectedTemplate: any,
selectedTemplateId: string,
defaultFilterLabels: Record<string, string>,
) => {
if (selectedTemplate && !selectedTemplate.isDefault) {
return selectedTemplate.name;
}
if (selectedTemplateId && !selectedTemplate) {
return DefaultFilterLabels[selectedTemplateId as keyof typeof DefaultFilterLabels];
return defaultFilterLabels[selectedTemplateId as keyof typeof defaultFilterLabels];
}
return i18n.t('Program overview');
};

export const useOriginLabel = ({ programId, displayFrontPageList, page }: Props) => {
const { enrollmentsLabel } = useTermLabel([LabelKeys.enrollmentPlural]);
const workingListTemplates = useSelector(({ workingListsTemplates }: any) => workingListsTemplates?.teiList);
const workingListProgramId = useSelector(({ workingListsContext }: any) => workingListsContext?.teiList?.programIdView);
const { selectedTemplateId, loading: isLoadingTemplates, templates } = workingListTemplates ?? {};
const selectedTemplate = templates?.find(({ id }: any) => id === selectedTemplateId);
const isSameProgram = workingListProgramId === programId;

const defaultFilterLabels = useMemo(() => ({
default: i18n.t('Program overview'),
active: i18n.t('Active {{enrollmentsLabel}}', { enrollmentsLabel }),
complete: i18n.t('Completed {{enrollmentsLabel}}', { enrollmentsLabel }),
cancelled: i18n.t('Cancelled {{enrollmentsLabel}}', { enrollmentsLabel }),
}), [enrollmentsLabel]);

const label = useMemo(() => {
if (page === breadcrumbsKeys.SEARCH_PAGE) {
return i18n.t('Search');
Expand All @@ -44,7 +50,7 @@ export const useOriginLabel = ({ programId, displayFrontPageList, page }: Props)
}

if (isSameProgram) {
return getWorkingListLabel(selectedTemplate, selectedTemplateId);
return getWorkingListLabel(selectedTemplate, selectedTemplateId, defaultFilterLabels);
}

if (!displayFrontPageList) {
Expand All @@ -58,6 +64,7 @@ export const useOriginLabel = ({ programId, displayFrontPageList, page }: Props)
selectedTemplate,
selectedTemplateId,
page,
defaultFilterLabels,
]);

return {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import React, { useCallback, useMemo, useState, ComponentType } from 'react';
import i18n from '@dhis2/d2-i18n';
import React, { useCallback, useMemo, useState, ComponentType } from 'react';
import { withStyles, WithStyles } from 'capture-core-utils/styles';
import { colors } from '@dhis2/ui';
import { LabelKeys, useTermLabel } from '../../../metaData';
import { DirectionalChevron } from '../../../utils/rtl';
import { useWorkingListLabel } from './hooks/useWorkingListLabel';
import { BreadcrumbItem } from '../common/BreadcrumbItem';
Expand Down Expand Up @@ -68,6 +69,10 @@ const BreadcrumbsPlain = ({
classes,
}: Props) => {
const [openWarning, setOpenWarning] = useState<WarningKey | null>(null);
const { enrollmentLabel, eventLabel } = useTermLabel(
[LabelKeys.enrollmentSingular, LabelKeys.eventSingular],
{ programId },
);

const { label } = useWorkingListLabel({
programId,
Expand Down Expand Up @@ -101,29 +106,29 @@ const BreadcrumbsPlain = ({
{
key: pageKeys.OVERVIEW,
onClick: () => handleNavigation(onBackToDashboard, pageKeys.OVERVIEW),
label: i18n.t('Enrollment dashboard'),
label: i18n.t('{{enrollmentLabel}} dashboard', { enrollmentLabel }),
selected: page === pageKeys.OVERVIEW,
condition: true,
},
{
key: pageKeys.VIEW_EVENT,
onClick: () => handleNavigation(onBackToViewEvent, pageKeys.VIEW_EVENT),
label: i18n.t('View event'),
label: i18n.t('View {{eventLabel}}', { eventLabel }),
selected: page === pageKeys.VIEW_EVENT,
condition: page === pageKeys.VIEW_EVENT ||
(page === pageKeys.EDIT_EVENT && !eventIsScheduled(eventStatus)),
},
{
key: pageKeys.EDIT_EVENT,
onClick: () => undefined,
label: i18n.t('Edit event'),
label: i18n.t('Edit {{eventLabel}}', { eventLabel }),
selected: page === pageKeys.EDIT_EVENT,
condition: page === pageKeys.EDIT_EVENT,
},
{
key: pageKeys.NEW_EVENT,
onClick: () => undefined,
label: i18n.t('New event'),
label: i18n.t('New {{eventLabel}}', { eventLabel }),
selected: page === pageKeys.NEW_EVENT,
condition: page === pageKeys.NEW_EVENT,
},
Expand All @@ -135,6 +140,8 @@ const BreadcrumbsPlain = ({
onBackToMainPage,
onBackToDashboard,
onBackToViewEvent,
enrollmentLabel,
eventLabel,
]);

return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import i18n from '@dhis2/d2-i18n';
import { useMemo } from 'react';
import { useSelector } from 'react-redux';
import { LabelKeys, useTermLabel } from '../../../../metaData';

type Template = {
id: string;
Expand All @@ -22,17 +23,11 @@ const DefaultFilterKeys = {

type DefaultFilterKey = typeof DefaultFilterKeys[keyof typeof DefaultFilterKeys];

const DefaultFilterLabels: { [key in DefaultFilterKey]: string } = {
[DefaultFilterKeys.DEFAULT]: i18n.t('Program overview'),
[DefaultFilterKeys.ACTIVE]: i18n.t('Active enrollments'),
[DefaultFilterKeys.COMPLETE]: i18n.t('Completed enrollments'),
[DefaultFilterKeys.CANCELLED]: i18n.t('Cancelled enrollments'),
};

export const useWorkingListLabel = ({
programId,
displayFrontPageList,
}: Props) => {
const { enrollmentsLabel } = useTermLabel([LabelKeys.enrollmentPlural], { programId });
const workingListTemplates = useSelector((state: any) => state.workingListsTemplates?.teiList);
const workingListProgramId = useSelector((state: any) => state.workingListsContext?.teiList?.programIdView);

Expand All @@ -41,6 +36,13 @@ export const useWorkingListLabel = ({
const selectedTemplate: Template | undefined = templates?.find(({ id }) => id === selectedTemplateId);
const isSameProgram: boolean = workingListProgramId === programId;

const defaultFilterLabels: { [key in DefaultFilterKey]: string } = useMemo(() => ({
[DefaultFilterKeys.DEFAULT]: i18n.t('Program overview'),
[DefaultFilterKeys.ACTIVE]: i18n.t('Active {{enrollmentsLabel}}', { enrollmentsLabel }),
[DefaultFilterKeys.COMPLETE]: i18n.t('Completed {{enrollmentsLabel}}', { enrollmentsLabel }),
[DefaultFilterKeys.CANCELLED]: i18n.t('Cancelled {{enrollmentsLabel}}', { enrollmentsLabel }),
}), [enrollmentsLabel]);

const label: string = useMemo(() => {
if (isLoadingTemplates) return i18n.t('Loading...');

Expand All @@ -51,7 +53,7 @@ export const useWorkingListLabel = ({

if (selectedTemplateId && !selectedTemplate &&
DefaultFilterKeys[selectedTemplateId.toUpperCase() as keyof typeof DefaultFilterKeys]) {
return DefaultFilterLabels[selectedTemplateId as DefaultFilterKey];
return defaultFilterLabels[selectedTemplateId as DefaultFilterKey];
}

return i18n.t('Program overview');
Expand All @@ -66,6 +68,7 @@ export const useWorkingListLabel = ({
isSameProgram,
selectedTemplate,
selectedTemplateId,
defaultFilterLabels,
]);

return {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import React, { ComponentType, useCallback, useMemo, useState } from 'react';
import i18n from '@dhis2/d2-i18n';
import React, { ComponentType, useCallback, useMemo, useState } from 'react';
import { colors } from '@dhis2/ui';
import { withStyles, WithStyles } from 'capture-core-utils/styles';
import { DirectionalChevron } from '../../../utils/rtl';
import { BreadcrumbItem } from '../common/BreadcrumbItem';
import { DiscardDialog } from '../../Dialogs/DiscardDialog.component';
import { defaultDialogProps } from '../../Dialogs/DiscardDialog.constants';
import { useWorkingListLabel } from './hooks/useWorkingListLabel';
import { LabelKeys, useTermLabel } from '../../../metaData';

export const pageKeys = {
MAIN_PAGE: 'mainPage',
Expand Down Expand Up @@ -43,6 +44,7 @@ const EventBreadcrumbPlain = ({
}: Props) => {
const [openWarning, setOpenWarning] = useState<PageKeys | null>(null);
const { label } = useWorkingListLabel({ programId });
const { eventLabel } = useTermLabel([LabelKeys.eventSingular], { programId });

const handleNavigation = useCallback((callback?: () => void, warningType?: PageKeys) => {
if (userInteractionInProgress && warningType) {
Expand Down Expand Up @@ -71,14 +73,14 @@ const EventBreadcrumbPlain = ({
{
key: pageKeys.VIEW_EVENT,
onClick: () => handleNavigation(onBackToViewEvent, pageKeys.VIEW_EVENT),
label: i18n.t('View event'),
label: i18n.t('View {{eventLabel}}', { eventLabel }),
selected: page === pageKeys.VIEW_EVENT,
condition: page === pageKeys.VIEW_EVENT || page === pageKeys.EDIT_EVENT,
},
{
key: pageKeys.EDIT_EVENT,
onClick: () => undefined,
label: i18n.t('Edit event'),
label: i18n.t('Edit {{eventLabel}}', { eventLabel }),
selected: page === pageKeys.EDIT_EVENT,
condition: page === pageKeys.EDIT_EVENT,
},
Expand All @@ -88,6 +90,7 @@ const EventBreadcrumbPlain = ({
onBackToViewEvent,
onBackToMainPage,
page,
eventLabel,
]);

return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useMemo } from 'react';
import i18n from '@dhis2/d2-i18n';
import { useSelector } from 'react-redux';
import { LabelKeys, useTermLabel } from '../../../../metaData';

type Template = {
id: string;
Expand All @@ -15,6 +16,7 @@ type Props = {
export const useWorkingListLabel = ({ programId }: Props) => {
const workingListTemplate = useSelector((state: any) => state.workingListsTemplates?.eventList);
const workingListProgramId = useSelector((state: any) => state.workingListsContext?.eventList?.programIdView);
const { eventLabel } = useTermLabel([LabelKeys.eventSingular], { programId });

const {
selectedTemplateId,
Expand All @@ -33,8 +35,8 @@ export const useWorkingListLabel = ({ programId }: Props) => {
return selectedTemplete.name;
}

return i18n.t('Event list');
}, [isDefaultTemplate, isSameProgram, loadingTemplates, selectedTemplete]);
return i18n.t('{{eventLabel}} list', { eventLabel });
}, [isDefaultTemplate, isSameProgram, loadingTemplates, selectedTemplete, eventLabel]);

return {
label: computedLabel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { availableCardListButtonState, enrollmentTypes } from './CardList.consta
import {
navigateToEnrollmentOverview,
} from '../../actions/navigateToEnrollmentOverview/navigateToEnrollmentOverview.actions';
import { useTermLabel, LabelKeys } from '../../metaData';

type Props = {
currentSearchScopeId?: string,
Expand Down Expand Up @@ -79,6 +80,7 @@ const CardListButtons: FC<Props> = ({
}) => {
const dispatch = useDispatch();
const navigationButtonsState: AvailableCardListButtonState = deriveNavigationButtonState(enrollmentType);
const { enrollmentLabel } = useTermLabel([LabelKeys.enrollmentSingular]);
const onHandleClick: ButtonEventHandler<React.MouseEvent<HTMLButtonElement>> = useCallback((_, event) => {
event.stopPropagation();

Expand Down Expand Up @@ -115,7 +117,7 @@ const CardListButtons: FC<Props> = ({
{
dataTest: 'view-active-enrollment-button',
onClick: onHandleClick,
label: i18n.t('View active enrollment'),
label: i18n.t('View active {{enrollmentLabel}}', { enrollmentLabel }),
hide: navigationButtonsState !== availableCardListButtonState.SHOW_VIEW_ACTIVE_ENROLLMENT_BUTTON,
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import {
getTrackerProgramThrowIfNotFound,
OptionSet,
type TrackerProgram,
useTermLabel,
LabelKeys,
} from '../../metaData';
import { useOrgUnitNameWithAncestors } from '../../metadataRetrieval/orgUnitName';
import type { ListItem, RenderCustomCardActions } from './CardList.types';
Expand Down Expand Up @@ -152,6 +154,10 @@ const CardListItemIndex = ({
const enrollmentType = deriveEnrollmentType(enrollments, currentProgramId);
const { orgUnitId, enrolledAt } = deriveEnrollmentOrgUnitIdAndDate(enrollments, enrollmentType, currentProgramId);
const { displayName: orgUnitName } = useOrgUnitNameWithAncestors(orgUnitId ?? null);
const { enrollmentLabel, orgUnitLabel } = useTermLabel(
[LabelKeys.enrollmentSingular, LabelKeys.orgUnitSingular],
{ programId: currentProgramId },
);
const program: TrackerProgram | undefined = enrollments.length
? deriveProgramFromEnrollment(enrollments, currentSearchScopeType)
: undefined;
Expand Down Expand Up @@ -217,11 +223,14 @@ const CardListItemIndex = ({

return (<>
<ListEntry
name={i18n.t('Organisation unit')}
name={i18n.t('{{orgUnitLabel}}', { orgUnitLabel })}
value={orgUnitName}
/>
<ListEntry
name={program?.enrollment?.enrollmentDateLabel ?? i18n.t('Date of enrollment')}
name={
program?.enrollment?.enrollmentDateLabel
?? i18n.t('Date of {{enrollmentLabel}}', { enrollmentLabel })
}
value={enrolledAt}
type={dataElementTypes.DATE}
/>
Expand Down
Loading
Loading