@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
at upstream/main 126 lines 3.4 kB view raw
1<?php 2 3final class PhabricatorEditEngineConfigurationReorderController 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 id(new Aphront404Response()); 25 } 26 27 $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; 28 $reorder_uri = "/transactions/editengine/{$engine_key}/reorder/{$key}/"; 29 30 if ($request->isFormPost()) { 31 $xactions = array(); 32 $key_order = $request->getStrList('keyOrder'); 33 34 $type_order = PhabricatorEditEngineOrderTransaction::TRANSACTIONTYPE; 35 $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction()) 36 ->setTransactionType($type_order) 37 ->setNewValue($key_order); 38 39 $editor = id(new PhabricatorEditEngineConfigurationEditor()) 40 ->setActor($viewer) 41 ->setContentSourceFromRequest($request) 42 ->setContinueOnMissingFields(true) 43 ->setContinueOnNoEffect(true); 44 45 $editor->applyTransactions($config, $xactions); 46 47 return id(new AphrontRedirectResponse()) 48 ->setURI($cancel_uri); 49 } 50 51 $engine = $config->getEngine(); 52 $fields = $engine->getFieldsForConfig($config); 53 54 $list_id = celerity_generate_unique_node_id(); 55 $input_id = celerity_generate_unique_node_id(); 56 57 $list = id(new PHUIObjectItemListView()) 58 ->setUser($viewer) 59 ->setID($list_id) 60 ->setFlush(true); 61 62 $key_order = array(); 63 foreach ($fields as $field) { 64 if (!$field->getIsFormField()) { 65 continue; 66 } 67 68 if (!$field->getIsReorderable()) { 69 continue; 70 } 71 72 $label = $field->getLabel(); 73 $key = $field->getKey(); 74 75 if ($label !== null) { 76 $header = $label; 77 } else { 78 $header = $key; 79 } 80 81 $item = id(new PHUIObjectItemView()) 82 ->setHeader($header) 83 ->setGrippable(true) 84 ->addSigil('editengine-form-field') 85 ->setMetadata( 86 array( 87 'fieldKey' => $key, 88 )); 89 90 $list->addItem($item); 91 92 $key_order[] = $key; 93 } 94 95 Javelin::initBehavior( 96 'editengine-reorder-fields', 97 array( 98 'listID' => $list_id, 99 'inputID' => $input_id, 100 'reorderURI' => $reorder_uri, 101 )); 102 103 $note = id(new PHUIInfoView()) 104 ->appendChild(pht('Drag and drop fields to reorder them.')) 105 ->setSeverity(PHUIInfoView::SEVERITY_NOTICE); 106 107 $input = phutil_tag( 108 'input', 109 array( 110 'type' => 'hidden', 111 'name' => 'keyOrder', 112 'value' => implode(', ', $key_order), 113 'id' => $input_id, 114 )); 115 116 return $this->newDialog() 117 ->setTitle(pht('Reorder Fields')) 118 ->setWidth(AphrontDialogView::WIDTH_FORM) 119 ->appendChild($note) 120 ->appendChild($list) 121 ->appendChild($input) 122 ->addSubmitButton(pht('Save Changes')) 123 ->addCancelButton($cancel_uri); 124 } 125 126}