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.Log; import org.activityinfo.legacy.shared.command.AddPartner; import org.activityinfo.legacy.shared.command.RemovePartner; import org.activityinfo.legacy.shared.command.result.CreateResult; import org.activityinfo.legacy.shared.command.result.DuplicateCreateResult; import org.activityinfo.legacy.shared.command.result.RemoveFailedResult; import org.activityinfo.legacy.shared.command.result.RemoveResult; import org.activityinfo.legacy.shared.model.PartnerDTO; 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.ArrayList; /** * @author Alex Bertram */ public class DbPartnerEditor extends AbstractGridPresenter<PartnerDTO> implements DbPage { public static final PageId PAGE_ID = new PageId("partners"); @ImplementedBy(DbPartnerGrid.class) public interface View extends GridView<DbPartnerEditor, PartnerDTO> { public void init(DbPartnerEditor editor, UserDatabaseDTO db, ListStore<PartnerDTO> store); public FormDialogTether showAddDialog(PartnerDTO partner, FormDialogCallback callback); } private final Dispatcher service; private final EventBus eventBus; private final View view; private UserDatabaseDTO db; private ListStore<PartnerDTO> store; @Inject public DbPartnerEditor(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<PartnerDTO>(); store.setSortField("name"); store.setSortDir(Style.SortDir.ASC); store.add(new ArrayList<PartnerDTO>(db.getPartners())); view.init(this, db, store); view.setActionEnabled(UIActions.DELETE, false); } @Override protected String getStateId() { return "PartnersGrid"; } // public void onSelectionChanged(PartnerDTO selectedItem) { // this.view.setActionEnabled(UIActions.delete, selectedItem != null); // } @Override protected void onAdd() { final PartnerDTO newPartner = new PartnerDTO(); this.view.showAddDialog(newPartner, new FormDialogCallback() { @Override public void onValidated(final FormDialogTether dlg) { service.execute(new AddPartner(db.getId(), newPartner), dlg, new AsyncCallback<CreateResult>() { @Override public void onFailure(Throwable caught) { Log.debug("DbPartnerEditor caught exception while executing command AddPartner: ", caught); } @Override public void onSuccess(CreateResult result) { if (result instanceof DuplicateCreateResult) { Log.debug("DbPartnerEditor tried to add partner '" + newPartner.getName() + "' to database " + db.getId() + " but it already exists"); MessageBox.alert(I18N.CONSTANTS.newPartner(), I18N.CONSTANTS.duplicatePartner(), null); } else { Log.debug("DbPartnerEditor added new partner '" + newPartner.getName() + "' to database " + db.getId()); newPartner.setId(result.getNewId()); store.add(newPartner); eventBus.fireEvent(AppEvents.SCHEMA_CHANGED); dlg.hide(); } } }); } }); } @Override protected void onDeleteConfirmed(final PartnerDTO model) { service.execute(new RemovePartner(db.getId(), model.getId()), view.getDeletingMonitor(), new AsyncCallback<RemoveResult>() { @Override public void onFailure(Throwable caught) { Log.debug("DbPartnerEditor caught exception while executing command RemovePartner: ", caught); } @Override public void onSuccess(RemoveResult result) { if (result instanceof RemoveFailedResult) { Log.debug("DbPartnerEditor tried to remove partner '" + model.getName() + "' from database " + db.getId() + " but there's data associated with it"); MessageBox.alert(I18N.CONSTANTS.removePartner(), I18N.MESSAGES.partnerHasDataWarning(model.getName()), null); } else { Log.debug("DbPartnerEditor removed partner '" + model.getName() + "' from database " + db.getId()); store.remove(model); } } }); } @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 public void onSelectionChanged(ModelData selectedItem) { this.view.setActionEnabled(UIActions.DELETE, selectedItem != null); } }