/* * 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.widget.workflow; import com.google.gwt.user.client.ui.Widget; import com.smartgwt.client.data.Criteria; 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.types.ExpansionMode; import com.smartgwt.client.types.SelectionStyle; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.events.DrawEvent; import com.smartgwt.client.widgets.events.DrawHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.events.SubmitValuesEvent; import com.smartgwt.client.widgets.form.events.SubmitValuesHandler; import com.smartgwt.client.widgets.form.fields.AutoFitTextAreaItem; import com.smartgwt.client.widgets.form.fields.SubmitItem; import com.smartgwt.client.widgets.form.fields.TextAreaItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import cz.cas.lib.proarc.common.workflow.model.MaterialType; import cz.cas.lib.proarc.common.workflow.model.WorkflowModelConsts; import cz.cas.lib.proarc.webapp.client.ClientMessages; import cz.cas.lib.proarc.webapp.client.ds.RestConfig; import cz.cas.lib.proarc.webapp.client.ds.WorkflowJobDataSource; import cz.cas.lib.proarc.webapp.client.ds.WorkflowMaterialDataSource; import cz.cas.lib.proarc.webapp.client.ds.WorkflowTaskDataSource; import cz.cas.lib.proarc.webapp.client.widget.ListGridPersistance; /** * * @author Jan Pokorsky */ public class WorkflowMaterialView { private final ClientMessages i18n; private ListGrid materialGrid; private final Widget widget; private final boolean jobMaterial; public WorkflowMaterialView(ClientMessages i18n) { this(i18n, false); } public WorkflowMaterialView(ClientMessages i18n, boolean jobMaterial) { this.i18n = i18n; this.jobMaterial = jobMaterial; widget = createMaterialList(); } public Widget getWidget() { return widget; } public void setEmptyMaterials() { materialGrid.setData(new Record[0]); } public void setTaskMaterials(String taskId) { setMaterials(new Criteria(WorkflowModelConsts.MATERIALFILTER_TASKID, taskId)); } public void setJobMaterials(String jobId) { setMaterials(new Criteria(WorkflowModelConsts.MATERIALFILTER_JOBID, jobId)); } private void setMaterials(Criteria c) { materialGrid.invalidateCache(); materialGrid.fetchData(c); } private Widget createMaterialList() { materialGrid = new ListGrid() { @Override protected Canvas getExpansionComponent(final ListGridRecord record) { String type = record.getAttribute(WorkflowMaterialDataSource.FIELD_TYPE); DynamicForm form = null; if (MaterialType.FOLDER.name().equals(type)) { form = createFolderForm(); } else if (MaterialType.PHYSICAL_DOCUMENT.name().equals(type)) { form = createPhysicalDocumentForm(); } else if (MaterialType.DIGITAL_OBJECT.name().equals(type)) { form = createDigitalDocumentForm(); } if (form != null) { return bindExpansinonForm(form, record); } else { return super.getExpansionComponent(record); } } }; materialGrid.setSelectionType(SelectionStyle.SINGLE); materialGrid.setExpansionMode(ExpansionMode.DETAIL_FIELD); materialGrid.setCanExpandRecords(true); materialGrid.setCanExpandMultipleRecords(false); materialGrid.setAutoSaveEdits(false); materialGrid.setCanSort(false); materialGrid.setCanGroupBy(false); materialGrid.setWrapCells(true); materialGrid.setDataSource(WorkflowMaterialDataSource.getInstance(), new ListGridField(WorkflowMaterialDataSource.FIELD_PROFILENAME), new ListGridField(WorkflowMaterialDataSource.FIELD_VALUE), new ListGridField(WorkflowMaterialDataSource.FIELD_WAY), new ListGridField(WorkflowMaterialDataSource.FIELD_NOTE), new ListGridField(WorkflowMaterialDataSource.FIELD_ID) ); materialGrid.getField(WorkflowMaterialDataSource.FIELD_WAY).setHidden(jobMaterial); String dbPrefix = jobMaterial ? "WorkflowJobFormView.WorkflowMaterialView" : "WorkflowTaskFormView.WorkflowMaterialView"; ListGridPersistance listGridPersistance = new ListGridPersistance( dbPrefix, materialGrid); materialGrid.setViewState(listGridPersistance.getViewState()); return materialGrid; } private DynamicForm bindExpansinonForm(final DynamicForm form, final Record record) { form.addDrawHandler(new DrawHandler() { @Override public void onDraw(DrawEvent event) { form.editRecord(record); } }); return form; } private DynamicForm createExpansionForm() { DynamicForm form = new DynamicForm(); form.setDataSource(WorkflowMaterialDataSource.getInstance()); form.addSubmitValuesHandler(new SubmitValuesHandler() { @Override public void onSubmitValues(SubmitValuesEvent event) { save(event.getForm()); } }); return form; } private void save(DynamicForm form) { final String type = form.getValueAsString(WorkflowMaterialDataSource.FIELD_TYPE); form.saveData(new DSCallback() { @Override public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) { if (RestConfig.isStatusOk(dsResponse)) { if (MaterialType.PHYSICAL_DOCUMENT.name().equals(type)) { // the name of job might be changed, refresh the job and task DSResponse resetCache = new DSResponse(); resetCache.setInvalidateCache(true); resetCache.setOperationType(DSOperationType.UPDATE); WorkflowTaskDataSource.getInstance().updateCaches(resetCache); WorkflowJobDataSource.getInstance().updateCaches(resetCache); } } } }); } private DynamicForm createFolderForm() { DynamicForm form = createExpansionForm(); TextItem path = new TextItem(WorkflowMaterialDataSource.FIELD_FOLDER_PATH); path.setWidth("*"); form.setDataSource(WorkflowMaterialDataSource.getInstance(), path, createNoteItem(), createSaveItem()); return form; } private DynamicForm createPhysicalDocumentForm() { DynamicForm form = createExpansionForm(); TextAreaItem xml = new TextAreaItem(WorkflowMaterialDataSource.FIELD_PHYSICAL_METADATA); xml.setWidth("*"); form.setDataSource(WorkflowMaterialDataSource.getInstance(), new TextItem(WorkflowMaterialDataSource.FIELD_PHYSICAL_CATALOG), new TextItem(WorkflowMaterialDataSource.FIELD_PHYSICAL_BARCODE), new TextItem(WorkflowMaterialDataSource.FIELD_PHYSICAL_FIELD001), new TextItem(WorkflowMaterialDataSource.FIELD_PHYSICAL_SIGNATURE), new TextItem(WorkflowMaterialDataSource.FIELD_PHYSICAL_RDCZID), createNoteItem(), xml, createSaveItem()); return form; } private DynamicForm createDigitalDocumentForm() { DynamicForm form = createExpansionForm(); TextItem pid = new TextItem(WorkflowMaterialDataSource.FIELD_DIGITAL_PID); pid.setWidth("*"); form.setDataSource(WorkflowMaterialDataSource.getInstance(), pid, createNoteItem(), createSaveItem()); return form; } private SubmitItem createSaveItem() { SubmitItem submit = new SubmitItem(); submit.setTitle(i18n.SaveAction_Title()); submit.setStartRow(true); submit.setEndRow(false); return submit; } private AutoFitTextAreaItem createNoteItem() { AutoFitTextAreaItem note = new AutoFitTextAreaItem(WorkflowMaterialDataSource.FIELD_NOTE); note.setStartRow(true); note.setColSpan("*"); note.setWidth("*"); return note; } }