in progress

This commit is contained in:
Francesco Mangiacrapa 2022-07-07 12:36:08 +02:00
parent 935e0035f1
commit 22713ca924
6 changed files with 253 additions and 124 deletions

View File

@ -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<GeoNaFormCardModel> 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);

View File

@ -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<Widget, GeonaDataEntryMainForm> {
}
private List<GeoNaFormCardModel> listCards = new ArrayList<GeoNaFormCardModel>();
private TNode<GeoNaFormCardModel> nodes = new TNode<GeoNaFormCardModel>();
@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<String, MetadataFormCard> mapForms = new LinkedHashMap<String, MetadataFormCard>();
//private List<Tab> listTabs = new ArrayList<Tab>();
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<root.getChildCount(); i++) {
// TreeItem child = root.getChild(i);
// NodeItem node = (NodeItem) child.getWidget();
// boolean isValid = node.validateForm();
// if (isValid == false)
// canSave = false;
// }
//
// for (String metadataType : mapForms.keySet()) {
// MetadataFormCard card = mapForms.get(metadataType);
// boolean isValid = card.validateForm();
// card.setValidCard(isValid);
// if (isValid == false)
// canSave = false;
// }
List<GeoNaFormDataObject> listGeonaFormObjects = new ArrayList<GeoNaFormDataObject>();
if (canSave) {
for (String metadataType : mapForms.keySet()) {
MetadataFormCard card = mapForms.get(metadataType);
List<GenericDatasetBean> listGDB = new ArrayList<GenericDatasetBean>(card.getListForms().size());
for (CreateMetadataForm form : card.getListForms()) {
listGDB.add(form.getFormDataBean());
// for (String metadataType : mapForms.keySet()) {
// MetadataFormCard card = mapForms.get(metadataType);
// List<GenericDatasetBean> listGDB = new ArrayList<GenericDatasetBean>(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);
}

View File

@ -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<Widget, NodeItem> {
}
@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;
}

View File

@ -8,11 +8,18 @@
margin-left: 20px;
}
.margin-left-10 {
margin-left: 10px;
}
.margin-left-10 {
margin-left: 10px;
}
</ui:style>
<g:HorizontalPanel>
<g:HTMLPanel addStyleNames="margin-left-10">
<b:Icon type="OK_SIGN" ui:field="iconField"></b:Icon>
</g:HTMLPanel>
<g:HTML ui:field="htmlNode">Node</g:HTML>
<b:Button title="This section can be duplicated"
styleName="{style.margin-left-10}" ui:field="buttonAdd"></b:Button>

View File

@ -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<String, List<TreeItem>> treeItemParents = new HashMap<String, List<TreeItem>>();
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<String, List<TreeItem>> mapParentSections = new TreeMap<String,
// List<TreeItem>>();
@ -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);

View File

@ -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 <T> the generic type
*/
public class TNode<T> {
public class TNode<T> implements Serializable {
/**
*
*/
private static final long serialVersionUID = -7319055031988865761L;
private T data;
private List<TNode<T>> children;
private TNode<T> parent;
public TNode() {
}
/**
* Instantiates a new node.
*