@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 AlmanacServiceEditController
4 extends AlmanacServiceController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $engine = id(new AlmanacServiceEditEngine())
8 ->setController($this);
9
10 $id = $request->getURIData('id');
11 if (!$id) {
12 $this->requireApplicationCapability(
13 AlmanacCreateServicesCapability::CAPABILITY);
14
15 $list_uri = $this->getApplicationURI('service/');
16
17 $service_type = $request->getStr('serviceType');
18 $service_types = AlmanacServiceType::getAllServiceTypes();
19 if ($service_type === null || empty($service_types[$service_type])) {
20 return $this->buildServiceTypeResponse($list_uri);
21 }
22
23 $engine
24 ->addContextParameter('serviceType', $service_type)
25 ->setServiceType($service_type);
26 }
27
28 return $engine->buildResponse();
29 }
30
31 private function buildServiceTypeResponse($cancel_uri) {
32 $service_types = AlmanacServiceType::getAllServiceTypes();
33
34 $request = $this->getRequest();
35 $viewer = $this->getViewer();
36
37 $e_service = null;
38 $errors = array();
39 if ($request->isFormPost()) {
40 $e_service = pht('Required');
41 $errors[] = pht(
42 'To create a new service, you must select a service type.');
43 }
44
45 list($can_cluster, $cluster_link) = $this->explainApplicationCapability(
46 AlmanacManageClusterServicesCapability::CAPABILITY,
47 pht('You have permission to create cluster services.'),
48 pht('You do not have permission to create new cluster services.'));
49
50 $type_control = id(new AphrontFormRadioButtonControl())
51 ->setLabel(pht('Service Type'))
52 ->setName('serviceType')
53 ->setError($e_service);
54
55 foreach ($service_types as $service_type) {
56 $is_cluster = $service_type->isClusterServiceType();
57 $is_disabled = ($is_cluster && !$can_cluster);
58
59 if ($is_cluster) {
60 $extra = $cluster_link;
61 } else {
62 $extra = null;
63 }
64
65 $type_control->addButton(
66 $service_type->getServiceTypeConstant(),
67 $service_type->getServiceTypeName(),
68 array(
69 $service_type->getServiceTypeDescription(),
70 $extra,
71 ),
72 $is_disabled ? 'disabled' : null,
73 $is_disabled);
74 }
75
76 $crumbs = $this->buildApplicationCrumbs();
77 $crumbs->addTextCrumb(pht('Create Service'));
78 $crumbs->setBorder(true);
79
80 $title = pht('Choose Service Type');
81 $header = id(new PHUIHeaderView())
82 ->setHeader(pht('Create Service'))
83 ->setHeaderIcon('fa-plus-square');
84
85 $form = id(new AphrontFormView())
86 ->setUser($viewer)
87 ->appendChild($type_control)
88 ->appendChild(
89 id(new AphrontFormSubmitControl())
90 ->setValue(pht('Continue'))
91 ->addCancelButton($cancel_uri));
92
93 $box = id(new PHUIObjectBoxView())
94 ->setFormErrors($errors)
95 ->setHeaderText(pht('Service'))
96 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
97 ->setForm($form);
98
99 $view = id(new PHUITwoColumnView())
100 ->setHeader($header)
101 ->setFooter(array(
102 $box,
103 ));
104
105 return $this->newPage()
106 ->setTitle($title)
107 ->setCrumbs($crumbs)
108 ->appendChild($view);
109
110 }
111
112}