From 22713ca924f80d706d30d46412adaa2ebed7ba40 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Thu, 7 Jul 2022 12:36:08 +0200 Subject: [PATCH] in progress --- .../client/GeoPortalDataEntryApp.java | 47 +----- .../ui/form/GeonaDataEntryMainForm.java | 156 +++++++++--------- .../client/ui/tree/NodeItem.java | 143 +++++++++++++++- .../client/ui/tree/NodeItem.ui.xml | 7 + .../client/ui/tree/TreeItemPanel.java | 13 +- .../user/geoportaldataentry/shared/TNode.java | 11 +- 6 files changed, 253 insertions(+), 124 deletions(-) diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/GeoPortalDataEntryApp.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/GeoPortalDataEntryApp.java index fba95dd..60c8329 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/GeoPortalDataEntryApp.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/GeoPortalDataEntryApp.java @@ -143,6 +143,8 @@ public class GeoPortalDataEntryApp implements EntryPoint { private boolean dataEntryProjectCreated = false; + private TreeItemPanel treeItemPanel; + /** * This is the entry point method. */ @@ -417,18 +419,6 @@ public class GeoPortalDataEntryApp implements EntryPoint { String theMetaType = metaDataProfileBean.getType().toLowerCase(); GWT.log("Building form card for type: " + theMetaType); -// // Managing Forms repeatability -// int minOccurs = gcubeProfiles.getMinOccurs(); -// minOccurs = minOccurs <= 0 ? 0 : minOccurs; -// int maxOccurs = gcubeProfiles.getMaxOccurs(); -// maxOccurs = maxOccurs <= 0 ? Integer.MAX_VALUE : maxOccurs; -// -// // TODO MUST BE MANAGED MIN_OCCURS -// ProjectFormCard cct = new ProjectFormCard(gcubeProfiles.getSectionName(), -// gcubeProfiles.getSectionTitle(), order, maxOccurs > 1, minOccurs, maxOccurs); -// GeoNaFormCardModel geonaForm = new GeoNaFormCardModel(metaDataProfileBean, null, cct, -// gcubeProfiles); - GeoNaFormCardModel geonaForm = buildNewFormCardModelFromProfile(gcubeProfile, order, metaDataProfileBean, OPERATION.UPDATE); @@ -468,6 +458,7 @@ public class GeoPortalDataEntryApp implements EntryPoint { */ private GeoNaFormCardModel buildNewFormCardModelFromProfile(GcubeProfileDV gcubeProfile, int order, MetaDataProfileBean metaDataProfileBean, OPERATION operation) { + // Managing Forms repeatability int minOccurs = gcubeProfile.getMinOccurs(); minOccurs = minOccurs <= 0 ? 0 : minOccurs; @@ -488,37 +479,16 @@ public class GeoPortalDataEntryApp implements EntryPoint { } private void buildNewCards(String profileID, String itemTypeTitle, Collection orderedCards) { + projectSavedWithSuccess = false; // resetting state of saving mainTabPanel.setLoaderVisible("Loading...", true); geoNaMainForm.setVisibleFormActions(true); resetUI(); - // ordered values -// for (GeoNaFormCardModel geonaForm : orderedCards) { -// -// // TODO TO TEST -// // if(geonaForm.getFormCardTitle().equals(ProjectFormCard.IMMAGINI_RAPPRESENTATIVE)){ -// -// GWT.log("Adding card: " + geonaForm.getFormCard()); -// CreateMetadataForm baseForm = new CreateMetadataForm(Arrays.asList(geonaForm.getMetadataProfileBean()), -// appManagerBus, operation); -// geonaForm.setMetadataForm(baseForm); -// String key = geonaForm.getMetadataProfileBean().getType(); -// if (geonaForm.getFormCard() != null) { -// key = geonaForm.getFormCard().getTitle(); -// } -// // profileID is unique for all the cards/forms -// geoNaMainForm.addForm(profileID, key, geonaForm); -// mapForms.put(key, geonaForm); -// -// // } -// } - geoNaMainForm.enableButtonSave(true); mainTabPanel.setLoaderVisible("", false); - TreeItemPanel tip = new TreeItemPanel(profileID, itemTypeTitle, orderedCards, appManagerBus); - geoNaMainForm.addTree(tip); - // RootPanel.get(GeoPortalDataEntryApp.DIV_PORTLET_ID).add(tip.getTree()); + treeItemPanel = new TreeItemPanel(profileID, itemTypeTitle, orderedCards, appManagerBus); + geoNaMainForm.addTree(treeItemPanel); } private void resetUI() { @@ -1130,8 +1100,9 @@ public class GeoPortalDataEntryApp implements EntryPoint { // geoNaMainForm.getTreeItemPanel().createAndAddChild(theRootNode.getParentTreeItem(), newNodeFormCard, // canBeDuplicated, true, theRootNode.getJsonSectionFullPath()); - TreeItem newTreeItem = new TreeItem(new NodeItem(root.getParentItem(), newNodeFormCard, canBeDuplicated, true, - theRootNode.getJsonSectionFullPath())); + TreeItem newTreeItem = new TreeItem( + new NodeItem(root.getParentItem(), nodeCard.getGcubeProfile().getSectionTitle(), newNodeFormCard, + canBeDuplicated, true, theRootNode.getJsonSectionFullPath())); String parentText = root.getParentItem() != null ? root.getParentItem().getText() : null; GWT.log("newTreeItem created: " + newTreeItem.getText() + ", parent is: " + parentText); diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/form/GeonaDataEntryMainForm.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/form/GeonaDataEntryMainForm.java index 9de8dfd..e05ff74 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/form/GeonaDataEntryMainForm.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/form/GeonaDataEntryMainForm.java @@ -9,8 +9,10 @@ import org.gcube.portlets.user.geoportaldataentry.client.events.TreeItemEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.TreeItemEvent.ACTION; import org.gcube.portlets.user.geoportaldataentry.client.ui.card.GeoNaFormCardModel; import org.gcube.portlets.user.geoportaldataentry.client.ui.card.MetadataFormCard; +import org.gcube.portlets.user.geoportaldataentry.client.ui.tree.NodeItem; import org.gcube.portlets.user.geoportaldataentry.client.ui.tree.TreeItemPanel; import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject; +import org.gcube.portlets.user.geoportaldataentry.shared.TNode; import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm; import org.gcube.portlets.widgets.mpformbuilder.shared.GenericDatasetBean; @@ -32,6 +34,7 @@ import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.Widget; /** @@ -55,7 +58,7 @@ public class GeonaDataEntryMainForm extends Composite { interface GeonaDataEntryMainFormUiBinder extends UiBinder { } - private List listCards = new ArrayList(); + private TNode nodes = new TNode(); @UiField HTMLPanel mainHTMLPanel; @@ -69,9 +72,6 @@ public class GeonaDataEntryMainForm extends Composite { @UiField ScrollPanel inputPanel; -// @UiField -// TabPanel mainTabPanel; - @UiField AlertBlock alertFormAction; @@ -89,14 +89,14 @@ public class GeonaDataEntryMainForm extends Composite { private LinkedHashMap mapForms = new LinkedHashMap(); - //private List listTabs = new ArrayList(); - private HandlerManager appManagerBus; private String profileID; private TreeItemPanel treeItemPanel; + private boolean canSave = true; + /** * Instantiates a new geona data entry main form. * @@ -155,54 +155,17 @@ public class GeonaDataEntryMainForm extends Composite { inputPanel.add(form); } -// /** -// * Adds the form. -// * -// * @param tabHeading the tab heading -// * @param key -// * @param geonFormModel the geon form model -// */ -// public void addForm(String profileID, String tabHeading, GeoNaFormCardModel geonFormModel) { -// this.profileID = profileID; -// listCards.add(geonFormModel); -// createNewCard(profileID, tabHeading, geonFormModel); -// } - -// /** -// * Creates the new card. -// * -// * @param profileID the profile ID -// * @param tabHeading the tab heading -// * @param geonFormModel the geon form model -// */ -// private void createNewCard(String profileID, String tabHeading, final GeoNaFormCardModel geonFormModel) { -// final Tab tab = new Tab(); -// tab.setHeading(tabHeading); -// // MetadataFormCard mfc = new MetadataFormCard(tab, createMetadataForm, -// // repeatible); -// MetadataFormCard mfc = new MetadataFormCard(tab, geonFormModel, appManagerBus); -// listTabs.add(tab); -// mainTabPanel.add(tab); -// -// if (listTabs.size() == 1) { -// tab.setActive(true); -// mainTabPanel.selectTab(0); -// } -// -// mapForms.put(tabHeading, mfc); -// } - /** * Reset. */ public void resetUI() { navbarTree.setVisible(false); mapForms.clear(); - //mainTabPanel.clear(); + // mainTabPanel.clear(); inputPanel.clear(); - //listTabs.clear(); + // listTabs.clear(); } - + /** * Reset. */ @@ -210,20 +173,44 @@ public class GeonaDataEntryMainForm extends Composite { inputPanel.clear(); } -// /** -// * Select tab. -// * -// * @param index the index -// */ -// public void selectTab(int index) { -// -// GWT.log("Selecting tab index: " + index + " of " + listTabs.size()); -// -// if (listTabs.size() < index) { -// mainTabPanel.selectTab(index); -// + public void validateFormsIntoTree(TreeItem root) { + GWT.log("validateFormsIntoTree called"); + + if (root == null) { + return; + } + + GWT.log("validateFormsIntoTree called for: " + root.getText()); + + for (int i = 0; i < root.getChildCount(); i++) { + TreeItem child = root.getChild(i); + validateFormsIntoTree(child); + } + + NodeItem node = (NodeItem) root.getWidget(); + GWT.log("validateFormsIntoTree called for: " + root.getText() + " node: " + node); + + //Is root + if (node == null) { + return; + } + +// try { +// node = (NodeItem) root.getWidget(); +// boolean isRoot = node.isRoot(); +// if(isRoot) +// return true; +// }catch (Exception e) { +// // TODO: handle exception // } -// } + + boolean isValid = node.validateForm(); + GWT.log("validateFormsIntoTree called for: " + root.getText() + " is valid: " + isValid); + + if (!isValid) { + canSave = false; + } + } /** * Save data. @@ -233,29 +220,46 @@ public class GeonaDataEntryMainForm extends Composite { @UiHandler("buttonSave") void saveData(ClickEvent e) { - boolean canSave = true; + canSave = true; + TreeItem root = treeItemPanel.getRoot(); + validateFormsIntoTree(root); - for (String metadataType : mapForms.keySet()) { - MetadataFormCard card = mapForms.get(metadataType); - boolean isValid = card.validateForm(); - card.setValidCard(isValid); - if (isValid == false) - canSave = false; - } +// boolean canSave = true; +// +// TreeItem root = treeItemPanel.getRoot(); +// +// for (int i=0; i listGeonaFormObjects = new ArrayList(); if (canSave) { - for (String metadataType : mapForms.keySet()) { - MetadataFormCard card = mapForms.get(metadataType); - List listGDB = new ArrayList(card.getListForms().size()); - for (CreateMetadataForm form : card.getListForms()) { - listGDB.add(form.getFormDataBean()); +// for (String metadataType : mapForms.keySet()) { +// MetadataFormCard card = mapForms.get(metadataType); +// List listGDB = new ArrayList(card.getListForms().size()); +// for (CreateMetadataForm form : card.getListForms()) { +// listGDB.add(form.getFormDataBean()); +// +// } +// listGeonaFormObjects.add(new GeoNaFormDataObject(listGDB, card.getGeonaFormModel().getGcubeProfile())); +// } +// appManagerBus.fireEvent(new SaveGeonaDataFormsEvent(profileID, listGeonaFormObjects)); + + showAlertOnSaveAction("Andiamo a salvare", AlertType.INFO, true); - } - listGeonaFormObjects.add(new GeoNaFormDataObject(listGDB, card.getGeonaFormModel().getGcubeProfile())); - } - appManagerBus.fireEvent(new SaveGeonaDataFormsEvent(profileID, listGeonaFormObjects)); } else { showAlertOnSaveAction("Detected errors, please fix it/them", AlertType.ERROR, true); } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.java index 938a8c5..b48ac3e 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.java @@ -1,8 +1,12 @@ package org.gcube.portlets.user.geoportaldataentry.client.ui.tree; import org.gcube.portlets.user.geoportaldataentry.client.ui.card.GeoNaFormCardModel; +import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm; +import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.GenericFormEvents.GenericFormEventsListener; +import org.gcube.portlets.widgets.mpformbuilder.shared.GenericDatasetBean; import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.Icon; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; @@ -21,6 +25,9 @@ public class NodeItem extends Composite { interface NodeItemUiBinder extends UiBinder { } + @UiField + Icon iconField; + @UiField HTML htmlNode; @@ -40,7 +47,11 @@ public class NodeItem extends Composite { private boolean canBeDeleted; - public NodeItem(TreeItem parent, GeoNaFormCardModel geoNaFormCardModel, boolean canBeDuplicated, + private boolean isRoot = false; + + private MetadataFormCardEventHandler formCardEventHandler = new MetadataFormCardEventHandler(); + + public NodeItem(TreeItem parent, String nodeHTML, GeoNaFormCardModel geoNaFormCardModel, boolean canBeDuplicated, boolean canBeDeleted, String jsonSectionFullPath) { initWidget(uiBinder.createAndBindUi(this)); this.geoNaFormCardModel = geoNaFormCardModel; @@ -48,13 +59,13 @@ public class NodeItem extends Composite { this.jsonSectionFullPath = jsonSectionFullPath; this.canBeDuplicated = canBeDuplicated; this.canBeDeleted = canBeDeleted; - htmlNode.setHTML(geoNaFormCardModel.getGcubeProfile().getSectionTitle()); + htmlNode.setHTML(nodeHTML); buttonAdd.setVisible(false); buttonRemove.setVisible(false); if (canBeDuplicated) { buttonAdd.setIcon(IconType.COPY); - //buttonAdd.getElement().getStyle().setProperty("pointerEvents", "none"); + // buttonAdd.getElement().getStyle().setProperty("pointerEvents", "none"); buttonAdd.getElement().getStyle().setProperty("textDecoration", "none"); buttonAdd.getElement().getStyle().setColor("#555"); buttonAdd.setVisible(true); @@ -63,7 +74,7 @@ public class NodeItem extends Composite { if (canBeDeleted) { buttonRemove.setIcon(IconType.TRASH); - //buttonRemove.getElement().getStyle().setProperty("pointerEvents", "none"); + // buttonRemove.getElement().getStyle().setProperty("pointerEvents", "none"); buttonRemove.getElement().getStyle().setProperty("textDecoration", "none"); buttonRemove.getElement().getStyle().setColor("#555"); buttonRemove.setVisible(true); @@ -78,6 +89,128 @@ public class NodeItem extends Composite { } }); + //Is not the root node + if(geoNaFormCardModel!=null) { + geoNaFormCardModel.getMetadataForm().addListener(formCardEventHandler); + resetNodeStatus(); + } + } + + /** + * The Class MetadataFormCardEventHandler. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Oct 12, 2020 + */ + private class MetadataFormCardEventHandler implements GenericFormEventsListener { + + /** + * On form data valid. + * + * @param genericDatasetBean the generic dataset bean + */ + @Override + public void onFormDataValid(GenericDatasetBean genericDatasetBean) { + setNodeStatus(); + + } + + /** + * On form data edit. + */ + @Override + public void onFormDataEdit() { + resetNodeStatus(); + + } + + /** + * On form aborted. + */ + @Override + public void onFormAborted() { + // TODO Auto-generated method stub + + } + + /** + * On validation error. + * + * @param throwable the throwable + * @param errorMsg the error msg + */ + @Override + public void onValidationError(Throwable throwable, String errorMsg) { + // TODO Auto-generated method stub + + } + } + + /** + * Validate form. + * + * @return true, if successful + */ + public boolean validateForm() { + + if(isRoot) + return true; + + CreateMetadataForm createMetadataForm = geoNaFormCardModel.getMetadataForm(); + boolean isFormDataValid = createMetadataForm.isFormDataValid(); + GWT.log("Is form data valid: " + isFormDataValid); + if (!isFormDataValid) { + return false; + } + + return true; + } + + /** + * Sets the valid card. + * + * @param bool the new valid card + */ + public void setValidCard(boolean bool) { + if (bool) { + iconField.setIcon(IconType.OK_SIGN); + htmlNode.asWidget().getElement().removeClassName("red-text"); + htmlNode.asWidget().getElement().addClassName("green-text"); + } else { + iconField.setIcon(IconType.MINUS_SIGN); + htmlNode.asWidget().getElement().removeClassName("green-text"); + htmlNode.asWidget().getElement().addClassName("red-text"); + } + + } + + /** + * Sets the tab status. + */ + private void setNodeStatus() { + boolean isValid = validateForm(); + if (isValid) { + iconField.setIcon(IconType.OK_SIGN); + htmlNode.asWidget().getElement().removeClassName("red-text"); + htmlNode.asWidget().getElement().addClassName("green-text"); + } else { + iconField.setIcon(IconType.MINUS_SIGN); + htmlNode.asWidget().getElement().removeClassName("red-text"); + htmlNode.asWidget().getElement().addClassName("red-text"); + } + } + + public boolean isRoot() { + return isRoot; + } + + public void setRoot(boolean isRoot) { + this.isRoot = isRoot; + } + + private void resetNodeStatus() { + iconField.setIcon(null); } public TreeItem getParentTreeItem() { @@ -104,7 +237,7 @@ public class NodeItem extends Composite { public boolean isCanBeDuplicated() { return canBeDuplicated; } - + public HTML getHtmlNode() { return htmlNode; } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.ui.xml b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.ui.xml index bc9d10e..9470b07 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.ui.xml +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/NodeItem.ui.xml @@ -8,11 +8,18 @@ margin-left: 20px; } + .margin-left-10 { + margin-left: 10px; + } + .margin-left-10 { margin-left: 10px; } + + + Node diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/TreeItemPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/TreeItemPanel.java index 011b2c3..4c761bd 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/TreeItemPanel.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/tree/TreeItemPanel.java @@ -22,7 +22,7 @@ public class TreeItemPanel { private static final String JSON_ROOT_PATH = "$."; private Tree tree = new Tree(); - private TreeItem root = new TreeItem(); + private TreeItem root; private HandlerManager appManagerBus; private HashMap> treeItemParents = new HashMap>(); private String itemTypeTitle; @@ -35,7 +35,12 @@ public class TreeItemPanel { this.itemTypeTitle = itemTypeTitle; this.profileID = profileID; tree.setAnimationEnabled(true); + + NodeItem rootNode = new NodeItem(null, "root", null, false, false, JSON_ROOT_PATH); + rootNode.setRoot(true); + root = new TreeItem(rootNode); root.setHTML(itemTypeTitle); + // TreeMap> mapParentSections = new TreeMap>(); @@ -80,7 +85,7 @@ public class TreeItemPanel { + profile.getSectionName() + " title: " + profile.getSectionTitle()); boolean canBeDuplicated = geoNaFormCardModel.getFormCard().isInternalRepeatibleForm(); - TreeItem child = createAndAddChild(listParent.get(0), geoNaFormCardModel, canBeDuplicated, false, + TreeItem child = createAndAddChild(listParent.get(0), profile.getSectionTitle(), geoNaFormCardModel, canBeDuplicated, false, jsonSectionFullPath); } @@ -124,10 +129,10 @@ public class TreeItemPanel { return jsonSectionFullPath; } - public TreeItem createAndAddChild(TreeItem parent, GeoNaFormCardModel geoNaFormCardModel, boolean canBeDuplicated, + public TreeItem createAndAddChild(TreeItem parent, String nodeHTML, GeoNaFormCardModel geoNaFormCardModel, boolean canBeDuplicated, boolean canBeDeleted, String jsonSectionFullPath) { GWT.log("Creating and adding child to parent: " + parent.getText()); - TreeItem newChild = new TreeItem(new NodeItem(parent, geoNaFormCardModel, canBeDuplicated, canBeDeleted, jsonSectionFullPath)); + TreeItem newChild = new TreeItem(new NodeItem(parent, nodeHTML, geoNaFormCardModel, canBeDuplicated, canBeDeleted, jsonSectionFullPath)); parent.addItem(newChild); fillItemParents(jsonSectionFullPath, newChild); diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/shared/TNode.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/shared/TNode.java index 3004182..f4aef2a 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/shared/TNode.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/shared/TNode.java @@ -1,5 +1,6 @@ package org.gcube.portlets.user.geoportaldataentry.shared; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -11,11 +12,19 @@ import java.util.List; * Jul 6, 2022 * @param the generic type */ -public class TNode { +public class TNode implements Serializable { + /** + * + */ + private static final long serialVersionUID = -7319055031988865761L; private T data; private List> children; private TNode parent; + public TNode() { + + } + /** * Instantiates a new node. *