public function render()
 {
     $project_phid = $this->request->getStr('project');
     $project_handle = null;
     if ($project_phid) {
         $phids = array($project_phid);
         $project_handle = $this->getProjectHandle($phids, $project_phid, $this->request);
         $tasks = $this->getOpenTasksforProject($this->user, $phids);
     } else {
         $tasks = $this->getOpenTasks($this->user);
     }
     $recently_closed = $this->loadRecentlyClosedTasks();
     $date = phabricator_date(time(), $this->user);
     $viewer_task_view = new UserOpenTasksView();
     $project_task_view = new ProjectOpenTasksView();
     if ($this->view == 'user') {
         list($leftover, $leftover_closed, $base_link, $leftover_name, $col_header, $header, $result_closed, $result) = $viewer_task_view->execute($tasks, $recently_closed, $date);
     } else {
         if ($this->view == 'project') {
             list($leftover, $base_link, $leftover_name, $col_header, $header, $result_closed, $leftover_closed, $result) = $project_task_view->execute($tasks, $recently_closed, $date);
         } else {
             $result = array();
             $result_closed = array();
             $base_link = null;
             $leftover = array();
             $leftover_closed = array();
             $leftover_name = null;
             $col_header = '';
             $header = '';
         }
     }
     $order = $this->request->getStr('order', 'name');
     list($order, $reverse) = AphrontTableView::parseSort($order);
     require_celerity_resource('aphront-tooltip-css');
     Javelin::initBehavior('phabricator-tooltips', array());
     $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);
     $panel = new PHUIObjectBoxView();
     $panel->setHeaderText($header);
     $panel->setTable($table);
     $tokens = array();
     if ($project_handle) {
         $tokens = array($project_handle);
     }
     $filter = $this->renderReportFilters($tokens, $has_window = false, $this->request, $this->user);
     return array($filter, $panel);
 }
 public function renderExample()
 {
     $rows = array(array('make' => 'Honda', 'model' => 'Civic', 'year' => 2004, 'price' => 3199, 'color' => pht('Blue')), array('make' => 'Ford', 'model' => 'Focus', 'year' => 2001, 'price' => 2549, 'color' => pht('Red')), array('make' => 'Toyota', 'model' => 'Camry', 'year' => 2009, 'price' => 4299, 'color' => pht('Black')), array('make' => 'NASA', 'model' => 'Shuttle', 'year' => 1998, 'price' => 1000000000, 'color' => pht('White')));
     $request = $this->getRequest();
     $orders = array('make', 'model', 'year', 'price');
     $sort = $request->getStr('sort');
     list($sort, $reverse) = AphrontTableView::parseSort($sort);
     if (!in_array($sort, $orders)) {
         $sort = 'make';
     }
     $rows = isort($rows, $sort);
     if ($reverse) {
         $rows = array_reverse($rows);
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array(pht('Make'), pht('Model'), pht('Year'), pht('Price'), pht('Color')));
     $table->setColumnClasses(array('', 'wide', 'n', 'n', ''));
     $table->makeSortable($request->getRequestURI(), 'sort', $sort, $reverse, $orders);
     $panel = new PHUIObjectBoxView();
     $panel->setHeaderText(pht('Sortable Table of Vehicles'));
     $panel->appendChild($table);
     return $panel;
 }
 public function renderOpenTasks()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $query = id(new ManiphestTaskQuery())->withStatus(ManiphestTaskQuery::STATUS_OPEN);
     $project_phid = $request->getStr('project');
     $project_handle = null;
     if ($project_phid) {
         $phids = array($project_phid);
         $handles = $this->loadViewerHandles($phids);
         $project_handle = $handles[$project_phid];
         $query->withAnyProjects($phids);
     }
     $tasks = $query->execute();
     $recently_closed = $this->loadRecentlyClosedTasks();
     $date = phabricator_date(time(), $user);
     switch ($this->view) {
         case 'user':
             $result = mgroup($tasks, 'getOwnerPHID');
             $leftover = idx($result, '', array());
             unset($result['']);
             $result_closed = mgroup($recently_closed, 'getOwnerPHID');
             $leftover_closed = idx($result_closed, '', array());
             unset($result_closed['']);
             $base_link = '/maniphest/?users=';
             $leftover_name = phutil_render_tag('a', array('href' => $base_link . ManiphestTaskOwner::OWNER_UP_FOR_GRABS), '<em>(Up For Grabs)</em>');
             $col_header = 'User';
             $header = 'Open Tasks by User and Priority (' . $date . ')';
             break;
         case 'project':
             $result = array();
             $leftover = array();
             foreach ($tasks as $task) {
                 $phids = $task->getProjectPHIDs();
                 if ($phids) {
                     foreach ($phids as $project_phid) {
                         $result[$project_phid][] = $task;
                     }
                 } else {
                     $leftover[] = $task;
                 }
             }
             $result_closed = array();
             $leftover_closed = array();
             foreach ($recently_closed as $task) {
                 $phids = $task->getProjectPHIDs();
                 if ($phids) {
                     foreach ($phids as $project_phid) {
                         $result_closed[$project_phid][] = $task;
                     }
                 } else {
                     $leftover_closed[] = $task;
                 }
             }
             $base_link = '/maniphest/view/all/?projects=';
             $leftover_name = phutil_render_tag('a', array('href' => $base_link . ManiphestTaskOwner::PROJECT_NO_PROJECT), '<em>(No Project)</em>');
             $col_header = 'Project';
             $header = 'Open Tasks by Project and Priority (' . $date . ')';
             break;
     }
     $phids = array_keys($result);
     $handles = $this->loadViewerHandles($phids);
     $handles = msort($handles, 'getName');
     $order = $request->getStr('order', 'name');
     list($order, $reverse) = AphrontTableView::parseSort($order);
     require_celerity_resource('aphront-tooltip-css');
     Javelin::initBehavior('phabricator-tooltips', array());
     $rows = array();
     $pri_total = array();
     foreach (array_merge($handles, array(null)) as $handle) {
         if ($handle) {
             if ($project_handle && $project_handle->getPHID() == $handle->getPHID()) {
                 // If filtering by, e.g., "bugs", don't show a "bugs" group.
                 continue;
             }
             $tasks = idx($result, $handle->getPHID(), array());
             $name = phutil_render_tag('a', array('href' => $base_link . $handle->getPHID()), phutil_escape_html($handle->getName()));
             $closed = idx($result_closed, $handle->getPHID(), array());
         } else {
             $tasks = $leftover;
             $name = $leftover_name;
             $closed = $leftover_closed;
         }
         $taskv = $tasks;
         $tasks = mgroup($tasks, 'getPriority');
         $row = array();
         $row[] = $name;
         $total = 0;
         foreach (ManiphestTaskPriority::getTaskPriorityMap() as $pri => $label) {
             $n = count(idx($tasks, $pri, array()));
             if ($n == 0) {
                 $row[] = '-';
             } else {
                 $row[] = number_format($n);
             }
             $total += $n;
         }
         $row[] = number_format($total);
         list($link, $oldest_all) = $this->renderOldest($taskv);
         $row[] = $link;
         $normal_or_better = array();
         foreach ($taskv as $id => $task) {
             if ($task->getPriority() < ManiphestTaskPriority::PRIORITY_NORMAL) {
                 continue;
             }
             $normal_or_better[$id] = $task;
         }
         list($link, $oldest_pri) = $this->renderOldest($normal_or_better);
         $row[] = $link;
         if ($closed) {
             $task_ids = implode(',', mpull($closed, 'getID'));
             $row[] = phutil_render_tag('a', array('href' => '/maniphest/view/custom/?s=oc&tasks=' . $task_ids, 'target' => '_blank'), phutil_escape_html(number_format(count($closed))));
         } else {
             $row[] = '-';
         }
         switch ($order) {
             case 'total':
                 $row['sort'] = $total;
                 break;
             case 'oldest-all':
                 $row['sort'] = $oldest_all;
                 break;
             case 'oldest-pri':
                 $row['sort'] = $oldest_pri;
                 break;
             case 'closed':
                 $row['sort'] = count($closed);
                 break;
             case 'name':
             default:
                 $row['sort'] = $handle ? $handle->getName() : '~';
                 break;
         }
         $rows[] = $row;
     }
     $rows = isort($rows, 'sort');
     foreach ($rows as $k => $row) {
         unset($rows[$k]['sort']);
     }
     if ($reverse) {
         $rows = array_reverse($rows);
     }
     $cname = array($col_header);
     $cclass = array('pri right wide');
     $pri_map = ManiphestTaskPriority::getTaskBriefPriorityMap();
     foreach ($pri_map as $pri => $label) {
         $cname[] = $label;
         $cclass[] = 'n';
     }
     $cname[] = 'Total';
     $cclass[] = 'n';
     $cname[] = javelin_render_tag('span', array('sigil' => 'has-tooltip', 'meta' => array('tip' => 'Oldest open task.', 'size' => 200)), 'Oldest (All)');
     $cclass[] = 'n';
     $cname[] = javelin_render_tag('span', array('sigil' => 'has-tooltip', 'meta' => array('tip' => 'Oldest open task, excluding those with Low or Wishlist ' . 'priority.', 'size' => 200)), 'Oldest (Pri)');
     $cclass[] = 'n';
     list($ignored, $window_epoch) = $this->getWindow();
     $cname[] = javelin_render_tag('span', array('sigil' => 'has-tooltip', 'meta' => array('tip' => 'Closed after ' . phabricator_datetime($window_epoch, $user), 'size' => 260)), 'Recently Closed');
     $cclass[] = 'n';
     $table = new AphrontTableView($rows);
     $table->setHeaders($cname);
     $table->setColumnClasses($cclass);
     $table->makeSortable($request->getRequestURI(), 'order', $order, $reverse, array('name', null, null, null, null, null, null, 'total', 'oldest-all', 'oldest-pri', 'closed'));
     $panel = new AphrontPanelView();
     $panel->setHeader($header);
     $panel->appendChild($table);
     $tokens = array();
     if ($project_handle) {
         $tokens = array($project_handle->getPHID() => $project_handle->getFullName());
     }
     $filter = $this->renderReportFilters($tokens, $has_window = true);
     return array($filter, $panel);
 }
 public function renderOpenTasks()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $query = id(new ManiphestTaskQuery())->setViewer($viewer)->withStatuses(ManiphestTaskStatus::getOpenStatusConstants());
     switch ($this->view) {
         case 'project':
             $query->needProjectPHIDs(true);
             break;
     }
     $project_phid = $request->getStr('project');
     $project_handle = null;
     if ($project_phid) {
         $phids = array($project_phid);
         $handles = $this->loadViewerHandles($phids);
         $project_handle = $handles[$project_phid];
         $query->withEdgeLogicPHIDs(PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, PhabricatorQueryConstraint::OPERATOR_OR, $phids);
     }
     $tasks = $query->execute();
     $recently_closed = $this->loadRecentlyClosedTasks();
     $date = phabricator_date(time(), $viewer);
     switch ($this->view) {
         case 'user':
             $result = mgroup($tasks, 'getOwnerPHID');
             $leftover = idx($result, '', array());
             unset($result['']);
             $result_closed = mgroup($recently_closed, 'getOwnerPHID');
             $leftover_closed = idx($result_closed, '', array());
             unset($result_closed['']);
             $base_link = '/maniphest/?assigned=';
             $leftover_name = phutil_tag('em', array(), pht('(Up For Grabs)'));
             $col_header = pht('User');
             $header = pht('Open Tasks by User and Priority (%s)', $date);
             break;
         case 'project':
             $result = array();
             $leftover = array();
             foreach ($tasks as $task) {
                 $phids = $task->getProjectPHIDs();
                 if ($phids) {
                     foreach ($phids as $project_phid) {
                         $result[$project_phid][] = $task;
                     }
                 } else {
                     $leftover[] = $task;
                 }
             }
             $result_closed = array();
             $leftover_closed = array();
             foreach ($recently_closed as $task) {
                 $phids = $task->getProjectPHIDs();
                 if ($phids) {
                     foreach ($phids as $project_phid) {
                         $result_closed[$project_phid][] = $task;
                     }
                 } else {
                     $leftover_closed[] = $task;
                 }
             }
             $base_link = '/maniphest/?projects=';
             $leftover_name = phutil_tag('em', array(), pht('(No Project)'));
             $col_header = pht('Project');
             $header = pht('Open Tasks by Project and Priority (%s)', $date);
             break;
     }
     $phids = array_keys($result);
     $handles = $this->loadViewerHandles($phids);
     $handles = msort($handles, 'getName');
     $order = $request->getStr('order', 'name');
     list($order, $reverse) = AphrontTableView::parseSort($order);
     require_celerity_resource('aphront-tooltip-css');
     Javelin::initBehavior('phabricator-tooltips', array());
     $rows = array();
     $pri_total = array();
     foreach (array_merge($handles, array(null)) as $handle) {
         if ($handle) {
             if ($project_handle && $project_handle->getPHID() == $handle->getPHID()) {
                 // If filtering by, e.g., "bugs", don't show a "bugs" group.
                 continue;
             }
             $tasks = idx($result, $handle->getPHID(), array());
             $name = phutil_tag('a', array('href' => $base_link . $handle->getPHID()), $handle->getName());
             $closed = idx($result_closed, $handle->getPHID(), array());
         } else {
             $tasks = $leftover;
             $name = $leftover_name;
             $closed = $leftover_closed;
         }
         $taskv = $tasks;
         $tasks = mgroup($tasks, 'getPriority');
         $row = array();
         $row[] = $name;
         $total = 0;
         foreach (ManiphestTaskPriority::getTaskPriorityMap() as $pri => $label) {
             $n = count(idx($tasks, $pri, array()));
             if ($n == 0) {
                 $row[] = '-';
             } else {
                 $row[] = number_format($n);
             }
             $total += $n;
         }
         $row[] = number_format($total);
         list($link, $oldest_all) = $this->renderOldest($taskv);
         $row[] = $link;
         $normal_or_better = array();
         foreach ($taskv as $id => $task) {
             // TODO: This is sort of a hard-code for the default "normal" status.
             // When reports are more powerful, this should be made more general.
             if ($task->getPriority() < 50) {
                 continue;
             }
             $normal_or_better[$id] = $task;
         }
         list($link, $oldest_pri) = $this->renderOldest($normal_or_better);
         $row[] = $link;
         if ($closed) {
             $task_ids = implode(',', mpull($closed, 'getID'));
             $row[] = phutil_tag('a', array('href' => '/maniphest/?ids=' . $task_ids, 'target' => '_blank'), number_format(count($closed)));
         } else {
             $row[] = '-';
         }
         switch ($order) {
             case 'total':
                 $row['sort'] = $total;
                 break;
             case 'oldest-all':
                 $row['sort'] = $oldest_all;
                 break;
             case 'oldest-pri':
                 $row['sort'] = $oldest_pri;
                 break;
             case 'closed':
                 $row['sort'] = count($closed);
                 break;
             case 'name':
             default:
                 $row['sort'] = $handle ? $handle->getName() : '~';
                 break;
         }
         $rows[] = $row;
     }
     $rows = isort($rows, 'sort');
     foreach ($rows as $k => $row) {
         unset($rows[$k]['sort']);
     }
     if ($reverse) {
         $rows = array_reverse($rows);
     }
     $cname = array($col_header);
     $cclass = array('pri right wide');
     $pri_map = ManiphestTaskPriority::getShortNameMap();
     foreach ($pri_map as $pri => $label) {
         $cname[] = $label;
         $cclass[] = 'n';
     }
     $cname[] = pht('Total');
     $cclass[] = 'n';
     $cname[] = javelin_tag('span', array('sigil' => 'has-tooltip', 'meta' => array('tip' => pht('Oldest open task.'), 'size' => 200)), pht('Oldest (All)'));
     $cclass[] = 'n';
     $cname[] = javelin_tag('span', array('sigil' => 'has-tooltip', 'meta' => array('tip' => pht('Oldest open task, excluding those with Low or Wishlist priority.'), 'size' => 200)), pht('Oldest (Pri)'));
     $cclass[] = 'n';
     list($ignored, $window_epoch) = $this->getWindow();
     $edate = phabricator_datetime($window_epoch, $viewer);
     $cname[] = javelin_tag('span', array('sigil' => 'has-tooltip', 'meta' => array('tip' => pht('Closed after %s', $edate), 'size' => 260)), pht('Recently Closed'));
     $cclass[] = 'n';
     $table = new AphrontTableView($rows);
     $table->setHeaders($cname);
     $table->setColumnClasses($cclass);
     $table->makeSortable($request->getRequestURI(), 'order', $order, $reverse, array('name', null, null, null, null, null, null, 'total', 'oldest-all', 'oldest-pri', 'closed'));
     $panel = new PHUIObjectBoxView();
     $panel->setHeaderText($header);
     $panel->setTable($table);
     $tokens = array();
     if ($project_handle) {
         $tokens = array($project_handle);
     }
     $filter = $this->renderReportFilters($tokens, $has_window = true);
     return array($filter, $panel);
 }