瀏覽代碼

Merge branch 'main' of https://github.com/walster001/wekan-atlanz

walster001 10 月之前
父節點
當前提交
62b13cc343
共有 100 個文件被更改,包括 803 次插入618 次删除
  1. 2 2
      .devcontainer/Dockerfile
  2. 2 2
      .github/workflows/docker-publish.yml
  3. 140 3
      CHANGELOG.md
  4. 3 3
      Dockerfile
  5. 1 2
      SECURITY.md
  6. 1 1
      Stackerfile.yml
  7. 6 6
      client/components/activities/activities.jade
  8. 33 31
      client/components/activities/activities.js
  9. 1 1
      client/components/boards/boardBody.jade
  10. 2 0
      client/components/boards/boardBody.js
  11. 237 443
      client/components/boards/boardColors.css
  12. 0 31
      client/components/boards/boardHeader.js
  13. 7 10
      client/components/boards/boardsList.js
  14. 0 2
      client/components/cards/attachments.jade
  15. 2 2
      client/components/cards/attachments.js
  16. 5 4
      client/components/cards/cardDetails.jade
  17. 6 4
      client/components/cards/cardDetails.js
  18. 1 1
      client/components/cards/checklists.jade
  19. 1 1
      client/components/cards/minicard.jade
  20. 1 5
      client/components/cards/minicard.js
  21. 4 10
      client/components/lists/list.css
  22. 1 1
      client/components/lists/list.js
  23. 8 8
      client/components/lists/listHeader.jade
  24. 1 1
      client/components/lists/listHeader.js
  25. 4 4
      client/components/main/editor.css
  26. 6 2
      client/components/sidebar/sidebar.css
  27. 2 10
      client/components/sidebar/sidebar.js
  28. 1 1
      client/components/swimlanes/swimlaneHeader.js
  29. 1 1
      client/components/swimlanes/swimlanes.jade
  30. 2 2
      client/components/swimlanes/swimlanes.js
  31. 3 3
      client/components/users/userHeader.js
  32. 4 3
      client/lib/utils.js
  33. 204 0
      docs/DeveloperDocs/Build-from-source.md
  34. 68 15
      docs/DeveloperDocs/Meteor.md
  35. 0 0
      docs/DeveloperDocs/Test-Edge.md
  36. 2 2
      docs/Features/Python.md
  37. 0 0
      docs/ImportExport/asana/CHANGELOG.md
  38. 0 0
      docs/ImportExport/asana/LICENSE
  39. 0 0
      docs/ImportExport/asana/export_boards.pl
  40. 0 0
      docs/ImportExport/asana/load_tasks.pl
  41. 0 0
      docs/ImportExport/trello/CHANGELOG.md
  42. 0 0
      docs/ImportExport/trello/LICENSE
  43. 0 0
      docs/ImportExport/trello/Migrating-from-Trello.md
  44. 0 0
      docs/ImportExport/trello/Wekan-vs-Trello-vs-Restyaboard.md
  45. 0 0
      docs/ImportExport/trello/api.py
  46. 0 0
      docs/ImportExport/trello/trello-project100.json
  47. 12 0
      docs/Login/Multitenancy.md
  48. 0 0
      docs/Login/OAuth2.md
  49. 29 1
      docs/Login/SAML.md
  50. 0 0
      docs/Login/ldap-sync/ldap-sync.py
  51. 0 0
      docs/Platforms/FOSS/Android.md
  52. 0 0
      docs/Platforms/FOSS/Cloud-Foundry.md
  53. 0 0
      docs/Platforms/FOSS/Debian.md
  54. 0 0
      docs/Platforms/FOSS/Docker/Docker.md
  55. 0 0
      docs/Platforms/FOSS/Docker/Export-Docker-Mongo-Data.md
  56. 0 0
      docs/Platforms/FOSS/Docker/Install-Wekan-Docker-for-testing.md
  57. 0 0
      docs/Platforms/FOSS/Docker/Install-Wekan-Docker-in-production.md
  58. 0 0
      docs/Platforms/FOSS/Docker/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1.md
  59. 0 0
      docs/Platforms/FOSS/Docker/Move-Docker-containers-to-other-computer.md
  60. 0 0
      docs/Platforms/FOSS/Docker/Rancher---Rancher-Active-Proxy---Wekan-MongoDB-Docker.md
  61. 0 0
      docs/Platforms/FOSS/Docker/Repair-Docker.md
  62. 0 0
      docs/Platforms/FOSS/FreeBSD.md
  63. 0 0
      docs/Platforms/FOSS/Friend.md
  64. 0 0
      docs/Platforms/FOSS/Helm.md
  65. 0 0
      docs/Platforms/FOSS/Helm2.md
  66. 0 0
      docs/Platforms/FOSS/OpenShift/OpenShift.md
  67. 0 0
      docs/Platforms/FOSS/OpenShift/README.md
  68. 0 0
      docs/Platforms/FOSS/OpenShift/wekan.yml
  69. 0 0
      docs/Platforms/FOSS/OpenSuse.md
  70. 0 0
      docs/Platforms/FOSS/Platforms.md
  71. 0 0
      docs/Platforms/FOSS/Sandstorm/Export-from-Wekan-Sandstorm-grain-.zip-file.md
  72. 0 0
      docs/Platforms/FOSS/Sandstorm/Sandstorm.md
  73. 0 0
      docs/Platforms/FOSS/Sandstorm/Wekan-Sandstorm-cards-to-CSV-using-Python.md
  74. 0 0
      docs/Platforms/FOSS/Sandstorm/Wekan-vs-Sandstorm.md
  75. 0 0
      docs/Platforms/FOSS/SmartOS.md
  76. 0 0
      docs/Platforms/FOSS/Snap/Automatic-update-schedule.md
  77. 0 0
      docs/Platforms/FOSS/Snap/Backup-and-restore.md
  78. 0 0
      docs/Platforms/FOSS/Snap/Candidate-WeKan-Snap-Manual-Upgrade.md
  79. 0 0
      docs/Platforms/FOSS/Snap/CentOS-7.md
  80. 0 0
      docs/Platforms/FOSS/Snap/CentOS8.md
  81. 0 0
      docs/Platforms/FOSS/Snap/Home.md
  82. 0 0
      docs/Platforms/FOSS/Snap/Install-snap-with-Ansible.md
  83. 0 0
      docs/Platforms/FOSS/Snap/Install.md
  84. 0 0
      docs/Platforms/FOSS/Snap/Limit-snap-to-root-user-only.md
  85. 0 0
      docs/Platforms/FOSS/Snap/Making-releases-from-source.md
  86. 0 0
      docs/Platforms/FOSS/Snap/Making-releases.md
  87. 0 0
      docs/Platforms/FOSS/Snap/Many-Snaps-on-LXC.md
  88. 0 0
      docs/Platforms/FOSS/Snap/Old-Making-releases.md
  89. 0 0
      docs/Platforms/FOSS/Snap/OpenSuse.md
  90. 0 0
      docs/Platforms/FOSS/Snap/Sharing-MongoDB.md
  91. 0 0
      docs/Platforms/FOSS/Snap/Snap.md
  92. 0 0
      docs/Platforms/FOSS/Snap/Supported-settings-keys.md
  93. 0 0
      docs/Platforms/FOSS/Snap/Testing-new-WeKan-Snap-versions.md
  94. 0 0
      docs/Platforms/FOSS/Snap/Troubleshooting.md
  95. 0 0
      docs/Platforms/FOSS/Snap/Uninstall.md
  96. 0 0
      docs/Platforms/FOSS/Snap/Update-all-snap-packages.md
  97. 0 0
      docs/Platforms/FOSS/Source/Install-and-Update.md
  98. 0 0
      docs/Platforms/FOSS/Source/Install-from-source-without-root.md
  99. 0 0
      docs/Platforms/FOSS/Source/Install-source-without-sudo-on-Linux.md
  100. 0 0
      docs/Platforms/FOSS/Source/Raspberry-Pi.md

+ 2 - 2
.devcontainer/Dockerfile

@@ -8,8 +8,8 @@ LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
 # - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
 #   so changing to 21.10. https://github.com/wekan/wekan/issues/4488
 
-ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ iproute2 apt-transport-https libarchive-tools git"
-ENV DEV_DEPS="curl python3 ca-certificates build-essential"
+ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ iproute2 apt-transport-https libarchive-tools"
+ENV DEV_DEPS="curl python3 ca-certificates build-essential git"
 ARG DEBIAN_FRONTEND=noninteractive
 
 ENV \

+ 2 - 2
.github/workflows/docker-publish.yml

@@ -38,7 +38,7 @@ jobs:
       # https://github.com/docker/login-action
       - name: Log into registry ${{ env.REGISTRY }}
         if: github.event_name != 'pull_request'
-        uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446
+        uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
         with:
           registry: ${{ env.REGISTRY }}
           username: ${{ github.actor }}
@@ -55,7 +55,7 @@ jobs:
       # Build and push Docker image with Buildx (don't push on PR)
       # https://github.com/docker/build-push-action
       - name: Build and push Docker image
-        uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003
+        uses: docker/build-push-action@5176d81f87c23d6fc96624dfdbcd9f3830bbe445
         with:
           context: .
           push: ${{ github.event_name != 'pull_request' }}

+ 140 - 3
CHANGELOG.md

@@ -15,7 +15,131 @@ Fixing other platforms In Progress.
 
 [How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
 
-# Upcoming WeKan ® release
+# v7.54 2024-08-07 WeKan ® release
+
+This release adds the following new features:
+
+- [Helm Chart: Add Support for Overriding Image Registry in Airgapped Environments](https://github.com/wekan/charts/pull/35).
+  Thanks to geilername.
+- [PWA, move to standalone (standard) to display the status bar](https://github.com/wekan/wekan/pull/5484)
+  Thanks to mfilser.
+- [Added info how with Caddy webserver config, PWA and Android app override icons, showing toolbars, etc](https://github.com/wekan/wekan/commit/55fc342f6d90d8e30b70a8903ecead1c4370bd89).
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- [Don't set background image in .board-canvas too](https://github.com/wekan/wekan/pull/5485).
+  Thanks to mfilser.
+- [Bugfix, variable "color" didn't exist](https://github.com/wekan/wekan/pull/5486).
+  Thanks to mfilser.
+- [Little opacity to minicards to see the background image a little bit](https://github.com/wekan/wekan/pull/5487).
+  Thanks to mfilser.
+- [Remove attachment storage name from attachment list](https://github.com/wekan/wekan/pull/5488).
+  Thanks to mfilser.
+- [Attachment popup back was broken since new attachment viewer, now fixed](https://github.com/wekan/wekan/pull/5489).
+  Thanks to mfilser.
+- [Change Meteor.user() to ReactiveCache.getCurrentUser()](https://github.com/wekan/wekan/pull/5490).
+  Thanks to mfilser.
+- [Fix empty parentId in cards](https://github.com/wekan/wekan/pull/5491).
+  Thanks to mfilser.
+- [Sidebar xmark icon, add padding and background color](https://github.com/wekan/wekan/pull/5492).
+  Thanks to mfilser.
+- [Board view, first column a bit smaller to save screen space](https://github.com/wekan/wekan/pull/5493).
+  Thanks to mfilser.
+- [Minicard, show creator, defaultValue of schema and other code is now the same](https://github.com/wekan/wekan/pull/5494).
+  Thanks to mfilser.
+- [Editor, Bugfix, copy text is now at each editor (textarea) again](https://github.com/wekan/wekan/pull/5495).
+  Thanks to mfilser.
+- [Bugfix, Cards Count on mobile view was missing](https://github.com/wekan/wekan/pull/5496).
+  Thanks to mfilser.
+- [ListHeader, simpler code logic at collapsed if conditions](https://github.com/wekan/wekan/pull/5497).
+  Thanks to mfilser.
+- [Bugfix, edit description didn't work if it was clicked](https://github.com/wekan/wekan/pull/5498).
+  Thanks to mfilser.
+- [Fix LDAP login fails after upgrade](https://github.com/wekan/wekan/commit/a4169f3da773e4fd961acd0266260085a753cdab).
+  Thanks to juppees and xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v7.53 2024-08-03 WeKan ® release
+
+This release adds the following new features:
+
+- [Added Dragscroll to scroll the board](https://github.com/wekan/wekan/pull/5477).
+  Click on an empty space in the board, hold the left mouse and move left and right
+  to scroll the board easily.
+  Thanks to mfilser.
+
+and adds the following updates:
+
+- [Updated release script: New install webpage location](https://github.com/wekan/wekan/commit/5e639a7c2d6dc1182ba95e44875ac8a6798a62be).
+  Thanks to xet7.
+- [Updated dependencies](https://github.com/wekan/wekan/commit/3f9ae57144dc9befd674c784896d68b5db9df146).
+  Thanks to developers of dependencies.
+- [Copied changes from wiki to docs](https://github.com/wekan/wekan/commit/aaca60b6760cc84b56a24fc15c93f23b4a34f06e).
+  Thanks to xet7.
+- [Updated Snap Candidate to MongoDB 6.0.16](https://github.com/wekan/wekan/commit/1af1844f37d17f9f54ca358ccf0f44eed1dfbef4).
+  Thanks to MongoDB developers.
+
+and fixes the following bugs:
+
+- [Board Menu Popup's were opened twice because of 2 same event creation](https://github.com/wekan/wekan/pull/5478).
+  Thanks to mfilser.
+- [Fixing of "mode is undefined" on first activity component creation](https://github.com/wekan/wekan/pull/5479).
+  Thanks to mfilser.
+- [Changing card color now closes the popup and doesn't refresh the whole board page](https://github.com/wekan/wekan/pull/5480).
+  Thanks to mfilser.
+- [Fix dragscroll package name](https://github.com/wekan/wekan/commit/45674806d78fddb8a3b8a75890e5059cc1a680ea).
+  Thanks to xet7.
+- [Reducing card size in database if no planning poker was started](https://github.com/wekan/wekan/pull/5481).
+  Thanks to mfilser.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v7.52 2024-08-03 WeKan ® release
+
+This release adds the following new features:
+
+- [Helm Chart: Add option to set resource limits for initContainer](https://github.com/wekan/charts/pull/33).
+  Thanks to mreichelt-dicos.
+- [Helm Chart: Fixes for mongodb persistence. Please test is this correct](https://github.com/wekan/charts/commit/7efb071dd91d76c3971e1865fd18f9d43d8c6891).
+  Thanks to emoritzx.
+- [Helm Chart: Added info about rarely used running WeKan at subpath](https://github.com/wekan/charts/commit/7d4176c7b328c5477c1fa29a323574aac78616a9).
+  Thanks to emoritzx.
+
+and adds the following updates:
+
+- Updated dependencies.
+  [Part 1](https://github.com/wekan/wekan/pull/5460),
+  [Part 2](https://github.com/wekan/wekan/pull/5464),
+  [Part 3](https://github.com/wekan/wekan/pull/5460),
+  [Part 4](https://github.com/wekan/wekan/pull/5469),
+  [Part 5](https://github.com/wekan/wekan/pull/5470),
+  [Part 6](https://github.com/wekan/wekan/pull/5471),
+  [Part 7](https://github.com/wekan/wekan/pull/5473).
+  Thanks to dependabot.
+- Added RepoCloud SaaS.
+  [Part 1](https://github.com/wekan/wekan/commit/21d6dfd79090f9885635f55537bd9fa1ef8539e1),
+  [Part 2](https://github.com/wekan/wekan/commit/e663ce038af397f547e8823d61ce5dc2e3cea84d),
+  [Part 3](https://github.com/wekan/wekan.github.io/commit/e9e0550824cdda31daae42df7c497fbd037fd78f).
+  Thanks to RepoCloud.
+- [Updated WeKan app webmanifest](https://github.com/wekan/wekan/commit/745618626535743938b9d2e8c88afe6345807a85).
+  Thanks to xet7.
+- [Revert forking of ldapjs](https://github.com/wekan/wekan/commit/c89f3ba3da6512169e033d76377a9190b35a92d2).
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- [Fixes to Clean light and Clean dark themes](https://github.com/wekan/wekan/pull/5458).
+  Thanks to abramchikd.
+- [Activities, adding back "created at" field](https://github.com/wekan/wekan/pull/5476).
+  Thanks to mfilser.
+- [Fix typos at attachments code](https://github.com/wekan/wekan/commit/de3bc9cb4d20590c45ff72ef7749d830ea3fc16c).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v7.51 2024-06-27 WeKan ® release
 
 This release adds the following updates:
 
@@ -23,10 +147,23 @@ This release adds the following updates:
   Thanks to dependabot.
 - Moved docs from wiki to wekan repo docs directory, organized to subdirectories. Organizing and updating in progress.
   [Part 1](https://github.com/wekan/wekan/commit/1961e22cbd51e83aa131c8b092c7d43475a021eb),
-  [Part 1](https://github.com/wekan/wekan/commit/ce89ff48331a27ffb42d021833c78df3a462b9db),
-  [Part 1](https://github.com/wekan/wekan/commit/449c02c42a0183a49592ada89bdfb8f25e5db903).
+  [Part 2](https://github.com/wekan/wekan/commit/ce89ff48331a27ffb42d021833c78df3a462b9db),
+  [Part 3](https://github.com/wekan/wekan/commit/449c02c42a0183a49592ada89bdfb8f25e5db903),
+  [Part 4](https://github.com/wekan/wekan/commit/0fb2f7fdd6b6cb828ab4ea534204a5b834d2e19a),
+  [Part 5](https://github.com/wekan/wekan/commit/e9c1c620eb938349c30761497066daf41cdcfc19),
+  [Part 6](https://github.com/wekan/wekan/commit/6b7b66801b716e1d0bf2548b18eed4ed4e354f2d),
+  [Part 7](https://github.com/wekan/wekan/commit/1cfaddff9cd4fe84fb74c80d1585f2a5dd65f5ca),
+  [Part 8](https://github.com/wekan/wekan/commit/057ac4031eaa912b849c637e163f4dffa79a9329),
+  [Part 9](https://github.com/wekan/wekan/commit/52375df78380bbe3407b51dc986baaf6f31f40e4),
+  [Part 10](https://github.com/wekan/wekan/commit/00a56f6aaa0c2bcd24ca8829a0718b45e7cedf04),
+  [Part 11](https://github.com/wekan/wekan/commit/c863428aa2597457fc4931e7b1bdd75d6cc2610b).
   Thanks to xet7.
 
+and fixes the following bugs:
+
+- [Fix ModernDark Cards not showing correctly](https://github.com/wekan/wekan/pull/5455).
+  Thanks to walster001.
+
 Thanks to above GitHub users for their contributions and translators for their translations.
 
 # v7.50 2024-06-22 WeKan ® release

+ 3 - 3
Dockerfile

@@ -202,7 +202,7 @@ ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
 mkdir -p "/opt/nodejs/lib/node_modules/fibers/.node-gyp" "/root/.node-gyp/${NODE_VERSION} /home/wekan/.config"
 
 # Install node dependencies
-npm install -g npm@${NPM_VERSION}
+npm install -g npm@${NPM_VERSION} --production
 chown --recursive wekan:wekan /home/wekan/.config
 
 # Install Meteor
@@ -222,11 +222,11 @@ cd /home/wekan/app
 mkdir -p /home/wekan/.npm
 chown --recursive wekan:wekan /home/wekan/.npm
 chmod u+w *.json
-gosu wekan:wekan meteor npm install
+gosu wekan:wekan meteor npm install --production
 gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build
 cd /home/wekan/app_build/bundle/programs/server/
 chmod u+w *.json
-gosu wekan:wekan meteor npm install
+gosu wekan:wekan meteor npm install --production
 cd node_modules/fibers
 node build.js
 cd ../..

+ 1 - 2
SECURITY.md

@@ -1,8 +1,7 @@
 About money, see [CONTRIBUTING.md](CONTRIBUTING.md)
 
 Security is very important to us. If you discover any issue regarding security, please disclose
-the information responsibly by sending an email to support (at) wekan.team using
-[this PGP public key](support-at-wekan.team_pgp-publickey.asc) and not by
+the information responsibly by sending an email to support@wekan.team and not by
 creating a GitHub issue. We will respond swiftly to fix verifiable security issues.
 
 We thank you with a place at our hall of fame page, that is

+ 1 - 1
Stackerfile.yml

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

+ 6 - 6
client/components/activities/activities.jade

@@ -16,7 +16,6 @@ template(name="cardActivities")
     +activity(activity=activityData card=card mode=mode)
 
 template(name="editOrDeleteComment")
-  = ' - '
   a.js-open-inlined-form {{_ "edit"}}
   = ' - '
   a.js-delete-comment {{_ "delete"}}
@@ -145,11 +144,10 @@ template(name="activity")
               +viewer
                 = activity.comment.text
             +commentReactions(reactions=activity.comment.reactions commentId=activity.comment._id)
-            span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
-              if($eq currentUser._id activity.comment.userId)
-                +editOrDeleteComment
-              else if currentUser.isBoardAdmin
-                +editOrDeleteComment
+            if($eq currentUser._id activity.comment.userId)
+              +editOrDeleteComment
+            else if currentUser.isBoardAdmin
+              +editOrDeleteComment
 
         if($eq activity.activityType 'deleteComment')
           | {{{_ 'activity-deleteComment' activity.commentId}}}.
@@ -242,3 +240,5 @@ template(name="activity")
         = ' @'
       else if(currentData.timeValue)
         | {{_ activity.activityType currentData.timeValue}}
+
+      div(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}

+ 33 - 31
client/components/activities/activities.js

@@ -13,39 +13,41 @@ BlazeComponent.extendComponent({
     const sidebar = Sidebar;
     sidebar && sidebar.callFirstWith(null, 'resetNextPeak');
     this.autorun(() => {
-      let mode = this.data().mode;
-      const capitalizedMode = Utils.capitalize(mode);
-      let searchId;
-      if (mode === 'linkedcard' || mode === 'linkedboard') {
-        searchId = Utils.getCurrentCard().linkedId;
-        mode = mode.replace('linked', '');
-      } else if (mode === 'card') {
-        searchId = Utils.getCurrentCardId();
-      } else {
-        searchId = Session.get(`current${capitalizedMode}`);
-      }
-      const limit = this.page.get() * activitiesPerPage;
-      const user = ReactiveCache.getCurrentUser();
-      const hideSystem = user ? user.hasHiddenSystemMessages() : false;
-      if (searchId === null) return;
+      let mode = this.data()?.mode;
+      if (mode) {
+        const capitalizedMode = Utils.capitalize(mode);
+        let searchId;
+        if (mode === 'linkedcard' || mode === 'linkedboard') {
+          searchId = Utils.getCurrentCard().linkedId;
+          mode = mode.replace('linked', '');
+        } else if (mode === 'card') {
+          searchId = Utils.getCurrentCardId();
+        } else {
+          searchId = Session.get(`current${capitalizedMode}`);
+        }
+        const limit = this.page.get() * activitiesPerPage;
+        const user = ReactiveCache.getCurrentUser();
+        const hideSystem = user ? user.hasHiddenSystemMessages() : false;
+        if (searchId === null) return;
 
-      this.subscribe('activities', mode, searchId, limit, hideSystem, () => {
-        this.loadNextPageLocked = false;
+        this.subscribe('activities', mode, searchId, limit, hideSystem, () => {
+          this.loadNextPageLocked = false;
 
-        // TODO the guard can be removed as soon as the TODO above is resolved
-        if (!sidebar) return;
-        // If the sibear peak hasn't increased, that mean that there are no more
-        // activities, and we can stop calling new subscriptions.
-        // XXX This is hacky! We need to know excatly and reactively how many
-        // activities there are, we probably want to denormalize this number
-        // dirrectly into card and board documents.
-        const nextPeakBefore = sidebar.callFirstWith(null, 'getNextPeak');
-        sidebar.calculateNextPeak();
-        const nextPeakAfter = sidebar.callFirstWith(null, 'getNextPeak');
-        if (nextPeakBefore === nextPeakAfter) {
-          sidebar.callFirstWith(null, 'resetNextPeak');
-        }
-      });
+          // TODO the guard can be removed as soon as the TODO above is resolved
+          if (!sidebar) return;
+          // If the sibear peak hasn't increased, that mean that there are no more
+          // activities, and we can stop calling new subscriptions.
+          // XXX This is hacky! We need to know excatly and reactively how many
+          // activities there are, we probably want to denormalize this number
+          // dirrectly into card and board documents.
+          const nextPeakBefore = sidebar.callFirstWith(null, 'getNextPeak');
+          sidebar.calculateNextPeak();
+          const nextPeakAfter = sidebar.callFirstWith(null, 'getNextPeak');
+          if (nextPeakBefore === nextPeakAfter) {
+            sidebar.callFirstWith(null, 'resetNextPeak');
+          }
+        });
+      }
     });
   },
   loadNextPage() {

+ 1 - 1
client/components/boards/boardBody.jade

@@ -18,7 +18,7 @@ template(name="boardBody")
   else
     .board-wrapper(class=currentBoard.colorClass)
       +sidebar
-      .board-canvas.js-swimlanes(
+      .board-canvas.js-swimlanes.dragscroll(
         class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
         class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
         class="{{#if draggingActive.get}}is-dragging-active{{/if}}")

+ 2 - 0
client/components/boards/boardBody.js

@@ -1,5 +1,6 @@
 import { ReactiveCache } from '/imports/reactiveCache';
 import { TAPi18n } from '/imports/i18n';
+import dragscroll from '@wekanteam/dragscroll';
 
 const subManager = new SubsManager();
 const { calculateIndex } = Utils;
@@ -219,6 +220,7 @@ BlazeComponent.extendComponent({
       boardComponent.openNewListForm();
     }
 
+    dragscroll.reset();
     Utils.setBackgroundImage();
   },
 

文件差異過大導致無法顯示
+ 237 - 443
client/components/boards/boardColors.css


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

@@ -6,37 +6,6 @@ const DOWNCLS = 'fa-sort-down';
 const UPCLS = 'fa-sort-up';
 */
 const sortCardsBy = new ReactiveVar('');
-Template.boardMenuPopup.events({
-  'click .js-rename-board': Popup.open('boardChangeTitle'),
-  'click .js-custom-fields'() {
-    Sidebar.setView('customFields');
-    Popup.back();
-  },
-  'click .js-open-archives'() {
-    Sidebar.setView('archives');
-    Popup.back();
-  },
-  'click .js-change-board-color': Popup.open('boardChangeColor'),
-  'click .js-change-language': Popup.open('changeLanguage'),
-  'click .js-archive-board ': Popup.afterConfirm('archiveBoard', function() {
-    const currentBoard = Utils.getCurrentBoard();
-    currentBoard.archive();
-    // XXX We should have some kind of notification on top of the page to
-    // confirm that the board was successfully archived.
-    FlowRouter.go('home');
-  }),
-  'click .js-delete-board': Popup.afterConfirm('deleteBoard', function() {
-    const currentBoard = Utils.getCurrentBoard();
-    Popup.back();
-    Boards.remove(currentBoard._id);
-    FlowRouter.go('home');
-  }),
-  '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'),
-  'click .js-minicard-settings': Popup.open('boardMinicardSettings'),
-});
 
 Template.boardChangeTitlePopup.events({
   submit(event, templateInstance) {

+ 7 - 10
client/components/boards/boardsList.js

@@ -151,8 +151,8 @@ BlazeComponent.extendComponent({
       }
       const currUser = ReactiveCache.getCurrentUser();
 
-      let orgIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
-      if (orgIdsUserBelongs && orgIdsUserBelongs != '') {
+      let orgIdsUserBelongs = currUser?.orgIdsUserBelongs() || '';
+      if (orgIdsUserBelongs) {
         let orgsIds = orgIdsUserBelongs.split(',');
         // for(let i = 0; i < orgsIds.length; i++){
         //   query.$and[2].$or.push({'orgs.orgId': orgsIds[i]});
@@ -162,8 +162,8 @@ BlazeComponent.extendComponent({
         query.$and[2].$or.push({ 'orgs.orgId': { $in: orgsIds } });
       }
 
-      let teamIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
-      if (teamIdsUserBelongs && teamIdsUserBelongs != '') {
+      let teamIdsUserBelongs = currUser?.teamIdsUserBelongs() || '';
+      if (teamIdsUserBelongs) {
         let teamsIds = teamIdsUserBelongs.split(',');
         // for(let i = 0; i < teamsIds.length; i++){
         //   query.$or[2].$or.push({'teams.teamId': teamsIds[i]});
@@ -199,15 +199,12 @@ BlazeComponent.extendComponent({
   },
 
   boardMembers(boardId) {
-    let boardMembers = [];
     /* Bug Board icons random dance https://github.com/wekan/wekan/issues/4214
     const lists = ReactiveCache.getBoard(boardId)
-    let members = lists.members
-    members.forEach(member => {
-      boardMembers.push(member.userId);
-    });
-    */
+    const boardMembers = lists?.members.map(member => member.userId);
     return boardMembers;
+    */
+    return [];
   },
 
   isStarred() {

+ 0 - 2
client/components/cards/attachments.jade

@@ -117,8 +117,6 @@ template(name="attachmentActionsPopup")
               | {{_ 'remove-background-image'}}
             else
               | {{_ 'add-background-image'}}
-        p.attachment-storage
-          | {{versions.original.storage}}
 
         if $neq versions.original.storage "fs"
           a.js-move-storage-fs

+ 2 - 2
client/components/cards/attachments.js

@@ -39,7 +39,7 @@ Template.attachmentGallery.events({
   'click .js-rename': Popup.open('attachmentRename'),
   'click .js-confirm-delete': Popup.afterConfirm('attachmentDelete', function() {
       Attachments.remove(this._id);
-      Popup.back(2);
+      Popup.back();
   }),
 });
 
@@ -501,7 +501,7 @@ BlazeComponent.extendComponent({
           if (name === DOMPurify.sanitize(name)) {
             Meteor.call('renameAttachment', this.data()._id, name);
           }
-          Popup.back(2);
+          Popup.back();
         },
       }
     ]

+ 5 - 4
client/components/cards/cardDetails.jade

@@ -5,7 +5,7 @@ template(name="cardDetails")
 
   +attachmentViewer
 
-  section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas
+  section.card-details.js-card-details.nodragscroll(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas
     .card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
       +inlinedForm(classNames="js-card-details-title")
         +editCardTitleForm
@@ -527,9 +527,10 @@ template(name="cardDetails")
               if currentBoard.allowsDescriptionText
                 a.js-open-inlined-form(title="{{_ 'edit'}}" value=title)
                   i.fa.fa-pencil-square-o
-                if getDescription
-                  +viewer
-                    = getDescription
+                a.js-open-inlined-form(title="{{_ 'edit'}}" value=title)
+                  if getDescription
+                    +viewer
+                      = getDescription
                 if (hasUnsavedValue 'cardDescription' _id)
                   p.quiet
                     | {{_ 'unsaved-description'}}

+ 6 - 4
client/components/cards/cardDetails.js

@@ -846,13 +846,15 @@ BlazeComponent.extendComponent({
         'click .js-palette-color'() {
           this.currentColor.set(this.currentData().color);
         },
-        'click .js-submit'() {
+        'click .js-submit'(event) {
+          event.preventDefault();
           this.currentCard.setColor(this.currentColor.get());
-          Popup.close();
+          Popup.back();
         },
-        'click .js-remove-color'() {
+        'click .js-remove-color'(event) {
+          event.preventDefault();
           this.currentCard.setColor(null);
-          Popup.close();
+          Popup.back();
         },
       },
     ];

+ 1 - 1
client/components/cards/checklists.jade

@@ -22,7 +22,7 @@ template(name="checklists")
         i.fa.fa-plus
 
 template(name="checklistDetail")
-  .js-checklist.checklist
+  .js-checklist.checklist.nodragscroll
     +inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
       +editChecklistItemForm(checklist = checklist)
     else

+ 1 - 1
client/components/cards/minicard.jade

@@ -1,5 +1,5 @@
 template(name="minicard")
-  .minicard(
+  .minicard.nodragscroll(
     class="{{#if isLinkedCard}}linked-card{{/if}}"
     class="{{#if isLinkedBoard}}linked-board{{/if}}"
     class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}")

+ 1 - 5
client/components/cards/minicard.js

@@ -42,11 +42,7 @@ BlazeComponent.extendComponent({
     const board = this.data().board();
     let ret = false;
     if (board) {
-      ret =
-        board.allowsCreatorOnMinicard === null ||
-        board.allowsCreatorOnMinicard === undefined ||
-        board.allowsCreatorOnMinicard
-      ;
+      ret = board.allowsCreatorOnMinicard ?? false;
     }
     return ret;
   },

+ 4 - 10
client/components/lists/list.css

@@ -7,17 +7,11 @@
   border-left: 1px solid #ccc;
   padding: 0;
   float: left;
-  /* min-width: 100px; TODO(mark-i-m): hardcoded? */
-  /*max-width: 270px;*/
-  /* Reverted incomplete change list width: */
-  /* https://github.com/wekan/wekan/issues/4558 */
-  /* Orinal width: 270px. Changes not saved yet: */
-  /*resize: both;  - List width and height resizeable */
-  /* overflow: auto; - List width and height resizeable */
 }
-.list:first-child {
+[id^="swimlane-"] .list:first-child {
   min-width: 20px;
-  margin-left: 5px;
+}
+.list:first-child {
   border-left: none;
 }
 .card-details + .list {
@@ -48,7 +42,7 @@
 }
 .list-header-add {
   flex: 0 0 auto;
-  padding: 20px 12px 4px;
+  padding: 12px;
   position: relative;
   min-height: 20px;
 }

+ 1 - 1
client/components/lists/list.js

@@ -196,7 +196,7 @@ BlazeComponent.extendComponent({
   },
 
   listWidth() {
-    const user = Meteor.user();
+    const user = ReactiveCache.getCurrentUser();
     const list = Template.currentData();
     return user.getListWidth(list.boardId, list._id);
   },

+ 8 - 8
client/components/lists/listHeader.jade

@@ -1,20 +1,18 @@
 template(name="listHeader")
-  .list-header.js-list-header(
+  .list-header.js-list-header.nodragscroll(
     class="{{#if limitToShowCardsCount}}list-header-card-count{{/if}}"
     class=colorClass)
     +inlinedForm
       +editListTitleForm
     else
-      unless isMiniScreen
-        if collapsed
-          a.js-collapse(title="{{_ 'uncollapse'}}")
-            i.fa.fa-arrow-left.list-header-uncollapse-left
-            i.fa.fa-arrow-right.list-header-uncollapse-right
       if isMiniScreen
         if currentList
           a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
-      unless isMiniScreen
+      else
         if collapsed
+          a.js-collapse(title="{{_ 'uncollapse'}}")
+            i.fa.fa-arrow-left.list-header-uncollapse-left
+            i.fa.fa-arrow-right.list-header-uncollapse-right
           if showCardsCountForList cards.length
             br
             span.cardCount {{cardsCount}}
@@ -28,7 +26,9 @@ template(name="listHeader")
            |&nbsp;(
            span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
            |/#{wipLimit.value})
-      unless isMiniScreen
+        if showCardsCountForList cards.length
+          span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
+      else
         div(class="{{#if collapsed}}list-rotated{{/if}}")
           h2.list-header-name(
             title="{{ moment modifiedAt 'LLL' }}"

+ 1 - 1
client/components/lists/listHeader.js

@@ -362,7 +362,7 @@ BlazeComponent.extendComponent({
   listWidthValue() {
     const list = Template.currentData();
     const board = list.boardId;
-    return Meteor.user().getListWidth(board, list._id);
+    return ReactiveCache.getCurrentUser().getListWidth(board, list._id);
   },
 
   events() {

+ 4 - 4
client/components/main/editor.css

@@ -2,15 +2,15 @@
 .inlined-form a.fa.fa-brands.fa-markdown {
   float: right;
   position: absolute;
-  top: -20px;
+  top: -10px;
   right: 60px;
 }
 .new-comment a.fa.fa-copy,
 .inlined-form a.fa.fa-copy {
   float: right;
-  position: absolute;
-  top: -20px;
-  right: 6px;
+  position: relative;
+  top: -10px;
+  right: 5px;
 }
 .js-inlined-form.viewer.btn-sm {
   position: absolute;

+ 6 - 2
client/components/sidebar/sidebar.css

@@ -16,9 +16,13 @@
 }
 .sidebar-xmark {
   position: absolute;
-  right: 10px;
-  top: 5px;
+  right: 0px;
+  top: 0px;
   font-size: 25px;
+  padding: 10px;
+}
+.sidebar-xmark:hover {
+  background: rgba(0,0,0,0.15);
 }
 .sidebar .sidebar-content {
   padding: 12px;

+ 2 - 10
client/components/sidebar/sidebar.js

@@ -913,19 +913,11 @@ BlazeComponent.extendComponent({
   },
 
   allowsCreator() {
-    return (
-      this.currentBoard.allowsCreator === null ||
-      this.currentBoard.allowsCreator === undefined ||
-      this.currentBoard.allowsCreator
-    );
+    return this.currentBoard.allowsCreator ?? false;
   },
 
   allowsCreatorOnMinicard() {
-    return (
-      this.currentBoard.allowsCreatorOnMinicard === null ||
-      this.currentBoard.allowsCreatorOnMinicard === undefined ||
-      this.currentBoard.allowsCreatorOnMinicard
-    );
+    return this.currentBoard.allowsCreatorOnMinicard ?? false;
   },
 
   allowsMembers() {

+ 1 - 1
client/components/swimlanes/swimlaneHeader.js

@@ -224,7 +224,7 @@ BlazeComponent.extendComponent({
   swimlaneHeightValue() {
     const swimlane = this.currentData();
     const board = swimlane.boardId;
-    return Meteor.user().getSwimlaneHeight(board, swimlane._id);
+    return ReactiveCache.getCurrentUser().getSwimlaneHeight(board, swimlane._id);
   },
 
   events() {

+ 1 - 1
client/components/swimlanes/swimlanes.jade

@@ -1,5 +1,5 @@
 template(name="swimlane")
-  .swimlane
+  .swimlane.nodragscroll
     +swimlaneHeader
   unless collapseSwimlane
     .swimlane.js-lists.js-swimlane(id="swimlane-{{_id}}"

+ 2 - 2
client/components/swimlanes/swimlanes.js

@@ -225,7 +225,7 @@ BlazeComponent.extendComponent({
   },
 
   swimlaneHeight() {
-    const user = Meteor.user();
+    const user = ReactiveCache.getCurrentUser();
     const swimlane = Template.currentData();
     const height = user.getSwimlaneHeight(swimlane.boardId, swimlane._id);
     return height == -1 ? "auto" : (height + "px");
@@ -288,7 +288,7 @@ BlazeComponent.extendComponent({
 
 Template.swimlane.helpers({
   canSeeAddList() {
-    return Meteor.user().isBoardAdmin();
+    return ReactiveCache.getCurrentUser().isBoardAdmin();
   },
 });
 

+ 3 - 3
client/components/users/userHeader.js

@@ -325,7 +325,7 @@ Template.changeSettingsPopup.helpers({
     });
   },
   startDayOfWeek() {
-    currentUser = Meteor.user();
+    currentUser = ReactiveCache.getCurrentUser();
     if (currentUser) {
       return currentUser.getStartDayOfWeek();
     } else {
@@ -343,7 +343,7 @@ Template.changeSettingsPopup.events({
     return ret;
   },
   'click .js-toggle-desktop-drag-handles'() {
-    currentUser = Meteor.user();
+    const currentUser = ReactiveCache.getCurrentUser();
     if (currentUser) {
       Meteor.call('toggleDesktopDragHandles');
     } else if (window.localStorage.getItem('showDesktopDragHandles')) {
@@ -375,7 +375,7 @@ Template.changeSettingsPopup.events({
       templateInstance.$('#start-day-of-week').val(),
       10,
     );
-    const currentUser = Meteor.user();
+    const currentUser = ReactiveCache.getCurrentUser();
     if (isNaN(minLimit) || minLimit < -1) {
       minLimit = -1;
     }

+ 4 - 3
client/lib/utils.js

@@ -4,10 +4,11 @@ Utils = {
   setBackgroundImage(url) {
     const currentBoard = Utils.getCurrentBoard();
     if (currentBoard.backgroundImageURL !== undefined) {
-      $(".board-wrapper,.board-wrapper .board-canvas").css({"background":"url(" + currentBoard.backgroundImageURL + ")","background-size":"cover"});
+      $(".board-wrapper").css({"background":"url(" + currentBoard.backgroundImageURL + ")","background-size":"cover"});
       $(".swimlane,.swimlane .list,.swimlane .list .list-body,.swimlane .list:first-child .list-body").css({"background-color":"transparent"});
-    } else if (currentBoard.color !== undefined) {
-      currentBoard.setColor(currentBoard.color);
+      $(".minicard").css({"opacity": "0.9"});
+    } else if (currentBoard["background-color"]) {
+      currentBoard.setColor(currentBoard["background-color"]);
     }
   },
   /** returns the current board id

+ 204 - 0
docs/DeveloperDocs/Build-from-source.md

@@ -0,0 +1,204 @@
+## About markdown changes
+
+Wekan v4.29 changes markdown rendering from [marked](https://github.com/markedjs/marked) to [markdown-it](https://github.com/markdown-it/markdown-it).
+
+## About emoji
+
+With markdown-it, also [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) plugin has been added, supporting [full list of GitHub emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.json).
+
+Example emoji code, that you can add for example to card name, card description etc:
+```
+:rainbow: :thumbsup: :100:
+```
+That shows emojis :rainbow: :thumbsup: :100:
+
+## About other markdown-it plugins
+
+For markdown-it, there are also other [syntax extensions](https://github.com/markdown-it/markdown-it#syntax-extensions) where some are listed at that markdown-it page, and [others at npmjs.com](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
+
+For example, how to get some [mermaid plugin](https://www.npmjs.com/search?q=markdown-it-mermaid) working so that some syntax works for https://mermaid-js.github.io/mermaid/ ?
+
+## How you could add another plugin
+
+Using newest Ubuntu amd64:
+
+# Meteor 2
+
+### 1. Install git and configure it
+```
+sudo apt -y install git
+
+git config --global user.name "Yourfirstname Yourlastname"
+
+git config --global user.email email-address-you-use-at-github@example.com
+
+git config --global push.default simple
+
+nano .ssh/config
+```
+There add your User (GitHub username) and IdentityFile (Your ssh private key. Not public key that has .pub).
+For indentation, use one tab.
+```
+Host *
+        IdentitiesOnly=yes
+
+Host github.com
+        Hostname github.com
+        User xet7
+        IdentityFile ~/.ssh/id_xet7ed
+```
+Save and Exit with Ctrl-o Enter Ctrl-x Enter
+
+If you do not have ssh key, create it:
+```
+ssh-keygen
+```
+And press Enter about 3 times, until you have private key at `~/.ssh/id_rsa` and public key at `~/.ssh/id_rsa.pub`
+
+Add public key `.pub` to your github account web interface.
+
+Add path to Meteor:
+```
+nano .bashrc
+```
+There at bottom add:
+```
+export PATH=~/.meteor:$PATH
+```
+Save and Exit with Ctrl-o Enter Ctrl-x Enter
+
+### 2. Create fork of `https://github.com/wekan/wekan` at GitHub web page
+
+```
+mkdir repos
+
+cd repos
+
+git clone git@github.com:YourGithubUsername/wekan.git
+
+cd wekan
+```
+### 3. Select option 1 to install dependencies, and then Enter.
+```
+./rebuild-wekan.sh
+
+1
+
+./rebuild-wekan.sh
+
+2
+
+./rebuild-wekan.sh
+
+3
+```
+That does: 1 install dependencies, 2 builds wekan, 3 starts wekan in development mode with command `meteor`, so it can detect if some file changes and try to rebuild automatically and reload webbroser. But, still sometimes, it may need stopping with Ctrl-c and full build with option 2.
+
+And then [register and login](Adding-users) at http://localhost:4000
+
+### OPTIONAL, NOT NEEDED: 5. Add new plugin package
+```
+meteor npm install markdown-it-something --save
+```
+
+Edit file `wekan/packages/markdown/src-integration.js` and add using that new package, using code example from that new plugin page, or similar like emoji plugin was added.
+
+### 7. Test
+
+Test does that new plugin syntax work, for example in card title, card description etc on other input fields.
+
+### 8. If it works, create pull request
+
+If normal markdown, emoji, and your new added plugin syntax all work, commit your changes:
+```
+git add --all
+
+git commit -m "Added plugin markdown-it-something."
+
+git push
+```
+And then at your GitHub for `https://github.com/YOUR-GITHUB-USERNAME/wekan` click `Create pull request`.
+
+# Meteor 3
+
+At 2024-06-26, it looks like from https://nodejs.org/en that Node.js LTS version is 20.15.0 , so change to newest Node.js LTS, delete old Meteor:
+```
+sudo n 20.15.0
+
+sudo npm -g install npm
+
+cd
+
+rm -rf .meteor
+```
+Check how to install newest Meteor from Meteor 3 PR at https://github.com/meteor/meteor/pull/13163 , for example:
+```
+npx meteor@rc
+```
+Check what branches there are:
+```
+cd repos/wekan
+
+git branch -a
+```
+Change to Meteor 3 branch:
+```
+git checkout feature-meteor3
+```
+Build wekan:
+```
+./rebuild-wekan.sh
+
+2
+```
+If there are errors, try to fix them.
+
+Or try to run wekan:
+```
+./rebuild-wekan.sh
+
+3
+```
+# Updating
+
+There are usually updates both for npm packages and Meteor
+
+Updating npm packages:
+```
+npm update
+```
+Checking for vulnerable packages:
+```
+npm audit
+```
+Fixing vulnerable npm packages by updating to newer packages:
+```
+npm audit fix
+```
+If that did not help, use force:
+```
+npm audit fix --force
+```
+If that did not help, read links from that `npm audit` command did show, remove deprecated dependencies, update to other maintained dependencies.
+
+Updating to next Meteor release:
+```
+meteor update
+```
+Updating to specific Meteor release:
+```
+meteor update --release METEOR@3.0-rc.4
+```
+Trying to update all Meteor packages:
+```
+meteor update --release METEOR@3.0-rc.4 --all-packages
+```
+Allowing incompatible updates, that may sometime work:
+```
+meteor update --release METEOR@3.0-rc.4 --all-packages --allow-incompatible-update
+```
+If you are changing Meteor and Node.js versions, you may need to reset Meteor:
+```
+meteor reset
+```
+Or alternatively, delete wekan repo (if you did not need any changes you made), and clone wekan repo again, and then build etc.

+ 68 - 15
docs/DeveloperDocs/Meteor.md

@@ -1,18 +1,71 @@
-## Upgrading Meteor
-
-- Disclaimer:
-  - These are opinions about upgrading, from xet7, maintainer of WeKan Open Source kanban https://wekan.github.io
-  - xet7 thinks, that it is good to keep using current frontend and backend frameworks, upgrade them when possible. If there is any problems, ask at https://forums.meteor.com
-  - xet7 thinks, that upgrading to newest Meteor 2 and Meteor 3 is being made more easier all the time, when new dependencies become available, any bugs are fixed, etc. So it is good to make all possible upgrading steps available.
-- Upgrade to newest 2.14 https://guide.meteor.com/2.14-migration . Currently xet7 is using newest 2.14.1-beta.0 in production release of WeKan https://forums.meteor.com/t/meteor-v2-14-1-beta-0-is-out/61142
-- Prepare for 3.0 https://guide.meteor.com/3.0-migration
-- Migrate Async
-  - Helper tool https://forums.meteor.com/t/blaze-async-migration-helper-babel-plugin-tracker-async-enhance-for-the-client-side-released/60842
-  - https://guide.meteor.com/prepare-meteor-3.0
-- Look at progress of migrated packages https://forums.meteor.com/t/looking-for-help-migrating-packages-to-meteor-3-0/60985
+## Videos about upgrading to Meteor 3
+
+- Storyteller
+  - 2024-07-15: WeKan Upgrades https://www.youtube.com/watch?v=Zjb3m9JsAD0
+  - 2024-07-08: Upgrading Meteor examples https://www.youtube.com/watch?v=jzWXxOe93t4
+  - Upcoming and past: https://www.youtube.com/@storytellercz/streams
+- React.js
+  - WeKan uses Blaze and Jade, not React.
+  - 2024-08-02:
+    - https://www.youtube.com/watch?v=NnT7AbVMnj4
+    - https://thenewstack.io/after-a-decade-of-react-is-frontend-a-post-react-world-now/
+    - https://thenewstack.io/pivoting-from-react-to-native-dom-apis-a-real-world-example/
+    - https://thenewstack.io/how-web-components-are-used-at-github-and-salesforce/
+    - https://devclass.com/2024/07/22/react-community-splitting-into-full-stack-and-client-only-camps-suggests-survey/
+    - https://news.ycombinator.com/item?id=41068685
+  - 2024-07-10: Storyteller at React Wroclaw Meetup, talking about Meteor.js and React: https://www.youtube.com/watch?v=4dnM6bXZCz4&t=741s
+  - How A Small Team of Developers Created React at Facebook | React.js: The Documentary https://www.youtube.com/watch?v=8pDqJVdNa44
+https://www.youtube.com/watch?v=8pDqJVdNa44
+- Meteor Dispatches Podcast
+  - 46: 2024-07-12: Packages you need in every app https://www.youtube.com/watch?v=S2YkZfKN0DI
+  - 25: 2024-02-09: WeKan Security https://www.youtube.com/watch?v=zic-h8jG6F8
+  - 16: 2023-12-08: WeKan interview https://www.youtube.com/watch?v=ke-mbnZM3zE
+  - Upcoming and past: https://www.youtube.com/@meteorjscommunity/streams
+  - Playlists: https://www.youtube.com/@meteorjscommunity/playlists
+  - Some recent also had info, how to make dependencies compatible with both Meteor 2 and Meteor 3
 - Add Eslint 3 and fix anything found
-  - https://youtu.be/rFjNNNc_7-E
+  - https://www.youtube.com/watch?v=rFjNNNc_7-E
   - https://github.com/quavedev/eslint-plugin
   - https://github.com/quavedev/meteor-template/pull/8
-- Watch Meteor Dispatches etc Podcasts https://www.youtube.com/@meteorjscommunity/playlists
-  - Some recent also had info, how to make dependencies compatible with both Meteor 2 and Meteor 3
+
+## Upgrading to Meteor 3
+
+- Meteor 3 migration guide: https://v3-migration-docs.meteor.com ( older pages at https://guide.meteor.com/3.0-migration or https://guide.meteor.com/prepare-meteor-3.0 )
+- Look at progress of migrated packages https://forums.meteor.com/t/looking-for-help-migrating-packages-to-meteor-3-0/60985
+- Migrate from Fibers (works only at Meteor 2 and Node.js 14) to Async/Await (works with Meteor 3 and Node.js 20)
+  - Helper tool https://forums.meteor.com/t/blaze-async-migration-helper-babel-plugin-tracker-async-enhance-for-the-client-side-released/60842
+  - Info how Async/Await works, from Storyteller: https://github.com/wekan/wekan/wiki/AsyncAwait
+- Forums posts about migrating: https://forums.meteor.com
+- ( Older version upgrade to newest 2.14 https://guide.meteor.com/2.14-migration )
+
+## Removing unused files
+
+From Meteor Discord chat from someone:
+
+> Nice tool that I found out about today. I was able to remove 58 unused files, functions, exports, types and dependencies 😄
+>
+> https://knip.dev
+
+## Lint
+
+From Meteor Discord chat from someone:
+
+> We started using https://biomejs.dev to replace eslint and prettier on Galaxy 2, and it's been amazing. It's speedy, easy to configure, and has fewer packages to care about.
+>
+> Just sharing it here in case someone has never heard about it before
+
+
+## Building WeKan
+
+- https://github.com/wekan/wekan/wiki/Emoji
+- Docs: https://github.com/wekan/wekan/tree/main/docs
+
+## Similar technology
+
+- https://en.wikipedia.org/wiki/JavaScript_engine
+- https://en.wikipedia.org/wiki/Single-page_application
+- https://en.wikipedia.org/wiki/Web_framework
+- https://en.wikipedia.org/wiki/Progressive_web_app
+- https://en.wikipedia.org/wiki/Web_2.0
+- https://en.wikipedia.org/wiki/Meteor_(web_framework)
+- https://en.wikipedia.org/wiki/Next.js

+ 0 - 0
docs/Platforms/Test-Edge.md → docs/DeveloperDocs/Test-Edge.md


+ 2 - 2
docs/Features/Python.md

@@ -1,5 +1,5 @@
 Some Python etc code in WeKan, that is not yet added directly to WeKan:
-- [LDAP sync script, that also correctly removes users](https://github.com/wekan/wekan/blob/main/ldap-sync/ldap-sync.py)
+- [LDAP sync script, that also correctly removes users](https://github.com/wekan/wekan/blob/main/docs/Login/ldap-sync/ldap-sync.py)
 - [Email notifications to AWS SES](https://github.com/wekan/wekan/issues/3543#issuecomment-1199897164)
 - [Prometheus Exporter](https://github.com/wekan/wekan-prometheus-exporter)
 - [Burndown Chart](Burndown-and-Velocity-Chart)
@@ -12,4 +12,4 @@ Some Python etc code in WeKan, that is not yet added directly to WeKan:
 - [Logstash and ElasticSearch](https://github.com/wekan/wekan-logstash)
 - iCal server in [Python](https://github.com/wekan/wekan-ical-server) and [PHP](https://github.com/wekan/wekan-ical-php)
 - [Sandstorm CSV related Python code](Wekan-Sandstorm-cards-to-CSV-using-Python)
-- [Trello API test code](https://github.com/wekan/wekan/tree/main/trello)
+- [Trello API test code](https://github.com/wekan/wekan/tree/main/docs/ImportExport/trello)

+ 0 - 0
asana/CHANGELOG.md → docs/ImportExport/asana/CHANGELOG.md


+ 0 - 0
asana/LICENSE → docs/ImportExport/asana/LICENSE


+ 0 - 0
asana/export_boards.pl → docs/ImportExport/asana/export_boards.pl


+ 0 - 0
asana/load_tasks.pl → docs/ImportExport/asana/load_tasks.pl


+ 0 - 0
trello/CHANGELOG.md → docs/ImportExport/trello/CHANGELOG.md


+ 0 - 0
trello/LICENSE → docs/ImportExport/trello/LICENSE


+ 0 - 0
docs/ImportExport/Migrating-from-Trello.md → docs/ImportExport/trello/Migrating-from-Trello.md


+ 0 - 0
docs/ImportExport/Wekan-vs-Trello-vs-Restyaboard.md → docs/ImportExport/trello/Wekan-vs-Trello-vs-Restyaboard.md


+ 0 - 0
trello/api.py → docs/ImportExport/trello/api.py


+ 0 - 0
trello/trello-project100.json → docs/ImportExport/trello/trello-project100.json


+ 12 - 0
docs/Login/Multitenancy.md

@@ -0,0 +1,12 @@
+Q: ​​Is Multi-tenancy like ability to configure multiple ROOT_URL for same Meteor app? Or having relative URLs?
+
+A: Yes
+
+https://www.youtube.com/watch?v=917v1a01-Ko
+
+https://github.com/Meteor-Community-Packages/meteor-partitioner
+
+Related:
+
+- https://www.enterpriseready.io
+- https://github.com/clinical-meteor/hipaa-audit-log

+ 0 - 0
docs/Platforms/OS/OAuth2.md → docs/Login/OAuth2.md


+ 29 - 1
docs/Login/SAML.md

@@ -1,4 +1,32 @@
-Related SAML code, not in WeKan yet: https://forums.meteor.com/t/what-are-you-working-on/59187
+Related Meteor SAML code, not in WeKan yet: 
+
+- New: https://forums.meteor.com/t/meteor-and-saml/61561
+- Old link: https://forums.meteor.com/t/what-are-you-working-on/59187
+
+Sandstorm has SAML login, and old WeKan that will be updated someday:
+
+- https://github.com/wekan/wekan/wiki/Sandstorm
+
+How SAML works:
+
+- https://ssoready.com/blog/engineering/a-gentle-intro-to-saml/
+- https://news.ycombinator.com/item?id=41036982
+- https://www.sheshbabu.com/posts/visual-explanation-of-saml-authentication/
+- https://news.ycombinator.com/item?id=41057814
+
+Ruby on Rails OmniAuth, that has Shibboleth and SAML:
+
+- https://github.com/omniauth/omniauth/wiki/List-of-Strategies
+- https://github.com/omniauth/omniauth
+
+SAML at SSOReady:
+
+- https://github.com/ssoready/ssoready
+- https://news.ycombinator.com/item?id=41110850
+
+The SSO Wall of Shame:
+
+- https://sso.tax
 
 [SAML Issue](https://github.com/wekan/wekan/issues/708)
 

+ 0 - 0
ldap-sync/ldap-sync.py → docs/Login/ldap-sync/ldap-sync.py


+ 0 - 0
docs/Platforms/OS/Android.md → docs/Platforms/FOSS/Android.md


+ 0 - 0
docs/Platforms/Cloud-Foundry.md → docs/Platforms/FOSS/Cloud-Foundry.md


+ 0 - 0
docs/Platforms/OS/Debian.md → docs/Platforms/FOSS/Debian.md


+ 0 - 0
docs/Docker/Docker.md → docs/Platforms/FOSS/Docker/Docker.md


+ 0 - 0
docs/Docker/Export-Docker-Mongo-Data.md → docs/Platforms/FOSS/Docker/Export-Docker-Mongo-Data.md


+ 0 - 0
docs/Docker/Install-Wekan-Docker-for-testing.md → docs/Platforms/FOSS/Docker/Install-Wekan-Docker-for-testing.md


+ 0 - 0
docs/Docker/Install-Wekan-Docker-in-production.md → docs/Platforms/FOSS/Docker/Install-Wekan-Docker-in-production.md


+ 0 - 0
docs/Docker/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1.md → docs/Platforms/FOSS/Docker/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1.md


+ 0 - 0
docs/Docker/Move-Docker-containers-to-other-computer.md → docs/Platforms/FOSS/Docker/Move-Docker-containers-to-other-computer.md


+ 0 - 0
docs/Docker/Rancher---Rancher-Active-Proxy---Wekan-MongoDB-Docker.md → docs/Platforms/FOSS/Docker/Rancher---Rancher-Active-Proxy---Wekan-MongoDB-Docker.md


+ 0 - 0
docs/Docker/Repair-Docker.md → docs/Platforms/FOSS/Docker/Repair-Docker.md


+ 0 - 0
docs/Platforms/OS/FreeBSD.md → docs/Platforms/FOSS/FreeBSD.md


+ 0 - 0
docs/Platforms/Friend.md → docs/Platforms/FOSS/Friend.md


+ 0 - 0
docs/Platforms/Helm.md → docs/Platforms/FOSS/Helm.md


+ 0 - 0
helm.md → docs/Platforms/FOSS/Helm2.md


+ 0 - 0
docs/Platforms/OpenShift.md → docs/Platforms/FOSS/OpenShift/OpenShift.md


+ 0 - 0
openshift/README.md → docs/Platforms/FOSS/OpenShift/README.md


+ 0 - 0
openshift/wekan.yml → docs/Platforms/FOSS/OpenShift/wekan.yml


+ 0 - 0
docs/Platforms/OS/OpenSuse.md → docs/Platforms/FOSS/OpenSuse.md


+ 0 - 0
docs/Platforms/Platforms.md → docs/Platforms/FOSS/Platforms.md


+ 0 - 0
docs/ImportExport/Export-from-Wekan-Sandstorm-grain-.zip-file.md → docs/Platforms/FOSS/Sandstorm/Export-from-Wekan-Sandstorm-grain-.zip-file.md


+ 0 - 0
docs/Platforms/Sandstorm.md → docs/Platforms/FOSS/Sandstorm/Sandstorm.md


+ 0 - 0
docs/ImportExport/Wekan-Sandstorm-cards-to-CSV-using-Python.md → docs/Platforms/FOSS/Sandstorm/Wekan-Sandstorm-cards-to-CSV-using-Python.md


+ 0 - 0
docs/Platforms/Wekan-vs-Sandstorm.md → docs/Platforms/FOSS/Sandstorm/Wekan-vs-Sandstorm.md


+ 0 - 0
docs/Platforms/SmartOS.md → docs/Platforms/FOSS/SmartOS.md


+ 0 - 0
docs/Snap/Automatic-update-schedule.md → docs/Platforms/FOSS/Snap/Automatic-update-schedule.md


+ 0 - 0
docs/Snap/Backup-and-restore.md → docs/Platforms/FOSS/Snap/Backup-and-restore.md


+ 0 - 0
docs/Snap/Candidate-WeKan-Snap-Manual-Upgrade.md → docs/Platforms/FOSS/Snap/Candidate-WeKan-Snap-Manual-Upgrade.md


+ 0 - 0
docs/Snap/CentOS-7.md → docs/Platforms/FOSS/Snap/CentOS-7.md


+ 0 - 0
docs/Snap/CentOS8.md → docs/Platforms/FOSS/Snap/CentOS8.md


+ 0 - 0
docs/Snap/Home.md → docs/Platforms/FOSS/Snap/Home.md


+ 0 - 0
docs/Snap/Install-snap-with-Ansible.md → docs/Platforms/FOSS/Snap/Install-snap-with-Ansible.md


+ 0 - 0
docs/Snap/Install.md → docs/Platforms/FOSS/Snap/Install.md


+ 0 - 0
docs/Snap/Limit-snap-to-root-user-only.md → docs/Platforms/FOSS/Snap/Limit-snap-to-root-user-only.md


+ 0 - 0
docs/Snap/Making-releases-from-source.md → docs/Platforms/FOSS/Snap/Making-releases-from-source.md


+ 0 - 0
docs/Snap/Making-releases.md → docs/Platforms/FOSS/Snap/Making-releases.md


+ 0 - 0
docs/Snap/Many-Snaps-on-LXC.md → docs/Platforms/FOSS/Snap/Many-Snaps-on-LXC.md


+ 0 - 0
docs/Snap/Old-Making-releases.md → docs/Platforms/FOSS/Snap/Old-Making-releases.md


+ 0 - 0
docs/Snap/OpenSuse.md → docs/Platforms/FOSS/Snap/OpenSuse.md


+ 0 - 0
docs/Snap/Sharing-MongoDB.md → docs/Platforms/FOSS/Snap/Sharing-MongoDB.md


+ 0 - 0
docs/Platforms/Snap.md → docs/Platforms/FOSS/Snap/Snap.md


+ 0 - 0
docs/Snap/Supported-settings-keys.md → docs/Platforms/FOSS/Snap/Supported-settings-keys.md


+ 0 - 0
docs/Snap/Testing-new-WeKan-Snap-versions.md → docs/Platforms/FOSS/Snap/Testing-new-WeKan-Snap-versions.md


+ 0 - 0
docs/Snap/Troubleshooting.md → docs/Platforms/FOSS/Snap/Troubleshooting.md


+ 0 - 0
docs/Snap/Uninstall.md → docs/Platforms/FOSS/Snap/Uninstall.md


+ 0 - 0
docs/Snap/Update-all-snap-packages.md → docs/Platforms/FOSS/Snap/Update-all-snap-packages.md


+ 0 - 0
docs/Platforms/OS/Install-and-Update.md → docs/Platforms/FOSS/Source/Install-and-Update.md


+ 0 - 0
docs/Platforms/OS/Install-from-source-without-root.md → docs/Platforms/FOSS/Source/Install-from-source-without-root.md


+ 0 - 0
docs/Platforms/OS/Install-source-without-sudo-on-Linux.md → docs/Platforms/FOSS/Source/Install-source-without-sudo-on-Linux.md


+ 0 - 0
docs/Platforms/Raspberry-Pi.md → docs/Platforms/FOSS/Source/Raspberry-Pi.md


部分文件因文件數量過多而無法顯示