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

Migrate Pholio image description and mock status to modular transactions

Summary: Also removes more now-dead code from `PholioTransaction`.

Test Plan: opened and closed a bunch of mocks, edited a bunch of image descriptions

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: Korvin, epriestley

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

+151 -117
+4
src/__phutil_library_map__.php
··· 4360 4360 'PholioDefaultEditCapability' => 'applications/pholio/capability/PholioDefaultEditCapability.php', 4361 4361 'PholioDefaultViewCapability' => 'applications/pholio/capability/PholioDefaultViewCapability.php', 4362 4362 'PholioImage' => 'applications/pholio/storage/PholioImage.php', 4363 + 'PholioImageDescriptionTransaction' => 'applications/pholio/xaction/PholioImageDescriptionTransaction.php', 4363 4364 'PholioImageNameTransaction' => 'applications/pholio/xaction/PholioImageNameTransaction.php', 4364 4365 'PholioImagePHIDType' => 'applications/pholio/phid/PholioImagePHIDType.php', 4365 4366 'PholioImageQuery' => 'applications/pholio/query/PholioImageQuery.php', ··· 4391 4392 'PholioMockRelationship' => 'applications/pholio/relationships/PholioMockRelationship.php', 4392 4393 'PholioMockRelationshipSource' => 'applications/search/relationship/PholioMockRelationshipSource.php', 4393 4394 'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php', 4395 + 'PholioMockStatusTransaction' => 'applications/pholio/xaction/PholioMockStatusTransaction.php', 4394 4396 'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php', 4395 4397 'PholioMockTransactionType' => 'applications/pholio/xaction/PholioMockTransactionType.php', 4396 4398 'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php', ··· 9905 9907 'PhabricatorMarkupInterface', 9906 9908 'PhabricatorPolicyInterface', 9907 9909 ), 9910 + 'PholioImageDescriptionTransaction' => 'PholioImageTransactionType', 9908 9911 'PholioImageNameTransaction' => 'PholioImageTransactionType', 9909 9912 'PholioImagePHIDType' => 'PhabricatorPHIDType', 9910 9913 'PholioImageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 9949 9952 'PholioMockRelationship' => 'PhabricatorObjectRelationship', 9950 9953 'PholioMockRelationshipSource' => 'PhabricatorObjectRelationshipSource', 9951 9954 'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine', 9955 + 'PholioMockStatusTransaction' => 'PholioMockTransactionType', 9952 9956 'PholioMockThumbGridView' => 'AphrontView', 9953 9957 'PholioMockTransactionType' => 'PholioTransactionType', 9954 9958 'PholioMockViewController' => 'PholioController',
+1 -1
src/applications/pholio/controller/PholioMockArchiveController.php
··· 32 32 $xactions = array(); 33 33 34 34 $xactions[] = id(new PholioTransaction()) 35 - ->setTransactionType(PholioTransaction::TYPE_STATUS) 35 + ->setTransactionType(PholioMockStatusTransaction::TRANSACTIONTYPE) 36 36 ->setNewValue($new_status); 37 37 38 38 id(new PholioMockEditor())
+1 -1
src/applications/pholio/controller/PholioMockEditController.php
··· 173 173 array($existing_image->getPHID() => $title)); 174 174 $xactions[] = id(new PholioTransaction()) 175 175 ->setTransactionType( 176 - PholioTransaction::TYPE_IMAGE_DESCRIPTION) 176 + PholioImageDescriptionTransaction::TRANSACTIONTYPE) 177 177 ->setNewValue( 178 178 array($existing_image->getPHID() => $description)); 179 179 $xactions[] = id(new PholioTransaction())
-35
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_STATUS; 33 32 $types[] = PholioTransaction::TYPE_INLINE; 34 33 35 34 $types[] = PholioTransaction::TYPE_IMAGE_FILE; 36 - $types[] = PholioTransaction::TYPE_IMAGE_DESCRIPTION; 37 35 $types[] = PholioTransaction::TYPE_IMAGE_REPLACE; 38 36 $types[] = PholioTransaction::TYPE_IMAGE_SEQUENCE; 39 37 ··· 45 43 PhabricatorApplicationTransaction $xaction) { 46 44 47 45 switch ($xaction->getTransactionType()) { 48 - case PholioTransaction::TYPE_STATUS: 49 - return $object->getStatus(); 50 46 case PholioTransaction::TYPE_IMAGE_FILE: 51 47 $images = $object->getImages(); 52 48 return mpull($images, 'getPHID'); 53 - case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 54 - $description = null; 55 - $phid = null; 56 - $image = $this->getImageForXaction($object, $xaction); 57 - if ($image) { 58 - $description = $image->getDescription(); 59 - $phid = $image->getPHID(); 60 - } 61 - return array($phid => $description); 62 49 case PholioTransaction::TYPE_IMAGE_REPLACE: 63 50 $raw = $xaction->getNewValue(); 64 51 return $raw->getReplacesImagePHID(); ··· 79 66 PhabricatorApplicationTransaction $xaction) { 80 67 81 68 switch ($xaction->getTransactionType()) { 82 - case PholioTransaction::TYPE_STATUS: 83 - case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 84 69 case PholioTransaction::TYPE_IMAGE_SEQUENCE: 85 70 return $xaction->getNewValue(); 86 71 case PholioTransaction::TYPE_IMAGE_REPLACE: ··· 185 170 $this->setNewImages($new_images); 186 171 } 187 172 188 - protected function applyCustomInternalTransaction( 189 - PhabricatorLiskDAO $object, 190 - PhabricatorApplicationTransaction $xaction) { 191 - 192 - switch ($xaction->getTransactionType()) { 193 - case PholioTransaction::TYPE_STATUS: 194 - $object->setStatus($xaction->getNewValue()); 195 - break; 196 - } 197 - } 198 - 199 173 private function getImageForXaction( 200 174 PholioMock $mock, 201 175 PhabricatorApplicationTransaction $xaction) { ··· 242 216 } 243 217 $object->attachImages($images); 244 218 break; 245 - case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 246 - $image = $this->getImageForXaction($object, $xaction); 247 - $value = (string)head($xaction->getNewValue()); 248 - $image->setDescription($value); 249 - $image->save(); 250 - break; 251 219 case PholioTransaction::TYPE_IMAGE_SEQUENCE: 252 220 $image = $this->getImageForXaction($object, $xaction); 253 221 $value = (int)head($xaction->getNewValue()); ··· 276 244 277 245 $type = $u->getTransactionType(); 278 246 switch ($type) { 279 - case PholioTransaction::TYPE_STATUS: 280 - return $v; 281 247 case PholioTransaction::TYPE_IMAGE_REPLACE: 282 248 $u_img = $u->getNewValue(); 283 249 $v_img = $v->getNewValue(); ··· 287 253 break; 288 254 case PholioTransaction::TYPE_IMAGE_FILE: 289 255 return $this->mergePHIDOrEdgeTransactions($u, $v); 290 - case PholioTransaction::TYPE_IMAGE_DESCRIPTION: 291 256 case PholioTransaction::TYPE_IMAGE_SEQUENCE: 292 257 $raw_new_value_u = $u->getNewValue(); 293 258 $raw_new_value_v = $v->getNewValue();
+3 -70
src/applications/pholio/storage/PholioTransaction.php
··· 2 2 3 3 final class PholioTransaction extends PhabricatorModularTransaction { 4 4 5 - // Edits to the high level mock 6 - const TYPE_STATUS = 'status'; 7 - 8 5 // Edits to images within the mock 9 6 const TYPE_IMAGE_FILE = 'image-file'; 10 - const TYPE_IMAGE_DESCRIPTION = 'image-description'; 11 7 const TYPE_IMAGE_REPLACE = 'image-replace'; 12 8 const TYPE_IMAGE_SEQUENCE = 'image-sequence'; 13 9 ··· 54 50 $phids[] = $new; 55 51 $phids[] = $old; 56 52 break; 57 - case self::TYPE_IMAGE_DESCRIPTION: 53 + case PholioImageDescriptionTransaction::TRANSACTIONTYPE: 58 54 case PholioImageNameTransaction::TRANSACTIONTYPE: 59 55 case self::TYPE_IMAGE_SEQUENCE: 60 56 $phids[] = key($new); ··· 68 64 $old = $this->getOldValue(); 69 65 70 66 switch ($this->getTransactionType()) { 71 - case self::TYPE_IMAGE_DESCRIPTION: 72 - return ($old === array(null => null)); 73 67 // this is boring / silly to surface; changing sequence is NBD 74 68 case self::TYPE_IMAGE_SEQUENCE: 75 69 return true; ··· 86 80 switch ($this->getTransactionType()) { 87 81 case self::TYPE_INLINE: 88 82 return 'fa-comment'; 89 - case self::TYPE_STATUS: 90 - if ($new == PholioMock::STATUS_CLOSED) { 91 - return 'fa-ban'; 92 - } else { 93 - return 'fa-check'; 94 - } 95 - case self::TYPE_IMAGE_DESCRIPTION: 96 83 case self::TYPE_IMAGE_SEQUENCE: 97 84 return 'fa-pencil'; 98 85 case self::TYPE_IMAGE_FILE: ··· 110 97 case PhabricatorTransactions::TYPE_COMMENT: 111 98 $tags[] = self::MAILTAG_COMMENT; 112 99 break; 113 - case self::TYPE_STATUS: 100 + case PholioMockStatusTransaction::TRANSACTIONTYPE: 114 101 $tags[] = self::MAILTAG_STATUS; 115 102 break; 116 103 case PholioMockNameTransaction::TRANSACTIONTYPE: 117 104 case PholioMockDescriptionTransaction::TRANSACTIONTYPE: 118 105 case PholioImageNameTransaction::TRANSACTIONTYPE: 119 - case self::TYPE_IMAGE_DESCRIPTION: 106 + case PholioImageDescriptionTransaction::TRANSACTIONTYPE: 120 107 case self::TYPE_IMAGE_SEQUENCE: 121 108 case self::TYPE_IMAGE_FILE: 122 109 case self::TYPE_IMAGE_REPLACE: ··· 137 124 138 125 $type = $this->getTransactionType(); 139 126 switch ($type) { 140 - case self::TYPE_STATUS: 141 - if ($new == PholioMock::STATUS_CLOSED) { 142 - return pht( 143 - '%s closed this mock.', 144 - $this->renderHandleLink($author_phid)); 145 - } else { 146 - return pht( 147 - '%s opened this mock.', 148 - $this->renderHandleLink($author_phid)); 149 - } 150 - break; 151 127 case self::TYPE_INLINE: 152 128 $count = 1; 153 129 foreach ($this->getTransactionGroup() as $xaction) { ··· 194 170 $this->renderHandleList($rem)); 195 171 } 196 172 break; 197 - case self::TYPE_IMAGE_DESCRIPTION: 198 - return pht( 199 - '%s updated an image\'s (%s) description.', 200 - $this->renderHandleLink($author_phid), 201 - $this->renderHandleLink(key($new))); 202 - break; 203 173 case self::TYPE_IMAGE_SEQUENCE: 204 174 return pht( 205 175 '%s updated an image\'s (%s) sequence.', ··· 220 190 221 191 $type = $this->getTransactionType(); 222 192 switch ($type) { 223 - case self::TYPE_STATUS: 224 - if ($new == PholioMock::STATUS_CLOSED) { 225 - return pht( 226 - '%s closed a mock %s.', 227 - $this->renderHandleLink($author_phid), 228 - $this->renderHandleLink($object_phid)); 229 - } else { 230 - return pht( 231 - '%s opened a mock %s.', 232 - $this->renderHandleLink($author_phid), 233 - $this->renderHandleLink($object_phid)); 234 - } 235 - break; 236 193 case self::TYPE_INLINE: 237 194 return pht( 238 195 '%s added an inline comment to %s.', ··· 243 200 case self::TYPE_IMAGE_FILE: 244 201 return pht( 245 202 '%s updated images of %s.', 246 - $this->renderHandleLink($author_phid), 247 - $this->renderHandleLink($object_phid)); 248 - break; 249 - case self::TYPE_IMAGE_DESCRIPTION: 250 - return pht( 251 - '%s updated image descriptions of %s.', 252 203 $this->renderHandleLink($author_phid), 253 204 $this->renderHandleLink($object_phid)); 254 205 break; ··· 268 219 $new = $this->getNewValue(); 269 220 270 221 switch ($this->getTransactionType()) { 271 - case self::TYPE_STATUS: 272 - if ($new == PholioMock::STATUS_CLOSED) { 273 - return PhabricatorTransactions::COLOR_INDIGO; 274 - } else { 275 - return PhabricatorTransactions::COLOR_GREEN; 276 - } 277 222 case self::TYPE_IMAGE_REPLACE: 278 223 return PhabricatorTransactions::COLOR_YELLOW; 279 224 case self::TYPE_IMAGE_FILE: ··· 291 236 return parent::getColor(); 292 237 } 293 238 294 - public function getNoEffectDescription() { 295 - switch ($this->getTransactionType()) { 296 - case self::TYPE_IMAGE_NAME: 297 - return pht('The image title was not updated.'); 298 - case self::TYPE_IMAGE_DESCRIPTION: 299 - return pht('The image description was not updated.'); 300 - case self::TYPE_IMAGE_SEQUENCE: 301 - return pht('The image sequence was not updated.'); 302 - } 303 - 304 - return parent::getNoEffectDescription(); 305 - } 306 239 }
+76
src/applications/pholio/xaction/PholioImageDescriptionTransaction.php
··· 1 + <?php 2 + 3 + final class PholioImageDescriptionTransaction 4 + extends PholioImageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'image-description'; 7 + 8 + public function generateOldValue($object) { 9 + $description = null; 10 + $phid = null; 11 + $image = $this->getImageForXaction($object); 12 + if ($image) { 13 + $description = $image->getDescription(); 14 + $phid = $image->getPHID(); 15 + } 16 + return array($phid => $description); 17 + } 18 + 19 + public function applyInternalEffects($object, $value) { 20 + $image = $this->getImageForXaction($object); 21 + $value = (string)head($this->getNewValue()); 22 + $image->setDescription($value); 23 + $image->save(); 24 + } 25 + 26 + public function getTitle() { 27 + $new = $this->getNewValue(); 28 + 29 + return pht( 30 + '%s updated an image\'s (%s) description.', 31 + $this->renderAuthor(), 32 + $this->renderHandle(head_key($new))); 33 + } 34 + 35 + public function getTitleForFeed() { 36 + return pht( 37 + '%s updated image descriptions of %s.', 38 + $this->renderAuthor(), 39 + $this->renderObject()); 40 + } 41 + 42 + public function mergeTransactions( 43 + $object, 44 + PhabricatorApplicationTransaction $u, 45 + PhabricatorApplicationTransaction $v) { 46 + 47 + $raw_new_value_u = $u->getNewValue(); 48 + $raw_new_value_v = $v->getNewValue(); 49 + $phid_u = head_key($raw_new_value_u); 50 + $phid_v = head_key($raw_new_value_v); 51 + if ($phid_u == $phid_v) { 52 + return $v; 53 + } 54 + 55 + return null; 56 + } 57 + 58 + public function shouldHide() { 59 + $old = $this->getOldValue(); 60 + return ($old === array(null => null)); 61 + } 62 + 63 + public function hasChangeDetailView() { 64 + return true; 65 + } 66 + 67 + public function newChangeDetailView() { 68 + $viewer = $this->getViewer(); 69 + 70 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 71 + ->setViewer($viewer) 72 + ->setOldText(head($this->getOldValue())) 73 + ->setNewText(head($this->getNewValue())); 74 + } 75 + 76 + }
-10
src/applications/pholio/xaction/PholioImageNameTransaction.php
··· 42 42 $this->renderObject()); 43 43 } 44 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 45 public function mergeTransactions( 56 46 $object, 57 47 PhabricatorApplicationTransaction $u,
+66
src/applications/pholio/xaction/PholioMockStatusTransaction.php
··· 1 + <?php 2 + 3 + final class PholioMockStatusTransaction 4 + extends PholioMockTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'status'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getStatus(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setStatus($value); 14 + } 15 + 16 + public function getTitle() { 17 + $new = $this->getNewValue(); 18 + 19 + if ($new == PholioMock::STATUS_CLOSED) { 20 + return pht( 21 + '%s closed this mock.', 22 + $this->renderAuthor()); 23 + } else { 24 + return pht( 25 + '%s opened this mock.', 26 + $this->renderAuthor()); 27 + } 28 + } 29 + 30 + public function getTitleForFeed() { 31 + $new = $this->getNewValue(); 32 + 33 + if ($new == PholioMock::STATUS_CLOSED) { 34 + return pht( 35 + '%s closed mock %s.', 36 + $this->renderAuthor(), 37 + $this->renderObject()); 38 + } else { 39 + return pht( 40 + '%s opened mock %s.', 41 + $this->renderAuthor(), 42 + $this->renderObject()); 43 + } 44 + } 45 + 46 + public function getIcon() { 47 + $new = $this->getNewValue(); 48 + 49 + if ($new == PholioMock::STATUS_CLOSED) { 50 + return 'fa-ban'; 51 + } else { 52 + return 'fa-check'; 53 + } 54 + } 55 + 56 + public function getColor() { 57 + $new = $this->getNewValue(); 58 + 59 + if ($new == PholioMock::STATUS_CLOSED) { 60 + return PhabricatorTransactions::COLOR_INDIGO; 61 + } else { 62 + return PhabricatorTransactions::COLOR_GREEN; 63 + } 64 + } 65 + 66 + }