Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15456643
D17655.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
18 KB
Referenced Files
None
Subscribers
None
D17655.diff
View Options
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
@@ -4369,6 +4369,7 @@
'PhortuneMemberHasAccountEdgeType' => 'applications/phortune/edge/PhortuneMemberHasAccountEdgeType.php',
'PhortuneMemberHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneMemberHasMerchantEdgeType.php',
'PhortuneMerchant' => 'applications/phortune/storage/PhortuneMerchant.php',
+ 'PhortuneMerchantAddManagerController' => 'applications/phortune/controller/merchant/PhortuneMerchantAddManagerController.php',
'PhortuneMerchantCapability' => 'applications/phortune/capability/PhortuneMerchantCapability.php',
'PhortuneMerchantContactInfoTransaction' => 'applications/phortune/xaction/PhortuneMerchantContactInfoTransaction.php',
'PhortuneMerchantController' => 'applications/phortune/controller/merchant/PhortuneMerchantController.php',
@@ -4381,10 +4382,12 @@
'PhortuneMerchantInvoiceEmailTransaction' => 'applications/phortune/xaction/PhortuneMerchantInvoiceEmailTransaction.php',
'PhortuneMerchantInvoiceFooterTransaction' => 'applications/phortune/xaction/PhortuneMerchantInvoiceFooterTransaction.php',
'PhortuneMerchantListController' => 'applications/phortune/controller/merchant/PhortuneMerchantListController.php',
+ 'PhortuneMerchantManagerController' => 'applications/phortune/controller/merchant/PhortuneMerchantManagerController.php',
'PhortuneMerchantNameTransaction' => 'applications/phortune/xaction/PhortuneMerchantNameTransaction.php',
'PhortuneMerchantPHIDType' => 'applications/phortune/phid/PhortuneMerchantPHIDType.php',
'PhortuneMerchantPictureController' => 'applications/phortune/controller/merchant/PhortuneMerchantPictureController.php',
'PhortuneMerchantPictureTransaction' => 'applications/phortune/xaction/PhortuneMerchantPictureTransaction.php',
+ 'PhortuneMerchantProfileController' => 'applications/phortune/controller/merchant/PhortuneMerchantProfileController.php',
'PhortuneMerchantQuery' => 'applications/phortune/query/PhortuneMerchantQuery.php',
'PhortuneMerchantSearchEngine' => 'applications/phortune/query/PhortuneMerchantSearchEngine.php',
'PhortuneMerchantTransaction' => 'applications/phortune/storage/PhortuneMerchantTransaction.php',
@@ -9832,6 +9835,7 @@
'PhabricatorApplicationTransactionInterface',
'PhabricatorPolicyInterface',
),
+ 'PhortuneMerchantAddManagerController' => 'PhortuneController',
'PhortuneMerchantCapability' => 'PhabricatorPolicyCapability',
'PhortuneMerchantContactInfoTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantController' => 'PhortuneController',
@@ -9840,20 +9844,22 @@
'PhortuneMerchantEditEngine' => 'PhabricatorEditEngine',
'PhortuneMerchantEditor' => 'PhabricatorApplicationTransactionEditor',
'PhortuneMerchantHasMemberEdgeType' => 'PhabricatorEdgeType',
- 'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantController',
+ 'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantProfileController',
'PhortuneMerchantInvoiceEmailTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantInvoiceFooterTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantListController' => 'PhortuneMerchantController',
+ 'PhortuneMerchantManagerController' => 'PhortuneMerchantProfileController',
'PhortuneMerchantNameTransaction' => 'PhortuneMerchantTransactionType',
'PhortuneMerchantPHIDType' => 'PhabricatorPHIDType',
- 'PhortuneMerchantPictureController' => 'PhortuneMerchantController',
+ 'PhortuneMerchantPictureController' => 'PhortuneMerchantProfileController',
'PhortuneMerchantPictureTransaction' => 'PhortuneMerchantTransactionType',
+ 'PhortuneMerchantProfileController' => 'PhortuneController',
'PhortuneMerchantQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhortuneMerchantSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhortuneMerchantTransaction' => 'PhabricatorModularTransaction',
'PhortuneMerchantTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'PhortuneMerchantTransactionType' => 'PhabricatorModularTransactionType',
- 'PhortuneMerchantViewController' => 'PhortuneMerchantController',
+ 'PhortuneMerchantViewController' => 'PhortuneMerchantProfileController',
'PhortuneMonthYearExpiryControl' => 'AphrontFormControl',
'PhortuneOrderTableView' => 'AphrontView',
'PhortunePayPalPaymentProvider' => 'PhortunePaymentProvider',
diff --git a/src/applications/phortune/application/PhabricatorPhortuneApplication.php b/src/applications/phortune/application/PhabricatorPhortuneApplication.php
--- a/src/applications/phortune/application/PhabricatorPhortuneApplication.php
+++ b/src/applications/phortune/application/PhabricatorPhortuneApplication.php
@@ -88,6 +88,10 @@
=> 'PhortuneMerchantEditController',
'orders/(?P<merchantID>\d+)/(?:query/(?P<queryKey>[^/]+)/)?'
=> 'PhortuneCartListController',
+ 'manager/' => array(
+ '(?:(?P<id>\d+)/)?' => 'PhortuneMerchantManagerController',
+ 'add/(?:(?P<id>\d+)/)?' => 'PhortuneMerchantAddManagerController',
+ ),
'(?P<merchantID>\d+)/' => array(
'cart/(?P<id>\d+)/' => array(
'' => 'PhortuneCartViewController',
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantAddManagerController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantAddManagerController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantAddManagerController.php
@@ -0,0 +1,76 @@
+<?php
+
+final class PhortuneMerchantAddManagerController extends PhortuneController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $request->getViewer();
+ $id = $request->getURIData('id');
+
+ $merchant = id(new PhortuneMerchantQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->needProfileImage(true)
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ if (!$merchant) {
+ return new Aphront404Response();
+ }
+
+ $v_members = array();
+ $e_members = null;
+ $merchant_uri = $this->getApplicationURI("/merchant/manager/{$id}/");
+
+ if ($request->isFormPost()) {
+ $xactions = array();
+ $v_members = $request->getArr('memberPHIDs');
+ $type_edge = PhabricatorTransactions::TYPE_EDGE;
+
+ $xactions[] = id(new PhortuneMerchantTransaction())
+ ->setTransactionType($type_edge)
+ ->setMetadataValue(
+ 'edge:type',
+ PhortuneMerchantHasMemberEdgeType::EDGECONST)
+ ->setNewValue(
+ array(
+ '+' => array_fuse($v_members),
+ ));
+
+ $editor = id(new PhortuneMerchantEditor())
+ ->setActor($viewer)
+ ->setContentSourceFromRequest($request)
+ ->setContinueOnNoEffect(true);
+
+ try {
+ $editor->applyTransactions($merchant, $xactions);
+
+ return id(new AphrontRedirectResponse())->setURI($merchant_uri);
+ } catch (PhabricatorApplicationTransactionValidationException $ex) {
+ $validation_exception = $ex;
+ $e_members = $ex->getShortMessage($type_edge);
+ }
+ }
+
+ $form = id(new AphrontFormView())
+ ->setUser($viewer)
+ ->appendControl(
+ id(new AphrontFormTokenizerControl())
+ ->setDatasource(new PhabricatorPeopleDatasource())
+ ->setLabel(pht('Members'))
+ ->setName('memberPHIDs')
+ ->setValue($v_members)
+ ->setError($e_members));
+
+ return $this->newDialog()
+ ->setTitle(pht('Add New Manager'))
+ ->appendForm($form)
+ ->setWidth(AphrontDialogView::WIDTH_FORM)
+ ->addCancelButton($merchant_uri)
+ ->addSubmitButton(pht('Add Manager'));
+
+ }
+
+}
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php
--- a/src/applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php
@@ -1,7 +1,7 @@
<?php
final class PhortuneMerchantInvoiceCreateController
- extends PhortuneMerchantController {
+ extends PhortuneMerchantProfileController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getUser();
@@ -11,6 +11,7 @@
return new Aphront404Response();
}
+ $this->setMerchant($merchant);
$merchant_id = $merchant->getID();
$cancel_uri = $this->getApplicationURI("/merchant/{$merchant_id}/");
@@ -88,8 +89,7 @@
$title = pht('New Invoice');
$crumbs = $this->buildApplicationCrumbs();
- $crumbs->addTextCrumb($merchant->getName());
- $crumbs->setBorder(true);
+ $crumbs->addTextCrumb($title);
$v_title = $request->getStr('title');
$e_title = true;
@@ -245,9 +245,12 @@
$box,
));
+ $navigation = $this->buildSideNavView('orders');
+
return $this->newPage()
->setTitle($title)
->setCrumbs($crumbs)
+ ->setNavigation($navigation)
->appendChild($view);
}
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantManagerController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantManagerController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantManagerController.php
@@ -0,0 +1,91 @@
+<?php
+
+final class PhortuneMerchantManagerController
+ extends PhortuneMerchantProfileController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $request->getViewer();
+ $id = $request->getURIData('id');
+
+ $merchant = id(new PhortuneMerchantQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->needProfileImage(true)
+ ->executeOne();
+ if (!$merchant) {
+ return new Aphront404Response();
+ }
+
+ $this->setMerchant($merchant);
+ $header = $this->buildHeaderView();
+
+ $crumbs = $this->buildApplicationCrumbs();
+ $crumbs->addTextCrumb(pht('Managers'));
+
+ $header = $this->buildHeaderView();
+ $members = $this->buildMembersSection($merchant);
+
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setFooter(array(
+ $members,
+ ));
+
+ $navigation = $this->buildSideNavView('managers');
+
+ return $this->newPage()
+ ->setTitle(pht('Managers'))
+ ->setCrumbs($crumbs)
+ ->setNavigation($navigation)
+ ->appendChild($view);
+
+ }
+
+ private function buildMembersSection(PhortuneMerchant $merchant) {
+ $viewer = $this->getViewer();
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $merchant,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ $id = $merchant->getID();
+
+ $add = id(new PHUIButtonView())
+ ->setTag('a')
+ ->setText(pht('New Manager'))
+ ->setIcon('fa-plus')
+ ->setWorkflow(true)
+ ->setHref("/phortune/merchant/manager/add/{$id}/");
+
+ $header = id(new PHUIHeaderView())
+ ->setHeader(pht('Merchant Account Managers'))
+ ->addActionLink($add);
+
+ $list = id(new PHUIObjectItemListView())
+ ->setUser($viewer);
+
+ $member_phids = $merchant->getMemberPHIDs();
+ $handles = $viewer->loadHandles($member_phids);
+
+ foreach ($member_phids as $member_phid) {
+ $image_uri = $handles[$member_phid]->getImageURI();
+ $image_href = $handles[$member_phid]->getURI();
+ $person = $handles[$member_phid];
+
+ $member = id(new PHUIObjectItemView())
+ ->setImageURI($image_uri)
+ ->setHref($image_href)
+ ->setHeader($person->getFullName())
+ ->addAttribute(pht('Merchant Manager'));
+
+ $list->addItem($member);
+ }
+
+ return id(new PHUIObjectBoxView())
+ ->setHeader($header)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->setObjectList($list);
+ }
+
+}
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php
--- a/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php
@@ -1,7 +1,7 @@
<?php
final class PhortuneMerchantPictureController
- extends PhortuneMerchantController {
+ extends PhortuneMerchantProfileController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
@@ -21,6 +21,7 @@
return new Aphront404Response();
}
+ $this->setMerchant($merchant);
$uri = $merchant->getURI();
$supported_formats = PhabricatorFile::getTransformableImageFormats();
@@ -92,7 +93,7 @@
}
}
- $title = pht('Edit Merchant Picture');
+ $title = pht('Edit Logo');
$form = id(new PHUIFormLayoutView())
->setUser($viewer);
@@ -208,12 +209,10 @@
->setForm($upload_form);
$crumbs = $this->buildApplicationCrumbs();
- $crumbs->addTextCrumb($merchant->getName(), $uri);
- $crumbs->addTextCrumb(pht('Merchant Logo'));
- $crumbs->setBorder(true);
+ $crumbs->addTextCrumb(pht('Edit Logo'));
$header = id(new PHUIHeaderView())
- ->setHeader(pht('Edit Merchant Logo'))
+ ->setHeader(pht('Edit Logo'))
->setHeaderIcon('fa-camera');
$view = id(new PHUITwoColumnView())
@@ -223,9 +222,12 @@
$upload_box,
));
+ $navigation = $this->buildSideNavView();
+
return $this->newPage()
->setTitle($title)
->setCrumbs($crumbs)
+ ->setNavigation($navigation)
->appendChild(
array(
$view,
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantProfileController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantProfileController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantProfileController.php
@@ -0,0 +1,92 @@
+<?php
+
+abstract class PhortuneMerchantProfileController
+ extends PhortuneController {
+
+ private $merchant;
+
+ public function setMerchant(PhortuneMerchant $merchant) {
+ $this->merchant = $merchant;
+ return $this;
+ }
+
+ public function getMerchant() {
+ return $this->merchant;
+ }
+
+ public function buildApplicationMenu() {
+ return $this->buildSideNavView()->getMenu();
+ }
+
+ protected function buildHeaderView() {
+ $viewer = $this->getViewer();
+ $merchant = $this->getMerchant();
+ $title = $merchant->getName();
+
+ $header = id(new PHUIHeaderView())
+ ->setHeader($title)
+ ->setUser($viewer)
+ ->setPolicyObject($merchant)
+ ->setImage($merchant->getProfileImageURI());
+
+ return $header;
+ }
+
+ protected function buildApplicationCrumbs() {
+ $merchant = $this->getMerchant();
+ $id = $merchant->getID();
+ $merchant_uri = $this->getApplicationURI("/merchant/{$id}/");
+
+ $crumbs = parent::buildApplicationCrumbs();
+ $crumbs->addTextCrumb($merchant->getName(), $merchant_uri);
+ $crumbs->setBorder(true);
+ return $crumbs;
+ }
+
+ protected function buildSideNavView($filter = null) {
+ $viewer = $this->getViewer();
+ $merchant = $this->getMerchant();
+ $id = $merchant->getID();
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $merchant,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ $nav = id(new AphrontSideNavFilterView())
+ ->setBaseURI(new PhutilURI($this->getApplicationURI()));
+
+ $nav->addLabel(pht('Merchant'));
+
+ $nav->addFilter(
+ 'overview',
+ pht('Overview'),
+ $this->getApplicationURI("/merchant/{$id}/"),
+ 'fa-building-o');
+
+ if ($can_edit) {
+ $nav->addFilter(
+ 'orders',
+ pht('Orders'),
+ $this->getApplicationURI("merchant/orders/{$id}/"),
+ 'fa-retweet');
+
+ $nav->addFilter(
+ 'subscriptions',
+ pht('Subscriptions'),
+ $this->getApplicationURI("merchant/{$id}/subscription/"),
+ 'fa-shopping-cart');
+
+ $nav->addFilter(
+ 'managers',
+ pht('Managers'),
+ $this->getApplicationURI("/merchant/manager/{$id}/"),
+ 'fa-group');
+ }
+
+ $nav->selectFilter($filter);
+
+ return $nav;
+ }
+
+}
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantViewController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantViewController.php
--- a/src/applications/phortune/controller/merchant/PhortuneMerchantViewController.php
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantViewController.php
@@ -1,7 +1,7 @@
<?php
final class PhortuneMerchantViewController
- extends PhortuneMerchantController {
+ extends PhortuneMerchantProfileController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
@@ -16,21 +16,15 @@
return new Aphront404Response();
}
+ $this->setMerchant($merchant);
$crumbs = $this->buildApplicationCrumbs();
- $crumbs->addTextCrumb($merchant->getName());
- $crumbs->setBorder(true);
+ $header = $this->buildHeaderView();
$title = pht(
'Merchant %d %s',
$merchant->getID(),
$merchant->getName());
- $header = id(new PHUIHeaderView())
- ->setHeader($merchant->getName())
- ->setUser($viewer)
- ->setPolicyObject($merchant)
- ->setImage($merchant->getProfileImageURI());
-
$providers = id(new PhortunePaymentProviderConfigQuery())
->setViewer($viewer)
->withMerchantPHIDs(array($merchant->getPHID()))
@@ -48,6 +42,8 @@
new PhortuneMerchantTransactionQuery());
$timeline->setShouldTerminate(true);
+ $navigation = $this->buildSideNavView('overview');
+
$view = id(new PHUITwoColumnView())
->setHeader($header)
->setCurtain($curtain)
@@ -60,6 +56,7 @@
return $this->newPage()
->setTitle($title)
->setCrumbs($crumbs)
+ ->setNavigation($navigation)
->appendChild($view);
}
@@ -198,22 +195,6 @@
$curtain->addAction(
id(new PhabricatorActionView())
- ->setName(pht('View Orders'))
- ->setIcon('fa-shopping-cart')
- ->setHref($this->getApplicationURI("merchant/orders/{$id}/"))
- ->setDisabled(!$can_edit)
- ->setWorkflow(!$can_edit));
-
- $curtain->addAction(
- id(new PhabricatorActionView())
- ->setName(pht('View Subscriptions'))
- ->setIcon('fa-moon-o')
- ->setHref($this->getApplicationURI("merchant/{$id}/subscription/"))
- ->setDisabled(!$can_edit)
- ->setWorkflow(!$can_edit));
-
- $curtain->addAction(
- id(new PhabricatorActionView())
->setName(pht('New Invoice'))
->setIcon('fa-fax')
->setHref($this->getApplicationURI("merchant/{$id}/invoice/new/"))
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Mar 31, 10:58 AM (2 d, 10 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7728035
Default Alt Text
D17655.diff (18 KB)
Attached To
Mode
D17655: Update Phortune Merchant UI
Attached
Detach File
Event Timeline
Log In to Comment