From 5795ccc79ec3fb88b93f782af0f995d6cea34df9 Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Fri, 18 Jan 2013 20:56:54 +0100 Subject: [PATCH] Allow setting the filter for project/group list screen by URL parameter This allows to bookmark a filtered screen and share links to filtered results. E.g. to send somebody a list of all Gerrit plugins the following link could be used: https://gerrit-review.googlesource.com/#/admin/projects/?filter=plugins Change-Id: I7417356a48f7cd8ece7e3d38c41114c571d51955 Signed-off-by: Edwin Kempin --- .../com/google/gerrit/client/Dispatcher.java | 26 +++++++++++++++++-- .../gerrit/client/admin/GroupListScreen.java | 24 +++++++++++++++++ .../client/admin/ProjectListScreen.java | 24 +++++++++++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java index e72e127619..801ee43197 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java @@ -679,14 +679,36 @@ public class Dispatcher { Gerrit.display(token, new GroupListScreen()); } else if (matchPrefix("/admin/groups/", token)) { - group(); + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new GroupListScreen(rest.substring(1))); + } else { + group(); + } + + } else if (matchPrefix("/admin/groups", token)) { + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new GroupListScreen(rest.substring(1))); + } } else if (matchExact(ADMIN_PROJECTS, token) || matchExact("/admin/projects", token)) { Gerrit.display(token, new ProjectListScreen()); } else if (matchPrefix("/admin/projects/", token)) { - Gerrit.display(token, selectProject()); + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new ProjectListScreen(rest.substring(1))); + } else { + Gerrit.display(token, selectProject()); + } + + } else if (matchPrefix("/admin/projects", token)) { + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new ProjectListScreen(rest.substring(1))); + } } else if (matchPrefix(ADMIN_PLUGINS, token) || matchExact("/admin/plugins", token)) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java index 8c54b580c8..0a8cad866c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java @@ -14,6 +14,8 @@ package com.google.gerrit.client.admin; +import static com.google.gerrit.common.PageLinks.ADMIN_GROUPS; + import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.groups.GroupMap; import com.google.gerrit.client.rpc.ScreenLoadCallback; @@ -23,6 +25,7 @@ import com.google.gerrit.client.ui.IgnoreOutdatedFilterResultsCallbackWrapper; import com.google.gerrit.common.PageLinks; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.http.client.URL; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwtexpui.globalkey.client.NpTextBox; @@ -32,6 +35,22 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf private NpTextBox filterTxt; private String subname; + public GroupListScreen() { + } + + public GroupListScreen(String params) { + for (String kvPair : params.split("[,;&]")) { + String[] kv = kvPair.split("=", 2); + if (kv.length != 2 || kv[0].isEmpty()) { + continue; + } + + if ("filter".equals(kv[0])) { + subname = URL.decodeQueryString(kv[1]); + } + } + } + @Override protected void onLoad() { super.onLoad(); @@ -39,6 +58,8 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf } private void refresh() { + setToken(subname == null || "".equals(subname) ? ADMIN_GROUPS + : ADMIN_GROUPS + "?filter=" + URL.encodeQueryString(subname)); GroupMap.match(subname, new IgnoreOutdatedFilterResultsCallbackWrapper(this, new ScreenLoadCallback(this) { @@ -87,6 +108,9 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf @Override public void onShowView() { super.onShowView(); + if (subname != null) { + filterTxt.setCursorPos(subname.length()); + } filterTxt.setFocus(true); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java index 4795bdae7f..6af437cb0c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java @@ -14,6 +14,8 @@ package com.google.gerrit.client.admin; +import static com.google.gerrit.common.PageLinks.ADMIN_PROJECTS; + import com.google.gerrit.client.Dispatcher; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.GitwebLink; @@ -29,6 +31,7 @@ import com.google.gerrit.client.ui.Screen; import com.google.gerrit.common.PageLinks; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.http.client.URL; import com.google.gwt.user.client.History; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; @@ -41,6 +44,22 @@ public class ProjectListScreen extends Screen implements FilteredUserInterface { private NpTextBox filterTxt; private String subname; + public ProjectListScreen() { + } + + public ProjectListScreen(String params) { + for (String kvPair : params.split("[,;&]")) { + String[] kv = kvPair.split("=", 2); + if (kv.length != 2 || kv[0].isEmpty()) { + continue; + } + + if ("filter".equals(kv[0])) { + subname = URL.decodeQueryString(kv[1]); + } + } + } + @Override protected void onLoad() { super.onLoad(); @@ -48,6 +67,8 @@ public class ProjectListScreen extends Screen implements FilteredUserInterface { } private void refresh() { + setToken(subname == null || "".equals(subname) ? ADMIN_PROJECTS + : ADMIN_PROJECTS + "?filter=" + URL.encodeQueryString(subname)); ProjectMap.match(subname, new IgnoreOutdatedFilterResultsCallbackWrapper(this, new ScreenLoadCallback(this) { @@ -141,6 +162,9 @@ public class ProjectListScreen extends Screen implements FilteredUserInterface { @Override public void onShowView() { super.onShowView(); + if (subname != null) { + filterTxt.setCursorPos(subname.length()); + } filterTxt.setFocus(true); }