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.
8.6 kB · 299 lines
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300<?php
final class PhabricatorProjectTriggerEditController extends PhabricatorProjectTriggerController {
public function handleRequest(AphrontRequest $request) { $request = $this->getRequest(); $viewer = $request->getViewer();
$id = $request->getURIData('id'); if ($id) { $trigger = id(new PhabricatorProjectTriggerQuery()) ->setViewer($viewer) ->withIDs(array($id)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$trigger) { return new Aphront404Response(); } } else { $trigger = PhabricatorProjectTrigger::initializeNewTrigger(); }
$trigger->setViewer($viewer);
$column_phid = $request->getStr('columnPHID'); if ($column_phid) { $column = id(new PhabricatorProjectColumnQuery()) ->setViewer($viewer) ->withPHIDs(array($column_phid)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$column) { return new Aphront404Response(); } $board_uri = $column->getWorkboardURI(); } else { $column = null; $board_uri = null; }
if ($board_uri) { $cancel_uri = $board_uri; } else if ($trigger->getID()) { $cancel_uri = $trigger->getURI(); } else { $cancel_uri = $this->getApplicationURI('trigger/'); }
$v_name = $trigger->getName(); $v_edit = $trigger->getEditPolicy(); $v_rules = $trigger->getTriggerRules();
$e_name = null; $e_edit = null;
$validation_exception = null; if ($request->isFormPost()) { try { $v_name = $request->getStr('name'); $v_edit = $request->getStr('editPolicy');
// Read the JSON rules from the request and convert them back into // "TriggerRule" objects so we can render the correct form state // if the user is modifying the rules $raw_rules = $request->getStr('rules'); $raw_rules = phutil_json_decode($raw_rules);
$copy = clone $trigger; $copy->setRuleset($raw_rules); $v_rules = $copy->getTriggerRules();
$xactions = array(); if (!$trigger->getID()) { $xactions[] = $trigger->getApplicationTransactionTemplate() ->setTransactionType(PhabricatorTransactions::TYPE_CREATE) ->setNewValue(true); }
$xactions[] = $trigger->getApplicationTransactionTemplate() ->setTransactionType( PhabricatorProjectTriggerNameTransaction::TRANSACTIONTYPE) ->setNewValue($v_name);
$xactions[] = $trigger->getApplicationTransactionTemplate() ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY) ->setNewValue($v_edit);
$xactions[] = $trigger->getApplicationTransactionTemplate() ->setTransactionType( PhabricatorProjectTriggerRulesetTransaction::TRANSACTIONTYPE) ->setNewValue($raw_rules);
$editor = $trigger->getApplicationTransactionEditor() ->setActor($viewer) ->setContentSourceFromRequest($request) ->setContinueOnNoEffect(true);
$editor->applyTransactions($trigger, $xactions);
$next_uri = $trigger->getURI();
if ($column) { $column_xactions = array();
$column_xactions[] = $column->getApplicationTransactionTemplate() ->setTransactionType( PhabricatorProjectColumnTriggerTransaction::TRANSACTIONTYPE) ->setNewValue($trigger->getPHID());
$column_editor = $column->getApplicationTransactionEditor() ->setActor($viewer) ->setContentSourceFromRequest($request) ->setContinueOnNoEffect(true) ->setContinueOnMissingFields(true);
$column_editor->applyTransactions($column, $column_xactions);
$next_uri = $column->getWorkboardURI(); }
return id(new AphrontRedirectResponse())->setURI($next_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex;
$e_name = $ex->getShortMessage( PhabricatorProjectTriggerNameTransaction::TRANSACTIONTYPE);
$e_edit = $ex->getShortMessage( PhabricatorTransactions::TYPE_EDIT_POLICY);
$trigger->setEditPolicy($v_edit); } }
if ($trigger->getID()) { $title = $trigger->getObjectName(); $submit = pht('Save Trigger'); $header = pht('Edit Trigger: %s', $trigger->getObjectName()); } else { $title = pht('New Trigger'); $submit = pht('Create Trigger'); $header = pht('New Trigger'); }
$form_id = celerity_generate_unique_node_id(); $table_id = celerity_generate_unique_node_id(); $create_id = celerity_generate_unique_node_id(); $input_id = celerity_generate_unique_node_id();
$form = id(new AphrontFormView()) ->setViewer($viewer) ->setID($form_id);
if ($column) { $form->addHiddenInput('columnPHID', $column->getPHID()); }
$form->appendControl( id(new AphrontFormTextControl()) ->setLabel(pht('Name')) ->setName('name') ->setValue($v_name) ->setError($e_name) ->setPlaceholder($trigger->getDefaultName()));
$policies = id(new PhabricatorPolicyQuery()) ->setViewer($viewer) ->setObject($trigger) ->execute();
$form->appendControl( id(new AphrontFormPolicyControl()) ->setName('editPolicy') ->setPolicyObject($trigger) ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) ->setPolicies($policies) ->setError($e_edit));
$form->appendChild( phutil_tag( 'input', array( 'type' => 'hidden', 'name' => 'rules', 'id' => $input_id, )));
$form->appendChild( id(new PHUIFormInsetView()) ->setTitle(pht('Rules')) ->setDescription( pht( 'When a card is dropped into a column which uses this trigger:')) ->setRightButton( javelin_tag( 'a', array( 'href' => '#', 'class' => 'button button-green', 'id' => $create_id, 'mustcapture' => true, ), pht('New Rule'))) ->setContent( javelin_tag( 'table', array( 'id' => $table_id, 'class' => 'trigger-rules-table', ))));
$this->setupEditorBehavior( $trigger, $v_rules, $form_id, $table_id, $create_id, $input_id);
$form->appendControl( id(new AphrontFormSubmitControl()) ->setValue($submit) ->addCancelButton($cancel_uri));
$header = id(new PHUIHeaderView()) ->setHeader($header);
$box_view = id(new PHUIObjectBoxView()) ->setHeader($header) ->setValidationException($validation_exception) ->appendChild($form);
$column_view = id(new PHUITwoColumnView()) ->setFooter($box_view);
$crumbs = $this->buildApplicationCrumbs() ->setBorder(true);
if ($column) { $crumbs->addTextCrumb( pht( '%s: %s', $column->getProject()->getDisplayName(), $column->getName()), $board_uri); }
$crumbs->addTextCrumb($title);
return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) ->appendChild($column_view); }
private function setupEditorBehavior( PhabricatorProjectTrigger $trigger, array $rule_list, $form_id, $table_id, $create_id, $input_id) {
$rule_list = mpull($rule_list, 'toDictionary'); $rule_list = array_values($rule_list);
$type_list = PhabricatorProjectTriggerRule::getAllTriggerRules();
foreach ($type_list as $rule) { $rule->setViewer($this->getViewer()); } $type_list = mpull($type_list, 'newTemplate'); $type_list = array_values($type_list);
require_celerity_resource('project-triggers-css');
Javelin::initBehavior( 'trigger-rule-editor', array( 'formNodeID' => $form_id, 'tableNodeID' => $table_id, 'createNodeID' => $create_id, 'inputNodeID' => $input_id,
'rules' => $rule_list, 'types' => $type_list, )); }
}