grsf-manage-widget/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.java

806 lines
26 KiB
Java

package org.gcube.datacatalogue.grsf_manage_widget.client.view;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.gcube.datacatalogue.common.enums.Fishery_Type;
import org.gcube.datacatalogue.common.enums.Product_Type;
import org.gcube.datacatalogue.common.enums.Status;
import org.gcube.datacatalogue.common.enums.Stock_Type;
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.EnableConfirmButtonEvent;
import org.gcube.datacatalogue.grsf_manage_widget.client.events.EnableConfirmButtonEventHandler;
import org.gcube.datacatalogue.grsf_manage_widget.client.events.HideManagementPanelEvent;
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.ConnectToWidget;
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.SimilarGRSFRecordWidget;
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.SourceWidget;
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.SuggestMerges;
import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectedBean;
import org.gcube.datacatalogue.grsf_manage_widget.shared.HashTagsOnUpdate;
import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean;
import org.gcube.datacatalogue.grsf_manage_widget.shared.RevertableOperationInfo;
import org.gcube.datacatalogue.grsf_manage_widget.shared.SimilarGRSFRecord;
import org.gcube.datacatalogue.grsf_manage_widget.shared.SourceRecord;
import org.gcube.datacatalogue.grsf_manage_widget.shared.ex.GRSFRecordAlreadyManagedStatusException;
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.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.ControlGroupType;
import com.github.gwtbootstrap.client.ui.event.HiddenEvent;
import com.github.gwtbootstrap.client.ui.event.HiddenHandler;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.SelectElement;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.i18n.client.DateTimeFormat;
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.Window;
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.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Management widget main panel.
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
*/
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<Widget, ManageProductWidget> {
}
@UiField
VerticalPanel container;
@UiField
Modal manageProductModal;
@UiField
AlertBlock infoBlock;
@UiField
TextArea shortNameTextBox;
@UiField
ListBox productGrsfTypeListbox;
@UiField
CheckBox traceabilityFlag;
@UiField
CheckBox sdgFlag;
@UiField
TextArea GRSFNameTexBox;
@UiField
TextArea semanticIdentifierTextBox;
@UiField
VerticalPanel panelForSourceItems;
@UiField
ControlGroup similarGRSFRecordGroup;
@UiField
ControlGroup suggestFurtherMerges;
@UiField
ControlGroup connectToOtherRecordsGroup;
@UiField
VerticalPanel panelForSimilarGRSFRecords;
@UiField
VerticalPanel panelForFurtherMerges;
@UiField
VerticalPanel panelForConnectOtherRecords;
@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
VerticalPanel moreInfoAboutOperation;
@UiField
Image loadingImage;
@UiField
TextArea requestAuthor;
// @UiField
// TextArea requestTypeBox;
@UiField
TextArea requestRecordUUID;
@UiField
TextArea requestTimestamp;
public static final String LOADING_IMAGE_URL = GWT.getModuleBaseURL() + "../images/loader.gif";
// messages used here and there
private final static String STATUS_UPDATE_SUCCESS = "The record 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 record";
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 record 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 records."
+ " You are suggested to contact the VRE Manager if something is wrong with this.";
// event bus shared with the portlet
private HandlerManager eventBus = null;
// the objects to be managed
private ManageProductBean bean;
private RevertableOperationInfo revertableOperation = null;
private final static List<Status> STATUS = new ArrayList<Status>(Arrays.asList(Status.values()));
// similar records and to connect widgets references
private SimilarGRSFRecordWidget similarRecordPanel;
private SuggestMerges suggestedMergesPanel;
private ConnectToWidget connectWidget;
private boolean updateSucceeded = false;
private boolean isRevertingMerge = false;
/**
* Build a ManageProduct widget for the product with the specified id or with a given revert merge url.
* @param productIdentifierOrUrl
* @param eventBus
*/
public ManageProductWidget(String productIdentifierOrUrl, HandlerManager eventBus) {
initWidget(uiBinder.createAndBindUi(this));
this.eventBus = eventBus;
if(productIdentifierOrUrl == null || productIdentifierOrUrl.isEmpty())
return;
// check if we are going to perform a revert merge operation
if(productIdentifierOrUrl.startsWith("http"))
isRevertingMerge = true;
// start loader service
loadingImage.setUrl(LOADING_IMAGE_URL);
loadingImage.setVisible(true);
formUpdate.setVisible(false);
loaderIcon.getElement().getStyle().setMarginRight(10, Unit.PX);
// show modal
manageProductModal.addStyleName("management-metadata-modal-style");
manageProductModal.addStyleName("modal-top-custom");
((Element)manageProductModal.getElement().getChildNodes().getItem(1)).addClassName("modal-body-custom");
manageProductModal.show();
manageProductModal.addHiddenHandler(new HiddenHandler() {
@Override
public void onHidden(HiddenEvent hiddenEvent) {
if(updateSucceeded)
Window.Location.reload();
}
});
// async request to fetch the product
if(!isRevertingMerge)
retrieveProductBean(productIdentifierOrUrl);
else
validateRevertUrlBefore(productIdentifierOrUrl);
listenEvents(this.eventBus);
}
/**
* Liste events
* @param eventBus
*/
private void listenEvents(HandlerManager eventBus) {
eventBus.addHandler(EnableConfirmButtonEvent.TYPE, new EnableConfirmButtonEventHandler() {
@Override
public void onEvent(EnableConfirmButtonEvent event) {
confirmButton.setEnabled(true);
}
});
}
/**
* Validate the parameters of the url and ask the editor/reviewer what he/she wants to do.
* @param encryptedUrlOperation
*/
private void validateRevertUrlBefore(String encryptedUrlOperation) {
confirmButton.setEnabled(false);
service.validateRevertOperation(encryptedUrlOperation, new AsyncCallback<RevertableOperationInfo>() {
@Override
public void onSuccess(RevertableOperationInfo result) {
loadingImage.setVisible(false);
if(result != null){
revertableOperation = result;
String dateString = DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss (z)").format(new Date(revertableOperation.getTimestamp()));
requestAuthor.setText(revertableOperation.getFullNameOriginalAdmin() + "(" + revertableOperation.getUserNameOriginalAdmin() + ")");
// requestTypeBox.setText(revertableOperation.getOperation().toString().toUpperCase());
requestRecordUUID.setText(revertableOperation.getUuid());
requestTimestamp.setText(dateString);
moreInfoAboutOperation.setVisible(true);
// proceed by fetching the other details
retrieveProductBean(revertableOperation.getUuid());
}else{
showInfo("Unable to evaluate the url for this operation. ", AlertType.ERROR);
formUpdate.setVisible(false);
loadingImage.setVisible(false);
}
}
@Override
public void onFailure(Throwable caught) {
showInfo("Unable to perform this operation. " + (caught != null ? "Error was " + caught.getMessage() : ""), AlertType.ERROR);
formUpdate.setVisible(false);
loadingImage.setVisible(false);
}
});
}
/**
* Actually builds the widget... asks for details about the record
* @param productIdentifierOrUrl
*/
private void retrieveProductBean(final String productIdentifierOrUrl) {
// check if it is an administrator
service.isAdminUser(new AsyncCallback<Boolean>() {
@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
if(eventBus != null){
eventBus.fireEvent(new HideManagementPanelEvent());
GWT.log("Hide management panel event sent");
}
}else{
service.getProductBeanById(productIdentifierOrUrl, isRevertingMerge, new AsyncCallback<ManageProductBean>() {
@Override
public void onSuccess(ManageProductBean resBean) {
if(resBean == null){
showInfo(ERROR_ON_RETRIEVING_BEAN, AlertType.ERROR);
formUpdate.setVisible(false);
confirmButton.setEnabled(false);
}else{
bean = resBean;
infoBlock.setVisible(false);
// top: more or less fixed information
GRSFNameTexBox.setText(bean.getTitle());
shortNameTextBox.setText(bean.getShortName());
shortNameTextBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
eventBus.fireEvent(new EnableConfirmButtonEvent());
}
});
semanticIdentifierTextBox.setText(bean.getSemanticIdentifier());
// update product type listbox.. get the available types for the record under management
List<String> types = getTypesForRecord(bean.getDomain());
productGrsfTypeListbox.addItem(bean.getCurrentGrsfType(), bean.getCurrentGrsfType());
types.remove(bean.getCurrentGrsfType());
for (String type : types) {
productGrsfTypeListbox.addItem(type, type);
}
//select the current
productGrsfTypeListbox.setSelectedValue(bean.getCurrentGrsfType());
productGrsfTypeListbox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
eventBus.fireEvent(new EnableConfirmButtonEvent());
}
});
currentStatus.setText(bean.getCurrentStatus().toString());
// traceability flag
traceabilityFlag.setValue(bean.isTraceabilityFlag());
traceabilityFlag.setText("Traceability");
traceabilityFlag.setTitle("Current value for this flag is " + bean.isTraceabilityFlag());
traceabilityFlag.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventBus.fireEvent(new EnableConfirmButtonEvent());
}
});
// sdg flag
sdgFlag.setValue(bean.isSdgFlag());
sdgFlag.setText("Sustainable Development Goals");
sdgFlag.setTitle("Current value for this flag is " + bean.isSdgFlag());
sdgFlag.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventBus.fireEvent(new EnableConfirmButtonEvent());
}
});
// manage sources
List<SourceRecord> availableSources = bean.getSources();
panelForSourceItems.add(new SourceWidget(availableSources));
// manage similar GRSF records, if any
if(bean.getSimilarGrsfRecords() != null && !bean.getSimilarGrsfRecords().isEmpty()){
List<SimilarGRSFRecord> availableGRSFSimilarRecords = bean.getSimilarGrsfRecords();
similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords, eventBus);
panelForSimilarGRSFRecords.add(similarRecordPanel);
}else
similarGRSFRecordGroup.setVisible(false);
// further suggested merges
suggestedMergesPanel = new SuggestMerges(service, bean.getDomain(), eventBus);
panelForFurtherMerges.add(suggestedMergesPanel);
// prepare "connect" panel
connectWidget = new ConnectToWidget(bean, service, eventBus);
panelForConnectOtherRecords.add(connectWidget);
// check for new status box
List<Status> statusToShow = new ArrayList<Status>(STATUS);
statusToShow.remove(bean.getCurrentStatus());
// if we are going to revert an operation
if(isRevertingMerge){
statusToShow.clear();
statusToShow.add(Status.Reject_Merge);
// all other stuff must be frozen, since the only allowed operation is to reject the merge
shortNameTextBox.setEnabled(false);
productGrsfTypeListbox.setEnabled(false);
sdgFlag.setEnabled(false);
traceabilityFlag.setEnabled(false);
// freeze other panels
connectWidget.freezeWidget();
similarRecordPanel.freezeWidget();
suggestedMergesPanel.freezeWidget();
}else{
// remove to be merged, since it cannot be set by a user
statusToShow.remove(Status.To_be_Merged);
// remove reject merge
statusToShow.remove(Status.Reject_Merge);
// if the record isn't approved, then remove also archived
if(!bean.getCurrentStatus().equals(Status.Approved))
statusToShow.remove(Status.Archived);
}
listBoxStatus.addItem("Select a new status");
listBoxStatus.getElement().<SelectElement>cast().getOptions().getItem(0).setDisabled(true);
for (Status availableStatus : statusToShow) {
listBoxStatus.addItem(availableStatus.toString(), availableStatus.toString());
}
listBoxStatus.setSelectedIndex(0);
listBoxStatus.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
eventBus.fireEvent(new EnableConfirmButtonEvent());
}
});
annotationArea.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
eventBus.fireEvent(new EnableConfirmButtonEvent());
}
});
formUpdate.setVisible(true);
}
loadingImage.setVisible(false);
}
@Override
public void onFailure(Throwable caught) {
if(caught instanceof NoGRSFRecordException)
showInfo(NO_GRSF_RECORD_BEAN, AlertType.WARNING);
else if(caught instanceof GRSFRecordAlreadyManagedStatusException) {
showInfo("WARNING: "+caught.getMessage(), AlertType.WARNING);
}else
showInfo("Error is " + 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);
}
});
}
@UiHandler("confirmButton")
void onSaveButton(ClickEvent ce){
annotationAreaGroup.setType(ControlGroupType.NONE);
annotationArea.setPlaceholder("");
listBoxStatusGroup.setType(ControlGroupType.NONE);
if(isRevertingMerge && listBoxStatus.getSelectedIndex() <= 0){
listBoxStatusGroup.setType(ControlGroupType.ERROR);
listBoxStatus.setFocus(true);
return;
}
// in case we are rejecting the record or the merge, the annotation is mandatory
Status selectedStatus = Status.fromString(listBoxStatus.getSelectedItemText());
if(selectedStatus.equals(Status.Reject_Merge) || selectedStatus.equals(Status.Rejected)){
if(annotationArea.getText() == null || annotationArea.getText().isEmpty()){
annotationArea.setPlaceholder("In case of reject operations you must specify an annotation message.");
annotationAreaGroup.setType(ControlGroupType.ERROR);
annotationArea.setFocus(true);
return;
}
}
manageProductModal.setCloseVisible(false);
cancelButton.setEnabled(false);
confirmButton.setEnabled(false);
loaderIcon.setVisible(true);
if(isRevertingMerge)
revertMergeOperation();
else
performRecordUpdate();
}
/**
* Perform a revert merge operation
*/
private void revertMergeOperation(){
service.performRevertOperation(revertableOperation, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
confirmButton.setEnabled(true);
loaderIcon.setVisible(false);
if(!result){
showInfo("Unable to perform this operation. ", AlertType.ERROR);
}
else{
infoBlock.setVisible(true);
infoBlock.setType(AlertType.SUCCESS);
infoBlock.setText("The request has been processed successfully!");
confirmButton.removeFromParent();
cancelButton.setText("Ok");
cancelButton.setType(ButtonType.INFO);
cancelButton.setEnabled(true);
}
}
@Override
public void onFailure(Throwable caught) {
showInfo("Unable to perform this operation. " + (caught != null ? "Error was " + caught : ""), AlertType.ERROR);
confirmButton.setEnabled(true);
loadingImage.setVisible(false);
}
});
}
/**
* Perform an update for this record
*/
private void performRecordUpdate(){
String report = "";
Set<String> hashtags = new HashSet<>();
// get short name
bean.setShortNameUpdated(shortNameTextBox.getText());
report += "\n-Information of the record managed:";
report += "\n\t- GRSF Name '" + bean.getTitle() + "' ;";
report += "\n\t- Short Name '" + bean.getShortName() + "' ;";
report += "\n\t- URL '" + bean.getUrl() + "' ;";
report += "\n\t- Semantic Identifier '" + bean.getSemanticIdentifier() + "' ;";
String involvedSourceRecords = "\n\t- Database Sources involved: ";
List<SourceRecord> sources = bean.getSources();
for (SourceRecord sourceRecord : sources) {
involvedSourceRecords += sourceRecord.getName() + " ";
}
involvedSourceRecords += ";";
report += involvedSourceRecords;
if(!bean.getShortName().equals(bean.getShortNameUpdated())){
report += "\n- The GRSF Short Name has been changed to '" + bean.getShortNameUpdated() + "' from '" + bean.getShortName() + "';";
hashtags.add(HashTagsOnUpdate.SHORTNAME_UPDATED.getString());
}
// status
bean.setNewGrsfType(productGrsfTypeListbox.getSelectedItemText());
if(bean.getNewGrsfType().equalsIgnoreCase(bean.getCurrentGrsfType())){
report += "\n- The GRSF Type is unchanged;";
}
else{
report += "\n- The GRSF Type has been changed to '" + bean.getNewGrsfType() + "' from '" + bean.getCurrentGrsfType() + "';";
hashtags.add(HashTagsOnUpdate.GRSF_TYPE_CHANGED.getString());
}
// evaluate the connections and the actions on them
bean.setConnections(connectWidget.getConnectList());
// add the connections for the report
if(!bean.getConnections().isEmpty()){
report += "\n- Suggested connections:";
boolean addConnectionHashtag = false;
boolean removeConnectionHashtag = false;
for(ConnectedBean cb: bean.getConnections()){
if(cb.isRemove()){
removeConnectionHashtag = true;
report += "\n\t - remove connection with record " + cb.getUrl() + ";";
}
else if(cb.isConnect()){
addConnectionHashtag = true;
report += "\n\t - add connection with record " + cb.getUrl() + ";";
}else
report += "\n\t - keep this suggestion " + cb.getUrl() + ";";
}
if(removeConnectionHashtag)
hashtags.add(HashTagsOnUpdate.DISCONNECT.getString());
if(addConnectionHashtag)
hashtags.add(HashTagsOnUpdate.CONNECT.getString());
}
// update similar records and to connect
if(similarRecordPanel != null)
bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords());
else
bean.setSimilarGrsfRecords(new ArrayList<SimilarGRSFRecord>(0));
// add the suggested ones, if any
bean.getSimilarGrsfRecords().addAll(suggestedMergesPanel.getSimilarRecords());
// set the merge operator on the bean if there is at least one merge to be done
if(!bean.getSimilarGrsfRecords().isEmpty()){
report += "\n- Suggested merges:";
for(SimilarGRSFRecord sR: bean.getSimilarGrsfRecords()){
if(sR.isSuggestedMerge()){
bean.setMergesInvolved(true);
report += "\n\t - merge the current record with record '" + sR.getTitle() + "' ;";
report += "\n\t \t- GRSF Name '" + sR.getTitle() + "' ;";
report += "\n\t \t- Short Name '" + sR.getShortName() + "' ;";
report += "\n\t \t- URL '" + sR.getUrl() + "' ;";
report += "\n\t \t- Semantic Identifier '" + sR.getSemanticIdentifier() + "' ;";
}
}
if(bean.isMergesInvolved()){
report += "\n- The update involves a merge operation;";
hashtags.add(HashTagsOnUpdate.MERGE.getString());
}
}
// set new values
bean.setAnnotation(new HTML(annotationArea.getText().trim()).getText());
if(bean.getAnnotation() != null && !bean.getAnnotation().isEmpty())
report += "\n- Annotation message is: " + bean.getAnnotation() + ";";
// traceability flag
Boolean traceabilityNewValue = traceabilityFlag.getValue();
boolean currentTraceabilitFlag = bean.isTraceabilityFlag();
if(!traceabilityNewValue.equals(currentTraceabilitFlag)){
report += "\n- Traceability flag has been changed to: '" + traceabilityNewValue + "';";
if(traceabilityNewValue)
hashtags.add(HashTagsOnUpdate.TRACEABILITY_FLAG_SET.getString());
else
hashtags.add(HashTagsOnUpdate.TRACEABILITY_FLAG_UNSET.getString());
}
// update the traceability flag
bean.setTraceabilityFlag(traceabilityNewValue);
// sdg flag
Boolean sdgNewValue = sdgFlag.getValue();
boolean currentSdgFlag = bean.isSdgFlag();
if(!sdgNewValue.equals(currentSdgFlag)){
report += "\n- SDG flag has been changed to: '" + sdgNewValue + "';";
if(sdgNewValue)
hashtags.add(HashTagsOnUpdate.SDG_FLAG_SET.getString());
else
hashtags.add(HashTagsOnUpdate.SDG_FLAG_UNSET.getString());
}
// update the traceability flag
bean.setSdgFlag(sdgNewValue);
// force the new status in the listbox
if(bean.isMergesInvolved()){
bean.setNewStatus(Status.To_be_Merged);
report += "\n- The Status has been changed to '" + bean.getNewStatus().getOrigName() + "'.";
}
else if(listBoxStatus.getSelectedIndex() <= 0){
// if the status has not be changed ...
bean.setNewStatus(bean.getCurrentStatus());
report += "\n- The Status is unchanged.";
}
else{
bean.setNewStatus(Status.fromString(listBoxStatus.getSelectedItemText()));
report += "\n- The Status has been changed to '" + bean.getNewStatus().getOrigName() + "'.";
hashtags.add(bean.getNewStatus().getOrigName());
}
// set the report
bean.setReport(report);
// set hashtags
bean.setHashtags(hashtags);
GWT.log("Report is:\n" + report);
service.notifyProductUpdate(bean, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void v) {
showInfo(STATUS_UPDATE_SUCCESS, AlertType.SUCCESS);
confirmButton.removeFromParent();
formUpdate.setVisible(false);
manageProductModal.setCloseVisible(true);
cancelButton.setEnabled(true);
cancelButton.setText("Ok");
cancelButton.setType(ButtonType.INFO);
loaderIcon.setVisible(false);
updateSucceeded = true;
}
@Override
public void onFailure(Throwable caught) {
manageProductModal.setCloseVisible(true);
cancelButton.setEnabled(true);
confirmButton.setEnabled(true);
loaderIcon.setVisible(false);
showInfo(STATUS_UPDATE_ERROR + ": " + caught.getMessage(), AlertType.ERROR);
}
});
}
@UiHandler("cancelButton")
void onCancelButton(ClickEvent ce){
manageProductModal.hide();
if(updateSucceeded)
Window.Location.reload();
}
/**
* Show information
* @param statusUpdateError
*/
protected void showInfo(String statusUpdateError, AlertType type) {
infoBlock.setText(statusUpdateError);
infoBlock.setType(type);
infoBlock.setVisible(true);
infoBlock.getElement().focus();
}
/**
* Retrieve the list of types for stocks and fisheries, given the domain
* @param domain
* @return a list of types
*/
private List<String> getTypesForRecord(
String domain) {
if(domain == null)
throw new RuntimeException("GRSF Domain is missing!");
return domain.equalsIgnoreCase(Product_Type.FISHERY.getOrigName()) ? Fishery_Type.getTypesAsListString() : Stock_Type.getTypesAsListString();
}
}