mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-28 00:10:57 +01:00
Smooth out Phortune purchase completion flow
Summary: Ref T2787. Currently, we dump the user back into the application. Instead, give them a confirmation screen and then let them continue. Also fix a couple of unit tests I adjusted the underlying behavior of somewhat-recently in libphutil. Test Plan: {F215498} Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T2787 Differential Revision: https://secure.phabricator.com/D10672
This commit is contained in:
parent
f41ae2228a
commit
f53861aa9d
9 changed files with 58 additions and 21 deletions
src
applications
fund/phortune
phortune
view
|
@ -81,4 +81,8 @@ final class FundBackerCart extends PhortuneCartImplementation {
|
||||||
return '/'.$this->getInitiative()->getMonogram();
|
return '/'.$this->getInitiative()->getMonogram();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getDoneActionName(PhortuneCart $cart) {
|
||||||
|
return pht('Return to Initiative');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,10 @@ abstract class PhortuneCartImplementation {
|
||||||
abstract public function getCancelURI(PhortuneCart $cart);
|
abstract public function getCancelURI(PhortuneCart $cart);
|
||||||
abstract public function getDoneURI(PhortuneCart $cart);
|
abstract public function getDoneURI(PhortuneCart $cart);
|
||||||
|
|
||||||
|
public function getDoneActionName(PhortuneCart $cart) {
|
||||||
|
return pht('Return to Application');
|
||||||
|
}
|
||||||
|
|
||||||
public function assertCanCancelOrder(PhortuneCart $cart) {
|
public function assertCanCancelOrder(PhortuneCart $cart) {
|
||||||
switch ($cart->getStatus()) {
|
switch ($cart->getStatus()) {
|
||||||
case PhortuneCart::STATUS_PURCHASED:
|
case PhortuneCart::STATUS_PURCHASED:
|
||||||
|
|
|
@ -102,7 +102,7 @@ final class PhortuneCartCheckoutController
|
||||||
|
|
||||||
$cart->didApplyCharge($charge);
|
$cart->didApplyCharge($charge);
|
||||||
|
|
||||||
$done_uri = $cart->getDoneURI();
|
$done_uri = $cart->getCheckoutURI();
|
||||||
return id(new AphrontRedirectResponse())->setURI($done_uri);
|
return id(new AphrontRedirectResponse())->setURI($done_uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ final class PhortuneCartViewController
|
||||||
PhabricatorPolicyCapability::CAN_EDIT);
|
PhabricatorPolicyCapability::CAN_EDIT);
|
||||||
|
|
||||||
$errors = array();
|
$errors = array();
|
||||||
|
$error_view = null;
|
||||||
$resume_uri = null;
|
$resume_uri = null;
|
||||||
switch ($cart->getStatus()) {
|
switch ($cart->getStatus()) {
|
||||||
case PhortuneCart::STATUS_PURCHASING:
|
case PhortuneCart::STATUS_PURCHASING:
|
||||||
|
@ -71,6 +72,12 @@ final class PhortuneCartViewController
|
||||||
phutil_tag('strong', array(), pht('Update Status')));
|
phutil_tag('strong', array(), pht('Update Status')));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PhortuneCart::STATUS_PURCHASED:
|
||||||
|
$error_view = id(new AphrontErrorView())
|
||||||
|
->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
|
||||||
|
->appendChild(pht('This purchase has been completed.'));
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$properties = $this->buildPropertyListView($cart);
|
$properties = $this->buildPropertyListView($cart);
|
||||||
|
@ -85,12 +92,30 @@ final class PhortuneCartViewController
|
||||||
->setUser($viewer)
|
->setUser($viewer)
|
||||||
->setHeader(pht('Order Detail'));
|
->setHeader(pht('Order Detail'));
|
||||||
|
|
||||||
|
if ($cart->getStatus() == PhortuneCart::STATUS_PURCHASED) {
|
||||||
|
$done_uri = $cart->getDoneURI();
|
||||||
|
if ($done_uri) {
|
||||||
|
$header->addActionLink(
|
||||||
|
id(new PHUIButtonView())
|
||||||
|
->setTag('a')
|
||||||
|
->setHref($done_uri)
|
||||||
|
->setIcon(id(new PHUIIconView())
|
||||||
|
->setIconFont('fa-check-square green'))
|
||||||
|
->setText($cart->getDoneActionName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$cart_box = id(new PHUIObjectBoxView())
|
$cart_box = id(new PHUIObjectBoxView())
|
||||||
->setHeader($header)
|
->setHeader($header)
|
||||||
->setFormErrors($errors)
|
|
||||||
->appendChild($properties)
|
->appendChild($properties)
|
||||||
->appendChild($cart_table);
|
->appendChild($cart_table);
|
||||||
|
|
||||||
|
if ($errors) {
|
||||||
|
$cart_box->setFormErrors($errors);
|
||||||
|
} else if ($error_view) {
|
||||||
|
$cart_box->setErrorView($error_view);
|
||||||
|
}
|
||||||
|
|
||||||
$charges = id(new PhortuneChargeQuery())
|
$charges = id(new PhortuneChargeQuery())
|
||||||
->setViewer($viewer)
|
->setViewer($viewer)
|
||||||
->withCartPHIDs(array($cart->getPHID()))
|
->withCartPHIDs(array($cart->getPHID()))
|
||||||
|
|
|
@ -450,7 +450,7 @@ final class PhortunePayPalPaymentProvider extends PhortunePaymentProvider {
|
||||||
if ($success) {
|
if ($success) {
|
||||||
$cart->didApplyCharge($charge);
|
$cart->didApplyCharge($charge);
|
||||||
$response = id(new AphrontRedirectResponse())->setURI(
|
$response = id(new AphrontRedirectResponse())->setURI(
|
||||||
$cart->getDoneURI());
|
$cart->getCheckoutURI());
|
||||||
} else if ($hold) {
|
} else if ($hold) {
|
||||||
$cart->didHoldCharge($charge);
|
$cart->didHoldCharge($charge);
|
||||||
|
|
||||||
|
|
|
@ -349,7 +349,7 @@ final class PhortuneWePayPaymentProvider extends PhortunePaymentProvider {
|
||||||
$cart->didApplyCharge($charge);
|
$cart->didApplyCharge($charge);
|
||||||
|
|
||||||
$response = id(new AphrontRedirectResponse())->setURI(
|
$response = id(new AphrontRedirectResponse())->setURI(
|
||||||
$cart->getDoneURI());
|
$cart->getCheckoutURI());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// It's not clear if we can ever get here on the web workflow,
|
// It's not clear if we can ever get here on the web workflow,
|
||||||
|
|
|
@ -332,6 +332,10 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
return $this->getImplementation()->getDoneURI($this);
|
return $this->getImplementation()->getDoneURI($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getDoneActionName() {
|
||||||
|
return $this->getImplementation()->getDoneActionName($this);
|
||||||
|
}
|
||||||
|
|
||||||
public function getCancelURI() {
|
public function getCancelURI() {
|
||||||
return $this->getImplementation()->getCancelURI($this);
|
return $this->getImplementation()->getCancelURI($this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,11 +8,11 @@ final class PhabricatorUnitsTestCase extends PhabricatorTestCase {
|
||||||
public function testByteFormatting() {
|
public function testByteFormatting() {
|
||||||
$tests = array(
|
$tests = array(
|
||||||
1 => '1 B',
|
1 => '1 B',
|
||||||
1000 => '1 KB',
|
1024 => '1 KB',
|
||||||
1000000 => '1 MB',
|
1024 * 1024 => '1 MB',
|
||||||
10000000 => '10 MB',
|
10 * 1024 * 1024 => '10 MB',
|
||||||
100000000 => '100 MB',
|
100 * 1024 * 1024 => '100 MB',
|
||||||
1000000000 => '1 GB',
|
1024 * 1024 * 1024 => '1 GB',
|
||||||
999 => '999 B',
|
999 => '999 B',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -27,16 +27,16 @@ final class PhabricatorUnitsTestCase extends PhabricatorTestCase {
|
||||||
public function testByteParsing() {
|
public function testByteParsing() {
|
||||||
$tests = array(
|
$tests = array(
|
||||||
'1' => 1,
|
'1' => 1,
|
||||||
'1k' => 1000,
|
'1k' => 1024,
|
||||||
'1K' => 1000,
|
'1K' => 1024,
|
||||||
'1kB' => 1000,
|
'1kB' => 1024,
|
||||||
'1Kb' => 1000,
|
'1Kb' => 1024,
|
||||||
'1KB' => 1000,
|
'1KB' => 1024,
|
||||||
'1MB' => 1000000,
|
'1MB' => 1024 * 1024,
|
||||||
'1GB' => 1000000000,
|
'1GB' => 1024 * 1024 * 1024,
|
||||||
'1.5M' => 1500000,
|
'1.5M' => (int)(1024 * 1024 * 1.5),
|
||||||
'1 000' => 1000,
|
'1 000' => 1000,
|
||||||
'1,234.56 KB' => 1234560,
|
'1,234.56 KB' => (int)(1024 * 1234.56),
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($tests as $input => $expect) {
|
foreach ($tests as $input => $expect) {
|
||||||
|
|
|
@ -85,7 +85,7 @@ final class PHUIObjectBoxView extends AphrontView {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setFormErrors(array $errors, $title = null) {
|
public function setFormErrors(array $errors, $title = null) {
|
||||||
if (nonempty($errors)) {
|
if ($errors) {
|
||||||
$this->formErrors = id(new AphrontErrorView())
|
$this->formErrors = id(new AphrontErrorView())
|
||||||
->setTitle($title)
|
->setTitle($title)
|
||||||
->setErrors($errors);
|
->setErrors($errors);
|
||||||
|
|
Loading…
Reference in a new issue