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:
parent
dc78329e34
commit
d5edded54d
@ -133,4 +133,7 @@ public interface AdminConstants extends Constants {
|
||||
|
||||
String pagedProjectListPrev();
|
||||
String pagedProjectListNext();
|
||||
|
||||
String pagedGroupListPrev();
|
||||
String pagedGroupListNext();
|
||||
}
|
||||
|
@ -98,6 +98,9 @@ errorNoGitRepository = No Git Repository
|
||||
pagedProjectListPrev = ⇦Prev
|
||||
pagedProjectListNext = Next⇨
|
||||
|
||||
pagedGroupListPrev = ⇦Prev
|
||||
pagedGroupListNext = Next⇨
|
||||
|
||||
addPermission = Add Permission ...
|
||||
|
||||
# Permission Names
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user