/* * 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.Record; import com.smartgwt.client.data.ResultSet; import com.smartgwt.client.types.ReadOnlyDisplayAppearance; import com.smartgwt.client.types.TitleOrientation; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.FormItemValueFormatter; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.SelectItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.form.fields.events.DataArrivedEvent; import com.smartgwt.client.widgets.form.fields.events.DataArrivedHandler; import com.smartgwt.client.widgets.grid.HoverCustomizer; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.toolbar.ToolStrip; import cz.cas.lib.proarc.webapp.client.ClientMessages; import cz.cas.lib.proarc.webapp.client.ClientUtils; import cz.cas.lib.proarc.webapp.client.Editor; import cz.cas.lib.proarc.webapp.client.action.AbstractAction; import cz.cas.lib.proarc.webapp.client.action.Action; import cz.cas.lib.proarc.webapp.client.action.ActionEvent; import cz.cas.lib.proarc.webapp.client.action.Actions; import cz.cas.lib.proarc.webapp.client.ds.WorkflowProfileDataSource; import cz.cas.lib.proarc.webapp.client.presenter.WorkflowNewJobEditor; import cz.cas.lib.proarc.webapp.client.widget.CatalogBrowser; import cz.cas.lib.proarc.webapp.shared.rest.WorkflowResourceApi; /** * * @author Jan Pokorsky */ public class WorkflowNewJobView { private final ClientMessages i18n; private DynamicForm optionForm; private CatalogBrowser catalogBrowser; private final Canvas widget; private WorkflowNewJobEditor handler; public WorkflowNewJobView(ClientMessages i18n) { this.i18n = i18n; this.widget = createMainLayout(); } public Canvas getWidget() { return widget; } public DynamicForm getOptions() { return optionForm; } public void init() { optionForm.clearValues(); optionForm.getField(WorkflowResourceApi.NEWJOB_METADATA).setVisible(false); catalogBrowser.bind(); } public void setHandler(WorkflowNewJobEditor handler) { this.handler = handler; } private Canvas createMainLayout() { VLayout main = new VLayout(); main.addMember(createPanelLabel()); main.addMember(createToolbar()); main.addMember(createOptionForm()); main.addMember(createCatalogBrowser()); return main; } private Label createPanelLabel() { Label lblHeader = new Label(); String title = ClientUtils.format("<b>%s</b>", i18n.WorkflowJob_NewJobView_Title()); lblHeader.setContents(title); lblHeader.setAutoHeight(); lblHeader.setPadding(4); lblHeader.setStyleName(Editor.CSS_PANEL_DESCRIPTION_TITLE); return lblHeader; } private ToolStrip createToolbar() { Action actionNew = new AbstractAction( i18n.WorkflowJob_NewJobView_NewAction_Title(), "[SKIN]/actions/save.png", i18n.WorkflowJob_NewJobView_NewAction_Hint()) { @Override public void performAction(ActionEvent event) { fireOnCreateNew(); } }; ToolStrip toolbar = Actions.createToolStrip(); toolbar.addMember(Actions.asIconButton(actionNew, this)); return toolbar; } private void fireOnCreateNew() { if (handler != null) { String mods = catalogBrowser.getMods(); optionForm.setValue(WorkflowResourceApi.NEWJOB_METADATA, mods); optionForm.getField(WorkflowResourceApi.NEWJOB_METADATA).setVisible(mods == null); optionForm.setValue(WorkflowResourceApi.NEWJOB_CATALOGID, catalogBrowser.getCatalogId()); boolean valid = optionForm.validate(); if (valid) { handler.onCreateNew(optionForm.getValuesAsRecord()); } } } private Widget createOptionForm() { final SelectItem profile = createProfileSelector(); TextItem metadata = new TextItem(WorkflowResourceApi.NEWJOB_METADATA, "Metadata"); metadata.setRequired(true); metadata.setShowTitle(false); metadata.setCanEdit(false); metadata.setStartRow(true); metadata.setReadOnlyDisplay(ReadOnlyDisplayAppearance.STATIC); metadata.setRequiredMessage(i18n.WorkflowJob_NewJobView_Err_NoMetadata_Msg()); // show empty value instead of XML metadata.setEditorValueFormatter(new FormItemValueFormatter() { @Override public String formatValue(Object value, Record record, DynamicForm form, FormItem item) { return ""; } }); // HiddenItem catalog = new HiddenItem(WorkflowResourceApi.NEWJOB_CATALOGID); // catalog.setRequired(true); // catalog.setRequiredMessage("Nejsou vybrána žádná metadata!"); optionForm = new DynamicForm(); optionForm.setAutoWidth(); optionForm.setWrapItemTitles(false); optionForm.setTitleOrientation(TitleOrientation.TOP); optionForm.setItems(profile, metadata); // XXX HiddenValidationErrorsHandler does not work in smartgwt 4.0 // optionForm.addHiddenValidationErrorsHandler(new HiddenValidationErrorsHandler() { // // @Override // public void onHiddenValidationErrors(HiddenValidationErrorsEvent event) { // event.cancel(); // String[] profileErrors = optionForm.getFieldErrors(profile.getName()); // ArrayList<String> result = new ArrayList<String>(); // result.addAll(Arrays.asList(profileErrors)); // Map<?,?> errors = event.getErrors(); // for (Entry<? extends Object, ? extends Object> entrySet : errors.entrySet()) { // StringBuilder sb = new StringBuilder(); // Object key = entrySet.getKey(); // Object value = entrySet.getValue(); // result.add(String.valueOf(key) + " - " + String.valueOf(value)); // } // System.out.println("## onHiddenValidationErrors. origErr: " + profileErrors + // "\n event.err: " + errors + "\n result: " + result); // optionForm.setFieldErrors(profile.getName(), result.toArray(new String[result.size()]), true); // } // }); return optionForm; } private SelectItem createProfileSelector() { final SelectItem profile = new SelectItem(WorkflowResourceApi.NEWJOB_PROFILE, i18n.WorkflowJob_NewJobView_Field_Profile_Title()); profile.setOptionDataSource(WorkflowProfileDataSource.getInstance()); profile.setValueField(WorkflowProfileDataSource.FIELD_ID); profile.setDisplayField(WorkflowProfileDataSource.FIELD_LABEL); profile.setOptionCriteria(new Criteria(WorkflowProfileDataSource.FIELD_DISABLED, Boolean.FALSE.toString())); profile.setFilterLocally(true); profile.setRequired(true); profile.setWidth(300); profile.setAllowEmptyValue(true); ListGrid profilePickListProperties = new ListGrid(); profilePickListProperties.setCanHover(true); profilePickListProperties.setShowHover(true); profilePickListProperties.setHoverWidth(300); profilePickListProperties.setHoverCustomizer(new HoverCustomizer() { @Override public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) { String hint = record.getAttribute(WorkflowProfileDataSource.FIELD_HINT); return hint; } }); profile.setPickListProperties(profilePickListProperties); profile.addDataArrivedHandler(new DataArrivedHandler() { @Override public void onDataArrived(DataArrivedEvent event) { if (event.getStartRow() == 0) { ResultSet data = event.getData(); int length = data.getLength(); if (length == 1) { Record r = data.get(0); String profileId = r.getAttribute(WorkflowProfileDataSource.FIELD_ID); profile.setValue(profileId); profile.setDefaultValue(profileId); } } } }); return profile; } private Widget createCatalogBrowser() { catalogBrowser = new CatalogBrowser(i18n); return catalogBrowser.getUI(); } }