Hybris95
2014-04-22 3f5b8f5d9203aa7ffb7fbe9cdbaf9dba3da6cae6
src/main/java/com/gitblit/wicket/pages/TicketsPage.java
@@ -20,6 +20,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
@@ -42,6 +43,7 @@
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Keys;
import com.gitblit.models.RegistrantAccessPermission;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TicketModel;
import com.gitblit.models.TicketModel.Status;
import com.gitblit.models.UserModel;
@@ -87,7 +89,7 @@
      // set stateless page preference
      setStatelessHint(true);
      any = new TicketResponsible("any", "[* TO *]", null);
      any = new TicketResponsible(getString("gb.any"), "[* TO *]", null);
      UserModel user = GitBlitWebSession.get().getUser();
      boolean isAuthenticated = user != null && user.isAuthenticated;
@@ -164,6 +166,9 @@
         if (currentMilestone == null) {
            // milestone not found, create a temporary one
            currentMilestone = new TicketMilestone(milestoneParam);
            String q = QueryBuilder.q(Lucene.rid.matches(getRepositoryModel().getRID())).and(Lucene.milestone.matches(milestoneParam)).build();
            currentMilestone.tickets = app().tickets().queryFor(q, 1, 0, Lucene.number.name(), true);
            milestones.add(currentMilestone);
         }
      }
@@ -185,16 +190,16 @@
         milestonePanel.add(label);
         milestonePanel.add(new LinkPanel("openTickets", null,
               currentMilestone.getOpenTickets() + " open",
               MessageFormat.format(getString("gb.nOpenTickets"), currentMilestone.getOpenTickets()),
               TicketsPage.class,
               queryParameters(null, currentMilestone.name, openStatii, null, sortBy, desc, 1)));
         milestonePanel.add(new LinkPanel("closedTickets", null,
               currentMilestone.getClosedTickets() + " closed",
               MessageFormat.format(getString("gb.nClosedTickets"), currentMilestone.getClosedTickets()),
               TicketsPage.class,
               queryParameters(null, currentMilestone.name, closedStatii, null, sortBy, desc, 1)));
         milestonePanel.add(new Label("totalTickets", currentMilestone.getTotalTickets() + " total"));
         milestonePanel.add(new Label("totalTickets", MessageFormat.format(getString("gb.nTotalTickets"), currentMilestone.getTotalTickets())));
         add(milestonePanel);
      }
@@ -397,7 +402,8 @@
      add(new BookmarkablePageLink<Void>("allTickets", TicketsPage.class, queryParameters(queryParam, milestoneParam, null, assignedToParam, sortBy, desc, 1)));
      // by status
      List<Status> statii = Arrays.asList(Status.values());
      List<Status> statii = new ArrayList<Status>(Arrays.asList(Status.values()));
      statii.remove(Status.Closed);
      ListDataProvider<Status> resolutionsDp = new ListDataProvider<Status>(statii);
      DataView<Status> statiiLinks = new DataView<Status>("statii", resolutionsDp) {
         private static final long serialVersionUID = 1L;
@@ -529,7 +535,7 @@
               @Override
               public void populateItem(final Item<String> labelItem) {
                  String content = messageProcessor().processPlainCommitMessage(getRepository(), repositoryName, labelItem.getModelObject());
                  String content = bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName, labelItem.getModelObject());
                  Label label = new Label("label", content);
                  label.setEscapeModelStrings(false);
                  TicketLabel tLabel = app().tickets().getLabel(getRepositoryModel(), labelItem.getModelObject());
@@ -642,18 +648,120 @@
      };
      add(ticketsView);
      DataView<TicketMilestone> milestonesList = new DataView<TicketMilestone>("milestoneList", milestonesDp) {
      // new milestone link
      RepositoryModel repositoryModel = getRepositoryModel();
      final boolean acceptingUpdates = app().tickets().isAcceptingTicketUpdates(repositoryModel)
             && user != null && user.canAdmin(getRepositoryModel());
      if (acceptingUpdates) {
         add(new LinkPanel("newMilestone", null, getString("gb.newMilestone"),
            NewMilestonePage.class, WicketUtils.newRepositoryParameter(repositoryName)));
      } else {
         add(new Label("newMilestone").setVisible(false));
      }
      // milestones list
      List<TicketMilestone> openMilestones = new ArrayList<TicketMilestone>();
      List<TicketMilestone> closedMilestones = new ArrayList<TicketMilestone>();
      for (TicketMilestone milestone : app().tickets().getMilestones(repositoryModel)) {
         if (milestone.isOpen()) {
            openMilestones.add(milestone);
         } else {
            closedMilestones.add(milestone);
         }
      }
      Collections.sort(openMilestones, new Comparator<TicketMilestone>() {
         @Override
         public int compare(TicketMilestone o1, TicketMilestone o2) {
            return o2.due.compareTo(o1.due);
         }
      });
      Collections.sort(closedMilestones, new Comparator<TicketMilestone>() {
         @Override
         public int compare(TicketMilestone o1, TicketMilestone o2) {
            return o2.due.compareTo(o1.due);
         }
      });
      DataView<TicketMilestone> openMilestonesList = milestoneList("openMilestonesList", openMilestones, acceptingUpdates);
      add(openMilestonesList);
      DataView<TicketMilestone> closedMilestonesList = milestoneList("closedMilestonesList", closedMilestones, acceptingUpdates);
      add(closedMilestonesList);
   }
   protected DataView<TicketMilestone> milestoneList(String wicketId, List<TicketMilestone> milestones, final boolean acceptingUpdates) {
      ListDataProvider<TicketMilestone> milestonesDp = new ListDataProvider<TicketMilestone>(milestones);
      DataView<TicketMilestone> milestonesList = new DataView<TicketMilestone>(wicketId, milestonesDp) {
         private static final long serialVersionUID = 1L;
         @Override
         public void populateItem(final Item<TicketMilestone> item) {
            Fragment entryPanel = new Fragment("entryPanel", "milestoneListFragment", this);
            item.add(entryPanel);
            final TicketMilestone tm = item.getModelObject();
            item.add(new Label("milestoneName", tm.name));
            item.add(new Label("milestoneState", tm.status.name()));
            item.add(new Label("milestoneDue", tm.due == null ? getString("gb.notSpecified") : tm.due.toString()));
            PageParameters params = queryParameters(null, tm.name, null, null, null, true, 1);
            entryPanel.add(new LinkPanel("milestoneName", null, tm.name, TicketsPage.class, params).setRenderBodyOnly(true));
            String css;
            String status = tm.status.name();
            switch (tm.status) {
            case Open:
               if (tm.isOverdue()) {
                  css = "aui-lozenge aui-lozenge-subtle aui-lozenge-error";
                  status = "overdue";
               } else {
                  css = "aui-lozenge aui-lozenge-subtle";
               }
               break;
            default:
               css = "aui-lozenge";
               break;
            }
            Label stateLabel = new Label("milestoneState", status);
            WicketUtils.setCssClass(stateLabel, css);
            entryPanel.add(stateLabel);
            if (tm.due == null) {
               entryPanel.add(new Label("milestoneDue", getString("gb.notSpecified")));
            } else {
               entryPanel.add(WicketUtils.createDatestampLabel("milestoneDue", tm.due, getTimeZone(), getTimeUtils()));
            }
            if (acceptingUpdates) {
               entryPanel.add(new LinkPanel("editMilestone", null, getString("gb.edit"), EditMilestonePage.class,
                  WicketUtils.newObjectParameter(repositoryName, tm.name)));
            } else {
               entryPanel.add(new Label("editMilestone").setVisible(false));
            }
            if (tm.isOpen()) {
               // re-load milestone with query results
               TicketMilestone m = app().tickets().getMilestone(getRepositoryModel(), tm.name);
               Fragment milestonePanel = new Fragment("milestonePanel", "openMilestoneFragment", this);
               Label label = new Label("progress");
               WicketUtils.setCssStyle(label, "width:" + tm.getProgress() + "%;");
               milestonePanel.add(label);
               milestonePanel.add(new LinkPanel("openTickets", null,
                     MessageFormat.format(getString("gb.nOpenTickets"), m.getOpenTickets()),
                     TicketsPage.class,
                     queryParameters(null, tm.name, openStatii, null, null, true, 1)));
               milestonePanel.add(new LinkPanel("closedTickets", null,
                     MessageFormat.format(getString("gb.nClosedTickets"), m.getClosedTickets()),
                     TicketsPage.class,
                     queryParameters(null, tm.name, closedStatii, null, null, true, 1)));
               milestonePanel.add(new Label("totalTickets", MessageFormat.format(getString("gb.nTotalTickets"), m.getTotalTickets())));
               entryPanel.add(milestonePanel);
            } else {
               entryPanel.add(new Label("milestonePanel").setVisible(false));
            }
         }
      };
      add(milestonesList);
      return milestonesList;
   }
   protected PageParameters queryParameters(