/* * Copyright (C) 2015 Jan Pokorsky * * 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/>. */ package cz.cas.lib.proarc.webapp.client.presenter; import com.google.gwt.place.shared.PlaceController; import com.smartgwt.client.data.DSCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.DSOperationType; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.form.DynamicForm; import cz.cas.lib.proarc.webapp.client.ClientMessages; import cz.cas.lib.proarc.webapp.client.ErrorHandler; import cz.cas.lib.proarc.webapp.client.ds.RestConfig; import cz.cas.lib.proarc.webapp.client.ds.WorkflowTaskDataSource; import cz.cas.lib.proarc.webapp.client.presenter.WorkflowManaging.WorkflowJobPlace; import cz.cas.lib.proarc.webapp.client.presenter.WorkflowManaging.WorkflowNewJobPlace; import cz.cas.lib.proarc.webapp.client.presenter.WorkflowManaging.WorkflowTaskPlace; import cz.cas.lib.proarc.webapp.client.widget.StatusView; import cz.cas.lib.proarc.webapp.client.widget.workflow.WorkflowJobFormView; import cz.cas.lib.proarc.webapp.client.widget.workflow.WorkflowJobView; /** * Edits jobs of the workflow. * * @author Jan Pokorsky */ public class WorkflowJobsEditor { private final ClientMessages i18n; private WorkflowJobView view; private final PlaceController places; public WorkflowJobsEditor(ClientMessages i18n, PlaceController places) { this.i18n = i18n; this.places = places; } public Canvas getUI() { if (view == null) { view = new WorkflowJobView(i18n); view.setHandler(this); } return view.getWidget(); } public void open(WorkflowJobPlace place) { if (view != null) { view.edit(place.getJobId()); } } public void onGotoTask(String taskId) { places.goTo(new WorkflowTaskPlace().setTaskId(taskId)); } public void onCreateNew() { places.goTo(new WorkflowNewJobPlace()); } public void onCreateNewTask(final WorkflowJobFormView jobFormView, Record taskDef) { DSRequest req = new DSRequest(); req.setWillHandleError(true); jobFormView.getTasks().addData(taskDef, new DSCallback() { @Override public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) { boolean statusOk = RestConfig.isStatusOk(dsResponse); if (statusOk) { StatusView.getInstance().show(i18n.SaveAction_Done_Msg()); // reload tasks to get the proper order of tasks jobFormView.refresh(); // } else if (RestConfig.isConcurrentModification(dsResponse)) { } else { ErrorHandler.warn(dsResponse, dsRequest); } } }, req); } public void onSave(WorkflowJobFormView jobFormView) { final DynamicForm vm = jobFormView.getJobValues(); if (vm.validate()) { view.setExpectUpdateOperation(true); DSRequest req = new DSRequest(); req.setWillHandleError(true); vm.saveData(new DSCallback() { @Override public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) { boolean statusOk = RestConfig.isStatusOk(dsResponse); if (statusOk) { StatusView.getInstance().show(i18n.SaveAction_Done_Msg()); view.refreshState(); // invalidate the task cache as it may contain an outdated job name DSResponse resetCache = new DSResponse(); resetCache.setInvalidateCache(true); resetCache.setOperationType(DSOperationType.UPDATE); WorkflowTaskDataSource.getInstance().updateCaches(resetCache); } else if (RestConfig.isConcurrentModification(dsResponse)) { SC.ask(i18n.SaveAction_ConcurrentErrorAskReload_Msg(), new BooleanCallback() { @Override public void execute(Boolean value) { if (value != null && value) { view.editSelection(); } } }); } else { ErrorHandler.warn(dsResponse, dsRequest); } vm.focus(); } }, req); } } }