? includes
Index: userqueue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/userqueue/userqueue.module,v
retrieving revision 1.1
diff -u -p -r1.1 userqueue.module
--- userqueue.module	6 Feb 2009 22:43:01 -0000	1.1
+++ userqueue.module	7 Aug 2009 16:30:59 -0000
@@ -46,6 +46,14 @@ function userqueue_menu() {
     'type' => MENU_CALLBACK,
   );
   
+  $items['admin/user/userqueue/%userqueue/add/%user'] = array(
+    'title' => 'Add user to queue',
+    'page callback' => 'userqueue_add_user_callback',
+    'page arguments' => array(3, 5),
+    'access arguments' => array('administer user queues'),
+    'type' => MENU_CALLBACK,
+  );
+
   $items['admin/user/userqueue/%userqueue/delete'] = array(
     'title' => 'Remove user from queue',
     'page callback' => 'userqueue_delete_user',
@@ -53,7 +61,16 @@ function userqueue_menu() {
     'access arguments' => array('administer user queues'),
     'type' => MENU_CALLBACK,
   );
-  
+
+  $items['user/%user/userqueue'] = array(
+    'title' => '@tab',
+    'title arguments' => array('@tab' => variable_get('userqueue_tab_name', 'Userqueue')),
+    'access arguments' => array('administer user queues'),
+    'page callback' => 'userqueue_user_tab',
+    'page arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5
+  );
   return $items;
 }
 
@@ -148,16 +165,38 @@ function userqueue_uid($user) {
   return $uid;
 }
 
+
 /**
- * Page callback for the main admin page.
+ * Wrapper to get all user queues
  */
-function userqueue_list_queues() {
+function userqueue_load_queues($with_users = FALSE) {
   $queues = array();
-  $result = db_query("SELECT * FROM {userqueue} WHERE 1");
+  $result = db_query('SELECT * FROM {userqueue}');
   while ($queue = db_fetch_object($result)) {
+    if ($with_users) {
+      $queue->users = array();
+
+      $userlist = db_query('SELECT uu.uid AS uid, u.name AS name
+                            FROM {userqueue_user} uu
+                            INNER JOIN {users} u ON u.uid = uu.uid
+                            WHERE uu.uqid = %d
+                            ORDER BY uu.weight, uu.uid', $queue->uqid);
+      while ($user = db_fetch_object($userlist)) {
+        $queue->users[$user->uid] = $user->name;
+      }
+    }
+
     $queues[$queue->uqid] = $queue;
   }
-  
+  return $queues; 
+}
+
+
+/**
+ * Page callback for the main admin page.
+ */
+function userqueue_list_queues() {
+  $queues = userqueue_load_queues();
   if (empty($queues)) {
     return t('No user queues found.');
   }
@@ -462,7 +501,7 @@ function theme_userqueue_view_queue($for
  */
 function userqueue_view_queue_submit($form, &$form_state) {
   if ($form_state['values']['op'] == t('Add')) {
-    if (count($form_state['values']['users']) >= $form['#max_size']) {
+    if ($form['#max_size'] > 0 && count($form_state['values']['users']) >= $form['#max_size']) {
       drupal_set_message(t('No additional users are allowed in this queue.'), 'error');
       return;
     }
@@ -526,6 +565,30 @@ function userqueue_delete_user($queue, $
 
 
 /**
+ * Callback to add a user to a queue
+ */
+function userqueue_add_user_callback($queue, $user) {
+  // Get the max weight (+1) for the queue. If there is nothing in the queue, $weight should be null...
+  $weight = db_result(db_query('SELECT MAX(weight)+1 FROM {userqueue_user} WHERE uqid = %d', $queue->uqid));
+
+  // ... so if $weight is not set, make it zero.
+  if (!$weight) {
+    $weight = 0;
+  }
+
+  // Add the user to the userqueue
+  userqueue_add_user($queue, $user, $weight);
+
+  if (isset($_REQUEST['destination'])) {
+    drupal_goto($_REQUEST['destination']);
+  }
+  else {
+    drupal_goto("admin/user/userqueue/{$queue->uqid}/view");
+  }
+}
+
+
+/**
  * Basic theme function for a user queue. Please override to taste.
  */
 function theme_userqueue_queue($queue) {
@@ -537,4 +600,52 @@ function theme_userqueue_queue($queue) {
   }
   
   return theme('item_list', $items);
-}
\ No newline at end of file
+}
+
+
+/**
+ * Implementation of hook_views_api()
+ */
+function userqueue_views_api() {
+  return array(
+    'api' => 2,
+    'path' => drupal_get_path('module', 'userqueue') .'/includes/views',
+  );
+}
+
+
+
+function userqueue_user_tab($user) {
+  $queues = userqueue_load_queues(TRUE);
+  if (empty($queues)) {
+    return FALSE;
+  }
+
+  $output = '';
+
+  $headers = array(
+    array('data' => t('Title'), 'class' => 'userqueue-title'),
+    array('data' => t('Max Queue Size'), 'class' => 'userqueue-max-queue-size'),
+    array('data' => t('In Queue'), 'class' => 'userqueue-in-queue'),
+    array('data' => t('Operation'), 'class' => 'userqueue-operation'),
+  );
+  $rows = array();
+
+  foreach ($queues as $uqid => $queue) {
+    if (isset($queue->users[$user->uid])) {
+      $op = l('Remove from queue', "admin/user/userqueue/{$uqid}/delete/{$user->uid}", array('query' => "destination=user/{$user->uid}/userqueue"));
+    }
+    else {
+      $op = l('Add to queue', "admin/user/userqueue/{$uqid}/add/{$user->uid}", array('query' => "destination=user/{$user->uid}/userqueue"));
+    }
+
+    $rows[] = array(
+      array('class' => 'userqueue-title',          'data' => l($queue->title, "userqueue/{$uqid}")),
+      array('class' => 'userqueue-max-queue-size', 'data' => ($queue->size == 0 ? t('Infinite') : $queue->size)),
+      array('class' => 'userqueue-in-queue',       'data' => count($queue->users)),
+      array('class' => 'userqueue-operations',     'data' => $op),
+    );
+  }
+
+  return theme('table', $headers, $rows);
+}
