diff --git a/src/applications/flag/controller/PhabricatorFlagListController.php b/src/applications/flag/controller/PhabricatorFlagListController.php index 01e0e5c78d..ee18e5b2b2 100644 --- a/src/applications/flag/controller/PhabricatorFlagListController.php +++ b/src/applications/flag/controller/PhabricatorFlagListController.php @@ -1,80 +1,130 @@ getRequest(); $user = $request->getUser(); + $flag_order = $request->getStr('o', 'n'); $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI('/flag/view/')); $nav->addLabel(pht('Flags')); $nav->addFilter('all', pht('Your Flags')); $nav->selectFilter('all', 'all'); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addCrumb(id(new PhabricatorCrumbView) ->setName(pht('Flags')) ->setHref($request->getRequestURI())); $nav->setCrumbs($crumbs); $filter_form = new AphrontFormView(); $filter_form->setUser($user); $filter_form->appendChild( id(new AphrontFormToggleButtonsControl()) ->setName('o') ->setLabel(pht('Sort Order')) ->setBaseURI($request->getRequestURI(), 'o') - ->setValue($request->getStr('o', 'n')) + ->setValue($flag_order) ->setButtons( array( 'n' => pht('Date'), 'c' => pht('Color'), 'o' => pht('Object Type'), - 'r' => pht('Reason'), ))); $filter = new AphrontListFilterView(); $filter->appendChild($filter_form); $nav->appendChild($filter); $query = new PhabricatorFlagQuery(); $query->withOwnerPHIDs(array($user->getPHID())); $query->setViewer($user); $query->needHandles(true); - switch ($request->getStr('o', 'n')) { + switch ($flag_order) { + // 'r' + // 'a' case 'n': $order = PhabricatorFlagQuery::ORDER_ID; break; case 'c': $order = PhabricatorFlagQuery::ORDER_COLOR; break; case 'o': $order = PhabricatorFlagQuery::ORDER_OBJECT; break; - case 'r': - $order = PhabricatorFlagQuery::ORDER_REASON; - break; default: throw new Exception("Unknown order!"); } $query->withOrder($order); $flags = $query->execute(); - $view = new PhabricatorFlagListView(); - $view->setFlags($flags); - $view->setUser($user); + $views = array(); + if ($flag_order == 'n') { + $view = new PhabricatorFlagListView(); + $view->setFlags($flags); + $view->setUser($user); + $view->setFlush(true); + $views[] = array( + 'view' => $view, + ); + } else { + switch ($flag_order) { + case 'c': + $flags_tmp = mgroup($flags, 'getColor'); + $flags = array(); + foreach ($flags_tmp as $color => $flag_group) { + $title = pht('%s Flags', + PhabricatorFlagColor::getColorName($color)); + $flags[$title] = $flag_group; + } + break; + case 'o': + $flags_tmp = mgroup($flags, 'getType'); + $flags = array(); + foreach ($flags_tmp as $color => $flag_group) { + // Appending an 's' to fake plurals + $title = head($flag_group)->getHandle()->getTypeName() . 's'; + $flags[$title] = $flag_group; + } + break; + default: + throw new Exception("Unknown order!"); + } + + foreach ($flags as $group_title => $flag_group) { + $view = new PhabricatorFlagListView(); + $view->setFlags($flag_group); + $view->setUser($user); + $view->setFlush(true); + $views[] = array( + 'title' => pht('%s (%d)', $group_title, count($flag_group)), + 'view' => $view, + ); + } + } - $nav->appendChild($view); + foreach ($views as $view) { + $panel = new AphrontPanelView(); + $panel->setNoBackground(); + + $title = idx($view, 'title'); + if ($title) { + $panel->setHeader($title); + } + $panel->appendChild($view['view']); + $nav->appendChild($panel); + } return $this->buildApplicationPage( $nav, array( 'title' => pht('Flags'), 'dust' => true, )); } } diff --git a/src/applications/flag/query/PhabricatorFlagQuery.php b/src/applications/flag/query/PhabricatorFlagQuery.php index 20fb19e416..1edeedc0c6 100644 --- a/src/applications/flag/query/PhabricatorFlagQuery.php +++ b/src/applications/flag/query/PhabricatorFlagQuery.php @@ -1,194 +1,194 @@ viewer = $viewer; return $this; } public function withOwnerPHIDs(array $owner_phids) { $this->ownerPHIDs = $owner_phids; return $this; } public function withTypes(array $types) { $this->types = $types; return $this; } public function withObjectPHIDs(array $object_phids) { $this->objectPHIDs = $object_phids; return $this; } public function withOrder($order) { $this->order = $order; return $this; } public function needHandles($need) { $this->needHandles = $need; return $this; } public function needObjects($need) { $this->needObjects = $need; return $this; } public function setLimit($limit) { $this->limit = $limit; return $this; } public function setOffset($offset) { $this->offset = $offset; return $this; } public static function loadUserFlag(PhabricatorUser $user, $object_phid) { // Specifying the type in the query allows us to use a key. return id(new PhabricatorFlag())->loadOneWhere( 'ownerPHID = %s AND type = %s AND objectPHID = %s', $user->getPHID(), phid_get_type($object_phid), $object_phid); } public function execute() { $table = new PhabricatorFlag(); $conn_r = $table->establishConnection('r'); $where = $this->buildWhereClause($conn_r); $limit = $this->buildLimitClause($conn_r); $order = $this->buildOrderClause($conn_r); $data = queryfx_all( $conn_r, 'SELECT * FROM %T flag %Q %Q %Q', $table->getTableName(), $where, $order, $limit); $flags = $table->loadAllFromArray($data); if ($this->needHandles || $this->needObjects) { $phids = ipull($data, 'objectPHID'); $query = new PhabricatorObjectHandleData($phids); $query->setViewer($this->viewer); if ($this->needHandles) { $handles = $query->loadHandles(); foreach ($flags as $flag) { $handle = idx($handles, $flag->getObjectPHID()); if ($handle) { $flag->attachHandle($handle); } } } if ($this->needObjects) { $objects = $query->loadObjects(); foreach ($flags as $flag) { $object = idx($objects, $flag->getObjectPHID()); if ($object) { $flag->attachObject($object); } } } } return $flags; } private function buildWhereClause($conn_r) { $where = array(); if ($this->ownerPHIDs) { $where[] = qsprintf( $conn_r, 'flag.ownerPHID IN (%Ls)', $this->ownerPHIDs); } if ($this->types) { $where[] = qsprintf( $conn_r, 'flag.type IN (%Ls)', $this->types); } if ($this->objectPHIDs) { $where[] = qsprintf( $conn_r, 'flag.objectPHID IN (%Ls)', $this->objectPHIDs); } if ($where) { return 'WHERE ('.implode(') AND (', $where).')'; } else { return ''; } } private function buildOrderClause($conn_r) { return qsprintf($conn_r, 'ORDER BY %Q', $this->getOrderColumn($conn_r)); } private function getOrderColumn($conn_r) { switch ($this->order) { case self::ORDER_ID: return 'id DESC'; break; case self::ORDER_COLOR: - return 'color DESC'; + return 'color ASC'; break; case self::ORDER_OBJECT: - return 'type ASC'; + return 'type DESC'; break; case self::ORDER_REASON: return 'reasonPHID DESC'; break; default: throw new Exception("Unknown order {$this->order}!"); break; } } private function buildLimitClause($conn_r) { if ($this->limit && $this->offset) { return qsprintf($conn_r, 'LIMIT %d, %d', $this->offset, $this->limit); } else if ($this->limit) { return qsprintf($conn_r, 'LIMIT %d', $this->limit); } else if ($this->offset) { return qsprintf($conn_r, 'LIMIT %d, %d', $this->offset, PHP_INT_MAX); } else { return ''; } } }