diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 680f7e098d..c3c521a57f 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -464,6 +464,7 @@ phutil_register_library_map(array( 'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.php', 'DifferentialSearchIndexer' => 'applications/differential/search/DifferentialSearchIndexer.php', 'DifferentialSubscribeController' => 'applications/differential/controller/DifferentialSubscribeController.php', + 'DifferentialSubscribersField' => 'applications/differential/customfield/DifferentialSubscribersField.php', 'DifferentialSummaryField' => 'applications/differential/customfield/DifferentialSummaryField.php', 'DifferentialSummaryFieldSpecification' => 'applications/differential/field/specification/DifferentialSummaryFieldSpecification.php', 'DifferentialTasksAttacher' => 'applications/differential/DifferentialTasksAttacher.php', @@ -3012,6 +3013,7 @@ phutil_register_library_map(array( 'DifferentialRevisionViewController' => 'DifferentialController', 'DifferentialSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'DifferentialSubscribeController' => 'DifferentialController', + 'DifferentialSubscribersField' => 'DifferentialCoreCustomField', 'DifferentialSummaryField' => 'DifferentialCoreCustomField', 'DifferentialSummaryFieldSpecification' => 'DifferentialFreeformFieldSpecification', 'DifferentialTestPlanField' => 'DifferentialCoreCustomField', diff --git a/src/applications/differential/customfield/DifferentialCoreCustomField.php b/src/applications/differential/customfield/DifferentialCoreCustomField.php index 0994dbee07..a63ffca7bb 100644 --- a/src/applications/differential/customfield/DifferentialCoreCustomField.php +++ b/src/applications/differential/customfield/DifferentialCoreCustomField.php @@ -14,9 +14,11 @@ abstract class DifferentialCoreCustomField abstract protected function readValueFromRevision( DifferentialRevision $revision); - abstract protected function writeValueToRevision( + protected function writeValueToRevision( DifferentialRevision $revision, - $value); + $value) { + throw new PhabricatorCustomFieldImplementationIncompleteException($this); + } protected function isCoreFieldRequired() { return false; diff --git a/src/applications/differential/customfield/DifferentialEditPolicyField.php b/src/applications/differential/customfield/DifferentialEditPolicyField.php index cede24c3c3..8175fa2b5b 100644 --- a/src/applications/differential/customfield/DifferentialEditPolicyField.php +++ b/src/applications/differential/customfield/DifferentialEditPolicyField.php @@ -20,12 +20,6 @@ final class DifferentialEditPolicyField return $revision->getEditPolicy(); } - protected function writeValueToRevision( - DifferentialRevision $revision, - $value) { - $revision->setEditPolicy($value); - } - public function readValueFromRequest(AphrontRequest $request) { $this->setValue($request->getStr($this->getFieldKey())); } diff --git a/src/applications/differential/customfield/DifferentialRepositoryField.php b/src/applications/differential/customfield/DifferentialRepositoryField.php index 789862b7be..a63bfac36d 100644 --- a/src/applications/differential/customfield/DifferentialRepositoryField.php +++ b/src/applications/differential/customfield/DifferentialRepositoryField.php @@ -29,7 +29,7 @@ final class DifferentialRepositoryField public function readValueFromRequest(AphrontRequest $request) { $phids = $request->getArr($this->getFieldKey()); $first = head($phids); - $this->setValue(coalesce($first, null)); + $this->setValue(nonempty($first, null)); } public function getRequiredHandlePHIDsForEdit() { @@ -41,7 +41,6 @@ final class DifferentialRepositoryField } public function renderEditControl(array $handles) { - if ($this->getValue()) { $control_value = array_select_keys($handles, array($this->getValue())); } else { @@ -97,7 +96,6 @@ final class DifferentialRepositoryField $xaction->renderHandleLink($author_phid), $xaction->renderHandleLink($old)); } - } public function getApplicationTransactionTitleForFeed( diff --git a/src/applications/differential/customfield/DifferentialSubscribersField.php b/src/applications/differential/customfield/DifferentialSubscribersField.php new file mode 100644 index 0000000000..321b7a1838 --- /dev/null +++ b/src/applications/differential/customfield/DifferentialSubscribersField.php @@ -0,0 +1,49 @@ +getPHID()); + } + + public function getNewValueForApplicationTransactions() { + return array('=' => $this->getValue()); + } + + public function readValueFromRequest(AphrontRequest $request) { + $this->setValue($request->getArr($this->getFieldKey())); + } + + public function getRequiredHandlePHIDsForEdit() { + return $this->getValue(); + } + + public function renderEditControl(array $handles) { + return id(new AphrontFormTokenizerControl()) + ->setName($this->getFieldKey()) + ->setDatasource('/typeahead/common/mailable/') + ->setValue($handles) + ->setError($this->getFieldError()) + ->setLabel($this->getFieldName()); + } + + public function getApplicationTransactionType() { + return PhabricatorTransactions::TYPE_SUBSCRIBERS; + } + +} diff --git a/src/applications/differential/customfield/DifferentialViewPolicyField.php b/src/applications/differential/customfield/DifferentialViewPolicyField.php index 2c3c8c8d4e..9b17413fcf 100644 --- a/src/applications/differential/customfield/DifferentialViewPolicyField.php +++ b/src/applications/differential/customfield/DifferentialViewPolicyField.php @@ -20,12 +20,6 @@ final class DifferentialViewPolicyField return $revision->getViewPolicy(); } - protected function writeValueToRevision( - DifferentialRevision $revision, - $value) { - $revision->setViewPolicy($value); - } - public function readValueFromRequest(AphrontRequest $request) { $this->setValue($request->getStr($this->getFieldKey())); } diff --git a/src/applications/differential/editor/DifferentialTransactionEditor.php b/src/applications/differential/editor/DifferentialTransactionEditor.php index 68f299c773..afbe9614a4 100644 --- a/src/applications/differential/editor/DifferentialTransactionEditor.php +++ b/src/applications/differential/editor/DifferentialTransactionEditor.php @@ -58,6 +58,8 @@ final class DifferentialTransactionEditor case PhabricatorTransactions::TYPE_EDIT_POLICY: $object->setEditPolicy($xaction->getNewValue()); return; + case PhabricatorTransactions::TYPE_SUBSCRIBERS: + return; } return parent::applyCustomInternalTransaction($object, $xaction); @@ -71,6 +73,8 @@ final class DifferentialTransactionEditor case PhabricatorTransactions::TYPE_VIEW_POLICY: case PhabricatorTransactions::TYPE_EDIT_POLICY: return; + case PhabricatorTransactions::TYPE_SUBSCRIBERS: + return; } return parent::applyCustomExternalTransaction($object, $xaction); diff --git a/src/applications/differential/storage/DifferentialRevision.php b/src/applications/differential/storage/DifferentialRevision.php index 64bf43473b..c70ce306d0 100644 --- a/src/applications/differential/storage/DifferentialRevision.php +++ b/src/applications/differential/storage/DifferentialRevision.php @@ -469,6 +469,7 @@ final class DifferentialRevision extends DifferentialDAO new DifferentialTitleField(), new DifferentialSummaryField(), new DifferentialTestPlanField(), + new DifferentialSubscribersField(), new DifferentialRepositoryField(), new DifferentialViewPolicyField(), new DifferentialEditPolicyField(), diff --git a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php index dc58105878..78974e1951 100644 --- a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php +++ b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php @@ -186,7 +186,11 @@ abstract class PhabricatorApplicationTransaction public function getHandle($phid) { if (empty($this->handles[$phid])) { throw new Exception( - "Transaction requires a handle ('{$phid}') it did not load."); + pht( + 'Transaction ("%s") requires a handle ("%s") that it did not '. + 'load.', + $this->getPHID(), + $phid)); } return $this->handles[$phid]; }