@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 PhabricatorEditEngineConfigurationViewController
4 extends PhabricatorEditEngineController {
5
6 public function shouldAllowPublic() {
7 return true;
8 }
9
10 public function handleRequest(AphrontRequest $request) {
11 $viewer = $this->getViewer();
12
13 $config = $this->loadConfigForView();
14 if (!$config) {
15 return id(new Aphront404Response());
16 }
17
18 $is_concrete = (bool)$config->getID();
19
20 $curtain = $this->buildCurtainView($config);
21 $properties = $this->buildPropertyView($config);
22
23 $header = id(new PHUIHeaderView())
24 ->setUser($viewer)
25 ->setPolicyObject($config)
26 ->setHeader(pht('Edit Form: %s', $config->getDisplayName()))
27 ->setHeaderIcon('fa-pencil');
28
29 if ($config->getIsDisabled()) {
30 $name = pht('Disabled');
31 $icon = 'fa-ban';
32 $color = 'indigo';
33 } else {
34 $name = pht('Enabled');
35 $icon = 'fa-check';
36 $color = 'green';
37 }
38 $header->setStatus($icon, $color, $name);
39
40 $field_list = $this->buildFieldList($config);
41 $crumbs = $this->buildApplicationCrumbs();
42 $crumbs->setBorder(true);
43
44 if ($is_concrete) {
45 $title = pht('Form %d', $config->getID());
46 $crumbs->addTextCrumb($title);
47 } else {
48 $title = pht('Builtin');
49 $crumbs->addTextCrumb(pht('Builtin'));
50 }
51
52 if ($is_concrete) {
53 $timeline = $this->buildTransactionTimeline(
54 $config,
55 new PhabricatorEditEngineConfigurationTransactionQuery());
56
57 $timeline->setShouldTerminate(true);
58 } else {
59 $timeline = null;
60 }
61
62 $view = id(new PHUITwoColumnView())
63 ->setHeader($header)
64 ->setCurtain($curtain)
65 ->setMainColumn(array(
66 $field_list,
67 $timeline,
68 ));
69
70 return $this->newPage()
71 ->setTitle($title)
72 ->setCrumbs($crumbs)
73 ->appendChild($view);
74 }
75
76 private function buildCurtainView(
77 PhabricatorEditEngineConfiguration $config) {
78 $viewer = $this->getViewer();
79 $engine = $config->getEngine();
80 $engine_key = $engine->getEngineKey();
81
82 $can_edit = PhabricatorPolicyFilter::hasCapability(
83 $viewer,
84 $config,
85 PhabricatorPolicyCapability::CAN_EDIT);
86
87 $curtain = $this->newCurtainView($config);
88 $form_key = $config->getIdentifier();
89
90 $base_uri = "/transactions/editengine/{$engine_key}";
91
92 $is_concrete = (bool)$config->getID();
93 if (!$is_concrete) {
94 $save_uri = "{$base_uri}/save/{$form_key}/";
95
96 $curtain->addAction(
97 id(new PhabricatorActionView())
98 ->setName(pht('Make Editable'))
99 ->setIcon('fa-pencil')
100 ->setDisabled(!$can_edit)
101 ->setWorkflow(true)
102 ->setHref($save_uri));
103
104 $can_edit = false;
105 } else {
106 $edit_uri = "{$base_uri}/edit/{$form_key}/";
107 $curtain->addAction(
108 id(new PhabricatorActionView())
109 ->setName(pht('Edit Form Configuration'))
110 ->setIcon('fa-pencil')
111 ->setDisabled(!$can_edit)
112 ->setWorkflow(!$can_edit)
113 ->setHref($edit_uri));
114 }
115
116 $use_uri = $engine->getEditURI(null, "form/{$form_key}/");
117
118 $curtain->addAction(
119 id(new PhabricatorActionView())
120 ->setName(pht('Use Form'))
121 ->setIcon('fa-th-list')
122 ->setHref($use_uri));
123
124 $defaults_uri = "{$base_uri}/defaults/{$form_key}/";
125
126 $curtain->addAction(
127 id(new PhabricatorActionView())
128 ->setName(pht('Change Default Values'))
129 ->setIcon('fa-paint-brush')
130 ->setHref($defaults_uri)
131 ->setWorkflow(!$can_edit)
132 ->setDisabled(!$can_edit));
133
134 $reorder_uri = "{$base_uri}/reorder/{$form_key}/";
135
136 $curtain->addAction(
137 id(new PhabricatorActionView())
138 ->setName(pht('Change Field Order'))
139 ->setIcon('fa-sort-alpha-asc')
140 ->setHref($reorder_uri)
141 ->setWorkflow(true)
142 ->setDisabled(!$can_edit));
143
144 $lock_uri = "{$base_uri}/lock/{$form_key}/";
145
146 $curtain->addAction(
147 id(new PhabricatorActionView())
148 ->setName(pht('Lock / Hide Fields'))
149 ->setIcon('fa-lock')
150 ->setHref($lock_uri)
151 ->setWorkflow(true)
152 ->setDisabled(!$can_edit));
153
154 if ($engine->supportsSubtypes()) {
155 $subtype_uri = "{$base_uri}/subtype/{$form_key}/";
156
157 $curtain->addAction(
158 id(new PhabricatorActionView())
159 ->setName(pht('Change Form Subtype'))
160 ->setIcon('fa-drivers-license-o')
161 ->setHref($subtype_uri)
162 ->setWorkflow(true)
163 ->setDisabled(!$can_edit));
164 }
165
166 $disable_uri = "{$base_uri}/disable/{$form_key}/";
167
168 if ($config->getIsDisabled()) {
169 $disable_name = pht('Enable Form');
170 $disable_icon = 'fa-check';
171 } else {
172 $disable_name = pht('Disable Form');
173 $disable_icon = 'fa-ban';
174 }
175
176 $curtain->addAction(
177 id(new PhabricatorActionView())
178 ->setName($disable_name)
179 ->setIcon($disable_icon)
180 ->setHref($disable_uri)
181 ->setWorkflow(true)
182 ->setDisabled(!$can_edit));
183
184 $defaultcreate_uri = "{$base_uri}/defaultcreate/{$form_key}/";
185
186 if ($config->getIsDefault()) {
187 $defaultcreate_name = pht('Unmark as "Create" Form');
188 $defaultcreate_icon = 'fa-minus';
189 } else {
190 $defaultcreate_name = pht('Mark as "Create" Form');
191 $defaultcreate_icon = 'fa-plus';
192 }
193
194 $curtain->addAction(
195 id(new PhabricatorActionView())
196 ->setName($defaultcreate_name)
197 ->setIcon($defaultcreate_icon)
198 ->setHref($defaultcreate_uri)
199 ->setWorkflow(true)
200 ->setDisabled(!$can_edit));
201
202 if ($config->getIsEdit()) {
203 $isedit_name = pht('Unmark as "Edit" Form');
204 $isedit_icon = 'fa-minus';
205 } else {
206 $isedit_name = pht('Mark as "Edit" Form');
207 $isedit_icon = 'fa-plus';
208 }
209
210 $isedit_uri = "{$base_uri}/defaultedit/{$form_key}/";
211
212 $curtain->addAction(
213 id(new PhabricatorActionView())
214 ->setName($isedit_name)
215 ->setIcon($isedit_icon)
216 ->setHref($isedit_uri)
217 ->setWorkflow(true)
218 ->setDisabled(!$can_edit));
219
220 return $curtain;
221 }
222
223 private function buildPropertyView(
224 PhabricatorEditEngineConfiguration $config) {
225 $viewer = $this->getViewer();
226
227 $properties = id(new PHUIPropertyListView())
228 ->setUser($viewer);
229
230 return $properties;
231 }
232
233 private function buildFieldList(PhabricatorEditEngineConfiguration $config) {
234 $viewer = $this->getViewer();
235 $engine = $config->getEngine();
236
237 $fields = $engine->getFieldsForConfig($config);
238
239 $form = id(new AphrontFormView())
240 ->setUser($viewer)
241 ->setAction(null);
242
243 foreach ($fields as $field) {
244 $field->setIsPreview(true);
245
246 $field->appendToForm($form);
247 }
248
249 $info = id(new PHUIInfoView())
250 ->setSeverity(PHUIInfoView::SEVERITY_WARNING)
251 ->setErrors(
252 array(
253 pht('This is a preview of the current form configuration.'),
254 ));
255
256 $box = id(new PHUIObjectBoxView())
257 ->setHeaderText(pht('Form Preview'))
258 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
259 ->setForm($form);
260
261 return array($info, $box);
262 }
263
264}