@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 PhabricatorProjectBoardManageController
4 extends PhabricatorProjectBoardController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $board_id = $request->getURIData('projectID');
9
10 $board = id(new PhabricatorProjectQuery())
11 ->setViewer($viewer)
12 ->withIDs(array($board_id))
13 ->needImages(true)
14 ->executeOne();
15 if (!$board) {
16 return new Aphront404Response();
17 }
18 $this->setProject($board);
19
20 // Perform layout of no tasks to load and populate the columns in the
21 // correct order.
22 $layout_engine = id(new PhabricatorBoardLayoutEngine())
23 ->setViewer($viewer)
24 ->setBoardPHIDs(array($board->getPHID()))
25 ->setObjectPHIDs(array())
26 ->setFetchAllBoards(true)
27 ->executeLayout();
28
29 $columns = $layout_engine->getColumns($board->getPHID());
30
31 $board_id = $board->getID();
32
33 $header = $this->buildHeaderView($board);
34 $curtain = $this->buildCurtainView($board);
35
36 $crumbs = $this->buildApplicationCrumbs();
37 $crumbs->addTextCrumb(pht('Workboard'), $board->getWorkboardURI());
38 $crumbs->addTextCrumb(pht('Manage'));
39 $crumbs->setBorder(true);
40
41 $nav = $this->newNavigation(
42 $board,
43 PhabricatorProject::ITEM_WORKBOARD);
44 $columns_list = $this->buildColumnsList($board, $columns);
45
46 require_celerity_resource('project-view-css');
47
48 $view = id(new PHUITwoColumnView())
49 ->setHeader($header)
50 ->addClass('project-view-home')
51 ->addClass('project-view-people-home')
52 ->setCurtain($curtain)
53 ->setMainColumn($columns_list);
54
55 $title = array(
56 pht('Manage Workboard'),
57 $board->getDisplayName(),
58 );
59
60 return $this->newPage()
61 ->setTitle($title)
62 ->setNavigation($nav)
63 ->setCrumbs($crumbs)
64 ->appendChild($view);
65 }
66
67 private function buildHeaderView(PhabricatorProject $board) {
68 $viewer = $this->getViewer();
69
70 $header = id(new PHUIHeaderView())
71 ->setHeader(pht('Workboard: %s', $board->getDisplayName()))
72 ->setUser($viewer);
73
74 return $header;
75 }
76
77 private function buildCurtainView(PhabricatorProject $board) {
78 $viewer = $this->getViewer();
79 $id = $board->getID();
80
81 $curtain = $this->newCurtainView();
82
83 $can_edit = PhabricatorPolicyFilter::hasCapability(
84 $viewer,
85 $board,
86 PhabricatorPolicyCapability::CAN_EDIT);
87
88 $disable_uri = $this->getApplicationURI("board/{$id}/disable/");
89
90 $curtain->addAction(
91 id(new PhabricatorActionView())
92 ->setIcon('fa-ban')
93 ->setName(pht('Disable Workboard'))
94 ->setHref($disable_uri)
95 ->setDisabled(!$can_edit)
96 ->setWorkflow(true));
97
98 return $curtain;
99 }
100
101 /**
102 * @param PhabricatorProject $board
103 * @param array<PhabricatorProjectColumn> $columns
104 */
105 private function buildColumnsList(
106 PhabricatorProject $board,
107 array $columns) {
108 assert_instances_of($columns, PhabricatorProjectColumn::class);
109
110 $board_id = $board->getID();
111
112 $view = id(new PHUIObjectItemListView())
113 ->setNoDataString(pht('This board has no columns.'));
114
115 foreach ($columns as $column) {
116 $column_id = $column->getID();
117
118 $proxy = $column->getProxy();
119 if ($proxy && !$proxy->isMilestone()) {
120 continue;
121 }
122
123 $detail_uri = "/project/board/{$board_id}/column/{$column_id}/";
124
125 $item = id(new PHUIObjectItemView())
126 ->setHeader($column->getDisplayName())
127 ->setHref($detail_uri);
128
129 if ($column->isHidden()) {
130 $item->setDisabled(true);
131 $item->addAttribute(pht('Hidden'));
132 $item->setImageIcon('fa-columns grey');
133 } else {
134 $item->addAttribute(pht('Visible'));
135 $item->setImageIcon('fa-columns');
136 }
137
138 $view->addItem($item);
139 }
140
141 return id(new PHUIObjectBoxView())
142 ->setHeaderText(pht('Columns'))
143 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
144 ->setObjectList($view);
145 }
146
147
148}