Răsfoiți Sursa

Merge branch 'dollybean' of https://github.com/2020product/wekan into 2020product-dollybean

Lauri Ojansivu 5 ani în urmă
părinte
comite
65fa2f626f

+ 1 - 1
Dockerfile

@@ -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="" \

+ 1 - 0
client/components/boards/boardHeader.js

@@ -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({

+ 163 - 139
client/components/cards/cardDetails.jade

@@ -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
-        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
           if canModifyCard
             unless currentUser.isWorker
             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
           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'}}")
             a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
               i.fa.fa-plus
               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
     .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
-          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")
         +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
-        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
     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
-      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
     unless currentUser.isNoComments
       if isLoaded.get
       if isLoaded.get
         if isLinkedCard
         if isLinkedCard

+ 87 - 0
client/components/cards/cardDetails.js

@@ -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';

+ 12 - 0
client/components/cards/cardDetails.styl

@@ -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

+ 92 - 0
client/components/sidebar/sidebar.jade

@@ -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

+ 296 - 0
client/components/sidebar/sidebar.js

@@ -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('');

+ 1 - 1
docker-compose.yml

@@ -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

+ 5 - 2
i18n/en.i18n.json

@@ -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 - 0
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 } };
   },
   },

+ 1 - 1
sandstorm-pkgdef.capnp

@@ -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=""),

+ 192 - 0
server/migrations.js

@@ -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,
+  );
+});

+ 2 - 2
snap-src/bin/config

@@ -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"
-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"
 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"

+ 1 - 1
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 "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:"

+ 1 - 1
start-wekan.bat

@@ -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

+ 1 - 1
start-wekan.sh

@@ -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

+ 1 - 1
torodb-postgresql/docker-compose.yml

@@ -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