///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition 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; version 3 of the License. // // This community edition 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.projectforge.web.fibu; import java.util.List; import java.util.Locale; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.convert.IConverter; import org.projectforge.common.RecentQueue; import org.projectforge.core.BaseSearchFilter; import org.projectforge.fibu.EmployeeDO; import org.projectforge.fibu.EmployeeDao; import org.projectforge.fibu.KostFormatter; import org.projectforge.user.PFUserDO; import org.projectforge.user.UserGroupCache; import org.projectforge.web.user.UserPreferencesHelper; import org.projectforge.web.wicket.AbstractSelectPanel; import org.projectforge.web.wicket.WicketUtils; import org.projectforge.web.wicket.autocompletion.PFAutoCompleteTextField; /** * This panel shows the actual employee and buttons for select/unselect employee. * @author Kai Reinhard (k.reinhard@micromata.de) * */ public class EmployeeSelectPanel extends AbstractSelectPanel<EmployeeDO> { private static final long serialVersionUID = -9161889503240264619L; private static final String USER_PREF_KEY_RECENT_EMPLOYEES = "EmployeeSelectPanel:recentEmployees"; @SpringBean(name = "employeeDao") private EmployeeDao employeeDao; @SpringBean(name = "userGroupCache") private UserGroupCache userGroupCache; private RecentQueue<String> recentEmployees; private PFAutoCompleteTextField<EmployeeDO> employeeTextField; // Only used for detecting changes: private EmployeeDO currentEmployee; /** * Label is assumed as "fibu.employee" translation. * @param id * @param model * @param caller * @param selectProperty */ public EmployeeSelectPanel(final String id, final IModel<EmployeeDO> model, final ISelectCallerPage caller, final String selectProperty) { this(id, model, null, caller, selectProperty); } /** * @param id * @param model * @param label Only needed for validation messages (feed back). * @param caller * @param selectProperty */ @SuppressWarnings("serial") public EmployeeSelectPanel(final String id, final IModel<EmployeeDO> model, final String label, final ISelectCallerPage caller, final String selectProperty) { super(id, model, caller, selectProperty); employeeTextField = new PFAutoCompleteTextField<EmployeeDO>("employeeField", getModel()) { @Override protected List<EmployeeDO> getChoices(final String input) { final BaseSearchFilter filter = new BaseSearchFilter(); filter.setSearchFields("user.username", "user.firstname", "user.lastname"); filter.setSearchString(input); final List<EmployeeDO> list = employeeDao.getList(filter); return list; } @Override protected List<String> getRecentUserInputs() { return getRecentEmployees().getRecents(); } @Override protected String formatLabel(final EmployeeDO employee) { if (employee == null) { return ""; } return formatEmployee(employee); } @Override protected String formatValue(final EmployeeDO employee) { if (employee == null || employee.getUser() == null) { return ""; } return employee.getUser().getUsername() + ": " + employee.getUser().getFullname(); } @Override protected String getTooltip() { final EmployeeDO employee = getModel().getObject(); if (employee == null) { return null; } return KostFormatter.format(employee.getKost1()) + ": " + employee.getUser().getFullname(); } @Override protected void convertInput() { final EmployeeDO employee = (EmployeeDO) getConverter(getType()).convertToObject(getInput(), getLocale()); setConvertedInput(employee); if (employee != null && (currentEmployee == null || employee.getId() != currentEmployee.getId())) { getRecentEmployees().append(formatEmployee(employee)); } currentEmployee = employee; } @SuppressWarnings({ "rawtypes", "unchecked"}) @Override public IConverter getConverter(final Class type) { return new IConverter() { @Override public Object convertToObject(final String value, final Locale locale) { if (StringUtils.isEmpty(value) == true) { getModel().setObject(null); return null; } final int ind = value.indexOf(": "); final String username = ind >= 0 ? value.substring(0, ind) : value; final PFUserDO user = userGroupCache.getUser(username); if (user == null) { error(getString("fibu.employee.panel.error.employeeNotFound")); return null; } final EmployeeDO employee = employeeDao.getByUserId(user.getId()); if (employee == null) { error(getString("fibu.employee.panel.error.employeeNotFound")); return null; } getModel().setObject(employee); return employee; } @Override public String convertToString(final Object value, final Locale locale) { if (value == null) { return ""; } final EmployeeDO employee = (EmployeeDO) value; return employee.getUser().getUsername() + ": " + employee.getUser().getFullname(); } }; } }; currentEmployee = getModelObject(); employeeTextField.enableTooltips().withLabelValue(true).withMatchContains(true).withMinChars(2).withAutoSubmit(false).withWidth(400); employeeTextField.setLabel(new Model<String>() { @Override public String getObject() { if (label != null) { return label; } else { return getString("fibu.employee"); } } }); add(employeeTextField); } /** * @see org.projectforge.web.wicket.AbstractSelectPanel#setFocus() */ @Override public EmployeeSelectPanel setFocus() { employeeTextField.add(WicketUtils.setFocus()); return this; } @Override public EmployeeSelectPanel init() { super.init(); return this; } /** * @see org.projectforge.web.wicket.AbstractSelectPanel#getClassModifierComponent() */ @Override public Component getClassModifierComponent() { return employeeTextField; } public EmployeeSelectPanel withAutoSubmit(final boolean autoSubmit) { employeeTextField.withAutoSubmit(autoSubmit); return this; } @Override protected void convertInput() { setConvertedInput(getModelObject()); } @SuppressWarnings("unchecked") private RecentQueue<String> getRecentEmployees() { if (this.recentEmployees == null) { this.recentEmployees = (RecentQueue<String>) UserPreferencesHelper.getEntry(USER_PREF_KEY_RECENT_EMPLOYEES); } if (this.recentEmployees == null) { this.recentEmployees = new RecentQueue<String>(); UserPreferencesHelper.putEntry(USER_PREF_KEY_RECENT_EMPLOYEES, this.recentEmployees, true); } return this.recentEmployees; } private String formatEmployee(final EmployeeDO employee) { if (employee == null) { return ""; } return employee.getUser().getUsername() + " (" + employee.getUser().getFullname() + ": " + KostFormatter.format(employee.getKost1()) + ")"; } }