Christopher Johnson (WMDE) has uploaded a new change for review.
https://gerrit.wikimedia.org/r/172227
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, 134 insertions(+), 39 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/phabricator/extensions/Sprint
refs/changes/27/172227/1
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..8506279 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)
+ {
+ return $task_open_status_sum += $points;
+ }
+
+ public function setTaskClosedStatusSum ($task_closed_status_sum, $points)
+ {
+ return $task_closed_status_sum+=$points;
+ }
}
diff --git a/src/view/BurndownDataView.php b/src/view/BurndownDataView.php
index 004fce2..98e2ba1 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,15 @@
$points = trim($points, '"');
$priority_name = new ManiphestTaskPriority();
+
+ $status = $task->getStatus();
+ $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);
+ }
+
$depth_indent = '';
for ($i = 0; $i < $depth; $i++) {
$depth_indent .= ' ';
@@ -292,7 +330,7 @@
$task->getOwnerPHID() ? $owner->renderLink() : 'none assigned',
$priority_name->getTaskPriorityName($task->getPriority()),
$points,
- $task->getStatus(),
+ $status,
);
$included[$task->getPHID()] = $task->getPHID();
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: newchange
Gerrit-Change-Id: I53cf91cc6dd892814e6f34a30a0b9ee94edd8822
Gerrit-PatchSet: 1
Gerrit-Project: phabricator/extensions/Sprint
Gerrit-Branch: master
Gerrit-Owner: Christopher Johnson (WMDE) <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits