geoportal-data-entry-app/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/GeonaMainTabPanel.java

768 lines
21 KiB
Java

package org.gcube.portlets.user.geoportaldataentry.client.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gcube.application.geoportalcommon.shared.SearchingFilter;
import org.gcube.application.geoportalcommon.shared.SearchingFilter.LOGICAL_OP;
import org.gcube.application.geoportalcommon.shared.SearchingFilter.ORDER;
import org.gcube.application.geoportalcommon.shared.WhereClause;
import org.gcube.application.geoportalcommon.shared.config.ACTION_ON_ITEM;
import org.gcube.application.geoportalcommon.shared.geoportal.ConfigurationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.DocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.ItemFieldDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
import org.gcube.portlets.user.geoportaldataentry.client.GeoPortalClientCaches.CacheSearchingFilterParametersFromConfig;
import org.gcube.portlets.user.geoportaldataentry.client.events.ActionOnItemEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.CreateNewProjectEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.GetListOfRecordsEvent;
import org.gcube.portlets.user.geoportaldataentry.client.ui.form.GeonaDataEntryMainForm;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.DialogInform;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.UCD_Util;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Dropdown;
import com.github.gwtbootstrap.client.ui.Hero;
import com.github.gwtbootstrap.client.ui.NavLink;
import com.github.gwtbootstrap.client.ui.PageHeader;
import com.github.gwtbootstrap.client.ui.Tab;
import com.github.gwtbootstrap.client.ui.TabPanel;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.IconSize;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* The Class GeonaMainTabPanel.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Aug 5, 2021
*/
public class GeonaMainTabPanel extends Composite {
private static final String LABEL_FILTER_SEPARATOR = " - ";
protected static final int MIN_LENGHT_SERCHING_STRING = 3;
private static GeonaMainTabPanelUiBinder uiBinder = GWT.create(GeonaMainTabPanelUiBinder.class);
/**
* The Interface GeonaMainTabPanelUiBinder.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Aug 5, 2021
*/
interface GeonaMainTabPanelUiBinder extends UiBinder<Widget, GeonaMainTabPanel> {
}
/** The geona main form panel. */
@UiField
HTMLPanel geonaMainFormPanel;
@UiField
HTMLPanel geonaListOfRecordsPanel;
/** The geona main form panel. */
@UiField
HTMLPanel contTabNewProject;
@UiField
HTMLPanel contTabGetListOfProjects;
/** The loader. */
@UiField
LoaderIcon loader;
// @UiField
// NavLink buttCreateNewProject;
@UiField
NavLink buttonReloadConcessioni;
@UiField
TabPanel tabPanel;
@UiField
Tab tabNewProject;
@UiField
Tab tabGetListOfProjects;
@UiField
Dropdown dropdownSortBy;
@UiField
Dropdown dropdownSearchFor;
@UiField
Alert alertSortBy;
@UiField
Alert alertProjectType;
@UiField
Alert alertSearchFor;
@UiField
NavLink navShowOnMap;
@UiField
NavLink navShowReport;
@UiField
NavLink navEditMode;
@UiField
NavLink navDelete;
@UiField
TextBox searchField;
@UiField
Button resetSearch;
@UiField
Label roleLabel;
@UiField
Dropdown ddCreateNewProject;
@UiField
Dropdown ddProjectType;
@UiField
PageHeader pageHeaderDataEntry;
@UiField
Hero introGNAHero;
private HandlerManager appManagerBus;
private SearchingFilter currentSearchingFilter;
private GeonaRecordsPaginatedView grpw = null;
private List<UseCaseDescriptorDV> ucdProjectTypesForListingDataView = new ArrayList<UseCaseDescriptorDV>();
private CacheSearchingFilterParametersFromConfig cacheSearchingFilterParameters;
/**
* Instantiates a new geona main tab panel.
*
* @param appManagerBus the app manager bus
*/
public GeonaMainTabPanel(HandlerManager appManagerBus) {
initWidget(uiBinder.createAndBindUi(this));
this.appManagerBus = appManagerBus;
// setFilteringParameters(defaultItemField, defaultItemField, defaultItemField,
// initialSortFilter);
alertSortBy.setType(AlertType.INFO);
alertSortBy.setClose(false);
alertSearchFor.setType(AlertType.INFO);
alertSearchFor.setClose(false);
alertProjectType.setType(AlertType.INFO);
alertProjectType.setClose(false);
bindEvents();
resetSearch.setIconSize(IconSize.TWO_TIMES);
resetSearch.setType(ButtonType.LINK);
setLoaderVisible("", false);
}
/**
* Sets the filtering parameters.
*
* @param sfp the sfp
* @param searchingFilter the searching filter
*/
public void setFilteringParameters(CacheSearchingFilterParametersFromConfig sfp) {
GWT.log("setFilteringParameters instancied");
this.cacheSearchingFilterParameters = sfp;
List<ItemFieldDV> sortByFields = sfp.getOrderByFields();
List<ItemFieldDV> searchForFields = sfp.getSearchByFields();
// currentSearchingFilter = new SearchingFilter(sortByFields, null);
alertSearchFor.clear();
dropdownSearchFor.clear();
alertSearchFor.setText(searchForFields.get(0).getDisplayName());
alertSortBy.setText(toLabelFilter((sortByFields.get(0)), SearchingFilter.ORDER.ASC));
for (ItemFieldDV record_FIELD : searchForFields) {
NavLink nav = new NavLink(record_FIELD.getDisplayName());
dropdownSearchFor.add(nav);
nav.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
alertSearchFor.setText(record_FIELD.getDisplayName());
if (searchField.getText().length() >= MIN_LENGHT_SERCHING_STRING) {
doSearchEvent();
}
}
});
}
dropdownSortBy.clear();
for (ItemFieldDV record_FIELD : sortByFields) {
// if (record_FIELD.equals(RECORD_FIELD.RECORD_STATUS))
// continue;
// ASC
final String labelASC = toLabelFilter(record_FIELD, ORDER.ASC);
final NavLink nav = new NavLink(labelASC);
dropdownSortBy.add(nav);
nav.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
GWT.log("Sort by: " + labelASC);
alertSortBy.setText(labelASC);
UseCaseDescriptorDV singleUCD = getSelectProjectType();
if (singleUCD != null) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, singleUCD.getName(),
singleUCD.getProfileID(), getCurrentSearchingFilter(), false));
}
}
});
// //DESC
final String labelDESC = toLabelFilter(record_FIELD, ORDER.DESC);
final NavLink nav2 = new NavLink(labelDESC);
dropdownSortBy.add(nav2);
nav2.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
GWT.log("Sort by: " + labelDESC);
alertSortBy.setText(labelDESC);
UseCaseDescriptorDV singleUCD = getSelectProjectType();
if (singleUCD != null) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, singleUCD.getName(),
singleUCD.getProfileID(), getCurrentSearchingFilter(), false));
}
}
});
}
}
public UseCaseDescriptorDV getSelectProjectType() {
String projectName = alertProjectType.getText();
for (UseCaseDescriptorDV usdDV : ucdProjectTypesForListingDataView) {
if (usdDV.getName().compareTo(projectName) == 0) {
GWT.log("Selected project type is: " + usdDV);
return usdDV;
}
}
return null;
}
/**
* Sets the internal height.
*
* @param height the new internal height
*/
public void setInternalHeight(int height) {
contTabNewProject.asWidget().setHeight(height + "px");
contTabGetListOfProjects.asWidget().setHeight(height + "px");
}
/**
* Bind events.
*/
private void bindEvents() {
buttonReloadConcessioni.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
UseCaseDescriptorDV singleUCD = getSelectProjectType();
if (singleUCD != null) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, singleUCD.getName(),
singleUCD.getProfileID(), getCurrentSearchingFilter(), true));
}
}
});
tabGetListOfProjects.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
instanceAndShowListOfProjects();
}
});
navShowOnMap.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<DocumentDV> listConcessioni = null;
if (grpw != null && grpw.getSelectItems() != null) {
listConcessioni = grpw.getSelectItems();
}
Window.alert("ACTION_ON_ITEM.VIEW_ON_MAP must be implemented");
/*
* appManagerBus .fireEvent(new
* ActionOnItemEvent<ConcessioneDV>(listConcessioni,
* ACTION_ON_ITEM.VIEW_ON_MAP));
*/
}
});
navShowReport.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<DocumentDV> listDocuments = null;
if (grpw != null && grpw.getSelectItems() != null) {
listDocuments = grpw.getSelectItems();
}
appManagerBus
.fireEvent(new ActionOnItemEvent<DocumentDV>(listDocuments, ACTION_ON_ITEM.VIEW_REPORT));
}
});
navEditMode.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<DocumentDV> listConcessioni = null;
if (grpw != null && grpw.getSelectItems() != null) {
listConcessioni = grpw.getSelectItems();
}
Window.alert("ACTION_ON_ITEM.EDIT_PROJECT must be implemented");
/*
* appManagerBus .fireEvent(new
* ActionOnItemEvent<ConcessioneDV>(listConcessioni,
* ACTION_ON_ITEM.EDIT_PROJECT));
*/
}
});
navDelete.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<DocumentDV> listConcessioni = null;
if (grpw != null && grpw.getSelectItems() != null) {
listConcessioni = grpw.getSelectItems();
}
Window.alert("ACTION_ON_ITEM.DELETE_PROJECT must be implemented");
/*
* appManagerBus.fireEvent( new
* ActionOnItemEvent<ConcessioneDV>(listConcessioni,
* ACTION_ON_ITEM.DELETE_PROJECT));
*/
}
});
searchField.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
GWT.log("CHAR CODE: " + event.getCharCode());
if (com.google.gwt.event.dom.client.KeyCodes.KEY_ENTER == event.getCharCode()) {
GWT.log(searchField.getText());
doSearchEvent();
}
}
});
resetSearch.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
searchField.setText("");
UseCaseDescriptorDV singleUCD = getSelectProjectType();
if (singleUCD != null) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, singleUCD.getName(),
singleUCD.getProfileID(), getCurrentSearchingFilter(), false));
}
resetSearch.setVisible(false);
// Window.alert("resetSearch MUST BE REVISITED");
/*
* appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE,
* getCurrentSortFilter())); resetSearch.setVisible(false);
*/
}
});
}
/**
* Sets the role label.
*
* @param msg the new role label
*/
public void setRoleLabel(String msg) {
roleLabel.setText(msg);
}
/**
* Do search event.
*/
private void doSearchEvent() {
String searchText = searchField.getText();
if (searchText.length() < MIN_LENGHT_SERCHING_STRING) {
Window.alert("Please enter at least " + MIN_LENGHT_SERCHING_STRING + " characters");
return;
}
resetSearch.setVisible(true);
UseCaseDescriptorDV singleUCD = getSelectProjectType();
if (singleUCD != null) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, singleUCD.getName(), singleUCD.getProfileID(),
getCurrentSearchingFilter(), false));
}
}
/**
* To label filter.
*
* @param itemField the item field
* @param direction the direction
* @return the string
*/
private String toLabelFilter(ItemFieldDV itemField, ORDER direction) {
String labelFilter = itemField.getDisplayName() + LABEL_FILTER_SEPARATOR + direction.name();
return labelFilter;
}
/**
* Adds the form panel.
*
* @param formPanel the form panel
*/
public void addFormPanel(GeonaDataEntryMainForm formPanel) {
geonaMainFormPanel.add(formPanel);
}
/**
* Show list of concessioni view.
*
* @param grpw the grpw
*/
public void showListOfConcessioniView(GeonaRecordsPaginatedView grpw) {
this.grpw = grpw;
geonaListOfRecordsPanel.clear();
VerticalPanel htmllPanel = new VerticalPanel();
htmllPanel.add(grpw.getCellPanel());
htmllPanel.add(grpw.getPagerPanel());
geonaListOfRecordsPanel.add(htmllPanel);
}
/**
* Sets the loader visible.
*
* @param txtHTML the txt HTML
* @param visible the visible
*/
public void setLoaderVisible(String txtHTML, boolean visible) {
loader.setText(txtHTML);
loader.setVisible(visible);
}
/**
* To sort filter.
*
* @param labelFilter the label filter
* @return the searching filter
*/
public SearchingFilter toSortFilter(String labelFilter) {
GWT.log("toSortFilter for label " + labelFilter);
String[] array = labelFilter.split(LABEL_FILTER_SEPARATOR);
GWT.log("label filter: " + array[0]);
SearchingFilter sortFilter = null;
try {
ItemFieldDV recordField = null;
GWT.log("cacheSearchingFilterParameters.getOrderByFields() is: "
+ cacheSearchingFilterParameters.getOrderByFields());
for (ItemFieldDV value : cacheSearchingFilterParameters.getOrderByFields()) {
if (array[0].trim().compareTo(value.getDisplayName()) == 0) {
recordField = value;
break;
}
}
ORDER orderField = ORDER.valueOf(array[1].trim());
sortFilter = new SearchingFilter(Arrays.asList(recordField), orderField);
} catch (Exception e) {
}
GWT.log("toSortFilter got " + sortFilter);
return sortFilter;
}
/**
* Built searching filter.
*
* @return the searching filter
*/
private SearchingFilter builtSearchingFilter() {
SearchingFilter searchingFilter = toSortFilter(alertSortBy.getText());
String searchText = searchField.getText();
if (searchText != null && !searchText.isEmpty()) {
Map<String, Object> searchInto = new HashMap<String, Object>();
String searchForField = "";
for (ItemFieldDV recordField : cacheSearchingFilterParameters.getSearchByFields()) {
if (recordField.getDisplayName().equals(alertSearchFor.getText())) {
searchForField = recordField.getProjection() + "." + recordField.getJsonFields().get(0);
continue;
}
}
searchInto.put(searchForField, searchText);
WhereClause where = new WhereClause();
where.setSearchInto(searchInto);
where.setOperator(LOGICAL_OP.OR);
searchingFilter.setConditions(Arrays.asList(where));
}
return searchingFilter;
}
/**
* Gets the current sort filter.
*
* @return the current sort filter
*/
public SearchingFilter getCurrentSearchingFilter() {
currentSearchingFilter = builtSearchingFilter();
// currentSearchingFilter.setProjection(cacheSearchingFilterParameters.getProjection());
GWT.log("getCurrentSearchingFilter: " + currentSearchingFilter);
return currentSearchingFilter;
}
/**
* Removes the tab.
*
* @param index the index
*/
public void removeTab(int index) {
tabPanel.remove(index);
}
/**
* Sets the tab active.
*
* @param index the new tab active
*/
public void setTabActive(int index) {
tabPanel.selectTab(index);
}
/**
* Dirty solution. I created this one because I had problem on firing click
* event for Tab element
*
*/
public void instanceAndShowListOfProjects() {
// If only one UCD is available for DATA_LIST_GUI.. FIRE THE EVENT OF SELECTION
if (ucdProjectTypesForListingDataView.size() == 1) {
UseCaseDescriptorDV singleUCD = ucdProjectTypesForListingDataView.get(0);
alertProjectType.setText(singleUCD.getName());
// setFilteringParameters(displayFields, sortByFields, searchForFields,
// currentSearchingFilter);
appManagerBus.fireEvent(new GetListOfRecordsEvent(true, singleUCD.getName(), singleUCD.getProfileID(),
getCurrentSearchingFilter(), true));
}
}
/**
* Inits the main according to list use case descriptors.
*
* @param listUCDescriptors the list UC descriptors
*/
public void initMainAccordingToListUseCaseDescriptors(List<UseCaseDescriptorDV> listUCDescriptors) {
GWT.log("initMainAccordingToListUseCaseDescriptors: " + listUCDescriptors);
// this.listUCDescriptors = listUCDescriptors;
ddCreateNewProject.clear();
ddProjectType.clear();
ucdProjectTypesForListingDataView.clear();
for (final UseCaseDescriptorDV ucd : listUCDescriptors) {
HandlerDeclarationDV dataEntryHandler = UCD_Util.getHandlerDeclarationFor(ucd,
GEOPORTAL_DATA_HANDLER.geoportal_data_entry);
if (dataEntryHandler != null) {
ConfigurationDV<?> config = dataEntryHandler.getConfiguration();
List<GcubeProfileDV> listGcubeProfiles = toListGcubeProfiles(config);
final List<GcubeProfileDV> listProfiles = listGcubeProfiles;
NavLink link = new NavLink(ucd.getName());
link.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (listProfiles == null || listProfiles.size() == 0) {
DialogInform di = new DialogInform(null, "No configuration found",
"No GcubeProfile found in the Configuration for " + config.getConfiguration());
di.center();
return;
}
appManagerBus.fireEvent(
new CreateNewProjectEvent(ucd.getProfileID(), dataEntryHandler, listProfiles));
}
});
ddCreateNewProject.add(link);
}
// Setting Project type having HANDLER DATA LIST
HandlerDeclarationDV dataListHandler = UCD_Util.getHandlerDeclarationFor(ucd,
GEOPORTAL_DATA_HANDLER.geoportal_data_list);
if (dataListHandler != null) {
NavLink link = new NavLink(ucd.getName());
link.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, ucd.getName(), ucd.getProfileID(),
getCurrentSearchingFilter(), true));
}
});
ucdProjectTypesForListingDataView.add(ucd);
ddProjectType.add(link);
}
}
// IF one type of document is available, fire
// CreateNewProjectEvent(documentConfigDV));
if (listUCDescriptors.size() == 1) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
GWT.log("One Config loaded. Firing CreateNewProjectEvent");
UseCaseDescriptorDV useCaseDescriptor = listUCDescriptors.get(0);
HandlerDeclarationDV dataEntryHandler = UCD_Util.getHandlerDeclarationFor(useCaseDescriptor,
GEOPORTAL_DATA_HANDLER.geoportal_data_entry);
if (dataEntryHandler != null) {
ConfigurationDV<?> config = dataEntryHandler.getConfiguration();
List<GcubeProfileDV> listGcubeProfiles = toListGcubeProfiles(config);
appManagerBus.fireEvent(new CreateNewProjectEvent(useCaseDescriptor.getProfileID(),
dataEntryHandler, listGcubeProfiles));
}
}
});
}
}
/**
* To list gcube profiles.
*
* @param config the config
* @return the list
*/
private List<GcubeProfileDV> toListGcubeProfiles(ConfigurationDV<?> config) {
try {
return (List<GcubeProfileDV>) config.getConfiguration();
} catch (Exception e) {
GWT.log("Error on casting " + ConfigurationDV.class.getName() + " to List of "
+ GcubeProfileDV.class.getName());
}
return null;
}
/**
* To list item fields.
*
* @param config the config
* @return the list
*/
private List<ItemFieldDV> toListItemFields(ConfigurationDV<?> config) {
try {
return (List<ItemFieldDV>) config.getConfiguration();
} catch (Exception e) {
GWT.log("Error on casting " + ConfigurationDV.class.getName() + " to List of "
+ ItemFieldDV.class.getName());
}
return null;
}
/**
* Sets the page header.
*
* @param hDV the new page header
*/
public void setPageHeader(HandlerDeclarationDV hDV) {
introGNAHero.setVisible(false);
this.pageHeaderDataEntry.setVisible(true);
this.pageHeaderDataEntry.setText("");
this.pageHeaderDataEntry.setSubtext("New: " + hDV.getItemType());
}
}