@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 134 lines 4.2 kB view raw
1<?php 2 3final class DivinerBookEditController extends DivinerController { 4 5 public function handleRequest(AphrontRequest $request) { 6 $viewer = $request->getViewer(); 7 8 $book_name = $request->getURIData('book'); 9 10 $book = id(new DivinerBookQuery()) 11 ->setViewer($viewer) 12 ->requireCapabilities( 13 array( 14 PhabricatorPolicyCapability::CAN_VIEW, 15 PhabricatorPolicyCapability::CAN_EDIT, 16 )) 17 ->needProjectPHIDs(true) 18 ->withNames(array($book_name)) 19 ->executeOne(); 20 21 if (!$book) { 22 return new Aphront404Response(); 23 } 24 25 $view_uri = '/book/'.$book->getName().'/'; 26 27 if ($request->isFormPost()) { 28 $v_projects = $request->getArr('projectPHIDs'); 29 $v_view = $request->getStr('viewPolicy'); 30 $v_edit = $request->getStr('editPolicy'); 31 32 $xactions = array(); 33 $xactions[] = id(new DivinerLiveBookTransaction()) 34 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 35 ->setMetadataValue( 36 'edge:type', 37 PhabricatorProjectObjectHasProjectEdgeType::EDGECONST) 38 ->setNewValue( 39 array( 40 '=' => array_fuse($v_projects), 41 )); 42 $xactions[] = id(new DivinerLiveBookTransaction()) 43 ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) 44 ->setNewValue($v_view); 45 $xactions[] = id(new DivinerLiveBookTransaction()) 46 ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY) 47 ->setNewValue($v_edit); 48 49 id(new DivinerLiveBookEditor()) 50 ->setContinueOnNoEffect(true) 51 ->setContentSourceFromRequest($request) 52 ->setActor($viewer) 53 ->applyTransactions($book, $xactions); 54 55 return id(new AphrontRedirectResponse())->setURI($view_uri); 56 } 57 58 $crumbs = $this->buildApplicationCrumbs(); 59 $crumbs->addTextCrumb(pht('Edit Basics')); 60 $crumbs->setBorder(true); 61 62 $title = pht('Edit Book: %s', $book->getTitle()); 63 $header_icon = 'fa-pencil'; 64 65 $policies = id(new PhabricatorPolicyQuery()) 66 ->setViewer($viewer) 67 ->setObject($book) 68 ->execute(); 69 $view_capability = PhabricatorPolicyCapability::CAN_VIEW; 70 $edit_capability = PhabricatorPolicyCapability::CAN_EDIT; 71 72 $form = id(new AphrontFormView()) 73 ->setUser($viewer) 74 ->appendControl( 75 id(new AphrontFormTokenizerControl()) 76 ->setDatasource(new PhabricatorProjectDatasource()) 77 ->setName('projectPHIDs') 78 ->setLabel(pht('Project Tags')) 79 ->setValue($book->getProjectPHIDs())) 80 ->appendControl( 81 id(new AphrontFormTokenizerControl()) 82 ->setDatasource(new DiffusionRepositoryDatasource()) 83 ->setName('repositoryPHIDs') 84 ->setLabel(pht('Repository')) 85 ->setDisableBehavior(true) 86 ->setLimit(1) 87 ->setValue($book->getRepositoryPHID() 88 ? array($book->getRepositoryPHID()) 89 : null)) 90 ->appendChild( 91 id(new AphrontFormPolicyControl()) 92 ->setName('viewPolicy') 93 ->setPolicyObject($book) 94 ->setCapability($view_capability) 95 ->setPolicies($policies)) 96 ->appendChild( 97 id(new AphrontFormPolicyControl()) 98 ->setName('editPolicy') 99 ->setPolicyObject($book) 100 ->setCapability($edit_capability) 101 ->setPolicies($policies)) 102 ->appendChild( 103 id(new AphrontFormSubmitControl()) 104 ->setValue(pht('Save')) 105 ->addCancelButton($view_uri)); 106 107 $box = id(new PHUIObjectBoxView()) 108 ->setHeaderText(pht('Book')) 109 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 110 ->setForm($form); 111 112 $timeline = $this->buildTransactionTimeline( 113 $book, 114 new DivinerLiveBookTransactionQuery()); 115 $timeline->setShouldTerminate(true); 116 117 $header = id(new PHUIHeaderView()) 118 ->setHeader($title) 119 ->setHeaderIcon($header_icon); 120 121 $view = id(new PHUITwoColumnView()) 122 ->setHeader($header) 123 ->setFooter(array( 124 $box, 125 $timeline, 126 )); 127 128 return $this->newPage() 129 ->setTitle($title) 130 ->setCrumbs($crumbs) 131 ->appendChild($view); 132 } 133 134}