1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-20 01:08:50 +02:00

Fully modularize Herald field values

Summary: Ref T8726. This gets rid of all the `VALUE_*` constants and lets Fields provide arbitrary typeaheads without upstream/JS changes.

Test Plan: Used all tokenizers. Used "Another Herald Rule". Grepped for all removed constants.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T8726

Differential Revision: https://secure.phabricator.com/D13616
This commit is contained in:
epriestley 2015-07-16 14:12:44 -07:00
parent ed3dfd491f
commit 715233fb61
58 changed files with 261 additions and 401 deletions

View file

@ -382,7 +382,7 @@ return array(
'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => 'e5822781',
'rsrc/js/application/files/behavior-icon-composer.js' => '8ef9ab58',
'rsrc/js/application/files/behavior-launch-icon-composer.js' => '48086888',
'rsrc/js/application/herald/HeraldRuleEditor.js' => '797e4876',
'rsrc/js/application/herald/HeraldRuleEditor.js' => '6c2dffcc',
'rsrc/js/application/herald/PathTypeahead.js' => 'f7fc67ec',
'rsrc/js/application/herald/herald-rule-editor.js' => '7ebaeed3',
'rsrc/js/application/maniphest/behavior-batch-editor.js' => '782ab6e7',
@ -538,7 +538,7 @@ return array(
'global-drag-and-drop-css' => '697324ad',
'harbormaster-css' => '49d64eb4',
'herald-css' => '826075fa',
'herald-rule-editor' => '797e4876',
'herald-rule-editor' => '6c2dffcc',
'herald-test-css' => '778b008e',
'inline-comment-summary-css' => '51efda3a',
'javelin-aphlict' => '5359e785',
@ -1338,6 +1338,15 @@ return array(
'javelin-install',
'javelin-util',
),
'6c2dffcc' => array(
'multirow-row-manager',
'javelin-install',
'javelin-util',
'javelin-dom',
'javelin-stratcom',
'javelin-json',
'phabricator-prefab',
),
'6c53634d' => array(
'javelin-install',
'javelin-event',
@ -1416,15 +1425,6 @@ return array(
'javelin-behavior',
'javelin-quicksand',
),
'797e4876' => array(
'multirow-row-manager',
'javelin-install',
'javelin-util',
'javelin-dom',
'javelin-stratcom',
'javelin-json',
'phabricator-prefab',
),
'7a68dda3' => array(
'owners-path-editor',
'javelin-behavior',

View file

@ -1057,6 +1057,7 @@ phutil_register_library_map(array(
'HeraldSubscribersField' => 'applications/subscriptions/herald/HeraldSubscribersField.php',
'HeraldTestConsoleController' => 'applications/herald/controller/HeraldTestConsoleController.php',
'HeraldTextFieldValue' => 'applications/herald/value/HeraldTextFieldValue.php',
'HeraldTokenizerFieldValue' => 'applications/herald/value/HeraldTokenizerFieldValue.php',
'HeraldTransactionQuery' => 'applications/herald/query/HeraldTransactionQuery.php',
'HeraldTranscript' => 'applications/herald/storage/transcript/HeraldTranscript.php',
'HeraldTranscriptController' => 'applications/herald/controller/HeraldTranscriptController.php',
@ -4664,6 +4665,7 @@ phutil_register_library_map(array(
'HeraldSubscribersField' => 'HeraldField',
'HeraldTestConsoleController' => 'HeraldController',
'HeraldTextFieldValue' => 'HeraldFieldValue',
'HeraldTokenizerFieldValue' => 'HeraldFieldValue',
'HeraldTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'HeraldTranscript' => array(
'HeraldDAO',

View file

@ -17,8 +17,8 @@ final class DifferentialDiffAuthorHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -19,14 +19,8 @@ final class DifferentialDiffAuthorProjectsHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -23,14 +23,8 @@ final class DifferentialDiffRepositoryHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_REPOSITORY;
}
protected function getDatasource() {
return new DiffusionRepositoryDatasource();
}
}

View file

@ -24,14 +24,8 @@ final class DifferentialDiffRepositoryProjectsHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class DifferentialRevisionAuthorHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -19,14 +19,8 @@ final class DifferentialRevisionAuthorProjectsHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -18,14 +18,8 @@ final class DifferentialRevisionPackageHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_OWNERS_PACKAGE;
}
protected function getDatasource() {
return new PhabricatorOwnersPackageDatasource();
}
}

View file

@ -23,14 +23,8 @@ final class DifferentialRevisionPackageOwnerHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -23,14 +23,8 @@ final class DifferentialRevisionRepositoryHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_REPOSITORY;
}
protected function getDatasource() {
return new DiffusionRepositoryDatasource();
}
}

View file

@ -24,14 +24,8 @@ final class DifferentialRevisionRepositoryProjectsHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -17,14 +17,8 @@ final class DifferentialRevisionReviewersHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -17,14 +17,8 @@ final class DiffusionCommitAuthorHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER;
}
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -20,7 +20,7 @@ final class DiffusionCommitAutocloseHeraldField
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_NONE;
return new HeraldEmptyFieldValue();
}
}

View file

@ -17,14 +17,8 @@ final class DiffusionCommitCommitterHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER;
}
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -22,14 +22,8 @@ final class DiffusionCommitPackageAuditHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_OWNERS_PACKAGE;
}
protected function getDatasource() {
return new PhabricatorOwnersPackageDatasource();
}
}

View file

@ -18,14 +18,8 @@ final class DiffusionCommitPackageHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_OWNERS_PACKAGE;
}
protected function getDatasource() {
return new PhabricatorOwnersPackageDatasource();
}
}

View file

@ -24,14 +24,8 @@ final class DiffusionCommitPackageOwnerHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class DiffusionCommitRepositoryHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_REPOSITORY;
protected function getDatasource() {
return new DiffusionRepositoryDatasource();
}
}

View file

@ -19,14 +19,8 @@ final class DiffusionCommitRepositoryProjectsHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -17,14 +17,8 @@ final class DiffusionCommitReviewerHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER;
}
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -23,14 +23,8 @@ final class DiffusionCommitRevisionReviewersHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -24,14 +24,8 @@ final class DiffusionCommitRevisionSubscribersHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -17,14 +17,8 @@ final class DiffusionPreCommitContentAuthorHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER;
}
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -17,14 +17,8 @@ final class DiffusionPreCommitContentCommitterHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER;
}
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class DiffusionPreCommitContentPusherHeraldField
return HeraldField::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -19,13 +19,8 @@ final class DiffusionPreCommitContentPusherProjectsHeraldField
return HeraldField::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class DiffusionPreCommitContentRepositoryHeraldField
return HeraldField::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_REPOSITORY;
protected function getDatasource() {
return new DiffusionRepositoryDatasource();
}
}

View file

@ -19,14 +19,8 @@ final class DiffusionPreCommitContentRepositoryProjectsHeraldField
return HeraldField::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -23,14 +23,8 @@ final class DiffusionPreCommitContentRevisionReviewersHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -24,14 +24,8 @@ final class DiffusionPreCommitContentRevisionSubscribersHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class DiffusionPreCommitRefPusherHeraldField
return HeraldField::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -19,13 +19,8 @@ final class DiffusionPreCommitRefPusherProjectsHeraldField
return HeraldField::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class DiffusionPreCommitRefRepositoryHeraldField
return HeraldField::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_REPOSITORY;
protected function getDatasource() {
return new DiffusionRepositoryDatasource();
}
}

View file

@ -19,14 +19,8 @@ final class DiffusionPreCommitRefRepositoryProjectsHeraldField
return HeraldField::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -41,21 +41,6 @@ abstract class HeraldAdapter extends Phobject {
const ACTION_BLOCK = 'block';
const ACTION_REQUIRE_SIGNATURE = 'signature';
const VALUE_NONE = 'none';
const VALUE_EMAIL = 'email';
const VALUE_USER = 'user';
const VALUE_RULE = 'rule';
const VALUE_REPOSITORY = 'repository';
const VALUE_OWNERS_PACKAGE = 'package';
const VALUE_PROJECT = 'project';
const VALUE_USER_OR_PROJECT = 'userorproject';
const VALUE_BUILD_PLAN = 'buildplan';
const VALUE_TASK_PRIORITY = 'taskpriority';
const VALUE_TASK_STATUS = 'taskstatus';
const VALUE_LEGAL_DOCUMENTS = 'legaldocuments';
const VALUE_APPLICATION_EMAIL = 'applicationemail';
const VALUE_SPACE = 'space';
private $contentSource;
private $isNewObject;
private $applicationEmail;
@ -761,36 +746,43 @@ abstract class HeraldAdapter extends Phobject {
case self::ACTION_ASSIGN_TASK:
case self::ACTION_ADD_REVIEWERS:
case self::ACTION_ADD_BLOCKING_REVIEWERS:
return self::VALUE_NONE;
return new HeraldEmptyFieldValue();
case self::ACTION_FLAG:
return $this->buildFlagColorFieldValue();
case self::ACTION_ADD_PROJECTS:
case self::ACTION_REMOVE_PROJECTS:
return self::VALUE_PROJECT;
return $this->buildTokenizerFieldValue(
new PhabricatorProjectDatasource());
}
} else {
switch ($action) {
case self::ACTION_ADD_CC:
case self::ACTION_REMOVE_CC:
case self::ACTION_EMAIL:
return self::VALUE_EMAIL;
return $this->buildTokenizerFieldValue(
new PhabricatorMetaMTAMailableDatasource());
case self::ACTION_NOTHING:
return self::VALUE_NONE;
return new HeraldEmptyFieldValue();
case self::ACTION_ADD_PROJECTS:
case self::ACTION_REMOVE_PROJECTS:
return self::VALUE_PROJECT;
return $this->buildTokenizerFieldValue(
new PhabricatorProjectDatasource());
case self::ACTION_FLAG:
return $this->buildFlagColorFieldValue();
case self::ACTION_ASSIGN_TASK:
return self::VALUE_USER;
return $this->buildTokenizerFieldValue(
new PhabricatorPeopleDatasource());
case self::ACTION_AUDIT:
case self::ACTION_ADD_REVIEWERS:
case self::ACTION_ADD_BLOCKING_REVIEWERS:
return self::VALUE_USER_OR_PROJECT;
return $this->buildTokenizerFieldValue(
new PhabricatorProjectOrUserDatasource());
case self::ACTION_APPLY_BUILD_PLANS:
return self::VALUE_BUILD_PLAN;
return $this->buildTokenizerFieldValue(
new HarbormasterBuildPlanDatasource());
case self::ACTION_REQUIRE_SIGNATURE:
return self::VALUE_LEGAL_DOCUMENTS;
return $this->buildTokenizerFieldValue(
new LegalpadDocumentDatasource());
case self::ACTION_BLOCK:
return new HeraldTextFieldValue();
}
@ -811,6 +803,16 @@ abstract class HeraldAdapter extends Phobject {
->setDefault(PhabricatorFlagColor::COLOR_BLUE);
}
private function buildTokenizerFieldValue(
PhabricatorTypeaheadDatasource $datasource) {
$key = 'action.'.get_class($datasource);
return id(new HeraldTokenizerFieldValue())
->setKey($key)
->setDatasource($datasource);
}
/* -( Repetition )--------------------------------------------------------- */

View file

@ -458,6 +458,8 @@ final class HeraldRuleController extends HeraldController {
$condition);
if ($value_key instanceof HeraldFieldValue) {
$value_key->setViewer($this->getViewer());
$spec = $value_key->getControlSpecificationDictionary();
$value_key = $value_key->getFieldValueKey();
$config_info['valueMap'][$value_key] = $spec;
@ -479,6 +481,8 @@ final class HeraldRuleController extends HeraldController {
}
if ($value_key instanceof HeraldFieldValue) {
$value_key->setViewer($this->getViewer());
$spec = $value_key->getControlSpecificationDictionary();
$value_key = $value_key->getFieldValueKey();
$config_info['valueMap'][$value_key] = $spec;
@ -493,7 +497,7 @@ final class HeraldRuleController extends HeraldController {
'root' => 'herald-rule-edit-form',
'conditions' => (object)$serial_conditions,
'actions' => (object)$serial_actions,
'template' => $this->buildTokenizerTemplates($handles) + array(
'template' => $this->buildTokenizerTemplates() + array(
'rules' => $all_rules,
),
'info' => $config_info,
@ -576,39 +580,10 @@ final class HeraldRuleController extends HeraldController {
}
protected function buildTokenizerTemplates(array $handles) {
protected function buildTokenizerTemplates() {
$template = new AphrontTokenizerTemplateView();
$template = $template->render();
$sources = array(
'repository' => new DiffusionRepositoryDatasource(),
'legaldocuments' => new LegalpadDocumentDatasource(),
'taskpriority' => new ManiphestTaskPriorityDatasource(),
'taskstatus' => new ManiphestTaskStatusDatasource(),
'buildplan' => new HarbormasterBuildPlanDatasource(),
'package' => new PhabricatorOwnersPackageDatasource(),
'project' => new PhabricatorProjectDatasource(),
'user' => new PhabricatorPeopleDatasource(),
'email' => new PhabricatorMetaMTAMailableDatasource(),
'userorproject' => new PhabricatorProjectOrUserDatasource(),
'applicationemail' => new PhabricatorMetaMTAApplicationEmailDatasource(),
'space' => new PhabricatorSpacesNamespaceDatasource(),
);
foreach ($sources as $key => $source) {
$source->setViewer($this->getViewer());
$sources[$key] = array(
'uri' => $source->getDatasourceURI(),
'placeholder' => $source->getPlaceholderText(),
'browseURI' => $source->getBrowseURI(),
);
}
return array(
'source' => $sources,
'username' => $this->getRequest()->getUser()->getUserName(),
'icons' => mpull($handles, 'getTypeIcon', 'getPHID'),
'markup' => $template,
);
}

View file

@ -19,7 +19,7 @@ final class HeraldAlwaysField extends HeraldField {
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_NONE;
return new HeraldEmptyFieldValue();
}
public function supportsObject($object) {

View file

@ -24,8 +24,11 @@ final class HeraldAnotherRuleField extends HeraldField {
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_RULE;
// NOTE: This is a bit magical because we don't currently have a reasonable
// way to populate it from here.
return id(new HeraldSelectFieldValue())
->setKey(self::FIELDCONST)
->setOptions(array());
}
}

View file

@ -20,6 +20,10 @@ abstract class HeraldField extends Phobject {
throw new PhutilMethodNotImplementedException();
}
protected function getDatasource() {
throw new PhutilMethodNotImplementedException();
}
public function getHeraldFieldConditions() {
$standard_type = $this->getHeraldFieldStandardType();
switch ($standard_type) {
@ -91,6 +95,20 @@ abstract class HeraldField extends Phobject {
case self::STANDARD_TEXT_LIST:
case self::STANDARD_TEXT_MAP:
return new HeraldTextFieldValue();
case self::STANDARD_PHID:
case self::STANDARD_PHID_NULLABLE:
case self::STANDARD_PHID_LIST:
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return new HeraldEmptyFieldValue();
default:
return id(new HeraldTokenizerFieldValue())
->setKey($this->getHeraldFieldName())
->setDatasource($this->getDatasource());
}
break;
}
throw new Exception(
@ -113,7 +131,8 @@ abstract class HeraldField extends Phobject {
$value_type = $this->getHeraldFieldValueType($condition);
if ($value_type instanceof HeraldFieldValue) {
return $value_type->renderValue($viewer, $value);
$value_type->setViewer($viewer);
return $value_type->renderFieldValue($value);
}
// TODO: While this is less of a mess than it used to be, it would still

View file

@ -11,7 +11,7 @@ final class HeraldEmptyFieldValue
return self::CONTROL_NONE;
}
public function renderValue(PhabricatorUser $viewer, $value) {
public function renderFieldValue($value) {
return null;
}

View file

@ -2,6 +2,8 @@
abstract class HeraldFieldValue extends Phobject {
private $viewer;
const CONTROL_NONE = 'herald.control.none';
const CONTROL_TEXT = 'herald.control.text';
const CONTROL_SELECT = 'herald.control.select';
@ -9,10 +11,20 @@ abstract class HeraldFieldValue extends Phobject {
abstract public function getFieldValueKey();
abstract public function getControlType();
abstract public function renderValue(PhabricatorUser $viewer, $value);
abstract public function renderFieldValue($value);
public function setViewer(PhabricatorUser $viewer) {
$this->viewer = $viewer;
return $this;
}
public function getViewer() {
return $this->viewer;
}
final public function getControlSpecificationDictionary() {
return array(
'key' => $this->getFieldValueKey(),
'control' => $this->getControlType(),
'template' => $this->getControlTemplate(),
);

View file

@ -56,7 +56,7 @@ final class HeraldSelectFieldValue
);
}
public function renderValue(PhabricatorUser $viewer, $value) {
public function renderFieldValue($value) {
$options = $this->getOptions();
return idx($options, $value, $value);
}

View file

@ -12,7 +12,7 @@ final class HeraldTextFieldValue
}
public function renderValue(PhabricatorUser $viewer, $value) {
public function renderFieldValue($value) {
return $value;
}

View file

@ -0,0 +1,60 @@
<?php
final class HeraldTokenizerFieldValue
extends HeraldFieldValue {
private $key;
private $datasource;
public function setKey($key) {
$this->key = $key;
return $this;
}
public function getKey() {
return $this->key;
}
public function setDatasource(PhabricatorTypeaheadDatasource $datasource) {
$this->datasource = $datasource;
return $this;
}
public function getDatasource() {
return $this->datasource;
}
public function getFieldValueKey() {
if ($this->getKey() === null) {
throw new PhutilInvalidStateException('setKey');
}
return 'tokenizer.'.$this->getKey();
}
public function getControlType() {
return self::CONTROL_TOKENIZER;
}
protected function getControlTemplate() {
if ($this->getDatasource() === null) {
throw new PhutilInvalidStateException('setDatasource');
}
$datasource = $this->getDatasource();
$datasource->setViewer($this->getViewer());
return array(
'tokenizer' => array(
'datasourceURI' => $datasource->getDatasourceURI(),
'browseURI' => $datasource->getBrowseURI(),
'placeholder' => $datasource->getPlaceholderText(),
),
);
}
public function renderFieldValue($value) {
$viewer = $this->getViewer();
return $viewer->renderHandleList((array)$value)->setAsInline(true);
}
}

View file

@ -17,14 +17,8 @@ final class ManiphestTaskAssigneeHeraldField
return self::STANDARD_PHID_NULLABLE;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER;
}
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class ManiphestTaskAuthorHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class ManiphestTaskPriorityHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_TASK_PRIORITY;
protected function getDatasource() {
return new ManiphestTaskPriorityDatasource();
}
public function renderConditionValue(

View file

@ -17,8 +17,8 @@ final class ManiphestTaskStatusHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_TASK_STATUS;
protected function getDatasource() {
return new ManiphestTaskStatusDatasource();
}
public function renderConditionValue(

View file

@ -28,14 +28,8 @@ final class PhabricatorMetaMTAApplicationEmailHeraldField
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_APPLICATION_EMAIL;
}
protected function getDatasource() {
return new PhabricatorMetaMTAApplicationEmailDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class PholioMockAuthorHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -17,8 +17,8 @@ final class PhrictionDocumentAuthorHeraldField
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
protected function getDatasource() {
return new PhabricatorPeopleDatasource();
}
}

View file

@ -22,14 +22,8 @@ final class HeraldProjectsField extends HeraldField {
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectDatasource();
}
}

View file

@ -20,8 +20,8 @@ final class HeraldSpaceField extends HeraldField {
return self::STANDARD_PHID;
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_SPACE;
protected function getDatasource() {
return new PhabricatorSpacesNamespaceDatasource();
}
}

View file

@ -21,14 +21,8 @@ final class HeraldSubscribersField extends HeraldField {
return self::STANDARD_PHID_LIST;
}
public function getHeraldFieldValueType($condition) {
switch ($condition) {
case HeraldAdapter::CONDITION_EXISTS:
case HeraldAdapter::CONDITION_NOT_EXISTS:
return HeraldAdapter::VALUE_NONE;
default:
return HeraldAdapter::VALUE_USER_OR_PROJECT;
}
protected function getDatasource() {
return new PhabricatorProjectOrUserDatasource();
}
}

View file

@ -41,7 +41,9 @@ final class PhabricatorStandardCustomFieldUsers
}
public function getHeraldFieldValueType($condition) {
return HeraldAdapter::VALUE_USER;
return id(new HeraldTokenizerFieldValue())
->setKey('custom.'.$this->getFieldKey())
->setDatasource(new PhabricatorPeopleDatasource());
}
}

View file

@ -200,7 +200,9 @@ JX.install('HeraldRuleEditor', {
return node;
},
_buildStandardInput: function(spec) {
_buildInput : function(type) {
var spec = this._config.info.valueMap[type];
var input;
var get_fn;
var set_fn;
@ -216,7 +218,18 @@ JX.install('HeraldRuleEditor', {
set_fn = function(v) { input.value = v; };
break;
case 'herald.control.select':
input = this._renderSelect(spec.template.options);
var options;
// NOTE: This is a hacky special case for "Another Herald Rule",
// which we don't currently generate normal options for.
if (spec.key == 'select.rule') {
options = this._config.template.rules;
} else {
options = spec.template.options;
}
input = this._renderSelect(options);
get_fn = function() { return input.value; };
set_fn = function(v) { input.value = v; };
if (spec.template.default) {
@ -224,7 +237,7 @@ JX.install('HeraldRuleEditor', {
}
break;
case 'herald.control.tokenizer':
var tokenizer = this._newTokenizer(spec.template.tokenizer, true);
var tokenizer = this._newTokenizer(spec.template.tokenizer);
input = tokenizer[0];
get_fn = tokenizer[1];
set_fn = tokenizer[2];
@ -237,48 +250,6 @@ JX.install('HeraldRuleEditor', {
return [input, get_fn, set_fn];
},
_buildInput : function(type) {
if (this._config.info.valueMap[type]) {
return this._buildStandardInput(this._config.info.valueMap[type]);
}
var input;
var get_fn;
var set_fn;
switch (type) {
case 'rule':
input = this._renderSelect(this._config.template.rules);
get_fn = function() { return input.value; };
set_fn = function(v) { input.value = v; };
break;
case 'email':
case 'user':
case 'repository':
case 'tag':
case 'package':
case 'project':
case 'userorproject':
case 'buildplan':
case 'taskpriority':
case 'taskstatus':
case 'legaldocuments':
case 'applicationemail':
case 'space':
var tokenizer = this._newTokenizer(type);
input = tokenizer[0];
get_fn = tokenizer[1];
set_fn = tokenizer[2];
break;
default:
input = JX.$N('input', {type: 'text'});
get_fn = function() { return input.value; };
set_fn = function(v) { input.value = v; };
break;
}
return [input, get_fn, set_fn];
},
_renderValueInputForRow : function(row_id) {
var cond = this._config.conditions[row_id];
var type = this._config.info.values[cond[0]][cond[1]];
@ -303,20 +274,12 @@ JX.install('HeraldRuleEditor', {
return node;
},
_newTokenizer : function(type, is_config) {
var tokenizerConfig;
if (is_config) {
tokenizerConfig = type;
} else {
tokenizerConfig = {
src : this._config.template.source[type].uri,
placeholder: this._config.template.source[type].placeholder,
browseURI: this._config.template.source[type].browseURI,
icons : this._config.template.icons,
username : this._config.username
};
}
_newTokenizer : function(spec) {
var tokenizerConfig = {
src: spec.datasourceURI,
placeholder: spec.placeholder,
browseURI: spec.browseURI
};
var build = JX.Prefab.newTokenizerFromTemplate(
this._config.template.markup,