mirror of
https://github.com/wekan/wekan.git
synced 2025-09-22 01:50:48 +02:00
Merge branch 'dollybean' of https://github.com/2020product/wekan into 2020product-dollybean
This commit is contained in:
commit
65fa2f626f
17 changed files with 1063 additions and 146 deletions
|
@ -21,7 +21,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \
|
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \
|
||||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
|
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
|
||||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
|
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
|
||||||
RICHER_CARD_COMMENT_EDITOR=true \
|
RICHER_CARD_COMMENT_EDITOR=false \
|
||||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||||
ATTACHMENTS_STORE_PATH="" \
|
ATTACHMENTS_STORE_PATH="" \
|
||||||
MAX_IMAGE_PIXEL="" \
|
MAX_IMAGE_PIXEL="" \
|
||||||
|
|
|
@ -30,6 +30,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'),
|
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
|
||||||
|
'click .js-card-settings': Popup.open('boardCardSettings')
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.boardMenuPopup.helpers({
|
Template.boardMenuPopup.helpers({
|
||||||
|
|
|
@ -8,10 +8,13 @@ template(name="cardDetails")
|
||||||
a.fa.fa-times-thin.close-card-details.js-close-card-details
|
a.fa.fa-times-thin.close-card-details.js-close-card-details
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
|
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
|
||||||
|
input.inline-input(type="hidden" id="cardURL_copy" value="{{ absoluteUrl }}")
|
||||||
|
a.fa.fa-link.card-copy-button.js-copy-link
|
||||||
if isMiniScreen
|
if isMiniScreen
|
||||||
a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
|
a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
|
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
|
||||||
|
a.fa.fa-link.card-copy-mobile-button
|
||||||
h2.card-details-title.js-card-title(
|
h2.card-details-title.js-card-title(
|
||||||
class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
|
class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
|
||||||
+viewer
|
+viewer
|
||||||
|
@ -36,92 +39,103 @@ template(name="cardDetails")
|
||||||
p.warning {{_ 'card-archived'}}
|
p.warning {{_ 'card-archived'}}
|
||||||
|
|
||||||
.card-details-items
|
.card-details-items
|
||||||
.card-details-item.card-details-item-received
|
if currentBoard.allowsReceivedDate
|
||||||
h3
|
.card-details-item.card-details-item-received
|
||||||
i.fa.fa-sign-out
|
h3
|
||||||
card-details-item-title {{_ 'card-received'}}
|
i.fa.fa-sign-out
|
||||||
if getReceived
|
card-details-item-title {{_ 'card-received'}}
|
||||||
+cardReceivedDate
|
if getReceived
|
||||||
else
|
+cardReceivedDate
|
||||||
if canModifyCard
|
else
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
a.js-received-date {{_ 'add'}}
|
unless currentUser.isWorker
|
||||||
|
a.card-label.add-label.js-received-date
|
||||||
|
i.fa.fa-plus
|
||||||
|
|
||||||
.card-details-item.card-details-item-start
|
if currentBoard.allowsStartDate
|
||||||
h3
|
.card-details-item.card-details-item-start
|
||||||
i.fa.fa-hourglass-start
|
h3
|
||||||
card-details-item-title {{_ 'card-start'}}
|
i.fa.fa-hourglass-start
|
||||||
if getStart
|
card-details-item-title {{_ 'card-start'}}
|
||||||
+cardStartDate
|
if getStart
|
||||||
else
|
+cardStartDate
|
||||||
if canModifyCard
|
else
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
a.js-start-date {{_ 'add'}}
|
unless currentUser.isWorker
|
||||||
|
a.card-label.add-label.js-start-date
|
||||||
|
i.fa.fa-plus
|
||||||
|
|
||||||
.card-details-item.card-details-item-due
|
if currentBoard.allowsDueDate
|
||||||
h3
|
.card-details-item.card-details-item-due
|
||||||
i.fa.fa-sign-in
|
h3
|
||||||
card-details-item-title {{_ 'card-due'}}
|
i.fa.fa-sign-in
|
||||||
if getDue
|
card-details-item-title {{_ 'card-due'}}
|
||||||
+cardDueDate
|
if getDue
|
||||||
else
|
+cardDueDate
|
||||||
if canModifyCard
|
else
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
a.js-due-date {{_ 'add'}}
|
unless currentUser.isWorker
|
||||||
|
a.card-label.add-label.js-due-date
|
||||||
|
i.fa.fa-plus
|
||||||
|
|
||||||
.card-details-item.card-details-item-end
|
if currentBoard.allowsEndDate
|
||||||
h3
|
.card-details-item.card-details-item-end
|
||||||
i.fa.fa-hourglass-end
|
h3
|
||||||
card-details-item-title {{_ 'card-end'}}
|
i.fa.fa-hourglass-end
|
||||||
if getEnd
|
card-details-item-title {{_ 'card-end'}}
|
||||||
+cardEndDate
|
if getEnd
|
||||||
else
|
+cardEndDate
|
||||||
if canModifyCard
|
else
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
a.js-end-date {{_ 'add'}}
|
unless currentUser.isWorker
|
||||||
|
a.card-label.add-label.js-end-date
|
||||||
|
i.fa.fa-plus
|
||||||
|
|
||||||
.card-details-items
|
.card-details-items
|
||||||
.card-details-item.card-details-item-members
|
if currentBoard.allowsMembers
|
||||||
h3
|
.card-details-item.card-details-item-members
|
||||||
i.fa.fa-users
|
h3
|
||||||
card-details-item-title {{_ 'members'}}
|
i.fa.fa-users
|
||||||
each getMembers
|
card-details-item-title {{_ 'members'}}
|
||||||
+userAvatar(userId=this cardId=../_id)
|
each getMembers
|
||||||
| {{! XXX Hack to hide syntaxic coloration /// }}
|
+userAvatar(userId=this cardId=../_id)
|
||||||
if canModifyCard
|
| {{! XXX Hack to hide syntaxic coloration /// }}
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
|
unless currentUser.isWorker
|
||||||
i.fa.fa-plus
|
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
|
||||||
|
i.fa.fa-plus
|
||||||
|
|
||||||
.card-details-item.card-details-item-assignees
|
//if assigneeSelected
|
||||||
h3
|
if currentBoard.allowsAssignee
|
||||||
i.fa.fa-user
|
.card-details-item.card-details-item-assignees
|
||||||
card-details-item-title {{_ 'assignee'}}
|
h3
|
||||||
each getAssignees
|
i.fa.fa-user
|
||||||
+userAvatarAssignee(userId=this cardId=../_id)
|
card-details-item-title {{_ 'assignee'}}
|
||||||
| {{! XXX Hack to hide syntaxic coloration /// }}
|
each getAssignees
|
||||||
if canModifyCard
|
+userAvatarAssignee(userId=this cardId=../_id)
|
||||||
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
|
| {{! XXX Hack to hide syntaxic coloration /// }}
|
||||||
i.fa.fa-plus
|
if canModifyCard
|
||||||
if currentUser.isWorker
|
|
||||||
unless assigneeSelected
|
|
||||||
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
|
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
|
||||||
i.fa.fa-plus
|
i.fa.fa-plus
|
||||||
|
if currentUser.isWorker
|
||||||
|
unless assigneeSelected
|
||||||
|
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
|
||||||
|
i.fa.fa-plus
|
||||||
|
|
||||||
|
if currentBoard.allowsLabels
|
||||||
.card-details-item.card-details-item-labels
|
.card-details-item.card-details-item-labels
|
||||||
h3
|
h3
|
||||||
i.fa.fa-tags
|
i.fa.fa-tags
|
||||||
card-details-item-title {{_ 'labels'}}
|
card-details-item-title {{_ 'labels'}}
|
||||||
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
|
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
|
||||||
each labels
|
each labels
|
||||||
span.card-label(class="card-label-{{color}}" title=name)
|
span.card-label(class="card-label-{{color}}" title=name)
|
||||||
+viewer
|
+viewer
|
||||||
= name
|
= name
|
||||||
if canModifyCard
|
if canModifyCard
|
||||||
unless currentUser.isWorker
|
unless currentUser.isWorker
|
||||||
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
|
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
|
||||||
i.fa.fa-plus
|
i.fa.fa-plus
|
||||||
|
|
||||||
.card-details-items
|
.card-details-items
|
||||||
each customFieldsWD
|
each customFieldsWD
|
||||||
|
@ -143,9 +157,9 @@ template(name="cardDetails")
|
||||||
//- XXX We should use "editable" to avoid repetiting ourselves
|
//- XXX We should use "editable" to avoid repetiting ourselves
|
||||||
if canModifyCard
|
if canModifyCard
|
||||||
unless currentUser.isWorker
|
unless currentUser.isWorker
|
||||||
h3
|
//h3
|
||||||
i.fa.fa-align-left
|
// i.fa.fa-align-left
|
||||||
card-details-item-title {{_ 'description'}}
|
// card-details-item-title {{_ 'description'}}
|
||||||
+inlinedCardDescription(classNames="card-description js-card-description")
|
+inlinedCardDescription(classNames="card-description js-card-description")
|
||||||
+editor(autofocus=true)
|
+editor(autofocus=true)
|
||||||
| {{getUnsavedValue 'cardDescription' _id getDescription}}
|
| {{getUnsavedValue 'cardDescription' _id getDescription}}
|
||||||
|
@ -153,16 +167,16 @@ template(name="cardDetails")
|
||||||
button.primary(type="submit") {{_ 'save'}}
|
button.primary(type="submit") {{_ 'save'}}
|
||||||
a.fa.fa-times-thin.js-close-inlined-form
|
a.fa.fa-times-thin.js-close-inlined-form
|
||||||
else
|
else
|
||||||
a.js-open-inlined-form
|
a.description-item.add-description.js-open-inlined-form
|
||||||
if getDescription
|
if getDescription
|
||||||
+viewer
|
+viewer
|
||||||
= getDescription
|
= getDescription
|
||||||
else
|
else
|
||||||
| {{_ 'edit'}}
|
| {{_ 'addmore-detail'}}
|
||||||
if (hasUnsavedValue 'cardDescription' _id)
|
if (hasUnsavedValue 'cardDescription' _id)
|
||||||
p.quiet
|
p.quiet
|
||||||
| {{_ 'unsaved-description'}}
|
| {{_ 'unsaved-description'}}
|
||||||
a.js-open-inlined-form {{_ 'view-it'}}
|
a.description-item.add-description.js-open-inlined-form {{_ 'view-it'}}
|
||||||
= ' - '
|
= ' - '
|
||||||
a.js-close-inlined-form {{_ 'discard'}}
|
a.js-close-inlined-form {{_ 'discard'}}
|
||||||
else if getDescription
|
else if getDescription
|
||||||
|
@ -171,57 +185,60 @@ template(name="cardDetails")
|
||||||
= getDescription
|
= getDescription
|
||||||
|
|
||||||
.card-details-items
|
.card-details-items
|
||||||
.card-details-item.card-details-item-name
|
if currentBoard.allowsRequestedBy
|
||||||
h3
|
.card-details-item.card-details-item-name
|
||||||
i.fa.fa-shopping-cart
|
h3
|
||||||
card-details-item-title {{_ 'requested-by'}}
|
i.fa.fa-shopping-cart
|
||||||
if canModifyCard
|
card-details-item-title {{_ 'requested-by'}}
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
+inlinedForm(classNames="js-card-details-requester")
|
unless currentUser.isWorker
|
||||||
+editCardRequesterForm
|
+inlinedForm(classNames="js-card-details-requester")
|
||||||
else
|
+editCardRequesterForm
|
||||||
a.js-open-inlined-form
|
else
|
||||||
if getRequestedBy
|
a.js-open-inlined-form
|
||||||
+viewer
|
if getRequestedBy
|
||||||
= getRequestedBy
|
+viewer
|
||||||
else
|
= getRequestedBy
|
||||||
| {{_ 'add'}}
|
else
|
||||||
else if getRequestedBy
|
| {{_ 'add'}}
|
||||||
+viewer
|
else if getRequestedBy
|
||||||
= getRequestedBy
|
+viewer
|
||||||
|
= getRequestedBy
|
||||||
|
|
||||||
.card-details-item.card-details-item-name
|
if currentBoard.allowsAssignedBy
|
||||||
h3
|
.card-details-item.card-details-item-name
|
||||||
i.fa.fa-user-plus
|
h3
|
||||||
card-details-item-title {{_ 'assigned-by'}}
|
i.fa.fa-user-plus
|
||||||
if canModifyCard
|
card-details-item-title {{_ 'assigned-by'}}
|
||||||
unless currentUser.isWorker
|
if canModifyCard
|
||||||
+inlinedForm(classNames="js-card-details-assigner")
|
unless currentUser.isWorker
|
||||||
+editCardAssignerForm
|
+inlinedForm(classNames="js-card-details-assigner")
|
||||||
else
|
+editCardAssignerForm
|
||||||
a.js-open-inlined-form
|
else
|
||||||
if getAssignedBy
|
a.js-open-inlined-form
|
||||||
+viewer
|
if getAssignedBy
|
||||||
= getAssignedBy
|
+viewer
|
||||||
else
|
= getAssignedBy
|
||||||
| {{_ 'add'}}
|
else
|
||||||
else if getRequestedBy
|
| {{_ 'add'}}
|
||||||
+viewer
|
else if getRequestedBy
|
||||||
= getAssignedBy
|
+viewer
|
||||||
|
= getAssignedBy
|
||||||
|
|
||||||
hr
|
.card-checklist-attachmentGalerys
|
||||||
+checklists(cardId = _id)
|
.card-checklist-attachmentGalery.card-checklists
|
||||||
|
if currentBoard.allowsChecklists
|
||||||
if currentBoard.allowsSubtasks
|
+checklists(cardId = _id)
|
||||||
hr
|
if currentBoard.allowsSubtasks
|
||||||
+subtasks(cardId = _id)
|
hr
|
||||||
|
+subtasks(cardId = _id)
|
||||||
hr
|
if currentBoard.allowsAttachments
|
||||||
h3
|
//- hr
|
||||||
i.fa.fa-paperclip
|
//- h3
|
||||||
| {{_ 'attachments'}}
|
//- i.fa.fa-paperclip
|
||||||
|
//- | {{_ 'attachments'}}
|
||||||
+attachmentsGalery
|
.card-checklist-attachmentGalery.card-attachmentGalery
|
||||||
|
+attachmentsGalery
|
||||||
|
|
||||||
hr
|
hr
|
||||||
unless currentUser.isNoComments
|
unless currentUser.isNoComments
|
||||||
|
@ -237,9 +254,16 @@ template(name="cardDetails")
|
||||||
else
|
else
|
||||||
input.toggle-switch(type="checkbox" id="toggleButton")
|
input.toggle-switch(type="checkbox" id="toggleButton")
|
||||||
label.toggle-label(for="toggleButton")
|
label.toggle-label(for="toggleButton")
|
||||||
if currentUser.isBoardMember
|
if currentBoard.allowsComments
|
||||||
unless currentUser.isNoComments
|
if currentUser.isBoardMember
|
||||||
+commentForm
|
unless currentUser.isNoComments
|
||||||
|
if canModifyCard
|
||||||
|
+inlinedForm(autoclose=false classNames="js-new-comment-form")
|
||||||
|
+commentForm
|
||||||
|
else
|
||||||
|
+userAvatar(userId=currentUser._id)
|
||||||
|
a.comment-item.add-comment.js-open-inlined-form
|
||||||
|
| {{_ 'Write Comment'}}
|
||||||
unless currentUser.isNoComments
|
unless currentUser.isNoComments
|
||||||
if isLoaded.get
|
if isLoaded.get
|
||||||
if isLinkedCard
|
if isLinkedCard
|
||||||
|
|
|
@ -279,6 +279,29 @@ BlazeComponent.extendComponent({
|
||||||
'click .js-close-card-details'() {
|
'click .js-close-card-details'() {
|
||||||
Utils.goBoardId(this.data().boardId);
|
Utils.goBoardId(this.data().boardId);
|
||||||
},
|
},
|
||||||
|
'click .js-copy-link'() {
|
||||||
|
StringToCopyElement = document.getElementById('cardURL_copy');
|
||||||
|
StringToCopyElement.select();
|
||||||
|
if (document.execCommand('copy')) {
|
||||||
|
StringToCopyElement.blur();
|
||||||
|
} else {
|
||||||
|
document.getElementById('cardURL_copy').selectionStart = 0;
|
||||||
|
document.getElementById('cardURL_copy').selectionEnd = 999;
|
||||||
|
document.execCommand('copy');
|
||||||
|
if (window.getSelection) {
|
||||||
|
if (window.getSelection().empty) {
|
||||||
|
// Chrome
|
||||||
|
window.getSelection().empty();
|
||||||
|
} else if (window.getSelection().removeAllRanges) {
|
||||||
|
// Firefox
|
||||||
|
window.getSelection().removeAllRanges();
|
||||||
|
}
|
||||||
|
} else if (document.selection) {
|
||||||
|
// IE?
|
||||||
|
document.selection.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
'click .js-open-card-details-menu': Popup.open('cardDetailsActions'),
|
'click .js-open-card-details-menu': Popup.open('cardDetailsActions'),
|
||||||
'submit .js-card-description'(event) {
|
'submit .js-card-description'(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
@ -371,6 +394,54 @@ Template.cardDetails.helpers({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
receivedSelected() {
|
||||||
|
if (this.getReceived().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
startSelected() {
|
||||||
|
if (this.getStart().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
endSelected() {
|
||||||
|
if (this.getEnd().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
dueSelected() {
|
||||||
|
if (this.getDue().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
memberSelected() {
|
||||||
|
if (this.getMembers().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
labelSelected() {
|
||||||
|
if (this.getLabels().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
assigneeSelected() {
|
assigneeSelected() {
|
||||||
if (this.getAssignees().length === 0) {
|
if (this.getAssignees().length === 0) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -379,6 +450,22 @@ Template.cardDetails.helpers({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
requestBySelected() {
|
||||||
|
if (this.getRequestBy().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
assigneeBySelected() {
|
||||||
|
if (this.getAssigneeBy().length === 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
memberType() {
|
memberType() {
|
||||||
const user = Users.findOne(this.userId);
|
const user = Users.findOne(this.userId);
|
||||||
return user && user.isBoardAdmin() ? 'admin' : 'normal';
|
return user && user.isBoardAdmin() ? 'admin' : 'normal';
|
||||||
|
|
|
@ -108,6 +108,8 @@ avatar-radius = 50%
|
||||||
|
|
||||||
.close-card-details,
|
.close-card-details,
|
||||||
.card-details-menu,
|
.card-details-menu,
|
||||||
|
.card-copy-button,
|
||||||
|
.card-copy-mobile-button,
|
||||||
.close-card-details-mobile-web,
|
.close-card-details-mobile-web,
|
||||||
.card-details-menu-mobile-web
|
.card-details-menu-mobile-web
|
||||||
float: right
|
float: right
|
||||||
|
@ -122,6 +124,16 @@ avatar-radius = 50%
|
||||||
padding: 5px
|
padding: 5px
|
||||||
margin-right: 40px
|
margin-right: 40px
|
||||||
|
|
||||||
|
.card-copy-button
|
||||||
|
font-size: 17px
|
||||||
|
padding: 10px
|
||||||
|
margin-right: 10px
|
||||||
|
|
||||||
|
.card-copy-mobile-button
|
||||||
|
font-size: 17px
|
||||||
|
padding: 10px
|
||||||
|
margin-right: 10px
|
||||||
|
|
||||||
.card-details-menu
|
.card-details-menu
|
||||||
font-size: 17px
|
font-size: 17px
|
||||||
padding: 10px
|
padding: 10px
|
||||||
|
|
|
@ -72,6 +72,88 @@ template(name="boardChangeColorPopup")
|
||||||
if isSelected
|
if isSelected
|
||||||
i.fa.fa-check
|
i.fa.fa-check
|
||||||
|
|
||||||
|
template(name="boardCardSettingsPopup")
|
||||||
|
form.board-card-settings
|
||||||
|
h3 {{_ 'show-on-card'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-receiveddate(class="{{#if allowsReceivedDate}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsReceivedDate}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-sign-out
|
||||||
|
| {{_ 'card-received'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-startdate(class="{{#if allowsStartDate}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsStartDate}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-hourglass-start
|
||||||
|
| {{_ 'card-start'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-duedate(class="{{#if allowsDueDate}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsDueDate}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-sign-in
|
||||||
|
| {{_ 'card-due'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-enddate(class="{{#if allowsEndDate}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsEndDate}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-hourglass-end
|
||||||
|
| {{_ 'card-end'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-members(class="{{#if allowsMembers}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsMembers}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-users
|
||||||
|
| {{_ 'members'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-assignee(class="{{#if allowsAssignee}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsAssignee}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-user
|
||||||
|
| {{_ 'assignee'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-assigned-by(class="{{#if allowsAssignedBy}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsAssignedBy}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-shopping-cart
|
||||||
|
| {{_ 'assigned-by'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-requested-by(class="{{#if allowsRequestedBy}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsRequestedBy}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-user-plus
|
||||||
|
| {{_ 'requested-by'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-labels(class="{{#if allowsLabels}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsLabels}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-tags
|
||||||
|
| {{_ 'labels'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-checklists(class="{{#if allowsChecklists}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsChecklists}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-check
|
||||||
|
| {{_ 'checklists'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-sitemap
|
||||||
|
| {{_ 'subtasks'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-attachments(class="{{#if allowsAttachments}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsAttachments}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-paperclip
|
||||||
|
| {{_ 'attachments'}}
|
||||||
|
div.check-div
|
||||||
|
a.flex.js-field-has-comments(class="{{#if allowsComments}}is-checked{{/if}}")
|
||||||
|
.materialCheckBox(class="{{#if allowsComments}}is-checked{{/if}}")
|
||||||
|
span
|
||||||
|
i.fa.fa-comment-o
|
||||||
|
| {{_ 'comment'}}
|
||||||
|
|
||||||
template(name="boardSubtaskSettingsPopup")
|
template(name="boardSubtaskSettingsPopup")
|
||||||
form.board-subtask-settings
|
form.board-subtask-settings
|
||||||
h3 {{_ 'show-parent-in-minicard'}}
|
h3 {{_ 'show-parent-in-minicard'}}
|
||||||
|
@ -197,6 +279,10 @@ template(name="boardMenuPopup")
|
||||||
a.js-outgoing-webhooks
|
a.js-outgoing-webhooks
|
||||||
i.fa.fa-globe
|
i.fa.fa-globe
|
||||||
| {{_ 'outgoing-webhooks'}}
|
| {{_ 'outgoing-webhooks'}}
|
||||||
|
li
|
||||||
|
a.js-card-settings
|
||||||
|
i.fa.fa-id-card-o
|
||||||
|
| {{_ 'card-settings'}}
|
||||||
li
|
li
|
||||||
a.js-subtask-settings
|
a.js-subtask-settings
|
||||||
i.fa.fa-sitemap
|
i.fa.fa-sitemap
|
||||||
|
@ -238,6 +324,12 @@ template(name="boardMenuPopup")
|
||||||
a.js-subtask-settings
|
a.js-subtask-settings
|
||||||
i.fa.fa-sitemap
|
i.fa.fa-sitemap
|
||||||
| {{_ 'subtask-settings'}}
|
| {{_ 'subtask-settings'}}
|
||||||
|
hr
|
||||||
|
ul.pop-over-list
|
||||||
|
li
|
||||||
|
a.js-Date-settings
|
||||||
|
i.fa.fa-calendar
|
||||||
|
| {{_ 'Date-settings'}}
|
||||||
|
|
||||||
template(name="labelsWidget")
|
template(name="labelsWidget")
|
||||||
.board-widget.board-widget-labels
|
.board-widget.board-widget-labels
|
||||||
|
|
|
@ -208,6 +208,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'),
|
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
|
||||||
|
'click .js-card-settings': Popup.open('boardCardSettings'),
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.boardMenuPopup.helpers({
|
Template.boardMenuPopup.helpers({
|
||||||
|
@ -472,6 +473,10 @@ BlazeComponent.extendComponent({
|
||||||
return this.currentBoard.allowsSubtasks;
|
return this.currentBoard.allowsSubtasks;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
allowsReceivedDate() {
|
||||||
|
return this.currentBoard.allowsReceivedDate;
|
||||||
|
},
|
||||||
|
|
||||||
isBoardSelected() {
|
isBoardSelected() {
|
||||||
return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id;
|
return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id;
|
||||||
},
|
},
|
||||||
|
@ -585,6 +590,297 @@ BlazeComponent.extendComponent({
|
||||||
},
|
},
|
||||||
}).register('boardSubtaskSettingsPopup');
|
}).register('boardSubtaskSettingsPopup');
|
||||||
|
|
||||||
|
BlazeComponent.extendComponent({
|
||||||
|
onCreated() {
|
||||||
|
this.currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsReceivedDate() {
|
||||||
|
return this.currentBoard.allowsReceivedDate;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsStartDate() {
|
||||||
|
return this.currentBoard.allowsStartDate;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsDueDate() {
|
||||||
|
return this.currentBoard.allowsDueDate;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsEndDate() {
|
||||||
|
return this.currentBoard.allowsEndDate;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsSubtasks() {
|
||||||
|
return this.currentBoard.allowsSubtasks;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsMembers() {
|
||||||
|
return this.currentBoard.allowsMembers;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsAssignee() {
|
||||||
|
return this.currentBoard.allowsAssignee;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsAssignedBy() {
|
||||||
|
return this.currentBoard.allowsAssignedBy;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsRequestedBy() {
|
||||||
|
return this.currentBoard.allowsRequestedBy;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsLabels() {
|
||||||
|
return this.currentBoard.allowsLabels;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsChecklists() {
|
||||||
|
return this.currentBoard.allowsChecklists;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsAttachments() {
|
||||||
|
return this.currentBoard.allowsAttachments;
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsComments() {
|
||||||
|
return this.currentBoard.allowsComments;
|
||||||
|
},
|
||||||
|
|
||||||
|
isBoardSelected() {
|
||||||
|
return this.currentBoard.dateSettingsDefaultBoardID;
|
||||||
|
},
|
||||||
|
|
||||||
|
isNullBoardSelected() {
|
||||||
|
return (
|
||||||
|
this.currentBoard.dateSettingsDefaultBoardId === null ||
|
||||||
|
this.currentBoard.dateSettingsDefaultBoardId === 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.dateSettingsDefaultBoardId === this.currentData()._id
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
events() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
'click .js-field-has-receiveddate'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsReceivedDate = !this.currentBoard
|
||||||
|
.allowsReceivedDate;
|
||||||
|
this.currentBoard.setAllowsReceivedDate(
|
||||||
|
this.currentBoard.allowsReceivedDate,
|
||||||
|
);
|
||||||
|
$(`.js-field-has-receiveddate ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsReceivedDate,
|
||||||
|
);
|
||||||
|
$('.js-field-has-receiveddate').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsReceivedDate,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-startdate'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsStartDate = !this.currentBoard
|
||||||
|
.allowsStartDate;
|
||||||
|
this.currentBoard.setAllowsStartDate(
|
||||||
|
this.currentBoard.allowsStartDate,
|
||||||
|
);
|
||||||
|
$(`.js-field-has-startdate ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsStartDate,
|
||||||
|
);
|
||||||
|
$('.js-field-has-startdate').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsStartDate,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-enddate'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsEndDate = !this.currentBoard.allowsEndDate;
|
||||||
|
this.currentBoard.setAllowsEndDate(this.currentBoard.allowsEndDate);
|
||||||
|
$(`.js-field-has-enddate ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsEndDate,
|
||||||
|
);
|
||||||
|
$('.js-field-has-enddate').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsEndDate,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-duedate'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsDueDate = !this.currentBoard.allowsDueDate;
|
||||||
|
this.currentBoard.setAllowsDueDate(this.currentBoard.allowsDueDate);
|
||||||
|
$(`.js-field-has-duedate ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsDueDate,
|
||||||
|
);
|
||||||
|
$('.js-field-has-duedate').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsDueDate,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-subtasks'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks;
|
||||||
|
this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks);
|
||||||
|
$(`.js-field-has-subtasks ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsSubtasks,
|
||||||
|
);
|
||||||
|
$('.js-field-has-subtasks').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsSubtasks,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-members'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsMembers = !this.currentBoard.allowsMembers;
|
||||||
|
this.currentBoard.setAllowsMembers(this.currentBoard.allowsMembers);
|
||||||
|
$(`.js-field-has-members ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsMembers,
|
||||||
|
);
|
||||||
|
$('.js-field-has-members').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsMembers,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-assignee'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsAssignee = !this.currentBoard.allowsAssignee;
|
||||||
|
this.currentBoard.setAllowsAssignee(this.currentBoard.allowsAssignee);
|
||||||
|
$(`.js-field-has-assignee ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAssignee,
|
||||||
|
);
|
||||||
|
$('.js-field-has-assignee').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAssignee,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-assigned-by'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsAssignedBy = !this.currentBoard.allowsAssignedBy;
|
||||||
|
this.currentBoard.setAllowsAssignedBy(this.currentBoard.allowsAssignedBy);
|
||||||
|
$(`.js-field-has-assigned-by ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAssignedBy,
|
||||||
|
);
|
||||||
|
$('.js-field-has-assigned-by').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAssignedBy,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-requested-by'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsRequestedBy = !this.currentBoard.allowsRequestedBy;
|
||||||
|
this.currentBoard.setAllowsRequestedBy(this.currentBoard.allowsRequestedBy);
|
||||||
|
$(`.js-field-has-requested-by ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsRequestedBy,
|
||||||
|
);
|
||||||
|
$('.js-field-has-requested-by').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsRequestedBy,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-labels'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsLabels = !this.currentBoard.allowsLabels;
|
||||||
|
this.currentBoard.setAllowsLabels(this.currentBoard.allowsLabels);
|
||||||
|
$(`.js-field-has-labels ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAssignee,
|
||||||
|
);
|
||||||
|
$('.js-field-has-labels').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsLabels,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-checklists'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsChecklists = !this.currentBoard
|
||||||
|
.allowsChecklists;
|
||||||
|
this.currentBoard.setAllowsChecklists(
|
||||||
|
this.currentBoard.allowsChecklists,
|
||||||
|
);
|
||||||
|
$(`.js-field-has-checklists ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsChecklists,
|
||||||
|
);
|
||||||
|
$('.js-field-has-checklists').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsChecklists,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-attachments'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsAttachments = !this.currentBoard
|
||||||
|
.allowsAttachments;
|
||||||
|
this.currentBoard.setAllowsAttachments(
|
||||||
|
this.currentBoard.allowsAttachments,
|
||||||
|
);
|
||||||
|
$(`.js-field-has-attachments ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAttachments,
|
||||||
|
);
|
||||||
|
$('.js-field-has-attachments').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsAttachments,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'click .js-field-has-comments'(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.currentBoard.allowsComments = !this.currentBoard.allowsComments;
|
||||||
|
this.currentBoard.setAllowsComments(this.currentBoard.allowsComments);
|
||||||
|
$(`.js-field-has-comments ${MCB}`).toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsComments,
|
||||||
|
);
|
||||||
|
$('.js-field-has-comments').toggleClass(
|
||||||
|
CKCLS,
|
||||||
|
this.currentBoard.allowsComments,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
}).register('boardCardSettingsPopup');
|
||||||
|
|
||||||
BlazeComponent.extendComponent({
|
BlazeComponent.extendComponent({
|
||||||
onCreated() {
|
onCreated() {
|
||||||
this.error = new ReactiveVar('');
|
this.error = new ReactiveVar('');
|
||||||
|
|
|
@ -238,7 +238,7 @@ services:
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
||||||
# https://github.com/wekan/wekan/pull/2560
|
# https://github.com/wekan/wekan/pull/2560
|
||||||
- RICHER_CARD_COMMENT_EDITOR=true
|
- RICHER_CARD_COMMENT_EDITOR=false
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
||||||
# https://github.com/wekan/wekan/issues/2518
|
# https://github.com/wekan/wekan/issues/2518
|
||||||
|
|
|
@ -583,8 +583,9 @@
|
||||||
"default": "Default",
|
"default": "Default",
|
||||||
"queue": "Queue",
|
"queue": "Queue",
|
||||||
"subtask-settings": "Subtasks Settings",
|
"subtask-settings": "Subtasks Settings",
|
||||||
|
"card-settings": "Card Settings",
|
||||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||||
"show-subtasks-field": "Cards can have subtasks",
|
"boardCardSettingsPopup-title": "Card Settings",
|
||||||
"deposit-subtasks-board": "Deposit subtasks to this board:",
|
"deposit-subtasks-board": "Deposit subtasks to this board:",
|
||||||
"deposit-subtasks-list": "Landing list for subtasks deposited here:",
|
"deposit-subtasks-list": "Landing list for subtasks deposited here:",
|
||||||
"show-parent-in-minicard": "Show parent in minicard:",
|
"show-parent-in-minicard": "Show parent in minicard:",
|
||||||
|
@ -756,5 +757,7 @@
|
||||||
"hide-minicard-label-text": "Hide minicard label text",
|
"hide-minicard-label-text": "Hide minicard label text",
|
||||||
"show-desktop-drag-handles": "Show desktop drag handles",
|
"show-desktop-drag-handles": "Show desktop drag handles",
|
||||||
"assignee": "Assignee",
|
"assignee": "Assignee",
|
||||||
"cardAssigneesPopup-title": "Assignee"
|
"cardAssigneesPopup-title": "Assignee",
|
||||||
|
"addmore-detail": "Add a more detailed description",
|
||||||
|
"show-on-card": "Show on Card"
|
||||||
}
|
}
|
||||||
|
|
210
models/boards.js
210
models/boards.js
|
@ -278,6 +278,7 @@ Boards.attachSchema(
|
||||||
optional: true,
|
optional: true,
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
},
|
},
|
||||||
|
|
||||||
subtasksDefaultListId: {
|
subtasksDefaultListId: {
|
||||||
/**
|
/**
|
||||||
* The default List ID assigned to subtasks.
|
* The default List ID assigned to subtasks.
|
||||||
|
@ -286,6 +287,19 @@ Boards.attachSchema(
|
||||||
optional: true,
|
optional: true,
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
dateSettingsDefaultBoardId: {
|
||||||
|
type: String,
|
||||||
|
optional: true,
|
||||||
|
defaultValue: null,
|
||||||
|
},
|
||||||
|
|
||||||
|
dateSettingsDefaultListId: {
|
||||||
|
type: String,
|
||||||
|
optional: true,
|
||||||
|
defaultValue: null,
|
||||||
|
},
|
||||||
|
|
||||||
allowsSubtasks: {
|
allowsSubtasks: {
|
||||||
/**
|
/**
|
||||||
* Does the board allows subtasks?
|
* Does the board allows subtasks?
|
||||||
|
@ -293,6 +307,103 @@ Boards.attachSchema(
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
defaultValue: true,
|
defaultValue: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
allowsAttachments: {
|
||||||
|
/**
|
||||||
|
* Does the board allows attachments?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsChecklists: {
|
||||||
|
/**
|
||||||
|
* Does the board allows checklists?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsComments: {
|
||||||
|
/**
|
||||||
|
* Does the board allows comments?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsLabels: {
|
||||||
|
/**
|
||||||
|
* Does the board allows labels?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsAssignee: {
|
||||||
|
/**
|
||||||
|
* Does the board allows assignee?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsMembers: {
|
||||||
|
/**
|
||||||
|
* Does the board allows members?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsRequestedBy: {
|
||||||
|
/**
|
||||||
|
* Does the board allows requested by?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsAssignedBy: {
|
||||||
|
/**
|
||||||
|
* Does the board allows requested by?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsReceivedDate: {
|
||||||
|
/**
|
||||||
|
* Does the board allows received date?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsStartDate: {
|
||||||
|
/**
|
||||||
|
* Does the board allows start date?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsEndDate: {
|
||||||
|
/**
|
||||||
|
* Does the board allows end date?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
allowsDueDate: {
|
||||||
|
/**
|
||||||
|
* Does the board allows due date?
|
||||||
|
*/
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
|
||||||
presentParentTask: {
|
presentParentTask: {
|
||||||
/**
|
/**
|
||||||
* Controls how to present the parent task:
|
* Controls how to present the parent task:
|
||||||
|
@ -710,6 +821,39 @@ Boards.helpers({
|
||||||
return Boards.findOne(this.getDefaultSubtasksBoardId());
|
return Boards.findOne(this.getDefaultSubtasksBoardId());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
//Date Settings option such as received date, start date and so on.
|
||||||
|
getDefaultDateSettingsBoardId() {
|
||||||
|
if (
|
||||||
|
this.dateSettingsDefaultBoardId === null ||
|
||||||
|
this.dateSettingsDefaultBoardId === undefined
|
||||||
|
) {
|
||||||
|
this.dateSettingsDefaultBoardId = Boards.insert({
|
||||||
|
title: `^${this.title}^`,
|
||||||
|
permission: this.permission,
|
||||||
|
members: this.members,
|
||||||
|
color: this.color,
|
||||||
|
description: TAPi18n.__('default-dates-board', {
|
||||||
|
board: this.title,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
Swimlanes.insert({
|
||||||
|
title: TAPi18n.__('default'),
|
||||||
|
boardId: this.dateSettingsDefaultBoardId,
|
||||||
|
});
|
||||||
|
Boards.update(this._id, {
|
||||||
|
$set: {
|
||||||
|
dateSettingsDefaultBoardId: this.dateSettingsDefaultBoardId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.dateSettingsDefaultBoardId;
|
||||||
|
},
|
||||||
|
|
||||||
|
getDefaultDateSettingsBoard() {
|
||||||
|
return Boards.findOne(this.getDefaultDateSettingsBoardId());
|
||||||
|
},
|
||||||
|
|
||||||
getDefaultSubtasksListId() {
|
getDefaultSubtasksListId() {
|
||||||
if (
|
if (
|
||||||
this.subtasksDefaultListId === null ||
|
this.subtasksDefaultListId === null ||
|
||||||
|
@ -728,6 +872,24 @@ Boards.helpers({
|
||||||
return Lists.findOne(this.getDefaultSubtasksListId());
|
return Lists.findOne(this.getDefaultSubtasksListId());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getDefaultDateSettingsListId() {
|
||||||
|
if (
|
||||||
|
this.dateSettingsDefaultListId === null ||
|
||||||
|
this.dateSettingsDefaultListId === undefined
|
||||||
|
) {
|
||||||
|
this.dateSettingsDefaultListId = Lists.insert({
|
||||||
|
title: TAPi18n.__('queue'),
|
||||||
|
boardId: this._id,
|
||||||
|
});
|
||||||
|
this.setDateSettingsDefaultListId(this.dateSettingsDefaultListId);
|
||||||
|
}
|
||||||
|
return this.dateSettingsDefaultListId;
|
||||||
|
},
|
||||||
|
|
||||||
|
getDefaultDateSettingsList() {
|
||||||
|
return Lists.findOne(this.getDefaultDateSettingsListId());
|
||||||
|
},
|
||||||
|
|
||||||
getDefaultSwimline() {
|
getDefaultSwimline() {
|
||||||
let result = Swimlanes.findOne({ boardId: this._id });
|
let result = Swimlanes.findOne({ boardId: this._id });
|
||||||
if (result === undefined) {
|
if (result === undefined) {
|
||||||
|
@ -925,6 +1087,54 @@ Boards.mutations({
|
||||||
return { $set: { allowsSubtasks } };
|
return { $set: { allowsSubtasks } };
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setAllowsMembers(allowsMembers) {
|
||||||
|
return { $set: { allowsMembers } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsChecklists(allowsChecklists) {
|
||||||
|
return { $set: { allowsChecklists } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsAssignee(allowsComments) {
|
||||||
|
return { $set: { allowsComments } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsAssignedBy(allowsAssignedBy) {
|
||||||
|
return { $set: { allowsAssignedBy } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsRequestedBy(allowsRequestedBy) {
|
||||||
|
return { $set: { allowsRequestedBy } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsAttachments(allowsAttachments) {
|
||||||
|
return { $set: { allowsAttachments } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsLabels(allowsLabels) {
|
||||||
|
return { $set: { allowsLabels } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsAssignee(allowsAssignee) {
|
||||||
|
return { $set: { allowsAssignee } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsReceivedDate(allowsReceivedDate) {
|
||||||
|
return { $set: { allowsReceivedDate } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsStartDate(allowsStartDate) {
|
||||||
|
return { $set: { allowsStartDate } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsEndDate(allowsEndDate) {
|
||||||
|
return { $set: { allowsEndDate } };
|
||||||
|
},
|
||||||
|
|
||||||
|
setAllowsDueDate(allowsDueDate) {
|
||||||
|
return { $set: { allowsDueDate } };
|
||||||
|
},
|
||||||
|
|
||||||
setSubtasksDefaultBoardId(subtasksDefaultBoardId) {
|
setSubtasksDefaultBoardId(subtasksDefaultBoardId) {
|
||||||
return { $set: { subtasksDefaultBoardId } };
|
return { $set: { subtasksDefaultBoardId } };
|
||||||
},
|
},
|
||||||
|
|
|
@ -238,7 +238,7 @@ const myCommand :Spk.Manifest.Command = (
|
||||||
# Note that this defines the *entire* environment seen by your app.
|
# Note that this defines the *entire* environment seen by your app.
|
||||||
(key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"),
|
(key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"),
|
||||||
(key = "WITH_API", value = "true"),
|
(key = "WITH_API", value = "true"),
|
||||||
(key = "RICHER_CARD_COMMENT_EDITOR", value="true"),
|
(key = "RICHER_CARD_COMMENT_EDITOR", value="false"),
|
||||||
(key = "CARD_OPENED_WEBHOOK_ENABLED", value="false"),
|
(key = "CARD_OPENED_WEBHOOK_ENABLED", value="false"),
|
||||||
(key = "BIGEVENTS_PATTERN", value="NONE"),
|
(key = "BIGEVENTS_PATTERN", value="NONE"),
|
||||||
(key = "MATOMO_ADDRESS", value=""),
|
(key = "MATOMO_ADDRESS", value=""),
|
||||||
|
|
|
@ -793,3 +793,195 @@ Migrations.add('add-profile-hiddenMinicardLabelText', () => {
|
||||||
noValidateMulti,
|
noValidateMulti,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-receiveddate-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsReceivedDate: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsReceivedDate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-startdate-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsStartDate: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsStartDate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-duedate-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsDueDate: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsDueDate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-enddate-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsEndDate: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsEndDate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-members-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsMembers: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsMembers: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-assignee-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsAssignee: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsAssignee: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-labels-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsLabels: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsLabels: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-checklists-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsChecklists: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsChecklists: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-attachments-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsAttachments: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsAttachments: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-comments-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsComments: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsComments: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-assigned-by-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsAssignedBy: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsAssignedBy: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Migrations.add('add-requested-by-allowed', () => {
|
||||||
|
Boards.update(
|
||||||
|
{
|
||||||
|
allowsRequestedBy: {
|
||||||
|
$exists: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$set: {
|
||||||
|
allowsRequestedBy: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
noValidateMulti,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
|
@ -60,8 +60,8 @@ DESCRIPTION_WITH_API="Enable/disable the api of wekan"
|
||||||
DEFAULT_WITH_API="true"
|
DEFAULT_WITH_API="true"
|
||||||
KEY_WITH_API="with-api"
|
KEY_WITH_API="with-api"
|
||||||
|
|
||||||
DESCRIPTION_RICHER_CARD_COMMENT_EDITOR="Rich text editor in card comments. Default: true"
|
DESCRIPTION_RICHER_CARD_COMMENT_EDITOR="Rich text editor in card comments. Default: false"
|
||||||
DEFAULT_RICHER_CARD_COMMENT_EDITOR="true"
|
DEFAULT_RICHER_CARD_COMMENT_EDITOR="false"
|
||||||
KEY_RICHER_CARD_COMMENT_EDITOR="richer-card-comment-editor"
|
KEY_RICHER_CARD_COMMENT_EDITOR="richer-card-comment-editor"
|
||||||
|
|
||||||
DESCRIPTION_CARD_OPENED_WEBHOOK_ENABLED="Card opened, send webhook message. Default: false https://github.com/wekan/wekan/issues/2518"
|
DESCRIPTION_CARD_OPENED_WEBHOOK_ENABLED="Card opened, send webhook message. Default: false https://github.com/wekan/wekan/issues/2518"
|
||||||
|
|
|
@ -63,7 +63,7 @@ echo -e "\n"
|
||||||
echo -e "Accounts lockout unknown users failure window, in seconds. Default: 15"
|
echo -e "Accounts lockout unknown users failure window, in seconds. Default: 15"
|
||||||
echo -e "\t$ snap set $SNAP_NAME accounts-lockout-unknown-users-failure-window='15'"
|
echo -e "\t$ snap set $SNAP_NAME accounts-lockout-unknown-users-failure-window='15'"
|
||||||
echo -e "\n"
|
echo -e "\n"
|
||||||
echo -e "Rich text editor in card comments. Default: true https://github.com/wekan/wekan/pull/2560"
|
echo -e "Rich text editor in card comments. Default: false https://github.com/wekan/wekan/pull/2560"
|
||||||
echo -e "Default:"
|
echo -e "Default:"
|
||||||
echo -e "\t$ snap set $SNAP_NAME richer-card-comment-editor='true'"
|
echo -e "\t$ snap set $SNAP_NAME richer-card-comment-editor='true'"
|
||||||
echo -e "Disabled:"
|
echo -e "Disabled:"
|
||||||
|
|
|
@ -23,7 +23,7 @@ SET WITH_API=true
|
||||||
|
|
||||||
REM # ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
REM # ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
||||||
REM # https://github.com/wekan/wekan/pull/2560
|
REM # https://github.com/wekan/wekan/pull/2560
|
||||||
SET RICHER_CARD_COMMENT_EDITOR=true
|
SET RICHER_CARD_COMMENT_EDITOR=false
|
||||||
|
|
||||||
REM # ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
REM # ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
||||||
SET CARD_OPENED_WEBHOOK_ENABLED=false
|
SET CARD_OPENED_WEBHOOK_ENABLED=false
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
||||||
# https://github.com/wekan/wekan/pull/2560
|
# https://github.com/wekan/wekan/pull/2560
|
||||||
export RICHER_CARD_COMMENT_EDITOR=true
|
export RICHER_CARD_COMMENT_EDITOR=false
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
||||||
export CARD_OPENED_WEBHOOK_ENABLED=false
|
export CARD_OPENED_WEBHOOK_ENABLED=false
|
||||||
|
|
|
@ -228,7 +228,7 @@ services:
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
|
||||||
# https://github.com/wekan/wekan/pull/2560
|
# https://github.com/wekan/wekan/pull/2560
|
||||||
- RICHER_CARD_COMMENT_EDITOR=true
|
- RICHER_CARD_COMMENT_EDITOR=false
|
||||||
#---------------------------------------------------------------
|
#---------------------------------------------------------------
|
||||||
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
||||||
# https://github.com/wekan/wekan/issues/2518
|
# https://github.com/wekan/wekan/issues/2518
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue