NIHVIVO-2279 Add more functions to the UserAccount controller.
This commit is contained in:
parent
9b41389bd7
commit
74a34e8a31
17 changed files with 728 additions and 216 deletions
|
@ -763,12 +763,12 @@
|
|||
</servlet-mapping>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>UserAccountsList</servlet-name>
|
||||
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.accounts.UserAccountsListController</servlet-class>
|
||||
<servlet-name>UserAccounts</servlet-name>
|
||||
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.accounts.UserAccountsController</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>UserAccountsList</servlet-name>
|
||||
<url-pattern>/listUserAccounts</url-pattern>
|
||||
<servlet-name>UserAccounts</servlet-name>
|
||||
<url-pattern>/userAccounts/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet>
|
||||
|
|
|
@ -197,18 +197,20 @@ public class VitroHttpServlet extends HttpServlet {
|
|||
}
|
||||
|
||||
/**
|
||||
* If logging is set to the TRACE level, dump the HTTP headers on the
|
||||
* request.
|
||||
* If logging on the subclass is set to the TRACE level, dump the HTTP
|
||||
* headers on the request.
|
||||
*/
|
||||
private void dumpRequestHeaders(HttpServletRequest req) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Enumeration<String> names = req.getHeaderNames();
|
||||
|
||||
log.trace("----------------------request:" + req.getRequestURL());
|
||||
Log subclassLog = LogFactory.getLog(this.getClass());
|
||||
subclassLog.trace("----------------------request:"
|
||||
+ req.getRequestURL());
|
||||
while (names.hasMoreElements()) {
|
||||
String name = names.nextElement();
|
||||
if (!BORING_HEADERS.contains(name)) {
|
||||
log.trace(name + "=" + req.getHeader(name));
|
||||
subclassLog.trace(name + "=" + req.getHeader(name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount.Status;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
public class UserAccountsAddPage extends UserAccountsPage {
|
||||
private static final String PARAMETER_SUBMIT = "submitAdd";
|
||||
private static final String PARAMETER_EMAIL_ADDRESS = "emailAddress";
|
||||
private static final String PARAMETER_FIRST_NAME = "firstName";
|
||||
private static final String PARAMETER_LAST_NAME = "lastName";
|
||||
private static final String PARAMETER_ROLE = "role";
|
||||
private static final String PARAMETER_ASSOCIATE_WITH_PROFILE = "associate";
|
||||
|
||||
private static final String ERROR_NO_EMAIL = "errorEmailIsEmpty";
|
||||
private static final String ERROR_EMAIL_IN_USE = "errorEmailInUse";
|
||||
private static final String ERROR_NO_FIRST_NAME = "errorFirstNameIsEmpty";
|
||||
private static final String ERROR_NO_LAST_NAME = "errorLastNameIsEmpty";
|
||||
private static final String ERROR_NO_ROLE = "errorNoRoleSelected";
|
||||
|
||||
private static final String TEMPLATE_NAME = "userAccounts-add.ftl";
|
||||
|
||||
/* The request parameters */
|
||||
private boolean submit;
|
||||
private String emailAddress = "";
|
||||
private String firstName = "";
|
||||
private String lastName = "";
|
||||
private String selectedRoleUri = "";
|
||||
private boolean associateWithProfile;
|
||||
|
||||
/* The result of validating a "submit" request. */
|
||||
private String errorCode = "";
|
||||
|
||||
public UserAccountsAddPage(VitroRequest vreq) {
|
||||
super(vreq);
|
||||
}
|
||||
|
||||
public void parseParametersAndValidate() {
|
||||
parseRequestParameters();
|
||||
|
||||
if (submit) {
|
||||
validateParameters();
|
||||
}
|
||||
}
|
||||
|
||||
private void parseRequestParameters() {
|
||||
submit = isFlagOnRequest(PARAMETER_SUBMIT);
|
||||
emailAddress = getStringParameter(PARAMETER_EMAIL_ADDRESS, "");
|
||||
firstName = getStringParameter(PARAMETER_FIRST_NAME, "");
|
||||
lastName = getStringParameter(PARAMETER_LAST_NAME, "");
|
||||
selectedRoleUri = getRoleChoices();
|
||||
associateWithProfile = getAssociateFlag();
|
||||
}
|
||||
|
||||
public boolean isSubmit() {
|
||||
return submit;
|
||||
}
|
||||
|
||||
private void validateParameters() {
|
||||
if (emailAddress.isEmpty()) {
|
||||
errorCode = ERROR_NO_EMAIL;
|
||||
} else if (isEmailInUse()) {
|
||||
errorCode = ERROR_EMAIL_IN_USE;
|
||||
} else if (firstName.isEmpty()) {
|
||||
errorCode = ERROR_NO_FIRST_NAME;
|
||||
} else if (lastName.isEmpty()) {
|
||||
errorCode = ERROR_NO_LAST_NAME;
|
||||
} else if (selectedRoleUri.isEmpty()) {
|
||||
errorCode = ERROR_NO_ROLE;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isEmailInUse() {
|
||||
return userAccountsDao.getUserAccountByEmail(emailAddress) != null;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
return errorCode.isEmpty();
|
||||
}
|
||||
|
||||
public UserAccount createNewAccount() {
|
||||
UserAccount u = new UserAccount();
|
||||
u.setEmailAddress(emailAddress);
|
||||
u.setFirstName(firstName);
|
||||
u.setLastName(lastName);
|
||||
u.setExternalAuthId("");
|
||||
|
||||
u.setMd5Password("");
|
||||
u.setOldPassword("");
|
||||
u.setPasswordChangeRequired(false);
|
||||
u.setPasswordLinkExpires(0);
|
||||
u.setLoginCount(0);
|
||||
u.setStatus(Status.INACTIVE);
|
||||
|
||||
u.setPermissionSetUris(Collections.singleton(selectedRoleUri));
|
||||
|
||||
String uri = userAccountsDao.insertUserAccount(u);
|
||||
return userAccountsDao.getUserAccountByUri(uri);
|
||||
}
|
||||
|
||||
/** What role are they asking for? */
|
||||
private String getRoleChoices() {
|
||||
String[] roles = vreq.getParameterValues(PARAMETER_ROLE);
|
||||
if ((roles == null) || (roles.length == 0)) {
|
||||
return "";
|
||||
} else {
|
||||
return roles[0];
|
||||
}
|
||||
}
|
||||
|
||||
/** Are they associating with an Individual profile? */
|
||||
private boolean getAssociateFlag() {
|
||||
return "yes".equals(getStringParameter(
|
||||
PARAMETER_ASSOCIATE_WITH_PROFILE, "no"));
|
||||
}
|
||||
|
||||
public ResponseValues showPage() {
|
||||
Map<String, Object> body = new HashMap<String, Object>();
|
||||
|
||||
body.put("emailAddress", emailAddress);
|
||||
body.put("firstName", firstName);
|
||||
body.put("lastName", lastName);
|
||||
body.put("selectedRole", selectedRoleUri);
|
||||
body.put("associate", associateWithProfile);
|
||||
|
||||
body.put("roles", buildRolesList());
|
||||
|
||||
body.put("formUrls", buildUrlsMap());
|
||||
|
||||
if (!errorCode.isEmpty()) {
|
||||
body.put(errorCode, Boolean.TRUE);
|
||||
}
|
||||
|
||||
return new TemplateResponseValues(TEMPLATE_NAME, body);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.usepages.ManageUserAccounts;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
|
||||
|
||||
/**
|
||||
* Parcel out the different actions required of the UserAccounts GUI.
|
||||
*/
|
||||
public class UserAccountsController extends FreemarkerHttpServlet {
|
||||
private static final Log log = LogFactory
|
||||
.getLog(UserAccountsController.class);
|
||||
|
||||
private static final String ACTION_ADD = "/add";
|
||||
private static final String ACTION_DELETE = "/delete";
|
||||
private static final String ACTION_EDIT = "/edit";
|
||||
|
||||
@Override
|
||||
protected Actions requiredActions(VitroRequest vreq) {
|
||||
return new Actions(new ManageUserAccounts());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ResponseValues processRequest(VitroRequest vreq) {
|
||||
if (log.isDebugEnabled()) {
|
||||
dumpRequestParameters(vreq);
|
||||
}
|
||||
|
||||
String action = vreq.getPathInfo();
|
||||
log.debug("action = '" + action + "'");
|
||||
|
||||
if (ACTION_ADD.equals(action)) {
|
||||
UserAccountsAddPage page = new UserAccountsAddPage(vreq);
|
||||
page.parseParametersAndValidate();
|
||||
if (page.isSubmit() && page.isValid()) {
|
||||
return addAccountAndShowList(vreq, page);
|
||||
} else {
|
||||
return page.showPage();
|
||||
}
|
||||
|
||||
} else if (ACTION_EDIT.equals(action)) {
|
||||
return new UserAccountsEditPage(vreq).showPage();
|
||||
|
||||
} else if (ACTION_DELETE.equals(action)) {
|
||||
UserAccountsDeleter deleter = new UserAccountsDeleter(vreq);
|
||||
Collection<String> deletedUris = deleter.delete();
|
||||
|
||||
return new UserAccountsListPage(vreq)
|
||||
.showPageWithDeletions(deletedUris);
|
||||
|
||||
} else {
|
||||
UserAccountsListPage page = new UserAccountsListPage(vreq);
|
||||
return page.showPage();
|
||||
}
|
||||
}
|
||||
|
||||
private ResponseValues addAccountAndShowList(VitroRequest vreq,
|
||||
UserAccountsAddPage addPage) {
|
||||
UserAccount userAccount = addPage.createNewAccount();
|
||||
|
||||
UserAccountsListPage listPage = new UserAccountsListPage(vreq);
|
||||
return listPage.showPageWithNewAccount(userAccount);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
public class UserAccountsDeleter extends UserAccountsPage {
|
||||
|
||||
protected UserAccountsDeleter(VitroRequest vreq) {
|
||||
super(vreq);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*
|
||||
*/
|
||||
public Collection<String> delete() {
|
||||
// TODO Auto-generated method stub
|
||||
throw new RuntimeException("UserAccountsDeleter.delete() not implemented.");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
public class UserAccountsEditPage extends UserAccountsPage {
|
||||
private static final String TEMPLATE_NAME = "userAccounts-edit.ftl";
|
||||
|
||||
public UserAccountsEditPage(VitroRequest vreq) {
|
||||
super(vreq);
|
||||
}
|
||||
|
||||
public ResponseValues showPage() {
|
||||
return new TemplateResponseValues(TEMPLATE_NAME);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -5,41 +5,32 @@ package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
|||
import static edu.cornell.mannlib.vitro.webapp.controller.accounts.UserAccountsSelectionCriteria.DEFAULT_ACCOUNTS_PER_PAGE;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.hp.hpl.jena.ontology.OntModel;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.usepages.ManageUserAccounts;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount.Status;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.accounts.UserAccountsOrdering.Direction;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.accounts.UserAccountsOrdering.Field;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
|
||||
|
||||
/**
|
||||
* Display the paginated list of User Accounts.
|
||||
* Handle the List page.
|
||||
*/
|
||||
public class UserAccountsListController extends FreemarkerHttpServlet {
|
||||
public class UserAccountsListPage extends UserAccountsPage {
|
||||
private static final Log log = LogFactory
|
||||
.getLog(UserAccountsListController.class);
|
||||
.getLog(UserAccountsListPage.class);
|
||||
|
||||
public static final String PARAMETER_ACCOUNTS_PER_PAGE = "accountsPerPage";
|
||||
public static final String PARAMETER_PAGE_INDEX = "pageIndex";
|
||||
|
@ -54,67 +45,19 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
|
||||
private static final String TEMPLATE_NAME = "userAccounts-list.ftl";
|
||||
|
||||
private OntModel userAccountsModel;
|
||||
private UserAccountsDao userAccountsDao;
|
||||
private UserAccountsSelectionCriteria criteria = UserAccountsSelectionCriteria.DEFAULT_CRITERIA;
|
||||
|
||||
@Override
|
||||
public void init() throws ServletException {
|
||||
super.init();
|
||||
|
||||
OntModelSelector oms = (OntModelSelector) getServletContext()
|
||||
.getAttribute("baseOntModelSelector");
|
||||
userAccountsModel = oms.getUserAccountsModel();
|
||||
|
||||
WebappDaoFactory wdf = (WebappDaoFactory) getServletContext()
|
||||
.getAttribute("webappDaoFactory");
|
||||
userAccountsDao = wdf.getUserAccountsDao();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Actions requiredActions(VitroRequest vreq) {
|
||||
return new Actions(new ManageUserAccounts());
|
||||
public UserAccountsListPage(VitroRequest vreq) {
|
||||
super(vreq);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assume the default criteria for display. Modify the criteria based on
|
||||
* parameters in the request. Get the selected accounts and display them.
|
||||
* Build the criteria from the request parameters.
|
||||
*/
|
||||
@Override
|
||||
protected ResponseValues processRequest(VitroRequest vreq) {
|
||||
if (log.isDebugEnabled()) {
|
||||
dumpRequestParameters(vreq);
|
||||
}
|
||||
|
||||
Map<String, Object> body = new HashMap<String, Object>();
|
||||
|
||||
UserAccountsSelectionCriteria criteria = buildCriteria(vreq);
|
||||
|
||||
body.put("accountsPerPage", criteria.getAccountsPerPage());
|
||||
body.put("pageIndex", criteria.getPageIndex());
|
||||
body.put("orderDirection", criteria.getOrderBy().getDirection().keyword);
|
||||
body.put("orderField", criteria.getOrderBy().getField().name);
|
||||
body.put("roleFilterUri", criteria.getRoleFilterUri());
|
||||
body.put("searchTerm", criteria.getSearchTerm());
|
||||
|
||||
UserAccountsSelection selection = UserAccountsSelector.select(
|
||||
userAccountsModel, criteria);
|
||||
|
||||
body.put("accounts", wrapUserAccounts(selection));
|
||||
body.put("total", selection.getResultCount());
|
||||
body.put("page", buildPageMap(selection));
|
||||
|
||||
body.put("formUrl", buildFormUrl(vreq));
|
||||
body.put("roles", buildRolesList());
|
||||
|
||||
body.put("messages", buildMessagesMap(vreq));
|
||||
|
||||
return new TemplateResponseValues(TEMPLATE_NAME, body);
|
||||
}
|
||||
|
||||
private UserAccountsSelectionCriteria buildCriteria(VitroRequest vreq) {
|
||||
int accountsPerPage = getIntegerParameter(vreq,
|
||||
PARAMETER_ACCOUNTS_PER_PAGE, DEFAULT_ACCOUNTS_PER_PAGE);
|
||||
int pageIndex = getIntegerParameter(vreq, PARAMETER_PAGE_INDEX, 1);
|
||||
public void parseParameters() {
|
||||
int accountsPerPage = getIntegerParameter(PARAMETER_ACCOUNTS_PER_PAGE,
|
||||
DEFAULT_ACCOUNTS_PER_PAGE);
|
||||
int pageIndex = getIntegerParameter(PARAMETER_PAGE_INDEX, 1);
|
||||
|
||||
Direction orderingDirection = Direction.fromKeyword(vreq
|
||||
.getParameter(PARAMETER_ORDERING_DIRECTION));
|
||||
|
@ -123,33 +66,72 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
UserAccountsOrdering ordering = new UserAccountsOrdering(orderingField,
|
||||
orderingDirection);
|
||||
|
||||
String roleFilterUri = getStringParameter(vreq,
|
||||
PARAMETER_ROLE_FILTER_URI, "");
|
||||
String searchTerm = getStringParameter(vreq, PARAMETER_SEARCH_TERM, "");
|
||||
String roleFilterUri = getStringParameter(PARAMETER_ROLE_FILTER_URI, "");
|
||||
String searchTerm = getStringParameter(PARAMETER_SEARCH_TERM, "");
|
||||
|
||||
return new UserAccountsSelectionCriteria(accountsPerPage, pageIndex,
|
||||
ordering, roleFilterUri, searchTerm);
|
||||
criteria = new UserAccountsSelectionCriteria(accountsPerPage,
|
||||
pageIndex, ordering, roleFilterUri, searchTerm);
|
||||
}
|
||||
|
||||
private String getStringParameter(VitroRequest vreq, String key,
|
||||
String defaultValue) {
|
||||
String value = vreq.getParameter(key);
|
||||
return (value == null) ? defaultValue : value;
|
||||
/**
|
||||
* Build the selection criteria from the request, select the accounts, and
|
||||
* create the ResponseValues to display the page.
|
||||
*/
|
||||
public ResponseValues showPage() {
|
||||
UserAccountsSelection selection = UserAccountsSelector.select(
|
||||
userAccountsModel, criteria);
|
||||
Map<String, Object> body = buildTemplateBodyMap(selection);
|
||||
return new TemplateResponseValues(TEMPLATE_NAME, body);
|
||||
}
|
||||
|
||||
private int getIntegerParameter(VitroRequest vreq, String key,
|
||||
int defaultValue) {
|
||||
String value = vreq.getParameter(key);
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
/**
|
||||
* We just came from adding a new account. Show the list with a message.
|
||||
*/
|
||||
public ResponseValues showPageWithNewAccount(UserAccount userAccount) {
|
||||
UserAccountsSelection selection = UserAccountsSelector.select(
|
||||
userAccountsModel, criteria);
|
||||
Map<String, Object> body = buildTemplateBodyMap(selection);
|
||||
|
||||
try {
|
||||
return Integer.parseInt(value);
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("Invalid integer for parameter '" + key + "': " + value);
|
||||
return defaultValue;
|
||||
}
|
||||
body.put("newUserAccount", new UserAccountWrapper(vreq, userAccount,
|
||||
Collections.<String> emptyList()));
|
||||
|
||||
return new TemplateResponseValues(TEMPLATE_NAME, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* We just came from deleting accounts. Show the list with a message.
|
||||
*/
|
||||
public ResponseValues showPageWithDeletions(Collection<String> deletedUris) {
|
||||
UserAccountsSelection selection = UserAccountsSelector.select(
|
||||
userAccountsModel, criteria);
|
||||
Map<String, Object> body = buildTemplateBodyMap(selection);
|
||||
|
||||
body.put("deletedAccountCount", deletedUris.size());
|
||||
|
||||
return new TemplateResponseValues(TEMPLATE_NAME, body);
|
||||
}
|
||||
|
||||
private Map<String, Object> buildTemplateBodyMap(
|
||||
UserAccountsSelection selection) {
|
||||
Map<String, Object> body = new HashMap<String, Object>();
|
||||
|
||||
body.put("accountsPerPage", criteria.getAccountsPerPage());
|
||||
body.put("pageIndex", criteria.getPageIndex());
|
||||
body.put("orderDirection", criteria.getOrderBy().getDirection().keyword);
|
||||
body.put("orderField", criteria.getOrderBy().getField().name);
|
||||
body.put("roleFilterUri", criteria.getRoleFilterUri());
|
||||
body.put("searchTerm", criteria.getSearchTerm());
|
||||
|
||||
body.put("accounts", wrapUserAccounts(selection));
|
||||
body.put("total", selection.getResultCount());
|
||||
body.put("page", buildPageMap(selection));
|
||||
|
||||
body.put("formUrls", buildUrlsMap());
|
||||
body.put("roles", buildRolesList());
|
||||
|
||||
body.put("messages", buildMessagesMap());
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
private Map<String, Integer> buildPageMap(UserAccountsSelection selection) {
|
||||
|
@ -175,50 +157,31 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
return map;
|
||||
}
|
||||
|
||||
private String buildFormUrl(VitroRequest vreq) {
|
||||
UrlBuilder urlBuilder = new UrlBuilder(vreq.getAppBean());
|
||||
return urlBuilder.getPortalUrl("/listUserAccounts");
|
||||
}
|
||||
|
||||
private List<PermissionSet> buildRolesList() {
|
||||
List<PermissionSet> list = new ArrayList<PermissionSet>();
|
||||
list.addAll(userAccountsDao.getAllPermissionSets());
|
||||
Collections.sort(list, new Comparator<PermissionSet>() {
|
||||
@Override
|
||||
public int compare(PermissionSet ps1, PermissionSet ps2) {
|
||||
return ps1.getUri().compareTo(ps2.getUri());
|
||||
}
|
||||
});
|
||||
return list;
|
||||
}
|
||||
|
||||
private Map<String, Object> buildMessagesMap(VitroRequest vreq) {
|
||||
private Map<String, Object> buildMessagesMap() {
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
|
||||
UserAccount newUser = getUserFromUriParameter(vreq,
|
||||
PARAMETER_NEW_USER_URI);
|
||||
UserAccount newUser = getUserFromUriParameter(PARAMETER_NEW_USER_URI);
|
||||
if (newUser != null) {
|
||||
map.put("newUser", newUser);
|
||||
}
|
||||
|
||||
UserAccount updatedUser = getUserFromUriParameter(vreq,
|
||||
PARAMETER_UPDATED_USER_URI);
|
||||
UserAccount updatedUser = getUserFromUriParameter(PARAMETER_UPDATED_USER_URI);
|
||||
if (updatedUser != null) {
|
||||
map.put("updatedUser", updatedUser);
|
||||
}
|
||||
|
||||
if (isFlagOnRequest(vreq, FLAG_UPDATED_USER_PW)) {
|
||||
if (isFlagOnRequest(FLAG_UPDATED_USER_PW)) {
|
||||
map.put("updatedUserPw", true);
|
||||
}
|
||||
|
||||
if (isFlagOnRequest(vreq, FLAG_USERS_DELETED)) {
|
||||
if (isFlagOnRequest(FLAG_USERS_DELETED)) {
|
||||
map.put("usersDeleted", true);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private UserAccount getUserFromUriParameter(VitroRequest vreq, String key) {
|
||||
private UserAccount getUserFromUriParameter(String key) {
|
||||
String uri = vreq.getParameter(key);
|
||||
if ((uri == null) || uri.isEmpty()) {
|
||||
return null;
|
||||
|
@ -227,11 +190,6 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
return userAccountsDao.getUserAccountByUri(uri);
|
||||
}
|
||||
|
||||
private boolean isFlagOnRequest(VitroRequest vreq, String key) {
|
||||
String value = vreq.getParameter(key);
|
||||
return (value != null);
|
||||
}
|
||||
|
||||
/**
|
||||
* The UserAccount has a list of PermissionSetUris, but the Freemarker
|
||||
* template needs a list of PermissionSet labels instead.
|
||||
|
@ -240,7 +198,7 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
UserAccountsSelection selection) {
|
||||
List<UserAccountWrapper> list = new ArrayList<UserAccountWrapper>();
|
||||
for (UserAccount account : selection.getUserAccounts()) {
|
||||
list.add(new UserAccountWrapper(account,
|
||||
list.add(new UserAccountWrapper(vreq, account,
|
||||
findPermissionSetLabels(account)));
|
||||
}
|
||||
return list;
|
||||
|
@ -263,11 +221,16 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
public static class UserAccountWrapper {
|
||||
private final UserAccount account;
|
||||
private final List<String> permissionSets;
|
||||
private final String editUrl;
|
||||
|
||||
public UserAccountWrapper(UserAccount account,
|
||||
public UserAccountWrapper(VitroRequest vreq, UserAccount account,
|
||||
List<String> permissionSets) {
|
||||
this.account = account;
|
||||
this.permissionSets = permissionSets;
|
||||
|
||||
UrlBuilder urlBuilder = new UrlBuilder(vreq.getAppBean());
|
||||
this.editUrl = urlBuilder.getPortalUrl("/userAccounts/edit",
|
||||
new ParamMap("editAccount", account.getUri()));
|
||||
}
|
||||
|
||||
public String getUri() {
|
||||
|
@ -303,6 +266,10 @@ public class UserAccountsListController extends FreemarkerHttpServlet {
|
|||
return permissionSets;
|
||||
}
|
||||
|
||||
public String getEditUrl() {
|
||||
return editUrl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.hp.hpl.jena.ontology.OntModel;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
|
||||
|
||||
/**
|
||||
* Common routines for the page controllers.
|
||||
*/
|
||||
public abstract class UserAccountsPage {
|
||||
private static final Log log = LogFactory.getLog(UserAccountsPage.class);
|
||||
|
||||
protected final VitroRequest vreq;
|
||||
protected final ServletContext ctx;
|
||||
protected final OntModel userAccountsModel;
|
||||
protected final UserAccountsDao userAccountsDao;
|
||||
|
||||
protected UserAccountsPage(VitroRequest vreq) {
|
||||
this.vreq = vreq;
|
||||
this.ctx = vreq.getSession().getServletContext();
|
||||
|
||||
OntModelSelector oms = (OntModelSelector) this.ctx
|
||||
.getAttribute("baseOntModelSelector");
|
||||
userAccountsModel = oms.getUserAccountsModel();
|
||||
|
||||
WebappDaoFactory wdf = (WebappDaoFactory) this.ctx
|
||||
.getAttribute("webappDaoFactory");
|
||||
userAccountsDao = wdf.getUserAccountsDao();
|
||||
}
|
||||
|
||||
protected String getStringParameter(String key, String defaultValue) {
|
||||
String value = vreq.getParameter(key);
|
||||
return (value == null) ? defaultValue : value;
|
||||
}
|
||||
|
||||
protected int getIntegerParameter(String key, int defaultValue) {
|
||||
String value = vreq.getParameter(key);
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
try {
|
||||
return Integer.parseInt(value);
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("Invalid integer for parameter '" + key + "': " + value);
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for the presence of a parameter, regardless of its value, even if
|
||||
* it's an empty string.
|
||||
*/
|
||||
protected boolean isFlagOnRequest(String key) {
|
||||
String value = vreq.getParameter(key);
|
||||
return (value != null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a list of all known PermissionSets.
|
||||
*/
|
||||
protected List<PermissionSet> buildRolesList() {
|
||||
List<PermissionSet> list = new ArrayList<PermissionSet>();
|
||||
list.addAll(userAccountsDao.getAllPermissionSets());
|
||||
Collections.sort(list, new Comparator<PermissionSet>() {
|
||||
@Override
|
||||
public int compare(PermissionSet ps1, PermissionSet ps2) {
|
||||
return ps1.getUri().compareTo(ps2.getUri());
|
||||
}
|
||||
});
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make these URLs available to all of the pages.
|
||||
*/
|
||||
protected Map<String, String> buildUrlsMap() {
|
||||
UrlBuilder urlBuilder = new UrlBuilder(vreq.getAppBean());
|
||||
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
|
||||
map.put("list", urlBuilder.getPortalUrl("/userAccounts/list"));
|
||||
map.put("add", urlBuilder.getPortalUrl("/userAccounts/add"));
|
||||
map.put("delete", urlBuilder.getPortalUrl("/userAccounts/delete"));
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
}
|
|
@ -11,6 +11,10 @@ package edu.cornell.mannlib.vitro.webapp.controller.accounts;
|
|||
public class UserAccountsSelectionCriteria {
|
||||
public static final int DEFAULT_ACCOUNTS_PER_PAGE = 25;
|
||||
|
||||
public static final UserAccountsSelectionCriteria DEFAULT_CRITERIA = new UserAccountsSelectionCriteria(
|
||||
DEFAULT_ACCOUNTS_PER_PAGE, 1,
|
||||
UserAccountsOrdering.DEFAULT_ORDERING, "", "");
|
||||
|
||||
/** How many accounts should we bring back, at most? */
|
||||
private final int accountsPerPage;
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ public class SiteAdminController extends FreemarkerHttpServlet {
|
|||
urls.put("users", urlBuilder.getPortalUrl("/listUsers"));
|
||||
}
|
||||
if (PolicyHelper.isAuthorizedForActions(vreq, new ManageUserAccounts())) {
|
||||
urls.put("userList", urlBuilder.getPortalUrl("/listUserAccounts"));
|
||||
urls.put("userList", urlBuilder.getPortalUrl("/userAccounts"));
|
||||
}
|
||||
|
||||
if (PolicyHelper.isAuthorizedForActions(vreq, new EditSiteInformation())) {
|
||||
|
|
|
@ -20,6 +20,14 @@ public interface UserAccountsDao {
|
|||
*/
|
||||
UserAccount getUserAccountByUri(String uri);
|
||||
|
||||
/**
|
||||
* Get the UserAccount for this Email address.
|
||||
*
|
||||
* @return null if the Email address is null, or if there is no such
|
||||
* UserAccount
|
||||
*/
|
||||
UserAccount getUserAccountByEmail(String emailAddress);
|
||||
|
||||
/**
|
||||
* Create a new UserAccount in the model.
|
||||
*
|
||||
|
|
|
@ -32,6 +32,11 @@ public class UserAccountsDaoFiltering extends BaseFiltering implements
|
|||
return innerDao.getUserAccountByUri(uri);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserAccount getUserAccountByEmail(String emailAddress) {
|
||||
return innerDao.getUserAccountByEmail(emailAddress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String insertUserAccount(UserAccount userAccount) {
|
||||
return innerDao.insertUserAccount(userAccount);
|
||||
|
|
|
@ -11,6 +11,7 @@ import com.hp.hpl.jena.ontology.OntModel;
|
|||
import com.hp.hpl.jena.ontology.OntResource;
|
||||
import com.hp.hpl.jena.rdf.model.Resource;
|
||||
import com.hp.hpl.jena.rdf.model.Statement;
|
||||
import com.hp.hpl.jena.rdf.model.StmtIterator;
|
||||
import com.hp.hpl.jena.shared.Lock;
|
||||
import com.hp.hpl.jena.util.iterator.ClosableIterator;
|
||||
import com.hp.hpl.jena.vocabulary.RDF;
|
||||
|
@ -71,6 +72,28 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserAccount getUserAccountByEmail(String emailAddress) {
|
||||
if (emailAddress == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String userUri = null;
|
||||
|
||||
getOntModel().enterCriticalSection(Lock.READ);
|
||||
try {
|
||||
StmtIterator stmts = getOntModel().listStatements(null, USERACCOUNT_EMAIL_ADDRESS,
|
||||
getOntModel().createLiteral(emailAddress));
|
||||
if (stmts.hasNext()) {
|
||||
userUri = stmts.next().getSubject().getURI();
|
||||
}
|
||||
} finally {
|
||||
getOntModel().leaveCriticalSection();
|
||||
}
|
||||
|
||||
return getUserAccountByUri(userUri);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String insertUserAccount(UserAccount userAccount) {
|
||||
if (userAccount == null) {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
package edu.cornell.mannlib.vitro.webapp.dao.jena;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.fail;
|
||||
|
@ -46,6 +47,9 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass {
|
|||
private static final String URI_USER1 = NS_MINE + "user01";
|
||||
private static final String URI_NO_SUCH_USER = NS_MINE + "bogusUser";
|
||||
|
||||
private static final String EMAIL_USER1 = "email@able.edu";
|
||||
private static final String EMAIL_NO_SUCH_USER = NS_MINE + "bogus@email.com";
|
||||
|
||||
private static final String URI_ROLE1 = NS_MINE + "role1";
|
||||
private static final String URI_ROLE2 = NS_MINE + "role2";
|
||||
private static final String URI_ROLE3 = NS_MINE + "role3";
|
||||
|
@ -100,6 +104,24 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass {
|
|||
assertNull("null result", u);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUserAccountByEmailSuccess() {
|
||||
UserAccount u = dao.getUserAccountByEmail(EMAIL_USER1);
|
||||
assertEquals("uri", URI_USER1, u.getUri());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUserAccountByEmailNull() {
|
||||
UserAccount u = dao.getUserAccountByEmail(null);
|
||||
assertEquals("uri", null, u);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUserAccountByEmailNotFound() {
|
||||
UserAccount u = dao.getUserAccountByEmail(EMAIL_NO_SUCH_USER);
|
||||
assertEquals("uri", null, u);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insertUserAccountSuccess() {
|
||||
UserAccount in = new UserAccount();
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Template for adding a user account -->
|
||||
|
||||
<h1>Add new account</h1>
|
||||
|
||||
<#if errorEmailIsEmpty??>
|
||||
<#assign errorMessage = "You must supply an email address." />
|
||||
</#if>
|
||||
|
||||
<#if errorEmailInUse??>
|
||||
<#assign errorMessage = "An account with that email address already exists." />
|
||||
</#if>
|
||||
|
||||
<#if errorFirstNameIsEmpty??>
|
||||
<#assign errorMessage = "You must supply a first name." />
|
||||
</#if>
|
||||
|
||||
<#if errorLastNameIsEmpty??>
|
||||
<#assign errorMessage = "You must supply a last name." />
|
||||
</#if>
|
||||
|
||||
<#if errorNoRoleSelected??>
|
||||
<#assign errorMessage = "You must select a role." />
|
||||
</#if>
|
||||
|
||||
<#if errorMessage?has_content>
|
||||
<section id="error-alert" role="alert">
|
||||
<img src="${urls.images}/iconAlert.png" width="24" height="24" alert="Error alert icon"/>
|
||||
<p>${errorMessage}</p>
|
||||
</section>
|
||||
</#if>
|
||||
|
||||
<form method="POST" action="${formUrls.add}">
|
||||
Email address *
|
||||
<br/>
|
||||
<input type="text" name="emailAddress" value="${emailAddress}" />
|
||||
<br/>
|
||||
First name *
|
||||
<br/>
|
||||
<input type="text" name="firstName" value="${firstName}" />
|
||||
<br/>
|
||||
Last name *
|
||||
<br/>
|
||||
<input type="text" name="lastName" value="${lastName}" />
|
||||
<br/>
|
||||
<br/>
|
||||
Roles *
|
||||
<br/>
|
||||
<#list roles as role>
|
||||
<input type="radio" name="role" value="${role.uri}" <#if selectedRole = role.uri>selected</#if> />${role.label}
|
||||
<br>
|
||||
</#list>
|
||||
<br/>
|
||||
Associate a profile with this account
|
||||
<br/>
|
||||
<input type="radio" name="associate" value="yes" <#if associate??>checked</#if> />Yes
|
||||
<br/>
|
||||
<input type="radio" name="associate" value="no" <#if !associate??>checked</#if> />No
|
||||
<br/>
|
||||
|
||||
<p>
|
||||
Note: An email will be sent to the address entered above
|
||||
notifying that an account has been created.
|
||||
It will include instructions for activating the account and creating a password.
|
||||
</p>
|
||||
|
||||
<input type="submit" name="submitAdd" value="Add new account" />
|
||||
or <a href="${formUrls.list}">Cancel</a>
|
||||
</form>
|
|
@ -0,0 +1,6 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Template for editing a user account -->
|
||||
|
||||
<h1>Edit user account</h1>
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
<#-- Template for displaying list of user accounts -->
|
||||
|
||||
<form method="POST" action="${formUrl}">
|
||||
<form method="POST" action="${formUrls.list}">
|
||||
|
||||
<#--current page: <input type="text" name="pageIndex" value="${page.current}" />
|
||||
<br />-->
|
||||
|
@ -38,12 +38,28 @@
|
|||
<input type="submit" name="list" value="Refresh page" />-->
|
||||
</form>
|
||||
|
||||
<h3>Account | <input type="submit" name="add" class="submit" value="Add new account" /></h3>
|
||||
<!-- When this is clicked, all other fields are ignored. -->
|
||||
<form method="POST" action="${formUrls.add}">
|
||||
<h3>Account | <input type="submit" class="submit" value="Add new account" /></h3>
|
||||
</form>
|
||||
|
||||
<section class="account-feedback">
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a hrf="#">Maecenas dui erat</a>, dapibus non vehicula at, tristique eu sem. Suspendisse ligula felis, mollis vitae elementum eget, semper a nisl.</p>
|
||||
</section>
|
||||
<#if newUserAccount?? >
|
||||
<section class="account-feedback">
|
||||
<p>
|
||||
A new account for
|
||||
<a href="${newUserAccount.editUrl}">${newUserAccount.firstName} ${newUserAccount.lastName}</a>
|
||||
was successfully created. A notification email has been sent to ${newUserAccount.emailAddress}
|
||||
with instructions for activating the account and creating a password.
|
||||
</p>
|
||||
</section>
|
||||
</#if>
|
||||
|
||||
<#if deletedAccountCount?? >
|
||||
<section class="account-feedback">
|
||||
<p>
|
||||
Deleted ${deletedAccountCount} accounts.
|
||||
</p>
|
||||
</section>
|
||||
</#if>
|
||||
|
||||
<section id="filter-roles">
|
||||
<select name="roleFilterUri" id="">
|
||||
|
@ -59,26 +75,37 @@
|
|||
</select>
|
||||
</section>
|
||||
|
||||
<section id="search-accounts">
|
||||
<input type="text" name="" />
|
||||
<input class="submit" type="submit" value="Search accounts"/>
|
||||
<!--
|
||||
When searchTerm changes,
|
||||
set pageIndex to 1
|
||||
set orderDirection to "ASC"
|
||||
set orderField to "email"
|
||||
submit the form (submit action is "list")
|
||||
-->
|
||||
</section>
|
||||
<form method="POST" action="${formUrls.list}">
|
||||
<section id="search-accounts">
|
||||
<input type="text" name="" />
|
||||
<input class="submit" type="submit" value="Search accounts"/>
|
||||
<!--
|
||||
When searchTerm changes,
|
||||
set pageIndex to 1
|
||||
set orderDirection to "ASC"
|
||||
set orderField to "email"
|
||||
submit the form (submit action is "list")
|
||||
-->
|
||||
</section>
|
||||
</form>
|
||||
|
||||
<section class="accounts">
|
||||
<input type="submit" name="delete" class="submit delete-account" value="Delete" />
|
||||
<!-- When this is clicked, the checkboxes are noticed and all other fields are ignored. -->
|
||||
<SCRIPT TYPE="text/javascript">
|
||||
function changeAction(form, url) {
|
||||
form.action = url;
|
||||
return true;
|
||||
}
|
||||
</SCRIPT>
|
||||
|
||||
<nav class="display-tools">
|
||||
<span>| <a href="#">n</a> accounts | </span>
|
||||
<form method="POST" action="${formUrls.list}">
|
||||
<section class="accounts">
|
||||
<input type="submit" class="submit delete-account" value="Delete" onClick="changeAction(this.form, '${formUrls.delete}')" />
|
||||
<!--
|
||||
When this is clicked, the checkboxes are noticed and all other fields are ignored.
|
||||
submit the form (submit action is formUrls.delete)
|
||||
-->
|
||||
|
||||
<form method="get" class="accounts-per-page-form" name="list" action="${formUrl}">
|
||||
<nav class="display-tools">
|
||||
<span>| <a href="#">n</a> accounts | </span>
|
||||
|
||||
<#assign counts = [25, 50, 100]>
|
||||
<select name="accountsPerPage" class="accounts-per-page">
|
||||
|
@ -88,69 +115,65 @@
|
|||
<!--
|
||||
When accountsPerPage changes,
|
||||
set pageIndex to 1
|
||||
submit the form (submit action is "list")
|
||||
submit the form (submit action is formUrls.list)
|
||||
-->
|
||||
</select>
|
||||
|
||||
<input class="hide" type="submit" value="Update" />
|
||||
</form>
|
||||
|
||||
accounts per page |
|
||||
accounts per page |
|
||||
|
||||
<#if page.previous?has_content>
|
||||
<a href="${formUrl}?accountsPerPage=${accountsPerPage}&pageIndex=${page.previous}">Previous</a> <!-- only present if current page is not 1.-->
|
||||
</#if>
|
||||
${page.current} of ${page.last}
|
||||
<#if page.next?has_content>
|
||||
<a href="${formUrl}?accountsPerPage=${accountsPerPage}&pageIndex=${page.next}">Next</a><!-- only present if current page is not last page.-->
|
||||
</#if>
|
||||
</nav>
|
||||
</section>
|
||||
<#if page.previous?has_content>
|
||||
<a href="${formUrls.list}?accountsPerPage=${accountsPerPage}&pageIndex=${page.previous}">Previous</a> <!-- only present if current page is not 1.-->
|
||||
</#if>
|
||||
${page.current} of ${page.last}
|
||||
<#if page.next?has_content>
|
||||
<a href="${formUrls.list}?accountsPerPage=${accountsPerPage}&pageIndex=${page.next}">Next</a><!-- only present if current page is not last page.-->
|
||||
</#if>
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<table id="account">
|
||||
<caption>Account Management</caption>
|
||||
<table id="account">
|
||||
<caption>Account Management</caption>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">
|
||||
<div>
|
||||
<form method="get" class="delete-all-accounts" name="list" action="${formUrl}">
|
||||
<input class="hide" type="checkbox" name="delete-all" id="">Email Address<span></span>
|
||||
</form>
|
||||
</div>
|
||||
</th>
|
||||
<th scope="col"><div>First name <a href="?accountsPerPage=${accountsPerPage}&orderField=firstName&orderDirection=ASC"><img class="middle" src="${urls.themeImages}/sort-asc.gif" /></a> <a href="?accountsPerPage=${accountsPerPage}&orderField=firstNameorderDirection=DEC"><img src="${urls.themeImages}/sort-desc.gif" /></a></div></th>
|
||||
<th scope="col"><div>Last Name<span></span></div></th>
|
||||
<th scope="col"><div>Status<span></span></div></th>
|
||||
<th scope="col"><div>Roles</div></th>
|
||||
<th scope="col"><div>Login Count<span></span></div></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<#list accounts as account>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="deleteAccount" value="${account.uri}" />
|
||||
<!-- ignored unless submit action is "delete" -->
|
||||
|
||||
<a href="${formUrl}?edit&editAccount=${account.uri}" >${account.emailAddress}</a>
|
||||
<!-- if submit action is "edit", editAccount is noticed and all other fields are ignored. -->
|
||||
</td>
|
||||
<td>${account.firstName}</td>
|
||||
<td>${account.lastName}</td>
|
||||
<td>${account.status}</td>
|
||||
<td>
|
||||
<#list account.permissionSets as permissionSet>
|
||||
<div>${permissionSet}</div>
|
||||
</#list>
|
||||
</td>
|
||||
<td>${account.loginCount}</td>
|
||||
<th scope="col">
|
||||
<div>
|
||||
<input class="hide" type="checkbox" name="delete-all" id="">Email Address<span></span>
|
||||
</div>
|
||||
</th>
|
||||
<th scope="col"><div>First name <a href="?accountsPerPage=${accountsPerPage}&orderField=firstName&orderDirection=ASC"><img class="middle" src="${urls.themeImages}/sort-asc.gif" /></a> <a href="?accountsPerPage=${accountsPerPage}&orderField=firstNameorderDirection=DEC"><img src="${urls.themeImages}/sort-desc.gif" /></a></div></th>
|
||||
<th scope="col"><div>Last Name<span></span></div></th>
|
||||
<th scope="col"><div>Status<span></span></div></th>
|
||||
<th scope="col"><div>Roles</div></th>
|
||||
<th scope="col"><div>Login Count<span></span></div></th>
|
||||
</tr>
|
||||
</#list>
|
||||
</tbody>
|
||||
</table>
|
||||
</thead>
|
||||
|
||||
<#--link on user's email address currently does nothing-->
|
||||
<tbody>
|
||||
<#list accounts as account>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="deleteAccount" value="${account.uri}" />
|
||||
<!-- ignored unless submit action is formUrls.delete -->
|
||||
|
||||
<a href="${account.editUrl}" >${account.emailAddress}</a>
|
||||
<!-- when this link is clicked, editAccount is noticed and all other fields are ignored. -->
|
||||
</td>
|
||||
<td>${account.firstName}</td>
|
||||
<td>${account.lastName}</td>
|
||||
<td>${account.status}</td>
|
||||
<td>
|
||||
<#list account.permissionSets as permissionSet>
|
||||
<div>${permissionSet}</div>
|
||||
</#list>
|
||||
</td>
|
||||
<td>${account.loginCount}</td>
|
||||
</tr>
|
||||
</#list>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/account/accountUtils.js"></script>')}
|
Loading…
Add table
Reference in a new issue