3 final class PhabricatorEditEngineConfigurationSortController
4 extends PhabricatorEditEngineController
{
6 public function handleRequest(AphrontRequest
$request) {
7 $viewer = $this->getViewer();
8 $engine_key = $request->getURIData('engineKey');
9 $this->setEngineKey($engine_key);
11 $type = $request->getURIData('type');
12 $is_create = ($type == 'create');
14 $engine = id(new PhabricatorEditEngineQuery())
16 ->withEngineKeys(array($engine_key))
17 ->requireCapabilities(
19 PhabricatorPolicyCapability
::CAN_VIEW
,
20 PhabricatorPolicyCapability
::CAN_EDIT
,
24 return id(new Aphront404Response());
27 $cancel_uri = "/transactions/editengine/{$engine_key}/";
28 $reorder_uri = "/transactions/editengine/{$engine_key}/sort/{$type}/";
30 $query = id(new PhabricatorEditEngineConfigurationQuery())
32 ->withEngineKeys(array($engine->getEngineKey()));
35 $query->withIsDefault(true);
37 $query->withIsEdit(true);
40 $configs = $query->execute();
42 // Do this check here (instead of in the Query above) to get a proper
43 // policy exception if the user doesn't satisfy
44 foreach ($configs as $config) {
45 PhabricatorPolicyFilter
::requireCapability(
48 PhabricatorPolicyCapability
::CAN_EDIT
);
52 $configs = msort($configs, 'getCreateSortKey');
54 $configs = msort($configs, 'getEditSortKey');
57 if ($request->isFormPost()) {
58 $form_order = $request->getStrList('formOrder');
60 // NOTE: This has a side-effect of saving any factory-default forms
61 // to the database. We might want to warn the user better, but this
62 // shouldn't generally be very important or confusing.
64 $configs = mpull($configs, null, 'getIdentifier');
65 $configs = array_select_keys($configs, $form_order) +
$configs;
68 foreach ($configs as $config) {
73 PhabricatorEditEngineCreateOrderTransaction
::TRANSACTIONTYPE
;
76 PhabricatorEditEngineEditOrderTransaction
::TRANSACTIONTYPE
;
79 $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())
80 ->setTransactionType($xaction_type)
81 ->setNewValue($order);
83 $editor = id(new PhabricatorEditEngineConfigurationEditor())
85 ->setContentSourceFromRequest($request)
86 ->setContinueOnNoEffect(true);
88 $editor->applyTransactions($config, $xactions);
93 return id(new AphrontRedirectResponse())
94 ->setURI($cancel_uri);
97 $list_id = celerity_generate_unique_node_id();
98 $input_id = celerity_generate_unique_node_id();
100 $list = id(new PHUIObjectItemListView())
105 $form_order = array();
106 foreach ($configs as $config) {
107 $name = $config->getName();
108 $identifier = $config->getIdentifier();
110 $item = id(new PHUIObjectItemView())
113 ->addSigil('editengine-form-config')
116 'formIdentifier' => $identifier,
119 $list->addItem($item);
121 $form_order[] = $identifier;
124 Javelin
::initBehavior(
125 'editengine-reorder-configs',
127 'listID' => $list_id,
128 'inputID' => $input_id,
129 'reorderURI' => $reorder_uri,
133 $title = pht('Reorder Create Forms');
134 $button = pht('Save Create Order');
137 'Drag and drop fields to change the order in which they appear in '.
138 'the application "Create" menu.');
140 $title = pht('Reorder Edit Forms');
141 $button = pht('Save Edit Order');
144 'Drag and drop fields to change their priority for edits. When a '.
145 'user edits an object, they will be shown the first form in this '.
146 'list that they have permission to see.');
149 $note = id(new PHUIInfoView())
150 ->appendChild($note_text)
151 ->setSeverity(PHUIInfoView
::SEVERITY_NOTICE
);
157 'name' => 'formOrder',
158 'value' => implode(', ', $form_order),
162 return $this->newDialog()
164 ->setWidth(AphrontDialogView
::WIDTH_FORM
)
167 ->appendChild($input)
168 ->addSubmitButton(pht('Save Changes'))
169 ->addCancelButton($cancel_uri);