package org.gcube.portlets.user.geoportaldataentry.client.ui; 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.GEOPORTAL_DATA_HANDLER; import org.gcube.application.geoportalcommon.shared.geoportal.HandlerDeclarationDV; import org.gcube.application.geoportalcommon.shared.geoportal.UseCaseDescriptorDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.ItemFieldDV; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; 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.ui.form.GeonaDataEntryMainForm; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.DialogInform; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon; 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 YOU_MUST_TO_SELECT_A_PROJECT_IN_THE_TABLE = "You must to select a Project in the table"; 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 { } /** 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 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 PageHeader pageHeaderDataEntry; @UiField Hero introGNAHero; private HandlerManager appManagerBus; private List sortByFields; private List searchForFields; private SearchingFilter currentSortFilter; private GeonaRecordsPaginatedView grpw = null; private List displayFields; private List listUCDescriptors; /** * Instantiates a new geona main tab panel. * * @param appManagerBus the first name * @param sortByFields the sort by fields * @param initialSortFilter */ public GeonaMainTabPanel(HandlerManager appManagerBus, List displayFields, List sortByFields, List searchForFields, SearchingFilter initialSortFilter) { initWidget(uiBinder.createAndBindUi(this)); this.appManagerBus = appManagerBus; this.sortByFields = sortByFields; this.displayFields = displayFields; this.currentSortFilter = initialSortFilter; this.searchForFields = searchForFields; alertSortBy.setType(AlertType.INFO); alertSortBy.setClose(false); alertSearchFor.setType(AlertType.INFO); alertSearchFor.setClose(false); alertSearchFor.setText(searchForFields.get(0).getDisplayName()); alertSortBy.setText(toLabelFilter((initialSortFilter.getOrderByFields().get(0)), initialSortFilter.getOrder())); pageHeaderDataEntry.setHeight("25px"); bindEvents(); resetSearch.setIconSize(IconSize.TWO_TIMES); resetSearch.setType(ButtonType.LINK); setLoaderVisible("", false); } public void setInternalHeight(int height) { contTabNewProject.asWidget().setHeight(height + "px"); contTabGetListOfProjects.asWidget().setHeight(height + "px"); } /** * Bind events. */ private void bindEvents() { // buttCreateNewProject.addClickHandler(new ClickHandler() { // // @Override // public void onClick(ClickEvent event) { // appManagerBus.fireEvent(new CreateNewProjectEvent()); // // } // }); buttonReloadConcessioni.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Window.alert("buttonReloadConcessioni MUST BE REVISITED"); /* appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); */ } }); tabGetListOfProjects.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { instanceAndShowListOfConcessioni(); } }); for (ItemFieldDV record_FIELD : sortByFields) { // if (record_FIELD.equals(RECORD_FIELD.RECORD_STATUS)) // continue; // ASC String labelASC = toLabelFilter(record_FIELD, ORDER.ASC); NavLink nav = new NavLink(labelASC); dropdownSortBy.add(nav); nav.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { alertSortBy.setText(labelASC); Window.alert("ASC MUST BE REVISITED"); /* appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); */ } }); // //DESC String labelDESC = toLabelFilter(record_FIELD, ORDER.DESC); NavLink nav2 = new NavLink(labelDESC); dropdownSortBy.add(nav2); nav2.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { alertSortBy.setText(labelDESC); Window.alert("DESC MUST BE REVISITED"); /* appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); */ } }); } 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(); } } }); } navShowOnMap.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { List listConcessioni = null; if (grpw != null && grpw.getSelectItems() != null) { listConcessioni = grpw.getSelectItems(); } appManagerBus .fireEvent(new ActionOnItemEvent(listConcessioni, ACTION_ON_ITEM.VIEW_ON_MAP)); } }); navShowReport.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { List listConcessioni = null; if (grpw != null && grpw.getSelectItems() != null) { listConcessioni = grpw.getSelectItems(); } appManagerBus .fireEvent(new ActionOnItemEvent(listConcessioni, ACTION_ON_ITEM.VIEW_REPORT)); } }); navEditMode.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { List listConcessioni = null; if (grpw != null && grpw.getSelectItems() != null) { listConcessioni = grpw.getSelectItems(); } appManagerBus .fireEvent(new ActionOnItemEvent(listConcessioni, ACTION_ON_ITEM.EDIT_PROJECT)); } }); navDelete.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { List listConcessioni = null; if (grpw != null && grpw.getSelectItems() != null) { listConcessioni = grpw.getSelectItems(); } appManagerBus.fireEvent( new ActionOnItemEvent(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(""); Window.alert("resetSearch MUST BE REVISITED"); /* appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); resetSearch.setVisible(false); */ } }); } public void setRoleLabel(String msg) { roleLabel.setText(msg); } 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); Window.alert("doSearchEvent MUST BE REVISITED"); /* appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); */ } 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); } public SearchingFilter toSortFilter(String labelFilter) { GWT.log("toSortFilter for label " + labelFilter); String[] array = labelFilter.split(LABEL_FILTER_SEPARATOR); SearchingFilter sortFilter = null; try { ItemFieldDV recordField = null; for (ItemFieldDV value : sortByFields) { if (array[0].equalsIgnoreCase(value.getDisplayName())) { recordField = value; break; } } ORDER orderField = ORDER.valueOf(array[1]); sortFilter = new SearchingFilter(Arrays.asList(recordField), orderField); } catch (Exception e) { } GWT.log("toSortFilter Got " + sortFilter); return sortFilter; } private SearchingFilter builtSearchingFilter() { SearchingFilter searchingFilter = toSortFilter(alertSortBy.getText()); String searchText = searchField.getText(); if (searchText != null && !searchText.isEmpty()) { Map searchInto = new HashMap(); String searchForField = ""; for (ItemFieldDV recordField : searchForFields) { if (recordField.getDisplayName().equals(alertSearchFor.getText())) { searchForField = 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; } public SearchingFilter getCurrentSortFilter() { currentSortFilter = builtSearchingFilter(); GWT.log("currentSortFilter: " + currentSortFilter); return currentSortFilter; } public void removeTab(int index) { tabPanel.remove(index); } 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 instanceAndShowListOfConcessioni() { Window.alert("instanceAndShowListOfConcessioni MUST BE REVISITED"); /* grpw = new GeonaRecordsPaginatedView(appManagerBus, RECORD_TYPE.CONCESSIONE, displayFields, currentSortFilter); showListOfConcessioniView(grpw); */ } public void setListUseCaseDescriptors(List listUCDescriptors) { GWT.log("Setting listUCDescriptors: " + listUCDescriptors); this.listUCDescriptors = listUCDescriptors; ddCreateNewProject.clear(); for (UseCaseDescriptorDV ucd : listUCDescriptors) { HandlerDeclarationDV dataEntryHandler = getDataEntryHandler(ucd); if (dataEntryHandler != null) { ConfigurationDV config = dataEntryHandler.getConfiguration(); List listGcubeProfiles = toListGcubeProfiles(config); final List 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(dataEntryHandler, listProfiles)); } }); ddCreateNewProject.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 = getDataEntryHandler(useCaseDescriptor); if (dataEntryHandler != null) { ConfigurationDV config = dataEntryHandler.getConfiguration(); List listGcubeProfiles = toListGcubeProfiles(config); appManagerBus.fireEvent(new CreateNewProjectEvent(dataEntryHandler, listGcubeProfiles)); } } }); } } private HandlerDeclarationDV getDataEntryHandler(UseCaseDescriptorDV useCaseDescriptor) { for (HandlerDeclarationDV handler : useCaseDescriptor.getHandlers()) { GEOPORTAL_DATA_HANDLER dataHandlerType = handler.getDataHandlerType(); // Checking if the handler if of geoportal_data_entry type if (dataHandlerType != null && dataHandlerType.getType().equals(GEOPORTAL_DATA_HANDLER.geoportal_data_entry.getType())) { return handler; } } return null; } private List toListGcubeProfiles(ConfigurationDV config) { try { return (List) config.getConfiguration(); } catch (Exception e) { GWT.log("Error on casting " + ConfigurationDV.class.getName() + " to List of " + GcubeProfileDV.class.getName()); } return null; } public void setPageHeader(HandlerDeclarationDV hDV) { introGNAHero.setVisible(false); this.pageHeaderDataEntry.setVisible(true); this.pageHeaderDataEntry.setText(""); this.pageHeaderDataEntry.setSubtext("New: " + hDV.getItemType()); } public List getListUCDescriptors() { return listUCDescriptors; } }