Can add cards as subtasks

This commit is contained in:
Nicu Tofan 2018-06-23 23:22:38 +03:00
parent adb7f5b2ca
commit 5a023e4315
No known key found for this signature in database
GPG key ID: 7EE66E95E64FD0B7
4 changed files with 92 additions and 5 deletions

View file

@ -12,13 +12,31 @@ BlazeComponent.extendComponent({
const title = textarea.value.trim();
const cardId = this.currentData().cardId;
const card = Cards.findOne(cardId);
const sortIndex = -1;
const crtBoard = Boards.findOne(card.boardId);
const targetBoard = crtBoard.getDefaultSubtasksBoard();
const listId = targetBoard.getDefaultSubtasksListId();
const swimlaneId = Swimlanes.findOne({boardId: targetBoard._id})._id;
if (title) {
Subtasks.insert({
cardId,
const _id = Cards.insert({
title,
sort: card.subtasks().count(),
parentId: cardId,
members: [],
labelIds: [],
customFields: [],
listId,
boardId: targetBoard._id,
sort: sortIndex,
swimlaneId,
});
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
// card will disappear instantly.
// See https://github.com/wekan/wekan/issues/80
Filter.addException(_id);
setTimeout(() => {
this.$('.add-subtask-item').last().click();
}, 100);
@ -34,7 +52,7 @@ BlazeComponent.extendComponent({
deleteSubtask() {
const subtask = this.currentData().subtask;
if (subtask && subtask._id) {
Subtasks.remove(subtask._id);
Cards.remove(subtask._id);
this.toggleDeleteDialog.set(false);
}
},

View file

@ -479,5 +479,7 @@
"board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
"delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
"boardDeletePopup-title": "Delete Board?",
"delete-board": "Delete Board"
"delete-board": "Delete Board",
"default-subtasks-board": "Subtasks for __board__ board",
"default": "Default"
}

View file

@ -151,6 +151,16 @@ Boards.attachSchema(new SimpleSchema({
type: String,
optional: true,
},
subtasksDefaultBoardId: {
type: String,
optional: true,
defaultValue: null,
},
subtasksDefaultListId: {
type: String,
optional: true,
defaultValue: null,
},
}));
@ -284,8 +294,52 @@ Boards.helpers({
return Cards.find(query, projection);
},
// A board alwasy has another board where it deposits subtasks of thasks
// that belong to itself.
getDefaultSubtasksBoardId() {
if (this.subtasksDefaultBoardId === null) {
this.subtasksDefaultBoardId = Boards.insert({
title: `^${this.title}^`,
permission: this.permission,
members: this.members,
color: this.color,
description: TAPi18n.__('default-subtasks-board', {board: this.title}),
});
Swimlanes.insert({
title: TAPi18n.__('default'),
boardId: this.subtasksDefaultBoardId,
});
Boards.update(this._id, {$set: {
subtasksDefaultBoardId: this.subtasksDefaultBoardId,
}});
}
return this.subtasksDefaultBoardId;
},
getDefaultSubtasksBoard() {
return Boards.findOne(this.getDefaultSubtasksBoardId());
},
getDefaultSubtasksListId() {
if (this.subtasksDefaultListId === null) {
this.subtasksDefaultListId = Lists.insert({
title: TAPi18n.__('new'),
boardId: this._id,
});
Boards.update(this._id, {$set: {
subtasksDefaultListId: this.subtasksDefaultListId,
}});
}
return this.subtasksDefaultListId;
},
getDefaultSubtasksList() {
return Lists.findOne(this.getDefaultSubtasksListId());
},
});
Boards.mutations({
archive() {
return { $set: { archived: true } };

View file

@ -269,3 +269,16 @@ Migrations.add('add-parent-field-to-cards', () => {
},
}, noValidateMulti);
});
Migrations.add('add-subtasks-boards', () => {
Boards.update({
subtasksDefaultBoardId: {
$exists: false,
},
}, {
$set: {
subtasksDefaultBoardId: null,
subtasksDefaultListId: null,
},
}, noValidateMulti);
});