Compare commits

...
146 Commits
Author SHA1 Message Date
github-actions[bot] 129af0bad9 v8.97 2026-04-16 10:02:21 +00:00
Lauri Ojansivu a9d95dd6b7 Prepare v8.97 release 2026-04-16 13:01:42 +03:00
Lauri Ojansivu 6d0978d0ed Release Scripts: Clean GitHub Cache. Part 3.
Thanks to xet7 !
2026-04-16 13:00:39 +03:00
Lauri Ojansivu 13cdf08e22 Release Scripts: Clean GitHub Cache. Part 2.
Thanks to xet7 !
2026-04-16 12:56:52 +03:00
Lauri Ojansivu e59bc9cd86 Release Scripts: Clean GitHub Cache.
Thanks to xet7 !
2026-04-16 12:53:42 +03:00
Lauri Ojansivu 6478d27d1c Fix GitHub Actions builds.
Thanks to xet7 !
2026-04-16 12:49:37 +03:00
Lauri Ojansivu 76d1800ec7 Prepare v8.96 release 2026-04-16 12:46:15 +03:00
Lauri Ojansivu 03ba747bc0 Fix GitHub Actions builds.
Thanks to xet7 !
2026-04-16 12:43:35 +03:00
Lauri Ojansivu 9eb3889d51 Prepare v8.95 release 2026-04-16 12:33:53 +03:00
Lauri Ojansivu 5d4bc7a886 Updated ChangeLog. 2026-04-16 12:31:58 +03:00
Lauri Ojansivu 135af977af Helm Chart: Use current Finland time for created field at index.yaml for newest built Helm Chart release.
Thanks to xet7 !
2026-04-16 12:26:44 +03:00
Lauri Ojansivu 6dfe81cbcb Fix Cannot find module /build/main.js error in latest Docker image.
Thanks to s8321414 and xet7 !

Fixes #6291
2026-04-16 12:16:58 +03:00
Lauri Ojansivu 3ec2821058 Updated ChangeLog. 2026-04-16 12:04:27 +03:00
Lauri Ojansivu 1c5ac8efba Merge pull request #6292 from titver968/helm-improvements
helm: add single-node ReplicaSet support with auto MONGO_OPLOG_URL
2026-04-16 12:00:01 +03:00
titver968 ce7fa0e314 helm: add single-node ReplicaSet support with auto MONGO_OPLOG_URL
- mongodb.url template now appends ?replicaSet=<name> for single-replica
  setups when mongodb.replicaSet.name is set, eliminating the need for
  a secretEnv workaround
- New mongodb.oplog.url helper generates MONGO_OPLOG_URL automatically
  when a ReplicaSet is configured (single-node or multi-node)
- deployment.yaml injects MONGO_OPLOG_URL env var when the oplog URL
  helper produces a non-empty value
- values.yaml documents the replicaSet.name option with example config
2026-04-16 09:58:44 +02:00
github-actions[bot] 0f464b21a3 Helm chart 8.94.0 2026-04-16 02:34:48 +00:00
github-actions[bot] 7169da8dae v8.94 2026-04-16 02:15:31 +00:00
Lauri Ojansivu 0f56e2dfc3 Prepare v8.94 release 2026-04-16 05:14:48 +03:00
Lauri Ojansivu 1b086c80a7 Updated ChangeLog. 2026-04-16 05:12:42 +03:00
Lauri Ojansivu c27d5d0412 Updated dompurify.
Thanks to developers of dompurify !
2026-04-16 05:10:59 +03:00
Lauri Ojansivu 7b3043bf46 Updated ChangeLog. 2026-04-16 05:09:46 +03:00
Lauri Ojansivu da19160e87 Fix Can't start latest docker image because of MongoDB Index errors.
Thanks to s8321414 and xet7 !

Fixes #6290
2026-04-16 05:09:46 +03:00
github-actions[bot] 790a801f30 Helm chart 8.93.0 2026-04-16 02:07:36 +00:00
github-actions[bot] b08c66a483 v8.93 2026-04-16 01:48:41 +00:00
Lauri Ojansivu 524aa9124d Prepare v8.93 release 2026-04-16 04:48:01 +03:00
Lauri Ojansivu df85b5ac45 Updated ChangeLog. 2026-04-16 04:44:04 +03:00
Lauri Ojansivu c009ddc915 Fix SSO Login broken. Part 2.
Thanks to xet7 !

Fixes #6276
2026-04-16 04:44:04 +03:00
github-actions[bot] 5407e4533c Helm chart 8.92.0 2026-04-16 01:08:11 +00:00
github-actions[bot] 98088c7734 v8.92 2026-04-16 00:49:02 +00:00
Lauri Ojansivu 0d6fb33043 Prepare v8.92 release 2026-04-16 03:48:15 +03:00
Lauri Ojansivu 1dbad1b454 Updated ChangeLog. 2026-04-16 03:44:46 +03:00
Lauri Ojansivu 2c8a6c8ec6 GitHub Actions: Added missing sudo to snap build.
Thanks to xet7 !
2026-04-16 03:42:56 +03:00
Lauri Ojansivu 06b9946dd8 Updated ChangeLog. 2026-04-16 03:36:32 +03:00
Lauri Ojansivu dbcdf15244 Updated Helm Charts versions.
Thanks to xet7 !
2026-04-16 03:36:32 +03:00
github-actions[bot] 7e2067d0b1 v8.91 2026-04-16 00:21:29 +00:00
Lauri Ojansivu 7489f720ea Prepare v8.91 release 2026-04-16 03:02:50 +03:00
Lauri Ojansivu 140e844238 Updated Helm Chart URL at readme.
Thanks to xet7 !
2026-04-16 03:02:50 +03:00
Lauri Ojansivu de55d5afbe Fix building Snap at GitHub Actions.
Thanks to xet7 !
2026-04-16 03:02:50 +03:00
github-actions[bot] c5fccb52cc Helm chart 8.90.0 2026-04-15 23:50:03 +00:00
github-actions[bot] 507ca57a50 v8.90 2026-04-15 23:28:22 +00:00
Lauri Ojansivu b2e072e02c Prepare v8.90 release 2026-04-16 02:27:44 +03:00
Lauri Ojansivu 357f63d01f Release scripts: Moved more steps to GitHub Actions.
Thanks to xet7 !
2026-04-16 02:24:17 +03:00
Lauri Ojansivu e6422d842a Updated ChangeLog. 2026-04-16 02:02:33 +03:00
Lauri Ojansivu 99519af83a Changed ArtifactHub from wekan/charts repo to wekan/wekan repo.
Thanks to xet7 !
2026-04-16 02:00:47 +03:00
Lauri Ojansivu 514ce6ad24 Updated ChangeLog. 2026-04-16 01:52:33 +03:00
Lauri Ojansivu f57ce52198 Added GitHub Actions for Docker and Snap. Moved Helm Charts from charts repo to wekan repo.
Thanks to xet7 !
2026-04-16 01:49:42 +03:00
Lauri Ojansivu 2a9c921ba6 Updated ChangeLog. 2026-04-16 00:54:13 +03:00
Lauri Ojansivu 0dd924f148 Removed jam:offline jam:method jam:pub-sub, because they are not used, and they cause too much database usage.
Thanks to xet7 !
2026-04-16 00:50:58 +03:00
Lauri Ojansivu 678eb0896d v8.89 2026-04-15 23:01:39 +03:00
Lauri Ojansivu 233c1c8e81 Updated ChangeLog. 2026-04-15 22:57:58 +03:00
Lauri Ojansivu f6a851a3d8 Disable jam:offline keepAll BEFORE any collections are created. Part 2.
Thanks to xet7 !
2026-04-15 22:56:01 +03:00
Lauri Ojansivu 4fba9d7802 v8.88 2026-04-15 21:45:44 +03:00
Lauri Ojansivu d41ecb054c Updated ChangeLog. 2026-04-15 21:37:09 +03:00
Lauri Ojansivu ec0c1bc9af Disable jam:offline keepAll to prevent full-collection COLLSCAN queries and Ensure standard GridFS index on attachments.chunks for efficient chunk lookups.
Disable jam:offline keepAll to prevent full-collection COLLSCAN queries.
WeKan uses modifiedAt (not updatedAt) and archived (not deleted),
so the default offline sync generates queries on non-existent fields
causing massive collection scans on every sync cycle.

Ensure standard GridFS index on attachments.chunks for efficient chunk lookups.
Without this, queries like find({files_id: ObjectId}) do full collection scans.
2026-04-15 21:33:18 +03:00
Lauri Ojansivu 05b77d24fa v8.87 2026-04-15 17:39:22 +03:00
Lauri Ojansivu 4535303807 Updated ChangeLog. 2026-04-15 17:37:33 +03:00
Lauri Ojansivu f232fdc30b Merge pull request #6287 from FlorentDotMe/fix_quick-access-scroll
ui: enable the horizontal scroll in the quick access menu boards list
2026-04-15 17:36:24 +03:00
Lauri Ojansivu dab72d80dc Updated ChangeLog. 2026-04-15 17:35:55 +03:00
Lauri Ojansivu 6f83464b24 Merge pull request #6286 from FlorentDotMe/fix_rooturl-as-env-variable
improve handling of ROOT_URL as an environement variable
2026-04-15 17:34:48 +03:00
Lauri Ojansivu 41cd0a8925 Updated ChangeLog. 2026-04-15 17:34:35 +03:00
Lauri Ojansivu fc02a15753 Try to fix Snap.
Thanks to xet7 !
2026-04-15 17:31:09 +03:00
Florent Bervas bd9c5a058a improve handling of ROOT_URL as an environement variable 2026-04-15 13:47:28 +00:00
Lauri Ojansivu c1692cc6b9 v8.86 2026-04-15 16:29:44 +03:00
Florent Bervas 5259c09a5c ui: enable the horizontal scroll in the quick access menu boards list 2026-04-15 13:28:08 +00:00
Lauri Ojansivu 10f801d31b Try to fix Snap.
Thanks to xet7 !
2026-04-15 16:25:06 +03:00
Lauri Ojansivu 28d19db328 v8.85 2026-04-15 16:02:59 +03:00
Lauri Ojansivu 0e13bfc50e Try to fix Snap.
Thanks to xet7 !
2026-04-15 16:00:33 +03:00
Lauri Ojansivu 4f4aa22ca1 v8.84 2026-04-15 15:29:15 +03:00
Lauri Ojansivu 6bec01198d Updated ChangeLog. 2026-04-15 15:27:02 +03:00
Lauri Ojansivu 5dbceb43b4 Updated ChangeLog. 2026-04-15 15:17:14 +03:00
Lauri Ojansivu bc92978fa9 Try to fix Snap Candidate.
Thanks to xet7 !
2026-04-15 15:16:02 +03:00
Lauri Ojansivu 893f83b79e Updated ChangeLog. 2026-04-15 15:09:53 +03:00
Lauri Ojansivu bde23f6c4d Merge pull request #6284 from cloudron-io/oidc-login-fix
Use local content variable in error case
2026-04-15 15:05:53 +03:00
Johannes Zellner e6d4b38c64 Use local content variable in error case 2026-04-15 10:27:53 +02:00
Lauri Ojansivu 23264044e6 v8.83 2026-04-14 21:39:23 +03:00
Lauri Ojansivu d51a381a79 Updated ChangeLog. 2026-04-14 21:32:31 +03:00
Lauri Ojansivu da4459304f Changed start-wekan.sh and start-wekan.bat to not use Change Streams.
Thanks to xet7 !
2026-04-14 21:31:08 +03:00
Lauri Ojansivu 085699f202 Updated ChangeLog. 2026-04-14 01:12:42 +03:00
Lauri Ojansivu 2c43aa463a Release scripts: Fix Node.js 24.x download URL for Snap builds.
Thanks to xet7 !
2026-04-14 01:09:26 +03:00
Lauri Ojansivu 41db7b4ad1 Release scripts: Docker not for armhf, no official Node.js binary for it.
Thanks to xet7 !
2026-04-14 00:58:35 +03:00
Lauri Ojansivu d0a9fa9a71 Release scripts: Removed armhf, there is no official Node.js binary for it.
Thanks to xet7 !
2026-04-14 00:38:55 +03:00
Lauri Ojansivu ed0675aaff v8.82 2026-04-14 00:37:28 +03:00
Lauri Ojansivu cad8f58468 Merge pull request #6282 from wekan/dependabot/github_actions/docker/build-push-action-7.1.0
Bump docker/build-push-action from 7.0.0 to 7.1.0
2026-04-14 00:31:12 +03:00
Lauri Ojansivu 819d58cf31 Merge pull request #6281 from wekan/dependabot/github_actions/softprops/action-gh-release-3
Bump softprops/action-gh-release from 2 to 3
2026-04-14 00:30:43 +03:00
dependabot[bot] b951515e3e Bump docker/build-push-action from 7.0.0 to 7.1.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.0.0 to 7.1.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/d08e5c354a6adb9ed34480a06d141179aa583294...bcafcacb16a39f128d818304e6c9c0c18556b85f)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 21:24:10 +00:00
dependabot[bot] 4c3265bca5 Bump softprops/action-gh-release from 2 to 3
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 21:24:05 +00:00
Lauri Ojansivu 11672a13f7 Release scripts: Added script for deleting repo git tag.
Thanks to xet7 !
2026-04-14 00:19:15 +03:00
Lauri Ojansivu 9a8141a0eb v8.81 2026-04-14 00:16:28 +03:00
Lauri Ojansivu 5462fb0647 Release scripts: Comment out build for armhf because no official Node.js 24.x binaries exist for armhf (arm/v7).
Thanks to xet7 !
2026-04-14 00:10:51 +03:00
Lauri Ojansivu 6b74b8f770 v8.81 2026-04-13 22:57:32 +03:00
Lauri Ojansivu 99fff1a1a1 Updated ChangeLog. 2026-04-13 20:25:00 +03:00
Lauri Ojansivu 645f233b83 Merge pull request #6279 from kolaente/patch-1
fix(exporter): attachments always empty in board JSON export
2026-04-13 20:22:38 +03:00
kolaente 643e2738bd fix(exporter): attachments always empty in board JSON export 2026-04-13 18:15:48 +02:00
Lauri Ojansivu cd356a29ce Updated translations. 2026-04-13 17:16:10 +03:00
Lauri Ojansivu 341be982f9 Updated ChangeLog. 2026-04-13 17:14:21 +03:00
Lauri Ojansivu 2e7565f9eb Docs: Added History of Schema Migration Systems.
Thanks to xet7 !
2026-04-13 17:13:00 +03:00
Lauri Ojansivu 1637a9c938 Updated dependencies.
Thanks to developers of dependencies !
2026-04-13 17:11:04 +03:00
Lauri Ojansivu 67c2be1858 Updated ChangeLog. 2026-04-13 16:25:14 +03:00
Lauri Ojansivu b8d4c01e60 Updated ChangeLog. 2026-04-13 16:23:41 +03:00
Lauri Ojansivu e259ab86f7 Updated dependencies.
Thanks to developers of dependencies !
2026-04-13 16:23:41 +03:00
Lauri Ojansivu 029b3523cb Merge pull request #6275 from KhaoulaMaleh/fix/export
Fix: include historical comments and activities in board exports
2026-04-13 16:21:02 +03:00
KhaoulaMaleh f4657ad817 Fix: include historical comments and activities in board exports 2026-04-13 00:12:57 -11:00
Lauri Ojansivu 5efddff154 Updated translations. 2026-04-12 17:35:51 +03:00
Lauri Ojansivu 25efe93507 Updated ChangeLog. 2026-04-12 17:31:27 +03:00
Lauri Ojansivu a393e67ef8 Merge pull request #6262 from Raawen-dev/first-fix
Fix Issue #6069: Add migration for v7.95 due dates
2026-04-12 17:29:21 +03:00
Lauri Ojansivu 7f6758cbe9 Merge pull request #6268 from YosserDerbali/fix/board-drag-tooltip-clarification
Clarify board drag tooltip text in Remaining and Workspaces
2026-04-12 17:28:48 +03:00
Lauri Ojansivu c5644a3321 Updated ChangeLog. 2026-04-12 17:28:38 +03:00
Lauri Ojansivu 4fec03101f Updated ChangeLog. 2026-04-12 17:27:32 +03:00
Lauri Ojansivu 10fed0a85c Merge pull request #6271 from YosserDerbali/fix/readme-node-version-and-changes-made
Fix/readme node version and changes made
2026-04-12 17:25:51 +03:00
Lauri Ojansivu fff6316192 Updated ChangeLog. 2026-04-12 17:23:19 +03:00
Lauri Ojansivu 61623f50b1 Merge pull request #6273 from AymenHassini19/solve-white-container-“Link-Card”-dialog
Fix Link Card modal overflow in Docker environment
2026-04-12 17:21:59 +03:00
Lauri Ojansivu 9f626407cf Updated ChangeLog. 2026-04-12 17:20:26 +03:00
Lauri Ojansivu 3a51678495 Merge pull request #6272 from snowsky/fix-activities-not-showing
Fix activities are not showing
2026-04-12 17:14:02 +03:00
Aymen Hassini c730a0e733 Add missing Meteor test dependencies 2026-04-12 10:17:18 +01:00
Aymen Hassini 80a9971508 solving white container "Link Card" 2026-04-12 09:31:49 +01:00
Hao Wang 85788e1d7d Fix activities are not showing 2026-04-11 19:39:27 +00:00
Yosser Derbali 23680547ea docs: update README to Node.js 24.x and remove Rosetta mention 2026-04-11 14:30:04 +01:00
Yosser Derbali 9767ead9f3 docs: update README Node.js version and setup guidance 2026-04-10 22:26:16 +01:00
Yosser Derbali 910c9a7f1f docs: improve README with first-time setup guide and fix typos 2026-04-10 22:24:40 +01:00
Yosser Derbali 0bc6c6abb6 docs: fix typos and grammar in SECURITY.md
- Fix capitalization: 'About Money', 'QA About PubSub', etc.
- Add missing articles ('the', 'a')
- Fix spelling: 'Wordwide' -> 'Worldwide', 'logics' -> 'logic'
- Remove duplicate 'by' and extra spaces
- Fix grammar and sentence structure for clarity
- Improve consistency with WeKan capitalization
2026-04-10 22:24:40 +01:00
Yosser Derbali 6361e16dba Clarify board drag tooltip text 2026-04-10 18:21:04 +01:00
Lauri Ojansivu 8572cbd761 v8.80 2026-04-10 11:56:56 +03:00
Lauri Ojansivu 1c0b91c5f4 Updated translations. 2026-04-10 11:56:25 +03:00
Lauri Ojansivu 2ebefdd0bf Try to fix GitHub Actions builds with custom newer bcrypt.
Thanks to xet7 !
2026-04-10 11:53:09 +03:00
Lauri Ojansivu 29f1384945 v8.79 2026-04-09 16:00:52 +03:00
Lauri Ojansivu 334e569fda Updated translations. 2026-04-09 15:58:41 +03:00
Lauri Ojansivu 2d4170a9bf Fix 8.78: WeKan build Error: Could not find rspack config. Using MongoDB Change Streams at start-wekan.sh start-wekan.bat bundle, docker-compose.yml and Snap Candidate.
Thanks to nachocodoner and xet7 !

Fixes #6264
2026-04-09 15:42:05 +03:00
Lauri Ojansivu 6b2759f97d v8.78 2026-04-09 04:52:05 +03:00
Lauri Ojansivu adf4312e5a v8.77 2026-04-09 04:40:21 +03:00
Lauri Ojansivu b1707b8691 Upgraded to Meteor 3.5-beta.7
Thanks to Meteor developers !
2026-04-09 04:37:36 +03:00
Lauri Ojansivu 25dff3f2da v8.76 2026-04-09 04:19:51 +03:00
Lauri Ojansivu bc88c0dfc2 Fix GitHub Actions builds.
Thanks to xet7 !
2026-04-09 04:14:46 +03:00
Lauri Ojansivu 1ca2dfd1b1 v8.75 2026-04-09 03:58:01 +03:00
Lauri Ojansivu bdb9274485 Updated to Node.js 24.x at release scripts.
Thanks to xet7 !
2026-04-09 03:56:06 +03:00
Lauri Ojansivu 14f9ac39ad Upgraded to Meteor 3.5-beta.7 and Node.js 24.14.1. Now prefers MongoDB Change Streams at Snap Candidate and docker-compose.yml.
Thanks to Meteor developers and xet7 !
2026-04-09 03:44:58 +03:00
Lauri Ojansivu d4b52f7de9 Updated ChangeLog. 2026-04-09 02:19:44 +03:00
Lauri Ojansivu bdc65ec6f4 Merge pull request #6261 from KhaoulaMaleh/fix/translation-refinement
Refine translations
2026-04-08 23:30:39 +03:00
RAWEN KHEFIFI 74966a0bc7 Fix Issue #6069: Add migration for v7.95 due dates
- Add migration script to convert dueDate to dueAt
- Convert string dates to Date objects
- Add missing userId and members fields
- Fix invalid board/list/swimlane references

This fixes cards not appearing in Due Cards view after migration from v7.95 to v8.20
2026-04-08 16:44:19 +01:00
KhaoulaMaleh 7fb31cecd5 fix refinement 2026-04-08 00:45:27 -11:00
KhaoulaMaleh 317c82a9f0 fixed after review 2026-04-08 00:16:18 -11:00
KhaoulaMaleh 9b5c89d235 Enhance translations with new key:value pairs 2026-04-07 23:36:43 -11:00
Lauri Ojansivu c23e190e8e Updated ChangeLog. 2026-04-08 02:16:21 +03:00
Lauri Ojansivu 4a73371499 Merge pull request #6260 from KhaoulaMaleh/fix/Card_setting_checkbox
fixed Card settings checkboxes
2026-04-08 02:14:28 +03:00
KhaoulaMaleh 6f8af55489 fixed Card settings checkboxes 2026-04-08 00:04:48 -11:00
Lauri Ojansivu 2a05f62bf9 Updated ChangeLog. 2026-04-08 01:49:33 +03:00
Lauri Ojansivu d6eb1eb76f Merge pull request #6259 from KhaoulaMaleh/fix/enhance_translation
Enhance translations with new key:value pairs
2026-04-08 01:46:33 +03:00
425 changed files with 10809 additions and 1889 deletions

No files matched your search

+1 -1
View File
@@ -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@d08e5c354a6adb9ed34480a06d141179aa583294
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
+409 -186
View File
@@ -1,36 +1,125 @@
name: Release All Platforms
# Triggered when maintainer pushes a version tag, e.g.: git tag v8.43 && git push --tags
# Does not work:
# Required GitHub Secrets:
# QUAY_USERNAME - Quay.io username
# QUAY_PASSWORD - Quay.io password or token
# DOCKERHUB_USERNAME - Docker Hub username
# DOCKERHUB_TOKEN - Docker Hub access token
# SNAP_STORE_LOGIN - Snapcraft store credentials: run 'snapcraft export-login --snaps wekan --channels stable -' and base64-encode the output
# Triggered manually via GitHub CLI or Actions UI.
# Usage:
# gh workflow run release-all.yml -f old_version=8.42 -f new_version=8.43
#
# Or use the convenience script (commits pending changes, pushes, and triggers):
# ./releases/release-all.sh 8.42 8.43
#
# Required GitHub Secrets:
# GHCR_AUTH - base64(username:token) for ghcr.io
# DOCKERHUB_AUTH - base64(username:token) for Docker Hub
# QUAY_AUTH - base64(username:token) for Quay.io
# SNAP_AUTH - Snapcraft store credentials
on:
push:
tags:
- 'v*.*'
workflow_dispatch:
inputs:
old_version:
description: 'Previous version number (e.g. 8.42, without v prefix)'
required: true
type: string
new_version:
description: 'New version number (e.g. 8.43, without v prefix)'
required: true
type: string
permissions:
contents: write
packages: write
pages: write
id-token: write
jobs:
# ─── 0. Version bump, docs rebuild, and tag creation ────────────────────────
# Runs update-node-version.sh, rebuild-docs.sh, and sed-release-versions.sh,
# then commits, pushes, and creates the version tag.
# Skipped on re-run if the tag already exists.
version-bump:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check if tag already exists
id: check
run: |
if git ls-remote --tags origin | grep -q "refs/tags/v${{ inputs.new_version }}$"; then
echo "existed=true" >> $GITHUB_OUTPUT
echo "Tag v${{ inputs.new_version }} already exists. Skipping version bump."
else
echo "existed=false" >> $GITHUB_OUTPUT
fi
- uses: actions/setup-node@v6
if: steps.check.outputs.existed == 'false'
with:
node-version: '24.14.1'
- name: Install Python dependencies for API doc generation
if: steps.check.outputs.existed == 'false'
run: python3 -m pip install --break-system-packages esprima
- name: Delete GitHub Actions caches
if: steps.check.outputs.existed == 'false'
env:
GH_TOKEN: ${{ github.token }}
run: gh cache delete --all || true
- name: Update Node.js to latest 24.x
if: steps.check.outputs.existed == 'false'
run: ./releases/update-node-version.sh
- name: Rebuild API docs
if: steps.check.outputs.existed == 'false'
run: ./releases/rebuild-docs.sh "${{ inputs.new_version }}"
- name: Update version numbers in release files
if: steps.check.outputs.existed == 'false'
run: ./releases/sed-release-versions.sh "${{ inputs.old_version }}" "${{ inputs.new_version }}"
- name: Commit and push version bump
if: steps.check.outputs.existed == 'false'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add --all
# GITHUB_TOKEN cannot push workflow file changes; exclude them
git reset HEAD -- .github/workflows/ || true
git checkout -- .github/workflows/ || true
if git diff --cached --quiet; then
echo "No changes to commit."
else
git commit -m "v${{ inputs.new_version }}"
fi
git push
- name: Create and push tag
if: steps.check.outputs.existed == 'false'
run: |
git tag -a "v${{ inputs.new_version }}" -m "v${{ inputs.new_version }}"
git push origin "v${{ inputs.new_version }}"
# ─── 1. Extract version and release notes ───────────────────────────────────
prepare:
needs: version-bump
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
changelog: ${{ steps.changelog.outputs.content }}
steps:
- uses: actions/checkout@v6
with:
ref: refs/tags/v${{ inputs.new_version }}
- name: Extract version from tag
- name: Set version from input
id: version
run: echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
run: |
VERSION="${{ inputs.new_version }}"
VERSION="${VERSION#v}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Extract release notes from CHANGELOG.md
id: changelog
@@ -60,12 +149,12 @@ jobs:
echo "GHEOF" >> $GITHUB_OUTPUT
# ─── 2. Build amd64 bundle (full Meteor 3 build) ────────────────────────────
# Meteor 3.4 installer supports only: Linux x86_64, Linux aarch64, macOS, Windows.
# Meteor 3.5-beta.7 installer supports only: Linux x86_64, Linux aarch64, macOS, Windows.
# It explicitly rejects armhf, s390x, and ppc64le at install time.
# Therefore the full Meteor build always runs here on x86_64.
# All other Linux architectures then rebuild only the native npm modules
# from this bundle (much faster than a full Meteor build).
# Node.js version must match what Meteor 3.4 bundles: 22.22.2 (ABI 127).
# Node.js version must match what Meteor 3.5-beta.7 bundles: 24.14.1 (ABI 143).
build-amd64:
needs: prepare
runs-on: ubuntu-24.04
@@ -74,6 +163,8 @@ jobs:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@v6
with:
ref: refs/tags/v${{ inputs.new_version }}
- name: Cache Meteor installation
uses: actions/cache@v5
@@ -93,11 +184,11 @@ jobs:
sudo apt-get update
sudo apt-get install -y build-essential g++ make python3 curl wget zip unzip
# Pin to Node 22.22.2 — the exact version bundled by Meteor 3.4.
# Pin to Node 24.14.1 — the exact version bundled by Meteor 3.5-beta.7.
# Using the same version for build and npm rebuild ensures consistent native module ABI.
- uses: actions/setup-node@v6
with:
node-version: '22.22.2'
node-version: '24.14.1'
- name: Install Meteor
run: |
@@ -109,13 +200,8 @@ jobs:
- name: Build WeKan bundle
run: |
rm -rf .build node_modules .meteor/local
meteor npm install
meteor build .build --directory --platforms=web.browser
- name: Install dependencies in bundle
run: |
cd .build/bundle/programs/server
npm install
(meteor update --npm 2>/dev/null || true) && meteor npm install
meteor build .build --directory
- name: Create amd64 zip
run: |
@@ -129,7 +215,7 @@ jobs:
retention-days: 1
# ─── 3. Build arm64 bundle (rebuild native modules natively) ─────────────────
# Meteor 3.4 does support Linux aarch64, but running a full Meteor build a
# Meteor 3.5-beta.7 does support Linux aarch64, but running a full Meteor build a
# second time would double the build time for the same result. npm rebuild on
# the native arm64 GitHub Actions runner is much faster and produces the same
# platform-specific native modules.
@@ -147,7 +233,7 @@ jobs:
- uses: actions/setup-node@v6
with:
node-version: '22.22.2'
node-version: '24.14.1'
- name: Download amd64 bundle
uses: actions/download-artifact@v8
@@ -157,6 +243,20 @@ jobs:
- name: Rebuild native modules for arm64
run: |
unzip wekan-${VERSION}-amd64.zip
# Fix: bcrypt 5.0.1 (Meteor accounts-password) ships node-addon-api@3
# which fails to compile on Node.js 24. Replace with bcrypt 6.0.0.
BCRYPT_DIR="$(pwd)/bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/bcrypt"
if [ -d "$BCRYPT_DIR" ]; then
rm -rf "$BCRYPT_DIR"
TMP=$(mktemp -d)
pushd "$TMP" > /dev/null
npm pack bcrypt@6.0.0
mkdir bcrypt && tar xzf bcrypt-*.tgz --strip-components=1 -C bcrypt
cd bcrypt && npm install --ignore-scripts && cd ..
cp -a bcrypt "$BCRYPT_DIR"
popd > /dev/null
rm -rf "$TMP"
fi
cd bundle/programs/server
rm -rf node_modules
npm install
@@ -173,10 +273,10 @@ jobs:
retention-days: 1
# ─── 4. Build s390x bundle (rebuild native modules via QEMU container) ───────
# Meteor 3.4 does NOT support s390x (installer exits with error on that arch).
# Meteor 3.5-beta.7 does NOT support s390x (installer exits with error on that arch).
# GitHub Actions has no native s390x runners.
# Solution: QEMU emulation + node:22.22.2-slim (s390x variant) for npm rebuild.
# node:22.22.2-slim is pinned to match Meteor 3.4's bundled Node.js version exactly.
# Solution: QEMU emulation + node:24.14.1-slim (s390x variant) for npm rebuild.
# node:24.14.1-slim is pinned to match Meteor 3.5-beta.7's bundled Node.js version exactly.
build-s390x:
needs: [prepare, build-amd64]
runs-on: ubuntu-latest
@@ -201,11 +301,25 @@ jobs:
run: |
unzip wekan-${VERSION}-amd64.zip
rm -rf bundle/programs/server/node_modules
# node:22.22.2-slim s390x — same Node.js version as Meteor 3.4 bundled
# Fix: bcrypt 5.0.1 (Meteor accounts-password) ships node-addon-api@3
# which fails to compile on Node.js 24. Replace with bcrypt 6.0.0.
BCRYPT_DIR="$(pwd)/bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/bcrypt"
if [ -d "$BCRYPT_DIR" ]; then
rm -rf "$BCRYPT_DIR"
TMP=$(mktemp -d)
pushd "$TMP" > /dev/null
npm pack bcrypt@6.0.0
mkdir bcrypt && tar xzf bcrypt-*.tgz --strip-components=1 -C bcrypt
cd bcrypt && npm install --ignore-scripts && cd ..
cp -a bcrypt "$BCRYPT_DIR"
popd > /dev/null
rm -rf "$TMP"
fi
# node:24.14.1-slim s390x — same Node.js version as Meteor 3.5-beta.7 bundled
docker run --rm --platform linux/s390x \
-v "$(pwd)/bundle:/bundle" \
-w /bundle/programs/server \
node:22.22.2-slim \
node:24.14.1-slim \
sh -c "apt-get update -qq && apt-get install -y -q build-essential python3 && npm install"
- name: Clean up and create s390x zip
@@ -219,9 +333,9 @@ jobs:
retention-days: 1
# ─── 4b. Build ppc64le bundle (rebuild native modules via QEMU container) ────
# Meteor 3.4 does NOT support ppc64le (installer exits with error on that arch).
# Meteor 3.5-beta.7 does NOT support ppc64le (installer exits with error on that arch).
# GitHub Actions has no native ppc64le runners.
# Solution: QEMU emulation + node:22.22.2-slim (ppc64le variant) for npm rebuild.
# Solution: QEMU emulation + node:24.14.1-slim (ppc64le variant) for npm rebuild.
build-ppc64le:
needs: [prepare, build-amd64]
runs-on: ubuntu-latest
@@ -246,11 +360,25 @@ jobs:
run: |
unzip wekan-${VERSION}-amd64.zip
rm -rf bundle/programs/server/node_modules
# node:22.22.2-slim ppc64le — same Node.js version as Meteor 3.4 bundled
# Fix: bcrypt 5.0.1 (Meteor accounts-password) ships node-addon-api@3
# which fails to compile on Node.js 24. Replace with bcrypt 6.0.0.
BCRYPT_DIR="$(pwd)/bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/bcrypt"
if [ -d "$BCRYPT_DIR" ]; then
rm -rf "$BCRYPT_DIR"
TMP=$(mktemp -d)
pushd "$TMP" > /dev/null
npm pack bcrypt@6.0.0
mkdir bcrypt && tar xzf bcrypt-*.tgz --strip-components=1 -C bcrypt
cd bcrypt && npm install --ignore-scripts && cd ..
cp -a bcrypt "$BCRYPT_DIR"
popd > /dev/null
rm -rf "$TMP"
fi
# node:24.14.1-slim ppc64le — same Node.js version as Meteor 3.5-beta.7 bundled
docker run --rm --platform linux/ppc64le \
-v "$(pwd)/bundle:/bundle" \
-w /bundle/programs/server \
node:22.22.2-slim \
node:24.14.1-slim \
sh -c "apt-get update -qq && apt-get install -y -q build-essential python3 && npm install"
- name: Clean up and create ppc64le zip
@@ -263,51 +391,62 @@ jobs:
path: wekan-${{ needs.prepare.outputs.version }}-ppc64le.zip
retention-days: 1
# ─── 4c. Build armhf bundle (rebuild native modules via QEMU container) ──────
# Meteor 3.4 does NOT support arm/v7 (armhf). Installer explicitly rejects it.
# GitHub Actions has no native arm/v7 runners.
# Solution: QEMU emulation + node:22.22.2-slim (arm/v7 variant) for npm rebuild.
# arm/v7 under QEMU is slowest — timeout set to 120 min.
build-armhf:
needs: [prepare, build-amd64]
runs-on: ubuntu-latest
timeout-minutes: 120
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- name: Set up QEMU for arm/v7
uses: docker/setup-qemu-action@v4
with:
platforms: arm
- name: Install unzip/zip
run: sudo apt-get update && sudo apt-get install -y unzip zip
- name: Download amd64 bundle
uses: actions/download-artifact@v8
with:
name: bundle-amd64
- name: Rebuild native modules for armhf in container
run: |
unzip wekan-${VERSION}-amd64.zip
rm -rf bundle/programs/server/node_modules
# node:22.22.2-slim arm/v7 — same Node.js version as Meteor 3.4 bundled
docker run --rm --platform linux/arm/v7 \
-v "$(pwd)/bundle:/bundle" \
-w /bundle/programs/server \
node:22.22.2-slim \
sh -c "apt-get update -qq && apt-get install -y -q build-essential python3 && npm install"
- name: Clean up and create armhf zip
run: |
zip -r wekan-${VERSION}-armhf.zip bundle
- uses: actions/upload-artifact@v7
with:
name: bundle-armhf
path: wekan-${{ needs.prepare.outputs.version }}-armhf.zip
retention-days: 1
# ─── 4c. Build armhf bundle — COMMENTED OUT ─────────────────────────────────
# No official Node.js binaries exist for armhf (arm/v7).
#build-armhf:
# needs: [prepare, build-amd64]
# runs-on: ubuntu-latest
# timeout-minutes: 120
# env:
# VERSION: ${{ needs.prepare.outputs.version }}
# steps:
# - name: Set up QEMU for arm/v7
# uses: docker/setup-qemu-action@v4
# with:
# platforms: arm
#
# - name: Install unzip/zip
# run: sudo apt-get update && sudo apt-get install -y unzip zip
#
# - name: Download amd64 bundle
# uses: actions/download-artifact@v8
# with:
# name: bundle-amd64
#
# - name: Rebuild native modules for armhf in container
# run: |
# unzip wekan-${VERSION}-amd64.zip
# rm -rf bundle/programs/server/node_modules
# # Fix: bcrypt 5.0.1 (Meteor accounts-password) ships node-addon-api@3
# # which fails to compile on Node.js 24. Replace with bcrypt 6.0.0.
# BCRYPT_DIR="$(pwd)/bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/bcrypt"
# if [ -d "$BCRYPT_DIR" ]; then
# rm -rf "$BCRYPT_DIR"
# TMP=$(mktemp -d)
# pushd "$TMP" > /dev/null
# npm pack bcrypt@6.0.0
# mkdir bcrypt && tar xzf bcrypt-*.tgz --strip-components=1 -C bcrypt
# cd bcrypt && npm install --ignore-scripts && cd ..
# cp -a bcrypt "$BCRYPT_DIR"
# popd > /dev/null
# rm -rf "$TMP"
# fi
# # node:24.14.1-slim arm/v7 — same Node.js version as Meteor 3.5-beta.7 bundled
# docker run --rm --platform linux/arm/v7 \
# -v "$(pwd)/bundle:/bundle" \
# -w /bundle/programs/server \
# node:24.14.1-slim \
# sh -c "apt-get update -qq && apt-get install -y -q build-essential python3 && npm install"
#
# - name: Clean up and create armhf zip
# run: |
# zip -r wekan-${VERSION}-armhf.zip bundle
#
# - uses: actions/upload-artifact@v7
# with:
# name: bundle-armhf
# path: wekan-${{ needs.prepare.outputs.version }}-armhf.zip
# retention-days: 1
# ─── 5. Build win64 bundle (rebuild native modules on Windows) ───────────────
build-win64:
@@ -319,11 +458,12 @@ jobs:
steps:
- uses: actions/setup-node@v6
with:
node-version: '22.22.2'
node-version: '24.14.1'
- name: Install node-gyp and build tools
run: |
npm install -g windows-build-tools --vs2019 2>$null; exit 0
## With Node 24 these are already preinstalled at GitHub Windows runners
#- name: Install node-gyp and build tools
# run: |
# npm install -g windows-build-tools --vs2019 2>$null; exit 0
- name: Install 7-zip
run: choco install -y 7zip
@@ -333,10 +473,28 @@ jobs:
with:
name: bundle-amd64
- name: Fix bcrypt for Node.js 24
shell: bash
run: |
7z x wekan-${VERSION}-amd64.zip
# Fix: bcrypt 5.0.1 (Meteor accounts-password) ships node-addon-api@3
# which fails to compile on Node.js 24. Replace with bcrypt 6.0.0.
BCRYPT_DIR="$(pwd)/bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/bcrypt"
if [ -d "$BCRYPT_DIR" ]; then
rm -rf "$BCRYPT_DIR"
TMP=$(mktemp -d)
pushd "$TMP" > /dev/null
npm pack bcrypt@6.0.0
mkdir bcrypt && tar xzf bcrypt-*.tgz --strip-components=1 -C bcrypt
cd bcrypt && npm install --ignore-scripts && cd ..
cp -r bcrypt "$BCRYPT_DIR"
popd > /dev/null
rm -rf "$TMP"
fi
- name: Rebuild native modules for Windows
shell: cmd
run: |
7z x wekan-%VERSION%-amd64.zip
cd bundle\programs\server
rmdir /s /q node_modules
npm install
@@ -354,7 +512,7 @@ jobs:
# ─── 6. Create GitHub Release and upload all bundles ────────────────────────
release:
needs: [prepare, build-amd64, build-arm64, build-s390x, build-ppc64le, build-armhf, build-win64]
needs: [prepare, build-amd64, build-arm64, build-s390x, build-ppc64le, build-win64]
runs-on: ubuntu-latest
env:
VERSION: ${{ needs.prepare.outputs.version }}
@@ -366,8 +524,9 @@ jobs:
merge-multiple: true
- name: Create GitHub Release with all bundles
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
tag_name: v${{ needs.prepare.outputs.version }}
name: v${{ needs.prepare.outputs.version }}
body: ${{ needs.prepare.outputs.changelog }}
files: |
@@ -375,106 +534,170 @@ jobs:
wekan-${{ needs.prepare.outputs.version }}-arm64.zip
wekan-${{ needs.prepare.outputs.version }}-s390x.zip
wekan-${{ needs.prepare.outputs.version }}-ppc64le.zip
wekan-${{ needs.prepare.outputs.version }}-armhf.zip
wekan-${{ needs.prepare.outputs.version }}-win64.zip
# ─── 7. Build and push multi-platform Docker image ──────────────────────────
#docker:
# needs: [prepare, release]
# runs-on: ubuntu-latest
# env:
# VERSION: ${{ needs.prepare.outputs.version }}
# steps:
# - uses: actions/checkout@v6
#
# - name: Set up QEMU
# uses: docker/setup-qemu-action@v4
#
# - name: Set up Docker Buildx
# uses: docker/setup-buildx-action@v3
#
# - name: Log in to Docker Hub
# uses: docker/login-action@v4
# with:
# username: ${{ secrets.DOCKERHUB_USERNAME }}
# password: ${{ secrets.DOCKERHUB_TOKEN }}
#
# - name: Log in to Quay.io
# uses: docker/login-action@v4
# with:
# registry: quay.io
# username: ${{ secrets.QUAY_USERNAME }}
# password: ${{ secrets.QUAY_PASSWORD }}
#
# - name: Log in to GitHub Container Registry
# uses: docker/login-action@v4
# with:
# registry: ghcr.io
# username: ${{ github.actor }}
# password: ${{ secrets.GITHUB_TOKEN }}
#
# - name: Build and push Docker image to all registries
# uses: docker/build-push-action@v7
# with:
# context: .
# platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x
# push: true
# build-args: VERSION=${{ needs.prepare.outputs.version }}
# tags: |
# #wekanteam/wekan:v${{ needs.prepare.outputs.version }}
# #wekanteam/wekan:latest
# quay.io/wekan/wekan:v${{ needs.prepare.outputs.version }}
# quay.io/wekan/wekan:latest
# ghcr.io/wekan/wekan:v${{ needs.prepare.outputs.version }}
# ghcr.io/wekan/wekan:latest
# cache-from: type=gha
# cache-to: type=gha,mode=max
docker:
needs: [prepare, release]
runs-on: ubuntu-latest
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@v6
with:
ref: refs/tags/v${{ inputs.new_version }}
# ─── 8. Build and publish snap packages (all architectures via Launchpad) ────
# Uses snapcraft remote-build on Launchpad's native builders (more reliable
# than QEMU for snap builds). Each architecture bundles its own database:
# amd64, arm64 — MongoDB 7.x prebuilt native binary
# armhf, s390x, ppc64el — MongoDB 7.x amd64 binary run via qemu-x86_64-static
# (no prebuilt MongoDB binaries exist for these arches)
#snap:
# needs: [prepare, release]
# runs-on: ubuntu-latest
# env:
# VERSION: ${{ needs.prepare.outputs.version }}
# steps:
# - uses: actions/checkout@v6
#
# - name: Install snapcraft
# run: sudo snap install snapcraft --classic
#
# - name: Remote-build snap for all architectures via Launchpad
# env:
# SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
# run: |
# snapcraft remote-build \
# --build-for=amd64,arm64,armhf,s390x,ppc64el \
# --launchpad-accept-public-upload
#
# - name: Upload all snap files as artifacts
# uses: actions/upload-artifact@v7
# with:
# name: snaps-all-arches
# path: "*.snap"
# retention-days: 30
#
# # Publish to edge — NOT stable.
# # Stable channel holds the old WeKan version until database migrations are ready.
# # Promote to stable manually via the Snap Store dashboard when migrations exist.
# - name: Publish all snaps to Snap Store (candidate, beta, edge)
# env:
# SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
# run: |
# for snap_file in *.snap; do
# echo "Publishing $snap_file ..."
# snapcraft upload --release=edge "$snap_file"
# done
#
# - name: Upload all snaps to GitHub Release
# uses: softprops/action-gh-release@v2
# with:
# files: "*.snap"
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Create Docker config with registry credentials
run: |
mkdir -p ~/.docker
cat > ~/.docker/config.json <<EOF
{
"auths": {
"ghcr.io": {
"auth": "${{ secrets.GHCR_AUTH }}"
},
"https://index.docker.io/v1/": {
"auth": "${{ secrets.DOCKERHUB_AUTH }}"
},
"quay.io": {
"auth": "${{ secrets.QUAY_AUTH }}"
}
}
}
EOF
- name: Create and use buildx builder
run: |
docker buildx create --name mybuilder --driver docker-container --use
docker buildx inspect --bootstrap
- name: Build and push Docker image to all registries
run: |
docker buildx build \
--platform linux/amd64,linux/arm64,linux/s390x,linux/ppc64le \
-t wekanteam/wekan:v${VERSION} \
-t wekanteam/wekan:latest \
-t quay.io/wekan/wekan:v${VERSION} \
-t quay.io/wekan/wekan:latest \
-t ghcr.io/wekan/wekan:v${VERSION} \
-t ghcr.io/wekan/wekan:latest \
--push .
# ─── 8. Build and publish snap packages ──────────────────────────────────────
# Build snap with snapcraft pack (like releases/snap-build.sh) using LXD,
# then push to Snap Store edge channel (like releases/snap-push-to-store.sh).
# Promote to stable manually via the Snap Store dashboard when ready.
snap:
needs: [prepare, release]
runs-on: ubuntu-latest
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@v6
with:
ref: refs/tags/v${{ inputs.new_version }}
- name: Install snapcraft
run: sudo snap install snapcraft --classic
- name: Build snap
run: sudo snapcraft pack --destructive-mode
- name: Upload snap files as artifacts
uses: actions/upload-artifact@v7
with:
name: snaps
path: "*.snap"
retention-days: 30
- name: Push all snaps to Snap Store edge channel
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_AUTH }}
run: |
for snap_file in *.snap; do
echo "Publishing $snap_file ..."
snapcraft upload --release=edge "$snap_file"
done
- name: Upload all snaps to GitHub Release
uses: softprops/action-gh-release@v3
with:
tag_name: v${{ needs.prepare.outputs.version }}
files: "*.snap"
# ─── 9. Update Helm charts and deploy to GitHub Pages ─────────────────────────
# Chart source is in helm/wekan/, published packages + index.yaml in helm/charts/.
# GitHub Pages deploys helm/charts/ via Actions, serving at https://wekan.github.io/wekan/
helm:
needs: [prepare, docker]
runs-on: ubuntu-latest
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@v6
with:
ref: refs/tags/v${{ inputs.new_version }}
- name: Install Helm
run: |
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
- name: Update Chart.yaml and values.yaml with new version
run: |
cd helm/wekan
# Chart.yaml: update appVersion and version
sed -i "s/^appVersion: .*/appVersion: \"${VERSION}\"/" Chart.yaml
sed -i "s/^version: .*/version: ${VERSION}.0/" Chart.yaml
# values.yaml: update image tag
sed -i "s/^ tag: v.*/ tag: v${VERSION}/" values.yaml
- name: Build Helm dependencies
run: |
cd helm/wekan
helm repo add mongo https://groundhog2k.github.io/helm-charts/
helm dependency update
helm dependency build
- name: Package chart and update index
run: |
helm package helm/wekan -d helm/charts/
helm repo index helm/charts/ --url https://wekan.github.io/wekan/
- name: Update created time to Finland time
run: |
FINLAND_TIME=$(TZ='Europe/Helsinki' date '+%Y-%m-%dT%H:%M:%S.000000000%:z')
sed -i "0,/^ created: .*/s/^ created: .*/ created: \"${FINLAND_TIME}\"/" helm/charts/index.yaml
- name: Commit updated chart
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add helm/
git commit -m "Helm chart ${VERSION}.0"
git push origin HEAD:refs/heads/main
- name: Upload helm/charts/ as Pages artifact
uses: actions/upload-pages-artifact@v4
with:
path: helm/charts/
# ─── 10. Deploy Helm chart to GitHub Pages ───────────────────────────────────
deploy-pages:
needs: helm
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+2 -2
View File
@@ -127,12 +127,12 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '22.22.2'
node-version: '24.14.1'
- name: Setup meteor
uses: meteorengineer/setup-meteor@v3
with:
meteor-release: '3.4'
meteor-release: '3.5-beta.7'
- name: Install NPM Dependencies
run: meteor npm install
+20 -28
View File
@@ -3,12 +3,12 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
meteor-base
meteor-base@1.5.2
# Build system
ecmascript
standard-minifier-js
rspack
ecmascript@0.17.0
standard-minifier-js@3.2.0
rspack@1.0.0
blaze@3.0.2
@@ -16,18 +16,10 @@ blaze@3.0.2
aldeed:collection2
aldeed:schema-index@4.0.0-beta.5
reywood:publish-composite
mongo
# The holy trifecta - this is a replacement for subs-manager
# for IndexedDB persistence and auto-sync
jam:offline
# for optimistic methods with offline queuing
jam:method
# global subscription caching
jam:pub-sub
mongo@2.3.0-beta350.7
# Account system
accounts-password
accounts-password@3.2.3-beta350.7
communitypackages:core
communitypackages:unstyled
communitypackages:flow-routing
@@ -41,19 +33,19 @@ wekan-oidc
wekan-accounts-oidc
# Utilities
check
random
reactive-dict
session
tracker
audit-argument-checks
check@1.5.0
random@1.2.2
reactive-dict@1.3.2
session@1.2.2
tracker@1.3.4
audit-argument-checks@1.0.8
# UI components
ostrio:i18n
reactive-var
shell-server
email
dynamic-import
reactive-var@1.0.13
shell-server@0.7.0
email@3.2.0-beta350.7
dynamic-import@0.7.4
wekan-markdown
quave:synced-cron
ostrio:cookies
@@ -61,9 +53,9 @@ ostrio:files
# lmieulet:meteor-coverage
meteortesting:mocha
matb33:collection-hooks
service-configuration
minifier-css
ejson
logging
service-configuration@1.3.5
minifier-css@2.0.1
ejson@1.2.0-beta350.7
logging@1.3.6
wekan-fullcalendar
wekan-fontawesome
+1 -1
View File
@@ -1 +1 @@
METEOR@3.4
METEOR@3.5-beta.7
+12 -15
View File
@@ -1,6 +1,6 @@
accounts-base@3.2.0
accounts-base@3.3.0-beta350.7
accounts-oauth@1.4.6
accounts-password@3.2.2
accounts-password@3.2.3-beta350.7
aldeed:collection2@4.1.5
aldeed:schema-index@4.0.0
aldeed:simple-schema@1.13.1
@@ -23,18 +23,18 @@ communitypackages:flow-routing@2.1.0
communitypackages:unstyled@2.0.1
core-runtime@1.0.0
ddp@1.4.2
ddp-client@3.1.1
ddp-client@3.2.0-beta350.7
ddp-common@1.4.4
ddp-rate-limiter@1.2.2
ddp-server@3.1.2
ddp-rate-limiter@1.3.0-beta350.7
ddp-server@3.2.0-beta350.7
diff-sequence@1.1.3
dynamic-import@0.7.4
ecmascript@0.17.0
ecmascript-runtime@0.8.3
ecmascript-runtime-client@0.12.3
ecmascript-runtime-server@0.11.1
ejson@1.1.5
email@3.1.2
ejson@1.2.0-beta350.7
email@3.2.0-beta350.7
es5-shim@4.8.1
facts-base@1.0.2
fetch@0.1.6
@@ -45,9 +45,6 @@ htmljs@2.0.1
http@1.4.4
id-map@1.2.0
inter-process-messaging@0.1.2
jam:method@1.9.1
jam:offline@0.4.1
jam:pub-sub@0.5.1
jquery@3.0.2
lai:collection-extensions@1.0.0
localstorage@1.2.1
@@ -60,11 +57,11 @@ meteortesting:mocha@2.1.0
meteortesting:mocha-core@8.0.1
minifier-css@2.0.1
minifier-js@3.1.0
minimongo@2.0.5
minimongo@2.1.0-beta350.7
modern-browsers@0.2.3
modules@0.20.3
modules-runtime@0.13.2
mongo@2.2.0
mongo@2.3.0-beta350.7
mongo-decimal@0.2.0
mongo-dev-server@1.1.1
mongo-id@1.0.9
@@ -82,7 +79,7 @@ promise@1.0.0
quave:synced-cron@2.4.0
raix:eventemitter@1.0.0
random@1.2.2
rate-limit@1.1.2
rate-limit@1.2.0-beta350.7
react-fast-refresh@0.3.0
reactive-dict@1.3.2
reactive-var@1.0.13
@@ -95,7 +92,7 @@ service-configuration@1.3.5
session@1.2.2
sha@1.0.10
shell-server@0.7.0
socket-stream-client@0.6.1
socket-stream-client@0.7.0-beta350.7
spacebars@2.0.0
spacebars-compiler@2.0.0
standard-minifier-js@3.2.0
@@ -107,7 +104,7 @@ tools-core@1.0.0
tracker@1.3.4
typescript@5.9.3
url@1.3.5
webapp@2.1.0
webapp@2.2.0-beta350.7
webapp-hashing@1.1.2
wekan-accounts-cas@0.2.0
wekan-accounts-lockout@1.1.0
+280 -11
View File
@@ -2,6 +2,7 @@
Newest WeKan at these platforms:
- [Upgrade WeKan](https://wekan.fi/upgrade/)
- [bundle zip at releases](https://github.com/wekan/wekan/releases), docs at
- [Linux amd64, arm64, s390x](https://github.com/wekan/wekan/blob/main/docs/Platforms/FOSS/RaspberryPi/Raspberry-Pi.md)
- [Windows amd64, works also at Windows arm64](https://github.com/wekan/wekan/blob/main/docs/Platforms/Propietary/Windows/Offline.md)
@@ -11,24 +12,292 @@ Newest WeKan at these platforms:
- Docker amd64/arm64/s390x
- Kubernetes Docker amd64
- Bitnami MongoDB Docker images do not exist anymore. [MongoDump/MongoRestore to groundhog2k MongoDB images](https://github.com/wekan/charts/issues/45)
- Fixing other platforms In Progress.
Fixing other platforms In Progress.
Versions:
- [Node.js 22.x](https://nodejs.org/dist/latest-v22.x/)
- MongoDB 6.x and 7.x, or [FerretDB2/PostgreSQL](https://github.com/wekan/wekan/blob/main/docs/Databases/FerretDB2-PostgreSQL.md)
- WeKan 8.75 and newer uses Meteor 3.5-beta.7, [Node.js 24.x](https://nodejs.org/dist/latest-v24.x/),
MongoDB 7.x (or 6.x), or [FerretDB2/PostgreSQL](https://github.com/wekan/wekan/blob/main/docs/Databases/FerretDB2-PostgreSQL.md)
- WeKan 8.43 upgraded to Meteor 3.x, huge thanks to harryadel:
- https://harryadel.com/dev-diary-24/
- https://harryadel.com/dev-diary-25/
- https://harryadel.com/dev-diary-26/
- WeKan 8.00-8.24 used Colorful Unicode Emoji Icons, versions before and after use mostly Font Awesome 4.7 icons.
- WeKan 8.00-8.06 had wrong raw database directory setting /var/snap/wekan/common/wekan and some cards were not visible,
it was fixed at WeKan 8.07 where database directory is back to /var/snap/wekan/common and all cards are visible.
[Upgrade WeKan](https://wekan.fi/upgrade/)
# v8.97 2026-04-16 WeKan ® release
WeKan 8.00-8.06 had wrong raw database directory setting /var/snap/wekan/common/wekan and some cards were not visible.
Those are fixed at WeKan 8.07 where database directory is back to /var/snap/wekan/common and all cards are visible.
This release adds the following updates:
WeKan 8.00-8.24 used Colorful Unicode Emoji Icons, versions before and after use mostly Font Awesome 4.7 icons.
- Release Scripts: Clean GitHub Cache.
[Part 1](https://github.com/wekan/wekan/commit/e59bc9cd86cc16333e24b2e7e8e5d5cf72f81e3e),
[Part 2](https://github.com/wekan/wekan/commit/13cdf08e223e83ef9a2f36417c11ad002e884f29),
[Part 3](https://github.com/wekan/wekan/commit/6d0978d0ede8316a1d9ac6afc0ecf7f02d9193d6).
Thanks to xet7.
WeKan 8.43 and newer uses Meteor 3.x, Node.js 22.x and MongoDB 7.x, huge thanks to harryadel:
and fixes the following bugs:
- https://harryadel.com/dev-diary-24/
- https://harryadel.com/dev-diary-25/
- https://harryadel.com/dev-diary-26/
- [Fix GitHub Actions builds](https://github.com/wekan/wekan/commit/6478d27d1ca2f6e27c025e0cc97b618bc255083f).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.96 2026-04-16 WeKan ® release
This release fixes the following bugs:
- [Fix GitHub Actions builds](https://github.com/wekan/wekan/commit/03ba747bc073f3993d933b814d35c7380fea745d).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.95 2026-04-16 WeKan ® release
This release adds the following new features:
- [Helm Chart: Add single-node ReplicaSet support with auto MONGO_OPLOG_URL](https://github.com/wekan/wekan/pull/6292).
Thanks to titver968.
- [Helm Chart: Use current Finland time for created field at index.yaml for newest built Helm Chart release](https://github.com/wekan/wekan/commit/135af977af4a1c598d2e067de0facb6eae8f8de1).
Thanks to xet7.
and fixes the following bugs:
- [Fix Cannot find module /build/main.js error in latest Docker image](https://github.com/wekan/wekan/commit/6dfe81cbcb0c6e2003b1984586d56042a6408e70).
Thanks to s8321414 and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.94 2026-04-16 WeKan ® release
This release adds the following updates:
- [Updated dompurify](https://github.com/wekan/wekan/commit/c27d5d04124f3eec659bbe5187a625c43176fc4f).
Thanks to developers of dompurify.
and fixes the following bugs:
- [Fix Can't start latest docker image because of MongoDB Index errors](https://github.com/wekan/wekan/commit/d537b7c9f3505fd4c1653f87d5f86d7e7729a514).
Thanks to s8321414 and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.93 2026-04-16 WeKan ® release
This release fixes the following bugs:
- [Fix SSO Login broken. Part 2](https://github.com/wekan/wekan/commit/4aa7b6aa2034f27efeb67d5dfa8f6acbe0005786).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.92 2026-04-16 WeKan ® release
This release adds the following updates:
- [Updated Helm Charts versions](https://github.com/wekan/wekan/commit/24ebb4ba45344ad152747c31e7df76217e5b8909).
Thanks to xet7.
- [GitHub Actions: Added missing sudo to snap build](https://github.com/wekan/wekan/commit/2c8a6c8ec6e24b6b6bb153da3edd089e0f0087cc).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.91 2026-04-16 WeKan ® release
This release fixes the following bugs:
- [Fix building Snap at GitHub Actions](https://github.com/wekan/wekan/commit/89de05ee91612cef4f13fa8ad32d112dca5bdb43).
Thanks to xet7.
- [Updated Helm Chart URL at readme](https://github.com/wekan/wekan/commit/529e0d25ef2ea84953d1c1e6a23b5798d34583fb).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.90 2026-04-16 WeKan ® release
This release adds the following updates:
- [Added GitHub Actions builds for Docker and Snap. Moved Helm Charts from charts repo to wekan repo](https://github.com/wekan/wekan/commit/f57ce521984f6f358410863c71fcaee342bb8107).
Thanks to xet7.
- [Changed ArtifactHub from wekan/charts repo to wekan/wekan repo](https://github.com/wekan/wekan/commit/99519af83adc45eca7beb40a4e82f5b73764b7fc).
Thanks to xet7.
- [Release scripts: Moved more steps to GitHub Actions](https://github.com/wekan/wekan/commit/357f63d01fc013ea412501dabbdd977e5f1efa61).
Thanks to xet7.
and fixes the following bugs:
- [Removed jam:offline jam:method jam:pub-sub, because they are not used, and they cause too much database usage](https://github.com/wekan/wekan/commit/0dd924f14889100e74fbd5e8d17bb3a7209025ca).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.89 2026-04-15 WeKan ® release
This release fixes the following bugs:
- [Disable jam:offline keepAll BEFORE any collections are created. Part 2](https://github.com/wekan/wekan/commit/f6a851a3d887ce9fa2fa5f62aad2a2ecf326c863).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.88 2026-04-15 WeKan ® release
This release fixes the following bugs:
- [Disable jam:offline keepAll to prevent full-collection COLLSCAN queries and Ensure standard GridFS index on attachments.chunks for efficient chunk lookups](https://github.com/wekan/wekan/commit/ec0c1bc9afd6e3fd8b60f9f17f96dc5df52dbfc2).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.87 2026-04-15 WeKan ® release
This release fixes the following bugs:
- [Try to fix Snap](https://github.com/wekan/wekan/commit/fc02a15753badc8d06d020aa97daae28ac05a310).
Thanks to xet7.
- [Improve handling of ROOT_URL as an environement variable](https://github.com/wekan/wekan/pull/6286).
Thanks to FlorentDotMe.
- [UI: Enable the horizontal scroll in the quick access menu boards list](https://github.com/wekan/wekan/pull/6287).
Thanks to FlorentDotMe.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.86 2026-04-15 WeKan ® release
This release fixes the following bugs:
- [Try to fix Snap](https://github.com/wekan/wekan/commit/10f801d31b7e2b1a8c562bf24f65c4cc6efe6013).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.85 2026-04-15 WeKan ® release
This release fixes the following bugs:
- [Try to fix Snap](https://github.com/wekan/wekan/commit/0e13bfc50eadc72adccfe785a1b47c30d0ba5429).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.84 2026-04-15 WeKan ® release
This release adds the following new features:
- [Helm Chart: Make readiness, liveness and startup probes configurable](https://github.com/wekan/charts/pull/51).
Thanks to snowsky.
and fixes the following bugs:
- [Fix SSO Login OIDC and OpenID Connect](https://github.com/wekan/wekan/pull/6284).
Thanks to sbaecker and nebulade.
- [Try to fix Snap Candidate](https://github.com/wekan/wekan/commit/bc92978fa9c9373947de40fe9ca584e133825610).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.83 2026-04-14 WeKan ® release
This release adds the following updates:
- [Release scripts: Removed armhf, there is no official Node.js binary for it](https://github.com/wekan/wekan/commit/d0a9fa9a71029a5586cf5bc87488619c7db9d0e3).
Thanks to xet7.
- [Release scripts: Docker not for armhf, no official Node.js binary for it](https://github.com/wekan/wekan/commit/41db7b4ad18359283602b8bfdb42b15acf51782d).
Thanks to xet7.
- [Release scripts: Fix Node.js 24.x download URL for Snap builds](https://github.com/wekan/wekan/commit/2c43aa463a0baadcae3db9f34066a9ddf6e77594).
Thanks to xet7.
- [Changed start-wekan.sh and start-wekan.bat to not use Change Streams](https://github.com/wekan/wekan/commit/da4459304fe7d068b1db91938f7fd4ffd04c5bcb).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.82 2026-04-14 WeKan ® release
This release adds the following updates:
- [Release scripts: Added script for deleting repo git tag](https://github.com/wekan/wekan/commit/11672a13f7b102b764978600a8fce2f757c9401a).
Thanks to xet7.
- [Bump softprops/action-gh-release from 2 to 3](https://github.com/wekan/wekan/pull/6281).
Thanks to dependabot.
- [Bump docker/build-push-action from 7.0.0 to 7.1.0](https://github.com/wekan/wekan/pull/6282).
Thanks to dependabot.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.81 2026-04-14 WeKan ® release
This release adds the following updates:
- Updated dependencies
[Part 1](https://github.com/wekan/wekan/commit/7b91439b0f9ec0e409c14ecebab389d41b40a990),
[Part 2](https://github.com/wekan/wekan/commit/1637a9c938134ef26846ba3c0cd53c065f434e3e).
Thanks to developers of dependencies.
- [Docs: Added History of Schema Migration Systems](https://github.com/wekan/wekan/commit/2e7565f9eb744bc59e454745e06fd43a85a02f97).
Thanks to xet7.
- [Release scripts: Comment out build for armhf because no official Node.js 24.x binaries exist for armhf (arm/v7)](https://github.com/wekan/wekan/commit/5462fb06477bc3a83f1d5c754ecd60ebe7643ee6).
Thanks to xet7.
and fixes the following bugs:
- [Fix activities are not showing](https://github.com/wekan/wekan/pull/6272).
Thanks to snowsky.
- [Fix Link Card modal overflow in Docker environment](https://github.com/wekan/wekan/pull/6273).
Thanks to AymenHassini19.
- [Fix/readme node version and changes made](https://github.com/wekan/wekan/pull/6271).
Thanks to YosserDerbali.
- [Clarify board drag tooltip text in Remaining and Workspaces](https://github.com/wekan/wekan/pull/6268).
Thanks to YosserDerbali.
- [Add migration for v7.95 due dates](https://github.com/wekan/wekan/pull/6262).
Thanks to Raawen-dev.
- [Fix: include historical comments and activities in board exports](https://github.com/wekan/wekan/pull/6275).
Thanks to KhaoulaMaleh.
- [Fix Exporter: Attachments always empty in board JSON export](https://github.com/wekan/wekan/pull/6279).
Thanks to kolaente.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.80 2026-04-10 WeKan ® release
This release fixes the following bugs:
- [Try to fix GitHub Actions builds with custom newer bcrypt](https://github.com/wekan/wekan/commit/2ebefdd0bf1cf482548319e130baf2b633ba259b).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.79 2026-04-09 WeKan ® release
This release fixes the following bugs:
- [Fix 8.78: WeKan build Error: Could not find rspack config. Using MongoDB Change Streams
at start-wekan.sh start-wekan.bat bundle, docker-compose.yml and Snap Candidate](https://github.com/wekan/wekan/commit/2d4170a9bfc58b8e6504abf122aea505e55802ef).
Thanks to nachocodoner and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.78 2026-04-09 WeKan ® release
This release adds the the following updates:
- Upgraded to Meteor 3.5-beta.7 and Node.js 24.14.1. Now prefers MongoDB Change Streams at Snap Candidate and docker-compose.yml.
[Part 1](https://github.com/wekan/wekan/commit/14f9ac39ad93db4f7c06721f1efd4c18e53cc5f8),
[Part 2](https://github.com/wekan/wekan/commit/b1707b8691d0ba5f355e78e250765c8a7657c3d7).
Thanks to Meteor developers.
- [Enhance translations with new key:value pairs](https://github.com/wekan/wekan/pull/6259).
Thanks to KhaoulaMaleh.
- [Refine translations](https://github.com/wekan/wekan/pull/6261).
Thanks to KhaoulaMaleh.
- [Updated to Node.js 24.x at release scripts](https://github.com/wekan/wekan/commit/bdb92744854cc211866631746c63d748d4a93cfa).
Thanks to xet7.
- [Fix GitHub Actions builds](https://github.com/wekan/wekan/commit/bc88c0dfc2742154e94861201d239bc4b3c51cef).
Thanks to xet7.
and fixes the following bugs:
- [Fixed Card settings checkboxes](https://github.com/wekan/wekan/pull/6260).
Thanks to KhaoulaMaleh.
Thanks to above GitHub users for their contributions and translators for their translations.
# v8.74 2026-04-08 WeKan ® release
+6 -7
View File
@@ -7,18 +7,17 @@ LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
# TARGETARCH and TARGETVARIANT are automatically provided by Docker Buildx
ARG TARGETARCH
ARG TARGETVARIANT
ARG VERSION=8.74
ARG VERSION=8.94
ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils gnupg wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3 unzip"
ENV \
DEBUG=false \
NODE_VERSION=v22.22.2 \
METEOR_RELEASE=METEOR@3.4 \
NODE_VERSION=v24.15.0 \
METEOR_RELEASE=METEOR@3.5-beta.7 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
NPM_VERSION=10.9.2 \
NPM_VERSION=11.11.0 \
SRC_PATH=./ \
WITH_API=true \
MONGO_OPLOG_URL="" \
@@ -191,7 +190,7 @@ rm -f "node-${NODE_VERSION}-linux-${NODE_ARCH}.tar.gz" SHASUMS256.txt.asc
ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
# NPM configuration
npm install -g npm@${NPM_VERSION} --production
npm install -g npm@${NPM_VERSION}
chown --recursive wekan:wekan /home/wekan/
# Temporary Tar swap for Meteor bundle
@@ -204,7 +203,7 @@ cd /home/wekan/app
wget "https://github.com/wekan/wekan/releases/download/v${VERSION}/wekan-${VERSION}-${WEKAN_ARCH}.zip"
unzip "wekan-${VERSION}-${WEKAN_ARCH}.zip"
rm "wekan-${VERSION}-${WEKAN_ARCH}.zip"
npm install --production --no-audit --prefix ./bundle/programs/server
npm install --prefix ./bundle/programs/server
mv /home/wekan/app/bundle /build
# Restore original tar
+70 -6
View File
@@ -47,12 +47,13 @@ See bottom of https://github.com/wekan/wekan/issues/3874
## FAQ
**NOTE**:
- Please read the [FAQ](https://github.com/wekan/wekan/blob/main/docs/FAQ/FAQ.md) first
- Please don't feed the [trolls](https://github.com/wekan/wekan/blob/main/docs/FAQ/FAQ.md#why-am-i-called-a-troll) and [spammers](https://github.com/wekan/wekan/blob/main/docs/FAQ/FAQ.md#why-am-i-called-a-spammer) that are mentioned in the FAQ :)
## About WeKan ®
WeKan ® is an completely [Open Source][open_source] and [Free software][free_software]
WeKan ® is a completely [Open Source][open_source] and [Free software][free_software]
collaborative kanban board application with MIT license.
Whether you’re maintaining a personal todo list, planning your holidays with some friends,
@@ -76,15 +77,15 @@ that by providing one-click installation on various platforms.
- 1 GB RAM minimum free for WeKan ®. Production server should have minimum total 4 GB RAM.
For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/main/docker-compose.yml): 3 frontend servers,
each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs.
- Enough disk space and alerts about low disk space. If you run out disk space, MongoDB database gets corrupted.
- Enough disk space and alerts about low disk space. If you run out of disk space, MongoDB database gets corrupted.
- SECURITY: Updating to newest WeKan ® version very often. Please check you do not have automatic updates of Sandstorm or Snap turned off.
Old versions have security issues because of old versions Node.js etc. Only newest WeKan ® is supported.
WeKan ® on Sandstorm is not usually affected by any Standalone WeKan ® (Snap/Docker/Source) security issues.
- [Reporting all new bugs immediately](https://github.com/wekan/wekan/issues).
New features and fixes are added to WeKan ® [many times a day](https://github.com/wekan/wekan/blob/main/CHANGELOG.md).
- [Backups](https://github.com/wekan/wekan/blob/main/docs/Backup/Backup.md) of WeKan ® database once a day miminum.
- [Backups](https://github.com/wekan/wekan/blob/main/docs/Backup/Backup.md) of WeKan ® database once a day minimum.
Bugs, updates, users deleting list or card, harddrive full, harddrive crash etc can eat your data. There is no undo yet.
Some bug can cause WeKan ® board to not load at all, requiring manual fixing of database content.
Some bugs can cause WeKan ® board to not load at all, requiring manual fixing of database content.
## Roadmap and Demo
@@ -92,7 +93,7 @@ that by providing one-click installation on various platforms.
[Developer Documentation][dev_docs]
- There is many companies and individuals contributing code to WeKan ®, to add features and bugfixes
- There are many companies and individuals contributing code to WeKan ®, to add features and bugfixes
[many times a day](https://github.com/wekan/wekan/blob/main/CHANGELOG.md).
- [Please add Add new Feature Requests and Bug Reports immediately](https://github.com/wekan/wekan/issues).
- [Commercial Support](https://wekan.fi/commercial-support/).
@@ -102,12 +103,75 @@ By working directly with WeKan ® you get the benefit of active maintenance and
## Getting Started with Development
The default branch uses [Meteor 2 with Node.js 14](https://wekan.fi/install/).
The default branch uses Meteor 3.5-beta.7 with Node.js 24.x.
See [CHANGELOG.md](https://github.com/wekan/wekan/blob/main/CHANGELOG.md) for the latest runtime updates.
To contribute, [create a fork](https://github.com/wekan/wekan/blob/main/docs/DeveloperDocs/Build-and-Create-Pull-Request.md#2-create-fork-of-httpsgithubcomwekanwekan-at-github-web-page) and run `./rebuild-wekan.sh` (or `./rebuild-wekan.bat` on Windows) as detailed [here](https://github.com/wekan/wekan/blob/main/docs/DeveloperDocs/Build-and-Create-Pull-Request.md#3-select-option-1-to-install-dependencies-and-then-enter). Once you're ready, please test your code and [submit a pull request (PR)](https://github.com/wekan/wekan/blob/main/docs/DeveloperDocs/Build-and-Create-Pull-Request.md#7-test).
Please refer to the [developer documentation](https://github.com/wekan/wekan/blob/main/docs/DeveloperDocs/Developer-Documentation.md) for more information.
## First-Time Setup for Development
### Prerequisites
Before building WeKan from source, ensure you have:
- **Git** - for cloning the repository
- **Node.js 24.x** - WeKan requires Node.js 24.x
- **Meteor** - the JavaScript framework WeKan is built with
### Installing Node.js 24.x
```bash
# Using nvm (recommended)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.zshrc # or ~/.bashrc
nvm install 24
nvm use 24
```
### Installing Meteor
```bash
curl https://install.meteor.com/ | sh
```
### Building WeKan
The `rebuild-wekan.sh` script guides you through a three-stage process:
1. **Install dependencies (Option 1)** - Downloads all required Meteor packages and npm modules
2. **Build WeKan (Option 2)** - Compiles the application
3. **Run WeKan (Option 3)** - Starts the development server at http://localhost:4000
```bash
# Clone your fork
git clone git@github.com:YOUR_USERNAME/wekan.git
cd wekan
# Make the script executable
chmod +x rebuild-wekan.sh
# Step 1: Install dependencies
./rebuild-wekan.sh
# Press 1 and Enter
# Step 2: Build WeKan (after dependencies complete)
./rebuild-wekan.sh
# Press 2 and Enter
# Step 3: Run WeKan in development mode
./rebuild-wekan.sh
# Press 3 and Enter
```
### WSL Users
WSL users can use Snap Candidate. See [install docs](https://wekan.fi/install/).
The development server will start at http://localhost:4000. Any changes you make to the source code will automatically trigger a rebuild and refresh your browser.
## Screenshot
[More screenshots at Features page](https://github.com/wekan/wekan/tree/main/docs/Features)
+42 -44
View File
@@ -1,4 +1,4 @@
## About money
## About Money
See [CONTRIBUTING](CONTRIBUTING.md)
@@ -8,13 +8,13 @@ See [CONTRIBUTING](CONTRIBUTING.md)
2. Send info about security issue ONLY to security@wekan.fi . NOT TO ANYWHERE ELSE. NO CC, NO BCC.
3. Wait for new WeKan release that fixes security issue to appear to top of
https://github.com/wekan/wekan/blob/main/CHANGELOG.md
4. We will thank you by adding you to Hall of Fame: https://wekan.fi/hall-of-fame/
4. We will thank you by adding you to Hall the of Fame: https://wekan.fi/hall-of-fame/
5. All vulnerability details will be private to security@wekan.fi ,
unless you help all WeKan platforms to have a way to upgrade, like sending
database migrations code to security@wekan.fi or PRs to https://github.com/wekan/wekan/pulls .
There is no benefit to Wordwide Security Community to have more details about vulnerabilities,
There is no benefit to the Wordwide Security Community to have more details about vulnerabilities,
if Worldwide Security Community does not help to make upgrades possible.
6. If there some day becomes available a way to upgrade all WeKan platforms,
6. If some day a way becomes available to upgrade all WeKan platforms,
this page will be updated to add permission for security researchers
to request new GHSA or CVE ID and publish your vulnerability details at your blog, talks, etc,
and send that info also to security@wekan.fi to be added to
@@ -32,7 +32,7 @@ See [CONTRIBUTING](CONTRIBUTING.md)
- If you forget to include vulnerability details.
- If you send info about security issue to somewhere else than security@wekan.fi
## How should reports be formatted?
## How Should Reports Be Formatted?
```
Name: %name
@@ -57,13 +57,13 @@ added to the WeKan Hall of Fame https://wekan.fi/hall-of-fame/
No public domains, because all those are donated to Wekan Open Source project,
and we don't have any permissions to do security scans on those donated servers.
Please don't perform research that could impact other users. Secondly, please keep
the reports short and succinct. If we fail to understand the logics of your bug, we will tell you.
Please don't perform research that could impact other users. Second, please keep
the reports short and succinct. If we fail to understand the logic of your bug, we will tell you.
You can [Install Wekan](https://github.com/wekan/wekan/releases) to your own computer
You can [Install Wekan](https://github.com/wekan/wekan/releases) on your own computer
and scan it's vulnerabilities there.
## About Wekan versions
## About Wekan Versions
There are only 2 versions of Wekan: Standalone Wekan, and Sandstorm Wekan.
@@ -74,8 +74,8 @@ like Snap and Docker have their own specific sandboxing etc features.
Standalone Wekan by default does not load any files from Internet, like fonts, CSS, etc.
This also means all Standalone Wekan functionality works in offline local networks.
WeKan is used at most countries of the world https://snapcraft.io/wekan
and by by companies that have 30k users.
WeKan is used in most countries of the world https://snapcraft.io/wekan
and by companies that have 30k users.
- Wekan private board attachments are not accessible without logging in.
- There is feature to set board public, so that board is visible without logging in in readonly mode, with realtime updates.
@@ -90,19 +90,19 @@ and by by companies that have 30k users.
## XSS
- Dompurify https://www.npmjs.com/package/dompurify
- WeKan uses dompurify npm package to filter for XSS at fields like cards, as you can see from
- DOMpurify https://www.npmjs.com/package/dompurify
- WeKan uses DOMpurify npm package to filter for XSS at fields like cards, as you can see from
[package.json](https://github.com/wekan/wekan/blob/main/package.json). Other used versions can be seen from
[Meteor versions file](https://github.com/wekan/wekan/blob/main/.meteor/versions).
- Forms can include markdown links, html, image tags etc like you see at https://wekan.github.io .
- It's possible to add attachments to cards, and markdown/html links to files.
- Dompurify cleans up viewed code, so Javascript in input fields does not execute
- Dompurify cleans up viewed code, so JavaScript in input fields does not execute
- https://wekan.github.io/hall-of-fame/fieldbleed/
- Reaction in comment is now checked, that it does not have extra added code
- https://wekan.github.io/hall-of-fame/reactionbleed/
- https://github.com/wekan/wekan/blob/main/packages/markdown/src/template-integration.js#L76
## QA about PubSub
## QA About PubSub
Q:
@@ -115,32 +115,32 @@ A:
## PubSub
- It is not security issue to show some text or image, that user has permission to see. It is a security issue, if browserside is some text or image that user should not see.
- Meteor has browserside minimongo database, made with Javascript, updated with Publish/Subscribe, PubSub.
- It is not a security issue to show text or images that the user has permission to see. It is a security issue, if browserside is some text or image that user should not see.
- Meteor has browserside minimongo database, made with JavaScript, updated with Publish/Subscribe, PubSub.
- Publish/Subscribe means, that realtime web framework reads database changes stream, and then immediately updates webpage,
like like dashboards, chat, kanban. That is the point in any realtime web framework in any programming language.
like like dashboards, chat, kanban. That is the point of any realtime web framework in any programming language.
- Yes, you should check with Meteor DevTools Evolved Chromium/Firefox extension that at minimongo is only text that user has permission to see.
- Do checking as logged in user, and logged out user.
- Check as a logged-in user and as a logged-out user.
- Check permissions and sanitize before allowing some change, because someone could modify content of input field,
PubSub/websocket data (for example with Burp Suite Community Edition), etc.
- If you have REST API, also check that only those that have login token, and have permission, can view or edit text
- If you have a REST API, also check that only those who have a login token and permission can view or edit text.
- You should not include any data user is not allowed to see. Not to webpage text, not to websockets/PubSub, etc.
- Minimongo should not have password hashes PubSub https://wekan.github.io/hall-of-fame/userbleed/
- PubSub uses Websockets, so you need those to be enabled at webserver like Caddy/Nginx/Apache etc, examples of settings
- PubSub uses WebSockets, so you need those to be enabled on the webserver like Caddy/Nginx/Apache etc, examples of settings
at right menu of https://github.com/wekan/wekan/wiki
- Clientside https://github.com/wekan/wekan/tree/main/client/components subscribes to
- Clientside https://github.com/wekan/wekan/tree/main/client/components subscribes to
PubSub https://github.com/wekan/wekan/tree/main/server/publications or calls meteor methods at https://github.com/wekan/wekan/tree/main/models
- For Admin:
- You can have input field for password https://github.com/wekan/wekan/blob/main/client/components/cards/attachments.js#L303-L312
- You can save password to database https://github.com/wekan/wekan/blob/main/client/components/cards/attachments.js#L303-L312
- Check that only current user or Admin can change password https://github.com/wekan/wekan/blob/main/client/components/cards/attachments.js#L303-L312
- Note that currentUser uses code like Meteor.user() in .js file
- Do not have password hashes in PubSub https://github.com/wekan/wekan/blob/main/server/publications/users.js
- Do not include password hashes in PubSub https://github.com/wekan/wekan/blob/main/server/publications/users.js
- Only show Admin Panel to Admin https://github.com/wekan/wekan/blob/main/client/components/settings/settingBody.jade#L3
- If there is a lot of data, use pagination https://github.com/wekan/wekan/blob/main/client/components/settings/peopleBody.js
- Only have limited amount of data published in PubSub. Limit in MongoDB query in publications how much is published. Too much could make browser too slow.
- Use Environment variables for any email etc passwords.
- But what if you would like to remove minimongo? And only use Meteor methods for saving? In that case, you don't have realtime updates,
- If there is a large amount of data, use pagination https://github.com/wekan/wekan/blob/main/client/components/settings/peopleBody.js
- Only publish a limited amount of data in PubSub. Limit in MongoDB query in publications how much is published. Too much could make browser too slow.
- Environment variables for email and other passwords.
- But what if you would like to remove Minimongo and only use Meteor methods for saving? In that case, you don't have realtime updates,
and you need to write much more code to load and save data yourself, handle any multi user data saving conflicts yourself,
and many Meteor Atmospherejs.com PubSub using packages would not work anymore https://github.com/wekan/we
@@ -152,10 +152,10 @@ A:
## Permissions and Roles
- For any user permissions, it's best to use Meteor package package https://github.com/Meteor-Community-Packages/meteor-roles .
- Currently WeKan has custom hardcoded permissions, WeKan does not yet use that meteor-roles package.
- For any user permissions, it's best to use Meteor package https://github.com/Meteor-Community-Packages/meteor-roles .
- Currently, WeKan has custom hardcoded permissions and does not yet use the meteor-roles package.
- Using permissions at WeKan sidebar https://github.com/wekan/wekan/blob/main/client/components/sidebar/sidebar.js#L1854-L1875
- List of roles https://github.com/wekan/wekan/wiki/REST-API-Role . Change at board or Admin Panel. Also Organizations/Teams.
- List of roles: https://github.com/wekan/wekan/wiki/REST-API-Role . Change at board or Admin Panel. Also Organizations/Teams.
- Worker role: https://github.com/wekan/wekan/issues/2788
- Not implemented yet: Granular Roles https://github.com/wekan/wekan/issues/3022
- Check is user logged in, with `if (Meteor.user()) {`
@@ -164,8 +164,8 @@ A:
## Environment variables
- For any passwords, use environment variables, those are serverside
- Do not copy environment variable to public variable that is visible browserside https://github.com/wekan/wekan/blob/main/server/max-size.js
- For any passwords, use environment variables; those are serverside
- Do not copy environment variables to public variables that are visible on the browserside https://github.com/wekan/wekan/blob/main/server/max-size.js
```
Meteor.startup(() => {
@@ -176,13 +176,13 @@ Meteor.startup(() => {
```
- For serverside, you can set Meteor.settings.variablename, without text public
- For WeKan kanban, there is feature for setting board public, it can be viewed by anyone, there is realtime updates. But
- For WeKan kanban, there is a feature for setting a board to public; it can be viewed by anyone, with realtime updates. But
- Some of those permissions are checked at users.js models at https://github.com/wekan/wekan/tree/main/models
- Environment variables are used for email server passwords, etc, at all platforms https://github.com/wekan/wekan/commit/a781c0e7dcfdbe34c1483ee83cec12455b7026f7
## Escape HTML comment tags so that HTML comments are visible
- Someone reported, that it is problem that content of HTML comments in edit mode, are not visible at at view mode, so this makes HTML comments visible.
- Someone reported that it was a problem that the content of HTML comments in edit mode was not visible in view mode, so this change makes HTML comments visible.
- https://github.com/wekan/wekan/commit/167863d95711249e69bb3511175d73b34acbbdb3
- https://wekan.github.io/hall-of-fame/invisiblebleed/
@@ -249,18 +249,16 @@ Meteor.startup(() => {
### Sandstorm Wekan Security
On Sandstorm platform using environment variable Standalone Wekan features like Admin Panel etc are
turned off, because Sandstorm platform provides SSO for all apps running on Sandstorm.
On the Sandstorm platform, Standalone WeKan features like the Admin Panel are turned off using environment variables, because Sandstorm platform provides SSO for all apps running on Sandstorm.
[Sandstorm](https://sandstorm.io) is separate Open Source platform that has been
[Sandstorm](https://sandstorm.io) is a separate Open Source platform that has been
[security audited](https://sandstorm.io/news/2017-03-02-security-review) and found bugs fixed.
Sandstorm also has passwordless login, LDAP, SAML, Google etc auth options already.
At Sandstorm code is read-only and signed by app maintainers, only grain content can be modified.
Wekan at Sandstorm runs in sandboxed grain, it does not have access elsewhere without user-visible
PowerBox request or opening randomly-generated API key URL.
Sandstorm also has passwordless login, LDAP, SAML, Google, and other auth options already.
On Sandstorm, code is read-only and signed by app maintainers; only grain content can be modified.
WeKan on Sandstorm runs in a sandboxed grain; it does not have access elsewhere without a user-visible PowerBox request or opening a randomly-generated API key URL.
Also read [Sandstorm Security Practices](https://docs.sandstorm.io/en/latest/using/security-practices/) and
[Sandstorm Security non-events](https://docs.sandstorm.io/en/latest/using/security-non-events/).
For Sandstorm specific security issues you can contact [kentonv](https://github.com/kentonv) by email.
For Sandstorm specific security issues you can contact [kentonv](https://github.com/kentonv) by email.
## What Wekan bugs are eligible?
@@ -276,14 +274,14 @@ a security issue, we'd like to know about it, and also how to fix it:
## What Wekan bugs are NOT eligible?
Typical already known or "no impact" bugs such as:
Typical already-known or 'no impact' bugs such as:
- [Wekan API old tokens not replaced correctly](https://github.com/wekan/wekan/issues/1437)
- Missing Cookie flags on non-session cookies or 3rd party cookies
- Logout CSRF
- Social engineering
- Denial of service
- SSL BEAST/CRIME/etc. Wekan does not have SSL built-in, it uses Caddy/Nginx/Apache etc at front.
- SSL BEAST/CRIME/etc. WeKan does not have SSL built-in; it uses Caddy/Nginx/Apache, etc., on the front end.
Integrated Caddy support is updated often.
- Email spoofing, SPF, DMARC & DKIM. Wekan does not include email server.
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v8.74.0"
appVersion: "v8.94.0"
files:
userUploads:
- README.md
+3 -3
View File
@@ -130,7 +130,7 @@ template(name="boardList")
if BoardMultiSelection.isActive
.materialCheckBox.multi-selection-checkbox.js-toggle-board-multi-selection(
class="{{#if BoardMultiSelection.isSelected _id}}is-checked{{/if}}")
span.board-handle(title="{{_ 'drag-board'}}")
span.board-handle(title="{{boardWorkspaceDragHint}}")
span.emoji-icon
i.fa.fa-arrows
@@ -158,13 +158,13 @@ template(name="boardList")
if BoardMultiSelection.isActive
.materialCheckBox.multi-selection-checkbox.js-toggle-board-multi-selection(
class="{{#if BoardMultiSelection.isSelected _id}}is-checked{{/if}}")
span.board-handle(title="{{_ 'drag-board'}}")
span.board-handle(title="{{boardWorkspaceDragHint}}")
span.emoji-icon
i.fa.fa-arrows
a.js-open-board(href="{{pathFor 'board' id=_id slug=slug}}")
span.details
span.board-list-item-name(title="{{_ 'board-drag-drop-reorder-or-click-open'}}")
span.board-list-item-name(title="{{boardOpenAndMoveHint}}")
+viewer
= title
unless currentSetting.hideBoardMemberList
+20
View File
@@ -539,6 +539,26 @@ Template.boardList.helpers({
hasBoardsSelected() {
return BoardMultiSelection.count() > 0;
},
boardWorkspaceDragHint() {
const drag = TAPi18n.__('drag-board') || 'Drag board';
const remaining = TAPi18n.__('allboards.remaining') || 'Remaining';
const workspaces = TAPi18n.__('allboards.workspaces') || 'Workspaces';
return `${drag}: ${remaining} <-> ${workspaces}`;
},
boardOpenAndMoveHint() {
const remaining = TAPi18n.__('allboards.remaining') || 'Remaining';
const workspaces = TAPi18n.__('allboards.workspaces') || 'Workspaces';
return (
TAPi18n.__(
'board-open-and-move-between-remaining-and-workspaces',
{
remaining,
workspaces,
},
) ||
`Click board icon to open board. Drag board between ${remaining} and ${workspaces}.`
);
},
});
Template.workspaceTree.helpers({
+33 -27
View File
@@ -11,17 +11,21 @@ template(name="minicard")
a.minicard-details-menu-with-handle.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
i.fa.fa-bars
.dates
if getReceived
.date
+minicardReceivedDate
if getStart
.date
+minicardStartDate
if getDue
.date
+minicardDueDate
if getEnd
+minicardEndDate
if showReceived
if getReceived
.date
+minicardReceivedDate
if showStart
if getStart
.date
+minicardStartDate
if showDue
if getDue
.date
+minicardDueDate
if showEnd
if getEnd
+minicardEndDate
if getSpentTime
.date
+cardSpentTime
@@ -68,19 +72,20 @@ template(name="minicard")
span.linked-icon.linked-archived
i.fa.fa-archive
+viewer
if currentBoard.allowsCardNumber
if showCardNumber
span.card-number
| ##{getCardNumber}
= getTitle
if labels
.minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}")
each labels
unless hiddenMinicardLabelText
span.js-card-label.card-label(class="card-label-{{color}}" title=name)
+viewer
= name
if hiddenMinicardLabelText
.minicard-label(class="card-label-{{color}}" title="{{name}}")
if showLabels
if labels
.minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}")
each labels
unless hiddenMinicardLabelText
span.js-card-label.card-label(class="card-label-{{color}}" title=name)
+viewer
= name
if hiddenMinicardLabelText
.minicard-label(class="card-label-{{color}}" title="{{name}}")
.minicard-custom-fields
each customFieldsWD
@@ -179,12 +184,13 @@ template(name="minicard")
span.badge-icon
i.fa.fa-paperclip
span.badge-text= attachments.length
if allSubtasks.count
.badge
span.badge-icon
i.fa.fa-globe
span.badge-text.check-list-text {{subtasksFinishedCount}}/{{allSubtasksCount}}
//{{subtasksFinishedCount}}/{{subtasksCount}} does not work because when a subtaks is archived, the count goes down
if showSubtasks
if allSubtasks.count
.badge
span.badge-icon
i.fa.fa-globe
span.badge-text.check-list-text {{subtasksFinishedCount}}/{{allSubtasksCount}}
//{{subtasksFinishedCount}}/{{subtasksCount}} does not work because when a subtaks is archived, the count goes down
if currentBoard.allowsCardSortingByNumber
if currentBoard.allowsCardSortingByNumberOnMinicard
.badge
+30 -12
View File
@@ -50,32 +50,50 @@ Template.minicard.helpers({
},
showMembers() {
// cache "board" to reduce the mini-mongodb access
const board = this.board();
let ret = false;
if (board) {
ret =
board.allowsMembers === null ||
board.allowsMembers === undefined ||
board.allowsMembers
;
ret = board.allowsMembersOnMinicard ?? false;
}
return ret;
},
showAssignee() {
// cache "board" to reduce the mini-mongodb access
const board = this.board();
let ret = false;
if (board) {
ret =
board.allowsAssignee === null ||
board.allowsAssignee === undefined ||
board.allowsAssignee
;
ret = board.allowsAssigneeOnMinicard ?? false;
}
return ret;
},
showReceived() {
const board = this.board();
return board ? board.allowsReceivedDateOnMinicard : false;
},
showStart() {
const board = this.board();
return board ? board.allowsStartDateOnMinicard : false;
},
showDue() {
const board = this.board();
return board ? board.allowsDueDateOnMinicard : false;
},
showEnd() {
const board = this.board();
return board ? board.allowsEndDateOnMinicard : false;
},
showLabels() {
const board = this.board();
return board ? board.allowsLabelsOnMinicard : false;
},
showCardNumber() {
const board = this.board();
return board ? board.allowsCardNumberOnMinicard : false;
},
showSubtasks() {
const board = this.board();
return board ? board.allowsSubtasksOnMinicard : false;
},
hiddenMinicardLabelText() {
const currentUser = ReactiveCache.getCurrentUser();
+5 -4
View File
@@ -177,7 +177,6 @@
}
#header-quick-access ul.header-quick-access-list {
transition: opacity 0.2s;
overflow: hidden;
white-space: nowrap;
padding: 10px;
margin: -10px;
@@ -185,16 +184,18 @@
min-width: 0; /* Allow shrinking below content size */
display: flex; /* Use flexbox for better control */
align-items: center;
overflow-x: auto;
scrollbar-color: white #2573a7;
}
/* Hide scrollbar completely */
#header-quick-access ul.header-quick-access-list::-webkit-scrollbar {
display: none;
display: flex;
}
#header-quick-access ul.header-quick-access-list {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
-ms-overflow-style: thin; /* IE and Edge */
scrollbar-width: thin; /* Firefox */
}
#header-quick-access ul.header-quick-access-list li {
display: inline-block; /* Keep inline-block for proper spacing */
-4
View File
@@ -70,10 +70,6 @@ template(name="header")
else
li.current.empty(title="{{_ 'quick-access-description'}}")
| {{_ 'quick-access-description'}}
#header-new-board-icon
// Next line is used only for spacing at header,
// there is no visible clickable icon.
#header-new-board-icon
//
Hide duplicate create board button,
//
+12 -2
View File
@@ -78,23 +78,32 @@
overflow-x: hidden;
}
/* Allow dynamic max-height to override default constraint */
/* Bounded height: flex column + clip so inline max-height cannot spill past the shell.
Class pop-over--bounded matches popup.tpl.jade when max-height is set (more reliable
than attribute substring matching on the style attribute alone). */
.pop-over.pop-over--bounded,
.pop-over[style*='max-height'] {
overflow: hidden;
display: flex;
flex-direction: column;
min-height: 0;
box-sizing: border-box;
}
.pop-over.pop-over--bounded .header,
.pop-over[style*='max-height'] .header {
flex: 0 0 auto;
}
.pop-over.pop-over--bounded .content-wrapper,
.pop-over[style*='max-height'] .content-wrapper {
flex: 1 1 auto;
/* 0% basis: use remaining space under header, scroll inside (not past white bg) */
flex: 1 1 0%;
min-height: 0;
max-height: none;
overflow-y: auto;
overflow-x: hidden;
background: inherit;
}
.pop-over .content-container {
width: 100%;
@@ -103,6 +112,7 @@
}
/* Allow dynamic max-height to override default constraint for content-container */
.pop-over.pop-over--bounded .content-container,
.pop-over[style*='max-height'] .content-container {
max-height: none;
}
+1
View File
@@ -2,6 +2,7 @@
class="{{#unless title}}miniprofile{{/unless}}"
class=currentBoard.colorClass
class="{{#unless title}}no-title{{/unless}}"
class="{{#if offset.maxHeight}}pop-over--bounded{{/if}}"
data-popup="{{popupName}}"
style="left:{{offset.left}}px; top:{{offset.top}}px;{{#if offset.maxHeight}} max-height:{{offset.maxHeight}}px;{{/if}}")
.header
+9 -9
View File
@@ -114,7 +114,7 @@ template(name="orgGeneral")
th {{_ 'shortName'}}
th {{_ 'website'}}
th {{_ 'createdAt'}}
th {{_ 'active'}}
th {{_ 'active-org'}}
tbody
tr
each org in orgList
@@ -137,7 +137,7 @@ template(name="teamGeneral")
th {{_ 'shortName'}}
th {{_ 'website'}}
th {{_ 'createdAt'}}
th {{_ 'active'}}
th {{_ 'active-team'}}
tbody
tr
each team in teamList
@@ -160,7 +160,7 @@ template(name="peopleGeneral")
th {{_ 'username'}}
th {{_ 'email'}}
th {{_ 'admin'}}
th {{_ 'admin-people-active-status'}}
th {{_ 'active-person'}}
th {{_ 'accounts-lockout-status'}}
th {{_ 'createdAt'}}
th
@@ -354,7 +354,7 @@ template(name="editOrgPopup")
| {{_ 'website'}}
input.js-orgWebsite(type="text" value=org.orgWebsite)
label
| {{_ 'active'}}
| {{_ 'active-org'}}
select.select-active.js-org-isactive
option(value="false") {{_ 'no'}}
option(value="true" selected="{{org.orgIsActive}}") {{_ 'yes'}}
@@ -380,7 +380,7 @@ template(name="editTeamPopup")
| {{_ 'website'}}
input.js-teamWebsite(type="text" value=team.teamWebsite)
label
| {{_ 'active'}}
| {{_ 'active-team'}}
select.select-active.js-team-isactive
option(value="false") {{_ 'no'}}
option(value="true" selected="{{team.teamIsActive}}") {{_ 'yes'}}
@@ -427,7 +427,7 @@ template(name="editUserPopup")
option(value="false") {{_ 'no'}}
option(value="true" selected="{{userData.emails.[0].verified}}") {{_ 'yes'}}
label
| {{_ 'active'}}
| {{_ 'active-person'}}
select.select-active.js-profile-isactive
option(value="false") {{_ 'yes'}}
option(value="true" selected="{{user.loginDisabled}}") {{_ 'no'}}
@@ -490,7 +490,7 @@ template(name="newOrgPopup")
| {{_ 'website'}}
input.js-orgWebsite(type="text" value="" required)
label
| {{_ 'active'}}
| {{_ 'active-org'}}
select.select-active.js-org-isactive
option(value="false" selected="selected") {{_ 'no'}}
option(value="true") {{_ 'yes'}}
@@ -514,7 +514,7 @@ template(name="newTeamPopup")
| {{_ 'website'}}
input.js-teamWebsite(type="text" value="")
label
| {{_ 'active'}}
| {{_ 'active-team'}}
select.select-active.js-team-isactive
option(value="false" selected="selected") {{_ 'no'}}
option(value="true") {{_ 'yes'}}
@@ -576,7 +576,7 @@ template(name="newUserPopup")
option(value="false" selected="selected") {{_ 'no'}}
option(value="true") {{_ 'yes'}}
label
| {{_ 'active'}}
| {{_ 'active-person'}}
select.select-active.js-profile-isactive
option(value="false" selected="selected") {{_ 'yes'}}
option(value="true") {{_ 'no'}}
+30 -30
View File
@@ -177,8 +177,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-receiveddate(title="{{_ 'card-received'}}" class="{{#if allowsReceivedDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsReceivedDate}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-receiveddate(title="{{_ 'card-received'}}" class="{{#if allowsReceivedDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsReceivedDate}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-receiveddate-on-minicard(title="{{_ 'card-received'}}" class="{{#if allowsReceivedDateOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsReceivedDateOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-sign-in
@@ -188,8 +188,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-startdate(title="{{_ 'card-start'}}" class="{{#if allowsStartDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsStartDate}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-startdate(title="{{_ 'card-start'}}" class="{{#if allowsStartDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsStartDate}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-startdate-on-minicard(title="{{_ 'card-start'}}" class="{{#if allowsStartDateOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsStartDateOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-hourglass
@@ -199,8 +199,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-duedate(title="{{_ 'card-due'}}" class="{{#if allowsDueDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsDueDate}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-duedate(title="{{_ 'card-due'}}" class="{{#if allowsDueDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsDueDate}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-duedate-on-minicard(title="{{_ 'card-due'}}" class="{{#if allowsDueDateOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsDueDateOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-sign-in
@@ -210,8 +210,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-enddate(title="{{_ 'card-end'}}" class="{{#if allowsEndDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsEndDate}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-enddate(title="{{_ 'card-end'}}" class="{{#if allowsEndDate}}is-checked{{/if}}")
i.fa(class="{{#if allowsEndDate}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-enddate-on-minicard(title="{{_ 'card-end'}}" class="{{#if allowsEndDateOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsEndDateOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-clock-o
@@ -221,8 +221,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-members(title="{{_ 'members'}}" class="{{#if allowsMembers}}is-checked{{/if}}")
i.fa(class="{{#if allowsMembers}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-members(title="{{_ 'members'}}" class="{{#if allowsMembers}}is-checked{{/if}}")
i.fa(class="{{#if allowsMembers}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-members-on-minicard(title="{{_ 'members'}}" class="{{#if allowsMembersOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsMembersOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-users
@@ -252,8 +252,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-assignee(title="{{_ 'assignee'}}" class="{{#if allowsAssignee}}is-checked{{/if}}")
i.fa(class="{{#if allowsAssignee}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-assignee(title="{{_ 'assignee'}}" class="{{#if allowsAssignee}}is-checked{{/if}}")
i.fa(class="{{#if allowsAssignee}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-assignee-on-minicard(title="{{_ 'assignee'}}" class="{{#if allowsAssigneeOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsAssigneeOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-user
@@ -263,8 +263,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-assigned-by(title="{{_ 'assigned-by'}}" class="{{#if allowsAssignedBy}}is-checked{{/if}}")
i.fa(class="{{#if allowsAssignedBy}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-assigned-by(title="{{_ 'assigned-by'}}" class="{{#if allowsAssignedBy}}is-checked{{/if}}")
i.fa(class="{{#if allowsAssignedBy}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-assigned-by-on-minicard(title="{{_ 'assigned-by'}}" class="{{#if allowsAssignedByOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsAssignedByOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-shopping-cart
@@ -274,8 +274,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-requested-by(title="{{_ 'requested-by'}}" class="{{#if allowsRequestedBy}}is-checked{{/if}}")
i.fa(class="{{#if allowsRequestedBy}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-requested-by(title="{{_ 'requested-by'}}" class="{{#if allowsRequestedBy}}is-checked{{/if}}")
i.fa(class="{{#if allowsRequestedBy}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-requested-by-on-minicard(title="{{_ 'requested-by'}}" class="{{#if allowsRequestedByOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsRequestedByOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-user
@@ -316,8 +316,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-labels(title="{{_ 'labels'}}" class="{{#if allowsLabels}}is-checked{{/if}}")
i.fa(class="{{#if allowsLabels}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-labels(title="{{_ 'labels'}}" class="{{#if allowsLabels}}is-checked{{/if}}")
i.fa(class="{{#if allowsLabels}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-labels-on-minicard(title="{{_ 'labels'}}" class="{{#if allowsLabelsOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsLabelsOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-tag
@@ -337,8 +337,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-card-number(title="{{_ 'card'}} {{_ 'number'}}" class="{{#if allowsCardNumber}}is-checked{{/if}}")
i.fa(class="{{#if allowsCardNumber}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-card-number(title="{{_ 'card'}} {{_ 'number'}}" class="{{#if allowsCardNumber}}is-checked{{/if}}")
i.fa(class="{{#if allowsCardNumber}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-card-number-on-minicard(title="{{_ 'card'}} {{_ 'number'}}" class="{{#if allowsCardNumberOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsCardNumberOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
| #️⃣
@@ -349,8 +349,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-description-title(title="{{_ 'description'}} {{_ 'title'}}" class="{{#if allowsDescriptionTitle}}is-checked{{/if}}")
i.fa(class="{{#if allowsDescriptionTitle}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-description-title(title="{{_ 'description'}} {{_ 'title'}}" class="{{#if allowsDescriptionTitle}}is-checked{{/if}}")
i.fa(class="{{#if allowsDescriptionTitle}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-description-title-on-minicard(title="{{_ 'description'}} {{_ 'title'}}" class="{{#if allowsDescriptionTitleOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsDescriptionTitleOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-file-text-o
@@ -361,8 +361,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-description-text(title="{{_ 'description'}} {{_ 'custom-field-text'}}" class="{{#if allowsDescriptionText}}is-checked{{/if}}")
i.fa(class="{{#if allowsDescriptionText}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-description-text(title="{{_ 'description'}} {{_ 'custom-field-text'}}" class="{{#if allowsDescriptionText}}is-checked{{/if}}")
i.fa(class="{{#if allowsDescriptionText}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-description-text-on-minicard(title="{{_ 'description'}} {{_ 'custom-field-text'}}" class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsDescriptionTextOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-file-text-o
@@ -383,8 +383,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-checklists(title="{{_ 'checklists'}}" class="{{#if allowsChecklists}}is-checked{{/if}}")
i.fa(class="{{#if allowsChecklists}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-checklists(title="{{_ 'checklists'}}" class="{{#if allowsChecklists}}is-checked{{/if}}")
i.fa(class="{{#if allowsChecklists}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-checklists-on-minicard(title="{{_ 'checklists'}}" class="{{#if allowsChecklistsOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsChecklistsOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-check
@@ -394,8 +394,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-subtasks(title="{{_ 'subtasks'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}")
i.fa(class="{{#if allowsSubtasks}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-subtasks(title="{{_ 'subtasks'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}")
i.fa(class="{{#if allowsSubtasks}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-subtasks-on-minicard(title="{{_ 'subtasks'}}" class="{{#if allowsSubtasksOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsSubtasksOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-globe
@@ -405,8 +405,8 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-attachments(title="{{_ 'attachments'}}" class="{{#if allowsAttachments}}is-checked{{/if}}")
i.fa(class="{{#if allowsAttachments}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-attachments(title="{{_ 'attachments'}}" class="{{#if allowsAttachments}}is-checked{{/if}}")
i.fa(class="{{#if allowsAttachments}}fa-check{{else}}fa-square-o{{/if}}")
a.flex.js-field-has-attachments-on-minicard(title="{{_ 'attachments'}}" class="{{#if allowsAttachmentsOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsAttachmentsOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-paperclip
+140
View File
@@ -1029,26 +1029,51 @@ Template.boardCardSettingsPopup.helpers({
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsReceivedDate : false;
},
allowsReceivedDateOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsReceivedDateOnMinicard : false;
},
allowsStartDate() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsStartDate : false;
},
allowsStartDateOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsStartDateOnMinicard : false;
},
allowsDueDate() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsDueDate : false;
},
allowsDueDateOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsDueDateOnMinicard : false;
},
allowsEndDate() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsEndDate : false;
},
allowsEndDateOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsEndDateOnMinicard : false;
},
allowsSubtasks() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsSubtasks : false;
},
allowsSubtasksOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsSubtasksOnMinicard : false;
},
allowsCreator() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
@@ -1064,21 +1089,41 @@ Template.boardCardSettingsPopup.helpers({
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsMembers : false;
},
allowsMembersOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsMembersOnMinicard : false;
},
allowsAssignee() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAssignee : false;
},
allowsAssigneeOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAssigneeOnMinicard : false;
},
allowsAssignedBy() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAssignedBy : false;
},
allowsAssignedByOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAssignedByOnMinicard : false;
},
allowsRequestedBy() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsRequestedBy : false;
},
allowsRequestedByOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsRequestedByOnMinicard : false;
},
allowsCardSortingByNumber() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
@@ -1094,6 +1139,11 @@ Template.boardCardSettingsPopup.helpers({
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsLabels : false;
},
allowsLabelsOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsLabelsOnMinicard : false;
},
allowsShowListsOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
@@ -1104,11 +1154,21 @@ Template.boardCardSettingsPopup.helpers({
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsChecklists : false;
},
allowsChecklistsOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsChecklistsOnMinicard : false;
},
allowsAttachments() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAttachments : false;
},
allowsAttachmentsOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAttachmentsOnMinicard : false;
},
allowsComments() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
@@ -1119,11 +1179,21 @@ Template.boardCardSettingsPopup.helpers({
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsCardNumber : false;
},
allowsCardNumberOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsCardNumberOnMinicard : false;
},
allowsDescriptionTitle() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsDescriptionTitle : false;
},
allowsDescriptionTitleOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsDescriptionTitleOnMinicard : false;
},
allowsDescriptionText() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
@@ -1213,26 +1283,51 @@ Template.boardCardSettingsPopup.events({
const newValue = !tpl.currentBoard.allowsReceivedDate;
Boards.update(tpl.currentBoard._id, { $set: { allowsReceivedDate: newValue } });
},
'click .js-field-has-receiveddate-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsReceivedDateOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsReceivedDateOnMinicard: newValue } });
},
'click .js-field-has-startdate'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsStartDate;
Boards.update(tpl.currentBoard._id, { $set: { allowsStartDate: newValue } });
},
'click .js-field-has-startdate-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsStartDateOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsStartDateOnMinicard: newValue } });
},
'click .js-field-has-enddate'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsEndDate;
Boards.update(tpl.currentBoard._id, { $set: { allowsEndDate: newValue } });
},
'click .js-field-has-enddate-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsEndDateOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsEndDateOnMinicard: newValue } });
},
'click .js-field-has-duedate'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsDueDate;
Boards.update(tpl.currentBoard._id, { $set: { allowsDueDate: newValue } });
},
'click .js-field-has-duedate-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsDueDateOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsDueDateOnMinicard: newValue } });
},
'click .js-field-has-subtasks'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsSubtasks;
Boards.update(tpl.currentBoard._id, { $set: { allowsSubtasks: newValue } });
},
'click .js-field-has-subtasks-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsSubtasksOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsSubtasksOnMinicard: newValue } });
},
'click .js-field-has-creator'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsCreator;
@@ -1248,21 +1343,41 @@ Template.boardCardSettingsPopup.events({
const newValue = !tpl.currentBoard.allowsMembers;
Boards.update(tpl.currentBoard._id, { $set: { allowsMembers: newValue } });
},
'click .js-field-has-members-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsMembersOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsMembersOnMinicard: newValue } });
},
'click .js-field-has-assignee'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAssignee;
Boards.update(tpl.currentBoard._id, { $set: { allowsAssignee: newValue } });
},
'click .js-field-has-assignee-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAssigneeOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsAssigneeOnMinicard: newValue } });
},
'click .js-field-has-assigned-by'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAssignedBy;
Boards.update(tpl.currentBoard._id, { $set: { allowsAssignedBy: newValue } });
},
'click .js-field-has-assigned-by-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAssignedByOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsAssignedByOnMinicard: newValue } });
},
'click .js-field-has-requested-by'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsRequestedBy;
Boards.update(tpl.currentBoard._id, { $set: { allowsRequestedBy: newValue } });
},
'click .js-field-has-requested-by-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsRequestedByOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsRequestedByOnMinicard: newValue } });
},
'click .js-field-has-card-sorting-by-number'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsCardSortingByNumber;
@@ -1278,6 +1393,11 @@ Template.boardCardSettingsPopup.events({
const newValue = !tpl.currentBoard.allowsLabels;
Boards.update(tpl.currentBoard._id, { $set: { allowsLabels: newValue } });
},
'click .js-field-has-labels-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsLabelsOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsLabelsOnMinicard: newValue } });
},
'click .js-field-has-card-show-lists-on-minicard'(evt, tpl) {
evt.preventDefault();
tpl.currentBoard.allowsShowListsOnMinicard = !tpl.currentBoard
@@ -1310,6 +1430,11 @@ Template.boardCardSettingsPopup.events({
tpl.currentBoard.allowsDescriptionTitle,
);
},
'click .js-field-has-description-title-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsDescriptionTitleOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsDescriptionTitleOnMinicard: newValue } });
},
'click .js-field-has-card-number'(evt, tpl) {
evt.preventDefault();
tpl.currentBoard.allowsCardNumber = !tpl.currentBoard
@@ -1326,6 +1451,11 @@ Template.boardCardSettingsPopup.events({
tpl.currentBoard.allowsCardNumber,
);
},
'click .js-field-has-card-number-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsCardNumberOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsCardNumberOnMinicard: newValue } });
},
'click .js-field-has-description-text-on-minicard'(evt, tpl) {
evt.preventDefault();
tpl.currentBoard.allowsDescriptionTextOnMinicard = !tpl.currentBoard
@@ -1374,6 +1504,11 @@ Template.boardCardSettingsPopup.events({
tpl.currentBoard.allowsChecklists,
);
},
'click .js-field-has-checklists-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsChecklistsOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsChecklistsOnMinicard: newValue } });
},
'click .js-field-has-attachments'(evt, tpl) {
evt.preventDefault();
tpl.currentBoard.allowsAttachments = !tpl.currentBoard
@@ -1390,6 +1525,11 @@ Template.boardCardSettingsPopup.events({
tpl.currentBoard.allowsAttachments,
);
},
'click .js-field-has-attachments-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAttachmentsOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsAttachmentsOnMinicard: newValue } });
},
'click .js-field-has-comments'(evt, tpl) {
evt.preventDefault();
tpl.currentBoard.allowsComments = !tpl.currentBoard.allowsComments;
+7 -1
View File
@@ -171,7 +171,7 @@ services:
# Leave it unset or empty to skip migration.
#-------------------------------------------------------------------------------------
#wekan-migrate:
# image: node:22.22.2-slim
# image: node:24.14.1-slim
# container_name: wekan-migrate
# restart: "no"
# networks:
@@ -289,6 +289,12 @@ services:
# remove port mapping if you use nginx reverse proxy, port 8080 is already exposed to wekan-tier network
- 80:8080
environment:
#-------------------- USING MONGODB CHANGE STREAMS WITH REPLICA SETS AT CURRENT DATABASE --------------------
# If you would not like to use Change Streams and replica set for improving speed, change to use polling:
#- METEOR_REACTIVITY_ORDER=polling
# https://forums.meteor.com/t/meteor-3-5-beta-change-streams-performance-improvements/64461#change-streams-setup-3
# https://github.com/meteor/meteor/blob/release-3.5/v3-docs/docs/performance/change-streams-observer-driver.md#choosing-the-reactivity-driver-order
- METEOR_REACTIVITY_ORDER=changeStreams,oplog,polling
#-----------------------------------------------------------------
# ==== WRITEABLE PATH FOR FILE UPLOADS ====
- WRITABLE_PATH=/data
@@ -0,0 +1,33 @@
# History of Schema Migration Systems
1. At `server/migrations.js` was changes to database schema, but making modifications to thousands
of cards did take many hours, it is too much time.
2. There was Admin Panel options to migrate attachments from MongoDB GridFS to filesystem, but that could
cause WeKan to become unresponsive, it did take too much resources.
3. There was separate migration script to change database schema, but it was incomplete, some data was not migrated.
4. Migrations were moved to opening of board, but that caused opening board to take too much time
5. Migrations were moved to Right Sidebar/Board Settings/Migrations, but there was complains that
it is too much try to get users to learn using those migrations, and it could take
many hours for migrations to run at big board. Also, there was Responsible Security Disclosure
that Board Admins have too much rights to change board structure so much, so migrations were moved
to Admin Panel to be used only by Admins.
6. At Admin Panel/Cron, migrations did not show progress of migrations well enough, it looked like no
migrations were happening, migrations did take too much time, and WeKan did slow down while migrations
were in progress, as was seen at increased CPU and RAM usage.
7. Migrations were commented out, so that they would not slow down WeKan anymore.
8. WeKan was migrated to Meteor 3.x.
9. Someone added datetime migrations, to convert previous date strings to Date Objects, that PR was merged,
but questions still is, does it cause too much slowdown. It should have been changed to detect and show
any current date, detecting is it a string or Date Object.
10. There was added code, that could show all Swimlanes/Lists/Cards without migrations, showing both
previous Shared Lists and newest Per-Swimlane Lists, and also orphaned Swimlanes/Lists/Cards.
But there was bug that something still disappeared when moving. It remains to be seen,
can there continue to be showing all data without migrations, can that code be made to work,
or is it really necessary to reintroduce migrations that take too much time.
How should migrations work?
a) Separate migrations script, that would be run before starting WeKan?
b) Reading any database structure and showing data, without needing to migrate any data?
c) Migrating while WeKan is running, that could cause slowdown?
d) Some other way?
+3 -3
View File
@@ -10,8 +10,8 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-8.74-win64.zip](https://github.com/wekan/wekan/releases/download/v8.74/wekan-8.74-win64.zip)
2. [node.exe](https://nodejs.org/dist/latest-v22.x/win-x64/node.exe)
1. [wekan-8.94-win64.zip](https://github.com/wekan/wekan/releases/download/v8.94/wekan-8.94-win64.zip)
2. [node.exe](https://nodejs.org/dist/latest-v24.x/win-x64/node.exe)
3. [mongodb-windows-x86_64-7.0.31-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-7.0.31-signed.msi)
@@ -21,7 +21,7 @@ Right click and download files 1-4:
6. Double click `mongodb-windows-x86_64-7.0.31-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-8.74-win64.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-8.94-win64.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+6
View File
@@ -0,0 +1,6 @@
repositoryID: f6dde1c7-7cc4-4053-870c-0dc6a73d9ac9
owners:
- name: wekan
email: support@wekan.fi
- name: xet7
email: x@xet7.org
File diff suppressed because it is too large. Load diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loaded 100 of 425 files, more files were not shown because too many files have changed in this diff. Show more