Index: role_weights.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/role_weights/role_weights.module,v
retrieving revision 1.12
diff -u -r1.12 role_weights.module
--- role_weights.module	16 Mar 2007 13:59:54 -0000	1.12
+++ role_weights.module	6 Jun 2007 19:21:58 -0000
@@ -21,6 +21,20 @@
   // Alter the 'user_admin_new_role' form to retheme.
   if ($form_id == 'user_admin_new_role') {
     $form['#pre_render'][] = 'role_weights_admin_new_role_set_theme';
+
+    // some crappy sorting for now
+    $user_roles = user_roles();
+    uksort($user_roles, '_role_weights_rid_compare');
+    
+    // add in our new select form elements
+    foreach ($user_roles as $role_id => $role_name) {
+      $form['role_weights']['role_weight_'. $role_id]['select'] = array(
+        '#type' => 'weight',
+        '#default_value' => role_weights_get_weight($role_id),
+      );
+      $form['role_weights']['role_weight_'. $role_id]['role_id'] = array('#type' => 'value', '#value' => $role_id);
+      $form['role_weights']['role_weight_'. $role_id]['role_name'] = array('#type' => 'value', '#value' => $role_name);
+    }
   }
   else if ($form_id == 'user_admin_role') {
     $rid = arg(4);
@@ -94,14 +108,20 @@
  * DRUPAL-5 TODO: links to edit anon and authed user don't work
  */
 function theme_role_weights_admin_new_role($form) {
-  $header = array(t('Name'), array('data' => t('Operations'), 'colspan' => 2));
-  foreach (user_roles() as $rid => $name) {
-    $edit_permissions = l(t('edit permissions'), 'admin/user/access/'. $rid);
-    
-    // Drupal core redirects if the rid is DRUPAL_ANONYMOUS_RID or DRUPAL_AUTHENTICATED_RID.
-    // We prevent this by shifting the rid.
-    _role_weights_shift_rid($rid);
-    $rows[] = array($name, l(t('edit role'), 'admin/user/roles/edit/'. $rid), $edit_permissions);
+  $header = array(t('Name'), t('Weight'), array('data' => t('Operations'), 'colspan' => 2));
+  
+  if ($form['role_weights']) {
+    foreach (element_children($form['role_weights']) as $key) {     
+      // Drupal core redirects if the rid is DRUPAL_ANONYMOUS_RID or DRUPAL_AUTHENTICATED_RID.
+      // We prevent this by shifting the rid. We also save the 'proper' role weight first for display.
+      $role_weight = drupal_render($form['role_weights'][$key]); // drupal_render($role_weight_select); //role_weights_get_weight($rid);
+      $rid = $form['role_weights'][$key]['role_id']['#value'];
+      $name = $form['role_weights'][$key]['role_name']['#value'];
+      
+      $edit_permissions = l(t('edit permissions'), 'admin/user/access/'. $rid);
+      _role_weights_shift_rid($rid);
+      $rows[] = array($name, $role_weight, l(t('edit role'), 'admin/user/roles/edit/'. $rid), $edit_permissions);
+    }
   }
   $rows[] = array(drupal_render($form['name']), array('data' => drupal_render($form['submit']), colspan => 2));
 
@@ -227,6 +247,20 @@
 }
 
 /**
+ * compare function for sorting uesr_roles() by weight using uksort()
+ */
+function _role_weights_rid_compare($r1, $r2) {
+  $r1_weight = role_weights_get_weight($r1);
+  $r2_weight = role_weights_get_weight($r2);
+  
+  if ($r1_weight == $r2_weight) {
+    return 0;
+  }
+  
+  return ($r1_weight < $r2_weight) ? -1 : 1;
+}
+
+/**
  * Implementation of hook_views_tables()
  */
 function role_weights_views_tables() {
