? .cvsignore
? userpoints_view.patch
Index: userpoints.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/userpoints/Attic/userpoints.admin.inc,v
retrieving revision 1.1.2.9
diff -u -p -r1.1.2.9 userpoints.admin.inc
--- userpoints.admin.inc	1 Nov 2010 23:36:02 -0000	1.1.2.9
+++ userpoints.admin.inc	2 Nov 2010 10:18:13 -0000
@@ -517,7 +517,7 @@ function userpoints_confirm_approve($for
     ),
   );
 
-  $transaction = userpoints_get_transaction($txn_id);
+  $transaction = userpoints_transaction_load($txn_id);
   $arguments = array(
     '!user' => theme('username', array('account' => $transaction->user)),
     '%category' => $transaction->category,
Index: userpoints.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/userpoints/Attic/userpoints.css,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 userpoints.css
--- userpoints.css	1 Nov 2010 23:36:02 -0000	1.1.2.2
+++ userpoints.css	2 Nov 2010 10:18:13 -0000
@@ -30,3 +30,13 @@ table.userpoints-myuserpoints-total {
   min-width: 300px;
 }
 
+td.userpoints-view-label {
+  font-weight: bold;
+  text-align: right;
+  width: 200px;
+}
+
+table.userpoints-view tr.odd {
+  background: none;
+}
+
Index: userpoints.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/userpoints/userpoints.module,v
retrieving revision 1.68.2.21
diff -u -p -r1.68.2.21 userpoints.module
--- userpoints.module	1 Nov 2010 23:36:02 -0000	1.68.2.21
+++ userpoints.module	2 Nov 2010 10:18:13 -0000
@@ -248,6 +248,17 @@ function userpoints_menu() {
       'type' => MENU_NORMAL_ITEM,
   );
 
+  $items['userpoints/view/%userpoints_transaction'] = array(
+      'title' => '!Point transaction',
+      'title arguments' => userpoints_translation(),
+      'page callback' => 'userpoints_view_transaction',
+      'page arguments' => array(2),
+      'access callback' => 'userpoints_access_view_transaction',
+      'access arguments' => array(2),
+      'file' => 'userpoints.pages.inc',
+      'type' => MENU_NORMAL_ITEM,
+  );
+
   $items['myuserpoints/%user_uid_optional'] = array(
       'title' => 'My !points',
       'title arguments' => userpoints_translation(),
@@ -278,6 +289,16 @@ function userpoints_access_my_points($ac
 }
 
 /**
+ * Checks if a user has access to a transaction.
+ *
+ * @return
+ *   TRUE if the user has permissions to view the transaction.
+ */
+function userpoints_access_view_transaction($transaction) {
+  return userpoints_access_my_points($transaction->user);
+}
+
+/**
  * Implements hook_permission().
  */
 function userpoints_permission() {
@@ -670,7 +691,7 @@ function _userpoints_transaction(&$param
 
   if (!empty($params['txn_id']) && $params['txn_id'] > 0) {
     // A transaction ID was passed in so we'll update the transaction.
-    $txn = (array) userpoints_get_transaction($params['txn_id']);
+    $txn = (array) userpoints_transaction_load($params['txn_id']);
     if (!$txn) {
       return FALSE;
     }
@@ -1242,7 +1263,7 @@ function userpoints_get_info($operation 
  *   The reason for that transaction, linked to the referenced
  *   entity if available.
  */
-function userpoints_create_description($transaction) {
+function userpoints_create_description($transaction, array $options = array()) {
   // Check if there is a valid entity referenced and which can be linked to.
   $entity = NULL;
   if ($transaction->entity_type && entity_get_info($transaction->entity_type)) {
@@ -1271,7 +1292,7 @@ function userpoints_create_description($
     $description = $transaction->operation;
   }
   // Link to the referenced entity, if available.
-  if ($entity) {
+  if ($entity && (!isset($options['link']) || $options['link'] != FALSE)) {
     $uri = entity_uri($transaction->entity_type, $entity);
     if ($uri) {
       $description = l($description, $uri['path'], $uri['options'] + array('html' => $safe));
@@ -1304,7 +1325,7 @@ function userpoints_userpoints_info() {
  * @return
  *   A loaded userpoints transaction object.
  */
-function userpoints_get_transaction($txn_id) {
+function userpoints_transaction_load($txn_id) {
   $transaction = db_query('SELECT * from {userpoints_txn} WHERE txn_id = :txn', array(':txn' => $txn_id))->fetchObject();
 
   // Load corresponding user object.
@@ -1320,14 +1341,22 @@ function userpoints_get_transaction($txn
  * Returns a list of operations as links.
  *
  * @param $transaction
- *  Transaction object.
+ *   Transaction object.
+ *
+ * @param $show_view
+ *   FALSE if the view link should not be displayed. Defaults to TRUE.
  *
  * @return
  *   A string with operation links.
  */
-function userpoints_get_transaction_operations($transaction) {
+function userpoints_get_transaction_operations($transaction, $show_view = TRUE) {
   $operations = array();
   $url_options = array('query' => drupal_get_destination());
+
+  if ($show_view && userpoints_access_view_transaction($transaction)) {
+    $operations[] = l('view', 'userpoints/view/' . $transaction->txn_id);
+  }
+
   if (userpoints_admin_access('edit')) {
     $operations[] = l('edit', "admin/config/people/userpoints/edit/$transaction->txn_id", $url_options);
   }
Index: userpoints.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/userpoints/Attic/userpoints.pages.inc,v
retrieving revision 1.1.2.6
diff -u -p -r1.1.2.6 userpoints.pages.inc
--- userpoints.pages.inc	1 Nov 2010 23:36:02 -0000	1.1.2.6
+++ userpoints.pages.inc	2 Nov 2010 10:18:13 -0000
@@ -91,7 +91,7 @@ function userpoints_list_my_userpoints($
     '#attributes' => array('class' => array('userpoints-myuserpoints-list')),
   );
   $output['pager'] = array(
-    '#theme' => 'pager',
+    '#markup' => theme('pager'),
     '#weight' => 0,
   );
 
@@ -178,3 +178,57 @@ function userpoints_list_users($tid = NU
   }
   return theme('userpoints_list_users', array('header' => $header, 'rows' => $rows, 'tid' => $tid));
 }
+
+function userpoints_view_transaction($transaction) {
+  drupal_add_css(drupal_get_path('module', 'userpoints') . '/userpoints.css');
+
+  $details = array();
+  $details[t('Transaction ID')] = $transaction->txn_id;
+  $details[t('User')] = theme('username', array('account' => $transaction->user));
+  $details[t('!Points', userpoints_translation())] = $transaction->points;
+  $details[t('Approved by')] = !empty($transaction->approver_uid) ? theme('username', array('account' => user_load($transaction->approver_uid))) : '';
+  $details[t('Date')] = format_date($transaction->time_stamp);
+  $details[t('Changed')] = format_date($transaction->changed);
+  $stati = userpoints_txn_status();
+  $details[t('Status')] = $stati[$transaction->status];
+  $details[t('Description')] = userpoints_create_description($transaction);
+  $details[t('Reference')] = check_plain($transaction->reference);
+  $details[t('Expiration date')] = !empty($transaction->expirydate) ? format_date($transaction->expirydate) : t('Never');
+  $details[t('Expired')] = $transaction->expired ? t('Yes') : t('No');
+  $parent = '';
+  if (!empty($transaction->parent_txn_id)) {
+    $parent_transaction = userpoints_transaction_load($transaction->parent_txn_id);
+    $parent = l(userpoints_create_description($parent_transaction, array('link' => FALSE)), 'userpoints/view/' . $transaction->parent_txn_id, array('html' => TRUE));
+  }
+  $details[t('Parent transaction')] = $parent;
+
+  $child_txn_ids = db_query('SELECT txn_id FROM {userpoints_txn} WHERE parent_txn_id = :txn_id', array(':txn_id' => $transaction->txn_id))->fetchCol();
+  $children = array();
+  foreach ($child_txn_ids as $child_txn_id) {
+    $child_transaction = userpoints_transaction_load($child_txn_id);
+    $children[] = l(userpoints_create_description($child_transaction, array('link' => FALSE)), 'userpoints/view/' . $child_txn_id, array('html' => TRUE));
+  }
+  $children = !empty($children) ? theme('item_list', array('items' => $children)) : '';
+  $details[t('Child transactions')] = $children;
+
+  $categories = userpoints_get_categories();
+  $details[t('Category')] = $transaction->category;
+
+  $details[t('Operations')] = userpoints_get_transaction_operations($transaction, FALSE);
+
+  $rows = array();
+  foreach ($details as $key => $value) {
+    $rows[] = array(
+      array(
+        'data' => $key,
+        'class' => array('userpoints-view-label'),
+      ),
+      array(
+        'data' => $value,
+        'class' => array('userpoints-view-value'),
+      ),
+    );
+  }
+
+  return theme('table', array('rows' => $rows, 'attributes' => array('class' => array('userpoints-view'))));
+}
\ No newline at end of file
