package org.gcube.portlets.user.geoportaldataentry.client.ui.card; import java.util.ArrayList; import java.util.List; 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.Tab; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; /** * The Class MetadataFormCard. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * * Oct 12, 2020 */ public class MetadataFormCard { /** The heading. */ private String heading; /** The tab. */ private Tab tab; /** The repeatible. */ private boolean repeatible; /** The list forms. */ private List listForms = new ArrayList(); /** The form card event handler. */ private MetadataFormCardEventHandler formCardEventHandler = new MetadataFormCardEventHandler(); /** The geona form model. */ private GeoNaFormCardModel geonaFormModel; /** * 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) { setTabStatus(); } /** * On form data edit. */ @Override public void onFormDataEdit() { resetTabStatus(); } /** * 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 } } /** * Instantiates a new metadata form card. * * @param tab the tab * @param geonaFormModel the geona form model */ public MetadataFormCard(Tab tab, GeoNaFormCardModel geonaFormModel) { this.tab = tab; this.geonaFormModel = geonaFormModel; this.repeatible = geonaFormModel.getFormCardTitle().isInternalRepeatibleForm(); this.buildCard(geonaFormModel.getMetadataForm()); geonaFormModel.getMetadataForm().addListener(formCardEventHandler); } /** * Builds the card. * * @param createMetadataForm the create metadata form */ private void buildCard(final CreateMetadataForm createMetadataForm) { if(repeatible) { Button buttonAddNew = new Button("Add New..."); tab.add(buttonAddNew); buttonAddNew.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { CreateMetadataForm newForm = new CreateMetadataForm(createMetadataForm.getMetadataProfiles()); addNewForm(newForm); //newForm.getCreateButton().setFocus(true); } }); } addNewForm(createMetadataForm); } /** * Adds the new form. * * @param newForm the new form */ private void addNewForm(final CreateMetadataForm newForm) { tab.add(newForm); listForms.add(newForm); if(listForms.size()>1) { final Button buttonRemoveLatestForm = new Button("Remove"); buttonRemoveLatestForm.setIcon(IconType.TRASH); tab.add(buttonRemoveLatestForm); buttonRemoveLatestForm.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { tab.remove(newForm); listForms.remove(newForm); tab.remove(buttonRemoveLatestForm); } }); } } /** * Gets the list forms. * * @return the list forms */ public List getListForms() { return listForms; } /** * Gets the heading. * * @return the heading */ public String getHeading() { return heading; } /** * Validate form. * * @return true, if successful */ public boolean validateForm() { for (CreateMetadataForm createMetadataForm : listForms) { if(!createMetadataForm.isFormDataValid()) return false; } return true; } /** * Sets the valid card. * * @param bool the new valid card */ public void setValidCard(boolean bool) { if(bool) { tab.setIcon(IconType.OK_SIGN); tab.asWidget().getElement().removeClassName("red-text"); } else { tab.setIcon(IconType.MINUS_SIGN); tab.asWidget().getElement().addClassName("red-text"); } } /** * Sets the tab status. */ private void setTabStatus() { boolean isValid = validateForm(); if(isValid) { tab.setIcon(IconType.OK_SIGN); tab.asWidget().getElement().removeClassName("red-text"); tab.asWidget().getElement().addClassName("green-text"); } else { tab.setIcon(IconType.MINUS_SIGN); tab.asWidget().getElement().addClassName("red-text"); } } /** * Reset tab status. */ private void resetTabStatus() { tab.setIcon(null); } public GeoNaFormCardModel getGeonaFormModel() { return geonaFormModel; } }