Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/java/Bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,9 @@ dashboard.card.harvestingserver.sets={0, choice, 0#Sets|1#Set|2#Sets}
dashboard.card.harvestingserver.btn.manage=Manage Server
dashboard.card.metadataexport.header=Metadata Export
dashboard.card.metadataexport.message=Dataset metadata export is only available through the {0} API. Learn more in the {0} {1}API Guide{2}.
dashboard.card.users.header=Users
dashboard.card.users.empty=No users have been created.
dashboard.card.users.btn.manage=Manage Users

#harvestclients.xhtml
harvestclients.title=Manage Harvesting Clients
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package edu.harvard.iq.dataverse.dashboard;

import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

@ViewScoped
@Named
public class DashboardUsersPage implements java.io.Serializable {

@EJB
AuthenticationServiceBean authenticationService;

public List<AuthenticatedUser> getAuthenticatedUsers() {
return authenticationService.findAllAuthenticatedUsers();
}
}
113 changes: 113 additions & 0 deletions src/main/webapp/dashboard-users.xhtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<h:head>
</h:head>
<h:body>
<f:metadata>
<f:viewParam name="dataverseId" value="#{dataverseServiceBean.findRootDataverse().id}"/>
<f:viewAction action="#{dataverseHeaderFragment.initBreadcrumbs(dataverseServiceBean.findRootDataverse())}"/>
<f:viewAction action="#{dataverseHeaderFragment.addBreadcrumb('/dashboard.xhtml?dataverseId='.concat(dataverse.id), bundle['dashboard.title'])}"/>
<f:viewAction action="#{dataverseHeaderFragment.addBreadcrumb(bundle['dashboard.card.users.header'])}"/>
</f:metadata>
<ui:composition template="/dataverse_template.xhtml">
<ui:param name="pageTitle" value="#{bundle['dashboard.card.users.header']} - #{dataverseServiceBean.findRootDataverse().name} #{bundle.dataverse}"/>
<ui:param name="showDataverseHeader" value="false"/>
<ui:define name="body">
<h:form id="manageUsersForm" class="row">
<div class="col-xs-12">
<div class="col-xs-6">
<div class="input-group">
<input id="filterUsers" name="filterUsers" type="text" class="ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all form-control" role="textbox" aria-disabled="false" aria-readonly="false" placeholder="Filter users..."/>
<span class="input-group-btn">
<a href="#" class="ui-commandlink ui-widget btn btn-default" onclick="return false;">
<span class="glyphicon glyphicon-search"></span> Filter
</a>
</span>
</div>
</div>
<div class="col-xs-6 text-right">
<ul class="pagination" style="margin:0;">
<!--should take you to page 1-->
<li class="disabled">
<h:outputLink value="#">
<h:outputText value="&#171;"/>
</h:outputLink>
</li>
<li class="disabled">
<h:outputLink value="#{widgetWrapper.wrapURL(page)}">
<h:outputText value="&lt; #{bundle.previous}"/>
</h:outputLink>
</li>
<ui:remove>
<c:forEach begin="#{Math:max(1,SearchIncludeFragment.page-Math:max(2,SearchIncludeFragment.page-SearchIncludeFragment.totalPages+4))}"
end="#{Math:min(SearchIncludeFragment.totalPages,SearchIncludeFragment.page+Math:max(2,5-SearchIncludeFragment.page))}"
varStatus="pageStatus">
<li class="#{SearchIncludeFragment.page == pageStatus.index ? 'active' : ''}">
<h:outputLink value="#{widgetWrapper.wrapURL(page)}">
<h:outputText value="#{pageStatus.index}">
<f:convertNumber pattern="###,###" />
</h:outputText>
<span class="#{SearchIncludeFragment.page == pageStatus.index ? 'sr-only' : ''}">
<h:outputText value="#{SearchIncludeFragment.page == pageStatus.index ? bundle['dataverse.results.paginator.current'] : ''}"/>
</span>
<f:param name="q" value="#{SearchIncludeFragment.query}"/>
<c:forEach items="#{SearchIncludeFragment.filterQueries}" var="clickedFilterQuery" varStatus="status">
<f:param name="fq#{status.index}" value='#{clickedFilterQuery}'/>
</c:forEach>
<f:param name="types" value="#{SearchIncludeFragment.selectedTypesString}"/>
<f:param name="sort" value="#{SearchIncludeFragment.sortField}"/>
<f:param name="order" value="#{SearchIncludeFragment.sortOrder}"/>
<f:param name="page" value="#{pageStatus.index}"/>
</h:outputLink>
</li>
</c:forEach>
</ui:remove>
<li class="disabled">
<h:outputLink value="#">
<h:outputText value="#{bundle.next} &gt;"/>
</h:outputLink>
</li>
<li class="disabled">
<h:outputLink value="#">
<h:outputText value="&#187;"/>
</h:outputLink>
</li>
</ul>
</div>
</div>
<div class="col-xs-12">
<p:dataTable var="user" value="#{dashboardUsersPage.authenticatedUsers}" paginator="true" rows="5">
<p:column headerText="Id">
<h:outputText value="#{user.id}"/>
</p:column>
<p:column headerText="Username">
<h:outputText value="#{user.identifier}"/>
</p:column>
<p:column headerText="Given Name">
<h:outputText value="#{user.firstName}"/>
</p:column>
<p:column headerText="Family Name">
<h:outputText value="#{user.lastName}"/>
</p:column>
<p:column headerText="Email">
<h:outputText value="#{user.email}"/>
</p:column>
<p:column headerText="Affiliation">
<h:outputText value="#{user.affiliation}"/>
</p:column>
<p:column headerText="Position">
<h:outputText value="#{user.position}"/>
</p:column>
</p:dataTable>
</div>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
25 changes: 25 additions & 0 deletions src/main/webapp/dashboard.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,31 @@
</div>
</div>
</div>
<div class="col-md-4">
<div class="card-box">
<h4 class="header-title">#{bundle['dashboard.card.users.header']}</h4>
<div class="row text-center" jsf:rendered="#{true}">
<div class="col-xs-12" jsf:rendered="#{true}">
<p class="small text-muted">#{bundle['dashboard.card.users.empty']}</p>
</div>
<div class="col-xs-6" jsf:rendered="#{true}">
<h:outputText value="##,###"/>
<p class="small text-muted">Users</p>
</div>
<div class="col-xs-6" jsf:rendered="#{true}">
<h:outputText value="##"/>
<p class="small text-muted">Super-Users</p>
</div>
</div>
<div class="row text-center">
<div class="col-xs-12">
<p>
<a href="/dashboard-users.xhtml" class="btn btn-primary" role="button">#{bundle['dashboard.card.users.btn.manage']}</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Expand Down
20 changes: 20 additions & 0 deletions src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -301,4 +301,24 @@ public void testFindPermissonsOn() {
assertEquals(200, deleteSuperuser.getStatusCode());
}

@Test
public void testCreateManyUsers() {
boolean disabled = true;
if (disabled) {
return;
}
// FIXME: JSF datatable performance is horrific with this many users. There may be code
// in DVN 3 we can grab. Otherwise, we should look into
// https://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml
// and/or these answers from BalusC:
// https://stackoverflow.com/questions/2372648/large-jsf-datatable-backed-by-database-that-can-handle-paging-sorting
// https://stackoverflow.com/questions/1986998/resultset-to-pagination
int numUsersInProdAtHarvard = 14000;
int numUsersToCreate = numUsersInProdAtHarvard;
for (int i = 0; i < numUsersToCreate; i++) {
System.out.println("creating user " + i);
Response createRandomUserResponse = UtilIT.createRandomUser();
}
}

}