Compare commits

...
74 Commits
Author SHA1 Message Date
github-actions[bot] 06e7db85dc Bump versions for v13.11 2026-11-13 18:11:28 +00:00
Lauri Ojansivu a97fde20c9 Prepare v13.11 release 2026-11-13 20:10:27 +02:00
Lauri Ojansivu a22dbc5b34 CHANGELOG: REST integration deletion answers 404 for a missing integration.
Thanks to AhmedLukman and xet7 !
2026-11-13 19:43:09 +02:00
Lauri Ojansivu cbe8a56d9d Merge pull request #6900 from AhmedLukman/codex/fix-integration-delete-not-found
Fix integration deletion acknowledging missing records
2026-11-13 19:41:28 +02:00
Ahmed Lukman ab685a7f6f Fix integration deletion acknowledging missing records
Reuse the board-scoped integration lookup before deleting, after board-admin
authorization. Missing, wrong-board and already deleted integrations now return
the existing JSON 404 response instead of acknowledging an unmatched selector.

Extend route regressions for deletion, authorization and database errors. Add
live API and browser coverage for rejected and successful deletions, persisted
state and retention of other webhooks in settings.
2026-11-13 19:01:54 +03:00
Lauri Ojansivu 24d5b2cdfd CHANGELOG: file-integrity baselines of deleted files, the checklist resetInterval index, REST custom-field and ownership fixes.
Thanks to Raymond-Voogt, AhmedLukman and xet7 !
2026-11-13 17:45:45 +02:00
Lauri Ojansivu ec05ff0089 File-integrity scan no longer reports files WeKan deleted itself as missing.
The daily scan keeps one baseline per stored file and reports every baseline
whose file is gone as a StorageBleed. Nothing ever removed a baseline, so
every attachment purged by retention and every avatar deleted was reported
missing on every run from then on - one finding folded 1,164 times.

The baseline is now forgotten where WeKan deletes or moves a local file:
- Attachments and Avatars onAfterRemove, for every version path. This is
  the retention purge's path: Meteor-Files unlinks the version paths itself
  after that hook, without going through the store strategy, so a fix in
  the strategy's unlink() alone would not have covered it;
- the filesystem strategy's unlink() (moving a file to GridFS or cloud);
- the filesystem strategy's rename(), for the old path.

A file that vanishes any other way keeps its baseline and is still reported.
The removal is fire-and-forget and can never break a delete.

Baselines already orphaned before this fix stay reported until removed, as
described in the issue.

Thanks to Raymond-Voogt and xet7 !

Fixes #6898.
2026-11-13 17:45:05 +02:00
Lauri Ojansivu c37575f1fa Checklists have a partial index on resetInterval for the recurring-reset cron.
The recurring-checklist reset cron queries
resetInterval: { $exists: true, $nin: [null, 'none'] } on every tick, and with
no index that read the whole checklists collection (about 45,000 documents on
the reporting instance), reported as db.collection-scan on Admin Panel ->
Problems. A partial index on resetInterval, like the one #6825 added for
recurring cards, holds only the recurring checklists.

Thanks to Raymond-Voogt and xet7 !

Fixes #6899.
2026-11-13 17:45:05 +02:00
Lauri Ojansivu a8e25952aa REST takeOwnership awaits the board update, and removeMember awaits its user lookup.
PUT /api/users/:userId with action takeOwnership called the async
board.changeOwnership() without await: the reply was sent before the board
was changed, and a failed update was an unhandled rejection behind a 200.

Boards.removeMember tested `!ReactiveCache.getUser(memberId)`. On the server
that lookup is async and returns a Promise, which is always truthy, so the
#5330 branch that hard-removes a member whose account was deleted never ran
on the server; such a member was only deactivated and lingered.

Tests pin both, and fail the tree for any un-awaited changeOwnership() or
negated un-awaited ReactiveCache lookup in server/ and models/.

Thanks to xet7 !
2026-11-13 17:45:05 +02:00
Lauri Ojansivu 22bf506ea1 Merge pull request #6896 from AhmedLukman/codex/fix-ownership-board-selection
Fix ownership transfer selecting ordinary board memberships
2026-11-13 17:23:36 +02:00
Lauri Ojansivu 41ff6da28d Merge pull request #6897 from AhmedLukman/codex/fix-custom-field-update-atomicity
Fix partial REST custom-field updates
2026-11-13 17:23:19 +02:00
Ahmed Lukman a81ec6ecdf Fix partial REST custom-field updates
Save supported custom-field properties in one board-scoped update so schema validation rejects the entire change before any accompanying fields persist. Preserve the existing authorization, field allowlist and response behavior.

Add handler regressions and live database/browser coverage for rejected settings and types, accepted updates, false values, omitted fields and board scoping.
2026-11-13 17:00:17 +03:00
Ahmed Lukman 4b4db92a1b Fix ownership transfer selecting ordinary board memberships
Match the target user and administrator flag within the same board member, following the existing membership query pattern. Leave boards where the target is only a normal member unchanged.

Cover selection, successful transfers, unchanged unrelated memberships, repeated requests, authorization, and retained browser access.
2026-11-13 11:51:40 +03:00
github-actions[bot] e2bf75b774 Bump versions for v13.10 2026-11-13 04:11:48 +00:00
Lauri Ojansivu d6c7dbcde2 Prepare v13.10 release 2026-11-13 06:10:46 +02:00
Lauri Ojansivu 8b44646314 CHANGELOG: every snapcraft install attempt is bounded, and snap-auth-check has room for all five.
Thanks to xet7 !
2026-11-13 06:06:16 +02:00
Lauri Ojansivu 560ff74a79 Release: every snapcraft install attempt is bounded, and snap-auth-check has room for all five.
In the v13.09 release the Snap Store failed snap-auth-check's first two
install attempts and then let the third hang with no output, until the job's
10-minute timeout cancelled it - the retry added for v13.07 never got its
remaining turns. Each `snap install snapcraft` in release-all.yml now runs
under `timeout 180`, and an attempt cut short is aborted (`snap abort
--last=install`) so the next one does not meet snapd's change still in
progress. snap-auth-check's job timeout is 25 minutes, enough for five
attempts 30 seconds apart and the whoami after them.

tests/snapAuthPreflight.test.cjs requires every install in the workflows to
be bounded and followed by the abort, and fails when snap-auth-check's job
timeout cannot hold all five attempts.

Thanks to xet7 !
2026-11-13 06:05:56 +02:00
github-actions[bot] 7347ae8f9d Bump versions for v13.09 2026-11-12 19:07:47 +00:00
Lauri Ojansivu 6cbb026f14 Prepare v13.09 release 2026-11-12 21:06:44 +02:00
Lauri Ojansivu 80253cf5e1 Merge remote-tracking branch 'origin/main' 2026-11-12 21:06:21 +02:00
Lauri Ojansivu d8fc23a4f4 CHANGELOG: snap-auth-check retries installing snapcraft.
Thanks to xet7 !
2026-11-12 21:02:13 +02:00
Lauri Ojansivu 534646347c Release: snap-auth-check retries installing snapcraft, as the build job does.
The v13.08 release stopped in snap-auth-check before it asked the Snap Store
anything: "cannot install system snap snapd: Post
https://api.snapcraft.io/v2/snaps/refresh: ... Client.Timeout exceeded while
awaiting headers". The job installed snapcraft once, while the snap build
job already retried five times, 30 seconds apart. It retries the same way now,
and when every attempt fails it says the store did not answer - not that
SNAP_AUTH is wrong.

tests/snapAuthPreflight.test.cjs fails on any snapcraft install in any
workflow without the five-attempt retry, and on the outage being reported as
a credential problem.

Thanks to xet7 !
2026-11-12 21:01:37 +02:00
github-actions[bot] 779ba553ce Bump versions for v13.08 2026-11-12 17:15:00 +00:00
Lauri Ojansivu 3144a578b5 Prepare v13.08 release 2026-11-12 19:13:48 +02:00
Lauri Ojansivu 82a30561d7 CHANGELOG: list-sync-estimate's checkbox test and index order.
Thanks to xet7 !
2026-11-12 17:03:34 +02:00
Lauri Ojansivu af76406d12 Tests: list-sync-estimate's checkbox test no longer depends on index order.
"dotted checkbox writes emit false once and removing a valued field emits an
unset" read the card's activities with an unsorted find and expected them in
insertion order. On FerretDB with the pushdown of plain equality, that find is
served by activities' { cardId: 1, createdAt: -1 } index and returns the newest
first, so it failed every time against Weddy, which creates WeKan's indexes,
with ['unsetCustomField', 'setCustomField']. The order of an unsorted find is
no contract on MongoDB either once an index serves it; what the test pins is
one set and one unset, so it now compares the activity types sorted.

Thanks to xet7 !
2026-11-12 17:03:33 +02:00
Lauri Ojansivu f57ea060fe CHANGELOG: CodeQL alert 604 in the security alert download script.
Thanks to GitHub CodeQL and xet7 !
2026-11-12 16:07:40 +02:00
Lauri Ojansivu ed19817433 releases/sec: SUMMARY.md carries no secret scanning field, and kept secrets are owner-only.
Code scanning alert #604 (py/clear-text-storage-sensitive-data, CWE-312):
download_github_security.py wrote a secret scanning alert's
secret_type_display_name into SUMMARY.md. That is the secret's type, not the
secret, but SUMMARY.md is the one file that is never redacted and the one most
likely to be pasted somewhere, so it now says only "Secret scanning alert" and
points at secret-scanning/, where the type still is. When
--include-secret-values keeps the secrets, the files holding them are created
readable by their owner only.

tests/securityDownloadScript.test.cjs checks the summary of a redacted and of a
kept download for the secret, its type and its type name, the 0600 mode of
kept secrets, and that describe() reads no field of a secret scanning alert
and every secret scanning write passes the private flag.

Thanks to GitHub CodeQL and xet7 !
2026-11-12 16:07:39 +02:00
Lauri Ojansivu 2b897dbf63 CHANGELOG: REST card parent, integration URL validation, and the single-file 32-bit host Node.js.
Thanks to AhmedLukman and xet7 !
2026-11-12 16:06:09 +02:00
Lauri Ojansivu c35c672ffb Single-file: the 32-bit host Node.js is the target bundle's exact version.
The v13.07 single files for armhf, armv6 and armv7 all stopped on "The
bundle's Node.js is v26.13.0 but this is v26.13.1: a single executable must
be built by the same Node.js version it embeds." A 32-bit target's SEA blob is
written by a 32-bit Node.js, and the workflow borrowed the i386 bundle's.
Every bundle takes the newest Node.js of the pinned major its platform has, so
i386 had v26.13.1 from wekan/node-patches while 32-bit ARM still had v26.13.0.

The host is now resolved with releases/resolve-node-source.sh at the target
bundle's exact version, checked against its published SHA256, and refused
unless it reports that version. libatomic1:i386, which the bundle used to
supply in node-runtime/, comes from apt, so HOST_LIBS is gone.

tests/singleFile.test.cjs pins the exact version, the checksum before the
first run, and that the host is never taken from another platform's bundle.

Thanks to xet7 !
2026-11-12 16:05:46 +02:00
Lauri Ojansivu 642ba6e876 Merge pull request #6895 from AhmedLukman/codex/fix-integration-update-validation
Validate integration URLs before updating other fields
2026-11-12 15:59:53 +02:00
Lauri Ojansivu e9c5aa2cae Merge pull request #6894 from AhmedLukman/codex/fix-rest-card-parent
Fix parent assignment when creating cards through REST
2026-11-12 15:59:37 +02:00
Ahmed Lukman 1418cb8480 Validate integration URLs before updating other fields 2026-11-12 13:21:00 +03:00
Ahmed Lukman 552950ed63 Fix parent assignment when creating cards through REST
Read parentId from the request body so single-card creation validates and persists the requested parent, matching the bulk endpoint. Cover persistence, subtask rendering, empty parents and rejected creation requests.
2026-11-12 12:48:09 +03:00
github-actions[bot] e1e0006a35 Bump versions for v13.07 2026-11-12 06:34:24 +00:00
Lauri Ojansivu 6f23e187ab Prepare v13.07 release 2026-11-12 07:15:19 +02:00
Lauri Ojansivu ab8c3452a8 CHANGELOG: Admin Panel Problems Clear button and event retention.
Thanks to Raymond-Voogt and xet7 !
2026-11-11 22:30:06 +02:00
Lauri Ojansivu fefabbf113 Admin Panel Problems: a Clear button, and resolved problems age out.
The problem streams were append-only and Acknowledge only reset the "new"
count, so a problem fixed long ago stayed in the table and buried the live
ones. Clear, beside Acknowledge, calls the admin-only clearEventLog, which
deletes the checked streams' events up to now and stamps the
acknowledgement; anything that happens after the click shows as new again,
and an unknown stream clears nothing. A daily sweep, claimed once per
installation, deletes events older than EVENTLOG_RETENTION_DAYS (default 90,
0 keeps them forever); a recurring problem's folded row keeps a recent date,
so it stays. The setting is listed on every platform, and clear-problems is
translated to every language.

Thanks to Raymond-Voogt and xet7 !

Fixes #6893,
2026-11-11 22:29:01 +02:00
Lauri Ojansivu 50ecd8944f CHANGELOG: ListLockAttachBleed, spent time as a duration, REST token deletion and the missing indexes.
Thanks to Furkan Derse, brlin-tw, AhmedLukman, Raymond-Voogt and xet7 !
2026-11-11 21:05:44 +02:00
Lauri Ojansivu 7bb3e13ba9 ListLockAttachBleed: a list's write refusal covers the attachment API.
A board admin can refuse a role write access in one list (#4527,
roleExceptions). The attachment API's upload, delete, copy and move, over
REST and DDP, asked only for board write access and mayWriteCardAttachment,
which allows every card to a member who is not assigned-only, so a normal
member the list refused still added and removed files on that list's cards.

Every attachment write that names a card now also asks mayWriteInCardList
with that card, and a move asks both the card it takes the file from and the
card it puts it on. The card's own board decides. As for the REST card
routes, only a list's refusal counts. A refusal is recorded in Admin Panel ->
Problems as ListLockAttachBleed (authz.list-locked-attachment, medium).

tests/listLockAttachments.test.cjs runs the guard on the reported case and
the negative cases, and fails on any mayWriteCardAttachment call in the tree
without the list check beside it; list-lock-attachments.e2e.js replays the
writes against a running server.

Thanks to Furkan Derse and xet7 !
2026-11-11 20:58:01 +02:00
Lauri Ojansivu 8dc77a89d8 Indexes for the LDAP id, cards' assignees and members, and History by entity and hash.
On a large installation the database-problems page filled with collection
scans of queries WeKan makes constantly but never indexed: a user looked
up by services.ldap.id at every LDAP login and sync pass (13,000+ users,
~430 ms per login), cards by assignees or members across every board for
My Cards and the filters (1.1M cards, 1-3.7 s, dozens of times a minute),
and changeHistory by entity and by integrity hash (120,000+ rows, and
growing). Each now has an index, created at startup with ensureIndex like
every other one: services.ldap.id sparse, assignees and members both so
their $or uses an index on each branch, and changeHistory's
{ entityType, entityId, createdAt } and { integrityHash }.

Thanks to Raymond-Voogt and xet7 !

Fixes #6892.
2026-11-11 20:29:31 +02:00
Lauri Ojansivu 9f5ab97a3c Spent time: the formatter imported as cardTime.js's other dependencies are.
A require() line stayed in the script tests/acceptedFixesLogic.test.cjs
evaluates, which strips imports, and failed it.

Thanks to brlin-tw and xet7 !
2026-11-11 20:29:31 +02:00
Lauri Ojansivu 3e8e8039ff Spent time is shown as a duration, not decimal hours.
A card's Spent time is stored in decimal hours, and a Pomodoro or Flowtime
session adds its duration to it, so a short session left a badge such as
0.034722222222222224. The badge shows days, hours, minutes and seconds now,
the leading zero units left out (12h34m56s, 2m5s), and the tooltip that
names hours rounds them to two decimals. The stored value and the edit
popup keep their hours. models/lib/spentTimeFormat.js, with a unit test
and a UI test.

Thanks to brlin-tw and xet7 !

Fixes #6890.
2026-11-11 20:20:55 +02:00
Lauri Ojansivu 4bdbded5d9 Merge remote-tracking branch 'origin/main' 2026-11-11 20:13:29 +02:00
Lauri Ojansivu dce58125c9 Merge pull request #6891 from AhmedLukman/codex/fix-rest-token-revocation
Await REST token deletion before reporting success
2026-11-11 19:54:56 +02:00
Ahmed Lukman fd59a8ff70 Await REST token deletion before reporting success
Wait for Accounts.destroyToken to finish so deletion completes before a success response and rejected database writes reach the existing error handler.

Add regression coverage for delayed and failed deletion, authorization, existing token input behavior, session isolation and browser logout.
2026-11-11 14:43:56 +03:00
Lauri Ojansivu 14a2fa9f43 CHANGELOG: releases/sec's GitHub security alert download script.
Thanks to xet7 !
2026-11-11 04:26:44 +02:00
Lauri Ojansivu 801f8956fe releases/sec: download a GitHub organization's Security and quality alerts with gh.
releases/sec/download-github-security.sh ORGANIZATION saves, for every
repository of the organization (or the ones named with --repo), its
Dependabot, code scanning, secret scanning and security advisory alerts
to .tools/log/sec/<organization>/<repository>/<YYYY-MM-DD_HH-MM-SS>/,
a directory per kind: alerts.json, a file per alert, an open code
scanning alert's instances, and SUMMARY.md with every open alert and its
link. It runs the GitHub CLI outside the editor's sandbox, where gh and
its login are, so the alerts can then be read and fixed from the files
inside it. A kind GitHub does not answer - not enabled, or not visible
to the account - gets status.txt with the reason and the run goes on;
archived repositories and forks are skipped unless asked for; the secret
a secret scanning alert found is redacted unless --include-secret-values
is given. A name that is not a GitHub name is refused before it becomes
a path or an API address. .tools/ keeps the downloads out of git.

tests/securityDownloadScript.test.cjs runs it against a stand-in gh: the
layout, both pages of a paginated answer, the summary, a disabled kind,
the redaction everywhere in the download and, as negatives, bad names,
no gh and gh signed out writing nothing. buildScriptParity knows why
build.sh has no menu entry for it.

Thanks to xet7 !
2026-11-11 04:25:18 +02:00
Lauri Ojansivu 4335614dcb CHANGELOG: CodeQL alerts #602 and #603 in the tests, and fast-xml-parser 5.12.0 for Dependabot alert #188.
Thanks to GitHub CodeQL, dependabot and xet7 !
2026-11-11 03:44:57 +02:00
Lauri Ojansivu a76a19058a Updated fast-xml-parser to 5.12.0, Dependabot alert #188.
fast-xml-parser <= 5.11.2, with its stopNodes option, rescanned the rest
of the input from every "<" of a stop node's body when no ">" followed,
so n such fragments cost O(n^2) CPU before it gave up (CWE-407). The
Azure and Google Cloud storage clients bring it in; each allows 5.x, so
the lock moves to 5.12.0 - which stops at the first failed scan - with
is-unsafe 2.0.3 and strnum 2.5.1, and no override.

tests/dependencySecurityUpdates.test.cjs pins that no tracked lockfile
resolves a version below 5.12.0, with a negative that the finder flags
5.11.2 at any depth, and runs the alert's input: 40,000 unterminated
fragments in a stop node are refused within two seconds. On 5.11.2 that
input grows quadratically (20,000 fragments took 1.2 s here, so 40,000
take about 5 s); on 5.12.0 it takes about a millisecond. A dependency
inside a storage client is not an attempt anybody makes, so there is
nothing to record in Admin Panel -> Problems.

Thanks to dependabot and xet7 !
2026-11-11 03:44:13 +02:00
Lauri Ojansivu 2b65b713a0 Tests: no path handed to a shell at all, CodeQL alerts #602 and #603.
The fix for #601 passed the paths to `bash -c` as arguments ("$1",
"$2") instead of pasting them into the script. That is safe in itself,
but it still hands a temporary or checkout path to a shell, and CodeQL
flagged js/shell-command-injection-from-environment again on the two
umask tests in tests/releaseDownloads.test.cjs. Those tests no longer
use a shell: fetch.sh runs as bash's program with its arguments, the
umask is set on the test's own process around the call and put back,
and `chmod +x` is fs.chmodSync. tests/macosSandbox.test.cjs, fixed the
same way for #601, now runs ls and touch as programs of sandbox-exec,
each path an argument.

The guard (tests/testShellPathsFromEnv.test.cjs) now also refuses any
value given to a shell's -c script as an argument - spawned or as a
wrapper's program - and the one other test that did so,
tests/dbConformanceWiring.test.cjs, passes its value in the environment.
Run against the files as they were, it names all three; its pattern
takes a backslash only as an escape, so a long file cannot make it
backtrack.

The findings were in tests, not in WeKan, so there is no attempt to
show in Admin Panel -> Problems.

Thanks to GitHub CodeQL and xet7 !
2026-11-11 03:44:13 +02:00
github-actions[bot] 77239ee100 Bump versions for v13.06 2026-11-10 22:50:32 +00:00
Lauri Ojansivu 3913fbd507 Prepare v13.06 release 2026-11-11 00:49:29 +02:00
Lauri Ojansivu c45359a759 CHANGELOG: CodeQL alert #601 and its siblings in the tests; the oldest October release archived to stay under GitHub's limit.
Thanks to GitHub CodeQL and xet7 !
2026-11-11 00:38:03 +02:00
Lauri Ojansivu d482856e03 Tests: no path is quoted into a bash -c script, CodeQL alert #601 and its siblings.
CodeQL flagged js/shell-command-injection-from-environment (CWE-78/88) in
tests/npmRetry.test.cjs: its bash -c script set
node_bin=${JSON.stringify(prog)} and ran bash ${JSON.stringify(script)},
pasting a path under the temporary directory and one under the checkout
into the script text. JSON's quotes are not the shell's: a path with $(,
a backtick or $ would change the command. The paths now go in through
the environment ("$NODE_BIN", "$NPM_RETRY_SCRIPT"), so the script is a
constant - and NODE_BIN is not node_bin, so the test still shows the
unbound variable it exists to show.

The guard written for alerts #549 and #550 (tests/testShellPathsFromEnv
.test.cjs) only knew `source "${path}"`. It now refuses any value quoted
into a -c script - "${...}" or ${JSON.stringify(...)} - across the tests,
while a script built from the test's own snippets stays allowed; with
the fixes taken away it names every offender. It found the same fault in
two more places, fixed as arguments ("$1", "$2"):
tests/releaseDownloads.test.cjs, which quoted fetch.sh and a temporary
file into its umask tests, and tests/macosSandbox.test.cjs, which quoted
the home and temporary paths into its sandbox probe.

The finding was in tests, not in WeKan, so there is no attempt to show
in Admin Panel -> Problems.

Thanks to GitHub CodeQL and xet7 !
2026-11-11 00:37:39 +02:00
Lauri Ojansivu 72ee10a3ed CHANGELOG: the merged REST overtime and card member fixes, their follow-ups, and cleared card dates.
Thanks to AhmedLukman and xet7 !
2026-11-11 00:08:21 +02:00
Lauri Ojansivu 32590ee7ab Card members and assignees: adding one whose account is gone no longer throws.
#6889 guarded the removal halves of the cardMembers and cardAssignees
hooks, which read user.username after a lookup that finds nobody for a
deleted account. The joining halves had the same read: the REST route
checks the user before adding, but a client $addToSet, a copied or
imported card, or a rule can still add such an id, and the hook threw.
Both now record the join with the id and no username, as a removal does.

tests/cardMemberRemoval.test.cjs runs the real hooks: adding a member
and an assignee whose account is gone records the join without
throwing; and, tree-wide, no `const x = user.field;` follows a
ReactiveCache.getUser() lookup without a guard.

Thanks to AhmedLukman and xet7 !
2026-11-11 00:07:53 +02:00
Lauri Ojansivu 569756b66c REST card overtime: an isOverTime stored before #6888 becomes isOvertime.
#6888 makes the REST card PUT write its isOverTime parameter to the
schema's isOvertime field. Every overtime set through the API before it
- since b895e61237 - was stored under isOverTime, which the UI and every
reader ignore: those cards still show no overtime.

A schema upgrade step, card-overtime-field, carries that over on the
next start: isOverTime becomes isOvertime where the card has none, the
value the UI already shows wins where it has both, and the stray field
is removed. Two updateMany batches and an $unset, version-gated and
idempotent like the steps beside it.

tests/schemaUpgradeSteps.test.cjs pins the fold, the precedence and a
second pass finding nothing; as negatives, no work on cards without the
field, and - tree-wide - no server code writing isOverTime into a card.

Thanks to AhmedLukman and xet7 !
2026-11-11 00:07:26 +02:00
Lauri Ojansivu 50334816ca Card dates: clearing one no longer goes through the timing hook as a set.
The Cards.before.update timing hook read modifier.$set[field] for any
update whose first field was a date, but unsetDue/unsetStart/unsetEnd/
unsetReceived send only a $unset. Without a $set the hook threw a
TypeError; with one beside the $unset (a stamped modifiedAt) it wrote an
a-dueAt with timeValue: undefined, which counted as a due date change
(#6081), matched the "date set or changed" rule triggers (#2474), and
showed in the activity feed as an empty date.

server/lib/timingChangeActivity.js now decides it: a date set records
timeValue, a date cleared records timeOldValue alone - the same record a
rule's removeDate writes, and the one models/lib/boardTimeline.js rewinds
- and clearing a date the card does not have records nothing. The rules
skip a cleared date before matching triggers, as server/triggersDef.js
already said they should, and the feed shows only the date it had.

tests/cardTimingActivity.test.cjs runs the real hook: a set, a $unset
alone and a $unset beside a $set (both used to fail), and clearing
nothing; and, tree-wide, no modifier.$set[...] read that assumes the $set
is there. The two guards that pinned the old inline list and its
modifier.$set[action] read now pin the helper instead.

Thanks to xet7 !
2026-11-11 00:06:31 +02:00
Lauri Ojansivu 9821478329 Merge pull request #6889 from AhmedLukman/codex/card-member-removal
Fix removal of card members and assignees with missing user accounts
2026-11-10 23:49:48 +02:00
Lauri Ojansivu ad5c35e9f3 Merge pull request #6888 from AhmedLukman/codex/rest-card-overtime
Fix REST card overtime persistence
2026-11-10 23:49:23 +02:00
Ahmed Lukman 416c69dfe2 Revert "Use optional chaining for removed assignment users"
This reverts commit 0acc9955d0.

Thanks to AhmedLukman and xet7 !
2026-11-10 16:59:39 +03:00
Ahmed Lukman 0acc9955d0 Use optional chaining for removed assignment users
Read the optional username safely when removing a card member or assignee whose account is missing.

Thanks to AhmedLukman and xet7 !
2026-11-10 16:52:39 +03:00
Ahmed Lukman 5e9d1cb630 Fix removal of missing card members and assignees
Allow card assignment removal when the target user no longer exists. Keep normal membership activity and no-op behavior intact, with unit and REST/browser regression coverage.

Thanks to AhmedLukman and xet7 !
2026-11-10 16:27:40 +03:00
github-actions[bot] 4f6832845d Bump versions for v13.05 2026-11-10 09:55:03 +00:00
Lauri Ojansivu 1ca199b607 Prepare v13.05 release 2026-11-10 11:54:10 +02:00
Lauri Ojansivu 63c6f42495 CHANGELOG: updated to Meteor 3.6.
Thanks to xet7 !
2026-11-10 09:20:28 +02:00
Lauri Ojansivu 0fbef8936f Updated to Meteor 3.6.
From 3.6-rc.1. `meteor update --release METEOR@3.6` refused it: WeKan's
forks of six Meteor packages in packages/ (allow-deny, ddp-server,
dynamic-import, facebook-oauth, google-oauth, shell-server) declared
3.6-rc.1's versions with a _1 wrap number, and a local package
overrides the release's, so ~3.6.0 could not be met. Meteor 3.6 changed
those six packages only in their version line (compared on GitHub,
release/METEOR@3.6-rc.1...release/METEOR@3.6), so each fork now
declares 3.6's version with its _1 wrap number; .meteor/packages drops
the rc pins, and .meteor/versions, @meteorjs/rspack 3.0.0 and the
lockfile are what meteor update wrote. webapp is 2.4.0.

The Dockerfile's METEOR_RELEASE is METEOR@3.6. The Bun build's patch
applies unchanged to Meteor 3.6, which still has no Bun ESM loader of
its own: it is meteor-3.6.patch, checked against 3.6's commit
e730097c. tests/meteor353SecurityFixes.test.cjs is moved to 3.6 by
decision, after that check. WeKan builds with Meteor 3.6, and the node
suites pass (2162 run, 0 failed).

Thanks to xet7 !
2026-11-10 09:20:28 +02:00
Lauri Ojansivu 0905de097b CHANGELOG: the Super Productivity fix's link names its commit after the rebase.
Thanks to xet7 !
2026-11-10 08:48:52 +02:00
Lauri Ojansivu 679ea9e63a CHANGELOG: the Android bundles build again.
Thanks to xet7 !
2026-11-10 08:48:37 +02:00
Lauri Ojansivu d08f658dea Android bundles build again: npm-retry.sh is given Android's node and npm, not a shell function.
v13.04's four Android bundle jobs all died with "environment: node:
unbound variable". v13.04 sent the Android npm installs through
releases/npm-retry.sh as `npm-retry.sh npm install`, and npm there is
build-bundle.sh's function npm() { "$node" "$npm_cli" ...; }.
npm-retry.sh is a new bash with set -u: export -f carried the function
into it, but not $node or $npm_cli, so the function failed before npm
ran - and the retry wrapper rightly called it not a network error.

The two installs now give npm-retry.sh the program itself, "$node"
"$npm_cli" install, still retried on a network error as before.
tests/npmRetry.test.cjs fails when any releases/ script gives
npm-retry.sh one of its own shell functions (it fails on the old two
lines), and reproduces the failure: an exported function without its
variable fails in npm-retry.sh, the program it runs works.

Thanks to xet7 !
2026-11-10 08:48:31 +02:00
Lauri Ojansivu dcd9fec925 CHANGELOG: the Super Productivity export no longer fails on a card whose list is archived.
Opens the Upcoming section. The fix is covered by a positive and a
negative check in tests/superProductivityFormat.test.cjs, which fails
on the old formatter; it is a pure formatter behind the REST export,
so no browser test was added, and WeKan's own server was not run here.

Thanks to xet7 !
2026-11-10 08:18:49 +02:00
Lauri Ojansivu 8b4fe0e737 Super Productivity export no longer fails on a card whose list is archived.
A card whose list is archived is collected with listTitle '', and the
Super Productivity formatter tagged such a card with tagFor(''), which
is undefined - the export then threw "Cannot read properties of
undefined (reading 'taskIds')" and the whole board's export failed.
The list with no title is now "Untitled", its tag and its panel alike,
so the panel shows its cards and every task's tags exist. The test
fails with that error on the old formatter.

Found while checking Weddy's Super Productivity export against
WeKan's formatter.

Thanks to xet7 !
2026-11-10 08:18:49 +02:00
Ahmed Lukman f74ef4c40d Fix REST card overtime persistence
Keep accepting the isOverTime request parameter and write its validated value to the isOvertime schema field used by card readers and the UI.

Correct the handler regression and cover JSON/form edits, persistence, API reads, reactive display, reloads and rejected requests.
2026-11-06 19:04:30 +03:00
365 changed files with 5686 additions and 1425 deletions

No files matched your search

+1 -1
View File
@@ -103,7 +103,7 @@ jobs:
app/.tools/meteor-bun/dev_bundle
app/.tools/meteor-bun/.babel-cache
app/.tools/meteor-bun/packages/*/.npm
key: bun-meteor-${{ runner.os }}-${{ hashFiles('app/.meteor/release', 'app/.meteor/versions', 'build-tools/releases/bun/meteor-3.6-rc.1.patch') }}
key: bun-meteor-${{ runner.os }}-${{ hashFiles('app/.meteor/release', 'app/.meteor/versions', 'build-tools/releases/bun/meteor-3.6.patch') }}
- name: Build the release's ESM application once
working-directory: app
env:
+26 -4
View File
@@ -4533,7 +4533,10 @@ jobs:
snap-auth-check:
needs: [prepare]
runs-on: ubuntu-24.04
timeout-minutes: 10
# Room for all five snapcraft install attempts (each at most 3 minutes,
# 30 s apart) and the whoami after them: at 10 minutes (v13.09) the job
# was cancelled during the third.
timeout-minutes: 25
steps:
- name: Ask the Snap Store whether SNAP_AUTH is usable
env:
@@ -4557,7 +4560,23 @@ jobs:
;;
esac
sudo snap install snapcraft --classic
# The Snap Store has bad minutes - a rate limit, or (v13.07) a refresh
# that timed out - so the install is retried as the build job's is;
# an outage is said as one, not as a broken credential. Each attempt
# is bounded: in v13.09 the third hung silently until the job was
# cancelled. An attempt cut short leaves snapd's install change
# running, so it is aborted before the next.
installed=""
for i in 1 2 3 4 5; do
if timeout 180 sudo snap install snapcraft --classic; then installed=1; break; fi
sudo snap abort --last=install >/dev/null 2>&1 || true
echo "snapcraft install attempt $i/5 failed (Snap Store unreachable, throttling or hanging); retrying in 30s..."
sleep 30
done
if [ -z "$installed" ]; then
echo "::error::snapcraft could not be installed after 5 attempts: the Snap Store did not answer. That is the store, not SNAP_AUTH - re-run the job."
exit 1
fi
# whoami writes its answer to stdout and its complaint to stderr; both
# matter, so both are captured.
@@ -4954,8 +4973,11 @@ jobs:
run: |
set -uo pipefail
for i in 1 2 3 4 5; do
sudo snap install snapcraft --classic && exit 0
echo "snapcraft install attempt $i/5 failed (Snap Store throttle?); retrying in 30s..."
# Bounded, as snap-auth-check's: a hanging store is a failed
# attempt, not a job that waits until it is cancelled.
timeout 180 sudo snap install snapcraft --classic && exit 0
sudo snap abort --last=install >/dev/null 2>&1 || true
echo "snapcraft install attempt $i/5 failed (Snap Store throttle or hang?); retrying in 30s..."
sleep 30
done
echo "::error::snapcraft install failed after 5 attempts (Snap Store rate limit)."
+33 -18
View File
@@ -150,27 +150,46 @@ jobs:
node-version: ${{ steps.fetch.outputs.node_version }}
# A 32-bit target's SEA blob must be written by a 32-bit Node.js: the blob
# stores its lengths as size_t (build.mjs refuses otherwise). The i386
# bundle's Node.js, of the same version, writes it for every 32-bit
# target - win32, i386 and 32-bit ARM read the same little-endian format.
# stores its lengths as size_t (build.mjs refuses otherwise). An i386
# Node.js writes it for every 32-bit target - win32, i386 and 32-bit ARM
# read the same little-endian format - but it has to be the SAME VERSION
# the target's bundle embeds (build.mjs checks that too). v13.07 took the
# i386 bundle's own Node.js, and the bundles resolve the newest Node.js of
# the pinned major per platform: i386 got v26.13.1 while 32-bit ARM still
# had v26.13.0, and armhf, armv6 and armv7 all stopped on "The bundle's
# Node.js is v26.13.0 but this is v26.13.1". So the host is resolved at
# the target bundle's exact version, from the same three sources and with
# the same published SHA256 as a bundle's Node.js.
- name: A 32-bit Node.js to build a 32-bit target
id: host32
if: steps.fetch.outputs.skip != 'true' && contains(fromJSON('["win32","i386","armv7","armhf","armv6"]'), matrix.target)
env:
GH_TOKEN: ${{ github.token }}
VERSION: ${{ steps.fetch.outputs.version }}
NODE_VERSION: ${{ steps.fetch.outputs.node_version }}
run: |
set -euo pipefail
zip="wekan-${VERSION}-i386.zip"
mkdir -p host32
gh release download "$TAG" --repo "$GITHUB_REPOSITORY" --pattern "$zip" --pattern "$zip.sha256sum" --dir host32 \
|| { echo "::error::$TARGET needs the i386 bundle's Node.js to build, and $TAG has no $zip."; exit 1; }
(cd host32 && sha256sum -c "$zip.sha256sum" && unzip -q "$zip" 'bundle/node' 'bundle/node-runtime/*' && rm -f "$zip")
mkdir -p host32 .tools/tmp
export TMPDIR="$PWD/.tools/tmp"
rc=0
src="$(bash releases/resolve-node-source.sh i386 "$NODE_VERSION")" || rc=$?
[ "$rc" = 0 ] || { echo "::error::$TARGET needs an i386 Node.js $NODE_VERSION to build its single file, and none of the three Node.js sources has one."; exit 1; }
node_url="$(printf '%s\n' "$src" | sed -n 's/^node_url=//p')"
node_kind="$(printf '%s\n' "$src" | sed -n 's/^node_kind=//p')"
node_member="$(printf '%s\n' "$src" | sed -n 's/^node_member=//p')"
node_sha256="$(printf '%s\n' "$src" | sed -n 's/^node_sha256=//p')"
bash releases/fetch.sh -o host32/download "$node_url"
echo "$node_sha256 host32/download" | sha256sum -c -
case "$node_kind" in
binary) mv host32/download host32/node ;;
tar.xz) tar -xJf host32/download -C host32 "$node_member" && mv "host32/$node_member" host32/node && rm -f host32/download ;;
*) echo "::error::An i386 Node.js comes as a binary or a tar.xz, not $node_kind."; exit 1 ;;
esac
chmod +x host32/node
sudo dpkg --add-architecture i386
sudo apt-get update -qq
sudo apt-get install -y -qq libc6:i386 libstdc++6:i386 >/dev/null
host="$PWD/host32/bundle/node"
[ -d host32/bundle/node-runtime ] && echo "libs=$PWD/host32/bundle/node-runtime" >> "$GITHUB_OUTPUT"
sudo apt-get install -y -qq libc6:i386 libstdc++6:i386 libatomic1:i386 >/dev/null
host="$PWD/host32/node"
got="$("$host" -p process.version)"
[ "$got" = "$NODE_VERSION" ] || { echo "::error::The i386 Node.js resolved for $NODE_VERSION reports $got."; exit 1; }
echo "node=$host" >> "$GITHUB_OUTPUT"
# A 32-bit ELF target's blob is injected in a 64-bit process, by
# LIEF 1.0.0 - the version Node.js vendors - not inside this 32-bit
@@ -187,20 +206,16 @@ jobs:
env:
VERSION: ${{ steps.fetch.outputs.version }}
HOST_NODE: ${{ steps.host32.outputs.node }}
HOST_LIBS: ${{ steps.host32.outputs.libs }}
SEA_PYTHON: ${{ steps.host32.outputs.python }}
run: |
set -euo pipefail
case "$TARGET" in win*) ext=.exe ;; *) ext= ;; esac
out="wekan-${VERSION}-${TARGET}-single-file${ext}"
# The i386 Node.js finds its own libraries; the libraries are ignored by
# the x64 Node.js that runs build.mjs (another architecture).
# Exit 3: this Node.js is one LIEF cannot inject the SEA into
# correctly (releases/single-file/sea-inject.mjs says which and why).
# That is a missing single file, not a failed release.
rc=0
LD_LIBRARY_PATH="${HOST_LIBS:-${LD_LIBRARY_PATH:-}}" \
node releases/single-file/build.mjs --bundle bundle --target "$TARGET" --version "$VERSION" --out "$out" \
node releases/single-file/build.mjs --bundle bundle --target "$TARGET" --version "$VERSION" --out "$out" \
${HOST_NODE:+--host-node "$HOST_NODE"} 2> build.err || rc=$?
cat build.err >&2
rm -rf bundle
+27 -27
View File
@@ -6,12 +6,12 @@
meteor-base@1.5.2
# Build system
ecmascript@0.19.2-rc360.1
standard-minifier-js@3.3.0-rc360.1
rspack@1.4.0-rc360.1
ecmascript@0.19.2
standard-minifier-js@3.3.0
rspack@1.4.0
# Declared explicitly because server/modernBrowsers.js imports it, to say that
# Yandex Browser is modern and must not be served the legacy bundle (#6557).
modern-browsers@0.2.4-rc360.1
modern-browsers@0.2.4
blaze@3.0.2
@@ -19,11 +19,11 @@ blaze@3.0.2
aldeed:collection2
aldeed:schema-index@4.0.0-beta.5
reywood:publish-composite
mongo@2.5.2-rc360.1
mongo@2.6.0
# Account system
accounts-password@3.3.2-rc360.1
accounts-2fa@3.1.1-rc360.1
accounts-password@3.3.2
accounts-2fa@3.1.1
accounts-express@1.0.0
communitypackages:core
communitypackages:unstyled
@@ -39,19 +39,19 @@ wekan-oidc
wekan-accounts-oidc
# Utilities
check@1.5.1-rc360.1
random@1.2.3-rc360.1
reactive-dict@1.3.3-rc360.1
session@1.2.4-rc360.1
tracker@1.3.5-rc360.1
check@1.5.1
random@1.2.3
reactive-dict@1.3.3
session@1.2.4
tracker@1.3.5
audit-argument-checks@1.0.8
# UI components
ostrio:i18n
reactive-var@1.0.13
shell-server@0.7.2-rc360.1
email@3.2.1-rc360.1
dynamic-import@0.8.1-rc360.1
shell-server@0.7.2
email@3.2.1
dynamic-import@0.8.1
wekan-markdown
quave:synced-cron
ostrio:cookies
@@ -59,21 +59,21 @@ ostrio:files
# lmieulet:meteor-coverage
meteortesting:mocha@3.0.0
matb33:collection-hooks
service-configuration@1.3.6-rc360.1
service-configuration@1.3.6
minifier-css@2.0.2
ejson@1.4.1-rc360.1
logging@1.3.7-rc360.1
ejson@1.4.1
logging@1.3.7
wekan-fullcalendar
wekan-fontawesome
accounts-google@1.4.2-rc360.1
accounts-github@1.5.2-rc360.1
accounts-facebook@1.3.5-rc360.1
accounts-twitter@1.5.3-rc360.1
accounts-meteor-developer@1.5.2-rc360.1
accounts-weibo@1.4.2-rc360.1
accounts-meetup@1.5.2-rc360.1
accounts-passwordless@3.1.2-rc360.1
instrumentation@0.0.1-rc360.1
accounts-google@1.4.2
accounts-github@1.5.2
accounts-facebook@1.3.5
accounts-twitter@1.5.3
accounts-meteor-developer@1.5.2
accounts-weibo@1.4.2
accounts-meetup@1.5.2
accounts-passwordless@3.1.2
instrumentation@0.0.1
# Prevent Meteor build/run tools from sending application package statistics.
package-stats-opt-out@1.0.8
+1 -1
View File
@@ -1 +1 @@
METEOR@3.6-rc.1
METEOR@3.6
+74 -74
View File
@@ -1,130 +1,130 @@
accounts-2fa@3.1.1-rc360.1
accounts-base@3.4.0-rc360.1
accounts-2fa@3.1.1
accounts-base@3.4.0
accounts-express@1.0.0
accounts-facebook@1.3.5-rc360.1
accounts-github@1.5.2-rc360.1
accounts-google@1.4.2-rc360.1
accounts-meetup@1.5.2-rc360.1
accounts-meteor-developer@1.5.2-rc360.1
accounts-oauth@1.4.8-rc360.1
accounts-password@3.3.2-rc360.1
accounts-passwordless@3.1.2-rc360.1
accounts-twitter@1.5.3-rc360.1
accounts-weibo@1.4.2-rc360.1
accounts-facebook@1.3.5
accounts-github@1.5.2
accounts-google@1.4.2
accounts-meetup@1.5.2
accounts-meteor-developer@1.5.2
accounts-oauth@1.4.8
accounts-password@3.3.2
accounts-passwordless@3.1.2
accounts-twitter@1.5.3
accounts-weibo@1.4.2
aldeed:collection2@4.2.2
aldeed:schema-index@4.0.0
aldeed:simple-schema@1.13.1
allow-deny@2.1.2-rc360.1_1
allow-deny@2.1.2_1
audit-argument-checks@1.0.8
autoupdate@2.0.2-rc360.1
babel-compiler@7.15.2-rc360.1
autoupdate@2.0.2
babel-compiler@7.15.2
babel-runtime@1.5.2
base64@1.0.15-rc360.1
binary-heap@1.0.14-rc360.1
base64@1.0.15
binary-heap@1.0.14
blaze@3.0.3
blaze-tools@2.0.1
boilerplate-generator@2.2.0-rc360.1
boilerplate-generator@2.2.0
caching-compiler@2.0.1
caching-html-compiler@2.0.1
callback-hook@1.8.1-rc360.1
check@1.5.1-rc360.1
callback-hook@1.8.1
check@1.5.1
communitypackages:core@2.0.3
communitypackages:flow-routing@2.1.0
communitypackages:unstyled@2.0.1
core-runtime@1.0.0
ddp@1.4.3-rc360.1
ddp-client@3.4.2-rc360.1
ddp-common@1.4.6-rc360.1
ddp-rate-limiter@1.3.1-rc360.1
ddp-server@3.6.0-rc360.1_1
diff-sequence@1.2.1-rc360.1
dynamic-import@0.8.1-rc360.1_1
ecmascript@0.19.2-rc360.1
ddp@1.4.3
ddp-client@3.4.2
ddp-common@1.4.6
ddp-rate-limiter@1.3.1
ddp-server@3.6.0_1
diff-sequence@1.2.1
dynamic-import@0.8.1_1
ecmascript@0.19.2
ecmascript-runtime@0.8.3
ecmascript-runtime-client@0.13.0
ecmascript-runtime-server@0.11.1
ejson@1.4.1-rc360.1
email@3.2.1-rc360.1
ejson@1.4.1
email@3.2.1
es5-shim@4.8.1
facebook-oauth@1.12.1-rc360.1_1
facts-base@1.0.3-rc360.1
fetch@0.2.1-rc360.1
geojson-utils@1.0.13-rc360.1
github-oauth@1.4.3-rc360.1
google-oauth@1.5.1-rc360.1_1
facebook-oauth@1.12.1_1
facts-base@1.0.3
fetch@0.2.1
geojson-utils@1.0.13
github-oauth@1.4.3
google-oauth@1.5.1_1
hot-code-push@1.0.5
html-tools@2.0.1
htmljs@2.0.2
id-map@1.2.1-rc360.1
instrumentation@0.0.1-rc360.1
inter-process-messaging@0.1.4-rc360.1
id-map@1.2.1
instrumentation@0.0.1
inter-process-messaging@0.1.4
jquery@3.0.2
lai:collection-extensions@1.0.0
localstorage@1.2.1
logging@1.3.7-rc360.1
logging@1.3.7
matb33:collection-hooks@2.1.0
meetup-oauth@1.1.4-rc360.1
meteor@2.3.2-rc360.1
meetup-oauth@1.1.4
meteor@2.3.2
meteor-base@1.5.2
meteor-developer-oauth@1.3.4-rc360.1
meteor-developer-oauth@1.3.4
meteortesting:browser-tests@1.8.0
meteortesting:mocha@3.4.0
meteortesting:mocha-core@8.2.0
minifier-css@2.0.2
minifier-js@3.3.2-rc360.1
minimongo@2.2.1-rc360.1
modern-browsers@0.2.4-rc360.1
minifier-js@3.3.2
minimongo@2.2.1
modern-browsers@0.2.4
modules@0.20.3
modules-runtime@0.13.2
mongo@2.5.2-rc360.1
mongo@2.6.0
mongo-decimal@0.2.0
mongo-dev-server@1.1.1
mongo-id@1.0.10-rc360.1
npm-mongo@6.18.1-rc360.1
oauth@3.0.5-rc360.1
oauth1@1.5.4-rc360.1
mongo-id@1.0.10
npm-mongo@6.18.1
oauth@3.0.5
oauth1@1.5.4
oauth2@1.3.3
observe-sequence@2.0.1
ordered-dict@1.2.1-rc360.1
ordered-dict@1.2.1
ostrio:cookies@2.9.2
ostrio:cstorage@4.0.1
ostrio:files@3.0.1
ostrio:flow-router-extra@3.15.3
ostrio:i18n@3.2.1
package-stats-opt-out@1.0.8
promise@1.0.1-rc360.1
promise@1.0.1
quave:synced-cron@2.4.0
raix:eventemitter@1.0.0
random@1.2.3-rc360.1
rate-limit@1.2.1-rc360.1
random@1.2.3
rate-limit@1.2.1
react-fast-refresh@0.3.0
reactive-dict@1.3.3-rc360.1
reactive-dict@1.3.3
reactive-var@1.0.13
reload@1.3.3-rc360.1
retry@1.1.2-rc360.1
reload@1.3.3
retry@1.1.2
reywood:publish-composite@1.9.0
routepolicy@1.1.3-rc360.1
rspack@1.4.0-rc360.1
service-configuration@1.3.6-rc360.1
session@1.2.4-rc360.1
sha@1.0.11-rc360.1
shell-server@0.7.2-rc360.1_1
socket-stream-client@0.7.2-rc360.1
routepolicy@1.1.3
rspack@1.4.0
service-configuration@1.3.6
session@1.2.4
sha@1.0.11
shell-server@0.7.2_1
socket-stream-client@0.7.2
spacebars@2.0.1
spacebars-compiler@2.0.1
standard-minifier-js@3.3.0-rc360.1
standard-minifier-js@3.3.0
templating@1.4.5
templating-compiler@2.0.1
templating-runtime@2.0.2
templating-tools@2.0.1
tools-core@1.4.0-rc360.1
tracker@1.3.5-rc360.1
twitter-oauth@1.3.5-rc360.1
typescript@5.11.2-rc360.1
url@1.3.7-rc360.1
webapp@2.3.1-rc360.1
webapp-hashing@1.1.3-rc360.1
weibo-oauth@1.3.4-rc360.1
tools-core@1.4.0
tracker@1.3.5
twitter-oauth@1.3.5
typescript@5.11.2
url@1.3.7
webapp@2.4.0
webapp-hashing@1.1.3
weibo-oauth@1.3.4
wekan-accounts-cas@0.2.0
wekan-accounts-lockout@1.1.0
wekan-accounts-oidc@1.0.10
+544 -645
View File
File diff suppressed because it is too large. Load diff
+31 -29
View File
@@ -5,46 +5,48 @@ each one changed and the project status are in
Written by `node releases/changelog-short.mjs` from CHANGELOG-big.md:
make changes there.
# v13.04 2026-11-09 WeKan ® release
# v13.11 2026-11-13 WeKan ® release
**ListLockBleed** is fixed: when a list refuses a role write
access, that refusal now also holds for the checklist and checklist-item REST
routes. The **Sandstorm** and **Android** bundles retry their npm install when
github.com is briefly unavailable.
The **file-integrity scan** stops reporting attachments and
avatars that WeKan deleted itself as missing, which had buried real
**StorageBleed** findings under thousands of false ones. The recurring-checklist
reset no longer scans every **checklist** on each tick. In the **REST API**, a
refused custom-field update changes nothing, ownership transfer takes only the
boards the user administers, and deleting a missing integration answers 404.
[All changes in v13.04](CHANGELOG-big.md#v1304-2026-11-09-wekan--release)
[All changes in v13.11](CHANGELOG-big.md#v1311-2026-11-13-wekan--release)
# v13.03 2026-11-09 WeKan ® release
# v13.10 2026-11-13 WeKan ® release
The amd64 **snaps** no longer fail the release when the Ubuntu
archive is briefly unreachable: the build waits for it and retries once.
The release's **Snap Store** credential check bounds each
snapcraft install attempt, so a Snap Store that hangs no longer stops a release.
[All changes in v13.03](CHANGELOG-big.md#v1303-2026-11-09-wekan--release)
[All changes in v13.10](CHANGELOG-big.md#v1310-2026-11-13-wekan--release)
# v13.02 2026-11-09 WeKan ® release
# v13.09 2026-11-12 WeKan ® release
**UnassignedArchiveBleed** is fixed: a member with the
**Normal, assigned only** role archives and converts only the cards assigned
to them, through every card method.
The release's **Snap Store** credential check retries installing
snapcraft, so one Snap Store timeout no longer stops a release.
[All changes in v13.02](CHANGELOG-big.md#v1302-2026-11-09-wekan--release)
[All changes in v13.09](CHANGELOG-big.md#v1309-2026-11-12-wekan--release)
# v13.01 2026-11-08 WeKan ® release
# v13.08 2026-11-12 WeKan ® release
Translations: the strings still in English are written in **33
more languages**, **Sardinian** is Sardinian instead of Italian and **Moroccan
Arabic** is Darija instead of Persian. Dependabot's updates of **mailparser**,
**isomorphic-git**, **pdfjs-dist** and the S3 libraries are checked and kept,
with the S3 client brought to the version the upload library needs.
The **REST API** creates a card under the **parent** it is given,
and a refused **integration URL** no longer leaves the other fields of the same
update written. The **single-file** WeKan for **32-bit ARM** builds again, with
an i386 Node.js of the exact version its bundle embeds. A **GitHub CodeQL**
alert in the security alert download script is fixed.
[All changes in v13.01](CHANGELOG-big.md#v1301-2026-11-08-wekan--release)
[All changes in v13.08](CHANGELOG-big.md#v1308-2026-11-12-wekan--release)
# v13.00 2026-11-07 WeKan ® release
# v13.07 2026-11-12 WeKan ® release
**CreateBleed** is fixed: "Only admins can create boards" now
holds on every path that creates a board - the browser console, the REST API,
imports, copies, clones and cards - not only on the Add Board form. The **REST
API documentation** spells the name **WeKan**, so the API pages published on
wekan.fi pass its brand-spelling check again.
**ListLockAttachBleed** is fixed: when a list refuses a role
write access, that refusal now also holds for the attachment API's upload,
delete, copy and move. **CodeQL** alerts #602 and #603 in the tests are fixed,
**fast-xml-parser** is updated to 5.12.0, spent time reads as a **duration**,
the **indexes** that LDAP, card member and History queries need are added, and
Admin Panel → Problems can **Clear** resolved problems, which also age out.
[All changes in v13.00](CHANGELOG-big.md#v1300-2026-11-07-wekan--release)
[All changes in v13.07](CHANGELOG-big.md#v1307-2026-11-12-wekan--release)
+4 -3
View File
@@ -38,7 +38,7 @@ FROM --platform=$BUILDPLATFORM debian:trixie AS bundle
ARG TARGETARCH
ARG TARGETVARIANT
ARG VERSION=13.04
ARG VERSION=13.11
ARG DEBIAN_FRONTEND=noninteractive
COPY --chmod=755 releases/check-telemetry.py /tmp/check-telemetry.py
@@ -148,8 +148,8 @@ ARG DEBIAN_FRONTEND=noninteractive
ENV \
DEBUG=false \
DDP_TRANSPORT=sockjs \
NODE_VERSION=v26.13.0 \
METEOR_RELEASE=METEOR@3.6-rc.1 \
NODE_VERSION=v26.13.1 \
METEOR_RELEASE=METEOR@3.6 \
USE_EDGE=false \
NPM_VERSION=12.2.2 \
SRC_PATH=./ \
@@ -318,6 +318,7 @@ ENV \
WEKAN_DISK_WATCH_PATHS="" \
WEKAN_RAM_MONITOR="" \
WEKAN_IMPORT_RUN_STALE_MS="" \
EVENTLOG_RETENTION_DAYS="" \
CORS="" \
CORS_ALLOW_HEADERS="" \
CORS_EXPOSE_HEADERS="" \
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v13.04.0"
appVersion: "v13.11.0"
files:
userUploads:
- README.md
+4 -1
View File
@@ -195,7 +195,10 @@ template(name="activity")
if(currentData.timeKey)
| {{_ activity.activityType }}
= ' '
i(title=currentData.timeValue).activity-meta {{ displayDate currentData.timeValue 'LLL' }}
//- A date cleared has no new value (server/lib/timingChangeActivity.js):
only the one it had, below, rather than an empty date.
if currentData.timeValue
i(title=currentData.timeValue).activity-meta {{ displayDate currentData.timeValue 'LLL' }}
if (currentData.timeOldValue)
= ' '
| {{{activityMessage "previous_as" }}}
+5 -3
View File
@@ -2,6 +2,8 @@ import { TAPi18n } from '/imports/i18n';
import Cards from '/models/cards';
import { getCurrentCardIdFromContext } from '/client/lib/currentCard';
import { backIfOwnPopup } from '/client/lib/popupBack';
// #6890: the badge shows a duration, the tooltip hours to two decimals.
import { formatSpentTime, roundedSpentHours } from '/models/lib/spentTimeFormat';
function getCardId() {
return getCurrentCardIdFromContext();
@@ -63,17 +65,17 @@ Template.cardSpentTime.helpers({
if (card.getIsOvertime && card.getIsOvertime()) {
return `${TAPi18n.__(
'overtime',
)} ${card.getSpentTime()} ${TAPi18n.__('hours')}`;
)} ${roundedSpentHours(card.getSpentTime())} ${TAPi18n.__('hours')}`;
} else if (card.getSpentTime) {
return `${TAPi18n.__(
'card-spent',
)} ${card.getSpentTime()} ${TAPi18n.__('hours')}`;
)} ${roundedSpentHours(card.getSpentTime())} ${TAPi18n.__('hours')}`;
}
return '';
},
showTime() {
const card = Cards.findOne(this._id) || this;
return card.getSpentTime ? card.getSpentTime() : '';
return card.getSpentTime ? formatSpentTime(card.getSpentTime()) : '';
},
getIsOvertime() {
const card = Cards.findOne(this._id) || this;
@@ -100,5 +100,6 @@ template(name="problemsSummary")
span.admin-problem-count {{area.count}} {{_ 'new-problems'}}
.admin-problem-actions
button.js-ack-checked.primary {{_ 'acknowledge'}}
button.js-clear-checked {{_ 'clear-problems'}}
else
p {{_ 'no-new-problems'}}
@@ -232,4 +232,14 @@ Template.problemsSummary.events({
if (!streams.length) return;
Meteor.call('acknowledgeEventLog', streams, () => templateInstance.reload());
},
// Clear (#6893) removes the checked streams' events up to now, so a resolved
// problem stops showing, where Acknowledge only resets the count.
'click .js-clear-checked'(event, templateInstance) {
const streams = Array.from(templateInstance.findAll('.js-problem-check:checked'))
.map(el => el.getAttribute('data-stream'))
.filter(Boolean);
if (!streams.length) return;
Meteor.call('clearEventLog', streams, () => templateInstance.reload());
},
});
+4
View File
@@ -986,6 +986,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
+4
View File
@@ -988,6 +988,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
@@ -975,6 +975,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
+4
View File
@@ -992,6 +992,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
@@ -898,6 +898,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
+4
View File
@@ -1129,6 +1129,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
+4
View File
@@ -973,6 +973,10 @@ services:
# progress counts as interrupted and can be resumed or discarded (at least
# 60000).
#- WEKAN_IMPORT_RUN_STALE_MS=600000
# EVENTLOG_RETENTION_DAYS : Days after which an Admin Panel / Problems event
# is deleted by the daily sweep, so resolved problems age out; a recurring
# problem keeps a recent date and stays. Default 90, 0 = keep forever.
#- EVENTLOG_RETENTION_DAYS=90
#---------------------------------------------------------------
# ATTACHMENT RETENTION (models/lib/attachmentRetention.js). Off unless set.
# ATTACHMENTS_RETENTION_DAYS : once a night, delete card attachments older
@@ -10,7 +10,7 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-13.04-win64.zip](https://github.com/wekan/wekan/releases/download/v13.04/wekan-13.04-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
1. [wekan-13.11-win64.zip](https://github.com/wekan/wekan/releases/download/v13.11/wekan-13.11-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
2. [node.exe](https://nodejs.org/dist/latest-v26.x/win-x64/node.exe)
@@ -22,7 +22,7 @@ Right click and download files 1-4:
6. Double click `mongodb-windows-x86_64-7.0.34-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-13.04-win64.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-13.11-win64.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Peukara pangkalan data",
"new-problems": "peukara barô",
"acknowledge": "Teurimong",
"clear-problems": "Peugléh",
"rulesReportTitle": "Laporan Atôran",
"boardsReportTitle": "Laporan Papan",
"cardsReportTitle": "Laporan Kad",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Databasisprobleme",
"new-problems": "nuwe probleme",
"acknowledge": "Erken",
"clear-problems": "Maak skoon",
"rulesReportTitle": "Reëlsverslag",
"boardsReportTitle": "Raadsverslag",
"cardsReportTitle": "Kaarte Verslag",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Databasisprobleme",
"new-problems": "nuwe probleme",
"acknowledge": "Erken",
"clear-problems": "Maak skoon",
"rulesReportTitle": "Reëlsverslag",
"boardsReportTitle": "Raadsverslag",
"cardsReportTitle": "Kaarte Verslag",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Nsɛm akorabea mu haw",
"new-problems": "Fa ade foforo ka ho",
"acknowledge": "Gye tom",
"clear-problems": "Pepa",
"rulesReportTitle": "Mmara ho amanneɛbɔ",
"boardsReportTitle": "Bɔɔd ho amanneɛbɔ",
"cardsReportTitle": "Kaad ho amanneɛbɔ",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "የውሂብ ጎታ ችግሮች",
"new-problems": "አዲስ ችግሮች",
"acknowledge": "እውቅና ስጥ",
"clear-problems": "አጽዳ",
"rulesReportTitle": "የደንቦች ሪፖርት",
"boardsReportTitle": "የሰሌዳዎች ሪፖርት",
"cardsReportTitle": "የካርዶች ሪፖርት",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas d’a base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Limpiar",
"rulesReportTitle": "Informe sobre as Reglas",
"boardsReportTitle": "Informe sobre os Tableros",
"cardsReportTitle": "Informe sobre as Tarchetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "مشاكل قاعدة البيانات",
"new-problems": "مشاكل جديدة",
"acknowledge": "إقرار",
"clear-problems": "مسح",
"rulesReportTitle": "تقرير القواعد",
"boardsReportTitle": "تقرير اللوحات",
"cardsReportTitle": "تقرير البطاقات",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "مشاكل قاعدة البيانات",
"new-problems": "مشاكل جديدة",
"acknowledge": "إقرار",
"clear-problems": "مسح",
"rulesReportTitle": "تقرير القواعد",
"boardsReportTitle": "تقرير اللوحات",
"cardsReportTitle": "تقرير البطاقات",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "مشاكل قاعدة البيانات",
"new-problems": "مشاكل جديدة",
"acknowledge": "إقرار",
"clear-problems": "مسح",
"rulesReportTitle": "تقرير القواعد",
"boardsReportTitle": "تقرير اللوحات",
"cardsReportTitle": "تقرير البطاقات",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "مشاكل قاعدة البيانات",
"new-problems": "مشاكل جداد",
"acknowledge": "تأكيد",
"clear-problems": "مسح",
"rulesReportTitle": "تقرير القواعد",
"boardsReportTitle": "تقرير اللوحات",
"cardsReportTitle": "تقرير البطاقات",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "ডাটাবেছৰ সমস্যাসমূহ",
"new-problems": "নতুন সমস্যাসমূহ",
"acknowledge": "স্বীকাৰ কৰক",
"clear-problems": "পৰিষ্কাৰ কৰক",
"rulesReportTitle": "নিয়মৰ প্ৰতিবেদন",
"boardsReportTitle": "বৰ্ডৰ প্ৰতিবেদন",
"cardsReportTitle": "কাৰ্ডৰ প্ৰতিবেদন",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemes de la base de datos",
"new-problems": "problemes nuevos",
"acknowledge": "Reconocer",
"clear-problems": "Llimpiar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe de los tableros",
"cardsReportTitle": "Informe de les tarxetes",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Aymar aruna: Database problems",
"new-problems": "machaqa problems",
"acknowledge": "Aymar aruna: Acknowledge",
"clear-problems": "Q'umachaña",
"rulesReportTitle": "Rules yatiyawi",
"boardsReportTitle": "pirqanaka yatiyawi",
"cardsReportTitle": "tarjetanaka yatiyawi",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Verilənlər bazası problemləri",
"new-problems": "yeni problem",
"acknowledge": "Təsdiqlə",
"clear-problems": "Təmizlə",
"rulesReportTitle": "Qaydalar Hesabatı",
"boardsReportTitle": "İdarə Heyətinin Hesabatı",
"cardsReportTitle": "Kartlar Hesabatı",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Verilənlər bazası problemləri",
"new-problems": "yeni problem",
"acknowledge": "Təsdiqlə",
"clear-problems": "Təmizlə",
"rulesReportTitle": "Qaydalar Hesabatı",
"boardsReportTitle": "İdarə Heyətinin Hesabatı",
"cardsReportTitle": "Kartlar Hesabatı",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Verilənlər bazası problemləri",
"new-problems": "yeni problem",
"acknowledge": "Təsdiqlə",
"clear-problems": "Təmizlə",
"rulesReportTitle": "Qaydalar Hesabatı",
"boardsReportTitle": "İdarə Heyətinin Hesabatı",
"cardsReportTitle": "Kartlar Hesabatı",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Мәғлүмәттәр базаһы мәсьәләләре",
"new-problems": "яңы мәсьәләләр",
"acknowledge": "Таныу",
"clear-problems": "Таҙартырға",
"rulesReportTitle": "Ҡағиҙәләр хисабы",
"boardsReportTitle": "Таҡталар хисабы",
"cardsReportTitle": "Карточкалар хисабы",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Праблемы базы даных",
"new-problems": "новых праблем",
"acknowledge": "Пацвердзіць",
"clear-problems": "Ачысціць",
"rulesReportTitle": "Справаздача па правілах",
"boardsReportTitle": "Справаздача па дошках",
"cardsReportTitle": "Справаздача па картках",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Проблеми с базата данни",
"new-problems": "нови проблема",
"acknowledge": "Потвърждаване",
"clear-problems": "Изчистване",
"rulesReportTitle": "Отчет за правилата",
"boardsReportTitle": "Отчет за таблата",
"cardsReportTitle": "Отчет за картите",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "डेटाबेस समस्या",
"new-problems": "नया समस्या",
"acknowledge": "जानकारी स्वीकार करीं",
"clear-problems": "साफ करीं",
"rulesReportTitle": "नियम रपट",
"boardsReportTitle": "बोर्ड रपट",
"cardsReportTitle": "कार्ड रपट",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Ol problem blong databes",
"new-problems": "niu problem",
"acknowledge": "Talem se yu kasem",
"clear-problems": "Klinim",
"rulesReportTitle": "Ripot blong ol rul",
"boardsReportTitle": "Ripot blong Ol bod",
"cardsReportTitle": "Ripot blong Ol kad",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datakurun gɛlɛyaw",
"new-problems": "gɛlɛya kuraw",
"acknowledge": "A sɔrɔ",
"clear-problems": "Saniya",
"rulesReportTitle": "Sariyaw lapɔrɔ",
"boardsReportTitle": "Tabaliw lapɔrɔ",
"cardsReportTitle": "Karataw lapɔrɔ",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "ডেটাবেসের সমস্যা",
"new-problems": "নতুন সমস্যা",
"acknowledge": "স্বীকার করুন",
"clear-problems": "মুছুন",
"rulesReportTitle": "নিয়মের প্রতিবেদন",
"boardsReportTitle": "বোর্ডের প্রতিবেদন",
"cardsReportTitle": "কার্ডের প্রতিবেদন",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "གཞི་གྲངས་མཛོད་ཀྱི་གནད་དོན།",
"new-problems": "གནད་དོན་གསར་པ།",
"acknowledge": "ངོས་ལེན།",
"clear-problems": "གཙང་སེལ།",
"rulesReportTitle": "སྒྲིག་སྲོལ་སྙན་ཞུ།",
"boardsReportTitle": "ལས་སྟེགས་སྙན་ཞུ།",
"cardsReportTitle": "བྱང་བུའི་སྙན་ཞུ།",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Kudennoù an diaz roadennoù",
"new-problems": "kudenn nevez",
"acknowledge": "Anzav",
"clear-problems": "Skarzhañ",
"rulesReportTitle": "Raport a benn ar merde",
"boardsReportTitle": "Raport a benn taolennnoù",
"cardsReportTitle": "Raport a benn kartennnoù",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemi baze podataka",
"new-problems": "novih problema",
"acknowledge": "Potvrdi",
"clear-problems": "Očisti",
"rulesReportTitle": "Izvještaj o pravilima",
"boardsReportTitle": "Izvještaj o tablama",
"cardsReportTitle": "Izvještaj o karticama",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Үгэгдэлэй сангай асуудалнууд",
"new-problems": "шэнэ асуудалнууд",
"acknowledge": "Мэдэрхэ",
"clear-problems": "Арилгаха",
"rulesReportTitle": "Дүримүүдэй тайлан",
"boardsReportTitle": "Самбарнуудай тайлан",
"cardsReportTitle": "Картануудай тайлан",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemes de la base de dades",
"new-problems": "problemes nous",
"acknowledge": "Reconeix",
"clear-problems": "Neteja",
"rulesReportTitle": "Informe de normes",
"boardsReportTitle": "Informe de les Juntes",
"cardsReportTitle": "Informe de fitxes",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemes de la base de dades",
"new-problems": "problemes nous",
"acknowledge": "Reconeix",
"clear-problems": "Neteja",
"rulesReportTitle": "Informe de normes",
"boardsReportTitle": "Informe de les Juntes",
"cardsReportTitle": "Informe de fitxes",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemes de la base de dades",
"new-problems": "problemes nous",
"acknowledge": "Reconeix",
"clear-problems": "Neteja",
"rulesReportTitle": "Informe de normes",
"boardsReportTitle": "Informe de les Juntes",
"cardsReportTitle": "Informe de fitxes",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "ᎧᏃᎮᏓ ᏗᎦᏓᎭ",
"new-problems": "ᎢᏤ ᏗᎦᏓᎭ",
"acknowledge": "ᎠᏓᏂᎸᏤᏗ",
"clear-problems": "ᎯᏅᎦᎸ",
"rulesReportTitle": "ᏗᎧᎿᏩᏛᏍᏗ ᎧᏃᎮᏓ",
"boardsReportTitle": "ᏗᎦᏍᎩᎸ ᎧᏃᎮᏓ",
"cardsReportTitle": "ᏗᎪᏪᎵ ᏗᏍᏗ ᎧᏃᎮᏓ",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "کێشەکانی بنکەدراوە",
"new-problems": "کێشە نوێکان",
"acknowledge": "پەسەند بکە",
"clear-problems": "پاککردنەوە",
"rulesReportTitle": "ڕاپۆرتی یاساکان",
"boardsReportTitle": "ڕاپۆرتی تەختەکان",
"cardsReportTitle": "ڕاپۆرتی کارتەکان",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "数据库问题",
"new-problems": "个新问题",
"acknowledge": "确认",
"clear-problems": "清除",
"rulesReportTitle": "规则报告",
"boardsReportTitle": "看板报告",
"cardsReportTitle": "卡片报告",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Prublemi di a basa di dati",
"new-problems": "prublemi novi",
"acknowledge": "Cunfirmà",
"clear-problems": "Sguassà",
"rulesReportTitle": "Raportu di e regule",
"boardsReportTitle": "Raportu di e tavule",
"cardsReportTitle": "Raportu di e carte",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problémy databáze",
"new-problems": "nových problémů",
"acknowledge": "Potvrdit",
"clear-problems": "Vymazat",
"rulesReportTitle": "Report pravidel",
"boardsReportTitle": "Report tabel",
"cardsReportTitle": "Report karet",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problémy databáze",
"new-problems": "nových problémů",
"acknowledge": "Potvrdit",
"clear-problems": "Vymazat",
"rulesReportTitle": "Report pravidel",
"boardsReportTitle": "Report tabel",
"cardsReportTitle": "Report karet",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemë bazë dónëch",
"new-problems": "nowych problemòw",
"acknowledge": "Pòcwierdzë",
"clear-problems": "Wëczëszczë",
"rulesReportTitle": "Rapòrt reglów",
"boardsReportTitle": "Raport tôblëcòw",
"cardsReportTitle": "Raport kôrtòw",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Палӑрту базин проблемӗсем",
"new-problems": "ҫӗнӗ проблемӑсем",
"acknowledge": "Йышӑнас",
"clear-problems": "Тасатас",
"rulesReportTitle": "Правилӑсен отчӗчӗ",
"boardsReportTitle": "Хӑмасен отчӗчӗ",
"cardsReportTitle": "Карточкӑсен отчӗчӗ",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemau cronfa ddata",
"new-problems": "problemau newydd",
"acknowledge": "Cydnabod",
"clear-problems": "Clirio",
"rulesReportTitle": "Adroddiad Rheolau",
"boardsReportTitle": "Adroddiad y Byrddau",
"cardsReportTitle": "Adroddiad Cardiau",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemau cronfa ddata",
"new-problems": "problemau newydd",
"acknowledge": "Cydnabod",
"clear-problems": "Clirio",
"rulesReportTitle": "Adroddiad Rheolau",
"boardsReportTitle": "Adroddiad y Byrddau",
"cardsReportTitle": "Adroddiad Cardiau",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Databaseproblemer",
"new-problems": "nye problemer",
"acknowledge": "Bekræft",
"clear-problems": "Nulstil",
"rulesReportTitle": "Regelrapport",
"boardsReportTitle": "Tavlerapport",
"cardsReportTitle": "Kortrapport",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datenbankprobleme",
"new-problems": "neue Probleme",
"acknowledge": "Bestätigen",
"clear-problems": "Zurücksetzen",
"rulesReportTitle": "Regeln-Bericht",
"boardsReportTitle": "Board-Bericht",
"cardsReportTitle": "Karten-Bericht",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datenbankprobleme",
"new-problems": "neue Probleme",
"acknowledge": "Bestätigen",
"clear-problems": "Zurücksetzen",
"rulesReportTitle": "Regeln-Bericht",
"boardsReportTitle": "Board-Bericht",
"cardsReportTitle": "Karten-Bericht",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datenbankprobleme",
"new-problems": "neue Probleme",
"acknowledge": "Bestätigen",
"clear-problems": "Zurücksetzen",
"rulesReportTitle": "Regeln-Bericht",
"boardsReportTitle": "Boardbericht",
"cardsReportTitle": "Kartenbericht",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datenbankprobleme",
"new-problems": "neue Probleme",
"acknowledge": "Bestätigen",
"clear-problems": "Zurücksetzen",
"rulesReportTitle": "Regeln-Bericht",
"boardsReportTitle": "Boardbericht",
"cardsReportTitle": "Kartenbericht",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "གཞི་གྲངས་མཛོད་གནད་དོན།",
"new-problems": "གནད་དོན་གསར་པ།",
"acknowledge": "ངོས་ལེན།",
"clear-problems": "བསལ།",
"rulesReportTitle": "སྒྲིག་ལམ་སྙན་ཞུ།",
"boardsReportTitle": "བྱང་གཞིའི་སྙན་ཞུ།",
"cardsReportTitle": "ཤོག་བྱང་སྙན་ཞུ།",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Nyatakakadzraɖoƒe ƒe kuxiwo",
"new-problems": "kuxi yeyewo",
"acknowledge": "Lɔ̃ ɖe edzi",
"clear-problems": "Tutui ɖa",
"rulesReportTitle": "Sewo ƒe nyatakakagbalẽ",
"boardsReportTitle": "Kpekpeɖeŋuwo ƒe nyatakakagbalẽ",
"cardsReportTitle": "Kaɖiwo ƒe nyatakakagbalẽ",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Προβλήματα βάσης δεδομένων",
"new-problems": "νέα προβλήματα",
"acknowledge": "Επιβεβαίωση",
"clear-problems": "Εκκαθάριση",
"rulesReportTitle": "Αναφορά κανόνων",
"boardsReportTitle": "Αναφορά πινάκων",
"cardsReportTitle": "Αναφορά καρτών",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Προβλήματα βάσης δεδομένων",
"new-problems": "νέα προβλήματα",
"acknowledge": "Επιβεβαίωση",
"clear-problems": "Εκκαθάριση",
"rulesReportTitle": "Αναφορά κανόνων",
"boardsReportTitle": "Αναφορά πινάκων",
"cardsReportTitle": "Αναφορά καρτών",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Database problems",
"new-problems": "new problems",
"acknowledge": "Acknowledge",
"clear-problems": "Clear",
"rulesReportTitle": "Rules Report",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datumbazaj problemoj",
"new-problems": "novaj problemoj",
"acknowledge": "Konfirmi",
"clear-problems": "Viŝi",
"rulesReportTitle": "Raporto pri reguloj",
"boardsReportTitle": "Raporto pri tabuloj",
"cardsReportTitle": "Raporto pri kartoj",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Problemas de la base de datos",
"new-problems": "problemas nuevos",
"acknowledge": "Confirmar",
"clear-problems": "Borrar",
"rulesReportTitle": "Informe sobre las Reglas",
"boardsReportTitle": "Informe sobre los Tableros",
"cardsReportTitle": "Informe sobre las Tarjetas",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Andmebaasi probleemid",
"new-problems": "uut probleemi",
"acknowledge": "Kinnita",
"clear-problems": "Tühjenda",
"rulesReportTitle": "Reeglite aruanne",
"boardsReportTitle": "Juhatuse aruanne",
"cardsReportTitle": "Kaartide aruanne",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Datu-basearen arazoak",
"new-problems": "arazo berri",
"acknowledge": "Berretsi",
"clear-problems": "Garbitu",
"rulesReportTitle": "Arauen txostena",
"boardsReportTitle": "Arbelen txostena",
"cardsReportTitle": "Txartelen txostena",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "مشکلات پایگاه داده",
"new-problems": "مشکل جدید",
"acknowledge": "تأیید",
"clear-problems": "پاک کردن",
"rulesReportTitle": "گزارش قوانین",
"boardsReportTitle": "گزارش بردها",
"cardsReportTitle": "گزارش کارت‌ها",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "مشکلات پایگاه داده",
"new-problems": "مشکل جدید",
"acknowledge": "تأیید",
"clear-problems": "پاک کردن",
"rulesReportTitle": "گزارش قوانین",
"boardsReportTitle": "گزارش بردها",
"cardsReportTitle": "گزارش کارت‌ها",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Caɗeele ruttorde keɓe",
"new-problems": "caɗeele kese",
"acknowledge": "Jaɓ",
"clear-problems": "Laɓɓin",
"rulesReportTitle": "Jaŋtol kuule",
"boardsReportTitle": "Jaŋtol alluuje",
"cardsReportTitle": "Jaŋtol karte",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Tietokantaongelmat",
"new-problems": "uutta ongelmaa",
"acknowledge": "Kuittaa",
"clear-problems": "Tyhjennä",
"rulesReportTitle": "Säännöt raportti",
"boardsReportTitle": "Taulut raportti",
"cardsReportTitle": "Kortit raportti",
+1
View File
@@ -2380,6 +2380,7 @@
"databaseReportTitle": "Leqa ni kato ni itukutuku",
"new-problems": "leqa vou",
"acknowledge": "Vakadinadinataka",
"clear-problems": "Vakasavasavataka",
"rulesReportTitle": "iTukutuku ni Lawa",
"boardsReportTitle": "iTukutuku ni Vola",
"cardsReportTitle": "iTukutuku ni Kadi",
Loaded 100 of 365 files, more files were not shown because too many files have changed in this diff. Show more