Something went wrong. Try again.
@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
Something went wrong. Try again.
6.7 kB · 206 lines
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207<?php
final class PhabricatorProjectColumnEditController extends PhabricatorProjectBoardController {
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $project_id = $request->getURIData('projectID');
$project = id(new PhabricatorProjectQuery()) ->setViewer($viewer) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->withIDs(array($project_id)) ->needImages(true) ->executeOne();
if (!$project) { return new Aphront404Response(); } $this->setProject($project);
$is_new = ($id ? false : true);
if (!$is_new) { $column = id(new PhabricatorProjectColumnQuery()) ->setViewer($viewer) ->withIDs(array($id)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$column) { return new Aphront404Response(); } } else { $column = PhabricatorProjectColumn::initializeNewColumn($viewer); }
$e_name = null; $e_limit = null; $e_milestone_name = null;
$v_limit = $column->getPointLimit(); $v_name = $column->getName();
$proxy = $column->getProxy();
// Is this a normal Column? Example: when true, this is not a Milestone. $is_column = !$proxy;
// Is this a Milestone? Example: when true, this is not a normal Column. $is_milestone = $proxy && $proxy->isMilestone();
// Milestone name, eventually coming from the proxed object. $v_milestone_name = null; if ($is_milestone) { $v_milestone_name = $proxy->getName(); }
$validation_exception = null; $view_uri = $project->getWorkboardURI();
if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_limit = $request->getStr('limit'); $v_milestone_name = $request->getStr('milestone.name');
if ($is_new) { $column->setProjectPHID($project->getPHID()); $column->attachProject($project);
$columns = id(new PhabricatorProjectColumnQuery()) ->setViewer($viewer) ->withProjectPHIDs(array($project->getPHID())) ->execute();
$new_sequence = 1; if ($columns) { $values = mpull($columns, 'getSequence'); $new_sequence = max($values) + 1; } $column->setSequence($new_sequence); }
$xactions = array(); $xactions_milestone = array();
$type_name = PhabricatorProjectColumnNameTransaction::TRANSACTIONTYPE; $type_limit = PhabricatorProjectColumnLimitTransaction::TRANSACTIONTYPE; $type_project_name = PhabricatorProjectNameTransaction::TRANSACTIONTYPE;
if ($is_column) { // Transaction for Column name. $xactions[] = id(new PhabricatorProjectColumnTransaction()) ->setTransactionType($type_name) ->setNewValue($v_name); } else if ($is_milestone) { // Transaction for Milestone name (that internally is a Project Name). $xactions_milestone[] = id(new PhabricatorProjectTransaction()) ->setTransactionType($type_project_name) ->setNewValue($v_milestone_name); }
$xactions[] = id(new PhabricatorProjectColumnTransaction()) ->setTransactionType($type_limit) ->setNewValue($v_limit);
try { $editor = id(new PhabricatorProjectColumnTransactionEditor()) ->setActor($viewer) ->setContinueOnNoEffect(true) ->setContentSourceFromRequest($request) ->applyTransactions($column, $xactions); } catch (PhabricatorApplicationTransactionValidationException $ex) { // Error messages related to the Column (like invalid Name, etc.) $e_name = $ex->getShortMessage($type_name); $e_limit = $ex->getShortMessage($type_limit); $validation_exception = $ex; }
// Save Milestone-related stuff but only if there were no prior problems // and only if we have changes. if (!$validation_exception && $xactions_milestone) { try { $editor_milestone = id(new PhabricatorProjectTransactionEditor()) ->setActor($viewer) ->setContinueOnNoEffect(true) ->setContentSourceFromRequest($request) ->applyTransactions($proxy, $xactions_milestone); } catch (PhabricatorApplicationTransactionValidationException $ex) { // Error messages related to the Milestone (like invalid Name, etc.) $e_milestone_name = $ex->getShortMessage($type_project_name); $validation_exception = $ex; } }
// Refresh the page only if there are no errors to show. if (!$validation_exception) { return id(new AphrontRedirectResponse())->setURI($view_uri); } }
$form = id(new AphrontFormView()) ->setUser($request->getUser());
// Show the most appropriate input field for the name. if ($is_column) { $form->appendChild( id(new AphrontFormTextControl()) ->setValue($v_name) ->setLabel(pht('Name')) ->setName('name') ->setError($e_name)); } else if ($is_milestone) { $form->appendChild( id(new AphrontFormTextControl()) ->setValue($v_milestone_name) ->setLabel(pht('Milestone Name')) ->setName('milestone.name') ->setError($e_milestone_name)); }
// The "limit" has always had a dual purpose. // Let's make it more obvious. if (ManiphestTaskPoints::getIsEnabled()) { $limit_label = pht('Point Limit'); $limit_caption = pht('Maximum number of points of tasks allowed in the column.'); } else { $limit_label = pht('Count Limit'); $limit_caption = pht('Maximum number of tasks allowed in the column.'); }
$form->appendChild( id(new AphrontFormTextControl()) ->setValue($v_limit) ->setLabel($limit_label) ->setName('limit') ->setError($e_limit) ->setCaption($limit_caption));
if ($is_new) { $title = pht('Create Column'); $submit = pht('Create Column'); } else { $title = pht('Edit %s', $column->getDisplayName()); $submit = pht('Save Column'); }
return $this->newDialog() ->setWidth(AphrontDialogView::WIDTH_FORM) ->setTitle($title) ->appendForm($form) ->setValidationException($validation_exception) ->addCancelButton($view_uri) ->addSubmitButton($submit);
}}