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

Quicksand - fix project board page and quicksand

Summary: Fixes T7913. Collapse the separate board dropdown into the board projects behavior; we always need that anyway and now we can install the listener more granularly.

Test Plan:
- visted project board
- invoked create task, cancelled dialog
- visited project feed
- visited project board
- invoked create task, cancelled dialog (FAILED pre patch...!)

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T7913

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

+188 -155
+27 -35
resources/celerity/map.php
··· 9 9 'names' => array( 10 10 'core.pkg.css' => '5e324506', 11 11 'core.pkg.js' => '59d01bb7', 12 - 'darkconsole.pkg.js' => '6d16ff19', 12 + 'darkconsole.pkg.js' => 'e7393ebb', 13 13 'differential.pkg.css' => '3500921f', 14 14 'differential.pkg.js' => '890046d3', 15 15 'diffusion.pkg.css' => '591664fa', ··· 205 205 'rsrc/externals/javelin/lib/JSON.js' => '69adf288', 206 206 'rsrc/externals/javelin/lib/Leader.js' => '331b1611', 207 207 'rsrc/externals/javelin/lib/Mask.js' => '8a41885b', 208 - 'rsrc/externals/javelin/lib/Quicksand.js' => '517545ab', 208 + 'rsrc/externals/javelin/lib/Quicksand.js' => '51aeb01d', 209 209 'rsrc/externals/javelin/lib/Request.js' => '94b750d2', 210 210 'rsrc/externals/javelin/lib/Resource.js' => '44959b73', 211 211 'rsrc/externals/javelin/lib/Routable.js' => 'b3e7d692', ··· 413 413 'rsrc/js/application/policy/behavior-policy-control.js' => '1ed33505', 414 414 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c', 415 415 'rsrc/js/application/ponder/behavior-votebox.js' => '4e9b766b', 416 - 'rsrc/js/application/projects/behavior-boards-dropdown.js' => '0ec56e1d', 417 - 'rsrc/js/application/projects/behavior-project-boards.js' => '87cb6b51', 416 + 'rsrc/js/application/projects/behavior-project-boards.js' => '60292820', 418 417 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 419 418 'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb', 420 419 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', ··· 460 459 'rsrc/js/core/behavior-autofocus.js' => '7319e029', 461 460 'rsrc/js/core/behavior-choose-control.js' => '6153c708', 462 461 'rsrc/js/core/behavior-crop.js' => 'fa0f4fc2', 463 - 'rsrc/js/core/behavior-dark-console.js' => '87987821', 462 + 'rsrc/js/core/behavior-dark-console.js' => 'f411b6ae', 464 463 'rsrc/js/core/behavior-device.js' => 'a205cf28', 465 464 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '6d49590e', 466 465 'rsrc/js/core/behavior-error-log.js' => '6882e80a', ··· 560 559 'javelin-behavior-aphront-more' => 'a80d0378', 561 560 'javelin-behavior-audio-source' => '59b251eb', 562 561 'javelin-behavior-audit-preview' => 'd835b03a', 563 - 'javelin-behavior-boards-dropdown' => '0ec56e1d', 564 562 'javelin-behavior-choose-control' => '6153c708', 565 563 'javelin-behavior-config-reorder-fields' => '14a827de', 566 564 'javelin-behavior-conpherence-menu' => '077a1dab', 567 565 'javelin-behavior-conpherence-pontificate' => '21ba5861', 568 566 'javelin-behavior-conpherence-widget-pane' => '93568464', 569 567 'javelin-behavior-countdown-timer' => 'e4cc26b3', 570 - 'javelin-behavior-dark-console' => '87987821', 568 + 'javelin-behavior-dark-console' => 'f411b6ae', 571 569 'javelin-behavior-dashboard-async-panel' => '469c0d9e', 572 570 'javelin-behavior-dashboard-move-panels' => '82439934', 573 571 'javelin-behavior-dashboard-query-panel-select' => '453c5375', ··· 642 640 'javelin-behavior-policy-control' => '1ed33505', 643 641 'javelin-behavior-policy-rule-editor' => '5e9f347c', 644 642 'javelin-behavior-ponder-votebox' => '4e9b766b', 645 - 'javelin-behavior-project-boards' => '87cb6b51', 643 + 'javelin-behavior-project-boards' => '60292820', 646 644 'javelin-behavior-project-create' => '065227cc', 647 645 'javelin-behavior-quicksand-blacklist' => '7927a7d3', 648 646 'javelin-behavior-refresh-csrf' => '7814b593', ··· 677 675 'javelin-leader' => '331b1611', 678 676 'javelin-magical-init' => '3010e992', 679 677 'javelin-mask' => '8a41885b', 680 - 'javelin-quicksand' => '517545ab', 678 + 'javelin-quicksand' => '51aeb01d', 681 679 'javelin-reactor' => '2b8de964', 682 680 'javelin-reactor-dom' => 'c90a04fc', 683 681 'javelin-reactor-node-calmer' => '76f4ebed', ··· 921 919 'javelin-util', 922 920 'phabricator-notification-css', 923 921 ), 924 - '0ec56e1d' => array( 925 - 'javelin-behavior', 926 - 'javelin-dom', 927 - 'javelin-stratcom', 928 - 'phuix-dropdown-menu', 929 - ), 930 922 '0f764c35' => array( 931 923 'javelin-install', 932 924 'javelin-util', ··· 1193 1185 'javelin-typeahead-source', 1194 1186 'javelin-util', 1195 1187 ), 1196 - '517545ab' => array( 1197 - 'javelin-install', 1198 - ), 1199 1188 '519705ea' => array( 1200 1189 'javelin-install', 1201 1190 'javelin-dom', 1202 1191 'javelin-reactor-dom', 1192 + ), 1193 + '51aeb01d' => array( 1194 + 'javelin-install', 1203 1195 ), 1204 1196 '54b612ba' => array( 1205 1197 'javelin-color', ··· 1274 1266 'javelin-workflow', 1275 1267 'javelin-stratcom', 1276 1268 ), 1269 + 60292820 => array( 1270 + 'javelin-behavior', 1271 + 'javelin-dom', 1272 + 'javelin-util', 1273 + 'javelin-vector', 1274 + 'javelin-stratcom', 1275 + 'javelin-workflow', 1276 + 'phabricator-draggable-list', 1277 + ), 1277 1278 60479091 => array( 1278 1279 'phabricator-busy', 1279 1280 'javelin-behavior', ··· 1471 1472 '86a13f7f' => array( 1472 1473 'aphront-typeahead-control-css', 1473 1474 'phui-tag-view-css', 1474 - ), 1475 - 87987821 => array( 1476 - 'javelin-behavior', 1477 - 'javelin-stratcom', 1478 - 'javelin-util', 1479 - 'javelin-dom', 1480 - 'javelin-request', 1481 - 'phabricator-keyboard-shortcut', 1482 - ), 1483 - '87cb6b51' => array( 1484 - 'javelin-behavior', 1485 - 'javelin-dom', 1486 - 'javelin-util', 1487 - 'javelin-vector', 1488 - 'javelin-stratcom', 1489 - 'javelin-workflow', 1490 - 'phabricator-draggable-list', 1491 1475 ), 1492 1476 '88236f00' => array( 1493 1477 'javelin-behavior', ··· 1969 1953 'javelin-stratcom', 1970 1954 'javelin-vector', 1971 1955 'phabricator-hovercard', 1956 + ), 1957 + 'f411b6ae' => array( 1958 + 'javelin-behavior', 1959 + 'javelin-stratcom', 1960 + 'javelin-util', 1961 + 'javelin-dom', 1962 + 'javelin-request', 1963 + 'phabricator-keyboard-shortcut', 1972 1964 ), 1973 1965 'f5d1233b' => array( 1974 1966 'javelin-behavior',
+12 -1
src/applications/base/controller/PhabricatorController.php
··· 3 3 abstract class PhabricatorController extends AphrontController { 4 4 5 5 private $handles; 6 + private $extraQuicksandConfig = array(); 6 7 7 8 public function shouldRequireLogin() { 8 9 return true; ··· 59 60 60 61 public function isGlobalDragAndDropUploadEnabled() { 61 62 return false; 63 + } 64 + 65 + public function addExtraQuicksandConfig($config) { 66 + $this->extraQuicksandConfig += $config; 67 + return $this; 68 + } 69 + 70 + private function getExtraQuicksandConfig() { 71 + return $this->extraQuicksandConfig; 62 72 } 63 73 64 74 public function willBeginExecution() { ··· 294 304 private function buildPageResponse($page) { 295 305 if ($this->getRequest()->isQuicksand()) { 296 306 $response = id(new AphrontAjaxResponse()) 297 - ->setContent($page->renderForQuicksand()); 307 + ->setContent($page->renderForQuicksand( 308 + $this->getExtraQuicksandConfig())); 298 309 } else { 299 310 $response = id(new AphrontWebpageResponse()) 300 311 ->setContent($page->render());
+9 -11
src/applications/project/controller/PhabricatorProjectBoardViewController.php
··· 265 265 ->setUser($viewer) 266 266 ->setID($board_id); 267 267 268 + $behavior_config = array( 269 + 'boardID' => $board_id, 270 + 'projectPHID' => $project->getPHID(), 271 + 'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'), 272 + 'createURI' => '/maniphest/task/create/', 273 + 'order' => $this->sortKey, 274 + ); 268 275 $this->initBehavior( 269 276 'project-boards', 270 - array( 271 - 'boardID' => $board_id, 272 - 'projectPHID' => $project->getPHID(), 273 - 'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'), 274 - 'createURI' => '/maniphest/task/create/', 275 - 'order' => $this->sortKey, 276 - )); 277 + $behavior_config); 278 + $this->addExtraQuickSandConfig(array('boardConfig' => $behavior_config)); 277 279 278 280 $this->handles = ManiphestTaskListView::loadTaskHandles($viewer, $tasks); 279 281 ··· 339 341 $panel->setCards($cards); 340 342 $board->addPanel($panel); 341 343 } 342 - 343 - Javelin::initBehavior( 344 - 'boards-dropdown', 345 - array()); 346 344 347 345 $sort_menu = $this->buildSortMenu( 348 346 $viewer,
+3 -2
src/view/page/PhabricatorStandardPageView.php
··· 601 601 $foot); 602 602 } 603 603 604 - public function renderForQuicksand() { 604 + public function renderForQuicksand(array $extra_config) { 605 605 parent::willRenderPage(); 606 606 $response = $this->renderPageBodyContent(); 607 607 $response = $this->willSendResponse($response); 608 608 609 609 return array( 610 610 'content' => hsprintf('%s', $response), 611 - ) + $this->buildQuicksandConfig(); 611 + ) + $this->buildQuicksandConfig() 612 + + $extra_config; 612 613 } 613 614 614 615 private function buildQuicksandConfig() {
+6
webroot/rsrc/externals/javelin/lib/Quicksand.js
··· 68 68 }, 69 69 70 70 71 + getCurrentPageID: function() { 72 + return JX.Quicksand._id; 73 + }, 74 + 71 75 /** 72 76 * Respond to the user clicking a link. 73 77 * ··· 234 238 null, 235 239 { 236 240 newResponse: self._responses[self._current], 241 + newResponseID: self._current, 237 242 oldResponse: self._responses[self._onpage], 243 + oldResponseID: self._onpage, 238 244 fromServer: from_server 239 245 }); 240 246 self._onpage = self._current;
-35
webroot/rsrc/js/application/projects/behavior-boards-dropdown.js
··· 1 - /** 2 - * @provides javelin-behavior-boards-dropdown 3 - * @requires javelin-behavior 4 - * javelin-dom 5 - * javelin-stratcom 6 - * phuix-dropdown-menu 7 - */ 8 - 9 - JX.behavior('boards-dropdown', function() { 10 - 11 - JX.Stratcom.listen('click', 'boards-dropdown-menu', function(e) { 12 - var data = e.getNodeData('boards-dropdown-menu'); 13 - if (data.menu) { 14 - return; 15 - } 16 - 17 - e.kill(); 18 - 19 - var list = JX.$H(data.items).getFragment().firstChild; 20 - 21 - var button = e.getNode('boards-dropdown-menu'); 22 - data.menu = new JX.PHUIXDropdownMenu(button); 23 - data.menu.setContent(list); 24 - data.menu.open(); 25 - 26 - JX.DOM.listen(list, 'click', 'tag:a', function(e) { 27 - if (!e.isNormalClick()) { 28 - return; 29 - } 30 - data.menu.close(); 31 - }); 32 - }); 33 - 34 - 35 - });
+131 -70
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 9 9 * phabricator-draggable-list 10 10 */ 11 11 12 - JX.behavior('project-boards', function(config) { 12 + JX.behavior('project-boards', function(config, statics) { 13 13 14 14 function finditems(col) { 15 15 return JX.DOM.scry(col, 'li', 'project-card'); ··· 69 69 } 70 70 71 71 function getcolumns() { 72 - return JX.DOM.scry(JX.$(config.boardID), 'ul', 'project-column'); 72 + return JX.DOM.scry(JX.$(statics.boardID), 'ul', 'project-column'); 73 73 } 74 74 75 75 function colsort(u, v) { ··· 91 91 92 92 function getcontainer() { 93 93 return JX.DOM.find( 94 - JX.$(config.boardID), 94 + JX.$(statics.boardID), 95 95 'div', 96 96 'aphront-multi-column-view'); 97 97 } ··· 164 164 data.beforePHID = before_phid; 165 165 } 166 166 167 - data.order = config.order; 167 + data.order = statics.order; 168 168 169 - var workflow = new JX.Workflow(config.moveURI, data) 169 + var workflow = new JX.Workflow(statics.moveURI, data) 170 170 .setHandler(function(response) { 171 171 onresponse(response, item, list); 172 172 }); ··· 174 174 workflow.start(); 175 175 } 176 176 177 - var lists = []; 178 - var ii; 179 - var cols = getcolumns(); 180 - 181 - for (ii = 0; ii < cols.length; ii++) { 182 - var list = new JX.DraggableList('project-card', cols[ii]) 183 - .setFindItemsHandler(JX.bind(null, finditems, cols[ii])); 184 - 185 - list.listen('didSend', JX.bind(list, onupdate, cols[ii])); 186 - list.listen('didReceive', JX.bind(list, onupdate, cols[ii])); 187 - 188 - list.listen('didDrop', JX.bind(null, ondrop, list)); 189 - 190 - list.listen('didBeginDrag', JX.bind(null, onbegindrag)); 191 - list.listen('didEndDrag', JX.bind(null, onenddrag)); 192 - 193 - lists.push(list); 194 - 195 - onupdate(cols[ii]); 196 - } 197 - 198 - for (ii = 0; ii < lists.length; ii++) { 199 - lists[ii].setGroup(lists); 200 - } 201 - 202 - var onedit = function(column, r) { 177 + function onedit(column, r) { 203 178 var new_card = JX.$H(r.tasks).getNode(); 204 179 var new_data = JX.Stratcom.getData(new_card); 205 180 var items = finditems(column); ··· 241 216 onupdate(column); 242 217 }; 243 218 244 - JX.Stratcom.listen( 245 - 'click', 246 - ['edit-project-card'], 247 - function(e) { 219 + function update_statics(update_config) { 220 + statics.boardID = update_config.boardID; 221 + statics.projectPHID = update_config.projectPHID; 222 + statics.order = update_config.order; 223 + statics.moveURI = update_config.moveURI; 224 + statics.createURI = update_config.createURI; 225 + } 226 + 227 + function init_board() { 228 + var lists = []; 229 + var ii; 230 + var cols = getcolumns(); 231 + 232 + for (ii = 0; ii < cols.length; ii++) { 233 + var list = new JX.DraggableList('project-card', cols[ii]) 234 + .setFindItemsHandler(JX.bind(null, finditems, cols[ii])); 235 + 236 + list.listen('didSend', JX.bind(list, onupdate, cols[ii])); 237 + list.listen('didReceive', JX.bind(list, onupdate, cols[ii])); 238 + 239 + list.listen('didDrop', JX.bind(null, ondrop, list)); 240 + 241 + list.listen('didBeginDrag', JX.bind(null, onbegindrag)); 242 + list.listen('didEndDrag', JX.bind(null, onenddrag)); 243 + 244 + lists.push(list); 245 + 246 + onupdate(cols[ii]); 247 + } 248 + 249 + for (ii = 0; ii < lists.length; ii++) { 250 + lists[ii].setGroup(lists); 251 + } 252 + 253 + JX.Stratcom.listen( 254 + 'click', 255 + ['edit-project-card'], 256 + function(e) { 257 + e.kill(); 258 + var column = e.getNode('project-column'); 259 + var request_data = { 260 + responseType: 'card', 261 + columnPHID: JX.Stratcom.getData(column).columnPHID, 262 + order: statics.order 263 + }; 264 + new JX.Workflow(e.getNode('tag:a').href, request_data) 265 + .setHandler(JX.bind(null, onedit, column)) 266 + .start(); 267 + }); 268 + 269 + JX.Stratcom.listen( 270 + 'click', 271 + ['column-add-task'], 272 + function (e) { 273 + 274 + // We want the 'boards-dropdown-menu' behavior to see this event and 275 + // close the dropdown, but don't want to follow the link. 276 + e.prevent(); 277 + 278 + var column_phid = e.getNodeData('column-add-task').columnPHID; 279 + var request_data = { 280 + responseType: 'card', 281 + columnPHID: column_phid, 282 + projects: statics.projectPHID, 283 + order: statics.order 284 + }; 285 + var cols = getcolumns(); 286 + var ii; 287 + var column; 288 + for (ii = 0; ii < cols.length; ii++) { 289 + if (JX.Stratcom.getData(cols[ii]).columnPHID == column_phid) { 290 + column = cols[ii]; 291 + break; 292 + } 293 + } 294 + new JX.Workflow(statics.createURI, request_data) 295 + .setHandler(JX.bind(null, onedit, column)) 296 + .start(); 297 + }); 298 + 299 + JX.Stratcom.listen('click', 'boards-dropdown-menu', function(e) { 300 + var data = e.getNodeData('boards-dropdown-menu'); 301 + if (data.menu) { 302 + return; 303 + } 304 + 248 305 e.kill(); 249 - var column = e.getNode('project-column'); 250 - var request_data = { 251 - responseType: 'card', 252 - columnPHID: JX.Stratcom.getData(column).columnPHID, 253 - order: config.order 254 - }; 255 - new JX.Workflow(e.getNode('tag:a').href, request_data) 256 - .setHandler(JX.bind(null, onedit, column)) 257 - .start(); 258 - }); 259 306 260 - JX.Stratcom.listen( 261 - 'click', 262 - ['column-add-task'], 263 - function (e) { 307 + var list = JX.$H(data.items).getFragment().firstChild; 264 308 265 - // We want the 'boards-dropdown-menu' behavior to see this event and 266 - // close the dropdown, but don't want to follow the link. 267 - e.prevent(); 309 + var button = e.getNode('boards-dropdown-menu'); 310 + data.menu = new JX.PHUIXDropdownMenu(button); 311 + data.menu.setContent(list); 312 + data.menu.open(); 268 313 269 - var column_phid = e.getNodeData('column-add-task').columnPHID; 270 - var request_data = { 271 - responseType: 'card', 272 - columnPHID: column_phid, 273 - projects: config.projectPHID, 274 - order: config.order 275 - }; 276 - var cols = getcolumns(); 277 - var ii; 278 - var column; 279 - for (ii = 0; ii < cols.length; ii++) { 280 - if (JX.Stratcom.getData(cols[ii]).columnPHID == column_phid) { 281 - column = cols[ii]; 282 - break; 314 + JX.DOM.listen(list, 'click', 'tag:a', function(e) { 315 + if (!e.isNormalClick()) { 316 + return; 283 317 } 284 - } 285 - new JX.Workflow(config.createURI, request_data) 286 - .setHandler(JX.bind(null, onedit, column)) 287 - .start(); 318 + data.menu.close(); 319 + }); 288 320 }); 321 + 322 + JX.Stratcom.listen( 323 + 'quicksand-redraw', 324 + null, 325 + function (e) { 326 + var data = e.getData(); 327 + if (!data.newResponse.boardConfig) { 328 + return; 329 + } 330 + var new_config; 331 + if (data.fromServer) { 332 + new_config = data.newResponse.boardConfig; 333 + statics.boardConfigCache[data.newResponseID] = new_config; 334 + } else { 335 + new_config = statics.boardConfigCache[data.newResponseID]; 336 + statics.boardID = new_config.boardID; 337 + } 338 + update_statics(new_config); 339 + }); 340 + return true; 341 + } 342 + 343 + if (!statics.setup) { 344 + update_statics(config); 345 + var current_page_id = JX.Quicksand.getCurrentPageID(); 346 + statics.boardConfigCache = {}; 347 + statics.boardConfigCache[current_page_id] = config; 348 + statics.setup = init_board(); 349 + } 289 350 290 351 });
-1
webroot/rsrc/js/core/behavior-dark-console.js
··· 38 38 'quicksand-redraw', 39 39 null, 40 40 function (e) { 41 - e.kill(); 42 41 var data = e.getData(); 43 42 var new_console; 44 43 if (data.fromServer) {