diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..2d9616a --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1 @@ +${gcube.license} \ No newline at end of file diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..640cbf5 --- /dev/null +++ b/distro/README @@ -0,0 +1,65 @@ +The gCube System - ${name} +-------------------------------------------------- + +${description} + + +${gcube.description} + +${gcube.funding} + + +Version +-------------------------------------------------- + +${version} (${buildDate}) + +Please see the file named "changelog.xml" in this directory for the release notes. + + +Authors +-------------------------------------------------- + +* Panagiota Koltsida (p.koltsida@di.uoa.gr), University of Athens + + +Maintainers +----------- + +* Panagiota Koltsida (p.koltsida@di.uoa.gr), University of Athens + + +Download information +-------------------------------------------------- + +Source code is available from SVN: + ${scm.url} + +Binaries can be downloaded from the gCube website: + ${gcube.website} + + +Installation +-------------------------------------------------- + +Use the respective war + + +Documentation +-------------------------------------------------- + +Documentation is available on-line in the gCube Wiki: + ${gcube.wikiRoot}/Users%27_Management + + +Support +-------------------------------------------------- + +Bugs and support requests can be reported in the gCube issue tracking tool: + ${gcube.issueTracking} + + +Licensing +-------------------------------------------------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. \ No newline at end of file diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..5c54457 --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,33 @@ + + + First release of the redesigned portlet + + + UI usability improvements + Added more options in handling users and/or groups/roles + Fixed minor bugs concerning user deletion from VRE and scroll bars in modals + + + VRE Managers are informed for acceptance or rejection of requests + Fixed a bug in the request's grid causing grid not to be refreshed after an action + + + Displaying rejected requests + Improved modals' labels + + + Fixed a scroll bar issue + Updated the label for unregistering users from a VRE + Fixed a bug which preventing the display of the requests for registration + + + Fixed date sorting in table + Added notification for group membership + + + Removed acceptance admin column in table + + + Email on role assignment/revoke + + diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..d98989d --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,31 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + changelog.xml + + 755 + true + + + + + target/${build.finalName}.${project.packaging} + /${artifactId} + + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..739b0ac --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,25 @@ + + + + Service + + ${description} + PortletAdmin + ${artifactId} + ${version} + + + ${artifactId} + ${version} + + ${groupId} + ${artifactId} + ${version} + + + target/${build.finalName}.war + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bb87de6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,162 @@ + + + + 4.0.0 + + + maven-parent + org.gcube.tools + 1.0.0 + + + org.gcube.portlets.admin + UsersManagementPortlet + war + UsersManagement Portlet + UsersManagementPortlet portlet + 3.8.1-SNAPSHOT + + + scm:svn:https://svn.madgik.di.uoa.gr/code/gcube/Portlets/UsersManagementPortlet + scm:svn:https://svn.madgik.di.uoa.gr/code/gcube/Portlets/UsersManagementPortlet + https://svn.madgik.di.uoa.gr/code/gcube/Portlets/UsersManagementPortlet + + + + 6.2.2 + ${project.basedir}/distro + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + + + com.liferay.portal + portal-service + ${liferay.version} + provided + + + javax.portlet + portlet-api + provided + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + com.liferay.portal + util-taglib + 6.2.3 + + + org.slf4j + slf4j-api + 1.7.18 + + + + + + jstl + jstl + 1.2 + + + com.liferay.maven.archetypes + liferay-portlet-archetype + ${liferay.version} + + + + com.google.code.gson + gson + 2.3.1 + + + com.google.guava + guava + + + com.sun.mail + javax.mail + provided + + + org.gcube.dvos + usermanagement-core + + provided + + + org.gcube.common.portal + portal-manager + + provided + + + org.gcube.portal + custom-portal-handler + + provided + + + org.gcube.portal.mailing + email-templates-library + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + + + maven-compiler-plugin + 2.5 + + UTF-8 + 1.8 + 1.8 + + + + maven-resources-plugin + 2.5 + + UTF-8 + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.6 + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + + \ No newline at end of file diff --git a/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/EmailPartsConstruction.java b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/EmailPartsConstruction.java new file mode 100644 index 0000000..5e04e55 --- /dev/null +++ b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/EmailPartsConstruction.java @@ -0,0 +1,200 @@ +/** + * + */ +package gr.cite.bluebridge.portlets.admin.usersmanagementportlet; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Properties; + +import com.liferay.portal.kernel.log.Log; +import com.liferay.portal.kernel.log.LogFactoryUtil; + +/** + * @author Panagiota Koltsida + * + */ +public class EmailPartsConstruction { + static String gCubeFileName = "gcube-data.properties"; + static String propFileName = "EmailTemplates.properties"; + static String catalinaHome = System.getProperty("catalina.base"); + static String filePath = catalinaHome + File.separator + "conf" + File.separator; + + private static Log logger = LogFactoryUtil.getLog(EmailPartsConstruction.class); + + public static String returnProperty(String bodyKey){ + InputStream is = null; + try{ + Properties props = new Properties(); + logger.debug("Using file -> " + filePath + propFileName); + is = new FileInputStream(filePath + propFileName); + + if (is != null) { + props.load(is); + } + + String prop1 = props.getProperty(bodyKey); + logger.debug("The body msg that will be sent is.... "); + logger.debug(prop1); + return prop1; + }catch(Exception e){ + e.printStackTrace(); + } + + return null; + } + + public static String returnPortalName(){ + InputStream is = null; + try{ + Properties props = new Properties(); + logger.debug("Using file -> " + filePath + gCubeFileName); + is = new FileInputStream(filePath + gCubeFileName); + + if (is != null) { + props.load(is); + } + + String prop1 = props.getProperty("portalinstancename"); + logger.debug(prop1); + return prop1; + }catch(Exception e){ + e.printStackTrace(); + } + + return null; + } + + public static String returnBodyForMembershipRequestApproval(){ + InputStream is = null; + String body = ""; + try{ + Properties props = new Properties(); + logger.debug("Using file -> " + filePath + propFileName); + is = new FileInputStream(filePath + propFileName); + + if (is != null) { + props.load(is); + } + + String prop1 = props.getProperty(body); + logger.debug("The body msg that will be sent is.... "); + logger.debug(prop1); + return prop1; + }catch(Exception e){ + e.printStackTrace(); + } + + return null; + } + + public static void sendDismissalEmailToUser(){ + InputStream is = null; + try{ + Properties props = new Properties(); + logger.debug("Using file -> " + filePath + propFileName); + is = new FileInputStream(filePath + propFileName); + + if (is != null) { + props.load(is); + } + + String prop1 = props.getProperty("prop1"); + System.out.println(prop1); + + }catch(Exception e){ + e.printStackTrace(); + } + } + + public static String sendMailForMembershipRequestAcceptanceOrRejection( + String acceptRejectBody, + String userFullName, String groupName, String managerFullName, + String managerEmail, String userEmail, String portalComplete){ + + String body = returnProperty(acceptRejectBody); + + if(body != null){ + logger.info("portal name: " +portalComplete); + return java.text.MessageFormat.format(body, userFullName, groupName, managerFullName, managerEmail, userEmail, portalComplete); + } + + return ""; + } + + public static void sendMailForMembershipRequestRejection( + String userFullName, String groupName, String managerFullName, + String managerEmail, String userEmail, String portalComplete){ + + String body = returnProperty("membershipRequestRejectionBody"); + + if(body != null){ + java.text.MessageFormat.format(body, userFullName, groupName, managerFullName, managerEmail, userEmail); + } + } + + public static String subjectForMembershipRequestAcceptanceOrRejection( + String subjectProperty, String groupName){ + + String subject = returnProperty(subjectProperty); + if(subject != null){ + String finalString = groupName; + return java.text.MessageFormat.format(subject, finalString); + } + + return ""; + } + + public static String subjectForUserDismissalFromSite( + String subjectProperty, String groupName){ + return subjectForMembershipRequestAcceptanceOrRejection(subjectProperty, groupName); + } + + public static void userDismissalFromSite(String groupName){ + String body = returnProperty("userDismissalFromSiteBody"); + + if(body != null){ + java.text.MessageFormat.format(body, groupName); + } + } + + public static String getSiteTeamAssignmentSubject(String siteTeamName) { + String subject = returnProperty("siteTeamAssignmentSubject"); + String response = ""; + + if(subject != null && !subject.isEmpty()) { + response = java.text.MessageFormat.format(subject, siteTeamName); + } + + return response; + } + + public static String getSiteTeamDismissalSubject(String siteTeamName) { + String subject = returnProperty("siteTeamDismissalSubject"); + String response = ""; + + if(subject != null && !subject.isEmpty()) { + response = java.text.MessageFormat.format(subject, siteTeamName); + } + + return response; + } + + public static String getRoleAssignmentRevokeSubject(String groupname) { + String subject = returnProperty("roleAssignmentRevokeSubject"); + String response = ""; + + if(subject != null && !subject.isEmpty()) { + response = java.text.MessageFormat.format(subject, groupname); + } + + return response; + } + + public static String constructPortal(String protocol, String port, String baseURL){ + + + return baseURL; + } +} \ No newline at end of file diff --git a/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/UsersManagementPortletHome.java b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/UsersManagementPortletHome.java new file mode 100644 index 0000000..afd5cb0 --- /dev/null +++ b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/UsersManagementPortletHome.java @@ -0,0 +1,1443 @@ +package gr.cite.bluebridge.portlets.admin.usersmanagementportlet; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +import javax.portlet.GenericPortlet; +import javax.portlet.PortletException; +import javax.portlet.PortletRequest; +import javax.portlet.PortletRequestDispatcher; +import javax.portlet.RenderRequest; +import javax.portlet.RenderResponse; +import javax.portlet.ResourceRequest; +import javax.portlet.ResourceResponse; +import javax.servlet.http.HttpServletRequest; + +import gr.cite.bluebridge.portlets.admin.usersmanagementportlet.mail.templates.TemplateUserRolesModifiedForGroup; +import org.gcube.common.portal.PortalContext; +import org.gcube.portal.mailing.service.EmailTemplateService; +import org.gcube.portal.mailing.templates.TemplateUserApprovedRequestVRE; +import org.gcube.portal.mailing.templates.TemplateUserHasBeenUnregisteredVRE; +import org.gcube.portal.mailing.templates.TemplateUserRejectedRequestVRE; +import org.gcube.portal.mailing.message.EmailAddress; +import org.gcube.portal.mailing.message.Recipient; +import org.gcube.portal.mailing.message.RecipientType; +import org.gcube.vomanagement.usermanagement.GroupManager; +import org.gcube.vomanagement.usermanagement.RoleManager; +import org.gcube.vomanagement.usermanagement.UserManager; +import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; +import org.gcube.vomanagement.usermanagement.exception.RoleRetrievalFault; +import org.gcube.vomanagement.usermanagement.exception.TeamRetrievalFault; +import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException; +import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; +import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; +import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager; +import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeMembershipRequest; +import org.gcube.vomanagement.usermanagement.model.GCubeRole; +import org.gcube.vomanagement.usermanagement.model.GCubeTeam; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; +import org.gcube.vomanagement.usermanagement.model.MembershipRequestStatus; + +import com.google.gson.Gson; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.kernel.json.JSONArray; +import com.liferay.portal.kernel.json.JSONFactoryUtil; +import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.portal.kernel.log.Log; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import com.liferay.portal.kernel.util.ParamUtil; +import com.liferay.portal.util.PortalUtil; + +import gr.cite.bluebridge.portlets.admin.usersmanagementportlet.mail.templates.TemplateUserHasBeenAssociatedWithGCubeTeam; +import gr.cite.bluebridge.portlets.admin.usersmanagementportlet.mail.templates.TemplateUserHasBeenDissAssociatedWithGCubeTeam; + +public class UsersManagementPortletHome extends GenericPortlet { + protected String viewTemplate; + protected boolean once = true; + public GCubeUser currentUser; + private static Log _log = LogFactoryUtil.getLog(UsersManagementPortletHome.class); + private static final int REJECT_MEMBERSHIP_REQUESTS_TABLE = 0; + private static final int APPROVE_MEMBERSHIP_REQUESTS_TABLE = 1; + private static final int REFRESH_MEMBERSHIP_REQUESTS_TABLE = 2; + private static final int EDIT_CURRENT_USERS_TABLE= 1; + private static final int REFRESH_CURRENT_USERS_TABLE = 2; + private static final int SITE_TEAMS_TABLE_CREATE_GROUP = 3; + private static final int REFRESH_SITE_TEAMS_TABLE = 2; + private static final int EDIT_SITE_TEAMS_TABLE = 1; + private static final int DELETE_SITE_TEAMS_TABLE = 0; + private static final int MASS_EDIT_USERS = 0; + private static final int ASSIGN_ROLES_TO_USERS = 1; + private static final int ASSIGN_TEAMS_TO_USERS = 2; + + public void init() { + viewTemplate = getInitParameter("view-template"); + } + + public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { + include(viewTemplate, renderRequest, renderResponse); + } + + @Override + public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException { + PortalContext pContext = PortalContext.getConfiguration(); + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + + currentUser = pContext.getCurrentUser(httpServletRequest); + + PortletRequest portletRequest = (PortletRequest)request.getAttribute("javax.portlet.request"); + JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); + long selfId = currentUser.getUserId(); + + //CurrentUsers + boolean currentUsersTable = ParamUtil.getBoolean(request, "currentUsersTable"); + boolean deleteUsersFromCurrentUsersTable = ParamUtil.getBoolean(request, "deleteUsersFromCurrentUsersTable"); + int modeCurrentUsersTable = ParamUtil.getInteger(request, "modeCurrentUsersTable"); + long groupId = pContext.getCurrentGroupId(httpServletRequest); + + currentUsersTableSection( + currentUsersTable, deleteUsersFromCurrentUsersTable,modeCurrentUsersTable, + groupId, jsonObject, portletRequest, request, selfId); + + //MembershipRequests + boolean fetchUsersRequests = ParamUtil.getBoolean(request, "fetchUsersRequests"); + int modeMembershipRequestsTable = ParamUtil.getInteger(request, "modeMembershipRequestsTable"); + + membershipRequestsSection( + fetchUsersRequests, modeMembershipRequestsTable, + jsonObject, request, portletRequest, + groupId, httpServletRequest); + + boolean userRequestRejectionEmailSubject = ParamUtil.getBoolean(request, "userRequestRejectionEmailSubject"); + if(userRequestRejectionEmailSubject){ + try { + GroupManager gm = new LiferayGroupManager(); + String groupName = gm.getGroup(groupId).getGroupName(); + + String gatewayNameForSubject = PortalContext.getConfiguration().getGatewayName(httpServletRequest); + String groupNameForSubject = ""; + if(gm.isRootVO(groupId)) { + groupNameForSubject += " Virtual Organization"; + groupName = "" + groupName + " Virtual Organization"; + } else if(gm.isVRE(groupId)) { + groupNameForSubject += " Virtual Research Environment"; + groupName = "" + groupName + " Virtual Research Environment"; + }else{ + groupNameForSubject = groupName; + _log.debug("isRootVO: " + gm.isRootVO(groupId) + "\nisVRE: " + gm.isVRE(groupId)); + } + String emailSubject = getUserRequestRejectionEmailSubject(gatewayNameForSubject, groupNameForSubject); + jsonObject.put("userRequestRejectionEmailSubject", emailSubject); + + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + String json = new Gson().toJson(managersEmails ); + jsonObject.put("userRequestRejectionEmailAdminsMailsCC", json); + + _log.debug("VRE Manager rejection request email subject -> " + emailSubject); + } catch (UserManagementSystemException | GroupRetrievalFault e) { + _log.error("Failed to retrieve rejection request email subject"); + e.printStackTrace(); + } + } + + //RejectedmembershipRequests + boolean fetchUsersRejectedRequests = ParamUtil.getBoolean(request, "fetchUsersRejectedRequests"); + + rejectedMembershipRequestsSection( + fetchUsersRejectedRequests, + jsonObject, request, portletRequest, + groupId, httpServletRequest); + + //count the membership requests + boolean countUsersMembershipRequests = ParamUtil.getBoolean(request, "countUsersMembershipRequests"); + countUsersMembershipRequestsSection(countUsersMembershipRequests, jsonObject, groupId); + + //Site-teams handling + boolean fetchAllSiteTeamsForTheCurrentGroup = ParamUtil.getBoolean(request, "fetchAllSiteTeamsForTheCurrentGroup"); + int modeSiteTeams = ParamUtil.getInteger(request, "modeSiteTeams"); + if(fetchAllSiteTeamsForTheCurrentGroup){ + try { + siteTeamsForTheCurrentGroupSection( request, selfId, modeSiteTeams, groupId, jsonObject); + } catch (SystemException e) { + e.printStackTrace(); + } + } + + boolean rolesInitial = ParamUtil.getBoolean(request, "rolesInitial"); + if(rolesInitial) { + fetchRolesNames(groupId, jsonObject); + } + + boolean teamsInitial = ParamUtil.getBoolean(request, "teamsInitial"); + if(teamsInitial) { + try { + fetchTeamsNames(groupId, jsonObject); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } + } + + response.getWriter().println(jsonObject); + super.serveResource(request, response); + } + + protected void include(String path, RenderRequest renderRequest, RenderResponse renderResponse) throws IOException,PortletException { + String url = null; + if (renderRequest.getParameter("jspPage") == null || renderRequest.getParameter("jspPage").equals("./")) + url = path + "usersManagement.jsp"; + else + url = path + renderRequest.getParameter("jspPage"); + + PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher(url); + + if (portletRequestDispatcher == null) { + _log.error(path + " is not a valid include"); + } + else { + portletRequestDispatcher.include(renderRequest, renderResponse); + } + } + + protected void rejectMembershipRequests( + PortletRequest portletRequest, + ResourceRequest request, long[] theReqIDs, + long groupId, long managerId, boolean CustomRejectionEmailFromAdmin, + String CustomRejectionEmailBodyFromAdmin) + throws NumberFormatException, SystemException, PortalException, UserManagementSystemException, GroupRetrievalFault{ + UserManager um = new LiferayUserManager(); + List reqs; + GroupManager gm = new LiferayGroupManager(); + String managerName = currentUser.getUsername(); + String groupName = gm.getGroup(groupId).getGroupName(); + String groupNameForSubject = ""; + + if(gm.isRootVO(groupId)) { + groupNameForSubject += " Virtual Organization"; + groupName = "" + groupName + " Virtual Organization"; + } else if(gm.isVRE(groupId)) { + groupNameForSubject += " Virtual Research Environment"; + groupName = "" + groupName + " Virtual Research Environment"; + }else{ + groupNameForSubject = groupName; + _log.debug("isRootVO: " + gm.isRootVO(groupId) + "\nisVRE: " + gm.isVRE(groupId)); + } + + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + + _log.debug("Rejecting requests for the group: " + groupName); + + try { + reqs = um.listMembershipRequestsByGroup(groupId); + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + for(GCubeMembershipRequest req : reqs){ + for(long reqId : theReqIDs){ + if(req.getStatus() == MembershipRequestStatus.REQUEST && req.getMembershipRequestId() == reqId){ + GCubeUser replyUser = um.getUserById(managerId); + String replyComment = "Membership Request rejected"; + GCubeMembershipRequest gcmr = um.rejectMembershipRequest(req.getRequestingUser().getUserId(), groupId, replyUser.getUsername(), replyComment); + String userName = req.getRequestingUser().getUsername(); + + String emailRecipient = req.getRequestingUser().getEmail(); + String emailSubject = EmailPartsConstruction.subjectForMembershipRequestAcceptanceOrRejection( + "membershipRequestRejectionSubject", groupNameForSubject); + + // bcc also the VRE managers to be notified about the registration + int recSize = managersEmails.size() + 1; + Recipient[] recs = new Recipient[recSize]; + recs[0] = new Recipient(new EmailAddress(emailRecipient), RecipientType.TO); + if (!managersEmails.isEmpty()) { + int i = 1; + for (String mEmail : managersEmails) { + recs[i] = new Recipient(new EmailAddress(mEmail), RecipientType.BCC); + i++; + } + } + + TemplateUserRejectedRequestVRE requestRejectedTemplate = new TemplateUserRejectedRequestVRE( + req.getRequestingUser(), replyUser, gm.getGroup(groupId), gcmr.getCreateDate(), + PortalContext.getConfiguration().getGatewayName(httpServletRequest), PortalContext.getConfiguration().getGatewayURL(httpServletRequest)); + EmailTemplateService.send(emailSubject, (org.gcube.common.portal.mailing.templates.Template)requestRejectedTemplate, httpServletRequest, recs); + + _log.debug("Admin: " + managerName + " rejected the membership request of the user:" + userName + " for the site: " + groupName); + } + } + } + } catch (UserManagementPortalException e) { + _log.debug("MembershipRequest retrieval failure"); + e.printStackTrace(); + } catch (UserManagementSystemException e) { + _log.debug("MembershipRequest retrieval failure"); + e.printStackTrace(); + } catch (GroupRetrievalFault e) { + _log.debug("MembershipRequest retrieval failure"); + e.printStackTrace(); + } catch (UserRetrievalFault e) { + _log.debug("MembershipRequest retrieval failure"); + e.printStackTrace(); + } + } + + protected void acceptMemebershipRequestAndAddUsersToGroup(PortletRequest portletRequest, ResourceRequest request, long[] reqIDs, Long groupId, Long managerId) throws NumberFormatException, PortalException, SystemException, UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault { + LiferayUserManager lum = new LiferayUserManager(); + List membershipRequests = lum.listMembershipRequestsByGroup(groupId); + GCubeUser manager = lum.getUserById(managerId); + GroupManager gm = new LiferayGroupManager(); + String groupName = gm.getGroup(groupId).getGroupName(); + String groupNameForSubject = ""; + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + + if(gm.isRootVO(groupId)) { + groupNameForSubject += " Virtual Organization"; + groupName = "" + groupName + " Virtual Organization"; + } else if(gm.isVRE(groupId)) { + groupNameForSubject += " Virtual Research Environment"; + groupName = "" + groupName + " Virtual Research Environment"; + }else{ + groupNameForSubject = groupName; + _log.debug("isRootVO: " + gm.isRootVO(groupId) + "\nisVRE: " + gm.isVRE(groupId)); + } + + _log.debug("Accepting membership requests for the group: " + groupName); + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + for(GCubeMembershipRequest gcmr : membershipRequests){ + for(long reqId : reqIDs){ + if(gcmr.getStatus() == MembershipRequestStatus.REQUEST && gcmr.getMembershipRequestId() == reqId){ + boolean addUserToGroup = true; + try { + String managerComments = "Membership request approved"; + @SuppressWarnings("unused") + GCubeMembershipRequest gcmr2 = lum.acceptMembershipRequest(gcmr.getRequestingUser().getUserId(), groupId, addUserToGroup, manager.getUsername(), managerComments); + lum.assignUserToGroup(groupId, gcmr.getRequestingUser().getUserId()); + String userName = gcmr.getRequestingUser().getUsername(); + String managerName = manager.getUsername(); + + _log.debug("Admin: " + managerName + " accepted user's : " + userName + " membership request for the site: " + groupName); + + String userEmail = gcmr.getRequestingUser().getEmail(); + + String properEmailSubject = EmailPartsConstruction.subjectForMembershipRequestAcceptanceOrRejection( + "membershipRequestAcceptanceSubject", groupNameForSubject); + + // bcc also the VRE managers to be notified about the registration + int recSize = managersEmails.size() + 1; + Recipient[] recs = new Recipient[recSize]; + recs[0] = new Recipient(new EmailAddress(userEmail), RecipientType.TO); + if (!managersEmails.isEmpty()) { + int i = 1; + for (String mEmail : managersEmails){ + recs[i] = new Recipient(new EmailAddress(mEmail), RecipientType.BCC); + i++; + } + } + + + TemplateUserApprovedRequestVRE requestAcceptedTemplate = new TemplateUserApprovedRequestVRE( + gcmr.getRequestingUser(), manager, gm.getGroup(groupId), gcmr.getCreateDate(), + PortalContext.getConfiguration().getGatewayName(httpServletRequest), PortalContext.getConfiguration().getGatewayURL(httpServletRequest)); + EmailTemplateService.send(properEmailSubject, (org.gcube.common.portal.mailing.templates.Template)requestAcceptedTemplate, httpServletRequest, recs); + } catch (UserManagementPortalException e) { + _log.debug("User: " + gcmr.getRequestingUser().getUsername() + " wasn't added to the site: " + gm.getGroup(groupId).getGroupName()); + e.printStackTrace(); + } + } + } + } + } + + protected JSONArray numberOfRequestsForSpecificGroup(long groupId) throws PortalException, SystemException, UserManagementSystemException, GroupRetrievalFault, UserRetrievalFault{ + JSONArray ja = JSONFactoryUtil.createJSONArray(); + UserManager um = new LiferayUserManager(); + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = lgm.getGroup(groupId).getGroupName(); + _log.debug("Counting membership requests for group: " + groupName + " ..."); + + List gcmrList = new ArrayList(); + for(GCubeMembershipRequest gcmr : um.listMembershipRequestsByGroup(groupId)){ + if(gcmr.getStatus() == MembershipRequestStatus.REQUEST){ + gcmrList.add(gcmr); + } + } + _log.debug("There are " + gcmrList.size() + " for the group: " + groupName); + ja.put(gcmrList.size()); + + ja.put(EmailPartsConstruction.returnPortalName()); + + return ja; + } + + protected JSONArray currentGroupUsers( long groupId, long selfId, HttpServletRequest httpServletRequest) throws GroupRetrievalFault, UserManagementSystemException, UserRetrievalFault{ + JSONArray ja = JSONFactoryUtil.createJSONArray(); + List users = new ArrayList(); + LiferayUserManager lm = new LiferayUserManager(); + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = lgm.getGroup(groupId).getGroupName(); + + try{ + users = lm.listUsersByGroup(groupId); + _log.debug("Retrieving users for the group: " + groupName); + + if(users.size() > 0){ + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", httpServletRequest.getLocale()); + + _log.debug("There are " + users.size() + " users in the group: " + groupName); + for(GCubeUser someUser : users){ + JSONObject jo = JSONFactoryUtil.createJSONObject(); + try{ + List gcmrs = lm.getMembershipRequests(someUser.getUserId(), groupId, MembershipRequestStatus.APPROVED); + GCubeMembershipRequest mr = gcmrs.get(gcmrs.size()-1); + + jo.put("requestDate", dateFormat.format(mr.getCreateDate())); + jo.put("RequestDateObject", mr.getCreateDate()); + jo.put("validationDate", dateFormat.format(mr.getReplyDate())); + jo.put("ValidationDateObject", mr.getReplyDate()); + jo.put("requestComments", mr.getComment()); + jo.put("reqID", mr.getMembershipRequestId()); + }catch(Exception e){ + jo.put("requestDate", "-"); + jo.put("RequestDateObject", "-"); + jo.put("validationDate", "-"); + jo.put("ValidationDateObject", "-"); + jo.put("requestComments", "-"); + jo.put("reqID", 0); + } + + jo.put("userName", someUser.getUsername()); + jo.put("userFullName", someUser.getFullname()); + jo.put("userEmail", someUser.getEmail()); + jo.put("userId", someUser.getUserId()); + String isSelf = (someUser.getUserId() == selfId) ? "true" : "false"; + jo.put("isSelf", isSelf); + + LiferayRoleManager lrm = new LiferayRoleManager(); + List rolesList = lrm.listRolesByUserAndGroup(someUser.getUserId(), groupId); + JSONArray ja2 = JSONFactoryUtil.createJSONArray(); + for(GCubeRole r : rolesList){ + ja2.put(r.getRoleName()); + } + + jo.put("userSiteRoles", ja2); + + List gcubeTeams = lrm.listTeamsByUserAndGroup(someUser.getUserId(), groupId); + JSONArray ja3 = JSONFactoryUtil.createJSONArray(); + for(GCubeTeam t : gcubeTeams){ + ja3.put(t.getTeamName()); + } + + jo.put("userTeams", ja3); + + ja.put(jo); + } + _log.debug("User: " + currentUser.getUsername() + " is displaying users of the site: " + lgm.getGroup(groupId).getGroupName()); + } + }catch(Exception e){ + e.printStackTrace(); + } + return ja; + } + + protected JSONArray currentGroupUsersRequests(long groupId, HttpServletRequest httpServletRequest) throws GroupRetrievalFault, UserManagementSystemException, UserRetrievalFault{ + JSONArray ja = JSONFactoryUtil.createJSONArray(); + @SuppressWarnings("unused") + List users = new ArrayList(); + LiferayUserManager lm = new LiferayUserManager(); + users = lm.listUsersByGroup(groupId); + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = lgm.getGroup(groupId).getGroupName(); + + _log.debug("Retrieving requests for: " + groupName); + List reqs = new ArrayList(); + try{ + reqs = lm.listMembershipRequestsByGroup(groupId); + _log.debug(reqs.size() + " requests for: " + groupName); + if(reqs.size() > 0) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", httpServletRequest.getLocale()); + + for(GCubeMembershipRequest gcmr : reqs){ + if(gcmr.getStatus() == MembershipRequestStatus.REQUEST){ + JSONObject jo = JSONFactoryUtil.createJSONObject(); + jo.put("requestDate", dateFormat.format(gcmr.getCreateDate())); + jo.put("requestDateObject", gcmr.getCreateDate()); + try { + jo.put("validationDate", dateFormat.format(gcmr.getReplyDate())); + } catch(Exception e) { + _log.debug("Reply date doesn\'t exist for the membership request of user: " + gcmr.getRequestingUser().getUsername()); + } + jo.put("requestComments", gcmr.getComment()); + jo.put("requestId", gcmr.getMembershipRequestId()); + GCubeUser gcu = gcmr.getRequestingUser(); + jo.put("userName", gcu.getUsername()); + jo.put("userFullName", gcu.getFullname()); + jo.put("userEmail", gcu.getEmail()); + jo.put("userId", gcu.getUserId()); + LiferayRoleManager lrm = new LiferayRoleManager(); + List rolesList = lrm.listRolesByUserAndGroup(gcu.getUserId(), groupId); + List roles = new ArrayList(); + for(GCubeRole gcr : rolesList){ + roles.add(gcr.getRoleName()); + } + jo.put("userSiteRoles", roles.toString()); + ja.put(jo); + } + + } + } + _log.debug("The admin: " + currentUser.getUsername() + " displayed membershipRequests for the site: " + groupName); + }catch(Exception e){ + _log.debug("Error while retrieving requests for: " + groupName); + e.printStackTrace(); + } + return ja; + } + + protected JSONArray currentGroupRejectedUsersRequests( long groupId, HttpServletRequest httpServletRequest) throws GroupRetrievalFault, UserManagementSystemException, UserRetrievalFault{ + JSONArray ja = JSONFactoryUtil.createJSONArray(); + @SuppressWarnings("unused") + List users = new ArrayList(); + LiferayUserManager lm = new LiferayUserManager(); + users = lm.listUsersByGroup(groupId); + LiferayGroupManager lgm = new LiferayGroupManager(); + + List reqs = new ArrayList(); + String groupName = lgm.getGroup(groupId).getGroupName(); + _log.debug("Displaying rejected membership requests for the group: " + groupName); + try{ + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", httpServletRequest.getLocale()); + + reqs = lm.listMembershipRequestsByGroup(groupId); + if(reqs.size() > 0){ + for(GCubeMembershipRequest gcmr : reqs){ + if(gcmr.getStatus() == MembershipRequestStatus.DENIED){ + JSONObject jo = JSONFactoryUtil.createJSONObject(); + jo.put("requestDate", dateFormat.format(gcmr.getCreateDate())); + jo.put("requestDateObject", gcmr.getCreateDate()); + jo.put("rejectionDate", dateFormat.format(gcmr.getReplyDate())); + jo.put("rejectionDateObject", gcmr.getReplyDate()); + jo.put("validationDate", dateFormat.format(gcmr.getReplyDate())); + jo.put("requestComments", gcmr.getComment()); + jo.put("requestId", gcmr.getMembershipRequestId()); + GCubeUser gcu = gcmr.getRequestingUser(); + jo.put("userName", gcu.getUsername()); + jo.put("userFullName", gcu.getFullname()); + jo.put("userEmail", gcu.getEmail()); + jo.put("userId", gcu.getUserId()); + LiferayRoleManager lrm = new LiferayRoleManager(); + List rolesList = lrm.listRolesByUserAndGroup(gcu.getUserId(), groupId); + List roles = new ArrayList(); + for(GCubeRole gcr : rolesList){ + roles.add(gcr.getRoleName()); + } + jo.put("userSiteRoles", roles.toString()); + ja.put(jo); + } + } + } + _log.debug("The admin: " + currentUser.getUsername() + " displayed rejectedMembershipRequests for the site: " + groupName); + }catch(Exception e){ + e.printStackTrace(); + } + return ja; + } + + protected JSONArray usersForCurrrentUsersTablePlusRoles( Long groupId, + long[] usersIDs, String[] theRoles, String[] usersTeams, + boolean deletePreviousRoles, long selfId, int typeOfChangesUpponUserMode, + ResourceRequest request + ) throws SystemException, PortalException, UserManagementSystemException, UserRetrievalFault, RoleRetrievalFault, GroupRetrievalFault{ + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = lgm.getGroup(groupId).getGroupName(); + + LiferayRoleManager lrm = new LiferayRoleManager(); + LiferayUserManager lum = new LiferayUserManager(); + + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + + _log.debug("Editing users for the group: " + groupName); + + if(usersIDs.length == 1){//You can delete previous roles of a single user only. + GCubeUser gcu = lum.getUserById(usersIDs[0]); + long[] roleIDs = new long[theRoles.length]; + GCubeRole[] gCubeRoles = new GCubeRole[theRoles.length]; + long[] newRoleIDs = new long[theRoles.length]; + List oldRoles = lrm.listRolesByUserAndGroup(usersIDs[0], groupId); + + for(int i=0;i teams = lrm.listTeamsByGroup(groupId); +// if(teams.size() > 0 ){ +// lrm.deleteUserTeams(gcu.getUserId(), teams); +// } + } else if(deletePreviousRoles && typeOfChangesUpponUserMode == ASSIGN_ROLES_TO_USERS){ + _log.debug("ASSIGN_ROLES_TO_USERS"); + try{ + lrm.removeAllRolesFromUser(gcu.getUserId(), groupId); + }catch(Exception e){ + e.printStackTrace(); + } + } else if(deletePreviousRoles && typeOfChangesUpponUserMode == ASSIGN_TEAMS_TO_USERS){ + _log.debug("ASSIGN_TEAMS_TO_USERS"); + } + + long[] gCubeTeamIDs = new long[usersTeams.length]; + String[] gCubeTeamNames = new String[usersTeams.length]; + StringBuffer teamNames = new StringBuffer(); + + for(int i=0; i oldUserTeams = lrm.listTeamsByUserAndGroup(gcu.getUserId(), groupId); + List oldUserTeamsIDs = new ArrayList(); + for(Iterator it = oldUserTeams.iterator(); it.hasNext();) { + GCubeTeam gct = it.next(); + oldUserTeamsIDs.add(gct.getTeamId()); + } + List newUserTeams = new ArrayList(); + List newUserTeamsIDs = new ArrayList(); + + for(long gCubeTeamID : gCubeTeamIDs) { + GCubeTeam gct = lrm.getTeam(gCubeTeamID); + newUserTeams.add(gct); + newUserTeamsIDs.add(gCubeTeamID); + } + + List newTeamsToBeAssociatedWith = new ArrayList(newUserTeams); + List newTeamsIDsToBeAssociatedWith = new ArrayList(newUserTeamsIDs); + + newUserTeams.removeAll(oldUserTeams); + newUserTeamsIDs.removeAll(oldUserTeamsIDs); + + for(Long gctID : newUserTeamsIDs){ + lrm.assignTeamToUser(gcu.getUserId(), gctID); + GCubeTeam gct = lrm.getTeam(gctID); + notifyUsersByEmailOnTeamAssignment(groupId, gcu, lum.getUserById(selfId), lgm.getGroup(groupId), httpServletRequest, gct); + } + + if(newUserTeamsIDs.size() > 0) + _log.debug("User: " + gcu.getUsername() + " was added to following teams: " + teamNames); + else + _log.debug("User: " + gcu.getUsername() + " was added to no new teams"); + + oldUserTeams.removeAll(newTeamsToBeAssociatedWith); + oldUserTeamsIDs.removeAll(newTeamsIDsToBeAssociatedWith); + List teamsIDsToBeDisassociatedFrom = new ArrayList(oldUserTeamsIDs); + if(teamsIDsToBeDisassociatedFrom.size() != 0) { + List teamsToBeDisassociatedFrom = new ArrayList(); + for(Iterator it = teamsIDsToBeDisassociatedFrom.iterator(); it.hasNext();){ + teamsToBeDisassociatedFrom.add(lrm.getTeam(it.next())); + } + + lrm.deleteUserTeams(gcu.getUserId(), teamsToBeDisassociatedFrom); + + for(int i = 0; i < teamsToBeDisassociatedFrom.size(); i++) { + + notifyUsersByEmailOnTeamDismissal(groupId, gcu, lum.getUserById(selfId), lgm.getGroup(groupId), httpServletRequest, teamsToBeDisassociatedFrom.get(i)); + } + } + } + } catch (TeamRetrievalFault e) { + _log.debug("User: " + gcu.getUsername() + " failed to be added to the following teams: " + teamNames); + e.printStackTrace(); + } + + boolean rolesAssignmentSucceeded = lrm.assignRolesToUser(gcu.getUserId(), groupId, roleIDs); + + if(rolesAssignmentSucceeded) { + List rolesComingFromTheUI = gCubeRoles.length > 0 ? Arrays.asList(gCubeRoles) : new ArrayList(); + _log.info("rolesComingFromTheUI"); + rolesComingFromTheUI.forEach(role -> _log.info("Role UI: " + role.getRoleName())); + List roleIdsComingFromTheUICopy = new ArrayList(); + List roleIdsComingFromTheUI = new ArrayList(); + for(long id : newRoleIDs) { + roleIdsComingFromTheUI.add(id); + roleIdsComingFromTheUICopy.add(id); + } + + List oldRoleIds = oldRoles.stream().map(role -> new Long(role.getRoleId())).collect(Collectors.toList()); + + //new roles + roleIdsComingFromTheUI.removeAll(oldRoleIds); + List newRoles = new ArrayList(rolesComingFromTheUI.stream().filter(role -> roleIdsComingFromTheUI.contains(role.getRoleId())).collect(Collectors.toList()) ); + _log.info("New roles"); + newRoles.forEach(role -> _log.info("NewRole: " + role.getRoleName())); + + //revoked roles + oldRoleIds.removeAll(roleIdsComingFromTheUICopy); + List rolesRevoked = new ArrayList( oldRoles.stream().filter(role -> oldRoleIds.contains(role.getRoleId())).collect(Collectors.toList()) ); + _log.info("Revoked roles"); + rolesRevoked.forEach(role -> _log.info("RevokedRole: " + role.getRoleName())); + + if(newRoles.size() > 0 || rolesRevoked.size() > 0) + notifyUsersByEmailOnRoleAssignemntRevoke(groupId, gcu,lum.getUserById(selfId), lgm.getGroup(groupId), newRoles, rolesRevoked, httpServletRequest); + } + + _log.debug("User: " + currentUser.getUsername() + " is editing the roles of user: "+ gcu.getUsername() + " for the site: " + groupName + "and deletes all previous site-roles"); + }else{ + + List existingGCubeTeams = lrm.listTeamsByGroup(groupId); + + for(long uid : usersIDs){ + GCubeUser user = lum.getUserById(uid); + GCubeUser gcu = lum.getUserByUsername(user.getUsername()); + + List usersInTeam = new ArrayList(); + + Set existingGCubeTeamsIDs = new HashSet(); + + for(GCubeTeam gCubeTeam : existingGCubeTeams){ + try { + usersInTeam = lum.listUsersByTeam(gCubeTeam.getTeamId()); + + if(usersInTeam.contains(user)){ + existingGCubeTeamsIDs.add(gCubeTeam.getTeamId()); + } + } catch (TeamRetrievalFault e) { + _log.debug("Failed to retrieve team with teamId: " + gCubeTeam.getTeamId()); + e.printStackTrace(); + } + } + + long[] roleIDs = new long[theRoles.length]; + + GCubeRole[] gCubeRoles = new GCubeRole[theRoles.length]; + long[] newRoleIDs = new long[theRoles.length]; + for(int i=0;i oldRoles = lrm.listRolesByUserAndGroup(usersIDs[0], groupId); + + @SuppressWarnings("unused") + boolean rolesAssignmentSucceeded = lrm.assignRolesToUser(gcu.getUserId(), groupId, roleIDs); + + if(rolesAssignmentSucceeded) { + List rolesComingFromTheUI = gCubeRoles.length > 0 ? Arrays.asList(gCubeRoles) : new ArrayList(); + List roleIdsComingFromTheUICopy = new ArrayList(); + List roleIdsComingFromTheUI = new ArrayList(); + + for(long id : newRoleIDs) { + roleIdsComingFromTheUI.add(id); + roleIdsComingFromTheUICopy.add(id); + } + + List oldRoleIds = oldRoles.stream().map(role -> new Long(role.getRoleId())).collect(Collectors.toList()); + + //new roles + roleIdsComingFromTheUI.removeAll(oldRoleIds); + List newRoles = new ArrayList(rolesComingFromTheUI.stream().filter(role -> roleIdsComingFromTheUI.contains(role.getRoleId())).collect(Collectors.toList()) ); + + //revoked roles + oldRoleIds.removeAll(roleIdsComingFromTheUICopy); + List rolesRevoked = new ArrayList( oldRoles.stream().filter(role -> oldRoleIds.contains(role.getRoleId())).collect(Collectors.toList()) ); + + + if(newRoles.size() > 0 && rolesRevoked.size() > 0) + notifyUsersByEmailOnRoleAssignemntRevoke(groupId, gcu,lum.getUserById(selfId), lgm.getGroup(groupId), newRoles, rolesRevoked, httpServletRequest); + } + + List gCubeTeamIDs = new ArrayList(); + String[] gCubeTeamNames = new String[usersTeams.length]; + StringBuffer teamNames = new StringBuffer(); + + for(int i=0; i oldUserTeams = lrm.listTeamsByUserAndGroup(gcu.getUserId(), groupId); + List oldUserTeamsIDs = new ArrayList(); + for(Iterator it = oldUserTeams.iterator(); it.hasNext();) { + GCubeTeam gct = it.next(); + oldUserTeamsIDs.add(gct.getTeamId()); + } + List newUserTeams = new ArrayList(); + List newUserTeamsIDs = new ArrayList(); + + for(long gCubeTeamID : gCubeTeamIDs) { + GCubeTeam gct = lrm.getTeam(gCubeTeamID); + newUserTeams.add(gct); + newUserTeamsIDs.add(gCubeTeamID); + } + + List newTeamsToBeAssociatedWith = new ArrayList(newUserTeams); + List newTeamsIDsToBeAssociatedWith = new ArrayList(newUserTeamsIDs); + newUserTeams.removeAll(oldUserTeams); + newUserTeamsIDs.removeAll(oldUserTeamsIDs); + + for(Long gctID : newUserTeamsIDs){ + lrm.assignTeamToUser(gcu.getUserId(), gctID); + GCubeTeam gct = lrm.getTeam(gctID); + notifyUsersByEmailOnTeamAssignment(groupId, gcu, lum.getUserById(selfId), lgm.getGroup(groupId), httpServletRequest, gct); + } + + if(newUserTeamsIDs.size() > 0) + _log.debug("User: " + gcu.getUsername() + " was added to following teams: " + teamNames); + else + _log.debug("User: " + gcu.getUsername() + " was added to no new teams"); + + oldUserTeams.removeAll(newTeamsToBeAssociatedWith); + oldUserTeamsIDs.removeAll(newTeamsIDsToBeAssociatedWith); + List teamsIDsToBeDisassociatedFrom = new ArrayList(oldUserTeamsIDs); + if(teamsIDsToBeDisassociatedFrom.size() != 0) { + List teamsToBeDisassociatedFrom = new ArrayList(); + for(Iterator it = teamsIDsToBeDisassociatedFrom.iterator(); it.hasNext();){ + teamsToBeDisassociatedFrom.add( lrm.getTeam(it.next()) ); + } + +// lrm.deleteUserTeams(gcu.getUserId(), teamsToBeDisassociatedFrom); + +// for(int index = 0; index < teamsToBeDisassociatedFrom.size(); index++) { +// notifyUsersByEmailOnTeamDismissal(groupId, gcu, lum.getUserById(selfId), lgm.getGroup(groupId), httpServletRequest, teamsToBeDisassociatedFrom.get(index)); +// } + } + } catch (TeamRetrievalFault e) { + _log.debug("User: " + gcu.getUsername() + " failed to be added to the following teams: " + teamNames); + e.printStackTrace(); + } + + _log.debug("User: " + currentUser.getUsername() + " is editing the roles of user: "+ user.getUsername() + " for the site: " + groupName); + } + } + + return currentGroupUsers( groupId, selfId, httpServletRequest); + } + + protected void removeUsersFromGroup(PortletRequest portletRequest, ResourceRequest request, long groupId, long[] userIDs, + long[] membershipRequestsIDs, boolean sendDismissalEmail) + throws SystemException, PortalException, UserManagementSystemException, + UserRetrievalFault, GroupRetrievalFault{ + + UserManager um = new LiferayUserManager(); + GroupManager gm = new LiferayGroupManager(); + RoleManager rm = new LiferayRoleManager(); + + String groupName = gm.getGroup(groupId).getGroupName(); + String groupNameForSubject = ""; + + //Email + if(gm.isRootVO(groupId)) { + groupNameForSubject += " Virtual Organization"; + groupName = "" + groupName + " Virtual Organization"; + } else if(gm.isVRE(groupId)) { + groupNameForSubject += " Virtual Research Environment"; + groupName = "" + groupName + " Virtual Research Environment"; + }else{ + groupNameForSubject = groupName; + _log.debug("isRootVO: " + gm.isRootVO(groupId) + "\nisVRE: " + gm.isVRE(groupId)); + } + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + + + String emailSubject = EmailPartsConstruction.subjectForUserDismissalFromSite( + "userDismissalFromSiteSubject", groupNameForSubject); + + List recipients = new ArrayList(); + + _log.debug("Dissmissing users from group: " + groupName); + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + for(int i = 0; i < userIDs.length; i++){ + + GCubeUser gcu = um.getUserById(userIDs[i]); + um.dismissUserFromGroup(groupId, gcu.getUserId()); + + if(sendDismissalEmail){ + String emailRecipient = gcu.getEmail(); + recipients.add(emailRecipient); + } + + try { + try{ + rm.removeAllRolesFromUser(gcu.getUserId(), groupId); + _log.debug("Removing all roles from user succeeded"); + }catch(Exception e){ + _log.debug("Removing all roles from user failed"); + e.printStackTrace(); + } + + try { + LiferayRoleManager lrm = new LiferayRoleManager(); + List teams = lrm.listTeamsByGroup(groupId); + if(teams.size() > 0 ){ + lrm.deleteUserTeams(gcu.getUserId(), teams); + _log.debug("Removing all groups from user succeeded"); + } + }catch(Exception e){ + _log.debug("Removing all groups from user failed"); + e.printStackTrace(); + } + + GCubeMembershipRequest mr = um.getMembershipRequestsById(membershipRequestsIDs[i]); + if (mr != null) { + um.rejectMembershipRequest(mr.getRequestingUser().getUserId(), groupId, mr.getReplierUser().getUsername(), mr.getManagerReplyComment()); + } + + _log.debug("User: " + currentUser.getUsername() + " dismissing the user: "+ gcu.getUsername() + " from the site: " + groupName); + } catch (UserManagementPortalException e) { + _log.debug("Membership Request rejection failed"); + e.printStackTrace(); + } + + if(sendDismissalEmail) { + int recSize = managersEmails.size() + 1; + Recipient[] recs = new Recipient[recSize]; + recs[0] = new Recipient(new EmailAddress(gcu.getEmail()), RecipientType.TO); + if (!managersEmails.isEmpty()) { + int j = 1; + for (String mEmail : managersEmails){ + recs[j] = new Recipient(new EmailAddress(mEmail), RecipientType.BCC); + j++; + } + } + + TemplateUserHasBeenUnregisteredVRE requestAcceptedTemplate = new TemplateUserHasBeenUnregisteredVRE( + gcu, um.getUserById(PortalUtil.getUserId(httpServletRequest)), gm.getGroup(groupId), + PortalContext.getConfiguration().getGatewayName(httpServletRequest), PortalContext.getConfiguration().getGatewayURL(httpServletRequest)); + EmailTemplateService.send(emailSubject, (org.gcube.common.portal.mailing.templates.Template)requestAcceptedTemplate, httpServletRequest, recs); + } + } + } + + protected void currentUsersTableSection( + boolean currentUsersTable, + boolean deleteUsersFromCurrentUsersTable, + int modeCurrentUsersTable, + long groupId, + JSONObject jsonObject, + + PortletRequest portletRequest, + ResourceRequest request, long selfId + ){ + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + + if(currentUsersTable && !deleteUsersFromCurrentUsersTable){ + if(modeCurrentUsersTable == REFRESH_CURRENT_USERS_TABLE){ + try { + jsonObject.put("currentUsers", currentGroupUsers( groupId, selfId, httpServletRequest)); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } + } else if(modeCurrentUsersTable == EDIT_CURRENT_USERS_TABLE){//edit + try { + long[] selectedUsers = ParamUtil.getLongValues(portletRequest, "selectedUsers[]"); + String[] usersRoles = ParamUtil.getParameterValues(portletRequest, "usersRoles[]"); + String[] usersTeams = ParamUtil.getParameterValues(portletRequest, "usersTeams[]"); + boolean deletePreviousRoles = ParamUtil.getBoolean(portletRequest, "deletePreviousRoles"); + int typeOfChangesUpponUserMode = ParamUtil.getInteger(portletRequest, "typeOfChangesUpponUserMode"); + jsonObject.put("currentUsers", usersForCurrrentUsersTablePlusRoles( groupId, selectedUsers, usersRoles, + usersTeams, deletePreviousRoles, selfId, + typeOfChangesUpponUserMode, request)); + } catch (SystemException e) { + e.printStackTrace(); + } catch (PortalException e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } catch (RoleRetrievalFault e) { + e.printStackTrace(); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } + } + + }else if(currentUsersTable && deleteUsersFromCurrentUsersTable){//delete + + try { + long[] selectedUsers = ParamUtil.getLongValues(portletRequest, "selectedUsers[]"); + long[] membershipRequestsIDs = ParamUtil.getLongValues(request, "membershipRequestsIDs[]"); + boolean sendDismissalEmail = ParamUtil.getBoolean(portletRequest, "sendDismissalEmail"); + removeUsersFromGroup(portletRequest, request, groupId, selectedUsers, membershipRequestsIDs, sendDismissalEmail); + jsonObject.put("currentUsers", currentGroupUsers( groupId, selfId, httpServletRequest)); + } catch (SystemException e) { + e.printStackTrace(); + } catch (PortalException e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } + } + } + + protected void membershipRequestsSection( + boolean fetchUsersRequests, int modeMembershipRequestsTable, + JSONObject jsonObject, ResourceRequest request, + PortletRequest portletRequest, long groupId, + HttpServletRequest httpServletRequest){ + if(fetchUsersRequests){ + if(modeMembershipRequestsTable == REFRESH_MEMBERSHIP_REQUESTS_TABLE){//Refresh + try { + jsonObject.put("currentUsersRequests", currentGroupUsersRequests(groupId, httpServletRequest)); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } + }else if(modeMembershipRequestsTable == APPROVE_MEMBERSHIP_REQUESTS_TABLE){//Accept + try { + long[] reqIDs = ParamUtil.getLongValues(portletRequest, "membershipRequestsIds[]"); + Long managerId = ParamUtil.getLong(request, "managerId"); + acceptMemebershipRequestAndAddUsersToGroup(portletRequest, request, reqIDs, groupId, managerId); + jsonObject.put("currentUsersRequests", currentGroupUsersRequests(groupId, httpServletRequest)); + }catch (SystemException e) { + e.printStackTrace(); + }catch (GroupRetrievalFault e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (PortalException e) { + e.printStackTrace(); + } + }else if(modeMembershipRequestsTable == REJECT_MEMBERSHIP_REQUESTS_TABLE){//Reject + try { + long[] reqIDs = ParamUtil.getLongValues(portletRequest, "membershipRequestsIds[]"); + Long managerId = ParamUtil.getLong(request, "managerId"); + boolean CustomRejectionEmailFromAdmin = ParamUtil.getBoolean(request, "CustomRejectionEmailFromAdmin"); + String CustomRejectionEmailBodyFromAdmin = ParamUtil.getString(request, "CustomRejectionEmailBodyFromAdmin"); + _log.debug(CustomRejectionEmailFromAdmin + " " + CustomRejectionEmailBodyFromAdmin); + rejectMembershipRequests(portletRequest, request, reqIDs, groupId, managerId, CustomRejectionEmailFromAdmin, CustomRejectionEmailBodyFromAdmin); + jsonObject.put("currentUsersRequests", currentGroupUsersRequests(groupId, httpServletRequest)); + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (SystemException e) { + e.printStackTrace(); + } catch (PortalException e) { + e.printStackTrace(); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } + } + } + } + + protected void rejectedMembershipRequestsSection( + boolean fetchUsersRejectedRequests, + JSONObject jsonObject, + ResourceRequest request, PortletRequest portletRequest, + long groupId, HttpServletRequest httpServletRequest) { + + if(fetchUsersRejectedRequests){//Rejected + try { + jsonObject.put("currentUsersRequests", currentGroupRejectedUsersRequests( groupId, httpServletRequest)); + }catch (GroupRetrievalFault e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + + } + + protected void countUsersMembershipRequestsSection( + boolean countUsersMembershipRequests, + JSONObject jsonObject, long groupId){ + if(countUsersMembershipRequests){ + try { + jsonObject.put("countUsersMembershipRequests", numberOfRequestsForSpecificGroup(groupId)); + } catch (PortalException e) { + e.printStackTrace(); + } catch (SystemException e) { + e.printStackTrace(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } catch (GroupRetrievalFault e) { + e.printStackTrace(); + } catch (UserRetrievalFault e) { + e.printStackTrace(); + } + } + } + + protected void siteTeamsForTheCurrentGroupSection( ResourceRequest request, long managerID, int modeSiteTeams, long groupId, JSONObject jsonObject) throws SystemException{ + HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request); + RoleManager rm = new LiferayRoleManager(); + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = ""; + try { + groupName = lgm.getGroup(groupId).getGroupName(); + } catch (UserManagementSystemException | GroupRetrievalFault e2) { + e2.printStackTrace(); + } + + if(modeSiteTeams == REFRESH_SITE_TEAMS_TABLE){ + fetchSiteTeams(groupId, jsonObject, PortalUtil.getHttpServletRequest(request)); + } else if(modeSiteTeams == EDIT_SITE_TEAMS_TABLE){ + long siteTeamID = ParamUtil.getLong(request, "siteTeamID"); + String siteTeamName = ParamUtil.getString(request, "siteTeamName"); + String siteTeamDescription = ParamUtil.getString(request, "siteTeamDescription"); + _log.debug("Editing teams for group: " + groupName + " ..."); + + try { + String teamName = rm.getTeam(siteTeamID).getTeamName(); + try { + rm.updateTeam(siteTeamID, siteTeamName, siteTeamDescription); + } catch (TeamRetrievalFault e) { + e.printStackTrace(); + } + _log.debug("Edited team: " +teamName + " to Team Name: " + siteTeamName + " and Team Description: " + siteTeamDescription); + } catch (UserManagementSystemException e1) { + e1.printStackTrace(); + } catch (TeamRetrievalFault e1) { + e1.printStackTrace(); + } + fetchSiteTeams(groupId, jsonObject, httpServletRequest); + + } else if(modeSiteTeams == SITE_TEAMS_TABLE_CREATE_GROUP){ + String siteTeamName = ParamUtil.getString(request, "siteTeamName"); + String siteTeamDescription = ParamUtil.getString(request, "siteTeamDescription"); + long adminUserId = currentUser.getUserId(); + _log.debug("Create team for group: " + groupName + " ..."); + + try { + rm.createTeam(adminUserId, groupId, siteTeamName, siteTeamDescription); + _log.debug("Added team with Name: " + siteTeamName + " and Team Description: " + siteTeamDescription); + } catch (GroupRetrievalFault | TeamRetrievalFault | UserManagementSystemException e) { + e.printStackTrace(); + } + fetchSiteTeams(groupId, jsonObject, httpServletRequest); + + } + else if(modeSiteTeams == DELETE_SITE_TEAMS_TABLE){ + long siteTeamID = ParamUtil.getLong(request, "siteTeamID"); + String teamName; + try { + teamName = rm.getTeam(siteTeamID).getTeamName(); + rm.deleteTeam(siteTeamID); + _log.debug("Deleted team with Name: " + teamName); + } catch (UserManagementSystemException | TeamRetrievalFault e) { + e.printStackTrace(); + } + fetchSiteTeams(groupId, jsonObject, httpServletRequest); + } + } + + void fetchSiteTeams(long groupId, JSONObject jsonObject, HttpServletRequest httpServletRequest){ + GroupManager gm = new LiferayGroupManager(); + RoleManager rm = new LiferayRoleManager(); + UserManager um = new LiferayUserManager(); + + List currentGroupTeams = new ArrayList(); + try { + currentGroupTeams = rm.listTeamsByGroup(groupId); + } catch (GroupRetrievalFault e2) { + e2.printStackTrace(); + } + JSONArray ja = JSONFactoryUtil.createJSONArray(); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", httpServletRequest.getLocale()); + + for(GCubeTeam siteTeam : currentGroupTeams){ + JSONObject jo = JSONFactoryUtil.createJSONObject(); + String siteTeamName = siteTeam.getTeamName(); + siteTeamName = siteTeamName.replace("'", "'");//Escaping single quote char + jo.put("Name", siteTeamName); + jo.put("Description", siteTeam.getDescription()); + jo.put("CreationDate", dateFormat.format(siteTeam.getCreatedate())); + jo.put("CreationDateObject", siteTeam.getCreatedate()); + jo.put("LastModificationDate", dateFormat.format(siteTeam.getModifiedDate())); + jo.put("LastModificationDateObject", siteTeam.getModifiedDate()); + + int numberOfUsersInTeam = 0; + List teamUsers = new ArrayList(); + try { + teamUsers = um.listUsersByTeam(siteTeam.getTeamId()); + numberOfUsersInTeam = teamUsers.size(); + } catch (UserManagementSystemException | TeamRetrievalFault | UserRetrievalFault e) { + e.printStackTrace(); + } + jo.put("NumberOfUsers", numberOfUsersInTeam); + jo.put("TeamID", siteTeam.getTeamId()); + + JSONArray ja1 = JSONFactoryUtil.createJSONArray(); + + List users = new ArrayList(); + + try { + users = um.listUsersByGroup(groupId); + } catch (UserManagementSystemException | GroupRetrievalFault | UserRetrievalFault e1) { + e1.printStackTrace(); + } + + for(GCubeUser u : users) { + JSONObject jo1 = JSONFactoryUtil.createJSONObject(); + try { + if(teamUsers.contains(u)){ + jo1.put("fullName", u.getFullname()); + jo1.put("screenName", u.getUsername()); + } + } catch (Exception e) { + e.printStackTrace(); + } + ja1.put(jo1); + } + jo.put("siteTeamUsers", ja1); + try { + jo.put("CreatorName", um.getUserById(siteTeam.getUserId()).getFullname()); + } catch (UserManagementSystemException | UserRetrievalFault e) { + jo.put("CreatorName", ""); + e.printStackTrace(); + } + ja.put(jo); + } + + jsonObject.put("siteTeams", ja); + String groupname = null; + try { + groupname = gm.getGroup(groupId).getGroupName(); + } catch (UserManagementSystemException | GroupRetrievalFault e) { + e.printStackTrace(); + } + _log.debug("Retrieving teams for the site: " + groupname); + } + + void fetchRolesNames(long groupId, JSONObject jsonObject){ + LiferayRoleManager lrm = new LiferayRoleManager(); + List rolesList = lrm.listAllGroupRoles(); + JSONArray ja = JSONFactoryUtil.createJSONArray(); + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = ""; + try { + groupName = lgm.getGroup(groupId).getGroupName(); + } catch (UserManagementSystemException | GroupRetrievalFault e) { + e.printStackTrace(); + } + _log.debug("Fetching roles for group: " + groupName + " ..."); + + for(GCubeRole role : rolesList){ + ja.put(role.getRoleName()); + } + + jsonObject.put("roleNames", ja); + } + + void fetchTeamsNames(long groupId, JSONObject jsonObject) throws GroupRetrievalFault{ + LiferayRoleManager lrm = new LiferayRoleManager(); + List teamsList = lrm.listTeamsByGroup(groupId); + JSONArray ja = JSONFactoryUtil.createJSONArray(); + LiferayGroupManager lgm = new LiferayGroupManager(); + String groupName = ""; + try { + groupName = lgm.getGroup(groupId).getGroupName(); + } catch (UserManagementSystemException e) { + e.printStackTrace(); + } + _log.debug("Fetching teams for group: " + groupName + " ..."); + + for(GCubeTeam team : teamsList){ + ja.put(team.getTeamName()); + } + + jsonObject.put("teamNames", ja); + } + + private ArrayList getVREManagersEmailsForGroup(Long groupId) { + UserManager um = new LiferayUserManager(); + ArrayList managersEmails = new ArrayList(); + Map> usersAndRoles = null; + try { + usersAndRoles = um.listUsersAndRolesByGroup(groupId); + } catch (Exception e) { + e.printStackTrace(); + } + Set users = usersAndRoles.keySet(); + for (GCubeUser usr:users) { + List roles = usersAndRoles.get(usr); + for (int i = 0; i < roles.size(); i++) { + if (roles.get(i).getRoleName().equals("VRE-Manager") || roles.get(i).getRoleName().equals("VO-Admin") ) { + managersEmails.add(usr.getEmail()); + _log.debug("VRE Manager email -> " + usr.getEmail()); + break; + } + } + } + return managersEmails; + } + + String getUserRequestRejectionEmailSubject(String gatewayNameForSubject, String groupNameForSubject){ + String emailSubject = EmailPartsConstruction.subjectForMembershipRequestAcceptanceOrRejection( + "membershipRequestRejectionSubject", groupNameForSubject); + + return emailSubject; + } + + public void notifyUsersByEmailOnTeamAssignment( + long groupId, GCubeUser gcu, GCubeUser manager, GCubeGroup group, + HttpServletRequest httpServletRequest, GCubeTeam team) { + + + _log.debug("notifyUsersByEmailOnTeamAssignment for user: " + gcu.getUsername() + " for team: " + team.getTeamName()); + + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + + int recSize = managersEmails.size() + 1; + Recipient[] recs = new Recipient[recSize]; + recs[0] = new Recipient(new EmailAddress(gcu.getEmail()), RecipientType.TO); + if (!managersEmails.isEmpty()) { + int i = 1; + for (String mEmail : managersEmails){ + recs[i] = new Recipient(new EmailAddress(mEmail), RecipientType.BCC); + i++; + } + } + + String properEmailSubject = EmailPartsConstruction.getSiteTeamAssignmentSubject(team.getTeamName()); + + TemplateUserHasBeenAssociatedWithGCubeTeam requestTeamAssignmentTemplate = new TemplateUserHasBeenAssociatedWithGCubeTeam( + group, team, gcu, + manager, new Date(), + PortalContext.getConfiguration().getGatewayName(httpServletRequest), PortalContext.getConfiguration().getGatewayURL(httpServletRequest)); + + _log.debug("Sending email to user: " + gcu.getUsername() + ". He is being assigned to group: " + team.getTeamName()); + + EmailTemplateService.send(properEmailSubject, (org.gcube.common.portal.mailing.templates.Template)requestTeamAssignmentTemplate, httpServletRequest, recs); + } + + public void notifyUsersByEmailOnTeamDismissal( + long groupId, GCubeUser gcu, GCubeUser manager, GCubeGroup group, + HttpServletRequest httpServletRequest, GCubeTeam team) { + + _log.debug("notifyUsersByEmailOnTeamDismissal for user: " + gcu.getUsername() + " for team: " + team.getTeamName()); + + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + + int recSize = managersEmails.size() + 1; + Recipient[] recs = new Recipient[recSize]; + recs[0] = new Recipient(new EmailAddress(gcu.getEmail()), RecipientType.TO); + if (!managersEmails.isEmpty()) { + int i = 1; + for (String mEmail : managersEmails){ + recs[i] = new Recipient(new EmailAddress(mEmail), RecipientType.BCC); + i++; + } + } + + String properEmailSubject = EmailPartsConstruction.getSiteTeamDismissalSubject(team.getTeamName()); + + TemplateUserHasBeenDissAssociatedWithGCubeTeam requestTeamDismissalTemplate = new TemplateUserHasBeenDissAssociatedWithGCubeTeam( + group, team, gcu, + manager, new Date(), + PortalContext.getConfiguration().getGatewayName(httpServletRequest), PortalContext.getConfiguration().getGatewayURL(httpServletRequest)); + + _log.debug("Sending email to user: " + gcu.getUsername() + ". He is being removed from group: " + team.getTeamName()); + + EmailTemplateService.send(properEmailSubject, (org.gcube.common.portal.mailing.templates.Template)requestTeamDismissalTemplate, httpServletRequest, recs); + } + + public void notifyUsersByEmailOnRoleAssignemntRevoke(long groupId, GCubeUser userToReceiveTheMail, GCubeUser manager, GCubeGroup group, List newRoles, List revokedRoles, HttpServletRequest httpServletRequest) throws UserManagementSystemException, GroupRetrievalFault { + _log.debug("Notifying user by email on new role assignme or role revoke fro user: " + userToReceiveTheMail.getUsername() + " for group: " + group.getGroupName() ); + + ArrayList managersEmails = getVREManagersEmailsForGroup(groupId); + + int recSize = managersEmails.size() + 1; + Recipient[] recs = new Recipient[recSize]; + recs[0] = new Recipient(new EmailAddress(userToReceiveTheMail.getEmail()), RecipientType.TO); + if (!managersEmails.isEmpty()) { + int i = 1; + for (String mEmail : managersEmails){ + recs[i] = new Recipient(new EmailAddress(mEmail), RecipientType.BCC); + i++; + } + } + + String properEmailSubject = EmailPartsConstruction.getRoleAssignmentRevokeSubject(new LiferayGroupManager().getGroup(groupId).getGroupName()); + + _log.debug("properEmailSubject: " + properEmailSubject); + + TemplateUserRolesModifiedForGroup templateUserRolesModifiedForGroup = new TemplateUserRolesModifiedForGroup( + PortalContext.getConfiguration().getGatewayName(httpServletRequest), PortalContext.getConfiguration().getGatewayURL(httpServletRequest), + group, userToReceiveTheMail, manager, newRoles, revokedRoles, new Date() ); + +// _log.debug("--------------------------------------------------------------------------------------------------------------------------------------------"); +// _log.info(templateUserRolesModifiedForGroup.getTextHTML()); +// _log.info("--------------------------------------------------------------------------------------------------------------------------------------------"); +// _log.info(templateUserRolesModifiedForGroup.getTextPLAIN()); +// _log.info("--------------------------------------------------------------------------------------------------------------------------------------------"); + + _log.debug("Sending email to user: " + userToReceiveTheMail.getUsername() + ". His roles have been modified within the context of VRE: " + group.getGroupName()); + _log.info("Sending email to user: " + userToReceiveTheMail.getUsername() + ". His roles have been modified within the context of VRE: " + group.getGroupName()); + + EmailTemplateService.send(properEmailSubject, (org.gcube.common.portal.mailing.templates.Template)templateUserRolesModifiedForGroup, httpServletRequest, recs); + + } +} \ No newline at end of file diff --git a/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserHasBeenAssociatedWithGCubeTeam.java b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserHasBeenAssociatedWithGCubeTeam.java new file mode 100644 index 0000000..6f5cce8 --- /dev/null +++ b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserHasBeenAssociatedWithGCubeTeam.java @@ -0,0 +1,91 @@ +package gr.cite.bluebridge.portlets.admin.usersmanagementportlet.mail.templates; + +import java.util.Base64; +import java.util.Date; + +import org.gcube.common.portal.GCubePortalConstants; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.portal.mailing.templates.AbstractTemplate; +import org.gcube.common.portal.mailing.templates.Template; +import org.gcube.portal.mailing.message.Constants; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeMembershipRequest; +import org.gcube.vomanagement.usermanagement.model.GCubeTeam; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; + +public class TemplateUserHasBeenAssociatedWithGCubeTeam extends AbstractTemplate implements Template { + private final String encodedTemplateHTML = "PCEtLSBJbmxpbmVyIEJ1aWxkIFZlcnNpb24gNDM4MGI3NzQxYmI3NTlkNmNiOTk3NTQ1ZjNhZGQyMWFkNDhmMDEwYiAtLT4KPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJtaW4taGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7Ij4KICA8aGVhZD4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCIgLz4KICAgIDx0aXRsZT5UaXRsZTwvdGl0bGU+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtaW4td2lkdGg6IDEwMCU7IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMyAhaW1wb3J0YW50OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBiZ2NvbG9yPSIjZjNmM2YzICFpbXBvcnRhbnQiPgogIDx0YWJsZSBjbGFzcz0iYm9keSIgZGF0YS1tYWRlLXdpdGgtZm91bmRhdGlvbj0iIiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjMgIWltcG9ydGFudDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmM2YzZjMgIWltcG9ydGFudCI+PHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPjx0ZCBjbGFzcz0iZmxvYXQtY2VudGVyIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgc3R5bGU9IndvcmQtd3JhcDogYnJlYWstd29yZDsgLXdlYmtpdC1oeXBoZW5zOiBhdXRvOyAtbW96LWh5cGhlbnM6IGF1dG87IGh5cGhlbnM6IGF1dG87IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOyBmbG9hdDogbm9uZTsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAwOyI+CiAgICAgICAgICA8Y2VudGVyIGRhdGEtcGFyc2VkPSIiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWluLXdpZHRoOiA1ODBweDsiPgogICAgICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2xhc3M9IndyYXBwZXIgaGVhZGVyIGZsb2F0LWNlbnRlciIgc3R5bGU9IndpZHRoOiAxMDAlOyBib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOyBmbG9hdDogbm9uZTsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDA7Ij48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGNsYXNzPSJ3cmFwcGVyLWlubmVyIiBzdHlsZT0id29yZC13cmFwOiBicmVhay13b3JkOyAtd2Via2l0LWh5cGhlbnM6IGF1dG87IC1tb3otaHlwaGVuczogYXV0bzsgaHlwaGVuczogYXV0bzsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250YWluZXIiIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogaW5oZXJpdDsgd2lkdGg6IDU4MHB4OyBiYWNrZ3JvdW5kOiAjZmVmZWZlOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmZWZlZmUiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IC13ZWJraXQtaHlwaGVuczogYXV0bzsgLW1vei1oeXBoZW5zOiBhdXRvOyBoeXBoZW5zOiBhdXRvOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0icm93IGNvbGxhcHNlIiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IHRhYmxlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggY2xhc3M9InNtYWxsLTYgbGFyZ2UtNiBjb2x1bW5zIGZpcnN0IiBzdHlsZT0id2lkdGg6IDI5OHB4OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDAgMCAxNnB4OyIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDA7Ij48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRoIHN0eWxlPSJjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPiA8aW1nIHNyYz0ie3tHQVRFV0FZX0xPR086VVJMfX0iIHN0eWxlPSJ3aWR0aDogMjAwcHg7IG91dGxpbmU6IG5vbmU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLW1zLWludGVycG9sYXRpb24tbW9kZTogYmljdWJpYzsgbWF4LXdpZHRoOiAxMDAlOyBjbGVhcjogYm90aDsgZGlzcGxheTogYmxvY2s7IiBhbHQ9Int7R0FURVdBWV9OQU1FfX0iIHRpdGxlPSJ7e0dBVEVXQVlfTkFNRX19IiAvPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+PC90YWJsZT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic21hbGwtNiBsYXJnZS02IGNvbHVtbnMgbGFzdCIgc3R5bGU9IndpZHRoOiAyOThweDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAwIDAgMTZweDsiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwOyI+PHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPjx0aCBzdHlsZT0iY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LXJpZ2h0IiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDAgMCAxMHB4OyBwYWRkaW5nOiAwOyIgYWxpZ249InJpZ2h0Ij48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj48L3RhYmxlPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+PC90Ym9keT48L3RhYmxlPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPgogICAgICAgICAgICAgIDwvdHI+PC90YWJsZT48dGFibGUgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRhaW5lciBib2R5LWJvcmRlciBmbG9hdC1jZW50ZXIiIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogNTgwcHg7IGZsb2F0OiBub25lOyBib3JkZXItdG9wLXdpZHRoOiA4cHg7IGJvcmRlci10b3AtY29sb3I6ICMyMjVmOTc7IGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOyBiYWNrZ3JvdW5kOiAjZmVmZWZlOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmZWZlZmUiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IC13ZWJraXQtaHlwaGVuczogYXV0bzsgLW1vei1oeXBoZW5zOiBhdXRvOyBoeXBoZW5zOiBhdXRvOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0icm93IiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IHRhYmxlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggY2xhc3M9InNtYWxsLTEyIGxhcmdlLTEyIGNvbHVtbnMgZmlyc3QgbGFzdCIgc3R5bGU9IndpZHRoOiA1NjRweDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAwIDE2cHggMTZweDsiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwOyI+PHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPjx0aCBzdHlsZT0iY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ic3BhY2VyIiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGQgaGVpZ2h0PSIxNnB4IiBzdHlsZT0iZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTZweDsgd29yZC13cmFwOiBicmVhay13b3JkOyAtd2Via2l0LWh5cGhlbnM6IGF1dG87IC1tb3otaHlwaGVuczogYXV0bzsgaHlwaGVuczogYXV0bzsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBtc28tbGluZS1oZWlnaHQtcnVsZTogZXhhY3RseTsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPsKgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48aDQgc3R5bGU9ImNvbG9yOiBpbmhlcml0OyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgd29yZC13cmFwOiBub3JtYWw7IGZvbnQtc2l6ZTogMjRweDsgbWFyZ2luOiAwIDAgMTBweDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij5IaSB7e1JFUVVFU1RJTkdfVVNFUl9GSVJTVF9OQU1FfX0sPGJyIC8+PGEgaHJlZj0ie3tVU0VSX1ZSRU1FTUJFUl9QUk9GSUxFX1VSTH19IiBzdHlsZT0iY29sb3I6ICMyMTk5ZTg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiPnt7VVNFUl9GVUxMTkFNRX19PC9hPiBoYXMganVzdCBtYWRlIHlvdSBhIG1lbWJlciBvZiB0aGUge3tTRUxFQ1RFRF9URUFNX05BTUV9fSBncm91cCBpbiB0aGUge3tTRUxFQ1RFRF9WUkVfTkFNRX19IFZSRS48L2g0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+PHAgc3R5bGU9ImNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDAgMCAxMHB4OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPllvdSBjYW4gYWNjZXNzIHRoZSBWUkUgYXQge3tWUkVfVVJMfX0gdXNpbmcgeW91ciBlbWFpbCB7e1JFUVVFU1RJTkdfVVNFUl9FTUFJTH19LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iZXhwYW5kZXIiIHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47IHdpZHRoOiAwOyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+PC90YWJsZT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT4KPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+PC90Ym9keT48L3RhYmxlPjwvY2VudGVyPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+PC90YWJsZT48L2JvZHk+CjwvaHRtbD4KCg=="; + private final String encodedTemplateTEXT = "e3tHQVRFV0FZX05BTUV9fQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkhpIHt7UkVRVUVTVElOR19VU0VSX0ZJUlNUX05BTUV9fSwKCnt7VVNFUl9GVUxMTkFNRX19IGhhcyBqdXN0IG1hZGUgeW91IGEgbWVtYmVyIG9mIHRoZSB7e1NFTEVDVEVEX1RFQU1fTkFNRX19IGdyb3VwIGluIHRoZSB7e1NFTEVDVEVEX1ZSRV9OQU1FfX0gVlJFLgoKWW91IGNhbiBhY2Nlc3MgdGhlIFZSRSBhdCB7e1ZSRV9VUkx9fSB1c2luZyB5b3VyIGVtYWlsIHt7UkVRVUVTVElOR19VU0VSX0VNQUlMfX0KCg"; + + private GCubeGroup theRequestedVRE; + private GCubeTeam teamToBeAssociatedWith; + private GCubeUser theRequestingUser; + private GCubeUser theManagerUser; + private Date originalRequestDate; + private String vreURL; + + /** + * + * @param theRequestingUser an instance of @see {@link GCubeUser} representing the user who requested access + * @param teamToBeAssociatedWith an instance of @see {@link GCubeTeam} representing the team the user will join + * @param theManagerUser an instance of @see {@link GCubeUser} representing the manager who approved the request + * @param theRequestedVRE instance of @see {@link GCubeGroup} of the current VRE + * @param originalRequestDate the request date as in the associated {@link GCubeMembershipRequest} + * @param gatewayName gateway name can be obtained with {@link PortalContext#getGatewayName(javax.servlet.http.HttpServletRequest)} + * @param gatewayURL gateway URL name can be obtained with {@link PortalContext#getGatewayURL(javax.servlet.http.HttpServletRequest)} + */ + + public TemplateUserHasBeenAssociatedWithGCubeTeam( + GCubeGroup theRequestedVRE, GCubeTeam teamToBeAssociatedWith, GCubeUser theRequestingUser, + GCubeUser theManagerUser, Date originalRequestDate, + String gatewayName, String gatewayURL) { + + super(gatewayName, gatewayURL); + + this.theRequestingUser = theRequestingUser; + this.theManagerUser = theManagerUser; + this.theRequestedVRE = theRequestedVRE; + this.originalRequestDate = originalRequestDate; + this.teamToBeAssociatedWith = teamToBeAssociatedWith; + this.vreURL = new StringBuffer(gatewayURL) + .append(GCubePortalConstants.PREFIX_GROUP_URL) + .append("/").append(theRequestedVRE.getGroupName().toLowerCase()).toString(); + } + + @Override + public String compile(String templateContent) { + String userProfileLink = new StringBuffer(vreURL) + .append("/").append(getUserProfileLink(theManagerUser.getUsername())).toString(); + + return new String(Base64.getDecoder().decode(templateContent)) + .replace("{{REQUESTING_USER_FIRST_NAME}}", theRequestingUser.getFirstName()) + .replace("{{GATEWAY_LOGO:URL}}", getGatewayLogoURL()) + .replace("{{GATEWAY_NAME}}", getGatewayName()) + .replace("{{USER_FULLNAME}}", theManagerUser.getFullname()) + .replace("{{SELECTED_VRE_NAME}}", theRequestedVRE.getGroupName()) + .replace("{{VRE_URL}}", vreURL) + .replace("{{REQUESTING_USER_EMAIL}}", theRequestingUser.getEmail()) + .replace("{{MANAGE_REQUEST_DATE}}", originalRequestDate.toString()) + .replace("{{USER_VREMEMBER_PROFILE_URL}}", userProfileLink) + .replace("{{SELECTED_TEAM_NAME}}", teamToBeAssociatedWith.getTeamName()) + ; + } + + @Override + public String getTextHTML() { + return compile(encodedTemplateHTML); + } + + @Override + public String getTextPLAIN() { + return compile(encodedTemplateTEXT); + } + + private String getUserProfileLink(String username) { + return "profile?"+ new String( + Base64.getEncoder().encodeToString(Constants.USER_PROFILE_OID.getBytes())+ + "="+ + new String( Base64.getEncoder().encodeToString(username.getBytes()) ) + ); + } +} \ No newline at end of file diff --git a/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserHasBeenDissAssociatedWithGCubeTeam.java b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserHasBeenDissAssociatedWithGCubeTeam.java new file mode 100644 index 0000000..aadd165 --- /dev/null +++ b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserHasBeenDissAssociatedWithGCubeTeam.java @@ -0,0 +1,90 @@ +package gr.cite.bluebridge.portlets.admin.usersmanagementportlet.mail.templates; + +import java.util.Base64; +import java.util.Date; + +import org.gcube.common.portal.GCubePortalConstants; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.portal.mailing.templates.AbstractTemplate; +import org.gcube.common.portal.mailing.templates.Template; +import org.gcube.portal.mailing.message.Constants; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeMembershipRequest; +import org.gcube.vomanagement.usermanagement.model.GCubeTeam; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; + +public class TemplateUserHasBeenDissAssociatedWithGCubeTeam extends AbstractTemplate implements Template { + private final static String encodedTemplateHTML = "PCEtLSBJbmxpbmVyIEJ1aWxkIFZlcnNpb24gNDM4MGI3NzQxYmI3NTlkNmNiOTk3NTQ1ZjNhZGQyMWFkNDhmMDEwYiAtLT4KPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJtaW4taGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7Ij4KICA8aGVhZD4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCIgLz4KICAgIDx0aXRsZT5UaXRsZTwvdGl0bGU+CiAgPC9oZWFkPgoKPGJvZHkgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IG1pbi13aWR0aDogMTAwJTsgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OyAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmM2YzZjMgIWltcG9ydGFudCI+ICAKICA8dGFibGUgY2xhc3M9ImJvZHkiIGRhdGEtbWFkZS13aXRoLWZvdW5kYXRpb249IiIgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBiZ2NvbG9yPSIjZjNmM2YzICFpbXBvcnRhbnQiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGNsYXNzPSJmbG9hdC1jZW50ZXIiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiBzdHlsZT0id29yZC13cmFwOiBicmVhay13b3JkOyAtd2Via2l0LWh5cGhlbnM6IGF1dG87IC1tb3otaHlwaGVuczogYXV0bzsgaHlwaGVuczogYXV0bzsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZsb2F0OiBub25lOyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDA7Ij4KICAgICAgICAgIDxjZW50ZXIgZGF0YS1wYXJzZWQ9IiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtaW4td2lkdGg6IDU4MHB4OyI+CiAgICAgICAgICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBjbGFzcz0id3JhcHBlciBoZWFkZXIgZmxvYXQtY2VudGVyIiBzdHlsZT0id2lkdGg6IDEwMCU7IGJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZsb2F0OiBub25lOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGNsYXNzPSJ3cmFwcGVyLWlubmVyIiBzdHlsZT0id29yZC13cmFwOiBicmVhay13b3JkOyAtd2Via2l0LWh5cGhlbnM6IGF1dG87IC1tb3otaHlwaGVuczogYXV0bzsgaHlwaGVuczogYXV0bzsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250YWluZXIiIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogaW5oZXJpdDsgd2lkdGg6IDU4MHB4OyBiYWNrZ3JvdW5kOiAjZmVmZWZlOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmZWZlZmUiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IC13ZWJraXQtaHlwaGVuczogYXV0bzsgLW1vei1oeXBoZW5zOiBhdXRvOyBoeXBoZW5zOiBhdXRvOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0icm93IGNvbGxhcHNlIiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IHRhYmxlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggY2xhc3M9InNtYWxsLTYgbGFyZ2UtNiBjb2x1bW5zIGZpcnN0IiBzdHlsZT0id2lkdGg6IDI5OHB4OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDAgMCAxNnB4OyIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDA7Ij48dGJvZHk+PHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPjx0aCBzdHlsZT0iY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij4gPGltZyBzcmM9Int7R0FURVdBWV9MT0dPOlVSTH19IiBzdHlsZT0id2lkdGg6IDIwMHB4OyBvdXRsaW5lOiBub25lOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7IG1heC13aWR0aDogMTAwJTsgY2xlYXI6IGJvdGg7IGRpc3BsYXk6IGJsb2NrOyIgYWx0PSJ7e0dBVEVXQVlfTkFNRX19IiB0aXRsZT0ie3tHQVRFV0FZX05BTUV9fSI+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNtYWxsLTYgbGFyZ2UtNiBjb2x1bW5zIGxhc3QiIHN0eWxlPSJ3aWR0aDogMjk4cHg7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMCAwIDE2cHg7IiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTAwJTsgcGFkZGluZzogMDsiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRoIHN0eWxlPSJjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtcmlnaHQiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCAwIDEwcHg7IHBhZGRpbmc6IDA7IiBhbGlnbj0icmlnaHQiPjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+PC90ZD4KICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48dGFibGUgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRhaW5lciBib2R5LWJvcmRlciBmbG9hdC1jZW50ZXIiIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogNTgwcHg7IGZsb2F0OiBub25lOyBib3JkZXItdG9wLXdpZHRoOiA4cHg7IGJvcmRlci10b3AtY29sb3I6ICMyMjVmOTc7IGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOyBiYWNrZ3JvdW5kOiAjZmVmZWZlOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmZWZlZmUiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IC13ZWJraXQtaHlwaGVuczogYXV0bzsgLW1vei1oeXBoZW5zOiBhdXRvOyBoeXBoZW5zOiBhdXRvOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0icm93IiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IHRhYmxlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggY2xhc3M9InNtYWxsLTEyIGxhcmdlLTEyIGNvbHVtbnMgZmlyc3QgbGFzdCIgc3R5bGU9IndpZHRoOiA1NjRweDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAwIDE2cHggMTZweDsiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggc3R5bGU9ImNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InNwYWNlciIgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTAwJTsgcGFkZGluZzogMDsiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGhlaWdodD0iMTZweCIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE2cHg7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgLXdlYmtpdC1oeXBoZW5zOiBhdXRvOyAtbW96LWh5cGhlbnM6IGF1dG87IGh5cGhlbnM6IGF1dG87IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgbXNvLWxpbmUtaGVpZ2h0LXJ1bGU6IGV4YWN0bHk7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+PC90Ym9keT48L3RhYmxlPjxoNCBzdHlsZT0iY29sb3I6IGluaGVyaXQ7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyB3b3JkLXdyYXA6IG5vcm1hbDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW46IDAgMCAxMHB4OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPkhpIHt7UkVRVUVTVElOR19VU0VSX0ZJUlNUX05BTUV9fSw8YnI+PGEgaHJlZj0ie3tVU0VSX1ZSRU1FTUJFUl9QUk9GSUxFX1VSTH19IiBzdHlsZT0iY29sb3I6ICMyMTk5ZTg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiPnt7VVNFUl9GVUxMTkFNRX19PC9hPiBoYXMganVzdCByZW1vdmVkIHlvdSBmcm9tIHRoZSB7e1NFTEVDVEVEX1RFQU1fTkFNRX19IGdyb3VwIGluIHRoZSB7e1NFTEVDVEVEX1ZSRV9OQU1FfX0gVlJFLjwvaDQ+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJleHBhbmRlciIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsgd2lkdGg6IDA7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+Cgo8L3RkPgogICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+PC9jZW50ZXI+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+Cgo8L2JvZHk+PC9odG1sPgoKCg=="; + private final String encodedTemplateTEXT = "e3tHQVRFV0FZX05BTUV9fQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkhpIHt7UkVRVUVTVElOR19VU0VSX0ZJUlNUX05BTUV9fSwKCnt7VVNFUl9GVUxMTkFNRX19IGhhcyBqdXN0IHJlbW92ZWQgeW91IGZyb20gdGhlIHt7U0VMRUNURURfVEVBTV9OQU1FfX0gZ3JvdXAgaW4gdGhlIHt7U0VMRUNURURfVlJFX05BTUV9fSBWUkUuCgo="; + + private GCubeGroup theRequestedVRE; + private GCubeTeam teamToBeAssociatedWith; + private GCubeUser theRequestingUser; + private GCubeUser theManagerUser; + private Date originalRequestDate; + private String vreURL; + + /** + * + * @param theRequestingUser an instance of @see {@link GCubeUser} representing the user who requested access + * @param teamToBeAssociatedWith an instance of @see {@link GCubeTeam} representing the team the user will join + * @param theManagerUser an instance of @see {@link GCubeUser} representing the manager who approved the request + * @param theRequestedVRE instance of @see {@link GCubeGroup} of the current VRE + * @param originalRequestDate the request date as in the associated {@link GCubeMembershipRequest} + * @param gatewayName gateway name can be obtained with {@link PortalContext#getGatewayName(javax.servlet.http.HttpServletRequest)} + * @param gatewayURL gateway URL name can be obtained with {@link PortalContext#getGatewayURL(javax.servlet.http.HttpServletRequest)} + */ + + public TemplateUserHasBeenDissAssociatedWithGCubeTeam( + GCubeGroup theRequestedVRE, GCubeTeam teamToBeAssociatedWith, GCubeUser theRequestingUser, + GCubeUser theManagerUser, Date originalRequestDate, + String gatewayName, String gatewayURL) { + + super(gatewayName, gatewayURL); + + this.theRequestingUser = theRequestingUser; + this.theManagerUser = theManagerUser; + this.theRequestedVRE = theRequestedVRE; + this.originalRequestDate = originalRequestDate; + this.teamToBeAssociatedWith = teamToBeAssociatedWith; + this.vreURL = new StringBuffer(gatewayURL) + .append(GCubePortalConstants.PREFIX_GROUP_URL) + .append("/").append(theRequestedVRE.getGroupName().toLowerCase()).toString(); + } + + @Override + public String compile(String templateContent) { + String userProfileLink = new StringBuffer(vreURL) + .append("/").append(getUserProfileLink(theManagerUser.getUsername())).toString(); + + return new String(Base64.getDecoder().decode(templateContent)) + .replace("{{REQUESTING_USER_FIRST_NAME}}", theRequestingUser.getFirstName()) + .replace("{{GATEWAY_LOGO:URL}}", getGatewayLogoURL()) + .replace("{{GATEWAY_NAME}}", getGatewayName()) + .replace("{{USER_FULLNAME}}", theManagerUser.getFullname()) + .replace("{{SELECTED_VRE_NAME}}", theRequestedVRE.getGroupName()) + .replace("{{VRE_URL}}", vreURL) + .replace("{{REQUESTING_USER_EMAIL}}", theRequestingUser.getEmail()) + .replace("{{MANAGE_REQUEST_DATE}}", originalRequestDate.toString()) + .replace("{{USER_VREMEMBER_PROFILE_URL}}", userProfileLink) + .replace("{{SELECTED_TEAM_NAME}}", teamToBeAssociatedWith.getTeamName()); + } + + @Override + public String getTextHTML() { + return compile(encodedTemplateHTML); + } + + @Override + public String getTextPLAIN() { + return compile(encodedTemplateTEXT); + } + + private String getUserProfileLink(String username) { + return "profile?"+ new String( + Base64.getEncoder().encodeToString(Constants.USER_PROFILE_OID.getBytes())+ + "="+ + new String( Base64.getEncoder().encodeToString(username.getBytes()) ) + ); + } +} \ No newline at end of file diff --git a/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserRolesModifiedForGroup.java b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserRolesModifiedForGroup.java new file mode 100644 index 0000000..726c649 --- /dev/null +++ b/src/main/java/gr/cite/bluebridge/portlets/admin/usersmanagementportlet/mail/templates/TemplateUserRolesModifiedForGroup.java @@ -0,0 +1,160 @@ +package gr.cite.bluebridge.portlets.admin.usersmanagementportlet.mail.templates; + +import org.gcube.common.portal.GCubePortalConstants; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.portal.mailing.templates.AbstractTemplate; +import org.gcube.common.portal.mailing.templates.Template; +import org.gcube.portal.mailing.message.Constants; +import org.gcube.vomanagement.usermanagement.model.*; + +import java.util.Base64; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +public class TemplateUserRolesModifiedForGroup extends AbstractTemplate implements Template { + private enum FormatType{ + TEXT, HTML + } + private final String hiddenSection = "none"; + private final String visibleSection = "block"; + private final static String encodedTemplateHTML = "PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJtaW4taGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7Ij4KICA8aGVhZD4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCIgLz4KICAgIDx0aXRsZT5UaXRsZTwvdGl0bGU+CiAgPC9oZWFkPgoKPGJvZHkgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IG1pbi13aWR0aDogMTAwJTsgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OyAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmM2YzZjMgIWltcG9ydGFudCI+ICAKICA8dGFibGUgY2xhc3M9ImJvZHkiIGRhdGEtbWFkZS13aXRoLWZvdW5kYXRpb249IiIgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzICFpbXBvcnRhbnQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBiZ2NvbG9yPSIjZjNmM2YzICFpbXBvcnRhbnQiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGNsYXNzPSJmbG9hdC1jZW50ZXIiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiBzdHlsZT0id29yZC13cmFwOiBicmVhay13b3JkOyAtd2Via2l0LWh5cGhlbnM6IGF1dG87IC1tb3otaHlwaGVuczogYXV0bzsgaHlwaGVuczogYXV0bzsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZsb2F0OiBub25lOyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDA7Ij4KICAgICAgICAgIDxjZW50ZXIgZGF0YS1wYXJzZWQ9IiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtaW4td2lkdGg6IDU4MHB4OyI+CiAgICAgICAgICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBjbGFzcz0id3JhcHBlciBoZWFkZXIgZmxvYXQtY2VudGVyIiBzdHlsZT0id2lkdGg6IDEwMCU7IGJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZsb2F0OiBub25lOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGNsYXNzPSJ3cmFwcGVyLWlubmVyIiBzdHlsZT0id29yZC13cmFwOiBicmVhay13b3JkOyAtd2Via2l0LWh5cGhlbnM6IGF1dG87IC1tb3otaHlwaGVuczogYXV0bzsgaHlwaGVuczogYXV0bzsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250YWluZXIiIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogaW5oZXJpdDsgd2lkdGg6IDU4MHB4OyBiYWNrZ3JvdW5kOiAjZmVmZWZlOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmZWZlZmUiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IC13ZWJraXQtaHlwaGVuczogYXV0bzsgLW1vei1oeXBoZW5zOiBhdXRvOyBoeXBoZW5zOiBhdXRvOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0icm93IGNvbGxhcHNlIiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IHRhYmxlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggY2xhc3M9InNtYWxsLTYgbGFyZ2UtNiBjb2x1bW5zIGZpcnN0IiBzdHlsZT0id2lkdGg6IDI5OHB4OyBjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDAgMCAxNnB4OyIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDA7Ij48dGJvZHk+PHRyIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPjx0aCBzdHlsZT0iY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij4gPGltZyBzcmM9Int7R0FURVdBWV9MT0dPOlVSTH19IiBzdHlsZT0id2lkdGg6IDIwMHB4OyBvdXRsaW5lOiBub25lOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7IG1heC13aWR0aDogMTAwJTsgY2xlYXI6IGJvdGg7IGRpc3BsYXk6IGJsb2NrOyIgYWx0PSJ7e0dBVEVXQVlfTkFNRX19IiB0aXRsZT0ie3tHQVRFV0FZX05BTUV9fSI+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNtYWxsLTYgbGFyZ2UtNiBjb2x1bW5zIGxhc3QiIHN0eWxlPSJ3aWR0aDogMjk4cHg7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMCAwIDE2cHg7IiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTAwJTsgcGFkZGluZzogMDsiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRoIHN0eWxlPSJjb2xvcjogIzBhMGEwYTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtcmlnaHQiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCAwIDEwcHg7IHBhZGRpbmc6IDA7IiBhbGlnbj0icmlnaHQiPjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj48L3Rib2R5PjwvdGFibGU+PC90ZD4KICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48dGFibGUgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRhaW5lciBib2R5LWJvcmRlciBmbG9hdC1jZW50ZXIiIHN0eWxlPSJib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogNTgwcHg7IGZsb2F0OiBub25lOyBib3JkZXItdG9wLXdpZHRoOiA4cHg7IGJvcmRlci10b3AtY29sb3I6ICMyMjVmOTc7IGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOyBiYWNrZ3JvdW5kOiAjZmVmZWZlOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMDsiIGJnY29sb3I9IiNmZWZlZmUiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IC13ZWJraXQtaHlwaGVuczogYXV0bzsgLW1vei1oeXBoZW5zOiBhdXRvOyBoeXBoZW5zOiBhdXRvOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0icm93IiBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IHRhYmxlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggY2xhc3M9InNtYWxsLTEyIGxhcmdlLTEyIGNvbHVtbnMgZmlyc3QgbGFzdCIgc3R5bGU9IndpZHRoOiA1NjRweDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAwIDE2cHggMTZweDsiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwOyI+PHRib2R5Pjx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48dGggc3R5bGU9ImNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InNwYWNlciIgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTAwJTsgcGFkZGluZzogMDsiPjx0Ym9keT48dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+PHRkIGhlaWdodD0iMTZweCIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE2cHg7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgLXdlYmtpdC1oeXBoZW5zOiBhdXRvOyAtbW96LWh5cGhlbnM6IGF1dG87IGh5cGhlbnM6IGF1dG87IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDsgdmVydGljYWwtYWxpZ246IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsgbXNvLWxpbmUtaGVpZ2h0LXJ1bGU6IGV4YWN0bHk7IGNvbG9yOiAjMGEwYTBhOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+PC90Ym9keT48L3RhYmxlPgoJCQkJCQkJCQkgIDxoNCBzdHlsZT0iY29sb3I6IGluaGVyaXQ7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyB3b3JkLXdyYXA6IG5vcm1hbDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW46IDAgMCAxMHB4OyBwYWRkaW5nOiAwOyIgYWxpZ249ImxlZnQiPgoJCQkJCQkJCQkJICBIaSB7e1JFUVVFU1RJTkdfVVNFUl9GSVJTVF9OQU1FfX0sCgkJCQkJCQkJCQkgIDxicj4KCQkJCQkJCQkJCSAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6e3tWSVNJQklMSVRZX09GX05FV19ST0xFU19TRUNUSU9OfX07Ij48YSBocmVmPSJ7e1VTRVJfVlJFTUVNQkVSX1BST0ZJTEVfVVJMfX0iIHN0eWxlPSJjb2xvcjogIzIxOTllODsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyI+CgkJCQkJCQkJCQkgIHt7VVNFUl9GVUxMTkFNRX19CgkJCQkJCQkJCQkgIDwvYT4gaGFzIGp1c3QgYXNzaWduZWQgeW91IHRoZSBmb2xsb3dpbmcgcm9sZXM6IHt7TkVXX1JPTEVTfX0gaW4gdGhlIAoJCQkJCQkJCQkJICA8YSBocmVmPSJ7e1ZSRV9VUkx9fSIgc3R5bGU9ImNvbG9yOiAjMjE5OWU4OyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7Ij4KCQkJCQkJCQkJCSAge3tTRUxFQ1RFRF9WUkVfTkFNRX19CgkJCQkJCQkJCQkgIDwvYT4gVlJFLgo8L3NwYW4+CgkJCQkJCQkJCSAgPC9oND4KCQkJCQkJCQkJICA8aDQgc3R5bGU9ImNvbG9yOiBpbmhlcml0OyBkaXNwbGF5Ont7VklTSUJJTElUWV9PRl9SRVZPS0VEX1JPTEVTX1NFQ1RJT059fTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IHdvcmQtd3JhcDogbm9ybWFsOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbjogMCAwIDEwcHg7IHBhZGRpbmc6IDA7IiBhbGlnbj0ibGVmdCI+CgkJCQkJCQkJCQkgIDxhIGhyZWY9Int7VVNFUl9WUkVNRU1CRVJfUFJPRklMRV9VUkx9fSIgc3R5bGU9ImNvbG9yOiAjMjE5OWU4OyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgbGluZS1oZWlnaHQ6IDEuMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7Ij4KCQkJCQkJCQkJCSAge3tVU0VSX0ZVTExOQU1FfX0KCQkJCQkJCQkJCSAgPC9hPiBoYXMganVzdCByZXZva2VkIHlvdXIgcm9sZXM6IHt7UkVWT0tFRF9ST0xFU319IGluIHRoZSAKCQkJCQkJCQkJCSAgPGEgaHJlZj0ie3tWUkVfVVJMfX0iIHN0eWxlPSJjb2xvcjogIzIxOTllODsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IGxpbmUtaGVpZ2h0OiAxLjM7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyI+CgkJCQkJCQkJCQkgIHt7U0VMRUNURURfVlJFX05BTUV9fQoJCQkJCQkJCQkJICA8L2E+IFZSRS4KCgkJCQkJCQkJCSAgPC9oND4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImV4cGFuZGVyIiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuOyB3aWR0aDogMDsgY29sb3I6ICMwYTBhMGE7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyBsaW5lLWhlaWdodDogMS4zOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsiIGFsaWduPSJsZWZ0Ij48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT4KCjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT48L2NlbnRlcj4KICAgICAgICA8L3RkPgogICAgICA8L3RyPjwvdGJvZHk+PC90YWJsZT4KPC9ib2R5PjwvaHRtbD4K"; + private final static String encodedTemplateTEXT = "e3tHQVRFV0FZX05BTUV9fQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkhpIHt7UkVRVUVTVElOR19VU0VSX0ZJUlNUX05BTUV9fSwKCnt7VVNFUl9GVUxMTkFNRX19IGhhcyBqdXN0IGFzc2lnbmVkIHlvdSB0aGUgcm9sZXMge3tORVdfUk9MRVN9fSBpbiB0aGUge3tTRUxFQ1RFRF9WUkVfTkFNRX19IFZSRS4KCnt7VVNFUl9GVUxMTkFNRX19IGhhcyBqdXN0IHJldm9rZWQgeW91ciByb2xlcyB7e1JFVk9LRURfUk9MRVN9fSBpbiB0aGUge3tTRUxFQ1RFRF9WUkVfTkFNRX19IFZSRS4="; + private final static String encodedTemplateTEXTGreeting = "e3tHQVRFV0FZX05BTUV9fQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkhpIHt7UkVRVUVTVElOR19VU0VSX0ZJUlNUX05BTUV9fSwK"; + private final static String encodedTemplateTEXTAssignedRoles = "Cnt7VVNFUl9GVUxMTkFNRX19IGhhcyBqdXN0IGFzc2lnbmVkIHlvdSB0aGUgcm9sZXMge3tORVdfUk9MRVN9fSBpbiB0aGUge3tTRUxFQ1RFRF9WUkVfTkFNRX19IFZSRS4K"; + private final static String encodedTemplateTEXTRevokedRoles = "Cnt7VVNFUl9GVUxMTkFNRX19IGhhcyBqdXN0IHJldm9rZWQgeW91ciByb2xlcyB7e1JFVk9LRURfUk9MRVN9fSBpbiB0aGUge3tTRUxFQ1RFRF9WUkVfTkFNRX19IFZSRS4="; + + private FormatType formatType; + + private GCubeGroup theRequestedVRE; + private GCubeUser theRequestingUser; + private GCubeUser theManagerUser; + private List newRoles; + private List rolesRevoked; + private Date originalRequestDate; + private String vreURL; + + /** + * + * @param theRequestingUser an instance of @see {@link GCubeUser} representing the user who requested access + * @param theManagerUser an instance of @see {@link GCubeUser} representing the manager who approved the request + * @param theRequestedVRE instance of @see {@link GCubeGroup} of the current VRE + * @param originalRequestDate the request date as in the associated {@link GCubeMembershipRequest} + * @param gatewayName gateway name can be obtained with {@link PortalContext#getGatewayName(javax.servlet.http.HttpServletRequest)} + * @param gatewayURL gateway URL name can be obtained with {@link PortalContext#getGatewayURL(javax.servlet.http.HttpServletRequest)} + * @param newRoles a collection of instances of @see {@link GCubeRole} representing the collection of new roles the user will be assigned + * @param rolesRevoked a collection of instances of @see {@link GCubeRole} representing the collection of roles that will be revoked + */ + + public TemplateUserRolesModifiedForGroup(String gatewayName, String gatewayURL, GCubeGroup theRequestedVRE, + GCubeUser theRequestingUser, GCubeUser theManagerUser, List newRoles, + List rolesRevoked, Date originalRequestDate) { + super(gatewayName, gatewayURL); + + this.theRequestedVRE = theRequestedVRE; + this.theRequestingUser = theRequestingUser; + this.theManagerUser = theManagerUser; + this.newRoles = newRoles; + this.rolesRevoked = rolesRevoked; + this.originalRequestDate = originalRequestDate; + this.vreURL = new StringBuffer(gatewayURL) + .append(GCubePortalConstants.PREFIX_GROUP_URL) + .append("/").append(theRequestedVRE.getGroupName().toLowerCase()).toString(); + } + + @Override + public String compile(String templateContent) { + String userProfileLink = new StringBuffer(vreURL) + .append("/").append(getUserProfileLink(theManagerUser.getUsername())).toString(); + + return new String(Base64.getDecoder().decode(templateContent)) + .replace("{{REQUESTING_USER_FIRST_NAME}}", theRequestingUser.getFirstName()) + .replace("{{GATEWAY_LOGO:URL}}", getGatewayLogoURL()) + .replace("{{GATEWAY_NAME}}", getGatewayName()) + .replace("{{USER_FULLNAME}}", theManagerUser.getFullname()) + .replace("{{SELECTED_VRE_NAME}}", theRequestedVRE.getGroupName()) + .replace("{{VRE_URL}}", vreURL) + .replace("{{REQUESTING_USER_EMAIL}}", theRequestingUser.getEmail()) + .replace("{{MANAGE_REQUEST_DATE}}", originalRequestDate.toString()) + .replace("{{VISIBILITY_OF_NEW_ROLES_SECTION}}", this.displayVisibilityOfRolesSectionBasedOnRolesSize(newRoles)) + .replace("{{NEW_ROLES}}", this.getRoleNamesFromRoles(newRoles)) + .replace("{{USER_VREMEMBER_PROFILE_URL}}", userProfileLink) + .replace("{{VISIBILITY_OF_REVOKED_ROLES_SECTION}}", this.displayVisibilityOfRolesSectionBasedOnRolesSize(rolesRevoked)) + .replace("{{REVOKED_ROLES}}", this.getRoleNamesFromRoles(rolesRevoked)); + } + + @Override + public String getTextHTML() { + this.formatType = FormatType.HTML; + return compile(encodedTemplateHTML); + } + + @Override + public String getTextPLAIN() { + this.formatType = FormatType.TEXT; + return compile( this.buildTextPlainBasedOnRoles() ); + } + + private String buildTextPlainBasedOnRoles() { + StringBuilder finalTextBuilder = new StringBuilder(encodedTemplateTEXTGreeting); + + if(!this.newRoles.isEmpty()) + finalTextBuilder.append(encodedTemplateTEXTAssignedRoles); + + if(!this.rolesRevoked.isEmpty()) + finalTextBuilder.append(encodedTemplateTEXTRevokedRoles); + + return finalTextBuilder.toString(); + } + + private String getUserProfileLink(String username) { + return "profile?"+ new String( + Base64.getEncoder().encodeToString(Constants.USER_PROFILE_OID.getBytes())+ + "="+ + new String( Base64.getEncoder().encodeToString(username.getBytes()) ) + ); + } + + private String getRoleNamesFromRoles(Collection roles) { + if(this.formatType == FormatType.HTML) + return this.buildRoleSectionForHTMLFormat(roles); + + if(this.formatType == FormatType.TEXT) + return this.buildRoleSectionForTextFormat(roles); + + return ""; + } + + private String buildRoleSectionForTextFormat(Collection roles) { + StringBuilder sb = new StringBuilder(); + if(roles == null || roles.isEmpty()) + return sb.append("-").toString(); + + boolean first = true; + for(GCubeRole role : roles) { + StringBuilder prefix = first ? new StringBuilder() : new StringBuilder(", "); + sb.append(prefix); + sb.append(role.getRoleName()); + first = false; + } + + return sb.toString(); + } + + private String buildRoleSectionForHTMLFormat(Collection roles) { + if(roles == null) + return "
-"; + + StringBuilder sb = new StringBuilder(); + sb.append("
    "); + roles.forEach(r -> sb.append("
  • " + r.getRoleName() + "
  • ")); + sb.append("
"); + + return sb.toString(); + } + + private String displayVisibilityOfRolesSectionBasedOnRolesSize(Collection roles) { + return roles == null || roles.isEmpty() ? this.hiddenSection : this.visibleSection; + } + +} \ No newline at end of file diff --git a/src/main/resources/EmailTemplates.properties b/src/main/resources/EmailTemplates.properties new file mode 100644 index 0000000..88c9526 --- /dev/null +++ b/src/main/resources/EmailTemplates.properties @@ -0,0 +1,10 @@ +membershipRequestAcceptanceBody=

Dear {0},

Your request for accessing the {1} has been approved by {2}

From now on you can access it here: {5} using the following email: {4}

+membershipRequestAcceptanceSubject={0} Request Approved +membershipRequestRejectionBody=

Dear {0},

Your request for accessing the {1} at: {5} has been rejected by {2}

+membershipRequestRejectionSubject={0} Request Rejected +userDismissalFromSiteBody=

You have been unregistered from the {0} VO/VRE

The {0} VO/VRE administration team

+userDismissalFromSiteSubject={0} You have been unregistered +siteTeamAssignmentSubject=You are now associated with {0} +siteTeamDismissalSubject=You have been dismissed from {0} +roleAssignmentRevokeSubject=Your roles have been modified for {0} + diff --git a/src/main/webapp/WEB-INF/liferay-display.xml b/src/main/webapp/WEB-INF/liferay-display.xml new file mode 100644 index 0000000..2673649 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties new file mode 100644 index 0000000..b50a28f --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,10 @@ +name=UsersManagementPortlet +module-group-id=liferay +module-incremental-version=1 +tags= +short-description= +change-log= +page-url=http://www.liferay.com +author=Liferay, Inc. +licenses=LGPL +portal.dependency.jars=usermanagement-core-2.0.0-20160229.000514-14.jar \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/liferay-portlet.xml b/src/main/webapp/WEB-INF/liferay-portlet.xml new file mode 100644 index 0000000..403250d --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,25 @@ + + + + + + Users Management + /icon.png + + + administrator + Administrator + + + guest + Guest + + + power-user + Power User + + + user + User + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..501196d --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,42 @@ + + + + + Users Management + Users Management + gr.cite.bluebridge.portlets.admin.usersmanagementportlet.UsersManagementPortletHome + + view-template + /views/ + + + 0 + + text/html + + + Users Management + Users Management + Users Management + + + administrator + + + guest + + + power-user + + + user + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..7d8c082 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/main/webapp/css/Tags.css b/src/main/webapp/css/Tags.css new file mode 100644 index 0000000..ba30afd --- /dev/null +++ b/src/main/webapp/css/Tags.css @@ -0,0 +1,142 @@ +div#usersManagementPortletContainer div.modal-header, +div#usersManagementPortletContainer div.modal-footer{ + border: 0px !important; +} +div#usersManagementPortletContainer div.text-tag.span2 { + padding : 0px; +} +div#usersManagementPortletContainer div#border, +div#usersManagementPortletContainer div#borderFirstScreen { + /* height:3px; */ + border-top: 2px solid #0271be; +/* padding-bottom: 0.2em; */ +} +div#usersManagementPortletContainer div.text-tag.span2:not(:first-of-type) { + margin-left : 10px !important; +} +div#usersManagementPortletContainer div.text-wrap { + width :inherit !important; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row div.text-core.span9 div.text-wrap, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row div.text-core.span9 div.text-wrap, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row div.text-core.span9 div.text-wrap { + width :100% !important; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row div.text-core.span9, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row div.text-core.span9, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row div.text-core.span9 { + min-height: 45px !important; + margin-top : -10px; + height:100% !important; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row:first div.text-core.span9 { + position: static; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row div.text-core.span9 div.text-wrap , + div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row div.text-core.span9 div.text-wrap, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row div.text-core.span9 div.text-wrap { + position:static; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row div.text-core.span9 div.text-wrap div.text-tags, +div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row div.text-core.span9 div.text-wrap div.text-tags, +div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row div.text-core.span9 div.text-wrap div.text-tags{ + position:static; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row div.text-core.span9 div.text-button { + padding: 0px 0px 8px 5px !important; + text-align: -webkit-center; +} +div#usersManagementPortletContainer #assignUsersRolesModal div.text-button.span12, + div#usersManagementPortletContainer #assignUsersToGroupsModal div.text-button.span12 { + padding-right: 0px; +} +div#usersManagementPortletContainer div.text-button.span12{ + padding-left:10px !important; + border-radius : 6px !important; +} +div#usersManagementPortletContainer a.tag-remove { + /* margin-left : 5px; */ + font-size : 14px; + padding: 3px 0px 3px 2px; + /* margin-top : 4px; */ +} +div#usersManagementPortletContainer div#requestsAcceptanceBody > div.row:first-of-type > div.text-core > div.text-wrap > div.text-tags > div.text-tag:not(:last-of-type){ + margin-right : 15px !important; +} +div#usersManagementPortletContainer span#textAboveTagsInput> div.row div.text-tags > div.text-tag:not(:last-of-type), +div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal> div.row div.text-tags > div.text-tag:not(:last-of-type), +div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal> div.row div.text-tags > div.text-tag:not(:last-of-type){ + margin-right : 15px !important; +} +div#usersManagementPortletContainer a.tag-remove:hover { + /* background : white; + background-color : white; */ + text-decoration : none; + color: red; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row:nth-last-child(-n+2) div.text-core.span9 div.text-wrap div.text-dropdown.text-position-below, +div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row:nth-last-child(-n+2) div.text-core.span9 div.text-wrap div.text-dropdown.text-position-below, +div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row:nth-last-child(-n+2) div.text-core.span9 div.text-wrap div.text-dropdown.text-position-below { + margin-left: -5px; + top: 100% !important; +} +div#usersManagementPortletContainer textarea#userNamesList { + width :100% !important; + display : none !important; +} +div#usersManagementPortletContainer textarea#userNamesListInAssignRolesModal, +div#usersManagementPortletContainer textarea#userNamesListInAssignUsersToGroupsModal { + width :100% !important; + display : none !important; +} +div#usersManagementPortletContainer div.text-tags { + padding-top:0px !important; + padding-bottom:0px !important; + padding-left : 0px !important; +} +div#usersManagementPortletContainer div.text-button { + background : rgb(234,234,234) !important; + background-color : rgb(234,234,234) !important; + border : 0px !important; + text-align : +} +div#usersManagementPortletContainer div.text-button span { + padding-top : 7px; + display : inline-block; + text-align: center; + font-size : 14px; + color: #0271be; + white-space : nowrap; +} +div.modal-body div.row ~ div.row div.text-button span { + /* text-transform : capitalize; */ +} +div#usersManagementPortletContainer a.text-remove { + display : none !important; +} +div#usersManagementPortletContainer div.text-button.span12 { + border-radius : 7px; +} +div#usersManagementPortletContainer div#requestsAcceptanceBody > div.row > div.text-core.span11 > div.text-wrap { + position: static !important; +} +div#usersManagementPortletContainer div#requestsAcceptanceBody > div.row > div.text-core.span11 > div.text-wrap > div.text-tags{ + position : static; +} +div#usersManagementPortletContainer input#singleTag { + margin-top : 0px; + margin-left : 10px; +} +div#usersManagementPortletContainer div#singleTagSection.hiddenSection, +div#usersManagementPortletContainer div#multipleTagsSection.hiddenSection, +div#usersManagementPortletContainer div#singleTagSectionInAssignRolesModal.hiddenSection, +div#usersManagementPortletContainer div#multipleTagsSectionInAssignRolesModal.hiddenSection, +div#usersManagementPortletContainer div#singleTagSectionInAssignUsersToGroupsModal.hiddenSection, +div#usersManagementPortletContainer div#multipleTagsSectionInAssignUsersToGroupsModal.hiddenSection{ + display :none; +} +.recipients .text-tag, +.emailCBCContainer .text-tag { + margin-right: 1em; + margin-bottom: 0.5em; +} \ No newline at end of file diff --git a/src/main/webapp/css/jquery_datatables/buttons.dataTables.min.css b/src/main/webapp/css/jquery_datatables/buttons.dataTables.min.css new file mode 100644 index 0000000..b7c3e63 --- /dev/null +++ b/src/main/webapp/css/jquery_datatables/buttons.dataTables.min.css @@ -0,0 +1 @@ +div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(top, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(top, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(top, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(top, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(top, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}} diff --git a/src/main/webapp/css/jquery_datatables/editor.dataTables.min.css b/src/main/webapp/css/jquery_datatables/editor.dataTables.min.css new file mode 100644 index 0000000..e416ad6 --- /dev/null +++ b/src/main/webapp/css/jquery_datatables/editor.dataTables.min.css @@ -0,0 +1 @@ +div.DTE{position:relative}div.DTE div.DTE_Processing_Indicator{position:absolute;top:10px;right:13px;height:32px;width:32px;background:url("../images/ajax-loader.gif") no-repeat top left;display:none;z-index:20}div.DTE div.DTE_Header{position:absolute;top:0;left:0;height:50px;width:100%;background-color:#f3f3f3;border-bottom:1px solid #ddd;padding:16px 10px 2px 16px;font-size:1.3em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE div.DTE_Footer{position:absolute;bottom:0;left:0;height:50px;width:100%;background-color:#f3f3f3;border-top:1px solid #ddd;padding:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE div.DTE_Form_Info{margin-bottom:0.5em;display:none}div.DTE div.DTE_Form_Content{position:relative;padding:10px}div.DTE div.DTE_Form_Error{float:left;padding:5px;display:none;color:#b11f1f}div.DTE button.btn,div.DTE div.DTE_Form_Buttons button{position:relative;text-align:center;display:block;margin-top:0;padding:5px 15px;cursor:pointer;float:right;margin-left:0.75em;font-size:14px;text-shadow:0 1px 0 white;border:1px solid #999;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background-color:#f9f9f9 100%;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}div.DTE button.btn:hover,div.DTE div.DTE_Form_Buttons button:hover{border:1px solid #666;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background-color:#f4f4f4 100%;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#f4f4f4')}div.DTE button.btn:active,div.DTE div.DTE_Form_Buttons button:active{-webkit-box-shadow:inset 1px 1px 3px #999;-moz-box-shadow:inset 1px 1px 3px #999;box-shadow:inset 1px 1px 3px #999}div.DTE button.btn:focus,div.DTE div.DTE_Form_Buttons button:focus{border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;background-color:#a3d0ef 100%;background-image:-webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef');outline:none}div.DTE button.btn:focus:after,div.DTE div.DTE_Form_Buttons button:focus:after{position:absolute;top:0;left:0;right:0;bottom:0;background:white;display:block;content:" ";-webkit-animation-duration:1s;-webkit-animation-name:buttonPulse;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-webkit-animation-direction:alternate;-moz-animation-duration:1s;-moz-animation-name:buttonPulse;-moz-animation-fill-mode:forwards;-moz-animation-iteration-count:infinite;-moz-animation-timing-function:linear;-moz-animation-direction:alternate;-o-animation-duration:1s;-o-animation-name:buttonPulse;-o-animation-fill-mode:forwards;-o-animation-iteration-count:infinite;-o-animation-timing-function:linear;-o-animation-direction:alternate;animation-duration:1s;animation-name:buttonPulse;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-timing-function:linear;animation-direction:alternate}div.DTE.DTE_Action_Remove div.DTE_Body_Content{text-align:center;padding:20px 0}@-webkit-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@-moz-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@-o-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}div.DTTT_container{float:left}div.DTE_Field input,div.DTE_Field textarea{box-sizing:border-box;background-color:white;-webkit-transition:background-color ease-in-out .15s;transition:background-color ease-in-out .15s}div.DTE_Field input:focus,div.DTE_Field textarea:focus{background-color:#ffffee}div.DTE_Field input[type="color"],div.DTE_Field input[type="date"],div.DTE_Field input[type="datetime"],div.DTE_Field input[type="datetime-local"],div.DTE_Field input[type="email"],div.DTE_Field input[type="month"],div.DTE_Field input[type="number"],div.DTE_Field input[type="password"],div.DTE_Field input[type="search"],div.DTE_Field input[type="tel"],div.DTE_Field input[type="text"],div.DTE_Field input[type="time"],div.DTE_Field input[type="url"],div.DTE_Field input[type="week"]{padding:6px 4px;width:100%}div.DTE_Field div.DTE_Field_Info,div.DTE_Field div.DTE_Field_Message{font-size:11px;line-height:1em}div.DTE_Field div.DTE_Field_Error{font-size:11px;line-height:1em;display:none;color:red;margin-top:5px}div.DTE_Field div.multi-value{display:none;border:1px dotted #666;border-radius:3px;padding:5px;background-color:#fafafa;cursor:pointer}div.DTE_Field div.multi-value span{font-size:0.8em;line-height:1.25em;display:block;color:#666}div.DTE_Field div.multi-value:hover{background-color:#f1f1f1}div.DTE_Field div.multi-restore{display:none;margin-top:0.5em;font-size:0.8em;line-height:1.25em;color:#3879d9}div.DTE_Field div.multi-restore:hover{text-decoration:underline;cursor:pointer}div.DTE_Field_Type_textarea textarea{padding:3px;width:100%;height:80px}div.DTE_Field.DTE_Field_Type_date img{vertical-align:middle;cursor:pointer;*cursor:hand}div.DTE_Field.DTE_Field_Type_date input.jqueryui{width:87%;margin-right:6px}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div{margin-bottom:0.25em}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div:last-child,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div:last-child{margin-bottom:0}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div label,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div label{margin-left:0.75em;vertical-align:middle}div.DTE_Field_Type_select div.DTE_Field_Input{padding-top:4px}div.DTE_Body{padding:50px 0}div.DTE_Body div.DTE_Body_Content{position:relative;overflow:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Form_Info{padding:1em 1em 0 1em;margin:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 20%;border:1px solid transparent}div.DTE_Body div.DTE_Body_Content div.DTE_Field:after{display:block;content:".";height:0;line-height:0;clear:both;visibility:hidden}div.DTE_Body div.DTE_Body_Content div.DTE_Field:hover{background-color:#f9f9f9;border:1px solid #f3f3f3}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:left;width:40%;padding-top:6px}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:right;width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 20%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:30%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:70%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{float:none;clear:both;width:100%}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:right}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:left}html[dir="rtl"] div.DTE div.DTE_Form_Buttons button{float:left}@media only screen and (max-width: 768px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:35.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:64.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 640px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:40%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 580px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:none;width:auto;padding-top:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:none;width:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}div.DTE_Bubble{position:absolute;z-index:11;margin-top:-6px;opacity:0}div.DTE_Bubble div.DTE_Bubble_Liner{position:absolute;bottom:0;border:1px solid black;width:300px;margin-left:-150px;background-color:white;box-shadow:2px 2px 7px #555;border-radius:5px;border:2px solid #444;padding:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table{display:table;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form{display:table-cell}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content{padding:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field{position:relative;zoom:1;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field:last-child{margin-bottom:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons{display:table-cell;vertical-align:bottom;padding:0 0 0 0.75em;width:1%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{border-top-left-radius:5px;border-top-right-radius:5px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Form_Info,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Bubble_Table{padding-top:42px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error{float:none;display:none;padding:0;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:18px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTE_Bubble div.DTE_Bubble_Triangle{position:absolute;height:10px;width:10px;top:-6px;background-color:white;border:2px solid #444;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after{position:absolute;content:' ';display:block;top:12px;right:18px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}div.DTE_Bubble.below div.DTE_Bubble_Liner{top:10px;bottom:auto}div.DTE_Bubble.below div.DTE_Bubble_Triangle{top:4px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTE_Bubble_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTE_Bubble_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}div.DTE_Inline{position:relative;display:table;width:100%}div.DTE_Inline div.DTE_Inline_Field,div.DTE_Inline div.DTE_Inline_Buttons{display:table-cell;vertical-align:middle}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field{padding:0}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field>label,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field>label{display:none}div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button{margin:-6px 0 -6px 4px;padding:5px}div.DTE_Inline div.DTE_Field input[type="color"],div.DTE_Inline div.DTE_Field input[type="date"],div.DTE_Inline div.DTE_Field input[type="datetime"],div.DTE_Inline div.DTE_Field input[type="datetime-local"],div.DTE_Inline div.DTE_Field input[type="email"],div.DTE_Inline div.DTE_Field input[type="month"],div.DTE_Inline div.DTE_Field input[type="number"],div.DTE_Inline div.DTE_Field input[type="password"],div.DTE_Inline div.DTE_Field input[type="search"],div.DTE_Inline div.DTE_Field input[type="tel"],div.DTE_Inline div.DTE_Field input[type="text"],div.DTE_Inline div.DTE_Field input[type="time"],div.DTE_Inline div.DTE_Field input[type="url"],div.DTE_Inline div.DTE_Field input[type="week"]{margin:-6px 0}div.DTE_Inline.DTE_Processing:after{position:absolute;content:' ';display:block;top:4px;right:10px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}span.dtr-data div.DTE_Inline{display:inline-table}div.DTED_Lightbox_Wrapper{position:fixed;top:0;left:50%;margin-left:-390px;width:780px;height:100%;z-index:11}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container{*position:absolute;*top:50%;#position:absolute;#top:50%;display:table;height:100%;width:100%}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper{*position:relative;#position:relative;display:table-cell;vertical-align:middle;width:100%}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content{*top:-50%;#top:-50%;position:relative;border:7px solid rgba(220,220,220,0.5);box-shadow:2px 2px 10px #555;border-radius:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE{background:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header{top:2px;left:2px;right:2px;width:auto;border-top-left-radius:5px;border-top-right-radius:5px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer{bottom:2px;left:2px;right:2px;width:auto;border-bottom-left-radius:5px;border-bottom-right-radius:5px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:18px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTED_Lightbox_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTED_Lightbox_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTED_Lightbox_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Background{height:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Shown{display:none}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper{position:absolute;top:0px;left:0px;right:0px;bottom:0px;width:auto;height:auto;margin-left:0;-webkit-overflow-scrolling:touch}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container{display:block}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper{display:block}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content{border:4px solid rgba(220,220,220,0.5);border-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE{border-radius:0;box-shadow:0 0 5px #555;border:2px solid #444}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header{border-top-left-radius:0;border-top-right-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer{border-bottom-left-radius:0;border-bottom-right-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close{top:11px;right:15px}@media only screen and (max-width: 780px){div.DTED_Lightbox_Wrapper{position:fixed;top:0;left:0;width:100%;margin-left:0}}div.DTED_Envelope_Wrapper{position:absolute;top:0;bottom:0;left:50%;height:100%;z-index:11;display:none;overflow:hidden}div.DTED_Envelope_Wrapper div.DTED_Envelope_ShadowLeft{position:absolute;top:0;left:0;width:50%;height:9px;background:url("../images/shadow_left.png") no-repeat top left;z-index:10}div.DTED_Envelope_Wrapper div.DTED_Envelope_ShadowRight{position:absolute;top:0;right:0;width:50%;height:9px;background:url("../images/shadow_right.png") no-repeat top right;z-index:10}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container{position:absolute;top:0;left:5%;width:90%;border-left:1px solid #777;border-right:1px solid #777;border-bottom:1px solid #777;box-shadow:3px 3px 10px #555;border-bottom-left-radius:5px;border-bottom-right-radius:5px;background-color:white}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Processing_Indicator{right:36px}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Footer{border-bottom-left-radius:5px;border-bottom-right-radius:5px}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTED_Envelope_Close{position:absolute;top:16px;right:10px;width:18px;height:18px;cursor:pointer;*cursor:hand;z-index:12;text-align:center;font-size:12px;background:#F8F8F8;background:-webkit-gradient(linear, center bottom, center top, from(#CCC), to(#fff));background:-moz-linear-gradient(top, #fff, #CCC);background:linear-gradient(top, #fff, #CCC);text-shadow:0 1px 0 white;border:1px solid #999;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:0px 0px 1px #999;-moz-box-shadow:0px 0px 1px #999;-webkit-box-shadow:0px 0px 1px #999}div.DTED_Envelope_Background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;background:rgba(0,0,0,0.4);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.1)), color-stop(1, rgba(0,0,0,0.4)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%)}table.dataTable tbody tr.highlight{background-color:#FFFBCC !important}table.dataTable tbody tr.highlight,table.dataTable tbody tr.noHighlight,table.dataTable tbody tr.highlight td,table.dataTable tbody tr.noHighlight td{-webkit-transition:background-color 500ms linear;-moz-transition:background-color 500ms linear;-ms-transition:background-color 500ms linear;-o-transition:background-color 500ms linear;transition:background-color 500ms linear}table.dataTable.stripe tbody tr.odd.highlight,table.dataTable.display tbody tr.odd.highlight{background-color:#f9f5c7}table.dataTable.hover tbody tr:hover.highlight,table.dataTable.hover tbody tr.odd:hover.highlight,table.dataTable.hover tbody tr.even:hover.highlight,table.dataTable.display tbody tr:hover.highlight,table.dataTable.display tbody tr.odd:hover.highlight,table.dataTable.display tbody tr.even:hover.highlight{background-color:#f6f2c5}table.dataTable.order-column tbody tr.highlight>.sorting_1,table.dataTable.order-column tbody tr.highlight>.sorting_2,table.dataTable.order-column tbody tr.highlight>.sorting_3,table.dataTable.display tbody tr.highlight>.sorting_1,table.dataTable.display tbody tr.highlight>.sorting_2,table.dataTable.display tbody tr.highlight>.sorting_3{background-color:#faf6c8}table.dataTable.display tbody tr.odd.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_1{background-color:#f1edc1}table.dataTable.display tbody tr.odd.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_2{background-color:#f3efc2}table.dataTable.display tbody tr.odd.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_3{background-color:#f5f1c4}table.dataTable.display tbody tr.even.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_1{background-color:#faf6c8}table.dataTable.display tbody tr.even.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_2{background-color:#fcf8ca}table.dataTable.display tbody tr.even.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_3{background-color:#fefacb}table.dataTable.display tbody tr:hover.highlight>.sorting_1,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.display tbody tr.even:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_1{background-color:#eae6bb}table.dataTable.display tbody tr:hover.highlight>.sorting_2,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.display tbody tr.even:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_2{background-color:#ece8bd}table.dataTable.display tbody tr:hover.highlight>.sorting_3,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.display tbody tr.even:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_3{background-color:#efebbf}div.DTE div.editor_upload{padding-top:4px}div.DTE div.editor_upload div.eu_table{display:table;width:100%}div.DTE div.editor_upload div.row{display:table-row}div.DTE div.editor_upload div.cell{display:table-cell;position:relative;width:50%;vertical-align:top}div.DTE div.editor_upload div.cell+div.cell{padding-left:10px}div.DTE div.editor_upload div.row+div.row div.cell{padding-top:10px}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{width:100%;height:2.3em;font-size:0.8em;text-align:center;line-height:1em}div.DTE div.editor_upload input[type=file]{position:absolute;top:0;left:0;width:100%;opacity:0}div.DTE div.editor_upload div.drop{position:relative;box-sizing:border-box;width:100%;height:100%;border:3px dashed #ccc;border-radius:6px;min-height:4em;color:#999;padding-top:3px;text-align:center}div.DTE div.editor_upload div.drop.over{border:3px dashed #111;color:#111}div.DTE div.editor_upload div.drop span{max-width:75%;font-size:0.85em;line-height:1em}div.DTE div.editor_upload div.rendered img{max-width:8em;margin:0 auto}div.DTE div.editor_upload.noDrop div.drop{display:none}div.DTE div.editor_upload.noDrop div.row.second{display:none}div.DTE div.editor_upload.noDrop div.rendered{margin-top:10px}div.DTE div.editor_upload.noClear div.clearValue button{display:none}div.DTE div.editor_upload.multi div.cell{display:block;width:100%}div.DTE div.editor_upload.multi div.cell div.drop{min-height:0;padding-bottom:5px}div.DTE div.editor_upload.multi div.clearValue{display:none}div.DTE div.editor_upload.multi ul{list-style-type:none;margin:0;padding:0}div.DTE div.editor_upload.multi ul li{position:relative;margin-top:0.5em}div.DTE div.editor_upload.multi ul li:first-child{margin-top:0}div.DTE div.editor_upload.multi ul li img{vertical-align:middle}div.DTE div.editor_upload.multi ul li button{position:absolute;width:40px;right:0;top:50%;margin-top:-1.5em} diff --git a/src/main/webapp/css/jquery_datatables/jquery.dataTables.css b/src/main/webapp/css/jquery_datatables/jquery.dataTables.css new file mode 100644 index 0000000..55c6d2b --- /dev/null +++ b/src/main/webapp/css/jquery_datatables/jquery.dataTables.css @@ -0,0 +1,485 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; + /* position: relative; */ + background-image: none !important; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; + border-bottom: 1px solid #111; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; + border-top: 1px solid #111; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead .sorting:after, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc:after { + /* position: absolute; + top: 12px; + right: 8px; + display: block; */ + font-family: FontAwesome; + font-weight: normal; + font-size: 0.8em; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background-repeat: no-repeat; + background-position: center right; +} +table.dataTable thead .sorting:after { + content: "\f0dc"; + color: #0271be; + font-size: 0.8em; +} +table.dataTable thead .sorting:hover:after, +table.dataTable thead .sorting_desc:hover:after, +table.dataTable thead .sorting_asc:hover:after { + color: #009AE5; +} +table.dataTable thead .sorting_asc:after { + content: "\f0de"; + color: #0271be; + font-size: 0.8em; +} +table.dataTable thead .sorting_desc:after { + content: "\f0dd"; + color: #0271be; +} +table.dataTable thead .sorting_asc_disabled:after { + +} +/* table.dataTable thead .sorting { + background-image: url("../../img/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("../../img/sort_asc.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("../../img/sort_desc.png"); +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("../../img/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("../../img/sort_desc_disabled.png"); +} */ +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #acbad4; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: #f6f6f6; +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #aab7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #fafafa; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b4cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a8b5cf; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b7d1; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #fafafa; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fcfcfc; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fefefe; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #aebcd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: #ececec; +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: #efefef; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a2aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a3b0c9; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a5b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px 4px 4px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; + border-radius: 0px; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid #979797; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table, +.dataTables_wrapper.no-footer div.dataTables_scrollBody table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} \ No newline at end of file diff --git a/src/main/webapp/css/jquery_datatables/select.dataTables.min.css b/src/main/webapp/css/jquery_datatables/select.dataTables.min.css new file mode 100644 index 0000000..59d808a --- /dev/null +++ b/src/main/webapp/css/jquery_datatables/select.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable td.select-checkbox{position:relative}table.dataTable td.select-checkbox:before,table.dataTable td.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable td.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}} diff --git a/src/main/webapp/css/modal.css b/src/main/webapp/css/modal.css new file mode 100644 index 0000000..d490328 --- /dev/null +++ b/src/main/webapp/css/modal.css @@ -0,0 +1,492 @@ +div#usersManagementPortletContainer button.close { + color: #d1d1d1 !important; + opacity : 1 !important; +} +div#usersManagementPortletContainer button.close:hover { + color: #0271be !important; +} +div#usersManagementPortletContainer span#theHeader { + color: #0271be; +} +div#usersManagementPortletContainer button#saveUsersRolesModal, +div#usersManagementPortletContainer #saveUsersRolesModalInAssignRolesModal, +div#usersManagementPortletContainer #closeUsersRolesModalInAssignRolesModal, +div#usersManagementPortletContainer #saveUsersTeamsInAssignUsersToGroupsModal, +div#usersManagementPortletContainer #closeUsersTeamsInAssignUsersToGroupsModal { + color : #4cb5d2; +} +div#usersManagementPortletContainer button#closeUsersRolesModal, +div#usersManagementPortletContainer button#acceptUsersRequestsOk, +div#usersManagementPortletContainer span#acceptRequestHeader, +div#usersManagementPortletContainer button#acceptDeleteUsersFromCurrentSiteModal, +div#usersManagementPortletContainer button#closeDeleteUsersFromCurrentSiteModal { + color : #4cb5d2; +} +div#usersManagementPortletContainer span#deleteCurrentSiteUsersHeader { + color : #0271be; +} +div#usersManagementPortletContainer div#blueLineBottom, + div#usersManagementPortletContainerSiteTeamsEditMode div#blueLineBottom { + border-bottom: 2px solid #0271be; + padding-bottom: 0.2em; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-footer, +div#usersManagementPortletContainer div#usersRequestsModal div.modal-footer { + background-color: white; + background: white; +} +div#usersManagementPortletContainer span#textAboveTagsInput , +div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal, +div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal { + /* opacity: 0.8; */ + display : block; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body div.bootstrap-tagsinput { + diplay : inline-block; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body div.bootstrap-tagsinput input{ + display : none; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body label:not(#deleteTheRolesLabel), + div#usersManagementPortletContainer div#assignUsersRolesModal div.modal-body label:not(#deleteTheRolesLabelInAssignRolesModal), + div#usersManagementPortletContainer div#assignUsersToGroupsModal div.modal-body label:not(#deleteTheRolesLabelInAssignUsersToGroupsModal), + #addGroupTeamAttributes label, + #groupTeamAttributes label { + color: #0271be; + display : inline-block; + text-transform: capitalize; +} +div#usersManagementPortletContainer div#changeUsersTeamsModal div.modal-body label:not(#deleteTheRolesLabel) { + color : #4cb5d2; + display : inline-block; +} +div#usersManagementPortletContainer label#deleteTheRolesLabel { + display : inline-block; +} +div#usersManagementPortletContainer label#deleteTheRolesLabelInAssignRolesModal, +div#usersManagementPortletContainer label#deleteTheRolesLabelInAssignUsersToGroupsModal { + display : inline-block; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body div.bootstrap-tagsinput { + display : inline-block; + margin-left : 10px; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row, +div#assignUsersRolesModal span#textAboveTagsInputInAssignRolesModal div.row, +div#assignUsersToGroupsModal span#textAboveTagsInputInAssignUsersToGroupsModal div.row { + margin-left : 0px; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row.usersEmailsTagsInModals div.text-core.span9, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row.usersEmailsTagsInModals div.text-core.span9, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row.usersEmailsTagsInModals div.text-core.span9 { + max-height: 10em !important; + overflow-y: scroll !important; + margin-top: -0.7em; + padding-top: 0.7em; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body span#textAboveTagsInput div.row:last-of-type div.bootstrap-tagsinput { + border: 1px solid #4cb5d2; + border-radius: 8px; + margin-top:-7px +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body span#textAboveTagsInput div.row:nth-last-child(-n+2) div.text-core.span9, + div#usersManagementPortletContainer div#assignUsersRolesModal div.modal-body span#textAboveTagsInputInAssignRolesModal div.row:last-of-type div.text-core.span9, + div#usersManagementPortletContainer div#assignUsersToGroupsModal div.modal-body span#textAboveTagsInputInAssignUsersToGroupsModal div.row:last-of-type div.text-core.span9 { + border-radius: 0.2em; + border: 1px solid #d1d1d1; + padding: 5px !important; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body span#textAboveTagsInput div.row:nth-last-child(-n+2), +div#usersManagementPortletContainer div#assignUsersRolesModal div.modal-body span#textAboveTagsInputInAssignRolesModal div.row:last-of-type, +div#usersManagementPortletContainer div#assignUsersToGroupsModal div.modal-body span#textAboveTagsInputInAssignUsersToGroupsModal div.row:last-of-type { + margin-top: 1.2em; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body span#textAboveTagsInput i { + color : #4cb5d2; + padding : 12px; +} +i.fa.fa-times { + padding: 6px !important; + color: #d1d1d1 !important; +} +i.fa.fa-times:hover { + color: #0271be !important; +} +div#usersManagementPortletContainer div#dropdownList { + max-height:200px; + overflow: scroll; + margin-left : 10px; + border : 1px solid #4cb5d2; +} +div#usersManagementPortletContainer div.listElement:not(:last-of-type) { + border-bottom: 1px solid #4cb5d2; +} +div#usersManagementPortletContainer textarea#roleList { + /* margin-left : 10px; */ + width : 100% !important; + border-radius : 7px; + padding-top : 8px !important; + padding-bottom : 8px !important; + display : none !important; +} + +div#usersManagementPortletContainer textarea#roleListInAssignRolesModal { + /* margin-left : 10px; */ + width : 100% !important; + border-radius : 7px; + padding-top : 8px !important; + padding-bottom : 8px !important; + display : none !important; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row:last-of-type div.text-core.offset3 { + width: 70%; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row:nth-last-child(-n+2) div.text-core.span9 div.text-wrap div.text-arrow, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignRolesModal div.row:last-of-type div.text-core.span9 div.text-wrap div.text-arrow, + div#usersManagementPortletContainer span#textAboveTagsInputInAssignUsersToGroupsModal div.row:last-of-type div.text-core.span9 div.text-wrap div.text-arrow { + -ms-transform: scale(1.6,1.6); /* IE 9 */ + -webkit-transform: scale(1.6,1.6); /* Safari */ + transform: scale(1.6,1.6); + height: 35px; + margin-right : 10px; +} +div#usersManagementPortletContainer span#textAboveTagsInput div.row:last-of-type div.text-core.offset3 div.text-wrap { + width: 100% !important; +} + +div#usersManagementPortletContainer div.text-dropdown.text-position-below { + margin-left: 10px; +} +div#usersManagementPortletContainer div.text-tags.text-tags-on-top { + margin-left:14px; + margin-top:6px; +} +div#usersManagementPortletContainer div.text-core.offset3 div.text-wrap div.text-arrow { + margin-top: 3%; +} +div#usersManagementPortletContainer div#usersRequestsModal { + width : 60%; + /* top : 33%; */ + color: #0271be !important; +} +@media (min-width: 1700px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left : 35%; + } +} +@media (min-width: 1550px) and (max-width: 1699px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 37%; + } +} +@media (min-width: 1350px) and (max-width: 1549px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 40%; + } +} +@media (min-width: 1300px) and (max-width: 1350px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 41%; + } +} +@media (min-width: 1250px) and (max-width: 1299px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 42%; + } +} +@media (min-width: 1100px) and (max-width: 1249px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 44%; + } +} +@media (min-width: 1050px) and (max-width: 1099px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 46%; + } +} +@media (min-width: 1000px) and (max-width: 1049px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 47%; + } +} +@media (min-width: 980px) and (max-width: 999px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 49%; + } +} +@media (min-width: 900px) and (max-width: 979px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 51%; + width: 62%; + } +} +@media (min-width: 850px) and (max-width: 900px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 52%; + } +} +@media (min-width: 801px) and (max-width: 849px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 55%; + } +} +@media (min-width: 768px) and (max-width: 800px){ + div#usersManagementPortletContainer div#usersRequestsModal { + left: 57%; + } +} +div#usersManagementPortletContainer div#usersRequestsModal .modalSubHeader { + margin-top: 1em; +} +div#usersManagementPortletContainer button#acceptAll, +div#usersManagementPortletContainer button#rejectAll, +div#usersManagementPortletContainer button#sendAcceptance, +div#usersManagementPortletContainer button#sendRejection { + /* color : #4cb5d2 !important */ +} +div#usersManagementPortletContainer a#reloadUsersRequestsTable { + font-size: 14px; + background-color: #7EAB10; + background: #7EAB10; + color: white; + display: inline; + border-radius: 50% !important; + padding: 6px 9px; + margin-left: 8px; + cursor: pointer; +} +div#usersManagementPortletContainer div#usersRequestsTableContainer { + position : relative; +} +div#usersManagementPortletContainer div#requestsAcceptanceContainer { + position : relative; +} +div#usersManagementPortletContainer div#requestsAcceptanceContainer.hideSection, +div#usersManagementPortletContainer div#requestsAcceptanceBody div.row.hideSection { + display : none; +} +div#usersManagementPortletContainer div#usersRequestsTableContainer.hideSection { + display : none; +} +div#usersManagementPortletContainer div#clickToGoBack { + cursor: pointer; + display : inline-block; +} +div#usersManagementPortletContainer button.hideButton { + display : none !important; +} +.emailCBCContainer { + margin-bottom: 1em; +} +div#usersManagementPortletContainer div#requestsAcceptanceBody > div.row > div.text-core { + position : static; + height: 100% !important; +} +div#requestsAcceptanceBody .recipients label + .text-core, +.emailCBCContainer .text-core { + min-height: 45px !important; + overflow-y: scroll; +} +div#usersManagementPortletContainer div#requestsAcceptanceBody > div.row:not(last-of-type) { + margin-bottom: 1em; +} +div#usersManagementPortletContainer textarea#tagsForEmails, +#CCAdminsEmails, #BCCAdminsEmails { + display : none; +} +div#usersManagementPortletContainer div#requestsAcceptanceBody label { + display : inline-block; +} +div#usersManagementPortletContainer div#requestsAcceptanceBody div.row { + margin-left : 0px; +} +div#usersManagementPortletContainer div#requestsAcceptanceToolbar { + display:block; + padding: 10px; +} +div#usersManagementPortletContainer div#emailForAcceptance, + div#usersManagementPortletContainer div#emailForRejection { + background-color : rgb(234, 234, 234); + background : rgb(234, 234, 234); + padding : 10px; + border-radius : 7px; + color : black; +} +div#usersManagementPortletContainer a#reloadUsersRequestsTable.btn.hide{ + display:none; +} +div#usersManagementPortletContainer div.modal-backdrop.fade.in.hideFirstModal { + z-index: 1051; +} +div#usersManagementPortletContainer div#acceptUsersRequestsModal { + z-index: 1052; +} +div#usersManagementPortletContainer #editEmailTemplate { + float:right; + color: #0271be; + border-radius: 25%; + background-color: #fff; + background: #fff; + border: none; + width: 40px; + height: 30px; +} +div#usersManagementPortletContainer label#labelRejectionEmail { + display:inline-block; +} +div#usersManagementPortletContainer input#sendAutomaticRejectionEmail { + margin:0px !important; +} +div#usersManagementPortletContainer span#theMiniHeader { + left: 15px; + top: 1.9em; + display: inline-block; + position: absolute; + color : #555; +} +div#usersManagementPortletContainer p#deleteTheRoles { + margin : 0 0 5px; +} +div#usersManagementPortletContainer button#closeUSerDetailsModal, +div#usersManagementPortletContainer #openEditModal, +div#usersManagementPortletContainer span#userName, +div#usersManagementPortletContainer span#detailsFor, +div#usersManagementPortletContainer span#username, div#userDetailsModal > div.modal-body > div.row-fluid > label { + color: #0271be; +} +div#usersManagementPortletContainer span#userName { + color : #4cb5d2; +} +div#usersManagementPortletContainer span#detailsFor{ + font-size : 17.5px; + color : #0271be; +} +div#usersManagementPortletContainer span#userName { + display:none; +} +div#usersManagementPortletContainer div#usersRequestsModal .modal-body { + /* overflow-y : visible; */ + overflow-x : visible; +} +div#usersManagementPortletContainer div.modal.fade.in .close:hover, + div#usersManagementPortletContainer div.modal.fade.in .btn-link:hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.modal.fade.in .btn-link:hover {/* color: #0271be !important; */} +div#usersManagementPortletContainer span#detailsFor, + div#usersManagementPortletContainerSiteTeamsEditMode span#teamPrefixHeader { + /* margin-bottom : 8px; */ +} +div#usersManagementPortletContainer div#deleteUsersFromCurrentSiteModal span#deleteCurrentSiteUsersHeader, +div#usersManagementPortletContainer div#changeUsersRolesModalHeaderDiv span#theHeader, +div#usersManagementPortletContainer div#InternalServerErrorModal div#blueLineBottom { + font-size : 18px; +} +div#usersManagementPortletContainer div#changeUsersRolesModalHeaderDiv { + border-bottom: 2px solid #0271be; + padding-bottom: 0.2em; +} +div#usersManagementPortletContainer div#InternalServerErrorModal div#blueLineBottom { + font-size : 18px; + padding-bottom : 7px; + color: #0271be; +} +div#usersManagementPortletContainer div#InternalServerErrorModal #closeInternalServerModal { + color : #4cb5d2; +} +#usersManagementPortletContainerSiteTeamsEditMode div#editGroupTeamModal div#groupTeamAttributes div.row-fluid { + margin-bottom: 10px; +} +div#usersManagementPortletContainer textarea#teamsList, +div#usersManagementPortletContainer textarea#teamsListInAssignUsersToGroupsModal { + display : none; +} +#usersManagementPortletContainerSiteTeamsEditMode span#teamPrefixHeader, + #usersManagementPortletContainerSiteTeamsEditMode span#teamNameHeader, + #usersManagementPortletContainerSiteTeamsEditMode span#acceptRequestHeader, + #usersManagementPortletContainerSiteTeamsEditMode span#acceptRequestHeader { + color: #0271be; + font-size : 18px; +} +#usersManagementPortletContainerSiteTeamsEditMode .modal-footer, + #usersManagementPortletContainerSiteTeamsEditMode .modal-header { + border-top : none; + border-bottom : none; +} +#usersManagementPortletContainerSiteTeamsEditMode .modal.fade button { + color: #d1d1d1; +} +#usersManagementPortletContainerSiteTeamsEditMode .modal.fade button:hover { + color: #0271be; +} +#usersManagementPortletContainerSiteTeamsEditMode .modal.fade button.close { + opacity : 1; +} +#usersManagementPortletContainer #acceptRequestHeader { + font-size: 18px; +} +div#displayGroupTeamUsersModal { + width: 700px; + left: 45%; +} +div#displayGroupTeamUsersModal .modal-body{ + padding-top: 0px; +} +div.modalHeaderContainer { + display: inline-block; +} +div.modalSubHeader { + /* display: inline-block; */ + color: #777; + font-size: 0.9em; +} +#usersRequestsModal .modal-header { + padding-bottom: 0px; +} +#clickToGoBack { + color: #0271be; +} +#addGroupTeamAttributes input, +#addGroupTeamAttributes textarea, +#groupTeamAttributes input, +#groupTeamAttributes textarea { + border-radius: 0.2em; + border: 1px solid #d1d1d1; +} +.modal-footer { + background: #fff !important; + background-color: #fff !important;; +} +.modal-footer button { + color: #0271be !important; + border-radius: 5px !important; +} +.modal-footer button:hover { + background: #eeeeee !important; + background-color:#eeeeee !important; +} +.text-arrow .caretContainer { + position: absolute; + top: 47%; + left: 32%; +} +span.caretContainer > i.caret { + padding: 0 !important; + border-top-color: #0271be; +} +div.emailSubject { + background-color: rgb(234, 234, 234); + background: rgb(234, 234, 234); + border-radius: 7px +} +div.emailSubjectContainer{ + margin-bottom: 1em; +} +div.emailSubject { + padding:7px; + color: black; +} +/* html { + overflow:hidden; +} */ +.grantDenyClass, .denyClass { + display:inline; +} \ No newline at end of file diff --git a/src/main/webapp/css/navbar.css b/src/main/webapp/css/navbar.css new file mode 100644 index 0000000..67f4287 --- /dev/null +++ b/src/main/webapp/css/navbar.css @@ -0,0 +1,142 @@ +div#usersManagementPortletContainer ul#myTab { + background: #1273c7; + background-color: #1273c7; + border-radius : 7px; +} +div#usersManagementPortletContainer ul#myTab li a{ + color : white; +} +div#usersManagementPortletContainer ul#myTab li a:hover{ + color : #1273c7; + background: white; + background-color: white; +} +div#usersManagementPortletContainer ul#myTab li.active a{ + color : white; + background: rgb(42, 170, 230); + background-color: rgb(42, 170, 230); +} +div#usersManagementPortletContainer ul#myTab li.active a{ + color : white; + background: rgb(42, 170, 230); + background-color: rgb(42, 170, 230); +} +div#usersManagementPortletContainer ul#myTab li.active { +} +div#usersManagementPortletContainer div.searchDiv, + div#usersManagementPortletContainerSiteTeamsEditMode div.searchDiv { + background: #0271be; + background-color: #0271be; + cursor:pointer; + padding: 7px 10px 3px 10px; + border-radius:50%; + color: white; + display:inline-block; + float:right; + height: 25px; +} +div#usersManagementPortletContainer #CurrentUsersTable_filter label, +div#usersManagementPortletContainer #usersRequestsTable_filter label, + div#usersManagementPortletContainerSiteTeamsEditMode #GroupTeamsTable_filter label { + display : inline-block; +} +div#usersManagementPortletContainer div.dataTables_filter label > input, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_filter label > input { + margin-bottom: 0px !important; +} +div#usersManagementPortletContainer .hideMe input, + div#usersManagementPortletContainerSiteTeamsEditMode .hideMe input, + .hideMe input { + display:none; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#GroupTeamsTableUsers_filter > label { + display: inline; +} +div#usersManagementPortletContainer ul#myTab { + background: #1273c7; + background-color: #1273c7; + border-radius : 7px; +} +div#usersManagementPortletContainer ul#myTab li a{ + color : white; +} +div#usersManagementPortletContainer ul#myTab li a:hover{ + color : #1273c7; + background: white; + background-color: white; +} +div#usersManagementPortletContainer ul#myTab li.active a{ + color : white; + background: rgb(42, 170, 230); + background-color: rgb(42, 170, 230); +} +div#usersManagementPortletContainer ul#myTab li.active a{ + color : white; + background: rgb(42, 170, 230); + background-color: rgb(42, 170, 230); +} +div#usersManagementPortletContainer ul#myTab li.active { +} +div#usersManagementPortletContainer div.searchDiv, + div#usersManagementPortletContainerSiteTeamsEditMode div.searchDiv, + div.searchDiv { + background: #0271be; + background-color: #0271be; + cursor:pointer; + padding: 5px 10px 3px 10px; + border-radius:50%; + color: white; + display:inline-block; + float:right; + height: 25px; + position: absolute; + right: 0; +} +div#usersManagementPortletContainer div.searchDiv:not(.active):hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.searchDiv:not(.active):hover { + background: #009AE5; + background-color: #009AE5; + } +div#usersManagementPortletContainer div.searchDiv.active, + div#usersManagementPortletContainerSiteTeamsEditMode div.searchDiv.active, + div.searchDiv.active { + background: #019ad3; + background-color: #019ad3; + } +div#usersManagementPortletContainer #CurrentUsersTable_filter label, +div#usersManagementPortletContainer #usersRequestsTable_filter label, + div#usersManagementPortletContainerSiteTeamsEditMode #GroupTeamsTable_filter label, + div#rejectedUsersRequestsManagementTab #rejectedUsersRequestsTable_filter label { + display : inline-block; + /* position: relative; */ +} +div#usersManagementPortletContainer div.dataTables_filter label > input, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_filter label > input, + #rejectedUsersRequestsTable_filter label > input { + margin-bottom: 0px !important; + margin-right: 21px; +} + +div#usersManagementPortletContainer .hideMe input, + div#usersManagementPortletContainerSiteTeamsEditMode .hideMe input, + #rejectedUsersRequestsManagementTab .hideMe input { + display:none; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#GroupTeamsTableUsers_filter > label { + display: inline; +} + +#CurrentUsersTable_filter input, #usersRequestsTable_filter input, #GroupTeamsTable_filter input, #GroupTeamsTableUsers_filter input, +#rejectedUsersRequestsTable_filter input { + border-radius: 1em 0 0 1em; +} + +#CurrentUsersTable_filter input:focus, + #usersRequestsTable_filter input:focus, + #GroupTeamsTable_filter input:focus, + #GroupTeamsTableUsers_filter input:focus { + webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(127, 127, 127, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(127, 127, 127, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(127, 127, 127, 0.6); + border-color: rgba(2, 113, 190, 0.5); +} \ No newline at end of file diff --git a/src/main/webapp/css/pagination.css b/src/main/webapp/css/pagination.css new file mode 100644 index 0000000..697e8e4 --- /dev/null +++ b/src/main/webapp/css/pagination.css @@ -0,0 +1,167 @@ +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_previous, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_previous, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_previous, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_previous, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_previous, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_previous, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTables_previous { + background: #0271be; + background-color: #0271be; + color: white; + border:0px; + /* border-top-left-radius: 7px; */ + /* border-bottom-left-radius: 7px; */ +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_previous:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_previous:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_previous:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_previous:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_previous:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_previous:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTables_previous:after{ + content: "\f04a "; +} +div.dataTables_paginate.paging_full_numbers{ + font-family: FontAwesome; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_previous:not(.disabled):hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_previous:not(.disabled):hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_previous:not(.disabled):hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTables_previous:not(.disabled):hover { + color: white; + border:0px; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_next, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_next, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_next, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_next, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_next, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_next, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTable_next { + background: #0271be; + background-color: #0271be; + color: white !important; + border:0px; + /* border-top-right-radius: 7px; */ + /* border-bottom-right-radius: 7px; */ +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_next:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_next:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_next:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_next:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_next:after, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_next:after, + div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTables_next:after { + content: "\f04e"; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button#CurrentUsersTable_next:not(.disabled):hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTable_next:not(.disabled):hover, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button#GroupTeamsTableUsers_next:not(.disabled):hover, + div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTable_next:not(.disabled):hover { + background: rgb(42, 170, 210); + background-color: rgb(42, 170, 210); + color: white !important; + border:0px; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers span a.paginate_button.current, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers span a.paginate_button.current, + div.dataTables_paginate.paging_full_numbers span a.paginate_button.current { + background: rgb(41, 131, 173); + background-color: rgb(41, 131, 173); + color: white !important; + border:0px; + cursor : default; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button, + div.dataTables_paginate.paging_full_numbers a.paginate_button { + color: white !important; + background: #0271be; + background-color: #0271be; + border:0px !important; + padding: 2px 15px; + margin-top: 6px; + font-size: 0.9em; +} +div.dataTables_paginate.paging_full_numbers a.first { + border-top-left-radius: 7px; + border-bottom-left-radius: 7px; +} +div.dataTables_paginate.paging_full_numbers a.first:after { + content: "\f049"; +} +div.dataTables_paginate.paging_full_numbers a.previous { + /* border-top-left-radius: 7px; */ + /* border-bottom-left-radius: 7px; */ +} +div.dataTables_paginate.paging_full_numbers a.previous:after { + content: "\f04a"; +} +div.dataTables_paginate.paging_full_numbers a.next { + /* border-top-right-radius: 7px; */ + /* border-bottom-right-radius: 7px; */ +} +.paging_full_numbers a.next:after { + content: "\f04e"; +} +div.dataTables_paginate.paging_full_numbers a.last { + border-top-right-radius: 7px; + border-bottom-right-radius: 7px; +} +.paging_full_numbers a.last:after { + content: "\f050"; +} +div.dataTables_paginate.paging_full_numbers a.paginate_button:not(.disabled):hover{ + border:0px; + color: white; + background: #4CB5D2 !important; + background-color: #4CB5D2 !important; +} +div.dataTables_paginate.paging_full_numbers a.paginate_button:not(.disabled):not(.current):active{ + border:0px; + color: white; + background: #019ad3 !important; + background-color: #019ad3 !important; +} +div.dataTables_paginate.paging_full_numbers a.paginate_button.current:hover { + border:0px !important; + color: white !important; + background: rgb(41, 131, 173); + background-color: rgb(41, 131, 173) ; +} +div#usersManagementPortletContainer .btn-default.moreInfo, + div#usersManagementPortletContainerSiteTeamsEditMode .btn-default.moreInfo, + .btn-default.moreInfo { + border : none; + background: rgb(1, 95, 126); + background-color: rgb(1, 95, 126); + color : white; +} +div#usersManagementPortletContainer .btn-default.moreInfo:hover, + div#usersManagementPortletContainerSiteTeamsEditMode .btn-default.moreInfo:hover, + .btn-default.moreInfo:hover { + border : none; + background: #327A8A; + background-color: #327A8A; + color : white; +} +div.dataTables_paginate.paging_full_numbers a.paginate_button#usersRequestsTable_previous, + div.dataTables_paginate.paging_full_numbers a.paginate_button#usersRequestsTable_previous, + div.dataTables_paginate.paging_full_numbers a.paginate_button#rejectedUsersRequestsTable_previous { + background: #0271be; + background-color: #0271be; + /* color: white !important; */ + border:0px; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button.disabled, +div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button.disabled, +div.dataTables_paginate.paging_full_numbers a.paginate_button.disabled { + background:#e0e0e0 !important; + background-color:#e0e0e0 !important; +} +div#usersManagementPortletContainer div.dataTables_paginate.paging_full_numbers a.paginate_button.current, +div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_paginate.paging_full_numbers a.paginate_button.current, +div.dataTables_paginate.paging_full_numbers a.paginate_button.current { + background: #019AD3; + background-color: #019AD3; +} \ No newline at end of file diff --git a/src/main/webapp/css/preloader.css b/src/main/webapp/css/preloader.css new file mode 100644 index 0000000..3e71422 --- /dev/null +++ b/src/main/webapp/css/preloader.css @@ -0,0 +1,23 @@ +div#blanket.shown *{ + background-color : #fff !important; + background : #fff !important; + color : #fff !important; + pointer-events: none; + cursor: default; +} +div#blanket.shown .dataTables_info, + div#blanket.shown div.dataTables_length select, + div#blanket.shown ul.nav.nav-tabs > li > a, + div#blanket.shown div.dataTables_paginate.paging_simple_numbers { + display : none; +} +div#blanket p#preloader.hiddenPreloader, + div#blanket p#preloader.hiddenPreloader { + display : none; +} +div#blanket.shown p#preloader, div#blanket.shown p#preloader { + position: fixed; + z-index: 1052; + top: 30%; + left: 45%; +} diff --git a/src/main/webapp/css/responsive.bootstrap.css b/src/main/webapp/css/responsive.bootstrap.css new file mode 100644 index 0000000..109f062 --- /dev/null +++ b/src/main/webapp/css/responsive.bootstrap.css @@ -0,0 +1,106 @@ +table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child, +table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child { + position: relative; + padding-left: 30px; + cursor: pointer; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child:before { + top: 8px; + left: 4px; + height: 16px; + width: 16px; + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; + content: '+'; + background-color: #337ab7; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child.dataTables_empty:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child.dataTables_empty:before { + display: none; +} +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child:before, +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child:before { + content: '-'; + background-color: #d33333; +} +table.dataTable.dtr-inline.collapsed > tbody > tr.child td:before { + display: none; +} +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child, +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child { + padding-left: 27px; +} +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child:before, +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child:before { + top: 5px; + left: 4px; + height: 14px; + width: 14px; + border-radius: 14px; + line-height: 12px; +} +table.dataTable.dtr-column > tbody > tr > td.control, +table.dataTable.dtr-column > tbody > tr > th.control { + position: relative; + cursor: pointer; +} +table.dataTable.dtr-column > tbody > tr > td.control:before, +table.dataTable.dtr-column > tbody > tr > th.control:before { + top: 50%; + left: 50%; + height: 16px; + width: 16px; + margin-top: -10px; + margin-left: -10px; + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; + content: '+'; + background-color: #337ab7; +} +table.dataTable.dtr-column > tbody > tr.parent td.control:before, +table.dataTable.dtr-column > tbody > tr.parent th.control:before { + content: '-'; + background-color: #d33333; +} +table.dataTable > tbody > tr.child { + padding: 0.5em 1em; +} +table.dataTable > tbody > tr.child:hover { + background: transparent !important; +} +table.dataTable > tbody > tr.child ul { + display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; +} +table.dataTable > tbody > tr.child ul li { + border-bottom: 1px solid #efefef; + padding: 0.5em 0; +} +table.dataTable > tbody > tr.child ul li:first-child { + padding-top: 0; +} +table.dataTable > tbody > tr.child ul li:last-child { + border-bottom: none; +} +table.dataTable > tbody > tr.child span.dtr-title { + display: inline-block; + min-width: 75px; + font-weight: bold; +} diff --git a/src/main/webapp/css/selectAllCheckboxes.css b/src/main/webapp/css/selectAllCheckboxes.css new file mode 100644 index 0000000..2330427 --- /dev/null +++ b/src/main/webapp/css/selectAllCheckboxes.css @@ -0,0 +1,68 @@ +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type, + div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type { + position:relative; + } + div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type div { + position: absolute; + bottom: 2px; + left: 7px; + background: #eeeeee; + background-color: #eeeeee; + width: 21px; + height: 24px; + padding: 3px 0px 0px 6px; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type { + text-align: center; + cursor: auto; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type div { + position: absolute; + bottom: 2px; + left: 7px; + background: #eeeeee; + background-color: #eeeeee; + width: 24px; + height: 27px; + padding-left: 3px; +} +div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type{ + padding-left: 2px; +} +div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type div { + position: absolute; + bottom: 4px; + left: 7px; + background: #eeeeee; + background-color: #eeeeee; + width: 20px; + height: 23px; + padding: 2px 0px 0px 5px; +} +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type.none div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type.none div, + div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type.none div { + background-color: rgb(42, 170, 230); + background: rgb(42, 170, 230); +} +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type:not(.none):hover div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type:not(.none):hover div, + div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type:not(.none):hover div { + background-color: rgb(42, 170, 210); + background: rgb(42, 170, 210); + } + div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type:not(.none):hover div i, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type:not(.none):hover div i, + div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type:not(.none):hover div i { + color: rgb(42, 170, 210); + } +div#usersManagementPortletContainer th i.icon-ok, + div#usersManagementPortletContainerSiteTeamsEditMode th i.icon-ok { + color: #eeeeee; + font-size: 1em; +} +div#usersManagementPortletContainer th i.icon-ok.whiteFont, + div#usersManagementPortletContainerSiteTeamsEditMode th i.icon-ok.whiteFont { + color: #fff; +} \ No newline at end of file diff --git a/src/main/webapp/css/table.css b/src/main/webapp/css/table.css new file mode 100644 index 0000000..c7c434d --- /dev/null +++ b/src/main/webapp/css/table.css @@ -0,0 +1,581 @@ +div#usersManagementPortletContainer, div#usersManagementPortletContainerSiteTeamsEditMode { + background-color : #fff; + background : #fff; + /* padding: 2px; */ +} +div#usersManagementPortletContainer i.icon-search, + div#usersManagementPortletContainerSiteTeamsEditMode i.icon-search, + i.icon-search { + -ms-transform: scale(1.2,1.4) !important; /* IE 9 */ + -webkit-transform: scale(1.2,1.4) !important; /* Safari */ + transform: sscale(1.2,1.4) !important; + display :inline-block !important; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody, + table#rejectedUsersRequestsTable tbody { + background-color : rgba(234, 236, 240, 1); + background: rgba(234, 236, 240, 1); +} +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr , + table#rejectedUsersRequestsTable thead > tr{ + border-bottom-color : white; +} +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr, + table#rejectedUsersRequestsTable thead > tr { + border: none; +} +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers thead > tr th, + table#rejectedUsersRequestsTable thead > tr th{ + border: none; + font-weight: bold; + padding-bottom: 0px; + padding-left: 4px; + text-transform: capitalize; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers thead > tr th:after + table#rejectedUsersRequestsTable thead > tr th:after,{ + font-weight: normal; +} +div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type, + table#rejectedUsersRequestsTable thead > tr th:first-of-type { + width: 14px !important; +} +@-moz-document url-prefix() { + div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type { + width:15px !important; + } +} +@-moz-document url-prefix() { + div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type div { + left: 7px !important;; + } +} +/* @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + div#usersManagementPortletContainer table#CurrentUsersTable thead > tr th:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead > tr th:first-of-type { + width:17px !important; + } + div#usersManagementPortletContainer table#usersRequestsTable thead > tr th:first-of-type div { + left: 7px !important;; + } +} */ +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr:last-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr:last-of-type, + table#rejectedUsersRequestsTable tbody tr:last-of-type { + border: none; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody, + table#rejectedUsersRequestsTable tbody { + border: none; +} +div#usersManagementPortletContainer table#CurrentUsersTable, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable, + table#rejectedUsersRequestsTable { + border: none; +} +div#usersManagementPortletContainer table#CurrentUsersTable tr td:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tr td:first-of-type, + table#tr:not(.selected):hover td div tr td:first-of-type { + :white; +} +.dataTable:not(#GroupTeamsTableUsers) tr td { + cursor: pointer; +} +div#usersManagementPortletContainer table#CurrentUsersTable tr.selected td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tr.selected td div, + table#tr:not(.selected):hover td div tr.selected td div { + background-color : rgb(42, 170, 230); + background : rgb(42, 170, 230); + color : #fff; +} +div#usersManagementPortletContainer table#CurrentUsersTable tr:not(.selected):hover td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tr:not(.selected):hover td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers tr:not(.selected):hover td div, + table#rejectedUsersRequestsTable tr:not(.selected):hover td div { + background: #4cb5d2; + background-color: #4cb5d2; + color: white; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers tr:not(.selected):hover td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers tr td div { + /* padding-left : 15px !important; */ +} +div#usersManagementPortletContainer table#CurrentUsersTable tr td:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tr td:first-of-type, + table#rejectedUsersRequestsTable tr td:first-of-type { + padding-top: 1px; +} +div#usersManagementPortletContainer table#CurrentUsersTable tr:hover td div i.icon-ok, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tr:hover td div i.icon-ok, + #rejectedUsersRequestsTable tr:hover td div i.icon-ok { + color: #4cb5d2; +} +div#usersManagementPortletContainer table#CurrentUsersTable tr td div i.icon-ok.whiteFont, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tr td div i.icon-ok.whiteFont, + table#rejectedUsersRequestsTable tr td div i.icon-ok.whiteFont { + color: white; + font-size: 1em; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr, + table#rejectedUsersRequestsTable tbody tr { + background:#fff; + padding: 0px; + background-color:#fff; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr td div, + table#rejectedUsersRequestsTable tbody tr td div { + background: #eeeeee; + background-color: #eeeeee; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr td div i, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr td div i { + color: #eeeeee; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr td, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr td, + table#rejectedUsersRequestsTable tbody tr td { + padding: 0px 2px 0px 2px; + text-align: center; + line-height: 1em; +} +div#usersManagementPortletContainer table#CurrentUsersTable thead th, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable thead th, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers thead th, + table#rejectedUsersRequestsTable thead th { + text-align: left; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers tbody tr div, + div#usersManagementPortletContainer table#usersRequestsTable tbody tr div, + table#rejectedUsersRequestsTable tbody tr div { + background: #eeeeee; + background-color: #eeeeee; + padding: 2px 0px 0px 10px; + text-align: left; + height: 1.5em; + line-height : 1.5em; + overflow : hidden; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + width:inherit; + height: 23px; +} +div#usersManagementPortletContainer table#usersRequestsTable tbody tr div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tbody tr div, + table#rejectedUsersRequestsTable tbody tr div { + background:white; + background-color:white; + padding:2px; + text-align: left; + height: 1.5em; + line-height : 1.5em; + overflow : hidden; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + width:inherit; +} +div#usersManagementPortletContainer table#CurrentUsersTable tbody tr td:first-of-type div, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable tbody tr td:first-of-type div, + table#rejectedUsersRequestsTable tbody tr td:first-of-type div { + display:inline-block; + width: 1.5em; + text-align: center; + padding: 2px 3px 2px 3px; +} +div#usersManagementPortletContainer div.dataTables_info, div.dataTables_length label, table#CurrentUsersTable > thead > tr > th, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_info, div.dataTables_length label, table#GroupTeamsTable > thead > tr > th, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_info, table#GroupTeamsTableUsers > thead > tr > th, + table#rejectedUsersRequestsTable > thead > tr> th { + color : #0271be; !important + font-weight: normal !important; + padding-left: 3px; + margin-bottom: 0px; +} +div.dataTables_length label { + font-size: 0.9em; + + +} +#GroupTeamsTableUsers_length label { + padding-top: 6px; +} +div#usersManagementPortletContainer table#CurrentUsersTable > tbody > tr > td.dataTables_empty, +div#usersManagementPortletContainer table#usersRequestsTable > tbody > tr > td.dataTables_empty, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable > tbody > tr > td.dataTables_empty, +div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable > tbody > tr > td.dataTables_empty, +table#GroupTeamsTableUsers td.dataTables_empty, +table#rejectedUsersRequestsTable td.dataTables_empty { + background: #d1d1d1; + background-color: #d1d1d1; + color: #f2f2f2; +} +td.dataTables_empty:hover { + cursor: default !important; +} +/* div#usersManagementPortletContainer div.dataTables_info, div.dataTables_filter, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_info, div.dataTables_filter { + margin-bottom: 10px; +} */ +div#usersManagementPortletContainer div.dataTables_filter, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_filter, + #rejectedUsersRequestsManagementTab div.dataTables_filter { + margin-top: 1.1em; + margin-bottom: 1em; + width: 250px; + height: 30px; + position: relative; +} +div#usersManagementPortletContainer div.dataTables_info, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_info, + #rejectedUsersRequestsTableContainer div.dataTables_info{ + padding-left: 10px; + font-size: 0.9em; + padding-top: 7px; + color: #0271be; +} +div#displayGroupTeamUsersModal div.dataTables_info { + padding-left : 0px; +} +div#usersManagementPortletContainer div.dataTables_length, +div#usersManagementPortletContainer div.dataTables_paginate.paging_simple_numbers, + div#usersManagementPortletContainerSiteTeamsEditMode #GroupTeamsTable_wrapper div.dataTables_length, +div#usersManagementPortletContainerSiteTeamsEditMode #GroupTeamsTable_wrapper div.dataTables_paginate.paging_simple_numbers, +#rejectedUsersRequestsTable_wrapper div.dataTables_length, +#rejectedUsersRequestsTable_wrapper div.dataTables_length.paging_simple_numbers { + margin-top: 6px; +} +.dataTables_length label:hover { + cursor: default; +} +div#usersManagementPortletContainer div.dataTables_length label > select, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_length label > select, + #rejectedUsersRequestsTableContainer div.dataTables_length label > select { + width : 65px !important; + margin-bottom: 0px; + height: 25px; +} +@media (min-width: 768px) and (max-width: 979px) { + div#usersManagementPortletContainer div.dataTables_length label > select, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_length label > select { + font-size: 1.1em; + } +} + +div#usersManagementPortletContainer div.dataTables_length label > select:focus, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_length label > select:focus { + + outline: none; +} +div#usersManagementPortletContainer table#usersRequestsTable thead > tr th, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable thead > tr th { + border: none; +} +div#usersManagementPortletContainer table#usersRequestsTable tbody, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tbody { + border: none; +} +div#usersManagementPortletContainer table#usersRequestsTable, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable, + table#rejectedUsersRequestsTable { + border: none; +} +div#usersManagementPortletContainer table#usersRequestsTable tbody tr:last-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tbody tr:last-of-type, + table#rejectedUsersRequestsTable tbody tr:last-of-type { + border: none; +} +div#usersManagementPortletContainer table#usersRequestsTable thead > tr, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable thead > tr { + border-bottom-color : white; +} +div#usersManagementPortletContainer table#usersRequestsTable thead > tr, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable thead > tr, + table#rejectedUsersRequestsTable thead > tr { + border: none; +} +div#usersManagementPortletContainer table#usersRequestsTable, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable { + text-align: center; +} +div#usersManagementPortletContainer table#usersRequestsTable i.icon-ok, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable i.icon-ok, + table#rejectedUsersRequestsTable i.icon-ok { + /* color : rgb(234, 234, 234); */ + color : #eeeeee; + font-size: 1em; +} +div#usersManagementPortletContainer table#usersRequestsTable tr:hover td div i.icon-ok.whiteFont, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr:hover td div i.icon-ok.whiteFont, + table#rejectedUsersRequestsTable tr:hover td div i.icon-ok.whiteFont { + color: white; +} +div#usersManagementPortletContainer table#usersRequestsTable tr td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr td div, + table#rejectedUsersRequestsTable tr td div { + /* background-color : #e7e7e7; + background : #e7e7e7; */ + background-color : #eeeeee; + background : #eeeeee; +} +div#usersManagementPortletContainer table#usersRequestsTable tbody tr td, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tbody tr td, + table#rejectedUsersRequestsTable tbody tr td { + padding: 0px 2px 0px 2px; + line-height: 1.09em; +} +div#usersManagementPortletContainer table#usersRequestsTable tbody tr td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tbody tr td div, + table#rejectedUsersRequestsTable tbody tr td div { + padding: 2px 0px 0px 10px; +} +div#usersManagementPortletContainer table#usersRequestsTable tr td:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr td:first-of-type, + table#rejectedUsersRequestsTable tr td:first-of-type { + cursor:pointer; + color:white !important; +} +div#usersManagementPortletContainer table#usersRequestsTable tr.selected, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr.selected, + table#rejectedUsersRequestsTable tr.selected { + background-color : white; + background : white; +} +div#usersManagementPortletContainer table#usersRequestsTable tr.selected td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr.selected td div, + table#rejectedUsersRequestsTable tr.selected td div { + background-color : rgb(42, 170, 230); + background : rgb(42, 170, 230); + /* padding: 2px; */ + color : #fff; +} +div#usersManagementPortletContainer table#usersRequestsTable th, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable th, + table#rejectedUsersRequestsTable th { + text-align : left; +} +div#usersManagementPortletContainer table#usersRequestsTable tr.selected td:first-of-type div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr.selected td:first-of-type div, + table#rejectedUsersRequestsTable tr.selected td:first-of-type div { + text-align: center; +} +div#usersManagementPortletContainer table#usersRequestsTable tr:not(.selected):hover td div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr:not(.selected):hover td div, + table#rejectedUsersRequestsTable tr:not(.selected):hover td div { + background: rgb(42, 170, 210); + background-color: rgb(42, 170, 210); + color: white; +} +div#usersManagementPortletContainer table#usersRequestsTable tr td:first-of-type div, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr td:first-of-type div, + table#rejectedUsersRequestsTable tr td:first-of-type div { + width: 1.5em; + display : inline-block; + padding: 2px; +} +div#usersManagementPortletContainer table#usersRequestsTable tr td:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr td:first-of-type, + table#rejectedUsersRequestsTable tr td:first-of-type { + text-align: center; + /* padding-top : 4px; */ +} +div#usersManagementPortletContainer table#usersRequestsTable thead th:first-of-type, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable thead th:first-of-type, + table#rejectedUsersRequestsTable thead th:first-of-type { + width : 15px !important; +} +div#usersManagementPortletContainer table#usersRequestsTable tr:hover td div i.icon-ok, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr:hover td div i.icon-ok, + table#rejectedUsersRequestsTable tr:hover td div i.icon-ok { + color: rgb(42, 170, 210); +} +div#usersManagementPortletContainer table#usersRequestsTable tr:hover, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr:hover, + table#rejectedUsersRequestsTable tr:hover { + background-color : white; + background : white; +} +div#usersManagementPortletContainer table#usersRequestsTable tr td:not(:first-of-type), + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable tr td:not(:first-of-type), + table#rejectedUsersRequestsTable tr td:not(:first-of-type) { + color : black; +} +div#usersManagementPortletContainer table#usersRequestsTable > thead > tr > th, + div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable > thead > tr > th, + table#rejectedUsersRequestsTable > thead > tr > th { + font-weight: bold; + color: #0271be; + padding-bottom: 0px; + padding-left: 4px; + text-transform: capitalize; +} +div#usersManagementPortletContainer table#usersRequestsTable > thead > tr > th:after, +table#rejectedUsersRequestsTable > thead > tr > th:after { + font-weight: normal !important; +} +div#usersManagementPortletContainer table#usersRequestsTable > thead > tr > th:hover:after, + table#GroupTeamsTableUsers > thead > tr > th:hover:after, + table#rejectedUsersRequestsTable > thead > tr > th:hover:after { + color: #009AE5; +} +div#usersManagementPortletContainer table#usersRequestsTable > thead > tr > th:active:after, + table#GroupTeamsTableUsers > thead > tr > th:active:after, + table#GroupTeamsTable > thead > tr > th:active:after, + table#rejectedUsersRequestsTable > thead > tr > th:active:after { + color: #019ad3; +} +div#usersManagementPortletContainer div.dataTables_filter label, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_filter label, + table#rejectedUsersRequestsTable div.dataTables_filter label { + color : #0271be !important +} +div#usersManagementPortletContainer a#currentUsersTableRefresh, + div#usersManagementPortletContainerSiteTeamsEditMode a#currentUsersTableRefresh { + font-size: 14px; + background-color: #7EAB10; + background: #7EAB10; + color: white; + display: inline; + border-radius: 50%; + padding: 6px 9px; + margin-left: 8px; + cursor: pointer; + +} +div#usersManagementPortletContainer div#auxilliaryDiv, + div#usersManagementPortletContainerSiteTeamsEditMode div#auxilliaryDiv { + padding: 0px 15px; +} +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body, + div#usersManagementPortletContainerSiteTeamsEditMode div#changeUsersRolesModal div.modal-body, + div#assignUsersRolesModal div#changeUsersRolesModal div.modal-body, + div#usersManagementPortletContainer div#assignUsersToGroupsModal div.modal-body { + display:inline; +} +div#usersManagementPortletContainer div#assignUsersRolesModal div.modal-body, +div#usersManagementPortletContainer div#assignUsersToGroupsModal div.modal-body { + overflow-y: visible; +} +div#usersManagementPortletContainer div#assignUsersRolesModal div.modal-body{ + padding-top: 0px; +} +div#usersManagementPortletContainer div#assignUsersToGroupsModal div.modal-body, +div#usersManagementPortletContainer div#changeUsersRolesModal div.modal-body { + padding: 0px; +} +div#usersManagementPortletContainer div.text-dropdown.text-position-below, + div#usersManagementPortletContainerSiteTeamsEditMode div.text-dropdown.text-position-below { + top:initial !important; +} +div#usersManagementPortletContainer span#rolesArrow, + div#usersManagementPortletContainerSiteTeamsEditMode span#rolesArrow, + span#rolesArrow { + display: inline-block; + width: 0; + height: 0; + /* background: red; */ + border-style: solid; + border-width: 15px 10px 10px 0px; + border-color: transparent #fff transparent transparent; + position: absolute; + bottom : 50%; + right: 100%; +} +div#usersManagementPortletContainer span#roles, + div#usersManagementPortletContainerSiteTeamsEditMode span#roles, + span#roles { + display : inline-block; + position: relative; + text-align: left; +} +div#usersManagementPortletContainer span#onHoverUser, + div#usersManagementPortletContainerSiteTeamsEditMode span#onHoverUser, + span#onHoverUser { + color : rgb(42, 170, 210); + padding-left : 35px; + padding-top : 10px; +} +div#usersManagementPortletContainer span#rolesContainer, + div#usersManagementPortletContainerSiteTeamsEditMode span#rolesContainer, + span#rolesContainer { + display : inline-block; + background-color : #fff; + background : #fff; + z-index : 3; + position : absolute; + bottom: 0%; + left: 100%; + border-radius : 8px; + box-shadow: 0px 9px 20px grey; + transform: translateY(50%); +} +div#usersManagementPortletContainer table#CurrentUsersTable, +div#usersManagementPortletContainer table#usersRequestsTable, + div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTable, +div#usersManagementPortletContainerSiteTeamsEditMode table#usersRequestsTable, + table#rejectedUsersRequestsTable { + table-layout: fixed; +} +div#usersManagementPortletContainer ul#rolesList, + div#usersManagementPortletContainerSiteTeamsEditMode ul#rolesList, + ul#rolesList { + list-style-type: none; + margin : 0px; + padding : 5px 20px 20px 20px; +} +div#usersManagementPortletContainer ul#rolesList li, + div#usersManagementPortletContainerSiteTeamsEditMode ul#rolesList li, + ul#rolesList li { + margin : 0px; + padding : 0px 15px; + white-space: nowrap; +} +div#usersManagementPortletContainer ul#rolesList li:hover, + div#usersManagementPortletContainerSiteTeamsEditMode ul#rolesList li:hover, + ul#rolesList li:hover { + background: #eeeeee; + background-color: #eeeeee; +} +div#usersManagementPortletContainer td.relative, + div#usersManagementPortletContainerSiteTeamsEditMode td.relative, + td.relative { + position : relative; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers, +table#rejectedUsersRequestsTable { + border-bottom : none; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers tbody td, +table#rejectedUsersRequestsTable tbody td { + padding: 3px; +} +div#usersManagementPortletContainerSiteTeamsEditMode table#GroupTeamsTableUsers tbody td.dataTables_empty, +table#rejectedUsersRequestsTable tbody td.dataTables_empty { + padding: 0px; +} +.dataTable td:focus { + outline:none !important; +} +table:not(#GroupTeamsTableUsers):not(#rejectedUsersRequestsTable) thead th:first-of-type:hover { + cursor: pointer; +} +table.dataTable { + margin-bottom: 2em; +} +div#blanket *{ + outline: none; +} \ No newline at end of file diff --git a/src/main/webapp/css/tabs.css b/src/main/webapp/css/tabs.css new file mode 100644 index 0000000..4bc92e4 --- /dev/null +++ b/src/main/webapp/css/tabs.css @@ -0,0 +1,59 @@ +ul#myTab { + margin-bottom : 0px; + border-bottom : none; + /* background-color : #eeeeee; + background : #eeeeee; */ + background-color : #fff; + background : #fff; +} +ul#myTab > li.active a.tabTitle { + background : #019ad3; + background-color : #019ad3; + color : #fff; + font-size: 1.2em; +} +ul#myTab > li.active a.lineBeneathTabTitle { + background : #019ad3; + background-color : #019ad3; + color : #fff; +} +ul#myTab > li > a.lineBeneathTabTitle { + line-height: 0.8em; + font-size:0.8em; + padding: 0px 0px 10px 12px; + border-radius: 0px; +} +ul#myTab > li > a { + border: none; + padding-bottom: 5px; + background : #0271BE; + background-color : #0271BE; + color: #fff; +} +ul#myTab > li.active:hover > a.tabTitle, +ul#myTab > li.active:hover > a.lineBeneathTabTitle { + background : #019ad3; + background-color : #019ad3; + color : #fff; + cursor: default; +} +ul#myTab > li > a.tabTitle{ + font-size: 1.2em; +} +ul#myTab > li:hover > a.tabTitle { + background: #4CB5D2; + background-color: #4CB5D2; + color : #fff; +} +ul#myTab > li:hover > a.lineBeneathTabTitle { + background: #4CB5D2; + background-color: #4CB5D2; + color : #fff; + cursor: pointer; +} +#tabsForTables { + overflow : inherit; +} +span.portlet-title-text.portlet-title-editable { + font-size: 0px;; +} \ No newline at end of file diff --git a/src/main/webapp/css/tagsinputForSearchByGroup.css b/src/main/webapp/css/tagsinputForSearchByGroup.css new file mode 100644 index 0000000..86805ba --- /dev/null +++ b/src/main/webapp/css/tagsinputForSearchByGroup.css @@ -0,0 +1,22 @@ +div.bootstrap-tagsinput span.label-info { + background: #0271be; + background-color: #0271be; +} +div.bootstrap-tagsinput span.label-info span:after{ + content: 'x'; + padding: 0 2px; + margin-left: 2px; +} +div.bootstrap-tagsinput span.label-info span:hover:after{ + background-color: #019ad3; + background: #019ad3; +} +#CurrentUsersTable_filter div.bootstrap-tagsinput input { + display:none; +} +#CurrentUsersTable_filter div.bootstrap-tagsinput { + display:inline-block; + position:absolute; + left: 5%; + top: 10%; +} \ No newline at end of file diff --git a/src/main/webapp/css/toolbar.css b/src/main/webapp/css/toolbar.css new file mode 100644 index 0000000..04a92aa --- /dev/null +++ b/src/main/webapp/css/toolbar.css @@ -0,0 +1,334 @@ +/*-----Portlet topper-----*/ +.portlet-title-text{ + /* display:none; */ +} +/*------------------------*/ +div#usersManagementPortletContainer span#numOfSelectedRowsUserReqs, + div#usersManagementPortletContainer span#numOfSelectedRows { + padding-right: 4px; +} +div#usersManagementPortletContainer #usersManagementDiv { + font-size: 15px; + color : #4cb5d2; + display : inline; + /* padding-right: 15px; */ + float: right; +} +div#usersManagementPortletContainer div#userRequestsNotifications.notificationsHidden { + font-size: 14px; + background-color : #d8d8d8; + background : #d8d8d8; + color: white; + display: inline-block; + border-radius : 50%; + height: 25px; + width: 25px; + margin-top: 4px; + text-align: center; + pointer-events: none; +} + +div#usersManagementPortletContainer div#userRequestsNotificationsTabletView.notificationsHidden { + font-size: 14px; + background-color : #d8d8d8; + background : #d8d8d8; + color: white; + display: inline-block; + border-radius : 50%; + height: 25px; + width: 25px; +/* margin-top: 4px; */ + text-align: center; + pointer-events: none; +} +div#usersManagementPortletContainer div#userRequestsNotifications:after { + /* content: 'No pending requests'; */ + color:#808080; + font-size 0.8em; +} +div#usersManagementPortletContainer div#userRequestsNotifications.notificationsShown { + font-size: 14px; + background-color : #c00000; + background : #c00000; + color: white; + display: inline-block; + border-radius : 50%; + /* padding: 6px 9px; */ + cursor : pointer; + float: right; + position: relative; + height: 25px; + width: 25px; + margin-top: 6px; + text-align: center; +} +#userRequestsNotificationsTabletView { + font-size: 14px; + background-color : #c00000; + background : #c00000; + color: white; + display: inline-block; + border-radius : 50%; + cursor : pointer; + float: left; + position: relative; + height: 25px; + width: 25px; + margin-top: 1em; + text-align: center; + border: 1px solid #ddd; + left: 7px; + z-index: 1039; +} +div#usersManagementPortletContainer div#toolbarHr,div.toolbarHr { + border-bottom: 4px solid #019ad3; + display:block !important; + padding: 0px !important; + margin: 0 !important; + height: 0 !important; +} +div#usersManagementPortletContainer div#toolbar.hiddenToolbar { + display: none; +} +div#usersManagementPortletContainer div#toolbar.shownToolbar { + background : #eeeeee; + background-color : #eeeeee; +} +div#usersManagementPortletContainer div#toolbar.shownToolbar > div#displaySelected { + cursor : default !important; + float : right; + /* margin-right: 10px; */ + color: #808080; + /* border-right:1px solid #ddd; */ +} +div#usersManagementPortletContainer div.toolbarContainer { + /* padding: 0px 0px 2px 0px; */ +} +div#usersManagementPortletContainer div#toolbar div.insideToolbar { + padding-right: 15px; + padding-left: 15px; + padding-top : 10px; + color: #0271be; + display : inline-block; + height : 2em; + cursor : pointer; +} +div#usersManagementPortletContainer div#toolbar div.insideToolbar:hover { + background: #4cb5d2; + background-color: #4cb5d2; + color : #fff; +} +div#usersManagementPortletContainer div#toolbar.shownToolbar:hover div.insideToolbar:last-of-type { + background-color : #eeeeee; + background : #eeeeee; + color : #4cb5d2; +} +div#usersManagementPortletContainer div#toolbar.hiddenToolbar div.insideToolbar { + background-color : #fff; + background : #fff; + color : #fff; +} +div#usersManagementPortletContainer div#toolbar.hiddenToolbar:hover div.insideToolbar { + background-color : #fff; + background : #fff; + color : #fff; + cursor : default; +} +div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer div { + padding-right: 15px; + padding-left: 15px; + padding-top : 10px; + color: #0271be; + display : inline-block; + height : 2em; + cursor : pointer; +} +div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer div:not(#displaySelectedUserReqs):hover { + background: #4cb5d2; + background-color: #4cb5d2; + color : white; +} +div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer.hiddenToolbar div:hover { + background: white; + background-color: white; + color : white; +} +div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer.shownToolbar > div#displaySelectedUserReqs { + cursor : default !important; + float : right; +} +/* div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer.shownToolbar:hover div:last-of-type { + background-color : #eeeeee; + background : #eeeeee; + color : rgb(13, 99, 200); +} */ +div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer { + background-color : #eeeeee; + background : #eeeeee; + margin-bottom : 10px; +} +div#usersManagementPortletContainer div#usersRequestsTableToolbarContainer.hiddenToolbar, + div#usersRequestsTableToolbarContainer.hiddenToolbar div { + background-color : white; + background : white; + color : white !important; + cursor : default !important; +} +div#usersManagementPortletContainer div#usersRequestsModal div.modal-body { + padding-top : 0px !important; +} +div#usersManagementPortletContainer div#requestsAcceptanceToolbar i, +div#usersManagementPortletContainer span:not(.grantDenyClass):not(.denyClass) { + display : inline-block; +} +#elementBubbletittle{ + display:inline-block; +} +div#usersManagementPortletContainer div#requestsAcceptanceToolbar { + background : rgb(234, 234, 234); + background-color : rgb(234, 234, 234); + display : block; +} +div#usersManagementPortletContainer div#requestsAcceptanceToolbar i{ + transform : scale(1.5,1.5); + -webkit-transform : scale(1.5,1.5); +} +div#usersManagementPortletContainer span#toolbarText { + margin-left: 10px; +} +div#usersManagementPortletContainer #currentUsersTableRefresh, +div#usersManagementPortletContainer #reloadUsersRequestsTable { + border : none; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer.hiddenToolbar > div:not(#addSiteTeam) { + background: #fff; + background-color: #fff; + color: #fff; + cursor : default; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer { + background: #eeeeee; + background-color: #eeeeee; +} + +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer.hiddenToolbar { + background: #fff; + background-color: #fff; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer.hiddenToolbar #deleteSiteTeam, +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer.hiddenToolbar #editSiteTeam{ + background: #fff; + background-color: #fff; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer div { + padding-right: 15px; + padding-left: 15px; + padding-top : 10px; + color: #0271be; + display : inline-block; + height : 2em; + cursor : pointer; +} +div#usersManagementPortletContainerSiteTeamsEditMode div#groupTeamsTableToolbarContainer div:hover { + background: #4cb5d2; + background-color: #4cb5d2; + color : #fff; +} +div.shownToolbar div#usersManagementDiv { + float:right; +} + +div#toolbar div#userRequestsNotifications { + float:right; +} +div#notificationsNumberPlaceHolder { + text-align: center; + display: inline-block; + padding: 3px 0px 0px 0px; +} +div#notificationsNumberPlaceHolderTabletView { + text-align: center; + display: inline-block; + padding: 3px 0px 0px 0px; +} +div#notificationsNumberPlaceHolder:before { + /* content: 'Pending Requests:'; */ + white-space: nowrap; + margin-left: -135px; + position: absolute; + color:#808080; + font-size 0.8em; +} +div#notificationsNumberPlaceHolder:hover:before { + cursor: default; +} +#notificationsTextDiv{ + float: right; + margin-top: 8px; + padding-left: 2px; + color:#808080; + font-size 0.8em; +} +#notificationsTextDivTabletView{ + padding-top: 3px; + padding-left: 2px; + color:#808080; + font-size 0.8em; +} +#notificationsTextDivTabletView{ + float: left; + margin-top: 0.9em; + padding-left: 13px; + color:#808080; + font-size 0.8em; +} +div#addSiteTeam { + display: inline-block; + float: left; + color: #0271be; + height: 27px; + padding: 10px 15px 0px 15px; + background: #eeeeee; + background-color: #eeeeee; +} +div#addSiteTeam:hover { + color: #eeeeee; + background: #4cb5d2; + background-color: #4cb5d2; + cursor: pointer; +} +#newGroupPlusIcon { + margin-left: 5px; +} +#displaySelectedUserReqs{ + color:#808080 !important; +} + +@media only screen and (min-width:980px) and (max-width: 1012px) { + #userRequestsNotifications{ + display:none !important; + } + #notificationsTextDiv{ + display:none !important; + } + + #userRequestsNotificationsTabletView{ + display:inline-block !important; + } + #notificationsTextDivTabletView{ + display:inline-block !important; + } +} +@media only screen and (min-width:768px) and (max-width: 1012px) { + + div#usersManagementPortletContainer div#toolbar.shownToolbar > div#displaySelected { + margin-right: 0px; + border-right:none; + padding-left: 0px; + } + + div#usersManagementPortletContainer div.dataTables_filter label, + div#usersManagementPortletContainerSiteTeamsEditMode div.dataTables_filter label { + width: 250px; + } +} \ No newline at end of file diff --git a/src/main/webapp/icon.png b/src/main/webapp/icon.png new file mode 100644 index 0000000..807b862 Binary files /dev/null and b/src/main/webapp/icon.png differ diff --git a/src/main/webapp/img/preloader.gif b/src/main/webapp/img/preloader.gif new file mode 100644 index 0000000..82fe34f Binary files /dev/null and b/src/main/webapp/img/preloader.gif differ diff --git a/src/main/webapp/img/sort_asc.png b/src/main/webapp/img/sort_asc.png new file mode 100644 index 0000000..a56d0e2 Binary files /dev/null and b/src/main/webapp/img/sort_asc.png differ diff --git a/src/main/webapp/img/sort_asc_disabled.png b/src/main/webapp/img/sort_asc_disabled.png new file mode 100644 index 0000000..fb11dfe Binary files /dev/null and b/src/main/webapp/img/sort_asc_disabled.png differ diff --git a/src/main/webapp/img/sort_both.png b/src/main/webapp/img/sort_both.png new file mode 100644 index 0000000..b842539 Binary files /dev/null and b/src/main/webapp/img/sort_both.png differ diff --git a/src/main/webapp/img/sort_desc.png b/src/main/webapp/img/sort_desc.png new file mode 100644 index 0000000..90b2951 Binary files /dev/null and b/src/main/webapp/img/sort_desc.png differ diff --git a/src/main/webapp/img/sort_desc_disabled.png b/src/main/webapp/img/sort_desc_disabled.png new file mode 100644 index 0000000..c9fdd8a Binary files /dev/null and b/src/main/webapp/img/sort_desc_disabled.png differ diff --git a/src/main/webapp/js/DataTableCSSArrowsIssueWorkArround.js b/src/main/webapp/js/DataTableCSSArrowsIssueWorkArround.js new file mode 100644 index 0000000..8742d2a --- /dev/null +++ b/src/main/webapp/js/DataTableCSSArrowsIssueWorkArround.js @@ -0,0 +1,4 @@ +function removeArrowFromFirstTableColumn(){ + var tablesSelector = $('#usersManagementPortletContainer #CurrentUsersTable thead th:first, #usersManagementPortletContainer #usersRequestsTable thead th:first, #usersManagementPortletContainerSiteTeamsEditMode #GroupTeamsTable thead th:first, #rejectedUsersRequestsTable thead th:first'); + tablesSelector.removeClass('sorting_asc'); +} \ No newline at end of file diff --git a/src/main/webapp/js/InitializeDataTables.js b/src/main/webapp/js/InitializeDataTables.js new file mode 100644 index 0000000..052601c --- /dev/null +++ b/src/main/webapp/js/InitializeDataTables.js @@ -0,0 +1,378 @@ +function initializeCurrentUsersTable(){ + $('table#CurrentUsersTable').on( 'draw.dt', function (e, settings, data) { + var info = $('#CurrentUsersTable').DataTable().page.info(); + CurrentUsersTablePages = info.pages; + }).dataTable({ + data : usersTableData, + columns : [ + { + data : "CheckBox" + }, + { + data : "UserName", + orderable : true + }, + { + data : "Email", + orderable : true + }, + { + data : "FullName", + orderable : true + }, + { + data : "Roles", + orderable : true + } , + { + data : "Teams", + orderable : true + } , + { + data : "RequestDate", + orderable : true, + orderData: 8, + targets : 6 + }, + { + data : "ValidationDate", + orderable : true, + orderData: 9, + targets : 7 + }, + { + data : "RequestDateObject", + visible : false, + searchable : false, + orderable : true, + type : "date" + }, + { + data : "ValidationDateObject", + visible : false, + searchable : false, + orderable : true, + type : "date" + } + ], + pagingType : "full_numbers", + language : { + "info": "Showing _START_ - _END_ of _TOTAL_ | ", + "processing" : "Processing...", + "paginate": { + "next": "", + "previous": "", + "first": "", + "last": "" + }, + "search": "_INPUT_", + "searchPlaceholder": "Search..." + }, + dom: '<"toolbarContainer">frtilp', + responsive: { + details: { + display: $.fn.dataTable.Responsive.display.childRowImmediate, + type: '' + } + }, + columnDefs: [{"orderable" : false, "targets" : 0}, + {responsivePriority: 1, targets: 0}, + {responsivePriority: 2, targets: 1}, + {responsivePriority: 3, targets: 2}, + {responsivePriority: 4, targets: 3}, + {responsivePriority: 5, targets: 5}, + {responsivePriority: 6, targets: 6}, + {responsivePriority: 7, targets: 7}] + }); + + addTagsInputFunctionalityToSearchInput(); +} + +function initializeMembershipRequestsTable(){ + $('table#usersRequestsTable').on( 'draw.dt', function (e, settings, data) { + var info = $('#usersRequestsTable').DataTable().page.info(); + UsersRequestsTablePages = info.pages; + }).DataTable({ + data : reqsTableData, + columns : [ + { + data : "CheckBox", + orderable : false, + }, + { + data : "UserName", + orderable : true, + }, + { + data : "Email", + orderable : true, + }, + { + data : "FullName", + orderable : true, + }, + { + data : "Message", + orderable : true, + }, + { + data: "RequestDate", + orderable : true, + orderData : 6, + targets : 5 + },{ + data : "RequestDateObject", + orderable : true, + visible : false, + searchable : false, + type : "date" + } + ], + pagingType : "full_numbers", + language : { + "info": "Showing _START_ - _END_ of _TOTAL_ | ", + "processing" : "Processing...", + "paginate": { + "next": "", + "previous": "", + "first": "", + "last": "" + }, + "search": "_INPUT_", + "searchPlaceholder": "Search..." + }, + dom: '<"usersRequestsTableToolbarContainer">frtilp', + responsive: { + details: { + display: $.fn.dataTable.Responsive.display.childRowImmediate, + type: '' + } + }, + columnDefs: [{responsivePriority: 1, targets: 0}, + {responsivePriority: 2, targets: 1}, + {responsivePriority: 3, targets: 2}, + {responsivePriority: 4, targets: 3}] + }); +} + +function initializeRejectedMembershipRequestsTable(){ + $('table#rejectedUsersRequestsTable') + .on('init.dt', function() { + constructToolbarForRejectedUsersRequestsTable(); + }) + .on( 'draw.dt', function (e, settings, data) { +// var info = $('#usersRequestsTable').DataTable().page.info(); +// UsersRequestsTablePages = info.pages; + }).DataTable({ + data : reqsTableData, + columns : [ + { + data : "CheckBox", + orderable : false, + }, + { + data : "UserName", + orderable : true, + }, + { + data : "Email", + orderable : true, + }, + { + data : "FullName", + orderable : true, + }, + { + data : "Message", + orderable : true, + }, + { + data: "RequestDate", + orderable : true, + orderData : 7, + targets : 5 + }, + { + data: "RejectionDate", + orderable : true, + orderData : 8, + targets : 6 + }, + { + data: "RequestDateObject", + orderable : true, + searchable : false, + visible : false + }, + { + data: "RejectionDateObject", + orderable : true, + searchable : false, + visible : false + } + ], + pagingType : "full_numbers", + language : { + "info": "Showing _START_ - _END_ of _TOTAL_ | ", + "processing" : "Processing...", + "paginate": { + "next": "", + "previous": "", + "first": "", + "last": "" + }, + "search": "_INPUT_", + "searchPlaceholder": "Search..." + }, + dom: '<"rejectedMembershipRequestsTableToolbarContainer">frtilp', + responsive: { + details: { + display: $.fn.dataTable.Responsive.display.childRowImmediate, + type: '' + } + }, + columnDefs: [{responsivePriority: 1, targets: 0}, + {responsivePriority: 2, targets: 1}, + {responsivePriority: 3, targets: 2}, + {responsivePriority: 4, targets: 3}, + {responsivePriority: 5, targets: 4}] + }); +} + +function initializeGroupTeamsTable(){ + $('table#GroupTeamsTable').on( 'draw.dt', function (e, settings, data) { + var info = $('#GroupTeamsTable').DataTable().page.info(); + GroupTeamsTablePages = info.pages; + }).DataTable({ + data : groupTeamsTableData, + columns : [ + { + data : "CheckBox", + orderable : false, + }, + { + data : "Name", + orderable : true, + }, + { + data : "Description", + orderable : true, + }, + { + data : "NumberOfUsers", + orderable : true, + }, + { + data : "CreationDate", + orderable : true, + orderData: 7, + targets : 4 + }, + { + data: "LastModificationDate", + orderable : true, + orderData: 8, + targets : 5 + }, + { + data: "CreatorName", + orderable : true + }, + { + data : "CreationDateObject", + visible : false, + searchable : false, + orderable : true, + type : "date" + }, + { + data : "LastModificationDateObject", + visible : false, + searchable : false, + orderable : true, + type : "date" + } + ], + language : { + "info": "Showing _START_ - _END_ of _TOTAL_ | ", + "processing" : "Processing...", + "paginate": { + "next": "", + "previous": "", + "first": "", + "last": "" + }, + "search": "_INPUT_", + "searchPlaceholder": "Search..." + }, + dom: '<"groupTeamsTableToolbarContainer">frtilp', + pagingType : "full_numbers", + responsive: { + details: { + display: $.fn.dataTable.Responsive.display.childRowImmediate, + type: '' + } + }, + columnDefs: [{responsivePriority: 1, targets: 0}, + {responsivePriority: 2, targets: 1}, + {responsivePriority: 3, targets: 2}, + {responsivePriority: 4, targets: 3}] + }); +} + +function initializeSiteTeamUsersTable(){ + $('table#GroupTeamsTableUsers').on( 'draw.dt', function (e, settings, data) { + var info = $('#GroupTeamsTableUsers').DataTable().page.info(); + GroupTeamsTableUsersTablePages = info.pages; + if(GroupTeamsTableUsersTablePages <= 1){ + $('#GroupTeamsTableUsers_paginate').addClass('hidden'); + }else{ + $('#GroupTeamsTableUsers_paginate').removeClass('hidden'); + } + }).dataTable({ + data : [], + columns : [ + { + data : "FullName", + orderable : true + }, + { + data : "UserName", + orderable : true + } + ], + pagingType : "full_numbers", + dom: 'frtilp', + language : { + "info": "Showing _START_ - _END_ of _TOTAL_ | ", + "processing" : "Processing...", + "paginate": { + "next": "", + "previous": "", + "first": "", + "last": "" + }, + "search": "_INPUT_", + "searchPlaceholder": "Search..." + } + }); +} + +function setTooltips(){ +// $('#userRequestsNotifications').tooltip(); + $('#currentUsersTableRefresh').tooltip(); + $('#reloadUsersRequestsTable').tooltip(); + $('#editEmailTemplate').tooltip(); +// $('#usersManagementPortletContainer .searchDiv').tooltip(); +// $('#usersManagementPortletContainerSiteTeamsEditMode .searchDiv').tooltip(); +} + +function eraseTextOfSearchInputLabels(){ + var array = $('#CurrentUsersTable_filter label, #usersRequestsTable_filter label, #GroupTeamsTable_filter label, #GroupTeamsTableUsers_filter label'); + + $.each(array, function(){ + $($(this).contents()[0]).remove(); + });//remove Search: text from label + + array.find('input').attr('placeholder', 'Search:'); +} \ No newline at end of file diff --git a/src/main/webapp/js/TagFunctionalities.js b/src/main/webapp/js/TagFunctionalities.js new file mode 100644 index 0000000..609710f --- /dev/null +++ b/src/main/webapp/js/TagFunctionalities.js @@ -0,0 +1,336 @@ +function tagEvents(theList, teamsList){ + //Roles + $('#roleList').textext({ + plugins : 'autocomplete arrow tags', + html : { + arrow:'
' + }, + ext : { + tags : { + addTags : function(tags) { + if(!alreadyExists(tags)) { + $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + } + } + } + } + }) + .bind('getSuggestions', function(e, data) + { + var list = theList, + textext = $(e.target).textext()[0], + query = (data ? data.query : '') || '' + ; + + $(this).trigger( + 'setSuggestions', + { + result : textext.itemManager().filter(list, query) + } + ); + }); + + $('#roleListInAssignRolesModal').textext({ + plugins : 'autocomplete arrow tags', + html : { + arrow:'
' + }, + ext : { + tags : { + addTags : function(tags) { + if(!alreadyExistsInAssignModal(tags)) { + $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + } + } + } + } + }) + .bind('getSuggestions', function(e, data) + { + var list = theList, + textext = $(e.target).textext()[0], + query = (data ? data.query : '') || '' + ; + + $(this).trigger( + 'setSuggestions', + { + result : textext.itemManager().filter(list, query) + } + ); + }); + //UI + $('#roleListInAssignRolesModal').closest('.text-core').addClass('span9') + + //Teams + $('#teamsList').textext({ + plugins : 'autocomplete arrow tags', + html : { + arrow:'
' + }, + ext : { + tags : { + addTags : function(tags) { + if(!alreadyExists(tags)) { + $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + } + } + } + } + }) + .bind('getSuggestions', function(e, data) + { + var list = teamsList, + textext = $(e.target).textext()[0], + query = (data ? data.query : '') || '' + ; + + $(this).trigger( + 'setSuggestions', + { + result : textext.itemManager().filter(list, query) + } + ); + }); + + $('#teamsListInAssignUsersToGroupsModal').textext({ + plugins : 'autocomplete arrow tags', + html : { + arrow:'
' + }, + ext : { + tags : { + addTags : function(tags) { + if(!alreadyExistsInAssignUsersToGroupsModal(tags)) { + $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + } + } + } + } + }) + .bind('getSuggestions', function(e, data) + { + var list = teamsList, + textext = $(e.target).textext()[0], + query = (data ? data.query : '') || '' + ; + + $(this).trigger( + 'setSuggestions', + { + result : textext.itemManager().filter(list, query) + } + ); + }); + //UI + $('#teamsListInAssignUsersToGroupsModal').closest('.text-core').addClass('span9') + + //Emails + $('#tagsForEmails').textext({ + plugins : 'tags' + }); + $('#tagsForEmails').closest('.row').find('.text-core').addClass('span11'); + $('#usersManagementPortletContainer div.text-tags').off().bind('DOMNodeInserted', function(event) { + var element = event.target; + var tagName = $(element).prop("tagName"); + if(tagName !== 'DIV')return; + $(this).find('.text-button').addClass('span12'); + $(this).find('.text-label').addClass('span11'); + $('#tagsForEmails').parent().find('a.text-remove').html('').removeClass('text-remove').addClass('tag-remove span1'); + }); + $('span#textAboveTagsInput div.row div.text-core:first-of-type').addClass('span9'); + + $('#CCAdminsEmails').textext({ + plugins : 'tags' + }); + + $('#BCCAdminsEmails').textext({ + plugins : 'tags', + html: { + tag : '
' + } + }); + $('textarea#BCCAdminsEmails').textext()[0].tags().containerElement().closest('.text-core').addClass('span11'); +} + +function alreadyExists(tags){ + var roleTexts = $('#roleList').parent().find('.text-button.span12 .text-label'); + var teamTexts = $('#teamsList').parent().find('.text-button.span12 .text-label'); + var elements = $.merge(roleTexts, teamTexts); + + for(var i = 0; i < elements.length; i++){ + if(tags === null) return false; + for(var j = 0; j < tags.length; j++){ + if($(elements[i]).text().trim() === tags[j].trim()){ + return true; + } + } + } + return false; +} + +function alreadyExistsInAssignModal(tags){ + var roleTextsInAssignModal = $('#roleListInAssignRolesModal').parent().find('.text-button.span12 .text-label'); + var elements = roleTextsInAssignModal; + + for(var i = 0; i < elements.length; i++){ + if(tags === null) return false; + for(var j = 0; j < tags.length; j++){ + if($(elements[i]).text().trim() === tags[j].trim()){ + return true; + } + } + } + return false; +} + +function alreadyExistsInAssignUsersToGroupsModal(tags){ + var teamTexts = $('#teamsListInAssignUsersToGroupsModal').parent().find('.text-button.span12 .text-label'); + var elements = teamTexts; + + for(var i = 0; i < elements.length; i++){ + if(tags === null) return false; + for(var j = 0; j < tags.length; j++){ + if($(elements[i]).text().trim() === tags[j].trim()){ + return true; + } + } + } + return false; +} + +function teamEditedOrDeleted(teamsList){ + $('#teamsList').closest('.text-core.span9').remove(); + $('#textAboveTagsInput .row:nth-of-type(5)').append( + $('', { + id : 'teamsList' + }) + ); + $('#teamsList').textext({ + plugins : 'autocomplete arrow tags', + html : { + arrow:'
' + }, + ext : { + tags : { + addTags : function(tags) { + if(!alreadyExists(tags)) { + $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + } + } + } + } + }) + .bind('getSuggestions', function(e, data) + { + var list = teamsList, + textext = $(e.target).textext()[0], + query = (data ? data.query : '') || '' + ; + + $(this).trigger( + 'setSuggestions', + { + result : textext.itemManager().filter(list, query) + } + ); + }); + + $('span#textAboveTagsInput div.row:nth-of-type(5) div.text-core:first').addClass('span9'); + + $('#teamsList').parent().find('div.text-tags').off().bind( + 'DOMNodeInserted', + function(event) { + var element = event.target; + var tagName = $(element).prop("tagName"); + if (tagName !== 'DIV') + return; + // $('#roleList').parent().find('div.text-tag').addClass('span5'); + $('#teamsList').parent().find('div.text-button').addClass( + 'span12'); + $('#teamsList').parent().find('a.text-remove').html('') + .removeClass('text-remove').addClass('tag-remove'); + $('textarea#teamsList').parent().find('a.tag-remove').off().on( + 'click', function() { + $(this).closest('.text-tag').remove(); + }); + var matched = false; + var tagsTextt = $('#teamsList').parent().find( + 'div.text-tag.span5'); + for (var i = 0; i < tagsTextt.length; i++) { + for (var j = i + 1; j < tagsTextt.length; j++) { + if ($(tagsTextt[i]).text() === $(tagsTextt[j]).text()) { + tagsTextt[j].remove(); + } + } + } + }); + + + $('#teamsListInAssignUsersToGroupsModal').closest('.text-core.span9').remove(); + $('#textAboveTagsInputInAssignUsersToGroupsModal .row:last').append( + $('', { + id : 'teamsListInAssignUsersToGroupsModal' + }) + ); + + $('#teamsListInAssignUsersToGroupsModal').textext({ + plugins : 'autocomplete arrow tags', + html : { + arrow:'
' + }, + ext : { + tags : { + addTags : function(tags) { + if(!alreadyExistsInAssignUsersToGroupsModal(tags)) { + $.fn.textext.TextExtTags.prototype.addTags.apply(this, arguments); + } + } + } + } + }) + .bind('getSuggestions', function(e, data) + { + var list = teamsList, + textext = $(e.target).textext()[0], + query = (data ? data.query : '') || '' + ; + + $(this).trigger( + 'setSuggestions', + { + result : textext.itemManager().filter(list, query) + } + ); + }); + + $('span#textAboveTagsInputInAssignUsersToGroupsModal div.row:last div.text-core:first').addClass('span9'); + + $('#teamsListInAssignUsersToGroupsModal').parent().find('div.text-tags').off().bind( + 'DOMNodeInserted', + function(event) { + var element = event.target; + var tagName = $(element).prop("tagName"); + if (tagName !== 'DIV') + return; + // $('#roleList').parent().find('div.text-tag').addClass('span5'); + $('#teamsListInAssignUsersToGroupsModal').parent().find('div.text-button').addClass( + 'span12'); + $('#teamsListInAssignUsersToGroupsModal').parent().find('a.text-remove').html('') + .removeClass('text-remove').addClass('tag-remove'); + $('textarea#teamsListInAssignUsersToGroupsModal').parent().find('a.tag-remove').off().on( + 'click', function() { + $(this).closest('.text-tag').remove(); + }); + var matched = false; + var tagsTextt = $('#teamsListInAssignUsersToGroupsModal').parent().find( + 'div.text-tag.span5'); + for (var i = 0; i < tagsTextt.length; i++) { + for (var j = i + 1; j < tagsTextt.length; j++) { + if ($(tagsTextt[i]).text() === $(tagsTextt[j]).text()) { + tagsTextt[j].remove(); + } + } + } + }); +} \ No newline at end of file diff --git a/src/main/webapp/js/Toolbar.js b/src/main/webapp/js/Toolbar.js new file mode 100644 index 0000000..3cca78f --- /dev/null +++ b/src/main/webapp/js/Toolbar.js @@ -0,0 +1,256 @@ +function constructToolbarForCurrentUsersTable(){ + var toolbar = $('
', { + id: 'toolbar', + class: 'shownToolbar', + css: { + display: 'none' + } +// 'class' : 'hiddenToolbar' + }); + var dispSelected = $('
', { + id : 'displaySelected', + class: 'insideToolbar' + }); + dispSelected.append($('', { + id : 'numOfSelectedRows' + })); + dispSelected.append($('', { + id : 'justSelectedText', + text : ' selected' + })); + + var notificationsWrapper = $('
', { + id : 'userRequestsNotifications', + 'class' : 'notificationsShown hidden', +// 'class' : 'notificationsShown visible-desktop', + 'data-toggle' : "tooltip", + 'data-placement':"left", + 'data-original-title':"Users' membership requests", + css : { + display: 'none' + }//hide element + }); + + var notificationsNumberPlaceHolder = $('
', { + id: 'notificationsNumberPlaceHolder', + text: 0 + }); + + var notificationsTextSpan = $('', { + id : 'notificationsTextDiv', + text: ' pending requests', + class : 'hidden', + css : { + display: 'none' + }//hide element +// class : 'visible-desktop' + }); + + notificationsWrapper.append(notificationsNumberPlaceHolder); + + + + var notificationsWrapperTabletView = $('
', { + id : 'userRequestsNotificationsTabletView', +// 'class' : 'notificationsShown visible-tablet', + 'class' : 'notificationsShown', + 'data-toggle' : "tooltip", + 'data-placement':"left", + 'data-original-title':"Users' membership requests" + }); + + var notificationsNumberPlaceHolderTabletView = $('
', { + id: 'notificationsNumberPlaceHolderTabletView', + text: 0 + }); + + var notificationsTextSpanTabletView = $('', { + id : 'notificationsTextDivTabletView', + text: ' pending requests', + class : '' +// class : 'visible-tablet' + }); + + toolbar + .append($('
', { + id : 'deselectAll', + class: 'insideToolbar', + text : 'Deselect All' + })).append($('
', { + id : 'editSelected', + class: 'insideToolbar', + text : 'Edit Selected' + })).append($('
', { + id : 'assignRolesToUser', + class: 'insideToolbar', + text : 'Assign Roles' + })).append($('
', { + id : 'assignUsersToGroup', + class: 'insideToolbar', + text : 'Add to Group' + })).append($('
', { + id : 'deleteSelected', + text : 'Unsubscribe Selected', + class: 'insideToolbar' + })).append(notificationsTextSpan).append(notificationsWrapper).append(dispSelected); + +// .append($('
', { +// id : 'usersManagementDiv', +// text : 'Pending Requests:' +// }))//.append(currentUsersTableRefresh) + + $("#usersManagementPortletContainer div.toolbarContainer") + .append($('
', { + id : 'toolbarHr' + })).append(toolbar); + + notificationsWrapperTabletView.append(notificationsNumberPlaceHolderTabletView); + notificationsTextSpanTabletView.insertAfter(toolbar); + notificationsWrapperTabletView.insertAfter(toolbar); +} + +function searchInputFixForCurrentUsersTable(){ + var a = $('
', { + 'class': 'searchDiv', + 'data-toggle' : "tooltip", + 'data-placement': "top", + 'data-original-title':"Search" + }).append($('', { + 'class' : "icon-search" + }).prop('outerHTML')); + $('#CurrentUsersTable_filter').append(a); + $('#CurrentUsersTable_filter label').toggleClass('hideMe'); + + $('div#changeUsersRolesModal div.modal-body span#textAboveTagsInput div.bootstrap-tagsinput').addClass('span9'); +} + +function searchInputFixForMembershipRequestsTable(){ + var aa = $('
', { + 'class': 'searchDiv', + 'data-toggle' : "tooltip", + 'data-placement': "top", + 'data-original-title':"Search" + }).append($('', { + 'class' : "icon-search" + }).prop('outerHTML')); + $('#usersRequestsTable_filter').append(aa); + $('#usersRequestsTable_filter label').toggleClass('hideMe'); +} + +function searchInputFixForSiteTeamsEditTable(){ + var aa = $('
', { + 'class': 'searchDiv', + 'data-toggle' : "tooltip", + 'data-placement': "top", + 'data-original-title':"Search" + }).append($('', { + 'class' : "icon-search" + }).prop('outerHTML')); + $('#GroupTeamsTable_filter').append(aa); + $('#GroupTeamsTable_filter label').toggleClass('hideMe'); +} + +function searchInputFixForSiteTeamsUsersTable(){ + var aa = $('
', { + 'class': 'searchDiv', + 'data-toggle' : "tooltip", + 'data-placement': "top", + 'data-original-title':"Search" + }).append($('', { + 'class' : "icon-search" + }).prop('outerHTML')); + $('#GroupTeamsTableUsers_filter').append(aa); + $('#GroupTeamsTableUsers_filter label').toggleClass('hideMe'); +} + +function searchInputFixForRejectedUsersRequestsTable(){ + var aa = $('
', { + 'class': 'searchDiv', + 'data-toggle' : "tooltip", + 'data-placement': "top", + 'data-original-title':"Search" + }).append($('', { + 'class' : "icon-search" + }).prop('outerHTML')); + $('#rejectedUsersRequestsTable_filter').append(aa); + $('#rejectedUsersRequestsTable_filter label').toggleClass('hideMe'); +} + +function constructToolbarForMembershipRequestsTable(){ + var dispSelectedUserReqs = $('
', { + id : 'displaySelectedUserReqs' + }); + dispSelectedUserReqs.append($('', { + id : 'numOfSelectedRowsUserReqs' + })); + dispSelectedUserReqs.append($('', { + id : 'justSelectedTextUserReqs', + text : ' selected' + })); + + $('#usersManagementPortletContainer .usersRequestsTableToolbarContainer') +// .addClass('hiddenToolbar') + .addClass('shownToolbar') + .prop('id', 'usersRequestsTableToolbarContainer') + .css('display', 'none') + .append($('
', { + id : 'acceptSeleced', + text : 'Accept Selected' + })).append($('
', { + id : 'rejectSeleced', + text : 'Reject Selected' + })).append(dispSelectedUserReqs); + + var div = $('
', { + id : 'borderFirstScreen' + }); + div.insertBefore('#usersManagementPortletContainer .usersRequestsTableToolbarContainer'); +} + +function constructToolbarForSiteTeamsTable(){ + + $('
', { + class : 'toolbarHr' + }).insertBefore($('.groupTeamsTableToolbarContainer')); + + $('.groupTeamsTableToolbarContainer') +// .addClass('hiddenToolbar') + .addClass('shownToolbar') + .css('display', 'none') + .prop('id', 'groupTeamsTableToolbarContainer') + .append($('
', { + id : 'deleteSiteTeam', + text : 'Delete Group' + })).append($('
', { + id : 'editSiteTeam', + text : 'Edit Group' + })); + + var addSiteTeam = $('
', { + id : 'addSiteTeam', + text : 'New Group' + }); + + var newGroupPlusIcon = $('',{ + class: "fa fa-plus-circle", + 'aria-hidden':"true", + id : 'newGroupPlusIcon' + }); + + addSiteTeam.append(newGroupPlusIcon); + + addSiteTeam.insertAfter('.groupTeamsTableToolbarContainer'); + + var div = $('
', { + id : 'borderFirstScreen' + }); + + div.insertBefore('#groupTeamsTableToolbarContainer .groupTeamsTableToolbarContainer'); +} + +function constructToolbarForRejectedUsersRequestsTable(){ + $("div.rejectedMembershipRequestsTableToolbarContainer") + .append($('
', { + class : 'toolbarHr' + })); +} \ No newline at end of file diff --git a/src/main/webapp/js/ajaxcallpost.js b/src/main/webapp/js/ajaxcallpost.js new file mode 100644 index 0000000..c8b6726 --- /dev/null +++ b/src/main/webapp/js/ajaxcallpost.js @@ -0,0 +1,556 @@ +function surroundObjectPropWithDiv(object){ + for(var prop in object){ + if(object[prop] instanceof Date)continue; + if(object[prop].length === 0)object[prop] = "-"; + if(object[prop] === '123')object[prop] = ""; + if(Array.isArray(object[prop]) && object[prop].length > 0){ + var variable = ""; + for(var i = 0; i < object[prop].length; i++){ + if(i===object[prop].length-1){ + variable += object[prop][i]; + }else{ + variable += object[prop][i] + ", "; + } + } + object[prop] = variable; + } + object[prop] = '
' + object[prop] + '
'; + } + return object; +} + +function AJAX_CALL_POST(theData, callBack){ + $.ajax( + { + url: loginURL, + type: 'post', + datatype:'json', + data: theData, + success: function(data){ + callBack(data); + removeArrowFromFirstTableColumn(); +// hideTeamManagementToolbar(); + hidePreloader(); + }, + error: function (xhr, ajaxOptions, thrownError) { + $('div.modal.fade').modal('hide'); + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); +// alert(xhr.status); +// alert(thrownError); + } + } + ); +} + +function dataToBeSendViaAJAX(fieldName, value, theObject){ + var returnObject; + if(typeof theObject === "object"){ + returnObject = theObject; + }else { + returnObject = {}; + } + + returnObject[nameSpace + fieldName] = value; + + return returnObject; +} + +function fetchAllCurrentUsers(mode, deleteUsers, usersUUIDs, roles, teams, deleteRoles, reqIDs, sendEmail, typeOfChangesUpponUserMode){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("currentUsersTable", true, theData); + theData = dataToBeSendViaAJAX("deleteUsersFromCurrentUsersTable", deleteUsers, theData); + theData = dataToBeSendViaAJAX("sendDismissalEmail", sendEmail, theData); + theData = dataToBeSendViaAJAX("selectedUsers", usersUUIDs, theData); + theData = dataToBeSendViaAJAX("usersRoles", roles, theData); + theData = dataToBeSendViaAJAX("usersTeams", teams, theData); + theData = dataToBeSendViaAJAX("modeCurrentUsersTable", mode, theData); + theData = dataToBeSendViaAJAX("deletePreviousRoles", deleteRoles, theData); + theData = dataToBeSendViaAJAX("membershipRequestsIDs", reqIDs, theData); + theData = dataToBeSendViaAJAX("typeOfChangesUpponUserMode", typeOfChangesUpponUserMode, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + currentUsers = []; + currentUsers = content.currentUsers; + + if(!$.isEmptyObject(content)){ + for(var i = 0; i < currentUsers.length; i++){ + currentUsers[i] = new currentUsersObjectForDataTable( + '', + currentUsers[i].userName, + currentUsers[i].userEmail, + currentUsers[i].userFullName, + currentUsers[i].userSiteRoles, + currentUsers[i].userTeams, + currentUsers[i].userId, + currentUsers[i].requestDate, + currentUsers[i].validationDate, + currentUsers[i].reqID, + currentUsers[i].isSelf, + currentUsers[i].RequestDateObject, + currentUsers[i].ValidationDateObject + ); + currentUsers[i] = surroundObjectPropWithDiv(currentUsers[i]); + } + + $('table#CurrentUsersTable').DataTable().clear(); + for(var i = 0; i < currentUsers.length; i++){ + $('table#CurrentUsersTable').dataTable().fnAddData(currentUsers[i]); + } + $('table#CurrentUsersTable th:first').removeClass('none'); + + if(CurrentUsersTablePages <= 1){ + $('#CurrentUsersTable_paginate').addClass('hidden'); + }else{ + $('#CurrentUsersTable_paginate').removeClass('hidden'); + } + + var isDataTable = $.fn.DataTable.isDataTable( '#GroupTeamsTable' ); +// var siteTeamsTableDataLenght = $('#GroupTeamsTable').dataTable().fnGetData().length; + if(mode !== 2 && isDataTable){//refresh + fetchAllSiteTeamsForTheCurrentGroup(); + }else if(mode !== 2 && !isDataTable){ + initializeGroupTeamsTable(); + fetchAllSiteTeamsForTheCurrentGroup(); + searchInputFixForSiteTeamsEditTable(); + siteTeamsTableEvents(); + constructToolbarForSiteTeamsTable(); + initializeSiteTeamUsersTable(); + searchInputFixForSiteTeamsUsersTable(); + + setTimeout(function(){//If you don't add some time interval, the table won't redraw when you press the tab + $('table#GroupTeamsTable').DataTable().columns.adjust().draw(); + $('table#GroupTeamsTable').DataTable().columns.adjust().responsive.recalc(); + + removeArrowFromFirstTableColumn(); + },200); + $('.unhit').removeClass('unhit').addClass('redraw'); + $('li.redraw').on('click', function(){ + setTimeout(function(){//If you don't add some time interval, the table won't redraw when you press the tab + $('table#GroupTeamsTable').DataTable().columns.adjust().draw(); + $('table#GroupTeamsTable').DataTable().columns.adjust().responsive.recalc(); + + removeArrowFromFirstTableColumn(); + },200); + $(this).removeClass('redraw'); + }); + } + + } else { + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + }; + + AJAX_CALL_POST(theData, callBack); +} + +function fetchAllUsersRequests(mode, reqIDs, replyUserId, sendCustomRejectionEmail, CustomRejectionEmailBody){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("fetchUsersRequests", true, theData); + theData = dataToBeSendViaAJAX("modeMembershipRequestsTable", mode, theData); + theData = dataToBeSendViaAJAX("membershipRequestsIds", reqIDs, theData); + theData = dataToBeSendViaAJAX("managerId", replyUserId, theData); + theData = dataToBeSendViaAJAX("CustomRejectionEmailFromAdmin", sendCustomRejectionEmail, theData); + theData = dataToBeSendViaAJAX("CustomRejectionEmailBodyFromAdmin", CustomRejectionEmailBody, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + currentUsersRequests = []; + currentUsersRequests = content.currentUsersRequests; + + if(!$.isEmptyObject(content) && content !== null && content.currentUsersRequests.length!== 0){ + for(var i = 0; i < currentUsersRequests.length; i++){ + currentUsersRequests[i] = new usersRequestObjectForDataTable( + '', + currentUsersRequests[i].userName, + currentUsersRequests[i].userEmail, + currentUsersRequests[i].userFullName, + currentUsersRequests[i].requestComments, + currentUsersRequests[i].userId, + currentUsersRequests[i].requestId, + currentUsersRequests[i].requestDate, + currentUsersRequests[i].requestDateObject + ); + currentUsersRequests[i] = surroundObjectPropWithDiv(currentUsersRequests[i]); + } + $('table#usersRequestsTable').DataTable().clear(); + for(var i = 0; i < currentUsersRequests.length; i++){ + $('table#usersRequestsTable').dataTable().fnAddData(currentUsersRequests[i]); + } + $('table#usersRequestsTable th:first').removeClass('none'); + $('div#usersRequestsTableToolbarContainer').animate({height:'hide'}); + $('div#usersRequestsTableToolbarContainer').removeClass('openToolbar'); + + if(UsersRequestsTablePages <= 1){ + $('#usersRequestsTable_paginate').addClass('hidden'); + }else{ + $('#usersRequestsTable_paginate').removeClass('hidden'); + } + + countUsersMembershipRequests(); +// $('div#usersRequestsTableToolbarContainer').addClass('hiddenToolbar').removeClass('shownToolbar'); + $('span#numOfSelectedRowsUserReqs').text(''); + + } else if(content.currentUsersRequests.length === 0) { + $('#notificationsNumberPlaceHolder').text(0); + $('#notificationsNumberPlaceHolderTabletView').text(0); + } else if(content === null) { + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + + fetchAllCurrentUsers(2, false, [], [], [], false, [], false); + } + + AJAX_CALL_POST(theData, callBack); +} + +function fetchAllRejectedUsersRequests() { + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("fetchUsersRejectedRequests", true, theData); +// theData = dataToBeSendViaAJAX("membershipRequestsIds", reqIDs, theData); + + var callback = function(data){ + var content= JSON.parse(data); + var rejectedUsersRequests = []; + rejectedUsersRequests = content.currentUsersRequests; + + if(!$.isEmptyObject(content) && content !== null && content.currentUsersRequests.length!== 0){ + for(var i = 0; i < rejectedUsersRequests.length; i++){ + rejectedUsersRequests[i] = new rejectedUsersRequestObjectForDataTable( + '', + rejectedUsersRequests[i].userName, + rejectedUsersRequests[i].userEmail, + rejectedUsersRequests[i].userFullName, + rejectedUsersRequests[i].requestComments, + rejectedUsersRequests[i].userId, + rejectedUsersRequests[i].requestId, + rejectedUsersRequests[i].requestDate, + rejectedUsersRequests[i].rejectionDate, + rejectedUsersRequests[i].requestDateObject, + rejectedUsersRequests[i].rejectionDateObject + ); + rejectedUsersRequests[i] = surroundObjectPropWithDiv(rejectedUsersRequests[i]); + } + + + $('table#rejectedUsersRequestsTable').DataTable().clear(); + for(var i = 0; i < rejectedUsersRequests.length; i++){ + $('table#rejectedUsersRequestsTable').dataTable().fnAddData(rejectedUsersRequests[i]); + } +// $('table#rejectedUsersRequestsTable th:first').removeClass('none'); +// $('div#usersRequestsTableToolbarContainer').animate({height:'hide'}); +// $('div#usersRequestsTableToolbarContainer').removeClass('openToolbar'); + + var numOfTablePages = $('#rejectedUsersRequestsTable').DataTable().page.info().pages; + if(numOfTablePages <= 1){ + $('#rejectedUsersRequestsTable_paginate').addClass('hidden'); + }else{ + $('#rejectedUsersRequestsTable_paginate').removeClass('hidden'); + } + + countUsersMembershipRequests(); +// $('div#usersRequestsTableToolbarContainer').addClass('hiddenToolbar').removeClass('shownToolbar'); +// $('span#numOfSelectedRowsUserReqs').text(''); + + } else if(content.currentUsersRequests.length === 0) { +// $('#notificationsNumberPlaceHolder').text(0); +// $('#notificationsNumberPlaceHolderTabletView').text(0); + } else if(content === null) { + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + +// fetchAllCurrentUsers(2, false, [], [], [], false, [], false); + } + + AJAX_CALL_POST(theData, callback); +} + +function countUsersMembershipRequests(){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("countUsersMembershipRequests", true, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + + if(!$.isEmptyObject(content) && content !== null){ + $('#notificationsNumberPlaceHolder').text(content.countUsersMembershipRequests[0]); + $('#notificationsNumberPlaceHolderTabletView').text(content.countUsersMembershipRequests[0]); + portalName = content.countUsersMembershipRequests[1];//retrieving the portal name from the backend via ajax + }else if(content === null) { + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + }; + + AJAX_CALL_POST(theData, callBack); +} + +function fetchAllSiteTeamsForTheCurrentGroup(){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("fetchAllSiteTeamsForTheCurrentGroup", true, theData); + theData = dataToBeSendViaAJAX("modeSiteTeams", SITE_TEAMS_TABLE_REFRESH, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + var siteTeams = []; + siteTeams = content.siteTeams; + + if(!$.isEmptyObject(content) && content !== null && siteTeams.length!== 0){ + var teams = []; + for(var i = 0; i < siteTeams.length; i++){ + siteTeams[i] = new siteTeamsObjectForDataTable( + '', + siteTeams[i].Name, + siteTeams[i].TeamID, + siteTeams[i].Description, + siteTeams[i].NumberOfUsers, + siteTeams[i].CreationDate, + siteTeams[i].LastModificationDate, + siteTeams[i].CreatorName, + siteTeams[i].siteTeamUsers, + siteTeams[i].CreationDateObject, + siteTeams[i].LastModificationDateObject + ); + teams.push(siteTeams[i].Name); + siteTeams[i].siteTeamUsers = formatSiteTeamUsers(siteTeams[i].siteTeamUsers); + siteTeams[i] = surroundObjectPropWithDiv(siteTeams[i]); + } + teamEditedOrDeleted(teams); + $('table#GroupTeamsTable').DataTable().clear(); + for(var i = 0; i < siteTeams.length; i++){ + $('table#GroupTeamsTable').dataTable().fnAddData(siteTeams[i]); + } + + if(GroupTeamsTablePages <= 1){ + $('#GroupTeamsTable_paginate').addClass('hidden'); + } else if(siteTeams.length === 0){ + $('#GroupTeamsTable_paginate').addClass('hidden'); + } + }else if(content === null) { + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + }else if(siteTeams.length === 0){ + $('#GroupTeamsTable_paginate').removeClass('hidden'); + } + if(!handlersAppliedToToolbarForFirstTime){ + siteTeamsToolbarEvents(); + } + }; + + AJAX_CALL_POST(theData, callBack); +} + +function EditSiteTeamsForTheCurrentGroup(siteTeamName, siteTeamDescription, TeamID){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("fetchAllSiteTeamsForTheCurrentGroup", true, theData); + theData = dataToBeSendViaAJAX("modeSiteTeams", SITE_TEAMS_TABLE_EDIT_GROUP, theData); + theData = dataToBeSendViaAJAX("siteTeamName", siteTeamName, theData); + theData = dataToBeSendViaAJAX("siteTeamDescription", siteTeamDescription, theData); + theData = dataToBeSendViaAJAX("siteTeamID", TeamID, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + var siteTeams = []; + siteTeams = content.siteTeams; + + if(!$.isEmptyObject(content) && content !== null && siteTeams.length!== 0){ + var teams = []; + for(var i = 0; i < siteTeams.length; i++){ + siteTeams[i] = new siteTeamsObjectForDataTable( + '', + siteTeams[i].Name, + siteTeams[i].TeamID, + siteTeams[i].Description, + siteTeams[i].NumberOfUsers, + siteTeams[i].CreationDate, + siteTeams[i].LastModificationDate, + siteTeams[i].CreatorName, + siteTeams[i].siteTeamUsers, + siteTeams[i].CreationDateObject, + siteTeams[i].LastModificationDateObject + ); + teams.push(siteTeams[i].Name); + siteTeams[i].siteTeamUsers = formatSiteTeamUsers(siteTeams[i].siteTeamUsers); + siteTeams[i] = surroundObjectPropWithDiv(siteTeams[i]); + } + teamEditedOrDeleted(teams); + $('table#GroupTeamsTable').DataTable().clear(); + for(var i = 0; i < siteTeams.length; i++){ + $('table#GroupTeamsTable').dataTable().fnAddData(siteTeams[i]); + } + $('#groupTeamsTableToolbarContainer').animate({height:'hide'}); + $('#groupTeamsTableToolbarContainer').removeClass('opened'); + + fetchAllCurrentUsers(2, false, [], [], false, [], false); + }else if(content === null) { + $('div.modal.fade').modal('hide'); + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + $('#editGroupTeamModal').modal('hide'); + }; + + showPreloader(); + AJAX_CALL_POST(theData, callBack); +} + +function CreateSiteTeamsForTheCurrentGroup(siteTeamName, siteTeamDescription){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("fetchAllSiteTeamsForTheCurrentGroup", true, theData); + theData = dataToBeSendViaAJAX("modeSiteTeams", SITE_TEAMS_TABLE_CREATE_GROUP, theData); + theData = dataToBeSendViaAJAX("siteTeamName", siteTeamName, theData); + theData = dataToBeSendViaAJAX("siteTeamDescription", siteTeamDescription, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + var siteTeams = []; + siteTeams = content.siteTeams; + + if(!$.isEmptyObject(content) && content !== null && siteTeams.length!== 0){ + var teams = []; + for(var i = 0; i < siteTeams.length; i++){ + siteTeams[i] = new siteTeamsObjectForDataTable( + '', + siteTeams[i].Name, + siteTeams[i].TeamID, + siteTeams[i].Description, + siteTeams[i].NumberOfUsers, + siteTeams[i].CreationDate, + siteTeams[i].LastModificationDate, + siteTeams[i].CreatorName, + siteTeams[i].siteTeamUsers, + siteTeams[i].CreationDateObject, + siteTeams[i].LastModificationDateObject + ); + teams.push(siteTeams[i].Name); + siteTeams[i].siteTeamUsers = formatSiteTeamUsers(siteTeams[i].siteTeamUsers); + siteTeams[i] = surroundObjectPropWithDiv(siteTeams[i]); + } + teamEditedOrDeleted(teams); + $('table#GroupTeamsTable').DataTable().clear(); + for(var i = 0; i < siteTeams.length; i++){ + $('table#GroupTeamsTable').dataTable().fnAddData(siteTeams[i]); + } + fetchAllCurrentUsers(2, false, [], [], false, [], false); + }else if(content === null) { + $('div.modal.fade').modal('hide'); + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + $('#newGroupTeamModal').modal('hide'); + }; + + $('div.modal.fade').modal('hide'); + showPreloader(); + AJAX_CALL_POST(theData, callBack); +} + +function DeleteSiteTeamsForTheCurrentGroup(teamID){ + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("fetchAllSiteTeamsForTheCurrentGroup", true, theData); + theData = dataToBeSendViaAJAX("modeSiteTeams", SITE_TEAMS_TABLE_DELETE_GROUP, theData); + theData = dataToBeSendViaAJAX("siteTeamID", teamID, theData); + + var callBack = function(data){ + var content= JSON.parse(data); + var siteTeams = []; + siteTeams = content.siteTeams; + + if(!$.isEmptyObject(content) && content !== null){ + var teams = []; + for(var i = 0; i < siteTeams.length; i++){ + siteTeams[i] = new siteTeamsObjectForDataTable( + '', + siteTeams[i].Name, + siteTeams[i].TeamID, + siteTeams[i].Description, + siteTeams[i].NumberOfUsers, + siteTeams[i].CreationDate, + siteTeams[i].LastModificationDate, + siteTeams[i].CreatorName, + siteTeams[i].siteTeamUsers, + siteTeams[i].CreationDateObject, + siteTeams[i].LastModificationDateObject + ); + teams.push(siteTeams[i].Name); + siteTeams[i].siteTeamUsers = formatSiteTeamUsers(siteTeams[i].siteTeamUsers); + siteTeams[i] = surroundObjectPropWithDiv(siteTeams[i]); + } + teamEditedOrDeleted(teams); + + if(siteTeams.length!== 0){ + $('table#GroupTeamsTable').DataTable().clear(); + } else { + $('table#GroupTeamsTable').DataTable().clear().draw(); + } + + for(var i = 0; i < siteTeams.length; i++){ + $('table#GroupTeamsTable').dataTable().fnAddData(siteTeams[i]); + } + $('#groupTeamsTableToolbarContainer').animate({height:'hide'}); + $('#groupTeamsTableToolbarContainer').removeClass('opened'); + + fetchAllCurrentUsers(2, false, [], [], false, [], false); + }else if(content === null) { + $('div.modal.fade').modal('hide'); + hidePreloader(); + $('#usersManagementPortletContainer #InternalServerErrorModal').modal('show'); + } + $('#deleteGroupTeamModal').modal('hide'); + }; + + showPreloader(); + AJAX_CALL_POST(theData, callBack); +} + +function fetchUserRequestRejectionEmailSubject() { + var theData = dataToBeSendViaAJAX("groupId", theGroupId); + theData = dataToBeSendViaAJAX("userRequestRejectionEmailSubject", true, theData); + + var callback = function(data){ + var objectFromJSON = JSON.parse(data); + rejectRequestEmailSubject = objectFromJSON.userRequestRejectionEmailSubject; + userRequestRejectionEmailAdminsMailsCC = eval(objectFromJSON.userRequestRejectionEmailAdminsMailsCC); + $('.emailSubject').text(rejectRequestEmailSubject); + + $('textarea#BCCAdminsEmails').textext()[0].tags().addTags( + userRequestRejectionEmailAdminsMailsCC); + }; + + AJAX_CALL_POST(theData, callback); +} + +function fetchRolesInitial() { + var theData = dataToBeSendViaAJAX("rolesInitial", true, theData); + + var callback = function(data){ + theList = JSON.parse(data).roleNames; + fetchTeamsInitial(); + }; + + AJAX_CALL_POST(theData, callback); +} + +function fetchTeamsInitial() { + var theData = dataToBeSendViaAJAX("teamsInitial", true, theData); + + var callback = function(data){ + teamList = JSON.parse(data).teamNames; + $.each(teamList, function(index, value){ + teamList[index] = value.replace("'", "'"); + }); + + tagEvents(theList, teamList); + + tableEvents(); + fetchUserRequestRejectionEmailSubject(); + + hidePreloader(); + }; + + AJAX_CALL_POST(theData, callback); +} \ No newline at end of file diff --git a/src/main/webapp/js/bootstrap.min.js b/src/main/webapp/js/bootstrap.min.js new file mode 100644 index 0000000..848258d --- /dev/null +++ b/src/main/webapp/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! +* Bootstrap.js by @fat & @mdo +* Copyright 2013 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('