Index: issue_cockpit.inc
===================================================================
RCS file: issue_cockpit.inc
diff -N issue_cockpit.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ issue_cockpit.inc	10 Apr 2009 18:55:52 -0000
@@ -0,0 +1,65 @@
+<?php
+// $Id$
+
+function project_issue_issue_cockpit_searchbox(&$form_state, $path) {
+  return array(
+    '#action' => url($path),
+    '#method' => 'get',
+    'text' => array(
+      '#type' => 'textfield',
+      '#size' => 20,
+    ),
+    'status' => array(
+      '#type' => 'hidden',
+      '#value' => 'All',
+    ),
+    'submit' => array(
+      '#type' => 'submit',
+      '#value' => t('search'),
+      '#name' => '',
+    ),
+    'advanced' => array(
+      '#value' => l(t('advanced search'), 'project/issues/search/'. $node->project['uri']),
+    ),
+  );
+}
+
+function template_preprocess_project_issue_issue_cockpit(&$vars) {
+  $node = $vars['node'];
+
+  // Flags that indicate what kind of access to project issues to allow.
+  $has_issues = !empty($node->project_issue['issues']);
+  $vars['view_issues'] = $has_issues && (user_access('access project issues') || user_access('access own project issues') || user_access('administer projects'));
+  $vars['make_issues'] = $has_issues && node_access('create', 'project_issue');
+
+  if ($vars['view_issues']) {
+    $open_states = '('. implode(',', array_keys(project_issue_state(0, FALSE, FALSE, 0, TRUE))) .')';
+
+    $vars['open'] = db_result(db_query(db_rewrite_sql('SELECT count(*) FROM {node} n INNER JOIN {project_issues} i ON n.nid = i.nid WHERE n.status = 1 AND i.pid = %d AND i.sid IN '. $open_states), $node->nid));
+    $vars['total'] = db_result(db_query(db_rewrite_sql('SELECT count(*) FROM {node} n INNER JOIN {project_issues} i ON n.nid = i.nid WHERE n.status = 1 AND i.pid = %d'), $node->nid));
+
+    $vars['path'] = 'project/issues/'. $node->project['uri'];
+    $vars['form'] = drupal_get_form('project_issue_issue_cockpit_searchbox', $vars['path']);
+
+    $vars['categories'] = array();
+    foreach (project_issue_category(0, 1) as $category => $name) {
+      $vars['categories'][$category] = array('name' => $name, 'open' => 0, 'total' => 0);
+    }
+
+    $result = db_query(db_rewrite_sql('SELECT count(*) AS open, i.category FROM {node} n INNER JOIN {project_issues} i ON n.nid = i.nid WHERE n.status = 1 AND i.pid = %d AND i.sid IN '. $open_states .' GROUP BY i.category'), $node->nid);
+    while ($category = db_fetch_object($result)) {
+      if (isset($vars['categories'][$category->category])) {
+        $vars['categories'][$category->category]['open'] = $category->open;
+      }
+    }
+
+    $result = db_query(db_rewrite_sql('SELECT count(*) AS total, i.category FROM {node} n INNER JOIN {project_issues} i ON n.nid = i.nid WHERE n.status = 1 AND i.pid = %d GROUP BY i.category'), $node->nid);
+    while ($category = db_fetch_object($result)) {
+      if (isset($vars['categories'][$category->category])) {
+        $vars['categories'][$category->category]['total'] = $category->total;
+      }
+    }
+
+    $vars['oldest'] = db_result(db_query(db_rewrite_sql('SELECT min(n.created) FROM {node} n INNER JOIN {project_issues} i ON n.nid = i.nid WHERE n.status = 1 AND i.pid = %d AND i.sid IN '. $open_states), $node->nid));
+  }
+}
Index: project-issue-issue-cockpit.tpl.php
===================================================================
RCS file: project-issue-issue-cockpit.tpl.php
diff -N project-issue-issue-cockpit.tpl.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ project-issue-issue-cockpit.tpl.php	10 Apr 2009 18:55:52 -0000
@@ -0,0 +1,31 @@
+<?php
+// $Id$
+?>
+
+<?php if ($make_issues): ?>
+  <p>
+    <?php print t("To avoid duplicates, please check the queues for your issue before submitting a new one. As you search or browse you will find a '<strong>Create a new issue</strong>' link."); ?>
+  </p>
+<?php endif; ?>
+
+<?php if ($view_issues): ?>
+  <div class="issue-cockpit-all">
+    <?php print l(t('All Issues: !open open', array('!open' => $open)), $path, array('html' => TRUE)); ?>,
+    <?php print l(t('!total total', array('!total' => $total)), $path, array('query' => 'status=All')); ?>
+  </div>
+
+  <?php print $form; ?>
+
+  <div class="issue-cockpit-categories">
+    <?php foreach($categories as $key => $category): ?>
+      <div class="issue-cockpit-<?php print $key; ?>">
+        <?php print l(t('!category: !open open', array('!open' => $category['open'], '!category' => $category['name'])), $path, array('query' => 'categories='. $key, 'html' => TRUE)); ?>,
+        <?php print l(t('!total total', array('!total' => $category['total'])), $path, array('query' => 'status=All&categories='. $key)); ?>
+      </div>
+    <?php endforeach; ?>
+  </div>
+
+  <div class="issue-cockpit-oldest">
+    <?php print t('Oldest open issue: @date', array('@date' => format_date($oldest, 'custom', 'j M y'))); ?>
+  </div>
+<?php endif; ?>
Index: project_issue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/project_issue.module,v
retrieving revision 1.157
diff -u -p -r1.157 project_issue.module
--- project_issue.module	4 Apr 2009 07:03:28 -0000	1.157
+++ project_issue.module	10 Apr 2009 18:55:53 -0000
@@ -371,6 +371,13 @@ function project_issue_theme() {
         'include_assigned' => FALSE,
       ),
     ),
+    'project_issue_issue_cockpit' => array(
+      'arguments' => array(
+        'node' => NULL,
+      ),
+      'file' => 'issue_cockpit.inc',
+      'template' => 'project-issue-issue-cockpit',
+    ),
   );
 }
 
@@ -449,6 +456,12 @@ function project_issue_form_alter(&$form
     case 'views_exposed_form':
       project_issue_alter_views_exposed_form($form, $form_state);
       break;
+
+    case 'project_issue_issue_cockpit_searchbox':
+      unset($form['form_build_id']);
+      unset($form['form_id']);
+      unset($form['form_token']);
+      break;
   }
 }
 
@@ -1601,3 +1614,21 @@ function project_issue_views_filter_iden
   return drupal_strtolower(preg_replace('/[^a-zA-Z0-9]/', '_', check_plain($name)));
 }
 
+/**
+ * Implementation of hook_block().
+ */
+function project_issue_block($op = 'list', $delta = 0, $edit = array()) {
+  if ($op == 'list') {
+    $blocks['issue_cockpit'] = array(
+      'info' => t('Issue cockpit'),
+      'cache' => BLOCK_CACHE_PER_ROLE | BLOCK_CACHE_PER_PAGE,
+    );
+    return $blocks;
+  }
+  elseif ($op == 'view' && ($node = menu_get_object()) && $node->type == 'project_project' && !empty($node->project_issue['issues']) && node_access('view', $node)) {
+    return array(
+      'subject' => t('Issues'),
+      'content' => theme('project_issue_issue_cockpit', $node),
+    );
+  }
+}
