diff --git a/src/applications/drydock/query/DrydockRepositoryOperationQuery.php b/src/applications/drydock/query/DrydockRepositoryOperationQuery.php --- a/src/applications/drydock/query/DrydockRepositoryOperationQuery.php +++ b/src/applications/drydock/query/DrydockRepositoryOperationQuery.php @@ -9,6 +9,7 @@ private $operationStates; private $operationTypes; private $isDismissed; + private $authorPHIDs; public function withIDs(array $ids) { $this->ids = $ids; @@ -45,6 +46,11 @@ return $this; } + public function withAuthorPHIDs(array $phids) { + $this->authorPHIDs = $phids; + return $this; + } + public function newResultObject() { return new DrydockRepositoryOperation(); } @@ -165,6 +171,13 @@ (int)$this->isDismissed); } + if ($this->authorPHIDs !== null) { + $where[] = qsprintf( + $conn, + 'authorPHID IN (%Ls)', + $this->authorPHIDs); + } + return $where; } diff --git a/src/applications/drydock/query/DrydockRepositoryOperationSearchEngine.php b/src/applications/drydock/query/DrydockRepositoryOperationSearchEngine.php --- a/src/applications/drydock/query/DrydockRepositoryOperationSearchEngine.php +++ b/src/applications/drydock/query/DrydockRepositoryOperationSearchEngine.php @@ -18,11 +18,41 @@ protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); + if ($map['repositoryPHIDs']) { + $query->withRepositoryPHIDs($map['repositoryPHIDs']); + } + + if ($map['authorPHIDs']) { + $query->withAuthorPHIDs($map['authorPHIDs']); + } + + if ($map['states']) { + $query->withOperationStates($map['states']); + } + return $query; } protected function buildCustomSearchFields() { return array( + id(new PhabricatorSearchDatasourceField()) + ->setLabel(pht('Repositories')) + ->setKey('repositoryPHIDs') + ->setAliases(array('repository', 'repositories', 'repositoryPHID')) + ->setDatasource(new DiffusionRepositoryFunctionDatasource()), + + // NOTE: Repository operations aren't necessarily created by a real + // user, but for now they normally are. Just use a user typeahead until + // more use cases arise. + id(new PhabricatorUsersSearchField()) + ->setLabel(pht('Authors')) + ->setKey('authorPHIDs') + ->setAliases(array('author', 'authors', 'authorPHID')), + id(new PhabricatorSearchCheckboxesField()) + ->setLabel(pht('States')) + ->setKey('states') + ->setAliases(array('state')) + ->setOptions(DrydockRepositoryOperation::getOperationStateNameMap()), ); } @@ -72,6 +102,10 @@ $item->setStatusIcon($icon, $name); + + $created = phabricator_datetime($operation->getDateCreated(), $viewer); + $item->addIcon(null, $created); + $item->addByline( array( pht('Via:'), diff --git a/src/applications/drydock/storage/DrydockRepositoryOperation.php b/src/applications/drydock/storage/DrydockRepositoryOperation.php --- a/src/applications/drydock/storage/DrydockRepositoryOperation.php +++ b/src/applications/drydock/storage/DrydockRepositoryOperation.php @@ -99,6 +99,15 @@ return $this; } + public static function getOperationStateNameMap() { + return array( + self::STATE_WAIT => pht('Waiting'), + self::STATE_WORK => pht('Working'), + self::STATE_DONE => pht('Done'), + self::STATE_FAIL => pht('Failed'), + ); + } + public static function getOperationStateIcon($state) { $map = array( self::STATE_WAIT => 'fa-clock-o', @@ -111,13 +120,7 @@ } public static function getOperationStateName($state) { - $map = array( - self::STATE_WAIT => pht('Waiting'), - self::STATE_WORK => pht('Working'), - self::STATE_DONE => pht('Done'), - self::STATE_FAIL => pht('Failed'), - ); - + $map = self::getOperationStateNameMap(); return idx($map, $state, pht('', $state)); }