James Moger
2014-06-03 ba516f6c6aaabf7935ef42292f446bf375bf542b
Extract re-usable conditional choice option panel
2 files added
2 files modified
173 ■■■■■ changed files
src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.html 34 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java 42 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.html 19 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.java 78 ●●●●● patch | view | raw | blame | history
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>
        
        <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>
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"));
src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.html
New file
@@ -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>
src/main/java/com/gitblit/wicket/panels/ConditionalChoiceOption.java
New file
@@ -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);
                }
            }
        });
    }
}