mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-14 19:02:41 +01:00
6f7bb8c91a
Summary: Ref T12314. Ref T6064. Ref T11580. If an install defines several different task create forms (like "Create Plant" and "Create Animal"), allow any of them to be created directly onto a workboard column. This is just a general consistency improvement that makes Custom Forms and Workboards work together a bit better. We might do something fancier eventually for T6064 (which wants fewer clicks) and/or T11580 (which wants per-workboard control over forms or defaults). Test Plan: - Created several different types of tasks directly onto a workboard. - Faked just one create form, saw the UI unchanged (except that it respects any renaming). {F3492928} Reviewers: chad Reviewed By: chad Maniphest Tasks: T12314, T11580, T6064 Differential Revision: https://secure.phabricator.com/D17446
200 lines
5.1 KiB
JavaScript
200 lines
5.1 KiB
JavaScript
/**
|
|
* @provides javelin-workboard-controller
|
|
* @requires javelin-install
|
|
* javelin-dom
|
|
* javelin-util
|
|
* javelin-vector
|
|
* javelin-stratcom
|
|
* javelin-workflow
|
|
* phabricator-drag-and-drop-file-upload
|
|
* javelin-workboard-board
|
|
* @javelin
|
|
*/
|
|
|
|
JX.install('WorkboardController', {
|
|
|
|
construct: function() {
|
|
this._boards = {};
|
|
},
|
|
|
|
properties: {
|
|
uploadURI: null,
|
|
coverURI: null,
|
|
moveURI: null,
|
|
chunkThreshold: null
|
|
},
|
|
|
|
members: {
|
|
_boards: null,
|
|
|
|
_panOrigin: null,
|
|
_panNode: null,
|
|
_panX: null,
|
|
|
|
start: function() {
|
|
this._setupCoverImageHandlers();
|
|
this._setupPanHandlers();
|
|
this._setupEditHandlers();
|
|
|
|
return this;
|
|
},
|
|
|
|
newBoard: function(phid, node) {
|
|
var board = new JX.WorkboardBoard(this, phid, node);
|
|
this._boards[phid] = board;
|
|
return board;
|
|
},
|
|
|
|
_getBoard: function(board_phid) {
|
|
return this._boards[board_phid];
|
|
},
|
|
|
|
_setupCoverImageHandlers: function() {
|
|
if (!JX.PhabricatorDragAndDropFileUpload.isSupported()) {
|
|
return;
|
|
}
|
|
|
|
var drop = new JX.PhabricatorDragAndDropFileUpload('project-card')
|
|
.setURI(this.getUploadURI())
|
|
.setChunkThreshold(this.getChunkThreshold());
|
|
|
|
drop.listen('didBeginDrag', function(node) {
|
|
JX.DOM.alterClass(node, 'phui-workcard-upload-target', true);
|
|
});
|
|
|
|
drop.listen('didEndDrag', function(node) {
|
|
JX.DOM.alterClass(node, 'phui-workcard-upload-target', false);
|
|
});
|
|
|
|
drop.listen('didUpload', JX.bind(this, this._oncoverupload));
|
|
|
|
drop.start();
|
|
},
|
|
|
|
_oncoverupload: function(file) {
|
|
var node = file.getTargetNode();
|
|
|
|
var board = this._getBoardFromNode(node);
|
|
|
|
var column_node = JX.DOM.findAbove(node, 'ul', 'project-column');
|
|
var column_phid = JX.Stratcom.getData(column_node).columnPHID;
|
|
var column = board.getColumn(column_phid);
|
|
|
|
var data = {
|
|
boardPHID: board.getPHID(),
|
|
objectPHID: JX.Stratcom.getData(node).objectPHID,
|
|
filePHID: file.getPHID(),
|
|
visiblePHIDs: column.getCardPHIDs()
|
|
};
|
|
|
|
new JX.Workflow(this.getCoverURI(), data)
|
|
.setHandler(JX.bind(board, board.updateCard))
|
|
.start();
|
|
},
|
|
|
|
_getBoardFromNode: function(node) {
|
|
var board_node = JX.DOM.findAbove(node, 'div', 'jx-workboard');
|
|
var board_phid = JX.Stratcom.getData(board_node).boardPHID;
|
|
return this._getBoard(board_phid);
|
|
},
|
|
|
|
_setupPanHandlers: function() {
|
|
var mousedown = JX.bind(this, this._onpanmousedown);
|
|
var mousemove = JX.bind(this, this._onpanmousemove);
|
|
var mouseup = JX.bind(this, this._onpanmouseup);
|
|
|
|
JX.Stratcom.listen('mousedown', 'workboard-shadow', mousedown);
|
|
JX.Stratcom.listen('mousemove', null, mousemove);
|
|
JX.Stratcom.listen('mouseup', null, mouseup);
|
|
},
|
|
|
|
_onpanmousedown: function(e) {
|
|
if (!JX.Device.isDesktop()) {
|
|
return;
|
|
}
|
|
|
|
if (e.getNode('workpanel')) {
|
|
return;
|
|
}
|
|
|
|
if (JX.Stratcom.pass()) {
|
|
return;
|
|
}
|
|
|
|
e.kill();
|
|
|
|
this._panOrigin = JX.$V(e);
|
|
this._panNode = e.getNode('workboard-shadow');
|
|
this._panX = this._panNode.scrollLeft;
|
|
},
|
|
|
|
_onpanmousemove: function(e) {
|
|
if (!this._panOrigin) {
|
|
return;
|
|
}
|
|
|
|
var cursor = JX.$V(e);
|
|
this._panNode.scrollLeft = this._panX + (this._panOrigin.x - cursor.x);
|
|
},
|
|
|
|
_onpanmouseup: function() {
|
|
this._panOrigin = null;
|
|
},
|
|
|
|
_setupEditHandlers: function() {
|
|
var onadd = JX.bind(this, this._onaddcard);
|
|
var onedit = JX.bind(this, this._oneditcard);
|
|
|
|
JX.Stratcom.listen('click', 'column-add-task', onadd);
|
|
JX.Stratcom.listen('click', 'edit-project-card', onedit);
|
|
},
|
|
|
|
_onaddcard: 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_data = e.getNodeData('column-add-task');
|
|
var column_phid = column_data.columnPHID;
|
|
|
|
var board_phid = column_data.boardPHID;
|
|
var board = this._getBoard(board_phid);
|
|
var column = board.getColumn(column_phid);
|
|
|
|
var request_data = {
|
|
responseType: 'card',
|
|
columnPHID: column.getPHID(),
|
|
projects: column_data.projectPHID,
|
|
visiblePHIDs: column.getCardPHIDs(),
|
|
order: board.getOrder()
|
|
};
|
|
|
|
new JX.Workflow(column_data.createURI, request_data)
|
|
.setHandler(JX.bind(board, board.updateCard))
|
|
.start();
|
|
},
|
|
|
|
_oneditcard: function(e) {
|
|
e.kill();
|
|
|
|
var column_node = e.getNode('project-column');
|
|
var column_phid = JX.Stratcom.getData(column_node).columnPHID;
|
|
|
|
var board = this._getBoardFromNode(column_node);
|
|
var column = board.getColumn(column_phid);
|
|
|
|
var request_data = {
|
|
responseType: 'card',
|
|
columnPHID: column.getPHID(),
|
|
visiblePHIDs: column.getCardPHIDs(),
|
|
order: board.getOrder()
|
|
};
|
|
|
|
new JX.Workflow(e.getNode('tag:a').href, request_data)
|
|
.setHandler(JX.bind(board, board.updateCard))
|
|
.start();
|
|
}
|
|
|
|
}
|
|
|
|
});
|