1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-15 18:10:53 +01:00
phorge-phorge/webroot/rsrc/js/application/projects/WorkboardController.js
epriestley 6f7bb8c91a On workboards, provide all of the supported "create task" forms in the dropdown
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
2017-03-02 04:24:40 -08:00

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();
}
}
});