Remove all "FileHasObject" edge reads and writes
[phabricator.git] / src / applications / harbormaster / controller / HarbormasterStepViewController.php
blobd4f15922642e69befeb78fad6ebb48e8dd9d7a7a
1 <?php
3 final class HarbormasterStepViewController
4 extends HarbormasterPlanController {
6 public function shouldAllowPublic() {
7 return true;
10 public function handleRequest(AphrontRequest $request) {
11 $viewer = $this->getViewer();
12 $id = $request->getURIData('id');
14 $step = id(new HarbormasterBuildStepQuery())
15 ->setViewer($viewer)
16 ->withIDs(array($id))
17 ->executeOne();
18 if (!$step) {
19 return new Aphront404Response();
21 $plan = $step->getBuildPlan();
23 $plan_id = $plan->getID();
24 $plan_uri = $this->getApplicationURI("plan/{$plan_id}/");
26 $field_list = PhabricatorCustomField::getObjectFields(
27 $step,
28 PhabricatorCustomField::ROLE_VIEW);
29 $field_list
30 ->setViewer($viewer)
31 ->readFieldsFromStorage($step);
33 $crumbs = $this->buildApplicationCrumbs();
34 $crumbs->addTextCrumb(pht('Plan %d', $plan_id), $plan_uri);
35 $crumbs->addTextCrumb(pht('Step %d', $id));
36 $crumbs->setBorder(true);
38 $header = id(new PHUIHeaderView())
39 ->setHeader(pht('Build Step %d: %s', $id, $step->getName()))
40 ->setHeaderIcon('fa-chevron-circle-right');
42 $properties = $this->buildPropertyList($step, $field_list);
43 $curtain = $this->buildCurtainView($step);
45 $timeline = $this->buildTransactionTimeline(
46 $step,
47 new HarbormasterBuildStepTransactionQuery());
48 $timeline->setShouldTerminate(true);
50 $view = id(new PHUITwoColumnView())
51 ->setHeader($header)
52 ->setCurtain($curtain)
53 ->setMainColumn(array(
54 $properties,
55 $timeline,
56 ));
58 return $this->newPage()
59 ->setTitle(pht('Step %d', $id))
60 ->setCrumbs($crumbs)
61 ->appendChild($view);
65 private function buildPropertyList(
66 HarbormasterBuildStep $step,
67 PhabricatorCustomFieldList $field_list) {
68 $viewer = $this->getViewer();
70 $view = id(new PHUIPropertyListView())
71 ->setUser($viewer);
73 try {
74 $implementation = $step->getStepImplementation();
75 } catch (Exception $ex) {
76 $implementation = null;
79 if ($implementation) {
80 $type = $implementation->getName();
81 } else {
82 $type = phutil_tag(
83 'em',
84 array(),
85 pht(
86 'Invalid Implementation ("%s")!',
87 $step->getClassName()));
90 $view->addProperty(pht('Step Type'), $type);
92 $view->addProperty(
93 pht('Created'),
94 phabricator_datetime($step->getDateCreated(), $viewer));
96 $field_list->appendFieldsToPropertyList(
97 $step,
98 $viewer,
99 $view);
101 $description = $step->getDescription();
102 if (strlen($description)) {
103 $view->addSectionHeader(
104 pht('Description'),
105 PHUIPropertyListView::ICON_SUMMARY);
106 $view->addTextContent(
107 new PHUIRemarkupView($viewer, $description));
110 return id(new PHUIObjectBoxView())
111 ->setHeaderText(pht('Properties'))
112 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
113 ->appendChild($view);
117 private function buildCurtainView(HarbormasterBuildStep $step) {
118 $viewer = $this->getViewer();
119 $id = $step->getID();
121 $curtain = $this->newCurtainView($step);
123 $can_edit = PhabricatorPolicyFilter::hasCapability(
124 $viewer,
125 $step,
126 PhabricatorPolicyCapability::CAN_EDIT);
128 $curtain->addAction(
129 id(new PhabricatorActionView())
130 ->setName(pht('Edit Step'))
131 ->setHref($this->getApplicationURI("step/edit/{$id}/"))
132 ->setWorkflow(!$can_edit)
133 ->setDisabled(!$can_edit)
134 ->setIcon('fa-pencil'));
136 $curtain->addAction(
137 id(new PhabricatorActionView())
138 ->setName(pht('Delete Step'))
139 ->setHref($this->getApplicationURI("step/delete/{$id}/"))
140 ->setWorkflow(true)
141 ->setDisabled(!$can_edit)
142 ->setIcon('fa-times'));
144 return $curtain;