/**
* Copyright (C) 2011 BonitaSoft S.A.
* BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble
* 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 2.0 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 org.bonitasoft.web.toolkit.client.ui.component.form;
import static org.bonitasoft.web.toolkit.client.common.i18n.AbstractI18n._;
import java.util.Date;
import java.util.Map;
import org.bonitasoft.web.toolkit.client.data.APIID;
import org.bonitasoft.web.toolkit.client.data.item.IItem;
import org.bonitasoft.web.toolkit.client.data.item.ItemDefinition;
import org.bonitasoft.web.toolkit.client.data.item.attribute.reader.AbstractAttributeReader;
import org.bonitasoft.web.toolkit.client.data.item.attribute.validator.Validator;
import org.bonitasoft.web.toolkit.client.ui.JsId;
import org.bonitasoft.web.toolkit.client.ui.action.form.AddItemFormAction;
import org.bonitasoft.web.toolkit.client.ui.action.form.UpdateItemFormAction;
import org.bonitasoft.web.toolkit.client.ui.component.form.entry.AutoCompleteEntry;
import org.bonitasoft.web.toolkit.client.ui.component.form.entry.Option;
import org.bonitasoft.web.toolkit.client.ui.component.form.entry.ValuedFormEntry;
import com.google.gwt.user.client.Element;
/**
* @author Julien Mege
*/
// FIXME this is not an AbstractForm since this object include his own form
// FIXME need to extend Form and then remove all reference to form class variable.
public class ItemForm<T extends IItem> extends AbstractForm {
private Form form = null;
private ItemDefinition itemDefinition = null;
private String itemId = null;
public ItemForm(final JsId jsid, final ItemDefinition itemDefinition) {
super(jsid);
this.itemDefinition = itemDefinition;
this.form = new Form(jsid);
}
public ItemForm(final JsId jsid, final ItemDefinition itemDefinition, final String itemId) {
super(jsid);
this.itemDefinition = itemDefinition;
if (itemId != null) {
this.setItemId(itemId);
this.form = new Form(jsid);
setFiller(new ItemFormFiller(this, itemId));
} else {
this.form = new Form(jsid);
}
}
public void setItemId(final String itemId) {
this.itemId = itemId;
}
private void initValidatorsAndModifiers(final JsId jsid, final String attributeName) {
final ValuedFormEntry entry = this.form.getEntry(jsid);
entry.addValidators(this.itemDefinition.getAttribute(attributeName).getValidators());
entry.addInputModifiers(this.itemDefinition.getAttribute(attributeName).getInputModifiers());
entry.addOutputModifiers(this.itemDefinition.getAttribute(attributeName).getOutputModifiers());
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ENTRIES
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ItemForm<T> addEntry(final String attributeName, final String label, final String tooltip) {
this.addEntry(attributeName, label, tooltip, null, null, null);
return this;
}
public ItemForm<T> addEntry(final String attributeName, final String label, final String tooltip, final String defaultValue) {
this.addEntry(attributeName, label, tooltip, defaultValue, null, null);
return this;
}
public ItemForm<T> addEntry(final String attributeName, final String label, final String tooltip, final String defaultValue, final String description) {
this.addEntry(attributeName, label, tooltip, defaultValue, description, null);
return this;
}
public ItemForm<T> addEntry(final String attributeName, final String label, final String tooltip, final String defaultValue, final String description,
final String example) {
this.form.addItemAttributeEntry(this.itemDefinition.getAttribute(attributeName), label, tooltip, defaultValue, description, example);
// Not needed already set in Form
// initValidatorsAndModifiers(this.jsid, attributeName);
return this;
}
public ItemForm<T> addEntry(final String attributeName, final String label, final String tooltip, final String defaultValue, final String description,
final String example, final Long maxLength) {
this.form.addItemAttributeEntry(this.itemDefinition.getAttribute(attributeName), label, tooltip, defaultValue, description, example, maxLength);
return this;
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// HIDDEN ENTRIES
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ItemForm<T> addHiddenEntry(final String attributeName, final String value) {
this.form.addHidden(attributeName, value);
return this;
}
public ItemForm<T> addHiddenEntry(final String attributeName, final APIID value) {
return this.addHiddenEntry(attributeName, value.toString());
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SELECT ENTRIES
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ItemForm<T> addEntryAsSelect(final String attributeName, final String label, final String tooltip, final String description) {
this.addEntryAsSelect(attributeName, label, tooltip, description, (Option[]) null);
return this;
}
public ItemForm<T> addEntryAsSelect(final String attributeName, final String label, final String tooltip, final Option... options) {
this.addEntryAsSelect(attributeName, label, tooltip, null, options);
return this;
}
public ItemForm<T> addEntryAsSelect(final String attributeName, final String label, final String tooltip, final String description, final Option... options) {
final JsId jsid = new JsId(attributeName);
this.form.addSelectEntry(jsid, label, tooltip, description, options);
initValidatorsAndModifiers(jsid, attributeName);
return this;
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AUTO COMPLETE ENTRIES
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ItemForm<T> addEntryAsAutoComplete(final String attributeName, final String label, final String tooltip, final ItemDefinition itemDefinition,
final String labelAttributeName, final String valueAttributeName) {
this.addEntryAsAutoComplete(attributeName, label, tooltip, itemDefinition, labelAttributeName, valueAttributeName, null);
return this;
}
public ItemForm<T> addEntryAsAutoComplete(final String attributeName, final String label, final String tooltip, final ItemDefinition itemDefinition,
final String labelAttributeName, final String valueAttributeName, final String description) {
final JsId jsid = new JsId(attributeName);
final AutoCompleteEntry autoComplete =
new AutoCompleteEntry(jsid, label, tooltip, itemDefinition, labelAttributeName, valueAttributeName, description);
this.form.addEntry(autoComplete);
initValidatorsAndModifiers(jsid, attributeName);
return this;
}
public ItemForm<T> addEntryAsAutoComplete(final String attributeName, final String label, final String tooltip, final ItemDefinition itemDefinition,
final AbstractAttributeReader labelTemplate, final String valueAttributeName) {
this.addEntryAsAutoComplete(attributeName, label, tooltip, itemDefinition, labelTemplate, valueAttributeName, null);
return this;
}
public ItemForm<T> addEntryAsAutoComplete(final String attributeName, final String label, final String tooltip, final ItemDefinition itemDefinition,
final AbstractAttributeReader labelTemplate, final String valueAttributeName, final String description) {
final JsId jsid = new JsId(attributeName);
final AutoCompleteEntry autoComplete =
new AutoCompleteEntry(jsid, label, tooltip, itemDefinition, labelTemplate, valueAttributeName, description);
this.form.addEntry(autoComplete);
initValidatorsAndModifiers(jsid, attributeName);
return this;
}
@Override
public void addEntry(final FormNode entry) {
form.addEntry(entry);
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// STATIC ENTRIES
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ItemForm<T> addEntryAsStatic(final String attributeName, final String label, final String tooltip) {
this.addEntryAsStatic(attributeName, label, tooltip, null, null, null);
return this;
}
public ItemForm<T> addEntryAsStatic(final String attributeName, final String label, final String tooltip, final String defaultValue) {
this.addEntryAsStatic(attributeName, label, tooltip, defaultValue, null, null);
return this;
}
public ItemForm<T> addEntryAsStatic(final String attributeName, final String label, final String tooltip, final String defaultValue,
final String description) {
this.addEntryAsStatic(attributeName, label, tooltip, defaultValue, description, null);
return this;
}
public ItemForm<T> addEntryAsStatic(final String attributeName, final String label, final String tooltip, final String defaultValue,
final String description, final String example) {
this.form.addItemAttributeStaticEntry(this.itemDefinition.getAttribute(attributeName), label, tooltip, defaultValue, description, example);
return this;
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DATEPICKER
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ItemForm<T> addEntryAsDatePicker(final String attributeName, final String label, final String tooltip, final Date startDate, final Date endDate) {
this.addEntryAsDatePicker(attributeName, label, tooltip, null, null, startDate, endDate);
return this;
}
public ItemForm<T> addEntryAsDatePicker(final String attributeName, final String label, final String tooltip, final String defaultValue,
final Date startDate, final Date endDate) {
this.addEntryAsDatePicker(attributeName, label, tooltip, defaultValue, null, null, startDate, endDate);
return this;
}
public ItemForm<T> addEntryAsDatePicker(final String attributeName, final String label, final String tooltip, final String defaultValue,
final String description, final Date startDate, final Date endDate) {
this.addEntryAsDatePicker(attributeName, label, tooltip, defaultValue, description, null, startDate, endDate);
return this;
}
public ItemForm<T> addEntryAsDatePicker(final String attributeName, final String label, final String tooltip, final String defaultValue,
final String description, final String example, final Date startDate, final Date endDate) {
final JsId jsid = new JsId(attributeName);
this.form.addDatePickerEntry(jsid, label, tooltip, defaultValue, description, example, startDate,
endDate);
initValidatorsAndModifiers(jsid, attributeName);
return this;
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// OUTPUT
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void buildActions() {
if (this.form.hasNonStaticEntry()) {
if (this.itemId == null) {
final AddItemFormAction<T> addAction = new AddItemFormAction<T>(this.itemDefinition);
addAction.setForm(this.form);
this.form.addButton(new JsId("addActionForm"), _("Add"), _("Create a new element"), addAction);
} else {
this.form.addHiddenEntry("id", this.itemId);
final UpdateItemFormAction<T> updateAction = new UpdateItemFormAction<T>(this.itemDefinition);
updateAction.setForm(this.form);
this.form.addButton(new JsId("updateActionForm"), _("Save"), _("Save this element"), updateAction);
}
this.form.addCancelButton();
}
}
@Override
protected Element makeElement() {
this.buildActions();
return this.form.getElement();
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RETRIEVE VALUES
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public String getEntryValue(final JsId jsid) {
return this.form.getEntryValue(jsid);
}
@Override
public String getEntryValue(final String jsid) {
return this.form.getEntryValue(jsid);
}
@Override
public void setEntryValue(final String name, final String value) {
this.form.setEntryValue(name, value);
}
@Override
public ValuedFormEntry getEntry(final JsId jsid) {
return this.form.getEntry(jsid);
}
@Override
public void setValues(final Map<String, String> values) {
this.form.setValues(values);
}
/**
* @return the itemDefinition
*/
public ItemDefinition getItemDefinition() {
return this.itemDefinition;
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// UTILS
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setJson(final String json) {
this.form.setJson(json);
}
@Override
public boolean hasNonStaticEntry() {
return this.form.hasNonStaticEntry();
}
@Override
public String toJson() {
return this.form.toJson();
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VALIDATORS
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public ItemForm addValidator(final JsId entryJsId, final Validator validator) {
return (ItemForm) super.addValidator(entryJsId, validator);
}
@Override
public ItemForm addValidator(final String entryJsId, final Validator validator) {
return (ItemForm) super.addValidator(entryJsId, validator);
}
}