diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java index 5e9d4a3ad79e4e4f7d8b37e63fd8b47aef0e4b10..fc9eeadf2cf8afab4d028239aa44d5f699376b2d 100755 --- a/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java +++ b/src/main/java/no/nibio/vips/logic/controller/servlet/UserController.java @@ -98,6 +98,9 @@ public class UserController extends HttpServlet { if(user.isSuperUser()) { users = userBean.getAllUsers(); + List<Organization> organizations = userBean.getOrganizations(); + request.setAttribute("organizations", organizations); + request.setAttribute("vipsLogicRoles", em.createNamedQuery("VipsLogicRole.findAll").getResultList()); } else { diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties index cfff66476042e9d1180477161823fe21b4489a7d..3b7c538dafe48032f4ab467b2efd9597b4be7e96 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties @@ -1038,3 +1038,5 @@ dd_upper=Day degree upper cutoffs observedPhase=Observed phase at biofix date YSTEMBTEMP=Yellow Stemborer Temperature Model addIllustration=Add illustration +allRoles=All roles +allStatuses=All statuses diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties index 1afc139bfe76d5367aa934e00a138b4af2fb573c..bb9653e045f85d43e06250948804dd95c770a56b 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties @@ -1031,3 +1031,5 @@ dd_upper=Day degree upper cutoffs observedPhase=Observed phase at biofix date YSTEMBTEMP=Yellow Stemborer Temperature Model addIllustration=Add illustration +allRoles=All roles +allStatuses=All statuses diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties index 44987729cc137364253d4baed14b90d6d168d499..076d4b6059dbde4cd8627443542ddba64d430e4e 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties @@ -1030,3 +1030,5 @@ dd_upper=Day degree upper cutoffs observedPhase=Observed phase at biofix date YSTEMBTEMP=Yellow Stemborer Temperature Model addIllustration=Add illustration +allRoles=All roles +allStatuses=All statuses diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties index 9066a82ec8fc7476518cdfd69438631be26424bc..55c9412dcefcf209f51d7be54786b09dd4931d1d 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties @@ -1039,3 +1039,5 @@ dd_upper=Maksimumstemperaturer d\u00f8gngradberegning observedPhase=Observert utviklingsstadium ved biofix-dato YSTEMBTEMP=Yellow Stemborer temperaturmodell addIllustration=Legg til illustrasjon +allRoles=Alle roller +allStatuses=Alle statuser diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties index fee3ba47efc49f20df1bf08dcabec1f8d873f8ce..4bd388a6d593250d1d8a469c0e306eb98145647d 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties @@ -1032,3 +1032,5 @@ dd_upper=Day degree upper cutoffs observedPhase=Observed phase at biofix date YSTEMBTEMP=Yellow Stemborer Temperature Model addIllustration=Add illustration +allRoles=All roles +allStatuses=All statuses diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties index 778dbb652dbcaf8d46e4f39f05385da8d57ed831..21a6db363439269f7656e3725adeb3ff8d744919 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties @@ -1025,3 +1025,5 @@ dd_upper=Day degree upper cutoffs observedPhase=Observed phase at biofix date YSTEMBTEMP=Yellow Stemborer Temperature Model addIllustration=Add illustration +allRoles=All roles +allStatuses=All statuses diff --git a/src/main/webapp/templates/userList.ftl b/src/main/webapp/templates/userList.ftl index 8d0ab98310df1df27eae7f4f0eb5a07139ca3fc2..b5a0d5ba96d48a5451368b3d0ae189f68a9cc421 100755 --- a/src/main/webapp/templates/userList.ftl +++ b/src/main/webapp/templates/userList.ftl @@ -18,39 +18,182 @@ <#macro page_head> <title>${i18nBundle.users}</title> </#macro> +<#macro custom_css> + <style type="text/css"> + ul { + padding-inline-start: 1px; + } + </style> + +</#macro> +<#macro custom_js> + <script type="text/javascript"> + + const statusPlace = 2; + const orgPlace = 3; + const table = document.getElementById("userList"); + const tr = table.getElementsByTagName("tr"); + + function sortAll() { + + var organID = document.getElementById("selectOrg").value; + var roleTypeId = document.getElementById("selectUserRole").value; + var statusId = document.getElementById("selectStatus").value; + + for (i = 1; i < tr.length; i++) { + var organization = tr[i].getElementsByTagName("td")[orgPlace].id; + var role = tr[i].getElementsByTagName('li'); + var status = tr[i].getElementsByTagName("td")[statusPlace].id; + var displayStatus = true; + var displayOrg = true; + var displayRole = false; + + if (organID != '-1' && organization != organID) { + displayOrg = false; + } + + if (statusId != '-1' && status != statusId) { + displayStatus = false; + } + + if(roleTypeId == -1){ + displayRole = true; + } else { + if(role != null){ + for(j = 0; j<role.length ; j++){ + if(displayRole != true){ + var userType = role[j].id; + + if(userType == roleTypeId){ + displayRole = true; + } + } + } + } + } + if (displayRole && displayOrg && displayStatus) { + tr[i].style.display = ""; + } else { + tr[i].style.display = "none"; + } + } + } + + function sortByUserRole() { + var roleTypeId = document.getElementById("selectUserRole").value; + + for (i = 1; i < tr.length; i++) { + var isDisplay = false; + var role = tr[i].getElementsByTagName('li'); + + if(roleTypeId == -1){ + isDisplay = true; + } else { + if(role != null){ + for(j = 0; j<role.length ; j++){ + if(isDisplay != true){ + var userType = role[j].id; + + if(userType == roleTypeId){ + isDisplay = true; + } + } + } + } + } + if (isDisplay) { + tr[i].style.display = ""; + } else { + tr[i].style.display = "none"; + } + } + } + + </script> +</#macro> <#macro page_contents> <div class="singleBlockContainer"> <h1>${i18nBundle.users}</h1> - <p> - <a href="/user?action=newUser" class="btn btn-default" role="button">${i18nBundle.addNew}</a> + <p> + <a href="/user?action=newUser" class="btn btn-default" role="button">${i18nBundle.addNew}</a> </p> <#if messageKey?has_content> <div class="alert alert-success">${i18nBundle(messageKey)}</div> - </#if> + </#if> + <tr> + <td> + <div class="row"> + <div class="col-sm-4"> + <#if user.isSuperUser() || user.isOrganizationAdmin() > + <select onchange="<#if user.isSuperUser()>sortAll();<#else>sortByUserRole();</#if>" id="selectUserRole" class="form-control"> + <option value="-1">${i18nBundle.allRoles}</option> + <#list vipsLogicRoles as role> + <option value="${role.vipsLogicRoleId}">${i18nBundle["vipsLogicRole_" + role.vipsLogicRoleId]}</option> + </#list> + </select> + </#if> + </div> + <div class="col-sm-4"> + <#if user.isSuperUser() > + <select onchange="sortAll();" id="selectOrg" class="form-control"> + <option value="-1">${i18nBundle.allOrganizations}</option> + <#list organizations as org> + <option value=${org.organizationId}>${org.organizationName}</option> + </#list> + </select> + </#if> + </div> + <div class="col-sm-4"> + <#if user.isSuperUser() || user.isOrganizationAdmin()> + <select id="selectStatus" onchange="sortAll();" class="form-control"> + <option value="-1">${i18nBundle.allStatuses}</option> + <option value="1">${i18nBundle["userStatus_" + 1]}</option> + <option value="2">${i18nBundle["userStatus_" + 2]}</option> + <option value="3">${i18nBundle["userStatus_" + 3]}</option> + <option value="4">${i18nBundle["userStatus_" + 4]}</option> + <option value="5">${i18nBundle["userStatus_" + 5]}</option> + </select> + </#if> + </div> + </div> + </td> + </tr> + <br> <div class="table-responsive"> - <table class="table table-striped"> + <table class="table table-striped" id="userList"> <thead> <th>${i18nBundle.lastName}</th> <th>${i18nBundle.firstName}</th> <th>${i18nBundle.status}</th> + <th>${i18nBundle.organizationId}</th> + <th>${i18nBundle.vipsLogicRoles}</th> </thead> <tbody> <!-- The ones that need treatment first --> - <#assign userStatusOrdering = [2,4,3,1,5]> + <#assign userStatusOrdering = [2,1,3,4,5]> <#list userStatusOrdering as currentUserStatusId> <#list users?sort_by("lastName") as user> <#if user.userStatusId == currentUserStatusId> - <tr> - <td><a href="/user?action=viewUser&userId=${user.userId}">${user.lastName}</a></td> - <td><a href="/user?action=viewUser&userId=${user.userId}">${user.firstName}</a></td> - <td>${i18nBundle["userStatus_" + user.userStatusId]}</td> - </tr> + <tr> + <td><a href="/user?action=viewUser&userId=${user.userId}">${user.lastName}</a></td> + <td><a href="/user?action=viewUser&userId=${user.userId}">${user.firstName}</a></td> + <td id=${user.userStatusId}>${i18nBundle["userStatus_" + user.userStatusId]}</td> + <td id=${user.organizationId.organizationId}>${user.organizationId.organizationName}</td> + <td> + <#list user.vipsLogicRoles as role> + <ul> + <li id=${role.vipsLogicRoleId} style="list-style-type:none">${i18nBundle["vipsLogicRole_" + role.vipsLogicRoleId]}</li> + </ul> + </#list> + </td> + </tr> </#if> </#list> </#list> </tbody> - </table> + </table> </div> </div> + </#macro> <@page_html/>