You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ProjectRepositoryPanel.java 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright 2012 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.panels;
  17. import java.text.MessageFormat;
  18. import java.util.Map;
  19. import org.apache.wicket.Component;
  20. import org.apache.wicket.Localizer;
  21. import org.apache.wicket.PageParameters;
  22. import org.apache.wicket.markup.html.basic.Label;
  23. import org.apache.wicket.markup.html.link.BookmarkablePageLink;
  24. import org.apache.wicket.markup.html.link.ExternalLink;
  25. import org.apache.wicket.markup.html.link.Link;
  26. import org.apache.wicket.markup.html.panel.Fragment;
  27. import com.gitblit.Constants.AccessRestrictionType;
  28. import com.gitblit.GitBlit;
  29. import com.gitblit.Keys;
  30. import com.gitblit.SyndicationServlet;
  31. import com.gitblit.models.RepositoryModel;
  32. import com.gitblit.models.UserModel;
  33. import com.gitblit.utils.ArrayUtils;
  34. import com.gitblit.utils.StringUtils;
  35. import com.gitblit.wicket.GitBlitWebSession;
  36. import com.gitblit.wicket.WicketUtils;
  37. import com.gitblit.wicket.pages.DocsPage;
  38. import com.gitblit.wicket.pages.EditRepositoryPage;
  39. import com.gitblit.wicket.pages.LogPage;
  40. import com.gitblit.wicket.pages.SummaryPage;
  41. import com.gitblit.wicket.pages.TicketsPage;
  42. import com.gitblit.wicket.pages.TreePage;
  43. public class ProjectRepositoryPanel extends BasePanel {
  44. private static final long serialVersionUID = 1L;
  45. public ProjectRepositoryPanel(String wicketId, Localizer localizer, Component parent,
  46. final boolean isAdmin, final RepositoryModel entry,
  47. final Map<AccessRestrictionType, String> accessRestrictions) {
  48. super(wicketId);
  49. final boolean showSwatch = GitBlit.getBoolean(Keys.web.repositoryListSwatches, true);
  50. final boolean showSize = GitBlit.getBoolean(Keys.web.showRepositorySizes, true);
  51. // repository swatch
  52. Component swatch;
  53. if (entry.isBare) {
  54. swatch = new Label("repositorySwatch", "&nbsp;").setEscapeModelStrings(false);
  55. } else {
  56. swatch = new Label("repositorySwatch", "!");
  57. WicketUtils.setHtmlTooltip(swatch, localizer.getString("gb.workingCopyWarning", parent));
  58. }
  59. WicketUtils.setCssBackground(swatch, entry.toString());
  60. add(swatch);
  61. swatch.setVisible(showSwatch);
  62. PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
  63. add(new LinkPanel("repositoryName", "list", StringUtils.getRelativePath(entry.projectPath,
  64. StringUtils.stripDotGit(entry.name)), SummaryPage.class, pp));
  65. add(new Label("repositoryDescription", entry.description).setVisible(!StringUtils
  66. .isEmpty(entry.description)));
  67. if (StringUtils.isEmpty(entry.originRepository)) {
  68. add(new Label("originRepository").setVisible(false));
  69. } else {
  70. Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
  71. forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(entry.originRepository),
  72. SummaryPage.class, WicketUtils.newRepositoryParameter(entry.originRepository)));
  73. add(forkFrag);
  74. }
  75. if (entry.isSparkleshared()) {
  76. add(WicketUtils.newImage("sparkleshareIcon", "star_16x16.png", localizer.getString("gb.isSparkleshared", parent)));
  77. } else {
  78. add(WicketUtils.newClearPixel("sparkleshareIcon").setVisible(false));
  79. }
  80. add(new BookmarkablePageLink<Void>("tickets", TicketsPage.class, pp).setVisible(entry.useTickets));
  81. add(new BookmarkablePageLink<Void>("docs", DocsPage.class, pp).setVisible(entry.useDocs));
  82. if (entry.isFrozen) {
  83. add(WicketUtils.newImage("frozenIcon", "cold_16x16.png", localizer.getString("gb.isFrozen", parent)));
  84. } else {
  85. add(WicketUtils.newClearPixel("frozenIcon").setVisible(false));
  86. }
  87. if (entry.isFederated) {
  88. add(WicketUtils.newImage("federatedIcon", "federated_16x16.png", localizer.getString("gb.isFederated", parent)));
  89. } else {
  90. add(WicketUtils.newClearPixel("federatedIcon").setVisible(false));
  91. }
  92. switch (entry.accessRestriction) {
  93. case NONE:
  94. add(WicketUtils.newBlankImage("accessRestrictionIcon").setVisible(false));
  95. break;
  96. case PUSH:
  97. add(WicketUtils.newImage("accessRestrictionIcon", "lock_go_16x16.png",
  98. accessRestrictions.get(entry.accessRestriction)));
  99. break;
  100. case CLONE:
  101. add(WicketUtils.newImage("accessRestrictionIcon", "lock_pull_16x16.png",
  102. accessRestrictions.get(entry.accessRestriction)));
  103. break;
  104. case VIEW:
  105. add(WicketUtils.newImage("accessRestrictionIcon", "shield_16x16.png",
  106. accessRestrictions.get(entry.accessRestriction)));
  107. break;
  108. default:
  109. add(WicketUtils.newBlankImage("accessRestrictionIcon"));
  110. }
  111. if (ArrayUtils.isEmpty(entry.owners)) {
  112. add(new Label("repositoryOwner").setVisible(false));
  113. } else {
  114. String owner = "";
  115. for (String username : entry.owners) {
  116. UserModel ownerModel = GitBlit.self().getUserModel(username);
  117. if (ownerModel != null) {
  118. owner = ownerModel.getDisplayName();
  119. }
  120. }
  121. if (entry.owners.size() > 1) {
  122. owner += ", ...";
  123. }
  124. Label ownerLabel = (new Label("repositoryOwner", owner + " (" +
  125. localizer.getString("gb.owner", parent) + ")"));
  126. WicketUtils.setHtmlTooltip(ownerLabel, ArrayUtils.toString(entry.owners));
  127. add(ownerLabel);
  128. }
  129. UserModel user = GitBlitWebSession.get().getUser();
  130. if (user == null) {
  131. user = UserModel.ANONYMOUS;
  132. }
  133. Fragment repositoryLinks;
  134. boolean showOwner = entry.isOwner(user.username);
  135. // owner of personal repository gets admin powers
  136. boolean showAdmin = isAdmin || entry.isUsersPersonalRepository(user.username);
  137. if (showAdmin || showOwner) {
  138. repositoryLinks = new Fragment("repositoryLinks", showAdmin ? "repositoryAdminLinks"
  139. : "repositoryOwnerLinks", this);
  140. repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository", EditRepositoryPage.class,
  141. WicketUtils.newRepositoryParameter(entry.name)));
  142. if (showAdmin) {
  143. Link<Void> deleteLink = new Link<Void>("deleteRepository") {
  144. private static final long serialVersionUID = 1L;
  145. @Override
  146. public void onClick() {
  147. if (GitBlit.self().deleteRepositoryModel(entry)) {
  148. // redirect to the owning page
  149. if (entry.isPersonalRepository()) {
  150. setResponsePage(getPage().getClass(), WicketUtils.newUsernameParameter(entry.projectPath.substring(1)));
  151. } else {
  152. setResponsePage(getPage().getClass(), WicketUtils.newProjectParameter(entry.projectPath));
  153. }
  154. } else {
  155. error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), entry));
  156. }
  157. }
  158. };
  159. deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
  160. localizer.getString("gb.deleteRepository", parent), entry)));
  161. repositoryLinks.add(deleteLink);
  162. }
  163. } else {
  164. repositoryLinks = new Fragment("repositoryLinks", "repositoryUserLinks", this);
  165. }
  166. repositoryLinks.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils
  167. .newRepositoryParameter(entry.name)).setEnabled(entry.hasCommits));
  168. repositoryLinks.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils
  169. .newRepositoryParameter(entry.name)).setEnabled(entry.hasCommits));
  170. add(repositoryLinks);
  171. String lastChange;
  172. if (entry.lastChange.getTime() == 0) {
  173. lastChange = "--";
  174. } else {
  175. lastChange = getTimeUtils().timeAgo(entry.lastChange);
  176. }
  177. Label lastChangeLabel = new Label("repositoryLastChange", lastChange);
  178. add(lastChangeLabel);
  179. WicketUtils.setCssClass(lastChangeLabel, getTimeUtils().timeAgoCss(entry.lastChange));
  180. if (entry.hasCommits) {
  181. // Existing repository
  182. add(new Label("repositorySize", entry.size).setVisible(showSize));
  183. } else {
  184. // New repository
  185. add(new Label("repositorySize", localizer.getString("gb.empty", parent)).setEscapeModelStrings(false));
  186. }
  187. add(new ExternalLink("syndication", SyndicationServlet.asLink("", entry.name, null, 0)));
  188. add(new RepositoryUrlPanel("repositoryPrimaryUrl", true, user, entry, localizer, parent));
  189. }
  190. }