From fcf64953f093945f098b727ba9d9ce3e3e29502b Mon Sep 17 00:00:00 2001 From: Austin McKinley Date: Wed, 10 May 2017 15:11:28 -0700 Subject: [PATCH] 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 --- src/__phutil_library_map__.php | 12 ++- .../controller/PholioMockEditController.php | 11 +-- .../pholio/editor/PholioMockEditor.php | 29 ------ ...PhabricatorPholioMockTestDataGenerator.php | 4 +- .../pholio/storage/PholioTransaction.php | 78 +-------------- .../xaction/PholioImageNameTransaction.php | 95 +++++++++++++++++++ .../xaction/PholioImageTransactionType.php | 18 ++++ ...p => PholioMockDescriptionTransaction.php} | 4 +- .../xaction/PholioMockNameTransaction.php | 88 +++++++++++++++++ .../xaction/PholioMockTransactionType.php | 4 + 10 files changed, 226 insertions(+), 117 deletions(-) create mode 100644 src/applications/pholio/xaction/PholioImageNameTransaction.php create mode 100644 src/applications/pholio/xaction/PholioImageTransactionType.php rename src/applications/pholio/xaction/{PholioDescriptionTransaction.php => PholioMockDescriptionTransaction.php} (92%) create mode 100644 src/applications/pholio/xaction/PholioMockNameTransaction.php create mode 100644 src/applications/pholio/xaction/PholioMockTransactionType.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 78994a0ce4..1c0bdca3db 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -4359,10 +4359,11 @@ phutil_register_library_map(array( 'PholioDAO' => 'applications/pholio/storage/PholioDAO.php', 'PholioDefaultEditCapability' => 'applications/pholio/capability/PholioDefaultEditCapability.php', 'PholioDefaultViewCapability' => 'applications/pholio/capability/PholioDefaultViewCapability.php', - 'PholioDescriptionTransaction' => 'applications/pholio/xaction/PholioDescriptionTransaction.php', 'PholioImage' => 'applications/pholio/storage/PholioImage.php', + 'PholioImageNameTransaction' => 'applications/pholio/xaction/PholioImageNameTransaction.php', 'PholioImagePHIDType' => 'applications/pholio/phid/PholioImagePHIDType.php', 'PholioImageQuery' => 'applications/pholio/query/PholioImageQuery.php', + 'PholioImageTransactionType' => 'applications/pholio/xaction/PholioImageTransactionType.php', 'PholioImageUploadController' => 'applications/pholio/controller/PholioImageUploadController.php', 'PholioInlineController' => 'applications/pholio/controller/PholioInlineController.php', 'PholioInlineListController' => 'applications/pholio/controller/PholioInlineListController.php', @@ -4371,6 +4372,7 @@ phutil_register_library_map(array( 'PholioMockAuthorHeraldField' => 'applications/pholio/herald/PholioMockAuthorHeraldField.php', 'PholioMockCommentController' => 'applications/pholio/controller/PholioMockCommentController.php', 'PholioMockDescriptionHeraldField' => 'applications/pholio/herald/PholioMockDescriptionHeraldField.php', + 'PholioMockDescriptionTransaction' => 'applications/pholio/xaction/PholioMockDescriptionTransaction.php', 'PholioMockEditController' => 'applications/pholio/controller/PholioMockEditController.php', 'PholioMockEditor' => 'applications/pholio/editor/PholioMockEditor.php', 'PholioMockEmbedView' => 'applications/pholio/view/PholioMockEmbedView.php', @@ -4383,12 +4385,14 @@ phutil_register_library_map(array( 'PholioMockListController' => 'applications/pholio/controller/PholioMockListController.php', 'PholioMockMailReceiver' => 'applications/pholio/mail/PholioMockMailReceiver.php', 'PholioMockNameHeraldField' => 'applications/pholio/herald/PholioMockNameHeraldField.php', + 'PholioMockNameTransaction' => 'applications/pholio/xaction/PholioMockNameTransaction.php', 'PholioMockPHIDType' => 'applications/pholio/phid/PholioMockPHIDType.php', 'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php', 'PholioMockRelationship' => 'applications/pholio/relationships/PholioMockRelationship.php', 'PholioMockRelationshipSource' => 'applications/search/relationship/PholioMockRelationshipSource.php', 'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php', 'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php', + 'PholioMockTransactionType' => 'applications/pholio/xaction/PholioMockTransactionType.php', 'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php', 'PholioRemarkupRule' => 'applications/pholio/remarkup/PholioRemarkupRule.php', 'PholioReplyHandler' => 'applications/pholio/mail/PholioReplyHandler.php', @@ -9896,14 +9900,15 @@ phutil_register_library_map(array( 'PholioDAO' => 'PhabricatorLiskDAO', 'PholioDefaultEditCapability' => 'PhabricatorPolicyCapability', 'PholioDefaultViewCapability' => 'PhabricatorPolicyCapability', - 'PholioDescriptionTransaction' => 'PholioTransactionType', 'PholioImage' => array( 'PholioDAO', 'PhabricatorMarkupInterface', 'PhabricatorPolicyInterface', ), + 'PholioImageNameTransaction' => 'PholioImageTransactionType', 'PholioImagePHIDType' => 'PhabricatorPHIDType', 'PholioImageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PholioImageTransactionType' => 'PholioTransactionType', 'PholioImageUploadController' => 'PholioController', 'PholioInlineController' => 'PholioController', 'PholioInlineListController' => 'PholioController', @@ -9925,6 +9930,7 @@ phutil_register_library_map(array( 'PholioMockAuthorHeraldField' => 'PholioMockHeraldField', 'PholioMockCommentController' => 'PholioController', 'PholioMockDescriptionHeraldField' => 'PholioMockHeraldField', + 'PholioMockDescriptionTransaction' => 'PholioMockTransactionType', 'PholioMockEditController' => 'PholioController', 'PholioMockEditor' => 'PhabricatorApplicationTransactionEditor', 'PholioMockEmbedView' => 'AphrontView', @@ -9937,12 +9943,14 @@ phutil_register_library_map(array( 'PholioMockListController' => 'PholioController', 'PholioMockMailReceiver' => 'PhabricatorObjectMailReceiver', 'PholioMockNameHeraldField' => 'PholioMockHeraldField', + 'PholioMockNameTransaction' => 'PholioMockTransactionType', 'PholioMockPHIDType' => 'PhabricatorPHIDType', 'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PholioMockRelationship' => 'PhabricatorObjectRelationship', 'PholioMockRelationshipSource' => 'PhabricatorObjectRelationshipSource', 'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PholioMockThumbGridView' => 'AphrontView', + 'PholioMockTransactionType' => 'PholioTransactionType', 'PholioMockViewController' => 'PholioController', 'PholioRemarkupRule' => 'PhabricatorObjectRemarkupRule', 'PholioReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', diff --git a/src/applications/pholio/controller/PholioMockEditController.php b/src/applications/pholio/controller/PholioMockEditController.php index 7a2a3ffbe6..42038cc2d3 100644 --- a/src/applications/pholio/controller/PholioMockEditController.php +++ b/src/applications/pholio/controller/PholioMockEditController.php @@ -65,8 +65,8 @@ final class PholioMockEditController extends PholioController { if ($request->isFormPost()) { $xactions = array(); - $type_name = PholioTransaction::TYPE_NAME; - $type_desc = PholioDescriptionTransaction::TRANSACTIONTYPE; + $type_name = PholioMockNameTransaction::TRANSACTIONTYPE; + $type_desc = PholioMockDescriptionTransaction::TRANSACTIONTYPE; $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; $type_cc = PhabricatorTransactions::TYPE_SUBSCRIBERS; @@ -88,11 +88,6 @@ final class PholioMockEditController extends PholioController { $mock_xactions[$type_cc] = array('=' => $v_cc); $mock_xactions[$type_space] = $v_space; - if (!strlen($request->getStr('name'))) { - $e_name = pht('Required'); - $errors[] = pht('You must give the mock a name.'); - } - $file_phids = $request->getArr('file_phids'); if ($file_phids) { $files = id(new PhabricatorFileQuery()) @@ -173,7 +168,7 @@ final class PholioMockEditController extends PholioController { $posted_mock_images[] = $add_image; } else { $xactions[] = id(new PholioTransaction()) - ->setTransactionType(PholioTransaction::TYPE_IMAGE_NAME) + ->setTransactionType(PholioImageNameTransaction::TRANSACTIONTYPE) ->setNewValue( array($existing_image->getPHID() => $title)); $xactions[] = id(new PholioTransaction()) diff --git a/src/applications/pholio/editor/PholioMockEditor.php b/src/applications/pholio/editor/PholioMockEditor.php index c80d8439ef..7910830b92 100644 --- a/src/applications/pholio/editor/PholioMockEditor.php +++ b/src/applications/pholio/editor/PholioMockEditor.php @@ -29,12 +29,10 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; - $types[] = PholioTransaction::TYPE_NAME; $types[] = PholioTransaction::TYPE_STATUS; $types[] = PholioTransaction::TYPE_INLINE; $types[] = PholioTransaction::TYPE_IMAGE_FILE; - $types[] = PholioTransaction::TYPE_IMAGE_NAME; $types[] = PholioTransaction::TYPE_IMAGE_DESCRIPTION; $types[] = PholioTransaction::TYPE_IMAGE_REPLACE; $types[] = PholioTransaction::TYPE_IMAGE_SEQUENCE; @@ -47,22 +45,11 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { PhabricatorApplicationTransaction $xaction) { switch ($xaction->getTransactionType()) { - case PholioTransaction::TYPE_NAME: - return $object->getName(); case PholioTransaction::TYPE_STATUS: return $object->getStatus(); case PholioTransaction::TYPE_IMAGE_FILE: $images = $object->getImages(); return mpull($images, 'getPHID'); - case PholioTransaction::TYPE_IMAGE_NAME: - $name = null; - $phid = null; - $image = $this->getImageForXaction($object, $xaction); - if ($image) { - $name = $image->getName(); - $phid = $image->getPHID(); - } - return array($phid => $name); case PholioTransaction::TYPE_IMAGE_DESCRIPTION: $description = null; $phid = null; @@ -92,9 +79,7 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { PhabricatorApplicationTransaction $xaction) { switch ($xaction->getTransactionType()) { - case PholioTransaction::TYPE_NAME: case PholioTransaction::TYPE_STATUS: - case PholioTransaction::TYPE_IMAGE_NAME: case PholioTransaction::TYPE_IMAGE_DESCRIPTION: case PholioTransaction::TYPE_IMAGE_SEQUENCE: return $xaction->getNewValue(); @@ -205,12 +190,6 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { PhabricatorApplicationTransaction $xaction) { switch ($xaction->getTransactionType()) { - case PholioTransaction::TYPE_NAME: - $object->setName($xaction->getNewValue()); - if ($object->getOriginalName() === null) { - $object->setOriginalName($xaction->getNewValue()); - } - break; case PholioTransaction::TYPE_STATUS: $object->setStatus($xaction->getNewValue()); break; @@ -263,12 +242,6 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { } $object->attachImages($images); break; - case PholioTransaction::TYPE_IMAGE_NAME: - $image = $this->getImageForXaction($object, $xaction); - $value = (string)head($xaction->getNewValue()); - $image->setName($value); - $image->save(); - break; case PholioTransaction::TYPE_IMAGE_DESCRIPTION: $image = $this->getImageForXaction($object, $xaction); $value = (string)head($xaction->getNewValue()); @@ -303,7 +276,6 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { $type = $u->getTransactionType(); switch ($type) { - case PholioTransaction::TYPE_NAME: case PholioTransaction::TYPE_STATUS: return $v; case PholioTransaction::TYPE_IMAGE_REPLACE: @@ -315,7 +287,6 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor { break; case PholioTransaction::TYPE_IMAGE_FILE: return $this->mergePHIDOrEdgeTransactions($u, $v); - case PholioTransaction::TYPE_IMAGE_NAME: case PholioTransaction::TYPE_IMAGE_DESCRIPTION: case PholioTransaction::TYPE_IMAGE_SEQUENCE: $raw_new_value_u = $u->getNewValue(); diff --git a/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php b/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php index 00999deafc..039b0ddeef 100644 --- a/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php +++ b/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php @@ -22,9 +22,9 @@ final class PhabricatorPholioMockTestDataGenerator // Accumulate Transactions $changes = array(); - $changes[PholioTransaction::TYPE_NAME] = + $changes[PholioMockNameTransaction::TRANSACTIONTYPE] = $this->generateTitle(); - $changes[PholioDescriptionTransaction::TRANSACTIONTYPE] = + $changes[PholioMockDescriptionTransaction::TRANSACTIONTYPE] = $this->generateDescription(); $changes[PhabricatorTransactions::TYPE_VIEW_POLICY] = PhabricatorPolicies::POLICY_PUBLIC; diff --git a/src/applications/pholio/storage/PholioTransaction.php b/src/applications/pholio/storage/PholioTransaction.php index 0d2a76e2bf..85688b84d2 100644 --- a/src/applications/pholio/storage/PholioTransaction.php +++ b/src/applications/pholio/storage/PholioTransaction.php @@ -3,12 +3,10 @@ final class PholioTransaction extends PhabricatorModularTransaction { // Edits to the high level mock - const TYPE_NAME = 'name'; const TYPE_STATUS = 'status'; // Edits to images within the mock const TYPE_IMAGE_FILE = 'image-file'; - const TYPE_IMAGE_NAME= 'image-name'; const TYPE_IMAGE_DESCRIPTION = 'image-description'; const TYPE_IMAGE_REPLACE = 'image-replace'; const TYPE_IMAGE_SEQUENCE = 'image-sequence'; @@ -57,7 +55,7 @@ final class PholioTransaction extends PhabricatorModularTransaction { $phids[] = $old; break; case self::TYPE_IMAGE_DESCRIPTION: - case self::TYPE_IMAGE_NAME: + case PholioImageNameTransaction::TRANSACTIONTYPE: case self::TYPE_IMAGE_SEQUENCE: $phids[] = key($new); break; @@ -70,7 +68,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { $old = $this->getOldValue(); switch ($this->getTransactionType()) { - case self::TYPE_IMAGE_NAME: case self::TYPE_IMAGE_DESCRIPTION: return ($old === array(null => null)); // this is boring / silly to surface; changing sequence is NBD @@ -89,14 +86,12 @@ final class PholioTransaction extends PhabricatorModularTransaction { switch ($this->getTransactionType()) { case self::TYPE_INLINE: return 'fa-comment'; - case self::TYPE_NAME: case self::TYPE_STATUS: if ($new == PholioMock::STATUS_CLOSED) { return 'fa-ban'; } else { return 'fa-check'; } - case self::TYPE_IMAGE_NAME: case self::TYPE_IMAGE_DESCRIPTION: case self::TYPE_IMAGE_SEQUENCE: return 'fa-pencil'; @@ -118,9 +113,9 @@ final class PholioTransaction extends PhabricatorModularTransaction { case self::TYPE_STATUS: $tags[] = self::MAILTAG_STATUS; break; - case self::TYPE_NAME: - case PholioDescriptionTransaction::TRANSACTIONTYPE: - case self::TYPE_IMAGE_NAME: + case PholioMockNameTransaction::TRANSACTIONTYPE: + case PholioMockDescriptionTransaction::TRANSACTIONTYPE: + case PholioImageNameTransaction::TRANSACTIONTYPE: case self::TYPE_IMAGE_DESCRIPTION: case self::TYPE_IMAGE_SEQUENCE: case self::TYPE_IMAGE_FILE: @@ -142,20 +137,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { $type = $this->getTransactionType(); switch ($type) { - case self::TYPE_NAME: - if ($old === null) { - return pht( - '%s created "%s".', - $this->renderHandleLink($author_phid), - $new); - } else { - return pht( - '%s renamed this mock from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $old, - $new); - } - break; case self::TYPE_STATUS: if ($new == PholioMock::STATUS_CLOSED) { return pht( @@ -213,15 +194,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { $this->renderHandleList($rem)); } break; - - case self::TYPE_IMAGE_NAME: - return pht( - '%s renamed an image (%s) from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $this->renderHandleLink(key($new)), - reset($old), - reset($new)); - break; case self::TYPE_IMAGE_DESCRIPTION: return pht( '%s updated an image\'s (%s) description.', @@ -248,21 +220,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { $type = $this->getTransactionType(); switch ($type) { - case self::TYPE_NAME: - if ($old === null) { - return pht( - '%s created %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - } else { - return pht( - '%s renamed %s from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid), - $old, - $new); - } - break; case self::TYPE_STATUS: if ($new == PholioMock::STATUS_CLOSED) { return pht( @@ -289,12 +246,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { $this->renderHandleLink($author_phid), $this->renderHandleLink($object_phid)); break; - case self::TYPE_IMAGE_NAME: - return pht( - '%s updated the image names of %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - break; case self::TYPE_IMAGE_DESCRIPTION: return pht( '%s updated image descriptions of %s.', @@ -312,23 +263,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { return parent::getTitleForFeed(); } - public function getRemarkupBodyForFeed(PhabricatorFeedStory $story) { - $text = null; - switch ($this->getTransactionType()) { - case self::TYPE_NAME: - if ($this->getOldValue() === null) { - $mock = $story->getPrimaryObject(); - $text = $mock->getDescription(); - } - break; - case self::TYPE_INLINE: - $text = $this->getComment()->getContent(); - break; - } - - return $text; - } - public function getColor() { $old = $this->getOldValue(); $new = $this->getNewValue(); @@ -340,10 +274,6 @@ final class PholioTransaction extends PhabricatorModularTransaction { } else { return PhabricatorTransactions::COLOR_GREEN; } - case self::TYPE_NAME: - if ($old === null) { - return PhabricatorTransactions::COLOR_GREEN; - } case self::TYPE_IMAGE_REPLACE: return PhabricatorTransactions::COLOR_YELLOW; case self::TYPE_IMAGE_FILE: diff --git a/src/applications/pholio/xaction/PholioImageNameTransaction.php b/src/applications/pholio/xaction/PholioImageNameTransaction.php new file mode 100644 index 0000000000..b888b1244b --- /dev/null +++ b/src/applications/pholio/xaction/PholioImageNameTransaction.php @@ -0,0 +1,95 @@ +getImageForXaction($object); + if ($image) { + $name = $image->getName(); + $phid = $image->getPHID(); + } + return array($phid => $name); + } + + public function applyInternalEffects($object, $value) { + $image = $this->getImageForXaction($object); + $value = (string)head($this->getNewValue()); + $image->setName($value); + $image->save(); + } + + public function getTitle() { + $old = $this->getOldValue(); + $new = $this->getNewValue(); + + return pht( + '%s renamed an image (%s) from %s to %s.', + $this->renderAuthor(), + $this->renderHandle(key($new)), + $this->renderValue($old), + $this->renderValue($new)); + } + + public function getTitleForFeed() { + return pht( + '%s updated the image names of %s.', + $this->renderAuthor(), + $this->renderObject()); + } + + public function getIcon() { + $new = $this->getNewValue(); + + if ($new == PholioMock::STATUS_CLOSED) { + return 'fa-ban'; + } else { + return 'fa-check'; + } + } + + public function mergeTransactions( + $object, + PhabricatorApplicationTransaction $u, + PhabricatorApplicationTransaction $v) { + + $raw_new_value_u = $u->getNewValue(); + $raw_new_value_v = $v->getNewValue(); + $phid_u = head_key($raw_new_value_u); + $phid_v = head_key($raw_new_value_v); + if ($phid_u == $phid_v) { + return $v; + } + + return null; + } + + public function shouldHide() { + $old = $this->getOldValue(); + return ($old === array(null => null)); + } + + public function validateTransactions($object, array $xactions) { + $errors = array(); + + $max_length = $object->getColumnMaximumByteLength('name'); + foreach ($xactions as $xaction) { + $new_value = head(array_values($xaction->getNewValue())); + $new_length = strlen($new_value); + if ($new_length > $max_length) { + $errors[] = $this->newInvalidError( + pht( + 'Mock image names must not be longer than %s character(s).', + new PhutilNumber($max_length))); + } + } + + return $errors; + } + + +} diff --git a/src/applications/pholio/xaction/PholioImageTransactionType.php b/src/applications/pholio/xaction/PholioImageTransactionType.php new file mode 100644 index 0000000000..3e576776aa --- /dev/null +++ b/src/applications/pholio/xaction/PholioImageTransactionType.php @@ -0,0 +1,18 @@ +getNewValue(); + $image_phid = head_key($raw_new_value); + $images = $mock->getImages(); + foreach ($images as $image) { + if ($image->getPHID() == $image_phid) { + return $image; + } + } + return null; + } + +} diff --git a/src/applications/pholio/xaction/PholioDescriptionTransaction.php b/src/applications/pholio/xaction/PholioMockDescriptionTransaction.php similarity index 92% rename from src/applications/pholio/xaction/PholioDescriptionTransaction.php rename to src/applications/pholio/xaction/PholioMockDescriptionTransaction.php index 077f26222a..ed14d43c99 100644 --- a/src/applications/pholio/xaction/PholioDescriptionTransaction.php +++ b/src/applications/pholio/xaction/PholioMockDescriptionTransaction.php @@ -1,7 +1,7 @@ getName(); + } + + public function applyInternalEffects($object, $value) { + $object->setName($value); + if ($object->getOriginalName() === null) { + $object->setOriginalName($this->getNewValue()); + } + } + + public function getTitle() { + $old = $this->getOldValue(); + $new = $this->getNewValue(); + + if ($old === null) { + return pht( + '%s created %s.', + $this->renderAuthor(), + $this->renderValue($new)); + } else { + return pht( + '%s renamed this mock from %s to %s.', + $this->renderAuthor(), + $this->renderValue($old), + $this->renderValue($new)); + } + } + + public function getTitleForFeed() { + $old = $this->getOldValue(); + $new = $this->getNewValue(); + + if ($old === null) { + return pht( + '%s created %s.', + $this->renderAuthor(), + $this->renderObject()); + } else { + return pht( + '%s renamed %s from %s to %s.', + $this->renderAuthor(), + $this->renderObject(), + $this->renderValue($old), + $this->renderValue($new)); + } + } + + public function getColor() { + $old = $this->getOldValue(); + + if ($old === null) { + return PhabricatorTransactions::COLOR_GREEN; + } + + return parent::getColor(); + } + + public function validateTransactions($object, array $xactions) { + $errors = array(); + + if ($this->isEmptyTextTransaction($object->getName(), $xactions)) { + $errors[] = $this->newRequiredError(pht('Mocks must have a name.')); + } + + $max_length = $object->getColumnMaximumByteLength('name'); + foreach ($xactions as $xaction) { + $new_value = $xaction->getNewValue(); + $new_length = strlen($new_value); + if ($new_length > $max_length) { + $errors[] = $this->newInvalidError( + pht( + 'Mock names must not be longer than %s character(s).', + new PhutilNumber($max_length))); + } + } + + return $errors; + } + +} diff --git a/src/applications/pholio/xaction/PholioMockTransactionType.php b/src/applications/pholio/xaction/PholioMockTransactionType.php new file mode 100644 index 0000000000..7993412304 --- /dev/null +++ b/src/applications/pholio/xaction/PholioMockTransactionType.php @@ -0,0 +1,4 @@ +