1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-02-23 12:09:12 +01:00

Update PhortuneMerchant to Modular Transactions

Summary: Modernize PhortuneMerchant for Modular Transactions. Also changed the language of "Members" to "Managers", which I think fits better given the power/capability.

Test Plan:
- Create a new Merchant
- Test not filling in a name, see error
- Test removing myself, see error
- Edit an existing Merchant
- Add new managers
- Test removing myself, see error
- Replace Picture
- Update various fields, contact info, email, footer
- Verify transactions are now nice and pretty

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D17584
This commit is contained in:
Chad Little 2017-04-11 09:27:04 -07:00
parent 26d6096e0a
commit 28941b3105
15 changed files with 431 additions and 226 deletions

View file

@ -4367,19 +4367,26 @@ phutil_register_library_map(array(
'PhortuneMemberHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneMemberHasMerchantEdgeType.php', 'PhortuneMemberHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneMemberHasMerchantEdgeType.php',
'PhortuneMerchant' => 'applications/phortune/storage/PhortuneMerchant.php', 'PhortuneMerchant' => 'applications/phortune/storage/PhortuneMerchant.php',
'PhortuneMerchantCapability' => 'applications/phortune/capability/PhortuneMerchantCapability.php', 'PhortuneMerchantCapability' => 'applications/phortune/capability/PhortuneMerchantCapability.php',
'PhortuneMerchantContactInfoTransaction' => 'applications/phortune/xaction/PhortuneMerchantContactInfoTransaction.php',
'PhortuneMerchantController' => 'applications/phortune/controller/merchant/PhortuneMerchantController.php', 'PhortuneMerchantController' => 'applications/phortune/controller/merchant/PhortuneMerchantController.php',
'PhortuneMerchantDescriptionTransaction' => 'applications/phortune/xaction/PhortuneMerchantDescriptionTransaction.php',
'PhortuneMerchantEditController' => 'applications/phortune/controller/merchant/PhortuneMerchantEditController.php', 'PhortuneMerchantEditController' => 'applications/phortune/controller/merchant/PhortuneMerchantEditController.php',
'PhortuneMerchantEditEngine' => 'applications/phortune/editor/PhortuneMerchantEditEngine.php', 'PhortuneMerchantEditEngine' => 'applications/phortune/editor/PhortuneMerchantEditEngine.php',
'PhortuneMerchantEditor' => 'applications/phortune/editor/PhortuneMerchantEditor.php', 'PhortuneMerchantEditor' => 'applications/phortune/editor/PhortuneMerchantEditor.php',
'PhortuneMerchantHasMemberEdgeType' => 'applications/phortune/edge/PhortuneMerchantHasMemberEdgeType.php', 'PhortuneMerchantHasMemberEdgeType' => 'applications/phortune/edge/PhortuneMerchantHasMemberEdgeType.php',
'PhortuneMerchantInvoiceCreateController' => 'applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php', 'PhortuneMerchantInvoiceCreateController' => 'applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php',
'PhortuneMerchantInvoiceEmailTransaction' => 'applications/phortune/xaction/PhortuneMerchantInvoiceEmailTransaction.php',
'PhortuneMerchantInvoiceFooterTransaction' => 'applications/phortune/xaction/PhortuneMerchantInvoiceFooterTransaction.php',
'PhortuneMerchantListController' => 'applications/phortune/controller/merchant/PhortuneMerchantListController.php', 'PhortuneMerchantListController' => 'applications/phortune/controller/merchant/PhortuneMerchantListController.php',
'PhortuneMerchantNameTransaction' => 'applications/phortune/xaction/PhortuneMerchantNameTransaction.php',
'PhortuneMerchantPHIDType' => 'applications/phortune/phid/PhortuneMerchantPHIDType.php', 'PhortuneMerchantPHIDType' => 'applications/phortune/phid/PhortuneMerchantPHIDType.php',
'PhortuneMerchantPictureController' => 'applications/phortune/controller/merchant/PhortuneMerchantPictureController.php', 'PhortuneMerchantPictureController' => 'applications/phortune/controller/merchant/PhortuneMerchantPictureController.php',
'PhortuneMerchantPictureTransaction' => 'applications/phortune/xaction/PhortuneMerchantPictureTransaction.php',
'PhortuneMerchantQuery' => 'applications/phortune/query/PhortuneMerchantQuery.php', 'PhortuneMerchantQuery' => 'applications/phortune/query/PhortuneMerchantQuery.php',
'PhortuneMerchantSearchEngine' => 'applications/phortune/query/PhortuneMerchantSearchEngine.php', 'PhortuneMerchantSearchEngine' => 'applications/phortune/query/PhortuneMerchantSearchEngine.php',
'PhortuneMerchantTransaction' => 'applications/phortune/storage/PhortuneMerchantTransaction.php', 'PhortuneMerchantTransaction' => 'applications/phortune/storage/PhortuneMerchantTransaction.php',
'PhortuneMerchantTransactionQuery' => 'applications/phortune/query/PhortuneMerchantTransactionQuery.php', 'PhortuneMerchantTransactionQuery' => 'applications/phortune/query/PhortuneMerchantTransactionQuery.php',
'PhortuneMerchantTransactionType' => 'applications/phortune/xaction/PhortuneMerchantTransactionType.php',
'PhortuneMerchantViewController' => 'applications/phortune/controller/merchant/PhortuneMerchantViewController.php', 'PhortuneMerchantViewController' => 'applications/phortune/controller/merchant/PhortuneMerchantViewController.php',
'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php', 'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php',
'PhortuneOrderTableView' => 'applications/phortune/view/PhortuneOrderTableView.php', 'PhortuneOrderTableView' => 'applications/phortune/view/PhortuneOrderTableView.php',
@ -9820,19 +9827,26 @@ phutil_register_library_map(array(
'PhabricatorPolicyInterface', 'PhabricatorPolicyInterface',
), ),
'PhortuneMerchantCapability' => 'PhabricatorPolicyCapability', 'PhortuneMerchantCapability' => 'PhabricatorPolicyCapability',
'PhortuneMerchantContactInfoTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantController' => 'PhortuneController', 'PhortuneMerchantController' => 'PhortuneController',
'PhortuneMerchantDescriptionTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantEditController' => 'PhortuneMerchantController', 'PhortuneMerchantEditController' => 'PhortuneMerchantController',
'PhortuneMerchantEditEngine' => 'PhabricatorEditEngine', 'PhortuneMerchantEditEngine' => 'PhabricatorEditEngine',
'PhortuneMerchantEditor' => 'PhabricatorApplicationTransactionEditor', 'PhortuneMerchantEditor' => 'PhabricatorApplicationTransactionEditor',
'PhortuneMerchantHasMemberEdgeType' => 'PhabricatorEdgeType', 'PhortuneMerchantHasMemberEdgeType' => 'PhabricatorEdgeType',
'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantController', 'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantController',
'PhortuneMerchantInvoiceEmailTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantInvoiceFooterTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantListController' => 'PhortuneMerchantController', 'PhortuneMerchantListController' => 'PhortuneMerchantController',
'PhortuneMerchantNameTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantPHIDType' => 'PhabricatorPHIDType', 'PhortuneMerchantPHIDType' => 'PhabricatorPHIDType',
'PhortuneMerchantPictureController' => 'PhortuneMerchantController', 'PhortuneMerchantPictureController' => 'PhortuneMerchantController',
'PhortuneMerchantPictureTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhortuneMerchantQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhortuneMerchantSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhortuneMerchantSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhortuneMerchantTransaction' => 'PhabricatorApplicationTransaction', 'PhortuneMerchantTransaction' => 'PhabricatorModularTransaction',
'PhortuneMerchantTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhortuneMerchantTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'PhortuneMerchantTransactionType' => 'PhabricatorModularTransactionType',
'PhortuneMerchantViewController' => 'PhortuneMerchantController', 'PhortuneMerchantViewController' => 'PhortuneMerchantController',
'PhortuneMonthYearExpiryControl' => 'AphrontFormControl', 'PhortuneMonthYearExpiryControl' => 'AphrontFormControl',
'PhortuneOrderTableView' => 'AphrontView', 'PhortuneOrderTableView' => 'AphrontView',

View file

@ -76,7 +76,8 @@ final class PhortuneMerchantPictureController
$xactions = array(); $xactions = array();
$xactions[] = id(new PhortuneMerchantTransaction()) $xactions[] = id(new PhortuneMerchantTransaction())
->setTransactionType(PhortuneMerchantTransaction::TYPE_PICTURE) ->setTransactionType(
PhortuneMerchantPictureTransaction::TRANSACTIONTYPE)
->setNewValue($new_value); ->setNewValue($new_value);
$editor = id(new PhortuneMerchantEditor()) $editor = id(new PhortuneMerchantEditor())

View file

@ -240,7 +240,7 @@ final class PhortuneMerchantViewController
} }
$curtain->newPanel() $curtain->newPanel()
->setHeaderText(pht('Members')) ->setHeaderText(pht('Managers'))
->appendChild($member_list); ->appendChild($member_list);
return $curtain; return $curtain;

View file

@ -14,7 +14,7 @@ final class PhortuneMerchantHasMemberEdgeType extends PhabricatorEdgeType {
$add_edges) { $add_edges) {
return pht( return pht(
'%s added %s merchant member(s): %s.', '%s added %s merchant manager(s): %s.',
$actor, $actor,
$add_count, $add_count,
$add_edges); $add_edges);
@ -26,7 +26,7 @@ final class PhortuneMerchantHasMemberEdgeType extends PhabricatorEdgeType {
$rem_edges) { $rem_edges) {
return pht( return pht(
'%s removed %s merchant member(s): %s.', '%s removed %s merchant manager(s): %s.',
$actor, $actor,
$rem_count, $rem_count,
$rem_edges); $rem_edges);
@ -41,7 +41,7 @@ final class PhortuneMerchantHasMemberEdgeType extends PhabricatorEdgeType {
$rem_edges) { $rem_edges) {
return pht( return pht(
'%s edited %s merchant member(s), added %s: %s; removed %s: %s.', '%s edited %s merchant manager(s), added %s: %s; removed %s: %s.',
$actor, $actor,
$total_count, $total_count,
$add_count, $add_count,
@ -57,7 +57,7 @@ final class PhortuneMerchantHasMemberEdgeType extends PhabricatorEdgeType {
$add_edges) { $add_edges) {
return pht( return pht(
'%s added %s merchant member(s) to %s: %s.', '%s added %s merchant manager(s) to %s: %s.',
$actor, $actor,
$add_count, $add_count,
$object, $object,
@ -71,7 +71,7 @@ final class PhortuneMerchantHasMemberEdgeType extends PhabricatorEdgeType {
$rem_edges) { $rem_edges) {
return pht( return pht(
'%s removed %s merchant member(s) from %s: %s.', '%s removed %s merchant manager(s) from %s: %s.',
$actor, $actor,
$rem_count, $rem_count,
$object, $object,
@ -88,7 +88,7 @@ final class PhortuneMerchantHasMemberEdgeType extends PhabricatorEdgeType {
$rem_edges) { $rem_edges) {
return pht( return pht(
'%s edited %s merchant member(s) for %s, added %s: %s; removed %s: %s.', '%s edited %s merchant manager(s) for %s, added %s: %s; removed %s: %s.',
$actor, $actor,
$total_count, $total_count,
$object, $object,

View file

@ -81,21 +81,22 @@ final class PhortuneMerchantEditEngine
->setDescription(pht('Merchant name.')) ->setDescription(pht('Merchant name.'))
->setConduitTypeDescription(pht('New Merchant name.')) ->setConduitTypeDescription(pht('New Merchant name.'))
->setIsRequired(true) ->setIsRequired(true)
->setTransactionType(PhortuneMerchantTransaction::TYPE_NAME) ->setTransactionType(
PhortuneMerchantNameTransaction::TRANSACTIONTYPE)
->setValue($object->getName()), ->setValue($object->getName()),
id(new PhabricatorUsersEditField()) id(new PhabricatorUsersEditField())
->setKey('members') ->setKey('members')
->setAliases(array('memberPHIDs')) ->setAliases(array('memberPHIDs', 'managerPHIDs'))
->setLabel(pht('Members')) ->setLabel(pht('Managers'))
->setUseEdgeTransactions(true) ->setUseEdgeTransactions(true)
->setTransactionType(PhabricatorTransactions::TYPE_EDGE) ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
->setMetadataValue( ->setMetadataValue(
'edge:type', 'edge:type',
PhortuneMerchantHasMemberEdgeType::EDGECONST) PhortuneMerchantHasMemberEdgeType::EDGECONST)
->setDescription(pht('Initial merchant members.')) ->setDescription(pht('Initial merchant managers.'))
->setConduitDescription(pht('Set merchant members.')) ->setConduitDescription(pht('Set merchant managers.'))
->setConduitTypeDescription(pht('New list of members.')) ->setConduitTypeDescription(pht('New list of managers.'))
->setInitialValue($object->getMemberPHIDs()) ->setInitialValue($object->getMemberPHIDs())
->setValue($member_phids), ->setValue($member_phids),
@ -104,7 +105,8 @@ final class PhortuneMerchantEditEngine
->setLabel(pht('Description')) ->setLabel(pht('Description'))
->setDescription(pht('Merchant description.')) ->setDescription(pht('Merchant description.'))
->setConduitTypeDescription(pht('New merchant description.')) ->setConduitTypeDescription(pht('New merchant description.'))
->setTransactionType(PhortuneMerchantTransaction::TYPE_DESCRIPTION) ->setTransactionType(
PhortuneMerchantDescriptionTransaction::TRANSACTIONTYPE)
->setValue($object->getDescription()), ->setValue($object->getDescription()),
id(new PhabricatorRemarkupEditField()) id(new PhabricatorRemarkupEditField())
@ -112,7 +114,8 @@ final class PhortuneMerchantEditEngine
->setLabel(pht('Contact Info')) ->setLabel(pht('Contact Info'))
->setDescription(pht('Merchant contact information.')) ->setDescription(pht('Merchant contact information.'))
->setConduitTypeDescription(pht('Merchant contact information.')) ->setConduitTypeDescription(pht('Merchant contact information.'))
->setTransactionType(PhortuneMerchantTransaction::TYPE_CONTACTINFO) ->setTransactionType(
PhortuneMerchantContactInfoTransaction::TRANSACTIONTYPE)
->setValue($object->getContactInfo()), ->setValue($object->getContactInfo()),
id(new PhabricatorTextEditField()) id(new PhabricatorTextEditField())
@ -121,7 +124,8 @@ final class PhortuneMerchantEditEngine
->setDescription(pht('Email address invoices are sent from.')) ->setDescription(pht('Email address invoices are sent from.'))
->setConduitTypeDescription( ->setConduitTypeDescription(
pht('Email address invoices are sent from.')) pht('Email address invoices are sent from.'))
->setTransactionType(PhortuneMerchantTransaction::TYPE_INVOICEEMAIL) ->setTransactionType(
PhortuneMerchantInvoiceEmailTransaction::TRANSACTIONTYPE)
->setValue($object->getInvoiceEmail()), ->setValue($object->getInvoiceEmail()),
id(new PhabricatorRemarkupEditField()) id(new PhabricatorRemarkupEditField())
@ -129,7 +133,8 @@ final class PhortuneMerchantEditEngine
->setLabel(pht('Invoice Footer')) ->setLabel(pht('Invoice Footer'))
->setDescription(pht('Footer on invoice forms.')) ->setDescription(pht('Footer on invoice forms.'))
->setConduitTypeDescription(pht('Footer on invoice forms.')) ->setConduitTypeDescription(pht('Footer on invoice forms.'))
->setTransactionType(PhortuneMerchantTransaction::TYPE_INVOICEFOOTER) ->setTransactionType(
PhortuneMerchantInvoiceFooterTransaction::TRANSACTIONTYPE)
->setValue($object->getInvoiceFooter()), ->setValue($object->getInvoiceFooter()),
); );

View file

@ -11,104 +11,19 @@ final class PhortuneMerchantEditor
return pht('Phortune Merchants'); return pht('Phortune Merchants');
} }
public function getCreateObjectTitle($author, $object) {
return pht('%s created this merchant.', $author);
}
public function getTransactionTypes() { public function getTransactionTypes() {
$types = parent::getTransactionTypes(); $types = parent::getTransactionTypes();
$types[] = PhortuneMerchantTransaction::TYPE_NAME;
$types[] = PhortuneMerchantTransaction::TYPE_DESCRIPTION;
$types[] = PhortuneMerchantTransaction::TYPE_CONTACTINFO;
$types[] = PhortuneMerchantTransaction::TYPE_PICTURE;
$types[] = PhortuneMerchantTransaction::TYPE_INVOICEEMAIL;
$types[] = PhortuneMerchantTransaction::TYPE_INVOICEFOOTER;
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
$types[] = PhabricatorTransactions::TYPE_EDGE; $types[] = PhabricatorTransactions::TYPE_EDGE;
return $types; return $types;
} }
protected function getCustomTransactionOldValue(
PhabricatorLiskDAO $object,
PhabricatorApplicationTransaction $xaction) {
switch ($xaction->getTransactionType()) {
case PhortuneMerchantTransaction::TYPE_NAME:
return $object->getName();
case PhortuneMerchantTransaction::TYPE_DESCRIPTION:
return $object->getDescription();
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
return $object->getContactInfo();
case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
return $object->getInvoiceEmail();
case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
return $object->getInvoiceFooter();
case PhortuneMerchantTransaction::TYPE_PICTURE:
return $object->getProfileImagePHID();
}
return parent::getCustomTransactionOldValue($object, $xaction);
}
protected function getCustomTransactionNewValue(
PhabricatorLiskDAO $object,
PhabricatorApplicationTransaction $xaction) {
switch ($xaction->getTransactionType()) {
case PhortuneMerchantTransaction::TYPE_NAME:
case PhortuneMerchantTransaction::TYPE_DESCRIPTION:
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
case PhortuneMerchantTransaction::TYPE_PICTURE:
return $xaction->getNewValue();
}
return parent::getCustomTransactionNewValue($object, $xaction);
}
protected function applyCustomInternalTransaction(
PhabricatorLiskDAO $object,
PhabricatorApplicationTransaction $xaction) {
switch ($xaction->getTransactionType()) {
case PhortuneMerchantTransaction::TYPE_NAME:
$object->setName($xaction->getNewValue());
return;
case PhortuneMerchantTransaction::TYPE_DESCRIPTION:
$object->setDescription($xaction->getNewValue());
return;
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
$object->setContactInfo($xaction->getNewValue());
return;
case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
$object->setInvoiceEmail($xaction->getNewValue());
return;
case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
$object->setInvoiceFooter($xaction->getNewValue());
return;
case PhortuneMerchantTransaction::TYPE_PICTURE:
$object->setProfileImagePHID($xaction->getNewValue());
return;
}
return parent::applyCustomInternalTransaction($object, $xaction);
}
protected function applyCustomExternalTransaction(
PhabricatorLiskDAO $object,
PhabricatorApplicationTransaction $xaction) {
switch ($xaction->getTransactionType()) {
case PhortuneMerchantTransaction::TYPE_NAME:
case PhortuneMerchantTransaction::TYPE_DESCRIPTION:
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
case PhortuneMerchantTransaction::TYPE_PICTURE:
return;
}
return parent::applyCustomExternalTransaction($object, $xaction);
}
protected function validateTransaction( protected function validateTransaction(
PhabricatorLiskDAO $object, PhabricatorLiskDAO $object,
$type, $type,
@ -117,48 +32,28 @@ final class PhortuneMerchantEditor
$errors = parent::validateTransaction($object, $type, $xactions); $errors = parent::validateTransaction($object, $type, $xactions);
switch ($type) { switch ($type) {
case PhortuneMerchantTransaction::TYPE_NAME: case PhabricatorTransactions::TYPE_EDGE:
$missing = $this->validateIsEmptyTextField(
$object->getName(),
$xactions);
if ($missing) {
$error = new PhabricatorApplicationTransactionValidationError(
$type,
pht('Required'),
pht('Merchant name is required.'),
nonempty(last($xactions), null));
$error->setIsMissingFieldError(true);
$errors[] = $error;
}
break;
case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
$new_email = null;
foreach ($xactions as $xaction) { foreach ($xactions as $xaction) {
switch ($xaction->getTransactionType()) { switch ($xaction->getMetadataValue('edge:type')) {
case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL: case PhortuneMerchantHasMemberEdgeType::EDGECONST:
$new_email = $xaction->getNewValue(); $new = $xaction->getNewValue();
break; $set = idx($new, '-', array());
} $actor_phid = $this->requireActor()->getPHID();
} foreach ($set as $phid) {
if (strlen($new_email)) { if ($actor_phid == $phid) {
$email = new PhutilEmailAddress($new_email);
$domain = $email->getDomainName();
if (!$domain) {
$error = new PhabricatorApplicationTransactionValidationError( $error = new PhabricatorApplicationTransactionValidationError(
$type, $type,
pht('Invalid'), pht('Invalid'),
pht('%s is not a valid email.', $new_email), pht('You can not remove yourself as an merchant manager.'),
nonempty(last($xactions), null)); $xaction);
$errors[] = $error; $errors[] = $error;
} }
} }
break; break;
} }
}
break;
}
return $errors; return $errors;
} }

View file

@ -1,14 +1,7 @@
<?php <?php
final class PhortuneMerchantTransaction final class PhortuneMerchantTransaction
extends PhabricatorApplicationTransaction { extends PhabricatorModularTransaction {
const TYPE_NAME = 'merchant:name';
const TYPE_DESCRIPTION = 'merchant:description';
const TYPE_CONTACTINFO = 'merchant:contactinfo';
const TYPE_INVOICEEMAIL = 'merchant:invoiceemail';
const TYPE_INVOICEFOOTER = 'merchant:invoicefooter';
const TYPE_PICTURE = 'merchant:picture';
public function getApplicationName() { public function getApplicationName() {
return 'phortune'; return 'phortune';
@ -22,79 +15,8 @@ final class PhortuneMerchantTransaction
return null; return null;
} }
public function getTitle() { public function getBaseTransactionClass() {
$author_phid = $this->getAuthorPHID(); return 'PhortuneMerchantTransactionType';
$old = $this->getOldValue();
$new = $this->getNewValue();
switch ($this->getTransactionType()) {
case self::TYPE_NAME:
if ($old === null) {
return pht(
'%s created this merchant.',
$this->renderHandleLink($author_phid));
} else {
return pht(
'%s renamed this merchant from "%s" to "%s".',
$this->renderHandleLink($author_phid),
$old,
$new);
}
break;
case self::TYPE_DESCRIPTION:
return pht(
'%s updated the description for this merchant.',
$this->renderHandleLink($author_phid));
case self::TYPE_CONTACTINFO:
return pht(
'%s updated the contact information for this merchant.',
$this->renderHandleLink($author_phid));
case self::TYPE_INVOICEEMAIL:
return pht(
'%s updated the invoice email for this merchant.',
$this->renderHandleLink($author_phid));
case self::TYPE_INVOICEFOOTER:
return pht(
'%s updated the invoice footer for this merchant.',
$this->renderHandleLink($author_phid));
}
return parent::getTitle();
}
public function shouldHide() {
$old = $this->getOldValue();
switch ($this->getTransactionType()) {
case self::TYPE_DESCRIPTION:
case self::TYPE_CONTACTINFO:
case self::TYPE_INVOICEEMAIL:
case self::TYPE_INVOICEFOOTER:
return ($old === null);
}
return parent::shouldHide();
}
public function hasChangeDetails() {
switch ($this->getTransactionType()) {
case self::TYPE_DESCRIPTION:
return ($this->getOldValue() !== null);
case self::TYPE_CONTACTINFO:
return ($this->getOldValue() !== null);
case self::TYPE_INVOICEEMAIL:
return ($this->getOldValue() !== null);
case self::TYPE_INVOICEFOOTER:
return ($this->getOldValue() !== null);
}
return parent::hasChangeDetails();
}
public function renderChangeDetails(PhabricatorUser $viewer) {
return $this->renderTextCorpusChangeDetails(
$viewer,
$this->getOldValue(),
$this->getNewValue());
} }
} }

View file

@ -0,0 +1,56 @@
<?php
final class PhortuneMerchantContactInfoTransaction
extends PhortuneMerchantTransactionType {
const TRANSACTIONTYPE = 'merchant:contactinfo';
public function generateOldValue($object) {
return $object->getContactInfo();
}
public function applyInternalEffects($object, $value) {
$object->setContactInfo($value);
}
public function getTitle() {
return pht(
'%s updated the merchant contact info.',
$this->renderAuthor());
}
public function getTitleForFeed() {
return pht(
'%s updated the merchant contact info for %s.',
$this->renderAuthor(),
$this->renderObject());
}
public function hasChangeDetailView() {
return true;
}
public function getMailDiffSectionHeader() {
return pht('CHANGES TO MERCHANT CONTACT INFO');
}
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;
}
}

View file

@ -0,0 +1,56 @@
<?php
final class PhortuneMerchantDescriptionTransaction
extends PhortuneMerchantTransactionType {
const TRANSACTIONTYPE = 'merchant:description';
public function generateOldValue($object) {
return $object->getDescription();
}
public function applyInternalEffects($object, $value) {
$object->setDescription($value);
}
public function getTitle() {
return pht(
'%s updated the merchant description.',
$this->renderAuthor());
}
public function getTitleForFeed() {
return pht(
'%s updated the merchant description for %s.',
$this->renderAuthor(),
$this->renderObject());
}
public function hasChangeDetailView() {
return true;
}
public function getMailDiffSectionHeader() {
return pht('CHANGES TO MERCHANT 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;
}
}

View file

@ -0,0 +1,94 @@
<?php
final class PhortuneMerchantInvoiceEmailTransaction
extends PhortuneMerchantTransactionType {
const TRANSACTIONTYPE = 'merchant:invoiceemail';
public function generateOldValue($object) {
return $object->getInvoiceEmail();
}
public function applyInternalEffects($object, $value) {
$object->setInvoiceEmail($value);
}
public function getTitle() {
$old = $this->getOldValue();
$new = $this->getNewValue();
if (strlen($old) && strlen($new)) {
return pht(
'%s updated the invoice email from %s to %s.',
$this->renderAuthor(),
$this->renderOldValue(),
$this->renderNewValue());
} else if (strlen($old)) {
return pht(
'%s removed the invoice email.',
$this->renderAuthor());
} else {
return pht(
'%s set the invoice email to %s.',
$this->renderAuthor(),
$this->renderNewValue());
}
}
public function getTitleForFeed() {
$old = $this->getOldValue();
$new = $this->getNewValue();
if (strlen($old) && strlen($new)) {
return pht(
'%s updated %s invoice email from %s to %s.',
$this->renderAuthor(),
$this->renderObject(),
$this->renderOldValue(),
$this->renderNewValue());
} else if (strlen($old)) {
return pht(
'%s removed the invoice email for %s.',
$this->renderAuthor(),
$this->renderObject());
} else {
return pht(
'%s set the invoice email for %s to %s.',
$this->renderAuthor(),
$this->renderObject(),
$this->renderNewValue());
}
}
public function getIcon() {
return 'fa-envelope';
}
public function validateTransactions($object, array $xactions) {
$errors = array();
$max_length = $object->getColumnMaximumByteLength('invoiceEmail');
foreach ($xactions as $xaction) {
if (strlen($xaction->getNewValue())) {
$email = new PhutilEmailAddress($xaction->getNewValue());
$domain = $email->getDomainName();
if (!strlen($domain)) {
$errors[] = $this->newInvalidError(
pht('Invoice email "%s" must be a valid email.',
$xaction->getNewValue()));
}
$new_value = $xaction->getNewValue();
$new_length = strlen($new_value);
if ($new_length > $max_length) {
$errors[] = $this->newInvalidError(
pht('The email can be no longer than %s characters.',
new PhutilNumber($max_length)));
}
}
}
return $errors;
}
}

View file

@ -0,0 +1,56 @@
<?php
final class PhortuneMerchantInvoiceFooterTransaction
extends PhortuneMerchantTransactionType {
const TRANSACTIONTYPE = 'merchant:invoicefooter';
public function generateOldValue($object) {
return $object->getInvoiceFooter();
}
public function applyInternalEffects($object, $value) {
$object->setInvoiceFooter($value);
}
public function getTitle() {
return pht(
'%s updated the merchant invoice footer.',
$this->renderAuthor());
}
public function getTitleForFeed() {
return pht(
'%s updated the merchant invoice footer for %s.',
$this->renderAuthor(),
$this->renderObject());
}
public function hasChangeDetailView() {
return true;
}
public function getMailDiffSectionHeader() {
return pht('CHANGES TO MERCHANT INVOICE FOOTER');
}
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;
}
}

View file

@ -0,0 +1,55 @@
<?php
final class PhortuneMerchantNameTransaction
extends PhortuneMerchantTransactionType {
const TRANSACTIONTYPE = 'merchant:name';
public function generateOldValue($object) {
return $object->getName();
}
public function applyInternalEffects($object, $value) {
$object->setName($value);
}
public function getTitle() {
return pht(
'%s renamed this merchant from %s to %s.',
$this->renderAuthor(),
$this->renderOldValue(),
$this->renderNewValue());
}
public function getTitleForFeed() {
return pht(
'%s renamed %s merchant name from %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('Merchants 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('The name can be no longer than %s characters.',
new PhutilNumber($max_length)));
}
}
return $errors;
}
}

View file

@ -0,0 +1,33 @@
<?php
final class PhortuneMerchantPictureTransaction
extends PhortuneMerchantTransactionType {
const TRANSACTIONTYPE = 'merchant:picture';
public function generateOldValue($object) {
return $object->getProfileImagePHID();
}
public function applyInternalEffects($object, $value) {
$object->setProfileImagePHID($value);
}
public function getTitle() {
return pht(
'%s updated the picture.',
$this->renderAuthor());
}
public function getTitleForFeed() {
return pht(
'%s updated the picture for merchant %s.',
$this->renderAuthor(),
$this->renderObject());
}
public function getIcon() {
return 'fa-camera-retro';
}
}

View file

@ -0,0 +1,4 @@
<?php
abstract class PhortuneMerchantTransactionType
extends PhabricatorModularTransactionType {}

View file

@ -1610,6 +1610,20 @@ final class PhabricatorUSEnglishTranslation
'%s accepted this revision as %s reviewer(s): %s.' => '%s accepted this revision as %s reviewer(s): %s.' =>
'%s accepted this revision as: %3$s.', '%s accepted this revision as: %3$s.',
'%s added %s merchant manager(s): %s.' => array(
array(
'%s added a merchant manager: %3$s.',
'%s added merchant managers: %3$s.',
),
),
'%s removed %s merchant manager(s): %s.' => array(
array(
'%s removed a merchant manager: %3$s.',
'%s removed merchant managers: %3$s.',
),
),
); );
} }