diff options
author | Lauri Ojansivu <x@xet7.org> | 2020-02-05 01:17:15 +0200 |
---|---|---|
committer | Lauri Ojansivu <x@xet7.org> | 2020-02-05 01:17:15 +0200 |
commit | 65fa2f626f503b8089e0d982901cffb3990426cb (patch) | |
tree | 1332d9e7eaa048ddfb1061d52d7bd68a46f5d9da | |
parent | 58df99d5be8460a56b06ff3151b7d63d7d12437b (diff) | |
parent | 0b00a8095ce34c753e5edac86d4b62e8aaa1b1e0 (diff) | |
download | wekan-65fa2f626f503b8089e0d982901cffb3990426cb.tar.gz wekan-65fa2f626f503b8089e0d982901cffb3990426cb.tar.bz2 wekan-65fa2f626f503b8089e0d982901cffb3990426cb.zip |
Merge branch 'dollybean' of https://github.com/2020product/wekan into 2020product-dollybean
-rw-r--r-- | Dockerfile | 2 | ||||
-rw-r--r-- | client/components/boards/boardHeader.js | 1 | ||||
-rw-r--r-- | client/components/cards/cardDetails.jade | 302 | ||||
-rw-r--r-- | client/components/cards/cardDetails.js | 87 | ||||
-rw-r--r-- | client/components/cards/cardDetails.styl | 12 | ||||
-rw-r--r-- | client/components/sidebar/sidebar.jade | 92 | ||||
-rw-r--r-- | client/components/sidebar/sidebar.js | 296 | ||||
-rw-r--r-- | docker-compose.yml | 2 | ||||
-rw-r--r-- | i18n/en.i18n.json | 7 | ||||
-rw-r--r-- | models/boards.js | 210 | ||||
-rw-r--r-- | sandstorm-pkgdef.capnp | 2 | ||||
-rw-r--r-- | server/migrations.js | 192 | ||||
-rwxr-xr-x | snap-src/bin/config | 4 | ||||
-rwxr-xr-x | snap-src/bin/wekan-help | 2 | ||||
-rwxr-xr-x | start-wekan.bat | 2 | ||||
-rwxr-xr-x | start-wekan.sh | 2 | ||||
-rw-r--r-- | torodb-postgresql/docker-compose.yml | 2 |
17 files changed, 1067 insertions, 150 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_LOCKOUT_PERIOD=60 \ ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \ - RICHER_CARD_COMMENT_EDITOR=true \ + RICHER_CARD_COMMENT_EDITOR=false \ CARD_OPENED_WEBHOOK_ENABLED=false \ ATTACHMENTS_STORE_PATH="" \ MAX_IMAGE_PIXEL="" \ diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index eea43bd3..8ab117f6 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -30,6 +30,7 @@ Template.boardMenuPopup.events({ 'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'), 'click .js-import-board': Popup.open('chooseBoardSource'), 'click .js-subtask-settings': Popup.open('boardSubtaskSettings'), + 'click .js-card-settings': Popup.open('boardCardSettings') }); Template.boardMenuPopup.helpers({ diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index de4e102a..41ab8ca2 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -8,10 +8,13 @@ template(name="cardDetails") a.fa.fa-times-thin.close-card-details.js-close-card-details if currentUser.isBoardMember 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 a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details if currentUser.isBoardMember 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( class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}") +viewer @@ -36,92 +39,103 @@ template(name="cardDetails") p.warning {{_ 'card-archived'}} .card-details-items - .card-details-item.card-details-item-received - h3 - i.fa.fa-sign-out - card-details-item-title {{_ 'card-received'}} - if getReceived - +cardReceivedDate - else - if canModifyCard - unless currentUser.isWorker - a.js-received-date {{_ 'add'}} - - .card-details-item.card-details-item-start - h3 - i.fa.fa-hourglass-start - card-details-item-title {{_ 'card-start'}} - if getStart - +cardStartDate - else - if canModifyCard - unless currentUser.isWorker - a.js-start-date {{_ 'add'}} + if currentBoard.allowsReceivedDate + .card-details-item.card-details-item-received + h3 + i.fa.fa-sign-out + card-details-item-title {{_ 'card-received'}} + if getReceived + +cardReceivedDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-received-date + i.fa.fa-plus + + if currentBoard.allowsStartDate + .card-details-item.card-details-item-start + h3 + i.fa.fa-hourglass-start + card-details-item-title {{_ 'card-start'}} + if getStart + +cardStartDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-start-date + i.fa.fa-plus + + if currentBoard.allowsDueDate + .card-details-item.card-details-item-due + h3 + i.fa.fa-sign-in + card-details-item-title {{_ 'card-due'}} + if getDue + +cardDueDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-due-date + i.fa.fa-plus + + if currentBoard.allowsEndDate + .card-details-item.card-details-item-end + h3 + i.fa.fa-hourglass-end + card-details-item-title {{_ 'card-end'}} + if getEnd + +cardEndDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-end-date + i.fa.fa-plus - .card-details-item.card-details-item-due - h3 - i.fa.fa-sign-in - card-details-item-title {{_ 'card-due'}} - if getDue - +cardDueDate - else + .card-details-items + if currentBoard.allowsMembers + .card-details-item.card-details-item-members + h3 + i.fa.fa-users + card-details-item-title {{_ 'members'}} + each getMembers + +userAvatar(userId=this cardId=../_id) + | {{! XXX Hack to hide syntaxic coloration /// }} if canModifyCard unless currentUser.isWorker - a.js-due-date {{_ 'add'}} - - .card-details-item.card-details-item-end - h3 - i.fa.fa-hourglass-end - card-details-item-title {{_ 'card-end'}} - if getEnd - +cardEndDate - else + a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}") + i.fa.fa-plus + + //if assigneeSelected + if currentBoard.allowsAssignee + .card-details-item.card-details-item-assignees + h3 + i.fa.fa-user + card-details-item-title {{_ 'assignee'}} + each getAssignees + +userAvatarAssignee(userId=this cardId=../_id) + | {{! XXX Hack to hide syntaxic coloration /// }} if canModifyCard - unless currentUser.isWorker - a.js-end-date {{_ 'add'}} - - .card-details-items - .card-details-item.card-details-item-members - h3 - i.fa.fa-users - card-details-item-title {{_ 'members'}} - each getMembers - +userAvatar(userId=this cardId=../_id) - | {{! XXX Hack to hide syntaxic coloration /// }} - if canModifyCard - unless currentUser.isWorker - 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 - h3 - i.fa.fa-user - card-details-item-title {{_ 'assignee'}} - each getAssignees - +userAvatarAssignee(userId=this cardId=../_id) - | {{! XXX Hack to hide syntaxic coloration /// }} - if canModifyCard - a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}") - 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 - - - .card-details-item.card-details-item-labels - h3 - i.fa.fa-tags - card-details-item-title {{_ 'labels'}} - a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}") - each labels - span.card-label(class="card-label-{{color}}" title=name) - +viewer - = name - if canModifyCard - unless currentUser.isWorker - a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") - 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 + h3 + i.fa.fa-tags + card-details-item-title {{_ 'labels'}} + a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}") + each labels + span.card-label(class="card-label-{{color}}" title=name) + +viewer + = name + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") + i.fa.fa-plus .card-details-items each customFieldsWD @@ -143,9 +157,9 @@ template(name="cardDetails") //- XXX We should use "editable" to avoid repetiting ourselves if canModifyCard unless currentUser.isWorker - h3 - i.fa.fa-align-left - card-details-item-title {{_ 'description'}} + //h3 + // i.fa.fa-align-left + // card-details-item-title {{_ 'description'}} +inlinedCardDescription(classNames="card-description js-card-description") +editor(autofocus=true) | {{getUnsavedValue 'cardDescription' _id getDescription}} @@ -153,16 +167,16 @@ template(name="cardDetails") button.primary(type="submit") {{_ 'save'}} a.fa.fa-times-thin.js-close-inlined-form else - a.js-open-inlined-form + a.description-item.add-description.js-open-inlined-form if getDescription +viewer = getDescription else - | {{_ 'edit'}} + | {{_ 'addmore-detail'}} if (hasUnsavedValue 'cardDescription' _id) p.quiet | {{_ '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'}} else if getDescription @@ -171,57 +185,60 @@ template(name="cardDetails") = getDescription .card-details-items - .card-details-item.card-details-item-name - h3 - i.fa.fa-shopping-cart - card-details-item-title {{_ 'requested-by'}} - if canModifyCard - unless currentUser.isWorker - +inlinedForm(classNames="js-card-details-requester") - +editCardRequesterForm - else - a.js-open-inlined-form - if getRequestedBy - +viewer - = getRequestedBy - else - | {{_ 'add'}} - else if getRequestedBy - +viewer - = getRequestedBy - - .card-details-item.card-details-item-name - h3 - i.fa.fa-user-plus - card-details-item-title {{_ 'assigned-by'}} - if canModifyCard - unless currentUser.isWorker - +inlinedForm(classNames="js-card-details-assigner") - +editCardAssignerForm - else - a.js-open-inlined-form - if getAssignedBy - +viewer - = getAssignedBy - else - | {{_ 'add'}} - else if getRequestedBy - +viewer - = getAssignedBy - - hr - +checklists(cardId = _id) - - if currentBoard.allowsSubtasks - hr - +subtasks(cardId = _id) - - hr - h3 - i.fa.fa-paperclip - | {{_ 'attachments'}} + if currentBoard.allowsRequestedBy + .card-details-item.card-details-item-name + h3 + i.fa.fa-shopping-cart + card-details-item-title {{_ 'requested-by'}} + if canModifyCard + unless currentUser.isWorker + +inlinedForm(classNames="js-card-details-requester") + +editCardRequesterForm + else + a.js-open-inlined-form + if getRequestedBy + +viewer + = getRequestedBy + else + | {{_ 'add'}} + else if getRequestedBy + +viewer + = getRequestedBy - +attachmentsGalery + if currentBoard.allowsAssignedBy + .card-details-item.card-details-item-name + h3 + i.fa.fa-user-plus + card-details-item-title {{_ 'assigned-by'}} + if canModifyCard + unless currentUser.isWorker + +inlinedForm(classNames="js-card-details-assigner") + +editCardAssignerForm + else + a.js-open-inlined-form + if getAssignedBy + +viewer + = getAssignedBy + else + | {{_ 'add'}} + else if getRequestedBy + +viewer + = getAssignedBy + + .card-checklist-attachmentGalerys + .card-checklist-attachmentGalery.card-checklists + if currentBoard.allowsChecklists + +checklists(cardId = _id) + if currentBoard.allowsSubtasks + hr + +subtasks(cardId = _id) + if currentBoard.allowsAttachments + //- hr + //- h3 + //- i.fa.fa-paperclip + //- | {{_ 'attachments'}} + .card-checklist-attachmentGalery.card-attachmentGalery + +attachmentsGalery hr unless currentUser.isNoComments @@ -237,9 +254,16 @@ template(name="cardDetails") else input.toggle-switch(type="checkbox" id="toggleButton") label.toggle-label(for="toggleButton") - if currentUser.isBoardMember - unless currentUser.isNoComments - +commentForm + if currentBoard.allowsComments + if currentUser.isBoardMember + 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 if isLoaded.get if isLinkedCard diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 07dcac44..92edec38 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -279,6 +279,29 @@ BlazeComponent.extendComponent({ 'click .js-close-card-details'() { 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'), 'submit .js-card-description'(event) { 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() { if (this.getAssignees().length === 0) { 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() { const user = Users.findOne(this.userId); return user && user.isBoardAdmin() ? 'admin' : 'normal'; diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl index 3fc4d047..fd6122eb 100644 --- a/client/components/cards/cardDetails.styl +++ b/client/components/cards/cardDetails.styl @@ -108,6 +108,8 @@ avatar-radius = 50% .close-card-details, .card-details-menu, + .card-copy-button, + .card-copy-mobile-button, .close-card-details-mobile-web, .card-details-menu-mobile-web float: right @@ -122,6 +124,16 @@ avatar-radius = 50% padding: 5px 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 font-size: 17px padding: 10px diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 8e84cd61..fe0810a5 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -72,6 +72,88 @@ template(name="boardChangeColorPopup") if isSelected 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") form.board-subtask-settings h3 {{_ 'show-parent-in-minicard'}} @@ -198,6 +280,10 @@ template(name="boardMenuPopup") i.fa.fa-globe | {{_ 'outgoing-webhooks'}} li + a.js-card-settings + i.fa.fa-id-card-o + | {{_ 'card-settings'}} + li a.js-subtask-settings i.fa.fa-sitemap | {{_ 'subtask-settings'}} @@ -238,6 +324,12 @@ template(name="boardMenuPopup") a.js-subtask-settings i.fa.fa-sitemap | {{_ 'subtask-settings'}} + hr + ul.pop-over-list + li + a.js-Date-settings + i.fa.fa-calendar + | {{_ 'Date-settings'}} template(name="labelsWidget") .board-widget.board-widget-labels diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index e8f38b8c..678c16d2 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -208,6 +208,7 @@ Template.boardMenuPopup.events({ 'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'), 'click .js-import-board': Popup.open('chooseBoardSource'), 'click .js-subtask-settings': Popup.open('boardSubtaskSettings'), + 'click .js-card-settings': Popup.open('boardCardSettings'), }); Template.boardMenuPopup.helpers({ @@ -472,6 +473,10 @@ BlazeComponent.extendComponent({ return this.currentBoard.allowsSubtasks; }, + allowsReceivedDate() { + return this.currentBoard.allowsReceivedDate; + }, + isBoardSelected() { return this.currentBoard.subtasksDefaultBoardId === this.currentData()._id; }, @@ -587,6 +592,297 @@ BlazeComponent.extendComponent({ 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({ + onCreated() { this.error = new ReactiveVar(''); this.loading = new ReactiveVar(false); }, diff --git a/docker-compose.yml b/docker-compose.yml index 57ccaeea..1aee54c9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -238,7 +238,7 @@ services: #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 - - RICHER_CARD_COMMENT_EDITOR=true + - RICHER_CARD_COMMENT_EDITOR=false #--------------------------------------------------------------- # ==== CARD OPENED, SEND WEBHOOK MESSAGE ==== # https://github.com/wekan/wekan/issues/2518 diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 64fada1a..da3d875a 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -583,8 +583,9 @@ "default": "Default", "queue": "Queue", "subtask-settings": "Subtasks Settings", + "card-settings": "Card 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-list": "Landing list for subtasks deposited here:", "show-parent-in-minicard": "Show parent in minicard:", @@ -756,5 +757,7 @@ "hide-minicard-label-text": "Hide minicard label text", "show-desktop-drag-handles": "Show desktop drag handles", "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee" + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card" } diff --git a/models/boards.js b/models/boards.js index 4e193dc7..69cf86fe 100644 --- a/models/boards.js +++ b/models/boards.js @@ -278,6 +278,7 @@ Boards.attachSchema( optional: true, defaultValue: null, }, + subtasksDefaultListId: { /** * The default List ID assigned to subtasks. @@ -286,6 +287,19 @@ Boards.attachSchema( optional: true, defaultValue: null, }, + + dateSettingsDefaultBoardId: { + type: String, + optional: true, + defaultValue: null, + }, + + dateSettingsDefaultListId: { + type: String, + optional: true, + defaultValue: null, + }, + allowsSubtasks: { /** * Does the board allows subtasks? @@ -293,6 +307,103 @@ Boards.attachSchema( type: Boolean, 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: { /** * Controls how to present the parent task: @@ -710,6 +821,39 @@ Boards.helpers({ 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() { if ( this.subtasksDefaultListId === null || @@ -728,6 +872,24 @@ Boards.helpers({ 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() { let result = Swimlanes.findOne({ boardId: this._id }); if (result === undefined) { @@ -925,6 +1087,54 @@ Boards.mutations({ 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) { return { $set: { subtasksDefaultBoardId } }; }, diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index e6dd9fc8..374d206b 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -238,7 +238,7 @@ const myCommand :Spk.Manifest.Command = ( # Note that this defines the *entire* environment seen by your app. (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"), (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 = "BIGEVENTS_PATTERN", value="NONE"), (key = "MATOMO_ADDRESS", value=""), diff --git a/server/migrations.js b/server/migrations.js index 1b7146c5..12a872a8 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -793,3 +793,195 @@ Migrations.add('add-profile-hiddenMinicardLabelText', () => { 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, + ); +}); diff --git a/snap-src/bin/config b/snap-src/bin/config index 8f1bfabd..a4c23a42 100755 --- a/snap-src/bin/config +++ b/snap-src/bin/config @@ -60,8 +60,8 @@ DESCRIPTION_WITH_API="Enable/disable the api of wekan" DEFAULT_WITH_API="true" KEY_WITH_API="with-api" -DESCRIPTION_RICHER_CARD_COMMENT_EDITOR="Rich text editor in card comments. Default: true" -DEFAULT_RICHER_CARD_COMMENT_EDITOR="true" +DESCRIPTION_RICHER_CARD_COMMENT_EDITOR="Rich text editor in card comments. Default: false" +DEFAULT_RICHER_CARD_COMMENT_EDITOR="false" 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" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index 1dc952b2..5d222b5d 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -63,7 +63,7 @@ echo -e "\n" 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 "\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 "\t$ snap set $SNAP_NAME richer-card-comment-editor='true'" echo -e "Disabled:" diff --git a/start-wekan.bat b/start-wekan.bat index 55dace87..718025ed 100755 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -23,7 +23,7 @@ SET WITH_API=true REM # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== 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 ==== SET CARD_OPENED_WEBHOOK_ENABLED=false diff --git a/start-wekan.sh b/start-wekan.sh index ad17f2fb..8dade1cc 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -39,7 +39,7 @@ #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 - export RICHER_CARD_COMMENT_EDITOR=true + export RICHER_CARD_COMMENT_EDITOR=false #--------------------------------------------------------------- # ==== CARD OPENED, SEND WEBHOOK MESSAGE ==== export CARD_OPENED_WEBHOOK_ENABLED=false diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index 7a7ad9c8..de4039bf 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -228,7 +228,7 @@ services: #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 - - RICHER_CARD_COMMENT_EDITOR=true + - RICHER_CARD_COMMENT_EDITOR=false #--------------------------------------------------------------- # ==== CARD OPENED, SEND WEBHOOK MESSAGE ==== # https://github.com/wekan/wekan/issues/2518 |