Quellcode durchsuchen

Merge branch 'master' of https://github.com/wekan/wekan

John Supplee vor 3 Jahren
Ursprung
Commit
52e45211a2

+ 1 - 1
.devcontainer/Dockerfile

@@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive
 
 ENV \
     DEBUG=false \
-    NODE_VERSION=v12.22.3 \
+    NODE_VERSION=v12.22.4 \
     METEOR_RELEASE=1.10.2 \
     USE_EDGE=false \
     METEOR_EDGE=1.5-beta.17 \

+ 1 - 1
.future-snap/broken-snapcraft.yaml

@@ -81,7 +81,7 @@ parts:
     wekan:
         source: .
         plugin: nodejs
-        node-engine: 12.22.3
+        node-engine: 12.22.4
         node-packages:
             - node-gyp
             - node-pre-gyp

+ 1 - 1
.future-snap/snapcraft.yaml

@@ -83,7 +83,7 @@ parts:
     wekan:
         source: .
         plugin: nodejs
-        node-engine: 12.22.3
+        node-engine: 12.22.4
         node-packages:
             - node-gyp
             - node-pre-gyp

+ 4 - 0
.gitignore

@@ -34,3 +34,7 @@ ehthumbs.db
 .devcontainer/docker-compose.extend.yml
 .devcontainer/volumes*/
 .coverage
+
+# Helm chart
+# Chart dependencies
+/helm/wekan/**/*.tgz

+ 1 - 1
.travis.yml

@@ -3,7 +3,7 @@ sudo: required
 
 env:
   TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
-  TRAVIS_NODE_VERSION: 12.22.3
+  TRAVIS_NODE_VERSION: 12.22.4
   TRAVIS_NPM_VERSION: latest
 
 before_install:

+ 73 - 0
CHANGELOG.md

@@ -3,6 +3,79 @@
 Note: With Docker, please don't use latest tag. Only use release tags.
 See https://github.com/wekan/wekan/issues/3874
 
+# v5.47 2021-08-05 Wekan release
+
+This release adds the following updates:
+
+- [Updated dependencies](https://github.com/wekan/wekan/commit/68d9de89466611521db7d942dcf8daf58ba15a3e).
+  Thanks to developers of dependencies.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.46 2021-08-05 Wekan release
+
+This release adds the following updates:
+
+- [Updated dependencies](https://github.com/wekan/wekan/commit/d5c0a5d377d31bedadf3730756406355a17a563a).
+  Thanks to developers of dependencies.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.45 2021-08-05 Wekan release
+
+This release adds the following new features:
+
+- [Special handles to notify board or card members in a comment](https://github.com/wekan/wekan/pull/3937).
+  Thanks to syndimann.
+
+and fixes the following bugs:
+
+- [Fix: Show missing user mentions popover when posting comments in maximized card layout](https://github.com/wekan/wekan/pull/3939).
+  Thanks to syndimann.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.44 2021-08-03 Wekan release
+
+This release adds the following updates:
+
+- [Wekan v5.43](https://github.com/wekan/wekan/commit/4e17d5a10f95fcea420c794ed8b30ea18dc2a725) and v5.44 for helm.
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- [Fix: Consecutive Card numbering when a card is moved to another board or copied](https://github.com/wekan/wekan/pull/3936).
+  Thanks to syndimann.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.43 2021-08-03 Wekan release
+
+This release adds the following new features:
+
+- [Consecutive boardwise card numbering](https://github.com/wekan/wekan/pull/3935).
+  Thanks to syndimann.
+
+and adds the following updates:
+
+- [Update Helm Chart apiVersion, pin image version](https://github.com/wekan/wekan/pulls/3933).
+  This makes this Chart compatible with [flux](https://fluxcd.io)
+  [helm-controller](https://fluxcd.io/docs/components/helm), which requires v2 charts.
+  Thanks to varac.
+- [Wekan v5.42 for helm](https://github.com/wekan/wekan/commit/7a1f42fa4e153ff4a0fb481ca5a363ac62033b7f).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.42 2021-08-01 Wekan release
+
+This release adds the following CRITICAL SECURITY UPDATES:
+
+- [Updated to Node.js v12.22.4](https://github.com/wekan/wekan/commit/b13f6913896f787e1cae485381d98345d9f8b830).
+  Thanks to Node.js developers.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
 # v5.41 2021-07-26 Wekan release
 
 This release fixes the following bugs:

+ 1 - 1
Dockerfile

@@ -12,7 +12,7 @@ ARG DEBIAN_FRONTEND=noninteractive
 
 ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
     DEBUG=false \
-    NODE_VERSION=v12.22.3 \
+    NODE_VERSION=v12.22.4 \
     METEOR_RELEASE=1.10.2 \
     USE_EDGE=false \
     METEOR_EDGE=1.5-beta.17 \

+ 2 - 2
Dockerfile.arm64v8

@@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder
 ENV QEMU_VERSION=v4.2.0-6 \
     QEMU_ARCHITECTURE=aarch64 \
     NODE_ARCHITECTURE=linux-arm64 \
-    NODE_VERSION=v12.22.3 \
+    NODE_VERSION=v12.22.4 \
     WEKAN_VERSION=latest  \
     WEKAN_ARCHITECTURE=arm64
 
@@ -40,7 +40,7 @@ LABEL maintainer="wekan"
 # Set the environment variables (defaults where required)
 ENV QEMU_ARCHITECTURE=aarch64 \
     NODE_ARCHITECTURE=linux-arm64 \
-    NODE_VERSION=v12.22.3 \
+    NODE_VERSION=v12.22.4 \
     NODE_ENV=production \
     NPM_VERSION=latest \
     WITH_API=true \

+ 1 - 1
Stackerfile.yml

@@ -1,5 +1,5 @@
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
-appVersion: "v5.41.0"
+appVersion: "v5.47.0"
 files:
   userUploads:
     - README.md

+ 3 - 0
client/components/cards/cardDetails.jade

@@ -25,6 +25,9 @@ template(name="cardDetails")
         h2.card-details-title.js-card-title(
           class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
             +viewer
+              if currentBoard.allowsCardNumber
+                span.card-number
+                  | ##{getCardNumber}
               = getTitle
             if isWatching
               i.card-details-watch.fa.fa-eye

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

@@ -114,6 +114,12 @@ avatar-radius = 50%
     background: darken(white, 7%)
     border-bottom: 1px solid darken(white, 14%)
 
+    .card-number {
+      color: darken(white, 30%);
+      display: inline-block;
+      margin-right: 5px;
+    }
+
     .close-card-details,
     .maximize-card-details,
     .minimize-card-details,

+ 3 - 0
client/components/cards/minicard.jade

@@ -37,6 +37,9 @@ template(name="minicard")
       if getArchived
         span.linked-icon.linked-archived.fa.fa-archive
       +viewer
+        if currentBoard.allowsCardNumber
+          span.card-number
+            | ##{getCardNumber}
         = getTitle
       if $eq 'subtext-with-full-path' currentBoard.presentParentTask
         .parent-subtext

+ 4 - 0
client/components/cards/minicard.styl

@@ -114,6 +114,10 @@
       font-size:20px;
       color: #ccc;
   .minicard-title
+    .card-number
+      color: darken(white, 30%);
+      display: inline-block;
+      margin-right: 5px;
     p:last-child
       margin-bottom: 0
     .viewer

+ 16 - 13
client/components/lists/listBody.js

@@ -81,7 +81,9 @@ BlazeComponent.extendComponent({
         Utils.boardView() === 'board-view-cal' ||
         !Utils.boardView()
       )
-        swimlaneId = board.getDefaultSwimline()._id;
+      swimlaneId = board.getDefaultSwimline()._id;
+
+      const nextCardNumber = board.getNextCardNumber();
 
       const _id = Cards.insert({
         title,
@@ -93,6 +95,7 @@ BlazeComponent.extendComponent({
         sort: sortIndex,
         swimlaneId,
         type: cardType,
+        cardNumber: nextCardNumber,
         linkedId,
       });
 
@@ -241,7 +244,7 @@ BlazeComponent.extendComponent({
       Boards.findOne(currentBoardId)
         .customFields()
         .fetch(),
-      function(field) {
+      function (field) {
         if (field.automaticallyOnCard || field.alwaysOnCard)
           arr.push({ _id: field._id, value: null });
       },
@@ -750,17 +753,17 @@ BlazeComponent.extendComponent({
 
   checkIdleTime() {
     return window.requestIdleCallback ||
-    function(handler) {
-      const startTime = Date.now();
-      return setTimeout(function() {
-        handler({
-          didTimeout: false,
-          timeRemaining() {
-            return Math.max(0, 50.0 - (Date.now() - startTime));
-          },
-        });
-      }, 1);
-    };
+      function (handler) {
+        const startTime = Date.now();
+        return setTimeout(function () {
+          handler({
+            didTimeout: false,
+            timeRemaining() {
+              return Math.max(0, 50.0 - (Date.now() - startTime));
+            },
+          });
+        }, 1);
+      };
   }
 
   updateList() {

+ 10 - 3
client/components/main/editor.js

@@ -1,3 +1,9 @@
+const specialHandles = [
+  {userId: 'board_members', username: 'board_members'},
+  {userId: 'card_members', username: 'card_members'}
+];
+const specialHandleNames = specialHandles.map(m => m.username);
+
 Template.editor.onRendered(() => {
   const textareaSelector = 'textarea';
   const mentions = [
@@ -7,13 +13,14 @@ Template.editor.onRendered(() => {
       search(term, callback) {
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         callback(
+          _.union(
           currentBoard
             .activeMembers()
             .map(member => {
               const username = Users.findOne(member.userId).username;
               return username.includes(term) ? username : null;
             })
-            .filter(Boolean),
+            .filter(Boolean), [...specialHandleNames])
         );
       },
       template(value) {
@@ -323,13 +330,13 @@ Blaze.Template.registerHelper(
       return HTML.Raw(
         DOMPurify.sanitize(content, { ALLOW_UNKNOWN_PROTOCOLS: true }),
       );
-    const knowedUsers = currentBoard.members.map(member => {
+    const knowedUsers = _.union(currentBoard.members.map(member => {
       const u = Users.findOne(member.userId);
       if (u) {
         member.username = u.username;
       }
       return member;
-    });
+    }), [...specialHandles]);
     const mentionRegex = /\B@([\w.]*)/gi;
 
     let currentMention;

+ 3 - 0
client/components/main/layouts.styl

@@ -317,6 +317,9 @@ kbd
 .grabbing
   cursor: grabbing
 
+.textcomplete-dropdown
+  z-index: 2000 !important;
+
 // Implement a thiner close icon as suggested in
 // https://github.com/FortAwesome/Font-Awesome/issues/1540#issuecomment-68689950
 .fa.fa-times-thin:before

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

@@ -189,6 +189,13 @@ template(name="boardCardSettingsPopup")
         span
           i.fa.fa-tags
           | {{_ 'labels'}}
+    div.check-div
+      a.flex.js-field-has-card-number(class="{{#if allowsCardNumber}}is-checked{{/if}}")
+        .materialCheckBox(class="{{#if allowsCardNumber}}is-checked{{/if}}")
+        span
+          i.fa.fa-hashtag
+          | {{_ 'card'}}
+          | {{_ 'number'}}
     div.check-div
       a.flex.js-field-has-description-title(class="{{#if allowsDescriptionTitle}}is-checked{{/if}}")
         .materialCheckBox(class="{{#if allowsDescriptionTitle}}is-checked{{/if}}")

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

@@ -776,6 +776,10 @@ BlazeComponent.extendComponent({
     return this.currentBoard.allowsComments;
   },
 
+  allowsCardNumber() {
+    return this.currentBoard.allowsCardNumber;
+  },
+
   allowsDescriptionTitle() {
     return this.currentBoard.allowsDescriptionTitle;
   },
@@ -1019,6 +1023,22 @@ BlazeComponent.extendComponent({
             this.currentBoard.allowsDescriptionTitle,
           );
         },
+        'click .js-field-has-card-number'(evt) {
+          evt.preventDefault();
+          this.currentBoard.allowsCardNumber = !this.currentBoard
+            .allowsCardNumber;
+          this.currentBoard.setAllowsCardNumber(
+            this.currentBoard.allowsCardNumber,
+          );
+          $(`.js-field-has-card-number ${MCB}`).toggleClass(
+            CKCLS,
+            this.currentBoard.allowsCardNumber,
+          );
+          $('.js-field-has-card-number').toggleClass(
+            CKCLS,
+            this.currentBoard.allowsCardNumber,
+          );
+        },
         'click .js-field-has-description-text'(evt) {
           evt.preventDefault();
           this.currentBoard.allowsDescriptionText = !this.currentBoard

+ 6 - 0
helm/wekan/Chart.lock

@@ -0,0 +1,6 @@
+dependencies:
+- name: mongodb
+  repository: https://charts.bitnami.com/bitnami
+  version: 10.0.5
+digest: sha256:f6520f39b687cb52574ec2fda514662ce913665c0fd2391b68fdb4d2eb059497
+generated: "2021-07-27T22:16:39.945592552+02:00"

+ 20 - 10
helm/wekan/Chart.yaml

@@ -1,14 +1,24 @@
-name: wekan
-version: 1.0.3
-apiVersion: v1
+apiVersion: v2
+appVersion: "5.47"
+dependencies:
+  - condition: mongodb.enabled
+    name: mongodb
+    repository: https://charts.bitnami.com/bitnami
+    version: 10.0.x
 description: Open Source kanban
-home: https://wekan.github.io/
+home: https://wekan.github.io
 icon: https://wekan.github.io/wekan-logo.svg
+keywords:
+  - kanban
+maintainers:
+  - email: github@randall.cc
+    name: technotaff
+  - email: jiangyt.cn@gmail.com
+    name: jiangytcn
+  - email: varac@varac.net
+    name: varac
+name: wekan
 sources:
   - https://github.com/wekan/wekan
-maintainers:
-  - name: technotaff
-    email: github@randall.cc
-  - name: jiangytcn
-    email: jiangyt.cn@gmail.com
-engine: gotpl
+type: application
+version: 1.1.0

+ 0 - 5
helm/wekan/requirements.yaml

@@ -1,5 +0,0 @@
-dependencies:
-- name: mongodb
-  version: 10.0.x
-  repository: "https://charts.bitnami.com/bitnami"
-  condition: mongodb.enabled

+ 1 - 1
helm/wekan/values.yaml

@@ -14,7 +14,7 @@ serviceAccounts:
 ##
 image:
   repository: quay.io/wekan/wekan
-  tag: latest
+  tag: v5.47
   pullPolicy: IfNotPresent
 
 ## Configuration for wekan component

+ 1 - 1
i18n/de-CH.i18n.json

@@ -89,7 +89,7 @@
     "add-subtask": "Teilaufgabe hinzufügen",
     "add-checklist": "Checkliste hinzufügen",
     "add-checklist-item": "Element zu Checkliste hinzufügen",
-    "convertChecklistItemToCardPopup-title": "Convert to Card",
+    "convertChecklistItemToCardPopup-title": "in Karte konvertieren",
     "add-cover": "Cover hinzufügen",
     "add-label": "Label hinzufügen",
     "add-list": "Liste hinzufügen",

+ 2 - 2
i18n/pt.i18n.json

@@ -89,7 +89,7 @@
     "add-subtask": "Adicionar Sub-tarefa",
     "add-checklist": "Adicionar Lista de Verificação",
     "add-checklist-item": "Adicionar um item à lista de verificação",
-    "convertChecklistItemToCardPopup-title": "Convert to Card",
+    "convertChecklistItemToCardPopup-title": "Converter para Cartão",
     "add-cover": "Adicionar Capa",
     "add-label": "Adicionar Etiqueta",
     "add-list": "Adicionar Lista",
@@ -199,7 +199,7 @@
     "poker-forty": "40",
     "poker-oneHundred": "100",
     "poker-unsure": "?",
-    "poker-finish": "Finish",
+    "poker-finish": "Finalizar",
     "poker-result-votes": "Votos",
     "poker-result-who": "Who",
     "poker-replay": "Replay",

+ 23 - 8
models/activities.js

@@ -210,15 +210,30 @@ if (Meteor.isServer) {
             // ignore commenter mention himself?
             continue;
           }
-          const atUser = _.findWhere(knownUsers, { username });
-          if (!atUser) {
-            continue;
+
+          if (activity.boardId && username === 'board_members') {
+            // mentions all board members
+            const knownUids = knownUsers.map(u => u.userId);
+            watchers = _.union(watchers, [...knownUids]);
+            title = 'act-atUserComment';
+          } else if (activity.cardId && username === 'card_members') {
+            // mentions all card members if assigned
+            const card = activity.card();
+            watchers = _.union(watchers, [...card.members]);
+            title = 'act-atUserComment';
+          } else {
+            const atUser = _.findWhere(knownUsers, { username });
+            if (!atUser) {
+              continue;
+            }
+
+            const uid = atUser.userId;
+            params.atUsername = username;
+            params.atEmails = atUser.emails;
+            title = 'act-atUserComment';
+            watchers = _.union(watchers, [uid]);
           }
-          const uid = atUser.userId;
-          params.atUsername = username;
-          params.atEmails = atUser.emails;
-          title = 'act-atUserComment';
-          watchers = _.union(watchers, [uid]);
+
         }
       }
       params.commentId = comment._id;

+ 32 - 0
models/boards.js

@@ -375,6 +375,14 @@ Boards.attachSchema(
       defaultValue: true,
     },
 
+    allowsCardNumber: {
+      /**
+       * Does the board allows card numbers?
+       */
+      type: Boolean,
+      defaultValue: false,
+    },
+
     allowsActivities: {
       /**
        * Does the board allows comments?
@@ -1056,6 +1064,26 @@ Boards.helpers({
     return result;
   },
 
+  getNextCardNumber() {
+    const boardCards = Cards.find(
+      {
+        boardId: this._id
+      },
+      {
+        sort: { cardNumber: -1 },
+        limit: 1
+      }
+    ).fetch();
+
+    // If no card is assigned to the board, return 1
+    if (!boardCards || boardCards.length === 0) {
+      return 1;
+    }
+
+    const maxCardNr = !!boardCards[0].cardNumber ? boardCards[0].cardNumber : 0;
+    return maxCardNr + 1;
+  },
+
   cardsDueInBetween(start, end) {
     return Cards.find({
       boardId: this._id,
@@ -1285,6 +1313,10 @@ Boards.mutations({
     return { $set: { allowsDescriptionTitle } };
   },
 
+  setAllowsCardNumber(allowsCardNumber) {
+    return { $set: { allowsCardNumber } };
+  },
+
   setAllowsDescriptionText(allowsDescriptionText) {
     return { $set: { allowsDescriptionText } };
   },

+ 22 - 0
models/cards.js

@@ -470,6 +470,16 @@ Cards.attachSchema(
       optional: true,
       defaultValue: [],
     },
+    cardNumber: {
+      /**
+       * A boardwise sequentially increasing number that is assigned
+       * to every newly created card
+       */
+      type: Number,
+      decimal: true,
+      optional: true,
+      defaultValue: 0,
+    },
   }),
 );
 
@@ -567,6 +577,7 @@ Cards.helpers({
 
     delete this._id;
     this.boardId = boardId;
+    this.cardNumber = Boards.findOne(boardId).getNextCardNumber();
     this.swimlaneId = swimlaneId;
     this.listId = listId;
     const _id = Cards.insert(this);
@@ -1647,6 +1658,10 @@ Cards.helpers({
     }
   },
 
+  getCardNumber() {
+    return this.cardNumber;
+  },
+
   getBoardTitle() {
     if (this.isLinkedCard()) {
       const card = Cards.findOne({ _id: this.linkedId });
@@ -1975,8 +1990,12 @@ Cards.mutations({
         '_id',
       );
 
+      // assign the new card number from the target board
+      const newCardNumber = newBoard.getNextCardNumber();
+
       Object.assign(mutatedFields, {
         labelIds: newCardLabelIds,
+        cardNumber: newCardNumber
       });
 
       mutatedFields.customFields = this.mapCustomFieldsToBoard(newBoard._id);
@@ -3207,6 +3226,8 @@ if (Meteor.isServer) {
     Authentication.checkAdminOrCondition(req.userId, addPermission);
     const paramListId = req.params.listId;
     const paramParentId = req.params.parentId;
+
+    const nextCardNumber = board.getNextCardNumber();
     const currentCards = Cards.find(
       {
         listId: paramListId,
@@ -3229,6 +3250,7 @@ if (Meteor.isServer) {
         userId: req.body.authorId,
         swimlaneId: req.body.swimlaneId,
         sort: currentCards.count(),
+        cardNumber: nextCardNumber,
         members,
         assignees,
       });

Datei-Diff unterdrückt, da er zu groß ist
+ 6607 - 2
package-lock.json


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "wekan",
-  "version": "v5.41.0",
+  "version": "v5.47.0",
   "description": "Open-Source kanban",
   "private": true,
   "repository": {

+ 23 - 5
public/api/wekan.html

@@ -7,7 +7,7 @@
     <meta charset="utf-8">
     <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-    <title>Wekan REST API v5.41</title>
+    <title>Wekan REST API v5.47</title>
 
     <style>
     </style>
@@ -1555,7 +1555,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
 	  	<ul class="toc-list-h1">
         
           <li>
-            <a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.41">Wekan REST API v5.41</a>
+            <a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.47">Wekan REST API v5.47</a>
             
           </li>
         
@@ -2128,7 +2128,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
     <div class="page-wrapper">
       <div class="dark-box"></div>
       <div class="content">
-        <h1 id="wekan-rest-api">Wekan REST API v5.41</h1>
+        <h1 id="wekan-rest-api">Wekan REST API v5.47</h1>
 <blockquote>
 <p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
 </blockquote>
@@ -3554,6 +3554,7 @@ System.out.println(response.toString());
   <span class="hljs-attr">&quot;allowsComments&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsDescriptionTitle&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsDescriptionText&quot;</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">&quot;allowsCardNumber&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsActivities&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsLabels&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsCreator&quot;</span>: <span class="hljs-literal">true</span>,
@@ -9138,7 +9139,8 @@ System.out.println(response.toString());
   ],
   <span class="hljs-attr">&quot;linkId_gantt&quot;</span>: [
     <span class="hljs-string">&quot;string&quot;</span>
-  ]
+  ],
+  <span class="hljs-attr">&quot;cardNumber&quot;</span>: <span class="hljs-number">0</span>
 }
 </code></pre>
 <h3 id="get_card-responses">Responses</h3>
@@ -18346,6 +18348,7 @@ UserSecurity
   <span class="hljs-attr">&quot;allowsComments&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsDescriptionTitle&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsDescriptionText&quot;</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">&quot;allowsCardNumber&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsActivities&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsLabels&quot;</span>: <span class="hljs-literal">true</span>,
   <span class="hljs-attr">&quot;allowsCreator&quot;</span>: <span class="hljs-literal">true</span>,
@@ -18551,6 +18554,13 @@ UserSecurity
 <td>Does the board allows description text?</td>
 </tr>
 <tr>
+<td>allowsCardNumber</td>
+<td>boolean</td>
+<td>true</td>
+<td>none</td>
+<td>Does the board allows card numbers?</td>
+</tr>
+<tr>
 <td>allowsActivities</td>
 <td>boolean</td>
 <td>true</td>
@@ -19302,7 +19312,8 @@ UserSecurity
   ],
   <span class="hljs-attr">&quot;linkId_gantt&quot;</span>: [
     <span class="hljs-string">&quot;string&quot;</span>
-  ]
+  ],
+  <span class="hljs-attr">&quot;cardNumber&quot;</span>: <span class="hljs-number">0</span>
 }
 
 </code></pre>
@@ -19563,6 +19574,13 @@ UserSecurity
 <td>none</td>
 <td>ID of card which is the parent link in gantt view</td>
 </tr>
+<tr>
+<td>cardNumber</td>
+<td>number¦null</td>
+<td>false</td>
+<td>none</td>
+<td>A boardwise sequentially increasing number that is assigned<br />to every newly created card</td>
+</tr>
 </tbody>
 </table>
 <h4 id="enumerated-values-3">Enumerated Values</h4>

+ 12 - 1
public/api/wekan.yml

@@ -1,7 +1,7 @@
 swagger: '2.0'
 info:
   title: Wekan REST API
-  version: v5.41
+  version: v5.47
   description: |
     The REST API allows you to control and extend Wekan with ease.
 
@@ -2770,6 +2770,10 @@ definitions:
         description: |
            Does the board allows description text?
         type: boolean
+      allowsCardNumber:
+        description: |
+           Does the board allows card numbers?
+        type: boolean
       allowsActivities:
         description: |
            Does the board allows comments?
@@ -2888,6 +2892,7 @@ definitions:
       - allowsComments
       - allowsDescriptionTitle
       - allowsDescriptionText
+      - allowsCardNumber
       - allowsActivities
       - allowsLabels
       - allowsCreator
@@ -3268,6 +3273,12 @@ definitions:
           type: string
           x-nullable: true
         x-nullable: true
+      cardNumber:
+        description: |
+           A boardwise sequentially increasing number that is assigned
+           to every newly created card
+        type: number
+        x-nullable: true
     required:
       - archived
       - swimlaneId

+ 2 - 2
rebuild-wekan.bat

@@ -18,8 +18,8 @@ REM Install chocolatey
 
 choco install -y git curl python2 dotnet4.5.2 nano mongodb-3 mongoclient meteor
 
-curl -O https://nodejs.org/dist/v12.22.3/node-v12.22.3-x64.msi
-call node-v12.22.3-x64.msi
+curl -O https://nodejs.org/dist/v12.22.4/node-v12.22.4-x64.msi
+call node-v12.22.4-x64.msi
 
 call npm config -g set msvs_version 2015
 call meteor npm config -g set msvs_version 2015

+ 1 - 1
rebuild-wekan.sh

@@ -28,7 +28,7 @@ do
 			#curl -0 -L https://npmjs.org/install.sh | sudo sh
 			#sudo chown -R $(id -u):$(id -g) $HOME/.npm
 			sudo npm -g install n
-			sudo n 12.22.3
+			sudo n 12.22.4
 			#curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
 			#sudo apt-get install -y nodejs
 		elif [[ "$OSTYPE" == "darwin"* ]]; then

+ 2 - 2
sandstorm-pkgdef.capnp

@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
     appTitle = (defaultText = "Wekan"),
     # The name of the app as it is displayed to the user.
 
-    appVersion = 541,
+    appVersion = 547,
     # Increment this for every release.
 
-    appMarketingVersion = (defaultText = "5.41.0~2021-07-26"),
+    appMarketingVersion = (defaultText = "5.47.0~2021-08-05"),
     # Human-readable presentation of the app version.
 
     minUpgradableAppVersion = 0,

+ 39 - 0
server/migrations.js

@@ -1061,3 +1061,42 @@ Migrations.add('add-hide-logo-by-default', () => {
     noValidateMulti,
   );
 });
+
+Migrations.add('add-card-number-allowed', () => {
+  Boards.update(
+    {
+      allowsCardNumber: {
+        $exists: false,
+      },
+    },
+    {
+      $set: {
+        allowsCardNumber: false,
+      },
+    },
+    noValidateMulti,
+  );
+});
+
+Migrations.add('assign-boardwise-card-numbers', () => {
+  Boards.find().forEach(board => {
+    let nextCardNumber = board.getNextCardNumber();
+    Cards.find(
+      {
+        boardId: board._id,
+        cardNumber: {
+          $exists: false
+        }
+      },
+      {
+        sort: { createdAt: 1 }
+      }
+    ).forEach(card => {
+      Cards.update(
+        card._id,
+        { $set: { cardNumber: nextCardNumber } },
+        noValidate);
+      nextCardNumber++;
+    });
+  })
+});

+ 2 - 2
snapcraft.yaml

@@ -1,5 +1,5 @@
 name: wekan
-version: '5.41'
+version: '5.47'
 summary: The open-source kanban
 description: |
    Wekan is an open-source and collaborative kanban board application.
@@ -80,7 +80,7 @@ parts:
     wekan:
         source: .
         plugin: nodejs
-        node-engine: 12.22.3
+        node-engine: 12.22.4
         node-packages:
             - node-gyp
             - node-pre-gyp

+ 1 - 1
stacksmith/user-scripts/build.sh

@@ -2,7 +2,7 @@
 set -euxo pipefail
 
 BUILD_DEPS="bsdtar gnupg wget curl bzip2 python git ca-certificates perl-Digest-SHA"
-NODE_VERSION=v12.22.3
+NODE_VERSION=v12.22.4
 #METEOR_RELEASE=1.6.0.1 - for Stacksmith, meteor-1.8 branch that could have METEOR@1.8.1-beta.8 or newer
 USE_EDGE=false
 METEOR_EDGE=1.5-beta.17

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.