diff --git a/amp/TEMPLATE/ampTemplate/css_2/amp-wicket.css b/amp/TEMPLATE/ampTemplate/css_2/amp-wicket.css index 93297562f54..9b7a269a099 100644 --- a/amp/TEMPLATE/ampTemplate/css_2/amp-wicket.css +++ b/amp/TEMPLATE/ampTemplate/css_2/amp-wicket.css @@ -684,4 +684,14 @@ input[disabled], select[disabled]{ .top-padding-10 { padding-top: 10px; +} +.save-gray-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); /* Black background with opacity */ + z-index: 1000; /* Ensure it's above other elements */ + display: none; /* Hidden by default */ } \ No newline at end of file diff --git a/amp/WEB-INF/applicationContext.xml b/amp/WEB-INF/applicationContext.xml index 8d61be1cbf1..b8717993df1 100644 --- a/amp/WEB-INF/applicationContext.xml +++ b/amp/WEB-INF/applicationContext.xml @@ -15,6 +15,9 @@ + + + diff --git a/amp/WEB-INF/src/hibernate.cfg.xml b/amp/WEB-INF/src/hibernate.cfg.xml index f77bfa2d6ce..6e1b5418576 100644 --- a/amp/WEB-INF/src/hibernate.cfg.xml +++ b/amp/WEB-INF/src/hibernate.cfg.xml @@ -23,7 +23,7 @@ true true true 1, false 0, yes 'Y', no 'N' - update + update allow diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java b/amp/WEB-INF/src/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java index 3bd8204e5e9..6e4ad6c2ef3 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java @@ -10,6 +10,9 @@ import org.hibernate.Session; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; @@ -73,12 +76,14 @@ private Pair, List> loadCachedTranslations( for (int i = 0; i < contents.size(); i += BATCH_SIZE) { List batchContents = contents.subList(i, Math.min(i + BATCH_SIZE, contents.size())); - translations.addAll(PersistenceManager.getSession() - .createCriteria(MachineTranslation.class) - .add(Restrictions.eq("sourceLanguage", srcLang)) - .add(Restrictions.eq("targetLanguage", destLang)) - .add(Restrictions.in("text", batchContents)) - .list()); + Session session = PersistenceManager.getRequestDBSession(); + CriteriaBuilder builder = session.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(MachineTranslation.class); + Root root = criteriaQuery.from(MachineTranslation.class); + criteriaQuery.select(root).where(builder.equal(root.get("sourceLanguage"), srcLang),builder.equal(root.get("targetLanguage"), destLang), + builder.equal(root.get("text"), batchContents)); + + translations.addAll(session.createQuery(criteriaQuery).list()); } return translations.stream().map(o -> ((MachineTranslation) o)) @@ -124,10 +129,13 @@ private Predicate upToCodePoints(int charsAllowed) { } private int getCharactersUsedThisMonth() { - MachineTranslationCharactersUsed used = (MachineTranslationCharactersUsed) PersistenceManager.getSession() - .createCriteria(MachineTranslationCharactersUsed.class) - .add(Restrictions.eq("id", 1L)) - .uniqueResult(); + Session session = PersistenceManager.getRequestDBSession(); + CriteriaBuilder builder = session.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder.createQuery(MachineTranslationCharactersUsed.class); + Root root = criteriaQuery.from(MachineTranslationCharactersUsed.class); + criteriaQuery.select(root).where(builder.equal(root.get("id"),1L)); + + MachineTranslationCharactersUsed used = session.createQuery(criteriaQuery).uniqueResult(); if (used != null && used.getMonth().equals(getCurrentMonth())) { return used.getUsed(); } else { diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ColumnReportDataPDF.java b/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ColumnReportDataPDF.java index a82496774bb..dc64ee32520 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ColumnReportDataPDF.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ColumnReportDataPDF.java @@ -17,7 +17,6 @@ import org.digijava.kernel.translator.TranslatorWorker; import org.digijava.module.aim.action.ExportActivityToPDF; - import java.util.ArrayList; import java.util.List; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/GroupReportDataPDF.java b/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/GroupReportDataPDF.java index f4312b29f5f..e6ba08bb02c 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/GroupReportDataPDF.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/GroupReportDataPDF.java @@ -17,8 +17,6 @@ import org.dgfoundation.amp.ar.Viewable; import org.digijava.module.aim.action.ExportActivityToPDF; -import java.util.Iterator; - /** * * @author Mihai Postelnicu - mpostelnicu@dgfoundation.org diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ReportPdfExportState.java b/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ReportPdfExportState.java index 659809c20b5..0f3e6d0465e 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ReportPdfExportState.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/ar/view/pdf/ReportPdfExportState.java @@ -4,7 +4,6 @@ import com.itextpdf.text.BaseColor; import com.itextpdf.text.pdf.PdfPCell; -import java.awt.*; import java.util.ArrayList; /** diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/ar/viewfetcher/InternationalizedModelDescription.java b/amp/WEB-INF/src/org/dgfoundation/amp/ar/viewfetcher/InternationalizedModelDescription.java index b3f35bc2f71..5966e9f3751 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/ar/viewfetcher/InternationalizedModelDescription.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/ar/viewfetcher/InternationalizedModelDescription.java @@ -4,6 +4,7 @@ import org.digijava.module.aim.annotations.translation.TranslatableClass; import org.digijava.module.aim.annotations.translation.TranslatableField; import org.digijava.module.translation.util.ContentTranslationUtil; +import org.hibernate.Session; import org.hibernate.metamodel.internal.MetamodelImpl; import org.hibernate.persister.entity.AbstractEntityPersister; import org.slf4j.Logger; @@ -31,28 +32,16 @@ private InternationalizedModelDescription(Class modelClass) { scanClass(modelClass); } - // public static java.sql.Connection connection = initConnection(); -// -// private static java.sql.Connection initConnection() -// { -// try -// { -// return PersistenceManager.getJdbcConnection(); -// } -// catch(Exception e) -// { -// throw new RuntimeException("Could not get RAW JDBC Connection", e); -// } -// } - public static AbstractEntityPersister getPersister(final Class modelClazz) { - EntityManager entityManager = PersistenceManager.getRequestDBSession().getEntityManagerFactory().createEntityManager(); + + public static AbstractEntityPersister getPersister(final Class modelClazz, Session session) { + EntityManager entityManager = session.getEntityManagerFactory().createEntityManager(); final MetamodelImpl metamodel = (MetamodelImpl) entityManager.getMetamodel(); return (AbstractEntityPersister) metamodel.entityPersister(modelClazz); } public static boolean isEntity(final Class modelClazz) { try { - getPersister(modelClazz); + getPersister(modelClazz, PersistenceManager.getRequestDBSession()); return true; } catch (Exception e) { logger.error("Seems this is not an entity: " + modelClazz); @@ -61,9 +50,9 @@ public static boolean isEntity(final Class modelClazz) { } public String getColumnNameByPropertyName(String propertyName, Class modelClazz) { - int propertyIndex = getPersister(modelClazz).getEntityMetamodel().getPropertyIndex(propertyName); + int propertyIndex = getPersister(modelClazz, PersistenceManager.getRequestDBSession()).getEntityMetamodel().getPropertyIndex(propertyName); if (propertyIndex != -1) { - String[] columnNames = getPersister(modelClazz).getPropertyColumnNames(propertyIndex); + String[] columnNames = getPersister(modelClazz, PersistenceManager.getRequestDBSession()).getPropertyColumnNames(propertyIndex); // In a single table inheritance strategy, typically there will be only one column name per property if (columnNames.length > 0) { return columnNames[0]; @@ -81,8 +70,8 @@ protected void scanClass(Class modelClass) { if (modelClass.getAnnotation(TranslatableClass.class) == null) throw new RuntimeException("asked to scan class " + modelClass + ", which is translatable"); - String keyColumnName = Arrays.stream(((AbstractEntityPersister) getPersister(modelClass)).getKeyColumnNames()).iterator().next(); - String modelTableName = ((AbstractEntityPersister) getPersister(modelClass)).getTableName(); + String keyColumnName = Arrays.stream(getPersister(modelClass, PersistenceManager.getRequestDBSession()).getKeyColumnNames()).iterator().next(); + String modelTableName = getPersister(modelClass, PersistenceManager.getRequestDBSession()).getTableName(); Set existingColumns = SQLUtils.getTableColumns(modelTableName); boolean idColumnExists = existingColumns.contains(keyColumnName); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output1PdfExporter.java b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output1PdfExporter.java index e8819e1b75e..2449c209667 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output1PdfExporter.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output1PdfExporter.java @@ -2,7 +2,6 @@ import com.itextpdf.text.*; -import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output2PdfExporter.java b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output2PdfExporter.java index 7f96cce3c34..82362bc29b5 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output2PdfExporter.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator1Output2PdfExporter.java @@ -4,7 +4,6 @@ import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; -import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPTable; import org.dgfoundation.amp.gpi.reports.GPIReport; import org.dgfoundation.amp.gpi.reports.GPIReportConstants; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5aPdfExporter.java b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5aPdfExporter.java index 1e359e15ccc..dd62948d491 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5aPdfExporter.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5aPdfExporter.java @@ -2,7 +2,6 @@ import com.itextpdf.text.*; -import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import org.dgfoundation.amp.ar.ColumnConstants; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5bPdfExporter.java b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5bPdfExporter.java index 24c9763790b..4ca62fe3629 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5bPdfExporter.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator5bPdfExporter.java @@ -2,7 +2,6 @@ import com.itextpdf.text.*; -import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import org.dgfoundation.amp.ar.ColumnConstants; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator9bPdfExporter.java b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator9bPdfExporter.java index f24bf0ac746..e0d5e9afd35 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator9bPdfExporter.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportIndicator9bPdfExporter.java @@ -5,7 +5,6 @@ import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; -import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPTable; import org.dgfoundation.amp.ar.MeasureConstants; import org.dgfoundation.amp.gpi.reports.GPIReport; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportPdfExporter.java b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportPdfExporter.java index 50dcc1180a3..dfd2cad9aed 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportPdfExporter.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/gpi/reports/export/pdf/GPIReportPdfExporter.java @@ -2,7 +2,6 @@ import com.itextpdf.text.*; -import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/AmpReportsSchema.java b/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/AmpReportsSchema.java index f9da314bb7d..d1da65ccd95 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/AmpReportsSchema.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/AmpReportsSchema.java @@ -22,7 +22,6 @@ import org.dgfoundation.amp.nireports.runtime.CellColumn; import org.dgfoundation.amp.nireports.runtime.VSplitStrategy; import org.dgfoundation.amp.nireports.schema.*; -import org.dgfoundation.amp.nireports.schema.NiDimension.*; import org.dgfoundation.amp.visibility.data.MeasuresVisibility; import org.digijava.kernel.ampapi.endpoints.performance.PerformanceRuleManager; import org.digijava.kernel.persistence.PersistenceManager; @@ -45,11 +44,22 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_0; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_1; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_2; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_3; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_4; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_5; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_6; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_7; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_8; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LEVEL_ALL_IDS; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.LevelColumn; +import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.NiDimensionUsage; import static org.dgfoundation.amp.nireports.amp.dimensions.LocationsDimension.*; import static org.dgfoundation.amp.nireports.amp.dimensions.OrganisationsDimension.*; import static org.dgfoundation.amp.nireports.amp.dimensions.SectorsDimension.*; import static org.dgfoundation.amp.nireports.formulas.NiFormula.*; -import static org.dgfoundation.amp.nireports.schema.NiDimension.*; /** * the big, glorious, immaculate, AMP NiReports schema. @@ -342,12 +352,12 @@ protected AmpReportsSchema() { date_column(ColumnConstants.AGREEMENT_SIGNATURE_DATE, "v_agreement_signature_date", AGR_LEVEL_COLUMN); date_column(ColumnConstants.AGREEMENT_EFFECTIVE_DATE, "v_agreement_effective_date", AGR_LEVEL_COLUMN); date_column(ColumnConstants.AGREEMENT_PARLIAMENTARY_APPROVAL_DATE, "v_agreement_parlimentary_date", AGR_LEVEL_COLUMN); - + no_dimension(ColumnConstants.AMP_ID, "v_amp_id"); single_dimension(ColumnConstants.BUDGET_ORGANIZATION, "v_budget_organization", RAW_ORG_LEVEL_COLUMN); single_dimension(ColumnConstants.BUDGET_PROGRAM, "v_budget_program", RAW_PRG_LEVEL_COLUMN); degenerate_dimension(ColumnConstants.BUDGET_STRUCTURE, "v_budget_structure", boolDimension); - + no_dimension(ColumnConstants.COMPONENT_DESCRIPTION, "v_component_description"); single_dimension(ColumnConstants.COMPONENT_FUNDING_ORGANIZATION, "v_component_funding_organization_name", CFO_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); @@ -356,9 +366,15 @@ protected AmpReportsSchema() { degenerate_dimension(ColumnConstants.COMPONENT_NAME, "v_components", COMPS_DIMENSION); degenerate_dimension(ColumnConstants.COMPONENT_TYPE, "v_component_type", COMP_TYPES_DIMENSION); no_dimension(ColumnConstants.DESCRIPTION_OF_COMPONENT_FUNDING, "v_component_funding_description"); - + degenerate_dimension(ColumnConstants.DISASTER_RESPONSE_MARKER, "v_disaster_response_marker", boolDimension); - no_entity(ColumnConstants.DISBURSEMENT_ID, "v_disbursement_id"); + try { + no_entity(ColumnConstants.DISBURSEMENT_ID, "v_disbursement_id"); + + }catch (Exception e) + { + e.printStackTrace(); + } no_dimension(ColumnConstants.DONOR_CONTACT_ORGANIZATION, "v_donor_cont_org"); no_entity(ColumnConstants.ENVIRONMENT, "v_environment", DG_EDITOR_POSTPROCESSOR); no_entity(ColumnConstants.EQUAL_OPPORTUNITY, "v_equalopportunity", DG_EDITOR_POSTPROCESSOR); @@ -371,7 +387,7 @@ protected AmpReportsSchema() { degenerate_dimension(ColumnConstants.MULTI_STAKEHOLDER_PARTNERSHIP, "v_multi_stakeholder_partnership", boolDimension); degenerate_dimension(ColumnConstants.IMPLEMENTATION_LEVEL, "v_implementation_level", catsDimension); - degenerate_dimension(ColumnConstants.PERFORMANCE_ALERT_TYPE, "v_performance_alert_type", + degenerate_dimension(ColumnConstants.PERFORMANCE_ALERT_TYPE, "v_performance_alert_type", PERF_TYPE_DIM, PERFORMANCE_ALERT_POSTPROCESSOR); degenerate_dimension(ColumnConstants.PERFORMANCE_ALERT_LEVEL, "v_performance_alert_level", catsDimension); degenerate_dimension(ColumnConstants.INDIRECT_ON_BUDGET, "v_indirect_on_budget", boolDimension); @@ -404,9 +420,9 @@ protected AmpReportsSchema() { no_dimension(ColumnConstants.REGIONAL_OBSERVATIONS_ACTORS, "v_regional_observations_actors"); date_column(ColumnConstants.REGIONAL_OBSERVATIONS_DATE, "v_regional_observations_date"); no_dimension(ColumnConstants.REGIONAL_OBSERVATIONS_MEASURES, "v_regional_observations_measures"); - + single_dimension(ColumnConstants.RELATED_PLEDGES, "v_related_pledges", PLEDGES_LEVEL_COLUMN); - + single_dimension(ColumnConstants.RELATED_PROJECTS, "v_ni_pledges_projects", ACT_LEVEL_COLUMN); no_dimension(ColumnConstants.SECTOR_MINISTRY_CONTACT_ORGANIZATION, "v_sect_min_cont_org"); degenerate_dimension(ColumnConstants.SSC_MODALITIES, "v_ssc_modalities", catsDimension); @@ -486,7 +502,7 @@ protected AmpReportsSchema() { no_entity(ColumnConstants.SECTOR_MINISTRY_CONTACT_TITLE, "v_sect_min_cont_title"); no_entity(ColumnConstants.SUB_VOTE, "v_subvote"); no_entity(ColumnConstants.VOTE, "v_vote"); - + single_dimension(ColumnConstants.BENEFICIARY_AGENCY__DEPARTMENT_DIVISION, "v_beneficiary_agency_info", BA_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); single_dimension(ColumnConstants.CONTRACTING_AGENCY_DEPARTMENT_DIVISION, "v_contracting_agency_info", CA_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); single_dimension(ColumnConstants.EXECUTING_AGENCY_DEPARTMENT_DIVISION, "v_executing_agency_info", EA_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); @@ -494,7 +510,7 @@ protected AmpReportsSchema() { single_dimension(ColumnConstants.REGIONAL_GROUP_DEPARTMENT_DIVISION, "v_regional_group_info", RG_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); single_dimension(ColumnConstants.RESPONSIBLE_ORGANIZATION_DEPARTMENT_DIVISION, "v_responsible_org_info", RO_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); single_dimension(ColumnConstants.SECTOR_GROUP_DEPARTMENT_DIVISION, "v_sector_group_info", SG_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); - + single_dimension(ColumnConstants.DONOR_AGENCY, "v_ni_donor_orgs", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); single_dimension(ColumnConstants.DONOR_GROUP, "v_ni_donor_orgsgroups", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION_GROUP)); single_dimension(ColumnConstants.DONOR_TYPE, "v_ni_donor_orgstypes", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION_TYPE)); @@ -504,11 +520,11 @@ protected AmpReportsSchema() { DN_COUNTRY_DIM_USG.getLevelColumn(0)); single_dimension(ColumnConstants.DONOR_ACRONYM, "v_ni_donor_orgsacronyms", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); - + with_percentage(ColumnConstants.IMPLEMENTING_AGENCY, "v_implementing_agency", IA_DIM_USG, LEVEL_ORGANISATION); with_percentage(ColumnConstants.IMPLEMENTING_AGENCY_GROUPS, "v_implementing_agency_groups", IA_DIM_USG, LEVEL_ORGANISATION_GROUP); with_percentage(ColumnConstants.IMPLEMENTING_AGENCY_TYPE, "v_implementing_agency_type", IA_DIM_USG, LEVEL_ORGANISATION_TYPE); - + with_percentage(ColumnConstants.BENEFICIARY_AGENCY, "v_beneficiary_agency", BA_DIM_USG, LEVEL_ORGANISATION); with_percentage(ColumnConstants.BENEFICIARY_AGENCY_GROUPS, "v_beneficiary_agency_groups", BA_DIM_USG, LEVEL_ORGANISATION_GROUP); with_percentage(ColumnConstants.BENEFICIARY_AGENCY_TYPE, "v_beneficiary_agency_type", BA_DIM_USG, @@ -570,7 +586,7 @@ protected AmpReportsSchema() { with_percentage(ColumnConstants.SECTOR_TAG_SUB_SECTOR, "v_tag_sub_sectors", TAG_S_DIM_USG, LEVEL_SUBSECTOR); with_percentage(ColumnConstants.SECTOR_TAG_SUB_SUB_SECTOR, "v_tag_sub_sub_sectors", TAG_S_DIM_USG, LEVEL_SUBSUBSECTOR); - + with_percentage(ColumnConstants.PRIMARY_PROGRAM_LEVEL_0, "v_primaryprogram_level_0", PP_DIM_USG, LEVEL_0); with_percentage(ColumnConstants.PRIMARY_PROGRAM_LEVEL_1, "v_primaryprogram_level_1", PP_DIM_USG, LEVEL_1); with_percentage(ColumnConstants.PRIMARY_PROGRAM_LEVEL_2, "v_primaryprogram_level_2", PP_DIM_USG, LEVEL_2); @@ -609,7 +625,7 @@ protected AmpReportsSchema() { with_percentage(ColumnConstants.SECONDARY_PROGRAM_LEVEL_6, "v_secondaryprogram_level_6", SP_DIM_USG, LEVEL_6); with_percentage(ColumnConstants.SECONDARY_PROGRAM_LEVEL_7, "v_secondaryprogram_level_7", SP_DIM_USG, LEVEL_7); with_percentage(ColumnConstants.SECONDARY_PROGRAM_LEVEL_8, "v_secondaryprogram_level_8", SP_DIM_USG, LEVEL_8); - + with_percentage(ColumnConstants.TERTIARY_PROGRAM_LEVEL_0, "v_tertiaryprogram_level_0", TP_DIM_USG, LEVEL_0); with_percentage(ColumnConstants.TERTIARY_PROGRAM_LEVEL_1, "v_tertiaryprogram_level_1", TP_DIM_USG, LEVEL_1); with_percentage(ColumnConstants.TERTIARY_PROGRAM_LEVEL_2, "v_tertiaryprogram_level_2", TP_DIM_USG, LEVEL_2); @@ -619,7 +635,7 @@ protected AmpReportsSchema() { with_percentage(ColumnConstants.TERTIARY_PROGRAM_LEVEL_6, "v_tertiaryprogram_level_6", TP_DIM_USG, LEVEL_6); with_percentage(ColumnConstants.TERTIARY_PROGRAM_LEVEL_7, "v_tertiaryprogram_level_7", TP_DIM_USG, LEVEL_7); with_percentage(ColumnConstants.TERTIARY_PROGRAM_LEVEL_8, "v_tertiaryprogram_level_8", TP_DIM_USG, LEVEL_8); - + with_percentage(ColumnConstants.NATIONAL_PLANNING_OBJECTIVES_LEVEL_0, "v_nationalobjectives_level_0", NPO_DIM_USG, LEVEL_0); with_percentage(ColumnConstants.NATIONAL_PLANNING_OBJECTIVES_LEVEL_1, "v_nationalobjectives_level_1", NPO_DIM_USG, LEVEL_1); @@ -646,7 +662,7 @@ protected AmpReportsSchema() { date_column(ColumnConstants.MATURITY, "v_maturity", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); date_column(ColumnConstants.RATIFICATION_DATE, "v_ratification_date", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); single_dimension(ColumnConstants.INTEREST_RATE, "v_interest_rate", DONOR_DIM_USG.getLevelColumn(LEVEL_ORGANISATION)); - + addMtefColumns(); addPseudoComputedColumns(); addColumn(new PPCColumn(ColumnConstants.PROPOSED_PROJECT_AMOUNT, "v_proposed_cost")); @@ -668,7 +684,7 @@ protected AmpReportsSchema() { date_column(ColumnConstants.FUNDING_END_DATE, "v_funding_end_date"); date_column(ColumnConstants.FUNDING_START_DATE, "v_funding_start_date"); date_column(ColumnConstants.ORIGINAL_COMPLETION_DATE, "v_original_completion_date"); - date_column(ColumnConstants.PROPOSED_APPROVAL_DATE, "v_actual_proposed_date"); + date_column(ColumnConstants.PROPOSED_APPROVAL_DATE, "v_actual_proposed_date"); date_column(ColumnConstants.PLEDGES_DETAIL_START_DATE, "v_pledges_funding_start_date"); date_column(ColumnConstants.PLEDGES_DETAIL_END_DATE, "v_pledges_funding_end_date"); date_column(ColumnConstants.PROPOSED_COMPLETION_DATE, "v_proposed_completion_date"); @@ -683,7 +699,7 @@ protected AmpReportsSchema() { degenerate_dimension(ColumnConstants.VULNERABLE_GROUP, "v_vulnerable_group", catsDimension); addPledgeColumns(); - + addTrivialMeasures(); addUnfilteredTrivialMeasures(); addFundingFlowMeasures(); @@ -692,7 +708,7 @@ protected AmpReportsSchema() { addComputedLinearMeasures(); addSscMeasures(); addFormulaMeasures(); - + addDividingMeasure(MeasureConstants.PLEDGES_PERCENTAGE_OF_DISBURSEMENT, MeasureConstants.ACTUAL_DISBURSEMENTS, false); addMeasure(new ForecastExecutionRateMeasure(MeasureConstants.FORECAST_EXECUTION_RATE)); addColumn(new NiComputedColumn<>(ColumnConstants.ACTIVITY_COUNT, null, GeneratedIntegerBehaviour.ENTITIES_COUNT_BEHAVIOUR, columnDescriptions.get(ColumnConstants.ACTIVITY_COUNT))); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/PsqlSourcedColumn.java b/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/PsqlSourcedColumn.java index 9531b4dbf0e..740eee6a10e 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/PsqlSourcedColumn.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/nireports/amp/PsqlSourcedColumn.java @@ -11,10 +11,7 @@ import java.sql.ResultSet; import java.sql.SQLException; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** @@ -62,8 +59,9 @@ public PsqlSourcedColumn withGroup(String group) { * @param col */ protected void check() { - NiUtils.failIf(viewColumns.isEmpty(), String.format("column %s: view %s does not exist", name, viewName)); - NiUtils.failIf(!viewColumns.contains(mainColumn), String.format("column %s: view %s does not have mainColumn %s", name, viewName, mainColumn)); + NiUtils.failIf(viewColumns.isEmpty(), String.format("column %s: view %s does not exist", name, viewName)); + NiUtils.failIf(!viewColumns.contains(mainColumn), String.format("column %s: view %s does not have mainColumn %s", name, viewName, mainColumn)); + } protected Map buildCoordinates(long entityId, diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerConst.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerConst.java index 57f4a3de2e3..2daed33a585 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerConst.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerConst.java @@ -5,10 +5,7 @@ package org.dgfoundation.amp.onepager; import org.apache.wicket.MetaDataKey; -import org.dgfoundation.amp.onepager.helper.EditorStore; -import org.dgfoundation.amp.onepager.helper.ResourceTranslationStore; -import org.dgfoundation.amp.onepager.helper.TemporaryActivityDocument; -import org.dgfoundation.amp.onepager.helper.TemporaryGPINiDocument; +import org.dgfoundation.amp.onepager.helper.*; import org.digijava.kernel.startup.AmpSessionListener; import org.digijava.module.aim.dbentity.*; @@ -34,8 +31,11 @@ public final class OnePagerConst { public static final MetaDataKey> RESOURCES_NEW_ITEMS = new MetaDataKey>(){}; + public static final MetaDataKey>> COMPONENT_FUNDING_NEW_ITEMS = new MetaDataKey>>(){}; public static final MetaDataKey> RESOURCES_DELETED_ITEMS = new MetaDataKey>(){}; + public static final MetaDataKey>> COMPONENT_FUNDING_DELETED_ITEMS = new MetaDataKey>>(){}; public static final MetaDataKey> RESOURCES_EXISTING_ITEM_TITLES = new MetaDataKey>(){}; + public static final MetaDataKey>> COMPONENT_FUNDING_EXISTING_ITEM_TITLES = new MetaDataKey>>(){}; public static final MetaDataKey> RESOURCES_TRANSLATIONS = new MetaDataKey>(){}; public static final MetaDataKey> GPI_RESOURCES_NEW_ITEMS = new MetaDataKey>(){}; @@ -75,6 +75,8 @@ public final class OnePagerConst { final static String toggleJS= "$('#%s').click(function(){$(this).siblings('div:first').slideToggle();return false;})"; final static String toggleChildrenJS = "$('#%s').find('a.slider').click(function(){$(this).siblings('div:first').slideToggle();return false;})"; + final static String toggleChildrenJSComponent = "$('#%s').find('a.slider').click(function(){$(this).closest('tr.wicketFundingRowItem').find('#%s').slideToggle();return false;})"; + final static String clickToggleJS= "$('#%s').siblings('div:first').slideToggle();"; final static String clickToggle2JS= "$('#%s').find('div:first').find('div:first').slideToggle();"; final static String toggleJSPM ="$(document).ready(function(){$('#%s').click(function(){$(this).siblings('div:first').slideToggle();return false;});})"; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerUtil.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerUtil.java index ca77fb6294c..c2747a16b9c 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerUtil.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/OnePagerUtil.java @@ -183,6 +183,11 @@ public static String getToggleChildrenJS(Component c) return String.format(OnePagerConst.toggleChildrenJS, c.getMarkupId()); } + public static String getToggleChildrenJSComponentFunding(Component c, String id) + { + return String.format(OnePagerConst.toggleChildrenJSComponent,c.getMarkupId(),id); + } + public static String getToggleJSPM(Component c) { return String.format(OnePagerConst.toggleJSPM, c.getMarkupId()); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.html b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.html index 236edf87bcb..485b5c2fe9c 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.html +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.html @@ -227,5 +227,7 @@ - +
+ + diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java index c8393bf21fd..7e8980b94e3 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java @@ -587,8 +587,10 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { - String onClickSaveAsDraft = "$(\"#"+ saveAsDraftAction.getButton().getMarkupId() +"\").prop('disabled', true);"; - onClickSaveAsDraft += "$(\"#" + cancelLink.getButton().getMarkupId() + "\").prop('disabled', true);"; +// String onClickSaveAsDraft = "$(\"#"+ saveAsDraftAction.getButton().getMarkupId() +"\").prop('disabled', true);"; +// onClickSaveAsDraft += "$(\"#" + cancelLink.getButton().getMarkupId() + "\").prop('disabled', true);"; + String onClickSaveAsDraft = "$('#" + saveAsDraftAction.getButton().getMarkupId() + "').prop('disabled', true);"; + onClickSaveAsDraft += "$('#" + cancelLink.getButton().getMarkupId() + "').prop('disabled', true);"; saveAsDraftAction.getButton().setDefaultFormProcessing(false); //disable global validation of the form saveAsDraftAction.getButton().add(new AttributeModifier("class", new Model("sideMenuButtons"))); @@ -919,12 +921,11 @@ private void verifySections(IModel am, boolean alertIfDisbur //DonorFunding Set fundingSet = activity.getFunding(); if (fundingSet != null){ - for (Iterator iterator = fundingSet.iterator(); iterator.hasNext(); ) { - AmpFunding funding = iterator.next(); - verifySet(new PropertyModel(funding, "fundingDetails"), alertIfDisbursementBiggerCommitments, + for (AmpFunding funding : (Iterable) fundingSet) { + verifySet(new PropertyModel(funding, "fundingDetails"), alertIfDisbursementBiggerCommitments, alertIfExpenditureBiggerDisbursement, commitmentErrors, expenditureErrors, funding, TranslatorUtil.getTranslatedText(OnePager.DONOR_FUNDING_SECTION_NAME) + ": " + - funding.getAmpDonorOrgId().getAcronymAndName()+" ["+funding.getGroupVersionedFunding()+"]"); + funding.getAmpDonorOrgId().getAcronymAndName() + " [" + funding.getGroupVersionedFunding() + "]"); } } @@ -932,15 +933,14 @@ private void verifySections(IModel am, boolean alertIfDisbur Set regionalSet = activity.getRegionalFundings(); if (regionalSet != null){ HashSet verifiedRegions = new HashSet(); - for (Iterator iterator = regionalSet.iterator(); iterator.hasNext(); ){ - AmpRegionalFunding funding = iterator.next(); + for (AmpRegionalFunding funding : (Iterable) regionalSet) { if (funding.getRegionLocation() == null || verifiedRegions.contains(funding.getRegionLocation().getId())) continue; verifiedRegions.add(funding.getRegionLocation().getId()); verifySet(new PropertyModel(am, "regionalFundings"), alertIfDisbursementBiggerCommitments, alertIfExpenditureBiggerDisbursement, commitmentErrors, expenditureErrors, funding.getRegionLocation(), TranslatorUtil.getTranslatedText(OnePager.REGIONAL_FUNDING_SECTION_NAME) + ": " + - funding.getRegionLocation().getAutoCompleteLabel()); + funding.getRegionLocation().getAutoCompleteLabel()); } } @@ -949,7 +949,7 @@ private void verifySections(IModel am, boolean alertIfDisbur if (componentSet != null) { for (AmpComponent component : componentSet) { for (AmpComponentFunding funding : component.getFundings()) { - verifySet(new PropertyModel(component, "fundings"), alertIfDisbursementBiggerCommitments, + verifySet(new PropertyModel<>(component, "fundings"), alertIfDisbursementBiggerCommitments, alertIfExpenditureBiggerDisbursement, commitmentErrors, expenditureErrors, funding.getComponent(), TranslatorUtil.getTranslatedText(OnePager.COMPONENTS_SECTION_NAME) + ": " + funding.getComponent().getTitle()); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIItemFeaturePanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIItemFeaturePanel.java index 4bbb3f8f6e0..832caec537e 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIItemFeaturePanel.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIItemFeaturePanel.java @@ -15,11 +15,9 @@ import org.digijava.module.aim.dbentity.AmpActivityVersion; import org.digijava.module.aim.dbentity.AmpGPISurvey; import org.digijava.module.aim.dbentity.AmpGPISurveyIndicator; -import org.digijava.module.aim.dbentity.AmpGPISurveyResponse; import org.digijava.module.aim.util.DbUtil; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -32,7 +30,7 @@ public class AmpGPIItemFeaturePanel extends AmpFeaturePanel { public AmpGPIItemFeaturePanel(String id, String fmName, final IModel survey, final IModel am) { super(id, survey, fmName, true); if (survey.getObject().getResponses() == null) { - survey.getObject().setResponses(new HashSet()); + survey.getObject().setResponses(new HashSet<>()); } final AbstractReadOnlyModel> listModel = new AbstractReadOnlyModel>() { @@ -41,7 +39,7 @@ public AmpGPIItemFeaturePanel(String id, String fmName, final IModel getObject() { ArrayList list = new ArrayList(DbUtil.getAllGPISurveyIndicators(true)); - Collections.sort(list, new AmpGPISurveyIndicator.GPISurveyIndicatorComparator()); + list.sort(new AmpGPISurveyIndicator.GPISurveyIndicatorComparator()); return list; } }; diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIQuestionItemFeaturePanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIQuestionItemFeaturePanel.java index d78958e5bf7..3fd4592562d 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIQuestionItemFeaturePanel.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/items/AmpGPIQuestionItemFeaturePanel.java @@ -19,7 +19,10 @@ import org.digijava.module.aim.dbentity.AmpGPISurveyQuestion; import org.digijava.module.aim.dbentity.AmpGPISurveyResponse; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; public class AmpGPIQuestionItemFeaturePanel extends AmpFeaturePanel { @@ -32,9 +35,7 @@ public AmpGPIQuestionItemFeaturePanel(String id, String fmName, final IModel it = surveyIndicator.getObject().getQuestions().iterator(); - while (it.hasNext()) { - AmpGPISurveyQuestion qq = (AmpGPISurveyQuestion) it.next(); + for (AmpGPISurveyQuestion qq : surveyIndicator.getObject().getQuestions()) { qq.getAmpTypeId().getName(); } } @@ -46,7 +47,7 @@ public AmpGPIQuestionItemFeaturePanel(String id, String fmName, final IModel getObject() { Set set = (Set) surveyIndicator.getObject().getQuestions(); ArrayList list = new ArrayList(set); - Collections.sort(list, new AmpGPISurveyQuestion.GPISurveyQuestionComparator()); + list.sort(new AmpGPISurveyQuestion.GPISurveyQuestionComparator()); ArrayList listOrderedByParent = new ArrayList(); @@ -74,9 +75,7 @@ protected void populateItem(final ListItem item) { Set responses = survey.getObject().getResponses(); AmpGPISurveyResponse response = null; - Iterator it = responses.iterator(); - while (it.hasNext()) { - AmpGPISurveyResponse rs = (AmpGPISurveyResponse) it.next(); + for (AmpGPISurveyResponse rs : responses) { if (rs.getAmpQuestionId().getAmpQuestionId().compareTo(item.getModelObject().getAmpQuestionId()) == 0) { response = rs; break; @@ -87,7 +86,8 @@ protected void populateItem(final ListItem item) { response.setAmpGPISurveyId(survey.getObject()); response.setAmpQuestionId(item.getModelObject()); responses.add(response); - } + } +// logger.info("Responses :"+ responses); // Create a label with a dynamic value (in this case a question from DB) that can be translatable and can have a tooltip. /*AmpLabelFieldPanel indName = new AmpLabelFieldPanel("qtext", new Model(""), diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java index 349c5eeda58..e3b9c13f4bf 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java @@ -19,6 +19,7 @@ import org.digijava.module.aim.helper.GlobalSettingsConstants; import org.digijava.module.aim.util.ComponentsUtil; import org.digijava.module.aim.util.FeaturesUtil; +import org.digijava.module.categorymanager.util.CategoryConstants; import java.util.List; import java.util.Set; @@ -35,9 +36,9 @@ public class AmpComponentsFormSectionFeature extends public AmpComponentsFormSectionFeature(String id, String fmName, final IModel am) throws Exception { super(id, fmName, am); - final PropertyModel> setModel=new PropertyModel>(am,"components"); + final PropertyModel> setModel= new PropertyModel<>(am, "components"); if (setModel.getObject() == null) - setModel.setObject(new TreeSet()); + setModel.setObject(new TreeSet<>()); final ListEditor list; IModel> listModel = OnePagerUtil.getReadOnlyListModelFromSetModel(setModel); @@ -72,6 +73,7 @@ public void onClick(AjaxRequestTarget target) { } comp.setType(defaultType); + comp.setComponentStatus(CategoryConstants.COMPONENT_STATUS_OPEN.getAmpCategoryValueFromDB()); target.add(this.getParent()); target.appendJavaScript(OnePagerUtil.getToggleChildrenJS(this.getParent())); } diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpDonorFundingFormSectionFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpDonorFundingFormSectionFeature.java index 7274495224d..7c7bfc8c7fa 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpDonorFundingFormSectionFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpDonorFundingFormSectionFeature.java @@ -488,8 +488,8 @@ public void addItemToList(AmpOrganisation org, AmpOrgRole ampOrgRole) { funding.setAmpDonorOrgId(org); funding.setAmpActivityId(am.getObject()); - funding.setMtefProjections(new HashSet()); - funding.setFundingDetails(new HashSet()); + funding.setMtefProjections(new HashSet<>()); + funding.setFundingDetails(new HashSet<>()); funding.setGroupVersionedFunding(System.currentTimeMillis()); // if it is a ssc activity we set a default type of assistance diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpFormSectionFeaturePanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpFormSectionFeaturePanel.java index 1d10bae8c73..8776f78c6fe 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpFormSectionFeaturePanel.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpFormSectionFeaturePanel.java @@ -44,9 +44,9 @@ public AmpFormSectionFeaturePanel(String id, String fmName,final IModel("display: none;"), "")); else - mrk.add(new AttributeAppender("style", new Model("display: block;"), "")); + mrk.add(new AttributeAppender("style", new Model<>("display: block;"), "")); } } diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpIdentificationFormSectionFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpIdentificationFormSectionFeature.java index d7f4d525148..82dea0e8ced 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpIdentificationFormSectionFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpIdentificationFormSectionFeature.java @@ -164,7 +164,7 @@ public String getObject() { AmpCategorySelectFieldPanel status = new AmpCategorySelectFieldPanel( "status", CategoryConstants.ACTIVITY_STATUS_KEY, new AmpCategoryValueByKeyModel( - new PropertyModel>(am,"categories"), + new PropertyModel<>(am, "categories"), CategoryConstants.ACTIVITY_STATUS_KEY), CategoryConstants.ACTIVITY_STATUS_NAME, true, false, null, AmpFMTypes.MODULE); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpMEFormSectionFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpMEFormSectionFeature.java index 31c288c1209..ff57ff78bff 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpMEFormSectionFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpMEFormSectionFeature.java @@ -60,10 +60,10 @@ public AmpMEFormSectionFeature(String id, String fmName, //final IModel> setModel = new PropertyModel>(am, "indicators"); if (am.getObject().getIndicators() == null){ - am.getObject().setIndicators(new HashSet()); + am.getObject().setIndicators(new HashSet<>()); } final IModel> listModel = OnePagerUtil - .getReadOnlyListModelFromSetModel(new PropertyModel(am, "indicators")); + .getReadOnlyListModelFromSetModel(new PropertyModel<>(am, "indicators")); final AmpUniqueCollectionValidatorField uniqueCollectionValidationField = new AmpUniqueCollectionValidatorField( "uniqueMEValidator", listModel, "Unique MEs Validator") { @@ -169,23 +169,17 @@ public Object getDisplayValue(Object object) { return TranslatorUtil.getTranslation("Descending"); } }; - add(new AmpSelectFieldPanel("indType", new PropertyModel(newInd, "type"), typeCol, "Type", false, true, cr)); - - - - + add(new AmpSelectFieldPanel("indType", new PropertyModel<>(newInd, "type"), typeCol, "Type", false, true, cr)); final AmpClassificationConfiguration sectorClassification = SectorUtil.getPrimaryConfigClassification(); - final IModel> sectorSetModel = new PropertyModel>( + final IModel> sectorSetModel = new PropertyModel<>( newInd, "sectors"); IModel> sectorListModel = new AbstractReadOnlyModel>() { @Override public List getObject() { - ArrayList ret = new ArrayList(); - ret.addAll(sectorSetModel.getObject()); - return ret; + return new ArrayList<>(sectorSetModel.getObject()); } }; @@ -319,32 +313,21 @@ public void onClick(AjaxRequestTarget target) { private AmpIndicator getNewIndicator() { AmpIndicator newInd = new AmpIndicator(); - newInd.setSectors(new HashSet()); + newInd.setSectors(new HashSet<>()); newInd.setCreationDate(new Date()); return newInd; } private IModel getNewIndicatorModel() { - return new Model(getNewIndicator()); + return new Model<>(getNewIndicator()); } protected void updateVisibility(IModel indicatorModel){ AmpIndicator ind = indicatorModel.getObject(); - if(ind.getSectors()==null||ind.getSectors().isEmpty()){ - sectorAdded=false; - } - else{ - sectorAdded=true; - } - if (ind.getCode() == null) - codeSelected = false; - else - codeSelected = true; - - if (ind.getName() == null || ind.getName() == "") - titleSelected = false; - else - titleSelected = true; + sectorAdded= ind.getSectors() != null && !ind.getSectors().isEmpty(); + codeSelected = ind.getCode() != null; + + titleSelected = ind.getName() != null && !Objects.equals(ind.getName(), ""); if (codeSelected && titleSelected&§orAdded){ indicatorFeedbackContainer.setVisible(false); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpStructuresFormSectionFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpStructuresFormSectionFeature.java index b396afa1a8d..c4a0521bebe 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpStructuresFormSectionFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/sections/AmpStructuresFormSectionFeature.java @@ -45,11 +45,11 @@ public class AmpStructuresFormSectionFeature extends private static final long serialVersionUID = -6654390083754446344L; private static final int COLOR_OFFSET_CATEGORY_VALUE = 7; - + protected Collection structureTypes; public AmpStructuresFormSectionFeature(String id, String fmName, - final IModel am) throws Exception { + final IModel am) throws Exception { super(id, fmName, am); final PropertyModel> setModel=new PropertyModel>(am,"structures"); if (setModel.getObject() == null) @@ -57,7 +57,7 @@ public AmpStructuresFormSectionFeature(String id, String fmName, final PagingListEditor list; this.structureTypes = StructuresUtil.getAmpStructureTypes(); - + IModel> listModel = new AbstractReadOnlyModel>() { private static final long serialVersionUID = 3706184421459839220L; @@ -69,19 +69,19 @@ public ArrayList getObject() { return null; } }; - - final TransparentWebMarkupContainer containter = new TransparentWebMarkupContainer("listWithPaginator"); + + final TransparentWebMarkupContainer containter = new TransparentWebMarkupContainer("listWithPaginator"); containter.setOutputMarkupId(true); list = new PagingListEditor("list", setModel) { - - + + @Override protected void onPopulateItem( org.dgfoundation.amp.onepager.components.ListItem item) { IModel structureModel = item.getModel(); final AmpTextFieldPanel name = new AmpTextFieldPanel("name", new PropertyModel(structureModel, "title"), "Structure Title",true, true); name.setOutputMarkupId(true); - name.getTextContainer().add(new AttributeAppender("size", new Model("10px"), ";")); + name.getTextContainer().add(new AttributeAppender("size", new Model<>("10px"), ";")); name.setTextContainerDefaultMaxSize(); name.getTextContainer().setRequired(true); if (name.isComponentMultilingual()) { @@ -93,27 +93,27 @@ protected void onUpdate(AjaxRequestTarget target) { target.add(name); } }); - + item.add(name); - + final AmpTextAreaFieldPanel description = new AmpTextAreaFieldPanel("description", new PropertyModel(structureModel, "description"),"Structure Description",false, true, true); description.setOutputMarkupId(true); String descriptionStyle; if (description.isComponentMultilingual()) { - descriptionStyle ="margin-bottom: 55px;"; + descriptionStyle ="margin-bottom: 55px;"; } else { descriptionStyle ="margin-bottom: 20px;"; } description.getTextAreaContainer().add(new AttributeModifier("style",descriptionStyle )); - item.add(description); + item.add(description); final AmpTextFieldPanel longitude = new AmpTextFieldPanel("longitude", new PropertyModel(structureModel, "longitude"),"Structure Longitude", true, true); longitude.setOutputMarkupId(true); longitude.setTextContainerDefaultMaxSize(); - longitude.getTextContainer().add(new AttributeAppender("size", new Model("7px"), ";")); + longitude.getTextContainer().add(new AttributeAppender("size", new Model<>("7px"), ";")); longitude.getTextContainer().add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { @@ -127,7 +127,7 @@ protected void onUpdate(AjaxRequestTarget target) { latitude.setTextContainerDefaultMaxSize(); latitude.setOutputMarkupId(true); - latitude.getTextContainer().add(new AttributeAppender("size", new Model("7px"), ";")); + latitude.getTextContainer().add(new AttributeAppender("size", new Model<>("7px"), ";")); latitude.getTextContainer().add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { @@ -138,11 +138,11 @@ protected void onUpdate(AjaxRequestTarget target) { item.add(latitude); final AmpTextFieldPanel shape = new AmpTextFieldPanel("shape", new PropertyModel(structureModel, "shape"),"Structure Shape", true, true); - shape.setOutputMarkupId(true); + shape.setOutputMarkupId(true); shape.getTextContainer().add(new AttributeAppender("size", new Model("7px"), ";")); shape.getTextContainer().add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override - protected void onUpdate(AjaxRequestTarget target) { + protected void onUpdate(AjaxRequestTarget target) { target.add(shape); } }); @@ -164,7 +164,7 @@ protected void onClick(AjaxRequestTarget target) { paging.setVisible(v); } } - + }; item.add(delbutton); @@ -172,7 +172,7 @@ protected void onClick(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { StructureData data = new StructureData(); - + AmpStructure structure = structureModel.getObject(); if (structure.getCoordinates() != null) { List coordinates = new ArrayList<>(); @@ -201,9 +201,9 @@ public void onClick(AjaxRequestTarget target) { target.add(latitude); target.add(longitude); target.add(viewCoords); - + MapData data = new MapData(); - + List structureColors = new ArrayList<>(); Collection categoryValues = CategoryManagerUtil .getAmpCategoryValueCollectionByKeyExcludeDeleted( @@ -247,18 +247,18 @@ protected void onUpdate(AjaxRequestTarget target) { coords.setOutputMarkupId(true); item.add(coords); - + final TextField tempId = new TextField("tempId", - new PropertyModel(structureModel, "tempId")); - tempId.setOutputMarkupId(true); + new PropertyModel(structureModel, "tempId")); + tempId.setOutputMarkupId(true); tempId.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { target.add(tempId); } - }); + }); item.add(tempId); - + final TextField structureColorId = new TextField("structureColorId", new PropertyModel(structureModel, "structureColorId")); structureColorId.setOutputMarkupId(true); @@ -275,10 +275,10 @@ protected void onUpdate(AjaxRequestTarget target) { target.add(structureColorId); } }); - item.add(structureColorId); - - latitude.getTextContainer().setEnabled(!hasCoordinates(structureModel)); - longitude.getTextContainer().setEnabled(!hasCoordinates(structureModel)); + item.add(structureColorId); +// +// latitude.getTextContainer().setEnabled(!hasCoordinates(structureModel)); +// longitude.getTextContainer().setEnabled(!hasCoordinates(structureModel)); viewCoords.getButton().setEnabled(hasCoordinates(structureModel)); } }; @@ -302,11 +302,11 @@ public void onClick(AjaxRequestTarget target) { pln.setVisible(visible); } }; - - addbutton.getButton().add(new AttributeModifier("class", new Model("addStructure button_green_btm"))); - add(addbutton); - - + + addbutton.getButton().add(new AttributeModifier("class", new Model("addStructure button_green_btm"))); + add(addbutton); + + } public StructureData getDataFromStructureModel(IModel structureModel) { @@ -337,4 +337,4 @@ private boolean hasCoordinates(IModel structureModel) { return structureModel.getObject().getCoordinates() != null && structureModel.getObject(). getCoordinates().size() > 0; } -} +} \ No newline at end of file diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java index d5c842fe469..d177bdd393d 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java @@ -17,6 +17,7 @@ import org.digijava.module.categorymanager.util.CategoryConstants; import java.util.Set; +import java.util.UUID; /** * @author aartimon@dginternational.org @@ -62,12 +63,14 @@ public AmpComponentsFundingSubsectionFeature(String id, public void onClick(AjaxRequestTarget target) { AmpComponentFunding cf = new AmpComponentFunding(); cf.setAdjustmentType(CategoryConstants.ADJUSTMENT_TYPE_ACTUAL.getAmpCategoryValueFromDB()); + cf.setComponentFundingStatus(CategoryConstants.COMPONENT_FUNDING_STATUS_OPEN.getAmpCategoryValueFromDB()); cf.setComponent(componentModel.getObject()); cf.setTransactionAmount(0d); cf.setCurrency(CurrencyUtil.getWicketWorkspaceCurrency()); cf.setTransactionDate(null); cf.setTransactionType(transactionType); cf.setAmpComponentFundingId(null); + cf.setJustAnId(UUID.randomUUID().toString()); tableFeature.getEditorList().addItem(cf); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.html b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.html new file mode 100644 index 00000000000..c1440525090 --- /dev/null +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.html @@ -0,0 +1,40 @@ + + + Title + Resource Name + Date + Year + Size + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java new file mode 100644 index 00000000000..a6aa9d97e46 --- /dev/null +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java @@ -0,0 +1,315 @@ +package org.dgfoundation.amp.onepager.components.features.tables; + + +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.MetaDataKey; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.link.ExternalLink; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; +import org.apache.wicket.util.file.File; +import org.dgfoundation.amp.onepager.OnePagerConst; +import org.dgfoundation.amp.onepager.components.fields.AmpTextFieldPanel; +import org.dgfoundation.amp.onepager.helper.DownloadResourceStream; +import org.dgfoundation.amp.onepager.helper.TemporaryComponentFundingDocument; +import org.dgfoundation.amp.onepager.helper.TemporaryDocument; +import org.dgfoundation.amp.onepager.models.PersistentObjectModel; +import org.dgfoundation.amp.onepager.models.ResourceTranslationModel; +import org.dgfoundation.amp.onepager.util.AmpFMTypes; +import org.dgfoundation.amp.onepager.util.SessionUtil; +import org.digijava.kernel.translator.TranslatorWorker; +import org.digijava.module.aim.dbentity.AmpComponentFunding; +import org.digijava.module.aim.dbentity.AmpComponentFundingDocument; +import org.digijava.module.aim.helper.Constants; +import org.digijava.module.aim.util.FeaturesUtil; +import org.digijava.module.contentrepository.helper.NodeWrapper; +import org.digijava.module.contentrepository.util.DocumentManagerUtil; +import org.digijava.module.translation.util.ContentTranslationUtil; + +import javax.jcr.Node; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author aartimon@dginternational.org + * @since Apr 13, 2011 + */ +public class AmpComponentFundingResourcesTableFeature extends AmpFormTableFeaturePanel { + + boolean refreshExistingDocs = false; + + + /** + * @param id + * @param fmName + * @param am + * @throws Exception + */ + public AmpComponentFundingResourcesTableFeature(String id, String fmName, + final IModel am) throws Exception { + super(id, am, fmName); + super.setTitleHeaderColSpan(10); +// getSession().setMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS, new HashSet<>()); +// getSession().setMetaData(OnePagerConst.COMPONENT_FUNDING_DELETED_ITEMS, new HashSet<>()); +// getSession().setMetaData(OnePagerConst.COMPONENT_FUNDING_EXISTING_ITEM_TITLES, new HashSet<>()); + + + final IModel> setModel = new PropertyModel<>(am, "componentFundingDocuments"); + +// if (am.getObject().getComponentFundingDocuments() == null) +// am.getObject().getComponentFundingDocuments().addAll(new HashSet<>()); + + IModel> listModel = new AbstractReadOnlyModel>() { + + private transient List existingTmpDocs = getExistingObject(); + + private List getExistingObject() { + Iterator it = setModel.getObject().iterator(); + List ret = new ArrayList<>(); + HashSet existingDocTitles = new HashSet<>(); + + while (it.hasNext()) { + AmpComponentFundingDocument d = it.next(); + Node node = DocumentManagerUtil.getWriteNode(d.getUuid(), SessionUtil.getCurrentServletRequest()); + NodeWrapper nw = new NodeWrapper(node); + + if (node == null) + continue; + + /** + * Code to add TempDoc to list + */ + TemporaryComponentFundingDocument td = new TemporaryComponentFundingDocument(); + td.setExisting(true); + td.setExistingDocument(d); + td.setDate(nw.getCalendarDate()); + td.setDescription(nw.getDescription()); + td.setNote(nw.getNotes()); + td.setTitle(nw.getTitle()); +// td.setType(CategoryManagerUtil.getAmpCategoryValueFromDb(nw.getCmDocTypeId())); + td.setWebLink(nw.getWebLink()); + td.setYear(nw.getYearOfPublication()); + td.setFileSize(nw.getFileSizeInMegabytes()); + td.setFileName(nw.getName()); +// td.setLabels(nw.getLabels()); + td.setContentType(nw.getContentType()); + + ret.add(td); + + // Existing doc titles should be populated only when multilingual is enabled + if (ContentTranslationUtil.multilingualIsEnabled()) { + TemporaryComponentFundingDocument titleHolder = new TemporaryComponentFundingDocument(); + titleHolder.setTitle(td.getTitle()); + titleHolder.setExistingDocument(d); + existingDocTitles.add(titleHolder); + existingDocTitles.add(td); + } + } + String justAnId= am.getObject().getJustAnId(); + + MetaDataKey>> metaDataKey = OnePagerConst.COMPONENT_FUNDING_EXISTING_ITEM_TITLES; + + HashMap> metaData = getSession().getMetaData(metaDataKey); + + if (metaData == null) { + metaData = new HashMap<>(); + + } + getSession().setMetaData(metaDataKey, metaData); + + HashSet existingSet = metaData.computeIfAbsent(justAnId, k -> new HashSet<>()); + + existingSet.addAll(existingDocTitles); + refreshExistingDocs = false; + return ret; + } + + + + @Override + public List getObject() { + HashSet newItems = getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS).get(am.getObject().getJustAnId()); + if (newItems == null) + newItems = new HashSet<>(); + HashMap> delItemsMap = getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_DELETED_ITEMS); + HashSet delItems = delItemsMap.get(am.getObject().getJustAnId()); + if (delItems == null) + delItems = new HashSet<>(); + + if (refreshExistingDocs) + existingTmpDocs = getExistingObject(); + if (existingTmpDocs==null){ + existingTmpDocs=new ArrayList<>(); + } + List ret = new ArrayList<>(existingTmpDocs); + +// if (am.getObject().getComponentFundingDocuments() == null) +// am.getObject().getComponentFundingDocuments().addAll(new HashSet<>()); + + for (AmpComponentFundingDocument d : setModel.getObject()) { + //check if marked for delete + if (delItems.contains(d)) { + for (TemporaryDocument td : existingTmpDocs) { + if (td.getExistingDocument().equals(d)) { + existingTmpDocs.remove(td); + break; + } + } + } + } + ret.addAll(newItems); + + return ret; + } + }; + + + list = new ListView("componentFundingDocumentList", listModel) { + private static final long serialVersionUID = 7218457979728871528L; + + @Override + protected void onAfterRender() { + super.onAfterRender(); + DocumentManagerUtil.logoutJcrSessions(SessionUtil.getCurrentServletRequest()); + } + + @Override + protected void populateItem(final ListItem item) { + if (item.getModel() == null && item.getModelObject() == null) { + logger.info("yoh here"); + return; + } + + TemporaryDocument document = item.getModelObject(); + + if (!ContentTranslationUtil.multilingualIsEnabled()) { + item.add(new Label("componentFundingDocumentTitle", item.getModel().getObject().getTitle())); + } else { + String id; + if (document.getExistingDocument() != null) { + id = document.getExistingDocument().getUuid(); + } else { + id = document.getNewTemporaryDocumentId(); + } + Model newResourceIdModel = new Model(id); + final ResourceTranslationModel titleModel = new ResourceTranslationModel(new PropertyModel<>(item.getModel().getObject(), "title"), newResourceIdModel); + final AmpTextFieldPanel name = new AmpTextFieldPanel("componentFundingDocumentTitle", titleModel, "Title", AmpFMTypes.MODULE, Boolean.TRUE); + name.setEnabled(false); + name.getTextContainer().setRequired(true); + item.add(name); + + + } + + if (item.getModel().getObject().getFileName() == null) { + item.add(new Label("componentFundingDocumentResourceName", item.getModel().getObject().getWebLink())); + } else { + item.add(new Label("componentFundingDocumentResourceName", item.getModel().getObject().getFileName())); + } + + AjaxLink delComponentDoc = new AjaxLink("componentFundingDocumentDelete", setModel) { + @Override + public void onClick(AjaxRequestTarget target) { + if (item.getModelObject().isExisting()) { + MetaDataKey>> metaDataKey = OnePagerConst.COMPONENT_FUNDING_DELETED_ITEMS; + + HashMap> metaData = getSession().getMetaData(metaDataKey); + + if (metaData == null) { + metaData = new HashMap<>(); + + } + getSession().setMetaData(metaDataKey, metaData); + HashSet delItems = metaData.computeIfAbsent(am.getObject().getJustAnId(), k -> new HashSet<>()); + delItems.add(item.getModelObject().getExistingDocument()); + } else { + HashSet newItems = getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS).get(am.getObject().getJustAnId()); + newItems.remove(item.getModelObject()); + } + target.add(list.getParent()); + } + }; + // TODO: 10/2/23 add some style to + delComponentDoc.add(new Button("deleteComponentFundingDocButton").add(new Label("deleteComponentFundingDocLabel", TranslatorWorker.translateText("Del")))); + item.add(delComponentDoc); +// item.add(new ListEditorRemoveButton("componentFundingDocumentDelete", "Component Funding Document Delete Resource")); + + PropertyModel dateModel = new PropertyModel<>(item.getModel(), "date.time"); + String pattern = FeaturesUtil.getGlobalSettingValue(Constants.GLOBALSETTINGS_DATEFORMAT); + pattern = pattern.replace('m', 'M'); + SimpleDateFormat formater = new SimpleDateFormat(pattern); + String formatedDate = formater.format(dateModel.getObject()); + + item.add(new Label("componentFundingDocumentDate", formatedDate)); + item.add(new Label("componentFundingDocumentYear",item.getModel().getObject().getYear())); + item.add(new Label("componentFundingDocumentSize", item.getModel().getObject().getFileSize())); +// item.add(new AmpLabelFieldPanel("docType", new PropertyModel(item.getModel(), "type.label"), "Document Type", true)); + + final DownloadResourceStream drs; + if (item.getModelObject().isExisting()) + drs = new DownloadResourceStream(new PersistentObjectModel<> + (item.getModelObject().getExistingDocument()), item.getModelObject().getFileName()); + else + drs = new DownloadResourceStream(item.getModelObject().getFile(), item.getModelObject().getFileName()); + + String webLink = item.getModelObject().getWebLink(); + + if (webLink != null && webLink.length() > 0) { + if (!webLink.startsWith("http")) + webLink = "http://" + webLink; + ExternalLink link = new ExternalLink("componentFundingDocumentDownload", new Model<>(webLink)); + item.add(link); + WebMarkupContainer downloadLinkImg = new WebMarkupContainer("componentFundingDocumentDownloadImage"); + downloadLinkImg.add(new AttributeModifier("src", new Model<>("/TEMPLATE/ampTemplate/img_2/ico_attachment.png"))); + link.add(downloadLinkImg); + } else { + Link downloadLink = new Link("componentFundingDocumentDownload") { + @Override + public void onClick() { + getRequestCycle().scheduleRequestHandlerAfterCurrent(new ResourceStreamRequestHandler(drs, drs.getFileName())); + } + }; + item.add(downloadLink); + + String contentType = item.getModelObject().getFileName(); + int index = contentType.lastIndexOf('.'); + + String extension = contentType.substring(index + 1, contentType.length()); + String extPath = "/TEMPLATE/ampTemplate/images/icons/" + extension + ".gif"; + File extImgFile = new File(WebApplication.get().getServletContext().getRealPath(extPath)); + if (!extImgFile.exists()) + extPath = "/TEMPLATE/ampTemplate/images/icons/default.icon.gif"; + else + extPath = "/TEMPLATE/ampTemplate/images/icons/" + extension + ".gif"; + + WebMarkupContainer downloadLinkImg = new WebMarkupContainer("componentFundingDocumentDownloadImage"); + downloadLinkImg.add(new AttributeModifier("src", new Model<>(extPath))); + downloadLink.add(downloadLinkImg); + } + + + } + }; + + add(list); + + } + + + public void setRefreshExistingDocs(boolean refreshExistingDocs) { + this.refreshExistingDocs = refreshExistingDocs; + } + +} + diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.html b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.html index a5c285bb985..f81be99557f 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.html +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.html @@ -13,6 +13,9 @@ + + + diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java index 9ceeda0c55a..cd186ac8e62 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java @@ -4,6 +4,7 @@ */ package org.dgfoundation.amp.onepager.components.features.tables; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.AttributeAppender; @@ -15,12 +16,14 @@ import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.dgfoundation.amp.onepager.components.features.subsections.AmpSubsectionFeaturePanel; +import org.dgfoundation.amp.onepager.components.fields.AmpCategorySelectFieldPanel; import org.dgfoundation.amp.onepager.components.fields.AmpSelectFieldPanel; import org.dgfoundation.amp.onepager.components.fields.AmpTextAreaFieldPanel; import org.dgfoundation.amp.onepager.components.fields.AmpTextFieldPanel; import org.dgfoundation.amp.onepager.validators.AmpUniqueComponentTitleValidator; import org.digijava.module.aim.dbentity.*; import org.digijava.module.aim.util.ComponentsUtil; +import org.digijava.module.categorymanager.util.CategoryConstants; import java.util.ArrayList; import java.util.List; @@ -58,7 +61,7 @@ public AmpComponentIdentificationFormTableFeature(String id, IModel>() { @Override protected List load() { - return new ArrayList(ComponentsUtil.getAmpComponentTypes(true)); + return new ArrayList<>(ComponentsUtil.getAmpComponentTypes(true)); } }, COMPONENT_TYPE, false, false, new ChoiceRenderer("name")){ /** @@ -70,15 +73,12 @@ public boolean dropDownChoiceIsDisabled( AmpComponentType object, int index, String selected) { - if (object.getSelectable()) - return false; - else - return true; + return !object.getSelectable(); } }; compTypes.setOutputMarkupId(true); compTypes.getChoiceContainer().setRequired(true); - compTypes.getChoiceContainer().add(new AttributeAppender("style", true, new Model("max-width: 300px"), ";")); + compTypes.getChoiceContainer().add(new AttributeAppender("style", true, new Model<>("max-width: 300px"), ";")); add(compTypes); final AmpTextFieldPanel name = new AmpTextFieldPanel("name", new PropertyModel(componentModel, "title"), COMPONENT_TITLE); @@ -91,12 +91,35 @@ protected void onUpdate(AjaxRequestTarget target) { target.add(componentNameLabel); } }); - name.getTextContainer().add(new AmpUniqueComponentTitleValidator(new PropertyModel(activityModel, "ampActivityGroup"))); + name.getTextContainer().add(new AmpUniqueComponentTitleValidator(new PropertyModel<>(activityModel, "ampActivityGroup"))); add(name); - AmpTextAreaFieldPanel description = new AmpTextAreaFieldPanel("description", new PropertyModel(componentModel, "description"), COMPONENT_DESCRIPTION, false, false, false); + AmpTextAreaFieldPanel description = new AmpTextAreaFieldPanel("description", new PropertyModel<>(componentModel, "description"), COMPONENT_DESCRIPTION, false, false, false); add(description); + AmpCategorySelectFieldPanel componentStatus = new AmpCategorySelectFieldPanel( + "componentStatus", CategoryConstants.COMPONENT_STATUS_KEY, + new PropertyModel<>(componentModel, "componentStatus"), + COMPONENT_STATUS, //fmname + false, false, false, null, false); +// componentStatus.getChoiceContainer().add(new AjaxFormComponentUpdatingBehavior("onchange") { +// @Override +// protected void onUpdate(AjaxRequestTarget target) { +// String selectedValue = componentModel.getObject().getComponentStatus().getValue(); +// logger.info("Selected Status: "+selectedValue); +// if ("rejected".equalsIgnoreCase(selectedValue)) { +// target.appendJavaScript("$('#" + rejectReason.getMarkupId() + "').show();"); +// } else { +// target.appendJavaScript("$('#" + rejectReason.getMarkupId() + "').hide();"); +// } +// +// +// } +// }); + componentStatus.getChoiceContainer().setRequired(true); + componentStatus.getChoiceContainer().add(new AttributeModifier("style", "width: 100px;")); + add(componentStatus); + } } diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.html b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.html index 23a4af6f6f5..9b85632f6b6 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.html +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.html @@ -5,10 +5,14 @@
+ + +
+
diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java index f7d422cc332..37f7b3ca900 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java @@ -5,32 +5,41 @@ package org.dgfoundation.amp.onepager.components.features.tables; import org.apache.wicket.AttributeModifier; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.event.Broadcast; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; +import org.dgfoundation.amp.onepager.OnePagerConst; import org.dgfoundation.amp.onepager.components.AmpFundingAmountComponent; import org.dgfoundation.amp.onepager.components.ListEditor; import org.dgfoundation.amp.onepager.components.ListEditorRemoveButton; -import org.dgfoundation.amp.onepager.components.fields.AmpCategorySelectFieldPanel; -import org.dgfoundation.amp.onepager.components.fields.AmpSelectFieldPanel; -import org.dgfoundation.amp.onepager.components.fields.AmpTextFieldPanel; +import org.dgfoundation.amp.onepager.components.fields.*; +import org.dgfoundation.amp.onepager.events.ContactChangedEvent; import org.dgfoundation.amp.onepager.events.FundingOrgListUpdateEvent; import org.dgfoundation.amp.onepager.events.UpdateEventBehavior; import org.dgfoundation.amp.onepager.models.AbstractMixedSetModel; import org.dgfoundation.amp.onepager.models.AmpRelatedOrgsModel; -import org.digijava.module.aim.dbentity.AmpActivityVersion; -import org.digijava.module.aim.dbentity.AmpComponent; -import org.digijava.module.aim.dbentity.AmpComponentFunding; -import org.digijava.module.aim.dbentity.AmpOrganisation; +import org.digijava.kernel.cache.AbstractCache; +import org.digijava.kernel.cache.ehcache.EhCacheWrapper; +import org.digijava.kernel.persistence.PersistenceManager; +import org.digijava.kernel.user.User; +import org.digijava.module.aim.dbentity.*; +import org.digijava.module.aim.util.TeamUtil; import org.digijava.module.categorymanager.dbentity.AmpCategoryValue; import org.digijava.module.categorymanager.util.CategoryConstants; +import org.digijava.module.trubudget.dbentity.AmpComponentFundingTruWF; +import org.digijava.module.trubudget.model.workflowitem.WorkflowItemDetailsModel; +import org.digijava.module.trubudget.util.ProjectUtil; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.net.URISyntaxException; +import java.util.*; import static org.digijava.module.aim.annotations.interchange.ActivityFieldsConstants.*; +import static org.digijava.module.aim.auth.AmpPostLoginAction.doActualTruBudgetLogin; +import static org.digijava.module.um.util.DbUtil.getGlobalSettingsBySection; +import static org.digijava.module.um.util.DbUtil.getSettingValue; /** * @author aartimon@dginternational.org @@ -62,10 +71,42 @@ public boolean condition(AmpComponentFunding item) { @Override protected void onPopulateItem(org.dgfoundation.amp.onepager.components.ListItem item) { IModel model = item.getModel(); +// if (model.getObject().getComponentFundingDocuments() == null) +// model.getObject().getComponentFundingDocuments(); + if (getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS)== null) + getSession().setMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS,new HashMap<>()); + if (getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_DELETED_ITEMS) == null) + getSession().setMetaData(OnePagerConst.COMPONENT_FUNDING_DELETED_ITEMS, new HashMap<>()); + if (getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_EXISTING_ITEM_TITLES) == null) + getSession().setMetaData(OnePagerConst.COMPONENT_FUNDING_EXISTING_ITEM_TITLES, new HashMap<>()); +// item.add(new AttributeModifier("style","")) + User user = model.getObject().getComponent().getActivity().getActivityCreator().getUser(); + if (getSettingValue(getGlobalSettingsBySection("trubudget"),"isEnabled").equalsIgnoreCase("true")&& user.getTruBudgetEnabled()) { + if (model.getObject().getTransactionType()==1) { + PersistenceManager.getRequestDBSession().createQuery("FROM " + AmpComponentFundingTruWF.class.getName() + " act WHERE act.ampComponentFundingId= '" + model.getObject().getJustAnId() + "' AND act.ampComponentFundingId IS NOT NULL", AmpComponentFundingTruWF.class).stream().findAny().ifPresent(ampComponentFundingTruWF->{ + WorkflowItemDetailsModel workflowItemDetailsModel = null; + try { + List settings = getGlobalSettingsBySection("trubudget"); + doActualTruBudgetLogin(user); + String token = ProjectUtil.getTrubudgetToken(); + workflowItemDetailsModel = ProjectUtil.getWFItemDetails(ampComponentFundingTruWF,settings,token); + } catch (Exception e) { + logger.info("Error when getting WF details: ",e); + } + if (workflowItemDetailsModel!=null && workflowItemDetailsModel.getData()!=null) { + if (!workflowItemDetailsModel.getData().getWorkflowitem().getData().getStatus().equalsIgnoreCase("open")) { + item.add(new AttributeModifier("style", "pointer-events: none; opacity: 0.5;")); + } + } + }); + + + } + } try{ AmpCategorySelectFieldPanel adjustmentTypes = new AmpCategorySelectFieldPanel( "adjustmentType", CategoryConstants.ADJUSTMENT_TYPE_KEY, - new PropertyModel(model,"adjustmentType"), + new PropertyModel<>(model, "adjustmentType"), COMPONENT_FUNDING_ADJUSTMENT_TYPE, //fmname false, false, false, null, false); adjustmentTypes.getChoiceContainer().setRequired(true); @@ -73,9 +114,61 @@ protected void onPopulateItem(org.dgfoundation.amp.onepager.components.ListItem< item.add(adjustmentTypes); } catch(Exception e) { - logger.error("AmpCategoryGroupFieldPanel initialization failed"); + logger.info("Unable to add adjustment type dropdown: ",e); + } + try { + AmpTextAreaFieldPanel rejectReason = new AmpTextAreaFieldPanel("componentRejectReason", new PropertyModel<>(model, "componentRejectReason"), "Reject Reason", false, false, false); + rejectReason.setOutputMarkupId(true); +// rejectReason.setVisible(false); + if (!model.getObject().getComponentFundingStatus().getValue().equalsIgnoreCase("rejected")) { + rejectReason.add(new AttributeModifier("style", "display: none;")); + } + + item.add(rejectReason); + + AmpCategorySelectFieldPanel componentFundingStatus = new AmpCategorySelectFieldPanel( + "componentFundingStatus", CategoryConstants.COMPONENT_FUNDING_STATUS_KEY, + new PropertyModel<>(model, "componentFundingStatus"), + COMPONENT_FUNDING_STATUS, //fmname + false, false, false, null, false) + ; + componentFundingStatus.getChoiceContainer().add(new AjaxFormComponentUpdatingBehavior("onchange") { + @Override + protected void onUpdate(AjaxRequestTarget target) { + String selectedValue = model.getObject().getComponentFundingStatus().getValue(); + logger.info("Selected Status: "+selectedValue); + if ("rejected".equalsIgnoreCase(selectedValue)) { + target.appendJavaScript("$('#" + rejectReason.getMarkupId() + "').show();"); + } else { + target.appendJavaScript("$('#" + rejectReason.getMarkupId() + "').hide();"); + } + + + } + }); + componentFundingStatus.getChoiceContainer().setRequired(true); + componentFundingStatus.getChoiceContainer().add(new AttributeModifier("style", "width: 100px;")); + item.add(componentFundingStatus); + } catch (Exception e) + { + logger.info("Unable to add component funding status dropdown: ",e); + } + try { + AmpComponentFundingResourcesTableFeature resourcesList = + new AmpComponentFundingResourcesTableFeature("componentFundingDocuments", "Component Funding Documents", model); + item.add(resourcesList); + + AmpComponentFundingNewResourceFieldPanel newDoc = + new AmpComponentFundingNewResourceFieldPanel("addNewComponentFundingDocument", model, "Add New Document", resourcesList); + newDoc.setOutputMarkupId(true); + item.add(newDoc); + }catch (Exception e) + { + e.printStackTrace(); } +// + // read the list of organizations from related organizations page, and // create a unique set with the orgs chosen AbstractReadOnlyModel> orgsList = new AmpRelatedOrgsModel(activityModel, null, true); @@ -93,15 +186,20 @@ protected void onPopulateItem(org.dgfoundation.amp.onepager.components.ListItem< model, orgsList); item.add(secondOrgSelect); - AmpFundingAmountComponent amountComponent = new AmpFundingAmountComponent("fundingAmount", + AmpFundingAmountComponent amountComponent = new AmpFundingAmountComponent<>("fundingAmount", model, COMPONENT_FUNDING_AMOUNT, "transactionAmount", COMPONENT_FUNDING_CURRENCY, - "currency", COMPONENT_FUNDING_TRANSACTION_DATE, "transactionDate", false,"6"); + "currency", COMPONENT_FUNDING_TRANSACTION_DATE, "transactionDate", false, "6"); amountComponent.getAmount().getTextContainer().setRequired(false); item.add(amountComponent); - AmpTextFieldPanel description = new AmpTextFieldPanel("description", new PropertyModel(model, "description"), COMPONENT_FUNDING_DESCRIPTION, false); + AmpTextFieldPanel description = new AmpTextFieldPanel<>("description", new PropertyModel<>(model, "description"), COMPONENT_FUNDING_DESCRIPTION, false); item.add(description); +// final AmpNewResourceFieldPanel newDoc = +// new AmpNewResourceFieldPanel("addNewDocument", am, "Add New Document", resourcesList, false); +// newDoc.setOutputMarkupId(true); +// add(newDoc); + item.add(new ListEditorRemoveButton("delete", "Delete")); } }; @@ -114,8 +212,8 @@ private AmpSelectFieldPanel buildSelectFieldPanel(String id, St IModel model, AbstractReadOnlyModel> orgsList) { - AmpSelectFieldPanel selectField = new AmpSelectFieldPanel(id, - new PropertyModel(model, expression), orgsList, fmName + AmpSelectFieldPanel selectField = new AmpSelectFieldPanel<>(id, + new PropertyModel<>(model, expression), orgsList, fmName , false, true, null, false); selectField.add(UpdateEventBehavior.of(FundingOrgListUpdateEvent.class)); selectField.getChoiceContainer().add(new AttributeModifier("style", "width: 100px;")); @@ -135,16 +233,13 @@ private AbstractReadOnlyModel> getSubsetModel( final I @Override public List getObject() { - List result = new ArrayList(); + List result = new ArrayList<>(); Set allComp = compFundsModel.getObject(); if (allComp != null){ - Iterator iterator = allComp.iterator(); - while (iterator.hasNext()) { - AmpComponentFunding comp = (AmpComponentFunding) iterator - .next(); + for (AmpComponentFunding comp : allComp) { if (comp.getTransactionType() == transactionType) //if (comp.getComponent().hashCode() == componentModel.getObject().hashCode()) - result.add(comp); + result.add(comp); } } diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpDonorCommitmentsFormTableFeature.html b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpDonorCommitmentsFormTableFeature.html index bbca7ed410f..0984b4aba41 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpDonorCommitmentsFormTableFeature.html +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpDonorCommitmentsFormTableFeature.html @@ -7,7 +7,8 @@
- + + diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpGPINiSurveyResourcesFormTableFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpGPINiSurveyResourcesFormTableFeature.java index 5871efeb569..4eeaccefbe6 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpGPINiSurveyResourcesFormTableFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpGPINiSurveyResourcesFormTableFeature.java @@ -97,13 +97,14 @@ public List getObject() { .ofNullable(getSession().getMetaData(OnePagerConst.GPI_RESOURCES_DELETED_ITEMS)) .orElse(new HashSet()); - List ret = new ArrayList(); - if (refreshExistingDocs) { existingTmpDocs = getExistingObject(); } + if (existingTmpDocs==null){ + existingTmpDocs=new ArrayList<>(); + } - ret.addAll(existingTmpDocs); + List ret = new ArrayList<>(existingTmpDocs); for (AmpGPINiSurveyResponseDocument d : setModel.getObject()) { if (delItems.contains(d)) { @@ -211,7 +212,7 @@ public void onClick(AjaxRequestTarget target) { newItems.remove(item.getModelObject()); } target.add(list.getParent()); - responseValidationFields.stream().forEach(r -> r.reloadValidationField(target, false)); + responseValidationFields.forEach(r -> r.reloadValidationField(target, false)); } }; item.add(delRelOrg); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java index 112e8f3e990..4187e3c0164 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java @@ -128,19 +128,19 @@ public List getObject() { HashSet delItems = getSession().getMetaData(OnePagerConst.RESOURCES_DELETED_ITEMS); if (delItems == null) delItems = new HashSet(); - List ret = new ArrayList(); if (refreshExistingDocs) existingTmpDocs = getExistingObject(); - ret.addAll(existingTmpDocs); + if (existingTmpDocs==null) + { + existingTmpDocs=new ArrayList<>(); + } + List ret = new ArrayList<>(existingTmpDocs); if (am.getObject().getActivityDocuments() == null) am.getObject().setActivityDocuments(new HashSet()); - Iterator it = setModel.getObject().iterator(); - while (it.hasNext()) { - AmpActivityDocument d = (AmpActivityDocument) it - .next(); + for (AmpActivityDocument d : setModel.getObject()) { //check if marked for delete if (delItems.contains(d)) { for (TemporaryDocument td : existingTmpDocs) { @@ -224,10 +224,10 @@ protected void populateItem(final ListItem item) { if (webLink != null && webLink.length() > 0) { if (!webLink.startsWith("http")) webLink = "http://" + webLink; - ExternalLink link = new ExternalLink("download", new Model(webLink)); + ExternalLink link = new ExternalLink("download", new Model<>(webLink)); item.add(link); WebMarkupContainer downloadLinkImg = new WebMarkupContainer("downloadImage"); - downloadLinkImg.add(new AttributeModifier("src", new Model("/TEMPLATE/ampTemplate/img_2/ico_attachment.png"))); + downloadLinkImg.add(new AttributeModifier("src", new Model<>("/TEMPLATE/ampTemplate/img_2/ico_attachment.png"))); link.add(downloadLinkImg); } else { Link downloadLink = new Link("download") { @@ -241,7 +241,7 @@ public void onClick() { String contentType = item.getModelObject().getFileName(); int index = contentType.lastIndexOf('.'); - String extension = contentType.substring(index + 1, contentType.length()); + String extension = contentType.substring(index + 1); String extPath = "/TEMPLATE/ampTemplate/images/icons/" + extension + ".gif"; File extImgFile = new File(WebApplication.get().getServletContext().getRealPath(extPath)); if (!extImgFile.exists()) @@ -250,7 +250,7 @@ public void onClick() { extPath = "/TEMPLATE/ampTemplate/images/icons/" + extension + ".gif"; WebMarkupContainer downloadLinkImg = new WebMarkupContainer("downloadImage"); - downloadLinkImg.add(new AttributeModifier("src", new Model(extPath))); + downloadLinkImg.add(new AttributeModifier("src", new Model<>(extPath))); downloadLink.add(downloadLinkImg); } @@ -260,7 +260,7 @@ public void onClick(AjaxRequestTarget target) { if (item.getModelObject().isExisting()) { HashSet delItems = getSession().getMetaData(OnePagerConst.RESOURCES_DELETED_ITEMS); if (delItems == null) { - delItems = new HashSet(); + delItems = new HashSet<>(); getSession().setMetaData(OnePagerConst.RESOURCES_DELETED_ITEMS, delItems); } delItems.add(item.getModelObject().getExistingDocument()); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpSectorsFormTableFeature.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpSectorsFormTableFeature.java index 1359faa6cee..eb2a4255d9c 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpSectorsFormTableFeature.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/features/tables/AmpSectorsFormTableFeature.java @@ -51,7 +51,7 @@ public AmpSectorsFormTableFeature(String id, String fmName, final AmpClassificationConfiguration sectorClassification) throws Exception { super(id, am, fmName, false, true); - final IModel> setModel = new PropertyModel>( + final IModel> setModel = new PropertyModel<>( am, "sectors"); if (setModel.getObject() == null) setModel.setObject(new HashSet()); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java index f082691c2a7..5b26de81eea 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java @@ -98,8 +98,7 @@ public AmpCategoryFieldPanel(String id, String categKey, String fmName, public List getObject() { try { - List collectionByKey = CategoryManagerUtil.getAllAcceptableValuesForACVClass(categoryKey, relatedChoicesModel == null ? null : relatedChoicesModel.getObject()); - return collectionByKey; + return CategoryManagerUtil.getAllAcceptableValuesForACVClass(categoryKey, relatedChoicesModel == null ? null : relatedChoicesModel.getObject()); } catch (Exception e) { logger.error(e.getMessage(), e); throw new RuntimeException(e); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.html b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.html new file mode 100644 index 00000000000..07f47814292 --- /dev/null +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.html @@ -0,0 +1,61 @@ + + + + + + + + +
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ ...* + + +
+
+
+ + +
+
+
+
+
\ No newline at end of file diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.java new file mode 100644 index 00000000000..2e30c4f5c98 --- /dev/null +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.java @@ -0,0 +1,393 @@ +package org.dgfoundation.amp.onepager.components.fields; + +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.MetaDataKey; +import org.apache.wicket.Session; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.upload.FileUpload; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.util.upload.FileItem; +import org.dgfoundation.amp.onepager.AmpAuthWebSession; +import org.dgfoundation.amp.onepager.OnePagerConst; +import org.dgfoundation.amp.onepager.OnePagerUtil; +import org.dgfoundation.amp.onepager.components.features.AmpFeaturePanel; +import org.dgfoundation.amp.onepager.components.features.tables.AmpComponentFundingResourcesTableFeature; +import org.dgfoundation.amp.onepager.components.upload.FileUploadPanel; +import org.dgfoundation.amp.onepager.helper.ResourceTranslation; +import org.dgfoundation.amp.onepager.helper.ResourceTranslationStore; +import org.dgfoundation.amp.onepager.helper.TemporaryComponentFundingDocument; +import org.dgfoundation.amp.onepager.helper.TemporaryDocument; +import org.dgfoundation.amp.onepager.models.ResourceTranslationModel; +import org.dgfoundation.amp.onepager.translation.TranslatorUtil; +import org.dgfoundation.amp.onepager.translation.TrnLabel; +import org.dgfoundation.amp.onepager.util.AmpFMTypes; +import org.digijava.kernel.ampapi.endpoints.filetype.FileTypeManager; +import org.digijava.kernel.ampapi.endpoints.filetype.FileTypeValidationResponse; +import org.digijava.kernel.ampapi.endpoints.filetype.FileTypeValidationStatus; +import org.digijava.kernel.translator.TranslatorWorker; +import org.digijava.module.aim.dbentity.AmpComponentFunding; +import org.digijava.module.aim.helper.GlobalSettingsConstants; +import org.digijava.module.aim.util.FeaturesUtil; +import org.digijava.module.contentrepository.util.DocumentManagerUtil; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +public class AmpComponentFundingNewResourceFieldPanel extends AmpFeaturePanel { + + + private static final long serialVersionUID = 1L; + + protected WebMarkupContainer webLinkFeedbackContainer; + protected Label webLinkFeedbackLabel; + boolean resourceIsURL = false; + protected boolean pathSelected; + protected boolean urlSelected; + protected boolean contentValid; + + final protected String DEFAULT_MESSAGE = "*" + TranslatorUtil.getTranslatedText("Please enter title"); + final protected String URL_NOT_SELECTED = "*" + TranslatorUtil.getTranslatedText("URL not selected"); + final protected String FILE_PATH_NOT_SELECTED = "*" + TranslatorUtil.getTranslatedText("File not submitted or upload has not finished"); + final protected String CONTENT_TYPE_NOT_ALLOWED = "*" + TranslatorUtil.getTranslatedText("Content type not allowed:"); + final protected String CONTENT_TYPE_EXTENSION_MISMATCH = "*" + TranslatorUtil.getTranslatedText("File extension does not match the actual file format:"); + final protected String CONTENT_TYPE_INTERNAL_ERROR = "*" + TranslatorUtil.getTranslatedText("Internal error during the content validation"); + + boolean webLinkFormatCorrect; + protected Model newResourceIdModel = new Model<>(); + + public AmpComponentFundingNewResourceFieldPanel(final String id, + final IModel model, + final String fmName, + final AmpComponentFundingResourcesTableFeature resourcesList) { + + super(id, model, fmName, true); + + TemporaryComponentFundingDocument tmpDoc = new TemporaryComponentFundingDocument (); + String docId =generateResourceKey("newResource"); + newResourceIdModel.setObject(docId); + tmpDoc.setNewTemporaryDocumentId(docId); + final IModel td = new Model<>(tmpDoc); + final ResourceTranslationModel titleModel = new ResourceTranslationModel(new PropertyModel(td, "title"),newResourceIdModel); + final AmpTextFieldPanel name = new AmpTextFieldPanel<>("componentFundingDocumentDocTitle", titleModel, "Title", AmpFMTypes.MODULE, Boolean.TRUE); + name.setTextContainerDefaultMaxSize(); + name.setOutputMarkupId(true); + final ResourceTranslationModel descModel = new ResourceTranslationModel(new PropertyModel(td, "description"),newResourceIdModel); + final AmpTextAreaFieldPanel desc = new AmpTextAreaFieldPanel("componentFundingDocumentDocDesc", descModel, "Description", false, false, false); + desc.setOutputMarkupId(true); + final ResourceTranslationModel noteModel = new ResourceTranslationModel(new PropertyModel(td, "note"),newResourceIdModel); + final AmpTextAreaFieldPanel note = new AmpTextAreaFieldPanel("componentFundingDocumentDocNote",noteModel, "Note", false, false, false); + note.setOutputMarkupId(true); +// final AmpCategorySelectFieldPanel type = new AmpCategorySelectFieldPanel("docType", CategoryConstants.DOCUMENT_TYPE_KEY, new PropertyModel(td, "type"), "Type", true, true); + //FileUploadField file = new FileUploadField("file", new AmpFileUploadModel(new PropertyModel(td, "file"))); + //file.setOutputMarkupId(true); + + String componentId = "new"; + if (model.getObject().getAmpComponentFundingId() != null) + componentId = Long.toString(model.getObject().getAmpComponentFundingId()); + final Model fileItemModel = new Model(); + FileUploadPanel fileUpload = new FileUploadPanel("componentFundingDocumentFile",componentId, fileItemModel); + +// final AmpTextFieldPanel webLink = new AmpTextFieldPanel("webLink", +// new PropertyModel(td, "webLink"), "Web Link", true, true); +// webLink.setTextContainerDefaultMaxSize(); +// webLink.setVisibilityAllowed(false); +// webLink.setOutputMarkupId(true); + + String resourceLabelModel = "File"; +// if (newResourceIsWebLink) { +// resourceLabelModel = "Web Link"; +// resourceIsURL = true; +// } + + TrnLabel resourceLabel = new TrnLabel("componentFundingDocumentResourceLabel", resourceLabelModel); + + // create the form + final Form form = new Form("componentFundingDocumentForm") { + + /** + * @see org.apache.wicket.markup.html.form.Form#onSubmit() + */ + @Override + protected void onSubmit() { + TemporaryComponentFundingDocument tmp = td.getObject(); + + if (fileItemModel.getObject() != null) + tmp.setFile(new FileUpload(fileItemModel.getObject())); + + if (updateVisibility(td.getObject(), resourceIsURL)) { + if (tmp.getFile() != null){ + double fSize = tmp.getFile().getSize()*100/(1024*1024); + fSize = fSize/100; + tmp.setFileSize(fSize); + tmp.setFileName(tmp.getFile().getClientFileName()); + tmp.setContentType(tmp.getFile().getContentType()); + } + + if (tmp.getWebLink() != null) { + tmp.setWebLink(DocumentManagerUtil.processUrl(tmp.getWebLink(), null)); + tmp.setFileName(tmp.getWebLink()); + } + + tmp.setDate(Calendar.getInstance()); + tmp.setYear(String.valueOf((tmp.getDate()).get(Calendar.YEAR))); +// HashSet newItemsSet = getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS).get(model.getObject().getJustAnId()); +// if (newItemsSet == null) { +// newItemsSet = new HashSet<>(); +//// getSession().getMetaData(OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS).get(model.getObject().getJustAnId()).addAll(newItemsSet); +// } + + MetaDataKey>> metaDataKey = OnePagerConst.COMPONENT_FUNDING_NEW_ITEMS; + + HashMap> metaData = getSession().getMetaData(metaDataKey); + + if (metaData == null) { + metaData = new HashMap<>(); + } + getSession().setMetaData(metaDataKey, metaData); + + HashSet newItemsSet = metaData.computeIfAbsent(model.getObject().getJustAnId(), k -> new HashSet<>()); + + +// existingSet.addAll(newItemsSet); + + tmp.setTranslatedDescriptionList(getTranslationsForField(tmp.getNewTemporaryDocumentId(),"description")); + tmp.setTranslatedTitleList(getTranslationsForField(tmp.getNewTemporaryDocumentId(),"title")); + tmp.setTranslatedNoteList(getTranslationsForField(tmp.getNewTemporaryDocumentId(),"description")); + newItemsSet.add(tmp); + TemporaryComponentFundingDocument tmpDoc = new TemporaryComponentFundingDocument(); + String docId = generateResourceKey("newResource"); + newResourceIdModel.setObject(docId); + tmpDoc.setNewTemporaryDocumentId(docId); + td.setObject(tmpDoc); + fileItemModel.setObject(null); + } + } + }; + + add(createAddNewLink(fmName)); + + WebMarkupContainer rc = new WebMarkupContainer("componentFundingDocumentResourcePanel"); + rc.add(new AttributeModifier("id", getToggleId())); + rc.add(form); + rc.add(name); + rc.add(fileUpload); + rc.setOutputMarkupId(true); + add(rc); + +// if (newResourceIsWebLink){ +// fileUpload.setVisible(false); +// webLink.setVisibilityAllowed(true); +// } + + form.add(name); + form.add(desc); + form.add(note); +// form.add(type); + form.add(fileUpload); + form.add(resourceLabel); +// form.add(webLink); + + // create the ajax button used to submit the form + AmpButtonField submit = new AmpButtonField("componentFundingDocumentAjaxSubmit", "Add", true){ + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + TemporaryDocument tmp = td.getObject(); + if (fileItemModel.getObject() != null) + tmp.setFile(new FileUpload(fileItemModel.getObject())); + target.add(name); + target.add(desc); + target.add(note); +// target.add(type); + +// if (webLink.isVisibleInHierarchy()) { +// target.add(webLink); +// } + + target.add(resourcesList); +// target.add(webLinkFeedbackContainer); + if (updateVisibility(td.getObject(), resourceIsURL)){ + target.appendJavaScript("$('#" + getToggleId() + "').hide();"); + target.appendJavaScript("$('#" + getToggleId() + "').find('[role=fileUploadedMsg]').html('');"); + target.appendJavaScript("$('#uploadLabel').text('" + TranslatorWorker.translateText("No file chosen") + "');"); + + } + } + }; + + form.add(submit); + form.add(createCancelButton()); + + createWebLinkFeedbackContainer(); + form.add(webLinkFeedbackContainer); + } + + protected AjaxLink createAddNewLink(final String fmName) { + final String newDocumentGenKey = TranslatorWorker.generateTrnKey(fmName); + final AjaxLink addNewLink = new AjaxLink("componentFundingDocumentPanelLink"){ + public void onClick(AjaxRequestTarget target) { +// target.prependJavaScript(OnePagerUtil.getToggleChildrenJS(this)); + target.prependJavaScript(OnePagerUtil.getToggleChildrenJSComponentFunding(this, getToggleId())); + } + + @Override + protected void onConfigure() { + super.onConfigure(); + configureTranslationMode(this, newDocumentGenKey); + } + }; + addNewLink.add(new Label("componentFundingDocumentLinkText", TranslatorWorker.translateText(fmName))); + + return addNewLink; + } + + protected AmpAjaxLinkField createCancelButton() { + + return new AmpAjaxLinkField("componentFundingDocumentCancel", "Cancel", "Cancel") { + @Override + protected void onClick(AjaxRequestTarget target) { + target.appendJavaScript("$('#" + getToggleId() + "').hide();"); + target.appendJavaScript("$('#" + getToggleId() + "').find('[role=fileUploadedMsg]').html('');"); + target.appendJavaScript("$('#uploadLabel').text('" + TranslatorWorker.translateText("No file chosen") + "');"); +// webLinkFeedbackContainer.setVisible(false); + } + }; + } + + protected void createWebLinkFeedbackContainer() { + webLinkFeedbackContainer = new WebMarkupContainer("webLinkFeedbackContainer"); + webLinkFeedbackContainer.setOutputMarkupId(true); + webLinkFeedbackContainer.setOutputMarkupPlaceholderTag(true); + webLinkFeedbackContainer.setVisible(false); + + webLinkFeedbackLabel = new Label("webLinkFeedbackLabel", new Model(DEFAULT_MESSAGE)); + webLinkFeedbackContainer.add(webLinkFeedbackLabel); + } + + protected boolean updateVisibility(TemporaryDocument resource, boolean newResourceIsWebLink) { + boolean noErrors = true; + boolean titleSelected = !(resource.getTitle() == null || resource.getTitle().length() == 0); + + String conentValidationMessage = ""; + + if (newResourceIsWebLink){ + urlSelected = resource.getWebLink() != null && resource.getWebLink().length() != 0; + } else { + pathSelected = resource.getFile() != null; + contentValid = true; + if (pathSelected) { + // validate the content of the file AMP-24920 + if (isEnabledMimeTypeValidation()) { + try { + FileTypeManager mimeTypeManager = FileTypeManager.getInstance(); + InputStream is = new BufferedInputStream(resource.getFile().getInputStream()); + FileTypeValidationResponse validationResponse = mimeTypeManager.validateFileType(is, resource.getFile().getClientFileName()); + if (validationResponse.getStatus() != FileTypeValidationStatus.ALLOWED) { + if (validationResponse.getStatus() == FileTypeValidationStatus.NOT_ALLOWED) { + conentValidationMessage = CONTENT_TYPE_NOT_ALLOWED + " " + + validationResponse.getDescription(); + + } else if (validationResponse.getStatus() == FileTypeValidationStatus.CONTENT_EXTENSION_MISMATCH) { + conentValidationMessage = CONTENT_TYPE_EXTENSION_MISMATCH + " " + + resource.getFile().getClientFileName() + " " + + TranslatorUtil.getTranslatedText("is a ") + " " + + validationResponse.getDescription() + " (" + + validationResponse.getContentName() + ")"; + } else { + conentValidationMessage = CONTENT_TYPE_INTERNAL_ERROR; + } + contentValid = false; + } + } catch (IOException e) { + conentValidationMessage = CONTENT_TYPE_INTERNAL_ERROR; + contentValid = false; + } + } + } + } + + if (!titleSelected && !((pathSelected && contentValid))) { + noErrors = false; + if (!titleSelected) { + webLinkFeedbackLabel.setDefaultModelObject(DEFAULT_MESSAGE); + } else if (!pathSelected && !newResourceIsWebLink) { + webLinkFeedbackLabel.setDefaultModelObject(FILE_PATH_NOT_SELECTED); + } else if (!contentValid && !newResourceIsWebLink) { + webLinkFeedbackLabel.setDefaultModelObject(conentValidationMessage); + } else if (!urlSelected && newResourceIsWebLink) { + webLinkFeedbackLabel.setDefaultModelObject(URL_NOT_SELECTED); + } + } + + return noErrors; + } + + private boolean isEnabledMimeTypeValidation() { + return FeaturesUtil.getGlobalSettingValueBoolean(GlobalSettingsConstants.LIMIT_FILE_TYPE_FOR_UPLOAD); + } + + protected String generateResourceKey(String id) { + AmpAuthWebSession session = ((AmpAuthWebSession) Session.get()); + String eKey = id + "-" + session.getCurrentMember().getMemberId() + "-"; + eKey = eKey + System.currentTimeMillis(); + + return eKey; + } + + private List getTranslationsForField (String id, String field) { + List translationsList; + HashMap translationMap = Session.get().getMetaData( + OnePagerConst.RESOURCES_TRANSLATIONS); + if (translationMap != null) { + ResourceTranslationStore store = translationMap.get(id); + if (store != null) { + translationsList = store.getResourceFieldTranslations().get(field); + return translationsList; + } + } + return null; + } + + protected void configureTranslationMode(AjaxLink link, String key) { + if (TranslatorUtil.isTranslatorMode(getSession())){ + link.setOutputMarkupId(true); + link.add(new AttributeAppender("style", new Model("text-decoration: underline; color: #0CAD0C;"), "")); + link.add(new AttributeModifier("key", key)); +// link.add(new AttributeModifier("onclick", "$('#" + getToggleId() + "').slideToggle();spawnEditBox(this.id)")); + link.add(new AttributeModifier("onclick", String.format("$(this).closest('tr.wicketFundingRowItem').find('#%s').slideToggle();spawnEditBox(this.id)",getToggleId()))); +// link.add(new AttributeModifier("onclick", "toggleElement(this, '" + getToggleId() + "');spawnEditBox(this.id)")); +// link.add(new AttributeModifier("onclick", "var row = $(this).closest('tr'); var element = row.find('#" + getToggleId() + "'); element.slideToggle(); return false;spawnEditBox(this.id)")); + + } else { + link.add(AttributeModifier.remove("key")); + link.add(AttributeModifier.remove("style")); + link.add(AttributeModifier.remove("onclick")); +// link.add(new AttributeModifier("onclick", "$('#" + getToggleId() + "').slideToggle();")); + link.add(new AttributeModifier("onclick", String.format("$(this).closest('tr.wicketFundingRowItem').find('#%s').slideToggle();",getToggleId()))); +// link.add(new AttributeModifier("onclick", "console.log('Link clicked'); var row = $(this).closest('tr'); var element = row.find('#" + getToggleId() + "'); console.log(element); element.slideToggle(); return false;")); + +// link.add(new AttributeModifier("onclick", "toggleElement(this, '" + getToggleId() + "');")); + + } + } + + protected String getToggleId() { + if (TranslatorUtil.isTranslatorMode(getSession())) { + return getTranlationToggleId(); + } + + return "id_" + getId(); + } + + protected String getTranlationToggleId() { + return getId() + "H"; + } +} diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpExistingDocumentFieldPanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpExistingDocumentFieldPanel.java index 08652ee74fa..3bd9f750933 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpExistingDocumentFieldPanel.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpExistingDocumentFieldPanel.java @@ -142,7 +142,7 @@ public Integer getChoiceLevel(NodeWrapper choice) { private void configureTranslationMode (AjaxLink link, String key, String id) { if (TranslatorUtil.isTranslatorMode(getSession())){ link.setOutputMarkupId(true); - link.add(new AttributeAppender("style", new Model("text-decoration: underline; color: #0CAD0C;"), "")); + link.add(new AttributeAppender("style", new Model<>("text-decoration: underline; color: #0CAD0C;"), "")); link.add(new AttributeModifier("key", key)); link.add(new AttributeModifier("onclick", "$('#"+id+"').slideToggle();spawnEditBox(this.id)")); } else{ diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpTextAreaFieldPanel.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpTextAreaFieldPanel.java index fd11095481e..343eefaf42b 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpTextAreaFieldPanel.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/fields/AmpTextAreaFieldPanel.java @@ -61,7 +61,7 @@ public AmpTextAreaFieldPanel(String id,IModel model, String fmName,boole model = (IModel) new EditorWrapperModel((IModel) model, id); } final IModel finalModel = model; - textAreaContainer = new TextArea("richText", TranslationDecorator.proxyModel((IModel) model)){ + textAreaContainer = new TextArea("richText", TranslationDecorator.proxyModel(model)){ @Override protected void onInitialize() { //get validators and put them in the {@link TranslatableValidators} diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java index a343c4a9c63..450ffdde237 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java @@ -79,6 +79,7 @@ public void renderHead(final Component component, IHeaderResponse response) { variables.put("uploadFailedMsg", TranslatorUtil.getTranslatedText("Upload failed! Please try again.")); variables.put("uploadStartedMsg", TranslatorUtil.getTranslatedText("Upload started, please wait...")); variables.put("uploadFailedTooBigMsg", TranslatorUtil.getTranslatedText("The file size limit is {size} MB. This file exceeds the limit.").replace("{size}", maxFileSizeGS)); + variables.put("uploadFailedTooSmallMsg", TranslatorUtil.getTranslatedText("This file is empty.Please upload a non-empty file.")); variables.put("uploadMaxFileSize", Long.toString(Bytes.megabytes(Long.parseLong(maxFileSizeGS)).bytes())); variables.put("uploadNoFileLabel", TranslatorWorker.translateText("No file chosen")); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js index 70d07f3caaa..b081c8bd123 100644 --- a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js @@ -26,7 +26,20 @@ function setupFileUpload(componentId, componentUrl, componentParamName){ $('#uploadLabel').text("${uploadNoFileLabel}"); $(this).find('[role=fileUploadedMsg]').html(''); $(this).find('[role=fileUploadedMsg]').hide(); - } else { + } else if (data.files[0].size <= 0) { + alert("${uploadFailedTooSmallMsg}"); + $('#uploadLabel').text("${uploadNoFileLabel}"); + $(this).find('[role=fileUploadedMsg]').html(''); + $(this).find('[role=fileUploadedMsg]').hide(); + } else if (data.title === '') { + alert("Document Title must be present."); + $('#uploadLabel').text("${uploadNoFileLabel}"); + $(this).find('[role=fileUploadedMsg]').html(''); + $(this).find('[role=fileUploadedMsg]').hide(); + } + + + else { $(this).find('[role=fileUploadedMsg]').show(); $(this).find('[role=fileUploadedMsg]').html(" \"" + "${uploadStartedMsg}" + data.files[0].size + "\" bytes"); data.submit(); diff --git a/amp/WEB-INF/src/org/dgfoundation/amp/onepager/helper/TemporaryComponentFundingDocument.java b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/helper/TemporaryComponentFundingDocument.java new file mode 100644 index 00000000000..027ec9f6d67 --- /dev/null +++ b/amp/WEB-INF/src/org/dgfoundation/amp/onepager/helper/TemporaryComponentFundingDocument.java @@ -0,0 +1,76 @@ +package org.dgfoundation.amp.onepager.helper; + +import org.digijava.module.aim.dbentity.AmpComponentFundingDocument; +import org.digijava.module.contentrepository.jcrentity.Label; + +import java.util.List; + +public class TemporaryComponentFundingDocument extends TemporaryDocument{ + private String description; + private String note; + private String year; + + private List
diff --git a/amp/repository/aim/view/viewGlobalSettings.jsp b/amp/repository/aim/view/viewGlobalSettings.jsp index 584cbaf84d0..278cac49882 100644 --- a/amp/repository/aim/view/viewGlobalSettings.jsp +++ b/amp/repository/aim/view/viewGlobalSettings.jsp @@ -65,6 +65,7 @@ sections.add("funding"); sections.add("date"); sections.add("user"); + sections.add("trubudget"); %> @@ -279,7 +280,7 @@ var enterBinder = new EnterHitBinder('gsSaveAllBtn'); -

General Settings

+

Global Settings

diff --git a/amp/repository/digi-common.xml b/amp/repository/digi-common.xml index 0028f4e720f..e7df689fb89 100644 --- a/amp/repository/digi-common.xml +++ b/amp/repository/digi-common.xml @@ -21,6 +21,12 @@ org.digijava.kernel.request.SiteDomain + org.digijava.kernel.entity.trubudget.TruBudgetIntent + org.digijava.kernel.entity.trubudget.SubIntents + org.digijava.module.aim.dbentity.AmpComponentFundingDocument + org.digijava.module.trubudget.dbentity.TruBudgetActivity + org.digijava.module.trubudget.dbentity.AmpComponentFundingTruWF + org.digijava.module.trubudget.dbentity.AmpComponentTruSubProject org.digijava.kernel.entity.Address org.digijava.kernel.entity.GeoRegion org.digijava.kernel.user.User diff --git a/amp/repository/um/view/addUser.jsp b/amp/repository/um/view/addUser.jsp index 2b2d9533198..effd62913fc 100644 --- a/amp/repository/um/view/addUser.jsp +++ b/amp/repository/um/view/addUser.jsp @@ -127,6 +127,8 @@ lastname = document.umAddUserForm.lastName.value; password = document.umAddUserForm.password.value; passwordConfirmation = document.umAddUserForm.passwordConfirmation.value; + truBudgetPassword = document.umAddUserForm.truBudgetPassword.value; + // truBudgetPasswordConfirmation = document.umAddUserForm.truBudgetPasswordConfirmation.value; selectedOrgType = document.umAddUserForm.selectedOrgType.value; selectedOrgGroup = document.umAddUserForm.selectedOrgGroup.value; selectedOrganizationId = document.umAddUserForm.selectedOrganizationId.value; @@ -190,6 +192,13 @@ alert("${translation}"); return false; } + <%--if(truBudgetPassword !== truBudgetPasswordConfirmation){--%> + <%-- --%> + <%-- Both Trubudget Passwords must be the same--%> + <%-- --%> + <%-- alert("${translation}");--%> + <%-- return false;--%> + <%--}--%> if(selectedOrgType=="-1"){ Please enter Organization Type @@ -478,6 +487,42 @@ + + + +   + +<%-- *--%> + TruBudget Permissions + + + + + + + + + +   + + * + Enter TruBudget Password + + + + +<%-- --%> +<%--  --%> +<%-- --%> +<%-- *--%> +<%-- Repeat TruBudget Password--%> +<%-- --%> +<%-- +<%-- size="20" autocomplete="new-password" />--%> +<%-- --%> +<%-- --%> +   @@ -536,6 +581,7 @@ +   diff --git a/amp/repository/um/view/userRegister.jsp b/amp/repository/um/view/userRegister.jsp index 930f11f3a54..0906e06f62b 100644 --- a/amp/repository/um/view/userRegister.jsp +++ b/amp/repository/um/view/userRegister.jsp @@ -1 +1 @@ -<%@ page language="java" %> <%@ taglib uri="/taglib/struts-bean" prefix="bean" %> <%@ taglib uri="/taglib/struts-logic" prefix="logic" %> <%@ taglib uri="/taglib/struts-tiles" prefix="tiles" %> <%@ taglib uri="/taglib/struts-html" prefix="html" %> <%@ taglib uri="/taglib/digijava" prefix="digi" %> <%@ taglib uri="/taglib/jstl-core" prefix="c" %>
Register BLANK
To become a member of the Development Gateway, please complete the form below.
 
Account information / about you
All fields marked with an * are required. Please use a valid e-mail address.
  First Name
 *Last Name
 *E-mail Address
 *Repeat Email Address
 *Password
 *Repeat Password
*Country of Residence
 Mailing Address
 *Organization Name
 *Organization Type
 Website
How did you hear about the Development Gateway?
Focus Join
Topics Join
Send me the monthly e-mail newsletter?  
Yes No  
YOUR MEMBERS PROFILE  

In addition to having your name associated with your content contributions, you can create a member profile and appear in the topic directory so that other members can see your organization, country of residence and favorite topics.
Please note that your e-mail address will not be displayed.

Display my member profile Yes No  
Your language settings  
Alert language  
 
I want to view content in following languages  
 
\ No newline at end of file +<%@ page language="java" %> <%@ taglib uri="/taglib/struts-bean" prefix="bean" %> <%@ taglib uri="/taglib/struts-logic" prefix="logic" %> <%@ taglib uri="/taglib/struts-tiles" prefix="tiles" %> <%@ taglib uri="/taglib/struts-html" prefix="html" %> <%@ taglib uri="/taglib/digijava" prefix="digi" %> <%@ taglib uri="/taglib/jstl-core" prefix="c" %>
Register BLANK
To become a member of the Development Gateway, please complete the form below.
 
Account information / about you
All fields marked with an * are required. Please use a valid e-mail address.
  First Name
 *Last Name
 *E-mail Address
 *Repeat Email Address
 *Password
 *Repeat Password
*Country of Residence
 Mailing Address
  <%-- *--%> TruBudget Permissions
* Enter TruBudget Password
 Mailing Address
* Confirm TruBudget Password
 *Organization Name
 *Organization Type
 Website
How did you hear about the Development Gateway?
Focus Join
Topics Join
Send me the monthly e-mail newsletter?  
Yes No  
YOUR MEMBERS PROFILE  

In addition to having your name associated with your content contributions, you can create a member profile and appear in the topic directory so that other members can see your organization, country of residence and favorite topics.
Please note that your e-mail address will not be displayed.

Display my member profile Yes No  
Your language settings  
Alert language  
 
I want to view content in following languages  
 
\ No newline at end of file diff --git a/amp/repository/um/view/viewEditUser.jsp b/amp/repository/um/view/viewEditUser.jsp index 114adca969c..1a4be6e0414 100644 --- a/amp/repository/um/view/viewEditUser.jsp +++ b/amp/repository/um/view/viewEditUser.jsp @@ -331,7 +331,9 @@ function validateUserInfo(){ - + + + Mailing address @@ -340,6 +342,40 @@ function validateUserInfo(){ + + + + + <%-- *--%> + TruBudget Permissions + + + + > + + + + + + + + New TruBudget Password: + + + + + + <%-- --%> + <%-- --%> + <%-- Confirm:--%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> + <%-- --%> +   diff --git a/amp/src/main/resources/applicationContext.xml b/amp/src/main/resources/applicationContext.xml index c2dce1a9380..e9580b607ee 100644 --- a/amp/src/main/resources/applicationContext.xml +++ b/amp/src/main/resources/applicationContext.xml @@ -8,5 +8,7 @@ http://www.springframework.org/schema/context/spring-context.xsd"> + + \ No newline at end of file diff --git a/amp/xmlpatches/2.3.07/v_pledges_projects-AMP-14241.xml b/amp/xmlpatches/2.3.07/v_pledges_projects-AMP-14241.xml index 005a8a99e5c..1b2da834344 100644 --- a/amp/xmlpatches/2.3.07/v_pledges_projects-AMP-14241.xml +++ b/amp/xmlpatches/2.3.07/v_pledges_projects-AMP-14241.xml @@ -7,8 +7,8 @@ + + diff --git a/amp/xmlpatches/general/views/amp_activity.xml b/amp/xmlpatches/general/views/amp_activity.xml index d1ccebe7834..8a58463a209 100644 --- a/amp/xmlpatches/general/views/amp_activity.xml +++ b/amp/xmlpatches/general/views/amp_activity.xml @@ -22,7 +22,8 @@ DROP VIEW IF EXISTS amp_activity CASCADE; CREATE OR REPLACE VIEW amp_activity AS SELECT amp_activity_version.* - FROM amp_activity_version JOIN amp_activity_group ON + FROM amp_activity_version + JOIN amp_activity_group ON amp_activity_version.amp_activity_id = amp_activity_group.amp_activity_last_version_id AND (amp_activity_version.deleted is null or amp_activity_version.deleted=false); diff --git a/amp/xmlpatches/general/views/v_component_funding.xml b/amp/xmlpatches/general/views/v_component_funding.xml index 8f6aa6a2dc8..d5e6939badd 100644 --- a/amp/xmlpatches/general/views/v_component_funding.xml +++ b/amp/xmlpatches/general/views/v_component_funding.xml @@ -1,7 +1,7 @@ + xmlns:tns="http://docs.ampdev.net/schemas/xmlpatcher" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://docs.ampdev.net/schemas/xmlpatcher ../doc/xmlpatcher.xsd "> AMP-16115 Views Constantin Dolghier @@ -13,9 +13,9 @@ SELECT settingsvalue FROM amp_global_settings where settingsname='Recreate the views on the next server restart'; - val.equalsIgnoreCase("true") + val.equalsIgnoreCase("true") - + - + \ No newline at end of file diff --git a/amp/xmlpatches/general/views/v_components.xml b/amp/xmlpatches/general/views/v_components.xml index e9c73ebfd94..8442c30c771 100644 --- a/amp/xmlpatches/general/views/v_components.xml +++ b/amp/xmlpatches/general/views/v_components.xml @@ -28,7 +28,14 @@ f.component_second_rep_org_id AS component_second_rep_org_id, c.type AS component_type_id FROM amp_components c - LEFT JOIN amp_component_funding f ON c.amp_component_id = f.amp_component_id; + LEFT JOIN amp_component_funding f ON c.amp_component_id = f.amp_component_id + WHERE + c.component_status IN ( + SELECT acv.id + FROM amp_category_class acc + JOIN amp_category_value acv ON acv.amp_category_class_id = acc.id + WHERE acc.keyname = 'component_status' AND acv.category_value <> 'Rejected' + ); ]]> diff --git a/amp/xmlpatches/general/views/v_ni_component_funding.xml b/amp/xmlpatches/general/views/v_ni_component_funding.xml index f2d9311c8da..95d66e09610 100644 --- a/amp/xmlpatches/general/views/v_ni_component_funding.xml +++ b/amp/xmlpatches/general/views/v_ni_component_funding.xml @@ -23,21 +23,35 @@ CREATE OR REPLACE VIEW v_ni_component_funding AS SELECT - c.amp_activity_id, - f.amp_component_id, - f.amp_component_funding_id, - f.amp_component_funding_id AS amp_fund_detail_id, - f.transaction_type, - f.adjustment_type, - f.transaction_date, - f.transaction_amount, - 1::decimal AS fixed_exchange_rate, - f.currency_id, - c.type AS component_type_id, - f.rep_organization_id AS component_rep_org_id, - f.component_second_rep_org_id AS component_second_rep_org_id - FROM amp_components c - JOIN amp_component_funding f ON f.amp_component_id = c.amp_component_id; + c.amp_activity_id, + f.amp_component_id, + f.amp_component_funding_id, + f.amp_component_funding_id AS amp_fund_detail_id, + f.transaction_type, + f.adjustment_type, + f.transaction_date, + f.transaction_amount, + 1::decimal AS fixed_exchange_rate, + f.currency_id, + c.type AS component_type_id, + f.rep_organization_id AS component_rep_org_id, + f.component_second_rep_org_id AS component_second_rep_org_id, + c.component_status, + f.component_funding_status +FROM amp_components c + LEFT JOIN amp_component_funding f ON f.amp_component_id = c.amp_component_id AND f.component_funding_status IN ( + SELECT acv.id + FROM amp_category_class acc + JOIN amp_category_value acv ON acv.amp_category_class_id = acc.id + WHERE acc.keyname = 'component_funding_status' AND acv.category_value <> 'Rejected' +) +WHERE + c.component_status IN ( + SELECT acv.id + FROM amp_category_class acc + JOIN amp_category_value acv ON acv.amp_category_class_id = acc.id + WHERE acc.keyname = 'component_status' AND acv.category_value <> 'Rejected' + ); DROP VIEW IF EXISTS v_ni_component_funding_debug CASCADE;