diff --git a/src/activity/preview/ActivityPreview.css b/src/activity/preview/ActivityPreview.css index 5d0672b..ff3a295 100644 --- a/src/activity/preview/ActivityPreview.css +++ b/src/activity/preview/ActivityPreview.css @@ -251,6 +251,59 @@ border: 1px solid #ebebeb; } +.me_disagg_table { + table-layout: fixed; +} + +.me_disagg_title { + text-align: left; + padding: 8px 10px; +} + +.me_disagg_header { + text-align: left; + padding: 8px 10px; + vertical-align: top; + line-height: 1.35; +} + +.me_disagg_cell { + padding: 8px 10px !important; + vertical-align: top; + line-height: 1.35; + word-break: break-word; + overflow-wrap: anywhere; +} + +.me_disagg_category_col { + width: 13%; +} + +.me_disagg_subcategory_col { + width: 13%; +} + +.me_disagg_value_col { + width: 25%; +} + +.me_disagg_actual_col { + width: 12%; +} + +.me_disagg_date_col { + width: 12%; + white-space: nowrap; +} + +.me_disagg_global_value { + min-height: 34px; +} + +.me_disagg_global_value_revised { + margin-top: 4px; +} + .two_box_table { border-top: 1px solid #ebebeb; border-bottom: 1px solid #ebebeb; diff --git a/src/activity/preview/sections/APME.jsx b/src/activity/preview/sections/APME.jsx index 6c31024..6c72ceb 100644 --- a/src/activity/preview/sections/APME.jsx +++ b/src/activity/preview/sections/APME.jsx @@ -30,10 +30,10 @@ class APME extends Component { return (
{buildSimpleField(`${ActivityConstants.INDICATORS}~${ActivityConstants.INDICATOR}`, true, null, false, indicator, null, { noTitle: true, fieldValueClass: styles.sector_title })} - {buildSimpleField(`${ActivityConstants.INDICATORS}~${ActivityConstants.LOG_FRAME}`, true, null, false, indicator, - null, { fieldClass: styles.noborder })} - {buildSimpleField(`${ActivityConstants.INDICATORS}~${ActivityConstants.RISK}`, true, null, false, indicator, - null, { fieldClass: styles.noborder })} + {/*{buildSimpleField(`${ActivityConstants.INDICATORS}~${ActivityConstants.LOG_FRAME}`, true, null, false, indicator,*/} + {/* null, { fieldClass: styles.noborder })}*/} + {/*{buildSimpleField(`${ActivityConstants.INDICATORS}~${ActivityConstants.RISK}`, true, null, false, indicator,*/} + {/* null, { fieldClass: styles.noborder })}*/}
{this.props.translate('Value Tracking')}
@@ -46,6 +46,10 @@ class APME extends Component { } _generateValueOrValuesTable(sectionName, value) { + // For the 'actual' section we may have multiple entries — render as a single structured table. + if (sectionName === ActivityConstants.CURRENT && Array.isArray(value) && value.length > 0) { + return this._generateActualsTable(value); + } return (
{Array.isArray(value) ? value.map(v => this._generateValueTable(sectionName, v)) @@ -53,6 +57,40 @@ class APME extends Component {
); } + _generateActualsTable(values) { + const { translate } = this.props; + const hasComment = values.some(v => v[ActivityConstants.INDICATOR_COMMENT]); + return ( + + + + + + {hasComment && } + + + + {values.map((v, idx) => ( + + + + {hasComment && ( + + )} + + ))} + +
{translate('Actual Date')}{translate('Actual Value')}{translate('Comment')}
+ {v[ActivityConstants.INDICATOR_DATE] || '\u2014'} + + {v[ActivityConstants.INDICATOR_VALUE] != null ? v[ActivityConstants.INDICATOR_VALUE] : '\u2014'} + + {v[ActivityConstants.INDICATOR_COMMENT] || '\u2014'} +
+ ); + } + _generateValueTable(sectionName, value) { if (!value) { return null; @@ -128,15 +166,24 @@ class APME extends Component { _renderGlobalValue(gv) { if (!gv) return null; - const { translate } = this.props; + // Display revised value if available, otherwise original (matching activity form behavior) + const value = gv[ActivityConstants.REVISED_VALUE] != null + ? gv[ActivityConstants.REVISED_VALUE] + : (gv[ActivityConstants.ORIGINAL_VALUE] != null ? gv[ActivityConstants.ORIGINAL_VALUE] : '—'); + + const valueDate = gv[ActivityConstants.REVISED_VALUE] != null + ? gv[ActivityConstants.REVISED_VALUE_DATE] + : gv[ActivityConstants.ORIGINAL_VALUE_DATE]; + + const display = [ + value, + valueDate ? `(${valueDate})` : null, + ].filter(Boolean).join(' '); + return ( - - {gv[ActivityConstants.ORIGINAL_VALUE] != null ? gv[ActivityConstants.ORIGINAL_VALUE] : '—'} - {gv[ActivityConstants.ORIGINAL_VALUE_DATE] ? ` (${gv[ActivityConstants.ORIGINAL_VALUE_DATE]})` : ''} - {gv[ActivityConstants.REVISED_VALUE] != null - ? ` / ${translate('Revised')}: ${gv[ActivityConstants.REVISED_VALUE]}` : ''} - {gv[ActivityConstants.REVISED_VALUE_DATE] ? ` (${gv[ActivityConstants.REVISED_VALUE_DATE]})` : ''} - +
+
{display}
+
); } @@ -180,37 +227,37 @@ class APME extends Component { }); return ( - - - - - - + + + + {rows.map((row, idx) => ( {row.isFirstGroupRow && ( - + )} {row.isFirstDvRow && ( - )} - - diff --git a/src/modules/field/FieldsManager.js b/src/modules/field/FieldsManager.js index 9c0d8db..3fb012c 100644 --- a/src/modules/field/FieldsManager.js +++ b/src/modules/field/FieldsManager.js @@ -165,40 +165,25 @@ export default class FieldsManager { return pList.find(itemList => itemList.field_name === pPart); } - let result; - let fieldsDef = this._fieldsDef; - if (fieldPath) { - let tmpDefinition; - let partToSearch; - let listDefinitions = fieldsDef; - const parts = fieldPath.split('~'); + if (!fieldPath) { + return undefined; + } - for (let i = 0; i < parts.length; i++) { - partToSearch = parts[i]; - tmpDefinition = _searchDefInList(listDefinitions, partToSearch); - if (tmpDefinition !== undefined) { - if (tmpDefinition.children !== undefined) { - if (parts[i + 1] !== undefined) { - partToSearch = parts[i + 1]; - listDefinitions = tmpDefinition.children; + const parts = fieldPath.split('~'); + let listDefinitions = this._fieldsDef; + let result; - tmpDefinition = _searchDefInList(listDefinitions, partToSearch); - if (tmpDefinition !== undefined) { - result = tmpDefinition; - i += 2; - } - } else { - result = tmpDefinition; - break; - } - } else { // It doesn't have children - result = tmpDefinition; - break; - } - } + for (let i = 0; i < parts.length; i++) { + const tmpDefinition = _searchDefInList(listDefinitions, parts[i]); + if (tmpDefinition === undefined) { + return undefined; + } + result = tmpDefinition; + if (tmpDefinition.children !== undefined && i + 1 < parts.length) { + listDefinitions = tmpDefinition.children; + } else { + break; } - } else { - fieldsDef = { children: fieldsDef }; // Deprecated?? } return result; }
+ {translate('Disaggregation Values')}
{translate('Category')}{translate('Sub-Category')}{translate('Actual Value')}{translate('Actual Date')}{translate('Category')}{translate('Sub-Category')}{translate('Actual Value')}{translate('Actual Date')}
{row.groupKey}{row.groupKey} + {row.dv[ActivityConstants.CHILD_CATEGORY_NAME] || '\u2014'} + {row.av && row.av[ActivityConstants.ORIGINAL_VALUE] != null ? row.av[ActivityConstants.ORIGINAL_VALUE] : '\u2014'} + {row.av && row.av[ActivityConstants.ORIGINAL_VALUE_DATE] ? row.av[ActivityConstants.ORIGINAL_VALUE_DATE] : '\u2014'}