Add rule action to move cards to other boards

Fixes #1996
This commit is contained in:
Peter Verraedt 2020-01-22 12:09:26 +01:00
parent 70f5326099
commit 4b56bbfe6d
3 changed files with 102 additions and 39 deletions

View file

@ -1,29 +1,42 @@
template(name="boardActions") template(name="boardActions")
div.trigger-item div.trigger-item
div.trigger-content div.trigger-content
div.trigger-text div.trigger-text
| {{_'r-move-card-to'}} | {{_'r-move-card-to'}}
div.trigger-dropdown div.trigger-dropdown
select(id="move-gen-action") select(id="move-gen-action")
option(value="top") {{_'r-top-of'}} option(value="top") {{_'r-top-of'}}
option(value="bottom") {{_'r-bottom-of'}} option(value="bottom") {{_'r-bottom-of'}}
div.trigger-text div.trigger-text
| {{_'r-its-list'}} | {{_'r-its-list'}}
div.trigger-button.js-add-gen-move-action.js-goto-rules div.trigger-button.js-add-gen-move-action.js-goto-rules
i.fa.fa-plus i.fa.fa-plus
div.trigger-item div.trigger-item
div.trigger-content div.trigger-content
div.trigger-text div.trigger-text
| {{_'r-move-card-to'}} | {{_'r-move-card-to'}}
div.trigger-dropdown div.trigger-dropdown
select(id="move-spec-action") select(id="move-spec-action")
option(value="top") {{_'r-top-of'}} option(value="top") {{_'r-top-of'}}
option(value="bottom") {{_'r-bottom-of'}} option(value="bottom") {{_'r-bottom-of'}}
div.trigger-text div.trigger-text
| {{_'r-list'}} | {{_'r-the-board'}}
div.trigger-dropdown
select(id="board-id")
each boards
if $eq _id currentBoard._id
option(value="{{_id}}" selected) {{_ 'current'}}
else
option(value="{{_id}}") {{title}}
div.trigger-text
| {{_'r-in-list'}}
div.trigger-dropdown div.trigger-dropdown
input(id="listName",type=text,placeholder="{{_'r-name'}}") input(id="listName",type=text,placeholder="{{_'r-name'}}")
div.trigger-text
| {{_'r-in-swimlane'}}
div.trigger-dropdown
input(id="swimlaneName",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-spec-move-action.js-goto-rules div.trigger-button.js-add-spec-move-action.js-goto-rules
i.fa.fa-plus i.fa.fa-plus
@ -33,14 +46,14 @@ template(name="boardActions")
select(id="arch-action") select(id="arch-action")
option(value="archive") {{_'r-archive'}} option(value="archive") {{_'r-archive'}}
option(value="unarchive") {{_'r-unarchive'}} option(value="unarchive") {{_'r-unarchive'}}
div.trigger-text div.trigger-text
| {{_'r-card'}} | {{_'r-card'}}
div.trigger-button.js-add-arch-action.js-goto-rules div.trigger-button.js-add-arch-action.js-goto-rules
i.fa.fa-plus i.fa.fa-plus
div.trigger-item div.trigger-item
div.trigger-content div.trigger-content
div.trigger-text div.trigger-text
| {{_'r-add-swimlane'}} | {{_'r-add-swimlane'}}
div.trigger-dropdown div.trigger-dropdown
input(id="swimlane-name",type=text,placeholder="{{_'r-name'}}") input(id="swimlane-name",type=text,placeholder="{{_'r-name'}}")
@ -49,15 +62,15 @@ template(name="boardActions")
div.trigger-item div.trigger-item
div.trigger-content div.trigger-content
div.trigger-text div.trigger-text
| {{_'r-create-card'}} | {{_'r-create-card'}}
div.trigger-dropdown div.trigger-dropdown
input(id="card-name",type=text,placeholder="{{_'r-name'}}") input(id="card-name",type=text,placeholder="{{_'r-name'}}")
div.trigger-text div.trigger-text
| {{_'r-in-list'}} | {{_'r-in-list'}}
div.trigger-dropdown div.trigger-dropdown
input(id="list-name",type=text,placeholder="{{_'r-name'}}") input(id="list-name",type=text,placeholder="{{_'r-name'}}")
div.trigger-text div.trigger-text
| {{_'r-in-swimlane'}} | {{_'r-in-swimlane'}}
div.trigger-dropdown div.trigger-dropdown
input(id="swimlane-name2",type=text,placeholder="{{_'r-name'}}") input(id="swimlane-name2",type=text,placeholder="{{_'r-name'}}")
@ -65,8 +78,8 @@ template(name="boardActions")
i.fa.fa-plus i.fa.fa-plus

View file

@ -1,6 +1,22 @@
BlazeComponent.extendComponent({ BlazeComponent.extendComponent({
onCreated() {}, onCreated() {},
boards() {
const boards = Boards.find(
{
archived: false,
'members.userId': Meteor.userId(),
_id: {
$ne: Meteor.user().getTemplatesBoardId(),
},
},
{
sort: ['title'],
},
);
return boards;
},
events() { events() {
return [ return [
{ {
@ -52,15 +68,18 @@ BlazeComponent.extendComponent({
const ruleName = this.data().ruleName.get(); const ruleName = this.data().ruleName.get();
const trigger = this.data().triggerVar.get(); const trigger = this.data().triggerVar.get();
const actionSelected = this.find('#move-spec-action').value; const actionSelected = this.find('#move-spec-action').value;
const listTitle = this.find('#listName').value; const swimlaneName = this.find('#swimlaneName').value;
const listName = this.find('#listName').value;
const boardId = Session.get('currentBoard'); const boardId = Session.get('currentBoard');
const destBoardId = this.find('#board-id').value;
const desc = Utils.getTriggerActionDesc(event, this); const desc = Utils.getTriggerActionDesc(event, this);
if (actionSelected === 'top') { if (actionSelected === 'top') {
const triggerId = Triggers.insert(trigger); const triggerId = Triggers.insert(trigger);
const actionId = Actions.insert({ const actionId = Actions.insert({
actionType: 'moveCardToTop', actionType: 'moveCardToTop',
listTitle, listName,
boardId, swimlaneName,
boardId: destBoardId,
desc, desc,
}); });
Rules.insert({ Rules.insert({
@ -74,8 +93,9 @@ BlazeComponent.extendComponent({
const triggerId = Triggers.insert(trigger); const triggerId = Triggers.insert(trigger);
const actionId = Actions.insert({ const actionId = Actions.insert({
actionType: 'moveCardToBottom', actionType: 'moveCardToBottom',
listTitle, listName,
boardId, swimlaneName,
boardId: destBoardId,
desc, desc,
}); });
Rules.insert({ Rules.insert({

View file

@ -42,35 +42,65 @@ RulesHelper = {
performAction(activity, action) { performAction(activity, action) {
const card = Cards.findOne({ _id: activity.cardId }); const card = Cards.findOne({ _id: activity.cardId });
const boardId = activity.boardId; const boardId = activity.boardId;
if (action.actionType === 'moveCardToTop') { if (
let listId; action.actionType === 'moveCardToTop' ||
action.actionType === 'moveCardToBottom'
) {
let list; let list;
if (action.listTitle === '*') { let listId;
listId = card.listId; if (action.listName === '*') {
list = card.list(); list = card.list();
if (boardId !== action.boardId) {
list = Lists.findOne({ title: list.title, boardId: action.boardId });
}
} else {
list = Lists.findOne({
title: action.listName,
boardId: action.boardId,
});
}
if (list === undefined) {
listId = '';
} else { } else {
list = Lists.findOne({ title: action.listTitle, boardId });
listId = list._id; listId = list._id;
} }
const minOrder = _.min(
list.cardsUnfiltered(card.swimlaneId).map(c => c.sort), let swimlane;
); let swimlaneId;
card.move(boardId, card.swimlaneId, listId, minOrder - 1); if (action.swimlaneName === '*') {
} swimlane = Swimlanes.findOne(card.swimlaneId);
if (action.actionType === 'moveCardToBottom') { if (boardId !== action.boardId) {
let listId; swimlane = Swimlanes.findOne({
let list; title: swimlane.title,
if (action.listTitle === '*') { boardId: action.boardId,
listId = card.listId; });
list = card.list(); }
} else { } else {
list = Lists.findOne({ title: action.listTitle, boardId }); swimlane = Swimlanes.findOne({
listId = list._id; title: action.swimlaneName,
boardId: action.boardId,
});
}
if (swimlane === undefined) {
swimlaneId = Swimlanes.findOne({
title: 'Default',
boardId: action.boardId,
})._id;
} else {
swimlaneId = swimlane._id;
}
if (action.actionType === 'moveCardToTop') {
const minOrder = _.min(
list.cardsUnfiltered(swimlaneId).map(c => c.sort),
);
card.move(action.boardId, swimlaneId, listId, minOrder - 1);
} else {
const maxOrder = _.max(
list.cardsUnfiltered(swimlaneId).map(c => c.sort),
);
card.move(action.boardId, swimlaneId, listId, maxOrder + 1);
} }
const maxOrder = _.max(
list.cardsUnfiltered(card.swimlaneId).map(c => c.sort),
);
card.move(boardId, card.swimlaneId, listId, maxOrder + 1);
} }
if (action.actionType === 'sendEmail') { if (action.actionType === 'sendEmail') {
const to = action.emailTo; const to = action.emailTo;