@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
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}