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.store.Record;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Provider;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.AsyncMonitor;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.client.state.StateProvider;
import org.activityinfo.legacy.shared.command.AddTarget;
import org.activityinfo.legacy.shared.command.Delete;
import org.activityinfo.legacy.shared.command.GetTargets;
import org.activityinfo.legacy.shared.command.UpdateEntity;
import org.activityinfo.legacy.shared.command.result.CreateResult;
import org.activityinfo.legacy.shared.command.result.TargetResult;
import org.activityinfo.legacy.shared.command.result.VoidResult;
import org.activityinfo.legacy.shared.model.PartnerDTO;
import org.activityinfo.legacy.shared.model.ProjectDTO;
import org.activityinfo.legacy.shared.model.TargetDTO;
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.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 java.util.HashMap;
import java.util.Map;
/**
* Displays a grid where users can add, remove and change Targets
*/
public class DbTargetEditor extends AbstractGridPresenter<TargetDTO> implements DbPage {
public static final PageId PAGE_ID = new PageId("targets");
@ImplementedBy(DbTargetGrid.class)
public interface View extends GridView<DbTargetEditor, TargetDTO> {
void init(DbTargetEditor editor, UserDatabaseDTO db, ListStore<TargetDTO> store);
void createTargetValueContainer(Widget w);
FormDialogTether showAddDialog(TargetDTO target, UserDatabaseDTO db, FormDialogCallback callback);
AsyncMonitor getLoadingMonitor();
}
private final Dispatcher service;
private final EventBus eventBus;
private final View view;
private UserDatabaseDTO db;
private ListStore<TargetDTO> store;
private final TargetIndicatorPresenter targetIndicatorPresenter;
@Inject
public DbTargetEditor(EventBus eventBus,
Dispatcher service,
StateProvider stateMgr,
View view,
Provider<TargetIndicatorPresenter> targetIndicatorPresenterProvider) {
super(eventBus, stateMgr, view);
this.service = service;
this.eventBus = eventBus;
this.view = view;
targetIndicatorPresenter = targetIndicatorPresenterProvider.get();
}
@Override
public void go(UserDatabaseDTO db) {
this.db = db;
store = new ListStore<TargetDTO>();
store.setSortField("name");
store.setSortDir(Style.SortDir.ASC);
fillStore();
view.init(this, db, store);
view.setActionEnabled(UIActions.DELETE, false);
view.setActionEnabled(UIActions.EDIT, false);
view.createTargetValueContainer((Widget) targetIndicatorPresenter.getWidget());
targetIndicatorPresenter.go(db);
}
private void fillStore() {
service.execute(new GetTargets(db.getId()), view.getLoadingMonitor(), new AsyncCallback<TargetResult>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(TargetResult result) {
store.add(result.getData());
}
});
}
@Override
protected void onDeleteConfirmed(final TargetDTO model) {
service.execute(new Delete(model), view.getDeletingMonitor(), new AsyncCallback<VoidResult>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(VoidResult result) {
store.remove(model);
store.commitChanges();
eventBus.fireEvent(AppEvents.SCHEMA_CHANGED);
}
});
}
@Override
protected void onAdd() {
final TargetDTO newTarget = new TargetDTO();
this.view.showAddDialog(newTarget, db, new FormDialogCallback() {
@Override
public void onValidated(final FormDialogTether dlg) {
service.execute(new AddTarget(db.getId(), newTarget), dlg, new AsyncCallback<CreateResult>() {
@Override
public void onFailure(Throwable caught) {
MessageBox.alert(I18N.CONSTANTS.error(), I18N.CONSTANTS.errorOnServer(), null);
}
@Override
public void onSuccess(CreateResult result) {
newTarget.setId(result.getNewId());
PartnerDTO partner = db.getPartnerById((Integer) newTarget.get("partnerId"));
newTarget.setPartner(partner);
ProjectDTO project = db.getProjectById((Integer) newTarget.get("projectId"));
newTarget.setProject(project);
store.add(newTarget);
store.commitChanges();
eventBus.fireEvent(AppEvents.SCHEMA_CHANGED);
dlg.hide();
}
});
}
});
}
@Override
protected void onEdit(final TargetDTO dto) {
this.view.showAddDialog(dto, db, new FormDialogCallback() {
@Override
public void onValidated(final FormDialogTether dlg) {
final Record record = store.getRecord(dto);
service.execute(new UpdateEntity(dto, getChangedProperties(record)),
dlg,
new AsyncCallback<VoidResult>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(VoidResult result) {
PartnerDTO partner = db.getPartnerById((Integer) record.get("partnerId"));
dto.setPartner(partner);
ProjectDTO project = db.getProjectById((Integer) record.get("projectId"));
dto.setProject(project);
store.commitChanges();
eventBus.fireEvent(AppEvents.SCHEMA_CHANGED);
dlg.hide();
}
});
}
});
}
protected Map<String, Object> getChangedProperties(Record record) {
Map<String, Object> changes = new HashMap<String, Object>();
for (String property : record.getChanges().keySet()) {
changes.put(property, record.get(property));
}
return changes;
}
@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() {
}
@Override
protected String getStateId() {
return "TargetGrid";
}
@Override
public void onSelectionChanged(ModelData selectedItem) {
view.setActionEnabled(UIActions.DELETE, true);
view.setActionEnabled(UIActions.EDIT, true);
targetIndicatorPresenter.load(view.getSelection());
}
}