diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -8,7 +8,7 @@ 'names' => array( 'core.pkg.css' => 'c2c68e64', - 'core.pkg.js' => '2b9e8efd', + 'core.pkg.js' => '80884e9b', 'darkconsole.pkg.js' => 'df001cab', 'differential.pkg.css' => '4a93db37', 'differential.pkg.js' => '7528cfc9', @@ -84,6 +84,7 @@ 'rsrc/css/application/pholio/pholio-inline-comments.css' => '8e545e49', 'rsrc/css/application/pholio/pholio.css' => '47dffb9c', 'rsrc/css/application/phortune/phortune-credit-card-form.css' => 'b25b4beb', + 'rsrc/css/application/phortune/phortune.css' => '6383389f', 'rsrc/css/application/phrequent/phrequent.css' => 'ffc185ad', 'rsrc/css/application/phriction/phriction-document-css.css' => '7d7f0071', 'rsrc/css/application/policy/policy-edit.css' => '05cca26a', @@ -216,7 +217,7 @@ 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js' => '503e17fd', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js' => '8b3fd187', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js' => '54f314a0', - 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js' => '210aa43b', + 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js' => 'fcba4ecc', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js' => '316b8fa1', 'rsrc/externals/raphael/g.raphael.js' => '40dde778', 'rsrc/externals/raphael/g.raphael.line.js' => '40da039e', @@ -308,6 +309,9 @@ 'rsrc/image/people/mckinley.png' => 'fb8f16ce', 'rsrc/image/people/taft.png' => 'd7bc402c', 'rsrc/image/people/washington.png' => '40dd301c', + 'rsrc/image/phortune/balanced.png' => 'c4069413', + 'rsrc/image/phortune/stripe.png' => 'f246dfad', + 'rsrc/image/phortune/test.png' => 'a13df550', 'rsrc/image/phrequent_active.png' => 'a466a8ed', 'rsrc/image/phrequent_inactive.png' => 'bfc15a69', 'rsrc/image/search-white.png' => '64cc0d45', @@ -357,7 +361,7 @@ 'rsrc/js/application/countdown/timer.js' => '361e3ed3', 'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '469c0d9e', 'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '82439934', - 'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '880fa5ac', + 'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '453c5375', 'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => 'd4eecc63', 'rsrc/js/application/differential/ChangesetViewManager.js' => 'd2907473', 'rsrc/js/application/differential/DifferentialInlineCommentEditor.js' => 'f2441746', @@ -564,7 +568,7 @@ 'javelin-behavior-dark-console' => '357b6e9b', 'javelin-behavior-dashboard-async-panel' => '469c0d9e', 'javelin-behavior-dashboard-move-panels' => '82439934', - 'javelin-behavior-dashboard-query-panel-select' => '880fa5ac', + 'javelin-behavior-dashboard-query-panel-select' => '453c5375', 'javelin-behavior-dashboard-tab-panel' => 'd4eecc63', 'javelin-behavior-device' => '03d6ed07', 'javelin-behavior-differential-add-reviewers-and-ccs' => 'e10f8e18', @@ -683,7 +687,7 @@ 'javelin-typeahead-normalizer' => 'aa93c7b0', 'javelin-typeahead-ondemand-source' => '8b3fd187', 'javelin-typeahead-preloaded-source' => '54f314a0', - 'javelin-typeahead-source' => '210aa43b', + 'javelin-typeahead-source' => 'fcba4ecc', 'javelin-typeahead-static-source' => '316b8fa1', 'javelin-uri' => '6eff08aa', 'javelin-util' => 'a23de73d', @@ -762,6 +766,7 @@ 'pholio-inline-comments-css' => '8e545e49', 'phortune-credit-card-form' => '2290aeef', 'phortune-credit-card-form-css' => 'b25b4beb', + 'phortune-css' => '6383389f', 'phrequent-css' => 'ffc185ad', 'phriction-document-css' => '7d7f0071', 'phui-action-header-view-css' => '83e2cc86', @@ -997,13 +1002,6 @@ 0 => 'javelin-util', 1 => 'javelin-magical-init', ), - '210aa43b' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead-normalizer', - ), '2290aeef' => array( 0 => 'javelin-install', @@ -1180,6 +1178,11 @@ 1 => 'javelin-dom', 2 => 'phabricator-prefab', ), + '453c5375' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + ), '469c0d9e' => array( 0 => 'javelin-behavior', @@ -1499,11 +1502,6 @@ array( 0 => 'javelin-install', ), - '880fa5ac' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - ), '88236f00' => array( 0 => 'javelin-behavior', @@ -2132,6 +2130,13 @@ 2 => 'javelin-vector', 3 => 'javelin-magical-init', ), + 'fcba4ecc' => + array( + 0 => 'javelin-install', + 1 => 'javelin-util', + 2 => 'javelin-dom', + 3 => 'javelin-typeahead-normalizer', + ), 42126667 => array( 0 => 'javelin-behavior', diff --git a/src/applications/phortune/application/PhabricatorApplicationPhortune.php b/src/applications/phortune/application/PhabricatorApplicationPhortune.php --- a/src/applications/phortune/application/PhabricatorApplicationPhortune.php +++ b/src/applications/phortune/application/PhabricatorApplicationPhortune.php @@ -41,9 +41,6 @@ '' => 'PhortuneAccountListController', 'edit/(?:(?P\d+)/)?' => 'PhortuneAccountEditController', ), - 'stripe/' => array( - 'testpaymentform/' => 'PhortuneStripeTestPaymentFormController', - ), 'product/' => array( '' => 'PhortuneProductListController', 'view/(?P\d+)/' => 'PhortuneProductViewController', diff --git a/src/applications/phortune/controller/PhortuneAccountBuyController.php b/src/applications/phortune/controller/PhortuneAccountBuyController.php --- a/src/applications/phortune/controller/PhortuneAccountBuyController.php +++ b/src/applications/phortune/controller/PhortuneAccountBuyController.php @@ -82,11 +82,17 @@ pht('Qty.'), pht('Total'), )); + $table->setColumnClasses( + array( + 'wide', + 'right', + 'right', + 'right', + )); - $panel = new AphrontPanelView(); - $panel->setNoBackground(true); - $panel->appendChild($table); - + $cart_box = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Your Cart')) + ->appendChild($table); $title = pht('Buy Stuff'); @@ -167,12 +173,19 @@ ->setValue($one_time_options)); } + $payment_box = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Choose Payment Method')) + ->appendChild($form) + ->appendChild($provider_form); + + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb($title); + return $this->buildApplicationPage( array( - $panel, - $form, - phutil_tag('br', array()), - $provider_form, + $crumbs, + $cart_box, + $payment_box, ), array( 'title' => $title, diff --git a/src/applications/phortune/controller/PhortuneAccountViewController.php b/src/applications/phortune/controller/PhortuneAccountViewController.php --- a/src/applications/phortune/controller/PhortuneAccountViewController.php +++ b/src/applications/phortune/controller/PhortuneAccountViewController.php @@ -79,20 +79,16 @@ $request = $this->getRequest(); $user = $request->getUser(); - $header = id(new PHUIHeaderView()) - ->setHeader(pht('Payment Methods')); - $id = $account->getID(); - $add_uri = $this->getApplicationURI($id.'/paymentmethod/edit/'); - $actions = id(new PhabricatorActionListView()) - ->setUser($user) - ->setObjectURI($request->getRequestURI()) - ->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Add Payment Method')) - ->setIcon('fa-plus') - ->setHref($add_uri)); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Payment Methods')) + ->addActionLink( + id(new PHUIButtonView()) + ->setTag('a') + ->setHref($this->getApplicationURI($id.'/paymentmethod/edit/')) + ->setText(pht('Add Payment Method')) + ->setIcon(id(new PHUIIconView())->setIconFont('fa-plus'))); $list = id(new PHUIObjectItemListView()) ->setUser($user) @@ -129,11 +125,9 @@ $list->addItem($item); } - return array( - $header, - $actions, - $list, - ); + return id(new PHUIObjectBoxView()) + ->setHeader($header) + ->appendChild($list); } private function buildPurchaseHistorySection(PhortuneAccount $account) { @@ -143,10 +137,8 @@ $header = id(new PHUIHeaderView()) ->setHeader(pht('Purchase History')); - return array( - $header, - - ); + return id(new PHUIObjectBoxView()) + ->setHeader($header); } private function buildAccountHistorySection(PhortuneAccount $account) { @@ -170,8 +162,11 @@ ->setTransactions($xactions) ->setMarkupEngine($engine); + $box = id(new PHUIObjectBoxView()) + ->setHeader($header); + return array( - $header, + $box, $xaction_view, ); } diff --git a/src/applications/phortune/controller/PhortunePaymentMethodEditController.php b/src/applications/phortune/controller/PhortunePaymentMethodEditController.php --- a/src/applications/phortune/controller/PhortunePaymentMethodEditController.php +++ b/src/applications/phortune/controller/PhortunePaymentMethodEditController.php @@ -37,7 +37,20 @@ foreach ($providers as $provider) { $choices[] = $this->renderSelectProvider($provider); } - return $this->buildResponse($choices, $account_uri); + + $content = phutil_tag( + 'div', + array( + 'class' => 'phortune-payment-method-list', + ), + $choices); + + return $this->newDialog() + ->setRenderDialogAsDiv(true) + ->setTitle(pht('Add Payment Method')) + ->appendParagraph(pht('Choose a payment method to add:')) + ->appendChild($content) + ->addCancelButton($account_uri); } $provider = $providers[$provider_key]; @@ -111,14 +124,21 @@ ->setValue(pht('Add Payment Method')) ->addCancelButton($account_uri)); - if ($errors) { - $errors = id(new AphrontErrorView()) - ->setErrors($errors); - } + $box = id(new PHUIObjectBoxView()) + ->setHeaderText($provider->getPaymentMethodDescription()) + ->setForm($form); + + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb(pht('Add Payment Method')); - return $this->buildResponse( - array($errors, $form), - $account_uri); + return $this->buildApplicationPage( + array( + $crumbs, + $box, + ), + array( + 'title' => $provider->getPaymentMethodDescription(), + )); } private function renderSelectProvider( @@ -128,20 +148,21 @@ $user = $request->getUser(); $description = $provider->getPaymentMethodDescription(); - $icon = $provider->getPaymentMethodIcon(); + $icon_uri = $provider->getPaymentMethodIcon(); $details = $provider->getPaymentMethodProviderDescription(); - $button = phutil_tag( - 'button', - array( - 'class' => 'grey', - ), - array( - $description, - phutil_tag('br'), - $icon, - $details, - )); + $this->requireResource('phortune-css'); + + $icon = id(new PHUIIconView()) + ->setImage($icon_uri) + ->addClass('phortune-payment-icon'); + + $button = id(new PHUIButtonView()) + ->setSize(PHUIButtonView::BIG) + ->setColor(PHUIButtonView::GREY) + ->setIcon($icon) + ->setText($description) + ->setSubtext($details); $form = id(new AphrontFormView()) ->setUser($user) @@ -151,28 +172,6 @@ return $form; } - private function buildResponse($content, $account_uri) { - $request = $this->getRequest(); - - $title = pht('Add Payment Method'); - $header = id(new PHUIHeaderView()) - ->setHeader($title); - - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb(pht('Account'), $account_uri); - $crumbs->addTextCrumb(pht('Payment Methods'), $request->getRequestURI()); - - return $this->buildApplicationPage( - array( - $crumbs, - $header, - $content, - ), - array( - 'title' => $title, - )); - } - private function processClientErrors( PhortunePaymentProvider $provider, $client_errors_raw) { diff --git a/src/applications/phortune/controller/PhortuneProductListController.php b/src/applications/phortune/controller/PhortuneProductListController.php --- a/src/applications/phortune/controller/PhortuneProductListController.php +++ b/src/applications/phortune/controller/PhortuneProductListController.php @@ -24,9 +24,6 @@ ->setHref($this->getApplicationURI('product/edit/')) ->setIcon('fa-plus-square')); - $header = id(new PHUIHeaderView()) - ->setHeader(pht('Product List')); - $product_list = id(new PHUIObjectItemListView()) ->setUser($user) ->setNoDataString(pht('No products.')); @@ -51,7 +48,6 @@ return $this->buildApplicationPage( array( $crumbs, - $header, $product_list, $pager, ), diff --git a/webroot/rsrc/css/application/phortune/phortune.css b/webroot/rsrc/css/application/phortune/phortune.css new file mode 100644 --- /dev/null +++ b/webroot/rsrc/css/application/phortune/phortune.css @@ -0,0 +1,17 @@ +/** + * @provides phortune-css + */ + +.phortune-payment-icon { + width: 34px; + height: 34px; +} + +.phortune-payment-method-list { + margin: 8px 24px 0; +} + +.phortune-payment-method-list button { + margin: 4px 0; + width: 100%; +} diff --git a/webroot/rsrc/image/phortune/balanced.png b/webroot/rsrc/image/phortune/balanced.png new file mode 100644 index 0000000000000000000000000000000000000000..ef94cd3ca8fe2abacec5a0eff964b0fb9ca2c20a GIT binary patch literal 2765 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 literal 0 Hc$@I4}&?F`J9zw2bL&>b?Ri< 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 literal 0 Hc$@I4}&?F`J9zw2bL&>b?Ri< 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 literal 0 Hc$@I4}&?F`J9zw2bL&>b?Ri< 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 literal 0 Hc$@I4}&?F`J9zw2bL&>b?Ri< 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 literal 0 Hc$@