@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 DivinerBookController extends DivinerController {
4
5 public function shouldAllowPublic() {
6 return true;
7 }
8
9 public function handleRequest(AphrontRequest $request) {
10 $viewer = $request->getViewer();
11
12 $book_name = $request->getURIData('book');
13
14 $book = id(new DivinerBookQuery())
15 ->setViewer($viewer)
16 ->withNames(array($book_name))
17 ->needRepositories(true)
18 ->executeOne();
19
20 if (!$book) {
21 return new Aphront404Response();
22 }
23
24 $actions = $this->buildActionView($viewer, $book);
25
26 $crumbs = $this->buildApplicationCrumbs();
27 $crumbs->setBorder(true);
28 $crumbs->addTextCrumb(
29 $book->getShortTitle(),
30 '/book/'.$book->getName().'/');
31
32 $header = id(new PHUIHeaderView())
33 ->setHeader($book->getTitle())
34 ->setUser($viewer)
35 ->setPolicyObject($book)
36 ->setEpoch($book->getDateModified())
37 ->setActionList($actions);
38
39 // TODO: This could probably look better.
40 if ($book->getRepositoryPHID()) {
41 $header->addTag(
42 id(new PHUITagView())
43 ->setType(PHUITagView::TYPE_STATE)
44 ->setBackgroundColor(PHUITagView::COLOR_BLUE)
45 ->setName($book->getRepository()->getMonogram()));
46 }
47
48 $document = new PHUIDocumentView();
49 $document->setHeader($header);
50 $document->addClass('diviner-view');
51
52 $atoms = id(new DivinerAtomQuery())
53 ->setViewer($viewer)
54 ->withBookPHIDs(array($book->getPHID()))
55 ->withGhosts(false)
56 ->withIsDocumentable(true)
57 ->execute();
58
59 $atoms = msort($atoms, 'getSortKey');
60
61 $group_spec = $book->getConfig('groups');
62 if (!is_array($group_spec)) {
63 $group_spec = array();
64 }
65
66 $groups = mgroup($atoms, 'getGroupName');
67 $groups = array_select_keys($groups, array_keys($group_spec)) + $groups;
68 if (isset($groups[''])) {
69 $no_group = $groups[''];
70 unset($groups['']);
71 $groups[''] = $no_group;
72 }
73
74 $out = array();
75 foreach ($groups as $group => $atoms) {
76 $group_name = $book->getGroupName($group);
77 if (!strlen($group_name)) {
78 $group_name = pht('Free Radicals');
79 }
80 $section = id(new DivinerSectionView())
81 ->setHeader($group_name);
82 $section->addContent($this->renderAtomList($atoms));
83 $out[] = $section;
84 }
85
86 $preface = $book->getPreface();
87 $preface_view = null;
88 if (strlen($preface)) {
89 $preface_view = new PHUIRemarkupView($viewer, $preface);
90 }
91
92 $document->appendChild($preface_view);
93 $document->appendChild($out);
94
95 return $this->newPage()
96 ->setTitle($book->getTitle())
97 ->setCrumbs($crumbs)
98 ->appendChild(array(
99 $document,
100 ));
101 }
102
103 private function buildActionView(
104 PhabricatorUser $user,
105 DivinerLiveBook $book) {
106
107 $can_edit = PhabricatorPolicyFilter::hasCapability(
108 $user,
109 $book,
110 PhabricatorPolicyCapability::CAN_EDIT);
111
112 $action_view = id(new PhabricatorActionListView())
113 ->setUser($user)
114 ->setObject($book);
115
116 $action_view->addAction(
117 id(new PhabricatorActionView())
118 ->setName(pht('Edit Book'))
119 ->setIcon('fa-pencil')
120 ->setHref('/book/'.$book->getName().'/edit/')
121 ->setDisabled(!$can_edit));
122
123 return $action_view;
124 }
125
126}