package org.activityinfo.ui.client.page.config;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* 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 com.extjs.gxt.ui.client.Style;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.client.state.StateProvider;
import org.activityinfo.legacy.shared.command.AddProject;
import org.activityinfo.legacy.shared.command.RequestChange;
import org.activityinfo.legacy.shared.command.result.CreateResult;
import org.activityinfo.legacy.shared.command.result.VoidResult;
import org.activityinfo.legacy.shared.exception.DuplicatePartnerException;
import org.activityinfo.legacy.shared.model.ProjectDTO;
import org.activityinfo.legacy.shared.model.UserDatabaseDTO;
import org.activityinfo.ui.client.AppEvents;
import org.activityinfo.ui.client.EventBus;
import org.activityinfo.ui.client.page.PageId;
import org.activityinfo.ui.client.page.PageState;
import org.activityinfo.ui.client.page.common.dialog.FormDialogCallback;
import org.activityinfo.ui.client.page.common.dialog.FormDialogImpl;
import org.activityinfo.ui.client.page.common.dialog.FormDialogTether;
import org.activityinfo.ui.client.page.common.grid.AbstractGridPresenter;
import org.activityinfo.ui.client.page.common.grid.GridView;
import org.activityinfo.ui.client.page.common.toolbar.UIActions;
import org.activityinfo.ui.client.page.config.form.ProjectForm;
import java.util.ArrayList;
/*
* Displays a grid where users can add, remove and change projects
*/
public class DbProjectEditor extends AbstractGridPresenter<ProjectDTO> implements DbPage {
public static final PageId PAGE_ID = new PageId("projects");
@ImplementedBy(DbProjectGrid.class)
public interface View extends GridView<DbProjectEditor, ProjectDTO> {
public void init(DbProjectEditor editor, UserDatabaseDTO db, ListStore<ProjectDTO> store);
public FormDialogTether showAddDialog(ProjectDTO partner, FormDialogCallback callback);
}
private final Dispatcher service;
private final EventBus eventBus;
private final View view;
private UserDatabaseDTO db;
private ListStore<ProjectDTO> store;
@Inject
public DbProjectEditor(EventBus eventBus, Dispatcher service, StateProvider stateMgr, View view) {
super(eventBus, stateMgr, view);
this.service = service;
this.eventBus = eventBus;
this.view = view;
}
@Override
public void go(UserDatabaseDTO db) {
this.db = db;
store = new ListStore<ProjectDTO>();
store.setSortField("name");
store.setSortDir(Style.SortDir.ASC);
store.add(new ArrayList<ProjectDTO>(db.getProjects()));
view.init(this, db, store);
view.setActionEnabled(UIActions.DELETE, false);
}
@Override
protected void onEdit(final ProjectDTO model) {
final FormDialogImpl<ProjectForm> dialog = new FormDialogImpl<ProjectForm>(new ProjectForm());
dialog.setWidth(450);
dialog.setHeight(300);
dialog.getForm().getBinding().bind(model);
dialog.show(new FormDialogCallback() {
@Override
public void onValidated() {
service.execute(RequestChange.update(model, "name", "description"),
dialog,
new AsyncCallback<VoidResult>() {
@Override
public void onFailure(Throwable caught) {
// handled by monitor
}
@Override
public void onSuccess(VoidResult result) {
dialog.hide();
eventBus.fireEvent(AppEvents.SCHEMA_CHANGED);
view.refresh();
}
});
}
});
}
@Override
protected void onDeleteConfirmed(final ProjectDTO project) {
service.execute(RequestChange.delete(project), view.getDeletingMonitor(), new AsyncCallback<VoidResult>() {
@Override
public void onFailure(Throwable caught) {
MessageBox.alert(I18N.CONSTANTS.error(), I18N.CONSTANTS.errorOnServer(), null);
}
@Override
public void onSuccess(VoidResult result) {
store.remove(project);
}
});
}
@Override
protected void onAdd() {
final ProjectDTO newProject = new ProjectDTO();
this.view.showAddDialog(newProject, new FormDialogCallback() {
@Override
public void onValidated(final FormDialogTether dlg) {
service.execute(new AddProject(db.getId(), newProject), dlg, new AsyncCallback<CreateResult>() {
@Override
public void onFailure(Throwable caught) {
if (caught instanceof DuplicatePartnerException) {
MessageBox.alert(I18N.CONSTANTS.error(), I18N.CONSTANTS.errorOnServer(), null);
} else {
MessageBox.alert(I18N.CONSTANTS.error(), I18N.CONSTANTS.errorOnServer(), null);
}
}
@Override
public void onSuccess(CreateResult result) {
newProject.setId(result.getNewId());
store.add(newProject);
db.getProjects().add(newProject);
eventBus.fireEvent(AppEvents.SCHEMA_CHANGED);
dlg.hide();
}
});
}
});
}
// @Override
// public void onSelectionChanged(ProjectDTO selectedItem) {
// view.setActionEnabled(UIActions.delete, true);
// }
@Override
public PageId getPageId() {
return PAGE_ID;
}
@Override
public Object getWidget() {
return view;
}
@Override
public boolean navigate(PageState place) {
return false;
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
}
@Override
protected String getStateId() {
return "ProjectsGrid";
}
@Override
public void onSelectionChanged(ModelData selectedItem) {
view.setActionEnabled(UIActions.DELETE, true);
}
}