| | |
| | | package com.gitblit.wicket.pages; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | |
| | | import org.apache.wicket.Component; |
| | | import org.apache.wicket.PageParameters; |
| | | import org.apache.wicket.markup.html.basic.Label; |
| | | import org.apache.wicket.markup.repeater.Item; |
| | | import org.apache.wicket.markup.repeater.data.DataView; |
| | | import org.apache.wicket.markup.repeater.data.ListDataProvider; |
| | | |
| | | import com.gitblit.models.RepositoryModel; |
| | | import com.gitblit.models.UserModel; |
| | | import com.gitblit.models.TicketModel; |
| | | import com.gitblit.models.UserModel; |
| | | import com.gitblit.models.TicketModel.Status; |
| | | import com.gitblit.models.TicketModel.Type; |
| | | import com.gitblit.tickets.ITicketService; |
| | | import com.gitblit.tickets.QueryBuilder; |
| | | import com.gitblit.tickets.QueryResult; |
| | | import com.gitblit.tickets.TicketIndexer.Lucene; |
| | | import com.gitblit.utils.StringUtils; |
| | | import com.gitblit.wicket.GitBlitWebApp; |
| | | import com.gitblit.wicket.GitBlitWebSession; |
| | | import com.gitblit.wicket.WicketUtils; |
| | | import com.gitblit.wicket.panels.GravatarImage; |
| | | import com.gitblit.wicket.panels.LinkPanel; |
| | | |
| | | import org.apache.wicket.markup.html.basic.Label; |
| | | import org.apache.wicket.markup.html.list.ListItem; |
| | | import org.apache.wicket.markup.html.list.ListView; |
| | | import org.apache.wicket.markup.html.panel.Fragment; |
| | | import org.apache.wicket.markup.repeater.Item; |
| | | import org.apache.wicket.markup.repeater.data.DataView; |
| | | import org.apache.wicket.markup.repeater.data.IDataProvider; |
| | | import org.apache.wicket.markup.repeater.data.ListDataProvider; |
| | | import org.apache.wicket.model.IModel; |
| | | import org.apache.wicket.Component; |
| | | import org.apache.wicket.PageParameters; |
| | | |
| | | public class MyTicketsPage extends RootPage { |
| | | |
| | | public MyTicketsPage(PageParameters params) |
| | | { |
| | | this(); |
| | | } |
| | | |
| | | public MyTicketsPage() |
| | | { |
| | | this(null); |
| | | } |
| | | |
| | | public MyTicketsPage(PageParameters params) |
| | | { |
| | | super(); |
| | | setupPage("", ""); |
| | | setupPage("", getString("gb.mytickets")); |
| | | |
| | | UserModel currentUser = GitBlitWebSession.get().getUser(); |
| | | if (currentUser == null) { |
| | |
| | | } |
| | | String username = currentUser.getName(); |
| | | |
| | | // TODO - Recover the Welcome message |
| | | String message = "Welcome on GitBlit"; |
| | | this.add(new Label("myTicketsMessage", message)); |
| | | |
| | | Fragment fragment = new Fragment("headerContent", "ticketsHeader", this); |
| | | add(fragment); |
| | | QueryBuilder qb = QueryBuilder |
| | | .q(Lucene.createdby.matches(username)) |
| | | .or(Lucene.responsible.matches(username)) |
| | | .or(Lucene.watchedby.matches(username)); |
| | | |
| | | ITicketService tickets = GitBlitWebApp.get().tickets(); |
| | | List<TicketModel> returnedTickets = tickets.getTickets(null); |
| | | List<TicketModel> yourTickets = new ArrayList<TicketModel>(); |
| | | List<QueryResult> results = tickets.queryFor(qb.build(), 0, 0, Lucene.updated.name(), true); |
| | | |
| | | for(int i = 0; i < returnedTickets.size(); i++) |
| | | { |
| | | TicketModel ticket = returnedTickets.get(i); |
| | | if(ticket.isOpen()) |
| | | { |
| | | if(ticket.isResponsible(username) || ticket.isAuthor(username) |
| | | || ticket.isVoter(username) || ticket.isWatching(username)) |
| | | { |
| | | yourTickets.add(ticket); |
| | | } |
| | | } |
| | | } |
| | | final ListDataProvider<QueryResult> dp = new ListDataProvider<QueryResult>(results); |
| | | |
| | | final ListDataProvider<TicketModel> dp = new ListDataProvider<TicketModel>(yourTickets); |
| | | |
| | | DataView<TicketModel> dataView = new DataView<TicketModel>("row", dp) { |
| | | DataView<QueryResult> dataView = new DataView<QueryResult>("row", dp) { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @Override |
| | | protected void populateItem(Item<TicketModel> item) { |
| | | TicketModel ticketModel = item.getModelObject(); |
| | | RepositoryModel repository = app().repositories().getRepositoryModel(ticketModel.repository); |
| | | protected void populateItem(Item<QueryResult> item) { |
| | | QueryResult ticket = item.getModelObject(); |
| | | RepositoryModel repository = app().repositories().getRepositoryModel(ticket.repository); |
| | | |
| | | Fragment row = new Fragment("rowContent", "ticketRow", this); |
| | | item.add(row); |
| | | |
| | | Component swatch; |
| | | if(repository.isBare) |
| | | { |
| | | swatch = new Label("repositorySwatch", " ").setEscapeModelStrings(false); |
| | | } |
| | | else |
| | | { |
| | | swatch = new Label("repositorySwatch", "!"); |
| | | WicketUtils.setHtmlTooltip(swatch, getString("gb.workingCopyWarning")); |
| | | } |
| | | Component swatch = new Label("repositorySwatch", " ").setEscapeModelStrings(false); |
| | | WicketUtils.setCssBackground(swatch, repository.toString()); |
| | | row.add(swatch); |
| | | item.add(swatch); |
| | | |
| | | PageParameters pp = WicketUtils.newRepositoryParameter(repository.name); |
| | | Class<? extends BasePage> linkPage; |
| | | if (repository.hasCommits) { |
| | | // repository has content |
| | | linkPage = SummaryPage.class; |
| | | PageParameters rp = WicketUtils.newRepositoryParameter(ticket.repository); |
| | | PageParameters tp = WicketUtils.newObjectParameter(ticket.repository, "" + ticket.number); |
| | | item.add(new LinkPanel("repositoryName", "list", StringUtils.stripDotGit(ticket.repository), SummaryPage.class, rp)); |
| | | |
| | | item.add(getStateIcon("ticketIcon", ticket.type, ticket.status)); |
| | | item.add(new Label("ticketNumber", "" + ticket.number)); |
| | | item.add(new LinkPanel("ticketTitle", "list", ticket.title, TicketsPage.class, tp)); |
| | | |
| | | // votes indicator |
| | | Label v = new Label("ticketVotes", "" + ticket.votesCount); |
| | | WicketUtils.setHtmlTooltip(v, getString("gb.votes")); |
| | | item.add(v.setVisible(ticket.votesCount > 0)); |
| | | |
| | | Label ticketStatus = new Label("ticketStatus", ticket.status.toString()); |
| | | String statusClass = getStatusClass(ticket.status); |
| | | WicketUtils.setCssClass(ticketStatus, statusClass); |
| | | item.add(ticketStatus); |
| | | |
| | | UserModel responsible = app().users().getUserModel(ticket.responsible); |
| | | if (responsible == null) { |
| | | if (ticket.responsible == null) { |
| | | item.add(new Label("ticketResponsibleImg").setVisible(false)); |
| | | } else { |
| | | // new/empty repository OR proposed repository |
| | | linkPage = EmptyRepositoryPage.class; |
| | | item.add(new GravatarImage("ticketResponsibleImg", ticket.responsible, ticket.responsible, null, 16, true)); |
| | | } |
| | | |
| | | String ticketUrl = app().tickets().getTicketUrl(ticketModel); |
| | | |
| | | row.add(new LinkPanel("repositoryName", "list", repository.name, linkPage, pp)); |
| | | row.add(new LinkPanel("ticketName", "list", ticketModel.title, ticketUrl)); |
| | | row.add(new LinkPanel("ticketDescription", "list", ticketModel.body, ticketUrl)); |
| | | row.add(new Label("ticketResponsible", ticketModel.responsible)); |
| | | item.add(new Label("ticketResponsible", ticket.responsible)); |
| | | } else { |
| | | item.add(new GravatarImage("ticketResponsibleImg", responsible, null, 16, true)); |
| | | item.add(new LinkPanel("ticketResponsible", null, responsible.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(ticket.responsible))); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | add(dataView); |
| | | } |
| | | |
| | | protected Label getStateIcon(String wicketId, TicketModel ticket) { |
| | | return getStateIcon(wicketId, ticket.type, ticket.status); |
| | | } |
| | | |
| | | protected Label getStateIcon(String wicketId, Type type, Status state) { |
| | | Label label = new Label(wicketId); |
| | | if (type == null) { |
| | | type = Type.defaultType; |
| | | } |
| | | switch (type) { |
| | | case Proposal: |
| | | WicketUtils.setCssClass(label, "fa fa-code-fork"); |
| | | break; |
| | | case Bug: |
| | | WicketUtils.setCssClass(label, "fa fa-bug"); |
| | | break; |
| | | case Enhancement: |
| | | WicketUtils.setCssClass(label, "fa fa-magic"); |
| | | break; |
| | | case Question: |
| | | WicketUtils.setCssClass(label, "fa fa-question"); |
| | | break; |
| | | default: |
| | | // standard ticket |
| | | WicketUtils.setCssClass(label, "fa fa-ticket"); |
| | | } |
| | | WicketUtils.setHtmlTooltip(label, getTypeState(type, state)); |
| | | return label; |
| | | } |
| | | |
| | | protected String getTypeState(Type type, Status state) { |
| | | return state.toString() + " " + type.toString(); |
| | | } |
| | | |
| | | protected String getLozengeClass(Status status, boolean subtle) { |
| | | if (status == null) { |
| | | status = Status.New; |
| | | } |
| | | String css = ""; |
| | | switch (status) { |
| | | case Declined: |
| | | case Duplicate: |
| | | case Invalid: |
| | | case Wontfix: |
| | | case Abandoned: |
| | | css = "aui-lozenge-error"; |
| | | break; |
| | | case Fixed: |
| | | case Merged: |
| | | case Resolved: |
| | | css = "aui-lozenge-success"; |
| | | break; |
| | | case New: |
| | | css = "aui-lozenge-complete"; |
| | | break; |
| | | case On_Hold: |
| | | css = "aui-lozenge-current"; |
| | | break; |
| | | default: |
| | | css = ""; |
| | | break; |
| | | } |
| | | |
| | | return "aui-lozenge" + (subtle ? " aui-lozenge-subtle": "") + (css.isEmpty() ? "" : " ") + css; |
| | | } |
| | | |
| | | protected String getStatusClass(Status status) { |
| | | String css = ""; |
| | | switch (status) { |
| | | case Declined: |
| | | case Duplicate: |
| | | case Invalid: |
| | | case Wontfix: |
| | | case Abandoned: |
| | | css = "resolution-error"; |
| | | break; |
| | | case Fixed: |
| | | case Merged: |
| | | case Resolved: |
| | | css = "resolution-success"; |
| | | break; |
| | | case New: |
| | | css = "resolution-complete"; |
| | | break; |
| | | case On_Hold: |
| | | css = "resolution-current"; |
| | | break; |
| | | default: |
| | | css = ""; |
| | | break; |
| | | } |
| | | |
| | | return "resolution" + (css.isEmpty() ? "" : " ") + css; |
| | | } |
| | | } |