diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -415,8 +415,8 @@ 'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef', 'rsrc/js/application/policy/behavior-policy-control.js' => 'd0c516d5', 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c', - 'rsrc/js/application/projects/Workboard.js' => '555f521a', - 'rsrc/js/application/projects/behavior-project-boards.js' => '9ed304e5', + 'rsrc/js/application/projects/Workboard.js' => 'b38d2c73', + 'rsrc/js/application/projects/behavior-project-boards.js' => '7f4359dd', 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb', 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', @@ -656,7 +656,7 @@ 'javelin-behavior-phui-profile-menu' => '12884df9', 'javelin-behavior-policy-control' => 'd0c516d5', 'javelin-behavior-policy-rule-editor' => '5e9f347c', - 'javelin-behavior-project-boards' => '9ed304e5', + 'javelin-behavior-project-boards' => '7f4359dd', 'javelin-behavior-project-create' => '065227cc', 'javelin-behavior-quicksand-blacklist' => '7927a7d3', 'javelin-behavior-recurring-edit' => '5f1c4d5f', @@ -723,7 +723,7 @@ 'javelin-view-renderer' => '6c2b09a2', 'javelin-view-visitor' => 'efe49472', 'javelin-websocket' => 'e292eaf4', - 'javelin-workboard' => '555f521a', + 'javelin-workboard' => 'b38d2c73', 'javelin-workflow' => '5b2e3e2b', 'lightbox-attachment-css' => '7acac05d', 'maniphest-batch-editor' => 'b0f0b6d5', @@ -1223,16 +1223,6 @@ 'javelin-request', 'javelin-typeahead-source', ), - '555f521a' => array( - 'javelin-install', - 'javelin-dom', - 'javelin-util', - 'javelin-vector', - 'javelin-stratcom', - 'javelin-workflow', - 'phabricator-draggable-list', - 'phabricator-drag-and-drop-file-upload', - ), '558829c2' => array( 'javelin-stratcom', 'javelin-behavior', @@ -1456,6 +1446,17 @@ 'javelin-behavior', 'javelin-history', ), + '7f4359dd' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-vector', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', + 'phabricator-drag-and-drop-file-upload', + 'javelin-workboard', + ), '805b806a' => array( 'javelin-magical-init', 'javelin-install', @@ -1597,17 +1598,6 @@ 'javelin-dom', 'javelin-vector', ), - '9ed304e5' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-util', - 'javelin-vector', - 'javelin-stratcom', - 'javelin-workflow', - 'phabricator-draggable-list', - 'phabricator-drag-and-drop-file-upload', - 'javelin-workboard', - ), '9f36c42d' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1727,6 +1717,16 @@ 'javelin-uri', 'javelin-request', ), + 'b38d2c73' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-util', + 'javelin-vector', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', + 'phabricator-drag-and-drop-file-upload', + ), 'b3a4b884' => array( 'javelin-behavior', 'phabricator-prefab', diff --git a/webroot/rsrc/js/application/projects/Workboard.js b/webroot/rsrc/js/application/projects/Workboard.js --- a/webroot/rsrc/js/application/projects/Workboard.js +++ b/webroot/rsrc/js/application/projects/Workboard.js @@ -33,7 +33,11 @@ addBoard: function(board_phid, board_node) { this._currentBoard = board_phid; - this._boardNodes[board_phid] = board_node; + + if (!this._boardNodes[board_phid]) { + this._boardNodes[board_phid] = board_node; + this._setupDragHandlers(board_node); + } }, _getConfig: function() { @@ -121,6 +125,85 @@ _onpanmouseup: function() { this._panOrigin = null; + }, + + + _setupDragHandlers: function(board_node) { + var columns = this._findBoardColumns(board_node); + var column; + var ii; + var lists = []; + + for (ii = 0; ii < columns.length; ii++) { + column = columns[ii]; + + var list = new JX.DraggableList('project-card', column) + .setOuterContainer(board_node) + .setFindItemsHandler(JX.bind(this, this._findCardsInColumn, column)) + .setCanDragX(true); + + // TODO: Restore these behaviors. + // list.listen('didSend', JX.bind(list, onupdate, cols[ii])); + // list.listen('didReceive', JX.bind(list, onupdate, cols[ii])); + // onupdate(cols[ii]); + + list.listen('didDrop', JX.bind(this, this._onmovecard, list)); + + // TODO: Restore these behaviors. + // list.listen('didBeginDrag', JX.bind(null, onbegindrag)); + // list.listen('didEndDrag', JX.bind(null, onenddrag)); + + lists.push(list); + } + + for (ii = 0; ii < lists.length; ii++) { + lists[ii].setGroup(lists); + } + }, + + _findBoardColumns: function(board_node) { + return JX.DOM.scry(board_node, 'ul', 'project-column'); + }, + + _findCardsInColumn: function(column_node) { + return JX.DOM.scry(column_node, 'li', 'project-card'); + }, + + _onmovecard: function(list, item, after_node) { + list.lock(); + JX.DOM.alterClass(item, 'drag-sending', true); + + var item_phid = JX.Stratcom.getData(item).objectPHID; + var data = { + objectPHID: item_phid, + columnPHID: JX.Stratcom.getData(list.getRootNode()).columnPHID + }; + + if (after_node) { + data.afterPHID = JX.Stratcom.getData(after_node).objectPHID; + } + + var before_node = item.nextSibling; + if (before_node) { + var before_phid = JX.Stratcom.getData(before_node).objectPHID; + if (before_phid) { + data.beforePHID = before_phid; + } + } + + // TODO: This should be managed per-board. + var config = this._getConfig(); + data.order = config.order; + + new JX.Workflow(config.moveURI, data) + .setHandler(JX.bind(this, this._oncardupdate, item, list)) + .start(); + }, + + _oncardupdate: function(item, list, response) { + list.unlock(); + JX.DOM.alterClass(item, 'drag-sending', false); + JX.DOM.replace(item, JX.$H(response.task)); } } diff --git a/webroot/rsrc/js/application/projects/behavior-project-boards.js b/webroot/rsrc/js/application/projects/behavior-project-boards.js --- a/webroot/rsrc/js/application/projects/behavior-project-boards.js +++ b/webroot/rsrc/js/application/projects/behavior-project-boards.js @@ -13,9 +13,6 @@ JX.behavior('project-boards', function(config, statics) { - function finditems(col) { - return JX.DOM.scry(col, 'li', 'project-card'); - } function onupdate(col) { var data = JX.Stratcom.getData(col); @@ -64,15 +61,6 @@ } } - function onresponse(response, item, list) { - list.unlock(); - JX.DOM.alterClass(item, 'drag-sending', false); - JX.DOM.replace(item, JX.$H(response.task)); - } - - function getcolumns() { - return JX.DOM.scry(JX.$(statics.boardID), 'ul', 'project-column'); - } function colsort(u, v) { var ud = JX.Stratcom.getData(u).sort || []; @@ -126,56 +114,6 @@ getcontainer().style.minHeight = ''; } - function ondrop(list, item, after) { - list.lock(); - JX.DOM.alterClass(item, 'drag-sending', true); - - var item_phid = JX.Stratcom.getData(item).objectPHID; - var data = { - objectPHID: item_phid, - columnPHID: JX.Stratcom.getData(list.getRootNode()).columnPHID - }; - - var after_phid = null; - var items = finditems(list.getRootNode()); - if (after) { - after_phid = JX.Stratcom.getData(after).objectPHID; - data.afterPHID = after_phid; - } - var ii; - var ii_item; - var ii_item_phid; - var ii_prev_item_phid = null; - var before_phid = null; - for (ii = 0; ii < items.length; ii++) { - ii_item = items[ii]; - ii_item_phid = JX.Stratcom.getData(ii_item).objectPHID; - if (ii_item_phid == item_phid) { - // skip the item we just dropped - continue; - } - // note this handles when there is no after phid - we are at the top of - // the list - quite nicely - if (ii_prev_item_phid == after_phid) { - before_phid = ii_item_phid; - break; - } - ii_prev_item_phid = ii_item_phid; - } - if (before_phid) { - data.beforePHID = before_phid; - } - - data.order = statics.order; - - var workflow = new JX.Workflow(statics.moveURI, data) - .setHandler(function(response) { - onresponse(response, item, list); - }); - - workflow.start(); - } - function onedit(column, r) { var new_card = JX.$H(r.tasks).getNode(); var new_data = JX.Stratcom.getData(new_card); @@ -226,35 +164,6 @@ statics.createURI = update_config.createURI; } - function init_board() { - var lists = []; - 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])) - .setOuterContainer(JX.$(config.boardID)) - .setCanDragX(true); - - 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); - } - } - function setup() { JX.Stratcom.listen( @@ -346,9 +255,6 @@ statics.boardID = new_config.boardID; } update_statics(new_config); - if (data.fromServer) { - init_board(); - } }); return true; @@ -359,7 +265,6 @@ var current_page_id = JX.Quicksand.getCurrentPageID(); statics.boardConfigCache = {}; statics.boardConfigCache[current_page_id] = config; - init_board(); statics.setup = setup(); }