Index: workflow.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/workflow/workflow.module,v
retrieving revision 1.54
diff -u -r1.54 workflow.module
--- workflow.module	3 Feb 2007 22:38:48 -0000	1.54
+++ workflow.module	8 Feb 2007 19:08:03 -0000
@@ -706,38 +706,34 @@
  */
 function workflow_permissions($wid) {
   $name = workflow_get_name($wid);
-  $result = db_query("SELECT sid, state FROM {workflow_states} WHERE wid = %d", $wid);
-  $states = array();
-  while ($data = db_fetch_object($result)) {
-    $states[$data->sid] = $data->state;
-  }
-
   $all = array();
-  $result = db_query("SELECT * FROM {workflow_transitions}");
+  $roles = array('author' => t('author')) + user_roles();
+  foreach ($roles as $role => $value) {
+    $all[$role]['name'] = $value;
+  }
+  $result = db_query(
+    "SELECT t.roles, s1.state AS state_name, s2.state AS target_state_name "
+  . "FROM {workflow_transitions} t "
+  . "INNER JOIN {workflow_states} s1 ON s1.sid = t.sid "
+  . "INNER JOIN {workflow_states} s2 ON s2.sid = t.target_sid "
+  . "WHERE s1.wid = %d "
+  . "ORDER BY s1.weight ASC , s1.state ASC , s2.weight ASC , s2.state ASC",
+    $wid);
   while ($data = db_fetch_object($result)) {
-    if (isset($states[$data->sid])) {
-      foreach (explode(',', $data->roles) as $role) {
-        $all[$role][] = array($data->sid, $data->target_sid);
-      }
+    foreach (explode(',', $data->roles) as $role) {
+      $all[$role]['transitions'][] = array($data->state_name, WORKFLOW_ARROW, $data->target_state_name);
     }
   }
-
+  
   $output = '';
-  $role_names = user_roles();
   $header = array(t('From'), '', t('To'));
-  foreach ($all as $role_id => $transitions) {
-    $rows = array();
-    $role = $role_id == 'author' ? 'author' : $role_names[$role_id];
-    foreach ($transitions as $transition) {
-      list($from, $to) = $transition;
-      $rows[] = array($states[$from], WORKFLOW_ARROW, $states[$to]);
-    }
-   $output .= '<h3>'. t("%role may do these transitions:", array('%role' => $role)) .'</h3>';
-   if ($rows) {
-       $output .= theme('table', $header, $rows);
+  foreach ($all as $role => $value) {
+    $output .= '<h3>'. t("%role may do these transitions:", array('%role' => $value['name'])) .'</h3>';
+    if ($value['transitions']) {
+      $output .= theme('table', $header, $value['transitions']) . '<p></p>';
     }
     else {
-      $output .= t('None');
+      $output .= '<table><tbody><tr class="even"><td>' . t('None') . '</td><td></tr></tbody></table><p></p>';
     }
   }
   return $output;
