Compare commits

...
103 Commits
Author SHA1 Message Date
Lauri Ojansivu 2f5670e830 v7.97 2025-10-08 23:57:08 +03:00
Lauri Ojansivu 108b18cebf Updated ChangeLog. 2025-10-08 23:48:26 +03:00
Lauri Ojansivu 814ac22a0d Updated ChangeLog. 2025-10-08 23:43:55 +03:00
Lauri Ojansivu 3814a218c2 Removed white box that appeared when clicking something.
Thanks to xet7 !

Fixes #5899
2025-10-08 23:38:44 +03:00
Lauri Ojansivu 3fda90612d Some mobile fixes.
Thanks to xet7 !

Fixes #5899
2025-10-08 23:32:13 +03:00
Lauri Ojansivu 05762aa50c Updated ChangeLog. 2025-10-08 09:37:51 +03:00
Lauri Ojansivu 9a31371de0 Fixed translation of "Change Language" at login page.
Thanks to xet7 !
2025-10-08 09:36:39 +03:00
Lauri Ojansivu b9b7143185 Updated ChangeLog. 2025-10-08 09:21:26 +03:00
Lauri Ojansivu 972721bdb5 Merge branch 'seve12-main' 2025-10-08 09:17:53 +03:00
Lauri Ojansivu 3a48982916 v7.96 2025-10-08 08:44:09 +03:00
Lauri Ojansivu 6b3a6f9f7d Updated ChangeLog. 2025-10-08 08:44:09 +03:00
Lauri Ojansivu 48fddecb62 Updated to MongoDB 7.0.25 at Snap Candidate.
Thanks to MongoDB developers !
2025-10-08 08:44:09 +03:00
Lauri Ojansivu 7f0d1cc5b3 Updated ChangeLog. 2025-10-08 08:44:09 +03:00
Lauri Ojansivu 70e82be0b4 Hide extra keyboard shortcuts toggle. Thanks to xet7. 2025-10-08 08:44:09 +03:00
Lauri Ojansivu 5fc0809844 Updated ChangeLog. 2025-10-08 08:44:09 +03:00
Lauri Ojansivu c79990bcd9 Added missing screenshots from wekan.github.io history to wekan/docs/Features/ . Thanks to xet7 2025-10-08 08:44:09 +03:00
dependabot[bot] cd9e7412ea Bump docker/login-action from 3.5.0 to 3.6.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/184bdaa0721073962dff0199f1fb9940f07167d1...5e57cd118135c172c3672efd75eb46360885c0ef)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-08 08:44:09 +03:00
Lauri Ojansivu 3e472606b5 Fixed links at docs. Thanks to xet7 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 2966bc3204 Updated translations 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 5dc6093eec Updated email address 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 86fc60f5ba Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 8189a3f9ab Fixed find.sh script errors about unmatched single quotes and binary files that are now ignored.
Thanks to xet7 !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu 76a65e2533 Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Jean-Sébastien Guay ad2914934e Fix links in docker-compose.yml to point to doc in repo 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 2769ba2874 Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 294f1e178e Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu c994d34bb8 Updated to MongoDB 7.0.24 at Snap Candidate.
Thanks to MongoDB developers !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu 42b5dd0751 Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu f884d6d471 Added missing mobile drag drop image to docs from wekan.github.io git history.
Thanks to xet7 !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu abe915a8d6 Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu a2e8de2fd8 Updated release script for new command of uploading snap package to Snap Store.
Thanks to xet7 !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu e34ca6a8a5 v7.95 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 596c9de603 Updated translations 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 4170361a1c Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 978a36ea77 Updated dependencies.
Thanks to developers of dependencies !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu 8745ef7de8 Reorganized docs 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 2ce929b7b3 Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 2dcdfa2862 Added PGP public key for sending encrypted email.
Thanks to xet7 !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu b18daac9c9 Updated ChangeLog. 2025-10-08 08:44:08 +03:00
sowwos 606041a00d docs(windows): clarify WRITABLE_PATH/attachments + LAN bind instructions (nits) 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 4ed5952a81 Updates 2025-10-08 08:44:08 +03:00
Lauri Ojansivu 37bfce2eb7 Added missing image to WeKan Multiverse page.
Thanks to xet7 !
2025-10-08 08:44:08 +03:00
Lauri Ojansivu 59541699ce Updated ChangeLog. 2025-10-08 08:44:08 +03:00
Lauri Ojansivu af73c16e37 More info about ToroDB, FerretDB, Turso, TigerBeetle, PostgreSQL, SQLite etc.
Thanks to xet7 !
2025-10-08 08:44:07 +03:00
Lauri Ojansivu 673b09b84b Updated ChangeLog. 2025-10-08 08:44:07 +03:00
Lauri Ojansivu 09f8edfead Fixed image link at docs.
Thanks to xet7 !
2025-10-08 08:44:07 +03:00
Lauri Ojansivu e1ebdeca4f Updated ChangeLog. 2025-10-08 08:44:07 +03:00
Lauri Ojansivu 31769aa4af Updated upgrade link.
Thanks to xet7 !
2025-10-08 08:44:07 +03:00
seve12 b32ad86ce7 fixed issue 5887 2025-10-07 22:23:19 +03:00
Lauri Ojansivu 7350473a65 v7.96 2025-10-07 01:14:42 +03:00
Lauri Ojansivu 1c87e337d6 Updated ChangeLog. 2025-10-07 01:06:21 +03:00
Lauri Ojansivu dec038e7ed Updated to MongoDB 7.0.25 at Snap Candidate.
Thanks to MongoDB developers !
2025-10-07 01:05:01 +03:00
Lauri Ojansivu ebe6f7813e Updated ChangeLog. 2025-10-07 00:45:05 +03:00
Lauri Ojansivu 706dbfacac Merge branch 'seve12-main' 2025-10-07 00:36:50 +03:00
Lauri Ojansivu 62ad588aa9 Hide extra keyboard shortcuts toggle. Thanks to xet7. 2025-10-07 00:35:17 +03:00
Lauri Ojansivu 3c776e2ab6 Merge branch 'main' of github.com:seve12/wekan into seve12-main 2025-10-07 00:19:46 +03:00
seve12 ab4e2d1ed6 fixed issue #5885 2025-10-06 16:34:49 +03:00
Lauri Ojansivu 5e90c4a142 Updated ChangeLog. 2025-10-02 20:15:35 +03:00
Lauri Ojansivu 9a7fa25ca3 Added missing screenshots from wekan.github.io history to wekan/docs/Features/ . Thanks to xet7 2025-10-02 20:05:38 +03:00
Lauri Ojansivu 65cb0641f3 Merge branch 'main' of github.com:wekan/wekan 2025-10-02 19:57:56 +03:00
Lauri Ojansivu 6f2b891214 Fixed links at docs. Thanks to xet7 2025-10-02 19:57:28 +03:00
Lauri Ojansivu 44d7ab83ec Merge pull request #5890 from wekan/dependabot/github_actions/docker/login-action-3.6.0
Bump docker/login-action from 3.5.0 to 3.6.0
2025-10-02 00:06:19 +03:00
dependabot[bot] b328cc3f6a Bump docker/login-action from 3.5.0 to 3.6.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/184bdaa0721073962dff0199f1fb9940f07167d1...5e57cd118135c172c3672efd75eb46360885c0ef)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 23:33:41 +00:00
seve12 836226a8d3 RICHER_CARD_COMMENT_EDITOR=true has no effect (no rich text toolbar shown) fixed! 2025-09-29 15:56:23 +03:00
Lauri Ojansivu 2083f6630a Updated translations 2025-09-28 00:42:45 +03:00
Lauri Ojansivu 25e1e9028f Updated email address 2025-09-28 00:38:04 +03:00
seve12 a5651c686f fix 22.9 Unable to download large PDF files attached to card issue fixed 2025-09-23 13:40:14 +03:00
Lauri Ojansivu 93f0e0b125 Updated ChangeLog. 2025-09-21 15:01:17 +03:00
Lauri Ojansivu 730bb6d166 Fixed find.sh script errors about unmatched single quotes and binary files that are now ignored.
Thanks to xet7 !
2025-09-21 14:59:00 +03:00
Lauri Ojansivu 855bac59bf Updated ChangeLog. 2025-09-19 23:46:32 +03:00
Lauri Ojansivu 870900b92a Merge pull request #5882 from Skylark13/main
Fix links in docker-compose.yml to point to doc in repo
2025-09-19 23:45:09 +03:00
Jean-Sébastien Guay a1d5802d36 Fix links in docker-compose.yml to point to doc in repo 2025-09-19 15:26:53 -04:00
Lauri Ojansivu 6e16fa3992 Updated ChangeLog. 2025-09-19 16:35:59 +03:00
Lauri Ojansivu ee3b49ce59 Updated ChangeLog. 2025-09-19 03:08:40 +03:00
Lauri Ojansivu 3253dd5010 Updated to MongoDB 7.0.24 at Snap Candidate.
Thanks to MongoDB developers !
2025-09-19 03:06:06 +03:00
Lauri Ojansivu a10d8e0438 Updated ChangeLog. 2025-09-19 01:56:18 +03:00
Lauri Ojansivu 5151814e98 Added missing mobile drag drop image to docs from wekan.github.io git history.
Thanks to xet7 !
2025-09-19 01:54:01 +03:00
Lauri Ojansivu 2e2a0f01f4 Updated ChangeLog. 2025-09-18 23:11:33 +03:00
Lauri Ojansivu dec9b82da0 Updated release script for new command of uploading snap package to Snap Store.
Thanks to xet7 !
2025-09-18 23:09:03 +03:00
Lauri Ojansivu 33f4db5871 v7.95 2025-09-18 21:59:50 +03:00
Lauri Ojansivu 9a086c0397 Updated translations 2025-09-18 21:43:38 +03:00
Lauri Ojansivu 013ddb8978 Updated ChangeLog. 2025-09-18 21:34:15 +03:00
Lauri Ojansivu c4161c5ce6 Updated dependencies.
Thanks to developers of dependencies !
2025-09-18 21:29:36 +03:00
seve12 392b8dd5b2 fix 17.9.2025 2025-09-17 22:34:46 +03:00
seve12 d19eb801f3 fixes 16.9.2025 2025-09-16 23:05:35 +03:00
seve12 ed416ca555 fixes 25.9 2025-09-15 19:31:18 +03:00
seve12 106009316f more fixes 2025-09-10 17:17:51 +03:00
seve12 cb10ad3a20 Fixed 9.2.4.6, 9.1.3.5 and 11.7 2025-09-10 13:04:37 +03:00
Lauri Ojansivu 2fad0099e4 Reorganized docs 2025-08-27 16:11:15 +03:00
Lauri Ojansivu 454416b0bd Updated ChangeLog. 2025-08-26 15:15:44 +03:00
Lauri Ojansivu dd80b7308b Added PGP public key for sending encrypted email.
Thanks to xet7 !
2025-08-26 15:14:19 +03:00
Lauri Ojansivu fe5c5f1bdc Updated ChangeLog. 2025-08-21 13:11:51 +03:00
Lauri Ojansivu 79074deb34 Merge pull request #5872 from sowwos/docs/windows-offline-clarify
This adds two actionable Windows notes to docs/Platforms/Propietary/Windows/Offline.md:  - Explain that WRITABLE_PATH and ATTACHMENTS_STORE_PATH must be set before start to avoid the attachments error   (“The 'path' argument must be of type string. Received undefined” from models/attachments.js). - Show how to expose the dev server on LAN on Windows (BIND_IP=0.0.0.0 + ROOT_URL=http://<LAN-IP>:4000).  Tested on Windows 11 with Meteor dev server. Follow-up to #5871 (closed as wrong file).
2025-08-21 13:07:59 +03:00
sowwos db0294c95e docs(windows): clarify WRITABLE_PATH/attachments + LAN bind instructions (nits) 2025-08-21 07:19:13 +03:00
Lauri Ojansivu 8f0fa88eac Updates 2025-08-20 03:20:49 +03:00
Lauri Ojansivu 946f7045e9 Added missing image to WeKan Multiverse page.
Thanks to xet7 !
2025-08-20 03:19:26 +03:00
Lauri Ojansivu dda8c90d44 Updated ChangeLog. 2025-08-20 02:26:20 +03:00
Lauri Ojansivu 701485d76a More info about ToroDB, FerretDB, Turso, TigerBeetle, PostgreSQL, SQLite etc.
Thanks to xet7 !
2025-08-20 02:24:38 +03:00
Lauri Ojansivu b25198b87e Updated ChangeLog. 2025-08-20 00:58:58 +03:00
Lauri Ojansivu ad7e3774c2 Fixed image link at docs.
Thanks to xet7 !
2025-08-20 00:57:40 +03:00
Lauri Ojansivu ee67dea96c Updated ChangeLog. 2025-08-20 00:43:26 +03:00
Lauri Ojansivu b3d3bf1593 Updated upgrade link.
Thanks to xet7 !
2025-08-20 00:41:22 +03:00
Lauri Ojansivu 53726fed24 Updated WeKan version to Dockerfile.
Thanks to xet7 !
2025-08-18 19:01:19 +03:00
62 changed files with 912 additions and 290 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
## Issue
UPGRADE OR MIGRATE: https://github.com/wekan/wekan/blob/main/docs/Upgrade/Upgrade.md
UPGRADE: https://wekan.fi/upgrade/
Pull requests welcome to fix any broken links at docs directory, and organizing docs/Features and their screenshots to subdirectories of each feature.
+1 -1
View File
@@ -38,7 +38,7 @@ jobs:
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
+67 -3
View File
@@ -10,16 +10,80 @@ Newest WeKan at these platforms:
- Snap Candidate amd64
- Docker amd64
- 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.
- Node.js 14.x at https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4 and https://nodejs.org/dist/latest-v14.x/
- MongoDB 6.x and 7.x, or FerretDB/PostgreSQL https://blog.ferretdb.io/building-project-management-stack-wekan-ferretdb/
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
[Upgrade WeKan](https://wekan.fi/upgrade/)
- Question: Broadcom to discontinue free Bitnami Helm charts. WeKan uses Bitnami MongoDB.
What to do? Help and PRs welcome at https://github.com/wekan/charts/issues/43 . Thanks!
# v7.97 2025-10-08 WeKan ® release
This release fixes the following bugs:
- [Fixed Collapse button not there when using clearlight board theme](https://github.com/wekan/wekan/pull/5900).
Thanks to seve12.
- [Fixed translation of "Change Language" at login page](https://github.com/wekan/wekan/commit/9a31371de0e155d3144769f45a1fa216872935eb).
Thanks to xet7.
- [Some mobile and tablet fixes. Show drag handles at touch screens only. No toggle of drag handles anymore](https://github.com/wekan/wekan/commit/3fda90612d88fc5a8f1e17ae5c399745de06aada).
Thanks to xet7.
- [Removed white box that appeared when clicking something](https://github.com/wekan/wekan/commit/3814a218c2dab3ed9e8908c3a2de996ffebf6d9d).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.96 2025-10-07 WeKan ® release
This release adds the following updates:
- [Updated release script for new command of uploading snap package to Snap Store](https://github.com/wekan/wekan/commit/dec9b82da0d700aafd7e2b2063b5d5b07dd383c3).
Thanks to xet7.
- [Updated to MongoDB 7.0.25 at Snap Candidate](https://github.com/wekan/wekan/commit/dec038e7edce11e2ce59de974aa870d7266af33b).
Thanks to MongoDB developers.
and fixes the following bugs:
- [Added missing mobile drag drop image to docs from wekan.github.io git history](https://github.com/wekan/wekan/commit/5151814e98599c22fff98dc7c42fbf634004ab20).
Thanks to xet7.
- [Fix links in docker-compose.yml to point to doc in repo](https://github.com/wekan/wekan/pull/5882).
Thanks to Skylark13.
- [Fixed find.sh script errors about unmatched single quotes and binary files that are now ignored](https://github.com/wekan/wekan/commit/730bb6d166baa5530cc75b4c94ae46c8077884b0).
Thanks to xet7.
- [Fixed links at docs](https://github.com/wekan/wekan/commit/6f2b89121402df8ecba88295ad09f5c4179ab0ed).
Thanks to xet7.
- [Added missing screenshots from wekan.github.io history to wekan/docs/Features/](https://github.com/wekan/wekan/commit/9a7fa25ca33d4267e193f0f9bb97b09c490e44fe).
Thanks to xet7.
- [Some accessibility, saving, downloading and editor fixes](https://github.com/wekan/wekan/pull/5895).
Thanks to seve12.
- [Hide extra keyboard shortcuts toggle](https://github.com/wekan/wekan/commit/62ad588aa982cd4305a8817cf21f0818234f4354).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.95 2025-09-18 WeKan ® release
This release adds the following updates:
- [Updated upgrade link at repo readme](https://github.com/wekan/wekan/commit/b3d3bf159376d56048361a385f0b295667e2319c).
Thanks to xet7.
- [Fixed image link at docs](https://github.com/wekan/wekan/commit/ad7e3774c2b29265a8fbefdde7b9b83822af6def).
Thanks to xet7.
- [More info about ToroDB, FerretDB, Turso, TigerBeetle, PostgreSQL, SQLite etc](https://github.com/wekan/wekan/commit/701485d76aded5ee4fa17967d94918132a821af6).
Thanks to xet7.
- [Added missing image to WeKan Multiverse page](https://github.com/wekan/wekan/commit/946f7045e92e26bbe8d182634844ee5eebf73564).
Thanks to xet7.
- [Added more info to Windows Offline docs about WRITABLE_PATH and ATTACHMENTS_STORE_PATH](https://github.com/wekan/wekan/pull/5872).
Thanks to sowwos.
- [Added PGP public key for sending encrypted email](https://github.com/wekan/wekan/commit/dd80b7308bb6c66113c8e6009c442a44a29e477a).
Thanks to xet7.
- [Updated dependencies](https://github.com/wekan/wekan/commit/c4161c5ce69a35c76364b13bcc456905f6335162).
Thanks to developers of dependencies.
- [Replace bitnami mongodb Helm chart by groundhog2k one](https://github.com/wekan/charts/pull/44).
Thanks to ariep.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.94 2025-08-18 WeKan ® release
+1 -1
View File
@@ -11,7 +11,7 @@ For all code at WeKan GitHub Organization https://github.com/wekan
## Private reports
- Email support@wekan.team
- Email support@wekan.fi
- Security issues: [SECURITY.md](SECURITY.md)
- License violations
- Anything private, sensitive or negative
+3 -2
View File
@@ -244,8 +244,9 @@ cd /home/wekan/app
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
#rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy
#mv /home/wekan/app_build/bundle /build
wget "https://github.com/wekan/wekan/releases/download/v7.93/wekan-7.93-amd64.zip"
unzip wekan-7.93-amd64.zip
wget "https://github.com/wekan/wekan/releases/download/v7.97/wekan-7.97-amd64.zip"
unzip wekan-7.97-amd64.zip
rm wekan-7.97-amd64.zip
mv /home/wekan/app/bundle /build
# Put back the original tar
+1 -7
View File
@@ -1,5 +1,3 @@
[Gitpod Ready-to-Code](https://gitpod.io/#https://github.com/wekan/wekan)
# WeKan ® - Open Source kanban
## Downloads
@@ -70,14 +68,11 @@ that by providing one-click installation on various platforms.
- WeKan ® largest user has 30k users using WeKan ® in their company.
- WeKan ® has been [translated](https://app.transifex.com/wekan/) to about 105 languages.
- [Features][features]: WeKan ® has real-time user interface.
- [Platforms][platforms]: WeKan ® supports many platforms.
- [Platforms](https://wekan.fi/install/): WeKan ® supports many platforms.
WeKan ® is critical part of new platforms Wekan is currently being integrated to.
## Requirements
- 64bit: Linux [Snap](https://github.com/wekan/wekan/blob/main/docs/Platforms/FOSS/Snap/Install.md) or [Sandstorm](https://sandstorm.io) /
[Mac](https://github.com/wekan/wekan/wiki/Mac) / [Windows](https://github.com/wekan/wekan/blob/main/docs/Platforms/Propietary/Windows/Offline.md).
[More Platforms](https://github.com/wekan/wekan/tree/main/docs/Platforms), bundle for RasPi3 ARM and other CPUs where Node.js and MongoDB exists.
- 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.
@@ -124,7 +119,6 @@ Please refer to the [developer documentation](https://github.com/wekan/wekan/blo
WeKan ® is released under the very permissive [MIT license](LICENSE), and made
with [Meteor](https://www.meteor.com).
[platforms]: https://github.com/wekan/wekan/tree/main/docs/Platforms
[dev_docs]: https://github.com/wekan/wekan/blob/main/docs/DeveloperDocs/Developer-Documentation.md
[screenshot_wekan]: https://wekan.fi/wekan-dark-mode.png
[features]: https://github.com/wekan/wekan/wiki/Features
+5 -4
View File
@@ -1,11 +1,12 @@
About money, see [CONTRIBUTING.md](CONTRIBUTING.md)
Security is very important to us. If you discover any issue regarding security, please disclose
the information responsibly by sending an email to security@wekan.fi and not by
creating a GitHub issue. We will respond swiftly to fix verifiable security issues.
the information responsibly by sending an email from Protonmail to security@wekan.fi
that is Protomail email address, or by using this PGP key
[security-at-wekan.fi.asc](security-at-wekan.fi.asc) to security@wekan.fi
and not by creating a GitHub issue. We will respond swiftly to fix verifiable security issues.
We thank you with a place at our hall of fame page, that is
at https://wekan.github.io/hall-of-fame
We thank you with a place at our hall of fame page, that is at https://wekan.fi/hall-of-fame
## How should reports be formatted?
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v7.94.0"
appVersion: "v7.97.0"
files:
userUploads:
- README.md
+11
View File
@@ -33,6 +33,17 @@
.board-wrapper .board-canvas.is-dragging-active .minicard-wrapper.is-checked {
display: none;
}
/* Mobile view styles - applied when isMiniScreen is true (iPhone, etc.) */
.board-wrapper.mobile-view .board-canvas.mobile-view .swimlane {
border-bottom: 1px solid #ccc;
display: flex;
flex-direction: column;
margin: 0;
padding: 0 0px 0px 0;
overflow-x: hidden;
overflow-y: auto;
}
@media screen and (max-width: 800px) {
.board-wrapper .board-canvas .swimlane {
border-bottom: 1px solid #ccc;
+3 -2
View File
@@ -16,13 +16,14 @@ template(name="boardBody")
if notDisplayThisBoard
| {{_ 'tableVisibilityMode-allowPrivateOnly'}}
else
.board-wrapper(class=currentBoard.colorClass)
.board-wrapper(class=currentBoard.colorClass class="{{#if isMiniScreen}}mobile-view{{/if}}")
.board-canvas.js-swimlanes(
class="{{#if hasSwimlanes}}dragscroll{{/if}}"
class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
class="{{#if draggingActive.get}}is-dragging-active{{/if}}"
class="{{#unless isVerticalScrollbars}}no-scrollbars{{/unless}}")
class="{{#unless isVerticalScrollbars}}no-scrollbars{{/unless}}"
class="{{#if isMiniScreen}}mobile-view{{/if}}")
if showOverlay.get
.board-overlay
if currentBoard.isTemplatesBoard
+286 -1
View File
@@ -76,6 +76,179 @@ BlazeComponent.extendComponent({
}
},
onRendered() {
// Accessibility: Focus management for popups and menus
function focusFirstInteractive(container) {
if (!container) return;
// Find first focusable element
const focusable = container.querySelectorAll('button, [role="button"], a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
for (let i = 0; i < focusable.length; i++) {
if (!focusable[i].disabled && focusable[i].offsetParent !== null) {
focusable[i].focus();
break;
}
}
}
// Observe for new popups/menus and set focus
const popupObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
mutation.addedNodes.forEach(function(node) {
if (node.nodeType === 1 && (node.classList.contains('popup') || node.classList.contains('modal') || node.classList.contains('menu'))) {
setTimeout(function() { focusFirstInteractive(node); }, 10);
}
});
});
});
popupObserver.observe(document.body, { childList: true, subtree: true });
// Remove tabindex from non-interactive elements (e.g., user abbreviations, labels)
document.querySelectorAll('.user-abbreviation, .user-label, .card-header-label, .edit-label, .private-label').forEach(function(el) {
if (el.hasAttribute('tabindex')) {
el.removeAttribute('tabindex');
}
});
/*
// Add a toggle button for keyboard shortcuts accessibility
if (!document.getElementById('wekan-shortcuts-toggle')) {
const toggleContainer = document.createElement('div');
toggleContainer.id = 'wekan-shortcuts-toggle';
toggleContainer.style.position = 'fixed';
toggleContainer.style.top = '10px';
toggleContainer.style.right = '10px';
toggleContainer.style.zIndex = '1000';
toggleContainer.style.background = '#fff';
toggleContainer.style.border = '2px solid #005fcc';
toggleContainer.style.borderRadius = '6px';
toggleContainer.style.padding = '8px 12px';
toggleContainer.style.boxShadow = '0 2px 8px rgba(0,0,0,0.1)';
toggleContainer.style.fontSize = '16px';
toggleContainer.style.color = '#005fcc';
toggleContainer.setAttribute('role', 'region');
toggleContainer.setAttribute('aria-label', 'Keyboard Shortcuts Settings');
toggleContainer.innerHTML = `
<label for="shortcuts-toggle-checkbox" style="cursor:pointer;">
<input type="checkbox" id="shortcuts-toggle-checkbox" ${window.wekanShortcutsEnabled ? 'checked' : ''} style="margin-right:8px;" />
Enable keyboard shortcuts
</label>
`;
document.body.appendChild(toggleContainer);
const checkbox = document.getElementById('shortcuts-toggle-checkbox');
checkbox.addEventListener('change', function(e) {
window.toggleWekanShortcuts(e.target.checked);
});
}
*/
// Ensure toggle-buttons, color choices, reactions, renaming, and calendar controls are focusable and have ARIA roles
document.querySelectorAll('.js-toggle').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
// Short, descriptive label for favorite/star toggle
if (el.classList.contains('js-favorite-toggle')) {
el.setAttribute('aria-label', TAPi18n.__('favorite-toggle-label'));
} else {
el.setAttribute('aria-label', 'Toggle');
}
});
document.querySelectorAll('.js-color-choice').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
el.setAttribute('aria-label', 'Choose color');
});
document.querySelectorAll('.js-reaction').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
el.setAttribute('aria-label', 'React');
});
document.querySelectorAll('.js-rename-swimlane').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
el.setAttribute('aria-label', 'Rename swimlane');
});
document.querySelectorAll('.js-rename-list').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
el.setAttribute('aria-label', 'Rename list');
});
document.querySelectorAll('.fc-button').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
});
// Set the language attribute on the <html> element for accessibility
document.documentElement.lang = TAPi18n.getLanguage();
// Ensure the accessible name for the board view switcher matches the visible label "Swimlanes"
// This fixes WCAG 2.5.3: Label in Name
const swimlanesSwitcher = this.$('.js-board-view-swimlanes');
if (swimlanesSwitcher.length) {
swimlanesSwitcher.attr('aria-label', swimlanesSwitcher.text().trim() || 'Swimlanes');
}
// Add a highly visible focus indicator and improve contrast for interactive elements
if (!document.getElementById('wekan-accessible-focus-style')) {
const style = document.createElement('style');
style.id = 'wekan-accessible-focus-style';
style.innerHTML = `
/* Focus indicator */
button:focus, [role="button"]:focus, a:focus, input:focus, select:focus, textarea:focus, .dropdown-menu:focus, .js-board-view-swimlanes:focus, .js-add-card:focus {
outline: 3px solid #005fcc !important;
outline-offset: 2px !important;
}
/* Input borders */
input, textarea, select {
border: 2px solid #222 !important;
}
/* Plus icon for adding a new card */
.js-add-card {
color: #005fcc !important; /* dark blue for contrast */
cursor: pointer;
outline: none;
}
.js-add-card[tabindex] {
outline: none;
}
/* Hamburger menu */
.fa-bars, .icon-hamburger {
color: #222 !important;
}
/* Grey icons in card detail header */
.card-detail-header .fa, .card-detail-header .icon {
color: #444 !important;
}
/* Grey operating elements in card detail */
.card-detail .fa, .card-detail .icon {
color: #444 !important;
}
/* Blue bar in checklists */
.checklist-progress-bar {
background-color: #005fcc !important;
}
/* Green checkmark in checklists */
.checklist .fa-check {
color: #007a33 !important;
}
/* X-Button and arrow button in menus */
.close, .fa-arrow-left, .icon-arrow-left {
color: #005fcc !important;
}
/* Cross icon to move boards */
.js-move-board {
color: #005fcc !important;
}
/* Current date background */
.current-date {
background-color: #005fcc !important;
color: #fff !important;
}
`;
document.head.appendChild(style);
}
// Ensure plus/add elements are focusable and have ARIA roles
document.querySelectorAll('.js-add-card').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
el.setAttribute('aria-label', 'Add new card');
});
const boardComponent = this;
const $swimlanesDom = boardComponent.$('.js-swimlanes');
@@ -326,8 +499,109 @@ BlazeComponent.extendComponent({
},
}).register('boardBody');
// Accessibility: Allow users to enable/disable keyboard shortcuts
window.wekanShortcutsEnabled = true;
window.toggleWekanShortcuts = function(enabled) {
window.wekanShortcutsEnabled = !!enabled;
};
// Example: Wrap your character key shortcut handler like this
document.addEventListener('keydown', function(e) {
// Example: "W" key shortcut (replace with your actual shortcut logic)
if (!window.wekanShortcutsEnabled) return;
if (e.key === 'w' || e.key === 'W') {
// ...existing shortcut logic...
// e.g. open swimlanes view, etc.
}
});
// Keyboard accessibility for card actions (favorite, archive, duplicate, etc.)
document.addEventListener('keydown', function(e) {
if (!window.wekanShortcutsEnabled) return;
// Only proceed if focus is on a card action element
const active = document.activeElement;
if (active && active.classList.contains('js-card-action')) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
active.click();
}
// Move card up/down with arrow keys
if (e.key === 'ArrowUp') {
e.preventDefault();
if (active.dataset.cardId) {
Meteor.call('moveCardUp', active.dataset.cardId);
}
}
if (e.key === 'ArrowDown') {
e.preventDefault();
if (active.dataset.cardId) {
Meteor.call('moveCardDown', active.dataset.cardId);
}
}
}
// Make plus/add elements keyboard accessible
if (active && active.classList.contains('js-add-card')) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
active.click();
}
}
// Keyboard move for cards (alternative to drag & drop)
if (active && active.classList.contains('js-move-card')) {
if (e.key === 'ArrowUp') {
e.preventDefault();
if (active.dataset.cardId) {
Meteor.call('moveCardUp', active.dataset.cardId);
}
}
if (e.key === 'ArrowDown') {
e.preventDefault();
if (active.dataset.cardId) {
Meteor.call('moveCardDown', active.dataset.cardId);
}
}
}
// Ensure move card buttons are focusable and have ARIA roles
document.querySelectorAll('.js-move-card').forEach(function(el) {
el.setAttribute('tabindex', '0');
el.setAttribute('role', 'button');
el.setAttribute('aria-label', 'Move card');
});
// Make toggle-buttons, color choices, reactions, and X-buttons keyboard accessible
if (active && (active.classList.contains('js-toggle') || active.classList.contains('js-color-choice') || active.classList.contains('js-reaction') || active.classList.contains('close'))) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
active.click();
}
}
// Prevent scripts from removing focus when received
if (active) {
active.addEventListener('focus', function(e) {
// Do not remove focus
// No-op: This prevents F55 failure
}, { once: true });
}
// Make swimlane/list renaming keyboard accessible
if (active && (active.classList.contains('js-rename-swimlane') || active.classList.contains('js-rename-list'))) {
if (e.key === 'Enter') {
e.preventDefault();
active.click();
}
}
// Calendar navigation buttons
if (active && active.classList.contains('fc-button')) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
active.click();
}
}
});
BlazeComponent.extendComponent({
onRendered() {
// Set the language attribute on the <html> element for accessibility
document.documentElement.lang = TAPi18n.getLanguage();
this.autorun(function () {
$('#calendar-view').fullCalendar('refetchEvents');
});
@@ -341,11 +615,19 @@ BlazeComponent.extendComponent({
timezone: 'local',
weekNumbers: true,
header: {
left: 'title today prev,next',
left: 'title today prev,next',
center:
'agendaDay,listDay,timelineDay agendaWeek,listWeek,timelineWeek month,listMonth',
right: '',
},
buttonText: {
prev: TAPi18n.__('calendar-previous-month-label'), // e.g. "Previous month"
next: TAPi18n.__('calendar-next-month-label'), // e.g. "Next month"
},
ariaLabel: {
prev: TAPi18n.__('calendar-previous-month-label'),
next: TAPi18n.__('calendar-next-month-label'),
},
// height: 'parent', nope, doesn't work as the parent might be small
height: 'auto',
/* TODO: lists as resources: https://fullcalendar.io/docs/vertical-resource-view */
@@ -476,6 +758,9 @@ BlazeComponent.extendComponent({
document.body.appendChild(modalElement);
const openModal = function() {
modalElement.style.display = 'flex';
// Set focus to the input field for better keyboard accessibility
const input = modalElement.querySelector('#card-title-input');
if (input) input.focus();
};
const closeModal = function() {
modalElement.style.display = 'none';
+26 -20
View File
@@ -1,4 +1,4 @@
/* ===============
/* ===============
THEME - NEPHRITIS
=================*/
@@ -99,7 +99,7 @@ THEME - NEPHRITIS
/* === END NEPHRITIS THEME === */
/* ===============
/* ===============
THEME - Pomegranate
=================*/
@@ -200,7 +200,7 @@ THEME - Pomegranate
/* === END Pomegranate THEME === */
/* ===============
/* ===============
THEME - Belize
=================*/
@@ -301,7 +301,7 @@ THEME - Belize
/* === END Belize THEME === */
/* ===============
/* ===============
THEME - Wisteria
=================*/
@@ -402,7 +402,7 @@ THEME - Wisteria
/* === END Wisteria THEME === */
/* ===============
/* ===============
THEME - Midnight
=================*/
@@ -503,7 +503,7 @@ THEME - Midnight
/* === END Midnight THEME === */
/* ===============
/* ===============
THEME - Pumpkin
=================*/
@@ -604,7 +604,7 @@ THEME - Pumpkin
/* === END Pumpkin THEME === */
/* ===============
/* ===============
THEME - Moderate Pink
=================*/
@@ -705,7 +705,7 @@ THEME - Moderate Pink
/* === END Moderatepink THEME === */
/* ===============
/* ===============
THEME - Strong Cyan
=================*/
@@ -806,7 +806,7 @@ THEME - Strong Cyan
/* === END Strongcyan THEME === */
/* ===============
/* ===============
THEME - Lime Green
=================*/
@@ -907,7 +907,7 @@ THEME - Lime Green
/* === END Limegreen THEME === */
/* ===============
/* ===============
THEME - Dark
=================*/
@@ -1111,7 +1111,7 @@ THEME - Dark
/* === END Dark THEME === */
/* ===============
/* ===============
THEME - Relax
=================*/
@@ -1241,7 +1241,7 @@ THEME - Relax
/* === END Relax THEME === */
/* ===============
/* ===============
THEME - Corteza
=================*/
@@ -1342,7 +1342,7 @@ THEME - Corteza
/* === END Corteza THEME === */
/* ===============
/* ===============
THEME - Clear Blue
=================*/
@@ -1609,7 +1609,7 @@ THEME - Clear Blue
/* === END Clearblue THEME === */
/* ===============
/* ===============
THEME - Natural
=================*/
@@ -1719,7 +1719,7 @@ THEME - Natural
/* === END Natural THEME === */
/* ===============
/* ===============
THEME - Modern
=================*/
@@ -2006,7 +2006,7 @@ THEME - Modern
/* === END Modern THEME === */
/* ===============
/* ===============
THEME - Modern Dark
=================*/
@@ -2496,7 +2496,7 @@ THEME - Modern Dark
/* === END ModernDark THEME === */
/* ===============
/* ===============
THEME - Exodark
=================*/
@@ -2744,7 +2744,7 @@ THEME - Exodark
/* === END Exodark THEME === */
/* ===============
/* ===============
THEME - Clean Dark
=================*/
@@ -3183,7 +3183,7 @@ THEME - Clean Dark
.board-color-cleandark.background-box {
background-color:#23232B;
} /*Fixes contrast issues with background box in theme selection list*/
/* ===============
/* ===============
THEME - Clean Light
=================*/
/* Please note Clean Light theme elements also contain references to some cleandark theme elements so if unable to find code you're looking for under CleanDark it might be here. This should probably be cleaned up*/
@@ -3322,7 +3322,13 @@ THEME - Clean Light
.board-color-cleanlight .list .list-header .list-header-menu .js-collapse,
.board-color-cleandark .list .list-header .list-header-menu .js-collapse {
display: none;
/* Make collapse button visible in Clean Light / Clean Dark themes.
Previously this was hidden which caused the missing Collapse button
when using these themes. Use inline-block so it lines up with other
header controls. */
display: inline-block;
vertical-align: middle;
color: inherit;
}
.board-color-cleanlight .list-header-add,
+1 -13
View File
@@ -17,7 +17,7 @@ template(name="boardHeaderBar")
i.fa.fa-pencil-square-o
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
title="{{#if isStarred}}{{_ 'star-board-short-unstar'}}{{else}}{{_ 'star-board-short-star'}}{{/if}}" aria-label="{{#if isStarred}}{{_ 'star-board-short-unstar'}}{{else}}{{_ 'star-board-short-star'}}{{/if}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
if showStarCounter
span
@@ -62,15 +62,11 @@ template(name="boardHeaderBar")
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
if showStarCounter
span
= currentBoard.stars
a.board-header-btn(
class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}"
title="{{_ currentBoard.permission}}")
i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
span {{_ currentBoard.permission}}
a.board-header-btn.js-watch-board(
title="{{_ watchLevel }}")
@@ -80,10 +76,8 @@ template(name="boardHeaderBar")
i.fa.fa-bell
if $eq watchLevel "muted"
i.fa.fa-bell-slash
span {{_ watchLevel}}
a.board-header-btn(title="{{_ 'sort-cards'}}" class="{{#if isSortActive }}emphasis{{else}} js-sort-cards {{/if}}")
i.fa.fa-sort
span {{#if isSortActive }}{{_ 'sort-is-on'}}{{else}}{{_ 'sort-cards'}}{{/if}}
if isSortActive
a.board-header-btn-close.js-sort-reset(title="{{_ 'remove-sort'}}")
i.fa.fa-times-thin
@@ -92,13 +86,11 @@ template(name="boardHeaderBar")
a.board-header-btn.js-log-in(
title="{{_ 'log-in'}}")
i.fa.fa-sign-in
span {{_ 'log-in'}}
if isSandstorm
if currentUser
a.board-header-btn.js-open-archived-board
i.fa.fa-archive
span {{_ 'archives'}}
//if showSort
// a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}")
@@ -109,14 +101,12 @@ template(name="boardHeaderBar")
title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
class="{{#if Filter.isActive}}emphasis{{/if}}")
i.fa.fa-filter
span {{#if Filter.isActive}}{{_ 'filter-on'}}{{else}}{{_ 'filter'}}{{/if}}
if Filter.isActive
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
i.fa.fa-search
span {{_ 'search'}}
unless currentBoard.isTemplatesBoard
a.board-header-btn.js-toggle-board-view(
@@ -128,14 +118,12 @@ template(name="boardHeaderBar")
i.fa.fa-trello
if $eq boardView 'board-view-cal'
i.fa.fa-calendar
span {{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-swimlanes'}}{{/if}}
if canModifyBoard
a.board-header-btn.js-multiselection-activate(
title="{{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}"
class="{{#if MultiSelection.isActive}}emphasis{{/if}}")
i.fa.fa-check-square-o
span {{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}
if MultiSelection.isActive
a.board-header-btn-close.js-multiselection-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
+39
View File
@@ -192,6 +192,32 @@
font-size: 25px;
color: #fff;
}
/* Mobile view styles - applied when isMiniScreen is true (iPhone, etc.) */
.board-list.mobile-view {
height: 100%;
overflow: scroll;
}
.board-list.mobile-view li {
width: 50%;
}
.board-list.mobile-view .board-list-item {
overflow: hidden;
height: 8rem;
}
.board-list.mobile-view .board-list-item-sub-name {
position: relative;
top: -100px;
left: -100px;
}
.board-list.mobile-view .board-handle {
position: absolute;
padding: 7px;
top: 50%;
transform: translateY(-50%);
right: 10px;
font-size: 24px;
}
@media screen and (max-width: 800px) {
.board-list {
height: 100%;
@@ -218,6 +244,19 @@
font-size: 24px;
}
}
/* Mobile view styles for very small screens - applied when isMiniScreen is true */
.board-list.mobile-view li {
width: 50%;
}
.board-list.mobile-view .board-handle {
position: absolute;
padding: 7px;
top: 50%;
transform: translateY(-50%);
right: 10px;
font-size: 24px;
}
@media screen and (max-width: 360px) {
li {
width: 100%;
+1 -1
View File
@@ -29,7 +29,7 @@ template(name="boardList")
input#filterBtn(type="button" value="{{_ 'filter'}}")
input#resetBtn(type="button" value="{{_ 'filter-clear'}}")
ul.board-list.clearfix.js-boards
ul.board-list.clearfix.js-boards(class="{{#if isMiniScreen}}mobile-view{{/if}}")
li.js-add-board
a.board-list-item.label(title="{{_ 'add-board'}}")
| {{_ 'add-board'}}
+12 -10
View File
@@ -35,6 +35,7 @@ input[type="file"] {
}
input[type="radio"] {
-webkit-appearance: radio;
appearance: radio;
min-height: inherit;
}
input[type="text"],
@@ -96,7 +97,7 @@ input[type="email"]:disabled,
textarea:disabled {
background-color: #dcdcdc;
border-color: #bfbfbf;
color: #8c8c8c;
color: #222;
-webkit-touch-callout: none;
-webkit-user-select: none;
user-select: none;
@@ -110,7 +111,7 @@ select.inline {
width: 100%;
}
option[disabled] {
color: #8c8c8c;
color: #222;
}
textarea {
height: 150px;
@@ -255,13 +256,13 @@ label {
margin-bottom: 4px;
}
label.form-error {
color: #ba1212;
color: #d32f2f;
}
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder,
input::-moz-placeholder,
textarea::-moz-placeholder {
color: #8c8c8c;
color: #333 !important;
}
.edit-controls,
.add-controls {
@@ -316,6 +317,7 @@ textarea::-moz-placeholder {
border-left: 2px solid transparent;
transform: rotate(40deg);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
transform-origin: 100% 100%;
}
.button-link {
@@ -376,14 +378,14 @@ textarea::-moz-placeholder {
.button-link.setting.disabled {
background: #fff;
border-color: #e9e9e9;
color: #8c8c8c;
color: #222;
cursor: default;
}
.button-link.setting.disabled select {
display: none;
}
.button-link.setting.disabled:hover .label {
color: #8c8c8c;
color: #222;
}
.button-link.setting.disabled,
.button-link.setting.disabled:hover,
@@ -399,7 +401,7 @@ textarea::-moz-placeholder {
color: #a8a8a8;
}
.button-link.setting .label {
color: #8c8c8c;
color: #222;
display: block;
font-size: 12px;
line-height: 14px;
@@ -509,7 +511,7 @@ button.loud-text-button:hover {
border-radius: 3px;
-webkit-user-select: none;
user-select: none;
color: #8c8c8c;
color: #222;
display: block;
margin: 2px 0;
padding: 6px 8px;
@@ -574,7 +576,7 @@ button.loud-text-button:hover {
top: 6px;
}
.big-link.none {
color: #8c8c8c;
color: #222;
text-decoration: none;
}
.big-link.none:hover {
@@ -604,7 +606,7 @@ button.loud-text-button:hover {
}
.show-more {
border-radius: 3px;
color: #8c8c8c;
color: #222;
display: block;
padding: 16px 8px 16px 40px;
margin: 8px 0;
+145 -7
View File
@@ -214,6 +214,125 @@
#js-list-width-edit .list-width-error {
display: none;
}
/* Mobile view styles - applied when isMiniScreen is true (iPhone, etc.) */
.mini-list.mobile-view {
flex: 0 0 60px;
height: auto;
width: 100%;
border-left: 0px;
border-bottom: 1px solid #ccc;
}
.list.mobile-view {
display: contents;
flex-basis: auto;
width: 100%;
border-left: 0px;
}
.list.mobile-view:first-child {
margin-left: 0px;
}
.list.mobile-view.ui-sortable-helper {
flex: 0 0 60px;
height: 60px;
width: 100%;
border-left: 0px;
border-bottom: 1px solid #ccc;
}
.list.mobile-view.ui-sortable-helper .list-header.ui-sortable-handle {
cursor: grabbing;
}
.list.mobile-view.placeholder {
flex: 0 0 60px;
height: 60px;
width: 100%;
border-left: 0px;
border-bottom: 1px solid #ccc;
}
.list.mobile-view .list-body {
padding: 15px 19px;
}
.list.mobile-view .list-header {
/*Updated padding values for mobile devices, this should fix text grouping issue*/
padding: 20px 0px 20px 0px;
border-bottom: 0px solid #e4e4e4;
min-height: 30px;
margin-top: 10px;
align-items: center;
/* Force grid layout for iPhone */
display: grid !important;
grid-template-columns: 30px 1fr auto auto !important;
gap: 10px !important;
}
.list.mobile-view .list-header .list-header-left-icon {
padding: 7px;
padding-right: 27px;
margin-top: 1px;
top: -7px;
left: -7px;
}
.list.mobile-view .list-header .list-header-menu-icon {
padding: 14px;
font-size: 40px !important;
text-align: center;
/* Force positioning for iPhone */
position: absolute !important;
right: 60px !important;
top: 50% !important;
transform: translateY(-50%) !important;
z-index: 10;
}
.list.mobile-view .list-header .list-header-handle {
padding: 14px;
font-size: 48px !important;
text-align: center;
/* Force positioning for iPhone */
position: absolute !important;
right: 10px !important;
top: 50% !important;
transform: translateY(-50%) !important;
z-index: 10;
}
.list.mobile-view .list-header .list-header-left-icon {
display: grid;
grid-row: 1/3;
grid-column: 1;
}
.list.mobile-view .list-header .list-header-name {
grid-row: 1;
grid-column: 2;
align-self: end;
font-size: 20px !important;
font-weight: bold;
line-height: 1.2;
padding-bottom: 2px;
}
.list.mobile-view .list-header .cardCount {
grid-row: 2;
grid-column: 2;
align-self: start;
font-size: 16px !important;
line-height: 1.2;
}
.list.mobile-view .list-header .list-header-menu {
grid-row: 1/3;
grid-column: 3;
}
.list.mobile-view .list-header .list-header-menu-icon {
grid-row: 1/3;
grid-column: 3;
}
.list.mobile-view .list-header .list-header-handle {
grid-row: 1/3;
grid-column: 4;
}
.list.mobile-view .list-header .inlined-form {
grid-row: 1/3;
grid-column: 1/4;
}
.list.mobile-view .list-header .edit-controls {
align-items: initial;
}
@media screen and (max-width: 800px) {
.mini-list {
flex: 0 0 60px;
@@ -267,24 +386,29 @@
left: -7px;
}
.list-header .list-header-menu-icon {
padding: 14px;
font-size: 40px;
text-align: center;
/* iOS Safari fallback positioning */
position: absolute;
padding: 7px;
right: 60px;
top: 50%;
transform: translateY(-50%);
right: 47px;
font-size: 20px;
}
.list-header .list-header-handle {
padding: 14px;
font-size: 48px;
text-align: center;
/* iOS Safari fallback positioning */
position: absolute;
padding: 7px;
right: 10px;
top: 50%;
transform: translateY(-50%);
right: 10px;
font-size: 24px;
}
.list-header {
display: grid;
grid-template-columns: 30px 5fr 1fr;
grid-template-columns: 30px 1fr auto auto;
gap: 10px;
}
.list-header .list-header-left-icon {
display: grid;
@@ -295,16 +419,30 @@
grid-row: 1;
grid-column: 2;
align-self: end;
font-size: 20px;
font-weight: bold;
line-height: 1.2;
padding-bottom: 2px;
}
.list-header .cardCount {
grid-row: 2;
grid-column: 2;
align-self: start;
font-size: 16px;
line-height: 1.2;
}
.list-header .list-header-menu {
grid-row: 1/3;
grid-column: 3;
}
.list-header .list-header-menu-icon {
grid-row: 1/3;
grid-column: 3;
}
.list-header .list-header-handle {
grid-row: 1/3;
grid-column: 4;
}
.list-header .inlined-form {
grid-row: 1/3;
grid-column: 1/4;
+2 -2
View File
@@ -1,10 +1,10 @@
template(name='list')
.list.js-list(id="js-list-{{_id}}"
style="{{#unless collapsed}}min-width:{{listWidth}}px;max-width:{{listConstraint}}px;{{/unless}}"
class="{{#if collapsed}}list-collapsed{{/if}} {{#if autoWidth}}list-auto-width{{/if}}")
class="{{#if collapsed}}list-collapsed{{/if}} {{#if autoWidth}}list-auto-width{{/if}} {{#if isMiniScreen}}mobile-view{{/if}}")
+listHeader
+listBody
template(name='miniList')
a.mini-list.js-select-list.js-list(id="js-list-{{_id}}")
a.mini-list.js-select-list.js-list(id="js-list-{{_id}}" class="{{#if isMiniScreen}}mobile-view{{/if}}")
+listHeader
+4 -6
View File
@@ -79,7 +79,6 @@ BlazeComponent.extendComponent({
autosize($textarea);
$textarea.escapeableTextComplete(mentions);
};
/*
if (Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR === true || Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR === 'true') {
const isSmall = Utils.isMiniScreen();
const toolbar = isSmall
@@ -117,7 +116,7 @@ BlazeComponent.extendComponent({
].join('|');
const badPatterns = new RegExp(
`(?:${[
`<(${badTags})s*[^>][\\s\\S]*?<\\/\\1>`,
`<(${badTags})\\s*[^>][\\s\\S]*?<\\/\\1>`,
`<(${badTags})[^>]*?\\/>`,
].join('|')})`,
'gi',
@@ -128,9 +127,9 @@ BlazeComponent.extendComponent({
// remove attributes ' style="..."'
const badAttributes = new RegExp(
`(?:${[
'on\\S+=([\'"]?).*?\\1',
'href=([\'"]?)javascript:.*?\\2',
'style=([\'"]?).*?\\3',
'on\\S+=([\'\"]?).*?\\1',
'href=([\'\"]?)javascript:.*?\\2',
'style=([\'\"]?).*?\\3',
'target=\\S+',
].join('|')})`,
'gi',
@@ -300,7 +299,6 @@ BlazeComponent.extendComponent({
} else {
enableTextarea();
}
*/
enableTextarea();
},
events() {
+12 -12
View File
@@ -23,12 +23,12 @@ template(name="header")
a(href="{{pathFor 'board' id=_id slug=slug}}")
+viewer
= title
a.js-toggle-desktop-drag-handles(title="{{_ 'show-desktop-drag-handles'}}" alt="{{_ 'show-desktop-drag-handles'}}")
i.fa.fa-arrows
if isShowDesktopDragHandles
i.fa.fa-check-square-o
unless isShowDesktopDragHandles
i.fa.fa-ban
//a.js-toggle-desktop-drag-handles(title="{{_ 'show-desktop-drag-handles'}}" alt="{{_ 'show-desktop-drag-handles'}}")
// i.fa.fa-arrows
// if isShowDesktopDragHandles
// i.fa.fa-check-square-o
// unless isShowDesktopDragHandles
// i.fa.fa-ban
#header-new-board-icon
else
//-
@@ -61,12 +61,12 @@ template(name="header")
= title
else
li.current.empty {{_ 'quick-access-description'}}
a.js-toggle-desktop-drag-handles(title="{{_ 'show-desktop-drag-handles'}}" alt="{{_ 'show-desktop-drag-handles'}}")
i.fa.fa-arrows
if isShowDesktopDragHandles
i.fa.fa-check-square-o
unless isShowDesktopDragHandles
i.fa.fa-ban
//a.js-toggle-desktop-drag-handles(title="{{_ 'show-desktop-drag-handles'}}" alt="{{_ 'show-desktop-drag-handles'}}")
// i.fa.fa-arrows
// if isShowDesktopDragHandles
// i.fa.fa-check-square-o
// unless isShowDesktopDragHandles
// i.fa.fa-ban
// Next line is used only for spacing at header,
// there is no visible clickable icon.
#header-new-board-icon
+33 -20
View File
@@ -1,22 +1,24 @@
head
title
meta(name="viewport" content="width=device-width, initial-scale=1")
meta(http-equiv="X-UA-Compatible" content="IE=edge")
//- XXX We should use pathFor in the following `href` to support the case
where the application is deployed with a path prefix, but it seems to be
difficult to do that cleanly with Blaze -- at least without adding extra
packages.
link(rel="shortcut icon" type="image/x-icon" href="/favicon.ico")
link(rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png")
link(rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png")
link(rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png")
link(rel="manifest" crossOrigin="use-credentials" href="/site.webmanifest")
link(rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5")
meta(name="apple-mobile-web-app-title" content="Wekan")
meta(name="application-name" content="Wekan")
meta(name="msapplication-TileColor" content="#00aba9")
meta(name="theme-color" content="#ffffff")
//link(rel="stylesheet" type="text/css" class="__meteor-css__" href="css/html5-default-theme.css")
template(name="main")
html(lang="{{TAPi18n.getLanguage}}")
head
title
meta(name="viewport" content="width=device-width, initial-scale=1")
meta(http-equiv="X-UA-Compatible" content="IE=edge")
//- XXX We should use pathFor in the following `href` to support the case
where the application is deployed with a path prefix, but it seems to be
difficult to do that cleanly with Blaze -- at least without adding extra
packages.
link(rel="shortcut icon" type="image/x-icon" href="/favicon.ico")
link(rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png")
link(rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png")
link(rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png")
link(rel="manifest" crossOrigin="use-credentials" href="/site.webmanifest")
link(rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5")
meta(name="apple-mobile-web-app-title" content="Wekan")
meta(name="application-name" content="Wekan")
meta(name="msapplication-TileColor" content="#00aba9")
meta(name="theme-color" content="#ffffff")
//link(rel="stylesheet" type="text/css" class="__meteor-css__" href="css/html5-default-theme.css")
template(name="userFormsLayout")
section.auth-layout
@@ -48,6 +50,16 @@ template(name="userFormsLayout")
if isLoading
+loader
else
// ARIA live region for error messages
div#login-error-message(role="alert" aria-live="assertive" style="color: #d32f2f; margin-bottom: 1em;")
// Add autocomplete attribute to login input for WCAG compliance
script.
document.addEventListener('DOMContentLoaded', function() {
var loginInput = document.querySelector('input[type="text"], input[type="email"]');
if (loginInput && loginInput.name && (loginInput.name.toLowerCase().includes('user') || loginInput.name.toLowerCase().includes('email'))) {
loginInput.setAttribute('autocomplete', 'username email');
}
});
+Template.dynamic(template=content)
if currentSetting.displayAuthenticationMethod
+connectionMethod(authenticationMethod=currentSetting.defaultAuthenticationMethod)
@@ -59,7 +71,8 @@ template(name="userFormsLayout")
if getLegalNoticeWithWritTraduction
div
div.at-form-lang
select.select-lang.js-userform-set-language
label(for="userform-set-language-select") {{_ 'changeLanguagePopup-title'}}
select.select-lang.js-userform-set-language#userform-set-language-select(aria-label="{{_ 'changeLanguagePopup-title'}}")
each languages
if isCurrentLanguage
option(value="{{tag}}" selected="selected") {{name}}
+15 -55
View File
@@ -192,55 +192,19 @@ BlazeComponent.extendComponent({
this.setLoading(true);
$('li').removeClass('has-error');
const productName = $('#product-name')
.val()
.trim();
const customLoginLogoImageUrl = $('#custom-login-logo-image-url')
.val()
.trim();
const customLoginLogoLinkUrl = $('#custom-login-logo-link-url')
.val()
.trim();
const customHelpLinkUrl = $('#custom-help-link-url')
.val()
.trim();
const textBelowCustomLoginLogo = $('#text-below-custom-login-logo')
.val()
.trim();
const automaticLinkedUrlSchemes = $('#automatic-linked-url-schemes')
.val()
.trim();
const customTopLeftCornerLogoImageUrl = $(
'#custom-top-left-corner-logo-image-url',
)
.val()
.trim();
const customTopLeftCornerLogoLinkUrl = $(
'#custom-top-left-corner-logo-link-url',
)
.val()
.trim();
const customTopLeftCornerLogoHeight = $(
'#custom-top-left-corner-logo-height',
)
.val()
.trim();
const productName = ($('#product-name').val() || '').trim();
const customLoginLogoImageUrl = ($('#custom-login-logo-image-url').val() || '').trim();
const customLoginLogoLinkUrl = ($('#custom-login-logo-link-url').val() || '').trim();
const customHelpLinkUrl = ($('#custom-help-link-url').val() || '').trim();
const textBelowCustomLoginLogo = ($('#text-below-custom-login-logo').val() || '').trim();
const automaticLinkedUrlSchemes = ($('#automatic-linked-url-schemes').val() || '').trim();
const customTopLeftCornerLogoImageUrl = ($('#custom-top-left-corner-logo-image-url').val() || '').trim();
const customTopLeftCornerLogoLinkUrl = ($('#custom-top-left-corner-logo-link-url').val() || '').trim();
const customTopLeftCornerLogoHeight = ($('#custom-top-left-corner-logo-height').val() || '').trim();
const oidcBtnText = $(
'#oidcBtnTextvalue',
)
.val()
.trim();
const mailDomainName = $(
'#mailDomainNamevalue',
)
.val()
.trim();
const legalNotice = $(
'#legalNoticevalue',
)
.val()
.trim();
const oidcBtnText = ($('#oidcBtnTextvalue').val() || '').trim();
const mailDomainName = ($('#mailDomainNamevalue').val() || '').trim();
const legalNotice = ($('#legalNoticevalue').val() || '').trim();
const hideLogoChange = $('input[name=hideLogo]:checked').val() === 'true';
const hideCardCounterListChange = $('input[name=hideCardCounterList]:checked').val() === 'true';
const hideBoardMemberListChange = $('input[name=hideBoardMemberList]:checked').val() === 'true';
@@ -248,13 +212,9 @@ BlazeComponent.extendComponent({
$('input[name=displayAuthenticationMethod]:checked').val() === 'true';
const defaultAuthenticationMethod = $('#defaultAuthenticationMethod').val();
const accessibilityPageEnabled = $('input[name=accessibilityPageEnabled]:checked').val() === 'true';
const accessibilityTitle = $('#accessibility-title')
.val()
.trim();
const accessibilityContent = $('#accessibility-content')
.val()
.trim();
const spinnerName = $('#spinnerName').val();
const accessibilityTitle = ($('#accessibility-title').val() || '').trim();
const accessibilityContent = ($('#accessibility-content').val() || '').trim();
const spinnerName = ($('#spinnerName').val() || '').trim();
try {
Settings.update(ReactiveCache.getCurrentSetting()._id, {
+46 -10
View File
@@ -287,22 +287,50 @@ Utils = {
},
windowResizeDep: new Tracker.Dependency(),
// in fact, what we really care is screen size
// large mobile device like iPad or android Pad has a big screen, it should also behave like a desktop
// in a small window (even on desktop), Wekan run in compact mode.
// we can easily debug with a small window of desktop browser. :-)
isMiniScreen() {
// OLD WINDOW WIDTH DETECTION:
this.windowResizeDep.depend();
return $(window).width() <= 800;
// Show mobile view when:
// 1. Screen width is 800px or less (matches CSS media queries)
// 2. Mobile phones in portrait mode
// 3. iPad in very small screens (≤ 600px)
const isSmallScreen = window.innerWidth <= 800;
const isVerySmallScreen = window.innerWidth <= 600;
const isPortrait = window.innerWidth < window.innerHeight || window.matchMedia("(orientation: portrait)").matches;
const isMobilePhone = /Mobile|Android|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) && !/iPad/i.test(navigator.userAgent);
const isIPhone = /iPhone|iPod/i.test(navigator.userAgent);
const isIPad = /iPad/i.test(navigator.userAgent);
const isUbuntuTouch = /Ubuntu/i.test(navigator.userAgent);
// For iPhone: always show mobile view regardless of orientation
// For other mobile phones: show mobile view in portrait, desktop view in landscape
// For iPad: show mobile view only in very small screens (≤ 600px)
// For Ubuntu Touch: smartphones behave like mobile phones, tablets like iPad
// For desktop: show mobile view when screen width <= 800px
if (isIPhone) {
return true; // iPhone: always mobile view
} else if (isMobilePhone) {
return isPortrait; // Other mobile phones: portrait = mobile, landscape = desktop
} else if (isIPad) {
return isVerySmallScreen; // iPad: only very small screens get mobile view
} else if (isUbuntuTouch) {
// Ubuntu Touch: smartphones (≤ 600px) behave like mobile phones, tablets (> 600px) like iPad
if (isVerySmallScreen) {
return isPortrait; // Ubuntu Touch smartphone: portrait = mobile, landscape = desktop
} else {
return isVerySmallScreen; // Ubuntu Touch tablet: only very small screens get mobile view
}
} else {
return isSmallScreen; // Desktop: based on 800px screen width
}
},
isTouchScreen() {
// NEW TOUCH DEVICE DETECTION:
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent
var hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
hasTouchScreen = navigator.maxTouchPoints > 0;
@@ -328,12 +356,19 @@ Utils = {
// returns if desktop drag handles are enabled
isShowDesktopDragHandles() {
//const currentUser = ReactiveCache.getCurrentUser();
//if (currentUser) {
// return (currentUser.profile || {}).showDesktopDragHandles;
//} else if (window.localStorage.getItem('showDesktopDragHandles')) {
if (this.isTouchScreen()) {
return true;
/*
const currentUser = ReactiveCache.getCurrentUser();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
//
if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
*/
} else {
return false;
}
@@ -341,8 +376,9 @@ Utils = {
// returns if mini screen or desktop drag handles
isTouchScreenOrShowDesktopDragHandles() {
return this.isTouchScreen();
//return this.isTouchScreen() || this.isShowDesktopDragHandles();
return this.isShowDesktopDragHandles();
//return this.isShowDesktopDragHandles();
},
calculateIndexData(prevData, nextData, nItems = 1) {
+1
View File
@@ -57,6 +57,7 @@ AccountsTemplates.addFields([
displayName: 'username',
required: true,
minLength: 2,
autocomplete: 'username',
},
emailField,
passwordField,
+15 -15
View File
@@ -1,14 +1,14 @@
# Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required.
#---------------------------------------------------------------------------------------------------------
# ==== CREATING USERS AND LOGGING IN TO WEKAN ====
# https://github.com/wekan/wekan/wiki/Adding-users
# https://github.com/wekan/wekan/blob/main/docs/Login/Adding-users.md
#---------------------------------------------------------------------------------------------------------
# ==== FORGOT PASSWORD ====
# https://github.com/wekan/wekan/wiki/Forgot-Password
# https://github.com/wekan/wekan/blob/main/docs/Login/Forgot-Password.md
#---------------------------------------------------------------------------------------------------------
# ==== Upgrading Wekan to new version =====
# NOTE: MongoDB has changed from 3.x to 4.x, in that case you need backup/restore with --noIndexRestore
# see https://github.com/wekan/wekan/wiki/Backup
# see https://github.com/wekan/wekan/tree/main/docs/Backup
# 1) Stop Wekan:
# docker compose stop
# 2) Remove old Wekan app (wekan-app only, not that wekan-db container that has all your data)
@@ -46,7 +46,7 @@
# docker compose stop
# ----------------------------------------------------------------------------------
# ===== INSIDE DOCKER CONTAINERS, AND BACKUP/RESTORE ====
# https://github.com/wekan/wekan/wiki/Backup
# https://github.com/wekan/wekan/tree/main/docs/Backup
# If really necessary, repair MongoDB: https://github.com/wekan/wekan-mongodb/issues/6#issuecomment-424004116
# 1) Going inside containers:
# a) Wekan app, does not contain data
@@ -183,7 +183,7 @@ services:
# ==== EMAIL SETTINGS ====
# Email settings are only at MAIL_URL and MAIL_FROM.
# Admin Panel has test button, but it's not used for settings.
# see https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
# see https://github.com/wekan/wekan/blob/main/docs/Email/Troubleshooting-Mail.md
# For SSL in email, change smtp:// to smtps://
# NOTE: Special characters need to be url-encoded in MAIL_URL.
# You can encode those characters for example at: https://www.urlencoder.org
@@ -228,7 +228,7 @@ services:
#- APM_APP_SECRET=
#---------------------------------------------------------------
# ==== OPTIONAL: LOGS AND STATS ====
# https://github.com/wekan/wekan/wiki/Logs
# https://github.com/wekan/wekan/blob/main/docs/Features/Logs.md
#
# Daily export of Wekan changes as JSON to Logstash and ElasticSearch / Kibana (ELK)
# https://github.com/wekan/wekan-logstash
@@ -252,7 +252,7 @@ services:
#---------------------------------------------------------------
# ==== WEKAN API AND EXPORT BOARD ====
# Wekan Export Board works when WITH_API=true.
# https://github.com/wekan/wekan/wiki/REST-API
# https://github.com/wekan/wekan/blob/main/docs/API/REST-API.md
# https://github.com/wekan/wekan-gogs
# If you disable Wekan API with false, Export Board does not work.
- WITH_API=true
@@ -361,7 +361,7 @@ services:
#- TRUSTED_URL=https://intra.example.com
#-----------------------------------------------------------------
# ==== METRICS ALLOWED IP ADDRESSES ====
# https://github.com/wekan/wekan/wiki/Metrics
# https://github.com/wekan/wekan/blob/main/docs/Features/Metrics.md
#- METRICS_ALLOWED_IP_ADDRESSES=192.168.0.100,192.168.0.200
#-----------------------------------------------------------------
# ==== OUTGOING WEBHOOKS ====
@@ -372,14 +372,14 @@ services:
#- DEBUG=true
#---------------------------------------------
# ==== AUTOLOGIN WITH OIDC/OAUTH2 ====
# https://github.com/wekan/wekan/wiki/autologin
# https://github.com/wekan/wekan/blob/main/docs/Login/autologin.md
#- OIDC_REDIRECTION_ENABLED=true
#-----------------------------------------------------------------
# ==== OAUTH2 ORACLE on premise identity manager OIM ====
#- ORACLE_OIM_ENABLED=true
#-----------------------------------------------------------------
# ==== OAUTH2 AZURE ====
# https://github.com/wekan/wekan/wiki/Azure
# https://github.com/wekan/wekan/blob/main/docs/Login/Azure/Azure.md
# 1) Register the application with Azure. Make sure you capture
# the application ID as well as generate a secret key.
# 2) Configure the environment variables. This differs slightly
@@ -437,7 +437,7 @@ services:
#- OAUTH2_EMAIL_MAP=email
#-----------------------------------------------------------------
# ==== OAUTH2 KEYCLOAK ====
# https://github.com/wekan/wekan/wiki/Keycloak <== MAPPING INFO, REQUIRED
# https://github.com/wekan/wekan/blob/main/docs/Login/Keycloak/Keycloak.md <== MAPPING INFO, REQUIRED
#- OAUTH2_ENABLED=true
# OAuth2 login style: popup or redirect.
#- OAUTH2_LOGIN_STYLE=redirect
@@ -454,10 +454,10 @@ services:
#-----------------------------------------------------------------
# ==== OAUTH2 DOORKEEPER ====
# https://github.com/wekan/wekan/issues/1874
# https://github.com/wekan/wekan/wiki/OAuth2
# https://github.com/wekan/wekan/blob/main/docs/Login/OAuth2.md2
# Enable the OAuth2 connection
#- OAUTH2_ENABLED=true
# OAuth2 docs: https://github.com/wekan/wekan/wiki/OAuth2
# OAuth2 docs: https://github.com/wekan/wekan/blob/main/docs/Login/OAuth2.md
# OAuth2 login style: popup or redirect.
#- OAUTH2_LOGIN_STYLE=redirect
# OAuth2 Client ID.
@@ -486,8 +486,8 @@ services:
#- OAUTH2_EMAIL_MAP=
#-----------------------------------------------------------------
# ==== LDAP: UNCOMMENT ALL TO ENABLE LDAP ====
# https://github.com/wekan/wekan/wiki/LDAP
# For Snap settings see https://github.com/wekan/wekan-snap/wiki/Supported-settings-keys
# https://github.com/wekan/wekan/blob/main/docs/Login/LDAP.md
# For Snap settings see https://github.com/wekan/wekan/blob/main/docs/Platforms/FOSS/Snap/Supported-settings-keys.md
# Most settings work both on Snap and Docker below.
# Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required.
#
+2 -2
View File
@@ -137,11 +137,11 @@ https://nosqlbooster.com/downloads
### At server where Wekan Snap is installed, MongoDB is running at localhost port 27019
<img src="https://wekan.fi/nosqlbooster-basic-connection.png" width="60%" alt="Wekan logo" />
<img src="nosqlbooster-basic-connection.png" width="60%" alt="NoSQLBooster basic connection" />
### You can tunnel via SSH to server, using password auth or private key auth dropdown selection
<img src="https://wekan.fi/nosqlbooster-ssh-tunnel.png" width="60%" alt="Wekan logo" />
<img src="nosqlbooster-ssh-tunnel.png" width="60%" alt="NoSQLBooster SSH tunnel" />
# Scheduled backups to local or remote server
+28 -4
View File
@@ -1,10 +1,34 @@
# Try FerretDB instead
https://github.com/wekan/wekan/wiki/PostgreSQL
# What was ToroDB
ToroDB was made with Java. It was about replacing MongoDB with ToroDB/PostgreSQL or ToroDB/MySQL.
ToroDB is not developed anymore.
ToroDB is compatible with MongoDB 3.0. WeKan 7.x is compatible with MongoDB 6.x.
# Try FerretDB instead
https://blog.ferretdb.io/building-project-management-stack-wekan-ferretdb/
FerretDB https://www.ferretdb.com , https://github.com/FerretDB/FerretDB is made with Go.
Why FerretDB is explained at https://docs.ferretdb.io/#why-do-we-need-ferretdb .
It is about replacing MongoDB with FerretDB/PostgreSQL,
using Microsoft DocumentDB https://github.com/microsoft/documentdb for additional compatibility.
There is old FerretDB/SQLite, community can maintain it, it's not developed currently by FerretDB:
https://github.com/FerretDB/FerretDB/tree/main-v1 .
C89 SQLite has problems with concurrency, corruption etc.
It will help when updated SQLite made with Rust
will have these issues fixed at https://github.com/tursodatabase/turso .
Turso originally had fork of C89 SQLite C89 Open Contribution based fork of SQLite
https://github.com/tursodatabase/libsql , where they added fixes, but they run into some limits,
so they then moved the Turso Rust SQLite experiment to main tursodatabase GitHub org
https://github.com/tursodatabase/turso like they say at https://www.youtube.com/watch?v=010OKqc3ObM .
Turso is using simulator like https://tigerbeetle.com https://github.com/tigerbeetle/tigerbeetle
to fix concurrency, corruption etc bugs.
So when they get rewrite done, Rust based SQLite is drop-in replacement for C89 SQLite.
It has same database syntax, etc. But it also works with high concurrent usage,
does not corrupt data like C89 SQLite, that is verified with simulator.
# Docker: Wekan to PostgreSQL read-only mirroring
@@ -1,3 +1,8 @@
## About AVX
If CPU does not have AVX, Snap Candidate Meteor 2 WeKan now uses qemu-user to run MongoDB, using Qemu AVX support.
This was added at [WeKan v7.93](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v793-2025-07-18-wekan--release).
## What is not Cross-Platform
- Requires CPU to support AVX
@@ -99,9 +104,10 @@
## Screenshot
Supporting many more webbrowsers:
Supporting many more webbrowsers. This is now part of WeKan Wami: https://github.com/wekan/wami .
Also mentioned at https://wekan.fi/upgrade/ .
<img src="https://wekan.fi/manybrowser.png" width="100%" alt="Multiverse WeKan screenshot" />
<img src="manybrowser.png" width="100%" alt="Multiverse WeKan screenshot" />
## Talks
@@ -369,4 +375,4 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
### Ruby on Rails
- https://github.com/wekan/weror . Password register and login works, there is workspaces and dragging cards, but no user management etc features yet.
- https://github.com/wekan/weror . Password register and login works, there is workspaces and dragging cards, but no user management etc features yet.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

+2 -2
View File
@@ -10,7 +10,7 @@ It depends on role of user what drag drop is allowed https://github.com/wekan/we
3. Use non-drag-handle area to to view other parts of board, by dragging board up/down/left/right, without moving any icons etc.
<img src="https://wekan.fi/dragdrop/mobile-drag-drop.png" width="40%" alt="Wekan logo" />
<img src="mobile-drag-drop.png" width="40%" alt="Mobile drag drop" />
## 2 or more external screens of desktop or mobile
@@ -43,4 +43,4 @@ Reorder with drag drop:
## Touch UI ideas
- https://blog.la-terminal.net/godot-on-ipad-summer-update/
- https://news.ycombinator.com/item?id=41415077
- https://news.ycombinator.com/item?id=41415077
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+29 -29
View File
@@ -6,11 +6,11 @@ Not all from [CHANGELOG](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
### WIP Limits
![Wekan WIP Limits screenshot](https://wekan.fi/screenshot-wip-limit.png)
![Wekan WIP Limits screenshot](screenshot-wip-limit.png)
### Boards: List of all your public and private boards, board shortcuts at top of page
![Wekan boards screenshot](https://wekan.fi/screenshot-boards.png)
![Wekan boards screenshot](screenshot-boards.png)
### Wekan full screen or window on desktop (without browser buttons etc)
@@ -22,49 +22,49 @@ Not all from [CHANGELOG](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
### Restore archived board
![Wekan boards screenshot](https://wekan.fi/screenshot-restore-board.png)
![Wekan boards screenshot](screenshot-restore-board.png)
### Star board
![Wekan star board screenshot](https://wekan.fi/screenshot-star-board.png)
![Wekan star board screenshot](screenshot-star-board.png)
### Watch board
![Wekan watch board screenshot](https://wekan.fi/screenshot-muted-watch.png)
![Wekan watch board screenshot](screenshot-muted-watch.png)
### Keyboard shortcuts button at bottom right corner
![Wekan watch board screenshot](https://wekan.fi/screenshot-keyboard-shortcuts.png)
![Wekan watch board screenshot](screenshot-keyboard-shortcuts.png)
### Board menu when clicking 3 lines "hamburger" menu on right
![Wekan board menu screenshot](https://wekan.fi/screenshot-board-menu.png)
![Wekan board menu screenshot](screenshot-board-menu.png)
### Member setting when clicking your username on top right corner
![Wekan member settings screenshot](https://wekan.fi/screenshot-member-settings.png)
![Wekan member settings screenshot](screenshot-member-settings.png)
NOTE: Edit Notification duplicate was removed from above menu at https://github.com/wekan/wekan/pull/1948 so Edit Notification is only available at below menu screenshot.
NOTE: Edit Notification duplicate was removed from above menu at https://github.com/wekan/wekan/pull/1948 so Edit Notification is only available at below menu screenshot.
### Member settings / Edit Notification
![Wekan edit notification screenshot](https://wekan.fi/screenshot-member-settings-edit-notification.png)
![Wekan edit notification screenshot](screenshot-member-settings-edit-notification.png)
### Member settings / Change settings
![Wekan hide system messages screenshot](https://wekan.fi/screenshot-member-settings-hide-system-messages.png)
![Wekan hide system messages screenshot](screenshot-member-settings-hide-system-messages.png)
### Members: Click member initials or avatar
![Wekan members screenshot](https://wekan.fi/screenshot-member-filter.png)
![Wekan members screenshot](screenshot-member-filter.png)
### Members: Click member initials or avatar => Permissions Admin/Normal/Comment only
![Wekan boards permissions screenshot](https://wekan.fi/screenshot-member-comment-only.png)
![Wekan boards permissions screenshot](screenshot-member-comment-only.png)
### Lists: Add, archive and restore archived, delete list.
![Wekan kanban screenshot](https://wekan.fi/screenshot-member-settings-archive.png)
![Wekan kanban screenshot](screenshot-member-settings-archive.png)
### Cards: Description, Customizable Labels, Checklists, Attachment images and files, Comments. Archive and restore archived card. Delete card.
@@ -73,33 +73,33 @@ Tip: Normally you archive a card so you can restore it back. If you want to dele
### [Markdown in card description and comments](https://github.com/wekan/wekan/issues/1038)
### [International Date Formatting for Due Date according to language](https://github.com/wekan/wekan/issues/838)
![Wekan kanban screenshot](https://wekan.fi/screenshot.png)
![Wekan kanban screenshot](screenshot.png)
### Cards: Drag and drop images to card. Paste images with Ctrl-V.
### 1) First attachment: Select Card 3 lines "hamburger" menu / Edit Attachments
![Wekan kanban screenshot](https://wekan.fi/screenshot-drag1.png)
![Wekan kanban screenshot](screenshot-drag1.png)
### 2) Select: Clipboard or drag and drop
![Wekan kanban screenshot](https://wekan.fi/screenshot-drag4.png)
![Wekan kanban screenshot](screenshot-drag4.png)
### 3) Drag and drop image, or Ctrl-V.
![Wekan kanban screenshot](https://wekan.fi/screenshot-drag2.png)
![Wekan kanban screenshot](screenshot-drag2.png)
### 4) Second image attachment and others can be added from Add Attachment button near first attachment.
![Wekan kanban screenshot](https://wekan.fi/screenshot-drag3.png)
![Wekan kanban screenshot](screenshot-drag3.png)
### Multi-selection => Checkmark select cards => drag-drop all selected to some list
![Wekan multi-selection screenshot](https://wekan.fi/screenshot-multi-selection.png)
![Wekan multi-selection screenshot](screenshot-multi-selection.png)
### Filtered views
![Wekan multi-selection screenshot](https://wekan.fi/screenshot-filter.png)
![Wekan multi-selection screenshot](screenshot-filter.png)
## Authentication, Admin Panel, SMTP Settings
@@ -107,9 +107,9 @@ NOTE: There is user admin as "People" in Admin Panel, but no screenshot here yet
* Source and Docker platforms: [Admin Panel](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v0111-rc2-2017-03-05-wekan-prerelease): Self-registration, or change to invite-only and inviting users to boards. SMTP Settings.
![Wekan Admin Panel registration disable screenshot](https://wekan.fi/screenshot-admin-panel-registration.png)
![Wekan Admin Panel registration disable screenshot](screenshot-admin-panel-registration.png)
![Wekan Admin Panel email screenshot](https://wekan.fi/screenshot-admin-panel-email.png)
![Wekan Admin Panel email screenshot](screenshot-admin-panel-email.png)
* Sandstorm Platform: Admin: LDAP, passwordless email, SAML, GitHub and Google Auth. Add and remove users. SMTP Settings. Wekan, Rocket.Chat, etc apps available with one click install.
@@ -150,15 +150,15 @@ Different activities send different webhook data. You can find the details in th
### Enabled
#### 1) Board menu when clicking 3 lines "hamburger" menu on right
![Wekan board menu screenshot](https://wekan.fi/screenshot-board-menu.png)
![Wekan board menu screenshot](screenshot-board-menu.png)
#### 2) Outgoing Webhooks
![Wekan Outgoing Webhooks screenshot](https://wekan.fi/screenshot-outgoing-webhooks.png)
![Wekan Outgoing Webhooks screenshot](screenshot-outgoing-webhooks.png)
### Disabled
Leave the URL field blank.
Leave the URL field blank.
## Cleanup
@@ -180,7 +180,7 @@ ElasticSearch / Kibana (ELK)](https://github.com/wekan/wekan-logstash)
* [Translate Wekan at Transifex](https://app.transifex.com/wekan/)
![Wekan translations screenshot](https://wekan.fi/screenshot-change-language.png)
![Wekan translations screenshot](screenshot-change-language.png)
# Already merged, will be at next version
@@ -207,7 +207,7 @@ ElasticSearch / Kibana (ELK)](https://github.com/wekan/wekan-logstash)
### Wishes for Boards
* [Custom fields](https://github.com/wekan/wekan/issues/807)
* [Children/Related cards](https://github.com/wekan/wekan/issues/709), subtasks. Dependencies.
* [Children/Related cards](https://github.com/wekan/wekan/issues/709), subtasks. Dependencies.
* [Top Level Projects](https://github.com/wekan/wekan/issues/641)
* [Swimlanes (rows)](https://github.com/wekan/wekan/issues/955)
* Kanban workflows
@@ -225,4 +225,4 @@ ElasticSearch / Kibana (ELK)](https://github.com/wekan/wekan-logstash)
[Platforms](Platforms)
[Integrations](Integrations)
[Integrations](Integrations)
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

+2 -2
View File
@@ -1,4 +1,4 @@
<img src="https://wekan.fi/hosting/univention.svg" width="30%" alt="Univention logo" />
<img src="univention.svg" width="30%" alt="Univention logo" />
## <a name="ProductionUnivention"></a>Production: [Univention](https://www.univention.com/products/univention-app-center/app-catalog/wekan/) platform, many apps and WeKan ®
@@ -46,4 +46,4 @@ https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
# Repairing MongoDB
https://github.com/wekan/wekan/wiki/Repair-MongoDB
https://github.com/wekan/wekan/wiki/Repair-MongoDB
@@ -0,0 +1 @@
- [Gitpod Ready-to-Code](https://gitpod.io/#https://github.com/wekan/wekan)
+35 -4
View File
@@ -10,19 +10,19 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-7.94-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.94/wekan-7.94-amd64-windows.zip)
1. [wekan-7.97-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.97/wekan-7.97-amd64-windows.zip)
2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe)
3. [mongodb-windows-x86_64-7.0.23-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-7.0.23-signed.msi)
3. [mongodb-windows-x86_64-7.0.25-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-7.0.25-signed.msi)
4. [start-wekan.bat](https://raw.githubusercontent.com/wekan/wekan/main/start-wekan.bat)
5. Copy files from steps 1-4 with USB stick or DVD to offline Windows computer
6. Double click `mongodb-windows-x86_64-7.0.23-signed.msi` . In installer, uncheck downloading MongoDB compass.
6. Double click `mongodb-windows-x86_64-7.0.25-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-7.94-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-7.97-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
@@ -465,3 +465,34 @@ sudo snap set wekan port='80'
12. Then at local network Wekan is at:
http://192.168.0.100
#### Windows notes (tested on Windows 11)
- **Attachments error fix**: if you get
`TypeError: The "path" argument must be of type string. Received undefined`
from `models/attachments.js`, create folders and set writable paths **before** start:
- Create: `C:\wekan-data` and `C:\wekan-data\attachments`
- PowerShell:
```
$env:WRITABLE_PATH="C:\wekan-data"
$env:ATTACHMENTS_STORE_PATH="C:\wekan-data\attachments"
```
- CMD:
```
set WRITABLE_PATH=C:\wekan-data
set ATTACHMENTS_STORE_PATH=C:\wekan-data\attachments
```
- **LAN access in dev on Windows**:
- PowerShell:
```
$env:BIND_IP="0.0.0.0"
$env:ROOT_URL="http://<YOUR-LAN-IP>:4000"
meteor run --port 4000
```
- CMD:
```
set BIND_IP=0.0.0.0
set ROOT_URL=http://<YOUR-LAN-IP>:4000
meteor run --port 4000
```
+3 -1
View File
@@ -13,4 +13,6 @@ if (( $# != 1 )); then
exit 0
fi
find . | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs grep --no-messages $1 | less
#find . | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs grep --no-messages $1 | less
#find . -print0 | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs -0 grep --no-messages $1 | less
find . | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs grep -I --no-messages $1 | less
+27 -27
View File
@@ -1270,37 +1270,37 @@
"supportPopup-title": "Laguntza",
"accessibility": "irisgarritasuna",
"accessibility-page-enabled": "Irisgarritasun orria gaituta",
"accessibility-info-not-added-yet": "Accessibility info has not been added yet",
"accessibility-info-not-added-yet": "Irisgarritasun informaziorik ez da gehitu oraindik",
"accessibility-title": "Irisgarritasun titulua",
"accessibility-content": "Irisgarritasun edukia",
"accounts-lockout-settings": "Brute Force babesteko ezarpenak",
"accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.",
"accounts-lockout-known-users": "Settings for known users (correct username, wrong password)",
"accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)",
"accounts-lockout-failures-before": "Failures before lockout",
"accounts-lockout-period": "Lockout period (seconds)",
"accounts-lockout-failure-window": "Failure window (seconds)",
"accounts-lockout-settings-updated": "Brute force protection settings have been updated",
"accounts-lockout-locked-users": "Locked Users",
"accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts",
"accounts-lockout-no-locked-users": "There are currently no locked users",
"accounts-lockout-failed-attempts": "Failed Attempts",
"accounts-lockout-remaining-time": "Remaining Time",
"accounts-lockout-user-unlocked": "User has been unlocked successfully",
"accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?",
"accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?",
"accounts-lockout-show-locked-users": "Show locked users only",
"accounts-lockout-user-locked": "User is locked",
"accounts-lockout-click-to-unlock": "Click to unlock this user",
"accounts-lockout-info": "Ezarpen hauek kontrolatzen dute nola babesten diren saioa hasteko saiakerak indar basatien erasoetatik.",
"accounts-lockout-known-users": "Erabiltzaile ezagunentzako konfigurazioa (erabiltzaile izen zuzena, pasahitz okerra)",
"accounts-lockout-unknown-users": " Erabiltzaile ezezagunentzako konfigurazioa (ez dago erabiltzaile-izenik)",
"accounts-lockout-failures-before": "Erroreak blokeatu aurretik",
"accounts-lockout-period": "Blokeoaren aldia (segundoak)",
"accounts-lockout-failure-window": "Hutsegite leihoa (segundoak)",
"accounts-lockout-settings-updated": "Indar basatiko erasoen kontrako babesa eguneratu da",
"accounts-lockout-locked-users": "Blokeatutako erabiltzaileak",
"accounts-lockout-locked-users-info": " Erabiltzaileak blokeatuta daude saioa hasteko huts egindako saiakera gehiegi dituztelako.",
"accounts-lockout-no-locked-users": "Une honetan ez dago blokeatutako erabiltzailerik",
"accounts-lockout-failed-attempts": "Huts egindako saiakerak",
"accounts-lockout-remaining-time": "Geratzen den denbora",
"accounts-lockout-user-unlocked": "Erabiltzailea behar bezala desblokeatu da",
"accounts-lockout-confirm-unlock": "Ziur zaude erabiltzaile hau desblokeatu nahi duzula?",
"accounts-lockout-confirm-unlock-all": "Ziur zaude blokeatutako erabiltzaile guztiak desblokeatu nahi dituzula?",
"accounts-lockout-show-locked-users": "Erakutsi bakarrik blokeatutako erabiltzaileak",
"accounts-lockout-user-locked": "Erabiltzailea blokeatuta dago",
"accounts-lockout-click-to-unlock": "Klikatu erabiltzaile hau desblokeatzeko",
"accounts-lockout-status": "Status",
"admin-people-filter-show": "Show:",
"admin-people-filter-show": "Erakutsi:",
"admin-people-filter-all": "All Users",
"admin-people-filter-locked": "Locked Users Only",
"admin-people-filter-locked": "Bakarrik blokeatutako erabiltzaileak",
"admin-people-filter-active": "Gaituta",
"admin-people-filter-inactive": "Not Active",
"admin-people-active-status": "Active Status",
"admin-people-user-active": "User is active - click to deactivate",
"admin-people-user-inactive": "User is inactive - click to activate",
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
"accounts-lockout-unlock-all": "Unlock All"
"admin-people-filter-inactive": "Ez dago aktibo",
"admin-people-active-status": "Egoera aktiboa",
"admin-people-user-active": "Erabiltzailea aktiboa dago - egin klik desaktibatzeko",
"admin-people-user-inactive": "Erabiltzailea ez dago aktiboa - egin klik aktibatzeko",
"accounts-lockout-all-users-unlocked": "Blokeatutako erabiltzaile guztiak desblokeatu dira",
"accounts-lockout-unlock-all": "Desblokeatu guztiak"
}
+1 -1
View File
@@ -1268,7 +1268,7 @@
"hideAllChecklistItems": "Hide all checklist items",
"support": "Support",
"supportPopup-title": "Support",
"accessibility": "Accessibility",
"accessibility": "Dostopnost",
"accessibility-page-enabled": "Accessibility page enabled",
"accessibility-info-not-added-yet": "Accessibility info has not been added yet",
"accessibility-title": "Accessibility title",
+2 -1
View File
@@ -8,7 +8,8 @@ export const httpStreamOutput = function(readStream, name, http, downloadFlag, c
http.response.end();
});
readStream.on('error', () => {
readStream.on('error', (err) => {
console.error(`Download stream error for file '${name}':`, err);
http.response.statusCode = 404;
http.response.end('not found');
});
+9 -7
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v7.94.0",
"version": "v7.97.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -1481,9 +1481,9 @@
"integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg=="
},
"meteor-node-stubs": {
"version": "1.2.22",
"resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.22.tgz",
"integrity": "sha512-xpHq9ExdN8fshx9CxOe1nheyWslAepejdkIQgTsk+96e46UJ4ms5TSiQX1rjd6rJuBOjIjHKLqqYvdTsHQj/pw==",
"version": "1.2.24",
"resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.24.tgz",
"integrity": "sha512-tw9QzDFVOI5A5CcEw4tTD6CjF+Lk14uzhy2gWH5ImoH4mx4pyPVcha9MmyVur+rEVgpzk+aMG6rs3RxAF9SwiA==",
"requires": {
"@meteorjs/crypto-browserify": "^3.12.1",
"assert": "^2.1.0",
@@ -1500,6 +1500,7 @@
"punycode": "^1.4.1",
"querystring-es3": "^0.2.1",
"readable-stream": "^3.6.2",
"sha.js": "^2.4.12",
"stream-browserify": "^3.0.0",
"stream-http": "^3.2.0",
"string_decoder": "^1.3.0",
@@ -2248,11 +2249,12 @@
"bundled": true
},
"sha.js": {
"version": "2.4.11",
"version": "2.4.12",
"bundled": true,
"requires": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
"inherits": "^2.0.4",
"safe-buffer": "^5.2.1",
"to-buffer": "^1.2.0"
}
},
"side-channel": {
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v7.94.0",
"version": "v7.97.0",
"description": "Open-Source kanban",
"private": true,
"repository": {
@@ -44,7 +44,7 @@
"markdown-it-emoji": "^2.0.0",
"markdown-it-mathjax3": "^4.3.2",
"meteor-accounts-t9n": "^2.6.0",
"meteor-node-stubs": "^1.2.22",
"meteor-node-stubs": "^1.2.24",
"minio": "^7.1.3",
"moment": "^2.29.4",
"os": "^0.1.2",
+2 -2
View File
@@ -1524,7 +1524,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<ul class="toc-list-h1">
<li>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v7.94">Wekan REST API v7.94</a>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v7.97">Wekan REST API v7.97</a>
</li>
@@ -2053,7 +2053,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<div class="page-wrapper">
<div class="dark-box"></div>
<div class="content">
<h1 id="wekan-rest-api">Wekan REST API v7.94</h1>
<h1 id="wekan-rest-api">Wekan REST API v7.97</h1>
<blockquote>
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
</blockquote>
+1 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v7.94
version: v7.97
description: |
The REST API allows you to control and extend Wekan with ease.
+1 -1
View File
@@ -1 +1 @@
snapcraft push $1
snapcraft upload $1
+2 -2
View File
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 794,
appVersion = 797,
# Increment this for every release.
appMarketingVersion = (defaultText = "7.94.0~2025-08-18"),
appMarketingVersion = (defaultText = "7.97.0~2025-10-08"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+17
View File
@@ -0,0 +1,17 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEaK2aIRYJKwYBBAHaRw8BAQdAIT89DZJJl08UlL4O1B7VH1t8j3Bb5H2L
QA+9W+Q+5RvNJXNlY3VyaXR5QHdla2FuLmZpIDxzZWN1cml0eUB3ZWthbi5m
aT7CwBEEExYKAIMFgmitmiEDCwkHCZA/vSiebbrMoUUUAAAAAAAcACBzYWx0
QG5vdGF0aW9ucy5vcGVucGdwanMub3Jnhox64D+pdSl+SYNXxxEUiNxiyk22
1oY5r2XITCkt/ZADFQoIBBYAAgECGQECmwMCHgEWIQRr+tyvBjGXrZYeJ+E/
vSiebbrMoQAA1rkA/i6uLDyZ6tJihJCLPvI4Uvue6vht9VExLufW7v2SnF3h
APkBNMJvGD5bOJnvnSZtRV18yyzouMXj8EdfXCY1HfzcAM44BGitmiESCisG
AQQBl1UBBQEBB0D4PAdZyHG2pKvHUJMzVnLGi8efh0+qIGqfDS/hm7K+ZAMB
CAfCvgQYFgoAcAWCaK2aIQmQP70onm26zKFFFAAAAAAAHAAgc2FsdEBub3Rh
dGlvbnMub3BlbnBncGpzLm9yZyYth6DqbMzmJP+21IFbBSU8+LQNuKEIhlNn
HwfhJ9cVApsMFiEEa/rcrwYxl62WHifhP70onm26zKEAAGFoAP42/EzsBLQr
K+ICGKE9Xte7ot7Zo4Hx3MiwFLpobofJWAD+IqQiNLo5WwwwNeSmS0cwNmov
bN4gNrrXY1/mCGKKGgg=
=7QOI
-----END PGP PUBLIC KEY BLOCK-----
+5 -5
View File
@@ -1,5 +1,5 @@
name: wekan
version: '7.94'
version: '7.97'
base: core24
summary: Open Source kanban
description: |
@@ -68,7 +68,7 @@ apps:
parts:
mongodb:
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2204-7.0.23.tgz
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2204-7.0.25.tgz
plugin: dump
stage-packages:
- libssl3
@@ -156,9 +156,9 @@ parts:
# Cleanup
mkdir .build
cd .build
wget https://github.com/wekan/wekan/releases/download/v7.94/wekan-7.94-amd64.zip
unzip wekan-7.94-amd64.zip
rm wekan-7.94-amd64.zip
wget https://github.com/wekan/wekan/releases/download/v7.97/wekan-7.97-amd64.zip
unzip wekan-7.97-amd64.zip
rm wekan-7.97-amd64.zip
cd ..
##cd .build/bundle
##find . -type d -name '*-garbage*' | xargs rm -rf