@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 PhabricatorProjectColumnHideController
4 extends PhabricatorProjectBoardController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $id = $request->getURIData('id');
9 $project_id = $request->getURIData('projectID');
10
11 $project = id(new PhabricatorProjectQuery())
12 ->setViewer($viewer)
13 ->requireCapabilities(
14 array(
15 PhabricatorPolicyCapability::CAN_VIEW,
16 PhabricatorPolicyCapability::CAN_EDIT,
17 ))
18 ->withIDs(array($project_id))
19 ->executeOne();
20
21 if (!$project) {
22 return new Aphront404Response();
23 }
24 $this->setProject($project);
25
26 $column = id(new PhabricatorProjectColumnQuery())
27 ->setViewer($viewer)
28 ->withIDs(array($id))
29 ->requireCapabilities(
30 array(
31 PhabricatorPolicyCapability::CAN_VIEW,
32 PhabricatorPolicyCapability::CAN_EDIT,
33 ))
34 ->executeOne();
35 if (!$column) {
36 return new Aphront404Response();
37 }
38
39 $column_phid = $column->getPHID();
40
41 $view_uri = $project->getWorkboardURI();
42 $view_uri = new PhutilURI($view_uri);
43 foreach ($request->getPassthroughRequestData() as $key => $value) {
44 $view_uri->replaceQueryParam($key, $value);
45 }
46
47 if ($column->isDefaultColumn()) {
48 return $this->newDialog()
49 ->setTitle(pht('Can Not Hide Default Column'))
50 ->appendParagraph(
51 pht('You can not hide the default/backlog column on a board.'))
52 ->addCancelButton($view_uri, pht('Okay'));
53 }
54
55 $proxy = $column->getProxy();
56
57 if ($request->isFormPost()) {
58 if ($proxy) {
59 if ($proxy->isArchived()) {
60 $new_status = PhabricatorProjectStatus::STATUS_ACTIVE;
61 } else {
62 $new_status = PhabricatorProjectStatus::STATUS_ARCHIVED;
63 }
64
65 $xactions = array();
66
67 $xactions[] = id(new PhabricatorProjectTransaction())
68 ->setTransactionType(
69 PhabricatorProjectStatusTransaction::TRANSACTIONTYPE)
70 ->setNewValue($new_status);
71
72 id(new PhabricatorProjectTransactionEditor())
73 ->setActor($viewer)
74 ->setContentSourceFromRequest($request)
75 ->setContinueOnNoEffect(true)
76 ->setContinueOnMissingFields(true)
77 ->applyTransactions($proxy, $xactions);
78 } else {
79 if ($column->isHidden()) {
80 $new_status = PhabricatorProjectColumn::STATUS_ACTIVE;
81 } else {
82 $new_status = PhabricatorProjectColumn::STATUS_HIDDEN;
83 }
84
85 $type_status =
86 PhabricatorProjectColumnStatusTransaction::TRANSACTIONTYPE;
87
88 $xactions = array(
89 id(new PhabricatorProjectColumnTransaction())
90 ->setTransactionType($type_status)
91 ->setNewValue($new_status),
92 );
93
94 $editor = id(new PhabricatorProjectColumnTransactionEditor())
95 ->setActor($viewer)
96 ->setContinueOnNoEffect(true)
97 ->setContinueOnMissingFields(true)
98 ->setContentSourceFromRequest($request)
99 ->applyTransactions($column, $xactions);
100 }
101
102 return id(new AphrontRedirectResponse())->setURI($view_uri);
103 }
104
105 if ($proxy) {
106 if ($column->isHidden()) {
107 $title = pht('Activate and Show Column');
108 $body = pht(
109 'This column is hidden because it represents an archived '.
110 'subproject. Do you want to activate the subproject so the '.
111 'column is visible again?');
112 $button = pht('Activate Subproject');
113 } else {
114 $title = pht('Archive and Hide Column');
115 $body = pht(
116 'This column is visible because it represents an active '.
117 'subproject. Do you want to hide the column by archiving the '.
118 'subproject?');
119 $button = pht('Archive Subproject');
120 }
121 } else {
122 if ($column->isHidden()) {
123 $title = pht('Show Column');
124 $body = pht('Are you sure you want to show this column?');
125 $button = pht('Show Column');
126 } else {
127 $title = pht('Hide Column');
128 $body = pht(
129 'Are you sure you want to hide this column? It will no longer '.
130 'appear on the workboard.');
131 $button = pht('Hide Column');
132 }
133 }
134
135 $dialog = $this->newDialog()
136 ->setWidth(AphrontDialogView::WIDTH_FORM)
137 ->setTitle($title)
138 ->appendChild($body)
139 ->addCancelButton($view_uri)
140 ->addSubmitButton($button);
141
142 foreach ($request->getPassthroughRequestData() as $key => $value) {
143 $dialog->addHiddenInput($key, $value);
144 }
145
146 return $dialog;
147 }
148}