package pl.net.bluesoft.rnd.pt.ext.usersubstitution.widget; import com.vaadin.data.Property; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.data.util.MethodProperty; import com.vaadin.ui.*; import org.aperteworkflow.util.liferay.LiferayBridge; import pl.net.bluesoft.rnd.processtool.model.BpmTask; import pl.net.bluesoft.rnd.processtool.model.ProcessInstance; import pl.net.bluesoft.rnd.processtool.model.UserData; import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolDataWidget; import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolVaadinRenderable; import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolWidget; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AliasName; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AutoWiredProperty; import pl.net.bluesoft.rnd.processtool.ui.widgets.impl.BaseProcessToolWidget; import pl.net.bluesoft.util.lang.Formats; import pl.net.bluesoft.util.lang.Maps; import pl.net.bluesoft.util.lang.Strings; import java.util.*; /** * User: POlszewski * Date: 2011-09-02 * Time: 14:07:11 */ @AliasName(name = "UserSubstitutionRequest") public class UserSubstitutionRequestWidget extends BaseProcessToolWidget implements ProcessToolVaadinRenderable, ProcessToolDataWidget { private static final String USER_SUBSTITUTE_LOGIN = "userSubstitute"; private static final String DATE_FROM = "dateFrom"; private static final String DATE_TO = "dateTo"; @AutoWiredProperty private boolean requestMode = true; private Map<String, UserData> usersMap; private UserData user; private UserData userSubstitute = null; private Date dateFrom; private Date dateTo; @Override public void loadData(BpmTask task) { ProcessInstance pi = task.getProcessInstance(); user = pi.getCreator(); String userSubstituteLogin = pi.getSimpleAttributeValue(USER_SUBSTITUTE_LOGIN, null); dateFrom = parseShortDate(pi.getSimpleAttributeValue(DATE_FROM, null)); dateTo = parseShortDate(pi.getSimpleAttributeValue(DATE_TO, null)); usersMap = Maps.collectionToMap(LiferayBridge.getAllUsersByCurrentUser(pi.getCreator()), "login"); usersMap.remove(user.getLogin()); if (Strings.hasText(userSubstituteLogin)) { userSubstitute = usersMap.get(userSubstituteLogin); } } @Override public void saveData(BpmTask task) { ProcessInstance pi = task.getProcessInstance(); pi.setSimpleAttribute(USER_SUBSTITUTE_LOGIN, userSubstitute.getLogin()); pi.setSimpleAttribute(DATE_FROM, formatShortDate(dateFrom)); pi.setSimpleAttribute(DATE_TO, formatShortDate(dateTo)); // if (user.getSuperior() != null && user.getSuperior().length() > 0) { // processInstance.setSimpleAttribute("superior", user.getSuperior()); // } // else { // processInstance.setSimpleAttribute("superior", user.getLogin()); // } } @Override public Collection<String> validateData(BpmTask task, boolean skipRequired) { List<String> errors = new ArrayList<String>(); if (userSubstitute == null) { errors.add(getMessage("usersubstitution.user.required")); } if (dateFrom == null) { errors.add(getMessage("usersubstitution.date.from.required")); } if (dateTo == null) { errors.add(getMessage("usersubstitution.date.to.required")); } if (requestMode && dateFrom != null && dateFrom.before(parseShortDate(formatShortDate(new Date())))) { errors.add(getMessage("usersubstitution.date.from.can.not.be.in.the.past")); } if (dateFrom != null && dateTo != null && !(dateFrom.equals(dateTo) || dateFrom.before(dateTo))) { errors.add(getMessage("usersubstitution.date.from.must.not.be.later.than.date.to")); } return errors; } @Override public Component render() { boolean readonly = !hasPermission("EDIT"); FormLayout fl = new FormLayout(); fl.addComponent(createLabel(getMessage("usersubstitution.substituted.user"), user.getRealName())); if (!readonly) { fl.addComponent(createUserSelectionBox()); } else { fl.addComponent(createLabel( getMessage("usersubstitution.substituting.user"), userSubstitute != null ? userSubstitute.getRealName() : null )); } fl.addComponent(createDateField(getMessage("usersubstitution.date.from"), "dateFrom", readonly)); fl.addComponent(createDateField(getMessage("usersubstitution.date.to"), "dateTo", readonly)); return fl; } private Label createLabel(String caption, Object value) { Label label = new Label(); label.setCaption(caption); label.setValue(value); return label; } private PopupDateField createDateField(String caption, String boundProperty, boolean readonly) { PopupDateField dateField = new PopupDateField(caption); dateField.setDateFormat("yyyy-MM-dd"); dateField.setResolution(PopupDateField.RESOLUTION_DAY); dateField.setRequired(true); // dateField.setImmediate(true); dateField.setPropertyDataSource(new MethodProperty<Date>(this, boundProperty)); dateField.setReadOnly(readonly); return dateField; } private ComboBox createUserSelectionBox() { final ComboBox userBox = new ComboBox(getMessage("usersubstitution.substituting.user")); userBox.setItemCaptionPropertyId("filteredName"); userBox.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); userBox.setFilteringMode(AbstractSelect.Filtering.FILTERINGMODE_CONTAINS); userBox.setRequired(true); userBox.setImmediate(true); userBox.setNewItemsAllowed(false); BeanItemContainer<UserData> usersBIC = new BeanItemContainer<UserData>(UserData.class); usersBIC.addAll(usersMap.values()); usersBIC.sort(new Object[] {"realName"}, new boolean[] {true}); userBox.setContainerDataSource(usersBIC); userBox.setValue(userSubstitute); userBox.addListener(new Property.ValueChangeListener() { public void valueChange(Property.ValueChangeEvent event) { userSubstitute = (UserData) userBox.getValue(); } }); return userBox; } @Override public void addChild(ProcessToolWidget child) { throw new IllegalArgumentException("Not supported!"); } private static String formatShortDate(Date date) { return date != null ? Formats.formatShortDate(date) : null; } private static Date parseShortDate(String date) { return date != null ? Formats.parseShortDate(date) : null; } public Date getDateFrom() { return dateFrom; } public void setDateFrom(Date dateFrom) { this.dateFrom = dateFrom; } public Date getDateTo() { return dateTo; } public void setDateTo(Date dateTo) { this.dateTo = dateTo; } public boolean isRequestMode() { return requestMode; } public void setRequestMode(boolean requestMode) { this.requestMode = requestMode; } }