@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 PhabricatorProjectManageController
4 extends PhabricatorProjectController {
5
6 public function shouldAllowPublic() {
7 return true;
8 }
9
10 public function handleRequest(AphrontRequest $request) {
11 $response = $this->loadProject();
12 if ($response) {
13 return $response;
14 }
15
16 $viewer = $request->getUser();
17 $project = $this->getProject();
18 $id = $project->getID();
19 $picture = $project->getProfileImageURI();
20
21 $header = id(new PHUIHeaderView())
22 ->setHeader(pht('Project History'))
23 ->setViewer($viewer)
24 ->setPolicyObject($project);
25
26 if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) {
27 $header->setStatus('fa-check', 'bluegrey', pht('Active'));
28 } else {
29 $header->setStatus('fa-ban', 'red', pht('Archived'));
30 }
31
32 $curtain = $this->buildCurtain($project);
33 $properties = $this->buildPropertyListView($project);
34
35 $timeline = $this->buildTransactionTimeline(
36 $project,
37 new PhabricatorProjectTransactionQuery());
38 $timeline->setShouldTerminate(true);
39
40 $nav = $this->newNavigation(
41 $project,
42 PhabricatorProject::ITEM_MANAGE);
43
44 $crumbs = $this->buildApplicationCrumbs();
45 $crumbs->addTextCrumb(pht('Manage'));
46 $crumbs->setBorder(true);
47
48 require_celerity_resource('project-view-css');
49
50 $manage = id(new PHUITwoColumnView())
51 ->setHeader($header)
52 ->setCurtain($curtain)
53 ->addPropertySection(pht('Details'), $properties)
54 ->addClass('project-view-home')
55 ->addClass('project-view-people-home')
56 ->setMainColumn(
57 array(
58 $timeline,
59 ));
60
61 return $this->newPage()
62 ->setNavigation($nav)
63 ->setCrumbs($crumbs)
64 ->setTitle(
65 array(
66 $project->getDisplayName(),
67 pht('Manage'),
68 ))
69 ->appendChild(
70 array(
71 $manage,
72 ));
73 }
74
75 private function buildCurtain(PhabricatorProject $project) {
76 $viewer = $this->getViewer();
77
78 $id = $project->getID();
79 $can_edit = PhabricatorPolicyFilter::hasCapability(
80 $viewer,
81 $project,
82 PhabricatorPolicyCapability::CAN_EDIT);
83
84 $curtain = $this->newCurtainView($project);
85
86 $curtain->addAction(
87 id(new PhabricatorActionView())
88 ->setName(pht('Edit Details'))
89 ->setIcon('fa-pencil')
90 ->setHref($this->getApplicationURI("edit/{$id}/"))
91 ->setDisabled(!$can_edit)
92 ->setWorkflow(!$can_edit));
93
94 $curtain->addAction(
95 id(new PhabricatorActionView())
96 ->setName(pht('Edit Menu'))
97 ->setIcon('fa-th-list')
98 ->setHref($this->getApplicationURI("{$id}/item/configure/"))
99 ->setDisabled(!$can_edit)
100 ->setWorkflow(!$can_edit));
101
102 $curtain->addAction(
103 id(new PhabricatorActionView())
104 ->setName(pht('Edit Picture'))
105 ->setIcon('fa-picture-o')
106 ->setHref($this->getApplicationURI("picture/{$id}/"))
107 ->setDisabled(!$can_edit)
108 ->setWorkflow(!$can_edit));
109
110 if ($project->isArchived()) {
111 $curtain->addAction(
112 id(new PhabricatorActionView())
113 ->setName(pht('Activate Project'))
114 ->setIcon('fa-check')
115 ->setHref($this->getApplicationURI("archive/{$id}/"))
116 ->setDisabled(!$can_edit)
117 ->setWorkflow(true));
118 } else {
119 $curtain->addAction(
120 id(new PhabricatorActionView())
121 ->setName(pht('Archive Project'))
122 ->setIcon('fa-ban')
123 ->setHref($this->getApplicationURI("archive/{$id}/"))
124 ->setDisabled(!$can_edit)
125 ->setWorkflow(true));
126 }
127
128 return $curtain;
129 }
130
131 private function buildPropertyListView(
132 PhabricatorProject $project) {
133 $viewer = $this->getViewer();
134
135 $view = id(new PHUIPropertyListView())
136 ->setViewer($viewer);
137
138 $view->addProperty(
139 pht('Looks Like'),
140 $viewer->renderHandle($project->getPHID())->setAsTag(true));
141
142 $slugs = $project->getSlugs();
143 $tags = mpull($slugs, 'getSlug');
144
145 $view->addProperty(
146 pht('Hashtags'),
147 $this->renderHashtags($tags));
148
149 $field_list = PhabricatorCustomField::getObjectFields(
150 $project,
151 PhabricatorCustomField::ROLE_VIEW);
152 $field_list->appendFieldsToPropertyList($project, $viewer, $view);
153
154 return $view;
155 }
156
157}