3 final class HarbormasterStepViewController
4 extends HarbormasterPlanController
{
6 public function shouldAllowPublic() {
10 public function handleRequest(AphrontRequest
$request) {
11 $viewer = $this->getViewer();
12 $id = $request->getURIData('id');
14 $step = id(new HarbormasterBuildStepQuery())
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(
28 PhabricatorCustomField
::ROLE_VIEW
);
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(
47 new HarbormasterBuildStepTransactionQuery());
48 $timeline->setShouldTerminate(true);
50 $view = id(new PHUITwoColumnView())
52 ->setCurtain($curtain)
53 ->setMainColumn(array(
58 return $this->newPage()
59 ->setTitle(pht('Step %d', $id))
65 private function buildPropertyList(
66 HarbormasterBuildStep
$step,
67 PhabricatorCustomFieldList
$field_list) {
68 $viewer = $this->getViewer();
70 $view = id(new PHUIPropertyListView())
74 $implementation = $step->getStepImplementation();
75 } catch (Exception
$ex) {
76 $implementation = null;
79 if ($implementation) {
80 $type = $implementation->getName();
86 'Invalid Implementation ("%s")!',
87 $step->getClassName()));
90 $view->addProperty(pht('Step Type'), $type);
94 phabricator_datetime($step->getDateCreated(), $viewer));
96 $field_list->appendFieldsToPropertyList(
101 $description = $step->getDescription();
102 if (strlen($description)) {
103 $view->addSectionHeader(
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(
126 PhabricatorPolicyCapability
::CAN_EDIT
);
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'));
137 id(new PhabricatorActionView())
138 ->setName(pht('Delete Step'))
139 ->setHref($this->getApplicationURI("step/delete/{$id}/"))
141 ->setDisabled(!$can_edit)
142 ->setIcon('fa-times'));