mirror of
https://we.phorge.it/source/phorge.git
synced 2025-03-28 12:08:14 +01:00
Summary: Ref T8441. Ref T7715. Automatically generate a modern "Order" control in ApplicationSearch for engines which fully support SearchField. Notably, this allows the standard "Order" control to automatically support custom field orders. We do this in Maniphest today, but in an ad-hoc way. Test Plan: Performed order-by queries in Almanac (Services), Pholio, Files, People, Projects, and Paste. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7715, T8441 Differential Revision: https://secure.phabricator.com/D13193
133 lines
3.4 KiB
PHP
133 lines
3.4 KiB
PHP
<?php
|
|
|
|
final class PholioMockSearchEngine extends PhabricatorApplicationSearchEngine {
|
|
|
|
public function getResultTypeDescription() {
|
|
return pht('Pholio Mocks');
|
|
}
|
|
|
|
public function getApplicationClassName() {
|
|
return 'PhabricatorPholioApplication';
|
|
}
|
|
|
|
public function newQuery() {
|
|
return id(new PholioMockQuery())
|
|
->needCoverFiles(true)
|
|
->needImages(true)
|
|
->needTokenCounts(true);
|
|
}
|
|
|
|
protected function buildCustomSearchFields() {
|
|
return array(
|
|
id(new PhabricatorSearchUsersField())
|
|
->setKey('authorPHIDs')
|
|
->setAliases(array('authors'))
|
|
->setLabel(pht('Authors')),
|
|
id(new PhabricatorSearchCheckboxesField())
|
|
->setKey('statuses')
|
|
->setLabel(pht('Status'))
|
|
->setOptions(
|
|
id(new PholioMock())
|
|
->getStatuses()),
|
|
);
|
|
}
|
|
|
|
public function buildQueryFromParameters(array $map) {
|
|
$query = $this->newQuery();
|
|
|
|
if ($map['authorPHIDs']) {
|
|
$query->withAuthorPHIDs($map['authorPHIDs']);
|
|
}
|
|
|
|
if ($map['statuses']) {
|
|
$query->withStatuses($map['statuses']);
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
protected function getURI($path) {
|
|
return '/pholio/'.$path;
|
|
}
|
|
|
|
protected function getBuiltinQueryNames() {
|
|
$names = array(
|
|
'open' => pht('Open Mocks'),
|
|
'all' => pht('All Mocks'),
|
|
);
|
|
|
|
if ($this->requireViewer()->isLoggedIn()) {
|
|
$names['authored'] = pht('Authored');
|
|
}
|
|
|
|
return $names;
|
|
}
|
|
|
|
public function buildSavedQueryFromBuiltin($query_key) {
|
|
$query = $this->newSavedQuery();
|
|
$query->setQueryKey($query_key);
|
|
|
|
switch ($query_key) {
|
|
case 'open':
|
|
return $query->setParameter(
|
|
'statuses',
|
|
array('open'));
|
|
case 'all':
|
|
return $query;
|
|
case 'authored':
|
|
return $query->setParameter(
|
|
'authorPHIDs',
|
|
array($this->requireViewer()->getPHID()));
|
|
}
|
|
|
|
return parent::buildSavedQueryFromBuiltin($query_key);
|
|
}
|
|
|
|
protected function getRequiredHandlePHIDsForResultList(
|
|
array $mocks,
|
|
PhabricatorSavedQuery $query) {
|
|
return mpull($mocks, 'getAuthorPHID');
|
|
}
|
|
|
|
protected function renderResultList(
|
|
array $mocks,
|
|
PhabricatorSavedQuery $query,
|
|
array $handles) {
|
|
assert_instances_of($mocks, 'PholioMock');
|
|
|
|
$viewer = $this->requireViewer();
|
|
|
|
$xform = PhabricatorFileTransform::getTransformByKey(
|
|
PhabricatorFileThumbnailTransform::TRANSFORM_PINBOARD);
|
|
|
|
$board = new PHUIPinboardView();
|
|
foreach ($mocks as $mock) {
|
|
|
|
$image = $mock->getCoverFile();
|
|
$image_uri = $image->getURIForTransform($xform);
|
|
list($x, $y) = $xform->getTransformedDimensions($image);
|
|
|
|
$header = 'M'.$mock->getID().' '.$mock->getName();
|
|
$item = id(new PHUIPinboardItemView())
|
|
->setHeader($header)
|
|
->setURI('/M'.$mock->getID())
|
|
->setImageURI($image_uri)
|
|
->setImageSize($x, $y)
|
|
->setDisabled($mock->isClosed())
|
|
->addIconCount('fa-picture-o', count($mock->getImages()))
|
|
->addIconCount('fa-trophy', $mock->getTokenCount());
|
|
|
|
if ($mock->getAuthorPHID()) {
|
|
$author_handle = $handles[$mock->getAuthorPHID()];
|
|
$datetime = phabricator_date($mock->getDateCreated(), $viewer);
|
|
$item->appendChild(
|
|
pht('By %s on %s', $author_handle->renderLink(), $datetime));
|
|
}
|
|
|
|
$board->addItem($item);
|
|
}
|
|
|
|
return $board;
|
|
}
|
|
|
|
}
|