Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/diffusion/controller/DiffusionRepositoryManagePanelsController.php
12242 views
1
<?php
2
3
final class DiffusionRepositoryManagePanelsController
4
extends DiffusionRepositoryManageController {
5
6
private $navigation;
7
8
public function buildApplicationMenu() {
9
// TODO: This is messy for now; the mobile menu should be set automatically
10
// when the body content is a two-column view with navigation.
11
if ($this->navigation) {
12
return $this->navigation->getMenu();
13
}
14
return parent::buildApplicationMenu();
15
}
16
17
18
public function handleRequest(AphrontRequest $request) {
19
$response = $this->loadDiffusionContext();
20
if ($response) {
21
return $response;
22
}
23
24
$viewer = $this->getViewer();
25
$drequest = $this->getDiffusionRequest();
26
$repository = $drequest->getRepository();
27
28
$panels = DiffusionRepositoryManagementPanel::getAllPanels();
29
30
foreach ($panels as $key => $panel) {
31
$panel
32
->setViewer($viewer)
33
->setRepository($repository)
34
->setController($this);
35
36
if (!$panel->shouldEnableForRepository($repository)) {
37
unset($panels[$key]);
38
continue;
39
}
40
}
41
42
$selected = $request->getURIData('panel');
43
if ($selected === null || !strlen($selected)) {
44
$selected = head_key($panels);
45
}
46
47
if (empty($panels[$selected])) {
48
return new Aphront404Response();
49
}
50
51
$nav = $this->renderSideNav($repository, $panels, $selected);
52
$this->navigation = $nav;
53
54
$panel = $panels[$selected];
55
56
$crumbs = $this->buildApplicationCrumbs();
57
$crumbs->addTextCrumb($panel->getManagementPanelLabel());
58
$crumbs->setBorder(true);
59
60
$content = $panel->buildManagementPanelContent();
61
62
$title = array(
63
$panel->getManagementPanelLabel(),
64
$repository->getDisplayName(),
65
);
66
67
$header = $this->buildHeaderView($repository->getDisplayName());
68
69
$view = id(new PHUITwoColumnView())
70
->setHeader($header)
71
->setMainColumn($content);
72
73
$curtain = $panel->buildManagementPanelCurtain();
74
if ($curtain) {
75
$view->setCurtain($curtain);
76
}
77
78
return $this->newPage()
79
->setTitle($title)
80
->setCrumbs($crumbs)
81
->setNavigation($nav)
82
->appendChild($view);
83
}
84
85
private function renderSideNav(
86
PhabricatorRepository $repository,
87
array $panels,
88
$selected) {
89
90
$base_uri = $repository->getPathURI('manage/');
91
$base_uri = new PhutilURI($base_uri);
92
93
$nav = id(new AphrontSideNavFilterView())
94
->setBaseURI($base_uri);
95
96
$groups = DiffusionRepositoryManagementPanelGroup::getAllPanelGroups();
97
$panel_groups = mgroup($panels, 'getManagementPanelGroupKey');
98
$other_key = DiffusionRepositoryManagementOtherPanelGroup::PANELGROUPKEY;
99
100
foreach ($groups as $group_key => $group) {
101
// If this is the "Other" group, include everything else that isn't in
102
// some actual group.
103
if ($group_key === $other_key) {
104
$group_panels = array_mergev($panel_groups);
105
$panel_groups = array();
106
} else {
107
$group_panels = idx($panel_groups, $group_key);
108
unset($panel_groups[$group_key]);
109
}
110
111
if (!$group_panels) {
112
continue;
113
}
114
115
$label = $group->getManagementPanelGroupLabel();
116
if ($label) {
117
$nav->addLabel($label);
118
}
119
120
foreach ($group_panels as $panel) {
121
$key = $panel->getManagementPanelKey();
122
$label = $panel->getManagementPanelLabel();
123
$icon = $panel->getManagementPanelIcon();
124
$href = $panel->getPanelNavigationURI();
125
126
$item = id(new PHUIListItemView())
127
->setKey($key)
128
->setName($label)
129
->setType(PHUIListItemView::TYPE_LINK)
130
->setHref($href)
131
->setIcon($icon);
132
133
$nav->addMenuItem($item);
134
}
135
}
136
137
$nav->selectFilter($selected);
138
139
return $nav;
140
}
141
142
public function buildHeaderView($title) {
143
$viewer = $this->getViewer();
144
145
$drequest = $this->getDiffusionRequest();
146
$repository = $drequest->getRepository();
147
148
$header = id(new PHUIHeaderView())
149
->setHeader($title)
150
->setProfileHeader(true)
151
->setHref($repository->getURI())
152
->setImage($repository->getProfileImageURI());
153
154
if ($repository->isTracked()) {
155
$header->setStatus('fa-check', 'bluegrey', pht('Active'));
156
} else {
157
$header->setStatus('fa-ban', 'dark', pht('Inactive'));
158
}
159
160
$doc_href = PhabricatorEnv::getDoclink(
161
'Diffusion User Guide: Managing Repositories');
162
163
$header->addActionLink(
164
id(new PHUIButtonView())
165
->setTag('a')
166
->setText(pht('View Repository'))
167
->setHref($repository->getURI())
168
->setIcon('fa-code')
169
->setColor(PHUIButtonView::GREY));
170
171
$header->addActionLink(
172
id(new PHUIButtonView())
173
->setTag('a')
174
->setIcon('fa-book')
175
->setHref($doc_href)
176
->setText(pht('Help'))
177
->setColor(PHUIButtonView::GREY));
178
179
return $header;
180
}
181
182
public function newTimeline(PhabricatorRepository $repository) {
183
$timeline = $this->buildTransactionTimeline(
184
$repository,
185
new PhabricatorRepositoryTransactionQuery());
186
$timeline->setShouldTerminate(true);
187
188
return $timeline;
189
}
190
191
192
}
193
194