diff --git a/resources/builtin/merchant.png b/resources/builtin/merchant.png new file mode 100644 index 0000000000000000000000000000000000000000..c8381eb00fd59eff93fb0a28242ad81f360331d4 GIT binary patch literal 5344 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 Jt&VH-{{jDmc#;4B literal 0 Hc$@ 'applications/phortune/controller/PhortuneMerchantInvoiceCreateController.php', 'PhortuneMerchantListController' => 'applications/phortune/controller/PhortuneMerchantListController.php', 'PhortuneMerchantPHIDType' => 'applications/phortune/phid/PhortuneMerchantPHIDType.php', + 'PhortuneMerchantPictureController' => 'applications/phortune/controller/PhortuneMerchantPictureController.php', 'PhortuneMerchantQuery' => 'applications/phortune/query/PhortuneMerchantQuery.php', 'PhortuneMerchantSearchEngine' => 'applications/phortune/query/PhortuneMerchantSearchEngine.php', 'PhortuneMerchantTransaction' => 'applications/phortune/storage/PhortuneMerchantTransaction.php', @@ -9419,6 +9420,7 @@ 'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantController', 'PhortuneMerchantListController' => 'PhortuneMerchantController', 'PhortuneMerchantPHIDType' => 'PhabricatorPHIDType', + 'PhortuneMerchantPictureController' => 'PhortuneMerchantController', 'PhortuneMerchantQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhortuneMerchantSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhortuneMerchantTransaction' => 'PhabricatorApplicationTransaction', diff --git a/src/applications/files/transform/.PhabricatorFileThumbnailTransform.php.swp b/src/applications/files/transform/.PhabricatorFileThumbnailTransform.php.swp new file mode 100644 index 0000000000000000000000000000000000000000..9e9f426fe07f2ea2aef7426a5b2d15152417467a GIT binary patch literal 1024 zc$`Zz$V<%2S1{5u)iY*50xP5$7?Lv*Qy7Q<1sRFSx+$q;dO7*Yi8;8{6&EGzCl(as zWF{w;Waj4;>!)Srq!#O!6eZ>rr{x#r>IY;bCKZ8X^NZYoQXv_oxk-76nK>aa6?z33 P1;n^$6pVsVKnwr?TE8Z! literal 0 Hc$@ array( '(?:query/(?P[^/]+)/)?' => 'PhortuneMerchantListController', + 'picture/(?:(?P\d+)/)?' => 'PhortuneMerchantPictureController', 'edit/(?:(?P\d+)/)?' => 'PhortuneMerchantEditController', 'orders/(?P\d+)/(?:query/(?P[^/]+)/)?' => 'PhortuneCartListController', diff --git a/src/applications/phortune/controller/PhortuneMerchantPictureController.php b/src/applications/phortune/controller/PhortuneMerchantPictureController.php new file mode 100644 --- /dev/null +++ b/src/applications/phortune/controller/PhortuneMerchantPictureController.php @@ -0,0 +1,234 @@ +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(); + } + + $uri = $merchant->getViewURI(); + + $supported_formats = PhabricatorFile::getTransformableImageFormats(); + $e_file = true; + $errors = array(); + + if ($request->isFormPost()) { + $phid = $request->getStr('phid'); + $is_default = false; + if ($phid == PhabricatorPHIDConstants::PHID_VOID) { + $phid = null; + $is_default = true; + } else if ($phid) { + $file = id(new PhabricatorFileQuery()) + ->setViewer($viewer) + ->withPHIDs(array($phid)) + ->executeOne(); + } else { + if ($request->getFileExists('picture')) { + $file = PhabricatorFile::newFromPHPUpload( + $_FILES['picture'], + array( + 'authorPHID' => $viewer->getPHID(), + 'canCDN' => true, + )); + } else { + $e_file = pht('Required'); + $errors[] = pht( + 'You must choose a file when uploading a merchant logo.'); + } + } + + if (!$errors && !$is_default) { + if (!$file->isTransformableImage()) { + $e_file = pht('Not Supported'); + $errors[] = pht( + 'This server only supports these image formats: %s.', + implode(', ', $supported_formats)); + } else { + $xform = PhabricatorFileTransform::getTransformByKey( + PhabricatorFileThumbnailTransform::TRANSFORM_PROFILE); + $xformed = $xform->executeTransform($file); + } + } + + if (!$errors) { + if ($is_default) { + $new_value = null; + } else { + $xformed->attachToObject($merchant->getPHID()); + $new_value = $xformed->getPHID(); + } + + $xactions = array(); + $xactions[] = id(new PhortuneMerchantTransaction()) + ->setTransactionType(PhortuneMerchantTransaction::TYPE_PICTURE) + ->setNewValue($new_value); + + $editor = id(new PhortuneMerchantEditor()) + ->setActor($viewer) + ->setContentSourceFromRequest($request) + ->setContinueOnMissingFields(true) + ->setContinueOnNoEffect(true); + + $editor->applyTransactions($merchant, $xactions); + + return id(new AphrontRedirectResponse())->setURI($uri); + } + } + + $title = pht('Edit Merchant Picture'); + + $form = id(new PHUIFormLayoutView()) + ->setUser($viewer); + + $default_image = PhabricatorFile::loadBuiltin($viewer, 'merchant.png'); + + $images = array(); + + $current = $merchant->getProfileImagePHID(); + $has_current = false; + if ($current) { + $file = id(new PhabricatorFileQuery()) + ->setViewer($viewer) + ->withPHIDs(array($current)) + ->executeOne(); + if ($file) { + if ($file->isTransformableImage()) { + $has_current = true; + $images[$current] = array( + 'uri' => $file->getBestURI(), + 'tip' => pht('Current Picture'), + ); + } + } + } + + $images[PhabricatorPHIDConstants::PHID_VOID] = array( + 'uri' => $default_image->getBestURI(), + 'tip' => pht('Default Picture'), + ); + + require_celerity_resource('people-profile-css'); + Javelin::initBehavior('phabricator-tooltips', array()); + + $buttons = array(); + foreach ($images as $phid => $spec) { + $button = javelin_tag( + 'button', + array( + 'class' => 'grey profile-image-button', + 'sigil' => 'has-tooltip', + 'meta' => array( + 'tip' => $spec['tip'], + 'size' => 300, + ), + ), + phutil_tag( + 'img', + array( + 'height' => 50, + 'width' => 50, + 'src' => $spec['uri'], + ))); + + $button = array( + phutil_tag( + 'input', + array( + 'type' => 'hidden', + 'name' => 'phid', + 'value' => $phid, + )), + $button, + ); + + $button = phabricator_form( + $viewer, + array( + 'class' => 'profile-image-form', + 'method' => 'POST', + ), + $button); + + $buttons[] = $button; + } + + if ($has_current) { + $form->appendChild( + id(new AphrontFormMarkupControl()) + ->setLabel(pht('Current Logo')) + ->setValue(array_shift($buttons))); + } + + $form->appendChild( + id(new AphrontFormMarkupControl()) + ->setLabel(pht('Use Logo')) + ->setValue($buttons)); + + $form_box = id(new PHUIObjectBoxView()) + ->setHeaderText($title) + ->setFormErrors($errors) + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) + ->setForm($form); + + $upload_form = id(new AphrontFormView()) + ->setUser($viewer) + ->setEncType('multipart/form-data') + ->appendChild( + id(new AphrontFormFileControl()) + ->setName('picture') + ->setLabel(pht('Upload Logo')) + ->setError($e_file) + ->setCaption( + pht('Supported formats: %s', implode(', ', $supported_formats)))) + ->appendChild( + id(new AphrontFormSubmitControl()) + ->addCancelButton($uri) + ->setValue(pht('Upload Logo'))); + + $upload_box = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Upload New Logo')) + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) + ->setForm($upload_form); + + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb($merchant->getName(), $uri); + $crumbs->addTextCrumb(pht('Merchant Logo')); + $crumbs->setBorder(true); + + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Edit Merchant Logo')) + ->setHeaderIcon('fa-camera'); + + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter(array( + $form_box, + $upload_box, + )); + + return $this->newPage() + ->setTitle($title) + ->setCrumbs($crumbs) + ->appendChild( + array( + $view, + )); + + } +} diff --git a/src/applications/phortune/controller/PhortuneMerchantViewController.php b/src/applications/phortune/controller/PhortuneMerchantViewController.php --- a/src/applications/phortune/controller/PhortuneMerchantViewController.php +++ b/src/applications/phortune/controller/PhortuneMerchantViewController.php @@ -10,6 +10,7 @@ $merchant = id(new PhortuneMerchantQuery()) ->setViewer($viewer) ->withIDs(array($id)) + ->needProfileImage(true) ->executeOne(); if (!$merchant) { return new Aphront404Response(); @@ -28,7 +29,7 @@ ->setHeader($merchant->getName()) ->setUser($viewer) ->setPolicyObject($merchant) - ->setHeaderIcon('fa-bank'); + ->setImage($merchant->getProfileImageURI()); $providers = id(new PhortunePaymentProviderConfigQuery()) ->setViewer($viewer) @@ -173,6 +174,14 @@ $curtain->addAction( id(new PhabricatorActionView()) + ->setName(pht('Edit Logo')) + ->setIcon('fa-camera') + ->setDisabled(!$can_edit) + ->setWorkflow(!$can_edit) + ->setHref($this->getApplicationURI("merchant/picture/{$id}/"))); + + $curtain->addAction( + id(new PhabricatorActionView()) ->setName(pht('View Orders')) ->setIcon('fa-shopping-cart') ->setHref($this->getApplicationURI("merchant/orders/{$id}/")) diff --git a/src/applications/phortune/editor/PhortuneMerchantEditor.php b/src/applications/phortune/editor/PhortuneMerchantEditor.php --- a/src/applications/phortune/editor/PhortuneMerchantEditor.php +++ b/src/applications/phortune/editor/PhortuneMerchantEditor.php @@ -17,6 +17,7 @@ $types[] = PhortuneMerchantTransaction::TYPE_NAME; $types[] = PhortuneMerchantTransaction::TYPE_DESCRIPTION; $types[] = PhortuneMerchantTransaction::TYPE_CONTACTINFO; + $types[] = PhortuneMerchantTransaction::TYPE_PICTURE; $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_EDGE; @@ -33,6 +34,8 @@ return $object->getDescription(); case PhortuneMerchantTransaction::TYPE_CONTACTINFO: return $object->getContactInfo(); + case PhortuneMerchantTransaction::TYPE_PICTURE: + return $object->getProfileImagePHID(); } return parent::getCustomTransactionOldValue($object, $xaction); @@ -46,6 +49,7 @@ case PhortuneMerchantTransaction::TYPE_NAME: case PhortuneMerchantTransaction::TYPE_DESCRIPTION: case PhortuneMerchantTransaction::TYPE_CONTACTINFO: + case PhortuneMerchantTransaction::TYPE_PICTURE: return $xaction->getNewValue(); } @@ -66,6 +70,9 @@ case PhortuneMerchantTransaction::TYPE_CONTACTINFO: $object->setContactInfo($xaction->getNewValue()); return; + case PhortuneMerchantTransaction::TYPE_PICTURE: + $object->setProfileImagePHID($xaction->getNewValue()); + return; } return parent::applyCustomInternalTransaction($object, $xaction); @@ -79,6 +86,7 @@ case PhortuneMerchantTransaction::TYPE_NAME: case PhortuneMerchantTransaction::TYPE_DESCRIPTION: case PhortuneMerchantTransaction::TYPE_CONTACTINFO: + case PhortuneMerchantTransaction::TYPE_PICTURE: return; } diff --git a/src/applications/phortune/query/PhortuneMerchantQuery.php b/src/applications/phortune/query/PhortuneMerchantQuery.php --- a/src/applications/phortune/query/PhortuneMerchantQuery.php +++ b/src/applications/phortune/query/PhortuneMerchantQuery.php @@ -6,6 +6,7 @@ private $ids; private $phids; private $memberPHIDs; + private $needProfileImage; public function withIDs(array $ids) { $this->ids = $ids; @@ -22,6 +23,11 @@ return $this; } + public function needProfileImage($need) { + $this->needProfileImage = $need; + return $this; + } + protected function loadPage() { $table = new PhortuneMerchant(); $conn = $table->establishConnection('r'); @@ -50,6 +56,35 @@ $merchant->attachMemberPHIDs($member_phids); } + if ($this->needProfileImage) { + $default = null; + $file_phids = mpull($merchants, 'getProfileImagePHID'); + $file_phids = array_filter($file_phids); + if ($file_phids) { + $files = id(new PhabricatorFileQuery()) + ->setParentQuery($this) + ->setViewer($this->getViewer()) + ->withPHIDs($file_phids) + ->execute(); + $files = mpull($files, null, 'getPHID'); + } else { + $files = array(); + } + + foreach ($merchants as $merchant) { + $file = idx($files, $merchant->getProfileImagePHID()); + if (!$file) { + if (!$default) { + $default = PhabricatorFile::loadBuiltin( + $this->getViewer(), + 'merchant.png'); + } + $file = $default; + } + $merchant->attachProfileImageFile($file); + } + } + return $merchants; } diff --git a/src/applications/phortune/query/PhortuneMerchantSearchEngine.php b/src/applications/phortune/query/PhortuneMerchantSearchEngine.php --- a/src/applications/phortune/query/PhortuneMerchantSearchEngine.php +++ b/src/applications/phortune/query/PhortuneMerchantSearchEngine.php @@ -18,7 +18,8 @@ } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { - $query = id(new PhortuneMerchantQuery()); + $query = id(new PhortuneMerchantQuery()) + ->needProfileImage(true); return $query; } @@ -74,7 +75,7 @@ ->setHeader($merchant->getName()) ->setHref('/phortune/merchant/'.$merchant->getID().'/') ->setObject($merchant) - ->setImageIcon('fa-bank'); + ->setImageURI($merchant->getProfileImageURI()); $list->addItem($item); } diff --git a/src/applications/phortune/storage/PhortuneMerchant.php b/src/applications/phortune/storage/PhortuneMerchant.php --- a/src/applications/phortune/storage/PhortuneMerchant.php +++ b/src/applications/phortune/storage/PhortuneMerchant.php @@ -9,8 +9,10 @@ protected $viewPolicy; protected $description; protected $contactInfo; + protected $profileImagePHID; private $memberPHIDs = self::ATTACHABLE; + private $profileImageFile = self::ATTACHABLE; public static function initializeNewMerchant(PhabricatorUser $actor) { return id(new PhortuneMerchant()) @@ -25,6 +27,7 @@ 'name' => 'text255', 'description' => 'text', 'contactInfo' => 'text', + 'profileImagePHID' => 'phid?', ), ) + parent::getConfiguration(); } @@ -43,6 +46,23 @@ return $this; } + public function getViewURI() { + return '/phortune/merchant/'.$this->getID().'/'; + } + + public function getProfileImageURI() { + return $this->getProfileImageFile()->getBestURI(); + } + + public function attachProfileImageFile(PhabricatorFile $file) { + $this->profileImageFile = $file; + return $this; + } + + public function getProfileImageFile() { + return $this->assertAttached($this->profileImageFile); + } + /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/phortune/storage/PhortuneMerchantTransaction.php b/src/applications/phortune/storage/PhortuneMerchantTransaction.php --- a/src/applications/phortune/storage/PhortuneMerchantTransaction.php +++ b/src/applications/phortune/storage/PhortuneMerchantTransaction.php @@ -6,6 +6,7 @@ const TYPE_NAME = 'merchant:name'; const TYPE_DESCRIPTION = 'merchant:description'; const TYPE_CONTACTINFO = 'merchant:contactinfo'; + const TYPE_PICTURE = 'merchant:picture'; public function getApplicationName() { return 'phortune';