From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 30 Apr 2016 04:19:14 -0400
Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates

---
 src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java |  120 +++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 78 insertions(+), 42 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java
index 7b20ade..200c8dc 100644
--- a/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java
@@ -17,18 +17,22 @@
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 
+import com.gitblit.models.ProjectModel;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
 
 /**
- * A radio group panel of the 5 available authorization/access restriction combinations.
+ * A panel for naming a repository, specifying it's project, and entering a description.
  *
  * @author James Moger
  *
@@ -37,62 +41,103 @@
 
 	private static final long serialVersionUID = 1L;
 
-	private final RepositoryModel repository;
-
 	private String fullName;
+
+	private final IModel<String> projectPath;
+
+	private DropDownChoice<String> pathChoice;
+
+	private final IModel<String> repoName;
+
+	private TextField<String> nameField;
 
 	public RepositoryNamePanel(String wicketId, RepositoryModel repository) {
 		super(wicketId);
-		this.repository = repository;
-	}
-
-	@Override
-	protected void onInitialize() {
-		super.onInitialize();
 
 		GitBlitWebSession session = GitBlitWebSession.get();
 		UserModel user = session.getUser();
-
-		// build project list for repository destination
-		String defaultProject = null;
-		List<String> projects = new ArrayList<String>();
-
-		if (user.canAdmin()) {
-			projects.add("/");
-			defaultProject = "/";
+		if (user == null) {
+			user = UserModel.ANONYMOUS;
 		}
 
-		if (user.canCreate()) {
-			String p =  user.getPersonalPath() + "/";
-			projects.add(p);
-			if (defaultProject == null) {
-				// only prefer personal namespace if default is not already set
-				defaultProject = p;
+		// build project set for repository destination
+		String defaultPath = null;
+		String defaultName = null;
+		Set<String> pathNames = new TreeSet<String>();
+
+		// add the registered/known projects
+		for (ProjectModel project : app().projects().getProjectModels(user, false)) {
+			// TODO issue-351: user.canAdmin(project)
+			if (user.canAdmin()) {
+				if (project.isRoot) {
+					pathNames.add("/");
+				} else {
+					pathNames.add(project.name + "/");
+				}
 			}
 		}
 
-		repository.projectPath = defaultProject;
+		// add the user's personal project namespace
+		if (user.canAdmin() || user.canCreate()) {
+			pathNames.add(user.getPersonalPath() + "/");
+		}
 
-		add(new DropDownChoice<String>("projectPath", projects));
-		add(new TextField<String>("name"));
+		if (!StringUtils.isEmpty(repository.name)) {
+			// editing a repository name
+			// set the defaultProject to the current repository project
+			if (StringUtils.isEmpty(repository.projectPath)) {
+				defaultPath = "/";
+				defaultName = repository.name;
+			} else {
+				defaultPath = repository.projectPath + "/";
+				defaultName = repository.name.substring(defaultPath.length());
+			}
+			pathNames.add(defaultPath);
+		}
+
+		// if default project is not already set, set preference based on the user permissions
+		if (defaultPath == null) {
+			if (user.canAdmin()) {
+				defaultPath = "/";
+			} else if (user.canCreate()) {
+				defaultPath = user.getPersonalPath() + "/";
+			}
+		}
+
+		projectPath = Model.of(defaultPath);
+		pathChoice = new DropDownChoice<String>("projectPath", projectPath, new ArrayList<String>(pathNames));
+		repoName = Model.of(defaultName);
+		nameField = new TextField<String>("name", repoName);
+
+		// only enable project selection if we actually have multiple choices
+		add(pathChoice.setEnabled(pathNames.size() > 1));
+		add(nameField);
+		add(new TextField<String>("description"));
+	}
+
+	public void setEditable(boolean editable) {
+		// only enable project selection if we actually have multiple choices
+		pathChoice.setEnabled(pathChoice.getChoices().size() > 1 && editable);
+		nameField.setEnabled(editable);
 	}
 
 	public boolean updateModel(RepositoryModel repositoryModel) {
-		// confirm a project was selected
-		if (StringUtils.isEmpty(repositoryModel.projectPath)) {
+		// confirm a project path was selected
+		if (StringUtils.isEmpty(projectPath.getObject())) {
 			error(getString("gb.pleaseSelectProject"));
 			return false;
 		}
 
 		// confirm a repository name was entered
-		if (StringUtils.isEmpty(repositoryModel.name)) {
+		if (StringUtils.isEmpty(repoName.getObject())) {
 			error(getString("gb.pleaseSetRepositoryName"));
 			return false;
 		}
 
-		String project = repositoryModel.projectPath;
+		String project = projectPath.getObject();
+		String name = repoName.getObject();
 
-		fullName = (project + repositoryModel.name).trim();
+		fullName = (project + name).trim();
 		fullName = fullName.replace('\\', '/');
 		fullName = fullName.replace("//", "/");
 		if (fullName.charAt(0) == '/') {
@@ -119,21 +164,12 @@
 		}
 
 		repositoryModel.name = fullName;
-		repositoryModel.projectPath = null;
 
 		return true;
-	}
-
-	public void resetModel(RepositoryModel repositoryModel) {
-		// restore project and name fields on error condition
-		repositoryModel.projectPath = StringUtils.getFirstPathElement(fullName) + "/";
-		if (repositoryModel.projectPath.length() > 1) {
-			repositoryModel.name = fullName.substring(repositoryModel.projectPath.length());
-		}
 	}
 
 	@Override
 	protected boolean getStatelessHint() {
 		return false;
 	}
-}
+}
\ No newline at end of file

--
Gitblit v1.9.1