@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
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Modularize PhabricatorEditEngineConfigurationTransaction

Summary: Ref T13319. Ref PHI1302. Migrate `PhabricatorEditEngineConfigurationTransaction` to modular transactions and add some additional transaction rendering to make these edits less opaque.

Test Plan: Hit all the form edit controllers, viewed resulting transaction timeline.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T13319

Differential Revision: https://secure.phabricator.com/D20595

+701 -591
+30 -2
src/__phutil_library_map__.php
··· 2172 2172 'PhabricatorApplicationTransactionCommentView' => 'applications/transactions/view/PhabricatorApplicationTransactionCommentView.php', 2173 2173 'PhabricatorApplicationTransactionController' => 'applications/transactions/controller/PhabricatorApplicationTransactionController.php', 2174 2174 'PhabricatorApplicationTransactionDetailController' => 'applications/transactions/controller/PhabricatorApplicationTransactionDetailController.php', 2175 + 'PhabricatorApplicationTransactionDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionDetailView.php', 2175 2176 'PhabricatorApplicationTransactionEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionEditor.php', 2176 2177 'PhabricatorApplicationTransactionFeedStory' => 'applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php', 2177 2178 'PhabricatorApplicationTransactionInterface' => 'applications/transactions/interface/PhabricatorApplicationTransactionInterface.php', 2179 + 'PhabricatorApplicationTransactionJSONDiffDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionJSONDiffDetailView.php', 2178 2180 'PhabricatorApplicationTransactionNoEffectException' => 'applications/transactions/exception/PhabricatorApplicationTransactionNoEffectException.php', 2179 2181 'PhabricatorApplicationTransactionNoEffectResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionNoEffectResponse.php', 2180 2182 'PhabricatorApplicationTransactionPublishWorker' => 'applications/transactions/worker/PhabricatorApplicationTransactionPublishWorker.php', ··· 3151 3153 'PhabricatorEditEngineConfigurationTransactionQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationTransactionQuery.php', 3152 3154 'PhabricatorEditEngineConfigurationViewController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php', 3153 3155 'PhabricatorEditEngineController' => 'applications/transactions/controller/PhabricatorEditEngineController.php', 3156 + 'PhabricatorEditEngineCreateOrderTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineCreateOrderTransaction.php', 3154 3157 'PhabricatorEditEngineDatasource' => 'applications/transactions/typeahead/PhabricatorEditEngineDatasource.php', 3158 + 'PhabricatorEditEngineDefaultCreateTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineDefaultCreateTransaction.php', 3155 3159 'PhabricatorEditEngineDefaultLock' => 'applications/transactions/editengine/PhabricatorEditEngineDefaultLock.php', 3160 + 'PhabricatorEditEngineDefaultTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineDefaultTransaction.php', 3161 + 'PhabricatorEditEngineDisableTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineDisableTransaction.php', 3162 + 'PhabricatorEditEngineEditOrderTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineEditOrderTransaction.php', 3156 3163 'PhabricatorEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorEditEngineExtension.php', 3157 3164 'PhabricatorEditEngineExtensionModule' => 'applications/transactions/engineextension/PhabricatorEditEngineExtensionModule.php', 3165 + 'PhabricatorEditEngineIsEditTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineIsEditTransaction.php', 3158 3166 'PhabricatorEditEngineListController' => 'applications/transactions/controller/PhabricatorEditEngineListController.php', 3159 3167 'PhabricatorEditEngineLock' => 'applications/transactions/editengine/PhabricatorEditEngineLock.php', 3160 3168 'PhabricatorEditEngineLockableInterface' => 'applications/transactions/editengine/PhabricatorEditEngineLockableInterface.php', 3169 + 'PhabricatorEditEngineLocksTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineLocksTransaction.php', 3161 3170 'PhabricatorEditEngineMFAEngine' => 'applications/transactions/editengine/PhabricatorEditEngineMFAEngine.php', 3162 3171 'PhabricatorEditEngineMFAInterface' => 'applications/transactions/editengine/PhabricatorEditEngineMFAInterface.php', 3172 + 'PhabricatorEditEngineNameTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineNameTransaction.php', 3173 + 'PhabricatorEditEngineOrderTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineOrderTransaction.php', 3163 3174 'PhabricatorEditEnginePointsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEnginePointsCommentAction.php', 3175 + 'PhabricatorEditEnginePreambleTransaction' => 'applications/transactions/xaction/PhabricatorEditEnginePreambleTransaction.php', 3164 3176 'PhabricatorEditEngineProfileMenuItem' => 'applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php', 3165 3177 'PhabricatorEditEngineQuery' => 'applications/transactions/query/PhabricatorEditEngineQuery.php', 3166 3178 'PhabricatorEditEngineSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineSearchEngine.php', ··· 3171 3183 'PhabricatorEditEngineSubtypeInterface' => 'applications/transactions/editengine/PhabricatorEditEngineSubtypeInterface.php', 3172 3184 'PhabricatorEditEngineSubtypeMap' => 'applications/transactions/editengine/PhabricatorEditEngineSubtypeMap.php', 3173 3185 'PhabricatorEditEngineSubtypeTestCase' => 'applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php', 3186 + 'PhabricatorEditEngineSubtypeTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php', 3174 3187 'PhabricatorEditEngineTokenizerCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineTokenizerCommentAction.php', 3188 + 'PhabricatorEditEngineTransactionType' => 'applications/transactions/xaction/PhabricatorEditEngineTransactionType.php', 3175 3189 'PhabricatorEditField' => 'applications/transactions/editfield/PhabricatorEditField.php', 3176 3190 'PhabricatorEditPage' => 'applications/transactions/editengine/PhabricatorEditPage.php', 3177 3191 'PhabricatorEditType' => 'applications/transactions/edittype/PhabricatorEditType.php', ··· 8091 8105 'PhabricatorApplicationTransactionCommentView' => 'AphrontView', 8092 8106 'PhabricatorApplicationTransactionController' => 'PhabricatorController', 8093 8107 'PhabricatorApplicationTransactionDetailController' => 'PhabricatorApplicationTransactionController', 8108 + 'PhabricatorApplicationTransactionDetailView' => 'AphrontView', 8094 8109 'PhabricatorApplicationTransactionEditor' => 'PhabricatorEditor', 8095 8110 'PhabricatorApplicationTransactionFeedStory' => 'PhabricatorFeedStory', 8111 + 'PhabricatorApplicationTransactionJSONDiffDetailView' => 'PhabricatorApplicationTransactionDetailView', 8096 8112 'PhabricatorApplicationTransactionNoEffectException' => 'Exception', 8097 8113 'PhabricatorApplicationTransactionNoEffectResponse' => 'AphrontProxyResponse', 8098 8114 'PhabricatorApplicationTransactionPublishWorker' => 'PhabricatorWorker', ··· 8103 8119 'PhabricatorApplicationTransactionShowOlderController' => 'PhabricatorApplicationTransactionController', 8104 8120 'PhabricatorApplicationTransactionStructureException' => 'Exception', 8105 8121 'PhabricatorApplicationTransactionTemplatedCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery', 8106 - 'PhabricatorApplicationTransactionTextDiffDetailView' => 'AphrontView', 8122 + 'PhabricatorApplicationTransactionTextDiffDetailView' => 'PhabricatorApplicationTransactionDetailView', 8107 8123 'PhabricatorApplicationTransactionTransactionPHIDType' => 'PhabricatorPHIDType', 8108 8124 'PhabricatorApplicationTransactionType' => 'PhabricatorModularTransactionType', 8109 8125 'PhabricatorApplicationTransactionValidationError' => 'Phobject', ··· 9228 9244 'PhabricatorEditEngineConfigurationSearchEngine' => 'PhabricatorApplicationSearchEngine', 9229 9245 'PhabricatorEditEngineConfigurationSortController' => 'PhabricatorEditEngineController', 9230 9246 'PhabricatorEditEngineConfigurationSubtypeController' => 'PhabricatorEditEngineController', 9231 - 'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorApplicationTransaction', 9247 + 'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorModularTransaction', 9232 9248 'PhabricatorEditEngineConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 9233 9249 'PhabricatorEditEngineConfigurationViewController' => 'PhabricatorEditEngineController', 9234 9250 'PhabricatorEditEngineController' => 'PhabricatorApplicationTransactionController', 9251 + 'PhabricatorEditEngineCreateOrderTransaction' => 'PhabricatorEditEngineTransactionType', 9235 9252 'PhabricatorEditEngineDatasource' => 'PhabricatorTypeaheadDatasource', 9253 + 'PhabricatorEditEngineDefaultCreateTransaction' => 'PhabricatorEditEngineTransactionType', 9236 9254 'PhabricatorEditEngineDefaultLock' => 'PhabricatorEditEngineLock', 9255 + 'PhabricatorEditEngineDefaultTransaction' => 'PhabricatorEditEngineTransactionType', 9256 + 'PhabricatorEditEngineDisableTransaction' => 'PhabricatorEditEngineTransactionType', 9257 + 'PhabricatorEditEngineEditOrderTransaction' => 'PhabricatorEditEngineTransactionType', 9237 9258 'PhabricatorEditEngineExtension' => 'Phobject', 9238 9259 'PhabricatorEditEngineExtensionModule' => 'PhabricatorConfigModule', 9260 + 'PhabricatorEditEngineIsEditTransaction' => 'PhabricatorEditEngineTransactionType', 9239 9261 'PhabricatorEditEngineListController' => 'PhabricatorEditEngineController', 9240 9262 'PhabricatorEditEngineLock' => 'Phobject', 9263 + 'PhabricatorEditEngineLocksTransaction' => 'PhabricatorEditEngineTransactionType', 9241 9264 'PhabricatorEditEngineMFAEngine' => 'Phobject', 9265 + 'PhabricatorEditEngineNameTransaction' => 'PhabricatorEditEngineTransactionType', 9266 + 'PhabricatorEditEngineOrderTransaction' => 'PhabricatorEditEngineTransactionType', 9242 9267 'PhabricatorEditEnginePointsCommentAction' => 'PhabricatorEditEngineCommentAction', 9268 + 'PhabricatorEditEnginePreambleTransaction' => 'PhabricatorEditEngineTransactionType', 9243 9269 'PhabricatorEditEngineProfileMenuItem' => 'PhabricatorProfileMenuItem', 9244 9270 'PhabricatorEditEngineQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 9245 9271 'PhabricatorEditEngineSearchEngine' => 'PhabricatorApplicationSearchEngine', ··· 9249 9275 'PhabricatorEditEngineSubtype' => 'Phobject', 9250 9276 'PhabricatorEditEngineSubtypeMap' => 'Phobject', 9251 9277 'PhabricatorEditEngineSubtypeTestCase' => 'PhabricatorTestCase', 9278 + 'PhabricatorEditEngineSubtypeTransaction' => 'PhabricatorEditEngineTransactionType', 9252 9279 'PhabricatorEditEngineTokenizerCommentAction' => 'PhabricatorEditEngineCommentAction', 9280 + 'PhabricatorEditEngineTransactionType' => 'PhabricatorModularTransactionType', 9253 9281 'PhabricatorEditField' => 'Phobject', 9254 9282 'PhabricatorEditPage' => 'Phobject', 9255 9283 'PhabricatorEditType' => 'Phobject',
+3 -10
src/applications/herald/xaction/HeraldRuleEditTransaction.php
··· 40 40 public function newChangeDetailView() { 41 41 $viewer = $this->getViewer(); 42 42 43 - $old = $this->getOldValue(); 44 - $new = $this->getNewValue(); 45 - 46 - $json = new PhutilJSON(); 47 - $old_json = $json->encodeFormatted($old); 48 - $new_json = $json->encodeFormatted($new); 49 - 50 - return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 43 + return id(new PhabricatorApplicationTransactionJSONDiffDetailView()) 51 44 ->setViewer($viewer) 52 - ->setOldText($old_json) 53 - ->setNewText($new_json); 45 + ->setOld($this->getOldValue()) 46 + ->setNew($this->getNewValue()); 54 47 } 55 48 56 49 }
+1 -1
src/applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultCreateController.php
··· 15 15 $key = $config->getIdentifier(); 16 16 $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; 17 17 18 - $type = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE; 18 + $type = PhabricatorEditEngineDefaultCreateTransaction::TRANSACTIONTYPE; 19 19 20 20 if ($request->isFormPost()) { 21 21 $xactions = array();
+1 -1
src/applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultsController.php
··· 52 52 $field->readValueFromSubmit($request); 53 53 } 54 54 55 - $type = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT; 55 + $type = PhabricatorEditEngineDefaultTransaction::TRANSACTIONTYPE; 56 56 57 57 $xactions = array(); 58 58 foreach ($fields as $field) {
+1 -1
src/applications/transactions/controller/PhabricatorEditEngineConfigurationDisableController.php
··· 15 15 $key = $config->getIdentifier(); 16 16 $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; 17 17 18 - $type = PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE; 18 + $type = PhabricatorEditEngineDisableTransaction::TRANSACTIONTYPE; 19 19 20 20 if ($request->isFormPost()) { 21 21 $xactions = array();
+1 -2
src/applications/transactions/controller/PhabricatorEditEngineConfigurationIsEditController.php
··· 15 15 $key = $config->getIdentifier(); 16 16 $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; 17 17 18 - $type = PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT; 19 - 18 + $type = PhabricatorEditEngineIsEditTransaction::TRANSACTIONTYPE; 20 19 if ($request->isFormPost()) { 21 20 $xactions = array(); 22 21
+1 -2
src/applications/transactions/controller/PhabricatorEditEngineConfigurationLockController.php
··· 30 30 $xactions = array(); 31 31 32 32 $locks = $request->getArr('locks'); 33 - $type_locks = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS; 34 - 33 + $type_locks = PhabricatorEditEngineLocksTransaction::TRANSACTIONTYPE; 35 34 $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction()) 36 35 ->setTransactionType($type_locks) 37 36 ->setNewValue($locks);
+1 -2
src/applications/transactions/controller/PhabricatorEditEngineConfigurationReorderController.php
··· 31 31 $xactions = array(); 32 32 $key_order = $request->getStrList('keyOrder'); 33 33 34 - $type_order = PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER; 35 - 34 + $type_order = PhabricatorEditEngineOrderTransaction::TRANSACTIONTYPE; 36 35 $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction()) 37 36 ->setTransactionType($type_order) 38 37 ->setNewValue($key_order);
+2 -2
src/applications/transactions/controller/PhabricatorEditEngineConfigurationSortController.php
··· 70 70 71 71 if ($is_create) { 72 72 $xaction_type = 73 - PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER; 73 + PhabricatorEditEngineCreateOrderTransaction::TRANSACTIONTYPE; 74 74 } else { 75 75 $xaction_type = 76 - PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER; 76 + PhabricatorEditEngineEditOrderTransaction::TRANSACTIONTYPE; 77 77 } 78 78 79 79 $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())
+1 -3
src/applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php
··· 35 35 $xactions = array(); 36 36 37 37 $subtype = $request->getStr('subtype'); 38 - $type_subtype = 39 - PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE; 40 - 38 + $type_subtype = PhabricatorEditEngineSubtypeTransaction::TRANSACTIONTYPE; 41 39 $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction()) 42 40 ->setTransactionType($type_subtype) 43 41 ->setNewValue($subtype);
+2 -2
src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php
··· 99 99 ->setLabel(pht('Name')) 100 100 ->setDescription(pht('Name of the form.')) 101 101 ->setTransactionType( 102 - PhabricatorEditEngineConfigurationTransaction::TYPE_NAME) 102 + PhabricatorEditEngineNameTransaction::TRANSACTIONTYPE) 103 103 ->setValue($object->getName()), 104 104 id(new PhabricatorRemarkupEditField()) 105 105 ->setKey('preamble') 106 106 ->setLabel(pht('Preamble')) 107 107 ->setDescription(pht('Optional instructions, shown above the form.')) 108 108 ->setTransactionType( 109 - PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE) 109 + PhabricatorEditEnginePreambleTransaction::TRANSACTIONTYPE) 110 110 ->setValue($object->getPreamble()), 111 111 ); 112 112 }
-182
src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php
··· 13 13 14 14 public function getTransactionTypes() { 15 15 $types = parent::getTransactionTypes(); 16 - 17 16 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 18 17 19 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_NAME; 20 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE; 21 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER; 22 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT; 23 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS; 24 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE; 25 - $types[] = 26 - PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE; 27 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT; 28 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE; 29 - 30 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER; 31 - $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER; 32 - 33 18 return $types; 34 - } 35 - 36 - protected function validateTransaction( 37 - PhabricatorLiskDAO $object, 38 - $type, 39 - array $xactions) { 40 - 41 - $errors = parent::validateTransaction($object, $type, $xactions); 42 - switch ($type) { 43 - case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME: 44 - $missing = $this->validateIsEmptyTextField( 45 - $object->getName(), 46 - $xactions); 47 - 48 - if ($missing) { 49 - $error = new PhabricatorApplicationTransactionValidationError( 50 - $type, 51 - pht('Required'), 52 - pht('Form name is required.'), 53 - nonempty(last($xactions), null)); 54 - 55 - $error->setIsMissingFieldError(true); 56 - $errors[] = $error; 57 - } 58 - break; 59 - case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE: 60 - if ($xactions) { 61 - $map = $object->getEngine() 62 - ->setViewer($this->getActor()) 63 - ->newSubtypeMap(); 64 - foreach ($xactions as $xaction) { 65 - $new = $xaction->getNewValue(); 66 - 67 - if ($map->isValidSubtype($new)) { 68 - continue; 69 - } 70 - 71 - $errors[] = new PhabricatorApplicationTransactionValidationError( 72 - $type, 73 - pht('Invalid'), 74 - pht('Subtype "%s" is not a valid subtype.', $new), 75 - $xaction); 76 - } 77 - } 78 - break; 79 - } 80 - 81 - return $errors; 82 - } 83 - 84 - protected function getCustomTransactionOldValue( 85 - PhabricatorLiskDAO $object, 86 - PhabricatorApplicationTransaction $xaction) { 87 - 88 - switch ($xaction->getTransactionType()) { 89 - case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME: 90 - return $object->getName(); 91 - case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE; 92 - return $object->getPreamble(); 93 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER: 94 - return $object->getFieldOrder(); 95 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT: 96 - $field_key = $xaction->getMetadataValue('field.key'); 97 - return $object->getFieldDefault($field_key); 98 - case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 99 - return $object->getFieldLocks(); 100 - case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE: 101 - return $object->getSubtype(); 102 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 103 - return (int)$object->getIsDefault(); 104 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT: 105 - return (int)$object->getIsEdit(); 106 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 107 - return (int)$object->getIsDisabled(); 108 - case PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER: 109 - return (int)$object->getCreateOrder(); 110 - case PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER: 111 - return (int)$object->getEditOrder(); 112 - 113 - } 114 - } 115 - 116 - protected function getCustomTransactionNewValue( 117 - PhabricatorLiskDAO $object, 118 - PhabricatorApplicationTransaction $xaction) { 119 - 120 - switch ($xaction->getTransactionType()) { 121 - case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME: 122 - case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE; 123 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER: 124 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT: 125 - case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 126 - case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE: 127 - return $xaction->getNewValue(); 128 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 129 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT: 130 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 131 - case PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER: 132 - case PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER: 133 - return (int)$xaction->getNewValue(); 134 - } 135 - } 136 - 137 - protected function applyCustomInternalTransaction( 138 - PhabricatorLiskDAO $object, 139 - PhabricatorApplicationTransaction $xaction) { 140 - 141 - switch ($xaction->getTransactionType()) { 142 - case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME: 143 - $object->setName($xaction->getNewValue()); 144 - return; 145 - case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE; 146 - $object->setPreamble($xaction->getNewValue()); 147 - return; 148 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER: 149 - $object->setFieldOrder($xaction->getNewValue()); 150 - return; 151 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT: 152 - $field_key = $xaction->getMetadataValue('field.key'); 153 - $object->setFieldDefault($field_key, $xaction->getNewValue()); 154 - return; 155 - case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 156 - $object->setFieldLocks($xaction->getNewValue()); 157 - return; 158 - case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE: 159 - $object->setSubtype($xaction->getNewValue()); 160 - return; 161 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 162 - $object->setIsDefault($xaction->getNewValue()); 163 - return; 164 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT: 165 - $object->setIsEdit($xaction->getNewValue()); 166 - return; 167 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 168 - $object->setIsDisabled($xaction->getNewValue()); 169 - return; 170 - case PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER: 171 - $object->setCreateOrder($xaction->getNewValue()); 172 - return; 173 - case PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER: 174 - $object->setEditOrder($xaction->getNewValue()); 175 - return; 176 - } 177 - 178 - return parent::applyCustomInternalTransaction($object, $xaction); 179 - } 180 - 181 - protected function applyCustomExternalTransaction( 182 - PhabricatorLiskDAO $object, 183 - PhabricatorApplicationTransaction $xaction) { 184 - 185 - switch ($xaction->getTransactionType()) { 186 - case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME: 187 - case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE; 188 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER; 189 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT: 190 - case PhabricatorEditEngineConfigurationTransaction::TYPE_ISEDIT: 191 - case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 192 - case PhabricatorEditEngineConfigurationTransaction::TYPE_SUBTYPE: 193 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 194 - case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 195 - case PhabricatorEditEngineConfigurationTransaction::TYPE_CREATEORDER: 196 - case PhabricatorEditEngineConfigurationTransaction::TYPE_EDITORDER: 197 - return; 198 - } 199 - 200 - return parent::applyCustomExternalTransaction($object, $xaction); 201 19 } 202 20 203 21 }
+3 -210
src/applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorEditEngineConfigurationTransaction 4 - extends PhabricatorApplicationTransaction { 5 - 6 - const TYPE_NAME = 'editengine.config.name'; 7 - const TYPE_PREAMBLE = 'editengine.config.preamble'; 8 - const TYPE_ORDER = 'editengine.config.order'; 9 - const TYPE_DEFAULT = 'editengine.config.default'; 10 - const TYPE_LOCKS = 'editengine.config.locks'; 11 - const TYPE_DEFAULTCREATE = 'editengine.config.default.create'; 12 - const TYPE_ISEDIT = 'editengine.config.isedit'; 13 - const TYPE_DISABLE = 'editengine.config.disable'; 14 - const TYPE_CREATEORDER = 'editengine.order.create'; 15 - const TYPE_EDITORDER = 'editengine.order.edit'; 16 - const TYPE_SUBTYPE = 'editengine.config.subtype'; 4 + extends PhabricatorModularTransaction { 17 5 18 6 public function getApplicationName() { 19 7 return 'search'; ··· 23 11 return PhabricatorEditEngineConfigurationPHIDType::TYPECONST; 24 12 } 25 13 26 - public function getTitle() { 27 - $author_phid = $this->getAuthorPHID(); 28 - 29 - $old = $this->getOldValue(); 30 - $new = $this->getNewValue(); 31 - 32 - $type = $this->getTransactionType(); 33 - switch ($type) { 34 - case PhabricatorTransactions::TYPE_CREATE: 35 - return pht( 36 - '%s created this form configuration.', 37 - $this->renderHandleLink($author_phid)); 38 - case self::TYPE_NAME: 39 - if (strlen($old)) { 40 - return pht( 41 - '%s renamed this form from "%s" to "%s".', 42 - $this->renderHandleLink($author_phid), 43 - $old, 44 - $new); 45 - } else { 46 - return pht( 47 - '%s named this form "%s".', 48 - $this->renderHandleLink($author_phid), 49 - $new); 50 - } 51 - case self::TYPE_PREAMBLE: 52 - return pht( 53 - '%s updated the preamble for this form.', 54 - $this->renderHandleLink($author_phid)); 55 - case self::TYPE_ORDER: 56 - return pht( 57 - '%s reordered the fields in this form.', 58 - $this->renderHandleLink($author_phid)); 59 - case self::TYPE_DEFAULT: 60 - $key = $this->getMetadataValue('field.key'); 61 - 62 - $object = $this->getObject(); 63 - $engine = $object->getEngine(); 64 - $fields = $engine->getFieldsForConfig($object); 65 - 66 - $field = idx($fields, $key); 67 - if (!$field) { 68 - return pht( 69 - '%s changed the default value for field "%s".', 70 - $this->renderHandleLink($author_phid), 71 - $key); 72 - } 73 - 74 - return pht( 75 - '%s changed the default value for field "%s".', 76 - $this->renderHandleLink($author_phid), 77 - $field->getLabel()); 78 - case self::TYPE_LOCKS: 79 - return pht( 80 - '%s changed locked and hidden fields.', 81 - $this->renderHandleLink($author_phid)); 82 - case self::TYPE_DEFAULTCREATE: 83 - if ($new) { 84 - return pht( 85 - '%s added this form to the "Create" menu.', 86 - $this->renderHandleLink($author_phid)); 87 - } else { 88 - return pht( 89 - '%s removed this form from the "Create" menu.', 90 - $this->renderHandleLink($author_phid)); 91 - } 92 - case self::TYPE_ISEDIT: 93 - if ($new) { 94 - return pht( 95 - '%s marked this form as an edit form.', 96 - $this->renderHandleLink($author_phid)); 97 - } else { 98 - return pht( 99 - '%s unmarked this form as an edit form.', 100 - $this->renderHandleLink($author_phid)); 101 - } 102 - case self::TYPE_DISABLE: 103 - if ($new) { 104 - return pht( 105 - '%s disabled this form.', 106 - $this->renderHandleLink($author_phid)); 107 - } else { 108 - return pht( 109 - '%s enabled this form.', 110 - $this->renderHandleLink($author_phid)); 111 - } 112 - case self::TYPE_SUBTYPE: 113 - return pht( 114 - '%s changed the subtype of this form from "%s" to "%s".', 115 - $this->renderHandleLink($author_phid), 116 - $old, 117 - $new); 118 - } 119 - 120 - return parent::getTitle(); 121 - } 122 - 123 - public function getColor() { 124 - $author_phid = $this->getAuthorPHID(); 125 - 126 - $old = $this->getOldValue(); 127 - $new = $this->getNewValue(); 128 - 129 - $type = $this->getTransactionType(); 130 - switch ($type) { 131 - case PhabricatorTransactions::TYPE_CREATE: 132 - return 'green'; 133 - case self::TYPE_DISABLE: 134 - if ($new) { 135 - return 'indigo'; 136 - } else { 137 - return 'green'; 138 - } 139 - } 140 - 141 - return parent::getColor(); 142 - } 143 - 144 - public function getIcon() { 145 - $author_phid = $this->getAuthorPHID(); 146 - 147 - $old = $this->getOldValue(); 148 - $new = $this->getNewValue(); 149 - 150 - $type = $this->getTransactionType(); 151 - switch ($type) { 152 - case PhabricatorTransactions::TYPE_CREATE: 153 - return 'fa-plus'; 154 - case self::TYPE_DISABLE: 155 - if ($new) { 156 - return 'fa-ban'; 157 - } else { 158 - return 'fa-check'; 159 - } 160 - } 161 - 162 - return parent::getIcon(); 163 - } 164 - 165 - protected function newRemarkupChanges() { 166 - $changes = array(); 167 - 168 - $type = $this->getTransactionType(); 169 - switch ($type) { 170 - case self::TYPE_PREAMBLE: 171 - $changes[] = $this->newRemarkupChange() 172 - ->setOldValue($this->getOldValue()) 173 - ->setNewValue($this->getNewValue()); 174 - break; 175 - } 176 - 177 - return $changes; 178 - } 179 - 180 - public function hasChangeDetails() { 181 - switch ($this->getTransactionType()) { 182 - case self::TYPE_DEFAULT: 183 - return true; 184 - } 185 - 186 - return parent::hasChangeDetails(); 187 - } 188 - 189 - public function renderChangeDetails(PhabricatorUser $viewer) { 190 - switch ($this->getTransactionType()) { 191 - case self::TYPE_DEFAULT: 192 - $old_value = $this->getOldValue(); 193 - $new_value = $this->getNewValue(); 194 - 195 - $old_value = $this->renderDefaultValueAsFallbackText($old_value); 196 - $new_value = $this->renderDefaultValueAsFallbackText($new_value); 197 - 198 - return $this->renderTextCorpusChangeDetails( 199 - $viewer, 200 - $old_value, 201 - $new_value); 202 - } 203 - 204 - return parent::renderChangeDetails($viewer); 205 - } 206 - 207 - private function renderDefaultValueAsFallbackText($default_value) { 208 - // See T13319. When rendering an "alice changed the default value for 209 - // field X." story on custom forms, we may fall back to a generic 210 - // rendering. Try to present the value change in a comprehensible way 211 - // even if it isn't especially human readable (for example, it may 212 - // contain PHIDs or other internal identifiers). 213 - 214 - if (is_scalar($default_value) || is_null($default_value)) { 215 - return $default_value; 216 - } 217 - 218 - if (phutil_is_natural_list($default_value)) { 219 - return id(new PhutilJSON())->encodeAsList($default_value); 220 - } 221 - 222 - return id(new PhutilJSON())->encodeAsObject($default_value); 14 + public function getBaseTransactionClass() { 15 + return 'PhabricatorEditEngineTransactionType'; 223 16 } 224 17 225 18 }
+172
src/applications/transactions/view/PhabricatorApplicationTransactionDetailView.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorApplicationTransactionDetailView 4 + extends AphrontView { 5 + protected $oldText; 6 + protected $newText; 7 + 8 + public function setNewText($new_text) { 9 + $this->newText = $new_text; 10 + return $this; 11 + } 12 + 13 + public function setOldText($old_text) { 14 + $this->oldText = $old_text; 15 + return $this; 16 + } 17 + 18 + public function renderForMail() { 19 + $diff = $this->buildDiff(); 20 + 21 + $viewer = $this->getViewer(); 22 + $old_bright = $viewer->getCSSValue('old-bright'); 23 + $new_bright = $viewer->getCSSValue('new-bright'); 24 + 25 + $old_styles = array( 26 + 'padding: 0 2px;', 27 + 'color: #333333;', 28 + "background: {$old_bright};", 29 + ); 30 + $old_styles = implode(' ', $old_styles); 31 + 32 + $new_styles = array( 33 + 'padding: 0 2px;', 34 + 'color: #333333;', 35 + "background: {$new_bright};", 36 + ); 37 + $new_styles = implode(' ', $new_styles); 38 + 39 + $omit_styles = array( 40 + 'padding: 8px 0;', 41 + ); 42 + $omit_styles = implode(' ', $omit_styles); 43 + 44 + $result = array(); 45 + foreach ($diff->getSummaryParts() as $part) { 46 + $type = $part['type']; 47 + $text = $part['text']; 48 + switch ($type) { 49 + case '.': 50 + $result[] = phutil_tag( 51 + 'div', 52 + array( 53 + 'style' => $omit_styles, 54 + ), 55 + pht('...')); 56 + break; 57 + case '-': 58 + $result[] = phutil_tag( 59 + 'span', 60 + array( 61 + 'style' => $old_styles, 62 + ), 63 + $text); 64 + break; 65 + case '+': 66 + $result[] = phutil_tag( 67 + 'span', 68 + array( 69 + 'style' => $new_styles, 70 + ), 71 + $text); 72 + break; 73 + case '=': 74 + $result[] = $text; 75 + break; 76 + } 77 + } 78 + 79 + $styles = array( 80 + 'white-space: pre-wrap;', 81 + 'color: #74777D;', 82 + ); 83 + 84 + // Beyond applying "pre-wrap", convert newlines to "<br />" explicitly 85 + // to improve behavior in clients like Airmail. 86 + $result = phutil_escape_html_newlines($result); 87 + 88 + return phutil_tag( 89 + 'div', 90 + array( 91 + 'style' => implode(' ', $styles), 92 + ), 93 + $result); 94 + } 95 + 96 + public function render() { 97 + $diff = $this->buildDiff(); 98 + 99 + require_celerity_resource('differential-changeset-view-css'); 100 + 101 + $result = array(); 102 + foreach ($diff->getParts() as $part) { 103 + $type = $part['type']; 104 + $text = $part['text']; 105 + switch ($type) { 106 + case '-': 107 + $result[] = phutil_tag( 108 + 'span', 109 + array( 110 + 'class' => 'old', 111 + ), 112 + $text); 113 + break; 114 + case '+': 115 + $result[] = phutil_tag( 116 + 'span', 117 + array( 118 + 'class' => 'new', 119 + ), 120 + $text); 121 + break; 122 + case '=': 123 + $result[] = $text; 124 + break; 125 + } 126 + } 127 + 128 + $diff_view = phutil_tag( 129 + 'div', 130 + array( 131 + 'class' => 'prose-diff', 132 + ), 133 + $result); 134 + 135 + $old_view = phutil_tag( 136 + 'div', 137 + array( 138 + 'class' => 'prose-diff', 139 + ), 140 + $this->oldText); 141 + 142 + $new_view = phutil_tag( 143 + 'div', 144 + array( 145 + 'class' => 'prose-diff', 146 + ), 147 + $this->newText); 148 + 149 + return id(new PHUITabGroupView()) 150 + ->addTab( 151 + id(new PHUITabView()) 152 + ->setKey('old') 153 + ->setName(pht('Old')) 154 + ->appendChild($old_view)) 155 + ->addTab( 156 + id(new PHUITabView()) 157 + ->setKey('new') 158 + ->setName(pht('New')) 159 + ->appendChild($new_view)) 160 + ->addTab( 161 + id(new PHUITabView()) 162 + ->setKey('diff') 163 + ->setName(pht('Diff')) 164 + ->appendChild($diff_view)) 165 + ->selectTab('diff'); 166 + } 167 + 168 + private function buildDiff() { 169 + $engine = new PhutilProseDifferenceEngine(); 170 + return $engine->getDiff($this->oldText, $this->newText); 171 + } 172 + }
+17
src/applications/transactions/view/PhabricatorApplicationTransactionJSONDiffDetailView.php
··· 1 + <?php 2 + 3 + final class PhabricatorApplicationTransactionJSONDiffDetailView 4 + extends PhabricatorApplicationTransactionDetailView { 5 + 6 + public function setNew($new_object) { 7 + $json = new PhutilJSON(); 8 + $this->setNewText($json->encodeFormatted($new_object)); 9 + return $this; 10 + } 11 + 12 + public function setOld($old_object) { 13 + $json = new PhutilJSON(); 14 + $this->setOldText($json->encodeFormatted($old_object)); 15 + return $this; 16 + } 17 + }
+1 -171
src/applications/transactions/view/PhabricatorApplicationTransactionTextDiffDetailView.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorApplicationTransactionTextDiffDetailView 4 - extends AphrontView { 5 - 6 - private $oldText; 7 - private $newText; 8 - 9 - public function setNewText($new_text) { 10 - $this->newText = $new_text; 11 - return $this; 12 - } 13 - 14 - public function setOldText($old_text) { 15 - $this->oldText = $old_text; 16 - return $this; 17 - } 18 - 19 - public function renderForMail() { 20 - $diff = $this->buildDiff(); 21 - 22 - $viewer = $this->getViewer(); 23 - $old_bright = $viewer->getCSSValue('old-bright'); 24 - $new_bright = $viewer->getCSSValue('new-bright'); 25 - 26 - $old_styles = array( 27 - 'padding: 0 2px;', 28 - 'color: #333333;', 29 - "background: {$old_bright};", 30 - ); 31 - $old_styles = implode(' ', $old_styles); 32 - 33 - $new_styles = array( 34 - 'padding: 0 2px;', 35 - 'color: #333333;', 36 - "background: {$new_bright};", 37 - ); 38 - $new_styles = implode(' ', $new_styles); 39 - 40 - $omit_styles = array( 41 - 'padding: 8px 0;', 42 - ); 43 - $omit_styles = implode(' ', $omit_styles); 44 - 45 - $result = array(); 46 - foreach ($diff->getSummaryParts() as $part) { 47 - $type = $part['type']; 48 - $text = $part['text']; 49 - switch ($type) { 50 - case '.': 51 - $result[] = phutil_tag( 52 - 'div', 53 - array( 54 - 'style' => $omit_styles, 55 - ), 56 - pht('...')); 57 - break; 58 - case '-': 59 - $result[] = phutil_tag( 60 - 'span', 61 - array( 62 - 'style' => $old_styles, 63 - ), 64 - $text); 65 - break; 66 - case '+': 67 - $result[] = phutil_tag( 68 - 'span', 69 - array( 70 - 'style' => $new_styles, 71 - ), 72 - $text); 73 - break; 74 - case '=': 75 - $result[] = $text; 76 - break; 77 - } 78 - } 79 - 80 - $styles = array( 81 - 'white-space: pre-wrap;', 82 - 'color: #74777D;', 83 - ); 84 - 85 - // Beyond applying "pre-wrap", convert newlines to "<br />" explicitly 86 - // to improve behavior in clients like Airmail. 87 - $result = phutil_escape_html_newlines($result); 88 - 89 - return phutil_tag( 90 - 'div', 91 - array( 92 - 'style' => implode(' ', $styles), 93 - ), 94 - $result); 95 - } 96 - 97 - public function render() { 98 - $diff = $this->buildDiff(); 99 - 100 - require_celerity_resource('differential-changeset-view-css'); 101 - 102 - $result = array(); 103 - foreach ($diff->getParts() as $part) { 104 - $type = $part['type']; 105 - $text = $part['text']; 106 - switch ($type) { 107 - case '-': 108 - $result[] = phutil_tag( 109 - 'span', 110 - array( 111 - 'class' => 'old', 112 - ), 113 - $text); 114 - break; 115 - case '+': 116 - $result[] = phutil_tag( 117 - 'span', 118 - array( 119 - 'class' => 'new', 120 - ), 121 - $text); 122 - break; 123 - case '=': 124 - $result[] = $text; 125 - break; 126 - } 127 - } 128 - 129 - $diff_view = phutil_tag( 130 - 'div', 131 - array( 132 - 'class' => 'prose-diff', 133 - ), 134 - $result); 135 - 136 - $old_view = phutil_tag( 137 - 'div', 138 - array( 139 - 'class' => 'prose-diff', 140 - ), 141 - $this->oldText); 142 - 143 - $new_view = phutil_tag( 144 - 'div', 145 - array( 146 - 'class' => 'prose-diff', 147 - ), 148 - $this->newText); 149 - 150 - return id(new PHUITabGroupView()) 151 - ->addTab( 152 - id(new PHUITabView()) 153 - ->setKey('old') 154 - ->setName(pht('Old')) 155 - ->appendChild($old_view)) 156 - ->addTab( 157 - id(new PHUITabView()) 158 - ->setKey('new') 159 - ->setName(pht('New')) 160 - ->appendChild($new_view)) 161 - ->addTab( 162 - id(new PHUITabView()) 163 - ->setKey('diff') 164 - ->setName(pht('Diff')) 165 - ->appendChild($diff_view)) 166 - ->selectTab('diff'); 167 - } 168 - 169 - private function buildDiff() { 170 - $engine = new PhutilProseDifferenceEngine(); 171 - return $engine->getDiff($this->oldText, $this->newText); 172 - } 173 - 174 - } 4 + extends PhabricatorApplicationTransactionDetailView {}
+26
src/applications/transactions/xaction/PhabricatorEditEngineCreateOrderTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineCreateOrderTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.order.create'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)$object->getCreateOrder(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setCreateOrder($value); 18 + } 19 + 20 + public function getTitle() { 21 + return pht( 22 + '%s changed the order in which this form appears in the "Create" menu.', 23 + $this->renderAuthor()); 24 + } 25 + 26 + }
+35
src/applications/transactions/xaction/PhabricatorEditEngineDefaultCreateTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineDefaultCreateTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.default.create'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)$object->getIsDefault(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setIsDefault($value); 18 + } 19 + 20 + public function getTitle() { 21 + $old = $this->getOldValue(); 22 + $new = $this->getNewValue(); 23 + 24 + if ($new) { 25 + return pht( 26 + '%s added this form to the "Create" menu.', 27 + $this->renderAuthor()); 28 + } else { 29 + return pht( 30 + '%s removed this form from the "Create" menu.', 31 + $this->renderAuthor()); 32 + } 33 + } 34 + 35 + }
+71
src/applications/transactions/xaction/PhabricatorEditEngineDefaultTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineDefaultTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.default'; 7 + 8 + public function generateOldValue($object) { 9 + $field_key = $this->getMetadataValue('field.key'); 10 + return $object->getFieldDefault($field_key); 11 + } 12 + 13 + public function applyInternalEffects($object, $value) { 14 + $field_key = $this->getMetadataValue('field.key'); 15 + $object->setFieldDefault($field_key, $value); 16 + } 17 + 18 + public function getTitle() { 19 + $key = $this->getMetadataValue('field.key'); 20 + $object = $this->getObject(); 21 + $engine = $object->getEngine(); 22 + $fields = $engine->getFieldsForConfig($object); 23 + $field = idx($fields, $key); 24 + 25 + if (!$field) { 26 + return pht( 27 + '%s changed the default values for field %s.', 28 + $this->renderAuthor(), 29 + $this->renderValue($key)); 30 + } 31 + 32 + return pht( 33 + '%s changed the default value for field %s.', 34 + $this->renderAuthor(), 35 + $this->renderValue($field->getLabel())); 36 + } 37 + 38 + public function hasChangeDetailView() { 39 + return true; 40 + } 41 + 42 + public function newChangeDetailView() { 43 + $viewer = $this->getViewer(); 44 + $old = $this->renderDefaultValueAsFallbackText($this->getOldValue()); 45 + $new = $this->renderDefaultValueAsFallbackText($this->getNewValue()); 46 + 47 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 48 + ->setViewer($viewer) 49 + ->setOldText($old) 50 + ->setNewText($new); 51 + } 52 + 53 + private function renderDefaultValueAsFallbackText($default_value) { 54 + // See T13319. When rendering an "alice changed the default value for 55 + // field X." story on custom forms, we may fall back to a generic 56 + // rendering. Try to present the value change in a comprehensible way 57 + // even if it isn't especially human readable (for example, it may 58 + // contain PHIDs or other internal identifiers). 59 + 60 + if (is_scalar($default_value) || is_null($default_value)) { 61 + return $default_value; 62 + } 63 + 64 + if (phutil_is_natural_list($default_value)) { 65 + return id(new PhutilJSON())->encodeAsList($default_value); 66 + } 67 + 68 + return id(new PhutilJSON())->encodeAsObject($default_value); 69 + } 70 + 71 + }
+51
src/applications/transactions/xaction/PhabricatorEditEngineDisableTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineDisableTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.disable'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)$object->getIsDisabled(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setIsDisabled($value); 18 + } 19 + 20 + public function getTitle() { 21 + $new = $this->getNewValue(); 22 + if ($new) { 23 + return pht( 24 + '%s disabled this form.', 25 + $this->renderAuthor()); 26 + } else { 27 + return pht( 28 + '%s enabled this form.', 29 + $this->renderAuthor()); 30 + } 31 + } 32 + 33 + public function getColor() { 34 + $new = $this->getNewValue(); 35 + if ($new) { 36 + return 'indigo'; 37 + } else { 38 + return 'green'; 39 + } 40 + } 41 + 42 + public function getIcon() { 43 + $new = $this->getNewValue(); 44 + if ($new) { 45 + return 'fa-ban'; 46 + } else { 47 + return 'fa-check'; 48 + } 49 + } 50 + 51 + }
+26
src/applications/transactions/xaction/PhabricatorEditEngineEditOrderTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineEditOrderTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.order.edit'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)$object->getEditOrder(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setEditOrder($value); 18 + } 19 + 20 + public function getTitle() { 21 + return pht( 22 + '%s changed the order in which this form appears in the "Edit" menu.', 23 + $this->renderAuthor()); 24 + } 25 + 26 + }
+34
src/applications/transactions/xaction/PhabricatorEditEngineIsEditTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineIsEditTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.isedit'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)$object->getIsEdit(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setIsEdit($value); 18 + } 19 + 20 + public function getTitle() { 21 + $new = $this->getNewValue(); 22 + 23 + if ($new) { 24 + return pht( 25 + '%s marked this form as an edit form.', 26 + $this->renderAuthor()); 27 + } else { 28 + return pht( 29 + '%s unmarked this form as an edit form.', 30 + $this->renderAuthor()); 31 + } 32 + } 33 + 34 + }
+35
src/applications/transactions/xaction/PhabricatorEditEngineLocksTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineLocksTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.locks'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getFieldLocks(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setFieldLocks($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s changed locked and hidden fields.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function hasChangeDetailView() { 23 + return true; 24 + } 25 + 26 + public function newChangeDetailView() { 27 + $viewer = $this->getViewer(); 28 + 29 + return id(new PhabricatorApplicationTransactionJSONDiffDetailView()) 30 + ->setViewer($viewer) 31 + ->setOld($this->getOldValue()) 32 + ->setNew($this->getNewValue()); 33 + } 34 + 35 + }
+54
src/applications/transactions/xaction/PhabricatorEditEngineNameTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineNameTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.name'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getName(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setName($value); 14 + } 15 + 16 + public function getTitle() { 17 + if (strlen($this->getOldValue())) { 18 + return pht( 19 + '%s renamed this form from %s to %s.', 20 + $this->renderAuthor(), 21 + $this->renderOldValue(), 22 + $this->renderNewValue()); 23 + } else { 24 + return pht( 25 + '%s named this form %s.', 26 + $this->renderAuthor(), 27 + $this->renderNewValue()); 28 + } 29 + } 30 + 31 + public function validateTransactions($object, array $xactions) { 32 + $errors = array(); 33 + 34 + foreach ($xactions as $xaction) { 35 + $new = $xaction->getNewValue(); 36 + if (!strlen($new)) { 37 + $errors[] = $this->newRequiredError( 38 + pht('Form name is required.'), 39 + $xaction); 40 + continue; 41 + } 42 + } 43 + 44 + if (!$errors) { 45 + if ($this->isEmptyTextTransaction($object->getName(), $xactions)) { 46 + $errors[] = $this->newRequiredError( 47 + pht('Forms must have a name.')); 48 + } 49 + } 50 + 51 + return $errors; 52 + } 53 + 54 + }
+35
src/applications/transactions/xaction/PhabricatorEditEngineOrderTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineOrderTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.order'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getFieldOrder(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setFieldOrder($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s reordered the fields in this form.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function hasChangeDetailView() { 23 + return true; 24 + } 25 + 26 + public function newChangeDetailView() { 27 + $viewer = $this->getViewer(); 28 + 29 + return id(new PhabricatorApplicationTransactionJSONDiffDetailView()) 30 + ->setViewer($viewer) 31 + ->setOld($this->getOldValue()) 32 + ->setNew($this->getNewValue()); 33 + } 34 + 35 + }
+45
src/applications/transactions/xaction/PhabricatorEditEnginePreambleTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEnginePreambleTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.preamble'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getPreamble(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setPreamble($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s updated the preamble for this form.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function hasChangeDetailView() { 23 + return true; 24 + } 25 + 26 + public function newChangeDetailView() { 27 + $viewer = $this->getViewer(); 28 + 29 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 30 + ->setViewer($viewer) 31 + ->setOldText($this->getOldValue()) 32 + ->setNewText($this->getNewValue()); 33 + } 34 + 35 + public function newRemarkupChanges() { 36 + $changes = array(); 37 + 38 + $changes[] = $this->newRemarkupChange() 39 + ->setOldValue($this->getOldValue()) 40 + ->setNewValue($this->getNewValue()); 41 + 42 + return $changes; 43 + } 44 + 45 + }
+48
src/applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineSubtypeTransaction 4 + extends PhabricatorEditEngineTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'editengine.config.subtype'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getSubtype(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setSubtype($value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + return pht( 21 + '%s changed the subtype of this form from %s to %s.', 22 + $this->renderAuthor(), 23 + $this->renderOldValue(), 24 + $this->renderNewValue()); 25 + } 26 + 27 + public function validateTransactions($object, array $xactions) { 28 + $map = $object->getEngine() 29 + ->setViewer($this->getActor()) 30 + ->newSubtypeMap(); 31 + 32 + $errors = array(); 33 + foreach ($xactions as $xaction) { 34 + $new = $xaction->getNewValue(); 35 + 36 + if ($map->isValidSubtype($new)) { 37 + continue; 38 + } 39 + 40 + $errors[] = $this->newInvalidError( 41 + pht('Subtype "%s" is not a valid subtype.', $new), 42 + $xaction); 43 + } 44 + 45 + return $errors; 46 + } 47 + 48 + }
+4
src/applications/transactions/xaction/PhabricatorEditEngineTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorEditEngineTransactionType 4 + extends PhabricatorModularTransactionType {}