Changeset View
Changeset View
Standalone View
Standalone View
webroot/rsrc/js/application/projects/behavior-project-boards.js
/** | /** | ||||
* @provides javelin-behavior-project-boards | * @provides javelin-behavior-project-boards | ||||
* @requires javelin-behavior | * @requires javelin-behavior | ||||
* javelin-dom | * javelin-dom | ||||
* javelin-util | * javelin-util | ||||
* javelin-vector | * javelin-vector | ||||
* javelin-stratcom | * javelin-stratcom | ||||
* javelin-workflow | * javelin-workflow | ||||
* phabricator-draggable-list | * phabricator-draggable-list | ||||
* phabricator-drag-and-drop-file-upload | * phabricator-drag-and-drop-file-upload | ||||
* javelin-workboard | * javelin-workboard | ||||
*/ | */ | ||||
JX.behavior('project-boards', function(config, statics) { | JX.behavior('project-boards', function(config, statics) { | ||||
function finditems(col) { | |||||
return JX.DOM.scry(col, 'li', 'project-card'); | |||||
} | |||||
function onupdate(col) { | function onupdate(col) { | ||||
var data = JX.Stratcom.getData(col); | var data = JX.Stratcom.getData(col); | ||||
var cards = finditems(col); | var cards = finditems(col); | ||||
// Update the count of tasks in the column header. | // Update the count of tasks in the column header. | ||||
if (!data.countTagNode) { | if (!data.countTagNode) { | ||||
data.countTagNode = JX.$(data.countTagID); | data.countTagNode = JX.$(data.countTagID); | ||||
Show All 32 Lines | var color_map = { | ||||
'phui-tag-shade-blue': (sum > 0 && !over_limit), | 'phui-tag-shade-blue': (sum > 0 && !over_limit), | ||||
'phui-tag-shade-red': (over_limit) | 'phui-tag-shade-red': (over_limit) | ||||
}; | }; | ||||
for (var c in color_map) { | for (var c in color_map) { | ||||
JX.DOM.alterClass(data.countTagNode, c, !!color_map[c]); | JX.DOM.alterClass(data.countTagNode, c, !!color_map[c]); | ||||
} | } | ||||
} | } | ||||
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) { | function colsort(u, v) { | ||||
var ud = JX.Stratcom.getData(u).sort || []; | var ud = JX.Stratcom.getData(u).sort || []; | ||||
var vd = JX.Stratcom.getData(v).sort || []; | var vd = JX.Stratcom.getData(v).sort || []; | ||||
for (var ii = 0; ii < ud.length; ii++) { | for (var ii = 0; ii < ud.length; ii++) { | ||||
if (parseInt(ud[ii]) < parseInt(vd[ii])) { | if (parseInt(ud[ii]) < parseInt(vd[ii])) { | ||||
Show All 37 Lines | function onbegindrag(item) { | ||||
container.style.minHeight = (item_size.y + container_size.y + 12) + 'px'; | container.style.minHeight = (item_size.y + container_size.y + 12) + 'px'; | ||||
} | } | ||||
function onenddrag() { | function onenddrag() { | ||||
getcontainer().style.minHeight = ''; | 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) { | function onedit(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); | ||||
var edited = false; | var edited = false; | ||||
var remove_index = null; | var remove_index = null; | ||||
for (var ii = 0; ii < items.length; ii++) { | for (var ii = 0; ii < items.length; ii++) { | ||||
Show All 34 Lines | JX.behavior('project-boards', function(config, statics) { | ||||
function update_statics(update_config) { | function update_statics(update_config) { | ||||
statics.boardID = update_config.boardID; | statics.boardID = update_config.boardID; | ||||
statics.projectPHID = update_config.projectPHID; | statics.projectPHID = update_config.projectPHID; | ||||
statics.order = update_config.order; | statics.order = update_config.order; | ||||
statics.moveURI = update_config.moveURI; | statics.moveURI = update_config.moveURI; | ||||
statics.createURI = update_config.createURI; | 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() { | function setup() { | ||||
JX.Stratcom.listen( | JX.Stratcom.listen( | ||||
'click', | 'click', | ||||
['edit-project-card'], | ['edit-project-card'], | ||||
function(e) { | function(e) { | ||||
e.kill(); | e.kill(); | ||||
var column = e.getNode('project-column'); | var column = e.getNode('project-column'); | ||||
▲ Show 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | JX.Stratcom.listen( | ||||
if (data.fromServer) { | if (data.fromServer) { | ||||
new_config = data.newResponse.boardConfig; | new_config = data.newResponse.boardConfig; | ||||
statics.boardConfigCache[data.newResponseID] = new_config; | statics.boardConfigCache[data.newResponseID] = new_config; | ||||
} else { | } else { | ||||
new_config = statics.boardConfigCache[data.newResponseID]; | new_config = statics.boardConfigCache[data.newResponseID]; | ||||
statics.boardID = new_config.boardID; | statics.boardID = new_config.boardID; | ||||
} | } | ||||
update_statics(new_config); | update_statics(new_config); | ||||
if (data.fromServer) { | |||||
init_board(); | |||||
} | |||||
}); | }); | ||||
return true; | return true; | ||||
} | } | ||||
if (!statics.setup) { | if (!statics.setup) { | ||||
update_statics(config); | update_statics(config); | ||||
var current_page_id = JX.Quicksand.getCurrentPageID(); | var current_page_id = JX.Quicksand.getCurrentPageID(); | ||||
statics.boardConfigCache = {}; | statics.boardConfigCache = {}; | ||||
statics.boardConfigCache[current_page_id] = config; | statics.boardConfigCache[current_page_id] = config; | ||||
init_board(); | |||||
statics.setup = setup(); | statics.setup = setup(); | ||||
} | } | ||||
if (!statics.workboard) { | if (!statics.workboard) { | ||||
statics.workboard = new JX.Workboard(config); | statics.workboard = new JX.Workboard(config); | ||||
} | } | ||||
statics.workboard.addBoard(config.projectPHID, JX.$(config.boardID)); | statics.workboard.addBoard(config.projectPHID, JX.$(config.boardID)); | ||||
}); | }); |