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 { } /** 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 ucdProjectTypesForListingDataView = new ArrayList(); 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 sortByFields = sfp.getOrderByFields(); List 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 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(listConcessioni, * ACTION_ON_ITEM.VIEW_ON_MAP)); */ } }); navShowReport.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { List listDocuments = null; if (grpw != null && grpw.getSelectItems() != null) { listDocuments = grpw.getSelectItems(); } appManagerBus .fireEvent(new ActionOnItemEvent(listDocuments, 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(); } Window.alert("ACTION_ON_ITEM.EDIT_PROJECT must be implemented"); /* * 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(); } Window.alert("ACTION_ON_ITEM.DELETE_PROJECT must be implemented"); /* * 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(""); 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 searchInto = new HashMap(); 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 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 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(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 listGcubeProfiles = toListGcubeProfiles(config); appManagerBus.fireEvent(new CreateNewProjectEvent(useCaseDescriptor.getProfileID(), dataEntryHandler, listGcubeProfiles)); } } }); } } /** * To list gcube profiles. * * @param config the config * @return the list */ 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; } /** * To list item fields. * * @param config the config * @return the list */ private List toListItemFields(ConfigurationDV config) { try { return (List) 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()); } }