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..28a4d24032b 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 @@ -374,6 +374,7 @@ const AddNewIndicatorModal: React.FC = (props) => { } })); + const hasDisagg = values.disaggregation && values.disaggregation.length > 0; const indicatorData = { name, description, @@ -382,18 +383,18 @@ const AddNewIndicatorModal: React.FC = (props) => { programId: programId ? programId : null, ascending, creationDate: creationDate ? formatDate(new Date(creationDate)) : null, - base: checkObjectIsNull(base) ? null : { + base: hasDisagg ? null : (checkObjectIsNull(base) ? null : { originalValue: base.originalValue ? lodash.toNumber(base.originalValue): null, originalValueDate: base.originalValueDate ? formatDate(base.originalValueDate) : null, revisedValue: base.revisedValue ? lodash.toNumber(base.revisedValue) : null, revisedValueDate: base.revisedValueDate ? formatDate(base.revisedValueDate) : null, - }, - target: checkObjectIsNull(target) ? null : { + }), + target: hasDisagg ? null : (checkObjectIsNull(target) ? null : { originalValue: target.originalValue ? lodash.toNumber(target.originalValue) : null, originalValueDate: target.originalValueDate ? formatDate(target.originalValueDate) : null, revisedValue: target.revisedValue ? lodash.toNumber(target.revisedValue) : null, revisedValueDate: target.revisedValueDate ? formatDate(target.revisedValueDate) : null, - }, + }), indicatorsCategory, outputId: values.outputId, outcomeId: values.outcomeId, @@ -407,7 +408,7 @@ const AddNewIndicatorModal: React.FC = (props) => { calculationMethod: values.calculationMethod, responsibleOrganizations: values.responsibleOrganizations, frequency: values.frequency, - disaggregationValues: formattedDisaggregationValues, + disaggregationValues: hasDisagg ? formattedDisaggregationValues : [], }; dispatch(createIndicator(indicatorData)); @@ -754,7 +755,7 @@ const AddNewIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.disaggregation && props.touched.disaggregation) && styles.text_is_invalid}`} classNamePrefix="select" - value={disaggregationOptions.filter(opt => props.values.disaggregation?.includes(opt.value))} + value={(props.values.disaggregation || []).map(id => disaggregationOptions.find(opt => opt.value === id)).filter(Boolean)} /> @@ -1107,6 +1108,15 @@ const AddNewIndicatorModal: React.FC = (props) => { {/* Value Tracking */}
{translations["amp.indicatormanager:value-tracking"]}
+ {props.values.disaggregation?.length > 0 && ( + + +
+ {translations["amp.indicatormanager:value-tracking-disabled-disaggregation"] || "Regular base/target values are disabled when disaggregation is active and will be cleared on save."} +
+ +
+ )}

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

@@ -1121,6 +1131,7 @@ const AddNewIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="base.originalValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.base?.originalValue && props.touched.base?.originalValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-original-value"]} /> @@ -1144,7 +1155,7 @@ const AddNewIndicatorModal: React.FC = (props) => { props.setFieldValue('base.originalValueDate', null); }} onBlur={props.handleBlur} - disabled={baseOriginalValueDateDisabled} + disabled={props.values.disaggregation?.length > 0 || baseOriginalValueDateDisabled} className={`${styles.input_field} ${(props.errors.base?.originalValueDate && props.touched.base?.originalValueDate) && styles.text_is_invalid}`}/> @@ -1162,6 +1173,7 @@ const AddNewIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="base.revisedValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.base?.revisedValue && props.touched.base?.revisedValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-revised-value"]} /> @@ -1185,6 +1197,7 @@ const AddNewIndicatorModal: React.FC = (props) => { }} onBlur={props.handleBlur} name="base.revisedValueDate" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.base?.revisedValueDate && props.touched.base?.revisedValueDate) && styles.text_is_invalid}`} /> @@ -1206,6 +1219,7 @@ const AddNewIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="target.originalValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.target?.originalValue && props.touched.target?.originalValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-target-value"]} /> @@ -1227,7 +1241,7 @@ const AddNewIndicatorModal: React.FC = (props) => { props.setFieldValue('target.originalValueDate', null); }} onBlur={props.handleBlur} - disabled={targetOriginalValueDateDisabled} + disabled={props.values.disaggregation?.length > 0 || targetOriginalValueDateDisabled} className={`${styles.input_field} ${(props.errors.target?.originalValueDate && props.touched.target?.originalValueDate) && styles.text_is_invalid}`} /> @@ -1245,6 +1259,7 @@ const AddNewIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="target.revisedValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.target?.revisedValue && props.touched.target?.revisedValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-revised-value"]} /> @@ -1268,6 +1283,7 @@ const AddNewIndicatorModal: React.FC = (props) => { }} onBlur={props.handleBlur} name="target.revisedValueDate" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.target?.revisedValueDate && props.touched.target?.revisedValueDate) && styles.text_is_invalid}`} /> 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 8930618fce6..e4eb987912d 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 @@ -469,6 +469,7 @@ const EditIndicatorModal: React.FC = (props) => { revisedValueDate: dv.target?.revisedValueDate ? formatDate(dv.target.revisedValueDate) : null, } })); + const hasDisagg = values.disaggregation && values.disaggregation.length > 0; const updatedIndicatorData = { id: indicator.id, name: values.name, @@ -488,21 +489,21 @@ const EditIndicatorModal: React.FC = (props) => { programId: values.programId ? values.programId: null, ascending: values.ascending, creationDate: values.creationDate && formatDate(values.creationDate), - base: checkObjectIsNull(values.base) ? null : { + base: hasDisagg ? null : (checkObjectIsNull(values.base) ? null : { originalValue: values.base.originalValue ? lodash.toNumber(values.base.originalValue) : null, originalValueDate: values.base.originalValueDate ? formatDate(values.base.originalValueDate) : null, revisedValue: values.base.revisedValue ? lodash.toNumber(values.base.revisedValue) : null, revisedValueDate: values.base.revisedValueDate ? formatDate(values.base.revisedValueDate) : null, - }, - target: checkObjectIsNull(values.target) ? null : { + }), + target: hasDisagg ? null : (checkObjectIsNull(values.target) ? null : { originalValue: values.target.originalValue ? lodash.toNumber(values.target.originalValue) : null, originalValueDate: values.target.originalValueDate ? formatDate(values.target.originalValueDate) : null, revisedValue: values.target.revisedValue ? lodash.toNumber(values.target.revisedValue) : null, revisedValueDate: values.target.revisedValueDate ? formatDate(values.target.revisedValueDate) : null, - }, + }), outcomeId: values.outcomeId, outputId: values.outputId, - disaggregationValues: formattedDisaggregationValues, + disaggregationValues: hasDisagg ? formattedDisaggregationValues : [], indicatorsCategory: indicator.indicatorsCategory || undefined, }; @@ -843,7 +844,7 @@ const EditIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} className={`basic-multi-select ${(props.errors.disaggregation && props.touched.disaggregation) && styles.text_is_invalid}`} classNamePrefix="select" - value={disaggregationOptions.filter(opt => props.values.disaggregation?.includes(opt.value))} + value={(props.values.disaggregation || []).map(id => disaggregationOptions.find(opt => opt.value === id)).filter(Boolean)} />
@@ -1208,6 +1209,15 @@ const EditIndicatorModal: React.FC = (props) => { {/* Value Tracking */}
{translations["amp.indicatormanager:value-tracking"]}
+ {props.values.disaggregation?.length > 0 && ( + + +
+ {translations["amp.indicatormanager:value-tracking-disabled-disaggregation"] || "Regular base/target values are disabled when disaggregation is active and will be cleared on save."} +
+ +
+ )}

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

@@ -1217,13 +1227,14 @@ const EditIndicatorModal: React.FC = (props) => { {translations['amp.indicatormanager:original-value']} + defaultValue={props.values.base?.originalValue} + onChange={props.handleChange} + onBlur={props.handleBlur} + name="base.originalValue" + type="number" + disabled={props.values.disaggregation?.length > 0} + className={`${styles.input_field} ${(props.errors.base?.originalValue && props.touched.base?.originalValue) && styles.text_is_invalid}`} + placeholder={translations["amp.indicatormanager:enter-original-value"]} /> {props.errors.base?.originalValue} @@ -1245,7 +1256,7 @@ const EditIndicatorModal: React.FC = (props) => { }} onBlur={props.handleBlur} name="base.originalValueDate" - disabled={baseOriginalValueDateDisabled} + disabled={props.values.disaggregation?.length > 0 || baseOriginalValueDateDisabled} className={`${styles.input_field} ${(props.errors.base?.originalValueDate && props.touched.base?.originalValueDate) && styles.text_is_invalid}`} id="baseOriginalValueDate" inputRef={baseOriginalValueDateRef} @@ -1266,6 +1277,7 @@ const EditIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="base.revisedValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.base?.revisedValue && props.touched.base?.revisedValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-revised-value"]} /> @@ -1289,6 +1301,7 @@ const EditIndicatorModal: React.FC = (props) => { }} onBlur={props.handleBlur} name="base.revisedValueDate" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.base?.revisedValueDate && props.touched.base?.revisedValueDate) && styles.text_is_invalid}`} id="baseRevisedValueDate" inputRef={baseRevisedValueDateRef} @@ -1312,6 +1325,7 @@ const EditIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="target.originalValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.target?.originalValue && props.touched.target?.originalValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-target-value"]} /> @@ -1332,7 +1346,7 @@ const EditIndicatorModal: React.FC = (props) => { onClear={() => { props.setFieldValue("target.originalValueDate", null); }} - disabled={targetOriginalValueDateDisabled} + disabled={props.values.disaggregation?.length > 0 || targetOriginalValueDateDisabled} onBlur={props.handleBlur} name="target.originalValueDate" className={`${styles.input_field} ${(props.errors.target?.originalValueDate && props.touched.target?.originalValueDate) && styles.text_is_invalid}`} @@ -1351,6 +1365,7 @@ const EditIndicatorModal: React.FC = (props) => { onBlur={props.handleBlur} name="target.revisedValue" type="number" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.target?.revisedValue && props.touched.target?.revisedValue) && styles.text_is_invalid}`} placeholder={translations["amp.indicatormanager:enter-revised-value"]} /> @@ -1374,6 +1389,7 @@ const EditIndicatorModal: React.FC = (props) => { }} onBlur={props.handleBlur} name="target.revisedValueDate" + disabled={props.values.disaggregation?.length > 0} className={`${styles.input_field} ${(props.errors.target?.revisedValueDate && props.touched.target?.revisedValueDate) && styles.text_is_invalid}`} id="targetRevisedValueDate" inputRef={targetRevisedValueDateRef} diff --git a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/config/initialTranslations.json b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/config/initialTranslations.json index bb2d9cc9864..19df53e1d08 100644 --- a/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/config/initialTranslations.json +++ b/amp/TEMPLATE/reampv2/packages/reampv2-app/src/modules/admin/indicator_manager/config/initialTranslations.json @@ -163,6 +163,7 @@ "amp.indicatormanager:indicator-type": "Indicator Type", "amp.indicatormanager:link-logframe": "Link to Logframe (Program Scheme)", "amp.indicatormanager:value-tracking": "Value Tracking", + "amp.indicatormanager:value-tracking-disabled-disaggregation": "Regular base/target values are disabled when disaggregation is active and will be cleared on save.", "amp.indicatormanager:other-considerations": "Other Considerations", "amp.indicatormanager:categorization-linkage-info": "Categorization and Linkage", "amp.indicatormanager:output": "Output", diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEFormSectionFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEFormSectionFeature.java index 140362042f7..afc6571ffdf 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEFormSectionFeature.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEFormSectionFeature.java @@ -127,4 +127,4 @@ public Integer getChoiceLevel(AmpIndicator choice) { add(UpdateEventBehavior.of(ProgramSelectedEvent.class)); add(searchIndicators); } -} +} \ No newline at end of file diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.html b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.html index d881223f476..0fc3e013053 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.html +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.html @@ -24,7 +24,7 @@
-
+
Base Values : diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.java index fead2905d84..0c96405d0a9 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/me/singlecountry/AmpMEItemFeaturePanel.java @@ -7,6 +7,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; @@ -97,15 +98,20 @@ public AmpMEItemFeaturePanel(String id, String fmName, final IModel() { + final boolean hasDisaggregation = indicator.getObject().getDisaggregation() != null + && !indicator.getObject().getDisaggregation().isEmpty(); + + WebMarkupContainer baseTargetContainer = new WebMarkupContainer("baseTargetContainer"); + baseTargetContainer.setVisible(!hasDisaggregation); + + baseTargetContainer.add(new Label("base", new LoadableDetachableModel() { @Override protected String load() { return globalBaseVal.getOriginalValue() != null ? String.valueOf(globalBaseVal.getOriginalValue()) : "N/A"; } - }); - add(indicatorBaseValueLabel); + })); - final Label indicatorBaseDateLabel = new Label("baseDate", new LoadableDetachableModel() { + baseTargetContainer.add(new Label("baseDate", new LoadableDetachableModel() { @Override protected String load() { if (globalBaseVal.getOriginalValueDate() != null) { @@ -115,18 +121,16 @@ protected String load() { return "N/A"; } } - }); - add(indicatorBaseDateLabel); + })); - final Label indicatorTargetValueLabel = new Label("target", new LoadableDetachableModel() { + baseTargetContainer.add(new Label("target", new LoadableDetachableModel() { @Override protected String load() { return globalTargetVal.getOriginalValue() != null ? String.valueOf(globalTargetVal.getOriginalValue()) : "N/A"; } - }); - add(indicatorTargetValueLabel); + })); - final Label indicatorTargetDateLabel = new Label("targetDate", new LoadableDetachableModel() { + baseTargetContainer.add(new Label("targetDate", new LoadableDetachableModel() { @Override protected String load() { if (globalTargetVal.getOriginalValueDate() != null) { @@ -136,10 +140,17 @@ protected String load() { return "N/A"; } } - }); - add(indicatorTargetDateLabel); + })); - AmpMEActualValuesFormTableFeaturePanel valuesTable = new AmpMEActualValuesFormTableFeaturePanel("valuesSubsection", indicator, conn, "Actual Values", false, 7); + add(baseTargetContainer); + AmpMEActualValuesFormTableFeaturePanel valuesTable = new AmpMEActualValuesFormTableFeaturePanel("valuesSubsection", indicator, conn, "Actual Values", false, 7) { + @Override + protected void onConfigure() { + super.onConfigure(); + if (isVisible()) setVisible(!hasDisaggregation); + } + }; + valuesTable.setOutputMarkupPlaceholderTag(true); add(valuesTable); AmpAjaxLinkField addActualValue = new AmpAjaxLinkField("addActualValue", "Add Actual Value", "Add Actual Value") { @@ -153,8 +164,15 @@ public void onClick(AjaxRequestTarget target) { target.add(valuesTable); target.appendJavaScript(QuarterInformationPanel.getJSUpdate(getSession())); } + + @Override + protected void onConfigure() { + super.onConfigure(); + if (isVisible()) setVisible(!hasDisaggregation); + } }; + addActualValue.setOutputMarkupPlaceholderTag(true); add(addActualValue); AmpAjaxLinkField setValue = new AmpAjaxLinkField("setValues", "Set Value", "Set Value") { @@ -191,10 +209,7 @@ protected void onClick(AjaxRequestTarget art) { AmpMEDisaggregationValuesFeaturePanel disaggPanel = new AmpMEDisaggregationValuesFeaturePanel("disaggregationValuesSubsection","Disaggregation Values", indicator); disaggPanel.setOutputMarkupId(true); disaggPanel.setOutputMarkupPlaceholderTag(true); - // Add disaggregation values subsection - if (indicator.getObject().getDisaggregation()== null || indicator.getObject().getDisaggregation().isEmpty()){ - disaggPanel.setVisible(false); - } + disaggPanel.setVisible(hasDisaggregation); add(disaggPanel); diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/models/AmpMEIndicatorSearchModel.java b/amp/src/main/java/org/dgfoundation/amp/onepager/models/AmpMEIndicatorSearchModel.java index aec1e7b63a2..2a3b9ba124c 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/models/AmpMEIndicatorSearchModel.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/models/AmpMEIndicatorSearchModel.java @@ -15,6 +15,7 @@ import java.util.*; import java.util.stream.Collectors; +import org.apache.log4j.Logger; /** * @author aartimon@dginternational.org @@ -31,6 +32,8 @@ public AmpMEIndicatorSearchModel(String input, String language, private static final long serialVersionUID = 8211300754918658832L; private Session session; + private static final Logger logger = Logger.getLogger(AmpMEIndicatorSearchModel.class); + public enum PARAM implements AmpAutoCompleteModelParam { ACTIVITY_PROGRAM @@ -49,7 +52,7 @@ protected Collection load() { Criteria crit = session.createCriteria(AmpIndicator.class); - Set ampActivityPrograms = (Set) getParam(PARAM.ACTIVITY_PROGRAM); + Set activityProgramThemeIds = toProgramThemeIds(getParam(PARAM.ACTIVITY_PROGRAM)); // Get activity location crit.setCacheable(false); @@ -62,28 +65,28 @@ protected Collection load() { if (maxResults != null && maxResults != 0) crit.setMaxResults(maxResults); ret = crit.list(); - // Re assign all indicators as filtered filterAmpIndicators = ret; // Check if the indicator filter by program is active boolean filterByProgram = FeaturesUtil.isVisibleModule(IndicatorManagerService.FILTER_BY_PROGRAM); - if(filterByProgram) { - // If not activity programs then do not return any indicator - if (ampActivityPrograms != null && !ampActivityPrograms.isEmpty()) { - Set programThemes = ampActivityPrograms.stream() - .map(AmpActivityProgram::getProgram) - .collect(Collectors.toSet()); - Set programThemesClone = new HashSet<>(programThemes); - // Check if program has siblings and add them to themes to get all indicators for objectives in a program - for (AmpTheme program : programThemes) { - if (program.getSiblings() != null) { - programThemesClone.addAll(program.getSiblings()); + + if (filterByProgram) { + if (activityProgramThemeIds != null && !activityProgramThemeIds.isEmpty()) { + // Include siblings (children in AMP hierarchy) via fresh session to avoid lazy-load issues + Set allProgramIds = new HashSet<>(activityProgramThemeIds); + for (Long themeId : activityProgramThemeIds) { + AmpTheme theme = session.get(AmpTheme.class, themeId); + if (theme != null && theme.getSiblings() != null) { + for (AmpTheme sibling : theme.getSiblings()) { + if (sibling.getAmpThemeId() != null) { + allProgramIds.add(sibling.getAmpThemeId()); + } + } } } - - filterAmpIndicators = ret.stream() - .filter(indicator -> programThemesClone.contains(indicator.getProgram())) + .filter(ind -> ind.getProgram() != null + && allProgramIds.contains(ind.getProgram().getAmpThemeId())) .collect(Collectors.toList()); } } @@ -94,4 +97,23 @@ protected Collection load() { } } + @SuppressWarnings("unchecked") + private static Set toProgramThemeIds(Object param) { + if (param == null) return Collections.emptySet(); + Set raw = (Set) param; + if (raw.isEmpty()) return Collections.emptySet(); + Object first = raw.iterator().next(); + if (first instanceof Long) { + return (Set) raw; + } + // Legacy: stale Wicket session still holds Set + Set ids = new HashSet<>(); + for (AmpActivityProgram ap : (Set) raw) { + if (ap.getProgram() != null && ap.getProgram().getAmpThemeId() != null) { + ids.add(ap.getProgram().getAmpThemeId()); + } + } + return ids; + } + } diff --git a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java index bad04679b80..e67ae5f76df 100644 --- a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java +++ b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java @@ -46,7 +46,7 @@ public class IndicatorManagerService { private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); - public static final String FILTER_BY_PROGRAM = "Filter By Program"; + public static final String FILTER_BY_PROGRAM = "Filter by Program"; public static final String FILTER_BY_SECTOR = "Filter By Sector"; diff --git a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java index 6264e3ea473..cc460beb867 100644 --- a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java +++ b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java @@ -109,7 +109,7 @@ public class SettingsConstants { put(YEAR_ALL, "All"); put(PROGRAM_SETTINGS, "Program Settings"); put(INDICATOR_FILTER_BY_SECTOR, "Filter By Sector"); - put(INDICATOR_FILTER_BY_PROGRAM, "Filter By Program"); + put(INDICATOR_FILTER_BY_PROGRAM, "Filter by Program"); put(NUMBER_OF_INDICATORS_IN_DASHBOARD, "Number of indicators in M&E Dashboard"); put(SORT_COLUMN, GlobalSettingsConstants.DEFAULT_RESOURCES_SORT_COLUMN); put(MAXIMUM_FILE_SIZE, GlobalSettingsConstants.CR_MAX_FILE_SIZE );