package org.sigmah.client.ui.presenter.admin.importation;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.sigmah.client.dispatch.CommandResultHandler;
import org.sigmah.client.dispatch.monitor.LoadingMask;
import org.sigmah.client.event.UpdateEvent;
import org.sigmah.client.event.handler.UpdateHandler;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.inject.Injector;
import org.sigmah.client.page.Page;
import org.sigmah.client.page.PageRequest;
import org.sigmah.client.page.RequestParameter;
import org.sigmah.client.ui.notif.ConfirmCallback;
import org.sigmah.client.ui.notif.N10N;
import org.sigmah.client.ui.presenter.admin.AbstractAdminPresenter;
import org.sigmah.client.ui.view.admin.importation.ImportationSchemeAdminView;
import org.sigmah.client.util.AdminUtil;
import org.sigmah.client.util.MessageType;
import org.sigmah.shared.command.CreateEntity;
import org.sigmah.shared.command.GetImportationSchemes;
import org.sigmah.shared.command.result.CreateResult;
import org.sigmah.shared.command.result.ListResult;
import org.sigmah.shared.dto.importation.ImportationSchemeDTO;
import org.sigmah.shared.dto.importation.VariableDTO;
import org.sigmah.shared.dto.referential.ImportationSchemeFileFormat;
import org.sigmah.shared.dto.referential.ImportationSchemeImportType;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.IconButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.IconButton;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.ArrayList;
import org.sigmah.shared.command.DeleteImportationSchemes;
import org.sigmah.shared.command.result.VoidResult;
/**
* Presenter for the administration page of importation schemes.
*
* @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr)
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
@Singleton
public class ImportationSchemeAdminPresenter extends AbstractAdminPresenter<ImportationSchemeAdminPresenter.View> {
/**
* Current selected Importation Scheme DTO.
*/
private ImportationSchemeDTO currentImportationSchemeDTO;
/**
* Description of the view managed by this presenter.
*/
@ImplementedBy(ImportationSchemeAdminView.class)
public static interface View extends AbstractAdminPresenter.View {
void setImportationSchemePresenterHandler(ImportationSchemePresenterHandler importationSchemePresenterHandler);
ListStore<VariableDTO> getVariablesStore();
ListStore<ImportationSchemeDTO> getSchemesStore();
void confirmDeleteSchemesSelected(ConfirmCallback confirmCallback);
void confirmDeleteVariablesSelected(ConfirmCallback confirmCallback);
List<VariableDTO> getVariablesSelection();
List<ImportationSchemeDTO> getSchemesSelection();
LoadingMask getVariablesLoadingMonitor();
LoadingMask getSchemesLoadingMonitor();
Button getAddVariableButton();
Button getDeleteVariableButton();
Button getDeleteSchemeButton();
Button getAddSchemeButton();
Button getEditSchemeButton();
Button getSaveSheetNameFirstRowButton();
IconButton getVariablesCloseButton();
Grid<ImportationSchemeDTO> getSchemesGrid();
Grid<VariableDTO> getVariablesGrid();
ContentPanel getSchemePanel();
ContentPanel getVariablePanel();
NumberField getFirstRow();
TextField<String> getSheetName();
Label getFirstRowLabel();
Label getSheetNameLabel();
boolean isFirstRowSheetNameValid(ImportationSchemeFileFormat format);
}
/**
* ImportationSchemePresenterHandler Grid Importation Scheme & Grid Imporation Scheme Varaible
*
* @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr).
*/
public interface ImportationSchemePresenterHandler {
/**
* Edit Importation Scheme
*
* @param importationSchemeDTO
*/
void onImportationSchemeEdit(ImportationSchemeDTO importationSchemeDTO);
/**
* Edit Variable Importation Scheme
*
* @param variableDTO
*/
void onVariableImportationSchemeEdit(VariableDTO variableDTO);
}
@Inject
protected ImportationSchemeAdminPresenter(View view, Injector injector) {
super(view, injector);
}
@Override
public Page getPage() {
return Page.ADMIN_IMPORTATION_SCHEME;
}
@Override
public void onBind() {
// --
// Add importation sheme button.
// --
view.getAddSchemeButton().addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
eventBus.navigate(Page.ADMIN_ADD_IMPORTATION_SCHEME);
}
});
// --
// Defining delete and edit button enable rule.
// --
view.getSchemesGrid().getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<ImportationSchemeDTO>() {
@Override
public void selectionChanged(SelectionChangedEvent<ImportationSchemeDTO> se) {
final boolean enabled = se.getSelectedItem() != null;
view.getDeleteSchemeButton().setEnabled(enabled);
view.getEditSchemeButton().setEnabled(enabled);
}
});
// --
// Delete importation sheme button.
// --
view.getDeleteSchemeButton().addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
final ImportationSchemeDTO scheme = view.getSchemesGrid().getSelectionModel().getSelectedItem();
N10N.confirmation(I18N.CONSTANTS.delete(), I18N.MESSAGES.confirmDeleteSchemes(scheme.getName()), new ConfirmCallback() {
@Override
public void onAction() {
deleteImportationScheme(scheme);
}
});
}
});
// --
// Edit importation sheme button.
// --
view.getEditSchemeButton().addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
final ImportationSchemeDTO scheme = view.getSchemesGrid().getSelectionModel().getSelectedItem();
eventBus.navigateRequest(Page.ADMIN_ADD_IMPORTATION_SCHEME.request()
.addData(RequestParameter.DTO, scheme));
}
});
// --
// Add importation sheme variable button.
// --
view.getAddVariableButton().addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
if (currentImportationSchemeDTO != null) {
eventBus.navigateRequest(Page.ADMIN_ADD_VARIABLE_IMPORTATION_SCHEME.request()
.addData(RequestParameter.IMPORTATION_SCHEME, currentImportationSchemeDTO));
} else {
N10N.message(I18N.MESSAGES.importSchemenNoSelected(), MessageType.INFO);
}
}
});
// --
// Save sheet name Importation Scheme Variable.
// --
view.getSaveSheetNameFirstRowButton().addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
Map<String, Object> newSchemaProperties = new HashMap<String, Object>();
if (view.isFirstRowSheetNameValid(currentImportationSchemeDTO.getFileFormat())) {
newSchemaProperties.put(AdminUtil.ADMIN_SCHEMA, currentImportationSchemeDTO);
newSchemaProperties.put(AdminUtil.PROP_SCH_FIRST_ROW, view.getFirstRow().getValue().intValue());
newSchemaProperties.put(AdminUtil.PROP_SCH_SHEET_NAME, view.getSheetName().getValue());
CreateEntity cmd = new CreateEntity(ImportationSchemeDTO.ENTITY_NAME, newSchemaProperties);
dispatch.execute(cmd, new CommandResultHandler<CreateResult>() {
@Override
public void onCommandSuccess(CreateResult result) {
N10N.message(I18N.CONSTANTS.infoConfirmation(), I18N.CONSTANTS.adminImportationSchemeUpdateConfirm(), MessageType.INFO);
ImportationSchemeDTO schemaUpdated = (ImportationSchemeDTO) result.getEntity();
currentImportationSchemeDTO.setFirstRow(schemaUpdated.getFirstRow());
currentImportationSchemeDTO.setSheetName(schemaUpdated.getSheetName());
view.getSchemesStore().update(currentImportationSchemeDTO);
view.getSchemesStore().commitChanges();
view.getSaveSheetNameFirstRowButton().disable();
}
});
} else {
N10N.message(I18N.MESSAGES.importationSchemeVariableInvalidValues(), MessageType.ERROR);
}
}
});
// --
// Delete Variable Importation Scheme.
// --
view.getVariablesGrid().getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<VariableDTO>() {
@Override
public void selectionChanged(SelectionChangedEvent<VariableDTO> se) {
view.getDeleteVariableButton().setEnabled(!se.getSelection().isEmpty());
}
});
view.getDeleteVariableButton().addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
final List<VariableDTO> variables = view.getVariablesGrid().getSelectionModel().getSelection();
final StringBuilder variableNames = new StringBuilder();
for(final VariableDTO variable : variables) {
variableNames.append(variable.getName()).append(", ");
}
if(variableNames.length() > 0) {
variableNames.setLength(variableNames.length() - 2);
}
N10N.confirmation(I18N.CONSTANTS.delete(), I18N.MESSAGES.confirmDeleteVariables(variableNames.toString()), new ConfirmCallback() {
@Override
public void onAction() {
deleteVariables(variables);
}
});
}
});
view.getVariablesCloseButton().addSelectionListener(new SelectionListener<IconButtonEvent>() {
@Override
public void componentSelected(IconButtonEvent ce) {
eventBus.navigateRequest(Page.ADMIN_IMPORTATION_SCHEME.request()
.addData(RequestParameter.NO_REFRESH, true));
}
});
// --
// Presenter Handler.
// --
view.setImportationSchemePresenterHandler(new ImportationSchemePresenterHandler() {
// Edit Importation Scheme Button
@Override
public void onImportationSchemeEdit(ImportationSchemeDTO importationSchemeDTO) {
eventBus.navigateRequest(Page.ADMIN_IMPORTATION_SCHEME.request()
.addParameter(RequestParameter.MODEL, importationSchemeDTO.getId())
.addData(RequestParameter.DTO, importationSchemeDTO));
}
// Edit Variable Importation Scheme
@Override
public void onVariableImportationSchemeEdit(VariableDTO variableDTO) {
PageRequest request = Page.ADMIN_ADD_VARIABLE_IMPORTATION_SCHEME.request().addData(RequestParameter.IMPORTATION_SCHEME, currentImportationSchemeDTO);
request.addData(RequestParameter.VARIABLE_IMPORTATION_SCHEME, variableDTO);
eventBus.navigateRequest(request);
}
});
// --
// Register Handler
// --
registerHandler(eventBus.addHandler(UpdateEvent.getType(), new UpdateHandler() {
@Override
public void onUpdate(final UpdateEvent event) {
if (event.concern(UpdateEvent.IMPORTATION_SCHEME_UPDATE)) {
final Integer selection = currentImportationSchemeDTO != null ? currentImportationSchemeDTO.getId() : null;
loadImportationShemes(selection);
}
if (event.concern(UpdateEvent.VARIABLE_SCHEME_UPDATE)) {
currentImportationSchemeDTO = event.getParam(0);
final Integer selection = currentImportationSchemeDTO != null ? currentImportationSchemeDTO.getId() : null;
loadImportationShemes(selection);
}
}
}));
}
@Override
public void onPageRequest(PageRequest request) {
final Integer currentSchemeId = request.getParameterInteger(RequestParameter.MODEL);
final ImportationSchemeDTO scheme = request.getData(RequestParameter.DTO);
final Boolean dontRefresh = request.getData(RequestParameter.NO_REFRESH);
view.getVariablePanel().setVisible(false);
if(dontRefresh != null && dontRefresh) {
return;
}
if(scheme == null) {
loadImportationShemes(currentSchemeId);
} else {
loadImportationScheme(scheme);
}
}
@Override
protected boolean hasValueChanged() {
return view.getSaveSheetNameFirstRowButton().isEnabled();
}
/**
* Hides the specific fields for the ROW import type
*/
public void hideSheetNameFirstRow() {
view.getFirstRow().hide();
view.getSheetName().hide();
view.getSaveSheetNameFirstRowButton().hide();
view.getFirstRowLabel().hide();
view.getSheetNameLabel().hide();
view.getSaveSheetNameFirstRowButton().disable();
if (currentImportationSchemeDTO != null && ImportationSchemeImportType.ROW.equals(currentImportationSchemeDTO.getImportType())) {
view.getSaveSheetNameFirstRowButton().show();
view.getFirstRow().show();
view.getFirstRowLabel().show();
if (!ImportationSchemeFileFormat.CSV.equals(currentImportationSchemeDTO.getFileFormat())) {
view.getSheetNameLabel().show();
view.getSheetName().show();
}
}
}
/**
* Load Importation Scheme
*/
public void loadImportationShemes(final Integer selection) {
view.getSchemesStore().removeAll();
view.getSchemesStore().clearFilters();
dispatch.execute(new GetImportationSchemes(), new CommandResultHandler<ListResult<ImportationSchemeDTO>>() {
@Override
public void onCommandSuccess(ListResult<ImportationSchemeDTO> result) {
if (result.getList() != null && !result.getList().isEmpty()) {
view.getSchemesStore().add(result.getList());
if(selection != null) {
for(final ImportationSchemeDTO scheme : result.getList()) {
if(selection.equals(scheme.getId())) {
loadImportationScheme(scheme);
}
}
} else {
view.getSaveSheetNameFirstRowButton().disable();
}
}
}
}, view.getSchemesLoadingMonitor());
}
private void loadImportationScheme(ImportationSchemeDTO scheme) {
currentImportationSchemeDTO = scheme;
view.getSchemesGrid().getSelectionModel().select(scheme, false);
view.getVariablePanel().setHeadingText(scheme.getName());
if (currentImportationSchemeDTO.getFirstRow() != null) {
view.getFirstRow().setValue(currentImportationSchemeDTO.getFirstRow());
} else {
view.getFirstRow().clear();
}
if (currentImportationSchemeDTO.getSheetName() != null) {
view.getSheetName().setValue(currentImportationSchemeDTO.getSheetName());
} else {
view.getSheetName().clear();
}
hideSheetNameFirstRow();
switch (currentImportationSchemeDTO.getImportType()) {
case ROW:
view.getVariablesGrid().getColumnModel().getColumnById("reference").setHeaderHtml(I18N.CONSTANTS.adminImportReferenceColumn());
break;
case SEVERAL:
view.getVariablesGrid().getColumnModel().getColumnById("reference").setHeaderHtml(I18N.CONSTANTS.adminImportReferenceCell());
break;
case UNIQUE:
view.getVariablesGrid().getColumnModel().getColumnById("reference").setHeaderHtml(I18N.CONSTANTS.adminImportReferenceSheetCell());
break;
default:
break;
}
view.getVariablesGrid().show();
view.getVariablesStore().removeAll();
view.getVariablesStore().add(currentImportationSchemeDTO.getVariables());
view.getVariablesStore().commitChanges();
view.getAddVariableButton().enable();
view.getVariablePanel().setVisible(true);
}
private void deleteImportationScheme(final ImportationSchemeDTO scheme) {
dispatch.execute(new DeleteImportationSchemes(scheme.getId()), new CommandResultHandler<VoidResult>() {
@Override
protected void onCommandSuccess(VoidResult result) {
view.getSchemesStore().remove(scheme);
view.getSchemesStore().commitChanges();
// BUGFIX #799 : Verifying if an importation scheme has been selected before using it.
if(currentImportationSchemeDTO != null && currentImportationSchemeDTO.equals(scheme)) {
eventBus.navigateRequest(Page.ADMIN_IMPORTATION_SCHEME.request()
.addData(RequestParameter.NO_REFRESH, true));
}
N10N.infoNotif(I18N.CONSTANTS.infoConfirmation(), I18N.CONSTANTS.adminImportationSchemesDeleteConfirm());
}
}, view.getSchemesLoadingMonitor());
}
private void deleteVariables(final List<VariableDTO> variables) {
final ArrayList<Integer> ids = new ArrayList<Integer>();
for(final VariableDTO variable : variables) {
ids.add(variable.getId());
}
dispatch.execute(new DeleteImportationSchemes(ids), new CommandResultHandler<VoidResult>() {
@Override
protected void onCommandSuccess(VoidResult result) {
for(final VariableDTO variable : variables) {
view.getVariablesStore().remove(variable);
}
view.getSchemesStore().commitChanges();
N10N.infoNotif(I18N.CONSTANTS.infoConfirmation(), I18N.CONSTANTS.adminVariableDeleteConfirm());
eventBus.fireEvent(new UpdateEvent(UpdateEvent.VARIABLE_SCHEME_UPDATE, currentImportationSchemeDTO));
}
}, view.getSchemesLoadingMonitor());
}
}