Skip to content

Commit d04f69e

Browse files
committed
AMP-31091: The disaggregation order doesnt match
AMP-31089: Disaggregated vs Regular Value Tracking values in the new Indicator Manager
1 parent 44d194b commit d04f69e

3 files changed

Lines changed: 56 additions & 23 deletions

File tree

amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/AddNewIndicatorModal.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
374374
}
375375
}));
376376

377+
const hasDisagg = values.disaggregation && values.disaggregation.length > 0;
377378
const indicatorData = {
378379
name,
379380
description,
@@ -382,18 +383,18 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
382383
programId: programId ? programId : null,
383384
ascending,
384385
creationDate: creationDate ? formatDate(new Date(creationDate)) : null,
385-
base: checkObjectIsNull(base) ? null : {
386+
base: hasDisagg ? null : (checkObjectIsNull(base) ? null : {
386387
originalValue: base.originalValue ? lodash.toNumber(base.originalValue): null,
387388
originalValueDate: base.originalValueDate ? formatDate(base.originalValueDate) : null,
388389
revisedValue: base.revisedValue ? lodash.toNumber(base.revisedValue) : null,
389390
revisedValueDate: base.revisedValueDate ? formatDate(base.revisedValueDate) : null,
390-
},
391-
target: checkObjectIsNull(target) ? null : {
391+
}),
392+
target: hasDisagg ? null : (checkObjectIsNull(target) ? null : {
392393
originalValue: target.originalValue ? lodash.toNumber(target.originalValue) : null,
393394
originalValueDate: target.originalValueDate ? formatDate(target.originalValueDate) : null,
394395
revisedValue: target.revisedValue ? lodash.toNumber(target.revisedValue) : null,
395396
revisedValueDate: target.revisedValueDate ? formatDate(target.revisedValueDate) : null,
396-
},
397+
}),
397398
indicatorsCategory,
398399
outputId: values.outputId,
399400
outcomeId: values.outcomeId,
@@ -407,7 +408,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
407408
calculationMethod: values.calculationMethod,
408409
responsibleOrganizations: values.responsibleOrganizations,
409410
frequency: values.frequency,
410-
disaggregationValues: formattedDisaggregationValues,
411+
disaggregationValues: hasDisagg ? formattedDisaggregationValues : [],
411412
};
412413

413414
dispatch(createIndicator(indicatorData));
@@ -754,7 +755,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
754755
onBlur={props.handleBlur}
755756
className={`basic-multi-select ${(props.errors.disaggregation && props.touched.disaggregation) && styles.text_is_invalid}`}
756757
classNamePrefix="select"
757-
value={disaggregationOptions.filter(opt => props.values.disaggregation?.includes(opt.value))}
758+
value={(props.values.disaggregation || []).map(id => disaggregationOptions.find(opt => opt.value === id)).filter(Boolean)}
758759
/>
759760
</Form.Group>
760761
</Row>
@@ -1107,6 +1108,15 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
11071108
{/* Value Tracking */}
11081109
<Row className={styles.view_row}><Col><h5 className={styles.sectionTitle}>{translations["amp.indicatormanager:value-tracking"]}</h5></Col></Row>
11091110
<div className={styles.sectionContainer}>
1111+
{props.values.disaggregation?.length > 0 && (
1112+
<Row className={styles.view_row}>
1113+
<Col>
1114+
<div style={{color: '#856404', background: '#fff3cd', border: '1px solid #ffc107', borderRadius: '4px', padding: '0.5rem 1rem', marginBottom: '0.5rem'}}>
1115+
{translations["amp.indicatormanager:value-tracking-disabled-disaggregation"] || "Regular base/target values are disabled when disaggregation is active and will be cleared on save."}
1116+
</div>
1117+
</Col>
1118+
</Row>
1119+
)}
11101120
<Form.Group as={Col}>
11111121
<Form.Label>
11121122
<h4>{translations["amp.indicatormanager:base-values"]}</h4>
@@ -1121,6 +1131,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
11211131
onBlur={props.handleBlur}
11221132
name="base.originalValue"
11231133
type="number"
1134+
disabled={props.values.disaggregation?.length > 0}
11241135
className={`${styles.input_field} ${(props.errors.base?.originalValue && props.touched.base?.originalValue) && styles.text_is_invalid}`}
11251136
placeholder={translations["amp.indicatormanager:enter-original-value"]} />
11261137

@@ -1144,7 +1155,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
11441155
props.setFieldValue('base.originalValueDate', null);
11451156
}}
11461157
onBlur={props.handleBlur}
1147-
disabled={baseOriginalValueDateDisabled}
1158+
disabled={props.values.disaggregation?.length > 0 || baseOriginalValueDateDisabled}
11481159
className={`${styles.input_field} ${(props.errors.base?.originalValueDate && props.touched.base?.originalValueDate) && styles.text_is_invalid}`}/>
11491160

11501161
<Form.Control.Feedback type="invalid" className={styles.text_is_invalid}>
@@ -1162,6 +1173,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
11621173
onBlur={props.handleBlur}
11631174
name="base.revisedValue"
11641175
type="number"
1176+
disabled={props.values.disaggregation?.length > 0}
11651177
className={`${styles.input_field} ${(props.errors.base?.revisedValue && props.touched.base?.revisedValue) && styles.text_is_invalid}`}
11661178
placeholder={translations["amp.indicatormanager:enter-revised-value"]} />
11671179

@@ -1185,6 +1197,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
11851197
}}
11861198
onBlur={props.handleBlur}
11871199
name="base.revisedValueDate"
1200+
disabled={props.values.disaggregation?.length > 0}
11881201
className={`${styles.input_field} ${(props.errors.base?.revisedValueDate && props.touched.base?.revisedValueDate) && styles.text_is_invalid}`}
11891202
/>
11901203

@@ -1206,6 +1219,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
12061219
onBlur={props.handleBlur}
12071220
name="target.originalValue"
12081221
type="number"
1222+
disabled={props.values.disaggregation?.length > 0}
12091223
className={`${styles.input_field} ${(props.errors.target?.originalValue && props.touched.target?.originalValue) && styles.text_is_invalid}`}
12101224
placeholder={translations["amp.indicatormanager:enter-target-value"]} />
12111225

@@ -1227,7 +1241,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
12271241
props.setFieldValue('target.originalValueDate', null);
12281242
}}
12291243
onBlur={props.handleBlur}
1230-
disabled={targetOriginalValueDateDisabled}
1244+
disabled={props.values.disaggregation?.length > 0 || targetOriginalValueDateDisabled}
12311245
className={`${styles.input_field} ${(props.errors.target?.originalValueDate && props.touched.target?.originalValueDate) && styles.text_is_invalid}`} />
12321246

12331247
<Form.Control.Feedback type="invalid" className={styles.text_is_invalid}>
@@ -1245,6 +1259,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
12451259
onBlur={props.handleBlur}
12461260
name="target.revisedValue"
12471261
type="number"
1262+
disabled={props.values.disaggregation?.length > 0}
12481263
className={`${styles.input_field} ${(props.errors.target?.revisedValue && props.touched.target?.revisedValue) && styles.text_is_invalid}`}
12491264
placeholder={translations["amp.indicatormanager:enter-revised-value"]} />
12501265

@@ -1268,6 +1283,7 @@ const AddNewIndicatorModal: React.FC<AddNewIndicatorModalProps> = (props) => {
12681283
}}
12691284
onBlur={props.handleBlur}
12701285
name="target.revisedValueDate"
1286+
disabled={props.values.disaggregation?.length > 0}
12711287
className={`${styles.input_field} ${(props.errors.target?.revisedValueDate && props.touched.target?.revisedValueDate) && styles.text_is_invalid}`}
12721288
/>
12731289

amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/components/modals/EditIndicatorModal.tsx

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
469469
revisedValueDate: dv.target?.revisedValueDate ? formatDate(dv.target.revisedValueDate) : null,
470470
}
471471
}));
472+
const hasDisagg = values.disaggregation && values.disaggregation.length > 0;
472473
const updatedIndicatorData = {
473474
id: indicator.id,
474475
name: values.name,
@@ -488,21 +489,21 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
488489
programId: values.programId ? values.programId: null,
489490
ascending: values.ascending,
490491
creationDate: values.creationDate && formatDate(values.creationDate),
491-
base: checkObjectIsNull(values.base) ? null : {
492+
base: hasDisagg ? null : (checkObjectIsNull(values.base) ? null : {
492493
originalValue: values.base.originalValue ? lodash.toNumber(values.base.originalValue) : null,
493494
originalValueDate: values.base.originalValueDate ? formatDate(values.base.originalValueDate) : null,
494495
revisedValue: values.base.revisedValue ? lodash.toNumber(values.base.revisedValue) : null,
495496
revisedValueDate: values.base.revisedValueDate ? formatDate(values.base.revisedValueDate) : null,
496-
},
497-
target: checkObjectIsNull(values.target) ? null : {
497+
}),
498+
target: hasDisagg ? null : (checkObjectIsNull(values.target) ? null : {
498499
originalValue: values.target.originalValue ? lodash.toNumber(values.target.originalValue) : null,
499500
originalValueDate: values.target.originalValueDate ? formatDate(values.target.originalValueDate) : null,
500501
revisedValue: values.target.revisedValue ? lodash.toNumber(values.target.revisedValue) : null,
501502
revisedValueDate: values.target.revisedValueDate ? formatDate(values.target.revisedValueDate) : null,
502-
},
503+
}),
503504
outcomeId: values.outcomeId,
504505
outputId: values.outputId,
505-
disaggregationValues: formattedDisaggregationValues,
506+
disaggregationValues: hasDisagg ? formattedDisaggregationValues : [],
506507
indicatorsCategory: indicator.indicatorsCategory || undefined,
507508
};
508509

@@ -843,7 +844,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
843844
onBlur={props.handleBlur}
844845
className={`basic-multi-select ${(props.errors.disaggregation && props.touched.disaggregation) && styles.text_is_invalid}`}
845846
classNamePrefix="select"
846-
value={disaggregationOptions.filter(opt => props.values.disaggregation?.includes(opt.value))}
847+
value={(props.values.disaggregation || []).map(id => disaggregationOptions.find(opt => opt.value === id)).filter(Boolean)}
847848
/>
848849
</Form.Group>
849850
</Row>
@@ -1208,6 +1209,15 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
12081209
{/* Value Tracking */}
12091210
<Row className={styles.view_row}><Col><h5 className={styles.sectionTitle}>{translations["amp.indicatormanager:value-tracking"]}</h5></Col></Row>
12101211
<div className={styles.sectionContainer}>
1212+
{props.values.disaggregation?.length > 0 && (
1213+
<Row className={styles.view_row}>
1214+
<Col>
1215+
<div style={{color: '#856404', background: '#fff3cd', border: '1px solid #ffc107', borderRadius: '4px', padding: '0.5rem 1rem', marginBottom: '0.5rem'}}>
1216+
{translations["amp.indicatormanager:value-tracking-disabled-disaggregation"] || "Regular base/target values are disabled when disaggregation is active and will be cleared on save."}
1217+
</div>
1218+
</Col>
1219+
</Row>
1220+
)}
12111221
<Form.Group as={Col}>
12121222
<Form.Label className={styles.view_one_item}>
12131223
<h4>{translations["amp.indicatormanager:base-values"]}</h4>
@@ -1217,13 +1227,14 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
12171227
<Form.Group className={styles.view_item}>
12181228
<Form.Label>{translations['amp.indicatormanager:original-value']}</Form.Label>
12191229
<Form.Control
1220-
defaultValue={props.values.base?.originalValue}
1221-
onChange={props.handleChange}
1222-
onBlur={props.handleBlur}
1223-
name="base.originalValue"
1224-
type="number"
1225-
className={`${styles.input_field} ${(props.errors.base?.originalValue && props.touched.base?.originalValue) && styles.text_is_invalid}`}
1226-
placeholder={translations["amp.indicatormanager:enter-original-value"]} />
1230+
defaultValue={props.values.base?.originalValue}
1231+
onChange={props.handleChange}
1232+
onBlur={props.handleBlur}
1233+
name="base.originalValue"
1234+
type="number"
1235+
disabled={props.values.disaggregation?.length > 0}
1236+
className={`${styles.input_field} ${(props.errors.base?.originalValue && props.touched.base?.originalValue) && styles.text_is_invalid}`}
1237+
placeholder={translations["amp.indicatormanager:enter-original-value"]} />
12271238

12281239
<Form.Control.Feedback type="invalid" className={styles.text_is_invalid}>
12291240
{props.errors.base?.originalValue}
@@ -1245,7 +1256,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
12451256
}}
12461257
onBlur={props.handleBlur}
12471258
name="base.originalValueDate"
1248-
disabled={baseOriginalValueDateDisabled}
1259+
disabled={props.values.disaggregation?.length > 0 || baseOriginalValueDateDisabled}
12491260
className={`${styles.input_field} ${(props.errors.base?.originalValueDate && props.touched.base?.originalValueDate) && styles.text_is_invalid}`}
12501261
id="baseOriginalValueDate"
12511262
inputRef={baseOriginalValueDateRef}
@@ -1266,6 +1277,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
12661277
onBlur={props.handleBlur}
12671278
name="base.revisedValue"
12681279
type="number"
1280+
disabled={props.values.disaggregation?.length > 0}
12691281
className={`${styles.input_field} ${(props.errors.base?.revisedValue && props.touched.base?.revisedValue) && styles.text_is_invalid}`}
12701282
placeholder={translations["amp.indicatormanager:enter-revised-value"]} />
12711283

@@ -1289,6 +1301,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
12891301
}}
12901302
onBlur={props.handleBlur}
12911303
name="base.revisedValueDate"
1304+
disabled={props.values.disaggregation?.length > 0}
12921305
className={`${styles.input_field} ${(props.errors.base?.revisedValueDate && props.touched.base?.revisedValueDate) && styles.text_is_invalid}`}
12931306
id="baseRevisedValueDate"
12941307
inputRef={baseRevisedValueDateRef}
@@ -1312,6 +1325,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
13121325
onBlur={props.handleBlur}
13131326
name="target.originalValue"
13141327
type="number"
1328+
disabled={props.values.disaggregation?.length > 0}
13151329
className={`${styles.input_field} ${(props.errors.target?.originalValue && props.touched.target?.originalValue) && styles.text_is_invalid}`}
13161330
placeholder={translations["amp.indicatormanager:enter-target-value"]} />
13171331

@@ -1332,7 +1346,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
13321346
onClear={() => {
13331347
props.setFieldValue("target.originalValueDate", null);
13341348
}}
1335-
disabled={targetOriginalValueDateDisabled}
1349+
disabled={props.values.disaggregation?.length > 0 || targetOriginalValueDateDisabled}
13361350
onBlur={props.handleBlur}
13371351
name="target.originalValueDate"
13381352
className={`${styles.input_field} ${(props.errors.target?.originalValueDate && props.touched.target?.originalValueDate) && styles.text_is_invalid}`}
@@ -1351,6 +1365,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
13511365
onBlur={props.handleBlur}
13521366
name="target.revisedValue"
13531367
type="number"
1368+
disabled={props.values.disaggregation?.length > 0}
13541369
className={`${styles.input_field} ${(props.errors.target?.revisedValue && props.touched.target?.revisedValue) && styles.text_is_invalid}`}
13551370
placeholder={translations["amp.indicatormanager:enter-revised-value"]} />
13561371

@@ -1374,6 +1389,7 @@ const EditIndicatorModal: React.FC<EditIndicatorModalProps> = (props) => {
13741389
}}
13751390
onBlur={props.handleBlur}
13761391
name="target.revisedValueDate"
1392+
disabled={props.values.disaggregation?.length > 0}
13771393
className={`${styles.input_field} ${(props.errors.target?.revisedValueDate && props.touched.target?.revisedValueDate) && styles.text_is_invalid}`}
13781394
id="targetRevisedValueDate"
13791395
inputRef={targetRevisedValueDateRef}

amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/config/initialTranslations.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
"amp.indicatormanager:indicator-type": "Indicator Type",
164164
"amp.indicatormanager:link-logframe": "Link to Logframe (Program Scheme)",
165165
"amp.indicatormanager:value-tracking": "Value Tracking",
166+
"amp.indicatormanager:value-tracking-disabled-disaggregation": "Regular base/target values are disabled when disaggregation is active and will be cleared on save.",
166167
"amp.indicatormanager:other-considerations": "Other Considerations",
167168
"amp.indicatormanager:categorization-linkage-info": "Categorization and Linkage",
168169
"amp.indicatormanager:output": "Output",

0 commit comments

Comments
 (0)