From 4874eac0e9dfb782c9dce307a51d8973297cea2c Mon Sep 17 00:00:00 2001 From: brianbrix Date: Sun, 31 May 2026 08:01:34 +0300 Subject: [PATCH 1/2] AMP-31135: Issue with Dissagregated values in activity form --- .../amp/onepager/util/ActivityUtil.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/util/ActivityUtil.java b/amp/src/main/java/org/dgfoundation/amp/onepager/util/ActivityUtil.java index bf316094a25..1c82c1dbe66 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/util/ActivityUtil.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/util/ActivityUtil.java @@ -300,8 +300,6 @@ public static AmpActivityVersion saveActivityNewVersion(AmpActivityVersion a, saveAnnualProjectBudgets(a, session); saveProjectCosts(a, session); saveStructures(a, session); - // Explicitly save indicator disaggregation values - saveIndicatorDisaggregationValues(a, session); if (createNewVersion) { if (a.getAmpActivityId() == null) session.save(a); @@ -1563,22 +1561,4 @@ public static Long calculateFundingDetailCheckSum(FundingInformationItem item) { return checkSum; } - private static void saveIndicatorDisaggregationValues(AmpActivityVersion a, Session session) { - Set indicators = a.getIndicators(); - if (indicators == null) return; - for (IndicatorActivity indicatorActivity : indicators) { - AmpIndicator indicator = indicatorActivity.getIndicator(); - if (indicator == null) continue; - Set disaggregationValues = indicator.getDisaggregationValues(); - if (disaggregationValues == null) continue; - for (AmpIndicatorDisaggregationValue value : disaggregationValues) { - value.setIndicator(indicator); - if (value.getId() == null) { - session.saveOrUpdate(value); - } else { - session.merge(value); - } - } - } - } } From d973c3c4ea7a5aa56fd53dad56f2f670e9266c68 Mon Sep 17 00:00:00 2001 From: brianbrix Date: Mon, 1 Jun 2026 09:54:23 +0300 Subject: [PATCH 2/2] AMP-31135: Issue with Dissagregated values in activity form --- .../components/modals/EditIndicatorModal.tsx | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/EditIndicatorModal.tsx b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/EditIndicatorModal.tsx index c0e6bed263b..50de3bd4ec8 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/EditIndicatorModal.tsx +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/EditIndicatorModal.tsx @@ -144,6 +144,37 @@ const EditIndicatorModal: React.FC = (props) => { return DateUtil.toISO8601(date, globalSettings['default-date-format']); }; + const resolveDisaggregationOrientation = ( + selectedDisaggregations: number[] = [], + disaggregationValues: any[] = [] + ) => { + const defaultOrientation = { + parentDisaggregationId: selectedDisaggregations[0], + childDisaggregationId: selectedDisaggregations[1], + }; + + if (selectedDisaggregations.length !== 2 || !Array.isArray(disaggregationValues) || disaggregationValues.length === 0) { + return defaultOrientation; + } + + const orientationFromValues = disaggregationValues.find((value: any) => ( + value?.parentDisaggregationId + && value?.childDisaggregationId + && selectedDisaggregations.includes(value.parentDisaggregationId) + && selectedDisaggregations.includes(value.childDisaggregationId) + && value.parentDisaggregationId !== value.childDisaggregationId + )); + + if (orientationFromValues) { + return { + parentDisaggregationId: orientationFromValues.parentDisaggregationId, + childDisaggregationId: orientationFromValues.childDisaggregationId, + }; + } + + return defaultOrientation; + }; + const formikRef = useRef>(null); const getCategories = () => { @@ -523,6 +554,11 @@ const EditIndicatorModal: React.FC = (props) => { }} > {(props) => { + const twoLevelOrientation = resolveDisaggregationOrientation( + props.values.disaggregation, + props.values.disaggregationValues || indicator?.disaggregationValues || [] + ); + // Fetch disaggregation children when disaggregation changes useEffect(() => { const selected = props.values.disaggregation; @@ -546,20 +582,25 @@ const EditIndicatorModal: React.FC = (props) => { return existing || { parentCategoryId: child.id, childCategoryId: null, + parentDisaggregationId: selected[0], base: { originalValue: '', originalValueDate: '', revisedValue: '', revisedValueDate: '' }, target: { originalValue: '', originalValueDate: '', revisedValue: '', revisedValueDate: '' } }; }); } else if (selected.length === 2) { // For double disaggregation, cross product of children - const parents = childrenMap[selected[0]] || []; - const children = childrenMap[selected[1]] || []; + const parentDisaggregationId = twoLevelOrientation.parentDisaggregationId; + const childDisaggregationId = twoLevelOrientation.childDisaggregationId; + const parents = childrenMap[parentDisaggregationId] || []; + const children = childrenMap[childDisaggregationId] || []; parents.forEach((parent: any) => { children.forEach((child: any) => { const existing = (props.values.disaggregationValues || []).find((v: any) => v.parentCategoryId === parent.id && v.childCategoryId === child.id); newDisaggValues.push(existing || { parentCategoryId: parent.id, childCategoryId: child.id, + parentDisaggregationId, + childDisaggregationId, base: { originalValue: '', originalValueDate: '', revisedValue: '', revisedValueDate: '' }, target: { originalValue: '', originalValueDate: '', revisedValue: '', revisedValueDate: '' } }); @@ -1026,7 +1067,7 @@ const EditIndicatorModal: React.FC = (props) => {
{t("amp.indicatormanager:disaggregation-values")}
- {disaggregationChildren[props.values.disaggregation[0]]?.map((parentChild: any, parentIdx: number) => ( + {disaggregationChildren[twoLevelOrientation.parentDisaggregationId]?.map((parentChild: any, parentIdx: number) => ( = (props) => { - {disaggregationChildren[props.values.disaggregation[1]]?.length > 0 ? ( + {disaggregationChildren[twoLevelOrientation.childDisaggregationId]?.length > 0 ? (
- {disaggregationChildren[props.values.disaggregation[1]].map((child: any) => { + {disaggregationChildren[twoLevelOrientation.childDisaggregationId].map((child: any) => { const disaggArr = Array.isArray(props.values.disaggregationValues) ? props.values.disaggregationValues : []; let entryIdx = disaggArr.findIndex((v: any) => v.parentCategoryId === parentChild.id && v.childCategoryId === child.id); let entry = entryIdx !== -1 ? disaggArr[entryIdx] : { parentCategoryId: parentChild.id, childCategoryId: child.id, + parentDisaggregationId: twoLevelOrientation.parentDisaggregationId, + childDisaggregationId: twoLevelOrientation.childDisaggregationId, base: { originalValue: '', originalValueDate: '', revisedValue: '', revisedValueDate: '' }, target: { originalValue: '', originalValueDate: '', revisedValue: '', revisedValueDate: '' } };