Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15444564
D14111.id34102.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
9 KB
Referenced Files
None
Subscribers
None
D14111.id34102.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D14111: Provide a generic "Datasource" StandardCustomField
Attached
Detach File
Event Timeline
Log In to Comment