Christopher Johnson (WMDE) has submitted this change and it was merged.

Change subject: Add new feature Task Status Report Pie Chart in BurndownView
......................................................................


Add new feature Task Status Report Pie Chart in BurndownView

Change-Id: I53cf91cc6dd892814e6f34a30a0b9ee94edd8822
---
A rsrc/behavior-c3-pie.js
M src/celerity/CeleritySprintResources.php
M src/celerity/map.php
M src/storage/SprintBuildStats.php
M src/view/BurndownDataView.php
M src/view/SprintReportOpenTasksView.php
6 files changed, 141 insertions(+), 39 deletions(-)

Approvals:
  Christopher Johnson (WMDE): Verified; Looks good to me, approved



diff --git a/rsrc/behavior-c3-pie.js b/rsrc/behavior-c3-pie.js
new file mode 100644
index 0000000..248132b
--- /dev/null
+++ b/rsrc/behavior-c3-pie.js
@@ -0,0 +1,18 @@
+/**
+ * @provides javelin-behavior-c3-pie
+ */
+
+JX.behavior('c3-pie', function(config) {
+
+    var h = JX.$(config.hardpoint);
+    var l = c3.generate({
+        bindto: h,
+        data: {
+            columns: [
+                ['open', config.open],
+                ['resolved', config.resolved]
+            ],
+            type: 'pie'
+        }
+    });
+});
diff --git a/src/celerity/CeleritySprintResources.php 
b/src/celerity/CeleritySprintResources.php
index 44f2caf..3aa7373 100644
--- a/src/celerity/CeleritySprintResources.php
+++ b/src/celerity/CeleritySprintResources.php
@@ -10,7 +10,7 @@
   }
 
   public function getPathToResources() {
-    return $this->getSprintPath('rsrc');
+    return $this->getSprintPath('../rsrc');
   }
 
   public function getPathToMap() {
diff --git a/src/celerity/map.php b/src/celerity/map.php
index b0839a4..a16d715 100644
--- a/src/celerity/map.php
+++ b/src/celerity/map.php
@@ -8,6 +8,7 @@
 return array(
   'names' => array(
     'behavior-c3-chart.js' => '339d1b90',
+    'behavior-c3-pie.js' => '4731bdd9',
     'c3.css' => '93642428',
     'c3.js' => '4b517cca',
     'd3.min.js' => '1595fbde',
@@ -17,6 +18,7 @@
     'c3-css' => '93642428',
     'd3' => '1595fbde',
     'javelin-behavior-c3-chart' => '339d1b90',
+    'javelin-behavior-c3-pie' => '4731bdd9',
   ),
   'requires' => array(
     '4b517cca' => array(
diff --git a/src/storage/SprintBuildStats.php b/src/storage/SprintBuildStats.php
index 120d18c..c412391 100644
--- a/src/storage/SprintBuildStats.php
+++ b/src/storage/SprintBuildStats.php
@@ -2,7 +2,10 @@
 
 final class SprintBuildStats {
 
-  public function buildDateArray($start, $end, $timezone) {
+  private $task_open_status_sum;
+  private $task_closed_status_sum;
+
+    public function buildDateArray($start, $end, $timezone) {
 
     $period = new DatePeriod(
         id(new DateTime("@" . $start, $timezone))->setTime(8, 0),
@@ -105,4 +108,14 @@
     }
     return $data;
   }
+
+  public function setTaskOpenStatusSum ($task_open_status_sum, $points) {
+    $task_open_status_sum += $points;
+    return $task_open_status_sum;
+  }
+
+  public function setTaskClosedStatusSum ($task_closed_status_sum, $points) {
+    $task_closed_status_sum += $points;
+    return $task_closed_status_sum;
+  }
 }
diff --git a/src/view/BurndownDataView.php b/src/view/BurndownDataView.php
index 004fce2..b8ce0f9 100644
--- a/src/view/BurndownDataView.php
+++ b/src/view/BurndownDataView.php
@@ -12,6 +12,8 @@
   private $viewer;
   private $tasks;
   private $xactions;
+  private $task_open_status_sum;
+  private $task_closed_status_sum;
 
   public function setProject ($project) {
     $this->project = $project;
@@ -31,9 +33,10 @@
   public function render() {
     $chart = $this->buildC3Chart();
     $tasks_table = $this->buildTasksTable();
+    $pie = $this->buildC3Pie();
     $burndown_table = $this->buildBurnDownTable();
     $event_table = $this->buildEventTable();
-    return array ($chart, $tasks_table, $burndown_table, $event_table);
+    return array ($chart, $pie, $tasks_table, $burndown_table, $event_table);
   }
 
   private function buildChartDataSet() {
@@ -120,6 +123,32 @@
             ), ''));
 
     return $chart;
+  }
+
+  private function buildC3Pie() {
+    $task_open_status_sum = $this->task_open_status_sum;
+    $task_closed_status_sum = $this->task_closed_status_sum;
+
+    require_celerity_resource('d3','sprint');
+    require_celerity_resource('c3-css','sprint');
+    require_celerity_resource('c3','sprint');
+
+    $id = 'pie';
+    Javelin::initBehavior('c3-pie', array(
+        'hardpoint' => $id,
+        'open' => $task_open_status_sum,
+        'resolved' => $task_closed_status_sum,
+    ), 'sprint');
+
+    $pie= id(new PHUIObjectBoxView())
+        ->setHeaderText(pht('Task Status Report for ' . 
$this->project->getName()))
+        ->appendChild(phutil_tag('div',
+            array(
+                'id' => 'pie',
+                'style' => 'width: 100%; height:200px'
+            ), ''));
+
+    return $pie;
   }
 
   /**
@@ -271,6 +300,8 @@
     $points = trim($points, '"');
 
     $priority_name = new ManiphestTaskPriority();
+    $status = $this->setTaskStatus($task);
+    $this->sumPointsbyStatus($status, $points);
     $depth_indent = '';
     for ($i = 0; $i < $depth; $i++) {
       $depth_indent .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
@@ -292,7 +323,7 @@
         $task->getOwnerPHID() ? $owner->renderLink() : 'none assigned',
         $priority_name->getTaskPriorityName($task->getPriority()),
         $points,
-        $task->getStatus(),
+        $status,
     );
     $included[$task->getPHID()] = $task->getPHID();
 
@@ -372,4 +403,18 @@
        }
     return $storypoints;
   }
+
+  private function setTaskStatus($task) {
+    $status = $task->getStatus();
+   return $status;
+  }
+
+  private function sumPointsbyStatus ($status, $points) {
+    $stats = id(new SprintBuildStats());
+    if ($status == 'open') {
+      $this->task_open_status_sum = 
$stats->setTaskOpenStatusSum($this->task_open_status_sum, $points);
+    } elseif ($status == 'resolved') {
+      $this->task_closed_status_sum = 
$stats->setTaskClosedStatusSum($this->task_closed_status_sum, $points);
+    }
+   }
 }
\ No newline at end of file
diff --git a/src/view/SprintReportOpenTasksView.php 
b/src/view/SprintReportOpenTasksView.php
index e7dfe31..ff9d020 100644
--- a/src/view/SprintReportOpenTasksView.php
+++ b/src/view/SprintReportOpenTasksView.php
@@ -54,11 +54,15 @@
 
 
     if (($this->view) == 'user') {
-       list($leftover, $leftover_closed, $base_link, $leftover_name, 
$col_header, $header, $result_closed, $result ) = (new UserOpenTasksView())
-          ->execute($tasks, $recently_closed, $date);
+       list($leftover, $leftover_closed, $base_link, $leftover_name,
+           $col_header, $header, $result_closed, $result ) =
+           (new UserOpenTasksView())
+               ->execute($tasks, $recently_closed, $date);
     } elseif (($this->view) == 'project') {
-      list($leftover, $base_link, $leftover_name, $col_header, $header, 
$result_closed, $leftover_closed, $result ) = (new ProjectOpenTasksView())
-          ->execute($tasks, $recently_closed, $date);
+        list($leftover, $base_link, $leftover_name, $col_header, $header,
+            $result_closed, $leftover_closed, $result ) =
+           (new ProjectOpenTasksView())
+                ->execute($tasks, $recently_closed, $date);
     } else {
       $result = array();
       $result_closed = array();
@@ -70,42 +74,19 @@
       $header = '';
     }
 
-    $phids = array_keys($result);
-    $handles = $this->loadViewerHandles($phids);
-    $handles = msort($handles, 'getName');
-
     $order = $this->request->getStr('order', 'name');
     list($order, $reverse) = AphrontTableView::parseSort($order);
 
     require_celerity_resource('aphront-tooltip-css');
     Javelin::initBehavior('phabricator-tooltips', array());
 
-    $rows = array();
-
-    foreach ($handles as $handle) {
-      list ($tasks, $name, $closed) = $this->setTaskArrays($handle, 
$project_handle, $result, $result_closed, $base_link, $leftover, 
$leftover_name, $leftover_closed);
-
-      $taskv = $tasks;
-      $tasks = mgroup($tasks, 'getPriority');
-
-      list ($row, $total) = $this->getPriorityMap($name, $tasks);
-      list ($row, $oldest_all, $oldest_pri ) = $this->renderTaskLinks($taskv, 
$closed, $row);
-
-      $row['sort'] = $this->setSortOrder($row, $order, $total, $oldest_all, 
$oldest_pri, $closed, $handle);
-
-      $rows[] = $row;
-    }
-
-    $rows = isort($rows, 'sort');
-    foreach ($rows as $k => $row) {
-      unset($rows[$k]['sort']);
-    }
-    if ($reverse) {
-      $rows = array_reverse($rows);
-    }
+    $rows = $this->buildRowsfromResult($project_handle, $result, 
$result_closed,
+        $base_link, $leftover, $leftover_name, $leftover_closed, $order,
+        $reverse);
 
     list ($cname, $cclass) = $this->buildTableColumns($col_header);
-    $table = $this->buildOpenTasksTable($rows, $cname, $cclass, $order, 
$reverse);
+    $table = $this->buildOpenTasksTable($rows, $cname, $cclass, $order,
+        $reverse);
     $panel = new PHUIObjectBoxView();
     $panel->setHeaderText($header);
     $panel->appendChild($table);
@@ -119,7 +100,8 @@
     return array($filter, $panel);
   }
 
-  private function setSortOrder ($row, $order, $total, $oldest_all, 
$oldest_pri, $closed, $handle) {
+  private function setSortOrder ($row, $order, $total, $oldest_all, 
$oldest_pri,
+                                 $closed, $handle) {
     switch ($order) {
       case 'total':
         $row['sort'] = $total;
@@ -139,6 +121,45 @@
         break;
     }
   return $row['sort'];
+  }
+
+  private function buildRowsfromResult ($project_handle, $result,
+                                        $result_closed, $base_link, $leftover,
+                                        $leftover_name, $leftover_closed,
+                                        $order, $reverse) {
+    $phids = array_keys($result);
+    $handles = $this->loadViewerHandles($phids);
+    $handles = msort($handles, 'getName');
+
+    $rows = array();
+
+    foreach ($handles as $handle) {
+      list ($tasks, $name, $closed) = $this->setTaskArrays($handle,
+          $project_handle, $result, $result_closed, $base_link, $leftover,
+          $leftover_name, $leftover_closed);
+
+      $taskv = $tasks;
+      $tasks = mgroup($tasks, 'getPriority');
+
+      list ($row, $total) = $this->getPriorityMap($name, $tasks);
+      list ($row, $oldest_all, $oldest_pri ) = $this->renderTaskLinks($taskv,
+          $closed, $row);
+
+      $row['sort'] = $this->setSortOrder($row, $order, $total, $oldest_all,
+          $oldest_pri, $closed, $handle);
+
+      $rows[] = $row;
+    }
+    $rows = isort($rows, 'sort');
+
+    foreach ($rows as $k => $row) {
+      unset($rows[$k]['sort']);
+    }
+
+    if ($reverse) {
+      $rows = array_reverse($rows);
+    }
+    return $rows;
   }
 
   private function renderTaskLinks ($taskv, $closed, $row) {
@@ -190,7 +211,9 @@
     return array ($row, $total);
   }
 
-  private function setTaskArrays($handle, $project_handle, $result, 
$result_closed, $base_link, $leftover, $leftover_name, $leftover_closed) {
+  private function setTaskArrays($handle, $project_handle, $result,
+                                 $result_closed, $base_link, $leftover,
+                                 $leftover_name, $leftover_closed) {
     if ($handle) {
       if (($project_handle) &&
           ($project_handle->getPHID() == $handle->getPHID())) {
@@ -266,7 +289,8 @@
     return array ($cname, $cclass);
   }
 
-  private function buildOpenTasksTable($rows, $cname, $cclass, $order, 
$reverse) {
+  private function buildOpenTasksTable($rows, $cname, $cclass, $order,
+                                       $reverse) {
     $table = new AphrontTableView($rows);
     $table->setHeaders($cname);
     $table->setColumnClasses($cclass);

-- 
To view, visit https://gerrit.wikimedia.org/r/172227
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I53cf91cc6dd892814e6f34a30a0b9ee94edd8822
Gerrit-PatchSet: 4
Gerrit-Project: phabricator/extensions/Sprint
Gerrit-Branch: master
Gerrit-Owner: Christopher Johnson (WMDE) <christopher.john...@wikimedia.de>
Gerrit-Reviewer: Christopher Johnson (WMDE) <christopher.john...@wikimedia.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to