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 @@ -226,6 +226,7 @@ 'BulkRemarkupParameterType' => 'applications/transactions/bulk/type/BulkRemarkupParameterType.php', 'BulkSelectParameterType' => 'applications/transactions/bulk/type/BulkSelectParameterType.php', 'BulkStringParameterType' => 'applications/transactions/bulk/type/BulkStringParameterType.php', + 'BulkTokenizerParameterType' => 'applications/transactions/bulk/type/BulkTokenizerParameterType.php', 'CalendarTimeUtil' => 'applications/calendar/util/CalendarTimeUtil.php', 'CalendarTimeUtilTestCase' => 'applications/calendar/__tests__/CalendarTimeUtilTestCase.php', 'CelerityAPI' => 'applications/celerity/CelerityAPI.php', @@ -5249,6 +5250,7 @@ 'BulkRemarkupParameterType' => 'BulkParameterType', 'BulkSelectParameterType' => 'BulkParameterType', 'BulkStringParameterType' => 'BulkParameterType', + 'BulkTokenizerParameterType' => 'BulkParameterType', 'CalendarTimeUtil' => 'Phobject', 'CalendarTimeUtilTestCase' => 'PhabricatorTestCase', 'CelerityAPI' => 'Phobject', diff --git a/src/applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php b/src/applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php --- a/src/applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php +++ b/src/applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php @@ -46,6 +46,8 @@ $project_phids = array(); } + $viewer = $engine->getViewer(); + $projects_field = id(new PhabricatorProjectsEditField()) ->setKey('projectPHIDs') ->setLabel(pht('Tags')) @@ -58,9 +60,11 @@ ->setDescription(pht('Select project tags for the object.')) ->setTransactionType($edge_type) ->setMetadataValue('edge:type', $project_edge_type) - ->setValue($project_phids); + ->setValue($project_phids) + ->setViewer($viewer); - $projects_field->setViewer($engine->getViewer()); + $projects_datasource = id(new PhabricatorProjectDatasource()) + ->setViewer($viewer); $edit_add = $projects_field->getConduitEditType(self::EDITKEY_ADD) ->setConduitDescription(pht('Add project tags.')); @@ -72,6 +76,18 @@ $edit_rem = $projects_field->getConduitEditType(self::EDITKEY_REMOVE) ->setConduitDescription(pht('Remove project tags.')); + $projects_field->getBulkEditType(self::EDITKEY_ADD) + ->setBulkEditLabel(pht('Add project tags')) + ->setDatasource($projects_datasource); + + $projects_field->getBulkEditType(self::EDITKEY_SET) + ->setBulkEditLabel(pht('Set project tags to')) + ->setDatasource($projects_datasource); + + $projects_field->getBulkEditType(self::EDITKEY_REMOVE) + ->setBulkEditLabel(pht('Remove project tags')) + ->setDatasource($projects_datasource); + return array( $projects_field, ); diff --git a/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php b/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php --- a/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php +++ b/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php @@ -42,6 +42,8 @@ $sub_phids = array(); } + $viewer = $engine->getViewer(); + $subscribers_field = id(new PhabricatorSubscribersEditField()) ->setKey(self::FIELDKEY) ->setLabel(pht('Subscribers')) @@ -53,9 +55,11 @@ ->setCommentActionOrder(9000) ->setDescription(pht('Choose subscribers.')) ->setTransactionType($subscribers_type) - ->setValue($sub_phids); + ->setValue($sub_phids) + ->setViewer($viewer); - $subscribers_field->setViewer($engine->getViewer()); + $subscriber_datasource = id(new PhabricatorMetaMTAMailableDatasource()) + ->setViewer($viewer); $edit_add = $subscribers_field->getConduitEditType(self::EDITKEY_ADD) ->setConduitDescription(pht('Add subscribers.')); @@ -67,6 +71,18 @@ $edit_rem = $subscribers_field->getConduitEditType(self::EDITKEY_REMOVE) ->setConduitDescription(pht('Remove subscribers.')); + $subscribers_field->getBulkEditType(self::EDITKEY_ADD) + ->setBulkEditLabel(pht('Add subscribers')) + ->setDatasource($subscriber_datasource); + + $subscribers_field->getBulkEditType(self::EDITKEY_SET) + ->setBulkEditLabel(pht('Set subscribers to')) + ->setDatasource($subscriber_datasource); + + $subscribers_field->getBulkEditType(self::EDITKEY_REMOVE) + ->setBulkEditLabel(pht('Remove subscribers')) + ->setDatasource($subscriber_datasource); + return array( $subscribers_field, ); diff --git a/src/applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php b/src/applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php --- a/src/applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php +++ b/src/applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php @@ -82,6 +82,12 @@ $xaction->attachComment($comment); } + if (isset($raw_xaction['metadata'])) { + foreach ($raw_xaction['metadata'] as $meta_key => $meta_value) { + $xaction->setMetadataValue($meta_key, $meta_value); + } + } + $xactions[] = $xaction; } diff --git a/src/applications/transactions/bulk/type/BulkTokenizerParameterType.php b/src/applications/transactions/bulk/type/BulkTokenizerParameterType.php new file mode 100644 --- /dev/null +++ b/src/applications/transactions/bulk/type/BulkTokenizerParameterType.php @@ -0,0 +1,40 @@ +datasource = $datasource; + return $this; + } + + public function getDatasource() { + return $this->datasource; + } + + public function getPHUIXControlType() { + return 'tokenizer'; + } + + public function getPHUIXControlSpecification() { + $template = new AphrontTokenizerTemplateView(); + $template_markup = $template->render(); + + $datasource = $this->getDatasource(); + $limit = null; + + return array( + 'markup' => (string)hsprintf('%s', $template_markup), + 'config' => array( + 'src' => $datasource->getDatasourceURI(), + 'browseURI' => $datasource->getBrowseURI(), + 'placeholder' => $datasource->getPlaceholderText(), + 'limit' => $limit, + ), + 'value' => null, + ); + } + +} diff --git a/src/applications/transactions/editengine/PhabricatorEditEngine.php b/src/applications/transactions/editengine/PhabricatorEditEngine.php --- a/src/applications/transactions/editengine/PhabricatorEditEngine.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php @@ -2498,6 +2498,8 @@ // but it's possible that this isn't the case. $xaction['type'] = $edit_type->getTransactionType(); + $xaction['metadata'] = $edit_type->getMetadata(); + $xaction = $edit_type->newRawBulkTransaction($xaction); if ($xaction === null) { unset($xactions[$key]); diff --git a/src/applications/transactions/editfield/PhabricatorEditField.php b/src/applications/transactions/editfield/PhabricatorEditField.php --- a/src/applications/transactions/editfield/PhabricatorEditField.php +++ b/src/applications/transactions/editfield/PhabricatorEditField.php @@ -769,6 +769,19 @@ return $this->bulkEditTypes; } + final public function getBulkEditType($key) { + $edit_types = $this->getBulkEditTypes(); + + if (empty($edit_types[$key])) { + throw new Exception( + pht( + 'This EditField does not provide a Bulk EditType with key "%s".', + $key)); + } + + return $edit_types[$key]; + } + protected function newBulkEditTypes() { $edit_type = $this->getEditType(); diff --git a/src/applications/transactions/edittype/PhabricatorEdgeEditType.php b/src/applications/transactions/edittype/PhabricatorEdgeEditType.php --- a/src/applications/transactions/edittype/PhabricatorEdgeEditType.php +++ b/src/applications/transactions/edittype/PhabricatorEdgeEditType.php @@ -34,4 +34,28 @@ return array($xaction); } + protected function newBulkParameterType() { + if (!$this->getDatasource()) { + return null; + } + + return id(new BulkTokenizerParameterType()) + ->setDatasource($this->getDatasource()); + } + + + public function newRawBulkTransaction(array $xaction) { + $value = idx($xaction, 'value'); + + if ($this->getEdgeOperation() !== null) { + $value = array_fuse($value); + $value = array( + $this->getEdgeOperation() => $value, + ); + $xaction['value'] = $value; + } + + return $xaction; + } + }