Page MenuHomePhabricator

D14111.id34102.diff
No OneTemporary

D14111.id34102.diff

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 @@
+<?php
+
+final class PhabricatorStandardCustomFieldDatasource
+ extends PhabricatorStandardCustomFieldTokenizer {
+
+ public function getFieldType() {
+ return 'datasource';
+ }
+
+ public function getDatasource() {
+ $parameters = $this->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 @@
<?php
-final class PhabricatorStandardCustomFieldUsers
+abstract class PhabricatorStandardCustomFieldTokenizer
extends PhabricatorStandardCustomFieldPHIDs {
- public function getFieldType() {
- return 'users';
- }
+ abstract public function getDatasource();
public function renderEditControl(array $handles) {
$value = $this->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 @@
<?php
final class PhabricatorStandardCustomFieldUsers
- extends PhabricatorStandardCustomFieldPHIDs {
+ extends PhabricatorStandardCustomFieldTokenizer {
public function getFieldType() {
return 'users';
}
- public function renderEditControl(array $handles) {
- $value = $this->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();
}
}

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 28, 10:08 AM (4 w, 15 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7724985
Default Alt Text
D14111.id34102.diff (9 KB)

Event Timeline