← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 4788: Beneficiary attribute group - Applied dhisAjaxSelect plugin into this.

 

------------------------------------------------------------
revno: 4788
committer: Hieu <hieu.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Sun 2011-10-02 16:53:57 +0700
message:
  Beneficiary attribute group - Applied dhisAjaxSelect plugin into this.
  Code style fixed and renamed action by typing error.
removed:
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithdoutGroupAction.java
added:
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithoutGroupAction.java
modified:
  dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/validationRules.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/addPatientAttributeGroupForm.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/javascript/patientAttributeGroup.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/updatePatientAttibuteGroupForm.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/validationRules.js'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/validationRules.js	2011-10-01 09:05:47 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/validationRules.js	2011-10-02 09:53:57 +0000
@@ -415,5 +415,15 @@
 		"name" : {
 			"required": true
 		}
+	},
+	"patientAttributeGroup" : {
+		"name" : {
+			"required" : true,
+			"rangelength" : [ 2,160 ]
+		},
+		"description" : {
+			"required" : true,
+			"rangelength" : [ 2, 255 ]
+		}
 	}
 };

=== removed file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithdoutGroupAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithdoutGroupAction.java	2011-03-31 01:42:05 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithdoutGroupAction.java	1970-01-01 00:00:00 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2004-2010, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice, this
- *   list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of the HISP project nor the names of its contributors may
- *   be used to endorse or promote products derived from this software without
- *   specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.hisp.dhis.patient.action.patientattribute;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.hisp.dhis.patient.PatientAttribute;
-import org.hisp.dhis.patient.PatientAttributeService;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author Chau Thu Tran
- *
- * @version GetPatientAttributesWithdoutGroupAction.java Sep 27, 2010 4:55:01 PM
- */
-public class GetPatientAttributesWithdoutGroupAction 
-    implements Action
-{   
-    // -------------------------------------------------------------------------
-    // Dependency
-    // -------------------------------------------------------------------------
-
-    private PatientAttributeService patientAttributeService;
-
-    public void setPatientAttributeService( PatientAttributeService patientAttributeService )
-    {
-        this.patientAttributeService = patientAttributeService;
-    }
-
-    // -------------------------------------------------------------------------
-    // Output
-    // -------------------------------------------------------------------------
-
-    private Collection<PatientAttribute> patientAttributes = new ArrayList<PatientAttribute>();
-
-    public Collection<PatientAttribute> getPatientAttributes()
-    {
-        return patientAttributes;
-    }
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-        throws Exception
-    {
-        patientAttributes = patientAttributeService.getPatientAttributesNotGroup();
-
-        return SUCCESS;
-    }
-
-}

=== added file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithoutGroupAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithoutGroupAction.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/patientattribute/GetPatientAttributesWithoutGroupAction.java	2011-10-02 09:53:57 +0000
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2004-2010, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this
+ *   list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of the HISP project nor the names of its contributors may
+ *   be used to endorse or promote products derived from this software without
+ *   specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.hisp.dhis.patient.action.patientattribute;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.hisp.dhis.patient.PatientAttribute;
+import org.hisp.dhis.patient.PatientAttributeService;
+
+import com.opensymphony.xwork2.Action;
+
+/**
+ * @author Chau Thu Tran
+ *
+ * @version GetPatientAttributesWithoutGroupAction.java Sep 27, 2010 4:55:01 PM
+ */
+public class GetPatientAttributesWithoutGroupAction 
+    implements Action
+{   
+    // -------------------------------------------------------------------------
+    // Dependency
+    // -------------------------------------------------------------------------
+
+    private PatientAttributeService patientAttributeService;
+
+    public void setPatientAttributeService( PatientAttributeService patientAttributeService )
+    {
+        this.patientAttributeService = patientAttributeService;
+    }
+
+    // -------------------------------------------------------------------------
+    // Output
+    // -------------------------------------------------------------------------
+
+    private Collection<PatientAttribute> patientAttributes = new ArrayList<PatientAttribute>();
+
+    public Collection<PatientAttribute> getPatientAttributes()
+    {
+        return patientAttributes;
+    }
+
+    // -------------------------------------------------------------------------
+    // Action implementation
+    // -------------------------------------------------------------------------
+
+    public String execute()
+        throws Exception
+    {
+        patientAttributes = patientAttributeService.getPatientAttributesNotGroup();
+
+        return SUCCESS;
+    }
+
+}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml	2011-09-14 06:36:13 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml	2011-10-02 09:53:57 +0000
@@ -125,8 +125,8 @@
 	</bean>
 
 	<bean
-		id="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributesWithdoutGroupAction"
-		class="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributesWithdoutGroupAction"
+		id="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributesWithoutGroupAction"
+		class="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributesWithoutGroupAction"
 		scope="prototype">
 		<property name="patientAttributeService"
 			ref="org.hisp.dhis.patient.PatientAttributeService" />

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/struts.xml	2011-09-28 07:48:12 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/struts.xml	2011-10-02 09:53:57 +0000
@@ -98,6 +98,20 @@
 			<param name="onExceptionReturn">plainTextError</param>
 		</action>
 
+		<action name="getPatientAttributes"
+			class="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributeListAction">
+			<result name="success" type="velocity-json">
+				/dhis-web-commons/ajax/jsonPatientAttributes.vm</result>
+			<param name="onExceptionReturn">plainTextError</param>
+		</action>
+		
+		<action name="getProgramAttributeWithoutGroup"
+			class="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributesWithoutGroupAction">
+			<result name="success" type="velocity-json">
+				/dhis-web-commons/ajax/jsonPatientAttributes.vm</result>
+			<param name="onExceptionReturn">plainTextError</param>
+		</action>
+
 		<action name="removePatientAttribute"
 			class="org.hisp.dhis.patient.action.patientattribute.RemovePatientAttributeAction">
 			<result name="success" type="velocity-json">
@@ -513,7 +527,7 @@
 		</action>
 
 		<action name="showAddPatientAttributeGroupForm"
-			class="org.hisp.dhis.patient.action.patientattribute.GetPatientAttributesWithdoutGroupAction">
+			class="org.hisp.dhis.patient.action.NoAction">
 			<result name="success" type="velocity">/main.vm</result>
 			<param name="page">/dhis-web-maintenance-patient/addPatientAttributeGroupForm.vm</param>
 			<param name="menu">/dhis-web-maintenance-patient/patientAndProgramMenu.vm</param>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/addPatientAttributeGroupForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/addPatientAttributeGroupForm.vm	2011-09-29 04:17:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/addPatientAttributeGroupForm.vm	2011-10-02 09:53:57 +0000
@@ -5,14 +5,30 @@
 		
 		jQuery('name').focus();
 		
-		validation( 'addPatientAttributeGroupForm', function(form){
+		validation2( 'addPatientAttributeGroupForm', function(form){
 			form.submit();
-		}, function()
-		{
-			beforeSubmit();
-		}); 
-		
-		checkValueIsExist( "name", "validatePatientAttributeGroup.action");			
+		}, {
+			'beforeValidateHandler' : function()
+			{
+				listValidator( 'memberValidator', 'selectedAttributes' );
+			},
+			'rules' : getValidationRules( 'patientAttributeGroup' )
+		} ); 
+		
+		checkValueIsExist( "name", "validatePatientAttributeGroup.action" );
+		
+		jQuery("#availableAttributes").dhisAjaxSelect({
+			source: 'getProgramAttributeWithoutGroup.action',
+			iterator: 'patientAttributes',
+			connectedTo: 'selectedAttributes',
+			handler: function(item){
+				var option = jQuery( "<option/>" );
+				option.attr( "value", item.id );
+				option.text( item.name );
+				
+				return option;
+			}
+		});
 	});		
 </script>
 	
@@ -21,57 +37,51 @@
 <form id="addPatientAttributeGroupForm" action="addPatientAttributeGroup.action" method="post" >
 
 <table>
-    <tr>
-      <th colspan="4">$i18n.getString( "patient_attribute_group_deltails" ) </th>
-    </tr>
-    <tr>
-        <td><label>$i18n.getString( "name" ) <em title="$i18n.getString( 'required' )" class="required">*</em></label></td>
-        <td><input type="text" id="name" name="name" style="width:20em" class="{validate:{required:true,rangelength:[2,160]}}"/></td>
-        </td>
-    </tr>   
-    
-    <tr>
-        <td><label>$i18n.getString( "description" ) <em title="$i18n.getString( 'required' )" class="required">*</em></label></td>
-        <td><input type="text" id="description" name="description" style="width:20em" class="{validate:{required:true,minlength:2}}"/></td>
-        <td>&nbsp;</td>
-        <td>&nbsp;</td>
-    </tr>
-    </table>
-	<table>
-    <tr>
-      <td colspan="2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>&nbsp;</td>
-    </tr>
-    <tr>
-      <th colspan="2">$i18n.getString( "availableAttribute" ) </th>
-      <th>$i18n.getString( "filter" ) </th>
-      <th>$i18n.getString( "selectedAttribute" )
-		<select id="memberValidator" multiple="multiple" style="display:none" class="{validate:{required:true}}"></select>
-	  </th>
-    </tr>
-    <tr>
-        <td colspan="2">
-			<select multiple id="availableAttributes" name="availableAttributes" size="15" style="width:25em " ondblclick="moveSelectedById( 'availableAttributes', 'selectedAttributes' )" >
-			#foreach($patientAttribute in $patientAttributes)
-				<option value='$patientAttribute.id' >$patientAttribute.name</option>
-			#end
-			</select>
-		</td>
-        <td>
-          <input type="button" value="&gt;" title="$i18n.getString('move_selected')" onclick="moveSelectedById( 'availableAttributes', 'selectedAttributes' )"/>
-          <br/>
-          <input type="button" value="&lt;" title="$i18n.getString('remove_selected')" onclick="moveSelectedById( 'selectedAttributes', 'availableAttributes' )"/>
-        </td>
-        <td><select multiple id="selectedAttributes" name="selectedAttributes" size="15" style="width:25em " ondblclick="moveSelectedById( 'selectedAttributes', 'availableAttributes' )"></select>
-		</td>
-        <td>
-			<a href="javascript:moveUpSelectedOption( 'selectedAttributes')" title="$i18n.getString( 'move_up' )"><img src="../images/move_up.png" alt="$i18n.getString( 'move_up' )"/></a>
-			<br/><br/>
+	<tr>
+		<th colspan="2">$i18n.getString( "patient_attribute_group_deltails" )</th>
+	</tr>
+	<tr>
+		<td>$i18n.getString( "name" ) <em title="$i18n.getString( 'required' )" class="required">*</em></td>
+		<td><input type="text" id="name" name="name" style="width:20em"/></td>
+	</tr>   
+	<tr>
+		<td>$i18n.getString( "description" ) <em title="$i18n.getString( 'required' )" class="required">*</em></td>
+		<td><input type="text" id="description" name="description" style="width:20em"/></td>
+	</tr>
+	<tr>
+		<td colspan="2" height="15px"></td>
+	</tr>
+</table>
+
+<table>
+	<col style="width: 450px"/>
+	<col/>
+	<col style="width: 450px"/>
+	
+	<tr>
+		<th>$i18n.getString( "availableAttribute" )</th>
+		<th>$i18n.getString( "filter" )</th>
+		<th>$i18n.getString( "selectedAttribute" )
+			<select id="memberValidator" multiple="multiple" style="display:none" class="{validate:{required:true}}"/>
+		</th>
+	</tr>
+	
+	<tr>
+		<td>
+			<select multiple id="availableAttributes" name="availableAttributes" size="15" style="width:100%"></select>
+		</td>
+		<td style="text-align:center">
+			<input type="button" value="&gt;" title="$i18n.getString('move_selected')" onclick="dhisAjaxSelect_moveAllSelected( 'availableAttributes', 'selectedAttributes' )"/><br/>
+			<input type="button" value="&lt;" title="$i18n.getString('remove_selected')" onclick="dhisAjaxSelect_moveAllSelected( 'selectedAttributes', 'availableAttributes' )"/>
+		</td>
+		<td>
+			<select multiple id="selectedAttributes" name="selectedAttributes" size="15" style="width:100%"></select>
+		</td>
+		<td>
+			<a href="javascript:moveUpSelectedOption( 'selectedAttributes')" title="$i18n.getString( 'move_up' )"><img src="../images/move_up.png" alt="$i18n.getString( 'move_up' )"/></a><br/><br/>
 			<a href="javascript:moveDownSelectedOption( 'selectedAttributes' )" title="$i18n.getString( 'move_down' )"><img src="../images/move_down.png" alt="$i18n.getString( 'move_up' )"/></a>
 		</td>
-    </tr>  
-        
+	</tr>        
 </table>
 
 <p>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/javascript/patientAttributeGroup.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/javascript/patientAttributeGroup.js	2011-09-28 07:11:18 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/javascript/patientAttributeGroup.js	2011-10-02 09:53:57 +0000
@@ -1,13 +1,3 @@
-function beforeSubmit()
-{
-	memberValidator = jQuery( "#memberValidator");
-	memberValidator.children().remove();
-	
-	jQuery.each( jQuery( "#selectedAttributes" ).children(), function(i, item){
-		item.selected = 'selected';
-		memberValidator.append( '<option value="' + item.value + '" selected="selected">' + item.value + '</option>');
-	});
-}
 // -----------------------------------------------------------------------------
 // View details
 // -----------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/updatePatientAttibuteGroupForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/updatePatientAttibuteGroupForm.vm	2011-09-29 04:17:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/updatePatientAttibuteGroupForm.vm	2011-10-02 09:53:57 +0000
@@ -1,18 +1,34 @@
 <script>
 	var i18n_remove_option = '$encoder.jsEscape( $i18n.getString( "remove_option" ) , "'") ';
 
-	jQuery(document).ready(	function(){
-			
-			jQuery('name').focus();
-			
-			validation( 'updatePatientAttributeGroupForm', function(form){
-				form.submit();
-			}, function()
+	jQuery(document).ready(	function() {
+	
+		jQuery('name').focus();
+
+		validation2( 'updatePatientAttributeGroupForm', function(form){
+			form.submit();
+		}, {
+			'beforeValidateHandler' : function()
 			{
-				beforeSubmit();
-			}); 
-			
-			checkValueIsExist( "name", "validatePatientAttributeGroup.action", {id:getFieldValue('id')});
+				listValidator( 'memberValidator', 'selectedAttributes' );
+			},
+			'rules' : getValidationRules( 'patientAttributeGroup' )
+		} );
+
+		checkValueIsExist( "name", "validatePatientAttributeGroup.action", {id:getFieldValue('id')});
+		
+		jQuery("#availableAttributes").dhisAjaxSelect({
+			source: 'getProgramAttributeWithoutGroup.action',
+			iterator: 'patientAttributes',
+			connectedTo: 'selectedAttributes',
+			handler: function(item){
+				var option = jQuery( "<option/>" );
+				option.attr( "value", item.id );
+				option.text( item.name );
+				
+				return option;
+			}
+		});
 	});		
 </script>
 <h3>$i18n.getString( "edit_patient_attribute_group" )</h3>
@@ -21,66 +37,64 @@
 <div style="display:inline">
   <input type="hidden" id="id" name="id" value="$!patientAttributeGroup.id"/>
 </div>
-  
-  <table id="detailsList">
-    <thead>
-      <tr>
-        <th colspan="4">$i18n.getString( "patient_attribute_group_deltails" ) </th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr>
-        <td>$i18n.getString( "name" ) <em title="$i18n.getString( 'required' )" class="required">*</em></td>
-        <td><input type="text" id="name" name="name" value="$encoder.htmlEncode( $patientAttributeGroup.name )" style="width:20em"/></td>
-		</tr>   
-      <tr>
-        <td>$i18n.getString( "description" ) <em title="$i18n.getString( 'required' )" class="required">*</em></td>
-        <td><input type="text" id="description" name="description" value="$encoder.htmlEncode( $patientAttributeGroup.description )" style="width:20em"/></td>
-      </tr>
-      <tr>
-        <td>&nbsp;</td>
-        <td>&nbsp;</td>
-      </tr>
-      <tr>
-      <th colspan="2">$i18n.getString( "availableAttribute" ) </th>
-      <th>$i18n.getString( "filter" ) </th>
-      <th>$i18n.getString( "selectedAttribute" )
-		<select id="memberValidator" multiple="multiple" style="display:none" class="{validate:{required:true}}"/>
-	  </th>
-    </tr>
-    <tr>
-        <td colspan="2">
-			<select multiple id="availableAttributes" name="availableAttributes" size="15" style="width:25em " ondblclick="moveSelectedById( 'availableAttributes', 'selectedAttributes' )">
-			#foreach($patientAttribute in $patientAttributes)
+
+<table>
+	<tr>
+		<th colspan="2">$i18n.getString( "patient_attribute_group_deltails" )</th>
+	</tr>
+	<tr>
+		<td>$i18n.getString( "name" ) <em title="$i18n.getString( 'required' )" class="required">*</em></td>
+		<td><input type="text" id="name" name="name" value="$encoder.htmlEncode( $patientAttributeGroup.name )" style="width:20em"/></td>
+	</tr>   
+	<tr>
+		<td>$i18n.getString( "description" ) <em title="$i18n.getString( 'required' )" class="required">*</em></td>
+		<td><input type="text" id="description" name="description" value="$encoder.htmlEncode( $patientAttributeGroup.description )" style="width:20em"/></td>
+	</tr>
+	<tr>
+		<td colspan="2" height="15px"></td>
+	</tr>
+</table>
+
+<table>
+	<col style="width: 450px"/>
+	<col/>
+	<col style="width: 450px"/>
+	
+	<tr>
+		<th>$i18n.getString( "availableAttribute" )</th>
+		<th>$i18n.getString( "filter" )</th>
+		<th>$i18n.getString( "selectedAttribute" )
+			<select id="memberValidator" multiple="multiple" style="display:none" class="{validate:{required:true}}"/>
+		</th>
+	</tr>
+	
+	<tr>
+		<td>
+			<select multiple id="availableAttributes" name="availableAttributes" size="15" style="width:100%"></select>
+		</td>
+		<td style="text-align:center">
+			<input type="button" value="&gt;" title="$i18n.getString('move_selected')" onclick="dhisAjaxSelect_moveAllSelected( 'availableAttributes', 'selectedAttributes' )"/><br/>
+			<input type="button" value="&lt;" title="$i18n.getString('remove_selected')" onclick="dhisAjaxSelect_moveAllSelected( 'selectedAttributes', 'availableAttributes' )"/>
+		</td>
+		<td>
+			<select multiple id="selectedAttributes" name="selectedAttributes" size="15" style="width:100%">
+			#foreach($patientAttribute in $patientAttributeGroup.attributes)
+			#if($!patientAttribute)
 				<option value='$patientAttribute.id'>$patientAttribute.name</option>
 			#end
+			#end
 			</select>
 		</td>
-        <td>
-          <input type="button" value="&gt;" title="$i18n.getString('move_selected')" onclick="moveSelectedById( 'availableAttributes', 'selectedAttributes' )"/>
-          <br/>
-          <input type="button" value="&lt;" title="$i18n.getString('remove_selected')" onclick="moveSelectedById( 'selectedAttributes', 'availableAttributes' )"/>
-        </td>
-        <td><select multiple id="selectedAttributes" name="selectedAttributes" size="15" style="width:25em" ondblclick="moveSelectedById( 'selectedAttributes', 'availableAttributes' )">
-        	 #foreach($patientAttribute in $patientAttributeGroup.attributes)
-				#if($!patientAttribute)
-					<option value='$patientAttribute.id'>$patientAttribute.name</option>
-				#end
-			 #end
-		</select></td>
-		
 		<td>
-			<a href="javascript:moveUpSelectedOption( 'selectedAttributes')" title="$i18n.getString( 'move_up' )"><img src="../images/move_up.png" alt="$i18n.getString( 'move_up' )"/></a>
-			<br/><br/>
+			<a href="javascript:moveUpSelectedOption( 'selectedAttributes')" title="$i18n.getString( 'move_up' )"><img src="../images/move_up.png" alt="$i18n.getString( 'move_up' )"/></a><br/><br/>
 			<a href="javascript:moveDownSelectedOption( 'selectedAttributes' )" title="$i18n.getString( 'move_down' )"><img src="../images/move_down.png" alt="$i18n.getString( 'move_up' )"/></a>
 		</td>
-    </tr>  
-        
-      <tr>
-        <td colspan="2" style="height:15px"></td>
-      </tr>
-    </tbody>
-  </table>  
+	</tr>  
+
+	<tr>
+		<td colspan="2" style="height:15px"></td>
+	</tr>
+</table>  
 
 <p>
     <input type="submit" value="$i18n.getString( 'update' )" style="width:10em"/>