From 4938a5faab18a34abe6e5cefee6705a312d8f28d Mon Sep 17 00:00:00 2001 From: brianbrix Date: Mon, 19 Jan 2026 18:13:16 +0300 Subject: [PATCH 01/25] AMP-31085: Update TruBudget Branch with latest develolp --- amp/pom.xml | 15 + .../CachedMachineTranslationService.java | 28 +- .../amp/onepager/OnePagerConst.java | 9 +- .../amp/onepager/OnePagerUtil.java | 4 + .../features/AmpActivityFormFeature.java | 13 +- .../AmpComponentsFormSectionFeature.java | 6 +- ...AmpComponentsFundingSubsectionFeature.java | 3 + ...ComponentFundingResourcesTableFeature.java | 314 ++++++++ ...mponentIdentificationFormTableFeature.java | 25 + .../AmpComponentsFundingFormTableFeature.java | 122 ++- .../tables/AmpResourcesFormTableFeature.java | 15 +- .../fields/AmpCategoryFieldPanel.java | 3 +- ...ComponentFundingNewResourceFieldPanel.java | 393 ++++++++++ .../components/upload/FileUploadBehavior.java | 1 + .../components/upload/FileUploadBehavior.js | 14 +- .../TemporaryComponentFundingDocument.java | 76 ++ .../onepager/helper/TemporaryDocument.java | 4 +- .../amp/onepager/util/ActivityUtil.java | 308 +++++++- .../gis/services/LocationService.java | 1 - .../kernel/entity/trubudget/SubIntents.java | 58 ++ .../entity/trubudget/TruBudgetIntent.java | 82 ++ .../kernel/user/SqlStartupListener.java | 59 ++ .../kernel/user/TruBudgetIntentGroup.java | 48 ++ .../java/org/digijava/kernel/user/User.java | 48 ++ .../module/aim/action/EditActivity.java | 17 +- .../org/digijava/module/aim/action/Login.java | 4 + .../module/aim/action/RegisterUser.java | 28 + .../module/aim/action/ShowUserRegister.java | 11 +- .../interchange/ActivityFieldsConstants.java | 3 + .../module/aim/auth/AmpPostLoginAction.java | 49 +- .../module/aim/dbentity/AmpComponent.java | 13 + .../aim/dbentity/AmpComponentFunding.java | 56 +- .../dbentity/AmpComponentFundingDocument.java | 114 +++ .../module/aim/dbentity/AmpFunding.java | 203 +++-- .../module/aim/helper/FundingDetail.java | 19 + .../aim/startup/AMPStartupListener.java | 223 +++++- .../startup/AmpBackgroundActivitiesUtil.java | 4 + .../aim/startup/WebClientFactoryBean.java | 30 + .../module/aim/util/ActivityUtil.java | 111 ++- .../module/aim/util/ActivityVersionUtil.java | 1 + .../util/CategoryConstants.java | 21 + .../contentrepository/helper/NodeWrapper.java | 8 +- .../dbentity/AmpComponentFundingTruWF.java | 72 ++ .../dbentity/AmpComponentTruSubProject.java | 59 ++ .../trubudget/dbentity/TruBudgetActivity.java | 46 ++ .../model/project/AssignProjectModel.java | 49 ++ .../model/project/CloseProjectModel.java | 35 + .../model/project/CreateProjectModel.java | 191 +++++ .../model/project/CreateSubProjectModel.java | 185 +++++ .../model/project/EditProjectModel.java | 90 +++ .../project/EditProjectedBudgetModel.java | 86 +++ .../project/ProjectGrantRevokePermModel.java | 56 ++ .../subproject/AssignSubProjectModel.java | 57 ++ .../subproject/CloseSubProjectModel.java | 44 ++ .../subproject/CreateWorkFlowItemModel.java | 232 ++++++ .../model/subproject/EditSubProjectModel.java | 99 +++ .../EditSubProjectedBudgetModel.java | 96 +++ .../subproject/ReorderWorkFlowItemsModel.java | 58 ++ .../SubProjectGrantRevokePermModel.java | 65 ++ .../model/workflowitem/AssignWFItemModel.java | 66 ++ .../model/workflowitem/CloseWFItemModel.java | 69 ++ .../workflowitem/CreateWFResponseModel.java | 151 ++++ .../model/workflowitem/EditWFItemModel.java | 183 +++++ .../workflowitem/ValidateWFDocumentModel.java | 35 + .../WFItemGrantRevokePermModel.java | 74 ++ .../model/workflowitem/WorkflowItem.java | 200 +++++ .../WorkflowItemDetailsModel.java | 250 ++++++ .../module/trubudget/util/ProjectUtil.java | 715 ++++++++++++++++++ .../digijava/module/um/action/AddUser.java | 14 +- .../module/um/action/RegisterUser.java | 25 + .../module/um/action/UserRegister.java | 26 + .../module/um/action/ViewEditUser.java | 69 +- .../digijava/module/um/form/AddUserForm.java | 40 +- .../module/um/form/UserRegisterForm.java | 47 +- .../module/um/form/ViewEditUserForm.java | 38 +- .../um/model/TruGrantPermissionRequest.java | 57 ++ .../module/um/model/TruLoginRequest.java | 90 +++ .../module/um/model/TruLoginResponse.java | 144 ++++ .../um/model/TruRevokePermissionRequest.java | 68 ++ .../digijava/module/um/model/TruUserData.java | 119 +++ .../org/digijava/module/um/util/DbUtil.java | 224 +++++- .../module/um/util/GenericWebClient.java | 171 +++++ .../org/digijava/module/um/util/UmUtil.java | 71 ++ amp/src/main/resources/applicationContext.xml | 2 + amp/src/main/resources/hibernate.cfg.xml | 2 +- ...ComponentFundingResourcesTableFeature.html | 40 + ...mponentIdentificationFormTableFeature.html | 3 + .../AmpComponentsFundingFormTableFeature.html | 4 + ...ComponentFundingNewResourceFieldPanel.html | 58 ++ .../entity/trubudget/SubIntents.hbm.xml | 17 + .../entity/trubudget/TruBudgetIntent.hbm.xml | 21 + .../kernel/user/TruBudgetntentGroup.hbm.xml | 20 + .../org/digijava/kernel/user/User.hbm.xml | 9 + .../module/aim/dbentity/AmpComponent.hbm.xml | 2 + .../aim/dbentity/AmpComponentFunding.hbm.xml | 10 + .../AmpComponentFundingDocument.hbm.xml | 17 + .../dbentity/AmpComponentFundingTruWF.hbm.xml | 18 + .../AmpComponentTruSubProject.hbm.xml | 17 + .../dbentity/TruBudgetActivity.hbm.xml | 16 + ...Recreate-views-on-next-server-starters.xml | 16 + .../xmlpatches/general/views/v_components.xml | 9 +- .../general/views/v_ni_component_funding.xml | 42 +- .../activitypreview/componentsSection.jsp | 16 + .../jsp/aim/view/viewGlobalSettings.jsp | 2 +- .../webapp/WEB-INF/jsp/um/view/addUser.jsp | 36 + .../WEB-INF/jsp/um/view/userRegister.jsp | 2 +- .../WEB-INF/jsp/um/view/viewEditUser.jsp | 34 + .../WEB-INF/moduleConfig/digi-common.xml | 6 + 108 files changed, 7166 insertions(+), 283 deletions(-) create mode 100644 amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java create mode 100644 amp/src/main/java/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.java create mode 100644 amp/src/main/java/org/dgfoundation/amp/onepager/helper/TemporaryComponentFundingDocument.java create mode 100644 amp/src/main/java/org/digijava/kernel/entity/trubudget/SubIntents.java create mode 100644 amp/src/main/java/org/digijava/kernel/entity/trubudget/TruBudgetIntent.java create mode 100644 amp/src/main/java/org/digijava/kernel/user/SqlStartupListener.java create mode 100644 amp/src/main/java/org/digijava/kernel/user/TruBudgetIntentGroup.java create mode 100644 amp/src/main/java/org/digijava/module/aim/dbentity/AmpComponentFundingDocument.java create mode 100644 amp/src/main/java/org/digijava/module/aim/startup/WebClientFactoryBean.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/dbentity/AmpComponentFundingTruWF.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/dbentity/AmpComponentTruSubProject.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/dbentity/TruBudgetActivity.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/AssignProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/CloseProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/CreateProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/CreateSubProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/EditProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/EditProjectedBudgetModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/project/ProjectGrantRevokePermModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/AssignSubProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/CloseSubProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/CreateWorkFlowItemModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/EditSubProjectModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/EditSubProjectedBudgetModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/ReorderWorkFlowItemsModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/subproject/SubProjectGrantRevokePermModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/AssignWFItemModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/CloseWFItemModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/CreateWFResponseModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/EditWFItemModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/ValidateWFDocumentModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/WFItemGrantRevokePermModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/WorkflowItem.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/model/workflowitem/WorkflowItemDetailsModel.java create mode 100644 amp/src/main/java/org/digijava/module/trubudget/util/ProjectUtil.java create mode 100644 amp/src/main/java/org/digijava/module/um/model/TruGrantPermissionRequest.java create mode 100644 amp/src/main/java/org/digijava/module/um/model/TruLoginRequest.java create mode 100644 amp/src/main/java/org/digijava/module/um/model/TruLoginResponse.java create mode 100644 amp/src/main/java/org/digijava/module/um/model/TruRevokePermissionRequest.java create mode 100644 amp/src/main/java/org/digijava/module/um/model/TruUserData.java create mode 100644 amp/src/main/java/org/digijava/module/um/util/GenericWebClient.java create mode 100644 amp/src/main/resources/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.html create mode 100644 amp/src/main/resources/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.html create mode 100644 amp/src/main/resources/org/digijava/kernel/entity/trubudget/SubIntents.hbm.xml create mode 100644 amp/src/main/resources/org/digijava/kernel/entity/trubudget/TruBudgetIntent.hbm.xml create mode 100644 amp/src/main/resources/org/digijava/kernel/user/TruBudgetntentGroup.hbm.xml create mode 100644 amp/src/main/resources/org/digijava/module/aim/dbentity/AmpComponentFundingDocument.hbm.xml create mode 100644 amp/src/main/resources/org/digijava/module/trubudget/dbentity/AmpComponentFundingTruWF.hbm.xml create mode 100644 amp/src/main/resources/org/digijava/module/trubudget/dbentity/AmpComponentTruSubProject.hbm.xml create mode 100644 amp/src/main/resources/org/digijava/module/trubudget/dbentity/TruBudgetActivity.hbm.xml create mode 100644 amp/src/main/resources/xmlpatches/4.0/AMP-30754-Recreate-views-on-next-server-starters.xml diff --git a/amp/pom.xml b/amp/pom.xml index 194e7069210..1f6fb8f0e25 100644 --- a/amp/pom.xml +++ b/amp/pom.xml @@ -601,6 +601,21 @@ jackson-databind ${jackson.version} + + io.projectreactor.netty + reactor-netty + 1.0.35 + + + org.springframework + spring-webmvc + 5.3.28 + + + org.springframework + spring-webflux + 5.3.28 + com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider diff --git a/amp/src/main/java/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java b/amp/src/main/java/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java index 3bd8204e5e9..6e4ad6c2ef3 100644 --- a/amp/src/main/java/org/dgfoundation/amp/aitranslation/CachedMachineTranslationService.java +++ b/amp/src/main/java/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/src/main/java/org/dgfoundation/amp/onepager/OnePagerConst.java b/amp/src/main/java/org/dgfoundation/amp/onepager/OnePagerConst.java index 57f4a3de2e3..5bb0ce130c2 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/OnePagerConst.java +++ b/amp/src/main/java/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,7 @@ 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/src/main/java/org/dgfoundation/amp/onepager/OnePagerUtil.java b/amp/src/main/java/org/dgfoundation/amp/onepager/OnePagerUtil.java index 98882f6f1ab..4b1932f5732 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/OnePagerUtil.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/OnePagerUtil.java @@ -185,6 +185,10 @@ public static String getToggleJSPM(Component c) { return String.format(OnePagerConst.toggleJSPM, c.getMarkupId()); } + public static String getToggleChildrenJSComponentFunding(Component c, String id) + { + return String.format(OnePagerConst.toggleChildrenJSComponent,c.getMarkupId(),id); + } /** * Slide the section on refresh diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java index d04c46e95a1..a26f3d9c86d 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/AmpActivityFormFeature.java @@ -937,18 +937,17 @@ private void verifySections(IModel am, boolean alertIfDisbur } //Regional Funding - Set regionalSet = activity.getRegionalFundings(); + 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 : regionalSet) { if (funding.getRegionLocation() == null || verifiedRegions.contains(funding.getRegionLocation().getId())) continue; verifiedRegions.add(funding.getRegionLocation().getId()); - verifySet(new PropertyModel(am, "regionalFundings"), alertIfDisbursementBiggerCommitments, + verifySet(new PropertyModel<>(am, "regionalFundings"), alertIfDisbursementBiggerCommitments, alertIfExpenditureBiggerDisbursement, commitmentErrors, expenditureErrors, funding.getRegionLocation(), TranslatorUtil.getTranslatedText(OnePager.REGIONAL_FUNDING_SECTION_NAME) + ": " + - funding.getRegionLocation().getAutoCompleteLabel()); + funding.getRegionLocation().getAutoCompleteLabel()); } } @@ -957,7 +956,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()); @@ -980,7 +979,7 @@ private void verifySet(PropertyModel detailsModel, boolean alertIfDisbursem if (alertIfExpenditureBiggerDisbursement){ double expenditureSum = sumUp(details, Constants.EXPENDITURE, parent); if (expenditureSum > disbursementSum) - expenditureErrors.put(itemIdentifier, Double.toString(expenditureSum) + " > " + Double.toString(disbursementSum)); + expenditureErrors.put(itemIdentifier, expenditureSum + " > " + disbursementSum); } } diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java index 349c5eeda58..e3b9c13f4bf 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/sections/AmpComponentsFormSectionFeature.java +++ b/amp/src/main/java/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/src/main/java/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java index d5c842fe469..d177bdd393d 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/subsections/AmpComponentsFundingSubsectionFeature.java +++ b/amp/src/main/java/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/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java new file mode 100644 index 00000000000..922f4876a05 --- /dev/null +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentFundingResourcesTableFeature.java @@ -0,0 +1,314 @@ +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; + } + +} \ No newline at end of file diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java index 9ceeda0c55a..ae59beda9c9 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentIdentificationFormTableFeature.java +++ b/amp/src/main/java/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; @@ -96,6 +99,28 @@ protected void onUpdate(AjaxRequestTarget target) { 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/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java index f7d422cc332..59b5a2e6a91 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpComponentsFundingFormTableFeature.java @@ -5,32 +5,35 @@ 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.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.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.persistence.PersistenceManager; +import org.digijava.kernel.user.User; +import org.digijava.module.aim.dbentity.*; 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.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 +65,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,7 +108,57 @@ protected void onPopulateItem(org.dgfoundation.amp.onepager.components.ListItem< item.add(adjustmentTypes); } catch(Exception e) { - logger.error("AmpCategoryGroupFieldPanel initialization failed"); + logger.error("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) + { + logger.error("Unable to add component funding documents table: ",e); } // read the list of organizations from related organizations page, and @@ -114,8 +199,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;")); @@ -138,13 +223,10 @@ public List getObject() { 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/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java index 112e8f3e990..a84af7f0305 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/features/tables/AmpResourcesFormTableFeature.java @@ -128,19 +128,20 @@ 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(); + am.getObject().setActivityDocuments(new HashSet<>()); - 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) { diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java index f082691c2a7..5b26de81eea 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/fields/AmpCategoryFieldPanel.java +++ b/amp/src/main/java/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/src/main/java/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/fields/AmpComponentFundingNewResourceFieldPanel.java new file mode 100644 index 00000000000..0a71edd2334 --- /dev/null +++ b/amp/src/main/java/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"; + } +} \ No newline at end of file diff --git a/amp/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java b/amp/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java index a343c4a9c63..450ffdde237 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.java +++ b/amp/src/main/java/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/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js b/amp/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js index 70d07f3caaa..301be3c83fc 100644 --- a/amp/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js +++ b/amp/src/main/java/org/dgfoundation/amp/onepager/components/upload/FileUploadBehavior.js @@ -26,7 +26,19 @@ 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/src/main/java/org/dgfoundation/amp/onepager/helper/TemporaryComponentFundingDocument.java b/amp/src/main/java/org/dgfoundation/amp/onepager/helper/TemporaryComponentFundingDocument.java new file mode 100644 index 00000000000..bd8d418724f --- /dev/null +++ b/amp/src/main/java/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