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 .= ' '; @@ -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