Christopher Johnson (WMDE) has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/177235

Change subject: Change SprintBuildStats logic
......................................................................

Change SprintBuildStats logic

Add sorting to EventsTable

Change-Id: Ifd3c975ce2508cedf5216acd940b44e6d8fd0e2d
---
M src/storage/SprintBuildStats.php
M src/storage/SprintTransaction.php
M src/util/BurndownDataDate.php
M src/view/BurndownDataView.php
M src/view/EventTableView.php
5 files changed, 170 insertions(+), 85 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/phabricator/extensions/Sprint 
refs/changes/35/177235/1

diff --git a/src/storage/SprintBuildStats.php b/src/storage/SprintBuildStats.php
index 77f15c5..d01c4d7 100644
--- a/src/storage/SprintBuildStats.php
+++ b/src/storage/SprintBuildStats.php
@@ -2,7 +2,9 @@
 
 final class SprintBuildStats {
   private $timezone;
+  private $total_tasks_added;
   private $tasks_remaining;
+  private $total_points_added;
   private $points_remaining;
 
   public function setTimezone ($viewer) {
@@ -51,13 +53,15 @@
     $first = true;
     $previous = new BurndownDataDate($date=null);
     foreach ($dates as $date) {
-      $tasks_added = $date->getTasksAddedToday();
+      $this->total_tasks_added += $date->getTasksAddedToday();
       if ($first) {
-        $date->setTasksTotal($tasks_added);
+        $date->setTasksTotal($this->total_tasks_added);
+        $tasks_total = $this->total_tasks_added;
       } else {
         $tasks_total = $date->sumTasksTotal($date, $previous);
         $date->setTasksTotal($tasks_total);
       }
+      $this->total_tasks_added += $tasks_total;
       $previous = $date;
       $first = false;
     }
@@ -68,15 +72,15 @@
     $first = true;
     $previous = new BurndownDataDate($date=null);
     foreach ($dates as $date) {
-      $points_added = $date->getPointsAddedToday();
+      $this->total_points_added += $date->getPointsAddedToday();
       if ($first) {
-        $points_before = $this->getPointsBefore();
-        $points_total = $points_added + $points_before;
-        $date->setPointsTotal($points_total);
+        $date->setPointsTotal($this->total_points_added);
+        $points_total = $this->total_points_added;
       } else {
         $points_total = $date->sumPointsTotal($date, $previous);
         $date->setPointsTotal($points_total);
       }
+      $this->total_points_added += $points_total;
       $previous = $date;
       $first = false;
     }
@@ -90,17 +94,23 @@
       $points_closed = $date->getPointsClosedToday();
       $points_reopened = $date->getPointsReopenedToday();
       $points_removed = $date->getPointsRemovedToday();
+
       if ($first) {
-        $points_total = ($points_added + $points_reopened) - ($points_removed 
+ $points_closed);
-        $net_change = 0;
+        $points_total = $points_added + $points_reopened - $points_removed - 
$points_closed;
+        $net_change =0;
       } else {
         $points_total = $this->points_remaining;
-        $net_change = ($points_added  + $points_reopened) - ($points_removed + 
$points_closed);
+        $net_change = $points_added + $points_reopened - $points_removed - 
$points_closed;
       }
-      $points_diff = abs($net_change);
-      $points_remaining = $points_total - $points_diff;
+
+      $points_diff = $net_change;
+      $points_remaining = $points_total + $points_diff;
+      if ($points_remaining < 0) {
+        $points_remaining = 0;
+      }
       $date->setPointsRemaining($points_remaining);
       $this->points_remaining = $points_remaining;
+
       $first = false;
     }
     return $dates;
@@ -114,14 +124,14 @@
       $tasks_reopened = $date->getTasksReopenedToday();
       $tasks_removed = $date->getTasksRemovedToday();
       if ($first) {
-        $tasks_total = ($tasks_added + $tasks_reopened) - ($tasks_removed + 
$tasks_closed);
+        $tasks_total = $tasks_added + $tasks_reopened - $tasks_removed - 
$tasks_closed;
         $net_change = 0;
       } else {
         $tasks_total = $this->tasks_remaining;
-        $net_change = ($tasks_added + $tasks_reopened) - ($tasks_removed + 
$tasks_closed);
+        $net_change = $tasks_added + $tasks_reopened - $tasks_removed - 
$tasks_closed;
       }
-      $tasks_diff = abs($net_change);
-      $tasks_remaining = $tasks_total - $tasks_diff;
+      $tasks_diff = $net_change;
+      $tasks_remaining = $tasks_total + $tasks_diff;
       $date->setTasksRemaining($tasks_remaining);
       $this->tasks_remaining = $tasks_remaining;
       $first = false;
diff --git a/src/storage/SprintTransaction.php 
b/src/storage/SprintTransaction.php
index 834956f..2cc5932 100644
--- a/src/storage/SprintTransaction.php
+++ b/src/storage/SprintTransaction.php
@@ -35,9 +35,14 @@
           case "points":
             // Points were changed
             $old_point_value = $xaction->getOldValue();
-           $this->SetPointsBefore($sprint_start, $task_phid, $points, 
$old_point_value, $dates);
+            $this->SetPointsBefore($sprint_start, $points, $old_point_value, 
$dates);
+            $this->closePoints($date, $task_phid, $points, $old_point_value, 
$dates);
             break;
         }
+      }
+
+      if ( $xaction_date > $end ) {
+        continue;
       }
 
         // Determine which date to attach this data to
@@ -75,9 +80,11 @@
               break;
             case "points":
               // Points were changed
-              $old_point_value = $xaction->getOldValue();
-              $this->changePoints($date, $task_phid, $points, 
$old_point_value, $dates);
-              $this->closePoints($date, $task_phid, $points, $old_point_value, 
$dates);
+              if ($this->task_in_sprint[$task_phid]) {
+                $old_point_value = $xaction->getOldValue();
+                $this->changePoints($date, $task_phid, $points, 
$old_point_value, $dates);
+                $this->closePoints($date, $task_phid, $points, 
$old_point_value, $dates);
+              }
               break;
           }
       }
@@ -155,11 +162,9 @@
     return $this->task_statuses[$task_phid];
   }
 
-  private function SetPointsBefore($points, $old_point_value, $dates) {
-    foreach ($dates as $date) {
-      $before = $points - $old_point_value;
-      $this->setPointsBefore = $before;
-    }
+  private function SetPointsBefore($sprint_start, $points,  $old_point_value, 
$dates) {
+    $points = $points - $old_point_value;
+    $dates[$sprint_start]->setPointsAddedToday($points);
   }
 
   private function SumTasksBefore($sprint_start, $dates) {
diff --git a/src/util/BurndownDataDate.php b/src/util/BurndownDataDate.php
index 30dd899..453711a 100644
--- a/src/util/BurndownDataDate.php
+++ b/src/util/BurndownDataDate.php
@@ -19,7 +19,6 @@
   // Totals over time
   private $tasks_total;
   private $tasks_remaining;
-  private $points_before;
   private $points_total;
   private $points_remaining;
   private $points_ideal_remaining;
@@ -32,7 +31,6 @@
 
   public function setTasksAddedToday () {
     return $this->tasks_added_today = $this->tasks_added_today +1;
-    return $this;
   }
 
   public function getTasksAddedToday () {
@@ -41,12 +39,14 @@
 
   public function setTasksRemovedToday () {
     return $this->tasks_removed_today = $this->tasks_removed_today + 1;
-    return $this;
   }
 
-  public function setTasksClosedToday () {
+  public function getTasksRemovedToday () {
+    return $this->tasks_removed_today;
+  }
+
+   public function setTasksClosedToday () {
     return $this->tasks_closed_today = $this->tasks_closed_today + 1;
-    return $this;
   }
 
   public function getTasksClosedToday () {
@@ -55,14 +55,9 @@
 
   public function setTasksReopenedToday () {
       return $this->tasks_reopened_today = $this->tasks_reopened_today + 1;
-    return $this;
   }
 
   public function getTasksReopenedToday () {
-    return $this->tasks_reopened_today;
-  }
-
-  public function getTasksRemovedToday () {
     return $this->tasks_reopened_today;
   }
 
@@ -83,7 +78,7 @@
   }
 
   public function setPointsAddedToday ($points) {
-    $this->points_added_today = $points;
+    $this->points_added_today = $this->points_added_today + $points;
   }
 
   public function getPointsAddedToday () {
@@ -91,7 +86,7 @@
   }
 
   public function setPointsClosedToday ($points) {
-    $this->points_closed_today = $points;
+    $this->points_closed_today = $this->points_closed_today + $points;
   }
 
   public function getPointsClosedToday () {
@@ -99,7 +94,7 @@
   }
 
   public function setPointsRemovedToday ($points) {
-    $this->points_removed_today = $points;
+    $this->points_removed_today = $this->points_removed_today + $points;
   }
 
   public function getPointsRemovedToday () {
@@ -107,7 +102,7 @@
   }
 
   public function setPointsReopenedToday ($points) {
-    $this->points_reopened_today = $points;
+    $this->points_reopened_today = $this->points_reopened_today + $points;
   }
 
   public function getPointsReopenedToday () {
@@ -116,14 +111,6 @@
 
   public function getDate() {
     return $this->date;
-  }
-
-   public function setPointsBefore($points) {
-    $this->points_before = $this->points_before + $points;
-  }
-
-  public function getPointsBefore() {
-    return $this->points_before;
   }
 
   public function setPointsTotal($points_total) {
diff --git a/src/view/BurndownDataView.php b/src/view/BurndownDataView.php
index 440af96..df3959d 100644
--- a/src/view/BurndownDataView.php
+++ b/src/view/BurndownDataView.php
@@ -40,8 +40,11 @@
     $pie = $this->buildC3Pie();
     $sprint_table = new SprintTableView();
     $burndown_table = $sprint_table->buildBurnDownTable($this->sprint_data);
-    $event_table = new EventTableView();
-    $event_table = $event_table->buildEventTable($this->project, 
$this->viewer);
+    $event_table = id(new EventTableView())
+        ->setProject($this->project)
+        ->setViewer($this->viewer)
+        ->setRequest($this->request);
+    $event_table = $event_table->buildEventTable();
     return array($chart, $tasks_table, $pie, $burndown_table, $event_table);
   }
 
diff --git a/src/view/EventTableView.php b/src/view/EventTableView.php
index a122142..f7dbd0b 100644
--- a/src/view/EventTableView.php
+++ b/src/view/EventTableView.php
@@ -1,15 +1,75 @@
 <?php
 
 final class EventTableView {
-  /**
-   * Format the Event data for display on the page.
-   *
-   * @returns PHUIObjectBoxView
-   */
-  public function buildEventTable($project, $viewer) {
+  private $project;
+  private $viewer;
+  private $request;
+
+  public function setProject ($project) {
+    $this->project = $project;
+    return $this;
+  }
+
+  public function setViewer ($viewer) {
+    $this->viewer = $viewer;
+    return $this;
+  }
+
+  public function setRequest ($request) {
+    $this->request =  $request;
+    return $this;
+  }
+
+  public function buildEventTable() {
+    $order = $this->request->getStr('ord', 'name');
+    list($order, $reverse) = AphrontTableView::parseSort($order);
+    $rows = $this->buildEventsTree($order, $reverse);
+    $table = id(new AphrontTableView($rows))
+        ->setHeaders(
+            array(
+                pht('Stamp'),
+                pht('When'),
+                pht('Task'),
+                pht('Action'),
+            ))
+        ->setColumnClasses(
+            array(
+                '',
+                '',
+                '',
+                'wide',
+            ));
+    $table->setColumnVisibility(
+        array(
+            false,
+            true,
+            true,
+            true,
+        ));
+    $table->makeSortable(
+        $this->request->getRequestURI(),
+        'ord',
+        $order,
+        $reverse,
+        array(
+            'When',
+            'Date',
+            'Task',
+            'Action',
+        )
+    );
+
+    $box = id(new PHUIObjectBoxView())
+        ->setHeaderText(pht('Events related to this sprint'))
+        ->appendChild($table);
+
+    return $box;
+  }
+
+  private function buildEventsTree ($order, $reverse) {
     $query = id(new SprintQuery())
-        ->setProject($project)
-        ->setViewer($viewer);
+        ->setProject($this->project)
+        ->setViewer($this->viewer);
     $aux_fields = $query->getAuxFields();
     $start = $query->getStartDate($aux_fields);
     $end = $query->getEndDate($aux_fields);
@@ -24,38 +84,58 @@
     foreach ($events as $event) {
       $task_phid = $xactions[$event['transactionPHID']]->getObjectPHID();
       $task = $tasks[$task_phid];
+      $row = $this->buildTableRow($event, $task);
+      list ($stamp, $when, $task, $action) = $row[0];
+      $row['sort'] = $this->setSortOrder($row, $order, $stamp, $when, $task, 
$action);
+      $rows[] = $row;
+     }
+    $rows = isort($rows, 'sort');
 
-      $rows[] = array(
-          phabricator_datetime($event['epoch'], $viewer),
-          phutil_tag(
-              'a',
-              array(
-                  'href' => '/' . $task->getMonogram(),
-              ),
-              $task->getMonogram() . ': ' . $task->getTitle()),
-          $event['title'],
-      );
+    foreach ($rows as $k => $row) {
+      unset($rows[$k]['sort']);
     }
 
-    $table = id(new AphrontTableView($rows))
-        ->setHeaders(
-            array(
-                pht('When'),
-                pht('Task'),
-                pht('Action'),
-            ))
-        ->setColumnClasses(
-            array(
-                '',
-                '',
-                'wide',
-            ));
-
-    $box = id(new PHUIObjectBoxView())
-        ->setHeaderText(pht('Events related to this sprint'))
-        ->appendChild($table);
-
-    return $box;
+    if ($reverse) {
+      $rows = array_reverse($rows);
+    }
+    $rows = array_map( function( $a ) { return $a['0']; }, $rows );
+    return $rows;
   }
 
+  private function buildTableRow($event, $task) {
+    $row[] = array(
+        $event['epoch'],
+        phabricator_datetime($event['epoch'], $this->viewer),
+        phutil_tag(
+            'a',
+            array(
+                'href' => '/' . $task->getMonogram(),
+            ),
+            $task->getMonogram() . ': ' . $task->getTitle()),
+        $event['title'],
+    );
+    return $row;
+  }
+
+  private function setSortOrder ($row, $order, $stamp, $when, $task, $action) {
+    switch ($order) {
+      case 'Date':
+      default:
+        $row['sort'] = -$stamp;
+        break;
+      case 'When':
+        $row['sort'] = $when;
+        break;
+      case 'Task':
+        $row['sort'] = $task;
+        break;
+      case 'Action':
+        $row['sort'] = $action;
+        break;
+    }
+    return $row['sort'];
+  }
+
+
+
 }
\ No newline at end of file

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifd3c975ce2508cedf5216acd940b44e6d8fd0e2d
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

Reply via email to