mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-01 19:22:42 +01:00
79f57cf517
Summary: Ref T4264. Currently, you choose a rule's content type (revision, commit, hook) and rule type (global, personal) on the same screen. - I want to make some rule types unavailable for some content types (e.g., personal hooks make little sense). - I want to make content type selection use a radio control instead of a dropdown, so it can explain what the content types do in more detail. - For new "object" hooks, I want to add a third step where you'll pick an object to bind to. Split rule creation out into two steps. I think this won't get complicated enough for `PHUIPagedFormView`, but maybe I'll swap it in if this gets messier than I think. Test Plan: Created some Herald rules, used back/cancel/etc. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4264 Differential Revision: https://secure.phabricator.com/D7845
165 lines
4.7 KiB
PHP
165 lines
4.7 KiB
PHP
<?php
|
|
|
|
final class HeraldNewController extends HeraldController {
|
|
|
|
public function processRequest() {
|
|
$request = $this->getRequest();
|
|
$user = $request->getUser();
|
|
|
|
$content_type_map = HeraldAdapter::getEnabledAdapterMap($user);
|
|
$rule_type_map = HeraldRuleTypeConfig::getRuleTypeMap();
|
|
|
|
$errors = array();
|
|
|
|
$e_type = null;
|
|
$e_rule = null;
|
|
|
|
$step = 0;
|
|
if ($request->isFormPost()) {
|
|
$step = $request->getInt('step');
|
|
$content_type = $request->getStr('content_type');
|
|
if (empty($content_type_map[$content_type])) {
|
|
$errors[] = pht('You must choose a content type for this rule.');
|
|
$e_type = pht('Required');
|
|
$step = 0;
|
|
}
|
|
|
|
if (!$errors && $step > 1) {
|
|
$rule_type = $request->getStr('rule_type');
|
|
if (empty($rule_type_map[$rule_type])) {
|
|
$errors[] = pht('You must choose a rule type for this rule.');
|
|
$e_rule = pht('Required');
|
|
$step = 1;
|
|
}
|
|
}
|
|
|
|
if (!$errors && $step == 2) {
|
|
$uri = id(new PhutilURI('edit/'))
|
|
->setQueryParams(
|
|
array(
|
|
'content_type' => $content_type,
|
|
'rule_type' => $rule_type,
|
|
));
|
|
$uri = $this->getApplicationURI($uri);
|
|
return id(new AphrontRedirectResponse())->setURI($uri);
|
|
}
|
|
}
|
|
|
|
if ($errors) {
|
|
$errors = id(new AphrontErrorView())->setErrors($errors);
|
|
}
|
|
|
|
$form = id(new AphrontFormView())
|
|
->setUser($user)
|
|
->setAction($this->getApplicationURI('new/'));
|
|
|
|
$rule_types = $this->renderRuleTypeControl($rule_type_map, $e_rule);
|
|
|
|
switch ($step) {
|
|
case 0:
|
|
default:
|
|
$form
|
|
->addHiddenInput('step', 1)
|
|
->appendChild(
|
|
id(new AphrontFormSelectControl())
|
|
->setLabel(pht('New Rule for'))
|
|
->setName('content_type')
|
|
->setValue($request->getStr('content_type'))
|
|
->setOptions($content_type_map));
|
|
$cancel_text = null;
|
|
$cancel_uri = $this->getApplicationURI();
|
|
break;
|
|
case 1:
|
|
$form
|
|
->addHiddenInput('content_type', $request->getStr('content_type'))
|
|
->addHiddenInput('step', 2)
|
|
->appendChild($rule_types);
|
|
$cancel_text = pht('Back');
|
|
$cancel_uri = id(new PhutilURI('new/'))
|
|
->setQueryParams(
|
|
array(
|
|
'content_type' => $request->getStr('content_type'),
|
|
'step' => 1,
|
|
));
|
|
$cancel_uri = $this->getApplicationURI($cancel_uri);
|
|
break;
|
|
}
|
|
|
|
|
|
$form
|
|
->appendChild(
|
|
id(new AphrontFormSubmitControl())
|
|
->setValue(pht('Continue'))
|
|
->addCancelButton($cancel_uri, $cancel_text));
|
|
|
|
$form_box = id(new PHUIObjectBoxView())
|
|
->setFormError($errors)
|
|
->setHeaderText(pht('Create Herald Rule'))
|
|
->setForm($form);
|
|
|
|
$crumbs = $this
|
|
->buildApplicationCrumbs()
|
|
->addTextCrumb(pht('Create Rule'));
|
|
|
|
return $this->buildApplicationPage(
|
|
array(
|
|
$crumbs,
|
|
$form_box,
|
|
),
|
|
array(
|
|
'title' => pht('Create Herald Rule'),
|
|
'device' => true,
|
|
));
|
|
}
|
|
|
|
private function renderRuleTypeControl(array $rule_type_map, $e_rule) {
|
|
$request = $this->getRequest();
|
|
|
|
// Reorder array to put "personal" first.
|
|
$rule_type_map = array_select_keys(
|
|
$rule_type_map,
|
|
array(
|
|
HeraldRuleTypeConfig::RULE_TYPE_PERSONAL,
|
|
)) + $rule_type_map;
|
|
|
|
list($can_global, $global_link) = $this->explainApplicationCapability(
|
|
HeraldCapabilityManageGlobalRules::CAPABILITY,
|
|
pht('You have permission to create and manage global rules.'),
|
|
pht('You do not have permission to create or manage global rules.'));
|
|
|
|
$captions = array(
|
|
HeraldRuleTypeConfig::RULE_TYPE_PERSONAL =>
|
|
pht(
|
|
'Personal rules notify you about events. You own them, but they can '.
|
|
'only affect you. Personal rules only trigger for objects you have '.
|
|
'permission to see.'),
|
|
HeraldRuleTypeConfig::RULE_TYPE_GLOBAL =>
|
|
array(
|
|
pht(
|
|
'Global rules notify anyone about events. Global rules can '.
|
|
'bypass access control policies and act on any object.'),
|
|
$global_link,
|
|
),
|
|
);
|
|
|
|
$radio = id(new AphrontFormRadioButtonControl())
|
|
->setLabel(pht('Type'))
|
|
->setName('rule_type')
|
|
->setValue($request->getStr('rule_type'))
|
|
->setError($e_rule);
|
|
|
|
foreach ($rule_type_map as $value => $name) {
|
|
$disabled = ($value == HeraldRuleTypeConfig::RULE_TYPE_GLOBAL) &&
|
|
(!$can_global);
|
|
|
|
$radio->addButton(
|
|
$value,
|
|
$name,
|
|
idx($captions, $value),
|
|
$disabled ? 'disabled' : null,
|
|
$disabled);
|
|
}
|
|
|
|
return $radio;
|
|
}
|
|
}
|