@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.

Add a Differential revision status tokenizer datasource

Summary:
Ref T2543. This adds a tokenizer, similar to the Maniphest tokenizer, so the hard-coded `<select />` control in Differential ApplicationSearch can be replaced with a more flexible control that handles the addition of new statuses with more grace.

This only adds the new datasource.

Test Plan: Used `/typeahead/class/` to preview the behavior of the new datasource.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T2543

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

+240
+8
src/__phutil_library_map__.php
··· 521 521 'DifferentialRevisionAuthorProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorProjectsHeraldField.php', 522 522 'DifferentialRevisionCloseDetailsController' => 'applications/differential/controller/DifferentialRevisionCloseDetailsController.php', 523 523 'DifferentialRevisionCloseTransaction' => 'applications/differential/xaction/DifferentialRevisionCloseTransaction.php', 524 + 'DifferentialRevisionClosedStatusDatasource' => 'applications/differential/typeahead/DifferentialRevisionClosedStatusDatasource.php', 524 525 'DifferentialRevisionCommandeerTransaction' => 'applications/differential/xaction/DifferentialRevisionCommandeerTransaction.php', 525 526 'DifferentialRevisionContentAddedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentAddedHeraldField.php', 526 527 'DifferentialRevisionContentHeraldField' => 'applications/differential/herald/DifferentialRevisionContentHeraldField.php', ··· 548 549 'DifferentialRevisionListController' => 'applications/differential/controller/DifferentialRevisionListController.php', 549 550 'DifferentialRevisionListView' => 'applications/differential/view/DifferentialRevisionListView.php', 550 551 'DifferentialRevisionMailReceiver' => 'applications/differential/mail/DifferentialRevisionMailReceiver.php', 552 + 'DifferentialRevisionOpenStatusDatasource' => 'applications/differential/typeahead/DifferentialRevisionOpenStatusDatasource.php', 551 553 'DifferentialRevisionOperationController' => 'applications/differential/controller/DifferentialRevisionOperationController.php', 552 554 'DifferentialRevisionPHIDType' => 'applications/differential/phid/DifferentialRevisionPHIDType.php', 553 555 'DifferentialRevisionPackageHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageHeraldField.php', ··· 572 574 'DifferentialRevisionSearchConduitAPIMethod' => 'applications/differential/conduit/DifferentialRevisionSearchConduitAPIMethod.php', 573 575 'DifferentialRevisionSearchEngine' => 'applications/differential/query/DifferentialRevisionSearchEngine.php', 574 576 'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php', 577 + 'DifferentialRevisionStatusDatasource' => 'applications/differential/typeahead/DifferentialRevisionStatusDatasource.php', 578 + 'DifferentialRevisionStatusFunctionDatasource' => 'applications/differential/typeahead/DifferentialRevisionStatusFunctionDatasource.php', 575 579 'DifferentialRevisionSummaryHeraldField' => 'applications/differential/herald/DifferentialRevisionSummaryHeraldField.php', 576 580 'DifferentialRevisionSummaryTransaction' => 'applications/differential/xaction/DifferentialRevisionSummaryTransaction.php', 577 581 'DifferentialRevisionTestPlanTransaction' => 'applications/differential/xaction/DifferentialRevisionTestPlanTransaction.php', ··· 5514 5518 'DifferentialRevisionAuthorProjectsHeraldField' => 'DifferentialRevisionHeraldField', 5515 5519 'DifferentialRevisionCloseDetailsController' => 'DifferentialController', 5516 5520 'DifferentialRevisionCloseTransaction' => 'DifferentialRevisionActionTransaction', 5521 + 'DifferentialRevisionClosedStatusDatasource' => 'PhabricatorTypeaheadDatasource', 5517 5522 'DifferentialRevisionCommandeerTransaction' => 'DifferentialRevisionActionTransaction', 5518 5523 'DifferentialRevisionContentAddedHeraldField' => 'DifferentialRevisionHeraldField', 5519 5524 'DifferentialRevisionContentHeraldField' => 'DifferentialRevisionHeraldField', ··· 5541 5546 'DifferentialRevisionListController' => 'DifferentialController', 5542 5547 'DifferentialRevisionListView' => 'AphrontView', 5543 5548 'DifferentialRevisionMailReceiver' => 'PhabricatorObjectMailReceiver', 5549 + 'DifferentialRevisionOpenStatusDatasource' => 'PhabricatorTypeaheadDatasource', 5544 5550 'DifferentialRevisionOperationController' => 'DifferentialController', 5545 5551 'DifferentialRevisionPHIDType' => 'PhabricatorPHIDType', 5546 5552 'DifferentialRevisionPackageHeraldField' => 'DifferentialRevisionHeraldField', ··· 5565 5571 'DifferentialRevisionSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 5566 5572 'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine', 5567 5573 'DifferentialRevisionStatus' => 'Phobject', 5574 + 'DifferentialRevisionStatusDatasource' => 'PhabricatorTypeaheadDatasource', 5575 + 'DifferentialRevisionStatusFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 5568 5576 'DifferentialRevisionSummaryHeraldField' => 'DifferentialRevisionHeraldField', 5569 5577 'DifferentialRevisionSummaryTransaction' => 'DifferentialRevisionTransactionType', 5570 5578 'DifferentialRevisionTestPlanTransaction' => 'DifferentialRevisionTransactionType',
+10
src/applications/differential/constants/DifferentialRevisionStatus.php
··· 93 93 return $result; 94 94 } 95 95 96 + public static function getAll() { 97 + $result = array(); 98 + 99 + foreach (self::getMap() as $key => $spec) { 100 + $result[$key] = self::newForStatus($key); 101 + } 102 + 103 + return $result; 104 + } 105 + 96 106 private static function getMap() { 97 107 $close_on_accept = PhabricatorEnv::getEnvConfig( 98 108 'differential.close-on-accept');
+74
src/applications/differential/typeahead/DifferentialRevisionClosedStatusDatasource.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionClosedStatusDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + const FUNCTION_TOKEN = 'closed()'; 7 + 8 + public function getBrowseTitle() { 9 + return pht('Browse Any Closed Status'); 10 + } 11 + 12 + public function getPlaceholderText() { 13 + return pht('Type closed()...'); 14 + } 15 + 16 + public function getDatasourceApplicationClass() { 17 + return 'PhabricatorDifferentialApplication'; 18 + } 19 + 20 + public function getDatasourceFunctions() { 21 + return array( 22 + 'closed' => array( 23 + 'name' => pht('Any Closed Status'), 24 + 'summary' => pht('Find results with any closed status.'), 25 + 'description' => pht( 26 + 'This function includes results which have any closed status.'), 27 + ), 28 + ); 29 + } 30 + 31 + public function loadResults() { 32 + $results = array( 33 + $this->buildClosedResult(), 34 + ); 35 + return $this->filterResultsAgainstTokens($results); 36 + } 37 + 38 + protected function evaluateFunction($function, array $argv_list) { 39 + $results = array(); 40 + 41 + $map = DifferentialRevisionStatus::getAll(); 42 + foreach ($argv_list as $argv) { 43 + foreach ($map as $status) { 44 + if ($status->isClosedStatus()) { 45 + $results[] = $status->getKey(); 46 + } 47 + } 48 + } 49 + 50 + return $results; 51 + } 52 + 53 + public function renderFunctionTokens($function, array $argv_list) { 54 + $results = array(); 55 + 56 + foreach ($argv_list as $argv) { 57 + $results[] = PhabricatorTypeaheadTokenView::newFromTypeaheadResult( 58 + $this->buildClosedResult()); 59 + } 60 + 61 + return $results; 62 + } 63 + 64 + private function buildClosedResult() { 65 + $name = pht('Any Closed Status'); 66 + return $this->newFunctionResult() 67 + ->setName($name.' closed') 68 + ->setDisplayName($name) 69 + ->setPHID(self::FUNCTION_TOKEN) 70 + ->setUnique(true) 71 + ->addAttribute(pht('Select any closed status.')); 72 + } 73 + 74 + }
+74
src/applications/differential/typeahead/DifferentialRevisionOpenStatusDatasource.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionOpenStatusDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + const FUNCTION_TOKEN = 'open()'; 7 + 8 + public function getBrowseTitle() { 9 + return pht('Browse Any Open Status'); 10 + } 11 + 12 + public function getPlaceholderText() { 13 + return pht('Type open()...'); 14 + } 15 + 16 + public function getDatasourceApplicationClass() { 17 + return 'PhabricatorDifferentialApplication'; 18 + } 19 + 20 + public function getDatasourceFunctions() { 21 + return array( 22 + 'open' => array( 23 + 'name' => pht('Any Open Status'), 24 + 'summary' => pht('Find results with any open status.'), 25 + 'description' => pht( 26 + 'This function includes results which have any open status.'), 27 + ), 28 + ); 29 + } 30 + 31 + public function loadResults() { 32 + $results = array( 33 + $this->buildOpenResult(), 34 + ); 35 + return $this->filterResultsAgainstTokens($results); 36 + } 37 + 38 + protected function evaluateFunction($function, array $argv_list) { 39 + $results = array(); 40 + 41 + $map = DifferentialRevisionStatus::getAll(); 42 + foreach ($argv_list as $argv) { 43 + foreach ($map as $status) { 44 + if (!$status->isClosedStatus()) { 45 + $results[] = $status->getKey(); 46 + } 47 + } 48 + } 49 + 50 + return $results; 51 + } 52 + 53 + public function renderFunctionTokens($function, array $argv_list) { 54 + $results = array(); 55 + 56 + foreach ($argv_list as $argv) { 57 + $results[] = PhabricatorTypeaheadTokenView::newFromTypeaheadResult( 58 + $this->buildOpenResult()); 59 + } 60 + 61 + return $results; 62 + } 63 + 64 + private function buildOpenResult() { 65 + $name = pht('Any Open Status'); 66 + return $this->newFunctionResult() 67 + ->setName($name.' open') 68 + ->setDisplayName($name) 69 + ->setPHID(self::FUNCTION_TOKEN) 70 + ->setUnique(true) 71 + ->addAttribute(pht('Select any open status.')); 72 + } 73 + 74 + }
+52
src/applications/differential/typeahead/DifferentialRevisionStatusDatasource.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionStatusDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + public function getBrowseTitle() { 7 + return pht('Browse Statuses'); 8 + } 9 + 10 + public function getPlaceholderText() { 11 + return pht('Type a revision status name...'); 12 + } 13 + 14 + public function getDatasourceApplicationClass() { 15 + return 'PhabricatorDifferentialApplication'; 16 + } 17 + 18 + public function loadResults() { 19 + $results = $this->buildResults(); 20 + return $this->filterResultsAgainstTokens($results); 21 + } 22 + 23 + 24 + protected function renderSpecialTokens(array $values) { 25 + return $this->renderTokensFromResults($this->buildResults(), $values); 26 + } 27 + 28 + private function buildResults() { 29 + $results = array(); 30 + 31 + $statuses = DifferentialRevisionStatus::getAll(); 32 + foreach ($statuses as $status) { 33 + $key = $status->getKey(); 34 + 35 + $result = id(new PhabricatorTypeaheadResult()) 36 + ->setIcon($status->getIcon()) 37 + ->setPHID($key) 38 + ->setName($status->getDisplayName()); 39 + 40 + if ($status->isClosedStatus()) { 41 + $result->addAttribute(pht('Closed Status')); 42 + } else { 43 + $result->addAttribute(pht('Open Status')); 44 + } 45 + 46 + $results[$key] = $result; 47 + } 48 + 49 + return $results; 50 + } 51 + 52 + }
+22
src/applications/differential/typeahead/DifferentialRevisionStatusFunctionDatasource.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionStatusFunctionDatasource 4 + extends PhabricatorTypeaheadCompositeDatasource { 5 + 6 + public function getBrowseTitle() { 7 + return pht('Browse Statuses'); 8 + } 9 + 10 + public function getPlaceholderText() { 11 + return pht('Type a revision status name or function...'); 12 + } 13 + 14 + public function getComponentDatasources() { 15 + return array( 16 + new DifferentialRevisionStatusDatasource(), 17 + new DifferentialRevisionClosedStatusDatasource(), 18 + new DifferentialRevisionOpenStatusDatasource(), 19 + ); 20 + } 21 + 22 + }