diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2012,7 +2012,16 @@ 'PhabricatorBadgesAwardController' => 'applications/badges/controller/PhabricatorBadgesAwardController.php', 'PhabricatorBadgesAwardQuery' => 'applications/badges/query/PhabricatorBadgesAwardQuery.php', 'PhabricatorBadgesBadge' => 'applications/badges/storage/PhabricatorBadgesBadge.php', + 'PhabricatorBadgesBadgeAwardTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php', + 'PhabricatorBadgesBadgeDescriptionTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php', + 'PhabricatorBadgesBadgeFlavorTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php', + 'PhabricatorBadgesBadgeIconTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php', 'PhabricatorBadgesBadgeNameNgrams' => 'applications/badges/storage/PhabricatorBadgesBadgeNameNgrams.php', + 'PhabricatorBadgesBadgeNameTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php', + 'PhabricatorBadgesBadgeQualityTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php', + 'PhabricatorBadgesBadgeRevokeTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php', + 'PhabricatorBadgesBadgeStatusTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php', + 'PhabricatorBadgesBadgeTransactionType' => 'applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php', 'PhabricatorBadgesCommentController' => 'applications/badges/controller/PhabricatorBadgesCommentController.php', 'PhabricatorBadgesController' => 'applications/badges/controller/PhabricatorBadgesController.php', 'PhabricatorBadgesCreateCapability' => 'applications/badges/capability/PhabricatorBadgesCreateCapability.php', @@ -6954,7 +6963,16 @@ 'PhabricatorConduitResultInterface', 'PhabricatorNgramsInterface', ), + 'PhabricatorBadgesBadgeAwardTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeDescriptionTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeFlavorTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeIconTransaction' => 'PhabricatorBadgesBadgeTransactionType', 'PhabricatorBadgesBadgeNameNgrams' => 'PhabricatorSearchNgrams', + 'PhabricatorBadgesBadgeNameTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeQualityTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeRevokeTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeStatusTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeTransactionType' => 'PhabricatorModularTransactionType', 'PhabricatorBadgesCommentController' => 'PhabricatorBadgesController', 'PhabricatorBadgesController' => 'PhabricatorController', 'PhabricatorBadgesCreateCapability' => 'PhabricatorPolicyCapability', @@ -6980,7 +6998,7 @@ 'PhabricatorBadgesSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorBadgesSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'PhabricatorBadgesSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorBadgesTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorBadgesTransaction' => 'PhabricatorModularTransaction', 'PhabricatorBadgesTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PhabricatorBadgesTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorBadgesViewController' => 'PhabricatorBadgesProfileController', diff --git a/src/applications/badges/controller/PhabricatorBadgesArchiveController.php b/src/applications/badges/controller/PhabricatorBadgesArchiveController.php --- a/src/applications/badges/controller/PhabricatorBadgesArchiveController.php +++ b/src/applications/badges/controller/PhabricatorBadgesArchiveController.php @@ -32,7 +32,8 @@ $xactions = array(); $xactions[] = id(new PhabricatorBadgesTransaction()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_STATUS) + ->setTransactionType( + PhabricatorBadgesBadgeStatusTransaction::TRANSACTIONTYPE) ->setNewValue($new_status); id(new PhabricatorBadgesEditor()) diff --git a/src/applications/badges/controller/PhabricatorBadgesAwardController.php b/src/applications/badges/controller/PhabricatorBadgesAwardController.php --- a/src/applications/badges/controller/PhabricatorBadgesAwardController.php +++ b/src/applications/badges/controller/PhabricatorBadgesAwardController.php @@ -37,7 +37,8 @@ foreach ($badges as $badge) { $xactions = array(); $xactions[] = id(new PhabricatorBadgesTransaction()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_AWARD) + ->setTransactionType( + PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE) ->setNewValue($award_phids); $editor = id(new PhabricatorBadgesEditor()) diff --git a/src/applications/badges/controller/PhabricatorBadgesEditRecipientsController.php b/src/applications/badges/controller/PhabricatorBadgesEditRecipientsController.php --- a/src/applications/badges/controller/PhabricatorBadgesEditRecipientsController.php +++ b/src/applications/badges/controller/PhabricatorBadgesEditRecipientsController.php @@ -37,7 +37,8 @@ } $xactions[] = id(new PhabricatorBadgesTransaction()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_AWARD) + ->setTransactionType( + PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE) ->setNewValue($award_phids); $editor = id(new PhabricatorBadgesEditor()) diff --git a/src/applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php b/src/applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php --- a/src/applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php +++ b/src/applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php @@ -34,7 +34,8 @@ if ($request->isFormPost()) { $xactions = array(); $xactions[] = id(new PhabricatorBadgesTransaction()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_REVOKE) + ->setTransactionType( + PhabricatorBadgesBadgeRevokeTransaction::TRANSACTIONTYPE) ->setNewValue(array($remove_phid)); $editor = id(new PhabricatorBadgesEditor()) diff --git a/src/applications/badges/editor/PhabricatorBadgesEditEngine.php b/src/applications/badges/editor/PhabricatorBadgesEditEngine.php --- a/src/applications/badges/editor/PhabricatorBadgesEditEngine.php +++ b/src/applications/badges/editor/PhabricatorBadgesEditEngine.php @@ -86,20 +86,24 @@ ->setLabel(pht('Name')) ->setDescription(pht('Badge name.')) ->setConduitTypeDescription(pht('New badge name.')) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_NAME) - ->setValue($object->getName()), + ->setTransactionType( + PhabricatorBadgesBadgeNameTransaction::TRANSACTIONTYPE) + ->setValue($object->getName()) + ->setIsRequired(true), id(new PhabricatorTextEditField()) ->setKey('flavor') ->setLabel(pht('Flavor text')) ->setDescription(pht('Short description of the badge.')) ->setConduitTypeDescription(pht('New badge flavor.')) ->setValue($object->getFlavor()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_FLAVOR), + ->setTransactionType( + PhabricatorBadgesBadgeFlavorTransaction::TRANSACTIONTYPE), id(new PhabricatorIconSetEditField()) ->setKey('icon') ->setLabel(pht('Icon')) ->setIconSet(new PhabricatorBadgesIconSet()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_ICON) + ->setTransactionType( + PhabricatorBadgesBadgeIconTransaction::TRANSACTIONTYPE) ->setConduitDescription(pht('Change the badge icon.')) ->setConduitTypeDescription(pht('New badge icon.')) ->setValue($object->getIcon()), @@ -109,14 +113,16 @@ ->setDescription(pht('Color and rarity of the badge.')) ->setConduitTypeDescription(pht('New badge quality.')) ->setValue($object->getQuality()) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_QUALITY) + ->setTransactionType( + PhabricatorBadgesBadgeQualityTransaction::TRANSACTIONTYPE) ->setOptions(PhabricatorBadgesQuality::getDropdownQualityMap()), id(new PhabricatorRemarkupEditField()) ->setKey('description') ->setLabel(pht('Description')) ->setDescription(pht('Badge long description.')) ->setConduitTypeDescription(pht('New badge description.')) - ->setTransactionType(PhabricatorBadgesTransaction::TYPE_DESCRIPTION) + ->setTransactionType( + PhabricatorBadgesBadgeDescriptionTransaction::TRANSACTIONTYPE) ->setValue($object->getDescription()), ); } diff --git a/src/applications/badges/editor/PhabricatorBadgesEditor.php b/src/applications/badges/editor/PhabricatorBadgesEditor.php --- a/src/applications/badges/editor/PhabricatorBadgesEditor.php +++ b/src/applications/badges/editor/PhabricatorBadgesEditor.php @@ -11,22 +11,20 @@ return pht('Badges'); } + public function getCreateObjectTitle($author, $object) { + return pht('%s created this badge.', $author); + } + + public function getCreateObjectTitleForFeed($author, $object) { + return pht('%s created %s.', $author, $object); + } + protected function supportsSearch() { return true; } public function getTransactionTypes() { $types = parent::getTransactionTypes(); - - $types[] = PhabricatorBadgesTransaction::TYPE_NAME; - $types[] = PhabricatorBadgesTransaction::TYPE_FLAVOR; - $types[] = PhabricatorBadgesTransaction::TYPE_DESCRIPTION; - $types[] = PhabricatorBadgesTransaction::TYPE_ICON; - $types[] = PhabricatorBadgesTransaction::TYPE_STATUS; - $types[] = PhabricatorBadgesTransaction::TYPE_QUALITY; - $types[] = PhabricatorBadgesTransaction::TYPE_AWARD; - $types[] = PhabricatorBadgesTransaction::TYPE_REVOKE; - $types[] = PhabricatorTransactions::TYPE_COMMENT; $types[] = PhabricatorTransactions::TYPE_EDGE; $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; @@ -34,159 +32,6 @@ return $types; } - protected function getCustomTransactionOldValue( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - switch ($xaction->getTransactionType()) { - case PhabricatorBadgesTransaction::TYPE_NAME: - return $object->getName(); - case PhabricatorBadgesTransaction::TYPE_FLAVOR: - return $object->getFlavor(); - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: - return $object->getDescription(); - case PhabricatorBadgesTransaction::TYPE_ICON: - return $object->getIcon(); - case PhabricatorBadgesTransaction::TYPE_QUALITY: - return (int)$object->getQuality(); - case PhabricatorBadgesTransaction::TYPE_STATUS: - return $object->getStatus(); - case PhabricatorBadgesTransaction::TYPE_AWARD: - $award_phids = mpull($object->getAwards(), 'getRecipientPHID'); - return $award_phids; - case PhabricatorBadgesTransaction::TYPE_REVOKE: - return null; - } - - return parent::getCustomTransactionOldValue($object, $xaction); - } - - protected function getCustomTransactionNewValue( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - - switch ($xaction->getTransactionType()) { - case PhabricatorBadgesTransaction::TYPE_NAME: - case PhabricatorBadgesTransaction::TYPE_FLAVOR: - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: - case PhabricatorBadgesTransaction::TYPE_ICON: - case PhabricatorBadgesTransaction::TYPE_STATUS: - case PhabricatorBadgesTransaction::TYPE_AWARD: - case PhabricatorBadgesTransaction::TYPE_REVOKE: - return $xaction->getNewValue(); - case PhabricatorBadgesTransaction::TYPE_QUALITY: - return (int)$xaction->getNewValue(); - } - - return parent::getCustomTransactionNewValue($object, $xaction); - } - - protected function applyCustomInternalTransaction( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - - $type = $xaction->getTransactionType(); - switch ($type) { - case PhabricatorBadgesTransaction::TYPE_NAME: - $object->setName($xaction->getNewValue()); - return; - case PhabricatorBadgesTransaction::TYPE_FLAVOR: - $object->setFlavor($xaction->getNewValue()); - return; - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: - $object->setDescription($xaction->getNewValue()); - return; - case PhabricatorBadgesTransaction::TYPE_ICON: - $object->setIcon($xaction->getNewValue()); - return; - case PhabricatorBadgesTransaction::TYPE_QUALITY: - $object->setQuality($xaction->getNewValue()); - return; - case PhabricatorBadgesTransaction::TYPE_STATUS: - $object->setStatus($xaction->getNewValue()); - return; - case PhabricatorBadgesTransaction::TYPE_AWARD: - case PhabricatorBadgesTransaction::TYPE_REVOKE: - return; - } - - return parent::applyCustomInternalTransaction($object, $xaction); - } - - protected function applyCustomExternalTransaction( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - - $type = $xaction->getTransactionType(); - switch ($type) { - case PhabricatorBadgesTransaction::TYPE_NAME: - case PhabricatorBadgesTransaction::TYPE_FLAVOR: - case PhabricatorBadgesTransaction::TYPE_DESCRIPTION: - case PhabricatorBadgesTransaction::TYPE_ICON: - case PhabricatorBadgesTransaction::TYPE_STATUS: - case PhabricatorBadgesTransaction::TYPE_QUALITY: - return; - case PhabricatorBadgesTransaction::TYPE_REVOKE: - $revoked_recipient_phids = $xaction->getNewValue(); - $awards = $object->getAwards(); - $awards = mpull($awards, null, 'getRecipientPHID'); - - foreach ($revoked_recipient_phids as $phid) { - $awards[$phid]->delete(); - } - $object->attachAwards($awards); - return; - case PhabricatorBadgesTransaction::TYPE_AWARD: - $recipient_phids = $xaction->getNewValue(); - $awards = $object->getAwards(); - $awards = mpull($awards, null, 'getRecipientPHID'); - - foreach ($recipient_phids as $phid) { - $award = idx($awards, $phid); - if (!$award) { - $award = PhabricatorBadgesAward::initializeNewBadgesAward( - $this->getActor(), - $object, - $phid); - $award->save(); - $awards[] = $award; - } - } - $object->attachAwards($awards); - return; - } - - return parent::applyCustomExternalTransaction($object, $xaction); - } - - protected function validateTransaction( - PhabricatorLiskDAO $object, - $type, - array $xactions) { - - $errors = parent::validateTransaction($object, $type, $xactions); - - switch ($type) { - case PhabricatorBadgesTransaction::TYPE_NAME: - $missing = $this->validateIsEmptyTextField( - $object->getName(), - $xactions); - - if ($missing) { - $error = new PhabricatorApplicationTransactionValidationError( - $type, - pht('Required'), - pht('Badge name is required.'), - nonempty(last($xactions), null)); - - $error->setIsMissingFieldError(true); - $errors[] = $error; - } - break; - } - - return $errors; - } - protected function shouldSendMail( PhabricatorLiskDAO $object, array $xactions) { diff --git a/src/applications/badges/storage/PhabricatorBadgesTransaction.php b/src/applications/badges/storage/PhabricatorBadgesTransaction.php --- a/src/applications/badges/storage/PhabricatorBadgesTransaction.php +++ b/src/applications/badges/storage/PhabricatorBadgesTransaction.php @@ -1,16 +1,7 @@ getAuthorPHID(); - $object_phid = $this->getObjectPHID(); - - $old = $this->getOldValue(); - $new = $this->getNewValue(); - - $type = $this->getTransactionType(); - switch ($type) { - case PhabricatorTransactions::TYPE_CREATE: - return pht( - '%s created this badge.', - $this->renderHandleLink($author_phid)); - case self::TYPE_NAME: - if ($old === null) { - return pht( - '%s created this badge.', - $this->renderHandleLink($author_phid)); - } else { - return pht( - '%s renamed this badge from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $old, - $new); - } - break; - case self::TYPE_FLAVOR: - if ($old === null) { - return pht( - '%s set the flavor text for this badge.', - $this->renderHandleLink($author_phid)); - } else { - return pht( - '%s updated the flavor text for this badge.', - $this->renderHandleLink($author_phid)); - } - break; - case self::TYPE_DESCRIPTION: - if ($old === null) { - return pht( - '%s set the description for this badge.', - $this->renderHandleLink($author_phid)); - } else { - return pht( - '%s updated the description for this badge.', - $this->renderHandleLink($author_phid)); - } - break; - case self::TYPE_STATUS: - switch ($new) { - case PhabricatorBadgesBadge::STATUS_ACTIVE: - return pht( - '%s activated this badge.', - $this->renderHandleLink($author_phid)); - case PhabricatorBadgesBadge::STATUS_ARCHIVED: - return pht( - '%s archived this badge.', - $this->renderHandleLink($author_phid)); - } - break; - case self::TYPE_ICON: - if ($old === null) { - return pht( - '%s set the icon for this badge as "%s".', - $this->renderHandleLink($author_phid), - $new); - } else { - $set = new PhabricatorBadgesIconSet(); - - $icon_old = $set->getIconLabel($old); - $icon_new = $set->getIconLabel($new); - - return pht( - '%s updated the icon for this badge from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $icon_old, - $icon_new); - } - break; - case self::TYPE_QUALITY: - $qual_new = PhabricatorBadgesQuality::getQualityName($new); - $qual_old = PhabricatorBadgesQuality::getQualityName($old); - if ($old === null) { - return pht( - '%s set the quality for this badge as "%s".', - $this->renderHandleLink($author_phid), - $qual_new); - } else { - return pht( - '%s updated the quality for this badge from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $qual_old, - $qual_new); - } - break; - case self::TYPE_AWARD: - if (!is_array($new)) { - $new = array(); - } - $handles = $this->renderHandleList($new); - return pht( - '%s awarded this badge to %s recipient(s): %s.', - $this->renderHandleLink($author_phid), - new PhutilNumber(count($new)), - $handles); - case self::TYPE_REVOKE: - if (!is_array($new)) { - $new = array(); - } - $handles = $this->renderHandleList($new); - return pht( - '%s revoked this badge from %s recipient(s): %s.', - $this->renderHandleLink($author_phid), - new PhutilNumber(count($new)), - $handles); - } - - return parent::getTitle(); - } - - public function getTitleForFeed() { - $author_phid = $this->getAuthorPHID(); - $object_phid = $this->getObjectPHID(); - - $old = $this->getOldValue(); - $new = $this->getNewValue(); - - $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.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - } - break; - case self::TYPE_FLAVOR: - return pht( - '%s updated the flavor text for %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - case self::TYPE_ICON: - return pht( - '%s updated the icon for %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - case self::TYPE_QUALITY: - return pht( - '%s updated the quality level for %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - case self::TYPE_DESCRIPTION: - return pht( - '%s updated the description for %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - case self::TYPE_STATUS: - switch ($new) { - case PhabricatorBadgesBadge::STATUS_ACTIVE: - return pht( - '%s activated %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - case PhabricatorBadgesBadge::STATUS_ARCHIVED: - return pht( - '%s archived %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid)); - } - break; - case self::TYPE_AWARD: - if (!is_array($new)) { - $new = array(); - } - $handles = $this->renderHandleList($new); - return pht( - '%s awarded %s to %s recipient(s): %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid), - new PhutilNumber(count($new)), - $handles); - case self::TYPE_REVOKE: - if (!is_array($new)) { - $new = array(); - } - $handles = $this->renderHandleList($new); - return pht( - '%s revoked %s from %s recipient(s): %s.', - $this->renderHandleLink($author_phid), - $this->renderHandleLink($object_phid), - new PhutilNumber(count($new)), - $handles); - } - - return parent::getTitleForFeed(); + public function getBaseTransactionClass() { + return 'PhabricatorBadgesBadgeTransactionType'; } public function getMailTags() { @@ -240,14 +30,16 @@ case PhabricatorTransactions::TYPE_COMMENT: $tags[] = self::MAILTAG_COMMENT; break; - case self::TYPE_NAME: - case self::TYPE_DESCRIPTION: - case self::TYPE_FLAVOR: - case self::TYPE_ICON: - case self::TYPE_STATUS: - case self::TYPE_QUALITY: + case PhabricatorBadgesBadgeNameTransaction::TRANSACTIONTYPE: + case PhabricatorBadgesBadgeDescriptionTransaction::TRANSACTIONTYPE: + case PhabricatorBadgesBadgeFlavorTransaction::TRANSACTIONTYPE: + case PhabricatorBadgesBadgeIconTransaction::TRANSACTIONTYPE: + case PhabricatorBadgesBadgeStatusTransaction::TRANSACTIONTYPE: + case PhabricatorBadgesBadgeQualityTransaction::TRANSACTIONTYPE: $tags[] = self::MAILTAG_DETAILS; break; + case PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE: + case PhabricatorBadgesBadgeRevokeTransaction::TRANSACTIONTYPE: default: $tags[] = self::MAILTAG_OTHER; break; @@ -255,49 +47,4 @@ return $tags; } - - public function shouldHide() { - $old = $this->getOldValue(); - switch ($this->getTransactionType()) { - case self::TYPE_DESCRIPTION: - return ($old === null); - } - return parent::shouldHide(); - } - - public function hasChangeDetails() { - switch ($this->getTransactionType()) { - case self::TYPE_DESCRIPTION: - return ($this->getOldValue() !== null); - } - - return parent::hasChangeDetails(); - } - - public function renderChangeDetails(PhabricatorUser $viewer) { - return $this->renderTextCorpusChangeDetails( - $viewer, - $this->getOldValue(), - $this->getNewValue()); - } - - public function getRequiredHandlePHIDs() { - $phids = parent::getRequiredHandlePHIDs(); - - $type = $this->getTransactionType(); - switch ($type) { - case self::TYPE_AWARD: - case self::TYPE_REVOKE: - $new = $this->getNewValue(); - if (!is_array($new)) { - $new = array(); - } - foreach ($new as $phid) { - $phids[] = $phid; - } - break; - } - - return $phids; - } } diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php @@ -0,0 +1,62 @@ +getAwards(), 'getRecipientPHID'); + } + + public function applyExternalEffects($object, $value) { + $awards = $object->getAwards(); + $awards = mpull($awards, null, 'getRecipientPHID'); + + foreach ($value as $phid) { + $award = idx($awards, $phid); + if (!$award) { + $award = PhabricatorBadgesAward::initializeNewBadgesAward( + $this->getActor(), + $object, + $phid); + $award->save(); + $awards[] = $award; + } + } + $object->attachAwards($awards); + return; + } + + public function getTitle() { + $new = $this->getNewValue(); + if (!is_array($new)) { + $new = array(); + } + $handles = $this->renderHandleList($new); + return pht( + '%s awarded this badge to %s recipient(s): %s.', + $this->renderAuthor(), + new PhutilNumber(count($new)), + $handles); + } + + public function getTitleForFeed() { + $new = $this->getNewValue(); + if (!is_array($new)) { + $new = array(); + } + $handles = $this->renderHandleList($new); + return pht( + '%s awarded %s to %s recipient(s): %s.', + $this->renderAuthor(), + $this->renderObject(), + new PhutilNumber(count($new)), + $handles); + } + + public function getIcon() { + return 'fa-user-plus'; + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php @@ -0,0 +1,57 @@ +getDescription(); + } + + public function applyInternalEffects($object, $value) { + $object->setDescription($value); + } + + public function getTitle() { + return pht( + '%s updated the badge description.', + $this->renderAuthor()); + } + + public function getTitleForFeed() { + return pht( + '%s updated the badge description for %s.', + $this->renderAuthor(), + $this->renderObject()); + } + + public function hasChangeDetailView() { + return true; + } + + public function getMailDiffSectionHeader() { + return pht('CHANGES TO BADGE DESCRIPTION'); + } + + public function newChangeDetailView() { + $viewer = $this->getViewer(); + + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) + ->setViewer($viewer) + ->setOldText($this->getOldValue()) + ->setNewText($this->getNewValue()); + } + + public function newRemarkupChanges() { + $changes = array(); + + $changes[] = $this->newRemarkupChange() + ->setOldValue($this->getOldValue()) + ->setNewValue($this->getNewValue()); + + return $changes; + } + + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php @@ -0,0 +1,33 @@ +getFlavor(); + } + + public function applyInternalEffects($object, $value) { + $object->setFlavor($value); + } + + public function getTitle() { + return pht( + '%s updated the flavor from %s to %s.', + $this->renderAuthor(), + $this->renderOldValue(), + $this->renderNewValue()); + } + + public function getTitleForFeed() { + return pht( + '%s updated %s flavor text from %s to %s.', + $this->renderAuthor(), + $this->renderObject(), + $this->renderOldValue(), + $this->renderNewValue()); + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php @@ -0,0 +1,56 @@ +getIcon(); + } + + public function applyInternalEffects($object, $value) { + $object->setIcon($value); + } + + public function shouldHide() { + if ($this->isCreateTransaction()) { + return true; + } + + return false; + } + + public function getTitle() { + $old = $this->getIconLabel($this->getOldValue()); + $new = $this->getIconLabel($this->getNewValue()); + + return pht( + '%s changed the badge icon from %s to %s.', + $this->renderAuthor(), + $this->renderValue($old), + $this->renderValue($new)); + } + + public function getTitleForFeed() { + $old = $this->getIconLabel($this->getOldValue()); + $new = $this->getIconLabel($this->getNewValue()); + + return pht( + '%s changed the badge icon for %s from %s to %s.', + $this->renderAuthor(), + $this->renderObject(), + $this->renderValue($old), + $this->renderValue($new)); + } + + private function getIconLabel($icon) { + $set = new PhabricatorBadgesIconSet(); + return $set->getIconLabel($icon); + } + + public function getIcon() { + return $this->getNewValue(); + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php @@ -0,0 +1,44 @@ +getName(); + } + + public function applyInternalEffects($object, $value) { + $object->setName($value); + } + + public function getTitle() { + return pht( + '%s renamed this badge from %s to %s.', + $this->renderAuthor(), + $this->renderOldValue(), + $this->renderNewValue()); + } + + public function getTitleForFeed() { + return pht( + '%s renamed %s badge %s to %s.', + $this->renderAuthor(), + $this->renderObject(), + $this->renderOldValue(), + $this->renderNewValue()); + } + + public function validateTransactions($object, array $xactions) { + $errors = array(); + + if ($this->isEmptyTextTransaction($object->getName(), $xactions)) { + $errors[] = $this->newRequiredError( + pht('Badges must have a name.')); + } + + return $errors; + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php @@ -0,0 +1,70 @@ +getQuality(); + } + + public function applyInternalEffects($object, $value) { + $object->setQuality($value); + } + + public function shouldHide() { + if ($this->isCreateTransaction()) { + return true; + } + + return false; + } + + public function getTitle() { + $old = $this->getQualityLabel($this->getOldValue()); + $new = $this->getQualityLabel($this->getNewValue()); + + return pht( + '%s updated the quality from %s to %s.', + $this->renderAuthor(), + $old, + $new); + } + + public function getTitleForFeed() { + $old = $this->getQualityLabel($this->getOldValue()); + $new = $this->getQualityLabel($this->getNewValue()); + + return pht( + '%s updated %s quality from %s to %s.', + $this->renderAuthor(), + $this->renderObject(), + $new, + $old); + } + + public function validateTransactions($object, array $xactions) { + $errors = array(); + + if ($this->isEmptyTextTransaction($object->getQuality(), $xactions)) { + $errors[] = $this->newRequiredError( + pht('Badge quality must be set.')); + } + + $map = PhabricatorBadgesQuality::getQualityMap(); + if (!$map[$object->getQuality()]) { + $errors[] = $this->newRequiredError( + pht('Badge quality is not valid.')); + } + + return $errors; + } + + private function getQualityLabel($quality) { + $map = PhabricatorBadgesQuality::getQualityMap(); + $name = $map[$quality]['name']; + return $this->renderValue($name); + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php @@ -0,0 +1,54 @@ +getAwards(); + $awards = mpull($awards, null, 'getRecipientPHID'); + + foreach ($value as $phid) { + $awards[$phid]->delete(); + } + $object->attachAwards($awards); + return; + } + + public function getTitle() { + $new = $this->getNewValue(); + if (!is_array($new)) { + $new = array(); + } + $handles = $this->renderHandleList($new); + return pht( + '%s revoked this badge from %s recipient(s): %s.', + $this->renderAuthor(), + new PhutilNumber(count($new)), + $handles); + } + + public function getTitleForFeed() { + $new = $this->getNewValue(); + if (!is_array($new)) { + $new = array(); + } + $handles = $this->renderHandleList($new); + return pht( + '%s revoked %s from %s recipient(s): %s.', + $this->renderAuthor(), + $this->renderObject(), + new PhutilNumber(count($new)), + $handles); + } + + public function getIcon() { + return 'fa-user-times'; + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php @@ -0,0 +1,50 @@ +getStatus(); + } + + public function applyInternalEffects($object, $value) { + $object->setStatus($value); + } + + public function getTitle() { + if ($this->getNewValue() == PhabricatorBadgesBadge::STATUS_ARCHIVED) { + return pht( + '%s disabled this badge.', + $this->renderAuthor()); + } else { + return pht( + '%s enabled this badge.', + $this->renderAuthor()); + } + } + + public function getTitleForFeed() { + if ($this->getNewValue() == PhabricatorBadgesBadge::STATUS_ARCHIVED) { + return pht( + '%s disabled the badge %s.', + $this->renderAuthor(), + $this->renderObject()); + } else { + return pht( + '%s enabled the badge %s.', + $this->renderAuthor(), + $this->renderObject()); + } + } + + public function getIcon() { + if ($this->getNewValue() == PhabricatorBadgesBadge::STATUS_ARCHIVED) { + return 'fa-ban'; + } else { + return 'fa-check'; + } + } + +} diff --git a/src/applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php b/src/applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php new file mode 100644 --- /dev/null +++ b/src/applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php @@ -0,0 +1,4 @@ +