@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

When an object which supports subtypes is created, set its subtype to the creating form's subtype

Summary:
Ref T12314. If you set a form to have the "plant" subtype, then create a task with it, save "plant" as the task subtype.

For Conduit, the default subtype is used by default, but a new "subtype" transaction is exposed. You can apply this transaction at create time to create an object of a certain subtype, or at any later time to change the subtype of an object.

This still doesn't do anything particularly useful or interesting.

Test Plan:
- Created a non-subtyped object (a Paste).
- Created "task" and "plant" tasks via different forms.
- Created "default" and "plant" tasks via Conduit.
- Changed the subtype of a task via Conduit.
- Tried to set a bad subtype.

{F3492061}

{F3492066}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12314

Differential Revision: https://secure.phabricator.com/D17443

+138 -2
+2
src/__phutil_library_map__.php
··· 3941 3941 'PhabricatorSubscriptionsTransactionController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsTransactionController.php', 3942 3942 'PhabricatorSubscriptionsUIEventListener' => 'applications/subscriptions/events/PhabricatorSubscriptionsUIEventListener.php', 3943 3943 'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsUnsubscribeEmailCommand.php', 3944 + 'PhabricatorSubtypeEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php', 3944 3945 'PhabricatorSupportApplication' => 'applications/support/application/PhabricatorSupportApplication.php', 3945 3946 'PhabricatorSyntaxHighlighter' => 'infrastructure/markup/PhabricatorSyntaxHighlighter.php', 3946 3947 'PhabricatorSyntaxHighlightingConfigOptions' => 'applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php', ··· 9241 9242 'PhabricatorSubscriptionsTransactionController' => 'PhabricatorController', 9242 9243 'PhabricatorSubscriptionsUIEventListener' => 'PhabricatorEventListener', 9243 9244 'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand', 9245 + 'PhabricatorSubtypeEditEngineExtension' => 'PhabricatorEditEngineExtension', 9244 9246 'PhabricatorSupportApplication' => 'PhabricatorApplication', 9245 9247 'PhabricatorSyntaxHighlighter' => 'Phobject', 9246 9248 'PhabricatorSyntaxHighlightingConfigOptions' => 'PhabricatorApplicationConfigOptions',
+23 -1
src/applications/maniphest/storage/ManiphestTransaction.php
··· 404 404 return pht( 405 405 '%s created this task.', 406 406 $this->renderHandleLink($author_phid)); 407 - 407 + case PhabricatorTransactions::TYPE_SUBTYPE: 408 + return pht( 409 + '%s changed the subtype of this task from "%s" to "%s".', 410 + $this->renderHandleLink($author_phid), 411 + $this->renderSubtypeName($old), 412 + $this->renderSubtypeName($new)); 408 413 case self::TYPE_TITLE: 409 414 if ($old === null) { 410 415 return pht( ··· 876 881 $this->renderHandleList($new), 877 882 $this->renderHandleLink($object_phid)); 878 883 884 + case PhabricatorTransactions::TYPE_SUBTYPE: 885 + return pht( 886 + '%s changed the subtype of %s from "%s" to "%s".', 887 + $this->renderHandleLink($author_phid), 888 + $this->renderHandleLink($object_phid), 889 + $this->renderSubtypeName($old), 890 + $this->renderSubtypeName($new)); 879 891 } 880 892 881 893 return parent::getTitleForFeed(); 894 + } 895 + 896 + private function renderSubtypeName($value) { 897 + $object = $this->getObject(); 898 + $map = $object->newEditEngineSubtypeMap(); 899 + if (!isset($map[$value])) { 900 + return $value; 901 + } 902 + 903 + return $map[$value]->getName(); 882 904 } 883 905 884 906 public function hasChangeDetails() {
+1
src/applications/transactions/constants/PhabricatorTransactions.php
··· 15 15 const TYPE_SPACE = 'core:space'; 16 16 const TYPE_CREATE = 'core:create'; 17 17 const TYPE_COLUMNS = 'core:columns'; 18 + const TYPE_SUBTYPE = 'core:subtype'; 18 19 19 20 const COLOR_RED = 'red'; 20 21 const COLOR_ORANGE = 'orange';
+9
src/applications/transactions/editengine/PhabricatorEditEngine.php
··· 976 976 $fields = $this->buildEditFields($object); 977 977 $template = $object->getApplicationTransactionTemplate(); 978 978 979 + $config = $this->getEditEngineConfiguration() 980 + ->attachEngine($this); 981 + 979 982 $validation_exception = null; 980 983 if ($request->isFormPost() && $request->getBool('editEngine')) { 981 984 $submit_fields = $fields; ··· 1010 1013 if ($this->getIsCreate()) { 1011 1014 $xactions[] = id(clone $template) 1012 1015 ->setTransactionType(PhabricatorTransactions::TYPE_CREATE); 1016 + 1017 + if ($this->supportsSubtypes()) { 1018 + $xactions[] = id(clone $template) 1019 + ->setTransactionType(PhabricatorTransactions::TYPE_SUBTYPE) 1020 + ->setNewValue($config->getSubtype()); 1021 + } 1013 1022 } 1014 1023 1015 1024 foreach ($submit_fields as $key => $field) {
+47
src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
··· 261 261 262 262 $types[] = PhabricatorTransactions::TYPE_CREATE; 263 263 264 + if ($this->object instanceof PhabricatorEditEngineSubtypeInterface) { 265 + $types[] = PhabricatorTransactions::TYPE_SUBTYPE; 266 + } 267 + 264 268 if ($this->object instanceof PhabricatorSubscribableInterface) { 265 269 $types[] = PhabricatorTransactions::TYPE_SUBSCRIBERS; 266 270 } ··· 324 328 switch ($type) { 325 329 case PhabricatorTransactions::TYPE_CREATE: 326 330 return null; 331 + case PhabricatorTransactions::TYPE_SUBTYPE: 332 + return $object->getEditEngineSubtype(); 327 333 case PhabricatorTransactions::TYPE_SUBSCRIBERS: 328 334 return array_values($this->subscribers); 329 335 case PhabricatorTransactions::TYPE_VIEW_POLICY: ··· 410 416 case PhabricatorTransactions::TYPE_BUILDABLE: 411 417 case PhabricatorTransactions::TYPE_TOKEN: 412 418 case PhabricatorTransactions::TYPE_INLINESTATE: 419 + case PhabricatorTransactions::TYPE_SUBTYPE: 413 420 return $xaction->getNewValue(); 414 421 case PhabricatorTransactions::TYPE_SPACE: 415 422 $space_phid = $xaction->getNewValue(); ··· 542 549 $field = $this->getCustomFieldForTransaction($object, $xaction); 543 550 return $field->applyApplicationTransactionInternalEffects($xaction); 544 551 case PhabricatorTransactions::TYPE_CREATE: 552 + case PhabricatorTransactions::TYPE_SUBTYPE: 545 553 case PhabricatorTransactions::TYPE_BUILDABLE: 546 554 case PhabricatorTransactions::TYPE_TOKEN: 547 555 case PhabricatorTransactions::TYPE_VIEW_POLICY: ··· 601 609 $field = $this->getCustomFieldForTransaction($object, $xaction); 602 610 return $field->applyApplicationTransactionExternalEffects($xaction); 603 611 case PhabricatorTransactions::TYPE_CREATE: 612 + case PhabricatorTransactions::TYPE_SUBTYPE: 604 613 case PhabricatorTransactions::TYPE_EDGE: 605 614 case PhabricatorTransactions::TYPE_BUILDABLE: 606 615 case PhabricatorTransactions::TYPE_TOKEN: ··· 663 672 break; 664 673 case PhabricatorTransactions::TYPE_SPACE: 665 674 $object->setSpacePHID($xaction->getNewValue()); 675 + break; 676 + case PhabricatorTransactions::TYPE_SUBTYPE: 677 + $object->setEditEngineSubtype($xaction->getNewValue()); 666 678 break; 667 679 } 668 680 } ··· 2103 2115 $xactions, 2104 2116 $type); 2105 2117 break; 2118 + case PhabricatorTransactions::TYPE_SUBTYPE: 2119 + $errors[] = $this->validateSubtypeTransactions( 2120 + $object, 2121 + $xactions, 2122 + $type); 2123 + break; 2106 2124 case PhabricatorTransactions::TYPE_CUSTOMFIELD: 2107 2125 $groups = array(); 2108 2126 foreach ($xactions as $xaction) { ··· 2254 2272 return $errors; 2255 2273 } 2256 2274 2275 + private function validateSubtypeTransactions( 2276 + PhabricatorLiskDAO $object, 2277 + array $xactions, 2278 + $transaction_type) { 2279 + $errors = array(); 2280 + 2281 + $map = $object->newEditEngineSubtypeMap(); 2282 + $old = $object->getEditEngineSubtype(); 2283 + foreach ($xactions as $xaction) { 2284 + $new = $xaction->getNewValue(); 2285 + 2286 + if ($old == $new) { 2287 + continue; 2288 + } 2289 + 2290 + if (!isset($map[$new])) { 2291 + $errors[] = new PhabricatorApplicationTransactionValidationError( 2292 + $transaction_type, 2293 + pht('Invalid'), 2294 + pht( 2295 + 'The subtype "%s" is not a valid subtype.', 2296 + $new), 2297 + $xaction); 2298 + continue; 2299 + } 2300 + } 2301 + 2302 + return $errors; 2303 + } 2257 2304 2258 2305 protected function adjustObjectForPolicyChecks( 2259 2306 PhabricatorLiskDAO $object,
+3 -1
src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php
··· 57 57 } 58 58 break; 59 59 case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE: 60 - $map = $object->getEngine()->newSubtypeMap(); 60 + $map = $object->getEngine() 61 + ->setViewer($this->getActor()) 62 + ->newSubtypeMap(); 61 63 foreach ($xactions as $xaction) { 62 64 $new = $xaction->getNewValue(); 63 65
+51
src/applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorSubtypeEditEngineExtension 4 + extends PhabricatorEditEngineExtension { 5 + 6 + const EXTENSIONKEY = 'editengine.subtype'; 7 + const EDITKEY = 'subtype'; 8 + 9 + public function getExtensionPriority() { 10 + return 8000; 11 + } 12 + 13 + public function isExtensionEnabled() { 14 + return true; 15 + } 16 + 17 + public function getExtensionName() { 18 + return pht('Subtypes'); 19 + } 20 + 21 + public function supportsObject( 22 + PhabricatorEditEngine $engine, 23 + PhabricatorApplicationTransactionInterface $object) { 24 + return $engine->supportsSubtypes(); 25 + } 26 + 27 + public function buildCustomEditFields( 28 + PhabricatorEditEngine $engine, 29 + PhabricatorApplicationTransactionInterface $object) { 30 + 31 + $subtype_type = PhabricatorTransactions::TYPE_SUBTYPE; 32 + 33 + $subtype_field = id(new PhabricatorSelectEditField()) 34 + ->setKey(self::EDITKEY) 35 + ->setLabel(pht('Subtype')) 36 + ->setIsConduitOnly(true) 37 + ->setIsHidden(true) 38 + ->setIsReorderable(false) 39 + ->setIsDefaultable(false) 40 + ->setIsLockable(false) 41 + ->setTransactionType($subtype_type) 42 + ->setConduitDescription(pht('Change the object subtype.')) 43 + ->setConduitTypeDescription(pht('New object subtype key.')) 44 + ->setValue($object->getEditEngineSubtype()); 45 + 46 + return array( 47 + $subtype_field, 48 + ); 49 + } 50 + 51 + }
+2
src/applications/transactions/storage/PhabricatorApplicationTransaction.php
··· 546 546 case PhabricatorTransactions::TYPE_JOIN_POLICY: 547 547 case PhabricatorTransactions::TYPE_SPACE: 548 548 break; 549 + case PhabricatorTransactions::TYPE_SUBTYPE: 550 + return true; 549 551 default: 550 552 $old = $this->getOldValue(); 551 553