Board level settings for subtasks

This commit is contained in:
Nicu Tofan 2018-06-25 23:12:20 +03:00
parent c9f70cf382
commit 94a52080cf
No known key found for this signature in database
GPG key ID: 7EE66E95E64FD0B7
8 changed files with 140 additions and 4 deletions

View file

@ -130,6 +130,10 @@ template(name="boardMenuPopup")
li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}} li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}}
li: a.js-archive-board {{_ 'archive-board'}} li: a.js-archive-board {{_ 'archive-board'}}
li: a.js-outgoing-webhooks {{_ 'outgoing-webhooks'}} li: a.js-outgoing-webhooks {{_ 'outgoing-webhooks'}}
hr
ul.pop-over-list
li: a.js-subtask-settings {{_ 'subtask-settings'}}
if isSandstorm if isSandstorm
hr hr
ul.pop-over-list ul.pop-over-list
@ -193,6 +197,33 @@ template(name="boardChangeColorPopup")
if isSelected if isSelected
i.fa.fa-check i.fa.fa-check
template(name="boardSubtaskSettingsPopup")
form.board-subtask-settings
a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}")
.materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}")
span {{_ 'show-subtasks-field'}}
label
| {{_ 'deposit-subtasks-board'}}
select.js-field-deposit-board(disabled="{{#unless allowsSubtasks}}disabled{{/unless}}")
each boards
if isBoardSelected
option(value=_id selected="selected") {{title}}
else
option(value=_id) {{title}}
if isNullBoardSelected
option(value='null' selected="selected") {{_ 'custom-field-dropdown-none'}}
else
option(value='null') {{_ 'custom-field-dropdown-none'}}
hr
label
| {{_ 'deposit-subtasks-list'}}
select.js-field-deposit-list(disabled="{{#unless hasLists}}disabled{{/unless}}")
each lists
if isListSelected
option(value=_id selected="selected") {{title}}
else
option(value=_id) {{title}}
template(name="createBoard") template(name="createBoard")
form form
label label

View file

@ -25,6 +25,7 @@ Template.boardMenuPopup.events({
}), }),
'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'), 'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'),
'click .js-import-board': Popup.open('chooseBoardSource'), 'click .js-import-board': Popup.open('chooseBoardSource'),
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
}); });
Template.boardMenuPopup.helpers({ Template.boardMenuPopup.helpers({
@ -151,6 +152,75 @@ BlazeComponent.extendComponent({
}, },
}).register('boardChangeColorPopup'); }).register('boardChangeColorPopup');
BlazeComponent.extendComponent({
onCreated() {
this.currentBoard = Boards.findOne(Session.get('currentBoard'));
},
allowsSubtasks() {
return this.currentBoard.allowsSubtasks;
},
isBoardSelected() {
return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id;
},
isNullBoardSelected() {
return (this.currentBoard.subtasksDefaultBoardId === null) || (this.currentBoard.subtasksDefaultBoardId === undefined);
},
boards() {
return Boards.find({
archived: false,
'members.userId': Meteor.userId(),
}, {
sort: ['title'],
});
},
lists() {
return Lists.find({
boardId: this.currentBoard._id,
archived: false,
}, {
sort: ['title'],
});
},
hasLists() {
return this.lists().count() > 0;
},
isListSelected() {
return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id;
},
events() {
return [{
'click .js-field-has-subtasks'(evt) {
evt.preventDefault();
this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks;
this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks);
$('.js-field-has-subtasks .materialCheckBox').toggleClass('is-checked', this.currentBoard.allowsSubtasks);
$('.js-field-has-subtasks').toggleClass('is-checked', this.currentBoard.allowsSubtasks);
$('.js-field-deposit-board').prop('disabled', !this.currentBoard.allowsSubtasks);
},
'change .js-field-deposit-board'(evt) {
let value = evt.target.value;
if (value === 'null') {
value = null;
}
this.currentBoard.setSubtasksDefaultBoardId(value);
evt.preventDefault();
},
'change .js-field-deposit-list'(evt) {
this.currentBoard.setSubtasksDefaultListId(evt.target.value);
evt.preventDefault();
},
}];
},
}).register('boardSubtaskSettingsPopup');
const CreateBoard = BlazeComponent.extendComponent({ const CreateBoard = BlazeComponent.extendComponent({
template() { template() {
return 'createBoard'; return 'createBoard';

View file

@ -144,6 +144,7 @@ template(name="cardDetails")
hr hr
+checklists(cardId = _id) +checklists(cardId = _id)
if currentBoard.allowsSubtasks
hr hr
+subtasks(cardId = _id) +subtasks(cardId = _id)

View file

@ -30,6 +30,7 @@ BlazeComponent.extendComponent({
sort: sortIndex, sort: sortIndex,
swimlaneId, swimlaneId,
}); });
// In case the filter is active we need to add the newly inserted card in // 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 // the list of exceptions -- cards that are not filtered. Otherwise the
// card will disappear instantly. // card will disappear instantly.

View file

@ -482,5 +482,10 @@
"delete-board": "Delete Board", "delete-board": "Delete Board",
"default-subtasks-board": "Subtasks for __board__ board", "default-subtasks-board": "Subtasks for __board__ board",
"default": "Default", "default": "Default",
"queue": "Queue" "queue": "Queue",
"subtask-settings": "Subtasks Settings",
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
"show-subtasks-field": "Cards can have subtasks:",
"deposit-subtasks-board": "Deposit subtasks to this board:",
"deposit-subtasks-list": "Landing list for subtasks deposited here:"
} }

View file

@ -161,6 +161,10 @@ Boards.attachSchema(new SimpleSchema({
optional: true, optional: true,
defaultValue: null, defaultValue: null,
}, },
allowsSubtasks: {
type: Boolean,
defaultValue: true,
},
})); }));
@ -473,6 +477,18 @@ Boards.mutations({
}, },
}; };
}, },
setAllowsSubtasks(allowsSubtasks) {
return { $set: { allowsSubtasks } };
},
setSubtasksDefaultBoardId(subtasksDefaultBoardId) {
return { $set: { subtasksDefaultBoardId } };
},
setSubtasksDefaultListId(subtasksDefaultListId) {
return { $set: { subtasksDefaultListId } };
},
}); });
if (Meteor.isServer) { if (Meteor.isServer) {

View file

@ -258,7 +258,7 @@ Cards.helpers({
return finishCount > 0 && this.subtasksCount() === finishCount; return finishCount > 0 && this.subtasksCount() === finishCount;
}, },
hasSubtasks() { allowsSubtasks() {
return this.subtasksCount() !== 0; return this.subtasksCount() !== 0;
}, },

View file

@ -287,3 +287,15 @@ Migrations.add('add-subtasks-sort', () => {
}, noValidateMulti); }, noValidateMulti);
}); });
Migrations.add('add-subtasks-allowed', () => {
Boards.update({
allowsSubtasks: {
$exists: false,
},
}, {
$set: {
allowsSubtasks: -1,
},
}, noValidateMulti);
});