From b39ddc543a1b6984fbb91219457a4f13f5b5b750 Mon Sep 17 00:00:00 2001 From: TrueCharts Bot Date: Mon, 6 Jul 2026 01:51:52 +0200 Subject: [PATCH] =?UTF-8?q?feat(wekan):=20update=20image=20docker.io/wekan?= =?UTF-8?q?team/wekan=20v9.74=20=E2=86=92=20v9.76=20(#49930)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [docker.io/wekanteam/wekan](https://redirect.github.com/wekan/wekan) | minor | `12c6429` → `6ed534c` | --- > [!WARNING] > Some dependencies could not be looked up. Check the [Dependency Dashboard](../issues/18710) for more information. Add the preset `:preserveSemverRanges` to your config if you don't want to pin your dependencies. --- ### Release Notes
wekan/wekan (docker.io/wekanteam/wekan) ### [`v9.76`](https://redirect.github.com/wekan/wekan/blob/HEAD/CHANGELOG.md#v976-2026-07-06-WeKan--release) [Compare Source](https://redirect.github.com/wekan/wekan/compare/v9.75...v9.76) This release adds the following fixes: - **[Fix notification emails linked to `/b/undefined/board/` instead of the real board](https://redirect.github.com/wekan/wekan/commit/8b21158736f9e1360332903707c100bce3d6b164)**: On the server `ReactiveCache.getBoard()` is async and returns a Promise, but `Cards.board()` did not await it, so the synchronous `Card.originRelativeUrl()`/`absoluteUrl()` interpolated a Promise — `board._id` and `board.slug` were `undefined`, producing `/b/undefined/board/` in card activity notification emails (the client UI was unaffected because `this.board()` is synchronous there). Fixed by making `Card.originRelativeUrl(board)`/`absoluteUrl(board)` accept an already-resolved board and fall back to `this.boardId` (always available synchronously) when the board is a Promise, and by passing the awaited board from `server/models/activities.js` so the correct board id and slug are used. Thanks to titver968 and xet7. - **[Release workflow: publish the Helm chart only after the Docker image is pushed](https://redirect.github.com/wekan/wekan/commit/a2802a850b57ef7ac183ddb581be666d14d43705)**: In `.github/workflows/release-all.yml` the `charts` job now depends on the `docker` job (`needs: docker`) instead of running in parallel right after `bump`. GitHub Actions runs a job only when all of its `needs` jobs succeed, so the wekan/charts Helm chart is published only after the multi-arch image is live on Docker Hub / Quay.io / GHCR (and is skipped if `docker` fails). This prevents ArtifactHub from scanning a freshly published chart whose image tag does not exist yet and emailing the maintainer about the missing Docker image. Thanks to xet7. - **[Fix thousands of unsolicited empty "Default" swimlanes created on some boards](https://redirect.github.com/wekan/wekan/commit/45fb54794755663307ef89636e2822ef9c65428d)**: `Board.getDefaultSwimline()`/`getDefaultSwimlineAsync()` self-heal a missing default swimlane by reading the board's swimlanes and inserting one if none exist. That check-then-insert is a race: concurrent or repeated server calls for a swimlane-less board each saw zero swimlanes and each inserted a new one, so some boards accumulated 30 000+ empty "Default" swimlanes and became unloadable (the `key 'default (en)' returned an object instead of string` log is a harmless i18n side effect — the title correctly falls back to the string `Default`). Follow-up to the client-side [#​6382](https://redirect.github.com/wekan/wekan/issues/6382) fix, which only stopped the browser from auto-creating them. Fixed by making the server self-heal **idempotent**: the default swimlane is now upserted with a deterministic `_id` (`-default`), so the `_id` unique index guarantees at most one default swimlane per board no matter how many times, or how concurrently, the getters run. `archived`/`type` are set explicitly in the `$setOnInsert` because their schema autoValue/defaultValue only fire on insert, not upsert. Note: this prevents new duplicates; boards that already accumulated thousands still need a one-off cleanup. Thanks to brlin-tw and xet7. - **[Reduce card flicker on drag by only writing changed fields on a card move](https://redirect.github.com/wekan/wekan/commit/2e7c4ede2a6429048882e68084bb286aedbc42a5)**: `Card.move()` wrote `boardId`/`swimlaneId`/`listId` into the update unconditionally, even for a same-board drag to another list (the reported case). Keeping `boardId` in the `$set` on every drag re-ran the `boardId`-gated `Cards.after.update` hook that re-syncs the card's checklists and checklist items via `multi` updates, ran the cross-board consistency guard and the `denyCrossBoardMove` deny-rule DB lookup, and invalidated more reactive dependents than necessary — server work and reactivity churn that contributed to a \~1s card flicker on large boards. `Card.move()` now writes **only the fields that actually change** (via the pure `computeCardMoveModifier` helper) and skips the write entirely when a card is dropped back in the same place, so a same-board move no longer touches boardId or the cross-board hooks. The `moveCard`/`moveCardBoard` activity generators already re-check `doc.X !== oldX`, so trimming the modifier does not drop any activity. Note: this reduces the drag-time work behind the flicker; the residual reactive re-render cost on very large boards is a separate performance topic. Thanks to mimZD and xet7. - **[Fix `DEFAULT_AUTHENTICATION_METHOD` env var ignored, and Admin Panel Layout save hanging](https://redirect.github.com/wekan/wekan/commit/d5596f05b7ee63a114d3479c34e930f0d9d5549c)**: Two related problems with the default login authentication method. - **Env var ignored:** the stored setting was only ever seeded as `password` and `DEFAULT_AUTHENTICATION_METHOD` was never applied, so operators setting it (e.g. Kubernetes/Helm `DEFAULT_AUTHENTICATION_METHOD: ldap`) saw no effect. Startup now applies the env var authoritatively: it seeds the value on a fresh install and, on existing installs, keeps the stored `defaultAuthenticationMethod` in sync with the env var on every boot (the operator's env is the source of truth), so the method can be configured entirely by env without the Admin Panel. The value is normalized (trimmed + lower-cased), so `DEFAULT_AUTHENTICATION_METHOD=LDAP` works. - **Layout save hanging / not persisting:** the authentication-method `