@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Simplify members() datasource function

Summary: Ref T4100. Implement members() in terms of the real projects datasource.

Test Plan: Used members() functions in Differential, browsed members() functions.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T4100

Differential Revision: https://secure.phabricator.com/D12459

+33 -69
+1 -1
src/__phutil_library_map__.php
··· 5675 5675 'PhabricatorProjectIcon' => 'Phobject', 5676 5676 'PhabricatorProjectListController' => 'PhabricatorProjectController', 5677 5677 'PhabricatorProjectMemberOfProjectEdgeType' => 'PhabricatorEdgeType', 5678 - 'PhabricatorProjectMembersDatasource' => 'PhabricatorTypeaheadDatasource', 5678 + 'PhabricatorProjectMembersDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 5679 5679 'PhabricatorProjectMembersEditController' => 'PhabricatorProjectController', 5680 5680 'PhabricatorProjectMembersRemoveController' => 'PhabricatorProjectController', 5681 5681 'PhabricatorProjectMoveController' => 'PhabricatorProjectController',
+1
src/applications/people/typeahead/PhabricatorUserProjectsDatasource.php
··· 73 73 ->setValue(pht('Projects: Invalid User')); 74 74 } else { 75 75 $token 76 + ->setIcon('fa-users') 76 77 ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) 77 78 ->setKey('projects('.$token->getKey().')') 78 79 ->setValue(pht('Projects: %s', $token->getValue()));
+31 -68
src/applications/project/typeahead/PhabricatorProjectMembersDatasource.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorProjectMembersDatasource 4 - extends PhabricatorTypeaheadDatasource { 4 + extends PhabricatorTypeaheadCompositeDatasource { 5 5 6 6 public function getPlaceholderText() { 7 7 return pht('Type members(<project>)...'); ··· 11 11 return 'PhabricatorProjectApplication'; 12 12 } 13 13 14 - public function loadResults() { 15 - $viewer = $this->getViewer(); 16 - $raw_query = $this->getRawQuery(); 14 + public function getComponentDatasources() { 15 + return array( 16 + new PhabricatorProjectDatasource(), 17 + ); 18 + } 17 19 18 - $pattern = $raw_query; 19 - if (self::isFunctionToken($raw_query)) { 20 - $function = $this->parseFunction($raw_query, $allow_partial = true); 21 - if ($function) { 22 - $pattern = head($function['argv']); 23 - } 24 - } 25 - 26 - // Allow users to type "#qa" or "qa" to find "Quality Assurance". 27 - $pattern = ltrim($pattern, '#'); 28 - $tokens = self::tokenizeString($pattern); 29 - 30 - $query = $this->newQuery(); 31 - if ($tokens) { 32 - $query->withNameTokens($tokens); 33 - } 34 - $projects = $this->executeQuery($query); 20 + public function getDatasourceFunctions() { 21 + return array( 22 + 'members' => array( 23 + 'name' => pht('Find results for members of a project.'), 24 + ), 25 + ); 26 + } 35 27 36 - $results = array(); 37 - foreach ($projects as $project) { 38 - $results[] = $this->buildProjectResult($project); 28 + protected function didLoadResults(array $results) { 29 + foreach ($results as $result) { 30 + $result 31 + ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) 32 + ->setIcon('fa-users') 33 + ->setPHID('members('.$result->getPHID().')') 34 + ->setDisplayName(pht('Members: %s', $result->getDisplayName())) 35 + ->setName($result->getName().' members'); 39 36 } 40 37 41 38 return $results; 42 - } 43 - 44 - protected function canEvaluateFunction($function) { 45 - return ($function == 'members'); 46 39 } 47 40 48 41 protected function evaluateFunction($function, array $argv_list) { ··· 73 66 $phids[] = head($argv); 74 67 } 75 68 76 - $projects = $this->newQuery() 77 - ->withPHIDs($phids) 78 - ->execute(); 79 - $projects = mpull($projects, null, 'getPHID'); 80 - 81 - $tokens = array(); 82 - foreach ($phids as $phid) { 83 - $project = idx($projects, $phid); 84 - if ($project) { 85 - $result = $this->buildProjectResult($project); 86 - $tokens[] = PhabricatorTypeaheadTokenView::newFromTypeaheadResult( 87 - $result); 69 + $tokens = $this->renderTokens($phids); 70 + foreach ($tokens as $token) { 71 + if ($token->isInvalid()) { 72 + $token 73 + ->setValue(pht('Members: Invalid Project')); 88 74 } else { 89 - $tokens[] = $this->newInvalidToken(pht('Members: Invalid Project')); 75 + $token 76 + ->setIcon('fa-users') 77 + ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) 78 + ->setKey('members('.$token->getKey().')') 79 + ->setValue(pht('Members: %s', $token->getValue())); 90 80 } 91 81 } 92 82 93 83 return $tokens; 94 - } 95 - 96 - private function newQuery() { 97 - return id(new PhabricatorProjectQuery()) 98 - ->setViewer($this->getViewer()) 99 - ->needImages(true) 100 - ->needSlugs(true); 101 - } 102 - 103 - private function buildProjectResult(PhabricatorProject $project) { 104 - $closed = null; 105 - if ($project->isArchived()) { 106 - $closed = pht('Archived'); 107 - } 108 - 109 - $all_strings = mpull($project->getSlugs(), 'getSlug'); 110 - $all_strings[] = 'members'; 111 - $all_strings[] = $project->getName(); 112 - $all_strings = implode(' ', $all_strings); 113 - 114 - return $this->newFunctionResult() 115 - ->setName($all_strings) 116 - ->setDisplayName(pht('Members: %s', $project->getName())) 117 - ->setURI('/tag/'.$project->getPrimarySlug().'/') 118 - ->setPHID('members('.$project->getPHID().')') 119 - ->setIcon('fa-users') 120 - ->setClosed($closed); 121 84 } 122 85 123 86 }