package org.gcube.portlets.user.geoportaldataentry.client.ui; import java.util.HashMap; import java.util.List; import java.util.Map; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.RECORD_FIELD; import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.RECORD_TYPE; 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.LoaderIcon; import org.gcube.portlets.user.geoportaldataentry.shared.ACTION_ON_ITEM; import org.gcube.portlets.user.geoportaldataentry.shared.SearchingFilter; import org.gcube.portlets.user.geoportaldataentry.shared.SearchingFilter.ORDER; 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.NavLink; 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.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.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 geonaListOfConcessioniPanel; /** 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; private HandlerManager appManagerBus; private RECORD_FIELD[] sortByFields; private RECORD_FIELD[] searchForFields; private SearchingFilter currentSortFilter; private GeonaRecordsPaginatedView grpw = null; /** * Instantiates a new geona main tab panel. * * @param appManagerBus the first name * @param sortByFields the sort by fields * @param initialSortFilter */ public GeonaMainTabPanel(HandlerManager appManagerBus, RECORD_FIELD[] sortByFields, RECORD_FIELD[] searchForFields, SearchingFilter initialSortFilter) { initWidget(uiBinder.createAndBindUi(this)); this.appManagerBus = appManagerBus; this.sortByFields = sortByFields; this.currentSortFilter = initialSortFilter; this.searchForFields = searchForFields; alertSortBy.setType(AlertType.INFO); alertSortBy.setClose(false); alertSearchFor.setType(AlertType.INFO); alertSearchFor.setClose(false); alertSearchFor.setText(searchForFields[0].getDisplayName()); alertSortBy.setText(toLabelFilter(initialSortFilter.getOrderByField(), initialSortFilter.getOrder())); bindEvents(); resetSearch.setIconSize(IconSize.TWO_TIMES); resetSearch.setType(ButtonType.LINK); } 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) { appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); } }); tabGetListOfProjects.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { instanceAndShowListOfConcessioni(); } }); for (RECORD_FIELD 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); 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); appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); } }); } for (RECORD_FIELD 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(""); appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); resetSearch.setVisible(false); } }); } 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); appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); } private String toLabelFilter(RECORD_FIELD orderBy, ORDER direction) { String labelFilter = orderBy.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; geonaListOfConcessioniPanel.clear(); VerticalPanel htmllPanel = new VerticalPanel(); htmllPanel.add(grpw.getCellPanel()); htmllPanel.add(grpw.getPagerPanel()); geonaListOfConcessioniPanel.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 { RECORD_FIELD recordField = null; for (RECORD_FIELD value : RECORD_FIELD.values()) { if (array[0].equalsIgnoreCase(value.getDisplayName())) { recordField = value; break; } } ORDER orderField = ORDER.valueOf(array[1]); sortFilter = new SearchingFilter(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 = RECORD_FIELD.NAME.getJsonFieldName(); for (RECORD_FIELD recordField : searchForFields) { if(recordField.getDisplayName().equals(alertSearchFor.getText())) { searchForField = recordField.getJsonFieldName(); continue; } } searchInto.put(searchForField, searchText); searchingFilter.setSearchInto(searchInto); } 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() { grpw = new GeonaRecordsPaginatedView(appManagerBus, RECORD_TYPE.CONCESSIONE, null, currentSortFilter); showListOfConcessioniView(grpw); } }