Path: blob/master/src/applications/harbormaster/controller/HarbormasterStepEditController.php
12256 views
<?php12final class HarbormasterStepEditController3extends HarbormasterPlanController {45public function handleRequest(AphrontRequest $request) {6$viewer = $this->getViewer();7$id = $request->getURIData('id');89if ($id) {10$step = id(new HarbormasterBuildStepQuery())11->setViewer($viewer)12->withIDs(array($id))13->requireCapabilities(14array(15PhabricatorPolicyCapability::CAN_VIEW,16PhabricatorPolicyCapability::CAN_EDIT,17))18->executeOne();19if (!$step) {20return new Aphront404Response();21}22$plan = $step->getBuildPlan();2324$is_new = false;25} else {26$plan_id = $request->getURIData('plan');27$class = $request->getURIData('class');2829$plan = id(new HarbormasterBuildPlanQuery())30->setViewer($viewer)31->withIDs(array($plan_id))32->requireCapabilities(33array(34PhabricatorPolicyCapability::CAN_VIEW,35PhabricatorPolicyCapability::CAN_EDIT,36))37->executeOne();38if (!$plan) {39return new Aphront404Response();40}4142$impl = HarbormasterBuildStepImplementation::getImplementation($class);43if (!$impl) {44return new Aphront404Response();45}4647if ($impl->shouldRequireAutotargeting()) {48// No manual creation of autotarget steps.49return new Aphront404Response();50}5152$step = HarbormasterBuildStep::initializeNewStep($viewer)53->setBuildPlanPHID($plan->getPHID())54->setClassName($class);5556$is_new = true;57}5859$plan_uri = $this->getApplicationURI('plan/'.$plan->getID().'/');6061if ($is_new) {62$cancel_uri = $plan_uri;63} else {64$cancel_uri = $this->getApplicationURI('step/view/'.$step->getID().'/');65}6667$implementation = $step->getStepImplementation();6869$field_list = PhabricatorCustomField::getObjectFields(70$step,71PhabricatorCustomField::ROLE_EDIT);72$field_list73->setViewer($viewer)74->readFieldsFromStorage($step);7576$e_name = true;77$v_name = $step->getName();78$e_description = null;79$v_description = $step->getDescription();80$e_depends_on = null;81$v_depends_on = $step->getDetail('dependsOn', array());8283$errors = array();84$validation_exception = null;85if ($request->isFormPost()) {86$e_name = null;87$v_name = $request->getStr('name');88$v_description = $request->getStr('description');89$v_depends_on = $request->getArr('dependsOn');9091$xactions = $field_list->buildFieldTransactionsFromRequest(92new HarbormasterBuildStepTransaction(),93$request);9495$editor = id(new HarbormasterBuildStepEditor())96->setActor($viewer)97->setContinueOnNoEffect(true)98->setContentSourceFromRequest($request);99100$name_xaction = id(new HarbormasterBuildStepTransaction())101->setTransactionType(HarbormasterBuildStepTransaction::TYPE_NAME)102->setNewValue($v_name);103array_unshift($xactions, $name_xaction);104105$depends_on_xaction = id(new HarbormasterBuildStepTransaction())106->setTransactionType(107HarbormasterBuildStepTransaction::TYPE_DEPENDS_ON)108->setNewValue($v_depends_on);109array_unshift($xactions, $depends_on_xaction);110111$description_xaction = id(new HarbormasterBuildStepTransaction())112->setTransactionType(113HarbormasterBuildStepTransaction::TYPE_DESCRIPTION)114->setNewValue($v_description);115array_unshift($xactions, $description_xaction);116117if ($is_new) {118// When creating a new step, make sure we have a create transaction119// so we'll apply the transactions even if the step has no120// configurable options.121$create_xaction = id(new HarbormasterBuildStepTransaction())122->setTransactionType(HarbormasterBuildStepTransaction::TYPE_CREATE);123array_unshift($xactions, $create_xaction);124}125126try {127$editor->applyTransactions($step, $xactions);128129$step_uri = $this->getApplicationURI('step/view/'.$step->getID().'/');130131return id(new AphrontRedirectResponse())->setURI($step_uri);132} catch (PhabricatorApplicationTransactionValidationException $ex) {133$validation_exception = $ex;134}135}136137$form = id(new AphrontFormView())138->setUser($viewer);139140$instructions = $implementation->getEditInstructions();141if (strlen($instructions)) {142$form->appendRemarkupInstructions($instructions);143}144145$form->appendChild(146id(new AphrontFormTextControl())147->setName('name')148->setLabel(pht('Name'))149->setError($e_name)150->setValue($v_name));151152$form->appendChild(id(new AphrontFormDividerControl()));153154$field_list->appendFieldsToForm($form);155156$form->appendChild(id(new AphrontFormDividerControl()));157158$form159->appendControl(160id(new AphrontFormTokenizerControl())161->setDatasource(id(new HarbormasterBuildDependencyDatasource())162->setParameters(array(163'planPHID' => $plan->getPHID(),164'stepPHID' => $is_new ? null : $step->getPHID(),165)))166->setName('dependsOn')167->setLabel(pht('Depends On'))168->setError($e_depends_on)169->setValue($v_depends_on));170171$form172->appendChild(173id(new PhabricatorRemarkupControl())174->setUser($viewer)175->setName('description')176->setLabel(pht('Description'))177->setError($e_description)178->setValue($v_description));179180$crumbs = $this->buildApplicationCrumbs();181$id = $plan->getID();182$crumbs->addTextCrumb(pht('Plan %d', $id), $plan_uri);183184if ($is_new) {185$submit = pht('Create Build Step');186$header = id(new PHUIHeaderView())187->setHeader(pht('New Step: %s', $implementation->getName()))188->setHeaderIcon('fa-plus-square');189$crumbs->addTextCrumb(pht('Add Step'));190} else {191$submit = pht('Save Build Step');192$header = id(new PHUIHeaderView())193->setHeader(pht('Edit Step: %s', $implementation->getName()))194->setHeaderIcon('fa-pencil');195$crumbs->addTextCrumb(pht('Step %d', $step->getID()), $cancel_uri);196$crumbs->addTextCrumb(pht('Edit Step'));197}198$crumbs->setBorder(true);199200$form->appendChild(201id(new AphrontFormSubmitControl())202->setValue($submit)203->addCancelButton($cancel_uri));204205$box = id(new PHUIObjectBoxView())206->setHeaderText(pht('Step'))207->setValidationException($validation_exception)208->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)209->setForm($form);210211$variables = $this->renderBuildVariablesTable();212213if ($is_new) {214$xaction_view = null;215$timeline = null;216} else {217$timeline = $this->buildTransactionTimeline(218$step,219new HarbormasterBuildStepTransactionQuery());220$timeline->setShouldTerminate(true);221}222223$view = id(new PHUITwoColumnView())224->setHeader($header)225->setFooter(array(226$box,227$variables,228$timeline,229));230231return $this->newPage()232->setTitle($implementation->getName())233->setCrumbs($crumbs)234->appendChild($view);235236}237238private function renderBuildVariablesTable() {239$viewer = $this->getRequest()->getUser();240241$variables = HarbormasterBuild::getAvailableBuildVariables();242ksort($variables);243244$rows = array();245$rows[] = pht(246'The following variables can be used in most fields. '.247'To reference a variable, use `%s` in a field.',248'${name}');249$rows[] = sprintf(250'| %s | %s |',251pht('Variable'),252pht('Description'));253$rows[] = '|---|---|';254foreach ($variables as $name => $description) {255$rows[] = '| `'.$name.'` | '.$description.' |';256}257$rows = implode("\n", $rows);258259$form = id(new AphrontFormView())260->setUser($viewer)261->appendRemarkupInstructions($rows);262263return id(new PHUIObjectBoxView())264->setHeaderText(pht('Build Variables'))265->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)266->appendChild($form);267}268269}270271272