List of usage examples for org.apache.wicket.markup.repeater.data DataView DataView
protected DataView(String id, IDataProvider<T> dataProvider)
From source file:com.gitblit.wicket.pages.ProjectsPage.java
License:Apache License
private void setup(PageParameters params) { setupPage("", ""); // check to see if we should display a login message boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, true); if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) { add(new Label("projectsPanel")); return;//from www. j a v a 2 s .c o m } List<ProjectModel> projects = getProjects(params); Collections.sort(projects); ListDataProvider<ProjectModel> dp = new ListDataProvider<ProjectModel>(projects); DataView<ProjectModel> dataView = new DataView<ProjectModel>("project", dp) { private static final long serialVersionUID = 1L; int counter; @Override protected void onBeforeRender() { super.onBeforeRender(); counter = 0; } @Override public void populateItem(final Item<ProjectModel> item) { final ProjectModel entry = item.getModelObject(); PageParameters pp = WicketUtils.newProjectParameter(entry.name); item.add(new LinkPanel("projectTitle", "list", entry.getDisplayName(), ProjectPage.class, pp)); item.add(new LinkPanel("projectDescription", "list", entry.description, ProjectPage.class, pp)); item.add(new Label("repositoryCount", entry.repositories.size() + " " + (entry.repositories.size() == 1 ? getString("gb.repository") : getString("gb.repositories")))); String lastChange; if (entry.lastChange.getTime() == 0) { lastChange = "--"; } else { lastChange = getTimeUtils().timeAgo(entry.lastChange); } Label lastChangeLabel = new Label("projectLastChange", lastChange); item.add(lastChangeLabel); WicketUtils.setCssClass(lastChangeLabel, getTimeUtils().timeAgoCss(entry.lastChange)); WicketUtils.setAlternatingBackground(item, counter); counter++; } }; add(dataView); }
From source file:com.gitblit.wicket.pages.SummaryPage.java
License:Apache License
public SummaryPage(PageParameters params) { super(params); int numberCommits = app().settings().getInteger(Keys.web.summaryCommitCount, 20); if (numberCommits <= 0) { numberCommits = 20;/* w w w . jav a 2s . co m*/ } int numberRefs = app().settings().getInteger(Keys.web.summaryRefsCount, 5); Repository r = getRepository(); final RepositoryModel model = getRepositoryModel(); UserModel user = GitBlitWebSession.get().getUser(); if (user == null) { user = UserModel.ANONYMOUS; } List<Metric> metrics = null; Metric metricsTotal = null; if (!model.skipSummaryMetrics && app().settings().getBoolean(Keys.web.generateActivityGraph, true)) { metrics = app().repositories().getRepositoryDefaultMetrics(model, r); metricsTotal = metrics.remove(0); } addSyndicationDiscoveryLink(); // repository description add(new Label("repositoryDescription", getRepositoryModel().description)); // owner links final List<String> owners = new ArrayList<String>(getRepositoryModel().owners); ListDataProvider<String> ownersDp = new ListDataProvider<String>(owners); DataView<String> ownersView = new DataView<String>("repositoryOwners", ownersDp) { private static final long serialVersionUID = 1L; int counter = 0; @Override public void populateItem(final Item<String> item) { String ownername = item.getModelObject(); UserModel ownerModel = app().users().getUserModel(ownername); if (ownerModel != null) { item.add(new LinkPanel("owner", null, ownerModel.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(ownerModel.username)).setRenderBodyOnly(true)); } else { Label owner = new Label("owner", ownername); WicketUtils.setCssStyle(owner, "text-decoration: line-through;"); WicketUtils.setHtmlTooltip(owner, MessageFormat.format(getString("gb.failedToFindAccount"), ownername)); item.add(owner); } counter++; item.add(new Label("comma", ",").setVisible(counter < owners.size())); item.setRenderBodyOnly(true); } }; ownersView.setRenderBodyOnly(true); add(ownersView); add(WicketUtils.createTimestampLabel("repositoryLastChange", JGitUtils.getLastChange(r).when, getTimeZone(), getTimeUtils())); add(new Label("repositorySize", getRepositoryModel().size)); if (metricsTotal == null) { add(new Label("branchStats", "")); } else { add(new Label("branchStats", MessageFormat.format(getString("gb.branchStats"), metricsTotal.count, metricsTotal.tag, getTimeUtils().duration(metricsTotal.duration)))); } add(new BookmarkablePageLink<Void>("metrics", MetricsPage.class, WicketUtils.newRepositoryParameter(repositoryName))); add(new RepositoryUrlPanel("repositoryUrlPanel", false, user, model)); add(new LogPanel("commitsPanel", repositoryName, getRepositoryModel().HEAD, r, numberCommits, 0, getRepositoryModel().showRemoteBranches)); add(new TagsPanel("tagsPanel", repositoryName, r, numberRefs).hideIfEmpty()); add(new BranchesPanel("branchesPanel", getRepositoryModel(), r, numberRefs, false).hideIfEmpty()); if (app().settings().getBoolean(Keys.web.summaryShowReadme, false)) { // show a readme on the summary page MarkupDocument markupDoc = null; RevCommit head = JGitUtils.getCommit(r, null); if (head != null) { MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter()); markupDoc = processor.getReadme(r, repositoryName, getBestCommitId(head)); } if (markupDoc == null || markupDoc.markup == null) { add(new Label("readme").setVisible(false)); } else { Fragment fragment = new Fragment("readme", MarkupSyntax.PLAIN.equals(markupDoc.syntax) ? "plaintextPanel" : "markdownPanel", SummaryPage.this); fragment.add(new Label("readmeFile", markupDoc.documentPath)); // Add the html to the page Component content = new Label("readmeContent", markupDoc.html).setEscapeModelStrings(false); fragment.add(content.setVisible(!StringUtils.isEmpty(markupDoc.html))); add(fragment); } } else { // global, no readme on summary page add(new Label("readme").setVisible(false)); } if (metrics == null || metrics.isEmpty()) { add(new Label("commitsChart").setVisible(false)); } else { Charts charts = createCharts(metrics); add(charts); } }
From source file:com.gitblit.wicket.pages.TicketPage.java
License:Apache License
public TicketPage(PageParameters params) { super(params); final UserModel user = GitBlitWebSession.get().getUser() == null ? UserModel.ANONYMOUS : GitBlitWebSession.get().getUser(); final RepositoryModel repository = getRepositoryModel(); final String id = WicketUtils.getObject(params); long ticketId = Long.parseLong(id); ticket = app().tickets().getTicket(repository, ticketId); if (ticket == null) { // ticket not found throw new RestartResponseException(TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)); }/*from w w w .j a v a 2 s . c om*/ final List<Change> revisions = new ArrayList<Change>(); List<Change> comments = new ArrayList<Change>(); List<Change> statusChanges = new ArrayList<Change>(); List<Change> discussion = new ArrayList<Change>(); for (Change change : ticket.changes) { if (change.hasComment() || (change.isStatusChange() && (change.getStatus() != Status.New))) { discussion.add(change); } if (change.hasComment()) { comments.add(change); } if (change.hasPatchset()) { revisions.add(change); } if (change.isStatusChange() && !change.hasPatchset()) { statusChanges.add(change); } } final Change currentRevision = revisions.isEmpty() ? null : revisions.get(revisions.size() - 1); final Patchset currentPatchset = ticket.getCurrentPatchset(); /* * TICKET HEADER */ String href = urlFor(TicketsPage.class, params).toString(); add(new ExternalLink("ticketNumber", href, "#" + ticket.number)); Label headerStatus = new Label("headerStatus", ticket.status.toString()); WicketUtils.setCssClass(headerStatus, TicketsUI.getLozengeClass(ticket.status, false)); add(headerStatus); add(new Label("ticketTitle", ticket.title)); if (currentPatchset == null) { add(new Label("diffstat").setVisible(false)); } else { // calculate the current diffstat of the patchset add(new DiffStatPanel("diffstat", ticket.insertions, ticket.deletions)); } /* * TAB TITLES */ add(new Label("commentCount", "" + comments.size()).setVisible(!comments.isEmpty())); add(new Label("commitCount", "" + (currentPatchset == null ? 0 : currentPatchset.commits)) .setVisible(currentPatchset != null)); /* * TICKET AUTHOR and DATE (DISCUSSION TAB) */ UserModel createdBy = app().users().getUserModel(ticket.createdBy); if (createdBy == null) { add(new Label("whoCreated", ticket.createdBy)); } else { add(new LinkPanel("whoCreated", null, createdBy.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(createdBy.username))); } if (ticket.isProposal()) { // clearly indicate this is a change ticket add(new Label("creationMessage", getString("gb.proposedThisChange"))); } else { // standard ticket add(new Label("creationMessage", getString("gb.createdThisTicket"))); } String dateFormat = app().settings().getString(Keys.web.datestampLongFormat, "EEEE, MMMM d, yyyy"); String timestampFormat = app().settings().getString(Keys.web.datetimestampLongFormat, "EEEE, MMMM d, yyyy"); final TimeZone timezone = getTimeZone(); final DateFormat df = new SimpleDateFormat(dateFormat); df.setTimeZone(timezone); final DateFormat tsf = new SimpleDateFormat(timestampFormat); tsf.setTimeZone(timezone); final Calendar cal = Calendar.getInstance(timezone); String fuzzydate; TimeUtils tu = getTimeUtils(); Date createdDate = ticket.created; if (TimeUtils.isToday(createdDate, timezone)) { fuzzydate = tu.today(); } else if (TimeUtils.isYesterday(createdDate, timezone)) { fuzzydate = tu.yesterday(); } else { // calculate a fuzzy time ago date cal.setTime(createdDate); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); createdDate = cal.getTime(); fuzzydate = getTimeUtils().timeAgo(createdDate); } Label when = new Label("whenCreated", fuzzydate + ", " + df.format(createdDate)); WicketUtils.setHtmlTooltip(when, tsf.format(ticket.created)); add(when); String exportHref = urlFor(ExportTicketPage.class, params).toString(); add(new ExternalLink("exportJson", exportHref, "json")); /* * RESPONSIBLE (DISCUSSION TAB) */ if (StringUtils.isEmpty(ticket.responsible)) { add(new Label("responsible")); } else { UserModel responsible = app().users().getUserModel(ticket.responsible); if (responsible == null) { add(new Label("responsible", ticket.responsible)); } else { add(new LinkPanel("responsible", null, responsible.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(responsible.username))); } } /* * MILESTONE PROGRESS (DISCUSSION TAB) */ if (StringUtils.isEmpty(ticket.milestone)) { add(new Label("milestone")); } else { // link to milestone query TicketMilestone tm = app().tickets().getMilestone(repository, ticket.milestone); if (tm == null) { tm = new TicketMilestone(ticket.milestone); } PageParameters milestoneParameters; if (tm.isOpen()) { milestoneParameters = WicketUtils.newOpenTicketsParameter(repositoryName); } else { milestoneParameters = WicketUtils.newRepositoryParameter(repositoryName); } milestoneParameters.add(Lucene.milestone.name(), ticket.milestone); int progress = 0; int open = 0; int closed = 0; if (tm != null) { progress = tm.getProgress(); open = tm.getOpenTickets(); closed = tm.getClosedTickets(); } Fragment milestoneProgress = new Fragment("milestone", "milestoneProgressFragment", TicketPage.this); milestoneProgress .add(new LinkPanel("link", null, ticket.milestone, TicketsPage.class, milestoneParameters)); Label label = new Label("progress"); WicketUtils.setCssStyle(label, "width:" + progress + "%;"); milestoneProgress.add(label); WicketUtils.setHtmlTooltip(milestoneProgress, MessageFormat.format(getString("gb.milestoneProgress"), open, closed)); add(milestoneProgress); } /* * TICKET DESCRIPTION (DISCUSSION TAB) */ String desc; if (StringUtils.isEmpty(ticket.body)) { desc = getString("gb.noDescriptionGiven"); } else { String bugtraq = bugtraqProcessor().processText(getRepository(), repositoryName, ticket.body); String html = MarkdownUtils.transformGFM(app().settings(), bugtraq, ticket.repository); String safeHtml = app().xssFilter().relaxed(html); desc = safeHtml; } add(new Label("ticketDescription", desc).setEscapeModelStrings(false)); /* * PARTICIPANTS (DISCUSSION TAB) */ if (app().settings().getBoolean(Keys.web.allowGravatar, true)) { // gravatar allowed List<String> participants = ticket.getParticipants(); add(new Label("participantsLabel", MessageFormat.format( getString(participants.size() > 1 ? "gb.nParticipants" : "gb.oneParticipant"), "<b>" + participants.size() + "</b>")).setEscapeModelStrings(false)); ListDataProvider<String> participantsDp = new ListDataProvider<String>(participants); DataView<String> participantsView = new DataView<String>("participants", participantsDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<String> item) { String username = item.getModelObject(); UserModel user = app().users().getUserModel(username); if (user == null) { user = new UserModel(username); } item.add(new AvatarImage("participant", user.getDisplayName(), user.emailAddress, null, 25, true)); } }; add(participantsView); } else { // gravatar prohibited add(new Label("participantsLabel").setVisible(false)); add(new Label("participants").setVisible(false)); } /* * LARGE STATUS INDICATOR WITH ICON (DISCUSSION TAB->SIDE BAR) */ Fragment ticketStatus = new Fragment("ticketStatus", "ticketStatusFragment", TicketPage.this); Label ticketIcon = TicketsUI.getStateIcon("ticketIcon", ticket); ticketStatus.add(ticketIcon); ticketStatus.add(new Label("ticketStatus", ticket.status.toString())); WicketUtils.setCssClass(ticketStatus, TicketsUI.getLozengeClass(ticket.status, false)); add(ticketStatus); /* * UPDATE FORM (DISCUSSION TAB) */ if (user.canEdit(ticket, repository) && app().tickets().isAcceptingTicketUpdates(repository)) { if (user.canAdmin(ticket, repository) && ticket.isOpen()) { /* * OPEN TICKET */ Fragment controls = new Fragment("controls", "openControlsFragment", TicketPage.this); /* * 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)); } 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); redirectTo(TicketsPage.class, getPageParameters()); } }; String css = TicketsUI.getStatusClass(item.getModel().getObject()); WicketUtils.setCssClass(link, css); item.add(link); } }; controls.add(statusView); /* * RESPONSIBLE LIST */ Set<String> userlist = new TreeSet<String>(ticket.getParticipants()); if (UserModel.ANONYMOUS.canPush(getRepositoryModel()) || AuthorizationControl.AUTHENTICATED == getRepositoryModel().authorizationControl) { // authorization is ANONYMOUS or AUTHENTICATED (i.e. all users can be set responsible) userlist.addAll(app().users().getAllUsernames()); } else { // authorization is by NAMED users (users with PUSH permission can be set responsible) for (RegistrantAccessPermission rp : app().repositories() .getUserAccessPermissions(getRepositoryModel())) { if (rp.permission.atLeast(AccessPermission.PUSH)) { 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; @Override public void populateItem(final Item<TicketResponsible> item) { SimpleAjaxLink<TicketResponsible> link = new SimpleAjaxLink<TicketResponsible>("link", item.getModel()) { 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); redirectTo(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); redirectTo(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", TicketPage.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)); } /* * TICKET METADATA */ add(new Label("ticketType", ticket.type.toString())); add(new Label("priority", ticket.priority.toString())); add(new Label("severity", ticket.severity.toString())); if (StringUtils.isEmpty(ticket.topic)) { add(new Label("ticketTopic").setVisible(false)); } else { // process the topic using the bugtraq config to link things String topic = bugtraqProcessor().processText(getRepository(), repositoryName, ticket.topic); String safeTopic = app().xssFilter().relaxed(topic); add(new Label("ticketTopic", safeTopic).setEscapeModelStrings(false)); } /* * VOTERS */ List<String> voters = ticket.getVoters(); Label votersCount = new Label("votes", "" + voters.size()); if (voters.size() == 0) { WicketUtils.setCssClass(votersCount, "badge"); } else { WicketUtils.setCssClass(votersCount, "badge badge-info"); } add(votersCount); if (user.isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) { Model<String> model; if (ticket.isVoter(user.username)) { model = Model.of(getString("gb.removeVote")); } else { model = Model.of(MessageFormat.format(getString("gb.vote"), ticket.type.toString())); } SimpleAjaxLink<String> link = new SimpleAjaxLink<String>("voteLink", model) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { Change change = new Change(user.username); if (ticket.isVoter(user.username)) { change.unvote(user.username); } else { change.vote(user.username); } app().tickets().updateTicket(repository, ticket.number, change); redirectTo(TicketsPage.class, getPageParameters()); } }; add(link); } else { add(new Label("voteLink").setVisible(false)); } /* * WATCHERS */ List<String> watchers = ticket.getWatchers(); Label watchersCount = new Label("watchers", "" + watchers.size()); if (watchers.size() == 0) { WicketUtils.setCssClass(watchersCount, "badge"); } else { WicketUtils.setCssClass(watchersCount, "badge badge-info"); } add(watchersCount); if (user.isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) { Model<String> model; if (ticket.isWatching(user.username)) { model = Model.of(getString("gb.stopWatching")); } else { model = Model.of(MessageFormat.format(getString("gb.watch"), ticket.type.toString())); } SimpleAjaxLink<String> link = new SimpleAjaxLink<String>("watchLink", model) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { Change change = new Change(user.username); if (ticket.isWatching(user.username)) { change.unwatch(user.username); } else { change.watch(user.username); } app().tickets().updateTicket(repository, ticket.number, change); redirectTo(TicketsPage.class, getPageParameters()); } }; add(link); } else { add(new Label("watchLink").setVisible(false)); } /* * TOPIC & LABELS (DISCUSSION TAB->SIDE BAR) */ ListDataProvider<String> labelsDp = new ListDataProvider<String>(ticket.getLabels()); DataView<String> labelsView = new DataView<String>("labels", labelsDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<String> item) { final String value = item.getModelObject(); Label label = new Label("label", value); TicketLabel tLabel = app().tickets().getLabel(repository, value); String background = MessageFormat.format("background-color:{0};", tLabel.color); label.add(new AttributeModifier("style", background)); item.add(label); } }; add(labelsView); /* * COMMENTS & STATUS CHANGES (DISCUSSION TAB) */ if (comments.size() == 0) { add(new Label("discussion").setVisible(false)); } else { Fragment discussionFragment = new Fragment("discussion", "discussionFragment", TicketPage.this); ListDataProvider<Change> discussionDp = new ListDataProvider<Change>(discussion); DataView<Change> discussionView = new DataView<Change>("discussion", discussionDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<Change> item) { final Change entry = item.getModelObject(); if (entry.isMerge()) { /* * MERGE */ String resolvedBy = entry.getString(Field.mergeSha); // identify the merged patch, it is likely the last Patchset mergedPatch = null; for (Change c : revisions) { if (c.patchset.tip.equals(resolvedBy)) { mergedPatch = c.patchset; break; } } String commitLink; if (mergedPatch == null) { // shouldn't happen, but just-in-case int len = app().settings().getInteger(Keys.web.shortCommitIdLength, 6); commitLink = resolvedBy.substring(0, len); } else { // expected result commitLink = mergedPatch.toString(); } Fragment mergeFragment = new Fragment("entry", "mergeFragment", TicketPage.this); mergeFragment.add(new LinkPanel("commitLink", null, commitLink, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, resolvedBy))); mergeFragment.add(new Label("toBranch", MessageFormat.format(getString("gb.toBranch"), "<b>" + ticket.mergeTo + "</b>")) .setEscapeModelStrings(false)); addUserAttributions(mergeFragment, entry, 0); addDateAttributions(mergeFragment, entry); item.add(mergeFragment); } else if (entry.isStatusChange()) { /* * STATUS CHANGE */ Fragment frag = new Fragment("entry", "statusFragment", TicketPage.this); Label status = new Label("statusChange", entry.getStatus().toString()); String css = TicketsUI.getLozengeClass(entry.getStatus(), false); WicketUtils.setCssClass(status, css); frag.add(status); addUserAttributions(frag, entry, avatarWidth); addDateAttributions(frag, entry); item.add(frag); } else { /* * COMMENT */ String bugtraq = bugtraqProcessor().processText(getRepository(), repositoryName, entry.comment.text); String comment = MarkdownUtils.transformGFM(app().settings(), bugtraq, repositoryName); String safeComment = app().xssFilter().relaxed(comment); Fragment frag = new Fragment("entry", "commentFragment", TicketPage.this); Label commentIcon = new Label("commentIcon"); if (entry.comment.src == CommentSource.Email) { WicketUtils.setCssClass(commentIcon, "iconic-mail"); } else { WicketUtils.setCssClass(commentIcon, "iconic-comment-alt2-stroke"); } frag.add(commentIcon); frag.add(new Label("comment", safeComment).setEscapeModelStrings(false)); addUserAttributions(frag, entry, avatarWidth); addDateAttributions(frag, entry); item.add(frag); } } }; discussionFragment.add(discussionView); add(discussionFragment); } /* * ADD COMMENT PANEL */ if (UserModel.ANONYMOUS.equals(user) || !repository.isBare || repository.isFrozen || repository.isMirror) { // prohibit comments for anonymous users, local working copy repos, // frozen repos, and mirrors add(new Label("newComment").setVisible(false)); } else { // permit user to comment Fragment newComment = new Fragment("newComment", "newCommentFragment", TicketPage.this); AvatarImage img = new AvatarImage("newCommentAvatar", user.username, user.emailAddress, "gravatar-round", avatarWidth, true); newComment.add(img); CommentPanel commentPanel = new CommentPanel("commentPanel", user, ticket, null, TicketsPage.class); commentPanel.setRepository(repositoryName); newComment.add(commentPanel); add(newComment); } /* * PATCHSET TAB */ if (currentPatchset == null) { // no patchset available RepositoryUrl repoUrl = getRepositoryUrl(user, repository); boolean canPropose = repoUrl != null && repoUrl.hasPermission() && repoUrl.permission.atLeast(AccessPermission.CLONE) && !UserModel.ANONYMOUS.equals(user); if (ticket.isOpen() && app().tickets().isAcceptingNewPatchsets(repository) && canPropose) { // ticket & repo will accept a proposal patchset // show the instructions for proposing a patchset Fragment changeIdFrag = new Fragment("patchset", "proposeFragment", TicketPage.this); changeIdFrag.add(new Label("proposeInstructions", MarkdownUtils.transformMarkdown(getString("gb.proposeInstructions"))) .setEscapeModelStrings(false)); changeIdFrag .add(new Label("ptWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Barnum"))); changeIdFrag.add(new Label("ptWorkflowSteps", getProposeWorkflow("propose_pt.md", repoUrl.url, ticket.number)) .setEscapeModelStrings(false)); changeIdFrag .add(new Label("gitWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Git"))); changeIdFrag.add(new Label("gitWorkflowSteps", getProposeWorkflow("propose_git.md", repoUrl.url, ticket.number)) .setEscapeModelStrings(false)); add(changeIdFrag); } else { // explain why you can't propose a patchset Fragment fragment = new Fragment("patchset", "canNotProposeFragment", TicketPage.this); String reason = ""; if (ticket.isClosed()) { reason = getString("gb.ticketIsClosed"); } else if (repository.isMirror) { reason = getString("gb.repositoryIsMirror"); } else if (repository.isFrozen) { reason = getString("gb.repositoryIsFrozen"); } else if (!repository.acceptNewPatchsets) { reason = getString("gb.repositoryDoesNotAcceptPatchsets"); } else if (!canPropose) { if (UserModel.ANONYMOUS.equals(user)) { reason = getString("gb.anonymousCanNotPropose"); } else { reason = getString("gb.youDoNotHaveClonePermission"); } } else { reason = getString("gb.serverDoesNotAcceptPatchsets"); } fragment.add(new Label("reason", reason)); add(fragment); } } else { // show current patchset Fragment patchsetFrag = new Fragment("patchset", "patchsetFragment", TicketPage.this); patchsetFrag.add(new Label("commitsInPatchset", MessageFormat.format(getString("gb.commitsInPatchsetN"), currentPatchset.number))); patchsetFrag.add(createMergePanel(user, repository)); if (ticket.isOpen()) { // current revision MarkupContainer panel = createPatchsetPanel("panel", repository, user); patchsetFrag.add(panel); addUserAttributions(patchsetFrag, currentRevision, avatarWidth); addUserAttributions(panel, currentRevision, 0); addDateAttributions(panel, currentRevision); } else { // current revision patchsetFrag.add(new Label("panel").setVisible(false)); } // commits List<RevCommit> commits = JGitUtils.getRevLog(getRepository(), currentPatchset.base, currentPatchset.tip); ListDataProvider<RevCommit> commitsDp = new ListDataProvider<RevCommit>(commits); DataView<RevCommit> commitsView = new DataView<RevCommit>("commit", commitsDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<RevCommit> item) { RevCommit commit = item.getModelObject(); PersonIdent author = commit.getAuthorIdent(); item.add(new AvatarImage("authorAvatar", author.getName(), author.getEmailAddress(), null, 16, false)); item.add(new Label("author", commit.getAuthorIdent().getName())); item.add(new LinkPanel("commitId", null, getShortObjectId(commit.getName()), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, commit.getName()), true)); item.add(new LinkPanel("diff", "link", getString("gb.diff"), CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, commit.getName()), true)); item.add(new Label("title", StringUtils.trimString(commit.getShortMessage(), Constants.LEN_SHORTLOG_REFS))); item.add(WicketUtils.createDateLabel("commitDate", JGitUtils.getAuthorDate(commit), GitBlitWebSession.get().getTimezone(), getTimeUtils(), false)); item.add(new DiffStatPanel("commitDiffStat", 0, 0, true)); } }; patchsetFrag.add(commitsView); add(patchsetFrag); } /* * ACTIVITY TAB */ Fragment revisionHistory = new Fragment("activity", "activityFragment", TicketPage.this); List<Change> events = new ArrayList<Change>(ticket.changes); Collections.sort(events); Collections.reverse(events); ListDataProvider<Change> eventsDp = new ListDataProvider<Change>(events); DataView<Change> eventsView = new DataView<Change>("event", eventsDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<Change> item) { Change event = item.getModelObject(); addUserAttributions(item, event, 16); if (event.hasPatchset()) { // patchset Patchset patchset = event.patchset; String what; if (event.isStatusChange() && (Status.New == event.getStatus())) { what = getString("gb.proposedThisChange"); } else if (patchset.rev == 1) { what = MessageFormat.format(getString("gb.uploadedPatchsetN"), patchset.number); } else { if (patchset.added == 1) { what = getString("gb.addedOneCommit"); } else { what = MessageFormat.format(getString("gb.addedNCommits"), patchset.added); } } item.add(new Label("what", what)); LinkPanel psr = new LinkPanel("patchsetRevision", null, patchset.number + "-" + patchset.rev, ComparePage.class, WicketUtils.newRangeParameter(repositoryName, patchset.parent == null ? patchset.base : patchset.parent, patchset.tip), true); WicketUtils.setHtmlTooltip(psr, patchset.toString()); WicketUtils.setCssClass(psr, "aui-lozenge aui-lozenge-subtle"); item.add(psr); String typeCss = getPatchsetTypeCss(patchset.type); Label typeLabel = new Label("patchsetType", patchset.type.toString()); if (typeCss == null) { typeLabel.setVisible(false); } else { WicketUtils.setCssClass(typeLabel, typeCss); } item.add(typeLabel); Link<Void> deleteLink = createDeletePatchsetLink(repository, patchset); if (user.canDeleteRef(repository)) { item.add(deleteLink.setVisible(patchset.canDelete)); } else { item.add(deleteLink.setVisible(false)); } // show commit diffstat item.add(new DiffStatPanel("patchsetDiffStat", patchset.insertions, patchset.deletions, patchset.rev > 1)); } else if (event.hasComment()) { // comment item.add(new Label("what", getString("gb.commented"))); item.add(new Label("patchsetRevision").setVisible(false)); item.add(new Label("patchsetType").setVisible(false)); item.add(new Label("deleteRevision").setVisible(false)); item.add(new Label("patchsetDiffStat").setVisible(false)); } else if (event.hasReference()) { // reference switch (event.reference.getSourceType()) { case Commit: { final int shaLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6); item.add(new Label("what", getString("gb.referencedByCommit"))); LinkPanel psr = new LinkPanel("patchsetRevision", null, event.reference.toString().substring(0, shaLen), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, event.reference.toString()), true); WicketUtils.setHtmlTooltip(psr, event.reference.toString()); WicketUtils.setCssClass(psr, "ticketReference-commit shortsha1"); item.add(psr); } break; case Ticket: { final String text = MessageFormat.format("ticket/{0}", event.reference.ticketId); item.add(new Label("what", getString("gb.referencedByTicket"))); //NOTE: Ideally reference the exact comment using reference.toString, // however anchor hash is used and is escaped resulting in broken link LinkPanel psr = new LinkPanel("patchsetRevision", null, text, TicketsPage.class, WicketUtils.newObjectParameter(repositoryName, event.reference.ticketId.toString()), true); WicketUtils.setCssClass(psr, "ticketReference-comment"); item.add(psr); } break; default: { item.add(new Label("what").setVisible(false)); item.add(new Label("patchsetRevision").setVisible(false)); } } item.add(new Label("patchsetType").setVisible(false)); item.add(new Label("deleteRevision").setVisible(false)); item.add(new Label("patchsetDiffStat").setVisible(false)); } else if (event.hasReview()) { // review String score; switch (event.review.score) { case approved: score = "<span style='color:darkGreen'>" + getScoreDescription(event.review.score) + "</span>"; break; case vetoed: score = "<span style='color:darkRed'>" + getScoreDescription(event.review.score) + "</span>"; break; default: score = getScoreDescription(event.review.score); } item.add(new Label("what", MessageFormat.format(getString("gb.reviewedPatchsetRev"), event.review.patchset, event.review.rev, score)).setEscapeModelStrings(false)); item.add(new Label("patchsetRevision").setVisible(false)); item.add(new Label("patchsetType").setVisible(false)); item.add(new Label("deleteRevision").setVisible(false)); item.add(new Label("patchsetDiffStat").setVisible(false)); } else { // field change item.add(new Label("patchsetRevision").setVisible(false)); item.add(new Label("patchsetType").setVisible(false)); item.add(new Label("deleteRevision").setVisible(false)); item.add(new Label("patchsetDiffStat").setVisible(false)); String what = ""; if (event.isStatusChange()) { switch (event.getStatus()) { case New: if (ticket.isProposal()) { what = getString("gb.proposedThisChange"); } else { what = getString("gb.createdThisTicket"); } break; default: break; } } item.add(new Label("what", what).setVisible(what.length() > 0)); } addDateAttributions(item, event); if (event.hasFieldChanges()) { StringBuilder sb = new StringBuilder(); sb.append("<table class=\"summary\"><tbody>"); for (Map.Entry<Field, String> entry : event.fields.entrySet()) { String value; switch (entry.getKey()) { case body: String body = entry.getValue(); if (event.isStatusChange() && Status.New == event.getStatus() && StringUtils.isEmpty(body)) { // ignore initial empty description continue; } // trim body changes if (StringUtils.isEmpty(body)) { value = "<i>" + ESC_NIL + "</i>"; } else { value = StringUtils.trimString(body, Constants.LEN_SHORTLOG_REFS); } break; case status: // special handling for status Status status = event.getStatus(); String css = TicketsUI.getLozengeClass(status, true); value = String.format("<span class=\"%1$s\">%2$s</span>", css, status.toString()); break; default: value = StringUtils.isEmpty(entry.getValue()) ? ("<i>" + ESC_NIL + "</i>") : StringUtils.escapeForHtml(entry.getValue(), false); break; } sb.append("<tr><th style=\"width:70px;\">"); try { sb.append(getString("gb." + entry.getKey().name())); } catch (Exception e) { sb.append(entry.getKey().name()); } sb.append("</th><td>"); sb.append(value); sb.append("</td></tr>"); } sb.append("</tbody></table>"); String safeHtml = app().xssFilter().relaxed(sb.toString()); item.add(new Label("fields", safeHtml).setEscapeModelStrings(false)); } else { item.add(new Label("fields").setVisible(false)); } } }; revisionHistory.add(eventsView); add(revisionHistory); }
From source file:com.gitblit.wicket.pages.TicketPage.java
License:Apache License
protected Fragment createPatchsetPanel(String wicketId, RepositoryModel repository, UserModel user) { final Patchset currentPatchset = ticket.getCurrentPatchset(); List<Patchset> patchsets = new ArrayList<Patchset>(ticket.getPatchsetRevisions(currentPatchset.number)); patchsets.remove(currentPatchset);/*from w w w.j a v a2 s .com*/ Collections.reverse(patchsets); Fragment panel = new Fragment(wicketId, "collapsiblePatchsetFragment", TicketPage.this); // patchset header String ps = "<b>" + currentPatchset.number + "</b>"; if (currentPatchset.rev == 1) { panel.add(new Label("uploadedWhat", MessageFormat.format(getString("gb.uploadedPatchsetN"), ps)) .setEscapeModelStrings(false)); } else { String rev = "<b>" + currentPatchset.rev + "</b>"; panel.add(new Label("uploadedWhat", MessageFormat.format(getString("gb.uploadedPatchsetNRevisionN"), ps, rev)) .setEscapeModelStrings(false)); } panel.add(new LinkPanel("patchId", null, "rev " + currentPatchset.rev, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, currentPatchset.tip), true)); // compare menu panel.add(new LinkPanel("compareMergeBase", null, getString("gb.compareToMergeBase"), ComparePage.class, WicketUtils.newRangeParameter(repositoryName, currentPatchset.base, currentPatchset.tip), true)); ListDataProvider<Patchset> compareMenuDp = new ListDataProvider<Patchset>(patchsets); DataView<Patchset> compareMenu = new DataView<Patchset>("comparePatch", compareMenuDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<Patchset> item) { Patchset patchset = item.getModelObject(); LinkPanel link = new LinkPanel("compareLink", null, MessageFormat.format(getString("gb.compareToN"), patchset.number + "-" + patchset.rev), ComparePage.class, WicketUtils.newRangeParameter(getRepositoryModel().name, patchset.tip, currentPatchset.tip), true); item.add(link); } }; panel.add(compareMenu); // reviews List<Change> reviews = ticket.getReviews(currentPatchset); ListDataProvider<Change> reviewsDp = new ListDataProvider<Change>(reviews); DataView<Change> reviewsView = new DataView<Change>("reviews", reviewsDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<Change> item) { Change change = item.getModelObject(); final String username = change.author; UserModel user = app().users().getUserModel(username); if (user == null) { item.add(new Label("reviewer", username)); } else { item.add(new LinkPanel("reviewer", null, user.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(username))); } // indicate review score Review review = change.review; Label scoreLabel = new Label("score"); String scoreClass = getScoreClass(review.score); String tooltip = getScoreDescription(review.score); WicketUtils.setCssClass(scoreLabel, scoreClass); if (!StringUtils.isEmpty(tooltip)) { WicketUtils.setHtmlTooltip(scoreLabel, tooltip); } item.add(scoreLabel); } }; panel.add(reviewsView); if (ticket.isOpen() && user.canReviewPatchset(repository) && app().tickets().isAcceptingTicketUpdates(repository)) { // can only review open tickets Review myReview = null; for (Change change : ticket.getReviews(currentPatchset)) { if (change.author.equals(user.username)) { myReview = change.review; } } // user can review, add review controls Fragment reviewControls = new Fragment("reviewControls", "reviewControlsFragment", TicketPage.this); // show "approve" button if no review OR not current score if (user.canApprovePatchset(repository) && (myReview == null || Score.approved != myReview.score)) { reviewControls.add(createReviewLink("approveLink", Score.approved)); } else { reviewControls.add(new Label("approveLink").setVisible(false)); } // show "looks good" button if no review OR not current score if (myReview == null || Score.looks_good != myReview.score) { reviewControls.add(createReviewLink("looksGoodLink", Score.looks_good)); } else { reviewControls.add(new Label("looksGoodLink").setVisible(false)); } // show "needs improvement" button if no review OR not current score if (myReview == null || Score.needs_improvement != myReview.score) { reviewControls.add(createReviewLink("needsImprovementLink", Score.needs_improvement)); } else { reviewControls.add(new Label("needsImprovementLink").setVisible(false)); } // show "veto" button if no review OR not current score if (user.canVetoPatchset(repository) && (myReview == null || Score.vetoed != myReview.score)) { reviewControls.add(createReviewLink("vetoLink", Score.vetoed)); } else { reviewControls.add(new Label("vetoLink").setVisible(false)); } panel.add(reviewControls); } else { // user can not review panel.add(new Label("reviewControls").setVisible(false)); } String insertions = MessageFormat.format("<span style=\"color:darkGreen;font-weight:bold;\">+{0}</span>", ticket.insertions); String deletions = MessageFormat.format("<span style=\"color:darkRed;font-weight:bold;\">-{0}</span>", ticket.deletions); panel.add(new Label("patchsetStat", MessageFormat .format(StringUtils.escapeForHtml(getString("gb.diffStat"), false), insertions, deletions)) .setEscapeModelStrings(false)); // changed paths list List<PathChangeModel> paths = JGitUtils.getFilesInRange(getRepository(), currentPatchset.base, currentPatchset.tip); ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths); DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) { private static final long serialVersionUID = 1L; int counter; @Override public void populateItem(final Item<PathChangeModel> item) { final PathChangeModel entry = item.getModelObject(); Label changeType = new Label("changeType", ""); WicketUtils.setChangeTypeCssClass(changeType, entry.changeType); setChangeTypeTooltip(changeType, entry.changeType); item.add(changeType); boolean hasSubmodule = false; String submodulePath = null; if (entry.isTree()) { // tree item.add(new LinkPanel("pathName", null, entry.path, TreePage.class, WicketUtils.newPathParameter(repositoryName, currentPatchset.tip, entry.path), true)); item.add(new Label("diffStat").setVisible(false)); } else if (entry.isSubmodule()) { // submodule String submoduleId = entry.objectId; SubmoduleModel submodule = getSubmodule(entry.path); submodulePath = submodule.gitblitPath; hasSubmodule = submodule.hasSubmodule; item.add(new LinkPanel("pathName", "list", entry.path + " @ " + getShortObjectId(submoduleId), TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, ""), true) .setEnabled(hasSubmodule)); item.add(new Label("diffStat").setVisible(false)); } else { // blob String displayPath = entry.path; String path = entry.path; if (entry.isSymlink()) { RevCommit commit = JGitUtils.getCommit(getRepository(), PatchsetCommand.getTicketBranch(ticket.number)); path = JGitUtils.getStringContent(getRepository(), commit.getTree(), path); displayPath = entry.path + " -> " + path; } if (entry.changeType.equals(ChangeType.ADD)) { // add show view item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class, WicketUtils.newPathParameter(repositoryName, currentPatchset.tip, path), true)); } else if (entry.changeType.equals(ChangeType.DELETE)) { // delete, show label item.add(new Label("pathName", displayPath)); } else { // mod, show diff item.add(new LinkPanel("pathName", "list", displayPath, BlobDiffPage.class, WicketUtils.newPathParameter(repositoryName, currentPatchset.tip, path), true)); } item.add(new DiffStatPanel("diffStat", entry.insertions, entry.deletions, true)); } // quick links if (entry.isSubmodule()) { // submodule item.add(setNewTarget(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))) .setEnabled(!entry.changeType.equals(ChangeType.ADD))); item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils.newObjectParameter(submodulePath, entry.objectId)) .setEnabled(hasSubmodule)); } else { // tree or blob item.add(setNewTarget(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class, WicketUtils.newBlobDiffParameter(repositoryName, currentPatchset.base, currentPatchset.tip, entry.path))) .setEnabled(!entry.changeType.equals(ChangeType.ADD) && !entry.changeType.equals(ChangeType.DELETE))); item.add(setNewTarget(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, currentPatchset.tip, entry.path))) .setEnabled(!entry.changeType.equals(ChangeType.DELETE))); } WicketUtils.setAlternatingBackground(item, counter); counter++; } }; panel.add(pathsView); addPtCheckoutInstructions(user, repository, panel); addGitCheckoutInstructions(user, repository, panel); return panel; }
From source file:com.gitblit.wicket.pages.TicketsPage.java
License:Apache License
public TicketsPage(PageParameters params) { super(params); if (!app().tickets().isReady()) { // tickets prohibited setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)); } else if (!app().tickets().hasTickets(getRepositoryModel())) { // no tickets for this repository setResponsePage(NoTicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)); } else {/* w ww . ja v a 2 s.c om*/ String id = WicketUtils.getObject(params); if (id != null) { // view the ticket with the TicketPage setResponsePage(TicketPage.class, params); } } // set stateless page preference setStatelessHint(true); any = new TicketResponsible(getString("gb.any"), "[* TO *]", null); UserModel user = GitBlitWebSession.get().getUser(); boolean isAuthenticated = user != null && user.isAuthenticated; final String[] statiiParam = (String[]) params.getValues(Lucene.status.name()).stream() .map(StringValue::toString).toArray(); final String assignedToParam = params.get(Lucene.responsible.name()).toString(null); final String milestoneParam = params.get(Lucene.milestone.name()).toString(null); final String queryParam = params.get("q").toString(null); final String searchParam = params.get("s").toString(null); final String sortBy = Lucene.fromString(params.get("sort").toString(Lucene.created.name())).name(); final boolean desc = !"asc".equals(params.get("direction").toString("desc")); // add search form add(new TicketSearchForm("ticketSearchForm", repositoryName, searchParam, getClass(), params)); final String activeQuery; if (!StringUtils.isEmpty(searchParam)) { activeQuery = searchParam; } else if (StringUtils.isEmpty(queryParam)) { activeQuery = ""; } else { activeQuery = queryParam; } // build Lucene query from defaults and request parameters QueryBuilder qb = new QueryBuilder(queryParam); if (!qb.containsField(Lucene.rid.name())) { // specify the repository qb.and(Lucene.rid.matches(getRepositoryModel().getRID())); } if (!qb.containsField(Lucene.responsible.name())) { // specify the responsible qb.and(Lucene.responsible.matches(assignedToParam)); } if (!qb.containsField(Lucene.milestone.name())) { // specify the milestone qb.and(Lucene.milestone.matches(milestoneParam)); } if (!qb.containsField(Lucene.status.name()) && !ArrayUtils.isEmpty(statiiParam)) { // specify the states boolean not = false; QueryBuilder q = new QueryBuilder(); for (String state : statiiParam) { if (state.charAt(0) == '!') { not = true; q.and(Lucene.status.doesNotMatch(state.substring(1))); } else { q.or(Lucene.status.matches(state)); } } if (not) { qb.and(q.toString()); } else { qb.and(q.toSubquery().toString()); } } final String luceneQuery = qb.build(); // open milestones List<TicketMilestone> milestones = app().tickets().getMilestones(getRepositoryModel(), Status.Open); TicketMilestone currentMilestone = null; if (!StringUtils.isEmpty(milestoneParam)) { for (TicketMilestone tm : milestones) { if (tm.name.equals(milestoneParam)) { // get the milestone (queries the index) currentMilestone = app().tickets().getMilestone(getRepositoryModel(), milestoneParam); break; } } 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); } } Fragment milestonePanel; if (currentMilestone == null) { milestonePanel = new Fragment("milestonePanel", "noMilestoneFragment", TicketsPage.this); add(milestonePanel); } else { milestonePanel = new Fragment("milestonePanel", "milestoneProgressFragment", TicketsPage.this); milestonePanel.add(new Label("currentMilestone", currentMilestone.name)); if (currentMilestone.due == null) { milestonePanel.add(new Label("currentDueDate", getString("gb.notSpecified"))); } else { milestonePanel.add(WicketUtils.createDateLabel("currentDueDate", currentMilestone.due, GitBlitWebSession.get().getTimezone(), getTimeUtils(), false)); } Label label = new Label("progress"); WicketUtils.setCssStyle(label, "width:" + currentMilestone.getProgress() + "%;"); milestonePanel.add(label); milestonePanel.add(new LinkPanel("openTickets", null, MessageFormat.format(getString("gb.nOpenTickets"), currentMilestone.getOpenTickets()), TicketsPage.class, queryParameters(null, currentMilestone.name, TicketsUI.openStatii, null, sortBy, desc, 1))); milestonePanel.add(new LinkPanel("closedTickets", null, MessageFormat.format(getString("gb.nClosedTickets"), currentMilestone.getClosedTickets()), TicketsPage.class, queryParameters(null, currentMilestone.name, TicketsUI.closedStatii, null, sortBy, desc, 1))); milestonePanel.add(new Label("totalTickets", MessageFormat.format(getString("gb.nTotalTickets"), currentMilestone.getTotalTickets()))); add(milestonePanel); } Fragment milestoneDropdown = new Fragment("milestoneDropdown", "milestoneDropdownFragment", TicketsPage.this); PageParameters resetMilestone = queryParameters(queryParam, null, statiiParam, assignedToParam, sortBy, desc, 1); milestoneDropdown.add(new BookmarkablePageLink<Void>("resetMilestone", TicketsPage.class, resetMilestone)); ListDataProvider<TicketMilestone> milestonesDp = new ListDataProvider<TicketMilestone>(milestones); DataView<TicketMilestone> milestonesMenu = new DataView<TicketMilestone>("milestone", milestonesDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<TicketMilestone> item) { final TicketMilestone tm = item.getModelObject(); PageParameters params = queryParameters(queryParam, tm.name, statiiParam, assignedToParam, sortBy, desc, 1); item.add(new LinkPanel("milestoneLink", null, tm.name, TicketsPage.class, params) .setRenderBodyOnly(true)); } }; milestoneDropdown.add(milestonesMenu); milestonePanel.add(milestoneDropdown); // search or query tickets int page = Math.max(1, WicketUtils.getPage(params)); int pageSize = app().settings().getInteger(Keys.tickets.perPage, 25); List<QueryResult> results; if (StringUtils.isEmpty(searchParam)) { results = app().tickets().queryFor(luceneQuery, page, pageSize, sortBy, desc); } else { results = app().tickets().searchFor(getRepositoryModel(), searchParam, page, pageSize); } int totalResults = results.size() == 0 ? 0 : results.get(0).totalResults; // standard queries add(new BookmarkablePageLink<Void>("changesQuery", TicketsPage.class, queryParameters(Lucene.type.matches(TicketModel.Type.Proposal.name()), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("bugsQuery", TicketsPage.class, queryParameters(Lucene.type.matches(TicketModel.Type.Bug.name()), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("enhancementsQuery", TicketsPage.class, queryParameters(Lucene.type.matches(TicketModel.Type.Enhancement.name()), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("tasksQuery", TicketsPage.class, queryParameters(Lucene.type.matches(TicketModel.Type.Task.name()), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("questionsQuery", TicketsPage.class, queryParameters(Lucene.type.matches(TicketModel.Type.Question.name()), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("maintenanceQuery", TicketsPage.class, queryParameters(Lucene.type.matches(TicketModel.Type.Maintenance.name()), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("resetQuery", TicketsPage.class, queryParameters(null, milestoneParam, TicketsUI.openStatii, null, null, true, 1))); if (isAuthenticated) { add(new Label("userDivider")); add(new BookmarkablePageLink<Void>("createdQuery", TicketsPage.class, queryParameters(Lucene.createdby.matches(user.username), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("watchedQuery", TicketsPage.class, queryParameters(Lucene.watchedby.matches(user.username), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("mentionsQuery", TicketsPage.class, queryParameters(Lucene.mentions.matches(user.username), milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1))); } else { add(new Label("userDivider").setVisible(false)); add(new Label("createdQuery").setVisible(false)); add(new Label("watchedQuery").setVisible(false)); add(new Label("mentionsQuery").setVisible(false)); } Set<TicketQuery> dynamicQueries = new TreeSet<TicketQuery>(); for (TicketLabel label : app().tickets().getLabels(getRepositoryModel())) { String q = QueryBuilder.q(Lucene.labels.matches(label.name)).build(); dynamicQueries.add(new TicketQuery(label.name, q).color(label.color)); } for (QueryResult ticket : results) { if (!StringUtils.isEmpty(ticket.topic)) { String q = QueryBuilder.q(Lucene.topic.matches(ticket.topic)).build(); dynamicQueries.add(new TicketQuery(ticket.topic, q)); } if (!ArrayUtils.isEmpty(ticket.labels)) { for (String label : ticket.labels) { String q = QueryBuilder.q(Lucene.labels.matches(label)).build(); dynamicQueries.add(new TicketQuery(label, q)); } } } if (dynamicQueries.size() == 0) { add(new Label("dynamicQueries").setVisible(false)); } else { Fragment fragment = new Fragment("dynamicQueries", "dynamicQueriesFragment", TicketsPage.this); ListDataProvider<TicketQuery> dynamicQueriesDp = new ListDataProvider<TicketQuery>( new ArrayList<TicketQuery>(dynamicQueries)); DataView<TicketQuery> dynamicQueriesList = new DataView<TicketQuery>("dynamicQuery", dynamicQueriesDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<TicketQuery> item) { final TicketQuery tq = item.getModelObject(); Component swatch = new Label("swatch", " ").setEscapeModelStrings(false); if (StringUtils.isEmpty(tq.color)) { // calculate a color tq.color = StringUtils.getColor(tq.name); } String background = MessageFormat.format("background-color:{0};", tq.color); swatch.add(new AttributeModifier("style", background)); item.add(swatch); if (activeQuery.contains(tq.query)) { // selected String q = QueryBuilder.q(activeQuery).remove(tq.query).build(); PageParameters params = queryParameters(q, milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1); item.add(new LinkPanel("link", "active", tq.name, TicketsPage.class, params) .setRenderBodyOnly(true)); Label checked = new Label("checked"); WicketUtils.setCssClass(checked, "iconic-o-x"); item.add(checked); item.add(new AttributeModifier("style", background)); } else { // unselected String q = QueryBuilder.q(queryParam).toSubquery().and(tq.query).build(); PageParameters params = queryParameters(q, milestoneParam, statiiParam, assignedToParam, sortBy, desc, 1); item.add(new LinkPanel("link", null, tq.name, TicketsPage.class, params) .setRenderBodyOnly(true)); item.add(new Label("checked").setVisible(false)); } } }; fragment.add(dynamicQueriesList); add(fragment); } // states if (ArrayUtils.isEmpty(statiiParam)) { add(new Label("selectedStatii", getString("gb.all"))); } else { add(new Label("selectedStatii", StringUtils.flattenStrings(Arrays.asList(statiiParam), ","))); } add(new BookmarkablePageLink<Void>("openTickets", TicketsPage.class, queryParameters(queryParam, milestoneParam, TicketsUI.openStatii, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("closedTickets", TicketsPage.class, queryParameters(queryParam, milestoneParam, TicketsUI.closedStatii, assignedToParam, sortBy, desc, 1))); add(new BookmarkablePageLink<Void>("allTickets", TicketsPage.class, queryParameters(queryParam, milestoneParam, null, assignedToParam, sortBy, desc, 1))); // by status 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; @Override public void populateItem(final Item<Status> item) { final Status status = item.getModelObject(); PageParameters p = queryParameters(queryParam, milestoneParam, new String[] { status.name().toLowerCase() }, assignedToParam, sortBy, desc, 1); String css = TicketsUI.getStatusClass(status); item.add(new LinkPanel("statusLink", css, status.toString(), TicketsPage.class, p) .setRenderBodyOnly(true)); } }; add(statiiLinks); // responsible filter List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>(); for (RegistrantAccessPermission perm : app().repositories() .getUserAccessPermissions(getRepositoryModel())) { if (perm.permission.atLeast(AccessPermission.PUSH)) { UserModel u = app().users().getUserModel(perm.registrant); responsibles.add(new TicketResponsible(u)); } } Collections.sort(responsibles); responsibles.add(0, any); TicketResponsible currentResponsible = null; for (TicketResponsible u : responsibles) { if (u.username.equals(assignedToParam)) { currentResponsible = u; break; } } add(new Label("currentResponsible", currentResponsible == null ? "" : currentResponsible.displayname)); ListDataProvider<TicketResponsible> responsibleDp = new ListDataProvider<TicketResponsible>(responsibles); DataView<TicketResponsible> responsibleMenu = new DataView<TicketResponsible>("responsible", responsibleDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<TicketResponsible> item) { final TicketResponsible u = item.getModelObject(); PageParameters params = queryParameters(queryParam, milestoneParam, statiiParam, u.username, sortBy, desc, 1); item.add(new LinkPanel("responsibleLink", null, u.displayname, TicketsPage.class, params) .setRenderBodyOnly(true)); } }; add(responsibleMenu); PageParameters resetResponsibleParams = queryParameters(queryParam, milestoneParam, statiiParam, null, sortBy, desc, 1); add(new BookmarkablePageLink<Void>("resetResponsible", TicketsPage.class, resetResponsibleParams)); List<TicketSort> sortChoices = new ArrayList<TicketSort>(); sortChoices.add(new TicketSort(getString("gb.sortNewest"), Lucene.created.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortOldest"), Lucene.created.name(), false)); sortChoices.add(new TicketSort(getString("gb.sortMostRecentlyUpdated"), Lucene.updated.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortLeastRecentlyUpdated"), Lucene.updated.name(), false)); sortChoices.add(new TicketSort(getString("gb.sortMostComments"), Lucene.comments.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortLeastComments"), Lucene.comments.name(), false)); sortChoices.add(new TicketSort(getString("gb.sortMostPatchsetRevisions"), Lucene.patchsets.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortLeastPatchsetRevisions"), Lucene.patchsets.name(), false)); sortChoices.add(new TicketSort(getString("gb.sortMostVotes"), Lucene.votes.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortLeastVotes"), Lucene.votes.name(), false)); sortChoices.add(new TicketSort(getString("gb.sortHighestPriority"), Lucene.priority.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortLowestPriority"), Lucene.priority.name(), false)); sortChoices.add(new TicketSort(getString("gb.sortHighestSeverity"), Lucene.severity.name(), true)); sortChoices.add(new TicketSort(getString("gb.sortLowestSeverity"), Lucene.severity.name(), false)); TicketSort currentSort = sortChoices.get(0); for (TicketSort ts : sortChoices) { if (ts.sortBy.equals(sortBy) && desc == ts.desc) { currentSort = ts; break; } } add(new Label("currentSort", currentSort.name)); ListDataProvider<TicketSort> sortChoicesDp = new ListDataProvider<TicketSort>(sortChoices); DataView<TicketSort> sortMenu = new DataView<TicketSort>("sort", sortChoicesDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<TicketSort> item) { final TicketSort ts = item.getModelObject(); PageParameters params = queryParameters(queryParam, milestoneParam, statiiParam, assignedToParam, ts.sortBy, ts.desc, 1); item.add(new LinkPanel("sortLink", null, ts.name, TicketsPage.class, params) .setRenderBodyOnly(true)); } }; add(sortMenu); // paging links buildPager(queryParam, milestoneParam, statiiParam, assignedToParam, sortBy, desc, page, pageSize, results.size(), totalResults); add(new TicketListPanel("ticketList", results, false, false)); // 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); }
From source file:com.gitblit.wicket.pages.TicketsPage.java
License:Apache License
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//w w w . j a v a 2 s . co m public void populateItem(final Item<TicketMilestone> item) { Fragment entryPanel = new Fragment("entryPanel", "milestoneListFragment", TicketsPage.this); item.add(entryPanel); final TicketMilestone tm = item.getModelObject(); String[] states; if (tm.isOpen()) { states = TicketsUI.openStatii; } else { states = TicketsUI.closedStatii; } PageParameters params = queryParameters(null, tm.name, states, 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", TicketsPage.this); Label label = new Label("progress"); WicketUtils.setCssStyle(label, "width:" + m.getProgress() + "%;"); milestonePanel.add(label); milestonePanel.add(new LinkPanel("openTickets", null, MessageFormat.format(getString("gb.nOpenTickets"), m.getOpenTickets()), TicketsPage.class, queryParameters(null, tm.name, TicketsUI.openStatii, null, null, true, 1))); milestonePanel.add(new LinkPanel("closedTickets", null, MessageFormat.format(getString("gb.nClosedTickets"), m.getClosedTickets()), TicketsPage.class, queryParameters(null, tm.name, TicketsUI.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)); } } }; return milestonesList; }
From source file:com.gitblit.wicket.pages.TicketsPage.java
License:Apache License
protected void buildPager(final String query, final String milestone, final String[] states, final String assignedTo, final String sort, final boolean desc, final int page, int pageSize, int count, int total) { boolean showNav = total > (2 * pageSize); boolean allowPrev = page > 1; boolean allowNext = (pageSize * (page - 1) + count) < total; add(new BookmarkablePageLink<Void>("prevLink", TicketsPage.class, queryParameters(query, milestone, states, assignedTo, sort, desc, page - 1)).setEnabled(allowPrev) .setVisible(showNav)); add(new BookmarkablePageLink<Void>("nextLink", TicketsPage.class, queryParameters(query, milestone, states, assignedTo, sort, desc, page + 1)).setEnabled(allowNext) .setVisible(showNav)); if (total <= pageSize) { add(new Label("pageLink").setVisible(false)); return;//from ww w .jav a 2 s . co m } // determine page numbers to display int pages = count == 0 ? 0 : ((total / pageSize) + (total % pageSize == 0 ? 0 : 1)); // preferred number of pagelinks int segments = 5; if (pages < segments) { // not enough data for preferred number of page links segments = pages; } int minpage = Math.min(Math.max(1, page - 2), pages - (segments - 1)); int maxpage = Math.min(pages, minpage + (segments - 1)); List<Integer> sequence = new ArrayList<Integer>(); for (int i = minpage; i <= maxpage; i++) { sequence.add(i); } ListDataProvider<Integer> pagesDp = new ListDataProvider<Integer>(sequence); DataView<Integer> pagesView = new DataView<Integer>("pageLink", pagesDp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<Integer> item) { final Integer i = item.getModelObject(); LinkPanel link = new LinkPanel("page", null, "" + i, TicketsPage.class, queryParameters(query, milestone, states, assignedTo, sort, desc, i)); link.setRenderBodyOnly(true); if (i == page) { WicketUtils.setCssClass(item, "active"); } item.add(link); } }; add(pagesView); }
From source file:com.gitblit.wicket.pages.TreePage.java
License:Apache License
public TreePage(PageParameters params) { super(params); final String path = WicketUtils.getPath(params); Repository r = getRepository();// w w w . j a va 2 s . c om RevCommit commit = getCommit(); List<PathModel> paths = JGitUtils.getFilesInPath2(r, path, commit); // tree page links add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path))); add(new CompressedDownloadsPanel("compressedLinks", GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), repositoryName, objectId, path)); add(new CommitHeaderPanel("commitHeader", repositoryName, commit)); // breadcrumbs add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, path, objectId)); if (path != null && path.trim().length() > 0) { // add .. parent path entry String parentPath = null; if (path.lastIndexOf('/') > -1) { parentPath = path.substring(0, path.lastIndexOf('/')); } PathModel model = new PathModel("..", parentPath, null, 0, FileMode.TREE.getBits(), null, objectId); model.isParentPath = true; paths.add(0, model); } final String id = getBestCommitId(commit); final ByteFormat byteFormat = new ByteFormat(); final String baseUrl = WicketUtils.getGitblitURL(getRequest()); // changed paths list ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths); DataView<PathModel> pathsView = new DataView<PathModel>("changedPath", pathsDp) { private static final long serialVersionUID = 1L; int counter; @Override public void populateItem(final Item<PathModel> item) { final PathModel entry = item.getModelObject(); item.add(new Label("pathPermissions", JGitUtils.getPermissionsFromMode(entry.mode))); item.add(WicketUtils.setHtmlTooltip(new Label("filestore", ""), getString("gb.filestore")) .setVisible(entry.isFilestoreItem())); if (entry.isParentPath) { // parent .. path item.add(WicketUtils.newBlankImage("pathIcon")); item.add(new Label("pathSize", "")); item.add(new LinkPanel("pathName", null, entry.name, TreePage.class, WicketUtils.newPathParameter(repositoryName, id, entry.path))); item.add(new Label("pathLinks", "")); } else { if (entry.isTree()) { // folder/tree link item.add(WicketUtils.newImage("pathIcon", "folder_16x16.png")); item.add(new Label("pathSize", "")); item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class, WicketUtils.newPathParameter(repositoryName, id, entry.path))); // links Fragment links = new Fragment("pathLinks", "treeLinks", TreePage.this); links.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newPathParameter(repositoryName, id, entry.path))); links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, id, entry.path))); links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl, repositoryName, objectId, entry.path)); item.add(links); } else if (entry.isSubmodule()) { // submodule String submoduleId = entry.objectId; String submodulePath; boolean hasSubmodule = false; SubmoduleModel submodule = getSubmodule(entry.path); submodulePath = submodule.gitblitPath; hasSubmodule = submodule.hasSubmodule; item.add(WicketUtils.newImage("pathIcon", "git-orange-16x16.png")); item.add(new Label("pathSize", "")); item.add(new LinkPanel("pathName", "list", entry.name + " @ " + getShortObjectId(submoduleId), TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, "")) .setEnabled(hasSubmodule)); Fragment links = new Fragment("pathLinks", "submoduleLinks", TreePage.this); links.add(new BookmarkablePageLink<Void>("view", SummaryPage.class, WicketUtils.newRepositoryParameter(submodulePath)).setEnabled(hasSubmodule)); links.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, "")) .setEnabled(hasSubmodule)); links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, id, entry.path))); links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl, submodulePath, submoduleId, "").setEnabled(hasSubmodule)); item.add(links); } else { // blob link String displayPath = entry.name; String path = entry.path; if (entry.isSymlink()) { path = JGitUtils.getStringContent(getRepository(), getCommit().getTree(), path); displayPath = entry.name + " -> " + path; } item.add(WicketUtils.getFileImage("pathIcon", entry.name)); item.add(new Label("pathSize", byteFormat.format(entry.size))); // links Fragment links = new Fragment("pathLinks", "blobLinks", TreePage.this); if (entry.isFilestoreItem()) { item.add(new LinkPanel("pathName", "list", displayPath, new Link<Object>("link", null) { private static final long serialVersionUID = 1L; @Override public void onClick() { IResourceStream resourceStream = new AbstractResourceStreamWriter() { private static final long serialVersionUID = 1L; @Override public void write(OutputStream output) { UserModel user = GitBlitWebSession.get().getUser(); user = user == null ? UserModel.ANONYMOUS : user; app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); } }; ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( resourceStream, entry.path); getRequestCycle() .scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); } })); links.add(new Link<Object>("view", null) { private static final long serialVersionUID = 1L; @Override public void onClick() { IResourceStream resourceStream = new AbstractResourceStreamWriter() { private static final long serialVersionUID = 1L; @Override public void write(OutputStream output) { UserModel user = GitBlitWebSession.get().getUser(); user = user == null ? UserModel.ANONYMOUS : user; app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); } }; ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( resourceStream, entry.path); getRequestCycle() .scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); } }); links.add(new Link<Object>("raw", null) { private static final long serialVersionUID = 1L; @Override public void onClick() { IResourceStream resourceStream = new AbstractResourceStreamWriter() { private static final long serialVersionUID = 1L; @Override public void write(OutputStream output) { UserModel user = GitBlitWebSession.get().getUser(); user = user == null ? UserModel.ANONYMOUS : user; app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); } }; ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( resourceStream, entry.path); getRequestCycle() .scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); } }); } else { item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class, WicketUtils.newPathParameter(repositoryName, id, path))); links.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, id, path))); String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, id, path); links.add(new ExternalLink("raw", rawUrl)); } links.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils.newPathParameter(repositoryName, id, path))); links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, id, path))); item.add(links); } } WicketUtils.setAlternatingBackground(item, counter); counter++; } }; add(pathsView); }
From source file:com.gitblit.wicket.pages.UserPage.java
License:Apache License
private void setup(PageParameters params) { setupPage("", ""); // check to see if we should display a login message boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, true); if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) { authenticationError("Please login"); return;/*from w w w. j ava2 s .co m*/ } String userName = WicketUtils.getUsername(params); if (StringUtils.isEmpty(userName)) { throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage()); } UserModel user = app().users().getUserModel(userName); if (user == null) { // construct a temporary user model user = new UserModel(userName); } add(new UserTitlePanel("userTitlePanel", user, user.username)); UserModel sessionUser = GitBlitWebSession.get().getUser(); boolean isMyProfile = sessionUser != null && sessionUser.equals(user); if (isMyProfile) { addPreferences(user); if (app().services().isServingSSH()) { // show the SSH key management tab addSshKeys(user); } else { // SSH daemon is disabled, hide keys tab add(new Label("sshKeysLink").setVisible(false)); add(new Label("sshKeysTab").setVisible(false)); } } else { // visiting user add(new Label("preferencesLink").setVisible(false)); add(new Label("preferencesTab").setVisible(false)); add(new Label("sshKeysLink").setVisible(false)); add(new Label("sshKeysTab").setVisible(false)); } List<RepositoryModel> repositories = getRepositories(params); Collections.sort(repositories, new Comparator<RepositoryModel>() { @Override public int compare(RepositoryModel o1, RepositoryModel o2) { // reverse-chronological sort return o2.lastChange.compareTo(o1.lastChange); } }); final ListDataProvider<RepositoryModel> dp = new ListDataProvider<RepositoryModel>(repositories); DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("repositoryList", dp) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<RepositoryModel> item) { final RepositoryModel entry = item.getModelObject(); ProjectRepositoryPanel row = new ProjectRepositoryPanel("repository", getLocalizer(), this, showAdmin, entry, getAccessRestrictions()); item.add(row); } }; add(dataView); }
From source file:com.gitblit.wicket.panels.ActivityPanel.java
License:Apache License
public ActivityPanel(String wicketId, List<Activity> recentActivity) { super(wicketId); Collections.sort(recentActivity); final int shortHashLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6); DataView<Activity> activityView = new DataView<Activity>("activity", new ListDataProvider<Activity>(recentActivity)) { private static final long serialVersionUID = 1L; @Override//from w w w. j a v a2 s . co m public void populateItem(final Item<Activity> activityItem) { final Activity entry = activityItem.getModelObject(); activityItem.add( WicketUtils.createDatestampLabel("title", entry.startDate, getTimeZone(), getTimeUtils())); // display the commits in chronological order DataView<RepositoryCommit> commits = new DataView<RepositoryCommit>("commit", new ListDataProvider<RepositoryCommit>(entry.getCommits())) { private static final long serialVersionUID = 1L; @Override public void populateItem(final Item<RepositoryCommit> commitItem) { final RepositoryCommit commit = commitItem.getModelObject(); // commit time of day commitItem.add(WicketUtils.createTimeLabel("time", commit.getCommitterIdent().getWhen(), getTimeZone(), getTimeUtils())); // avatar commitItem.add(new AvatarImage("avatar", commit.getAuthorIdent(), 40)); // merge icon if (commit.getParentCount() > 1) { commitItem.add(WicketUtils.newImage("commitIcon", "commit_merge_16x16.png")); } else { commitItem.add(WicketUtils.newBlankImage("commitIcon").setVisible(false)); } // author search link String author = commit.getAuthorIdent().getName(); LinkPanel authorLink = new LinkPanel("author", "list", author, GitSearchPage.class, WicketUtils.newSearchParameter(commit.repository, null, author, Constants.SearchType.AUTHOR), true); setPersonSearchTooltip(authorLink, author, Constants.SearchType.AUTHOR); commitItem.add(authorLink); // repository String repoName = StringUtils.stripDotGit(commit.repository); LinkPanel repositoryLink = new LinkPanel("repository", null, repoName, SummaryPage.class, WicketUtils.newRepositoryParameter(commit.repository), true); WicketUtils.setCssBackground(repositoryLink, repoName); commitItem.add(repositoryLink); // repository branch LinkPanel branchLink = new LinkPanel("branch", "list", Repository.shortenRefName(commit.branch), LogPage.class, WicketUtils.newObjectParameter(commit.repository, commit.branch), true); WicketUtils.setCssStyle(branchLink, "color: #008000;"); commitItem.add(branchLink); LinkPanel commitid = new LinkPanel("commitid", "list subject", commit.getName().substring(0, shortHashLen), CommitPage.class, WicketUtils.newObjectParameter(commit.repository, commit.getName()), true); commitItem.add(commitid); // message/commit link String shortMessage = commit.getShortMessage(); String trimmedMessage = shortMessage; if (commit.getRefs() != null && commit.getRefs().size() > 0) { trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS); } else { trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG); } LinkPanel shortlog = new LinkPanel("message", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(commit.repository, commit.getName()), true); if (!shortMessage.equals(trimmedMessage)) { WicketUtils.setHtmlTooltip(shortlog, shortMessage); } commitItem.add(shortlog); // refs commitItem.add(new RefsPanel("commitRefs", commit.repository, commit.getRefs())); // diff, tree links commitItem.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class, WicketUtils.newObjectParameter(commit.repository, commit.getName())) .setEnabled(commit.getParentCount() > 0)); commitItem.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newObjectParameter(commit.repository, commit.getName()))); } }; activityItem.add(commits); } }; add(activityView); }