diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2915,6 +2915,7 @@ 'PhabricatorStandardCustomField' => 'infrastructure/customfield/standard/PhabricatorStandardCustomField.php', 'PhabricatorStandardCustomFieldBool' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php', 'PhabricatorStandardCustomFieldCredential' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldCredential.php', + 'PhabricatorStandardCustomFieldDatasource' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldDatasource.php', 'PhabricatorStandardCustomFieldDate' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldDate.php', 'PhabricatorStandardCustomFieldHeader' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldHeader.php', 'PhabricatorStandardCustomFieldInt' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldInt.php', @@ -2924,6 +2925,7 @@ 'PhabricatorStandardCustomFieldRemarkup' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldRemarkup.php', 'PhabricatorStandardCustomFieldSelect' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldSelect.php', 'PhabricatorStandardCustomFieldText' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldText.php', + 'PhabricatorStandardCustomFieldTokenizer' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldTokenizer.php', 'PhabricatorStandardCustomFieldUsers' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php', 'PhabricatorStandardPageView' => 'view/page/PhabricatorStandardPageView.php', 'PhabricatorStandardSelectCustomFieldDatasource' => 'infrastructure/customfield/datasource/PhabricatorStandardSelectCustomFieldDatasource.php', @@ -7022,6 +7024,7 @@ 'PhabricatorStandardCustomField' => 'PhabricatorCustomField', 'PhabricatorStandardCustomFieldBool' => 'PhabricatorStandardCustomField', 'PhabricatorStandardCustomFieldCredential' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldDatasource' => 'PhabricatorStandardCustomFieldTokenizer', 'PhabricatorStandardCustomFieldDate' => 'PhabricatorStandardCustomField', 'PhabricatorStandardCustomFieldHeader' => 'PhabricatorStandardCustomField', 'PhabricatorStandardCustomFieldInt' => 'PhabricatorStandardCustomField', @@ -7030,7 +7033,8 @@ 'PhabricatorStandardCustomFieldRemarkup' => 'PhabricatorStandardCustomField', 'PhabricatorStandardCustomFieldSelect' => 'PhabricatorStandardCustomField', 'PhabricatorStandardCustomFieldText' => 'PhabricatorStandardCustomField', - 'PhabricatorStandardCustomFieldUsers' => 'PhabricatorStandardCustomFieldPHIDs', + 'PhabricatorStandardCustomFieldTokenizer' => 'PhabricatorStandardCustomFieldPHIDs', + 'PhabricatorStandardCustomFieldUsers' => 'PhabricatorStandardCustomFieldTokenizer', 'PhabricatorStandardPageView' => 'PhabricatorBarePageView', 'PhabricatorStandardSelectCustomFieldDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorStatusController' => 'PhabricatorController', diff --git a/src/applications/almanac/typeahead/AlmanacServiceDatasource.php b/src/applications/almanac/typeahead/AlmanacServiceDatasource.php --- a/src/applications/almanac/typeahead/AlmanacServiceDatasource.php +++ b/src/applications/almanac/typeahead/AlmanacServiceDatasource.php @@ -23,6 +23,16 @@ ->withNamePrefix($raw_query) ->setOrder('name'); + // TODO: When service classes are restricted, it might be nice to customize + // the title and placeholder text to show which service types can be + // selected, or show all services but mark the invalid ones disabled and + // prevent their selection. + + $service_classes = $this->getParameter('serviceClasses'); + if ($service_classes) { + $services->withServiceClasses($service_classes); + } + $services = $this->executeQuery($services); if ($services) { diff --git a/src/docs/user/configuration/custom_fields.diviner b/src/docs/user/configuration/custom_fields.diviner --- a/src/docs/user/configuration/custom_fields.diviner +++ b/src/docs/user/configuration/custom_fields.diviner @@ -144,6 +144,9 @@ - **Credentials**: Controls with type `credential` allow selection of a Passphrase credential which provides `credential.provides`, and creation of credentials of `credential.type`. + - **Datasource**: Controls with type `datasource` allow selection of tokens + from an arbitrary datasource, controlled with `datasource.class` and + `datasource.parameters`. = Advanced Custom Fields = diff --git a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldDatasource.php b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldDatasource.php new file mode 100644 --- /dev/null +++ b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldDatasource.php @@ -0,0 +1,28 @@ +getFieldConfigValue('datasource.parameters', array()); + + $class = $this->getFieldConfigValue('datasource.class'); + $parent = 'PhabricatorTypeaheadDatasource'; + if (!is_subclass_of($class, $parent)) { + throw new Exception( + pht( + 'Configured datasource class "%s" must be a valid subclass of '. + '"%s".', + $class, + $parent)); + } + + return newv($class, array()) + ->setParameters($parameters); + } + +} diff --git a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldTokenizer.php copy from src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php copy to src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldTokenizer.php --- a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php +++ b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldTokenizer.php @@ -1,11 +1,9 @@ getFieldValue(); @@ -14,7 +12,7 @@ ->setUser($this->getViewer()) ->setLabel($this->getFieldName()) ->setName($this->getFieldKey()) - ->setDatasource(new PhabricatorPeopleDatasource()) + ->setDatasource($this->getDatasource()) ->setCaption($this->getCaption()) ->setValue(nonempty($value, array())); @@ -34,7 +32,7 @@ $control = id(new AphrontFormTokenizerControl()) ->setLabel($this->getFieldName()) ->setName($this->getFieldKey()) - ->setDatasource(new PhabricatorPeopleDatasource()) + ->setDatasource($this->getDatasource()) ->setValue(nonempty($value, array())); $form->appendControl($control); @@ -43,7 +41,7 @@ public function getHeraldFieldValueType($condition) { return id(new HeraldTokenizerFieldValue()) ->setKey('custom.'.$this->getFieldKey()) - ->setDatasource(new PhabricatorPeopleDatasource()); + ->setDatasource($this->getDatasource()); } } diff --git a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php --- a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php +++ b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php @@ -1,49 +1,14 @@ getFieldValue(); - - $control = id(new AphrontFormTokenizerControl()) - ->setUser($this->getViewer()) - ->setLabel($this->getFieldName()) - ->setName($this->getFieldKey()) - ->setDatasource(new PhabricatorPeopleDatasource()) - ->setCaption($this->getCaption()) - ->setValue(nonempty($value, array())); - - $limit = $this->getFieldConfigValue('limit'); - if ($limit) { - $control->setLimit($limit); - } - - return $control; - } - - public function appendToApplicationSearchForm( - PhabricatorApplicationSearchEngine $engine, - AphrontFormView $form, - $value) { - - $control = id(new AphrontFormTokenizerControl()) - ->setLabel($this->getFieldName()) - ->setName($this->getFieldKey()) - ->setDatasource(new PhabricatorPeopleDatasource()) - ->setValue(nonempty($value, array())); - - $form->appendControl($control); - } - - public function getHeraldFieldValueType($condition) { - return id(new HeraldTokenizerFieldValue()) - ->setKey('custom.'.$this->getFieldKey()) - ->setDatasource(new PhabricatorPeopleDatasource()); + public function getDatasource() { + return new PhabricatorPeopleDatasource(); } }