package org.activityinfo.ui.client.page.entry.form;
/*
* #%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.widget.MessageBox;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.activityinfo.core.client.ResourceLocator;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.client.callback.SuccessCallback;
import org.activityinfo.legacy.shared.Log;
import org.activityinfo.legacy.shared.adapter.ResourceLocatorAdaptor;
import org.activityinfo.legacy.shared.command.DimensionType;
import org.activityinfo.legacy.shared.command.Filter;
import org.activityinfo.legacy.shared.command.GetActivityForm;
import org.activityinfo.legacy.shared.command.GetSchema;
import org.activityinfo.legacy.shared.model.*;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.model.legacy.KeyGenerator;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.ui.client.EventBus;
import org.activityinfo.ui.client.component.form.FormDialog;
import org.activityinfo.ui.client.component.form.FormDialogCallback;
import org.activityinfo.ui.client.page.entry.location.LocationDialog;
public class SiteDialogLauncher {
private final Dispatcher dispatcher;
private final ResourceLocator resourceLocator;
private final EventBus eventBus;
public SiteDialogLauncher(Dispatcher dispatcher, EventBus eventBus) {
super();
this.dispatcher = dispatcher;
this.eventBus = eventBus;
this.resourceLocator = new ResourceLocatorAdaptor(dispatcher);
}
public void addSite(final Filter filter, final SiteDialogCallback callback) {
if (filter.isDimensionRestrictedToSingleCategory(DimensionType.Activity)) {
final int activityId = filter.getRestrictedCategory(DimensionType.Activity);
dispatcher.execute(new GetSchema(), new AsyncCallback<SchemaDTO>() {
@Override
public void onFailure(Throwable caught) {
showError(caught);
}
@Override
public void onSuccess(SchemaDTO schema) {
ActivityDTO activity = schema.getActivityById(activityId);
Log.trace("adding site for activity " + activity + ", locationType = " + activity.getLocationType());
if(activity.getDatabase().getPartners().isEmpty()) {
// Since we are creating a partner by default for every database,
// this shouldn't happen beyond the development environment
MessageBox.alert(I18N.CONSTANTS.error(), I18N.CONSTANTS.noPartners(), null);
return;
}
if (!activity.getClassicView()) {// modern view
final ResourceId instanceId = CuidAdapter.newLegacyFormInstanceId(activity.getFormClassId());
FormInstance newInstance = new FormInstance(instanceId, activity.getFormClassId());
showModernFormDialog(activity.getName(), newInstance, callback, true);
return;
}
dispatcher.execute(new GetActivityForm(activityId)).then(new AsyncCallback<ActivityFormDTO>() {
@Override
public void onFailure(Throwable caught) {
showError(caught);
}
@Override
public void onSuccess(ActivityFormDTO activity) {
if (activity.getLocationType().isAdminLevel()) {
addNewSiteWithBoundLocation(activity, callback);
} else if (activity.getLocationType().isNationwide()) {
addNewSiteWithNoLocation(activity, callback);
} else {
chooseLocationThenAddSite(activity, callback);
}
}
});
}
});
}
}
private void showError(Throwable caught) {
MessageBox.alert(I18N.CONSTANTS.serverError(), I18N.CONSTANTS.errorUnexpectedOccured(), null);
Log.error("Error launching site dialog", caught);
}
public void showModernFormDialog(String formName, FormInstance instance, final SiteDialogCallback callback, boolean isNew) {
showModernFormDialog(formName, instance, callback, isNew, resourceLocator);
}
public static void showModernFormDialog(String formName, FormInstance instance, final SiteDialogCallback callback, boolean isNew, ResourceLocator resourceLocator) {
String h2Title = isNew ? I18N.CONSTANTS.newSubmission() : I18N.CONSTANTS.editSubmission();
FormDialog dialog = new FormDialog(resourceLocator);
dialog.setDialogTitle(formName, h2Title);
dialog.show(instance, new FormDialogCallback() {
@Override
public void onPersisted(FormInstance instance) {
callback.onSaved();
}
});
}
public void editSite(final SiteDTO site, final SiteDialogCallback callback) {
dispatcher.execute(new GetSchema(), new AsyncCallback<SchemaDTO>() {
@Override
public void onFailure(Throwable caught) {
showError(caught);
}
@Override
public void onSuccess(SchemaDTO schema) {
final ActivityDTO activity = schema.getActivityById(site.getActivityId());
if (!activity.getClassicView()) {// modern view
resourceLocator.getFormInstance(site.getInstanceId()).then(new SuccessCallback<FormInstance>() {
@Override
public void onSuccess(FormInstance result) {
showModernFormDialog(activity.getName(), result, callback, false);
}
});
return;
}
// check whether the site has been locked
// (this only applies to Once-reported activities because
// otherwise the date criteria applies to the monthly report)
if (activity.getReportingFrequency() == ActivityFormDTO.REPORT_ONCE) {
LockedPeriodSet locks = new LockedPeriodSet(schema);
if (locks.isLocked(site)) {
MessageBox.alert(I18N.CONSTANTS.lockedSiteTitle(), I18N.CONSTANTS.siteIsLocked(), null);
return;
}
}
dispatcher.execute(new GetActivityForm(activity.getId())).then(new AsyncCallback<ActivityFormDTO>() {
@Override
public void onFailure(Throwable caught) {
showError(caught);
}
@Override
public void onSuccess(ActivityFormDTO result) {
SiteDialog dialog = new SiteDialog(dispatcher, result, eventBus);
dialog.showExisting(site, callback);
}
});
}
});
}
private void chooseLocationThenAddSite(final ActivityFormDTO activity, final SiteDialogCallback callback) {
LocationDialog dialog = new LocationDialog(dispatcher,
activity.getLocationType());
dialog.show(new LocationDialog.Callback() {
@Override
public void onSelected(LocationDTO location, boolean isNew) {
SiteDTO newSite = new SiteDTO();
newSite.setActivityId(activity.getId());
newSite.setLocation(location);
SiteDialog dialog = new SiteDialog(dispatcher, activity, eventBus);
dialog.showNew(newSite, location, isNew, callback);
}
});
}
private void addNewSiteWithBoundLocation(ActivityFormDTO activity, SiteDialogCallback callback) {
SiteDTO newSite = new SiteDTO();
newSite.setActivityId(activity.getId());
LocationDTO location = new LocationDTO();
location.setId(new KeyGenerator().generateInt());
location.setLocationTypeId(activity.getLocationTypeId());
SiteDialog dialog = new SiteDialog(dispatcher, activity, eventBus);
dialog.showNew(newSite, location, true, callback);
}
private void addNewSiteWithNoLocation(ActivityFormDTO activity, SiteDialogCallback callback) {
SiteDTO newSite = new SiteDTO();
newSite.setActivityId(activity.getId());
LocationDTO location = new LocationDTO();
location.setId(activity.getLocationTypeId());
location.setLocationTypeId(activity.getLocationTypeId());
SiteDialog dialog = new SiteDialog(dispatcher, activity, eventBus);
dialog.showNew(newSite, location, true, callback);
}
}