Compare commits

...
65 Commits
Author SHA1 Message Date
Lauri Ojansivu b7d9af9ae7 v7.89 2025-05-13 22:45:44 +03:00
Lauri Ojansivu 0046b3c802 Merge pull request #5772 from oussama-madimagh/fix/css-compatibility
Fix: Add vendor prefixes for user-select and text-size-adjust for better browser compatibility
2025-05-13 22:37:32 +03:00
oussama-madimagh 25384c8ac3 Fix: Add vendor prefixes for user-select and text-size-adjust for better browser compatibility 2025-05-13 20:33:29 +01:00
Lauri Ojansivu 2eee72da8a Updated ChangeLog. 2025-05-13 22:00:50 +03:00
Lauri Ojansivu d65c422e3f Merge pull request #5769 from Adamsss001/feature/email-i18n
Add email notifications language localization feature
2025-05-13 21:50:53 +03:00
Omar Abid 2ab9bd3172 Add email notifications language localization feature 2025-05-13 19:45:08 +01:00
Lauri Ojansivu a0b5c2e88c Updated ChangeLog. 2025-05-13 19:42:41 +03:00
Lauri Ojansivu 0bd4108661 Upgraded to MongoDB 6.0.23 at Snap Candidate.
Thanks to MongoDB developers !
2025-05-13 19:37:42 +03:00
Lauri Ojansivu 7d1a1475ba Add missing code of fix insertion order of list.
Thanks to xet7 !

Fixes https://github.com/wekan/wekan/pull/5767,
fixes #5732
2025-05-13 18:54:14 +03:00
Lauri Ojansivu 6418263165 Merge branch 'correct-list-position' of github.com:valhalla-creator/wekan 2025-05-13 18:30:59 +03:00
Lauri Ojansivu b32c835cf9 Updated license 2025-05-13 17:00:54 +03:00
valhalla-creator a927685bc6 Update swimlanes.js 2025-05-12 22:33:42 +01:00
Lauri Ojansivu 6827d40e84 Updated ChangeLog. 2025-05-12 22:26:33 +03:00
Lauri Ojansivu 9aa12b0eb6 Updated Caddy docs.
Thanks to xet7 !
2025-05-12 22:25:18 +03:00
Lauri Ojansivu 8ca1a36d78 Updated ChangeLog. 2025-05-12 21:57:43 +03:00
Lauri Ojansivu 394f2eae69 Updated Browser Compatibility Matrix.
Thanks to xet7 !
2025-05-12 21:56:11 +03:00
Lauri Ojansivu 7588459c3e Updated translations. 2025-05-12 21:43:02 +03:00
Lauri Ojansivu 2c33f45a6a Updated translations. 2025-04-29 05:47:20 +03:00
Lauri Ojansivu 43cf0b66ac Merge pull request #5754 from wekan/dependabot/github_actions/docker/build-push-action-6.16.0
Bump docker/build-push-action from 6.15.0 to 6.16.0
2025-04-29 04:59:27 +03:00
dependabot[bot] c05f6fcff2 Bump docker/build-push-action from 6.15.0 to 6.16.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.15.0 to 6.16.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/471d1dc4e07e5cdedd4c2171150001c434f0b7a4...14487ce63c7a62a4a324b0bfb37086795e31c6c1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-28 21:07:25 +00:00
Lauri Ojansivu a4eb32158b Updated ChangeLog. 2025-04-25 23:33:40 +03:00
Lauri Ojansivu 072ced9d0e Added script to build snap locally and push to snapcraft.io candidate and edge.
Thanks to xet7 !
2025-04-25 23:30:57 +03:00
Lauri Ojansivu c5fefc1414 v7.88 2025-04-25 22:12:37 +03:00
Lauri Ojansivu c825895ceb Reverted translation fix that sometimes did not work.
Thanks to xet7 !

Fixes #5751,
related https://github.com/wekan/wekan/pull/5748
2025-04-25 22:06:06 +03:00
Lauri Ojansivu 9488972ed8 Merge newest changes. 2025-04-25 21:07:22 +03:00
Lauri Ojansivu 1f4bed38f7 Merge pull request #5750 from walster001/main
Fix more contrasting issues
2025-04-25 21:02:50 +03:00
Lauri Ojansivu 747112957a v7.87 2025-04-25 20:59:20 +03:00
Lauri Ojansivu 18228096f9 Updated ChangeLog. 2025-04-25 20:56:07 +03:00
Lauri Ojansivu d0ea5bf500 Fix typos.
Thanks to xet7 !
2025-04-25 20:54:02 +03:00
walster001 74fe91fa3a Fix more contrasting issues
- Fix contrast issue with CleanDark & CleanLight buttons on theme selection menu.
2025-04-26 01:40:15 +09:30
Lauri Ojansivu d4e3075fcc v7.86 2025-04-25 19:00:08 +03:00
Lauri Ojansivu 413ae5f20e Updated translations. 2025-04-25 18:38:13 +03:00
Lauri Ojansivu e23f86f542 Updated ChangeLog. 2025-04-25 18:35:12 +03:00
Lauri Ojansivu b3c47dbe84 Merge pull request #5749 from walster001/main
Fix contrast issue checkbox
2025-04-25 18:32:28 +03:00
Lauri Ojansivu b10c2b9a15 Updated ChangeLog. 2025-04-25 18:31:35 +03:00
Lauri Ojansivu bb6910acd1 Merge branch 'nourguidara-fix-i18n-init-timing' 2025-04-25 18:29:43 +03:00
Lauri Ojansivu 76b000820e Updated ChangeLog. 2025-04-25 18:28:23 +03:00
Lauri Ojansivu 50b874629c Merge branch 'Rayene123-add-toggle-watch-icon-on-card' 2025-04-25 18:25:44 +03:00
Lauri Ojansivu 4d145ab4ad Added translations to questions about are you sure.
Thanks to xet7 !

Related https://github.com/wekan/wekan/pull/5745
2025-04-25 18:24:40 +03:00
Lauri Ojansivu 4d67a4641f Merge branch 'fix-i18n-init-timing' of github.com:nourguidara/wekan into nourguidara-fix-i18n-init-timing 2025-04-25 17:54:41 +03:00
Lauri Ojansivu bc2eab6f9d Merge branch 'add-toggle-watch-icon-on-card' of github.com:Rayene123/wekan into Rayene123-add-toggle-watch-icon-on-card 2025-04-25 17:49:14 +03:00
walster001 3ccce75863 Fix contrast issue checkbox
- Fixed contrasting issue with tick check on custom fields, also fixed the ugly green tick coming up on the checklists in cards by utilisation of the !important tag to override it with the checkbox colour for custom fields also.
2025-04-25 20:15:34 +09:30
nour guidara b390b266e2 bug fix in imports\i18n\index.js 2025-04-25 11:10:46 +01:00
Lauri Ojansivu 561af8926c Merge branch 'main' of github.com:wekan/wekan 2025-04-24 22:20:06 +03:00
Lauri Ojansivu 5717dc2cf4 Updated ChangeLog. 2025-04-24 22:19:45 +03:00
Lauri Ojansivu d0e64ad6d2 Merge pull request #5746 from nourguidara/nourguidara-patch-1
Improve impersonate user documentation in docs/Admin/Impersonate-user.md
2025-04-24 22:18:07 +03:00
Lauri Ojansivu 8e1a735ec7 Updates 2025-04-24 22:17:47 +03:00
nour guidara 1301d67295 Update Impersonate-user.md
Restored direct link to the original pull request (#3280) as requested
2025-04-24 20:14:41 +01:00
nour guidara 7c239f5218 Update Impersonate-user.md 2025-04-24 19:45:29 +01:00
Rayene123 61235c953c added a watch icon button when clicked toggle if a card is watched or not 2025-04-24 11:53:08 +01:00
Lauri Ojansivu ea65a0308d Merge pull request #5741 from Firas-Git/documentation/login-and-signup
Documentation/login and signup
2025-04-21 22:57:08 +03:00
Firas Saidi f840b07c02 documentation/login-and-signup 2025-04-21 20:50:23 +01:00
Lauri Ojansivu 8af719d39e v7.85 2025-04-21 16:30:58 +03:00
Lauri Ojansivu c1a4250bd2 Updated to MongoDB 6.0.22.
Thanks to MongoDB developers !
2025-04-21 16:28:41 +03:00
Lauri Ojansivu b4b442f8a8 Updated translations. 2025-04-21 16:13:56 +03:00
Lauri Ojansivu b7e76fcfa1 Updated ChangeLog. 2025-04-21 16:10:24 +03:00
Lauri Ojansivu 01950cc796 Fix board sidebar menu doesn't open in mobile.
Thanks to mimZD and xet7 !

Fixes #5736
2025-04-21 16:07:43 +03:00
Firas Saidi 14f2022e21 fix-5434 2025-04-10 11:16:38 +01:00
Lauri Ojansivu 23bac73559 Updated translations. 2025-04-05 17:39:29 +03:00
Lauri Ojansivu 2de9b94b01 Updated ChangeLog. 2025-03-31 21:50:47 +03:00
Lauri Ojansivu 05d1736f5f Update Browser-compatibility-matrix.md 2025-03-31 21:45:22 +03:00
Lauri Ojansivu db5346fc5c Update Browser-compatibility-matrix.md 2025-03-31 21:38:06 +03:00
Lauri Ojansivu f09f5bd737 Updated translations. 2025-03-29 21:35:45 +02:00
Firas Saidi dc389a68ab bug_fixing 2025-03-09 16:23:37 +01:00
Zegden Rayen 094f13934c added the confirm pop up before cloning or archiving a board 2025-03-08 15:38:22 +00:00
38 changed files with 3196 additions and 302 deletions

No files matched your search

+1 -1
View File
@@ -55,7 +55,7 @@ jobs:
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
+87
View File
@@ -15,6 +15,93 @@ Fixing other platforms In Progress.
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
# v7.89 2025-05-13 WeKan ® release
This release adds the following new features:
- [Add email notifications language localization feature](https://github.com/wekan/wekan/pull/5769).
Thanks to Adamsss001.
and adds the following updates:
- [Added script to build snap locally and push to snapcraft.io candidate and edge](https://github.com/wekan/wekan/commit/072ced9d0e53dc6c8964e9b37fc7d1036962ca19).
Thanks to xet7.
- [Updated Browser Compatibility Matrix by adding Servo](https://github.com/wekan/wekan/commit/394f2eae69542067fde9e2511ffcef165d170d2d).
Thanks to xet7.
- [Updated Caddy docs](https://github.com/wekan/wekan/commit/9aa12b0eb62962bd107fe1aa87cdf5bad5a5905f).
Thanks to xet7.
- [Upgraded to MongoDB 6.0.23 at Snap Candidate](https://github.com/wekan/wekan/commit/0bd410866196bc2faa76b9c26c12f42617321a03).
Thanks to MongoDB developers.
and fixes the following bugs:
- [Fix list insertion order and prevent runtime error in "Add After" feature](https://github.com/wekan/wekan/pull/5767).
Thanks to valhalla-creator.
- [Fix: Add CSS vendor prefixes for user-select and text-size-adjust for better browser compatibility](https://github.com/wekan/wekan/pull/5772).
Thanks to oussama-madimagh.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.88 2025-04-25 WeKan ® release
This release fixes the following bugs:
- [Reverted translation fix that sometimes did not work](https://github.com/wekan/wekan/commit/c825895cebd24355d076741512c9aa16844393d9).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.87 2025-04-25 WeKan ® release
Note: This release does not work, there is bugs. Use newest release.
This release fixes the following bugs:
- [Fix typos](https://github.com/wekan/wekan/commit/d0ea5bf50067fd76359330986edbad8dd1fbcdcc).
Thanks to xet7.
- [Fix more contrasting issues](https://github.com/wekan/wekan/pull/5750).
Thanks to walster001.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.86 2025-04-25 WeKan ® release
Note: This release does not work, there is typos. Use newest release.
This release adds the following updates:
- [Improve impersonate user documentation in docs/Admin/Impersonate-user.md](https://github.com/wekan/wekan/pull/5746).
Thanks to nourguidara.
and fixes the following bugs:
- [Add toggle watch icon on card. Add questions are you sure to duplicate board and archive board](https://github.com/wekan/wekan/pull/5745).
Thanks to Rayene123.
- [Fix translations not working](https://github.com/wekan/wekan/pull/5748).
Thanks to nourguidara.
- [Fix contrast issue checkbox at Exodark theme](https://github.com/wekan/wekan/pull/5749).
Thanks to walster001.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.85 2025-04-21 WeKan ® release
This release adds the following updates:
- Updated Browser compatibility matrix, adding Iris browser at RISC OS Direct, and fixing links.
[Part1](https://github.com/wekan/wekan/commit/db5346fc5c7407160f381c0fcf4a87204206ed55),
[Part2](https://github.com/wekan/wekan/commit/05d1736f5f21e93e83b2e25029c6cab6c5106398).
Thanks to xet7.
- [Updated to MongoDB 6.0.22](https://github.com/wekan/wekan/commit/c1a4250bd2e26be5549704234a3cfb5306120352).
Thanks to MongoDB developers.
and fixes the following bugs:
- [Fix board sidebar menu doesn't open in mobile](https://github.com/wekan/wekan/commit/01950cc796697fa201ac9e4376cb204d308e8181).
Thanks to mimZD and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.84 2025-03-23 WeKan ® release
This release adds the following new features:
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2014-2024 The Wekan Team
Copyright (c) Lauri Ojansivu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+113
View File
@@ -0,0 +1,113 @@
# 🔐 WeKan — Login System Overview
This document provides a detailed overview of WeKan’s **login and authentication system**, covering client-side UI, server-side logic, external authentication methods, and potential upgrade paths.
---
## 🖥️ Login Web UI
WeKan's login interface is implemented using a combination of:
- `layouts.jade` – Login HTML structure
- `layouts.js` – Login logic and interactivity
- `layouts.css` – Styling and layout
📁 Source: [`client/components/main`](https://github.com/wekan/wekan/tree/main/client/components/main)
---
## ⚙️ Server-Side Authentication
Server-side login functionality is handled in:
- [`server/authentication.js`](https://github.com/wekan/wekan/blob/main/server/authentication.js)
Other related configurations:
- 🔧 Account config: [`config/accounts.js`](https://github.com/wekan/wekan/blob/main/config/accounts.js)
- 📨 Sign-up invitations: [`models/settings.js#L275`](https://github.com/wekan/wekan/blob/main/models/settings.js#L275)
- 👤 User creation logic: [`models/users.js#L1339`](https://github.com/wekan/wekan/blob/main/models/users.js#L1339)
---
## 👥 Meteor User Accounts
WeKan utilizes Meteor’s `accounts` system. Relevant resources:
- 📚 Meteor 2.x Accounts Docs: [v2-docs.meteor.com/api/accounts](https://v2-docs.meteor.com/api/accounts)
- 🔍 Meteor Packages:
- [`packages`](https://github.com/wekan/wekan/blob/main/.meteor/packages)
- [`versions`](https://github.com/wekan/wekan/blob/main/.meteor/versions)
- 📦 Meteor 2.14 core packages: [Meteor 2.14 packages](https://github.com/meteor/meteor/tree/release/METEOR%402.14/packages)
---
## 🔐 External Authentication (OIDC, LDAP, etc.)
WeKan supports external authentication methods via internal packages.
📁 See [`packages/`](https://github.com/wekan/wekan/tree/main/packages) for:
- OpenID Connect (OIDC)
- LDAP
- OAuth and other integrations
---
## 📦 NPM & AtmosphereJS Dependencies
- 🔗 `package.json`: [Dependencies list](https://github.com/wekan/wekan/blob/main/package.json)
- 🧩 WekanTeam scoped NPM packages: [@wekanteam on npm](https://www.npmjs.com/search?q=%40wekanteam)
- ☁️ AtmosphereJS Meteor packages: [atmospherejs.com](https://atmospherejs.com)
---
## 🚧 Meteor Version & Upgrade Notes
- 📌 Current Version: **Meteor 2.14**
- [`.meteor/release`](https://github.com/wekan/wekan/blob/main/.meteor/release)
- 🔧 Maintained with only **critical fixes** until ~Summer 2025
- 🚀 Migration to **Meteor 3** or a new framework is under consideration
📘 Meteor 3 API: [docs.meteor.com/api/accounts](https://docs.meteor.com/api/accounts)
---
## 🧪 Prototypes & Examples
### 🐘 PHP Prototype Sign-Up
Used in experimental versions:
- Step 1: [`sign-up1.php`](https://github.com/wekan/php/blob/main/page/sign-up1.php)
- Step 2: [`sign-up2.php`](https://github.com/wekan/php/blob/main/page/sign-up2.php)
- Main entry: [`index.php#L72-L83`](https://github.com/wekan/php/blob/main/public/index.php#L72-L83)
---
### 🎨 WeKan Studio Prototype
Sign-up logic in the **WeKan Studio** version:
- [`signUp.fmt`](https://github.com/wekan/wekanstudio/blob/main/srv/templates/login/signUp.fmt)
---
## 📎 Future Considerations
- Upgrading to **Meteor 3.x**
- Refactoring frontend logic to fix translation rendering order
- Exploring **simplified authentication systems** in future prototypes
---
## 🔗 Project Links
- 🔧 Main Repo: [github.com/wekan/wekan](https://github.com/wekan/wekan)
- 🌐 Website: [wekan.github.io](https://wekan.github.io)
- 📚 Documentation: [Wekan Wiki](https://github.com/wekan/wekan/wiki)
---
---
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v7.84.0"
appVersion: "v7.89.0"
files:
userUploads:
- README.md
+9 -2
View File
@@ -2544,8 +2544,8 @@ THEME - Exodark
background: #1b1b1b;
}
.board-color-exodark .materialCheckBox.is-checked {
border-bottom: 2px solid #222;
border-right: 2px solid #222;
border-bottom: 2px solid #dbdbdb!important;/*Fix contrast of checkbox*/
border-right: 2px solid #dbdbdb!important;
}
.board-color-exodark .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard {
background: #e9e9e9;
@@ -3179,10 +3179,17 @@ THEME - Clean Dark
margin-top: 8px;
}
.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*/
.board-color-cleanlight.background-box {
background-color:#e0e0e0;
color:#010101!important;
} /*Fixes issues with text colour/background box being similar no contrast */
.board-color-cleanlight {
background: #E0E0E0;
+32 -26
View File
@@ -239,34 +239,40 @@ BlazeComponent.extendComponent({
evt.preventDefault();
},
'click .js-clone-board'(evt) {
let title = getSlug(ReactiveCache.getBoard(this.currentData()._id).title) || 'cloned-board';
Meteor.call(
'copyBoard',
this.currentData()._id,
{
sort: ReactiveCache.getBoards({ archived: false }).length,
type: 'board',
title: ReactiveCache.getBoard(this.currentData()._id).title,
},
(err, res) => {
if (err) {
console.error(err);
} else {
Session.set('fromBoard', null);
subManager.subscribe('board', res, false);
FlowRouter.go('board', {
id: res,
slug: title,
});
}
},
);
evt.preventDefault();
if (confirm(TAPi18n.__('duplicate-board-confirm'))) {
let title =
getSlug(ReactiveCache.getBoard(this.currentData()._id).title) ||
'cloned-board';
Meteor.call(
'copyBoard',
this.currentData()._id,
{
sort: ReactiveCache.getBoards({ archived: false }).length,
type: 'board',
title: ReactiveCache.getBoard(this.currentData()._id).title,
},
(err, res) => {
if (err) {
console.error(err);
} else {
Session.set('fromBoard', null);
subManager.subscribe('board', res, false);
FlowRouter.go('board', {
id: res,
slug: title,
});
}
},
);
evt.preventDefault();
}
},
'click .js-archive-board'(evt) {
const boardId = this.currentData()._id;
Meteor.call('archiveBoard', boardId);
evt.preventDefault();
if (confirm(TAPi18n.__('archive-board-confirm'))) {
const boardId = this.currentData()._id;
Meteor.call('archiveBoard', boardId);
evt.preventDefault();
}
},
'click .js-accept-invite'() {
const boardId = this.currentData()._id;
+9
View File
@@ -225,3 +225,12 @@ template(name="minicardDetailsActionsPopup")
a.js-link
i.fa.fa-link
| {{_ 'link-card'}}
li
a.js-toggle-watch-card
if isWatching
i.fa.fa-eye
| {{_ 'unwatch'}}
else
i.fa.fa-eye-slash
| {{_ 'watch'}}
+14
View File
@@ -46,6 +46,10 @@ BlazeComponent.extendComponent({
}
return ret;
},
isWatching() {
const card = this.currentData();
return card.findWatcher(Meteor.userId());
},
showMembers() {
// cache "board" to reduce the mini-mongodb access
@@ -125,6 +129,9 @@ Template.minicard.helpers({
? Meteor.connection._lastSessionId
: null;
},
isWatching() {
return this.findWatcher(Meteor.userId());
}
});
BlazeComponent.extendComponent({
@@ -178,4 +185,11 @@ Template.minicardDetailsActionsPopup.events({
this.archive();
Utils.goBoardId(this.boardId);
}),
'click .js-toggle-watch-card'() {
const currentCard = this;
const level = currentCard.findWatcher(Meteor.userId()) ? null : 'watching';
Meteor.call('watch', 'card', currentCard._id, level, (err, ret) => {
if (!err && ret) Popup.back();
});
},
});
+3
View File
@@ -98,6 +98,7 @@ textarea:disabled {
border-color: #bfbfbf;
color: #8c8c8c;
-webkit-touch-callout: none;
-webkit-user-select: none;
user-select: none;
}
select {
@@ -322,6 +323,7 @@ textarea::-moz-placeholder {
background: linear-gradient(#fff, #f5f5f5);
border-radius: 3px;
box-sizing: border-box;
-webkit-user-select: none;
user-select: none;
border: 1px solid #e3e3e3;
border-bottom-color: #c2c2c2;
@@ -505,6 +507,7 @@ button.loud-text-button:hover {
.emphasis-button,
.quiet-button {
border-radius: 3px;
-webkit-user-select: none;
user-select: none;
color: #8c8c8c;
display: block;
+7
View File
@@ -59,8 +59,12 @@ button {
html {
font-size: 100%;
max-height: 100%;
-webkit-user-select: none;
user-select: none;
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
body {
background: #dedede;
@@ -188,7 +192,10 @@ strong {
font-weight: bold;
}
p {
-webkit-user-select: none;
user-select: text;
}
p a {
text-decoration: underline;
+1 -1
View File
@@ -177,7 +177,7 @@
@media screen and (max-width: 800px) {
.board-sidebar {
width: 100%;
right: -100%;
left: 0;
}
.board-sidebar .sidebar-content .hide-btn {
width: 40px;
+29 -20
View File
@@ -250,36 +250,45 @@ BlazeComponent.extendComponent({
return [
{
submit(evt) {
evt.preventDefault();
const lastList = this.currentBoard.getLastList();
const titleInput = this.find('.list-name-input');
const title = titleInput.value.trim();
let sortIndex = 0
if (lastList) {
const positionInput = this.find('.list-position-input');
const position = positionInput.value.trim();
const ret = ReactiveCache.getList({ boardId: Utils.getCurrentBoardId(), _id: position, archived: false })
sortIndex = parseInt(JSON.stringify(ret['sort']))
sortIndex = sortIndex+1
} else {
sortIndex = Utils.calculateIndexData(lastList, null).base;
}
evt.preventDefault();
const titleInput = this.find('.list-name-input');
const title = titleInput?.value.trim();
if (!title) return;
let sortIndex = 0;
const lastList = this.currentBoard.getLastList();
const boardId = Utils.getCurrentBoardId();
const positionInput = this.find('.list-position-input');
if (positionInput) {
const positionId = positionInput.value.trim();
const selectedList = ReactiveCache.getList({ boardId, _id: positionId, archived: false });
if (selectedList) {
sortIndex = selectedList.sort + 1;
} else {
sortIndex = Utils.calculateIndexData(lastList, null).base;
}
} else {
sortIndex = Utils.calculateIndexData(lastList, null).base;
}
if (title) {
Lists.insert({
title,
boardId: Session.get('currentBoard'),
sort: sortIndex,
type: this.isListTemplatesSwimlane ? 'template-list' : 'list',
swimlaneId: this.currentBoard.isTemplatesBoard()
? this.currentSwimlane._id
: '',
swimlaneId: this.currentBoard.isTemplatesBoard() ? this.currentSwimlane._id : '',
});
titleInput.value = '';
titleInput.focus();
}
},
}
},
{
'click .js-list-template': Popup.open('searchElement'),
},
];
+16 -3
View File
@@ -1,8 +1,21 @@
Admin Panel / People / Click at right side of usename `...` button that is User Settings / Impersonate user.
## Impersonate a User
You will be switched to logged in as that user.
To impersonate another user in the Admin Panel:
To switch back to your original user, at your webbrowser click `Reload open webpage` round arrow button.
1. Go to **Admin Panel** → **People**.
2. Find the user you want to impersonate.
3. Click the **`...` (three dots)** menu on the right side of the username.
4. Select **User Settings** → **Impersonate User**.
You will now be logged in as that user.
### How to Switch Back
To return to your original admin account:
- Click the **Reload** (🔄) button in your web browser to refresh the page.
---
📝 **Note:**
This feature was added to Wekan v4.39 at https://github.com/wekan/wekan/pull/3280
+15 -8
View File
@@ -10,6 +10,7 @@ There edit Browser-compatibility-matrix.md and attach it with .txt extension or
Browser | [PWA](PWA) | Mobile | Desktop | OS
------- | ----| ------ | ------- | -------
Safari | iOS Yes | iOS Newest | Newest | iOS, macOS
Iris | No | No | Newest | [Iris browser news](https://www.riscosopen.org/forum/forums/1/topics/19545), Download [RISC OS Direct](https://www.riscosdev.com/direct/) for Raspberry Pi etc. [Other versions of RISC OS for many ARM CPU devices](https://www.riscosopen.org/content/downloads) do not have Iris browser yet, but there could be some way to transfer Iris browser files from RISC OS Direct.
## Firefox based
@@ -17,10 +18,8 @@ Any telemetry at any Firefox based browser can be additionally most locked down
Browser | [PWA](PWA) | Mobile | Desktop | OS
------- | ----| ------ | ------- | -------
[Mypal](https://releases.wekan.team/mypal/) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132), Other 32bit browsers probably not
Firefox | Android Yes | Android Newest | Newest | Win/Mac/Linux/BSD/RasPi. [Haiku](https://discuss.haiku-os.org/t/progress-on-porting-firefox/13493/143) not tested yet - [HN](https://news.ycombinator.com/item?id=41214762).
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) (based on Ubuntu 16.04) on PinePhone, OnePlus 3, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). Works best with bluetooth or USB mouse and keyboard. [Repo](https://gitlab.com/ubports/development/core/morph-browser)
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . Tested on [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/). PWA URL is configured here https://github.com/wekan/wekan-openstore/blob/master/wekan.desktop#L3
[Mypal](https://github.com/reactosapps/apps/releases/download/0.01/mypal-27.9.4.win32.installer.exe) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132)
Firefox | No | Newest | Newest | iOS/Android/Win/Mac/Linux/BSD/RasPi. At iOS uses Safari engine, elsewhere Firefox engine. [Haiku](https://discuss.haiku-os.org/t/progress-on-porting-firefox/13493/143) not tested yet - [HN](https://news.ycombinator.com/item?id=41214762).
[Waterfox](https://www.waterfox.net) | No | No | Yes | Win/Mac/Linux, more private than Firefox, no tracking. [Repo](https://github.com/BrowserWorks/Waterfox)
[Floorp](https://floorp.app) | No | No | Yes | [Win/Mac/Linux](https://github.com/Floorp-Projects/Floorp/releases), more private than Firefox, [Repo](https://github.com/Floorp-Projects/Floorp)
[Mercury](https://thorium.rocks/mercury) | No | No | Yes | [Win/Linux](https://github.com/Alex313031/Mercury/releases), more private than Firefox, [Repo](https://github.com/Alex313031/Mercury)
@@ -38,6 +37,8 @@ Brave | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
Vivaldi | Android Yes | Android Newest | Newest | Win/Mac/Linux
Opera | Android Yes | Android Newest | Newest | Win/Mac/Linux
Credge, Chromium Edge | Android Yes | Android | Newest | Win/Mac/Linux/Mobile
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) based on Ubuntu 16.04 and 20.04 at all Ubuntu Touch devices, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). [Repo](https://gitlab.com/ubports/development/core/morph-browser)
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . App source code for Ubuntu 16.04 at https://github.com/wekan/wekan-openstore and Ubuntu 20.04 at https://github.com/wekan/wekan-openstore2
[Microsoft Store App](https://www.microsoft.com/fi-fi/p/wekan/9p2mrxvd087r#activetab=pivot:overviewtab) | Yes | Yes | Yes | At Microsoft Store of Windows 10/11 desktop, made with [PWABuilder](https://www.pwabuilder.com/). Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), changed app from EdgeHTML to Credge based with Wekan demo & development server https://boards.wekan.team
[Android Play Store App](https://play.google.com/store/apps/details?id=team.wekan.boards.twa) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), made with [PWABuilder](https://www.pwabuilder.com/), uses Android Chrome browser with Wekan demo & development server https://boards.wekan.team
[Thorium](https://thorium.rocks) | No | Yes | Yes | [Win/Win7/Mac/Linux/Android/RasPi](https://thorium.rocks), speed optimized
@@ -57,10 +58,16 @@ Internet Explorer | No | No | No | No | No
## Servo based, not tested yet
- Apache 2.0 or MIT license
- Repo: https://github.com/versotile-org/verso
- Verso
- Apache 2.0 or MIT license
- Repo: https://github.com/versotile-org/verso
- Servo
- MPL-2.0 license
- https://servo.org
- Repo: https://github.com/servo/servo
- At https://www.youtube.com/watch?v=g9hzWXxUgiU was said, that Gmail works, so maybe WeKan could also work
## Ladybird based, not tested yet:
## Ladybird based, not yet compatible with WeKan
- BSD-2-Clause license
- Website: https://ladybird.org
@@ -76,7 +83,7 @@ Benefits:
## Desktop app with Meteor
https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
- https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
## Optional Payments
+30 -6
View File
@@ -4,15 +4,35 @@
- Bun Javascript Engine https://bun.sh
- MongoDB 5.x and newer https://github.com/turnkeylinux/tracker/issues/1724#issuecomment-2351544191
- Does not work at s390x
- V programming language https://github.com/vlang/v/issues/18737
- Bun Javascript Engine https://github.com/oven-sh/bun/issues/2632
- Deno Javascript Engine https://github.com/denoland/deno/issues/20212#issuecomment-1756663943
- Lazarus IDE https://www.lazarus-ide.org
- FreePascal programming language https://www.freepascal.org
- TigerBeetle database https://github.com/tigerbeetle/tigerbeetle/issues/2241
- GUI requires porting to other OS
## What is Cross-Platform
- Works at s390x
- Programming languages
- Node.js https://nodejs.org https://github.com/wekan/ferretdb/tree/main/node-deno-bun (not Deno or Bun)
- C89 https://github.com/xet7/darkesthour
- PHP https://github.com/wekan/php
- Go https://github.com/wekan/wekango
- Tcl/Tk
- Web Frameworks
- V veb https://github.com/vlang/v/issues/18737
- Gambas https://github.com/wekan/hx/tree/main/prototypes/ui/gambas
- Python Py4Web https://py4web.com
- Ruby on Rails https://github.com/werot
- WeKan Studio https://github.com/wekan/wekanstudio
- Works at AmigaOS 3.x/4.x/MorphOS/AROS, Win/Mac/Linux
- Web frameworks
- FreePascal https://github.com/wekan/wami
- GUI
- BBC Basic https://www.bbcbasic.net/wiki/doku.php?id=converting_20programs_20from_20risc_20os_20to_20windows
- Tcl/Tk GUI does works at most OS
- Godot https://godotengine.org , https://github.com/godotengine/godot
- Redot https://www.redotengine.org , https://github.com/Redot-Engine/redot-engine
- HaxeUI https://haxeui.org
## Prototype Strategy
@@ -251,7 +271,7 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
- Only test webpage. No actual features.
### Node.js 20, Bun and Deno
- Repo https://github.com/wekan/wekan-node20
- Repo https://github.com/wekan/ferretdb/tree/main/node-deno-bun
- Features:
- main.js makes database queries to many databases
- Database drivers:
@@ -282,7 +302,7 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
### FreePascal
- Repo https://github.com/wekan/wami
- Some static pages
- Some static pages. At upload page, uploading file now works.
- Previous:
- Repo https://github.com/wekan/hx/tree/main/prototypes/code/webserver/works/freepascal-router
- Router and some webpage
@@ -345,4 +365,8 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
### Swap microframework, vs HTMX
- https://github.com/josephernest/Swap
- https://news.ycombinator.com/item?id=35991783
- https://news.ycombinator.com/item?id=35991783
### 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.
+4 -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.84-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.84/wekan-7.84-amd64-windows.zip)
1. [wekan-7.89-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.89/wekan-7.89-amd64-windows.zip)
2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe)
3. [mongodb-windows-x86_64-6.0.20-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.20-signed.msi)
3. [mongodb-windows-x86_64-6.0.23-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.23-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-6.0.20-signed.msi` . In installer, uncheck downloading MongoDB compass.
6. Double click `mongodb-windows-x86_64-6.0.23-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-7.84-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-7.89-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+7
View File
@@ -1,3 +1,10 @@
## Infra Caddy Guy Scripts: Docker, Caddy Lightweight Server Management Bash TUI
- https://github.com/nguyenanhung/infra-caddy-guy
- https://news.ycombinator.com/item?id=43940096
----
[Caddy 2 .well-known/assetlinks.json config for WeKan Android Play Store app](../PWA#fullscreen-android-app-with-caddy-and-wekan-server)
# CloudFlare DNS
+73 -73
View File
@@ -49,7 +49,7 @@
"activity-archived": "%s انتقل الى الارشيف",
"activity-attached": "إرفاق %s ل %s",
"activity-created": "أنشأ %s",
"activity-changedListTitle": "renamed list to %s",
"activity-changedListTitle": "إعادة تسمية القائمة إلى ",
"activity-customfield-created": "%s احدت حقل مخصص",
"activity-excluded": "استبعاد %s عن %s",
"activity-imported": "imported %s into %s from %s",
@@ -86,16 +86,16 @@
"add-card": "إضافة بطاقة",
"add-card-to-top-of-list": "Add Card to Top of List",
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
"setListWidthPopup-title": "Set Widths",
"set-list-width": "Set Widths",
"set-list-width-value": "Set Min & Max Widths (pixels)",
"list-width-error-message": "List widths must be integers greater than 100",
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
"setSwimlaneHeightPopup-title": "Set Swimlane Height",
"set-swimlane-height": "Set Swimlane Height",
"set-swimlane-height-value": "Swimlane Height (pixels)",
"swimlane-height-error-message": "Swimlane height must be a positive integer",
"setListWidthPopup-title": "تعيين العرض",
"set-list-width": "تعيين العرض",
"set-list-width-value": "تعيين الحد الأدنى والأقصى للعرض (بالبكسل)",
"list-width-error-message": "يجب أن تكون عرضات القائمة أعدادًا صحيحة أكبر من 100",
"keyboard-shortcuts-enabled": "تم تفعيل اختصارات لوحة المفاتيح. انقر لتعطيلها.",
"keyboard-shortcuts-disabled": "اختصارات لوحة المفاتيح معطلة. انقر للتفعيل.",
"setSwimlaneHeightPopup-title": "ضبط ارتفاع مسار السباحة",
"set-swimlane-height": "ضبط ارتفاع مسار السباحة",
"set-swimlane-height-value": "ارتفاع مسار السباحة (بكسل)",
"swimlane-height-error-message": "يجب أن يكون ارتفاع مسار السباحة عددًا صحيحًا موجبًا\n ",
"add-swimlane": "Add Swimlane",
"add-subtask": "إضافة مهمة فرعية",
"add-checklist": "إضافة قائمة تدقيق",
@@ -103,10 +103,10 @@
"close-add-checklist-item": "Close add an item to checklist form",
"close-edit-checklist-item": "Close edit an item to checklist form",
"convertChecklistItemToCardPopup-title": "Convert to Card",
"add-cover": "Add cover image to minicard",
"add-cover": "إضافة صورة الغلاف إلى البطاقة الصغيرة",
"add-label": "إضافة ملصق",
"add-list": "إضافة قائمة",
"add-after-list": "Add After List",
"add-after-list": "أضف بعد القائمة",
"add-members": "إضافة أعضاء",
"added": "أُضيف",
"addMemberPopup-title": "أعضاء",
@@ -146,13 +146,13 @@
"attachmentDeletePopup-title": "تريد حذف المرفق ?",
"attachments": "المرفقات",
"auto-watch": "مراقبة لوحات تلقائيا عندما يتم إنشاؤها",
"avatar-too-big": "The avatar is too large (__size__ max)",
"avatar-too-big": "الصورة الرمزية كبيرة جدًا (الحجم الأقصى)",
"back": "رجوع",
"board-change-color": "تغيير اللومr",
"board-change-background-image": "Change Background Image",
"board-background-image-url": "Background Image URL",
"add-background-image": "Add Background Image",
"remove-background-image": "Remove Background Image",
"board-change-background-image": "تغيير صورة الخلفية",
"board-background-image-url": "عنوان URL لصورة الخلفية",
"add-background-image": "إضافة صورة الخلفية",
"remove-background-image": "إزالة صورة الخلفية",
"show-at-all-boards-page" : "Show at All Boards page",
"board-info-on-my-boards" : "جميع إعدادات اللوحات",
"boardInfoOnMyBoardsPopup-title" : "جميع إعدادات اللوحات",
@@ -165,9 +165,9 @@
"board-public-info": "سوف تصبح هذه اللوحة <strong>عامّة</strong>.",
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
"boardChangeColorPopup-title": "تعديل خلفية الشاشة",
"boardChangeBackgroundImagePopup-title": "Change Background Image",
"boardChangeBackgroundImagePopup-title": "تغيير صورة الخلفية",
"allBoardsChangeColorPopup-title": "تغيير اللومr",
"allBoardsChangeBackgroundImagePopup-title": "Change Background Image",
"allBoardsChangeBackgroundImagePopup-title": "تغيير صورة الخلفية",
"boardChangeTitlePopup-title": "إعادة تسمية اللوحة",
"boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية",
"boardChangeWatchPopup-title": "تغيير المتابعة",
@@ -266,9 +266,9 @@
"checklists": "قوائم التّدقيق",
"click-to-star": "اضغط لإضافة اللوحة للمفضلة.",
"click-to-unstar": "اضغط لحذف اللوحة من المفضلة.",
"click-to-enable-auto-width": "Auto list width disabled. Click to enable.",
"click-to-disable-auto-width": "Auto list width enabled. Click to disable.",
"auto-list-width": "Auto list width",
"click-to-enable-auto-width": "تم تعطيل عرض القائمة التلقائي. انقر للتفعيل.",
"click-to-disable-auto-width": "تم تفعيل عرض القائمة التلقائي. انقر لتعطيله.",
"auto-list-width": "عرض القائمة التلقائية",
"clipboard": "Clipboard or drag & drop",
"close": "غلق",
"close-board": "غلق اللوحة",
@@ -300,7 +300,7 @@
"color-white": "أبيض",
"color-yellow": "yellow",
"unset-color": "غير محدد",
"comments": "Comments",
"comments": "تعليقات",
"comment": "تعليق",
"comment-placeholder": "أكتب تعليق",
"comment-only": "التعليق فقط",
@@ -383,14 +383,14 @@
"email-sent": "Email sent",
"email-verifyEmail-subject": "Verify your email address on __siteName__",
"email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
"enable-vertical-scrollbars": "Enable vertical scrollbars",
"enable-vertical-scrollbars": "تمكين أشرطة التمرير العمودية",
"enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "This board does not exist",
"error-board-notAdmin": "You need to be admin of this board to do that",
"error-board-notAMember": "You need to be a member of this board to do that",
"error-json-malformed": "Your text is not valid JSON",
"error-json-schema": "Your JSON data does not include the proper information in the correct format",
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-list-doesNotExist": "This list does not exist",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
@@ -429,7 +429,7 @@
"filter-overdue": "Overdue",
"filter-due-today": "Due today",
"filter-due-this-week": "Due this week",
"filter-due-next-week": "Due next week",
"filter-due-next-week": "المقرر الاسبوع المقبل",
"filter-due-tomorrow": "Due tomorrow",
"list-filter-label": "Filter List by Title",
"filter-clear": "مسح التصفية",
@@ -451,7 +451,7 @@
"advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\\\/) to be skipped, you can use \\\\. For example: Field1 == I\\\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
"fullname": "الإسم الكامل",
"header-logo-title": "الرجوع إلى صفحة اللوحات",
"show-activities": "Show Activities",
"show-activities": "عرض الأنشطة",
"headerBarCreateBoardPopup-title": "إنشاء لوحة",
"home": "الرئيسية",
"import": "Import",
@@ -558,7 +558,7 @@
"public": "عامّ",
"public-desc": "هذه اللوحة عامة: مرئية لكلّ من يحصل على الرابط ، و هي مرئية أيضا في محركات البحث مثل جوجل. التعديل مسموح به للأعضاء فقط.",
"quick-access-description": "أضف لوحة إلى المفضلة لإنشاء اختصار في هذا الشريط.",
"remove-cover": "Remove cover image from minicard",
"remove-cover": "إزالة صورة الغلاف من البطاقة الصغيرة",
"remove-from-board": "حذف من اللوحة",
"remove-label": "إزالة التصنيف",
"listDeletePopup-title": "حذف القائمة ؟",
@@ -587,7 +587,7 @@
"shortcut-clear-filters": "مسح التصفيات",
"shortcut-close-dialog": "غلق النافذة",
"shortcut-filter-my-cards": "تصفية بطاقاتي",
"shortcut-filter-my-assigned-cards": "Filter my assigned cards",
"shortcut-filter-my-assigned-cards": "تصفية البطاقات المخصصة لي",
"shortcut-show-shortcuts": "عرض قائمة الإختصارات ،تلك",
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-searchbar": "Toggle Search Sidebar",
@@ -610,7 +610,7 @@
"has-spenttime-cards": "Has spent time cards",
"time": "الوقت",
"title": "عنوان",
"toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).",
"toggle-assignees": "تبديل المخصصين من 1-9 للبطاقة (حسب ترتيب الإضافة إلى اللوحة).",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "تتبع",
@@ -750,9 +750,9 @@
"deposit-subtasks-list": "Landing list for subtasks deposited here:",
"show-parent-in-minicard": "Show parent in minicard:",
"description-on-minicard": "Description on minicard",
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"cover-attachment-on-minicard": "صورة الغلاف على البطاقة الصغيرة",
"badge-attachment-on-minicard": "عدد المرفقات على البطاقة الصغيرة",
"card-sorting-by-number-on-minicard": "رز البطاقات حسب الرقم على البطاقة الصغيرة",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
@@ -865,7 +865,7 @@
"r-items-list": "item1,item2,item3",
"r-add-swimlane": "Add swimlane",
"r-swimlane-name": "swimlane name",
"r-board-note": "Note: leave a field empty to match every possible value. ",
"r-board-note": "ملحوظة: اترك الحقل فارغًا لمطابقة كل قيمة ممكنة.",
"r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
"r-when-a-card-is-moved": "When a card is moved to another list",
"r-set": "Set",
@@ -896,9 +896,9 @@
"oidc-button-text": "Customize the OIDC button text",
"default-authentication-method": "Default Authentication Method",
"duplicate-board": "Duplicate Board",
"org-number": "The number of organizations is: ",
"team-number": "The number of teams is: ",
"people-number": "The number of people is: ",
"org-number": "عدد المنظمات هو:",
"team-number": "عدد الفرق هو:",
"people-number": "عدد الأشخاص هو:",
"swimlaneDeletePopup-title": "Delete Swimlane ?",
"swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
"restore-all": "Restore all",
@@ -966,7 +966,7 @@
"delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
"delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
"hide-checked-items": "Hide checked items",
"hide-finished-checklist": "Hide finished checklist",
"hide-finished-checklist": "إخفاء قائمة التحقق النهائية",
"task": "Task",
"create-task": "Create Task",
"ok": "OK",
@@ -974,7 +974,7 @@
"teams": "Teams",
"displayName": "Display Name",
"shortName": "Short Name",
"autoAddUsersWithDomainName": "Automatically add users with the domain name",
"autoAddUsersWithDomainName": "إضافة المستخدمين تلقائيًا باستخدام اسم المجال",
"website": "موقع الكتروني",
"person": "شخص",
"my-cards": "My Cards",
@@ -1111,7 +1111,7 @@
"label-names": "Label Names",
"archived-at": "archived at",
"sort-cards": "Sort Cards",
"sort-is-on": "Sort is on",
"sort-is-on": "الفرز قيد التشغيل",
"cardsSortPopup-title": "Sort Cards",
"due-date": "Due Date",
"server-error": "خطأ بالخادم",
@@ -1120,8 +1120,8 @@
"created-at-newest-first": "Created At (Newest First)",
"created-at-oldest-first": "Created At (Oldest First)",
"links-heading": "روابط",
"hide-activities-of-all-boards": "Don't show the board activities on all boards",
"now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden",
"hide-activities-of-all-boards": "لا تعرض أنشطة اللوحة على جميع اللوحات",
"now-activities-of-all-boards-are-hidden": "الآن تم إخفاء جميع أنشطة جميع المجالس",
"move-swimlane": "Move Swimlane",
"moveSwimlanePopup-title": "Move Swimlane",
"custom-field-stringtemplate": "String Template",
@@ -1129,7 +1129,7 @@
"custom-field-stringtemplate-separator": "Separator (use &#32; or &nbsp; for a space)",
"custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
"creator": "المنشئ",
"creator-on-minicard": "Creator on minicard",
"creator-on-minicard": "الخالق على بطاقة صغيرة",
"filesReportTitle": "تقارير الملفات",
"reports": "تقارير",
"rulesReportTitle": "Rules Report",
@@ -1204,9 +1204,9 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items",
"newLineNewItem": "One line of text = one checklist item",
"newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order",
"newlineBecomesNewChecklistItem": "يصبح كل سطر من النص أحد عناصر قائمة التحقق",
"newLineNewItem": "سطر واحد من النص = عنصر واحد من قائمة التحقق",
"newlineBecomesNewChecklistItemOriginOrder": "يصبح كل سطر من النص أحد عناصر قائمة التحقق، الترتيب الأصلي",
"originOrder": "النظام الأصلي\n ",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
@@ -1241,32 +1241,32 @@
"minicardDetailsActionsPopup-title": "نقاصيل البطاقة",
"Mongo_sessions_count": "Mongo sessions count",
"change-visibility": "تعديل وضوح الرؤية",
"max-upload-filesize": "Max upload filesize in bytes:",
"allowed-upload-filetypes": "Allowed upload filetypes:",
"max-avatar-filesize": "Max avatar filesize in bytes:",
"allowed-avatar-filetypes": "Allowed avatar filetypes:",
"invalid-file": "If filename is invalid, upload or rename is cancelled.",
"preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.",
"drag-board": "Drag board",
"translation-number": "The number of custom translation strings is:",
"delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.",
"newTranslationPopup-title": "New custom translation string",
"editTranslationPopup-title": "Edit custom translation string",
"settingsTranslationPopup-title": "Delete this custom translation string?",
"translation": "Translation",
"max-upload-filesize": "الحد الأقصى لحجم الملف المرفوع بالبايت:",
"allowed-upload-filetypes": "أنواع الملفات المسموح بتحميلها:",
"max-avatar-filesize": "الحد الأقصى لحجم الصورة الرمزية بالبايت:",
"allowed-avatar-filetypes": "أنواع ملفات الصورة الرمزية المسموح بها:",
"invalid-file": "إذا كان اسم الملف غير صالح، فسيتم إلغاء عملية التحميل أو إعادة التسمية.",
"preview-pdf-not-supported": "جهازك لا يدعم معاينة ملفات PDF. حاول تنزيل الملف بدلاً من ذلك.",
"drag-board": "لوحة السحب",
"translation-number": "عدد سلاسل الترجمة المخصصة هو:",
"delete-translation-confirm-popup": "هل أنت متأكد من حذف سلسلة الترجمة المخصصة هذه؟ لا يوجد خيار للتراجع.",
"newTranslationPopup-title": "سلسلة ترجمة مخصصة جديدة",
"editTranslationPopup-title": "تحرير سلسلة الترجمة المخصصة",
"settingsTranslationPopup-title": "حذف سلسلة الترجمة المخصصة هذه؟",
"translation": "ترجمة",
"text": "نص",
"translation-text": "Translation text",
"show-subtasks-field": "Show subtasks field",
"show-week-of-year": "Show week of year (ISO 8601)",
"convert-to-markdown": "Convert to markdown",
"import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments",
"translation-text": "نص الترجمة",
"show-subtasks-field": "إظهار حقل المهام الفرعية",
"show-week-of-year": "عرض أسبوع السنة (ISO 8601)",
"convert-to-markdown": "تحويل إلى تخفيض السعر",
"import-board-zip": "أضف ملف .zip الذي يحتوي على ملفات JSON الخاصة باللوحة، ودلائل فرعية لأسماء اللوحة مع المرفقات",
"collapse": "انهيار",
"uncollapse": "Uncollapse",
"hideCheckedChecklistItems": "Hide checked checklist items",
"hideAllChecklistItems": "Hide all checklist items",
"support": "Support",
"supportPopup-title": "Support",
"accessibility-page-enabled": "Accessibility page enabled",
"accessibility-title": "Accessibility topic",
"accessibility-content": "Accessibility content"
"uncollapse": "إلغاء الانهيار",
"hideCheckedChecklistItems": "إخفاء عناصر قائمة التحقق المحددة",
"hideAllChecklistItems": "إخفاء جميع عناصر قائمة التحقق",
"support": "دعم",
"supportPopup-title": "دعم",
"accessibility-page-enabled": "تم تمكين صفحة إمكانية الوصول",
"accessibility-title": "موضوع إمكانية الوصول",
"accessibility-content": "محتوى إمكانية الوصول"
}
+2 -2
View File
@@ -319,7 +319,7 @@
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copy-text-to-clipboard": "Copy text to clipboard",
"linkCardPopup-title": "Link Card",
"searchElementPopup-title": "Search",
"searchElementPopup-title": "Klask",
"copyCardPopup-title": "Copy Card",
"copyManyCardsPopup-title": "Copy Template to Many Cards",
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
@@ -572,7 +572,7 @@
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
"save": "Save",
"search": "Search",
"search": "Klask",
"rules": "Rules",
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
"search-example": "Write text you search and press Enter",
File diff suppressed because it is too large. Load diff
+2
View File
@@ -125,6 +125,7 @@
"archive": "Move to Archive",
"archive-all": "Move All to Archive",
"archive-board": "Move Board to Archive",
"archive-board-confirm": "Are you sure you want to archive this board?",
"archive-card": "Move Card to Archive",
"archive-list": "Move List to Archive",
"archive-swimlane": "Move Swimlane to Archive",
@@ -896,6 +897,7 @@
"oidc-button-text": "Customize the OIDC button text",
"default-authentication-method": "Default Authentication Method",
"duplicate-board": "Duplicate Board",
"duplicate-board-confirm": "Are you sure you want to duplicate this board?",
"org-number": "The number of organizations is: ",
"team-number": "The number of teams is: ",
"people-number": "The number of people is: ",
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -16,9 +16,9 @@
"act-uncheckedItem": "desmarcado el elemento __checklistItem__ de la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-completeChecklist": "completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-uncompleteChecklist": "no completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-addComment": "comentario en la tarjeta__card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-editComment": "comentario editado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-deleteComment": "comentario eliminado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-addComment": "ha comentado en la tarjeta__card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-editComment": "ha editado la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-deleteComment": "ha borrado el comentario en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
"act-createBoard": "creó el tablero __board__",
"act-createSwimlane": "creó el carril de flujo __swimlane__ en el tablero __board__",
"act-createCard": "creada la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
+21 -21
View File
@@ -14,7 +14,7 @@
"act-removeChecklistItem": "移除看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 清单项 __checklistItem__",
"act-checkedItem": "选中看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 的清单项 __checklistItem__",
"act-uncheckedItem": "反选看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 的清单项 __checklistItem__",
"act-completeChecklist": "完成检查列表 __checklist__ 卡片 __card__ 列表 __list__ 泳道 __swimlane__ 看板 __board__",
"act-completeChecklist": "完成清单 __checklist__ 卡片 __card__ 列表 __list__ 泳道 __swimlane__ 看板 __board__",
"act-uncompleteChecklist": "看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 未完成",
"act-addComment": "对看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 发表了评论: __comment__",
"act-editComment": "编辑卡片中的评论:看板__board__中的泳道__swimlane__中的列表__list__中的评论__comment__",
@@ -86,12 +86,12 @@
"add-card": "添加卡片",
"add-card-to-top-of-list": "添加卡片到列表顶部",
"add-card-to-bottom-of-list": "添加卡片到列表底部",
"setListWidthPopup-title": "Set Widths",
"set-list-width": "Set Widths",
"set-list-width-value": "Set Min & Max Widths (pixels)",
"list-width-error-message": "List widths must be integers greater than 100",
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
"setListWidthPopup-title": "设定宽度",
"set-list-width": "设定宽度",
"set-list-width-value": "设定最小与最大宽度(像素)",
"list-width-error-message": "列表宽度必须为大于100的整数",
"keyboard-shortcuts-enabled": "已启用键盘快捷键。点选已停用。",
"keyboard-shortcuts-disabled": "已停用键盘快捷键。点选已启用。",
"setSwimlaneHeightPopup-title": "设置泳道高度",
"set-swimlane-height": "设置泳道高度",
"set-swimlane-height-value": "泳道高度(px)",
@@ -266,9 +266,9 @@
"checklists": "清单",
"click-to-star": "点此来标记该看板",
"click-to-unstar": "点此来去除该看板的标记",
"click-to-enable-auto-width": "Auto list width disabled. Click to enable.",
"click-to-disable-auto-width": "Auto list width enabled. Click to disable.",
"auto-list-width": "Auto list width",
"click-to-enable-auto-width": "已停用自动列表宽度。点选已启用。",
"click-to-disable-auto-width": "已启用自动列表宽度。点选已停用。",
"auto-list-width": "自动列表宽度",
"clipboard": "剪贴板或者拖放文件",
"close": "关闭",
"close-board": "关闭看板",
@@ -383,7 +383,7 @@
"email-sent": "邮件已发送",
"email-verifyEmail-subject": "在 __siteName__ 验证您的邮件地址",
"email-verifyEmail-text": "尊敬的 __user__,\n\n点击下面的链接,验证您的邮件地址:\n\n__url__\n\n谢谢。",
"enable-vertical-scrollbars": "Enable vertical scrollbars",
"enable-vertical-scrollbars": "启用垂直滚动条",
"enable-wip-limit": "启用最大任务数限制",
"error-board-doesNotExist": "该看板不存在",
"error-board-notAdmin": "需要成为管理员才能执行此操作",
@@ -580,7 +580,7 @@
"select-board": "选择看板",
"set-wip-limit-value": "设置此列表中的最大任务数",
"setWipLimitPopup-title": "设置最大任务数",
"shortcut-add-self": "Add yourself to current card",
"shortcut-add-self": "将您新增至目前的卡片",
"shortcut-assign-self": "指派当前卡片给自己",
"shortcut-autocomplete-emoji": "表情符号自动补全",
"shortcut-autocomplete-members": "自动补全成员",
@@ -610,7 +610,7 @@
"has-spenttime-cards": "耗时卡",
"time": "时间",
"title": "标题",
"toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).",
"toggle-assignees": "切换卡片的代理人 1-9(按加入看板的顺序)。",
"toggle-labels": "切换卡片标签1-9,多选添加标签1-9",
"remove-labels-multiselect": "多选移除标签1-9",
"tracking": "跟踪",
@@ -1257,16 +1257,16 @@
"text": "文本",
"translation-text": "翻译文本",
"show-subtasks-field": "显示子任务字段",
"show-week-of-year": "Show week of year (ISO 8601)",
"show-week-of-year": "显示年度周数(ISO 8601)",
"convert-to-markdown": "转换成markdown",
"import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments",
"import-board-zip": "新增包含看板 JSON文件与帶有附件的看板名称子目录的 .zip文件",
"collapse": "崩溃",
"uncollapse": "展开",
"hideCheckedChecklistItems": "隐藏勾选的清单项",
"hideAllChecklistItems": "Hide all checklist items",
"support": "Support",
"supportPopup-title": "Support",
"accessibility-page-enabled": "Accessibility page enabled",
"accessibility-title": "Accessibility topic",
"accessibility-content": "Accessibility content"
"hideAllChecklistItems": "隐藏所有待办清单项目",
"support": "支持",
"supportPopup-title": "支持",
"accessibility-page-enabled": "已启用无障碍页面",
"accessibility-title": "无障碍主题",
"accessibility-content": "无障碍内容"
}
+9 -20
View File
@@ -275,22 +275,18 @@ if (Meteor.isServer) {
url: FlowRouter.url('sign-up'),
};
const lang = author.getLanguage();
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
// Use EmailLocalization utility to handle email in the proper language
if (typeof EmailLocalization !== 'undefined') {
EmailLocalization.sendEmail({
to: icode.email,
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-register-subject', params, lang),
text: TAPi18n.__('email-invite-register-text', params, lang),
})
subject: 'email-invite-register-subject',
text: 'email-invite-register-text',
params: params,
language: lang
});
} else {
// Fallback if EmailLocalization is not available
Email.send({
to: icode.email,
from: Accounts.emailTemplates.from,
@@ -298,13 +294,6 @@ if (Meteor.isServer) {
text: TAPi18n.__('email-invite-register-text', params, lang),
});
}
*/
Email.send({
to: icode.email,
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-register-subject', params, lang),
text: TAPi18n.__('email-invite-register-text', params, lang),
});
} catch (e) {
InvitationCodes.remove(_id);
throw new Meteor.Error('email-fail', e.message);
+44 -55
View File
@@ -1618,62 +1618,51 @@ if (Meteor.isServer) {
subBoard.addMember(user._id);
user.addInvite(subBoard._id);
}
}
} try {
const fullName =
inviter.profile !== undefined &&
inviter.profile.fullname !== undefined
? inviter.profile.fullname
: '';
const userFullName =
user.profile !== undefined && user.profile.fullname !== undefined
? user.profile.fullname
: '';
const params = {
user:
userFullName != ''
? userFullName + ' (' + user.username + ' )'
: user.username,
inviter:
fullName != ''
? fullName + ' (' + inviter.username + ' )'
: inviter.username,
board: board.title,
url: board.absoluteUrl(),
};
// Get the recipient user's language preference for the email
const lang = user.getLanguage();
try {
const fullName =
inviter.profile !== undefined &&
inviter.profile.fullname !== undefined
? inviter.profile.fullname
: '';
const userFullName =
user.profile !== undefined && user.profile.fullname !== undefined
? user.profile.fullname
: '';
const params = {
user:
userFullName != ''
? userFullName + ' (' + user.username + ' )'
: user.username,
inviter:
fullName != ''
? fullName + ' (' + inviter.username + ' )'
: inviter.username,
board: board.title,
url: board.absoluteUrl(),
};
const lang = user.getLanguage();
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
})
} else {
Email.send({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
});
}
*/
Email.send({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
});
// Add code to send invitation with EmailLocalization
if (typeof EmailLocalization !== 'undefined') {
EmailLocalization.sendEmail({
to: user.emails[0].address,
from: Accounts.emailTemplates.from,
subject: 'email-invite-subject',
text: 'email-invite-text',
params: params,
language: lang,
userId: user._id
});
} else {
// Fallback if EmailLocalization is not available
Email.send({
to: user.emails[0].address,
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
});
}
} catch (e) {
throw new Meteor.Error('email-fail', e.message);
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v7.84.0",
"version": "v7.89.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v7.84.0",
"version": "v7.89.0",
"description": "Open-Source kanban",
"private": true,
"repository": {
+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.84">Wekan REST API v7.84</a>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v7.89">Wekan REST API v7.89</a>
</li>
@@ -1963,7 +1963,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.84</h1>
<h1 id="wekan-rest-api">Wekan REST API v7.89</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.84
version: v7.89
description: |
The REST API allows you to control and extend Wekan with ease.
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Use: snapcraft login"
echo "Then use version number:"
echo " ./releases/snap-build-push-edge-candidate.sh 7.88"
exit 1
fi
sudo apt -y install snapd
sudo systemctl enable snapd
sudo systemctl start snapd
sudo snap install snapcraft --classic
sudo snap install multipass
multipass launch --name ubu
snapcraft
snapcraft upload --release=candidate,edge wekan_$1_amd64.snap
+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 = 784,
appVersion = 789,
# Increment this for every release.
appMarketingVersion = (defaultText = "7.84.0~2025-03-23"),
appMarketingVersion = (defaultText = "7.89.0~2025-05-13"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+58
View File
@@ -0,0 +1,58 @@
// emailLocalization.js
// Utility functions to handle email localization in Wekan
import { TAPi18n } from '/imports/i18n';
import { ReactiveCache } from '/imports/reactiveCache';
// Main object for email localization utilities
EmailLocalization = {
/**
* Send an email using the recipient's preferred language
* @param {Object} options - Standard email sending options plus language options
* @param {String} options.to - Recipient email address
* @param {String} options.from - Sender email address
* @param {String} options.subject - Email subject i18n key
* @param {String} options.text - Email text i18n key
* @param {Object} options.params - Parameters for i18n translation
* @param {String} options.language - Language code to use (if not provided, will try to detect)
* @param {String} options.userId - User ID to determine language (if not provided with language)
*/
sendEmail(options) {
// Determine the language to use
let lang = options.language;
// If no language is specified but we have a userId, try to get the user's language
if (!lang && options.userId) {
const user = ReactiveCache.getUser(options.userId);
if (user) {
lang = user.getLanguage();
}
}
// If no language could be determined, use the site default
if (!lang) {
lang = TAPi18n.getLanguage() || 'en';
}
// Translate subject and text using the determined language
const subject = TAPi18n.__(options.subject, options.params || {}, lang);
let text = options.text;
// If text is an i18n key, translate it
if (typeof text === 'string' && text.startsWith('email-')) {
text = TAPi18n.__(text, options.params || {}, lang);
}
// Send the email with translated content
return Email.send({
to: options.to,
from: options.from || Accounts.emailTemplates.from,
subject: subject,
text: text,
html: options.html
});
}
};
// Add module.exports to make it accessible from other files
module.exports = EmailLocalization;
+4
View File
@@ -0,0 +1,4 @@
// This file ensures the EmailLocalization utility is imported
// and available throughout the application
import './emailLocalization';
+7 -25
View File
@@ -2,6 +2,8 @@ import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
//var nodemailer = require('nodemailer');
import EmailLocalization from '../lib/emailLocalization';
// buffer each user's email text in a queue, then flush them in single email
Meteor.startup(() => {
Notifications.subscribe('email', (user, title, description, params) => {
@@ -14,6 +16,7 @@ Meteor.startup(() => {
quoteParams[key] = quoteParams[key] ? `${params[key]}` : '';
});
// Get user's preferred language
const lan = user.getLanguage();
const subject = TAPi18n.__(title, params, lan); // the original function has a fault, i believe the title should be used according to original author
const existing = user.getEmailBuffer().length > 0;
@@ -42,35 +45,14 @@ Meteor.startup(() => {
const html = texts.join('<br/>\n\n');
user.clearEmailBuffer();
try {
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject,
html,
})
} else {
Email.send({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject,
html,
});
}
*/
Email.send({
// Use EmailLocalization utility to ensure the correct language is used
EmailLocalization.sendEmail({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject,
html,
language: user.getLanguage(),
userId: user._id
});
} catch (e) {
return;
+20 -18
View File
@@ -125,22 +125,31 @@ RulesHelper = {
const text = action.emailMsg || '';
const subject = action.emailSubject || '';
try {
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
// Try to detect the recipient's language preference if it's a Wekan user
// Otherwise, use the default language for the rule-triggered emails
let recipientUser = null;
let recipientLang = TAPi18n.getLanguage() || 'en';
// Check if recipient is a Wekan user to get their language
if (to && to.includes('@')) {
recipientUser = ReactiveCache.getUser({ 'emails.address': to.toLowerCase() });
if (recipientUser && typeof recipientUser.getLanguage === 'function') {
recipientLang = recipientUser.getLanguage();
}
}
// Use EmailLocalization if available
if (typeof EmailLocalization !== 'undefined') {
EmailLocalization.sendEmail({
to,
from: Accounts.emailTemplates.from,
subject,
text,
})
language: recipientLang,
userId: recipientUser ? recipientUser._id : null
});
} else {
// Fallback to standard Email.send
Email.send({
to,
from: Accounts.emailTemplates.from,
@@ -148,13 +157,6 @@ RulesHelper = {
text,
});
}
*/
Email.send({
to,
from: Accounts.emailTemplates.from,
subject,
text,
});
} catch (e) {
// eslint-disable-next-line no-console
console.error(e);
+5 -5
View File
@@ -1,5 +1,5 @@
name: wekan
version: '7.84'
version: '7.89'
base: core20
summary: Open Source kanban
description: |
@@ -65,7 +65,7 @@ apps:
parts:
mongodb:
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.20.tgz
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.23.tgz
plugin: dump
stage-packages:
- libssl1.1
@@ -170,9 +170,9 @@ parts:
# Cleanup
mkdir .build
cd .build
wget https://github.com/wekan/wekan/releases/download/v7.84/wekan-7.84-amd64.zip
unzip wekan-7.84-amd64.zip
rm wekan-7.84-amd64.zip
wget https://github.com/wekan/wekan/releases/download/v7.89/wekan-7.89-amd64.zip
unzip wekan-7.89-amd64.zip
rm wekan-7.89-amd64.zip
cd ..
##cd .build/bundle
##find . -type d -name '*-garbage*' | xargs rm -rf