summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-01-30 18:43:49 -0800
committerShawn O. Pearce <sop@google.com>2009-01-30 18:43:49 -0800
commit1343b7dee0e4fab2f2f74bf0ab26c2869e5080ad (patch)
tree5426fd5c26d1950e27cba8dcf0747acedba4e7b9
parentcdc5faebd4c94484d84237dec11344d0caa09e37 (diff)
Display all open changes for a single project
Change tables now display a hyperlink to view all open changes for that project, browsing them in the same order that the all open changes for the entire site would navigate them in. Bug: GERRIT-32 Signed-off-by: Shawn O. Pearce <sop@google.com>
-rw-r--r--appdist/src/main/sql/query_index.sql5
-rw-r--r--appdist/src/main/sql/upgrade003_004.sql4
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/Link.java15
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java3
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java51
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java3
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java9
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java25
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java1
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties1
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java4
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java4
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java10
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java7
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java38
15 files changed, 177 insertions, 3 deletions
diff --git a/appdist/src/main/sql/query_index.sql b/appdist/src/main/sql/query_index.sql
index 1bf5be7366..97cd21d95f 100644
--- a/appdist/src/main/sql/query_index.sql
+++ b/appdist/src/main/sql/query_index.sql
@@ -116,6 +116,11 @@ CREATE INDEX changes_allOpen
ON changes (sort_key)
WHERE open = 'Y';
+-- covers: byProjectOpenPrev, byProjectOpenNext
+CREATE INDEX changes_byProjectOpen
+ON changes (dest_project_name, sort_key)
+WHERE open = 'Y';
+
-- covers: allClosedPrev, allClosedNext
CREATE INDEX changes_allClosed
ON changes (status, sort_key)
diff --git a/appdist/src/main/sql/upgrade003_004.sql b/appdist/src/main/sql/upgrade003_004.sql
index a4ddf07b1a..3c2634fd39 100644
--- a/appdist/src/main/sql/upgrade003_004.sql
+++ b/appdist/src/main/sql/upgrade003_004.sql
@@ -13,3 +13,7 @@ ALTER TABLE accounts ALTER COLUMN show_site_header SET DEFAULT 'N';
ALTER TABLE accounts ALTER COLUMN show_site_header SET NOT NULL;
UPDATE schema_version SET version_nbr = 4;
+
+CREATE INDEX changes_byProjectOpen
+ON changes (dest_project_name, sort_key)
+WHERE open = 'Y';
diff --git a/appjar/src/main/java/com/google/gerrit/client/Link.java b/appjar/src/main/java/com/google/gerrit/client/Link.java
index 8d9b04b8fa..62031d5602 100644
--- a/appjar/src/main/java/com/google/gerrit/client/Link.java
+++ b/appjar/src/main/java/com/google/gerrit/client/Link.java
@@ -25,6 +25,7 @@ import com.google.gerrit.client.changes.AccountDashboardScreen;
import com.google.gerrit.client.changes.AllAbandonedChangesScreen;
import com.google.gerrit.client.changes.AllMergedChangesScreen;
import com.google.gerrit.client.changes.AllOpenChangesScreen;
+import com.google.gerrit.client.changes.ByProjectOpenChangesScreen;
import com.google.gerrit.client.changes.ChangeScreen;
import com.google.gerrit.client.changes.MineDraftsScreen;
import com.google.gerrit.client.changes.MineStarredScreen;
@@ -101,6 +102,10 @@ public class Link implements HistoryListener {
return "admin,project," + id.toString();
}
+ public static String toProjectOpen(final Project.NameKey proj) {
+ return "project,open," + proj.toString() + ",n,z";
+ }
+
public void onHistoryChanged(final String token) {
Screen s;
try {
@@ -160,6 +165,16 @@ public class Link implements HistoryListener {
}
}
+ if (token.startsWith("project,")) {
+ p = "project,open,";
+ if (token.startsWith(p)) {
+ final String s = skip(p, token);
+ final int c = s.indexOf(',');
+ return new ByProjectOpenChangesScreen(Project.NameKey.parse(s
+ .substring(0, c)), s.substring(c + 1));
+ }
+ }
+
if (token.startsWith("patch,")) {
p = "patch,sidebyside,";
if (token.startsWith(p))
diff --git a/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java b/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java
index 8d7af61c53..3c33507ae3 100644
--- a/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java
+++ b/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java
@@ -18,6 +18,7 @@ import com.google.gerrit.client.reviewdb.AccountProjectWatch;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.client.ui.ProjectNameSuggestOracle;
+import com.google.gerrit.client.ui.ProjectOpenLink;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
@@ -278,7 +279,7 @@ class ProjectWatchPanel extends Composite {
void populate(final int row, final AccountProjectWatchInfo k) {
table.setWidget(row, 1, new CheckBox());
- table.setText(row, 2, k.getProject().getName());
+ table.setWidget(row, 2, new ProjectOpenLink(k.getProject().getNameKey()));
{
final CheckBox notifyNewChanges = new CheckBox();
notifyNewChanges.addClickListener(new ClickListener() {
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java b/appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java
new file mode 100644
index 0000000000..8d67f2da08
--- /dev/null
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java
@@ -0,0 +1,51 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client.changes;
+
+import com.google.gerrit.client.data.SingleListChangeInfo;
+import com.google.gerrit.client.reviewdb.Project;
+import com.google.gerrit.client.rpc.GerritCallback;
+
+
+public class ByProjectOpenChangesScreen extends AllSingleListScreen {
+ private final Project.NameKey projectKey;
+
+ public ByProjectOpenChangesScreen(final Project.NameKey proj,
+ final String positionToken) {
+ super(Util.M.changesOpenInProject(proj.get()), "project,open,"
+ + proj.toString(), positionToken);
+ projectKey = proj;
+ }
+
+ @Override
+ protected void loadPrev() {
+ Util.LIST_SVC.byProjectOpenPrev(projectKey, pos, pageSize,
+ new GerritCallback<SingleListChangeInfo>() {
+ public void onSuccess(final SingleListChangeInfo result) {
+ display(result);
+ }
+ });
+ }
+
+ @Override
+ protected void loadNext() {
+ Util.LIST_SVC.byProjectOpenNext(projectKey, pos, pageSize,
+ new GerritCallback<SingleListChangeInfo>() {
+ public void onSuccess(final SingleListChangeInfo result) {
+ display(result);
+ }
+ });
+ }
+}
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
index b631a23248..f96fbc57aa 100644
--- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
@@ -21,6 +21,7 @@ import com.google.gerrit.client.reviewdb.Branch;
import com.google.gerrit.client.reviewdb.Change;
import com.google.gerrit.client.ui.AccountDashboardLink;
import com.google.gerrit.client.ui.ChangeLink;
+import com.google.gerrit.client.ui.ProjectOpenLink;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
@@ -67,7 +68,7 @@ public class ChangeInfoBlock extends Composite {
public void display(final Change chg, final AccountInfoCache acc) {
final Branch.NameKey dst = chg.getDest();
table.setWidget(R_OWNER, 1, AccountDashboardLink.link(acc, chg.getOwner()));
- table.setText(R_PROJECT, 1, dst.getParentKey().get());
+ table.setWidget(R_PROJECT, 1, new ProjectOpenLink(dst.getParentKey()));
table.setText(R_BRANCH, 1, dst.getShortName());
table.setText(R_UPLOADED, 1, mediumFormat(chg.getCreatedOn()));
table.setText(R_UPDATED, 1, mediumFormat(chg.getLastUpdatedOn()));
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java
index ba441ffc83..58460976ba 100644
--- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java
@@ -18,6 +18,7 @@ import com.google.gerrit.client.data.AccountDashboardInfo;
import com.google.gerrit.client.data.SingleListChangeInfo;
import com.google.gerrit.client.reviewdb.Account;
import com.google.gerrit.client.reviewdb.Change;
+import com.google.gerrit.client.reviewdb.Project;
import com.google.gerrit.client.rpc.SignInRequired;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwtjsonrpc.client.RemoteJsonService;
@@ -34,6 +35,14 @@ public interface ChangeListService extends RemoteJsonService {
void allOpenNext(String pos, int limit,
AsyncCallback<SingleListChangeInfo> callback);
+ /** Get all open changes more recent than pos, fetching at most limit rows. */
+ void byProjectOpenPrev(Project.NameKey project, String pos, int limit,
+ AsyncCallback<SingleListChangeInfo> callback);
+
+ /** Get all open changes older than pos, fetching at most limit rows. */
+ void byProjectOpenNext(Project.NameKey project, String pos, int limit,
+ AsyncCallback<SingleListChangeInfo> callback);
+
/** Get all closed changes more recent than pos, fetching at most limit rows. */
void allClosedPrev(Change.Status status, String pos, int limit,
AsyncCallback<SingleListChangeInfo> callback);
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java
index 096f824ce5..3fccd450d1 100644
--- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java
@@ -23,6 +23,7 @@ import com.google.gerrit.client.reviewdb.Change;
import com.google.gerrit.client.reviewdb.ChangeAccess;
import com.google.gerrit.client.reviewdb.ChangeApproval;
import com.google.gerrit.client.reviewdb.PatchLineComment;
+import com.google.gerrit.client.reviewdb.Project;
import com.google.gerrit.client.reviewdb.ReviewDb;
import com.google.gerrit.client.reviewdb.StarredChange;
import com.google.gerrit.client.reviewdb.Change.Id;
@@ -85,6 +86,30 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements
});
}
+ public void byProjectOpenPrev(final Project.NameKey project,
+ final String pos, final int pageSize,
+ final AsyncCallback<SingleListChangeInfo> callback) {
+ run(callback, new QueryPrev(pageSize, pos) {
+ @Override
+ ResultSet<Change> query(ReviewDb db, int slim, String sortKey)
+ throws OrmException {
+ return db.changes().byProjectOpenPrev(project, sortKey, slim);
+ }
+ });
+ }
+
+ public void byProjectOpenNext(final Project.NameKey project,
+ final String pos, final int pageSize,
+ final AsyncCallback<SingleListChangeInfo> callback) {
+ run(callback, new QueryNext(pageSize, pos) {
+ @Override
+ ResultSet<Change> query(ReviewDb db, int slim, String sortKey)
+ throws OrmException {
+ return db.changes().byProjectOpenNext(project, sortKey, slim);
+ }
+ });
+ }
+
public void allClosedPrev(final Change.Status s, final String pos,
final int pageSize, final AsyncCallback<SingleListChangeInfo> callback) {
run(callback, new QueryPrev(pageSize, pos) {
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java
index 1b78738273..5fc0a46812 100644
--- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java
@@ -20,6 +20,7 @@ public interface ChangeMessages extends Messages {
String accountDashboardTitle(String fullName);
String changesStartedBy(String fullName);
String changesReviewableBy(String fullName);
+ String changesOpenInProject(String string);
String changeScreenTitleId(int id);
String patchSetHeader(int id);
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties
index 395d81729d..17c4dbb9f5 100644
--- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties
@@ -1,6 +1,7 @@
accountDashboardTitle = Code Review Dashboard for {0}
changesStartedBy = Started by {0}
changesReviewableBy = Reviewable by {0}
+changesOpenInProject = Open Changes In {0}
changeScreenTitleId = Change {0}
patchSetHeader = Patch Set {0}
diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
index 8c41c221fe..1fd46d20f7 100644
--- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
+++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
@@ -27,6 +27,7 @@ import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountDashboardLink;
import com.google.gerrit.client.ui.ChangeLink;
import com.google.gerrit.client.ui.FancyFlexTable;
+import com.google.gerrit.client.ui.ProjectOpenLink;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Image;
@@ -224,7 +225,8 @@ public class ChangeTable extends FancyFlexTable<ChangeInfo> {
}
table.setWidget(row, C_SUBJECT, new TableChangeLink(s, c));
table.setWidget(row, C_OWNER, link(c.getOwner()));
- table.setText(row, C_PROJECT, c.getProject().getName());
+ table.setWidget(row, C_PROJECT,
+ new ProjectOpenLink(c.getProject().getKey()));
table.setText(row, C_LAST_UPDATE, mediumFormat(c.getLastUpdatedOn()));
setRowItem(row, c);
}
diff --git a/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java b/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java
index 86f68faf08..714fcb45e2 100644
--- a/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java
+++ b/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java
@@ -26,6 +26,10 @@ public class ProjectInfo {
this.key = key;
}
+ public Project.NameKey getKey() {
+ return key;
+ }
+
public String getName() {
return key.get();
}
diff --git a/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java b/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java
index e0e423ae08..41bccd475e 100644
--- a/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java
+++ b/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java
@@ -40,6 +40,16 @@ public interface ChangeAccess extends Access<Change, Change.Id> {
@Query("WHERE open = true AND sortKey < ? ORDER BY sortKey DESC LIMIT ?")
ResultSet<Change> allOpenNext(String sortKey, int limit) throws OrmException;
+ @Query("WHERE open = true AND dest.projectName = ? AND sortKey > ?"
+ + " ORDER BY sortKey LIMIT ?")
+ ResultSet<Change> byProjectOpenPrev(Project.NameKey p, String sortKey,
+ int limit) throws OrmException;
+
+ @Query("WHERE open = true AND dest.projectName = ? AND sortKey < ?"
+ + " ORDER BY sortKey DESC LIMIT ?")
+ ResultSet<Change> byProjectOpenNext(Project.NameKey p, String sortKey,
+ int limit) throws OrmException;
+
@Query("WHERE open = false AND status = ? AND sortKey > ? ORDER BY sortKey LIMIT ?")
ResultSet<Change> allClosedPrev(char status, String sortKey, int limit)
throws OrmException;
diff --git a/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java b/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java
index ffbf394a90..5dc5e06470 100644
--- a/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java
+++ b/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java
@@ -42,6 +42,13 @@ public final class Project {
protected void set(String newValue) {
name = newValue;
}
+
+ /** Parse a Project.NameKey out of a string representation. */
+ public static NameKey parse(final String str) {
+ final NameKey r = new NameKey();
+ r.fromString(str);
+ return r;
+ }
}
/** Synthetic key to link to within the database */
diff --git a/appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java b/appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java
new file mode 100644
index 0000000000..446ff18dca
--- /dev/null
+++ b/appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java
@@ -0,0 +1,38 @@
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client.ui;
+
+import com.google.gerrit.client.Link;
+import com.google.gerrit.client.changes.ByProjectOpenChangesScreen;
+import com.google.gerrit.client.reviewdb.Project;
+
+/** Link to the open changes of a project. */
+public class ProjectOpenLink extends DirectScreenLink {
+ private Project.NameKey project;
+
+ public ProjectOpenLink(final Project.NameKey proj) {
+ this(proj.get(), proj);
+ }
+
+ public ProjectOpenLink(final String text, final Project.NameKey proj) {
+ super(text, Link.toProjectOpen(proj));
+ project = proj;
+ }
+
+ @Override
+ protected Screen createScreen() {
+ return new ByProjectOpenChangesScreen(project, "n,z");
+ }
+}