package org.sakaiproject.delegatedaccess.tool.pages; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; import org.apache.wicket.markup.repeater.DefaultItemReuseStrategy; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.IDataProvider; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.sakaiproject.delegatedaccess.model.SearchResult; import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants; import org.sakaiproject.delegatedaccess.util.SearchResultComparator; /** * This page searches for user's in Sakai and redirects the user to their edit page to assign access * * @author Bryan Holladay (holladay@longsight.com) * */ public class SearchUsersPage extends BasePage { Link<Void> toThirdPageLink; private String search = ""; private int orderBy = DelegatedAccessConstants.SEARCH_COMPARE_DEFAULT; private boolean orderAsc = true; SearchResultDataProvider provider; public SearchUsersPage() { disableLink(searchUsersLink); //Create Search Form: final PropertyModel<String> messageModel = new PropertyModel<String>(this, "search"); Form<?> form = new Form("form"){ @Override protected void onSubmit() { super.onSubmit(); if(provider != null){ provider.detachManually(); } } }; form.add(new TextField<String>("search", messageModel)); add(form); //show user's search (if not null) add(new Label("searchResultsTitle", new StringResourceModel("searchResultsTitle", null)){ @Override public boolean isVisible() { return messageModel.getObject() != null && !"".equals(messageModel.getObject()); } }); add(new Label("searchString",messageModel){ @Override public boolean isVisible() { return messageModel.getObject() != null && !"".equals(messageModel.getObject()); } }); //search result table: //Headers Link<Void> userIdSort = new Link<Void>("userIdSortLink"){ private static final long serialVersionUID = 1L; public void onClick() { changeOrder(DelegatedAccessConstants.SEARCH_COMPARE_EID); } @Override public boolean isVisible() { return provider.size() > 0; } }; add(userIdSort); Link<Void> nameSort = new Link<Void>("nameSortLink"){ private static final long serialVersionUID = 1L; public void onClick() { changeOrder(DelegatedAccessConstants.SEARCH_COMPARE_SORT_NAME); } @Override public boolean isVisible() { return provider.size() > 0; } }; add(nameSort); Link<Void> emailSort = new Link<Void>("emailSortLink"){ private static final long serialVersionUID = 1L; public void onClick() { changeOrder(DelegatedAccessConstants.SEARCH_COMPARE_EMAIL); } @Override public boolean isVisible() { return provider.size() > 0; } }; add(emailSort); Link<Void> typeSort = new Link<Void>("typeSortLink"){ private static final long serialVersionUID = 1L; public void onClick() { changeOrder(DelegatedAccessConstants.SEARCH_COMPARE_TYPE); } @Override public boolean isVisible() { return provider.size() > 0; } }; add(typeSort); //Data: provider = new SearchResultDataProvider(); final DataView<SearchResult> dataView = new DataView<SearchResult>("searchResult", provider) { @Override public void populateItem(final Item item) { final SearchResult searchResult = (SearchResult) item.getModelObject(); item.add(new Label("userId", searchResult.getEid())); Link<Void> userEditLink = new Link("editLink"){ private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new UserEditPage(searchResult.getId(), searchResult.getDisplayName())); } }; item.add(userEditLink); Link<Void> userViewLink = new Link("viewLink"){ private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new SearchAccessPage(false, searchResult.getEid())); } }; item.add(userViewLink); item.add(new Label("name", searchResult.getSortName())); item.add(new Label("email", searchResult.getEmail())); item.add(new Label("type", searchResult.getType())); } @Override public boolean isVisible() { return provider.size() > 0; } }; dataView.setItemReuseStrategy(new DefaultItemReuseStrategy()); dataView.setItemsPerPage(DelegatedAccessConstants.SEARCH_RESULTS_PAGE_SIZE); add(dataView); //Navigation //add a pager to our table, only visible if we have more than SEARCH_RESULTS_PAGE_SIZE items add(new PagingNavigator("navigatorTop", dataView) { @Override public boolean isVisible() { if(provider.size() > DelegatedAccessConstants.SEARCH_RESULTS_PAGE_SIZE) { return true; } return false; } @Override public void onBeforeRender() { super.onBeforeRender(); //clear the feedback panel messages clearFeedback(feedbackPanel); } }); add(new PagingNavigator("navigatorBottom", dataView) { @Override public boolean isVisible() { if(provider.size() > DelegatedAccessConstants.SEARCH_RESULTS_PAGE_SIZE) { return true; } return false; } @Override public void onBeforeRender() { super.onBeforeRender(); //clear the feedback panel messages clearFeedback(feedbackPanel); } }); } /** * changes order by desc or asc * * @param sortByColumn */ private void changeOrder(int sortByColumn){ if(sortByColumn == orderBy){ orderAsc = !orderAsc; }else{ orderBy = sortByColumn; } } /** * A data provider for the search results table. This calls the search functions in Sakai * */ private class SearchResultDataProvider implements IDataProvider<SearchResult>{ private boolean lastOrderAsc = true; private int lastOrderBy = DelegatedAccessConstants.SEARCH_COMPARE_DEFAULT; private List<SearchResult> list; public void detach() { } public void detachManually(){ this.list = null; } public Iterator<? extends SearchResult> iterator(int first, int count) { return getData().subList(first, first + count).iterator(); } public IModel<SearchResult> model(final SearchResult object) { return new AbstractReadOnlyModel<SearchResult>() { private static final long serialVersionUID = 1L; @Override public SearchResult getObject() { return object; } }; } public int size() { return getData().size(); } private List<SearchResult> getData(){ if(list == null){ if(getSearch() != null && !"".equals(getSearch())){ list = projectLogic.searchUsers(getSearch()); if(!sakaiProxy.isSuperUser()){ //only allow super admins to modify their own permissions, //otherwise, remove the current user's id String userId = sakaiProxy.getCurrentUserId(); for (Iterator userItr = list.iterator(); userItr .hasNext();) { SearchResult user = (SearchResult) userItr.next(); if(userId.equals(user.getId())){ userItr.remove(); break; } } } sortList(); }else{ list = new ArrayList<SearchResult>(); } }else if(lastOrderAsc != orderAsc || lastOrderBy != orderBy){ sortList(); } return list; } private void sortList(){ Collections.sort(list, new SearchResultComparator(orderBy)); if(!orderAsc){ Collections.reverse(list); } this.lastOrderAsc = orderAsc; this.lastOrderBy = orderBy; } } public String getSearch() { return search; } public void setSearch(String search) { this.search = search; } }