1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-18 19:40:55 +01:00

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
This commit is contained in:
Bob Trahan 2015-04-28 14:51:49 -07:00
parent b1081a1553
commit 00f864b359
8 changed files with 188 additions and 155 deletions

View file

@ -9,7 +9,7 @@ return array(
'names' => array( 'names' => array(
'core.pkg.css' => '5e324506', 'core.pkg.css' => '5e324506',
'core.pkg.js' => '59d01bb7', 'core.pkg.js' => '59d01bb7',
'darkconsole.pkg.js' => '6d16ff19', 'darkconsole.pkg.js' => 'e7393ebb',
'differential.pkg.css' => '3500921f', 'differential.pkg.css' => '3500921f',
'differential.pkg.js' => '890046d3', 'differential.pkg.js' => '890046d3',
'diffusion.pkg.css' => '591664fa', 'diffusion.pkg.css' => '591664fa',
@ -205,7 +205,7 @@ return array(
'rsrc/externals/javelin/lib/JSON.js' => '69adf288', 'rsrc/externals/javelin/lib/JSON.js' => '69adf288',
'rsrc/externals/javelin/lib/Leader.js' => '331b1611', 'rsrc/externals/javelin/lib/Leader.js' => '331b1611',
'rsrc/externals/javelin/lib/Mask.js' => '8a41885b', 'rsrc/externals/javelin/lib/Mask.js' => '8a41885b',
'rsrc/externals/javelin/lib/Quicksand.js' => '517545ab', 'rsrc/externals/javelin/lib/Quicksand.js' => '51aeb01d',
'rsrc/externals/javelin/lib/Request.js' => '94b750d2', 'rsrc/externals/javelin/lib/Request.js' => '94b750d2',
'rsrc/externals/javelin/lib/Resource.js' => '44959b73', 'rsrc/externals/javelin/lib/Resource.js' => '44959b73',
'rsrc/externals/javelin/lib/Routable.js' => 'b3e7d692', 'rsrc/externals/javelin/lib/Routable.js' => 'b3e7d692',
@ -413,8 +413,7 @@ return array(
'rsrc/js/application/policy/behavior-policy-control.js' => '1ed33505', 'rsrc/js/application/policy/behavior-policy-control.js' => '1ed33505',
'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c', 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c',
'rsrc/js/application/ponder/behavior-votebox.js' => '4e9b766b', 'rsrc/js/application/ponder/behavior-votebox.js' => '4e9b766b',
'rsrc/js/application/projects/behavior-boards-dropdown.js' => '0ec56e1d', 'rsrc/js/application/projects/behavior-project-boards.js' => '60292820',
'rsrc/js/application/projects/behavior-project-boards.js' => '87cb6b51',
'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc',
'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb', 'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb',
'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf',
@ -460,7 +459,7 @@ return array(
'rsrc/js/core/behavior-autofocus.js' => '7319e029', 'rsrc/js/core/behavior-autofocus.js' => '7319e029',
'rsrc/js/core/behavior-choose-control.js' => '6153c708', 'rsrc/js/core/behavior-choose-control.js' => '6153c708',
'rsrc/js/core/behavior-crop.js' => 'fa0f4fc2', 'rsrc/js/core/behavior-crop.js' => 'fa0f4fc2',
'rsrc/js/core/behavior-dark-console.js' => '87987821', 'rsrc/js/core/behavior-dark-console.js' => 'f411b6ae',
'rsrc/js/core/behavior-device.js' => 'a205cf28', 'rsrc/js/core/behavior-device.js' => 'a205cf28',
'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '6d49590e', 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '6d49590e',
'rsrc/js/core/behavior-error-log.js' => '6882e80a', 'rsrc/js/core/behavior-error-log.js' => '6882e80a',
@ -560,14 +559,13 @@ return array(
'javelin-behavior-aphront-more' => 'a80d0378', 'javelin-behavior-aphront-more' => 'a80d0378',
'javelin-behavior-audio-source' => '59b251eb', 'javelin-behavior-audio-source' => '59b251eb',
'javelin-behavior-audit-preview' => 'd835b03a', 'javelin-behavior-audit-preview' => 'd835b03a',
'javelin-behavior-boards-dropdown' => '0ec56e1d',
'javelin-behavior-choose-control' => '6153c708', 'javelin-behavior-choose-control' => '6153c708',
'javelin-behavior-config-reorder-fields' => '14a827de', 'javelin-behavior-config-reorder-fields' => '14a827de',
'javelin-behavior-conpherence-menu' => '077a1dab', 'javelin-behavior-conpherence-menu' => '077a1dab',
'javelin-behavior-conpherence-pontificate' => '21ba5861', 'javelin-behavior-conpherence-pontificate' => '21ba5861',
'javelin-behavior-conpherence-widget-pane' => '93568464', 'javelin-behavior-conpherence-widget-pane' => '93568464',
'javelin-behavior-countdown-timer' => 'e4cc26b3', 'javelin-behavior-countdown-timer' => 'e4cc26b3',
'javelin-behavior-dark-console' => '87987821', 'javelin-behavior-dark-console' => 'f411b6ae',
'javelin-behavior-dashboard-async-panel' => '469c0d9e', 'javelin-behavior-dashboard-async-panel' => '469c0d9e',
'javelin-behavior-dashboard-move-panels' => '82439934', 'javelin-behavior-dashboard-move-panels' => '82439934',
'javelin-behavior-dashboard-query-panel-select' => '453c5375', 'javelin-behavior-dashboard-query-panel-select' => '453c5375',
@ -642,7 +640,7 @@ return array(
'javelin-behavior-policy-control' => '1ed33505', 'javelin-behavior-policy-control' => '1ed33505',
'javelin-behavior-policy-rule-editor' => '5e9f347c', 'javelin-behavior-policy-rule-editor' => '5e9f347c',
'javelin-behavior-ponder-votebox' => '4e9b766b', 'javelin-behavior-ponder-votebox' => '4e9b766b',
'javelin-behavior-project-boards' => '87cb6b51', 'javelin-behavior-project-boards' => '60292820',
'javelin-behavior-project-create' => '065227cc', 'javelin-behavior-project-create' => '065227cc',
'javelin-behavior-quicksand-blacklist' => '7927a7d3', 'javelin-behavior-quicksand-blacklist' => '7927a7d3',
'javelin-behavior-refresh-csrf' => '7814b593', 'javelin-behavior-refresh-csrf' => '7814b593',
@ -677,7 +675,7 @@ return array(
'javelin-leader' => '331b1611', 'javelin-leader' => '331b1611',
'javelin-magical-init' => '3010e992', 'javelin-magical-init' => '3010e992',
'javelin-mask' => '8a41885b', 'javelin-mask' => '8a41885b',
'javelin-quicksand' => '517545ab', 'javelin-quicksand' => '51aeb01d',
'javelin-reactor' => '2b8de964', 'javelin-reactor' => '2b8de964',
'javelin-reactor-dom' => 'c90a04fc', 'javelin-reactor-dom' => 'c90a04fc',
'javelin-reactor-node-calmer' => '76f4ebed', 'javelin-reactor-node-calmer' => '76f4ebed',
@ -921,12 +919,6 @@ return array(
'javelin-util', 'javelin-util',
'phabricator-notification-css', 'phabricator-notification-css',
), ),
'0ec56e1d' => array(
'javelin-behavior',
'javelin-dom',
'javelin-stratcom',
'phuix-dropdown-menu',
),
'0f764c35' => array( '0f764c35' => array(
'javelin-install', 'javelin-install',
'javelin-util', 'javelin-util',
@ -1193,14 +1185,14 @@ return array(
'javelin-typeahead-source', 'javelin-typeahead-source',
'javelin-util', 'javelin-util',
), ),
'517545ab' => array(
'javelin-install',
),
'519705ea' => array( '519705ea' => array(
'javelin-install', 'javelin-install',
'javelin-dom', 'javelin-dom',
'javelin-reactor-dom', 'javelin-reactor-dom',
), ),
'51aeb01d' => array(
'javelin-install',
),
'54b612ba' => array( '54b612ba' => array(
'javelin-color', 'javelin-color',
'javelin-install', 'javelin-install',
@ -1274,6 +1266,15 @@ return array(
'javelin-workflow', 'javelin-workflow',
'javelin-stratcom', 'javelin-stratcom',
), ),
60292820 => array(
'javelin-behavior',
'javelin-dom',
'javelin-util',
'javelin-vector',
'javelin-stratcom',
'javelin-workflow',
'phabricator-draggable-list',
),
60479091 => array( 60479091 => array(
'phabricator-busy', 'phabricator-busy',
'javelin-behavior', 'javelin-behavior',
@ -1472,23 +1473,6 @@ return array(
'aphront-typeahead-control-css', 'aphront-typeahead-control-css',
'phui-tag-view-css', 'phui-tag-view-css',
), ),
87987821 => array(
'javelin-behavior',
'javelin-stratcom',
'javelin-util',
'javelin-dom',
'javelin-request',
'phabricator-keyboard-shortcut',
),
'87cb6b51' => array(
'javelin-behavior',
'javelin-dom',
'javelin-util',
'javelin-vector',
'javelin-stratcom',
'javelin-workflow',
'phabricator-draggable-list',
),
'88236f00' => array( '88236f00' => array(
'javelin-behavior', 'javelin-behavior',
'phabricator-keyboard-shortcut', 'phabricator-keyboard-shortcut',
@ -1970,6 +1954,14 @@ return array(
'javelin-vector', 'javelin-vector',
'phabricator-hovercard', 'phabricator-hovercard',
), ),
'f411b6ae' => array(
'javelin-behavior',
'javelin-stratcom',
'javelin-util',
'javelin-dom',
'javelin-request',
'phabricator-keyboard-shortcut',
),
'f5d1233b' => array( 'f5d1233b' => array(
'javelin-behavior', 'javelin-behavior',
'javelin-dom', 'javelin-dom',

View file

@ -3,6 +3,7 @@
abstract class PhabricatorController extends AphrontController { abstract class PhabricatorController extends AphrontController {
private $handles; private $handles;
private $extraQuicksandConfig = array();
public function shouldRequireLogin() { public function shouldRequireLogin() {
return true; return true;
@ -61,6 +62,15 @@ abstract class PhabricatorController extends AphrontController {
return false; return false;
} }
public function addExtraQuicksandConfig($config) {
$this->extraQuicksandConfig += $config;
return $this;
}
private function getExtraQuicksandConfig() {
return $this->extraQuicksandConfig;
}
public function willBeginExecution() { public function willBeginExecution() {
$request = $this->getRequest(); $request = $this->getRequest();
@ -294,7 +304,8 @@ abstract class PhabricatorController extends AphrontController {
private function buildPageResponse($page) { private function buildPageResponse($page) {
if ($this->getRequest()->isQuicksand()) { if ($this->getRequest()->isQuicksand()) {
$response = id(new AphrontAjaxResponse()) $response = id(new AphrontAjaxResponse())
->setContent($page->renderForQuicksand()); ->setContent($page->renderForQuicksand(
$this->getExtraQuicksandConfig()));
} else { } else {
$response = id(new AphrontWebpageResponse()) $response = id(new AphrontWebpageResponse())
->setContent($page->render()); ->setContent($page->render());

View file

@ -265,15 +265,17 @@ final class PhabricatorProjectBoardViewController
->setUser($viewer) ->setUser($viewer)
->setID($board_id); ->setID($board_id);
$behavior_config = array(
'boardID' => $board_id,
'projectPHID' => $project->getPHID(),
'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'),
'createURI' => '/maniphest/task/create/',
'order' => $this->sortKey,
);
$this->initBehavior( $this->initBehavior(
'project-boards', 'project-boards',
array( $behavior_config);
'boardID' => $board_id, $this->addExtraQuickSandConfig(array('boardConfig' => $behavior_config));
'projectPHID' => $project->getPHID(),
'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'),
'createURI' => '/maniphest/task/create/',
'order' => $this->sortKey,
));
$this->handles = ManiphestTaskListView::loadTaskHandles($viewer, $tasks); $this->handles = ManiphestTaskListView::loadTaskHandles($viewer, $tasks);
@ -340,10 +342,6 @@ final class PhabricatorProjectBoardViewController
$board->addPanel($panel); $board->addPanel($panel);
} }
Javelin::initBehavior(
'boards-dropdown',
array());
$sort_menu = $this->buildSortMenu( $sort_menu = $this->buildSortMenu(
$viewer, $viewer,
$sort_key); $sort_key);

View file

@ -601,14 +601,15 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView {
$foot); $foot);
} }
public function renderForQuicksand() { public function renderForQuicksand(array $extra_config) {
parent::willRenderPage(); parent::willRenderPage();
$response = $this->renderPageBodyContent(); $response = $this->renderPageBodyContent();
$response = $this->willSendResponse($response); $response = $this->willSendResponse($response);
return array( return array(
'content' => hsprintf('%s', $response), 'content' => hsprintf('%s', $response),
) + $this->buildQuicksandConfig(); ) + $this->buildQuicksandConfig()
+ $extra_config;
} }
private function buildQuicksandConfig() { private function buildQuicksandConfig() {

View file

@ -68,6 +68,10 @@ JX.install('Quicksand', {
}, },
getCurrentPageID: function() {
return JX.Quicksand._id;
},
/** /**
* Respond to the user clicking a link. * Respond to the user clicking a link.
* *
@ -234,7 +238,9 @@ JX.install('Quicksand', {
null, null,
{ {
newResponse: self._responses[self._current], newResponse: self._responses[self._current],
newResponseID: self._current,
oldResponse: self._responses[self._onpage], oldResponse: self._responses[self._onpage],
oldResponseID: self._onpage,
fromServer: from_server fromServer: from_server
}); });
self._onpage = self._current; self._onpage = self._current;

View file

@ -1,35 +0,0 @@
/**
* @provides javelin-behavior-boards-dropdown
* @requires javelin-behavior
* javelin-dom
* javelin-stratcom
* phuix-dropdown-menu
*/
JX.behavior('boards-dropdown', function() {
JX.Stratcom.listen('click', 'boards-dropdown-menu', function(e) {
var data = e.getNodeData('boards-dropdown-menu');
if (data.menu) {
return;
}
e.kill();
var list = JX.$H(data.items).getFragment().firstChild;
var button = e.getNode('boards-dropdown-menu');
data.menu = new JX.PHUIXDropdownMenu(button);
data.menu.setContent(list);
data.menu.open();
JX.DOM.listen(list, 'click', 'tag:a', function(e) {
if (!e.isNormalClick()) {
return;
}
data.menu.close();
});
});
});

View file

@ -9,7 +9,7 @@
* phabricator-draggable-list * phabricator-draggable-list
*/ */
JX.behavior('project-boards', function(config) { JX.behavior('project-boards', function(config, statics) {
function finditems(col) { function finditems(col) {
return JX.DOM.scry(col, 'li', 'project-card'); return JX.DOM.scry(col, 'li', 'project-card');
@ -69,7 +69,7 @@ JX.behavior('project-boards', function(config) {
} }
function getcolumns() { function getcolumns() {
return JX.DOM.scry(JX.$(config.boardID), 'ul', 'project-column'); return JX.DOM.scry(JX.$(statics.boardID), 'ul', 'project-column');
} }
function colsort(u, v) { function colsort(u, v) {
@ -91,7 +91,7 @@ JX.behavior('project-boards', function(config) {
function getcontainer() { function getcontainer() {
return JX.DOM.find( return JX.DOM.find(
JX.$(config.boardID), JX.$(statics.boardID),
'div', 'div',
'aphront-multi-column-view'); 'aphront-multi-column-view');
} }
@ -164,9 +164,9 @@ JX.behavior('project-boards', function(config) {
data.beforePHID = before_phid; data.beforePHID = before_phid;
} }
data.order = config.order; data.order = statics.order;
var workflow = new JX.Workflow(config.moveURI, data) var workflow = new JX.Workflow(statics.moveURI, data)
.setHandler(function(response) { .setHandler(function(response) {
onresponse(response, item, list); onresponse(response, item, list);
}); });
@ -174,32 +174,7 @@ JX.behavior('project-boards', function(config) {
workflow.start(); workflow.start();
} }
var lists = []; function onedit(column, r) {
var ii;
var cols = getcolumns();
for (ii = 0; ii < cols.length; ii++) {
var list = new JX.DraggableList('project-card', cols[ii])
.setFindItemsHandler(JX.bind(null, finditems, cols[ii]));
list.listen('didSend', JX.bind(list, onupdate, cols[ii]));
list.listen('didReceive', JX.bind(list, onupdate, cols[ii]));
list.listen('didDrop', JX.bind(null, ondrop, list));
list.listen('didBeginDrag', JX.bind(null, onbegindrag));
list.listen('didEndDrag', JX.bind(null, onenddrag));
lists.push(list);
onupdate(cols[ii]);
}
for (ii = 0; ii < lists.length; ii++) {
lists[ii].setGroup(lists);
}
var onedit = function(column, r) {
var new_card = JX.$H(r.tasks).getNode(); var new_card = JX.$H(r.tasks).getNode();
var new_data = JX.Stratcom.getData(new_card); var new_data = JX.Stratcom.getData(new_card);
var items = finditems(column); var items = finditems(column);
@ -241,50 +216,136 @@ JX.behavior('project-boards', function(config) {
onupdate(column); onupdate(column);
}; };
JX.Stratcom.listen( function update_statics(update_config) {
'click', statics.boardID = update_config.boardID;
['edit-project-card'], statics.projectPHID = update_config.projectPHID;
function(e) { statics.order = update_config.order;
e.kill(); statics.moveURI = update_config.moveURI;
var column = e.getNode('project-column'); statics.createURI = update_config.createURI;
var request_data = { }
responseType: 'card',
columnPHID: JX.Stratcom.getData(column).columnPHID,
order: config.order
};
new JX.Workflow(e.getNode('tag:a').href, request_data)
.setHandler(JX.bind(null, onedit, column))
.start();
});
JX.Stratcom.listen( function init_board() {
'click', var lists = [];
['column-add-task'], var ii;
function (e) { var cols = getcolumns();
// We want the 'boards-dropdown-menu' behavior to see this event and for (ii = 0; ii < cols.length; ii++) {
// close the dropdown, but don't want to follow the link. var list = new JX.DraggableList('project-card', cols[ii])
e.prevent(); .setFindItemsHandler(JX.bind(null, finditems, cols[ii]));
var column_phid = e.getNodeData('column-add-task').columnPHID; list.listen('didSend', JX.bind(list, onupdate, cols[ii]));
var request_data = { list.listen('didReceive', JX.bind(list, onupdate, cols[ii]));
responseType: 'card',
columnPHID: column_phid, list.listen('didDrop', JX.bind(null, ondrop, list));
projects: config.projectPHID,
order: config.order list.listen('didBeginDrag', JX.bind(null, onbegindrag));
}; list.listen('didEndDrag', JX.bind(null, onenddrag));
var cols = getcolumns();
var ii; lists.push(list);
var column;
for (ii = 0; ii < cols.length; ii++) { onupdate(cols[ii]);
if (JX.Stratcom.getData(cols[ii]).columnPHID == column_phid) { }
column = cols[ii];
break; for (ii = 0; ii < lists.length; ii++) {
lists[ii].setGroup(lists);
}
JX.Stratcom.listen(
'click',
['edit-project-card'],
function(e) {
e.kill();
var column = e.getNode('project-column');
var request_data = {
responseType: 'card',
columnPHID: JX.Stratcom.getData(column).columnPHID,
order: statics.order
};
new JX.Workflow(e.getNode('tag:a').href, request_data)
.setHandler(JX.bind(null, onedit, column))
.start();
});
JX.Stratcom.listen(
'click',
['column-add-task'],
function (e) {
// We want the 'boards-dropdown-menu' behavior to see this event and
// close the dropdown, but don't want to follow the link.
e.prevent();
var column_phid = e.getNodeData('column-add-task').columnPHID;
var request_data = {
responseType: 'card',
columnPHID: column_phid,
projects: statics.projectPHID,
order: statics.order
};
var cols = getcolumns();
var ii;
var column;
for (ii = 0; ii < cols.length; ii++) {
if (JX.Stratcom.getData(cols[ii]).columnPHID == column_phid) {
column = cols[ii];
break;
}
} }
new JX.Workflow(statics.createURI, request_data)
.setHandler(JX.bind(null, onedit, column))
.start();
});
JX.Stratcom.listen('click', 'boards-dropdown-menu', function(e) {
var data = e.getNodeData('boards-dropdown-menu');
if (data.menu) {
return;
} }
new JX.Workflow(config.createURI, request_data)
.setHandler(JX.bind(null, onedit, column)) e.kill();
.start();
var list = JX.$H(data.items).getFragment().firstChild;
var button = e.getNode('boards-dropdown-menu');
data.menu = new JX.PHUIXDropdownMenu(button);
data.menu.setContent(list);
data.menu.open();
JX.DOM.listen(list, 'click', 'tag:a', function(e) {
if (!e.isNormalClick()) {
return;
}
data.menu.close();
});
}); });
JX.Stratcom.listen(
'quicksand-redraw',
null,
function (e) {
var data = e.getData();
if (!data.newResponse.boardConfig) {
return;
}
var new_config;
if (data.fromServer) {
new_config = data.newResponse.boardConfig;
statics.boardConfigCache[data.newResponseID] = new_config;
} else {
new_config = statics.boardConfigCache[data.newResponseID];
statics.boardID = new_config.boardID;
}
update_statics(new_config);
});
return true;
}
if (!statics.setup) {
update_statics(config);
var current_page_id = JX.Quicksand.getCurrentPageID();
statics.boardConfigCache = {};
statics.boardConfigCache[current_page_id] = config;
statics.setup = init_board();
}
}); });

View file

@ -38,7 +38,6 @@ JX.behavior('dark-console', function(config, statics) {
'quicksand-redraw', 'quicksand-redraw',
null, null,
function (e) { function (e) {
e.kill();
var data = e.getData(); var data = e.getData();
var new_console; var new_console;
if (data.fromServer) { if (data.fromServer) {