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
This commit is contained in:
Anthony Chin 2014-04-11 12:38:31 -04:00 committed by David Pursehouse
parent dc78329e34
commit d5edded54d
5 changed files with 106 additions and 14 deletions

View File

@ -133,4 +133,7 @@ public interface AdminConstants extends Constants {
String pagedProjectListPrev();
String pagedProjectListNext();
String pagedGroupListPrev();
String pagedGroupListNext();
}

View File

@ -98,6 +98,9 @@ errorNoGitRepository = No Git Repository
pagedProjectListPrev = ⇦Prev
pagedProjectListNext = Next⇨
pagedGroupListPrev = ⇦Prev
pagedGroupListNext = Next⇨
addPermission = Add Permission ...
# Permission Names

View File

@ -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 {
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);
}
}
});

View File

@ -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);

View File

@ -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) {