From 1e9efa0359e0f4da220bc0c82a89333267140742 Mon Sep 17 00:00:00 2001
From: anto-gom <anto-gom@dsv.su.se>
Date: Fri, 2 Mar 2012 09:15:23 +0100
Subject: [PATCH] Created a panel for manually suggesting a reviewer for a
 project idea.

---
 .../admin/panels/ManualSetReviewerPanel.html  |  19 ++
 .../admin/panels/ManualSetReviewerPanel.java  | 185 ++++++++++++++++++
 .../panels/match/ProjectIdeaActionPanel.html  |   3 +
 3 files changed, 207 insertions(+)
 create mode 100644 src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.html
 create mode 100644 src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java

diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.html b/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.html
new file mode 100644
index 0000000000..bd79b72bab
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<body>
+	<wicket:panel>
+		<div wicket:id="main"></div>
+		<wicket:fragment wicket:id="buttonFragment">
+			<button wicket:id="manualMatchButton">Match manually</button>
+   		</wicket:fragment>
+		<wicket:fragment wicket:id="matchFragment">
+  			<form wicket:id="matchForm">
+  				Supervisor: <div wicket:id="supervisorTextField"></div>
+  				<button type="submit" style="float: right;">Save</button>
+  				<button wicket:id="cancelButton" style="float: right;">Cancel</button>
+  			</form>
+ 		</wicket:fragment>
+	</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java
new file mode 100644
index 0000000000..50058b143c
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java
@@ -0,0 +1,185 @@
+package se.su.dsv.scipro.admin.panels;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
+import org.apache.wicket.markup.html.form.ChoiceRenderer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.wicket.util.string.Strings;
+import org.odlabs.wiquery.ui.autocomplete.AutocompleteComponent;
+import se.su.dsv.scipro.data.dataobjects.Employee;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
+import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
+import se.su.dsv.scipro.match.dataobject.ProjectIdea;
+
+import java.util.List;
+
+public class ManualSetReviewerPanel extends Panel {
+
+    private static final long serialVersionUID = 1L;
+
+//	@SpringBean
+//	private MatchDao matchDao;
+
+    @SpringBean
+    private ProjectIdeaDao projectIdeaDao;
+
+    @SpringBean
+    SupervisorDao supervisorDao;
+
+//	@SpringBean
+//	UserDao	userDao;
+
+    private Fragment currentFragment;
+    private Fragment alternateFragment;
+    private Form<Employee> reviewerForm;
+    private AutocompleteComponent<Employee> autocompleteReviewerField;
+    private Long reviewerId;
+    public ManualSetReviewerPanel(String id, IModel<ProjectIdea> projectIdeaModel) {
+        super(id);
+        reviewerId = projectIdeaModel.getObject().getSuggestedReviewer() != null ? projectIdeaModel.getObject().getSuggestedReviewer().getId() : 0L;
+        setOutputMarkupPlaceholderTag(true);
+        currentFragment = createButtonFragment();
+        alternateFragment = createReviewerFragment(projectIdeaModel);
+        add(currentFragment);
+    }
+
+    private Fragment createButtonFragment() {
+        Fragment buttonFragment = new Fragment("main", "buttonFragment", this) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onBeforeRender() {
+                reviewerForm.setEnabled(false);
+                super.onBeforeRender();
+            }
+        };
+        buttonFragment.add(new AjaxFallbackLink<Object>("manualSetReviewerButton") {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+                swapFragment();
+                if (target != null) {
+                    target.addComponent(currentFragment);
+                }
+            }
+        });
+        buttonFragment.setOutputMarkupPlaceholderTag(true);
+        return buttonFragment;
+    }
+
+    private Fragment createReviewerFragment(final IModel<ProjectIdea> projectIdeaModel) {
+        Fragment reviewerFragment = new Fragment("main", "reviewerFragment", this) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onBeforeRender() {
+                reviewerForm.setEnabled(true);
+                super.onBeforeRender();
+            }
+        };
+        autocompleteReviewerField = createAutocompleteComponent();
+        autocompleteReviewerField.setModelObject(null);
+        reviewerForm = new Form<Employee>("reviewerForm") {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onSubmit() {
+                ProjectIdea projectIdea = projectIdeaModel.getObject();
+                projectIdea.setSuggestedReviewer(autocompleteReviewerField.getModelObject());
+                projectIdeaDao.save(projectIdea);
+            }
+        };
+
+        reviewerForm.add(autocompleteReviewerField);
+        reviewerForm.add(new AjaxFallbackLink<Object>("cancelButton") {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+                swapFragment();
+                if (target != null) {
+                    target.addComponent(currentFragment);
+                }
+            }
+        });
+        reviewerFragment.add(reviewerForm);
+        reviewerFragment.setOutputMarkupPlaceholderTag(true);
+        return reviewerFragment;
+    }
+
+    private AutocompleteComponent<Employee> createAutocompleteComponent() {
+        LoadableDetachableModel<List<Employee>> reviewerListModel = new LoadableDetachableModel<List<Employee>>() {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected List<Employee> load() {
+                return supervisorDao.findAll();
+            }
+        };
+
+        LoadableDetachableModel<Employee> reviewerModel = new LoadableDetachableModel<Employee>() {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected Employee load() {
+                if(reviewerId != 0L)
+                    return supervisorDao.load(reviewerId);
+                else
+                    return null;
+            }
+        };
+
+        ChoiceRenderer<Employee> choiceRenderer = new ChoiceRenderer<Employee>() {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public String getDisplayValue(Employee reviewer) {
+                return reviewer.getUser().getFullName();
+            }
+
+            @Override
+            public String getIdValue(Employee reviewer, int index) {
+                return reviewer.getId().toString();
+            }
+        };
+
+        return new AutocompleteComponent<Employee>("reviewerTextField",
+                reviewerModel, reviewerListModel, choiceRenderer) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public Employee getValueOnSearchFail(String input) {
+                if (Strings.isEmpty(input)) {
+                    return null;
+                } else {
+                    User tempUser = new User();
+                    tempUser.setFirstName(input);
+                    Employee reviewer = new Employee();
+                    reviewer.setUser(tempUser);
+                    return reviewer;
+                }
+            }
+        };
+    }
+
+    private void swapFragment() {
+        Fragment tempFragment = currentFragment;
+        currentFragment.replaceWith(alternateFragment);
+        currentFragment = alternateFragment;
+        alternateFragment = tempFragment;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/match/ProjectIdeaActionPanel.html b/src/main/java/se/su/dsv/scipro/admin/panels/match/ProjectIdeaActionPanel.html
index 1faa36a38b..524bbc1e9c 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/match/ProjectIdeaActionPanel.html
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/match/ProjectIdeaActionPanel.html
@@ -9,6 +9,9 @@
 			<div class="prepend-top">If you want to match and suggest this
 				idea to a supervisor or reviewer manually, you can do so.</div>
 			<div wicket:id="manualMatchPanel"></div>
+			<div class="prepend-top">If you want to manually suggest a
+				reviewer for this idea, you may do so as well.</div>
+			<div wicket:id="manualSetReviewerPanel"></div>
 			<div class="prepend-top">If this project idea is poorly
 				written, it should be refused, which means it will be sent back to the
 				authors for rewriting.</div>