From ba516f6c6aaabf7935ef42292f446bf375bf542b Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Tue, 03 Jun 2014 10:34:51 -0400
Subject: [PATCH] Extract re-usable conditional choice option panel

---
 src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html        |   36 +----------
 src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.java |   78 ++++++++++++++++++++++++++
 src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java        |   42 ++++++--------
 src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.html |   19 ++++++
 4 files changed, 119 insertions(+), 56 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html
index df55381..115b8c1 100644
--- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html
+++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html
@@ -19,41 +19,13 @@
 		<hr/>
 		
 		<h4><wicket:message key="gb.initialCommit"></wicket:message></h4>
-		<div>
-			<p><wicket:message key="gb.initialCommitDescription"></wicket:message></p>
-		</div>
+		<p><wicket:message key="gb.initialCommitDescription"></wicket:message></p>
 		
-		<div style="clear:both;padding-top:10px;">
-			<div style="display: inline-block;vertical-align: top;">
-				<input type="checkbox" wicket:id="addReadme" />
-			</div>
-			<div style="display: inline-block;">
-				<b><wicket:message key="gb.initWithReadme"></wicket:message></b><br/>
-				<p><wicket:message key="gb.initWithReadmeDescription"></wicket:message></p>
-			</div>
-		</div>
+		<div wicket:id="addReadme"></div>
 		
-		<div style="clear:both;padding-top:10px;display:none;">
-			<!-- future GitFlow -->
-			<div style="display: inline-block;vertical-align: top;">
-				<input type="checkbox" wicket:id="addGitflow" />
-			</div>
-			<div style="display: inline-block;">
-				<b>Include a .gitflow file</b>
-				<p>This will generate a config file which guides Git clients in setting up Gitflow branches.</p>
-			</div>
-		</div>
+		<div wicket:id="addGitIgnore"></div>
 		
-		<div style="clear:both;padding-top:10px;">
-			<div style="display: inline-block;vertical-align: top;">
-				<input type="checkbox" wicket:id="addGitignore" />
-			</div>
-			<div style="display:inline-block;">
-				<b><wicket:message key="gb.initWithGitignore"></wicket:message></b><br/>
-				<p><wicket:message key="gb.initWithGitignoreDescription"></wicket:message></p>
-				<p style="padding-top:5px;"><select class="span2" wicket:id="gitignore" /></p>
-			</div>
-		</div>		
+		<div wicket:id="addGitFlow"></div>
 	</div>
 </div>
 
diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java
index d5ae344..f0aa224 100644
--- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java
@@ -22,12 +22,8 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.behavior.SimpleAttributeModifier;
 import org.apache.wicket.markup.html.form.Button;
-import org.apache.wicket.markup.html.form.CheckBox;
-import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
@@ -60,6 +56,8 @@
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.AccessPolicyPanel;
+import com.gitblit.wicket.panels.CheckboxOption;
+import com.gitblit.wicket.panels.ConditionalChoiceOption;
 import com.gitblit.wicket.panels.RepositoryNamePanel;
 
 public class NewRepositoryPage extends RootSubPage {
@@ -183,7 +181,10 @@
 
 		// add README
 		addReadmeModel = Model.of(false);
-		form.add(new CheckBox("addReadme", addReadmeModel));
+		form.add(new CheckboxOption("addReadme",
+				getString("gb.initWithReadme"),
+				getString("gb.initWithReadmeDescription"),
+				addReadmeModel));
 
 		// add .gitignore
 		File gitignoreDir = app().runtime().getFileOrFolder(Keys.git.gitignoreFolder, "${baseFolder}/gitignore");
@@ -198,29 +199,22 @@
 			}
 		}
 		Collections.sort(gitignores);
+
 		gitignoreModel = Model.of("");
-		final DropDownChoice<String> gitignoreChoice = new DropDownChoice<String>("gitignore", gitignoreModel, gitignores);
-		gitignoreChoice.setOutputMarkupId(true);
-		form.add(gitignoreChoice.setEnabled(false));
-
 		addGitignoreModel = Model.of(false);
-		final CheckBox gitignoreCheckbox = new CheckBox("addGitignore", addGitignoreModel);
-		form.add(gitignoreCheckbox);
+		form.add(new ConditionalChoiceOption<String>("addGitIgnore",
+				getString("gb.initWithGitignore"),
+				getString("gb.initWithGitignoreDescription"),
+				addGitignoreModel,
+				gitignoreModel,
+				gitignores));
 
-		gitignoreCheckbox.add(new AjaxFormComponentUpdatingBehavior("onchange") {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				gitignoreChoice.setEnabled(addGitignoreModel.getObject());
-				target.addComponent(gitignoreChoice);
-			}
-		});
-
-		// TODO add .gitflow
+		// TODO consider gitflow at creation (ticket-55)
 		addGitflowModel = Model.of(false);
-		form.add(new CheckBox("addGitflow", addGitflowModel));
+		form.add(new CheckboxOption("addGitFlow",
+				"Include a .gitflow file",
+				"This will generate a config file which guides Git clients in setting up Gitflow branches.",
+				addGitflowModel).setVisible(false));
 
 		form.add(new Button("create"));
 
diff --git a/src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.html b/src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.html
new file mode 100644
index 0000000..fb360d1
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+
+<body>
+<wicket:panel>
+	<div style="padding-top:4px;">
+		<div>
+			<label style="font-weight:bold;" class="checkbox"><input type="checkbox" wicket:id="checkbox" /> <span wicket:id="name"></span></label>
+		</div>
+		<label class="checkbox" style="color:#777;"> <span wicket:id="description"></span>
+		<p style="padding-top:5px;"><select class="span3" wicket:id="choice" /></p>
+		</label>		
+	</div>
+</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.java b/src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.java
new file mode 100644
index 0000000..07aaee8
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.panels;
+
+import java.util.List;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.model.IModel;
+import org.parboiled.common.StringUtils;
+
+/**
+ * A re-usable conditional choice option panel.
+ *
+ * [x] title
+ *     description
+ *     [choices]
+ *
+ * @author James Moger
+ *
+ */
+public class ConditionalChoiceOption<T> extends BasePanel {
+
+	private static final long serialVersionUID = 1L;
+
+	final CheckBox checkbox;
+	final DropDownChoice<T> choice;
+
+	public ConditionalChoiceOption(String wicketId, String title, String description, IModel<Boolean> checkboxModel, IModel<T> choiceModel, List<T> choices) {
+		super(wicketId);
+		add(new Label("name", title));
+		add(new Label("description", description).setVisible(!StringUtils.isEmpty(description)));
+
+		this.checkbox = new CheckBox("checkbox", checkboxModel);
+		checkbox.setOutputMarkupId(true);
+
+		this.choice = new DropDownChoice<T>("choice", choiceModel, choices);
+		choice.setOutputMarkupId(true);
+
+		setup();
+	}
+
+	private void setup() {
+		add(checkbox);
+		add(choice.setMarkupId("choice").setEnabled(choice.getChoices().size() > 0));
+		choice.setEnabled(checkbox.getModelObject());
+
+		checkbox.add(new AjaxFormComponentUpdatingBehavior("onchange") {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onUpdate(AjaxRequestTarget target) {
+				choice.setEnabled(checkbox.getModelObject());
+				target.addComponent(choice);
+				if (!choice.isEnabled()) {
+					choice.setModelObject(null);
+				}
+			}
+		});
+	}
+}

--
Gitblit v1.9.1