diff options
author | Anthony Chin <anthony.a.chin@ericsson.com> | 2014-04-11 12:38:31 -0400 |
---|---|---|
committer | David Pursehouse <david.pursehouse@sonymobile.com> | 2014-04-16 21:21:00 +0900 |
commit | d5edded54ddc2db50dd06130b79c839782873a65 (patch) | |
tree | 186dcf8c866e5b6eeaafa505ff804322c6ee5374 | |
parent | dc78329e347abed59247dd7e3846d5996bc5a1ee (diff) |
Implement pagination in group list screen
Group list screen now uses pagination similar to project list screen.
The number of groups displayed is determined by the 'Maximum Page
Size' in user preferences.
Change-Id: Id4649fda4b06ef62bf9d630460aeefc1c5f65989
5 files changed, 106 insertions, 14 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java index 530c0a77bc..cb96e38631 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java @@ -133,4 +133,7 @@ public interface AdminConstants extends Constants { String pagedProjectListPrev(); String pagedProjectListNext(); + + String pagedGroupListPrev(); + String pagedGroupListNext(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties index c54adb51fd..6a25a09ad7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties @@ -98,6 +98,9 @@ errorNoGitRepository = No Git Repository pagedProjectListPrev = ⇦Prev pagedProjectListNext = Next⇨ +pagedGroupListPrev = ⇦Prev +pagedGroupListNext = Next⇨ + addPermission = Add Permission ... # Permission Names 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 cf9fb041f7..6579f83e96 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 @@ -21,8 +21,10 @@ import com.google.gerrit.client.groups.GroupMap; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.ui.AccountScreen; import com.google.gerrit.client.ui.FilteredUserInterface; +import com.google.gerrit.client.ui.Hyperlink; import com.google.gerrit.client.ui.IgnoreOutdatedFilterResultsCallbackWrapper; import com.google.gerrit.common.PageLinks; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; @@ -32,11 +34,16 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwtexpui.globalkey.client.NpTextBox; public class GroupListScreen extends AccountScreen implements FilteredUserInterface { + private Hyperlink prev; + private Hyperlink next; private GroupTable groups; private NpTextBox filterTxt; private String subname = ""; + private int startPosition; + private int pageSize; public GroupListScreen() { + configurePageSize(); } public GroupListScreen(String params) { @@ -49,6 +56,22 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf if ("filter".equals(kv[0])) { subname = URL.decodeQueryString(kv[1]); } + + if ("skip".equals(kv[0]) && URL.decodeQueryString(kv[1]).matches("^[\\d]+")) { + startPosition = Integer.parseInt(URL.decodeQueryString(kv[1])); + } + } + configurePageSize(); + } + + private void configurePageSize() { + if (Gerrit.isSignedIn()) { + final AccountGeneralPreferences p = + Gerrit.getUserAccount().getGeneralPreferences(); + final short m = p.getMaximumPageSize(); + pageSize = 0 < m ? m : AccountGeneralPreferences.DEFAULT_PAGESIZE; + } else { + pageSize = AccountGeneralPreferences.DEFAULT_PAGESIZE; } } @@ -56,13 +79,17 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf protected void onLoad() { super.onLoad(); display(); - refresh(false); + refresh(false, false); } - private void refresh(final boolean open) { - setToken(subname == null || "".equals(subname) ? ADMIN_GROUPS - : ADMIN_GROUPS + "?filter=" + URL.encodeQueryString(subname)); - GroupMap.match(subname, + private void refresh(final boolean open, final boolean filterModified) { + if (filterModified){ + startPosition = 0; + } + setToken(getTokenForScreen(subname, startPosition)); + // Retrieve one more group than page size to determine if there are more + // groups to display + GroupMap.match(subname, pageSize + 1, startPosition, new IgnoreOutdatedFilterResultsCallbackWrapper<GroupMap>(this, new GerritCallback<GroupMap>() { @Override @@ -71,13 +98,45 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf Gerrit.display(PageLinks.toGroup( result.values().get(0).getGroupUUID())); } else { - groups.display(result, subname); + if (result.size() <= pageSize) { + groups.display(result, subname); + next.setVisible(false); + } else { + groups.displaySubset(result, 0, result.size() - 1, subname); + setupNavigationLink(next, subname, startPosition + pageSize); + } + if (startPosition > 0) { + setupNavigationLink(prev, subname, startPosition - pageSize); + } else { + prev.setVisible(false); + } groups.finishDisplay(); } } })); } + private void setupNavigationLink(Hyperlink link, String filter, int skip) { + link.setTargetHistoryToken(getTokenForScreen(filter, skip)); + link.setVisible(true); + } + + private String getTokenForScreen(String filter, int skip) { + String token = ADMIN_GROUPS; + if (filter != null && !filter.isEmpty()) { + token += "?filter=" + URL.encodeQueryString(filter); + } + if (skip > 0) { + if (token.contains("?filter=")) { + token += ","; + } else { + token += "?"; + } + token += "skip=" + skip; + } + return token; + } + @Override public String getCurrentFilter() { return subname; @@ -89,8 +148,20 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf setPageTitle(Util.C.groupListTitle()); initPageHeader(); + prev = new Hyperlink(Util.C.pagedGroupListPrev(), true, ""); + prev.setVisible(false); + + next = new Hyperlink(Util.C.pagedGroupListNext(), true, ""); + next.setVisible(false); + groups = new GroupTable(PageLinks.ADMIN_GROUPS); add(groups); + + final HorizontalPanel buttons = new HorizontalPanel(); + buttons.setStyleName(Gerrit.RESOURCES.css().changeTablePrevNextLinks()); + buttons.add(prev); + buttons.add(next); + add(buttons); } private void initPageHeader() { @@ -106,9 +177,10 @@ public class GroupListScreen extends AccountScreen implements FilteredUserInterf public void onKeyUp(KeyUpEvent event) { boolean enterPressed = event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER; - if (enterPressed || !filterTxt.getValue().equals(subname)) { + boolean filterModified = !filterTxt.getValue().equals(subname); + if (enterPressed || filterModified) { subname = filterTxt.getValue(); - refresh(enterPressed); + refresh(enterPressed, filterModified); } } }); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java index de840813b6..1b420b4e51 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java @@ -95,6 +95,14 @@ public class GroupTable extends NavigationTable<GroupInfo> { } public void display(List<GroupInfo> list, String toHighlight) { + displaySubset(list, toHighlight, 0, list.size()); + } + + public void displaySubset(GroupMap groups, int fromIndex, int toIndex, String toHighlight) { + displaySubset(Natives.asList(groups.values()), toHighlight, fromIndex, toIndex); + } + + public void displaySubset(List<GroupInfo> list, String toHighlight, int fromIndex, int toIndex) { while (1 < table.getRowCount()) table.removeRow(table.getRowCount() - 1); @@ -104,7 +112,7 @@ public class GroupTable extends NavigationTable<GroupInfo> { return a.name().compareTo(b.name()); } }); - for(GroupInfo group : list) { + for(GroupInfo group : list.subList(fromIndex, toIndex)) { final int row = table.getRowCount(); table.insertRow(row); applyDataRowStyle(row); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java index 6ba00ae643..f28fb8649a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java @@ -24,12 +24,18 @@ public class GroupMap extends NativeMap<GroupInfo> { groups().get(NativeMap.copyKeysIntoChildren(callback)); } - public static void match(String match, AsyncCallback<GroupMap> cb) { - if (match == null || "".equals(match)) { - all(cb); - } else { - groups().addParameter("m", match).get(NativeMap.copyKeysIntoChildren(cb)); + public static void match(String match, int limit, int start, AsyncCallback<GroupMap> cb) { + RestApi call = groups(); + if (match != null) { + call.addParameter("m", match); } + if (limit > 0) { + call.addParameter("n", limit); + } + if (start > 0) { + call.addParameter("S", start); + } + call.get(NativeMap.copyKeysIntoChildren(cb)); } public static void myOwned(AsyncCallback<GroupMap> cb) { |