Skip to content

Commit b9d60d2

Browse files
author
epriestley
committedMar 2, 2017
Allow EditEngine forms for objects which support subtyping to have a subtype configured
Summary: Ref T12314. This adds a "Change Form Subtype" workflow to the EditEngine form configuration screen, for forms that edit/create objects which support subtyping (for now, only tasks). For example, this allows you to switch a form from being a "task" form to a "plant" or "animal" form. Doing this doesn't yet do anything useful or interesting. I'm also not showing it in the UI yet since I'm not sure what we should make that look like (presumably, we should just echo whatever UI we end up with on tasks). Test Plan: - Changed the subtype of a task form. - Verified that the "Change Subtype" action doesn't appear on other forms (for example, those for Pastes). {F3491374} Reviewers: chad Reviewed By: chad Maniphest Tasks: T12314 Differential Revision: https://secure.phabricator.com/D17442
1 parent dc7ecf5 commit b9d60d2

10 files changed

+198
-0
lines changed
 

‎src/__phutil_library_map__.php

+2
Original file line numberDiff line numberDiff line change
@@ -2610,6 +2610,7 @@
26102610
'PhabricatorEditEngineConfigurationSaveController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSaveController.php',
26112611
'PhabricatorEditEngineConfigurationSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineConfigurationSearchEngine.php',
26122612
'PhabricatorEditEngineConfigurationSortController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSortController.php',
2613+
'PhabricatorEditEngineConfigurationSubtypeController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php',
26132614
'PhabricatorEditEngineConfigurationTransaction' => 'applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php',
26142615
'PhabricatorEditEngineConfigurationTransactionQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationTransactionQuery.php',
26152616
'PhabricatorEditEngineConfigurationViewController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php',
@@ -7669,6 +7670,7 @@
76697670
'PhabricatorEditEngineConfigurationSaveController' => 'PhabricatorEditEngineController',
76707671
'PhabricatorEditEngineConfigurationSearchEngine' => 'PhabricatorApplicationSearchEngine',
76717672
'PhabricatorEditEngineConfigurationSortController' => 'PhabricatorEditEngineController',
7673+
'PhabricatorEditEngineConfigurationSubtypeController' => 'PhabricatorEditEngineController',
76727674
'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorApplicationTransaction',
76737675
'PhabricatorEditEngineConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
76747676
'PhabricatorEditEngineConfigurationViewController' => 'PhabricatorEditEngineController',

‎src/applications/maniphest/storage/ManiphestTask.php

+5
Original file line numberDiff line numberDiff line change
@@ -557,4 +557,9 @@ public function setEditEngineSubtype($value) {
557557
return $this->setSubtype($value);
558558
}
559559

560+
public function newEditEngineSubtypeMap() {
561+
$config = PhabricatorEnv::getEnvConfig('maniphest.subtypes');
562+
return PhabricatorEditEngineSubtype::newSubtypeMap($config);
563+
}
564+
560565
}

‎src/applications/transactions/application/PhabricatorTransactionsApplication.php

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public function getRoutes() {
5555
'PhabricatorEditEngineConfigurationDefaultsController',
5656
'lock/(?P<key>[^/]+)/' =>
5757
'PhabricatorEditEngineConfigurationLockController',
58+
'subtype/(?P<key>[^/]+)/' =>
59+
'PhabricatorEditEngineConfigurationSubtypeController',
5860
'defaultcreate/(?P<key>[^/]+)/' =>
5961
'PhabricatorEditEngineConfigurationDefaultCreateController',
6062
'defaultedit/(?P<key>[^/]+)/' =>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
final class PhabricatorEditEngineConfigurationSubtypeController
4+
extends PhabricatorEditEngineController {
5+
6+
public function handleRequest(AphrontRequest $request) {
7+
$engine_key = $request->getURIData('engineKey');
8+
$this->setEngineKey($engine_key);
9+
10+
$key = $request->getURIData('key');
11+
$viewer = $this->getViewer();
12+
13+
$config = id(new PhabricatorEditEngineConfigurationQuery())
14+
->setViewer($viewer)
15+
->withEngineKeys(array($engine_key))
16+
->withIdentifiers(array($key))
17+
->requireCapabilities(
18+
array(
19+
PhabricatorPolicyCapability::CAN_VIEW,
20+
PhabricatorPolicyCapability::CAN_EDIT,
21+
))
22+
->executeOne();
23+
if (!$config) {
24+
return new Aphront404Response();
25+
}
26+
27+
$cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/";
28+
29+
$engine = $config->getEngine();
30+
if (!$engine->supportsSubtypes()) {
31+
return new Aphront404Response();
32+
}
33+
34+
if ($request->isFormPost()) {
35+
$xactions = array();
36+
37+
$subtype = $request->getStr('subtype');
38+
$type_subtype =
39+
PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE;
40+
41+
$xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())
42+
->setTransactionType($type_subtype)
43+
->setNewValue($subtype);
44+
45+
$editor = id(new PhabricatorEditEngineConfigurationEditor())
46+
->setActor($viewer)
47+
->setContentSourceFromRequest($request)
48+
->setContinueOnMissingFields(true)
49+
->setContinueOnNoEffect(true);
50+
51+
$editor->applyTransactions($config, $xactions);
52+
53+
return id(new AphrontRedirectResponse())
54+
->setURI($cancel_uri);
55+
}
56+
57+
$fields = $engine->getFieldsForConfig($config);
58+
59+
$help = pht(<<<EOTEXT
60+
Choose the object **subtype** that this form should create and edit.
61+
EOTEXT
62+
);
63+
64+
$map = $engine->newSubtypeMap();
65+
$map = mpull($map, 'getName');
66+
67+
$form = id(new AphrontFormView())
68+
->setUser($viewer)
69+
->appendRemarkupInstructions($help)
70+
->appendControl(
71+
id(new AphrontFormSelectControl())
72+
->setName('subtype')
73+
->setLabel(pht('Subtype'))
74+
->setValue($config->getSubtype())
75+
->setOptions($map));
76+
77+
return $this->newDialog()
78+
->setTitle(pht('Change Form Subtype'))
79+
->setWidth(AphrontDialogView::WIDTH_FORM)
80+
->appendForm($form)
81+
->addSubmitButton(pht('Save Changes'))
82+
->addCancelButton($cancel_uri);
83+
}
84+
85+
}

‎src/applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php

+21
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,27 @@ private function buildCurtainView(
151151
->setWorkflow(true)
152152
->setDisabled(!$can_edit));
153153

154+
if ($engine->supportsSubtypes()) {
155+
$subtype_uri = "{$base_uri}/subtype/{$form_key}/";
156+
157+
$curtain->addAction(
158+
id(new PhabricatorActionView())
159+
->setName(pht('Change Form Subtype'))
160+
->setIcon('fa-drivers-license-o')
161+
->setHref($subtype_uri)
162+
->setWorkflow(true)
163+
->setDisabled(!$can_edit));
164+
}
165+
166+
$curtain->addAction(
167+
id(new PhabricatorActionView())
168+
->setName(pht('Change Default Values'))
169+
->setIcon('fa-paint-brush')
170+
->setHref($defaults_uri)
171+
->setWorkflow(!$can_edit)
172+
->setDisabled(!$can_edit));
173+
174+
154175
$disable_uri = "{$base_uri}/disable/{$form_key}/";
155176

156177
if ($config->getIsDisabled()) {

‎src/applications/transactions/editengine/PhabricatorEditEngine.php

+14
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,20 @@ protected function willConfigureFields($object, array $fields) {
213213
return $fields;
214214
}
215215

216+
final public function supportsSubtypes() {
217+
try {
218+
$object = $this->newEditableObject();
219+
} catch (Exception $ex) {
220+
return false;
221+
}
222+
223+
return ($object instanceof PhabricatorEditEngineSubtypeInterface);
224+
}
225+
226+
final public function newSubtypeMap() {
227+
return $this->newEditableObject()->newEditEngineSubtypeMap();
228+
}
229+
216230

217231
/* -( Display Text )------------------------------------------------------- */
218232

‎src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php

+36
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,27 @@ final class PhabricatorEditEngineSubtype
66

77
const SUBTYPE_DEFAULT = 'default';
88

9+
private $key;
10+
private $name;
11+
12+
public function setKey($key) {
13+
$this->key = $key;
14+
return $this;
15+
}
16+
17+
public function getKey() {
18+
return $this->key;
19+
}
20+
21+
public function setName($name) {
22+
$this->name = $name;
23+
return $this;
24+
}
25+
26+
public function getName() {
27+
return $this->name;
28+
}
29+
930
public static function validateSubtypeKey($subtype) {
1031
if (strlen($subtype) > 64) {
1132
throw new Exception(
@@ -81,4 +102,19 @@ public static function validateConfiguration($config) {
81102
}
82103
}
83104

105+
public static function newSubtypeMap(array $config) {
106+
$map = array();
107+
108+
foreach ($config as $entry) {
109+
$key = $entry['key'];
110+
$name = $entry['name'];
111+
112+
$map[$key] = id(new self())
113+
->setKey($key)
114+
->setName($name);
115+
}
116+
117+
return $map;
118+
}
119+
84120
}

‎src/applications/transactions/editengine/PhabricatorEditEngineSubtypeInterface.php

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ interface PhabricatorEditEngineSubtypeInterface {
44

55
public function getEditEngineSubtype();
66
public function setEditEngineSubtype($subtype);
7+
public function newEditEngineSubtypeMap();
78

89
}

‎src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php

+25
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public function getTransactionTypes() {
2121
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER;
2222
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT;
2323
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS;
24+
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE;
2425
$types[] =
2526
PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE;
2627
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT;
@@ -55,6 +56,22 @@ protected function validateTransaction(
5556
$errors[] = $error;
5657
}
5758
break;
59+
case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE:
60+
$map = $object->getEngine()->newSubtypeMap();
61+
foreach ($xactions as $xaction) {
62+
$new = $xaction->getNewValue();
63+
64+
if (isset($map[$new])) {
65+
continue;
66+
}
67+
68+
$errors[] = new PhabricatorApplicationTransactionValidationError(
69+
$type,
70+
pht('Invalid'),
71+
pht('Subtype "%s" is not a valid subtype.', $new),
72+
$xaction);
73+
}
74+
break;
5875
}
5976

6077
return $errors;
@@ -76,6 +93,8 @@ protected function getCustomTransactionOldValue(
7693
return $object->getFieldDefault($field_key);
7794
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
7895
return $object->getFieldLocks();
96+
case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE:
97+
return $object->getSubtype();
7998
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE:
8099
return (int)$object->getIsDefault();
81100
case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT:
@@ -86,6 +105,7 @@ protected function getCustomTransactionOldValue(
86105
return (int)$object->getCreateOrder();
87106
case PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER:
88107
return (int)$object->getEditOrder();
108+
89109
}
90110
}
91111

@@ -99,6 +119,7 @@ protected function getCustomTransactionNewValue(
99119
case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER:
100120
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT:
101121
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
122+
case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE:
102123
return $xaction->getNewValue();
103124
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE:
104125
case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT:
@@ -130,6 +151,9 @@ protected function applyCustomInternalTransaction(
130151
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
131152
$object->setFieldLocks($xaction->getNewValue());
132153
return;
154+
case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE:
155+
$object->setSubtype($xaction->getNewValue());
156+
return;
133157
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE:
134158
$object->setIsDefault($xaction->getNewValue());
135159
return;
@@ -161,6 +185,7 @@ protected function applyCustomExternalTransaction(
161185
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT:
162186
case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT:
163187
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
188+
case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE:
164189
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE:
165190
case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE:
166191
case PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER:

‎src/applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php

+7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ final class PhabricatorEditEngineConfigurationTransaction
1313
const TYPE_DISABLE = 'editengine.config.disable';
1414
const TYPE_CREATEORDER = 'editengine.order.create';
1515
const TYPE_EDITORDER = 'editengine.order.edit';
16+
const TYPE_SUBTYPE = 'editengine.config.subtype';
1617

1718
public function getApplicationName() {
1819
return 'search';
@@ -99,6 +100,12 @@ public function getTitle() {
99100
'%s enabled this form.',
100101
$this->renderHandleLink($author_phid));
101102
}
103+
case self::TYPE_SUBTYPE:
104+
return pht(
105+
'%s changed the subtype of this form from "%s" to "%s".',
106+
$this->renderHandleLink($author_phid),
107+
$old,
108+
$new);
102109
}
103110

104111
return parent::getTitle();

0 commit comments

Comments
 (0)
Failed to load comments.