mirror of
https://github.com/wekan/wekan.git
synced 2025-12-16 23:40:13 +01:00
Board level settings for subtasks
This commit is contained in:
parent
c9f70cf382
commit
94a52080cf
8 changed files with 140 additions and 4 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -144,8 +144,9 @@ template(name="cardDetails")
|
||||||
hr
|
hr
|
||||||
+checklists(cardId = _id)
|
+checklists(cardId = _id)
|
||||||
|
|
||||||
hr
|
if currentBoard.allowsSubtasks
|
||||||
+subtasks(cardId = _id)
|
hr
|
||||||
|
+subtasks(cardId = _id)
|
||||||
|
|
||||||
hr
|
hr
|
||||||
h3
|
h3
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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:"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue