Ejemplo n.º 1
0
 protected function loadPage()
 {
     $table = new FundInitiative();
     $conn_r = $table->establishConnection('r');
     $rows = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r));
     return $table->loadAllFromArray($rows);
 }
 private function buildCommentForm(FundInitiative $initiative)
 {
     $viewer = $this->getViewer();
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
     $add_comment_header = $is_serious ? pht('Add Comment') : pht('Add Liquidity');
     $draft = PhabricatorDraft::newFromUserAndKey($viewer, $initiative->getPHID());
     return id(new PhabricatorApplicationTransactionCommentView())->setUser($viewer)->setObjectPHID($initiative->getPHID())->setDraft($draft)->setHeaderText($add_comment_header)->setAction($this->getApplicationURI('/comment/' . $initiative->getID() . '/'))->setSubmitButtonName(pht('Add Comment'));
 }
 private function buildActionListView(FundInitiative $initiative)
 {
     $viewer = $this->getRequest()->getUser();
     $id = $initiative->getID();
     $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $initiative, PhabricatorPolicyCapability::CAN_EDIT);
     $view = id(new PhabricatorActionListView())->setUser($viewer)->setObject($initiative);
     $view->addAction(id(new PhabricatorActionView())->setName(pht('Edit Initiative'))->setIcon('fa-pencil')->setDisabled(!$can_edit)->setWorkflow(!$can_edit)->setHref($this->getApplicationURI("/edit/{$id}/")));
     if ($initiative->isClosed()) {
         $close_name = pht('Reopen Initiative');
         $close_icon = 'fa-check';
     } else {
         $close_name = pht('Close Initiative');
         $close_icon = 'fa-times';
     }
     $view->addAction(id(new PhabricatorActionView())->setName($close_name)->setIcon($close_icon)->setDisabled(!$can_edit)->setWorkflow(true)->setHref($this->getApplicationURI("/close/{$id}/")));
     $view->addAction(id(new PhabricatorActionView())->setName(pht('Back Initiative'))->setIcon('fa-money')->setDisabled($initiative->isClosed())->setWorkflow(true)->setHref($this->getApplicationURI("/back/{$id}/")));
     $view->addAction(id(new PhabricatorActionView())->setName(pht('View Backers'))->setIcon('fa-bank')->setHref($this->getApplicationURI("/backers/{$id}/")));
     return $view;
 }
 public function buildSearchForm(AphrontFormView $form, PhabricatorSavedQuery $saved)
 {
     $statuses = $saved->getParameter('statuses', array());
     $statuses = array_fuse($statuses);
     $owner_phids = $saved->getParameter('ownerPHIDs', array());
     $status_map = FundInitiative::getStatusNameMap();
     $status_control = id(new AphrontFormCheckboxControl())->setLabel(pht('Statuses'));
     foreach ($status_map as $status => $name) {
         $status_control->addCheckbox('statuses[]', $status, $name, isset($statuses[$status]));
     }
     $form->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Owners'))->setName('owners')->setDatasource(new PhabricatorPeopleDatasource())->setValue($owner_phids))->appendChild($status_control);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
     if ($id) {
         $initiative = id(new FundInitiativeQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne();
         if (!$initiative) {
             return new Aphront404Response();
         }
         $is_new = false;
     } else {
         $initiative = FundInitiative::initializeNewInitiative($viewer);
         $is_new = true;
     }
     if ($is_new) {
         $title = pht('Create Initiative');
         $button_text = pht('Create Initiative');
         $cancel_uri = $this->getApplicationURI();
     } else {
         $title = pht('Edit %s %s', $initiative->getMonogram(), $initiative->getName());
         $button_text = pht('Save Changes');
         $cancel_uri = '/' . $initiative->getMonogram();
     }
     $e_name = true;
     $v_name = $initiative->getName();
     $e_merchant = null;
     $v_merchant = $initiative->getMerchantPHID();
     $v_desc = $initiative->getDescription();
     $v_risk = $initiative->getRisks();
     if ($is_new) {
         $v_projects = array();
     } else {
         $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs($initiative->getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
         $v_projects = array_reverse($v_projects);
     }
     $validation_exception = null;
     if ($request->isFormPost()) {
         $v_name = $request->getStr('name');
         $v_desc = $request->getStr('description');
         $v_risk = $request->getStr('risks');
         $v_view = $request->getStr('viewPolicy');
         $v_edit = $request->getStr('editPolicy');
         $v_merchant = $request->getStr('merchantPHID');
         $v_projects = $request->getArr('projects');
         $type_name = FundInitiativeTransaction::TYPE_NAME;
         $type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION;
         $type_risk = FundInitiativeTransaction::TYPE_RISKS;
         $type_merchant = FundInitiativeTransaction::TYPE_MERCHANT;
         $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY;
         $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
         $xactions = array();
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_name)->setNewValue($v_name);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_desc)->setNewValue($v_desc);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_risk)->setNewValue($v_risk);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_merchant)->setNewValue($v_merchant);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_view)->setNewValue($v_view);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_edit)->setNewValue($v_edit);
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $proj_edge_type)->setNewValue(array('=' => array_fuse($v_projects)));
         $editor = id(new FundInitiativeEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true);
         try {
             $editor->applyTransactions($initiative, $xactions);
             return id(new AphrontRedirectResponse())->setURI('/' . $initiative->getMonogram());
         } catch (PhabricatorApplicationTransactionValidationException $ex) {
             $validation_exception = $ex;
             $e_name = $ex->getShortMessage($type_name);
             $e_merchant = $ex->getShortMessage($type_merchant);
             $initiative->setViewPolicy($v_view);
             $initiative->setEditPolicy($v_edit);
         }
     }
     $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($initiative)->execute();
     $merchants = id(new PhortuneMerchantQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->execute();
     $merchant_options = array();
     foreach ($merchants as $merchant) {
         $merchant_options[$merchant->getPHID()] = pht('Merchant %d %s', $merchant->getID(), $merchant->getName());
     }
     if ($v_merchant && empty($merchant_options[$v_merchant])) {
         $merchant_options = array($v_merchant => pht('(Restricted Merchant)')) + $merchant_options;
     }
     if (!$merchant_options) {
         return $this->newDialog()->setTitle(pht('No Valid Phortune Merchant Accounts'))->appendParagraph(pht('You do not control any merchant accounts which can receive ' . 'payments from this initiative. When you create an initiative, ' . 'you need to specify a merchant account where funds will be paid ' . 'to.'))->appendParagraph(pht('Create a merchant account in the Phortune application before ' . 'creating an initiative in Fund.'))->addCancelButton($this->getApplicationURI());
     }
     $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name))->appendChild(id(new AphrontFormSelectControl())->setName('merchantPHID')->setLabel(pht('Pay To Merchant'))->setValue($v_merchant)->setError($e_merchant)->setOptions($merchant_options))->appendChild(id(new PhabricatorRemarkupControl())->setUser($viewer)->setName('description')->setLabel(pht('Description'))->setValue($v_desc))->appendChild(id(new PhabricatorRemarkupControl())->setUser($viewer)->setName('risks')->setLabel(pht('Risks/Challenges'))->setValue($v_risk))->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Projects'))->setName('projects')->setValue($v_projects)->setDatasource(new PhabricatorProjectDatasource()))->appendChild(id(new AphrontFormPolicyControl())->setName('viewPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_VIEW)->setPolicies($policies))->appendChild(id(new AphrontFormPolicyControl())->setName('editPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_EDIT)->setPolicies($policies))->appendChild(id(new AphrontFormSubmitControl())->setValue($button_text)->addCancelButton($cancel_uri));
     $crumbs = $this->buildApplicationCrumbs();
     if ($is_new) {
         $crumbs->addTextCrumb(pht('Create Initiative'));
     } else {
         $crumbs->addTextCrumb($initiative->getMonogram(), '/' . $initiative->getMonogram());
         $crumbs->addTextCrumb(pht('Edit'));
     }
     $box = id(new PHUIObjectBoxView())->setValidationException($validation_exception)->setHeaderText($title)->appendChild($form);
     return $this->buildApplicationPage(array($crumbs, $box), array('title' => $title));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     if ($this->id) {
         $initiative = id(new FundInitiativeQuery())->setViewer($viewer)->withIDs(array($this->id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne();
         if (!$initiative) {
             return new Aphront404Response();
         }
         $is_new = false;
     } else {
         $initiative = FundInitiative::initializeNewInitiative($viewer);
         $is_new = true;
     }
     if ($is_new) {
         $title = pht('Create Initiative');
         $button_text = pht('Create Initiative');
         $cancel_uri = $this->getApplicationURI();
     } else {
         $title = pht('Edit %s %s', $initiative->getMonogram(), $initiative->getName());
         $button_text = pht('Save Changes');
         $cancel_uri = '/' . $initiative->getMonogram();
     }
     $e_name = true;
     $v_name = $initiative->getName();
     $v_desc = $initiative->getDescription();
     if ($is_new) {
         $v_projects = array();
     } else {
         $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs($initiative->getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
         $v_projects = array_reverse($v_projects);
     }
     $validation_exception = null;
     if ($request->isFormPost()) {
         $v_name = $request->getStr('name');
         $v_desc = $request->getStr('description');
         $v_view = $request->getStr('viewPolicy');
         $v_edit = $request->getStr('editPolicy');
         $v_projects = $request->getArr('projects');
         $type_name = FundInitiativeTransaction::TYPE_NAME;
         $type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION;
         $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY;
         $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
         $xactions = array();
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_name)->setNewValue($v_name);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_desc)->setNewValue($v_desc);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_view)->setNewValue($v_view);
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType($type_edit)->setNewValue($v_edit);
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new FundInitiativeTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $proj_edge_type)->setNewValue(array('=' => array_fuse($v_projects)));
         $editor = id(new FundInitiativeEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true);
         try {
             $editor->applyTransactions($initiative, $xactions);
             return id(new AphrontRedirectResponse())->setURI('/' . $initiative->getMonogram());
         } catch (PhabricatorApplicationTransactionValidationException $ex) {
             $validation_exception = $ex;
             $e_name = $ex->getShortMessage($type_name);
             $initiative->setViewPolicy($v_view);
             $initiative->setEditPolicy($v_edit);
         }
     }
     $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($initiative)->execute();
     if ($v_projects) {
         $project_handles = $this->loadViewerHandles($v_projects);
     } else {
         $project_handles = array();
     }
     $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name))->appendChild(id(new PhabricatorRemarkupControl())->setName('description')->setLabel(pht('Description'))->setValue($v_desc))->appendChild(id(new AphrontFormTokenizerControl())->setLabel(pht('Projects'))->setName('projects')->setValue($project_handles)->setDatasource(new PhabricatorProjectDatasource()))->appendChild(id(new AphrontFormPolicyControl())->setName('viewPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_VIEW)->setPolicies($policies))->appendChild(id(new AphrontFormPolicyControl())->setName('editPolicy')->setPolicyObject($initiative)->setCapability(PhabricatorPolicyCapability::CAN_EDIT)->setPolicies($policies))->appendChild(id(new AphrontFormSubmitControl())->setValue($button_text)->addCancelButton($cancel_uri));
     $crumbs = $this->buildApplicationCrumbs();
     if ($is_new) {
         $crumbs->addTextCrumb(pht('Create Initiative'));
     } else {
         $crumbs->addTextCrumb($initiative->getMonogram(), '/' . $initiative->getMonogram());
         $crumbs->addTextCrumb(pht('Edit'));
     }
     $box = id(new PHUIObjectBoxView())->setValidationException($validation_exception)->setHeaderText($title)->appendChild($form);
     return $this->buildApplicationPage(array($crumbs, $box), array('title' => $title));
 }