Changeset View
Changeset View
Standalone View
Standalone View
src/applications/fund/query/FundInitiativeSearchEngine.php
<?php | <?php | ||||
final class FundInitiativeSearchEngine | final class FundInitiativeSearchEngine | ||||
extends PhabricatorApplicationSearchEngine { | extends PhabricatorApplicationSearchEngine { | ||||
public function getResultTypeDescription() { | public function getResultTypeDescription() { | ||||
return pht('Fund Initiatives'); | return pht('Fund Initiatives'); | ||||
} | } | ||||
public function getApplicationClassName() { | public function getApplicationClassName() { | ||||
return 'PhabricatorFundApplication'; | return 'PhabricatorFundApplication'; | ||||
} | } | ||||
public function buildSavedQueryFromRequest(AphrontRequest $request) { | public function newQuery() { | ||||
$saved = new PhabricatorSavedQuery(); | return new FundInitiativeQuery(); | ||||
} | |||||
$saved->setParameter( | |||||
'ownerPHIDs', | |||||
$this->readUsersFromRequest($request, 'owners')); | |||||
$saved->setParameter( | |||||
'statuses', | |||||
$this->readListFromRequest($request, 'statuses')); | |||||
return $saved; | protected function buildCustomSearchFields() { | ||||
return array( | |||||
id(new PhabricatorUsersSearchField()) | |||||
->setKey('ownerPHIDs') | |||||
->setAliases(array('owner', 'ownerPHID', 'owners')) | |||||
->setLabel(pht('Owners')), | |||||
id(new PhabricatorSearchCheckboxesField()) | |||||
->setKey('statuses') | |||||
->setLabel(pht('Statuses')) | |||||
->setOptions(FundInitiative::getStatusNameMap()), | |||||
); | |||||
} | } | ||||
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { | protected function buildQueryFromParameters(array $map) { | ||||
$query = id(new FundInitiativeQuery()) | $query = $this->newQuery(); | ||||
->needProjectPHIDs(true); | |||||
$owner_phids = $saved->getParameter('ownerPHIDs'); | if ($map['ownerPHIDs']) { | ||||
if ($owner_phids) { | $query->withOwnerPHIDs($map['ownerPHIDs']); | ||||
$query->withOwnerPHIDs($owner_phids); | |||||
} | } | ||||
$statuses = $saved->getParameter('statuses'); | if ($map['statuses']) { | ||||
if ($statuses) { | $query->withStatuses($map['statuses']); | ||||
$query->withStatuses($statuses); | |||||
} | } | ||||
return $query; | return $query; | ||||
} | } | ||||
public function buildSearchForm( | |||||
AphrontFormView $form, | |||||
PhabricatorSavedQuery $saved) { | |||||
$statuses = $saved->getParameter('statuses', array()); | |||||
$statuses = array_fuse($statuses); | |||||
$owner_phids = $saved->getParameter('ownerPHIDs', array()); | |||||
$status_map = FundInitiative::getStatusNameMap(); | |||||
$status_control = id(new AphrontFormCheckboxControl()) | |||||
->setLabel(pht('Statuses')); | |||||
foreach ($status_map as $status => $name) { | |||||
$status_control->addCheckbox( | |||||
'statuses[]', | |||||
$status, | |||||
$name, | |||||
isset($statuses[$status])); | |||||
} | |||||
$form | |||||
->appendControl( | |||||
id(new AphrontFormTokenizerControl()) | |||||
->setLabel(pht('Owners')) | |||||
->setName('owners') | |||||
->setDatasource(new PhabricatorPeopleDatasource()) | |||||
->setValue($owner_phids)) | |||||
->appendChild($status_control); | |||||
} | |||||
protected function getURI($path) { | protected function getURI($path) { | ||||
return '/fund/'.$path; | return '/fund/'.$path; | ||||
} | } | ||||
protected function getBuiltinQueryNames() { | protected function getBuiltinQueryNames() { | ||||
$names = array(); | $names = array(); | ||||
$names['open'] = pht('Open Initiatives'); | $names['open'] = pht('Open Initiatives'); | ||||
Show All 24 Lines | switch ($query_key) { | ||||
array( | array( | ||||
FundInitiative::STATUS_OPEN, | FundInitiative::STATUS_OPEN, | ||||
)); | )); | ||||
} | } | ||||
return parent::buildSavedQueryFromBuiltin($query_key); | return parent::buildSavedQueryFromBuiltin($query_key); | ||||
} | } | ||||
protected function getRequiredHandlePHIDsForResultList( | |||||
array $initiatives, | |||||
PhabricatorSavedQuery $query) { | |||||
$phids = array(); | |||||
foreach ($initiatives as $initiative) { | |||||
$phids[] = $initiative->getOwnerPHID(); | |||||
foreach ($initiative->getProjectPHIDs() as $project_phid) { | |||||
$phids[] = $project_phid; | |||||
} | |||||
} | |||||
return $phids; | |||||
} | |||||
protected function renderResultList( | protected function renderResultList( | ||||
array $initiatives, | array $initiatives, | ||||
PhabricatorSavedQuery $query, | PhabricatorSavedQuery $query, | ||||
array $handles) { | array $handles) { | ||||
assert_instances_of($initiatives, 'FundInitiative'); | assert_instances_of($initiatives, 'FundInitiative'); | ||||
$viewer = $this->requireViewer(); | $viewer = $this->requireViewer(); | ||||
$list = id(new PHUIObjectItemListView()); | $load_phids = array(); | ||||
foreach ($initiatives as $initiative) { | |||||
$load_phids[] = $initiative->getOwnerPHID(); | |||||
} | |||||
if ($initiatives) { | |||||
$edge_query = id(new PhabricatorEdgeQuery()) | |||||
->withSourcePHIDs(mpull($initiatives, 'getPHID')) | |||||
->withEdgeTypes( | |||||
array( | |||||
PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, | |||||
)); | |||||
$edge_query->execute(); | |||||
foreach ($edge_query->getDestinationPHIDs() as $phid) { | |||||
$load_phids[] = $phid; | |||||
} | |||||
} | |||||
$handles = $viewer->loadHandles($load_phids); | |||||
$handles = iterator_to_array($handles); | |||||
$list = new PHUIObjectItemListView(); | |||||
foreach ($initiatives as $initiative) { | foreach ($initiatives as $initiative) { | ||||
$owner_handle = $handles[$initiative->getOwnerPHID()]; | $owner_handle = $handles[$initiative->getOwnerPHID()]; | ||||
$item = id(new PHUIObjectItemView()) | $item = id(new PHUIObjectItemView()) | ||||
->setObjectName($initiative->getMonogram()) | ->setObjectName($initiative->getMonogram()) | ||||
->setHeader($initiative->getName()) | ->setHeader($initiative->getName()) | ||||
->setHref('/'.$initiative->getMonogram()) | ->setHref('/'.$initiative->getMonogram()) | ||||
->addByline(pht('Owner: %s', $owner_handle->renderLink())); | ->addByline(pht('Owner: %s', $owner_handle->renderLink())); | ||||
if ($initiative->isClosed()) { | if ($initiative->isClosed()) { | ||||
$item->setDisabled(true); | $item->setDisabled(true); | ||||
} | } | ||||
$project_handles = array_select_keys( | $project_phids = $edge_query->getDestinationPHIDs( | ||||
$handles, | array( | ||||
$initiative->getProjectPHIDs()); | $initiative->getPHID(), | ||||
)); | |||||
$project_handles = array_select_keys($handles, $project_phids); | |||||
if ($project_handles) { | if ($project_handles) { | ||||
$item->addAttribute( | $item->addAttribute( | ||||
id(new PHUIHandleTagListView()) | id(new PHUIHandleTagListView()) | ||||
->setLimit(4) | ->setLimit(4) | ||||
->setSlim(true) | ->setSlim(true) | ||||
->setHandles($project_handles)); | ->setHandles($project_handles)); | ||||
} | } | ||||
$list->addItem($item); | $list->addItem($item); | ||||
} | } | ||||
$result = new PhabricatorApplicationSearchResultView(); | $result = new PhabricatorApplicationSearchResultView(); | ||||
$result->setObjectList($list); | $result->setObjectList($list); | ||||
$result->setNoDataString(pht('No initiatives found.')); | $result->setNoDataString(pht('No initiatives found.')); | ||||
return $result; | return $result; | ||||
return $list; | |||||
} | } | ||||
} | } |