Paul Martin
2016-04-30 a502d96a860456ec5e8c96761db70f7cabb74751
src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java
@@ -15,28 +15,35 @@
 */
package com.gitblit.wicket.pages;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.extensions.markup.html.form.DateTextField;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.basic.Label;
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.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.parboiled.common.StringUtils;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TicketModel;
import com.gitblit.models.TicketModel.Status;
import com.gitblit.models.UserModel;
import com.gitblit.tickets.TicketMilestone;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.Html5DateField;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.BasePanel.JavascriptEventConfirmation;
/**
 * Page for creating a new milestone.
@@ -47,13 +54,13 @@
public class EditMilestonePage extends RepositoryPage {
   private final String oldName;
   private IModel<String> nameModel;
   private IModel<Date> dueModel;
   private IModel<Status> statusModel;
   private IModel<Boolean> notificationModel;
   public EditMilestonePage(PageParameters params) {
@@ -62,9 +69,9 @@
      RepositoryModel model = getRepositoryModel();
      if (!app().tickets().isAcceptingTicketUpdates(model)) {
         // ticket service is read-only
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
      }
      UserModel currentUser = GitBlitWebSession.get().getUser();
      if (currentUser == null) {
         currentUser = UserModel.ANONYMOUS;
@@ -72,86 +79,111 @@
      if (!currentUser.isAuthenticated || !currentUser.canAdmin(model)) {
         // administration prohibited
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
      }
      oldName = WicketUtils.getObject(params);
      if (StringUtils.isEmpty(oldName)) {
         // milestone not specified
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
      }
      TicketMilestone tm = app().tickets().getMilestone(getRepositoryModel(), oldName);
      if (tm == null) {
         // milestone does not exist
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
         throw new RestartResponseException(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
      }
      setStatelessHint(false);
      setOutputMarkupId(true);
      Form<Void> form = new Form<Void>("editForm") {
         private static final long serialVersionUID = 1L;
         @Override
         protected void onSubmit() {
            String name = nameModel.getObject();
            if (StringUtils.isEmpty(name)) {
               return;
            }
            Date due = dueModel.getObject();
            Status status = statusModel.getObject();
            boolean rename = !name.equals(oldName);
            boolean notify = notificationModel.getObject();
            UserModel currentUser = GitBlitWebSession.get().getUser();
            String createdBy = currentUser.username;
            TicketMilestone tm = app().tickets().getMilestone(getRepositoryModel(), oldName);
            tm.setName(name);
            tm.setDue(due);
            tm.status = status;
            boolean success = true;
            if (rename) {
               success = app().tickets().renameMilestone(getRepositoryModel(), oldName, name, createdBy, notify);
            }
            if (success && app().tickets().updateMilestone(getRepositoryModel(), tm, createdBy)) {
               setResponsePage(TicketsPage.class, WicketUtils.newRepositoryParameter(getRepositoryModel().name));
            } else {
               // TODO error
            }
         }
      };
      Form<Void> form = new Form<Void>("editForm");
      add(form);
      nameModel = Model.of(tm.name);
      dueModel = Model.of(tm.due);
      statusModel = Model.of(tm.status);
      notificationModel = Model.of(true);
      form.add(new TextField<String>("name", nameModel));
      form.add(new DateTextField("due", dueModel, "yyyy-MM-dd"));
      form.add(new TextField<String>("name", nameModel));
      form.add(new Html5DateField("due", dueModel, "yyyy-MM-dd"));
      form.add(new Label("dueFormat", "yyyy-MM-dd"));
      form.add(new CheckBox("notify", notificationModel));
      addBottomScriptInline("{var e=document.createElement('input');e.type='date';if(e.type=='date'){$('[name=\"due\"]~.help-inline').hide()}}");
      addBottomScript("scripts/wicketHtml5Patch.js");
      List<Status> statusChoices = Arrays.asList(Status.Open, Status.Closed);
      form.add(new DropDownChoice<TicketModel.Status>("status", statusModel, statusChoices));
      form.add(new Button("save"));
      form.add(new AjaxButton("save") {
         private static final long serialVersionUID = 1L;
         @Override
         protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            String name = nameModel.getObject();
            if (StringUtils.isEmpty(name)) {
               return;
            }
            Date due = dueModel.getObject();
            Status status = statusModel.getObject();
            boolean rename = !name.equals(oldName);
            boolean notify = notificationModel.getObject();
            UserModel currentUser = GitBlitWebSession.get().getUser();
            String createdBy = currentUser.username;
            TicketMilestone tm = app().tickets().getMilestone(getRepositoryModel(), oldName);
            tm.setName(name);
            tm.setDue(due);
            tm.status = status;
            boolean success = true;
            if (rename) {
               success = app().tickets().renameMilestone(getRepositoryModel(), oldName, name, createdBy, notify);
            }
            if (success && app().tickets().updateMilestone(getRepositoryModel(), tm, createdBy)) {
               redirectTo(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
            } else {
               // TODO error
            }
         }
      });
      Button cancel = new Button("cancel") {
         private static final long serialVersionUID = 1L;
         @Override
         public void onSubmit() {
            setResponsePage(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
            setResponsePage(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
         }
      };
      cancel.setDefaultFormProcessing(false);
      form.add(cancel);
      Link<Void> delete = new Link<Void>("delete") {
         private static final long serialVersionUID = 1L;
         @Override
         public void onClick() {
            UserModel currentUser = GitBlitWebSession.get().getUser();
            String createdBy = currentUser.username;
            boolean notify = notificationModel.getObject();
            if (app().tickets().deleteMilestone(getRepositoryModel(), oldName, createdBy, notify)) {
               setResponsePage(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
            } else {
               error(MessageFormat.format(getString("gb.milestoneDeleteFailed"), oldName));
            }
         }
      };
      delete.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
         getString("gb.deleteMilestone"), oldName)));
      form.add(delete);
   }
   @Override