diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/DateInput.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/DateInput.tsx index 9986dff47ff..da236923f0d 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/DateInput.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/DateInput.tsx @@ -6,6 +6,7 @@ import { Value } from 'react-date-picker/dist/cjs/shared/types'; import 'react-date-picker/dist/DatePicker.css'; import './css/React-Calendar.css'; import './css/DateInput.css'; +import initialTranslations from '../config/initialTranslations.json'; export interface DateInputProps { id?: string; @@ -44,6 +45,7 @@ const DateInput: React.FC = (props) => { disableCalendar, translations } = props; + const t = (key: string): string => translations[key] ?? initialTranslations[key as keyof typeof initialTranslations] ?? key; const globalSettings: SettingsType = useSelector((state: any) => state.fetchSettingsReducer.settings); const [dateFormat, setDateFormat] = useState(); const [inputValue, setInputValue] = useState(value); @@ -97,9 +99,9 @@ const DateInput: React.FC = (props) => { = (props) => { defaultValue={defaultValue} disabled={disabled} clearIcon={clearIcon === null ? null : } - monthAriaLabel="Month" - dayAriaLabel="Day" - yearAriaLabel="Year" + monthAriaLabel={t("amp.indicatormanager:aria-month")} + dayAriaLabel={t("amp.indicatormanager:aria-day")} + yearAriaLabel={t("amp.indicatormanager:aria-year")} closeCalendar - clearAriaLabel="Clear Date" - calendarAriaLabel="Toggle Calendar" + clearAriaLabel={t("amp.indicatormanager:aria-clear-date")} + calendarAriaLabel={t("amp.indicatormanager:aria-toggle-calendar")} inputRef={inputRef} locale="en-US" disableCalendar={disableCalendar} diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/AddNewIndicatorModal.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/AddNewIndicatorModal.tsx index 9c8065cac4f..3dcf215280a 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/AddNewIndicatorModal.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/AddNewIndicatorModal.tsx @@ -19,6 +19,7 @@ import lodash from 'lodash'; import { getResponsibleOrgs } from '../../reducers/fetchResponsibleOrgsReducer'; import axios from 'axios'; import Accordion from 'react-bootstrap/Accordion'; +import initialTranslations from '../../config/initialTranslations.json'; const MySwal = withReactContent(Swal); @@ -74,10 +75,11 @@ interface IndicatorFormValues { const AddNewIndicatorModal: React.FC = (props) => { const { show, setShow, translations } = props; + const t = (key: string): string => translations[key] ?? initialTranslations[key as keyof typeof initialTranslations] ?? key; const ascendingOptions = [ - { value: true, label: translations["amp.indicatormanager:true"] }, - { value: false, label: translations["amp.indicatormanager:false"] } + { value: true, label: t("amp.indicatormanager:true") }, + { value: false, label: t("amp.indicatormanager:false") } ]; const nodeRef = useRef(null); @@ -246,7 +248,7 @@ const AddNewIndicatorModal: React.FC = (props) => { if (createIndicatorState.loading) { MySwal.fire({ icon: 'info', - title: `${translations["amp.indicatormanager:creating-indicator"]}...`, + title: `${t("amp.indicatormanager:creating-indicator")}...`, timer: 1000 }); return; @@ -254,10 +256,10 @@ const AddNewIndicatorModal: React.FC = (props) => { if (!createIndicatorState.loading && !createIndicatorState?.error && createIndicatorState?.createdIndicator?.id) { MySwal.fire({ - title: translations["amp.indicatormanager:success"], - text: translations["amp.indicatormanager:save-success"], + title: t("amp.indicatormanager:success"), + text: t("amp.indicatormanager:save-success"), icon: 'success', - confirmButtonText: translations["amp.indicatormanager:ok"], + confirmButtonText: t("amp.indicatormanager:ok"), }).then(() => { dispatch(getIndicators()); handleClose(); @@ -267,10 +269,10 @@ const AddNewIndicatorModal: React.FC = (props) => { if (createIndicatorState.error && !createIndicatorState.loading && !createIndicatorState.createdIndicator) { MySwal.fire({ - title: translations["amp.indicatormanager:error"], - text: createIndicatorState.loading ? translations["Error creating indicator"] : createIndicatorState.error, + title: t("amp.indicatormanager:error"), + text: createIndicatorState.loading ? t("Error creating indicator") : createIndicatorState.error, icon: 'error', - confirmButtonText: translations["amp.indicatormanager:ok"], + confirmButtonText: t("amp.indicatormanager:ok"), }); } @@ -339,7 +341,7 @@ const AddNewIndicatorModal: React.FC = (props) => { size='lg' > - {translations['amp.dashboard:add-new']} + {t('amp.dashboard:add-new')} = (props) => { const { name, description, code, sectors, programId, ascending, creationDate, base, target, indicatorsCategory } = values; if (selectedProgramSchemeId && !programId) { MySwal.fire({ - title: translations['amp.indicatormanager:error'], - text: translations['amp.indicatormanager:errors-program-is-required'], + title: t('amp.indicatormanager:error'), + text: t('amp.indicatormanager:errors-program-is-required'), icon: 'error', - confirmButtonText: translations['amp.indicatormanager:ok'], + confirmButtonText: t('amp.indicatormanager:ok'), }) return; @@ -512,11 +514,11 @@ const AddNewIndicatorModal: React.FC = (props) => {
{/* Core Indicator Information */} -
{translations["amp.indicatormanager:core-info"]}
+
{t("amp.indicatormanager:core-info")}
- {translations["amp.indicatormanager:indicator-name"]} + {t("amp.indicatormanager:indicator-name")} = (props) => { isInvalid={!!props.errors.name} required aria-required type="text" - placeholder={translations["amp.indicatormanager:enter-indicator-name"]} + placeholder={t("amp.indicatormanager:enter-indicator-name")} /> {props.errors.name && {props.errors.name}} - {translations["amp.indicatormanager:indicator-code"]} + {t("amp.indicatormanager:indicator-code")} = (props) => { required type="text" className={`${styles.input_field} ${(props.errors.code && props.touched.code) && styles.text_is_invalid}`} - placeholder={translations["amp.indicatormanager:enter-indicator-code"]} + placeholder={t("amp.indicatormanager:enter-indicator-code")} /> {props.errors.code && {props.errors.code}} @@ -549,7 +551,7 @@ const AddNewIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:indicator-description"]} + {t("amp.indicatormanager:indicator-description")} = (props) => { as="textarea" rows={2} className={`${styles.input_field} ${(props.errors.description && props.touched.description) && styles.text_is_invalid}`} - placeholder={translations["amp.indicatormanager:enter-indicator-description"]} + placeholder={t("amp.indicatormanager:enter-indicator-description")} /> {props.errors.description && {props.errors.description}} @@ -566,7 +568,7 @@ const AddNewIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:relevance-for-climate-change"]} + {t("amp.indicatormanager:relevance-for-climate-change")} = (props) => { as="textarea" rows={2} className={styles.input_field} - placeholder={translations["amp.indicatormanager:relevance-for-climate-change"]} + placeholder={t("amp.indicatormanager:relevance-for-climate-change")} /> - {translations["amp.indicatormanager:type"]} + {t("amp.indicatormanager:type")} ({ value: outcome.id, label: outcome.name }))} @@ -611,11 +614,12 @@ const AddNewIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.outcomeId && props.touched.outcomeId) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-outcome")} value={allOutcomes.find(outcome => outcome.id === selectedOutcomeId) ? { value: selectedOutcomeId, label: allOutcomes.find(outcome => outcome.id === selectedOutcomeId)?.name } : null} /> - {translations["amp.indicatormanager:output"]} + {t("amp.indicatormanager:output")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${styles.input_field}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-program-scheme")} /> {programFieldVisible && ( - {translations["amp.indicatormanager:programs"]} + {t("amp.indicatormanager:programs")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.sectors && props.touched.sectors) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-sectors")} />
{/* Data Definition and Sourcing */} -
{translations["amp.indicatormanager:data-definition-sourcing-info"] || "Data Definition and Sourcing"}
+
{t("amp.indicatormanager:data-definition-sourcing-info")}
- {translations["amp.indicatormanager:data"]} + {t("amp.indicatormanager:data")} - {translations["amp.indicatormanager:data-source"]} + {t("amp.indicatormanager:data-source")} - {translations["amp.indicatormanager:unit-of-measure"]} + {t("amp.indicatormanager:unit-of-measure")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.disaggregation && props.touched.disaggregation) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-disaggregation")} value={disaggregationOptions.filter(opt => props.values.disaggregation?.includes(opt.value))} /> @@ -763,7 +773,7 @@ const AddNewIndicatorModal: React.FC = (props) => {
-
{translations["amp.indicatormanager:disaggregation-values"]}
+
{t("amp.indicatormanager:disaggregation-values")}
{props.values.disaggregation.map((parentId, parentIdx) => ( @@ -772,7 +782,7 @@ const AddNewIndicatorModal: React.FC = (props) => { eventKey={String(parentIdx)} className={styles.accordionHeader} style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', background: '#f7f7f7', fontWeight: 'bold' }} - aria-label={translations["amp.indicatormanager:click-to-expand-collapse"]} + aria-label={t("amp.indicatormanager:click-to-expand-collapse")} >
{disaggregationOptions.find(opt => opt.value === parentId)?.label || `Disaggregation ${parentId}`} @@ -801,95 +811,95 @@ const AddNewIndicatorModal: React.FC = (props) => { {child.value}
-
{translations["amp.indicatormanager:base-values"]}
+
{t("amp.indicatormanager:base-values")}
- {translations["amp.indicatormanager:original-value"]} + {t("amp.indicatormanager:original-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'originalValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-original-value"]} + aria-label={t("amp.indicatormanager:base-original-value")} disabled={false} /> - {translations["amp.indicatormanager:original-value-date"]} + {t("amp.indicatormanager:original-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'originalValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-original-value-date"]} + aria-label={t("amp.indicatormanager:base-original-value-date")} disabled={false} /> - {translations["amp.indicatormanager:revised-value"]} + {t("amp.indicatormanager:revised-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'revisedValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-revised-value"]} + aria-label={t("amp.indicatormanager:base-revised-value")} disabled={false} /> - {translations["amp.indicatormanager:revised-value-date"]} + {t("amp.indicatormanager:revised-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'revisedValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-revised-value-date"]} + aria-label={t("amp.indicatormanager:base-revised-value-date")} disabled={false} />
-
{translations["amp.indicatormanager:target-values"]}
+
{t("amp.indicatormanager:target-values")}
- {translations["amp.indicatormanager:original-value"]} + {t("amp.indicatormanager:original-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'originalValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-original-value"]} + aria-label={t("amp.indicatormanager:target-original-value")} disabled={false} /> - {translations["amp.indicatormanager:original-value-date"]} + {t("amp.indicatormanager:original-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'originalValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-original-value-date"]} + aria-label={t("amp.indicatormanager:target-original-value-date")} disabled={false} /> - {translations["amp.indicatormanager:revised-value"]} + {t("amp.indicatormanager:revised-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'revisedValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-revised-value"]} + aria-label={t("amp.indicatormanager:target-revised-value")} disabled={false} /> - {translations["amp.indicatormanager:revised-value-date"]} + {t("amp.indicatormanager:revised-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'revisedValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-revised-value-date"]} + aria-label={t("amp.indicatormanager:target-revised-value-date")} disabled={false} /> @@ -902,7 +912,7 @@ const AddNewIndicatorModal: React.FC = (props) => {
) : (
- {translations["amp.indicatormanager:no-disaggregation-children"]} + {t("amp.indicatormanager:no-disaggregation-children")}
)} @@ -918,7 +928,7 @@ const AddNewIndicatorModal: React.FC = (props) => {
-
{translations["amp.indicatormanager:disaggregation-values"]}
+
{t("amp.indicatormanager:disaggregation-values")}
{disaggregationChildren[props.values.disaggregation[0]]?.map((parentChild: any, parentIdx: number) => ( @@ -927,7 +937,7 @@ const AddNewIndicatorModal: React.FC = (props) => { eventKey={String(parentIdx)} className={styles.accordionHeader} style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', background: '#f7f7f7', fontWeight: 'bold' }} - aria-label={translations["amp.indicatormanager:click-to-expand-collapse"]} + aria-label={t("amp.indicatormanager:click-to-expand-collapse")} >
{parentChild.value} @@ -955,95 +965,95 @@ const AddNewIndicatorModal: React.FC = (props) => { {child.value}
-
{translations["amp.indicatormanager:base-values"]}
+
{t("amp.indicatormanager:base-values")}
- {translations["amp.indicatormanager:original-value"]} + {t("amp.indicatormanager:original-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'originalValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-original-value"]} + aria-label={t("amp.indicatormanager:base-original-value")} disabled={false} /> - {translations["amp.indicatormanager:original-value-date"]} + {t("amp.indicatormanager:original-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'originalValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-original-value-date"]} + aria-label={t("amp.indicatormanager:base-original-value-date")} disabled={false} /> - {translations["amp.indicatormanager:revised-value"]} + {t("amp.indicatormanager:revised-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'revisedValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-revised-value"]} + aria-label={t("amp.indicatormanager:base-revised-value")} disabled={false} /> - {translations["amp.indicatormanager:revised-value-date"]} + {t("amp.indicatormanager:revised-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['base', 'revisedValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-base-revised-value-date"]} + aria-label={t("amp.indicatormanager:base-revised-value-date")} disabled={false} />
-
{translations["amp.indicatormanager:target-values"]}
+
{t("amp.indicatormanager:target-values")}
- {translations["amp.indicatormanager:original-value"]} + {t("amp.indicatormanager:original-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'originalValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-original-value"]} + aria-label={t("amp.indicatormanager:target-original-value")} disabled={false} /> - {translations["amp.indicatormanager:original-value-date"]} + {t("amp.indicatormanager:original-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'originalValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-original-value-date"]} + aria-label={t("amp.indicatormanager:target-original-value-date")} disabled={false} /> - {translations["amp.indicatormanager:revised-value"]} + {t("amp.indicatormanager:revised-value")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'revisedValue'], e.target.value)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-revised-value"]} + aria-label={t("amp.indicatormanager:target-revised-value")} disabled={false} /> - {translations["amp.indicatormanager:revised-value-date"]} + {t("amp.indicatormanager:revised-value-date")} updateDisaggregationField(entryIdx === -1 ? disaggArr.length : entryIdx, ['target', 'revisedValueDate'], val)} className={styles.input_field} - aria-label={translations["amp.indicatormanager:aria-target-revised-value-date"]} + aria-label={t("amp.indicatormanager:target-revised-value-date")} disabled={false} /> @@ -1056,7 +1066,7 @@ const AddNewIndicatorModal: React.FC = (props) => {
) : (
- {translations["amp.indicatormanager:no-disaggregation-children"]} + {t("amp.indicatormanager:no-disaggregation-children")}
)} @@ -1070,11 +1080,11 @@ const AddNewIndicatorModal: React.FC = (props) => { )}
{/* Responsibility and Frequency */} -
{translations["amp.indicatormanager:responsibility-frequency-info"]}
+
{t("amp.indicatormanager:responsibility-frequency-info")}
- {translations["amp.indicatormanager:responsible-organizations"]} + {t("amp.indicatormanager:responsible-organizations")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.frequency && props.touched.frequency) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-frequency")} value={frequencyOptions.find(opt => opt.value === props.values.frequency) || null} />
{/* Value Tracking */} -
{translations["amp.indicatormanager:value-tracking"]}
+
{t("amp.indicatormanager:value-tracking")}
-

{translations["amp.indicatormanager:base-values"]}

+

{t("amp.indicatormanager:base-values")}

{/* Original Value and Date in one row */} - {translations['amp.indicatormanager:original-value']} + {t('amp.indicatormanager:original-value')} = (props) => { name="base.originalValue" type="number" className={`${styles.input_field} ${(props.errors.base?.originalValue && props.touched.base?.originalValue) && styles.text_is_invalid}`} - placeholder={translations["amp.indicatormanager:enter-original-value"]} /> + placeholder={t("amp.indicatormanager:enter-original-value")} /> {props.errors.base?.originalValue} @@ -1130,7 +1142,7 @@ const AddNewIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:original-value-date"]} + {t("amp.indicatormanager:original-value-date")} = (props) => { {/* Revised Value and Date in one row */} - {translations["amp.indicatormanager:revised-value"]} + {t("amp.indicatormanager:revised-value")} = (props) => { name="base.revisedValue" type="number" className={`${styles.input_field} ${(props.errors.base?.revisedValue && props.touched.base?.revisedValue) && styles.text_is_invalid}`} - placeholder={translations["amp.indicatormanager:enter-revised-value"]} /> + placeholder={t("amp.indicatormanager:enter-revised-value")} /> {props.errors.base?.revisedValue} @@ -1171,7 +1183,7 @@ const AddNewIndicatorModal: React.FC = (props) => { - {translations['amp.indicatormanager:revised-value-date']} + {t('amp.indicatormanager:revised-value-date')} = (props) => { -

{translations["amp.indicatormanager:target-values"]}

+

{t("amp.indicatormanager:target-values")}

{/* Original Value and Date in one row */} - {translations["amp.indicatormanager:target-value"]} + {t("amp.indicatormanager:target-value")} = (props) => { name="target.originalValue" type="number" className={`${styles.input_field} ${(props.errors.target?.originalValue && props.touched.target?.originalValue) && styles.text_is_invalid}`} - placeholder={translations["amp.indicatormanager:enter-target-value"]} /> + placeholder={t("amp.indicatormanager:enter-target-value")} /> {props.errors.target?.originalValue} - {translations["amp.indicatormanager:target-value-date"]} + {t("amp.indicatormanager:target-value-date")} = (props) => { {/* Revised Value and Date in one row */} - {translations["amp.indicatormanager:revised-value"]} + {t("amp.indicatormanager:revised-value")} = (props) => { name="target.revisedValue" type="number" className={`${styles.input_field} ${(props.errors.target?.revisedValue && props.touched.target?.revisedValue) && styles.text_is_invalid}`} - placeholder={translations["amp.indicatormanager:enter-revised-value"]} /> + placeholder={t("amp.indicatormanager:enter-revised-value")} /> {props.errors.target?.revisedValue} @@ -1254,7 +1266,7 @@ const AddNewIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:revised-value-date"]} + {t("amp.indicatormanager:revised-value-date")} = (props) => { {/* Other Considerations */} -
Other Considerations
+
{t("amp.indicatormanager:other-considerations")}
- {translations["amp.indicatormanager:ascending"]} + {t("amp.indicatormanager:ascending")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.indicatorType && props.touched.indicatorType) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-indicator-type")} value={indicatorTypeOptions.find(opt => opt.value === props.values.indicatorType) || null} />
{/* Categorization and Linkage */} -
{translations["amp.indicatormanager:categorization-linkage-info"] || "Categorization and Linkage"}
+
{t("amp.indicatormanager:categorization-linkage-info")}
- {translations["amp.indicatormanager:outcome"]} + {t("amp.indicatormanager:outcome")} ({ value: output.id, label: output.name }))} @@ -705,6 +709,7 @@ const EditIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.outputId && props.touched.outputId) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-output")} value={filteredOutputs.find(output => output.id === props.values.outputId) ? { value: props.values.outputId, label: filteredOutputs.find(output => output.id === props.values.outputId)?.name } : null} isDisabled={!selectedOutcomeId} /> @@ -712,7 +717,7 @@ const EditIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:link-logframe"]} + {t("amp.indicatormanager:link-logframe")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${styles.input_field} ${(props.errors.programId && props.touched.programId) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-program")} defaultValue={defaultProgram} /> @@ -751,7 +758,7 @@ const EditIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:sectors"]} + {t("amp.indicatormanager:sectors")} = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.unitOfMeasure && props.touched.unitOfMeasure) && styles.text_is_invalid}`} classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-unit-of-measure")} value={unitOfMeasureOptions.find(opt => opt.value === props.values.unitOfMeasure) || null} /> - {translations["amp.indicatormanager:calculation-method"]} + {t("amp.indicatormanager:calculation-method")} = (props) => { name="calculationMethod" type="text" className={styles.input_field} - placeholder={translations["amp.indicatormanager:calculation-method-placeholder"]} + placeholder={t("amp.indicatormanager:calculation-method-placeholder")} /> - {translations["amp.indicatormanager:disaggregation"]} + {t("amp.indicatormanager:disaggregation")} = (props) => { }} onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.responsibleOrganizations && props.touched.responsibleOrganizations) && styles.text_is_invalid}`} - classNamePrefix="select" - value={responsibleOrgOptions.filter(opt => props.values.responsibleOrganizations?.includes(opt.value))} + classNamePrefix="select" + placeholder={t("amp.indicatormanager:select-responsible-organizations")} + value={responsibleOrgOptions.filter(opt => props.values.responsibleOrganizations?.includes(opt.value))} /> - {translations["amp.indicatormanager:frequency"]} + {t("amp.indicatormanager:frequency")} = (props) => { }} defaultValue={{ value: false, - label: translations["amp.indicatormanager:true"] + label: t("amp.indicatormanager:true") }} /> @@ -1412,7 +1424,7 @@ const EditIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:table-header-creation-date"]} + {t("amp.indicatormanager:table-header-creation-date")} = (props) => { diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutcomeModal.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutcomeModal.tsx index 81eeefb3068..05d09490b42 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutcomeModal.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutcomeModal.tsx @@ -3,6 +3,7 @@ import { Modal, Button, Form, Row, Col } from 'react-bootstrap'; import { Formik, FormikProps, Form as FormikForm, Field } from 'formik'; import * as Yup from 'yup'; import styles from './css/IndicatorModal.module.css'; +import initialTranslations from '../../config/initialTranslations.json'; interface AddNewOutcomeModalProps { show: boolean; @@ -15,8 +16,9 @@ interface AddNewOutcomeModalProps { const OutcomeModal: React.FC = ({ show, setShow, onSubmit, initialName = '', initialDescription = '', translations = {} }) => { const nodeRef = useRef(null); + const t = (key: string): string => translations[key] ?? initialTranslations[key as keyof typeof initialTranslations] ?? key; const validationSchema = Yup.object().shape({ - name: Yup.string().required(translations['amp.outcomeoutput:errors-name-required'] || 'Name is required'), + name: Yup.string().required(t('amp.outcomeoutput:errors-name-required')), description: Yup.string() }); @@ -40,7 +42,7 @@ const OutcomeModal: React.FC = ({ show, setShow, onSubm size='lg' > - {translations['amp.outcomeoutput:modal-title-outcome'] || 'Add New Outcome'} + {t('amp.outcomeoutput:add-new-outcome')} = ({ show, setShow, onSubm
- {translations['amp.outcomeoutput:outcome-name'] || 'Outcome Name'} + {t('amp.outcomeoutput:outcome-name')} = ({ show, setShow, onSubm isInvalid={!!props.errors.name} required aria-required type="text" - placeholder={translations['amp.outcomeoutput:outcome-name'] || 'Outcome Name'} + placeholder={t('amp.outcomeoutput:outcome-name')} /> {props.errors.name} @@ -77,7 +79,7 @@ const OutcomeModal: React.FC = ({ show, setShow, onSubm - {translations['amp.outcomeoutput:outcome-description'] || 'Outcome Description'} + {t('amp.outcomeoutput:outcome-description')} = ({ show, setShow, onSubm name="description" type="text" className={`${styles.input_field} ${(props.errors.description && props.touched.description) && styles.text_is_invalid}`} - placeholder={translations['amp.outcomeoutput:outcome-description'] || 'Outcome Description'} + placeholder={t('amp.outcomeoutput:outcome-description')} /> {props.errors.description} @@ -96,10 +98,10 @@ const OutcomeModal: React.FC = ({ show, setShow, onSubm diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutputModal.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutputModal.tsx index 187b249ca74..488eeecf847 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutputModal.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/OutputModal.tsx @@ -3,6 +3,7 @@ import { Modal, Button, Form, Row, Col } from 'react-bootstrap'; import { Formik, FormikProps } from 'formik'; import * as Yup from 'yup'; import styles from './css/IndicatorModal.module.css'; +import initialTranslations from '../../config/initialTranslations.json'; interface Outcome { id: number; @@ -31,12 +32,13 @@ const OutputModal: React.FC = ({ loading = false }) => { const nodeRef = useRef(null); + const t = (key: string): string => translations[key] ?? initialTranslations[key as keyof typeof initialTranslations] ?? key; // Only render if selectedOutcome is provided if (!selectedOutcome) return null; const validationSchema = Yup.object().shape({ - name: Yup.string().required(translations['amp.outcomeoutput:errors-name-required'] || 'Name is required'), + name: Yup.string().required(t('amp.outcomeoutput:errors-name-required')), description: Yup.string(), outcomeId: Yup.number().required('Outcome is required') }); @@ -62,7 +64,7 @@ const OutputModal: React.FC = ({ size='lg' > - {translations['amp.outcomeoutput:modal-title-output'] || 'Add New Output'} + {t('amp.outcomeoutput:add-new-output')} = ({
- {translations['amp.outcomeoutput:output-name'] || 'Output Name'} + {t('amp.outcomeoutput:output-name')} = ({ isInvalid={!!props.errors.name} required aria-required type="text" - placeholder={translations['amp.outcomeoutput:output-name'] || 'Output Name'} + placeholder={t('amp.outcomeoutput:output-name')} /> {props.errors.name} @@ -99,7 +101,7 @@ const OutputModal: React.FC = ({ - {translations['amp.outcomeoutput:output-description'] || 'Output Description'} + {t('amp.outcomeoutput:output-description')} = ({ name="description" type="text" className={`${styles.input_field} ${(props.errors.description && props.touched.description) && styles.text_is_invalid}`} - placeholder={translations['amp.outcomeoutput:output-description'] || 'Output Description'} + placeholder={t('amp.outcomeoutput:output-description')} /> {props.errors.description} @@ -116,7 +118,7 @@ const OutputModal: React.FC = ({ - {translations['amp.outcomeoutput:linked-outcome'] || 'Linked Outcome'} + {t('amp.outcomeoutput:linked-outcome')} = ({ diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/ViewIndicatorModal.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/ViewIndicatorModal.tsx index e732221555a..71aea2c1eb8 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/ViewIndicatorModal.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/ViewIndicatorModal.tsx @@ -5,6 +5,7 @@ import backdropStyles from './css/IndicatorModal.module.css'; import styles from './css/ViewIndicatorModal.module.css'; import { DefaultComponentProps, IndicatorObjectType, ProgramObjectType, SectorObjectType } from '../../types'; import { useSelector } from 'react-redux'; +import initialTranslations from '../../config/initialTranslations.json'; interface ViewIndicatorModalProps extends DefaultComponentProps { show: boolean; @@ -14,6 +15,7 @@ interface ViewIndicatorModalProps extends DefaultComponentProps { const ViewIndicatorModal: React.FC = (props) => { const { show, setShow, indicator, translations } = props; + const t = (key: string): string => translations[key] ?? initialTranslations[key as keyof typeof initialTranslations] ?? key; const sectorsReducer = useSelector((state: any) => state.fetchSectorsReducer); const programsReducer = useSelector((state: any) => state.fetchProgramsReducer); const categoriesReducer = useSelector((state: any) => state.fetchAmpCategoryReducer); @@ -39,29 +41,29 @@ const ViewIndicatorModal: React.FC = (props) => { // Helper functions for lookups const getCategoryLabel = (id: number | undefined) => { - if (!id) return translations["amp.indicatormanager:no-data"]; + if (!id) return t("amp.indicatormanager:no-data"); const found = categoriesReducer.categories.find((cat: any) => cat.id === id); return found ? found.value : id; }; const getOutcomeLabel = (id: number | undefined) => { - if (!id) return translations["amp.indicatormanager:no-data"]; + if (!id) return t("amp.indicatormanager:no-data"); const found = outcomesReducer.outcomes.find((o: any) => o.id === id); return found ? found.name : id; }; const getOutputLabel = (id: number | undefined) => { - if (!id) return translations["amp.indicatormanager:no-data"]; + if (!id) return t("amp.indicatormanager:no-data"); const found = outputsReducer.outputs.find((o: any) => o.id === id); return found ? found.name : id; }; const getResponsibleOrgLabels = (ids: number[] = []) => { - if (!ids.length) return [translations["amp.indicatormanager:no-data"]]; + if (!ids.length) return [t("amp.indicatormanager:no-data")]; return ids.map(id => { const found = responsibleOrgsReducer.options.find((org: any) => org.value === id); return found ? found.label : id; }); }; const getProgramLabel = (id: number | null) => { - if (!id) return translations["amp.indicatormanager:no-data"]; + if (!id) return t("amp.indicatormanager:no-data"); const found = programsReducer.programs.find((p: any) => p.id === id); return found ? found.name : id; }; @@ -80,7 +82,7 @@ const ViewIndicatorModal: React.FC = (props) => { - {translations["amp.indicatormanager:view-indicator"]} + {t("amp.indicatormanager:view-indicator")} {indicator ? @@ -90,24 +92,24 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:core-info"] || "Core Indicator Information"} + {t("amp.indicatormanager:core-info")}

-
{translations["amp.indicatormanager:indicator-name"]}
+
{t("amp.indicatormanager:indicator-name")}
{indicator.name}
-
{translations["amp.indicatormanager:indicator-code"]}
+
{t("amp.indicatormanager:indicator-code")}
{indicator.code}
-
{translations["amp.indicatormanager:indicator-description"]}
+
{t("amp.indicatormanager:indicator-description")}
{indicator.description === "" || !indicator.description ? - {translations["amp.indicatormanager:no-description-available"]} : + {t("amp.indicatormanager:no-description-available")} : indicator.description }
@@ -115,11 +117,11 @@ const ViewIndicatorModal: React.FC = (props) => {
-
{translations["amp.indicatormanager:relevance-for-climate-change"]}
-
{indicator.relevanceForClimateChange || {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:relevance-for-climate-change")}
+
{indicator.relevanceForClimateChange || {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:type"] || "Type"}
+
{t("amp.indicatormanager:type")}
{getCategoryLabel(indicator.indicatorType)}
@@ -129,27 +131,27 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:categorization-linkage-info"] || "Categorization and Linkage"} + {t("amp.indicatormanager:categorization-linkage-info")}

-
{translations["amp.indicatormanager:outcome"]}
+
{t("amp.indicatormanager:outcome")}
{getOutcomeLabel(indicator.outcomeId)}
-
{translations["amp.indicatormanager:output"]}
+
{t("amp.indicatormanager:output")}
{getOutputLabel(indicator.outputId)}
-
{translations["amp.indicatormanager:logframe-links"] || "Link to Logframe (Program)"}
+
{t("amp.indicatormanager:logframe-links")}
{getProgramLabel(indicator.programId)}
-
{translations["amp.indicatormanager:sectors"]}
+
{t("amp.indicatormanager:sectors")}
{sectorData.length > 0 ? (
    @@ -158,7 +160,7 @@ const ViewIndicatorModal: React.FC = (props) => { ))}
) : ( - {translations["amp.indicatormanager:no-data"]} + {t("amp.indicatormanager:no-data")} )}
@@ -169,21 +171,21 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:data"] || "Data Definition and Sourcing"} + {t("amp.indicatormanager:data")}

-
{translations["amp.indicatormanager:data"]}
-
{indicator.data || {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:data")}
+
{indicator.data || {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:data-source"]}
-
{indicator.dataSource || {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:data-source")}
+
{indicator.dataSource || {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:disaggregation"]}
+
{t("amp.indicatormanager:disaggregation")}
{indicator.disaggregation && indicator.disaggregation.length > 0 ? (
    @@ -192,19 +194,19 @@ const ViewIndicatorModal: React.FC = (props) => { ))}
) : ( - {translations["amp.indicatormanager:no-data"]} + {t("amp.indicatormanager:no-data")} )}
-
{translations["amp.indicatormanager:unit-of-measure"]}
+
{t("amp.indicatormanager:unit-of-measure")}
{getCategoryLabel(indicator.unitOfMeasure)}
-
{translations["amp.indicatormanager:calculation-method"]}
-
{indicator.calculationMethod || {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:calculation-method")}
+
{indicator.calculationMethod || {t("amp.indicatormanager:no-data")}}
@@ -213,11 +215,11 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:disaggregation-values"] || "Disaggregation Values"} + {t("amp.indicatormanager:disaggregation-values")}

-
{translations["amp.indicatormanager:disaggregation-values"] || "Disaggregation Values"}
+
{t("amp.indicatormanager:disaggregation-values")}
{indicator.disaggregationValues && indicator.disaggregationValues.length > 0 ? (
@@ -243,21 +245,21 @@ const ViewIndicatorModal: React.FC = (props) => { {/* Parent disaggregation label for first column */} - {parentIds.length > 0 ? getCategoryLabel(parentGroups[parentIds[0]][0].parentDisaggregationId) : translations["amp.indicatormanager:no-parent-category"] || "No Parent"} + {parentIds.length > 0 ? getCategoryLabel(parentGroups[parentIds[0]][0].parentDisaggregationId) : t("amp.indicatormanager:no-parent-category")} {parentIds.map(parentId => { const children = getChildren(parentId); if (children.length > 0) { return ( - {getCategoryLabel(parentId) || translations["amp.indicatormanager:no-parent-category"] || "No Parent"} + {getCategoryLabel(parentId) || t("amp.indicatormanager:no-parent-category")} ); } else { // No children, colSpan=2 return ( - {getCategoryLabel(parentId) || translations["amp.indicatormanager:no-parent-category"] || "No Parent"} + {getCategoryLabel(parentId) || t("amp.indicatormanager:no-parent-category")} ); } @@ -270,7 +272,7 @@ const ViewIndicatorModal: React.FC = (props) => { {/* Child category label for first column */} {parentIds.length > 0 && getChildren(parentIds[0]).length > 0 ? getCategoryLabel(parentGroups[parentIds[0]][0].childDisaggregationId) - : translations["amp.indicatormanager:no-child-category"] || "No Child"} + : t("amp.indicatormanager:no-child-category")} {parentIds.map(parentId => { const children = getChildren(parentId); @@ -299,17 +301,17 @@ const ViewIndicatorModal: React.FC = (props) => { if (children.length > 0) { return children.map(child => [ -
{translations["amp.indicatormanager:value"] || "Value"}
+
{t("amp.indicatormanager:value")}
, -
{translations["amp.indicatormanager:date"] || "Date"}
+
{t("amp.indicatormanager:date")}
]); } else { // No children, just Value/Date return [ - {translations["amp.indicatormanager:value"] || "Value"}, - {translations["amp.indicatormanager:date"] || "Date"} + {t("amp.indicatormanager:value")}, + {t("amp.indicatormanager:date")} ]; } })} @@ -318,7 +320,7 @@ const ViewIndicatorModal: React.FC = (props) => { {/* Original Base Value */} - {translations["amp.indicatormanager:original-base-value"] || "Original Base Value"} + {t("amp.indicatormanager:original-base-value")} {parentIds.map(parentId => { const children = getChildren(parentId); if (children.length > 0) { @@ -338,7 +340,7 @@ const ViewIndicatorModal: React.FC = (props) => { {/* Revised Base Value */} - {translations["amp.indicatormanager:revised-base-value"] || "Revised Base Value"} + {t("amp.indicatormanager:revised-base-value")} {parentIds.map(parentId => { const children = getChildren(parentId); if (children.length > 0) { @@ -357,7 +359,7 @@ const ViewIndicatorModal: React.FC = (props) => { {/* Original Target Value */} - {translations["amp.indicatormanager:original-target-value"] || "Original Target Value"} + {t("amp.indicatormanager:original-target-value")} {parentIds.map(parentId => { const children = getChildren(parentId); if (children.length > 0) { @@ -376,7 +378,7 @@ const ViewIndicatorModal: React.FC = (props) => { {/* Revised Target Value */} - {translations["amp.indicatormanager:revised-target-value"] || "Revised Target Value"} + {t("amp.indicatormanager:revised-target-value")} {parentIds.map(parentId => { const children = getChildren(parentId); if (children.length > 0) { @@ -399,7 +401,7 @@ const ViewIndicatorModal: React.FC = (props) => { })()}
) : ( -
{translations["amp.indicatormanager:no-disaggregation-values"] || "No Disaggregation Values"}
+
{t("amp.indicatormanager:no-disaggregation-values")}
)}
@@ -410,11 +412,11 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:responsibility-frequency-info"] || "Responsibility and Frequency"} + {t("amp.indicatormanager:responsibility-frequency-info")}

-
{translations["amp.indicatormanager:responsible-organizations"]}
+
{t("amp.indicatormanager:responsible-organizations")}
{indicator.responsibleOrganizations && indicator.responsibleOrganizations.length > 0 ? (
    @@ -423,12 +425,12 @@ const ViewIndicatorModal: React.FC = (props) => { ))}
) : ( - {translations["amp.indicatormanager:no-data"]} + {t("amp.indicatormanager:no-data")} )}
-
{translations["amp.indicatormanager:frequency"]}
+
{t("amp.indicatormanager:frequency")}
{getCategoryLabel(indicator.frequency)}
@@ -438,51 +440,51 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:value-tracking"] || "Value Tracking"} + {t("amp.indicatormanager:value-tracking")}

- {translations["amp.indicatormanager:base-values"]} + {t("amp.indicatormanager:base-values")}
-
{translations["amp.indicatormanager:original-base-value"]}
-
{indicator.base?.originalValue ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:original-base-value")}
+
{indicator.base?.originalValue ?? {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:original-value-date"]}
-
{indicator.base?.originalValueDate ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:original-value-date")}
+
{indicator.base?.originalValueDate ?? {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:revised-value"]}
-
{indicator.base?.revisedValue ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:revised-value")}
+
{indicator.base?.revisedValue ?? {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:revised-value-date"]}
-
{indicator.base?.revisedValueDate ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:revised-value-date")}
+
{indicator.base?.revisedValueDate ?? {t("amp.indicatormanager:no-data")}}
- {translations["amp.indicatormanager:target-values"]} + {t("amp.indicatormanager:target-values")}
-
{translations["amp.indicatormanager:target-value"]}
-
{indicator.target?.originalValue ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:target-value")}
+
{indicator.target?.originalValue ?? {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:target-value-date"]}
-
{indicator.target?.originalValueDate ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:target-value-date")}
+
{indicator.target?.originalValueDate ?? {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:revised-value"]}
-
{indicator.target?.revisedValue ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:revised-value")}
+
{indicator.target?.revisedValue ?? {t("amp.indicatormanager:no-data")}}
-
{translations["amp.indicatormanager:revised-value-date"]}
-
{indicator.target?.revisedValueDate ?? {translations["amp.indicatormanager:no-data"]}}
+
{t("amp.indicatormanager:revised-value-date")}
+
{indicator.target?.revisedValueDate ?? {t("amp.indicatormanager:no-data")}}
@@ -492,18 +494,18 @@ const ViewIndicatorModal: React.FC = (props) => {

- {translations["amp.indicatormanager:other-considerations"] || "Other Considerations"} + {t("amp.indicatormanager:other-considerations")}

-
{translations["amp.indicatormanager:table-header-creation-date"]}
+
{t("amp.indicatormanager:table-header-creation-date")}
{indicator.creationDate}
-
{translations["amp.indicatormanager:ascending"]}
+
{t("amp.indicatormanager:ascending")}
- {indicator.ascending ? translations["amp.indicatormanager:yes"] : translations["amp.indicatormanager:no"]} + {indicator.ascending ? t("amp.indicatormanager:yes") : t("amp.indicatormanager:no")}
@@ -514,7 +516,7 @@ const ViewIndicatorModal: React.FC = (props) => {
-

{translations["amp.indicatormanager:view-error"]}

+

{t("amp.indicatormanager:view-error")}

} diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/table/Table.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/table/Table.tsx index e8ca2846223..46ef98ebe87 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/table/Table.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/table/Table.tsx @@ -26,6 +26,7 @@ import { setSizePerPage} from '../../reducers/fetchIndicatorsReducer'; import Select from "react-select"; import {formatProgramSchemeToSelect} from "../../utils/helpers"; import { useNavigate } from 'react-router-dom'; +import initialTranslations from '../../config/initialTranslations.json'; interface SkeletonTableProps extends DefaultComponentProps { columns: any; @@ -84,6 +85,7 @@ const SkeletonTable: React.FC = (props) => { filterByProgram, programs } = props; + const t = (key: string): string => translations[key] ?? initialTranslations[key as keyof typeof initialTranslations] ?? key; const dispatch = useDispatch(); const programSchemeReducer = useSelector((state: any) => state.fetchProgramsReducer); const sectorsReducer = useSelector((state: any) => state.fetchSectorsReducer); @@ -105,29 +107,29 @@ const SkeletonTable: React.FC = (props) => { const [showAddNewIndicatorModal, setShowAddNewIndicatorModal] = useState(false); const [programOptions, setProgramOptions] = useState([ { - label: translations['amp.indicatormanager:all-programs'], + label: t('amp.indicatormanager:all-programs'), options: [{ value: 0, - label: translations['amp.indicatormanager:all-programs'] + label: t('amp.indicatormanager:all-programs') }] } ]); const [sectorOptions, setSectorOptions] = useState([{ value: 0, - label: translations['amp.indicatormanager:all-sectors'] + label: t('amp.indicatormanager:all-sectors') }]); const [outcomeOptions, setOutcomeOptions] = useState([{ value: 0, - label: translations['amp.indicatormanager:all-outcomes'] + label: t('amp.indicatormanager:all-outcomes') }]); const [outputOptions, setOutputOptions] = useState([{ value: 0, - label: translations['amp.indicatormanager:all-outputs'] + label: t('amp.indicatormanager:all-outputs') }]); const [indicatorTypeOptions, setIndicatorTypeOptions] = useState([{ value: 0, - label: translations['amp.indicatormanager:all-indicator-types'] + label: t('amp.indicatormanager:all-indicator-types') }]); const showAddNewIndicatorModalHandler = () => { @@ -152,7 +154,7 @@ const SkeletonTable: React.FC = (props) => { value: outcome.id, label: outcome.name, })); - setOutcomeOptions([{ value: 0, label: translations['amp.indicatormanager:all-outcomes'] }, ...formattedOutcomes]); + setOutcomeOptions([{ value: 0, label: t('amp.indicatormanager:all-outcomes') }, ...formattedOutcomes]); } if (outputsReducer && outputsReducer.outputs) { @@ -160,7 +162,7 @@ const SkeletonTable: React.FC = (props) => { value: output.id, label: output.name, })); - setOutputOptions([{ value: 0, label: translations['amp.indicatormanager:all-outputs'] }, ...formattedOutputs]); + setOutputOptions([{ value: 0, label: t('amp.indicatormanager:all-outputs') }, ...formattedOutputs]); } // Set indicator type options from Redux @@ -169,7 +171,7 @@ const SkeletonTable: React.FC = (props) => { value: indicatorType.id, label: indicatorType.value, })); - setIndicatorTypeOptions([{ value: 0, label: translations['amp.indicatormanager:all-indicator-types'] }, ...formattedIndicatorTypes]); + setIndicatorTypeOptions([{ value: 0, label: t('amp.indicatormanager:all-indicator-types') }, ...formattedIndicatorTypes]); } }, [sectors, programConfiguration, translations]); @@ -200,18 +202,18 @@ const SkeletonTable: React.FC = (props) => { value: 100, }, { - text: translations['amp.indicatormanager:all'], + text: t('amp.indicatormanager:all'), value: data.length, } ], - firstPageText: translations['amp.indicatormanager:first'], - prePageText: translations['amp.indicatormanager:previous'], - nextPageText: translations['amp.indicatormanager:next'], - lastPageText: translations['amp.indicatormanager:last'], - nextPageTitle: translations['amp.indicatormanager:next-page'], - prePageTitle: translations['amp.indicatormanager:pre-page'], - firstPageTitle: translations['amp.indicatormanager:first-page'], - lastPageTitle: translations['amp.indicatormanager:last-page'], + firstPageText: t('amp.indicatormanager:first'), + prePageText: t('amp.indicatormanager:previous'), + nextPageText: t('amp.indicatormanager:next'), + lastPageText: t('amp.indicatormanager:last'), + nextPageTitle: t('amp.indicatormanager:next-page'), + prePageTitle: t('amp.indicatormanager:pre-page'), + firstPageTitle: t('amp.indicatormanager:first-page'), + lastPageTitle: t('amp.indicatormanager:last-page'), showTotal: true, sizePerPage: sizePerPage, hidePageListOnlyOnePage: true, @@ -298,7 +300,7 @@ const SkeletonTable: React.FC = (props) => { > {' '} - {translations['amp.dashboard:add-new']} + {t('amp.dashboard:add-new')} = (props) => { > {' '} - {translations['amp.indicatormanager:export-csv']} + {t('amp.indicatormanager:export-csv')}
@@ -335,11 +337,11 @@ const SkeletonTable: React.FC = (props) => {
- {translations['amp.indicatormanager:search']} + {t('amp.indicatormanager:search')}
@@ -350,7 +352,7 @@ const SkeletonTable: React.FC = (props) => {
-
{translations['amp.indicatormanager:filters'] || 'Filters'}
+
{t('amp.indicatormanager:filters')}
@@ -358,11 +360,11 @@ const SkeletonTable: React.FC = (props) => { {filterBySector && (
- {translations['amp.indicatormanager:sectors']} + {t('amp.indicatormanager:sectors')} {sectorsReducer.sectors.length > 0 ? ( null }} className={styles.filter_select} @@ -386,12 +388,12 @@ const SkeletonTable: React.FC = (props) => { {filterByProgram && (
- {translations['amp.indicatormanager:programs']} + {t('amp.indicatormanager:programs')} {programOptions.length > 0 ? ( null }} className={styles.filter_select} @@ -414,9 +416,10 @@ const SkeletonTable: React.FC = (props) => {
- {translations['amp.indicatormanager:outcome']} + {t('amp.indicatormanager:outcome')} setSelectedOutput(opt?.value || 0)} className={styles.filter_select} components={{ IndicatorSeparator: () => null }} @@ -442,9 +446,10 @@ const SkeletonTable: React.FC = (props) => {
- {translations['amp.indicatormanager:indicator-type']} + {t('amp.indicatormanager:indicator-type')}