@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.

Begin making card updates on boards independent of context

Summary:
Ref T4900. To eventually support realtime board updates, we need to be able to perform a board state update without the context of the action which caused it.

For example, if the server says "update card Y", we need to know what to do without being told "card Y was moved from column A to column B" explicitly. Currently, all the update code relies on knowing what happened and which nodes were affected.

This is only a small step forward, but starts making things a bit more independent and consistent.

Test Plan:
- Moved cards around.
- Changed card cover images.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T4900

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

+95 -55
+25 -25
resources/celerity/map.php
··· 415 415 'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef', 416 416 'rsrc/js/application/policy/behavior-policy-control.js' => 'd0c516d5', 417 417 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c', 418 - 'rsrc/js/application/projects/Workboard.js' => 'fa8ab410', 419 - 'rsrc/js/application/projects/behavior-project-boards.js' => '7784bfc6', 418 + 'rsrc/js/application/projects/Workboard.js' => '088b2495', 419 + 'rsrc/js/application/projects/behavior-project-boards.js' => '37eb99e4', 420 420 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 421 421 'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb', 422 422 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', ··· 656 656 'javelin-behavior-phui-profile-menu' => '12884df9', 657 657 'javelin-behavior-policy-control' => 'd0c516d5', 658 658 'javelin-behavior-policy-rule-editor' => '5e9f347c', 659 - 'javelin-behavior-project-boards' => '7784bfc6', 659 + 'javelin-behavior-project-boards' => '37eb99e4', 660 660 'javelin-behavior-project-create' => '065227cc', 661 661 'javelin-behavior-quicksand-blacklist' => '7927a7d3', 662 662 'javelin-behavior-recurring-edit' => '5f1c4d5f', ··· 723 723 'javelin-view-renderer' => '6c2b09a2', 724 724 'javelin-view-visitor' => 'efe49472', 725 725 'javelin-websocket' => 'e292eaf4', 726 - 'javelin-workboard' => 'fa8ab410', 726 + 'javelin-workboard' => '088b2495', 727 727 'javelin-workflow' => '5b2e3e2b', 728 728 'lightbox-attachment-css' => '7acac05d', 729 729 'maniphest-batch-editor' => 'b0f0b6d5', ··· 930 930 'javelin-stratcom', 931 931 'javelin-vector', 932 932 ), 933 + '088b2495' => array( 934 + 'javelin-install', 935 + 'javelin-dom', 936 + 'javelin-util', 937 + 'javelin-vector', 938 + 'javelin-stratcom', 939 + 'javelin-workflow', 940 + 'phabricator-draggable-list', 941 + 'phabricator-drag-and-drop-file-upload', 942 + ), 933 943 '0a3f3021' => array( 934 944 'javelin-behavior', 935 945 'javelin-stratcom', ··· 1086 1096 'javelin-vector', 1087 1097 'phuix-autocomplete', 1088 1098 ), 1099 + '37eb99e4' => array( 1100 + 'javelin-behavior', 1101 + 'javelin-dom', 1102 + 'javelin-util', 1103 + 'javelin-vector', 1104 + 'javelin-stratcom', 1105 + 'javelin-workflow', 1106 + 'phabricator-draggable-list', 1107 + 'phabricator-drag-and-drop-file-upload', 1108 + 'javelin-workboard', 1109 + ), 1089 1110 '3ab51e2c' => array( 1090 1111 'javelin-behavior', 1091 1112 'javelin-behavior-device', ··· 1406 1427 'javelin-install', 1407 1428 'javelin-reactor', 1408 1429 'javelin-util', 1409 - ), 1410 - '7784bfc6' => array( 1411 - 'javelin-behavior', 1412 - 'javelin-dom', 1413 - 'javelin-util', 1414 - 'javelin-vector', 1415 - 'javelin-stratcom', 1416 - 'javelin-workflow', 1417 - 'phabricator-draggable-list', 1418 - 'phabricator-drag-and-drop-file-upload', 1419 - 'javelin-workboard', 1420 1430 ), 1421 1431 '782ab6e7' => array( 1422 1432 'javelin-behavior', ··· 2077 2087 'javelin-dom', 2078 2088 'javelin-vector', 2079 2089 'javelin-magical-init', 2080 - ), 2081 - 'fa8ab410' => array( 2082 - 'javelin-install', 2083 - 'javelin-dom', 2084 - 'javelin-util', 2085 - 'javelin-vector', 2086 - 'javelin-stratcom', 2087 - 'javelin-workflow', 2088 - 'phabricator-draggable-list', 2089 - 'phabricator-drag-and-drop-file-upload', 2090 2090 ), 2091 2091 'fb20ac8d' => array( 2092 2092 'javelin-behavior',
+2 -1
src/applications/project/controller/PhabricatorProjectController.php
··· 192 192 return id(new AphrontAjaxResponse()) 193 193 ->setContent( 194 194 array( 195 - 'task' => $item, 195 + 'objectPHID' => $object->getPHID(), 196 + 'cardHTML' => $item, 196 197 )); 197 198 } 198 199
+62 -28
webroot/rsrc/js/application/projects/Workboard.js
··· 17 17 this._config = config; 18 18 19 19 this._boardNodes = {}; 20 + this._columnMap = {}; 21 + }, 20 22 21 - this._setupCoverImageHandlers(); 22 - this._setupPanHandlers(); 23 + properties: { 24 + uploadURI: null, 25 + coverURI: null, 26 + moveURI: null, 27 + chunkThreshold: null 23 28 }, 24 29 25 30 members: { ··· 31 36 _panNode: null, 32 37 _panX: null, 33 38 39 + _columnMap: null, 40 + 41 + start: function() { 42 + this._setupCoverImageHandlers(); 43 + this._setupPanHandlers(); 44 + 45 + return this; 46 + }, 47 + 34 48 addBoard: function(board_phid, board_node) { 35 49 this._currentBoard = board_phid; 36 - 37 - if (!this._boardNodes[board_phid]) { 38 - this._boardNodes[board_phid] = board_node; 39 - this._setupDragHandlers(board_node); 40 - } 50 + this._boardNodes[board_phid] = board_node; 51 + this._setupDragHandlers(board_node); 41 52 }, 42 53 43 54 _getConfig: function() { ··· 49 60 return; 50 61 } 51 62 52 - var config = this._getConfig(); 53 - 54 63 var drop = new JX.PhabricatorDragAndDropFileUpload('project-card') 55 - .setURI(config.uploadURI) 56 - .setChunkThreshold(config.chunkThreshold); 64 + .setURI(this.getUploadURI()) 65 + .setChunkThreshold(this.getChunkThreshold()); 57 66 58 67 drop.listen('didBeginDrag', function(node) { 59 68 JX.DOM.alterClass(node, 'phui-workcard-upload-target', true); ··· 63 72 JX.DOM.alterClass(node, 'phui-workcard-upload-target', false); 64 73 }); 65 74 66 - drop.listen('didUpload', function(file) { 67 - var node = file.getTargetNode(); 75 + drop.listen('didUpload', JX.bind(this, this._oncoverupload)); 68 76 69 - var board = JX.DOM.findAbove(node, 'div', 'jx-workboard'); 77 + drop.start(); 78 + }, 70 79 71 - var data = { 72 - boardPHID: JX.Stratcom.getData(board).boardPHID, 73 - objectPHID: JX.Stratcom.getData(node).objectPHID, 74 - filePHID: file.getPHID() 75 - }; 80 + _oncoverupload: function(file) { 81 + var node = file.getTargetNode(); 82 + var board = JX.DOM.findAbove(node, 'div', 'jx-workboard'); 76 83 77 - new JX.Workflow(config.coverURI, data) 78 - .setHandler(function(r) { 79 - JX.DOM.replace(node, JX.$H(r.task)); 80 - }) 81 - .start(); 82 - }); 84 + var data = { 85 + boardPHID: JX.Stratcom.getData(board).boardPHID, 86 + objectPHID: JX.Stratcom.getData(node).objectPHID, 87 + filePHID: file.getPHID() 88 + }; 83 89 84 - drop.start(); 90 + new JX.Workflow(this.getCoverURI(), data) 91 + .setHandler(JX.bind(this, this._queueCardUpdate)) 92 + .start(); 85 93 }, 86 94 87 95 _setupPanHandlers: function() { ··· 192 200 var config = this._getConfig(); 193 201 data.order = config.order; 194 202 195 - new JX.Workflow(config.moveURI, data) 203 + new JX.Workflow(this.getMoveURI(), data) 196 204 .setHandler(JX.bind(this, this._oncardupdate, item, list)) 197 205 .start(); 198 206 }, ··· 200 208 _oncardupdate: function(item, list, response) { 201 209 list.unlock(); 202 210 JX.DOM.alterClass(item, 'drag-sending', false); 203 - JX.DOM.replace(item, JX.$H(response.task)); 211 + 212 + this._queueCardUpdate(response); 213 + }, 214 + 215 + _queueCardUpdate: function(response) { 216 + var board_node = this._boardNodes[this._currentBoard]; 217 + 218 + var columns = this._findBoardColumns(board_node); 219 + var cards; 220 + var ii; 221 + var jj; 222 + var data; 223 + 224 + for (ii = 0; ii < columns.length; ii++) { 225 + cards = this._findCardsInColumn(columns[ii]); 226 + for (jj = 0; jj < cards.length; jj++) { 227 + data = JX.Stratcom.getData(cards[jj]); 228 + if (data.objectPHID == response.objectPHID) { 229 + this._replaceCard(cards[jj], JX.$H(response.cardHTML)); 230 + } 231 + } 232 + } 233 + 234 + }, 235 + 236 + _replaceCard: function(old_node, new_node) { 237 + JX.DOM.replace(old_node, new_node); 204 238 } 205 239 206 240 }
+6 -1
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 234 234 } 235 235 236 236 if (!statics.workboard) { 237 - statics.workboard = new JX.Workboard(config); 237 + statics.workboard = new JX.Workboard(config) 238 + .setUploadURI(config.uploadURI) 239 + .setCoverURI(config.coverURI) 240 + .setMoveURI(config.moveURI) 241 + .setChunkThreshold(config.chunkThreshold) 242 + .start(); 238 243 } 239 244 240 245 statics.workboard.addBoard(config.projectPHID, JX.$(config.boardID));