James Moger
2014-03-05 85775acd760c668a73f9febf80009832ddf91af9
Delegate closed ticket changes to the Edit Ticket page
2 files modified
304 ■■■■ changed files
src/main/java/com/gitblit/wicket/pages/TicketPage.html 15 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/TicketPage.java 289 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/TicketPage.html
@@ -136,8 +136,8 @@
</wicket:fragment>
<!-- TICKET CONTROLS FRAGMENT -->
<wicket:fragment wicket:id="controlsFragment">
<!-- OPEN TICKET CONTROLS FRAGMENT -->
<wicket:fragment wicket:id="openControlsFragment">
    <div class="hidden-phone hidden-tablet">
        <div class="btn-group" style="display:inline-block;">
            <a class="btn btn-small dropdown-toggle" data-toggle="dropdown" href="#"><wicket:message key="gb.status"></wicket:message> <span class="caret"></span></a>
@@ -167,6 +167,17 @@
</wicket:fragment>
<!-- CLOSED TICKET CONTROLS FRAGMENT -->
<wicket:fragment wicket:id="closedControlsFragment">
    <div class="hidden-phone hidden-tablet">
        <div class="btn-group" style="display:inline-block;">
            <a class="btn btn-small" wicket:id="editLink"></a>
        </div>
    </div>
</wicket:fragment>
<!-- STATUS INDICATOR FRAGMENT -->
<wicket:fragment wicket:id="ticketStatusFragment">
    <div style="font-size:2.5em;padding-bottom: 5px;">
src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -328,159 +328,170 @@
         * UPDATE FORM (DISCUSSION TAB)
         */
        if (isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) {
            Fragment controls = new Fragment("controls", "controlsFragment", this);
            if (ticket.isOpen()) {
                /*
                 * OPEN TICKET
                 */
                Fragment controls = new Fragment("controls", "openControlsFragment", this);
            /*
             * STATUS
             */
            List<Status> choices = new ArrayList<Status>();
            if (ticket.isClosed()) {
                // re-open
                choices.addAll(Arrays.asList(TicketModel.Status.Open));
            } else if (ticket.isProposal()) {
                choices.addAll(Arrays.asList(TicketModel.Status.proposalWorkflow));
            } else if (ticket.isBug()) {
                choices.addAll(Arrays.asList(TicketModel.Status.bugWorkflow));
            } else {
                choices.addAll(Arrays.asList(TicketModel.Status.requestWorkflow));
            }
            choices.remove(ticket.status);
            ListDataProvider<Status> workflowDp = new ListDataProvider<Status>(choices);
            DataView<Status> statusView = new DataView<Status>("newStatus", workflowDp) {
                private static final long serialVersionUID = 1L;
                @Override
                public void populateItem(final Item<Status> item) {
                    SimpleAjaxLink<Status> link = new SimpleAjaxLink<Status>("link", item.getModel()) {
                        private static final long serialVersionUID = 1L;
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            Status status = getModel().getObject();
                            Change change = new Change(user.username);
                            change.setField(Field.status, status);
                            if (!ticket.isWatching(user.username)) {
                                change.watch(user.username);
                            }
                            TicketModel update = app().tickets().updateTicket(repository, ticket.number, change);
                            app().tickets().createNotifier().sendMailing(update);
                            setResponsePage(TicketsPage.class, getPageParameters());
                        }
                    };
                    String css = getStatusClass(item.getModel().getObject());
                    WicketUtils.setCssClass(link, css);
                    item.add(link);
                /*
                 * STATUS
                 */
                List<Status> choices = new ArrayList<Status>();
                if (ticket.isProposal()) {
                    choices.addAll(Arrays.asList(TicketModel.Status.proposalWorkflow));
                } else if (ticket.isBug()) {
                    choices.addAll(Arrays.asList(TicketModel.Status.bugWorkflow));
                } else {
                    choices.addAll(Arrays.asList(TicketModel.Status.requestWorkflow));
                }
            };
            controls.add(statusView);
                choices.remove(ticket.status);
            /*
             * RESPONSIBLE LIST
             */
            Set<String> userlist = new TreeSet<String>(ticket.getParticipants());
            for (RegistrantAccessPermission rp : app().repositories().getUserAccessPermissions(getRepositoryModel())) {
                if (rp.permission.atLeast(AccessPermission.PUSH) && !rp.isTeam()) {
                    userlist.add(rp.registrant);
                }
            }
            List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>();
            if (!StringUtils.isEmpty(ticket.responsible)) {
                // exclude the current responsible
                userlist.remove(ticket.responsible);
            }
            for (String username : userlist) {
                UserModel u = app().users().getUserModel(username);
                if (u != null) {
                    responsibles.add(new TicketResponsible(u));
                }
            }
            Collections.sort(responsibles);
            responsibles.add(new TicketResponsible(ESC_NIL, "", ""));
            ListDataProvider<TicketResponsible> responsibleDp = new ListDataProvider<TicketResponsible>(responsibles);
            DataView<TicketResponsible> responsibleView = new DataView<TicketResponsible>("newResponsible", responsibleDp) {
                private static final long serialVersionUID = 1L;
                ListDataProvider<Status> workflowDp = new ListDataProvider<Status>(choices);
                DataView<Status> statusView = new DataView<Status>("newStatus", workflowDp) {
                    private static final long serialVersionUID = 1L;
                @Override
                public void populateItem(final Item<TicketResponsible> item) {
                    SimpleAjaxLink<TicketResponsible> link = new SimpleAjaxLink<TicketResponsible>("link", item.getModel()) {
                    @Override
                    public void populateItem(final Item<Status> item) {
                        SimpleAjaxLink<Status> link = new SimpleAjaxLink<Status>("link", item.getModel()) {
                        private static final long serialVersionUID = 1L;
                            private static final long serialVersionUID = 1L;
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            TicketResponsible responsible = getModel().getObject();
                            Change change = new Change(user.username);
                            change.setField(Field.responsible, responsible.username);
                            if (!StringUtils.isEmpty(responsible.username)) {
                                if (!ticket.isWatching(responsible.username)) {
                                    change.watch(responsible.username);
                            @Override
                            public void onClick(AjaxRequestTarget target) {
                                Status status = getModel().getObject();
                                Change change = new Change(user.username);
                                change.setField(Field.status, status);
                                if (!ticket.isWatching(user.username)) {
                                    change.watch(user.username);
                                }
                                TicketModel update = app().tickets().updateTicket(repository, ticket.number, change);
                                app().tickets().createNotifier().sendMailing(update);
                                setResponsePage(TicketsPage.class, getPageParameters());
                            }
                            if (!ticket.isWatching(user.username)) {
                                change.watch(user.username);
                            }
                            TicketModel update = app().tickets().updateTicket(repository, ticket.number, change);
                            app().tickets().createNotifier().sendMailing(update);
                            setResponsePage(TicketsPage.class, getPageParameters());
                        }
                    };
                    item.add(link);
                }
            };
            controls.add(responsibleView);
                        };
                        String css = getStatusClass(item.getModel().getObject());
                        WicketUtils.setCssClass(link, css);
                        item.add(link);
                    }
                };
                controls.add(statusView);
            /*
             * MILESTONE LIST
             */
            List<TicketMilestone> milestones = app().tickets().getMilestones(repository, Status.Open);
            if (!StringUtils.isEmpty(ticket.milestone)) {
                for (TicketMilestone milestone : milestones) {
                    if (milestone.name.equals(ticket.milestone)) {
                        milestones.remove(milestone);
                        break;
                /*
                 * RESPONSIBLE LIST
                 */
                Set<String> userlist = new TreeSet<String>(ticket.getParticipants());
                for (RegistrantAccessPermission rp : app().repositories().getUserAccessPermissions(getRepositoryModel())) {
                    if (rp.permission.atLeast(AccessPermission.PUSH) && !rp.isTeam()) {
                        userlist.add(rp.registrant);
                    }
                }
            }
            milestones.add(new TicketMilestone(ESC_NIL));
            ListDataProvider<TicketMilestone> milestoneDp = new ListDataProvider<TicketMilestone>(milestones);
            DataView<TicketMilestone> milestoneView = new DataView<TicketMilestone>("newMilestone", milestoneDp) {
                private static final long serialVersionUID = 1L;
                @Override
                public void populateItem(final Item<TicketMilestone> item) {
                    SimpleAjaxLink<TicketMilestone> link = new SimpleAjaxLink<TicketMilestone>("link", item.getModel()) {
                        private static final long serialVersionUID = 1L;
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            TicketMilestone milestone = getModel().getObject();
                            Change change = new Change(user.username);
                            if (NIL.equals(milestone.name) || ESC_NIL.equals(milestone.name)) {
                                change.setField(Field.milestone, "");
                            } else {
                                change.setField(Field.milestone, milestone.name);
                            }
                            if (!ticket.isWatching(user.username)) {
                                change.watch(user.username);
                            }
                            TicketModel update = app().tickets().updateTicket(repository, ticket.number, change);
                            app().tickets().createNotifier().sendMailing(update);
                            setResponsePage(TicketsPage.class, getPageParameters());
                        }
                    };
                    item.add(link);
                List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>();
                if (!StringUtils.isEmpty(ticket.responsible)) {
                    // exclude the current responsible
                    userlist.remove(ticket.responsible);
                }
            };
            controls.add(milestoneView);
                for (String username : userlist) {
                    UserModel u = app().users().getUserModel(username);
                    if (u != null) {
                        responsibles.add(new TicketResponsible(u));
                    }
                }
                Collections.sort(responsibles);
                responsibles.add(new TicketResponsible(ESC_NIL, "", ""));
                ListDataProvider<TicketResponsible> responsibleDp = new ListDataProvider<TicketResponsible>(responsibles);
                DataView<TicketResponsible> responsibleView = new DataView<TicketResponsible>("newResponsible", responsibleDp) {
                    private static final long serialVersionUID = 1L;
            String editHref = urlFor(EditTicketPage.class, params).toString();
            controls.add(new ExternalLink("editLink", editHref, getString("gb.edit")));
                    @Override
                    public void populateItem(final Item<TicketResponsible> item) {
                        SimpleAjaxLink<TicketResponsible> link = new SimpleAjaxLink<TicketResponsible>("link", item.getModel()) {
            add(controls);
                            private static final long serialVersionUID = 1L;
                            @Override
                            public void onClick(AjaxRequestTarget target) {
                                TicketResponsible responsible = getModel().getObject();
                                Change change = new Change(user.username);
                                change.setField(Field.responsible, responsible.username);
                                if (!StringUtils.isEmpty(responsible.username)) {
                                    if (!ticket.isWatching(responsible.username)) {
                                        change.watch(responsible.username);
                                    }
                                }
                                if (!ticket.isWatching(user.username)) {
                                    change.watch(user.username);
                                }
                                TicketModel update = app().tickets().updateTicket(repository, ticket.number, change);
                                app().tickets().createNotifier().sendMailing(update);
                                setResponsePage(TicketsPage.class, getPageParameters());
                            }
                        };
                        item.add(link);
                    }
                };
                controls.add(responsibleView);
                /*
                 * MILESTONE LIST
                 */
                List<TicketMilestone> milestones = app().tickets().getMilestones(repository, Status.Open);
                if (!StringUtils.isEmpty(ticket.milestone)) {
                    for (TicketMilestone milestone : milestones) {
                        if (milestone.name.equals(ticket.milestone)) {
                            milestones.remove(milestone);
                            break;
                        }
                    }
                }
                milestones.add(new TicketMilestone(ESC_NIL));
                ListDataProvider<TicketMilestone> milestoneDp = new ListDataProvider<TicketMilestone>(milestones);
                DataView<TicketMilestone> milestoneView = new DataView<TicketMilestone>("newMilestone", milestoneDp) {
                    private static final long serialVersionUID = 1L;
                    @Override
                    public void populateItem(final Item<TicketMilestone> item) {
                        SimpleAjaxLink<TicketMilestone> link = new SimpleAjaxLink<TicketMilestone>("link", item.getModel()) {
                            private static final long serialVersionUID = 1L;
                            @Override
                            public void onClick(AjaxRequestTarget target) {
                                TicketMilestone milestone = getModel().getObject();
                                Change change = new Change(user.username);
                                if (NIL.equals(milestone.name) || ESC_NIL.equals(milestone.name)) {
                                    change.setField(Field.milestone, "");
                                } else {
                                    change.setField(Field.milestone, milestone.name);
                                }
                                if (!ticket.isWatching(user.username)) {
                                    change.watch(user.username);
                                }
                                TicketModel update = app().tickets().updateTicket(repository, ticket.number, change);
                                app().tickets().createNotifier().sendMailing(update);
                                setResponsePage(TicketsPage.class, getPageParameters());
                            }
                        };
                        item.add(link);
                    }
                };
                controls.add(milestoneView);
                String editHref = urlFor(EditTicketPage.class, params).toString();
                controls.add(new ExternalLink("editLink", editHref, getString("gb.edit")));
                add(controls);
            } else {
                /*
                 * CLOSED TICKET
                 */
                Fragment controls = new Fragment("controls", "closedControlsFragment", this);
                String editHref = urlFor(EditTicketPage.class, params).toString();
                controls.add(new ExternalLink("editLink", editHref, getString("gb.edit")));
                add(controls);
            }
        } else {
            add(new Label("controls").setVisible(false));
        }