You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by wo...@apache.org on 2010/04/13 14:04:00 UTC

svn commit: r933571 [1/4] - in /portals/jetspeed-2/applications/j2-admin/trunk/src/main: java/org/apache/jetspeed/portlets/security/ webapp/WEB-INF/ webapp/WEB-INF/view/security/ webapp/css/ webapp/css/yui2/ webapp/javascript/yui2/

Author: woonsan
Date: Tue Apr 13 12:04:00 2010
New Revision: 933571

URL: http://svn.apache.org/viewvc?rev=933571&view=rev
Log:
JS2-1186: Committing the patch provided by Joachim Müller. Thanks a lot!

Added:
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java   (with props)
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp   (with props)
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css   (with props)
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt   (with props)
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/yui2-jetspeed.css   (with props)
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/javascript/yui2/
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/javascript/yui2/VERSION.txt   (with props)
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/javascript/yui2/yui2-jetspeed.js   (with props)
Modified:
    portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/portlet.xml

Added: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java?rev=933571&view=auto
==============================================================================
--- portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java (added)
+++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java Tue Apr 13 12:04:00 2010
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.portlets.security;
+
+import java.io.IOException;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.MimeResponse;
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletContext;
+import javax.portlet.PortletException;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+
+import org.apache.jetspeed.CommonPortletServices;
+import org.apache.jetspeed.JetspeedActions;
+import org.apache.jetspeed.om.page.ContentPage;
+import org.apache.jetspeed.portlet.HeaderPhaseSupportConstants;
+import org.apache.jetspeed.request.RequestContext;
+import org.apache.jetspeed.security.UserManager;
+import org.apache.portals.bridges.common.GenericServletPortlet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Element;
+
+/**
+ * Jetspeed Usermamagement Portlet
+ * 
+ * @author <a href="mailto:joachim@wemove.com">Joachim Mueller</a>
+ */
+public class JetspeedUserManagement2Portlet extends GenericServletPortlet {
+	static Logger log = LoggerFactory.getLogger(JetspeedUserManagement2Portlet.class);
+
+	protected UserManager userManager;
+	protected String yuiScriptPath = "/javascript/yui/build/yui/yui-min.js";
+
+	public void init(PortletConfig config) throws PortletException {
+		super.init(config);
+
+		PortletContext context = getPortletContext();
+
+		userManager = (UserManager) context.getAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT);
+
+		if (userManager == null) {
+			throw new PortletException("Failed to find the User Manager Component on portlet initialization");
+		}
+
+		String param = config.getInitParameter("yuiScriptPath");
+
+		if (param != null) {
+			yuiScriptPath = param;
+		}
+	}
+
+	@Override
+	protected void doHeaders(RenderRequest request, RenderResponse response) {
+		super.doHeaders(request, response);
+		RequestContext rc = (RequestContext) request.getAttribute(RequestContext.REQUEST_PORTALENV);
+		addJavaScript(response, rc.getRequest().getContextPath() + yuiScriptPath,
+				HeaderPhaseSupportConstants.HEAD_ELEMENT_CONTRIBUTION_ELEMENT_ID_YUI_LIBRARY_INCLUDE);
+
+		
+		addJavaScript(response, request.getContextPath() + "/javascript/yui2/yui2-jetspeed.js", null);
+		addStyleLink(response, request.getContextPath() + "/css/yui2/yui2-jetspeed.css", null);
+		addStyleLink(response, request.getContextPath() + "/css/security-usermanager2.css", null);
+
+	}
+
+	@Override
+	public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
+
+		boolean hasEditAccess = false;
+
+		try {
+			RequestContext requestContext = (RequestContext) request.getAttribute(RequestContext.REQUEST_PORTALENV);
+			ContentPage contentPage = requestContext.getPage();
+			contentPage.checkAccess(JetspeedActions.EDIT);
+			hasEditAccess = true;
+		} catch (Exception ignore) {
+		}
+
+		request.setAttribute("editAccess", hasEditAccess ? Boolean.TRUE : Boolean.FALSE);
+
+		super.doView(request, response);
+	}
+
+	@Override
+	public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException,
+			IOException {
+		// nothing todo at the moment, everything is done by a REST service
+	}
+
+	private void addJavaScript(RenderResponse response, String scriptPath, String scriptId) {
+		Element headElem = response.createElement("script");
+		headElem.setAttribute("language", "javascript");
+		if (scriptId != null) {
+			headElem.setAttribute("id", scriptId);
+		}
+		headElem.setAttribute("src", scriptPath);
+		headElem.setAttribute("type", "text/javascript");
+		response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, headElem);
+	}
+
+	private void addStyleLink(RenderResponse response, String cssPath, String cssId) {
+		Element headElem = response.createElement("link");
+		headElem.setAttribute("rel", "stylesheet");
+		if (cssId != null) {
+			headElem.setAttribute("id", cssId);
+		}
+		headElem.setAttribute("href", cssPath);
+		headElem.setAttribute("type", "text/css");
+		response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, headElem);
+	}
+
+}

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/security/JetspeedUserManagement2Portlet.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/portlet.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/portlet.xml?rev=933571&r1=933570&r2=933571&view=diff
==============================================================================
--- portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/portlet.xml (original)
+++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/portlet.xml Tue Apr 13 12:04:00 2010
@@ -2506,6 +2506,32 @@
       <keywords>admin,breadcrumb,menu,nav</keywords>                        
     </portlet-info>
   </portlet>
+  
+  <portlet id="JetspeedAjaxUserManager">
+    <description>Jetspeed Ajax User Manager, supporting paging.</description>
+    <portlet-name>JetspeedAjaxUserManager</portlet-name>
+    <display-name>Jetspeed Ajax User Manager</display-name>
+    <portlet-class>org.apache.jetspeed.portlets.security.JetspeedUserManagement2Portlet</portlet-class>
+    <init-param>
+      <name>ViewPage</name>
+      <value>/WEB-INF/view/security/usermanager2.jsp</value>
+    </init-param>
+    <init-param>
+      <name>portlet-icon</name>
+      <value>linux.png</value>
+    </init-param>                        
+    <expiration-cache>0</expiration-cache>
+    <supports>
+      <mime-type>text/html</mime-type>
+      <portlet-mode>VIEW</portlet-mode>
+    </supports>
+    <supported-locale>en</supported-locale>
+    <portlet-info>
+      <title>Jetspeed Ajax User Manager</title>
+      <short-title>Ajax User Manager</short-title>
+      <keywords>admin,user,ajax,paging,portlet</keywords>                        
+    </portlet-info>
+  </portlet>  
       
   <portlet>
     <description>Portal DynamicPage enabled content portlet that displays content of another website inside the portal without using frames. All links are rewritten back to the portal to attempt to proxy all content through the portal.</description>        

Added: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp?rev=933571&view=auto
==============================================================================
--- portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp (added)
+++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp Tue Apr 13 12:04:00 2010
@@ -0,0 +1,783 @@
+<%--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+--%>
+<%@ page contentType="text/html" %>
+<%@ page import="org.apache.jetspeed.request.RequestContext"%>
+<%@ page import="org.apache.jetspeed.security.UserResultList"%>
+<%@ page import="org.apache.jetspeed.security.User"%>
+
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
+
+<portlet:defineObjects/>
+<c_rt:set var="requestContext" value="<%=request.getAttribute(RequestContext.REQUEST_PORTALENV)%>"/>
+<c:set var="portalContextPrefix" value="${requestContext.request.contextPath}"/>
+<c:set var="portalContextPath" value="${requestContext.request.contextPath}"/>
+<c:set var="portalPagePath" value="${requestContext.portalURL.path}"/>
+<c:if test="${empty portalPagePath}">
+  <c:set var="portalPagePath" value="/"/>
+</c:if>
+
+<div id="searchPage">
+	<span>FIND USERS</span>
+	<div class="search-form">
+		<div id="constraints">
+			<div id="constraint" style="clear:both;">
+				<select id="constraintKey" style="float:left;width:214px" class="portlet-form-field-label">
+					<option value="user">user</option>
+					<option value="hasRole">has role</option>
+					<option value="hasGroup">has group</option>
+					<option disabled="true" value="">---</option>
+					<option value="attribute_user.name.given">first name</option>
+					<option value="attribute_user.name.family">last name</option>
+					<option value="attribute_user.email">email</option>
+				</select>
+				<div style="float:left;margin-left:1em;width:214px;padding-bottom:0.5em;"> 
+					<input id="constraintValue0" type="text" class="portlet-form-field-label" style="font-family:verdana;width:100%"> 
+				</div><br/>
+			</div>
+		</div>	
+	</div><br/>
+	<div id="filterActionContainer" style="clear:both;width:655px;margin-top:10px; text-align:right">
+		<div style="float:left">
+			<a id="actionAddConstraint" style="font-family:verdana;" href="#">Add more constraints...</a>
+		</div>
+		<div style="">
+			<input id="actionFindUser" type="button" value="Find" />
+		</div><br/>
+	</div>
+	<hr style="clear:both" align="left" class="hr2"/>
+	<div class="yui-skin-sam" style="margin-bottom:20px">
+		<div id="searchResult" style="width:655px;"></div>
+	</div>
+	<div style="width:655px;text-align:right">
+		<input id="actionNewUser" type="button" value="New User" />
+	</div>
+</div>
+
+<div id="editUserPage" class="hidden-node">
+	<span><a id="actionEditUserBack" href="#">FIND USER</a> | EDIT USER</span>
+	<div class="yui-skin-sam">
+	<div id="user-properties" class="yui-navset" style="width:665px;">
+		<form id="editUserForm">
+		<div id="editUserError" class="portlet-msg-error hidden-node"></div>
+		
+		<%-- overwrite jetspeed defined margin style here for <ul> element --%>
+		<ul class="yui-nav" style="margin:0">
+			<li class="selected"><a href="#tab1"><em>USER</em></a></li>
+			<li><a href="#tab2"><em>ROLES</em></a></li>
+			<li><a href="#tab3"><em>GROUPS</em></a></li>
+
+		</ul>            
+		<div style="margin-bottom:20px" class="yui-content">
+			<div>
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em">User Name*</div>
+					<div style="float:left;width:214px;padding-bottom:1em;"> 
+						<input id="inputUserName" name="name" disabled="true" type="text" value="admin" style="width:100%;"/> 
+						<input id="inputUserNameHidden" name="name" type="hidden" value="admin" style="width:100%;"/> 
+					</div>
+				</div>	
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em"><label for="password">Password*</label></div>
+					<div style="float:left;width:214px;padding-bottom:1em;"> 
+						<input id="password" name="password" type="password" style="width:100%"/> 
+					</div>
+				</div>	
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em">Password (confirm)*</div>
+					<div style="float:left;width:214px;padding-bottom:1em;"> 
+						<input id="passwordConfirm" name="password_confirm" type="password" style="width:100%"/>
+						<p class="portlet-form-field">Please confirm the password.</p> 
+					</div>
+				</div>
+
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em"><label for="credentialUpdateRequired">Need to change password on login</label></div>
+					<div style="float:left;width:214px;padding-bottom:1em;">
+						<input id="credentialUpdateRequired" name="credential_update_required" value="true" type="checkbox" style=""/> 
+					</div>
+				</div>
+
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em">First Name</div>
+					<div style="float:left;width:214px;padding-bottom:1em;"> 
+						<input id="inputUserNameGiven" name="user_name_given" type="text" style="width:100%"/> 
+					</div>
+				</div>
+
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em">Last Name</div>
+					<div style="float:left;width:214px;padding-bottom:1em;"> 
+						<input id="inputUserNameFamily" name="user_name_family" type="text" style="width:100%"/> 
+					</div>
+				</div>
+
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em">Email</div>
+					<div style="float:left;width:214px;padding-bottom:1em;"> 
+						<input id="inputUserEmail" name="user_email" type="text" style="width:100%"/> 
+					</div><br />
+				</div>
+
+				<div style="clear:both">
+					<div style="float:left;margin-left:20px;margin-right:20px;width:20em"><label for="userEnabled">Enabled</label></div>
+					<div style="float:left;width:214px;">
+						<input id="userEnabled" name="user_enabled" value="true" type="checkbox" style=""/> 
+					</div>
+				</div>
+			</div>
+			<div>
+				<div>
+					<div style="float:left;margin-left:20px">
+						<label for="availableRoles">Available Roles</label><br/>
+						<select id="availableRoles" name="top5" size="10" multiple="multiple" style="width:20em;margin-top:2px">
+						</select>
+					</div>
+					<div style="float:left;margin-left:20px;margin-right:20px;padding-top:60px">
+						<input id="actionAssignRoles" type="button" name="toRight" value="&gt;"/><br />
+						<input id="actionRemoveRoles" type="button" name="toLeft" value="&lt;" style="margin-top:5px"/>
+					</div>
+					<div style="float:left">
+						<label for="assignedRoles" style="">Assigned Roles</label><br/>
+						<select id="assignedRoles" name="roles" size="10" multiple="multiple" style="width:20em;margin-top:2px">
+						</select>
+					</div>
+				</div>
+			</div>
+			<div>
+				<div>
+					<div style="float:left;margin-left:20px">
+						<label for="availableGroups" style="">Available Groups</label><br/>
+						<select id="availableGroups" name="top5" size="10" multiple="multiple" style="width:20em;margin-top:2px">
+						</select>
+					</div>
+					<div style="float:left;margin-left:20px;margin-right:20px;padding-top:3em">
+						<input id="actionAssignGroups" type="button" name="toRight" value="&gt;"/><br />
+						<input id="actionRemoveGroups" type="button" name="toLeft" value="&lt;" style="margin-top:5px"//>
+					</div>
+					<div style="float:left">
+						<label for="assignedGroups" style="">Assigned Groups</label><br/>
+						<select id="assignedGroups" name="groups" size="10" multiple="multiple" style="width:20em;margin-top:2px">
+						</select>
+					</div>
+				</div>
+			</div>
+		</div>
+		</form>
+	</div>
+	</div>
+	<div style="clear:both; width:665px; text-align:right">
+		<input id="actionUpdateUser" type="button" value="Update"/>
+		<input id="actionDeleteUser" style="margin-right:10px" type="button" value="Remove"/>
+	</div>
+</div>
+
+<div id="newUserPage" class="hidden-node">
+	<span><a id="actionNewUserBack" href="#">FIND USER</a> | NEW USER</span>
+	<div class="yui-skin-sam">
+	<div id="user-properties" class="yui-navset" style="width:665px;">
+		<form id="newUserForm">
+		<div id="newUserError" class="portlet-msg-error hidden-node"></div>
+		<div>
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em">User Name*</div>
+				<div style="float:left;width:214px;padding-bottom:1em;"> 
+					<input id="inputUserName" name="name" type="text" style="width:100%;"/> 
+				</div>
+			</div>	
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em"><label for="password">Password*</label></div>
+				<div style="float:left;width:214px;padding-bottom:1em;"> 
+					<input id="password" name="password" type="password" style="width:100%"/> 
+				</div>
+			</div>	
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em">Password (confirm)*</div>
+				<div style="float:left;width:214px;padding-bottom:1em;"> 
+					<input id="passwordConfirm" name="password_confirm" type="password" style="width:100%"/>
+					<p class="portlet-form-field">Please confirm the password.</p> 
+				</div>
+			</div>
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em"><label for="credentialUpdateRequired">Need to change password on login</label></div>
+				<div style="float:left;width:214px;padding-bottom:1em;">
+					<input id="credentialUpdateRequired" name="credential_update_required" value="true" type="checkbox" style=""/> 
+				</div>
+			</div>
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em">First Name</div>
+				<div style="float:left;width:214px;padding-bottom:1em;"> 
+					<input id="inputUserNameGiven" name="user_name_given" type="text" style="width:100%"/> 
+				</div>
+			</div>
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em">Last Name</div>
+				<div style="float:left;width:214px;padding-bottom:1em;"> 
+					<input id="inputUserNameFamily" name="user_name_family" type="text" style="width:100%"/> 
+				</div>
+			</div>
+			<div style="clear:both">
+				<div style="float:left;margin-left:20px;margin-right:20px;width:20em">Email</div>
+				<div style="float:left;width:214px;padding-bottom:1em;"> 
+					<input id="inputUserEmail" name="user_email" type="text" style="width:100%"/> 
+				</div><br />
+			</div>
+		</div>
+		</form>
+	</div>
+	</div>
+	<div style="clear:both; width:665px; text-align:right">
+		<input id="actionCreateUser" type="button" value="Save"/>
+	</div>
+</div>
+
+
+<script type="text/javascript">
+
+var constraintUIId = 1;
+
+YUI({combine: true, timeout: 10000}).use('io', 'node', 'json', 'collection', function(Y) {
+
+    YAHOO.widget.Logger.enableBrowserConsole();
+	
+	
+    <%--// convenient method to create a new constraint in the find user filter dialog --%> 
+    var getConstraint = function(id) {
+		return '<div id="constraint" style="clear:both">'+
+					'<select id="constraintKey" style="float:left;width:214px" class="portlet-form-field-label">'+
+						'<option value="user">user</option>'+
+						'<option value="hasRole">has role</option>'+
+						'<option value="hasGroup">has group</option>'+
+						'<option disabled="true" value="">---</option>'+
+						'<option value="attribute_user.name.given">first name</option>'+
+						'<option value="attribute_user.name.family">last name</option>'+
+						'<option value="attribute_user.email">email</option>'+
+					'</select>'+
+					'<div style="float:left;margin-left:1em;width:214px;padding-bottom:0.5em"> '+
+						'<input id="constraintValue'+id+'" type="text" class="portlet-form-field-label" style="font-family:verdana;width:100%"> '+
+					'</div>'+
+					'<div style="float:left;margin-left:1em;width:150px;padding-bottom:0.5em;padding-top:2px"> '+
+						'<a id="actionRemoveConstraint'+id+'" href="#" style="font-family:verdana;width:100%">remove</a> '+
+					'</div><br/>'+
+				'</div>';
+    }
+    
+    <%--//  add a constraint line in the find user filter dialog --%> 
+	var addConstraint = function(e) {
+        var node = Y.one('#constraints');
+        node.append(getConstraint(constraintUIId));  // added as lastChild
+		node.get('lastChild').one('#actionRemoveConstraint'+constraintUIId).on('click', removeConstraint);
+		constraintUIId++;
+    };
+    
+	<%--//  remove a constraint line in the find user filter dialog --%>
+	var removeConstraint = function(e) {
+		var node = e.currentTarget.get('parentNode').get('parentNode');
+		node.remove();
+    };
+
+	<%--//  transform the constraints into a query, fire it and display the results --%>
+	var actionFindUser = function(e) {
+        var node = Y.one('#constraints');
+        var constraintNodes = node.all('#constraint');
+        UserResultTable.settings.userName = '';
+        UserResultTable.settings.roles = [];
+        UserResultTable.settings.groups = [];
+        UserResultTable.settings.attributeKeys = [];
+        UserResultTable.settings.attributeValues = [];
+        for (var i=0; i<constraintNodes.size(); i++) {
+        	var cNode = constraintNodes.item(i);
+        	var keyNode = cNode.one('#constraintKey')._node;
+        	var key = keyNode.options[keyNode.selectedIndex].value;
+        	var value = cNode.one('#constraintValue'+i).get('value');
+        	if (key == 'user') {
+        		UserResultTable.settings.userName = value;
+        	} else if (key == 'hasRole') {
+        		UserResultTable.settings.roles.push(value);
+        	} else if (key == 'hasGroup') {
+        		UserResultTable.settings.groups.push(value);
+        	} else {
+        		if (key.indexOf('attribute_') == 0) {
+	        		UserResultTable.settings.attributeKeys.push(key.substr(key.indexOf('_')+1));
+	        		UserResultTable.settings.attributeValues.push(value);
+        		}
+        	}
+        }
+        UserResultTable.fireQuery();
+    };
+    
+	<%--//  edit a user, get the data from the server --%>
+    var actionEditUser = function(userName) {
+    	var node = Y.one('#editUserPage');
+    	node.toggleClass('hidden-node');
+    	var node = Y.one('#searchPage');
+    	node.toggleClass('hidden-node');
+		var node = Y.one('#editUserError');
+		if (!node.hasClass('hidden-node')) {
+			node.toggleClass('hidden-node');
+		}
+    	var uri = "${portalContextPrefix}/services/usermanager/users/"+userName+"/?_type=json";
+    	var request = Y.io(uri, { on: { complete: onGetUserByNameComplete } });
+    }
+    
+    <%--// callback for getting a users detail data, display it --%>
+    var onGetUserByNameComplete = function(id, o, args) {
+        var id = id;
+        var data = o.responseText;
+        var dataOut = null;
+
+        try {
+			Y.log(data);
+            dataOut = Y.JSON.parse(data);
+            if (!dataOut) {
+                Y.log("Error: no data found.");
+                return;
+            }
+        } catch (e) {
+            Y.log("Error: " + e.message);
+            return;
+        }
+        Y.one('#inputUserName').set('value', dataOut.name);
+        Y.one('#inputUserNameHidden').set('value', dataOut.name);
+        Y.one('#inputUserNameGiven').set('value', dataOut.infoMap["user.name.given"]);
+        Y.one('#inputUserNameFamily').set('value', dataOut.infoMap["user.name.family"]);
+        Y.one('#inputUserEmail').set('value', dataOut.infoMap["user.email"]);
+        Y.one('#userEnabled').set('checked', dataOut.enabled);
+        Y.one('#credentialUpdateRequired').set('checked', dataOut.credentialUpdateRequired);
+		Y.one('#editUserPage * #password').set('value', '');
+        Y.one('#editUserPage * #passwordConfirm').set('value', '');
+        
+        var availableRoles = Y.one('#availableRoles')
+        availableRoles.get('children').remove();
+        if (dataOut.availableRoles) {
+	        for (var i=0; i<dataOut.availableRoles.length; i++) {
+	        	availableRoles.appendChild(new Option(dataOut.availableRoles[i], dataOut.availableRoles[i]));
+	        }
+	    }
+        var assignedRoles = Y.one('#assignedRoles')
+        assignedRoles.get('children').remove();
+        if (dataOut.roles) {
+	        for (var i=0; i<dataOut.roles.length; i++) {
+	        	assignedRoles.appendChild(new Option(dataOut.roles[i], dataOut.roles[i]));
+	        }
+		}
+        var availableGroups = Y.one('#availableGroups')
+        availableGroups.get('children').remove();
+        if (dataOut.availableGroups) {
+	        for (var i=0; i<dataOut.availableGroups.length; i++) {
+	        	availableGroups.appendChild(new Option(dataOut.availableGroups[i], dataOut.availableGroups[i]));
+	        }
+	    }
+        var assignedGroups = Y.one('#assignedGroups')
+        assignedGroups.get('children').remove();
+        if (dataOut.groups) {
+	        for (var i=0; i<dataOut.groups.length; i++) {
+	        	assignedGroups.appendChild(new Option(dataOut.groups[i], dataOut.groups[i]));
+	        }
+	    }
+	    userTabView.selectTab(0);
+        
+    }
+    
+	<%--//  go back to the find user dialog from the edit user page  --%>
+    var actionEditUserBack = function(e) {
+    	var node = Y.one('#editUserPage');
+    	node.toggleClass('hidden-node');
+    	var node = Y.one('#searchPage');
+    	node.toggleClass('hidden-node');
+    }
+    
+	<%--//  PUT user detail data back to the service for updating  --%>
+    var actionUpdateUserDetail = function() {
+		var userName = Y.one('#inputUserNameHidden').get('value');
+		doSelectAll(Y.one('#assignedRoles'));
+		doSelectAll(Y.one('#assignedGroups'));
+		
+		// add form data to request
+		var formObject = document.getElementById('editUserForm');
+		<%--// Since we use the PUT method, we have to add the form data manually.
+		// setForm will only include form data automatically for GET and POST requests --%>
+		var formData = YAHOO.util.Connect.setForm(formObject);
+		var cObj = YAHOO.util.Connect.asyncRequest('POST', '${portalContextPrefix}/services/usermanager/users/'+userName+'/?_type=json', actionUpdateUserDetailDone, formData);
+    }
+    
+	<%--//  callback for updating user data  --%>
+    var actionUpdateUserDetailDone = {
+    	success: function(o) {
+	    	var node = Y.one('#editUserPage');
+	    	node.toggleClass('hidden-node');
+	    	var node = Y.one('#searchPage');
+	    	node.toggleClass('hidden-node');
+			UserResultTable.fireQuery(true);
+
+    	},
+    	failure: function(o) {
+    		Y.log(o);
+    		if (!o.responseText) {
+    			o.responseText = 'Update user failed with unspecified error!';
+    		}
+			var node = Y.one('#editUserError');
+			node.setContent(o.responseText);
+			if (node.hasClass('hidden-node')) {
+				node.toggleClass('hidden-node');
+			}
+    	}
+    }; 
+
+	var actionNewUser = function(e) {
+    	var node = Y.one('#newUserPage');
+    	node.toggleClass('hidden-node');
+    	var node = Y.one('#searchPage');
+    	node.toggleClass('hidden-node');
+    	document.getElementById('newUserForm').reset();
+    	
+	}
+
+	var actionCreateUser = function(e) {
+		// add form data to request
+		var formObject = document.getElementById('newUserForm');
+		YAHOO.util.Connect.setForm(formObject);
+		var cObj = YAHOO.util.Connect.asyncRequest('POST', '${portalContextPrefix}/services/usermanager/users/?_type=json', actionCreateUserDone);
+	}
+
+	<%--//  callback for creating a new user --%>
+    var actionCreateUserDone = {
+    	success: function(o) {
+	    	var node = Y.one('#newUserPage');
+	    	node.toggleClass('hidden-node');
+	    	var node = Y.one('#searchPage');
+	    	node.toggleClass('hidden-node');
+			UserResultTable.fireQuery(true);
+    	},
+    	failure: function(o) {
+    		Y.log(o);
+    		if (!o.responseText) {
+    			o.responseText = 'Create user failed with unspecified error!';
+    		}
+			var node = Y.one('#newUserError');
+			node.setContent(o.responseText);
+			if (node.hasClass('hidden-node')) {
+				node.toggleClass('hidden-node');
+			}
+    	}
+    };
+	<%--//  go back to the find user dialog from the new user page  --%>
+    var actionNewUserBack = function(e) {
+    	var node = Y.one('#newUserPage');
+    	node.toggleClass('hidden-node');
+    	var node = Y.one('#searchPage');
+    	node.toggleClass('hidden-node');
+	};
+
+	var actionDeleteUser = function(e) {
+		var userName = Y.one('#inputUserNameHidden').get('value');
+		var cObj = YAHOO.util.Connect.asyncRequest('DELETE', '${portalContextPrefix}/services/usermanager/users/' + userName + '/?_type=json', actionDeleteUserDone);
+	}
+	
+	<%--//  callback for creating a new user --%>
+    var actionDeleteUserDone = {
+    	success: function(o) {
+	    	var node = Y.one('#editUserPage');
+	    	node.toggleClass('hidden-node');
+	    	var node = Y.one('#searchPage');
+	    	node.toggleClass('hidden-node');
+			UserResultTable.fireQuery(true);
+    	},
+    	failure: function(o) {
+    		Y.log(o);
+    		if (!o.responseText) {
+    			o.responseText = 'Delete user failed with unspecified error!';
+    		}
+			var node = Y.one('#editUserError');
+			node.setContent(o.responseText);
+			if (node.hasClass('hidden-node')) {
+				node.toggleClass('hidden-node');
+			}
+    	}
+    };
+ 	
+
+    Y.one('#actionEditUserBack').on('click', actionEditUserBack);
+    
+    Y.one('#actionAddConstraint').on('click', addConstraint);
+
+    Y.one('#actionFindUser').on('click', actionFindUser);
+
+    Y.one('#actionNewUser').on('click', actionNewUser);
+    
+    Y.one('#actionCreateUser').on('click', actionCreateUser);
+	
+	Y.one('#actionUpdateUser').on('click', actionUpdateUserDetail);
+	
+    Y.one('#actionNewUserBack').on('click', actionNewUserBack);
+    
+    Y.one('#actionDeleteUser').on('click', actionDeleteUser);
+    
+    
+
+	<%--//  define the search results table --%>
+	var UserResultTable,
+		myDataSource,
+		myDataTable;
+	
+	UserResultTable = {
+		
+		settings: {
+			userName: '',
+			roles: [],
+			groups: [],
+			attributeKeys: [],
+			attributeValues: []
+		},
+		
+		init: function () {
+	        var myColumnDefs = [
+	                {key:"userName", label:"User Name", sortable:true, width:200},
+	                {key:"firstName", label:"First Name", width:200},
+	                {key:"lastName", label:"Last Name", width:200}
+            ];
+			var myDataSource = new YAHOO.util.DataSource("${portalContextPrefix}/services/usermanager/users/?_type=json&");
+	        myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
+	        myDataSource.responseSchema = {
+	            resultsList: "records",
+	            fields: [
+	                {key:"userName"},
+	                {key:"firstName"},
+	                {key:"lastName"}
+	            ],
+		        metaFields: {
+		            totalRecords: "totalRecords" // Access to value in the server response
+		        }
+	        };
+			var oConfigs = {
+	                paginator: new YAHOO.widget.Paginator({
+	                    rowsPerPage: 10,
+						template:'{PreviousPageLink} {PageLinks} {NextPageLink} {CurrentPageReport}',
+	                    pageReportTemplate:'{totalRecords} total accounts',
+	                    nextPageLinkLabel:'>>',
+	                    previousPageLinkLabel:'<<',
+	                    alwaysVisible:true
+	                }),
+	                initialRequest: "start=0&results=10",
+	                dynamicData: true, // Enables dynamic server-driven data 
+					selectionMode:"single",
+					// This configuration item is what builds the query string
+    				// passed to the DataSource.
+    				generateRequest: this.requestBuilder					
+	        };
+	        var myDataTable = new YAHOO.widget.DataTable("searchResult", myColumnDefs,
+	                myDataSource, oConfigs);
+	        // Update totalRecords on the fly with value from server
+		    myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {
+		        oPayload.totalRecords = oResponse.meta.totalRecords;
+		        return oPayload;
+		    }
+	        // Subscribe to events for row selection
+	        myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow);
+	        myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow);
+	        myDataTable.subscribe("rowClickEvent", myDataTable.onEventSelectRow);
+	        
+	        myDataTable.subscribe("rowSelectEvent", function() {
+				var data = this.getRecordSet().getRecord(this.getSelectedRows()[0])._oData;
+				actionEditUser(data.userName);
+			});
+			
+			// Store the DataTable and DataSource for use elsewhere in this script.
+    		UserResultTable.myDataSource = myDataSource;
+    		UserResultTable.myDataTable = myDataTable;
+		},
+		/**
+		 * This method is passed into the DataTable's "generateRequest" configuration
+		 * setting overriding the default generateRequest function. This function puts
+		 * together a query string which is passed to the DataSource each time a new
+		 * set of data is requested. All of the custom sorting and filtering options
+		 * added in by this script are gathered up here and inserted into the
+		 * query string.
+		 * @param {Object} oState
+		 * @param {Object} oSelf
+		 * These parameters are explained in detail in DataTable's API
+		 * documentation. It's important to note that oState contains
+		 * a reference to the paginator and the pagination state and
+		 * the column sorting state as well.
+		 */
+		requestBuilder: function (oState, oSelf) {
+			var sort, dir, startIndex, results;
+			var startIndex, results;
+ 
+			oState = oState || {pagination: null, sortedBy: null};
+			sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[0].getKey();
+			dir = (oState.sortedBy && oState.sortedBy.dir === DataTable.CLASS_DESC) ? "desc" : "asc"; 
+			startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0;
+			results = (oState.pagination) ? oState.pagination.rowsPerPage : null;
+ 
+			var resultParams =	"results=" 	+ results +
+					"&start=" 	+ startIndex +
+					"&sort=" 		+ sort +
+					"&dir=" 		+ dir +
+				    "&name=" 	+ UserResultTable.settings.userName +
+				    "&roles=" 		+ UserResultTable.settings.roles.join(',')
+				    + "&groups=" 		+ UserResultTable.settings.groups.join(',');
+				    for (var i=0; i<UserResultTable.settings.attributeKeys.length; i++) {
+				    	resultParams += "&attribute_key=" 	+ UserResultTable.settings.attributeKeys[i];
+				    	resultParams += "&attribute_value=" 	+ UserResultTable.settings.attributeValues[i];
+				    }
+			return resultParams;
+		},
+		/**
+		 * This method is used to fire off a request for new data for the
+		 * DataTable from the DataSource. The new state of the DataTable,
+		 * after the request for new data, will be determined here.
+		 * @param {Boolean} resetRecordOffset
+		 */
+		fireQuery: function (keepPagination) {
+            var oState = UserResultTable.myDataTable.getState(),
+            	request,
+            	oCallback;
+ 
+			if (!keepPagination) {
+				/* reset the recordOffset.*/
+				oState.pagination.recordOffset = 0;
+			}
+ 
+			/* using onDataReturnSetRows because that method
+			will clear out the old data in the DataTable, making way for
+			the new data.*/
+			oCallback = {
+			    success : UserResultTable.myDataTable.onDataReturnSetRows,
+			    failure : UserResultTable.myDataTable.onDataReturnSetRows,
+                argument : oState,
+			    scope : UserResultTable.myDataTable
+			};
+ 
+			// Generate a query string
+            request = UserResultTable.myDataTable.get("generateRequest")(oState, UserResultTable.myDataTable);
+ 
+			// Fire off a request for new data.
+			UserResultTable.myDataSource.sendRequest(request, oCallback);
+    	}
+	};
+	
+	// initialize the results table once.
+	UserResultTable.init();
+
+	/*
+	* USER DETAILS TAB VIEW
+	*/
+
+	var userTabView = new YAHOO.widget.TabView('user-properties');
+	
+    // assign roles to the user, sort them
+    var assignRoles = function(e) {
+        var availableRolesNode = Y.one('#availableRoles');
+		var selectedRoles = getSelectedOptions(availableRolesNode);
+		var assignedRolesNode = Y.one('#assignedRoles');
+		Y.Array.each(selectedRoles, function(selectedRole, idx) {
+										selectedRole.selected = false;
+										assignedRolesNode.appendChild(selectedRole);
+		});
+		sortOptions(assignedRolesNode);
+    };
+
+    // remove roles from a user, sort them
+    var removeRoles = function(e) {
+        var assignedRolesNode = Y.one('#assignedRoles');
+		var selectedRoles = getSelectedOptions(assignedRolesNode);
+		var availableRolesNode = Y.one('#availableRoles');
+		Y.Array.each(selectedRoles, function(selectedRole, idx) {
+										selectedRole.selected = false;
+										availableRolesNode.appendChild(selectedRole);
+		});
+		sortOptions(availableRolesNode);
+    };
+
+    // assign groups for a user, sort them
+    var assignGroups = function(e) {
+        var availableGroupsNode = Y.one('#availableGroups');
+		var selectedGroups = getSelectedOptions(availableGroupsNode);
+		var assignedGroupsNode = Y.one('#assignedGroups');
+		Y.Array.each(selectedGroups, function(selectedGroup, idx) {
+										selectedGroup.selected = false;
+										assignedGroupsNode.appendChild(selectedGroup);
+		});
+		sortOptions(assignedGroupsNode);
+    };
+
+    // remove groups from a user, sort them
+    var removeGroups = function(e) {
+        var assignedGroupsNode = Y.one('#assignedGroups');
+		var selectedGroups = getSelectedOptions(assignedGroupsNode);
+		var availableGroupsNode = Y.one('#availableGroups');
+		Y.Array.each(selectedGroups, function(selectedGroup, idx) {
+										selectedGroup.selected = false;
+										availableGroupsNode.appendChild(selectedGroup);
+		});
+		sortOptions(availableGroupsNode);
+    };
+
+	
+	// convenience method to get all selected options from a list box 
+	function getSelectedOptions(selectBox) {
+		return Y.Array.reduce(
+            Y.NodeList.getDOMNodes(selectBox.get('options')), new Array(),
+				function(list, value) {
+					if (value.selected) {
+						list.push(value);
+					}
+					return list;
+				});
+	};
+	
+	// convenience method to select all options from a list box
+	function doSelectAll(selectBox) {
+		return Y.Array.each(
+            Y.NodeList.getDOMNodes(selectBox.get('options')), 
+				function(option, i) {
+					if (option.selected == false) {
+						option.selected = true;
+					}
+				});
+	};
+	
+	// convenience method to sort options of a select box 
+	function sortOptions(selectBox) {
+		var my_options = Y.NodeList.getDOMNodes(selectBox.get('children'));
+
+		my_options.sort(function(a,b) {
+			if (a.text > b.text) return 1;
+			else if (a.text < b.text) return -1;
+			else return 0
+		});
+		selectBox.get('children').each(function(node, idx) {node.remove()});
+		Y.Array.each(my_options, function(option) {selectBox.append(option)});
+	}
+	
+    // register callbacks to certain elements
+    Y.one('#actionAssignRoles').on('click', assignRoles);
+    Y.one('#actionRemoveRoles').on('click', removeRoles);
+
+    Y.one('#actionAssignGroups').on('click', assignGroups);
+    Y.one('#actionRemoveGroups').on('click', removeGroups);
+	
+});
+
+
+</script>

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/security/usermanager2.jsp
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css?rev=933571&view=auto
==============================================================================
--- portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css (added)
+++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css Tue Apr 13 12:04:00 2010
@@ -0,0 +1,212 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+.yui-skin-sam .yui-dt table { 
+	margin:0;padding:0; 
+	font-family:verdana; 
+	border-collapse:separate;*border-collapse:collapse;border-spacing:0; /* since ie6 and ie7 behave differently */ 
+	border:1px solid #CFCFCF;
+}
+
+.yui-skin-sam .yui-dt th, .yui-skin-sam .yui-dt th a {
+	background:#F2F2F2;
+	border-color:#FFFFFF;
+	text-align:left;
+	font-weight:bold;
+}
+
+.yui-skin-sam .yui-dt tr.yui-dt-first td {
+	border-top:1px solid #FFFFFF;
+}
+
+.yui-skin-sam tr.yui-dt-odd {
+	background-color:#F7F7F7;
+}
+
+.yui-skin-sam tr.yui-dt-odd td.yui-dt-asc, .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc {
+	background-color:#E5ECF2;
+}
+
+.yui-skin-sam tr.yui-dt-even td.yui-dt-asc, .yui-skin-sam tr.yui-dt-even td.yui-dt-desc {
+	background-color:#ECF3F9;
+}
+
+.yui-skin-sam th.yui-dt-highlighted, .yui-skin-sam th.yui-dt-highlighted a {
+	background-color:#E5ECF2;
+}
+
+.yui-skin-sam tr.yui-dt-highlighted, .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc, .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc, .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted, .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
+	background-color:#E5ECF2;
+}
+
+
+.yui-skin-sam th.yui-dt-selected, .yui-skin-sam th.yui-dt-selected a {
+	background-color:#9BBEDE;
+	color:#000000;
+}
+
+.yui-skin-sam tr.yui-dt-selected td, .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc, .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
+	background-color:#9BBEDE;
+	color:#000000;
+}
+
+.yui-skin-sam tr.yui-dt-even td.yui-dt-selected, .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
+	background-color:#9BBEDE;
+	color:#000000;
+}
+
+
+
+.yui-skin-sam .yui-dt td {
+	border-right:1px solid #FFFFFF;
+}
+
+
+/* scrolling */ 
+.yui-skin-sam .yui-dt-scrollable table {border:none;} 
+.yui-skin-sam .yui-dt-scrollable .yui-dt-hd {border-left:1px solid #CFCFCF;border-top:1px solid #CFCFCF;border-right:1px solid #CFCFCF;} 
+.yui-skin-sam .yui-dt-scrollable .yui-dt-bd {border-left:1px solid #CFCFCF;border-bottom:1px solid #CFCFCF;border-right:1px solid #CFCFCF;background-color:#FFF;} 
+.yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td {border-bottom:0px solid #CFCFCF;}	
+	
+#paginated {
+    text-align: center;
+}
+#paginated table {
+    margin-left:auto; margin-right:auto;
+}
+#paginated, #paginated .yui-dt-loading {
+    text-align: center; background-color: transparent;
+}
+
+.yui-skin-sam .yui-pg-page {
+	background-color:#FFFFFF;
+	border:1px solid #FFFFFF;
+	padding:2px 3px;
+	text-decoration:none;
+}
+
+.yui-skin-sam .yui-pg-first, .yui-skin-sam .yui-pg-previous, .yui-skin-sam .yui-pg-next, .yui-skin-sam .yui-pg-last, .yui-skin-sam .yui-pg-current, .yui-skin-sam .yui-pg-pages, .yui-skin-sam .yui-pg-page {
+	display:inline-block;
+	font-family:verdana, arial,helvetica,clean,sans-serif;
+	padding:0px 3px;
+}
+
+.yui-skin-sam .yui-pg-container {
+	display:block;
+	margin:6px 0;
+	white-space:nowrap;
+}	
+
+.yui-skin-sam .yui-dt-paginator {
+	text-align:right;
+}	
+
+#yui-dt0-paginator1 {
+	display:none;
+}
+	
+/* tab view */	
+
+
+.yui-skin-sam .yui-navset .yui-nav, .yui-skin-sam .yui-navset .yui-navset-top .yui-nav {
+	border-color:#ACACAC;
+	border-style:solid;
+	border-width:0 0 1px;
+}
+
+.yui-navset li em {
+	font-family:verdana;
+	font-style:normal;
+}
+
+.yui-skin-sam .yui-navset .yui-nav a, .yui-skin-sam .yui-navset .yui-navset-top .yui-nav a {
+	background:#E5E5E5 repeat-x scroll 0 0;
+	border-color:#ACACAC;
+	border-style:solid;
+	border-width:0 1px;
+	color:#000000;
+	position:relative;
+	text-decoration:none;
+}
+
+.yui-skin-sam .yui-navset .yui-nav a em, .yui-skin-sam .yui-navset .yui-navset-top .yui-nav a em {
+	border-color:#ACACAC;
+	border-style:solid;
+	border-width:1px 0 0;
+	bottom:0;
+	left:0;
+	padding:0.25em 0.75em;
+	position:relative;
+	right:0;
+	top:0;
+}
+
+.yui-skin-sam .yui-navset .yui-nav .selected a, .yui-skin-sam .yui-navset .yui-nav .selected a:focus, .yui-skin-sam .yui-navset .yui-nav .selected a:hover {
+	background:#FFFFFF;
+	color:#000000;
+}
+
+.yui-skin-sam .yui-navset .yui-nav .selected, .yui-skin-sam .yui-navset .yui-navset-top .yui-nav .selected {
+	margin:0 -1px -1px 0;
+}
+.yui-skin-sam .yui-navset .yui-nav .selected a, .yui-skin-sam .yui-navset .yui-nav .selected a em {
+	border-color:#ACACAC;
+}
+
+.yui-skin-sam .yui-navset .yui-nav li, .yui-skin-sam .yui-navset .yui-navset-top .yui-nav li {
+	margin:0 -1px 0 0;
+	padding:1px 0 0;
+}
+
+.yui-skin-sam .yui-navset .yui-content {
+	background:#FFFFFF none repeat scroll 0 0;
+}
+
+.yui-skin-sam .yui-navset .yui-content, .yui-skin-sam .yui-navset .yui-navset-top .yui-content {
+	border-color:#FFFFFF #ACACAC #ACACAC;
+	border-style:solid;
+	border-width: 0px 1px 1px 1px;
+	padding:2em 0.5em;
+}	
+	
+.form-select {
+    width:214px;
+	padding-top:2px;
+	padding-bottom:2px;
+	font-family:verdana,arial,helvetica,clean,sans-serif;
+}
+
+h1 {
+	margin-bottom: 25px;
+	font-family:verdana;font-size:1em;
+}
+
+hr.hr2 {
+	background-color:#E5E5E5;
+	color:#E5E5E5;
+	height:1px;
+}
+hr {
+	border:0 none;
+	margin-bottom:25px;
+	margin-top:6px;
+	text-align:left;
+	width:665px;
+}
+
+.hidden-node {display:none;}
+	

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/security-usermanager2.css
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt?rev=933571&view=auto
==============================================================================
--- portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt (added)
+++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt Tue Apr 13 12:04:00 2010
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+yui-release-2.8.0r4
+
+customized css obtained from:
+http://yui.yahooapis.com/combo?2.8.0r4/build/fonts/fonts-min.css&2.8.0r4/build/assets/skins/sam/skin.css
+
+skin.css includes styles for
+- TabView Control
+- DataTable Control
+- Paginator
\ No newline at end of file

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/css/yui2/VERSION.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org