package org.gcube.datacatalogue.grsf_manage_widget.client.view; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.gcube.datacatalogue.common.enums.Status; import org.gcube.datacatalogue.grsf_manage_widget.client.GRSFManageWidgetService; import org.gcube.datacatalogue.grsf_manage_widget.client.GRSFManageWidgetServiceAsync; import org.gcube.datacatalogue.grsf_manage_widget.client.events.HideManagementPanelEvent; import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.ex.NoGRSFRecordException; import com.github.gwtbootstrap.client.ui.AlertBlock; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.CheckBox; import com.github.gwtbootstrap.client.ui.ControlGroup; import com.github.gwtbootstrap.client.ui.Form; import com.github.gwtbootstrap.client.ui.Icon; import com.github.gwtbootstrap.client.ui.Image; import com.github.gwtbootstrap.client.ui.ListBox; import com.github.gwtbootstrap.client.ui.Modal; import com.github.gwtbootstrap.client.ui.TextArea; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.github.gwtbootstrap.client.ui.constants.ControlGroupType; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.SelectElement; import com.google.gwt.event.dom.client.ClickEvent; 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.uibinder.client.UiHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Widget; public class ManageProductWidget extends Composite{ private static GRSFManageWidgetServiceAsync service = GWT.create(GRSFManageWidgetService.class); private static ManageProductWidgetUiBinder uiBinder = GWT .create(ManageProductWidgetUiBinder.class); interface ManageProductWidgetUiBinder extends UiBinder { } @UiField Modal manageProductModal; @UiField AlertBlock infoBlock; @UiField TextArea shortNameTextBox; @UiField TextBox productGrsfType; @UiField CheckBox traceabilityFlag; @UiField TextArea GRSFNameTexBox; @UiField TextArea semanticIdentifierTextBox; @UiField TextBox sources; @UiField TextBox currentStatus; @UiField ListBox listBoxStatus; @UiField TextArea annotationArea; @UiField Button cancelButton; @UiField Button confirmButton; @UiField Icon loaderIcon; @UiField ControlGroup listBoxStatusGroup; @UiField ControlGroup annotationAreaGroup; @UiField ControlGroup productGrsfTypeGroup; @UiField Form formUpdate; @UiField Image loadingImage; public static final String LOADING_IMAGE_URL = GWT.getModuleBaseURL() + "../images/loader.gif"; private final static List STATUS = new ArrayList(Arrays.asList(Status.values())); private final static String STATUS_UPDATE_SUCCESS = "The item has been correctly updated. Thanks for your collaboration!"; private final static String STATUS_UPDATE_ERROR = "Sorry, there was a problem while trying to update the status of this item"; protected static final String ERROR_ON_RETRIEVING_BEAN = "It seems there was a problem while contacting the service..."; protected static final String NO_GRSF_RECORD_BEAN = "This item is not a GRSF record, thus it cannot be managed"; protected static final String NO_ADMIN_ROLE = "Sorry but it seems you do not have the rights to manage items." + " You are suggested to contact the VRE Manager if something is wrong with this"; private ManageProductBean bean; private HandlerManager eventBus = null; public ManageProductWidget(String productIdentifier, HandlerManager eventBus) { initWidget(uiBinder.createAndBindUi(this)); this.eventBus = eventBus; if(productIdentifier == null || productIdentifier.isEmpty()){ GWT.log("The received item identifier is null.."); return; } GWT.log("item identifier is " + productIdentifier); // start loader service loadingImage.setUrl(LOADING_IMAGE_URL); loadingImage.setVisible(true); formUpdate.setVisible(false); manageProductModal.show(); // async request to fetch the product retrieveProductBean(productIdentifier); } private void retrieveProductBean(final String productIdentifier) { // check if it is an administrator service.isAdminUser(new AsyncCallback() { @Override public void onSuccess(Boolean result) { if(!result){ showInfo(NO_ADMIN_ROLE, AlertType.ERROR); // hide the form and disable the send button formUpdate.setVisible(false); confirmButton.setEnabled(false); loadingImage.setVisible(false); // ask to hide management panel eventBus.fireEvent(new HideManagementPanelEvent()); }else{ service.getProductBeanById(productIdentifier, new AsyncCallback() { @Override public void onSuccess(ManageProductBean result) { if(result != null){ bean = result; annotationArea.setText(""); infoBlock.setVisible(false); formUpdate.setVisible(true); shortNameTextBox.setText(bean.getShortName()); currentStatus.setText(bean.getCurrentStatus().toString()); productGrsfType.setText(bean.getGrsfType()); GRSFNameTexBox.setText(bean.getGrsfName()); semanticIdentifierTextBox.setText(bean.getSemanticId()); sources.setText(bean.getSources()); traceabilityFlag.setValue(bean.isTraceabilityFlag()); // check if we need to show more if(bean.getExtrasIfAvailable() != null && !bean.getExtrasIfAvailable().isEmpty()) addExtrasAfter(bean, productGrsfTypeGroup); List statusToShow = new ArrayList(STATUS); statusToShow.remove(bean.getCurrentStatus()); // if the record isn't approved, then remove also archived if(!bean.getCurrentStatus().equals(Status.Approved)) statusToShow.remove(Status.Archived); listBoxStatus.addItem("Select the new status"); listBoxStatus.getElement().cast().getOptions().getItem(0).setDisabled(true); for (Status availableStatus : statusToShow) { listBoxStatus.addItem(availableStatus.toString()); } listBoxStatus.setSelectedIndex(0); } else{ showInfo(ERROR_ON_RETRIEVING_BEAN, AlertType.ERROR); formUpdate.setVisible(false); confirmButton.setEnabled(false); } loadingImage.setVisible(false); } @Override public void onFailure(Throwable caught) { if(caught instanceof NoGRSFRecordException) showInfo(NO_GRSF_RECORD_BEAN, AlertType.WARNING); else showInfo(caught.getMessage(), AlertType.ERROR); // hide the form and disable the send button formUpdate.setVisible(false); confirmButton.setEnabled(false); loadingImage.setVisible(false); } }); } } @Override public void onFailure(Throwable caught) { showInfo(NO_ADMIN_ROLE, AlertType.ERROR); // hide the form and disable the send button formUpdate.setVisible(false); confirmButton.setEnabled(false); loadingImage.setVisible(false); } }); } /** * Add extras if available after controlGroupBefore * @param bean * @param productTypeGroup */ private void addExtrasAfter(ManageProductBean bean, ControlGroup controlGroupBefore) { int index = formUpdate.getWidgetIndex(controlGroupBefore); Map extras = bean.getExtrasIfAvailable(); Iterator> iterator = extras.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator .next(); formUpdate.insert(new FormEntryModel(entry.getKey(), entry.getValue()), index); index++; } } @UiHandler("cancelButton") void onCancelButton(ClickEvent ce){ manageProductModal.hide(); } @UiHandler("confirmButton") void onSaveButton(ClickEvent ce){ if(bean == null) return; listBoxStatusGroup.setType(ControlGroupType.NONE); if(listBoxStatus.getSelectedIndex() <= 0){ listBoxStatusGroup.setType(ControlGroupType.ERROR); return; } annotationAreaGroup.setType(ControlGroupType.NONE); if(annotationArea.getText() == null || annotationArea.getText().isEmpty()){ annotationArea.setPlaceholder("An annotation message to send along the update (mandatory)"); annotationAreaGroup.setType(ControlGroupType.ERROR); return; } manageProductModal.setCloseVisible(false); cancelButton.setEnabled(false); confirmButton.setEnabled(false); loaderIcon.setVisible(true); // set new values bean.setAnnotation(new HTML(annotationArea.getText().trim()).getText()); bean.setNewStatus(Status.fromString(listBoxStatus.getSelectedItemText())); service.notifyProductUpdate(bean, new AsyncCallback() { @Override public void onSuccess(String result) { if(result == null){ showInfo(STATUS_UPDATE_SUCCESS, AlertType.SUCCESS); confirmButton.removeFromParent(); formUpdate.setVisible(false); }else{ showInfo(STATUS_UPDATE_ERROR + "(" + result + ")", AlertType.ERROR); confirmButton.setEnabled(true); } manageProductModal.setCloseVisible(true); cancelButton.setEnabled(true); loaderIcon.setVisible(false); } @Override public void onFailure(Throwable caught) { manageProductModal.setCloseVisible(true); cancelButton.setEnabled(true); confirmButton.setEnabled(true); loaderIcon.setVisible(false); showInfo(STATUS_UPDATE_ERROR, AlertType.ERROR); } }); } /** * Show information * @param statusUpdateError */ protected void showInfo(String statusUpdateError, AlertType type) { infoBlock.setText(statusUpdateError); infoBlock.setType(type); infoBlock.setVisible(true); } }