@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.

Migate more of Pholio to Modular Transaction

Summary: Another Franken-transaction. Adds transactions for ImageName and MockName. Adds transaction-level validation for presence of mock name; removed same from edit controller. Removes `PholioTransaction::getRemarkupBodyForFeed()`, which appears to be dead code since that method isn't defined on any other types.

Test Plan: made a bunch of changes to pholio mocks and images and observed expected results

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: Korvin, chad, epriestley

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

+226 -117
+10 -2
src/__phutil_library_map__.php
··· 4359 4359 'PholioDAO' => 'applications/pholio/storage/PholioDAO.php', 4360 4360 'PholioDefaultEditCapability' => 'applications/pholio/capability/PholioDefaultEditCapability.php', 4361 4361 'PholioDefaultViewCapability' => 'applications/pholio/capability/PholioDefaultViewCapability.php', 4362 - 'PholioDescriptionTransaction' => 'applications/pholio/xaction/PholioDescriptionTransaction.php', 4363 4362 'PholioImage' => 'applications/pholio/storage/PholioImage.php', 4363 + 'PholioImageNameTransaction' => 'applications/pholio/xaction/PholioImageNameTransaction.php', 4364 4364 'PholioImagePHIDType' => 'applications/pholio/phid/PholioImagePHIDType.php', 4365 4365 'PholioImageQuery' => 'applications/pholio/query/PholioImageQuery.php', 4366 + 'PholioImageTransactionType' => 'applications/pholio/xaction/PholioImageTransactionType.php', 4366 4367 'PholioImageUploadController' => 'applications/pholio/controller/PholioImageUploadController.php', 4367 4368 'PholioInlineController' => 'applications/pholio/controller/PholioInlineController.php', 4368 4369 'PholioInlineListController' => 'applications/pholio/controller/PholioInlineListController.php', ··· 4371 4372 'PholioMockAuthorHeraldField' => 'applications/pholio/herald/PholioMockAuthorHeraldField.php', 4372 4373 'PholioMockCommentController' => 'applications/pholio/controller/PholioMockCommentController.php', 4373 4374 'PholioMockDescriptionHeraldField' => 'applications/pholio/herald/PholioMockDescriptionHeraldField.php', 4375 + 'PholioMockDescriptionTransaction' => 'applications/pholio/xaction/PholioMockDescriptionTransaction.php', 4374 4376 'PholioMockEditController' => 'applications/pholio/controller/PholioMockEditController.php', 4375 4377 'PholioMockEditor' => 'applications/pholio/editor/PholioMockEditor.php', 4376 4378 'PholioMockEmbedView' => 'applications/pholio/view/PholioMockEmbedView.php', ··· 4383 4385 'PholioMockListController' => 'applications/pholio/controller/PholioMockListController.php', 4384 4386 'PholioMockMailReceiver' => 'applications/pholio/mail/PholioMockMailReceiver.php', 4385 4387 'PholioMockNameHeraldField' => 'applications/pholio/herald/PholioMockNameHeraldField.php', 4388 + 'PholioMockNameTransaction' => 'applications/pholio/xaction/PholioMockNameTransaction.php', 4386 4389 'PholioMockPHIDType' => 'applications/pholio/phid/PholioMockPHIDType.php', 4387 4390 'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php', 4388 4391 'PholioMockRelationship' => 'applications/pholio/relationships/PholioMockRelationship.php', 4389 4392 'PholioMockRelationshipSource' => 'applications/search/relationship/PholioMockRelationshipSource.php', 4390 4393 'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php', 4391 4394 'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php', 4395 + 'PholioMockTransactionType' => 'applications/pholio/xaction/PholioMockTransactionType.php', 4392 4396 'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php', 4393 4397 'PholioRemarkupRule' => 'applications/pholio/remarkup/PholioRemarkupRule.php', 4394 4398 'PholioReplyHandler' => 'applications/pholio/mail/PholioReplyHandler.php', ··· 9896 9900 'PholioDAO' => 'PhabricatorLiskDAO', 9897 9901 'PholioDefaultEditCapability' => 'PhabricatorPolicyCapability', 9898 9902 'PholioDefaultViewCapability' => 'PhabricatorPolicyCapability', 9899 - 'PholioDescriptionTransaction' => 'PholioTransactionType', 9900 9903 'PholioImage' => array( 9901 9904 'PholioDAO', 9902 9905 'PhabricatorMarkupInterface', 9903 9906 'PhabricatorPolicyInterface', 9904 9907 ), 9908 + 'PholioImageNameTransaction' => 'PholioImageTransactionType', 9905 9909 'PholioImagePHIDType' => 'PhabricatorPHIDType', 9906 9910 'PholioImageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 9911 + 'PholioImageTransactionType' => 'PholioTransactionType', 9907 9912 'PholioImageUploadController' => 'PholioController', 9908 9913 'PholioInlineController' => 'PholioController', 9909 9914 'PholioInlineListController' => 'PholioController', ··· 9925 9930 'PholioMockAuthorHeraldField' => 'PholioMockHeraldField', 9926 9931 'PholioMockCommentController' => 'PholioController', 9927 9932 'PholioMockDescriptionHeraldField' => 'PholioMockHeraldField', 9933 + 'PholioMockDescriptionTransaction' => 'PholioMockTransactionType', 9928 9934 'PholioMockEditController' => 'PholioController', 9929 9935 'PholioMockEditor' => 'PhabricatorApplicationTransactionEditor', 9930 9936 'PholioMockEmbedView' => 'AphrontView', ··· 9937 9943 'PholioMockListController' => 'PholioController', 9938 9944 'PholioMockMailReceiver' => 'PhabricatorObjectMailReceiver', 9939 9945 'PholioMockNameHeraldField' => 'PholioMockHeraldField', 9946 + 'PholioMockNameTransaction' => 'PholioMockTransactionType', 9940 9947 'PholioMockPHIDType' => 'PhabricatorPHIDType', 9941 9948 'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 9942 9949 'PholioMockRelationship' => 'PhabricatorObjectRelationship', 9943 9950 'PholioMockRelationshipSource' => 'PhabricatorObjectRelationshipSource', 9944 9951 'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine', 9945 9952 'PholioMockThumbGridView' => 'AphrontView', 9953 + 'PholioMockTransactionType' => 'PholioTransactionType', 9946 9954 'PholioMockViewController' => 'PholioController', 9947 9955 'PholioRemarkupRule' => 'PhabricatorObjectRemarkupRule', 9948 9956 'PholioReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
+3 -8
src/applications/pholio/controller/PholioMockEditController.php
··· 65 65 if ($request->isFormPost()) { 66 66 $xactions = array(); 67 67 68 - $type_name = PholioTransaction::TYPE_NAME; 69 - $type_desc = PholioDescriptionTransaction::TRANSACTIONTYPE; 68 + $type_name = PholioMockNameTransaction::TRANSACTIONTYPE; 69 + $type_desc = PholioMockDescriptionTransaction::TRANSACTIONTYPE; 70 70 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 71 71 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 72 72 $type_cc = PhabricatorTransactions::TYPE_SUBSCRIBERS; ··· 87 87 $mock_xactions[$type_edit] = $v_edit; 88 88 $mock_xactions[$type_cc] = array('=' => $v_cc); 89 89 $mock_xactions[$type_space] = $v_space; 90 - 91 - if (!strlen($request->getStr('name'))) { 92 - $e_name = pht('Required'); 93 - $errors[] = pht('You must give the mock a name.'); 94 - } 95 90 96 91 $file_phids = $request->getArr('file_phids'); 97 92 if ($file_phids) { ··· 173 168 $posted_mock_images[] = $add_image; 174 169 } else { 175 170 $xactions[] = id(new PholioTransaction()) 176 - ->setTransactionType(PholioTransaction::TYPE_IMAGE_NAME) 171 + ->setTransactionType(PholioImageNameTransaction::TRANSACTIONTYPE) 177 172 ->setNewValue( 178 173 array($existing_image->getPHID() => $title)); 179 174 $xactions[] = id(new PholioTransaction())
-29
src/applications/pholio/editor/PholioMockEditor.php
··· 29 29 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 30 30 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 31 31 32 - $types[] = PholioTransaction::TYPE_NAME; 33 32 $types[] = PholioTransaction::TYPE_STATUS; 34 33 $types[] = PholioTransaction::TYPE_INLINE; 35 34 36 35 $types[] = PholioTransaction::TYPE_IMAGE_FILE; 37 - $types[] = PholioTransaction::TYPE_IMAGE_NAME; 38 36 $types[] = PholioTransaction::TYPE_IMAGE_DESCRIPTION; 39 37 $types[] = PholioTransaction::TYPE_IMAGE_REPLACE; 40 38 $types[] = PholioTransaction::TYPE_IMAGE_SEQUENCE; ··· 47 45 PhabricatorApplicationTransaction $xaction) { 48 46 49 47 switch ($xaction->getTransactionType()) { 50 - case PholioTransaction::TYPE_NAME: 51 - return $object->getName(); 52 48 case PholioTransaction::TYPE_STATUS: 53 49 return $object->getStatus(); 54 50 case PholioTransaction::TYPE_IMAGE_FILE: 55 51 $images = $object->getImages(); 56 52 return mpull($images, 'getPHID'); 57 - case PholioTransaction::TYPE_IMAGE_NAME: 58 - $name = null; 59 - $phid = null; 60 - $image = $this->getImageForXaction($object, $xaction); 61 - if ($image) { 62 - $name = $image->getName(); 63 - $phid = $image->getPHID(); 64 - } 65 - return array($phid => $name); 66 53 case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 67 54 $description = null; 68 55 $phid = null; ··· 92 79 PhabricatorApplicationTransaction $xaction) { 93 80 94 81 switch ($xaction->getTransactionType()) { 95 - case PholioTransaction::TYPE_NAME: 96 82 case PholioTransaction::TYPE_STATUS: 97 - case PholioTransaction::TYPE_IMAGE_NAME: 98 83 case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 99 84 case PholioTransaction::TYPE_IMAGE_SEQUENCE: 100 85 return $xaction->getNewValue(); ··· 205 190 PhabricatorApplicationTransaction $xaction) { 206 191 207 192 switch ($xaction->getTransactionType()) { 208 - case PholioTransaction::TYPE_NAME: 209 - $object->setName($xaction->getNewValue()); 210 - if ($object->getOriginalName() === null) { 211 - $object->setOriginalName($xaction->getNewValue()); 212 - } 213 - break; 214 193 case PholioTransaction::TYPE_STATUS: 215 194 $object->setStatus($xaction->getNewValue()); 216 195 break; ··· 263 242 } 264 243 $object->attachImages($images); 265 244 break; 266 - case PholioTransaction::TYPE_IMAGE_NAME: 267 - $image = $this->getImageForXaction($object, $xaction); 268 - $value = (string)head($xaction->getNewValue()); 269 - $image->setName($value); 270 - $image->save(); 271 - break; 272 245 case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 273 246 $image = $this->getImageForXaction($object, $xaction); 274 247 $value = (string)head($xaction->getNewValue()); ··· 303 276 304 277 $type = $u->getTransactionType(); 305 278 switch ($type) { 306 - case PholioTransaction::TYPE_NAME: 307 279 case PholioTransaction::TYPE_STATUS: 308 280 return $v; 309 281 case PholioTransaction::TYPE_IMAGE_REPLACE: ··· 315 287 break; 316 288 case PholioTransaction::TYPE_IMAGE_FILE: 317 289 return $this->mergePHIDOrEdgeTransactions($u, $v); 318 - case PholioTransaction::TYPE_IMAGE_NAME: 319 290 case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 320 291 case PholioTransaction::TYPE_IMAGE_SEQUENCE: 321 292 $raw_new_value_u = $u->getNewValue();
+2 -2
src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php
··· 22 22 23 23 // Accumulate Transactions 24 24 $changes = array(); 25 - $changes[PholioTransaction::TYPE_NAME] = 25 + $changes[PholioMockNameTransaction::TRANSACTIONTYPE] = 26 26 $this->generateTitle(); 27 - $changes[PholioDescriptionTransaction::TRANSACTIONTYPE] = 27 + $changes[PholioMockDescriptionTransaction::TRANSACTIONTYPE] = 28 28 $this->generateDescription(); 29 29 $changes[PhabricatorTransactions::TYPE_VIEW_POLICY] = 30 30 PhabricatorPolicies::POLICY_PUBLIC;
+4 -74
src/applications/pholio/storage/PholioTransaction.php
··· 3 3 final class PholioTransaction extends PhabricatorModularTransaction { 4 4 5 5 // Edits to the high level mock 6 - const TYPE_NAME = 'name'; 7 6 const TYPE_STATUS = 'status'; 8 7 9 8 // Edits to images within the mock 10 9 const TYPE_IMAGE_FILE = 'image-file'; 11 - const TYPE_IMAGE_NAME= 'image-name'; 12 10 const TYPE_IMAGE_DESCRIPTION = 'image-description'; 13 11 const TYPE_IMAGE_REPLACE = 'image-replace'; 14 12 const TYPE_IMAGE_SEQUENCE = 'image-sequence'; ··· 57 55 $phids[] = $old; 58 56 break; 59 57 case self::TYPE_IMAGE_DESCRIPTION: 60 - case self::TYPE_IMAGE_NAME: 58 + case PholioImageNameTransaction::TRANSACTIONTYPE: 61 59 case self::TYPE_IMAGE_SEQUENCE: 62 60 $phids[] = key($new); 63 61 break; ··· 70 68 $old = $this->getOldValue(); 71 69 72 70 switch ($this->getTransactionType()) { 73 - case self::TYPE_IMAGE_NAME: 74 71 case self::TYPE_IMAGE_DESCRIPTION: 75 72 return ($old === array(null => null)); 76 73 // this is boring / silly to surface; changing sequence is NBD ··· 89 86 switch ($this->getTransactionType()) { 90 87 case self::TYPE_INLINE: 91 88 return 'fa-comment'; 92 - case self::TYPE_NAME: 93 89 case self::TYPE_STATUS: 94 90 if ($new == PholioMock::STATUS_CLOSED) { 95 91 return 'fa-ban'; 96 92 } else { 97 93 return 'fa-check'; 98 94 } 99 - case self::TYPE_IMAGE_NAME: 100 95 case self::TYPE_IMAGE_DESCRIPTION: 101 96 case self::TYPE_IMAGE_SEQUENCE: 102 97 return 'fa-pencil'; ··· 118 113 case self::TYPE_STATUS: 119 114 $tags[] = self::MAILTAG_STATUS; 120 115 break; 121 - case self::TYPE_NAME: 122 - case PholioDescriptionTransaction::TRANSACTIONTYPE: 123 - case self::TYPE_IMAGE_NAME: 116 + case PholioMockNameTransaction::TRANSACTIONTYPE: 117 + case PholioMockDescriptionTransaction::TRANSACTIONTYPE: 118 + case PholioImageNameTransaction::TRANSACTIONTYPE: 124 119 case self::TYPE_IMAGE_DESCRIPTION: 125 120 case self::TYPE_IMAGE_SEQUENCE: 126 121 case self::TYPE_IMAGE_FILE: ··· 142 137 143 138 $type = $this->getTransactionType(); 144 139 switch ($type) { 145 - case self::TYPE_NAME: 146 - if ($old === null) { 147 - return pht( 148 - '%s created "%s".', 149 - $this->renderHandleLink($author_phid), 150 - $new); 151 - } else { 152 - return pht( 153 - '%s renamed this mock from "%s" to "%s".', 154 - $this->renderHandleLink($author_phid), 155 - $old, 156 - $new); 157 - } 158 - break; 159 140 case self::TYPE_STATUS: 160 141 if ($new == PholioMock::STATUS_CLOSED) { 161 142 return pht( ··· 213 194 $this->renderHandleList($rem)); 214 195 } 215 196 break; 216 - 217 - case self::TYPE_IMAGE_NAME: 218 - return pht( 219 - '%s renamed an image (%s) from "%s" to "%s".', 220 - $this->renderHandleLink($author_phid), 221 - $this->renderHandleLink(key($new)), 222 - reset($old), 223 - reset($new)); 224 - break; 225 197 case self::TYPE_IMAGE_DESCRIPTION: 226 198 return pht( 227 199 '%s updated an image\'s (%s) description.', ··· 248 220 249 221 $type = $this->getTransactionType(); 250 222 switch ($type) { 251 - case self::TYPE_NAME: 252 - if ($old === null) { 253 - return pht( 254 - '%s created %s.', 255 - $this->renderHandleLink($author_phid), 256 - $this->renderHandleLink($object_phid)); 257 - } else { 258 - return pht( 259 - '%s renamed %s from "%s" to "%s".', 260 - $this->renderHandleLink($author_phid), 261 - $this->renderHandleLink($object_phid), 262 - $old, 263 - $new); 264 - } 265 - break; 266 223 case self::TYPE_STATUS: 267 224 if ($new == PholioMock::STATUS_CLOSED) { 268 225 return pht( ··· 289 246 $this->renderHandleLink($author_phid), 290 247 $this->renderHandleLink($object_phid)); 291 248 break; 292 - case self::TYPE_IMAGE_NAME: 293 - return pht( 294 - '%s updated the image names of %s.', 295 - $this->renderHandleLink($author_phid), 296 - $this->renderHandleLink($object_phid)); 297 - break; 298 249 case self::TYPE_IMAGE_DESCRIPTION: 299 250 return pht( 300 251 '%s updated image descriptions of %s.', ··· 312 263 return parent::getTitleForFeed(); 313 264 } 314 265 315 - public function getRemarkupBodyForFeed(PhabricatorFeedStory $story) { 316 - $text = null; 317 - switch ($this->getTransactionType()) { 318 - case self::TYPE_NAME: 319 - if ($this->getOldValue() === null) { 320 - $mock = $story->getPrimaryObject(); 321 - $text = $mock->getDescription(); 322 - } 323 - break; 324 - case self::TYPE_INLINE: 325 - $text = $this->getComment()->getContent(); 326 - break; 327 - } 328 - 329 - return $text; 330 - } 331 - 332 266 public function getColor() { 333 267 $old = $this->getOldValue(); 334 268 $new = $this->getNewValue(); ··· 338 272 if ($new == PholioMock::STATUS_CLOSED) { 339 273 return PhabricatorTransactions::COLOR_INDIGO; 340 274 } else { 341 - return PhabricatorTransactions::COLOR_GREEN; 342 - } 343 - case self::TYPE_NAME: 344 - if ($old === null) { 345 275 return PhabricatorTransactions::COLOR_GREEN; 346 276 } 347 277 case self::TYPE_IMAGE_REPLACE:
+2 -2
src/applications/pholio/xaction/PholioDescriptionTransaction.php src/applications/pholio/xaction/PholioMockDescriptionTransaction.php
··· 1 1 <?php 2 2 3 - final class PholioDescriptionTransaction 4 - extends PholioTransactionType { 3 + final class PholioMockDescriptionTransaction 4 + extends PholioMockTransactionType { 5 5 6 6 const TRANSACTIONTYPE = 'description'; 7 7
+95
src/applications/pholio/xaction/PholioImageNameTransaction.php
··· 1 + <?php 2 + 3 + final class PholioImageNameTransaction 4 + extends PholioImageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'image-name'; 7 + 8 + public function generateOldValue($object) { 9 + $name = null; 10 + $phid = null; 11 + $image = $this->getImageForXaction($object); 12 + if ($image) { 13 + $name = $image->getName(); 14 + $phid = $image->getPHID(); 15 + } 16 + return array($phid => $name); 17 + } 18 + 19 + public function applyInternalEffects($object, $value) { 20 + $image = $this->getImageForXaction($object); 21 + $value = (string)head($this->getNewValue()); 22 + $image->setName($value); 23 + $image->save(); 24 + } 25 + 26 + public function getTitle() { 27 + $old = $this->getOldValue(); 28 + $new = $this->getNewValue(); 29 + 30 + return pht( 31 + '%s renamed an image (%s) from %s to %s.', 32 + $this->renderAuthor(), 33 + $this->renderHandle(key($new)), 34 + $this->renderValue($old), 35 + $this->renderValue($new)); 36 + } 37 + 38 + public function getTitleForFeed() { 39 + return pht( 40 + '%s updated the image names of %s.', 41 + $this->renderAuthor(), 42 + $this->renderObject()); 43 + } 44 + 45 + public function getIcon() { 46 + $new = $this->getNewValue(); 47 + 48 + if ($new == PholioMock::STATUS_CLOSED) { 49 + return 'fa-ban'; 50 + } else { 51 + return 'fa-check'; 52 + } 53 + } 54 + 55 + public function mergeTransactions( 56 + $object, 57 + PhabricatorApplicationTransaction $u, 58 + PhabricatorApplicationTransaction $v) { 59 + 60 + $raw_new_value_u = $u->getNewValue(); 61 + $raw_new_value_v = $v->getNewValue(); 62 + $phid_u = head_key($raw_new_value_u); 63 + $phid_v = head_key($raw_new_value_v); 64 + if ($phid_u == $phid_v) { 65 + return $v; 66 + } 67 + 68 + return null; 69 + } 70 + 71 + public function shouldHide() { 72 + $old = $this->getOldValue(); 73 + return ($old === array(null => null)); 74 + } 75 + 76 + public function validateTransactions($object, array $xactions) { 77 + $errors = array(); 78 + 79 + $max_length = $object->getColumnMaximumByteLength('name'); 80 + foreach ($xactions as $xaction) { 81 + $new_value = head(array_values($xaction->getNewValue())); 82 + $new_length = strlen($new_value); 83 + if ($new_length > $max_length) { 84 + $errors[] = $this->newInvalidError( 85 + pht( 86 + 'Mock image names must not be longer than %s character(s).', 87 + new PhutilNumber($max_length))); 88 + } 89 + } 90 + 91 + return $errors; 92 + } 93 + 94 + 95 + }
+18
src/applications/pholio/xaction/PholioImageTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PholioImageTransactionType 4 + extends PholioTransactionType { 5 + 6 + protected function getImageForXaction(PholioMock $mock) { 7 + $raw_new_value = $this->getNewValue(); 8 + $image_phid = head_key($raw_new_value); 9 + $images = $mock->getImages(); 10 + foreach ($images as $image) { 11 + if ($image->getPHID() == $image_phid) { 12 + return $image; 13 + } 14 + } 15 + return null; 16 + } 17 + 18 + }
+88
src/applications/pholio/xaction/PholioMockNameTransaction.php
··· 1 + <?php 2 + 3 + final class PholioMockNameTransaction 4 + extends PholioMockTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'name'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getName(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setName($value); 14 + if ($object->getOriginalName() === null) { 15 + $object->setOriginalName($this->getNewValue()); 16 + } 17 + } 18 + 19 + public function getTitle() { 20 + $old = $this->getOldValue(); 21 + $new = $this->getNewValue(); 22 + 23 + if ($old === null) { 24 + return pht( 25 + '%s created %s.', 26 + $this->renderAuthor(), 27 + $this->renderValue($new)); 28 + } else { 29 + return pht( 30 + '%s renamed this mock from %s to %s.', 31 + $this->renderAuthor(), 32 + $this->renderValue($old), 33 + $this->renderValue($new)); 34 + } 35 + } 36 + 37 + public function getTitleForFeed() { 38 + $old = $this->getOldValue(); 39 + $new = $this->getNewValue(); 40 + 41 + if ($old === null) { 42 + return pht( 43 + '%s created %s.', 44 + $this->renderAuthor(), 45 + $this->renderObject()); 46 + } else { 47 + return pht( 48 + '%s renamed %s from %s to %s.', 49 + $this->renderAuthor(), 50 + $this->renderObject(), 51 + $this->renderValue($old), 52 + $this->renderValue($new)); 53 + } 54 + } 55 + 56 + public function getColor() { 57 + $old = $this->getOldValue(); 58 + 59 + if ($old === null) { 60 + return PhabricatorTransactions::COLOR_GREEN; 61 + } 62 + 63 + return parent::getColor(); 64 + } 65 + 66 + public function validateTransactions($object, array $xactions) { 67 + $errors = array(); 68 + 69 + if ($this->isEmptyTextTransaction($object->getName(), $xactions)) { 70 + $errors[] = $this->newRequiredError(pht('Mocks must have a name.')); 71 + } 72 + 73 + $max_length = $object->getColumnMaximumByteLength('name'); 74 + foreach ($xactions as $xaction) { 75 + $new_value = $xaction->getNewValue(); 76 + $new_length = strlen($new_value); 77 + if ($new_length > $max_length) { 78 + $errors[] = $this->newInvalidError( 79 + pht( 80 + 'Mock names must not be longer than %s character(s).', 81 + new PhutilNumber($max_length))); 82 + } 83 + } 84 + 85 + return $errors; 86 + } 87 + 88 + }
+4
src/applications/pholio/xaction/PholioMockTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PholioMockTransactionType 4 + extends PholioTransactionType {}