? diff
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	9 Apr 2009 07:41:49 -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' => 15,
+    ),
+    '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']) {
+    $categories = project_issue_category(0, 1);
+    $vars['default_state'] = variable_get('project_issue_default_state', 1);
+
+    $open_states = '('. implode(',', array_keys(project_issue_state(0, FALSE, FALSE, 0, TRUE))) .')';
+    $sql = 'SELECT count(*) FROM {node} n INNER JOIN {project_issues} i ON n.nid = i.nid WHERE n.status = 1 AND i.pid = %d';
+    $sql_active = $sql .' AND i.sid IN '. $open_states;
+    $sql_unanswered = $sql .' AND i.sid = %d';
+    $sql_category = " AND i.category = '%s'";
+
+    $vars['active'] = db_result(db_query($sql_active, $node->nid));
+    $vars['unanswered'] = db_result(db_query($sql_unanswered, $node->nid, $vars['default_state']));
+    $vars['total'] = db_result(db_query($sql, $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 ($categories as $category => $name) {
+      $vars['categories'][$category] = array(
+        'name' => $name,
+        'active' => db_result(db_query($sql_active . $sql_category, $node->nid, $category)),
+        'unanswered' => db_result(db_query($sql_unanswered . $sql_category, $node->nid, $vars['default_state'], $category)),
+        'total' => db_result(db_query($sql . $sql_category, $node->nid, $category)),
+      );
+    }
+
+    $vars['oldest'] = db_result(db_query('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	9 Apr 2009 07:41:49 -0000
@@ -0,0 +1,45 @@
+<?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 handy '<strong>create new</strong>' button."); ?>
+  </p>
+<?php endif; ?>
+
+<?php if ($view_issues): ?>
+  <div class="issue-cockpit-all">
+    <h2>
+      <?php print l(t('All Issues <span>(!count active)</span>', array('!count' => $active)), $path, array('html' => TRUE)); ?>
+    </h2>
+    <div>
+      <?php print l(t('unanswered (!count)', array('!count' => $unanswered)), $path, array('query' => 'status='. $default_state)); ?>
+    </div>
+    <div>
+       <?php print l(t('total (!count)', array('!count' => $total)), $path, array('query' => 'status=All')); ?>
+    </div>
+  </div>
+
+  <?php print $form; ?>
+
+  <div class="issue-cockpit-categories">
+    <?php foreach($categories as $key => $category): ?>
+      <div class="issue-cockpit-<?php print $key; ?>">
+        <h3>
+          <?php print l(t('!category <span>(!count active)</span>', array('!count' => $category['active'], '!category' => $category['name'])), $path, array('query' => 'categories='. $key, 'html' => TRUE)); ?>
+        </h3>
+        <div>
+          <?php print l(t('unanswered (!count)', array('!count' => $category['unanswered'])), $path, array('query' => 'status='. $default_state .'&categories='. $key)); ?>
+        </div>
+        <div>
+          <?php print l(t('total (!count)', array('!count' => $category['total'])), $path, array('query' => 'status=All&categories='. $key)); ?>
+        </div>
+      </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	9 Apr 2009 07:41:50 -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[] = 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'])) {
+    return array(
+      'subject' => t('Issues'),
+      'content' => theme('project_issue_issue_cockpit', $node),
+    );
+  }
+}
