James Moger
2014-04-26 01995873731e7efa517ca66246547b3084f8d529
Allow milestone deletion within the edit milestone page
5 files modified
84 ■■■■ changed files
src/main/java/com/gitblit/tickets/ITicketService.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/QueryResult.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/EditMilestonePage.html 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java 45 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/ITicketService.java
@@ -643,7 +643,7 @@
    public synchronized boolean renameMilestone(RepositoryModel repository, String oldName, String newName, String createdBy) {
        return renameMilestone(repository, oldName, newName, createdBy, true);
    }
    /**
     * Renames a milestone.
     *
@@ -714,6 +714,7 @@
        }
        Repository db = null;
        try {
            TicketMilestone tm = getMilestone(repository, milestone);
            db = repositoryManager.getRepository(repository.name);
            StoredConfig config = db.getConfig();
            config.unsetSection(MILESTONE, milestone);
@@ -721,6 +722,14 @@
            milestonesCache.remove(repository.name);
            for (QueryResult qr : tm.tickets) {
                if (qr.isOpen()) {
                    // reset the milestone only for open tickets
                    Change change = new Change(createdBy);
                    change.setField(Field.milestone, "");
                    TicketModel ticket = updateTicket(repository, qr.number, change);
                }
            }
            return true;
        } catch (IOException e) {
            log.error("failed to delete milestone " + milestone + " in " + repository, e);
src/main/java/com/gitblit/tickets/QueryResult.java
@@ -74,6 +74,14 @@
        return type != null && Type.Proposal == type;
    }
    public boolean isOpen() {
        return !status.isClosed();
    }
    public boolean isClosed() {
        return status.isClosed();
    }
    public boolean isMerged() {
        return Status.Merged == status && !StringUtils.isEmpty(mergeSha);
    }
src/main/java/com/gitblit/wicket/pages/EditMilestonePage.html
@@ -27,7 +27,7 @@
    <div class="row">
    <div class="span12">
        <div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /> &nbsp; <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /></div>
        <div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /> &nbsp; <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /> &nbsp; <input class="btn btn-danger" type="submit" value="Delete" wicket:message="value:gb.delete" wicket:id="delete" /></div>
    </div>
    </div>
    </form>
src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java
@@ -28,13 +28,13 @@
import org.apache.wicket.markup.html.form.TextField;
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.WicketUtils;
@@ -47,13 +47,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) {
@@ -64,7 +64,7 @@
            // ticket service is read-only
            throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
        }
        UserModel currentUser = GitBlitWebSession.get().getUser();
        if (currentUser == null) {
            currentUser = UserModel.ANONYMOUS;
@@ -74,13 +74,13 @@
            // administration prohibited
            throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
        }
        oldName = WicketUtils.getObject(params);
        if (StringUtils.isEmpty(oldName)) {
            // milestone not specified
            throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
        }
        TicketMilestone tm = app().tickets().getMilestone(getRepositoryModel(), oldName);
        if (tm == null) {
            // milestone does not exist
@@ -96,30 +96,30 @@
            @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 {
@@ -133,7 +133,7 @@
        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"));
@@ -152,6 +152,23 @@
        cancel.setDefaultFormProcessing(false);
        form.add(cancel);
        Button delete = new Button("delete") {
            private static final long serialVersionUID = 1L;
            @Override
            public void onSubmit() {
                UserModel currentUser = GitBlitWebSession.get().getUser();
                String createdBy = currentUser.username;
                if (app().tickets().deleteMilestone(getRepositoryModel(), oldName, createdBy)) {
                    setResponsePage(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
                } else {
                    // TODO error processing
                }
            }
        };
        delete.setDefaultFormProcessing(false);
        form.add(delete);
    }
    @Override
src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java
@@ -29,6 +29,8 @@
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.tickets.TicketMilestone;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
@@ -43,7 +45,7 @@
    private IModel<String> nameModel;
    private IModel<Date> dueModel;
    public NewMilestonePage(PageParameters params) {
        super(params);
@@ -52,7 +54,7 @@
            // ticket service is read-only
            throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName));
        }
        UserModel currentUser = GitBlitWebSession.get().getUser();
        if (currentUser == null) {
            currentUser = UserModel.ANONYMOUS;
@@ -72,13 +74,17 @@
            @Override
            protected void onSubmit() {
                String name = nameModel.getObject();
                if (StringUtils.isEmpty(name)) {
                    return;
                }
                Date due = dueModel.getObject();
                UserModel currentUser = GitBlitWebSession.get().getUser();
                String createdBy = currentUser.username;
                TicketMilestone milestone = app().tickets().createMilestone(getRepositoryModel(), name, createdBy);
                if (milestone != null) {
                    milestone.due = due;
@@ -92,8 +98,8 @@
        add(form);
        nameModel = Model.of("");
        dueModel = Model.of(new Date());
        dueModel = Model.of(new Date(System.currentTimeMillis() + TimeUtils.ONEDAY));
        form.add(new TextField<String>("name", nameModel));
        form.add(new DateTextField("due", dueModel, "yyyy-MM-dd"));