diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java b/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java
index d9f2e5f17..16ebd4fa7 100644
--- a/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java
+++ b/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java
@@ -313,4 +313,8 @@ public class User extends BaseEntity implements IHumanIdentifiable{
this.worker = worker;
}
+ public String getFullName() {
+ return firstName + " " + lastName;
+ }
+
}
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxSearch.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxSearch.java
index 6fba17456..b444ca749 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxSearch.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxSearch.java
@@ -165,6 +165,7 @@ public class BandboxSearch extends HtmlMacroComponent {
final Object object = getSelectedItem().getValue();
bandbox.setValue(finder.objectToString(object));
setSelectedElement(object);
+ Util.getBinder(this).saveAttribute(this, "selectedElement");
}
private void clearSelectedElement() {
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/UserBandboxFinder.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/UserBandboxFinder.java
new file mode 100644
index 000000000..ecc165f7d
--- /dev/null
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/UserBandboxFinder.java
@@ -0,0 +1,108 @@
+/*
+ * This file is part of LibrePlan
+ *
+ * Copyright (C) 2012 Igalia, S.L.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package org.libreplan.web.common.components.finders;
+
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.libreplan.business.users.daos.IUserDAO;
+import org.libreplan.business.users.entities.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+import org.zkoss.lang.Strings;
+import org.zkoss.zul.Bandbox;
+import org.zkoss.zul.Listcell;
+import org.zkoss.zul.Listitem;
+import org.zkoss.zul.ListitemRenderer;
+
+/**
+ * This is a finder for {@link User}s in a {@link Bandbox}
+ *
+ * @author Manuel Rego Casasnovas
+ */
+@Repository
+public class UserBandboxFinder extends BandboxFinder implements IBandboxFinder {
+
+ @Autowired
+ private IUserDAO userDAO;
+
+ private final String headers[] = { _("Login name"), _("Full name") };
+
+ /**
+ * Forces to mark the string as needing translation
+ */
+ private static String _(String string) {
+ return string;
+ }
+
+ @Override
+ @Transactional(readOnly = true)
+ public List getAll() {
+ return userDAO.list(User.class);
+ }
+
+ @Override
+ public boolean entryMatchesText(Object obj, String text) {
+ final User user = (User) obj;
+ text = StringUtils.trim(text.toLowerCase());
+ return checkContainsText(user.getLoginName(), text)
+ || checkContainsText(user.getFirstName(), text)
+ || checkContainsText(user.getLastName(), text);
+ }
+
+ private boolean checkContainsText(String original, String text) {
+ return original.toLowerCase().contains(text);
+ }
+
+ @Override
+ public String objectToString(Object obj) {
+ User user = (User) obj;
+
+ String fullName = user.getFullName();
+ if (Strings.isBlank(fullName)) {
+ return user.getLoginName();
+ }
+
+ return user.getLoginName() + " (" + fullName + ")";
+ }
+
+ @Override
+ public String[] getHeaders() {
+ return headers.clone();
+ }
+
+ @Override
+ public ListitemRenderer getItemRenderer() {
+ return usersRenderer;
+ }
+
+ private final ListitemRenderer usersRenderer = new ListitemRenderer() {
+ @Override
+ public void render(Listitem item, Object data) {
+ User user = (User) data;
+
+ item.setValue(data);
+
+ item.appendChild(new Listcell(user.getLoginName()));
+ item.appendChild(new Listcell(user.getFullName()));
+ }
+ };
+}
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java
index 59a0ec3a2..8d27d58c1 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java
@@ -49,6 +49,7 @@ import org.libreplan.web.common.MessagesForUser;
import org.libreplan.web.common.OnlyOneVisible;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.components.bandboxsearch.BandboxMultipleSearch;
+import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
import org.libreplan.web.common.components.finders.FilterPair;
import org.libreplan.web.common.entrypoints.EntryPointsHandler;
import org.libreplan.web.common.entrypoints.IURLHandlerRegistry;
@@ -74,7 +75,6 @@ import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
-import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
@@ -158,7 +158,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements
private Radiogroup userBindingRadiogroup;
- private Listbox userListbox;
+ private BandboxSearch userBandbox;
private Textbox loginNameTextbox;
@@ -278,7 +278,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements
if (UserBindingOption.EXISTING_USER.ordinal() == option) {
if (getWorker().getUser() == null) {
- throw new WrongValueException(userListbox,
+ throw new WrongValueException(userBandbox,
_("please select a user to bound"));
}
getWorker().updateUserData();
@@ -467,7 +467,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements
userBindingRadiogroup = (Radiogroup) editWindow
.getFellowIfAny("userBindingRadiogroup");
initUserBindingOptions();
- userListbox = (Listbox) editWindow.getFellowIfAny("userListbox");
+ userBandbox = (BandboxSearch) editWindow.getFellowIfAny("userBandbox");
loginNameTextbox = (Textbox) editWindow.getFellowIfAny("loginName");
passwordTextbox = (Textbox) editWindow.getFellowIfAny("password");
passwordConfirmationTextbox = (Textbox) editWindow
@@ -1050,25 +1050,8 @@ public class WorkerCRUDController extends GenericForwardComposer implements
updateUserBindingComponents();
}
- public ListitemRenderer getUsersRenderer() {
- return new ListitemRenderer() {
-
- @Override
- public void render(Listitem item, Object data) throws Exception {
- User user = (User) data;
-
- item.setLabel(user.getLoginName());
- item.setValue(user);
- }
- };
- }
-
public boolean isUserSelected() {
- if (userListbox.getSelectedItem() == null
- || userListbox.getSelectedItem().getValue() == null) {
- return false;
- }
- return true;
+ return userBandbox.getSelectedElement() != null;
}
public String getLoginName() {
diff --git a/libreplan-webapp/src/main/webapp/resources/worker/_edition.zul b/libreplan-webapp/src/main/webapp/resources/worker/_edition.zul
index 363ad1b1b..ca5a57953 100644
--- a/libreplan-webapp/src/main/webapp/resources/worker/_edition.zul
+++ b/libreplan-webapp/src/main/webapp/resources/worker/_edition.zul
@@ -112,14 +112,9 @@
-
-
-
-
-
+ selectedElement="@{controller.boundUser, access='both'}" />