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

Modular Transactions for Badges

Summary: Ref T12270. This converts Badges to modular transactions for editing and awarding.

Test Plan: Add Badge, edit badge, award and revoke... Still going to test this some more but feel free to comment on anything obviously wrong?

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T12270

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

+488 -438
+19 -1
src/__phutil_library_map__.php
··· 2012 2012 'PhabricatorBadgesAwardController' => 'applications/badges/controller/PhabricatorBadgesAwardController.php', 2013 2013 'PhabricatorBadgesAwardQuery' => 'applications/badges/query/PhabricatorBadgesAwardQuery.php', 2014 2014 'PhabricatorBadgesBadge' => 'applications/badges/storage/PhabricatorBadgesBadge.php', 2015 + 'PhabricatorBadgesBadgeAwardTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php', 2016 + 'PhabricatorBadgesBadgeDescriptionTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php', 2017 + 'PhabricatorBadgesBadgeFlavorTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php', 2018 + 'PhabricatorBadgesBadgeIconTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php', 2015 2019 'PhabricatorBadgesBadgeNameNgrams' => 'applications/badges/storage/PhabricatorBadgesBadgeNameNgrams.php', 2020 + 'PhabricatorBadgesBadgeNameTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php', 2021 + 'PhabricatorBadgesBadgeQualityTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php', 2022 + 'PhabricatorBadgesBadgeRevokeTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php', 2023 + 'PhabricatorBadgesBadgeStatusTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php', 2024 + 'PhabricatorBadgesBadgeTransactionType' => 'applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php', 2016 2025 'PhabricatorBadgesCommentController' => 'applications/badges/controller/PhabricatorBadgesCommentController.php', 2017 2026 'PhabricatorBadgesController' => 'applications/badges/controller/PhabricatorBadgesController.php', 2018 2027 'PhabricatorBadgesCreateCapability' => 'applications/badges/capability/PhabricatorBadgesCreateCapability.php', ··· 6954 6963 'PhabricatorConduitResultInterface', 6955 6964 'PhabricatorNgramsInterface', 6956 6965 ), 6966 + 'PhabricatorBadgesBadgeAwardTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6967 + 'PhabricatorBadgesBadgeDescriptionTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6968 + 'PhabricatorBadgesBadgeFlavorTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6969 + 'PhabricatorBadgesBadgeIconTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6957 6970 'PhabricatorBadgesBadgeNameNgrams' => 'PhabricatorSearchNgrams', 6971 + 'PhabricatorBadgesBadgeNameTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6972 + 'PhabricatorBadgesBadgeQualityTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6973 + 'PhabricatorBadgesBadgeRevokeTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6974 + 'PhabricatorBadgesBadgeStatusTransaction' => 'PhabricatorBadgesBadgeTransactionType', 6975 + 'PhabricatorBadgesBadgeTransactionType' => 'PhabricatorModularTransactionType', 6958 6976 'PhabricatorBadgesCommentController' => 'PhabricatorBadgesController', 6959 6977 'PhabricatorBadgesController' => 'PhabricatorController', 6960 6978 'PhabricatorBadgesCreateCapability' => 'PhabricatorPolicyCapability', ··· 6980 6998 'PhabricatorBadgesSchemaSpec' => 'PhabricatorConfigSchemaSpec', 6981 6999 'PhabricatorBadgesSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 6982 7000 'PhabricatorBadgesSearchEngine' => 'PhabricatorApplicationSearchEngine', 6983 - 'PhabricatorBadgesTransaction' => 'PhabricatorApplicationTransaction', 7001 + 'PhabricatorBadgesTransaction' => 'PhabricatorModularTransaction', 6984 7002 'PhabricatorBadgesTransactionComment' => 'PhabricatorApplicationTransactionComment', 6985 7003 'PhabricatorBadgesTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6986 7004 'PhabricatorBadgesViewController' => 'PhabricatorBadgesProfileController',
+2 -1
src/applications/badges/controller/PhabricatorBadgesArchiveController.php
··· 32 32 $xactions = array(); 33 33 34 34 $xactions[] = id(new PhabricatorBadgesTransaction()) 35 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_STATUS) 35 + ->setTransactionType( 36 + PhabricatorBadgesBadgeStatusTransaction::TRANSACTIONTYPE) 36 37 ->setNewValue($new_status); 37 38 38 39 id(new PhabricatorBadgesEditor())
+2 -1
src/applications/badges/controller/PhabricatorBadgesAwardController.php
··· 37 37 foreach ($badges as $badge) { 38 38 $xactions = array(); 39 39 $xactions[] = id(new PhabricatorBadgesTransaction()) 40 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_AWARD) 40 + ->setTransactionType( 41 + PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE) 41 42 ->setNewValue($award_phids); 42 43 43 44 $editor = id(new PhabricatorBadgesEditor())
+2 -1
src/applications/badges/controller/PhabricatorBadgesEditRecipientsController.php
··· 37 37 } 38 38 39 39 $xactions[] = id(new PhabricatorBadgesTransaction()) 40 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_AWARD) 40 + ->setTransactionType( 41 + PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE) 41 42 ->setNewValue($award_phids); 42 43 43 44 $editor = id(new PhabricatorBadgesEditor())
+2 -1
src/applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php
··· 34 34 if ($request->isFormPost()) { 35 35 $xactions = array(); 36 36 $xactions[] = id(new PhabricatorBadgesTransaction()) 37 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_REVOKE) 37 + ->setTransactionType( 38 + PhabricatorBadgesBadgeRevokeTransaction::TRANSACTIONTYPE) 38 39 ->setNewValue(array($remove_phid)); 39 40 40 41 $editor = id(new PhabricatorBadgesEditor())
+12 -6
src/applications/badges/editor/PhabricatorBadgesEditEngine.php
··· 86 86 ->setLabel(pht('Name')) 87 87 ->setDescription(pht('Badge name.')) 88 88 ->setConduitTypeDescription(pht('New badge name.')) 89 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_NAME) 90 - ->setValue($object->getName()), 89 + ->setTransactionType( 90 + PhabricatorBadgesBadgeNameTransaction::TRANSACTIONTYPE) 91 + ->setValue($object->getName()) 92 + ->setIsRequired(true), 91 93 id(new PhabricatorTextEditField()) 92 94 ->setKey('flavor') 93 95 ->setLabel(pht('Flavor text')) 94 96 ->setDescription(pht('Short description of the badge.')) 95 97 ->setConduitTypeDescription(pht('New badge flavor.')) 96 98 ->setValue($object->getFlavor()) 97 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_FLAVOR), 99 + ->setTransactionType( 100 + PhabricatorBadgesBadgeFlavorTransaction::TRANSACTIONTYPE), 98 101 id(new PhabricatorIconSetEditField()) 99 102 ->setKey('icon') 100 103 ->setLabel(pht('Icon')) 101 104 ->setIconSet(new PhabricatorBadgesIconSet()) 102 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_ICON) 105 + ->setTransactionType( 106 + PhabricatorBadgesBadgeIconTransaction::TRANSACTIONTYPE) 103 107 ->setConduitDescription(pht('Change the badge icon.')) 104 108 ->setConduitTypeDescription(pht('New badge icon.')) 105 109 ->setValue($object->getIcon()), ··· 109 113 ->setDescription(pht('Color and rarity of the badge.')) 110 114 ->setConduitTypeDescription(pht('New badge quality.')) 111 115 ->setValue($object->getQuality()) 112 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_QUALITY) 116 + ->setTransactionType( 117 + PhabricatorBadgesBadgeQualityTransaction::TRANSACTIONTYPE) 113 118 ->setOptions(PhabricatorBadgesQuality::getDropdownQualityMap()), 114 119 id(new PhabricatorRemarkupEditField()) 115 120 ->setKey('description') 116 121 ->setLabel(pht('Description')) 117 122 ->setDescription(pht('Badge long description.')) 118 123 ->setConduitTypeDescription(pht('New badge description.')) 119 - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_DESCRIPTION) 124 + ->setTransactionType( 125 + PhabricatorBadgesBadgeDescriptionTransaction::TRANSACTIONTYPE) 120 126 ->setValue($object->getDescription()), 121 127 ); 122 128 }
+8 -163
src/applications/badges/editor/PhabricatorBadgesEditor.php
··· 11 11 return pht('Badges'); 12 12 } 13 13 14 + public function getCreateObjectTitle($author, $object) { 15 + return pht('%s created this badge.', $author); 16 + } 17 + 18 + public function getCreateObjectTitleForFeed($author, $object) { 19 + return pht('%s created %s.', $author, $object); 20 + } 21 + 14 22 protected function supportsSearch() { 15 23 return true; 16 24 } 17 25 18 26 public function getTransactionTypes() { 19 27 $types = parent::getTransactionTypes(); 20 - 21 - $types[] = PhabricatorBadgesTransaction::TYPE_NAME; 22 - $types[] = PhabricatorBadgesTransaction::TYPE_FLAVOR; 23 - $types[] = PhabricatorBadgesTransaction::TYPE_DESCRIPTION; 24 - $types[] = PhabricatorBadgesTransaction::TYPE_ICON; 25 - $types[] = PhabricatorBadgesTransaction::TYPE_STATUS; 26 - $types[] = PhabricatorBadgesTransaction::TYPE_QUALITY; 27 - $types[] = PhabricatorBadgesTransaction::TYPE_AWARD; 28 - $types[] = PhabricatorBadgesTransaction::TYPE_REVOKE; 29 - 30 28 $types[] = PhabricatorTransactions::TYPE_COMMENT; 31 29 $types[] = PhabricatorTransactions::TYPE_EDGE; 32 30 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 33 31 34 32 return $types; 35 - } 36 - 37 - protected function getCustomTransactionOldValue( 38 - PhabricatorLiskDAO $object, 39 - PhabricatorApplicationTransaction $xaction) { 40 - switch ($xaction->getTransactionType()) { 41 - case PhabricatorBadgesTransaction::TYPE_NAME: 42 - return $object->getName(); 43 - case PhabricatorBadgesTransaction::TYPE_FLAVOR: 44 - return $object->getFlavor(); 45 - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: 46 - return $object->getDescription(); 47 - case PhabricatorBadgesTransaction::TYPE_ICON: 48 - return $object->getIcon(); 49 - case PhabricatorBadgesTransaction::TYPE_QUALITY: 50 - return (int)$object->getQuality(); 51 - case PhabricatorBadgesTransaction::TYPE_STATUS: 52 - return $object->getStatus(); 53 - case PhabricatorBadgesTransaction::TYPE_AWARD: 54 - $award_phids = mpull($object->getAwards(), 'getRecipientPHID'); 55 - return $award_phids; 56 - case PhabricatorBadgesTransaction::TYPE_REVOKE: 57 - return null; 58 - } 59 - 60 - return parent::getCustomTransactionOldValue($object, $xaction); 61 - } 62 - 63 - protected function getCustomTransactionNewValue( 64 - PhabricatorLiskDAO $object, 65 - PhabricatorApplicationTransaction $xaction) { 66 - 67 - switch ($xaction->getTransactionType()) { 68 - case PhabricatorBadgesTransaction::TYPE_NAME: 69 - case PhabricatorBadgesTransaction::TYPE_FLAVOR: 70 - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: 71 - case PhabricatorBadgesTransaction::TYPE_ICON: 72 - case PhabricatorBadgesTransaction::TYPE_STATUS: 73 - case PhabricatorBadgesTransaction::TYPE_AWARD: 74 - case PhabricatorBadgesTransaction::TYPE_REVOKE: 75 - return $xaction->getNewValue(); 76 - case PhabricatorBadgesTransaction::TYPE_QUALITY: 77 - return (int)$xaction->getNewValue(); 78 - } 79 - 80 - return parent::getCustomTransactionNewValue($object, $xaction); 81 - } 82 - 83 - protected function applyCustomInternalTransaction( 84 - PhabricatorLiskDAO $object, 85 - PhabricatorApplicationTransaction $xaction) { 86 - 87 - $type = $xaction->getTransactionType(); 88 - switch ($type) { 89 - case PhabricatorBadgesTransaction::TYPE_NAME: 90 - $object->setName($xaction->getNewValue()); 91 - return; 92 - case PhabricatorBadgesTransaction::TYPE_FLAVOR: 93 - $object->setFlavor($xaction->getNewValue()); 94 - return; 95 - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: 96 - $object->setDescription($xaction->getNewValue()); 97 - return; 98 - case PhabricatorBadgesTransaction::TYPE_ICON: 99 - $object->setIcon($xaction->getNewValue()); 100 - return; 101 - case PhabricatorBadgesTransaction::TYPE_QUALITY: 102 - $object->setQuality($xaction->getNewValue()); 103 - return; 104 - case PhabricatorBadgesTransaction::TYPE_STATUS: 105 - $object->setStatus($xaction->getNewValue()); 106 - return; 107 - case PhabricatorBadgesTransaction::TYPE_AWARD: 108 - case PhabricatorBadgesTransaction::TYPE_REVOKE: 109 - return; 110 - } 111 - 112 - return parent::applyCustomInternalTransaction($object, $xaction); 113 - } 114 - 115 - protected function applyCustomExternalTransaction( 116 - PhabricatorLiskDAO $object, 117 - PhabricatorApplicationTransaction $xaction) { 118 - 119 - $type = $xaction->getTransactionType(); 120 - switch ($type) { 121 - case PhabricatorBadgesTransaction::TYPE_NAME: 122 - case PhabricatorBadgesTransaction::TYPE_FLAVOR: 123 - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: 124 - case PhabricatorBadgesTransaction::TYPE_ICON: 125 - case PhabricatorBadgesTransaction::TYPE_STATUS: 126 - case PhabricatorBadgesTransaction::TYPE_QUALITY: 127 - return; 128 - case PhabricatorBadgesTransaction::TYPE_REVOKE: 129 - $revoked_recipient_phids = $xaction->getNewValue(); 130 - $awards = $object->getAwards(); 131 - $awards = mpull($awards, null, 'getRecipientPHID'); 132 - 133 - foreach ($revoked_recipient_phids as $phid) { 134 - $awards[$phid]->delete(); 135 - } 136 - $object->attachAwards($awards); 137 - return; 138 - case PhabricatorBadgesTransaction::TYPE_AWARD: 139 - $recipient_phids = $xaction->getNewValue(); 140 - $awards = $object->getAwards(); 141 - $awards = mpull($awards, null, 'getRecipientPHID'); 142 - 143 - foreach ($recipient_phids as $phid) { 144 - $award = idx($awards, $phid); 145 - if (!$award) { 146 - $award = PhabricatorBadgesAward::initializeNewBadgesAward( 147 - $this->getActor(), 148 - $object, 149 - $phid); 150 - $award->save(); 151 - $awards[] = $award; 152 - } 153 - } 154 - $object->attachAwards($awards); 155 - return; 156 - } 157 - 158 - return parent::applyCustomExternalTransaction($object, $xaction); 159 - } 160 - 161 - protected function validateTransaction( 162 - PhabricatorLiskDAO $object, 163 - $type, 164 - array $xactions) { 165 - 166 - $errors = parent::validateTransaction($object, $type, $xactions); 167 - 168 - switch ($type) { 169 - case PhabricatorBadgesTransaction::TYPE_NAME: 170 - $missing = $this->validateIsEmptyTextField( 171 - $object->getName(), 172 - $xactions); 173 - 174 - if ($missing) { 175 - $error = new PhabricatorApplicationTransactionValidationError( 176 - $type, 177 - pht('Required'), 178 - pht('Badge name is required.'), 179 - nonempty(last($xactions), null)); 180 - 181 - $error->setIsMissingFieldError(true); 182 - $errors[] = $error; 183 - } 184 - break; 185 - } 186 - 187 - return $errors; 188 33 } 189 34 190 35 protected function shouldSendMail(
+11 -264
src/applications/badges/storage/PhabricatorBadgesTransaction.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorBadgesTransaction 4 - extends PhabricatorApplicationTransaction { 5 - 6 - const TYPE_NAME = 'badges:name'; 7 - const TYPE_DESCRIPTION = 'badges:description'; 8 - const TYPE_QUALITY = 'badges:quality'; 9 - const TYPE_ICON = 'badges:icon'; 10 - const TYPE_STATUS = 'badges:status'; 11 - const TYPE_FLAVOR = 'badges:flavor'; 12 - const TYPE_AWARD = 'badges:award'; 13 - const TYPE_REVOKE = 'badges:revoke'; 4 + extends PhabricatorModularTransaction { 14 5 15 6 const MAILTAG_DETAILS = 'badges:details'; 16 7 const MAILTAG_COMMENT = 'badges:comment'; ··· 28 19 return new PhabricatorBadgesTransactionComment(); 29 20 } 30 21 31 - 32 - public function getTitle() { 33 - $author_phid = $this->getAuthorPHID(); 34 - $object_phid = $this->getObjectPHID(); 35 - 36 - $old = $this->getOldValue(); 37 - $new = $this->getNewValue(); 38 - 39 - $type = $this->getTransactionType(); 40 - switch ($type) { 41 - case PhabricatorTransactions::TYPE_CREATE: 42 - return pht( 43 - '%s created this badge.', 44 - $this->renderHandleLink($author_phid)); 45 - case self::TYPE_NAME: 46 - if ($old === null) { 47 - return pht( 48 - '%s created this badge.', 49 - $this->renderHandleLink($author_phid)); 50 - } else { 51 - return pht( 52 - '%s renamed this badge from "%s" to "%s".', 53 - $this->renderHandleLink($author_phid), 54 - $old, 55 - $new); 56 - } 57 - break; 58 - case self::TYPE_FLAVOR: 59 - if ($old === null) { 60 - return pht( 61 - '%s set the flavor text for this badge.', 62 - $this->renderHandleLink($author_phid)); 63 - } else { 64 - return pht( 65 - '%s updated the flavor text for this badge.', 66 - $this->renderHandleLink($author_phid)); 67 - } 68 - break; 69 - case self::TYPE_DESCRIPTION: 70 - if ($old === null) { 71 - return pht( 72 - '%s set the description for this badge.', 73 - $this->renderHandleLink($author_phid)); 74 - } else { 75 - return pht( 76 - '%s updated the description for this badge.', 77 - $this->renderHandleLink($author_phid)); 78 - } 79 - break; 80 - case self::TYPE_STATUS: 81 - switch ($new) { 82 - case PhabricatorBadgesBadge::STATUS_ACTIVE: 83 - return pht( 84 - '%s activated this badge.', 85 - $this->renderHandleLink($author_phid)); 86 - case PhabricatorBadgesBadge::STATUS_ARCHIVED: 87 - return pht( 88 - '%s archived this badge.', 89 - $this->renderHandleLink($author_phid)); 90 - } 91 - break; 92 - case self::TYPE_ICON: 93 - if ($old === null) { 94 - return pht( 95 - '%s set the icon for this badge as "%s".', 96 - $this->renderHandleLink($author_phid), 97 - $new); 98 - } else { 99 - $set = new PhabricatorBadgesIconSet(); 100 - 101 - $icon_old = $set->getIconLabel($old); 102 - $icon_new = $set->getIconLabel($new); 103 - 104 - return pht( 105 - '%s updated the icon for this badge from "%s" to "%s".', 106 - $this->renderHandleLink($author_phid), 107 - $icon_old, 108 - $icon_new); 109 - } 110 - break; 111 - case self::TYPE_QUALITY: 112 - $qual_new = PhabricatorBadgesQuality::getQualityName($new); 113 - $qual_old = PhabricatorBadgesQuality::getQualityName($old); 114 - if ($old === null) { 115 - return pht( 116 - '%s set the quality for this badge as "%s".', 117 - $this->renderHandleLink($author_phid), 118 - $qual_new); 119 - } else { 120 - return pht( 121 - '%s updated the quality for this badge from "%s" to "%s".', 122 - $this->renderHandleLink($author_phid), 123 - $qual_old, 124 - $qual_new); 125 - } 126 - break; 127 - case self::TYPE_AWARD: 128 - if (!is_array($new)) { 129 - $new = array(); 130 - } 131 - $handles = $this->renderHandleList($new); 132 - return pht( 133 - '%s awarded this badge to %s recipient(s): %s.', 134 - $this->renderHandleLink($author_phid), 135 - new PhutilNumber(count($new)), 136 - $handles); 137 - case self::TYPE_REVOKE: 138 - if (!is_array($new)) { 139 - $new = array(); 140 - } 141 - $handles = $this->renderHandleList($new); 142 - return pht( 143 - '%s revoked this badge from %s recipient(s): %s.', 144 - $this->renderHandleLink($author_phid), 145 - new PhutilNumber(count($new)), 146 - $handles); 147 - } 148 - 149 - return parent::getTitle(); 150 - } 151 - 152 - public function getTitleForFeed() { 153 - $author_phid = $this->getAuthorPHID(); 154 - $object_phid = $this->getObjectPHID(); 155 - 156 - $old = $this->getOldValue(); 157 - $new = $this->getNewValue(); 158 - 159 - $type = $this->getTransactionType(); 160 - switch ($type) { 161 - case self::TYPE_NAME: 162 - if ($old === null) { 163 - return pht( 164 - '%s created %s.', 165 - $this->renderHandleLink($author_phid), 166 - $this->renderHandleLink($object_phid)); 167 - 168 - } else { 169 - return pht( 170 - '%s renamed %s.', 171 - $this->renderHandleLink($author_phid), 172 - $this->renderHandleLink($object_phid)); 173 - } 174 - break; 175 - case self::TYPE_FLAVOR: 176 - return pht( 177 - '%s updated the flavor text for %s.', 178 - $this->renderHandleLink($author_phid), 179 - $this->renderHandleLink($object_phid)); 180 - case self::TYPE_ICON: 181 - return pht( 182 - '%s updated the icon for %s.', 183 - $this->renderHandleLink($author_phid), 184 - $this->renderHandleLink($object_phid)); 185 - case self::TYPE_QUALITY: 186 - return pht( 187 - '%s updated the quality level for %s.', 188 - $this->renderHandleLink($author_phid), 189 - $this->renderHandleLink($object_phid)); 190 - case self::TYPE_DESCRIPTION: 191 - return pht( 192 - '%s updated the description for %s.', 193 - $this->renderHandleLink($author_phid), 194 - $this->renderHandleLink($object_phid)); 195 - case self::TYPE_STATUS: 196 - switch ($new) { 197 - case PhabricatorBadgesBadge::STATUS_ACTIVE: 198 - return pht( 199 - '%s activated %s.', 200 - $this->renderHandleLink($author_phid), 201 - $this->renderHandleLink($object_phid)); 202 - case PhabricatorBadgesBadge::STATUS_ARCHIVED: 203 - return pht( 204 - '%s archived %s.', 205 - $this->renderHandleLink($author_phid), 206 - $this->renderHandleLink($object_phid)); 207 - } 208 - break; 209 - case self::TYPE_AWARD: 210 - if (!is_array($new)) { 211 - $new = array(); 212 - } 213 - $handles = $this->renderHandleList($new); 214 - return pht( 215 - '%s awarded %s to %s recipient(s): %s.', 216 - $this->renderHandleLink($author_phid), 217 - $this->renderHandleLink($object_phid), 218 - new PhutilNumber(count($new)), 219 - $handles); 220 - case self::TYPE_REVOKE: 221 - if (!is_array($new)) { 222 - $new = array(); 223 - } 224 - $handles = $this->renderHandleList($new); 225 - return pht( 226 - '%s revoked %s from %s recipient(s): %s.', 227 - $this->renderHandleLink($author_phid), 228 - $this->renderHandleLink($object_phid), 229 - new PhutilNumber(count($new)), 230 - $handles); 231 - } 232 - 233 - return parent::getTitleForFeed(); 22 + public function getBaseTransactionClass() { 23 + return 'PhabricatorBadgesBadgeTransactionType'; 234 24 } 235 25 236 26 public function getMailTags() { ··· 240 30 case PhabricatorTransactions::TYPE_COMMENT: 241 31 $tags[] = self::MAILTAG_COMMENT; 242 32 break; 243 - case self::TYPE_NAME: 244 - case self::TYPE_DESCRIPTION: 245 - case self::TYPE_FLAVOR: 246 - case self::TYPE_ICON: 247 - case self::TYPE_STATUS: 248 - case self::TYPE_QUALITY: 33 + case PhabricatorBadgesBadgeNameTransaction::TRANSACTIONTYPE: 34 + case PhabricatorBadgesBadgeDescriptionTransaction::TRANSACTIONTYPE: 35 + case PhabricatorBadgesBadgeFlavorTransaction::TRANSACTIONTYPE: 36 + case PhabricatorBadgesBadgeIconTransaction::TRANSACTIONTYPE: 37 + case PhabricatorBadgesBadgeStatusTransaction::TRANSACTIONTYPE: 38 + case PhabricatorBadgesBadgeQualityTransaction::TRANSACTIONTYPE: 249 39 $tags[] = self::MAILTAG_DETAILS; 250 40 break; 41 + case PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE: 42 + case PhabricatorBadgesBadgeRevokeTransaction::TRANSACTIONTYPE: 251 43 default: 252 44 $tags[] = self::MAILTAG_OTHER; 253 45 break; ··· 255 47 return $tags; 256 48 } 257 49 258 - 259 - public function shouldHide() { 260 - $old = $this->getOldValue(); 261 - switch ($this->getTransactionType()) { 262 - case self::TYPE_DESCRIPTION: 263 - return ($old === null); 264 - } 265 - return parent::shouldHide(); 266 - } 267 - 268 - public function hasChangeDetails() { 269 - switch ($this->getTransactionType()) { 270 - case self::TYPE_DESCRIPTION: 271 - return ($this->getOldValue() !== null); 272 - } 273 - 274 - return parent::hasChangeDetails(); 275 - } 276 - 277 - public function renderChangeDetails(PhabricatorUser $viewer) { 278 - return $this->renderTextCorpusChangeDetails( 279 - $viewer, 280 - $this->getOldValue(), 281 - $this->getNewValue()); 282 - } 283 - 284 - public function getRequiredHandlePHIDs() { 285 - $phids = parent::getRequiredHandlePHIDs(); 286 - 287 - $type = $this->getTransactionType(); 288 - switch ($type) { 289 - case self::TYPE_AWARD: 290 - case self::TYPE_REVOKE: 291 - $new = $this->getNewValue(); 292 - if (!is_array($new)) { 293 - $new = array(); 294 - } 295 - foreach ($new as $phid) { 296 - $phids[] = $phid; 297 - } 298 - break; 299 - } 300 - 301 - return $phids; 302 - } 303 50 }
+62
src/applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeAwardTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.award'; 7 + 8 + public function generateOldValue($object) { 9 + return mpull($object->getAwards(), 'getRecipientPHID'); 10 + } 11 + 12 + public function applyExternalEffects($object, $value) { 13 + $awards = $object->getAwards(); 14 + $awards = mpull($awards, null, 'getRecipientPHID'); 15 + 16 + foreach ($value as $phid) { 17 + $award = idx($awards, $phid); 18 + if (!$award) { 19 + $award = PhabricatorBadgesAward::initializeNewBadgesAward( 20 + $this->getActor(), 21 + $object, 22 + $phid); 23 + $award->save(); 24 + $awards[] = $award; 25 + } 26 + } 27 + $object->attachAwards($awards); 28 + return; 29 + } 30 + 31 + public function getTitle() { 32 + $new = $this->getNewValue(); 33 + if (!is_array($new)) { 34 + $new = array(); 35 + } 36 + $handles = $this->renderHandleList($new); 37 + return pht( 38 + '%s awarded this badge to %s recipient(s): %s.', 39 + $this->renderAuthor(), 40 + new PhutilNumber(count($new)), 41 + $handles); 42 + } 43 + 44 + public function getTitleForFeed() { 45 + $new = $this->getNewValue(); 46 + if (!is_array($new)) { 47 + $new = array(); 48 + } 49 + $handles = $this->renderHandleList($new); 50 + return pht( 51 + '%s awarded %s to %s recipient(s): %s.', 52 + $this->renderAuthor(), 53 + $this->renderObject(), 54 + new PhutilNumber(count($new)), 55 + $handles); 56 + } 57 + 58 + public function getIcon() { 59 + return 'fa-user-plus'; 60 + } 61 + 62 + }
+57
src/applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeDescriptionTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.description'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDescription(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDescription($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s updated the badge description.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function getTitleForFeed() { 23 + return pht( 24 + '%s updated the badge description for %s.', 25 + $this->renderAuthor(), 26 + $this->renderObject()); 27 + } 28 + 29 + public function hasChangeDetailView() { 30 + return true; 31 + } 32 + 33 + public function getMailDiffSectionHeader() { 34 + return pht('CHANGES TO BADGE DESCRIPTION'); 35 + } 36 + 37 + public function newChangeDetailView() { 38 + $viewer = $this->getViewer(); 39 + 40 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 41 + ->setViewer($viewer) 42 + ->setOldText($this->getOldValue()) 43 + ->setNewText($this->getNewValue()); 44 + } 45 + 46 + public function newRemarkupChanges() { 47 + $changes = array(); 48 + 49 + $changes[] = $this->newRemarkupChange() 50 + ->setOldValue($this->getOldValue()) 51 + ->setNewValue($this->getNewValue()); 52 + 53 + return $changes; 54 + } 55 + 56 + 57 + }
+33
src/applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeFlavorTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.flavor'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getFlavor(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setFlavor($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s updated the flavor from %s to %s.', 19 + $this->renderAuthor(), 20 + $this->renderOldValue(), 21 + $this->renderNewValue()); 22 + } 23 + 24 + public function getTitleForFeed() { 25 + return pht( 26 + '%s updated %s flavor text from %s to %s.', 27 + $this->renderAuthor(), 28 + $this->renderObject(), 29 + $this->renderOldValue(), 30 + $this->renderNewValue()); 31 + } 32 + 33 + }
+56
src/applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeIconTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.icon'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getIcon(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setIcon($value); 14 + } 15 + 16 + public function shouldHide() { 17 + if ($this->isCreateTransaction()) { 18 + return true; 19 + } 20 + 21 + return false; 22 + } 23 + 24 + public function getTitle() { 25 + $old = $this->getIconLabel($this->getOldValue()); 26 + $new = $this->getIconLabel($this->getNewValue()); 27 + 28 + return pht( 29 + '%s changed the badge icon from %s to %s.', 30 + $this->renderAuthor(), 31 + $this->renderValue($old), 32 + $this->renderValue($new)); 33 + } 34 + 35 + public function getTitleForFeed() { 36 + $old = $this->getIconLabel($this->getOldValue()); 37 + $new = $this->getIconLabel($this->getNewValue()); 38 + 39 + return pht( 40 + '%s changed the badge icon for %s from %s to %s.', 41 + $this->renderAuthor(), 42 + $this->renderObject(), 43 + $this->renderValue($old), 44 + $this->renderValue($new)); 45 + } 46 + 47 + private function getIconLabel($icon) { 48 + $set = new PhabricatorBadgesIconSet(); 49 + return $set->getIconLabel($icon); 50 + } 51 + 52 + public function getIcon() { 53 + return $this->getNewValue(); 54 + } 55 + 56 + }
+44
src/applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeNameTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.name'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getName(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setName($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s renamed this badge from %s to %s.', 19 + $this->renderAuthor(), 20 + $this->renderOldValue(), 21 + $this->renderNewValue()); 22 + } 23 + 24 + public function getTitleForFeed() { 25 + return pht( 26 + '%s renamed %s badge %s to %s.', 27 + $this->renderAuthor(), 28 + $this->renderObject(), 29 + $this->renderOldValue(), 30 + $this->renderNewValue()); 31 + } 32 + 33 + public function validateTransactions($object, array $xactions) { 34 + $errors = array(); 35 + 36 + if ($this->isEmptyTextTransaction($object->getName(), $xactions)) { 37 + $errors[] = $this->newRequiredError( 38 + pht('Badges must have a name.')); 39 + } 40 + 41 + return $errors; 42 + } 43 + 44 + }
+70
src/applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeQualityTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.quality'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getQuality(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setQuality($value); 14 + } 15 + 16 + public function shouldHide() { 17 + if ($this->isCreateTransaction()) { 18 + return true; 19 + } 20 + 21 + return false; 22 + } 23 + 24 + public function getTitle() { 25 + $old = $this->getQualityLabel($this->getOldValue()); 26 + $new = $this->getQualityLabel($this->getNewValue()); 27 + 28 + return pht( 29 + '%s updated the quality from %s to %s.', 30 + $this->renderAuthor(), 31 + $old, 32 + $new); 33 + } 34 + 35 + public function getTitleForFeed() { 36 + $old = $this->getQualityLabel($this->getOldValue()); 37 + $new = $this->getQualityLabel($this->getNewValue()); 38 + 39 + return pht( 40 + '%s updated %s quality from %s to %s.', 41 + $this->renderAuthor(), 42 + $this->renderObject(), 43 + $new, 44 + $old); 45 + } 46 + 47 + public function validateTransactions($object, array $xactions) { 48 + $errors = array(); 49 + 50 + if ($this->isEmptyTextTransaction($object->getQuality(), $xactions)) { 51 + $errors[] = $this->newRequiredError( 52 + pht('Badge quality must be set.')); 53 + } 54 + 55 + $map = PhabricatorBadgesQuality::getQualityMap(); 56 + if (!$map[$object->getQuality()]) { 57 + $errors[] = $this->newRequiredError( 58 + pht('Badge quality is not valid.')); 59 + } 60 + 61 + return $errors; 62 + } 63 + 64 + private function getQualityLabel($quality) { 65 + $map = PhabricatorBadgesQuality::getQualityMap(); 66 + $name = $map[$quality]['name']; 67 + return $this->renderValue($name); 68 + } 69 + 70 + }
+54
src/applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeRevokeTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badge.revoke'; 7 + 8 + public function generateOldValue($object) { 9 + return null; 10 + } 11 + 12 + public function applyExternalEffects($object, $value) { 13 + $awards = $object->getAwards(); 14 + $awards = mpull($awards, null, 'getRecipientPHID'); 15 + 16 + foreach ($value as $phid) { 17 + $awards[$phid]->delete(); 18 + } 19 + $object->attachAwards($awards); 20 + return; 21 + } 22 + 23 + public function getTitle() { 24 + $new = $this->getNewValue(); 25 + if (!is_array($new)) { 26 + $new = array(); 27 + } 28 + $handles = $this->renderHandleList($new); 29 + return pht( 30 + '%s revoked this badge from %s recipient(s): %s.', 31 + $this->renderAuthor(), 32 + new PhutilNumber(count($new)), 33 + $handles); 34 + } 35 + 36 + public function getTitleForFeed() { 37 + $new = $this->getNewValue(); 38 + if (!is_array($new)) { 39 + $new = array(); 40 + } 41 + $handles = $this->renderHandleList($new); 42 + return pht( 43 + '%s revoked %s from %s recipient(s): %s.', 44 + $this->renderAuthor(), 45 + $this->renderObject(), 46 + new PhutilNumber(count($new)), 47 + $handles); 48 + } 49 + 50 + public function getIcon() { 51 + return 'fa-user-times'; 52 + } 53 + 54 + }
+50
src/applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorBadgesBadgeStatusTransaction 4 + extends PhabricatorBadgesBadgeTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'badges.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 + if ($this->getNewValue() == PhabricatorBadgesBadge::STATUS_ARCHIVED) { 18 + return pht( 19 + '%s disabled this badge.', 20 + $this->renderAuthor()); 21 + } else { 22 + return pht( 23 + '%s enabled this badge.', 24 + $this->renderAuthor()); 25 + } 26 + } 27 + 28 + public function getTitleForFeed() { 29 + if ($this->getNewValue() == PhabricatorBadgesBadge::STATUS_ARCHIVED) { 30 + return pht( 31 + '%s disabled the badge %s.', 32 + $this->renderAuthor(), 33 + $this->renderObject()); 34 + } else { 35 + return pht( 36 + '%s enabled the badge %s.', 37 + $this->renderAuthor(), 38 + $this->renderObject()); 39 + } 40 + } 41 + 42 + public function getIcon() { 43 + if ($this->getNewValue() == PhabricatorBadgesBadge::STATUS_ARCHIVED) { 44 + return 'fa-ban'; 45 + } else { 46 + return 'fa-check'; 47 + } 48 + } 49 + 50 + }
+4
src/applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorBadgesBadgeTransactionType 4 + extends PhabricatorModularTransactionType {}