14678 Commits
Author SHA1 Message Date
Frederick [Bot] 5fa9361891 chore(i18n): update translations via Crowdin 2026-07-21 00:22:37 +00:00
kolaente 7f7d61fe5d docs: update readme with LLM disclosure, update sponsors [skip ci]
Ref https://github.com/go-vikunja/vikunja/issues/3246
2026-07-20 13:09:26 +02:00
renovate[bot]andkolaente 317dd44a26 chore(deps): update dev-dependencies 2026-07-20 06:39:09 +00:00
renovate[bot]andkolaente ab29478192 chore(deps): update postgres:18 docker digest to 3a82e1f 2026-07-20 06:38:57 +00:00
Frederick [Bot] ed0d8d03ec chore(i18n): update translations via Crowdin 2026-07-20 00:23:26 +00:00
kolaenteandkolaente 80178fa1b2 fix(frontend): route to not-found on forbidden task instead of blank shell
Opening a task the user has no permission for returned a 403, which
fell through the task detail load handler's 404-only catch. The empty
pre-initialized task model stayed visible, rendering a broken shell
(#0, no title, "Created 57 years ago"). Treat 403 like 404 and route
to the not-found page.
2026-07-19 20:01:20 +00:00
kolaente 907850feae chore: v2.4.0 release preparations v2.4.0 2026-07-19 19:00:07 +02:00
kolaente e31ea2de50 test(e2e): seed hashed user tokens in TokenFactory (GHSA-r6w9-259g-gwrv)
Reset/confirm/deletion tokens (kinds 1-3) are now stored as a SHA-256 hash and
looked up by hash, so the e2e factory must seed the hash while returning the
plaintext to the test. Kind 4 (caldav/bcrypt) is seeded verbatim.
2026-07-19 18:59:34 +02:00
kolaente 6895a7765e fix(security): reject cross-project views in ProjectView Can{Delete,Update} (GHSA-gg93-x632-9ccv) 2026-07-19 18:59:34 +02:00
kolaente 781ffac198 fix(security): require Admin to detach a project from its parent (GHSA-44v6-7fxq-vgf4) 2026-07-19 18:59:34 +02:00
kolaente 1c13624a8e fix(api): reject link shares on reaction and task-read endpoints (consistency; GHSA-vvcv-vpph-h844) 2026-07-19 18:59:34 +02:00
kolaente 3a0ea15d8c fix(security): hash password-reset, email-confirm and deletion tokens at rest (GHSA-r6w9-259g-gwrv) 2026-07-19 18:59:34 +02:00
kolaente 00fd2c6155 fix(security): clear plaintext user tokens for reset/confirm/deletion (GHSA-r6w9-259g-gwrv) 2026-07-19 18:59:34 +02:00
kolaente 4ae2e09301 fix(auth): reject API tokens at the OAuth authorize endpoint (GHSA-v3p6-34mc-hj7v) 2026-07-19 18:59:34 +02:00
kolaente 7854f2729a fix(auth): require verified email before OIDC email-fallback account linking (GHSA-xv7q-fvmc-jx96) 2026-07-19 18:59:34 +02:00
kolaente be36c11e67 fix(api): derive API-token ownership from a verified user principal (GHSA-vvcv-vpph-h844) 2026-07-19 18:59:34 +02:00
kolaente d911caaa11 fix(projects): enforce write permission on target parent when duplicating a project (GHSA-f27p-pw2p-9pr4) 2026-07-19 18:59:34 +02:00
kolaente cfb9c24519 fix(kanban): pin link-share task collection view to the share's project (GHSA-rj9j-8772-4h6c) 2026-07-19 18:59:34 +02:00
kolaente b31d606b88 fix(kanban): prevent cross-tenant bucket relocation via project_view_id mass-assignment (GHSA-569v-q83c-3j3g) 2026-07-19 18:59:34 +02:00
kolaente 36cdc2ce2b fix(kanban): authorize body task_id when moving a task into a bucket (GHSA-5pg6-m483-7vrg) 2026-07-19 18:59:34 +02:00
kolaenteandkolaente 37c35c64fb fix(a11y): make the editor toolbar a single tab stop with roving focus
role=toolbar with a roving tabindex: Arrow keys move between buttons,
one Tab stop, Tab leaves the toolbar, and the tab stop stays valid when
buttons become disabled. Covered by an e2e keyboard-navigation spec.

Also fixes the table-edit :disabled bindings, which referenced
editor.can().X as a property (always truthy) so those buttons never
actually disabled — surfaced by review while testing the roving focus.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente ad6884fb72 fix(a11y): announce comment and attachment counts on task cards and rows
The bare count badges read as just a number to screen readers; they now
carry an accessible name like "2 comments" / "1 attachment".

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 2a823836ee fix(a11y): label the bucket selector with its purpose and current bucket
The trigger announced only the bare bucket name ("To-Do, button");
it now announces "Kanban bucket: To-Do".

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente eb164f8ce9 fix(a11y): keep the auth hero heading readable with a gradient scrim
The white hero heading sat directly on the photo, where its contrast
depends on the image content. A bottom-weighted gradient scrim keeps it
readable across the whole picture.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 5495043861 feat(editor): prompt for alt text when inserting an image
Opens the existing alt-text prompt right after an image is inserted
(upload, paste and URL flows) so every new image gets a description.
Cancelling leaves the image without alt text, and the node is deselected
afterwards so the next insert appends instead of replacing.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 878d389587 fix(a11y): un-nest the attachment rows
Each attachment row was a button containing the download, copy-URL,
delete and set-cover buttons — interactive elements nested inside an
interactive element, which is invalid and confuses assistive-technology
focus (axe: nested-interactive). The row is now a non-interactive
container: the filename (and thumbnail) is the trigger that opens or
downloads the attachment, and the action buttons are its siblings.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente a980e99c9e test(tasks): pin subtask root placement for fuzzy search and multi-parent scopes
The fuzzy mirror test is ParadeDB-only and fails without the previous
commit (child returned as a second root). The multi-parent test pins the
NOT EXISTS semantics from #3197: one in-scope and one out-of-scope
parent must still nest the child.

Part of #2954
2026-07-19 14:16:07 +00:00
kolaenteandkolaente 723ef2dce9 fix(search): mirror ParadeDB BM25 matching into the subtask parent search condition
The parent root-membership mirror always used the ILIKE fallback, so on
ParadeDB a parent matching the search only via fuzzy/token matching kept
its child as a duplicate root, and a substring-only ILIKE match could
hide a child under a parent absent from the results. The assumed
limitation no longer holds: pg_search plans ||| against the aliased
parent_tasks inside the correlated NOT EXISTS as a regular BM25 scan
(verified on 0.24.1), and score-free predicates never triggered the
"unsupported query shape" error on older versions either.

Part of #2954
2026-07-19 14:16:07 +00:00
kolaenteandkolaente d3d69c76ce fix(a11y): render the kanban bucket footer as a list item
The add-task footer renders inside ul.tasks via the draggable footer
slot; as a div it was the one remaining invalid child of the kanban
lists converted in #3234.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 13:43:18 +00:00
TinkandGitHub 60a09f2088 fix(a11y): contrast tokens, empty-title feedback, structure and landmarks (#3234) 2026-07-19 15:15:10 +02:00
TinkandGitHub b5f34ff7da fix(labels): explain why link-share users can't create labels (#3233) 2026-07-19 14:45:37 +02:00
TinkandGitHub 5c2bb6bd2d fix(quick-add): don't abort task creation when a label can't be created (#3232) 2026-07-19 14:45:24 +02:00
kolaenteandkolaente 4ccf5ac4ae fix(a11y): expose expanded, sort, result-count and toggle states to assistive technology
Add disclosure semantics to dropdown/popup triggers (aria-expanded, Escape to
close with focus return, drop the incorrect role=menu), aria-sort plus
per-column labels on the table view, a debounced polite live region announcing
quick-actions result counts, aria-pressed on editor toggle buttons, and an
aria-label on the rich-text editing region.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 11:36:25 +00:00
maximilizeandGitHub 4f86f21316 fix(filters): resolve relative and absolute date filters in UTC (#3181) 🤖🤖🤖 (#3229) 2026-07-19 13:31:21 +02:00
kolaente 9e25b36530 chore(deps): update devenv 2026-07-19 12:58:41 +02:00
TinkandGitHub 7afbf86467 fix(a11y): login tab order, announced errors, combobox pattern, named dialogs and selects (#3228) 2026-07-19 12:39:47 +02:00
Evan BakerandGitHub d0dad0437f fix(user): stop double-encoding FrontendSettings on UpdateUser (#2793) 2026-07-19 12:13:35 +02:00
renovate[bot]andkolaente f462187544 chore(deps): update dev-dependencies 2026-07-19 09:06:25 +00:00
renovate[bot]andkolaente 7826aa4bba fix(deps): update tiptap to v3.28.0 2026-07-19 09:00:23 +00:00
renovate[bot]andkolaente 3d501969a4 fix(deps): update font awesome to v7.3.1 2026-07-19 09:00:16 +00:00
TinkandGitHub 0dd27ed2d0 fix(tasks): make subtask root condition NULL-safe and search-aware (#3197) 2026-07-19 10:59:28 +02:00
kolaenteandkolaente f76e405b6c fix: disable echo group 404 auto-registration to keep pre-5.3.0 routing behavior
echo v5.3.0 reverted to v4 behavior where every group with middleware
implicitly registers a 404 route at its prefix. Our route setup creates
multiple groups with the same prefix (rate-limit subgroups of /api/v1),
which now panics with a duplicate-route error at startup.
2026-07-18 17:24:51 +00:00
renovate[bot]andkolaente 293ac5d103 fix(deps): update module github.com/labstack/echo/v5 to v5.3.0 2026-07-18 17:24:51 +00:00
Pierre Christenandkolaente 44ed50d508 docs: fix @Success 200 -> 201 on 5 PUT/Create endpoints
Five PUT-routed "create" endpoints document @Success 200, but they all
dispatch through the shared CreateWeb handler (pkg/web/handler/create.go),
which always responds 201 Created. Every other CreateWeb-routed endpoint
(labels, teams, filters, task relations/comments/assignees/duplicate,
task-labels) already correctly documents 201 - these five are stragglers
with the same stale annotation.

Affected endpoints:
- PUT /tokens
- PUT /projects/{id}/views/{view}/buckets
- PUT /projects/{id}/webhooks
- PUT /{kind}/{id}/reactions
- PUT /projects/{project}/views

Doc-only change, no behavior change. Regenerated pkg/swagger/* via
`swag init -g ./pkg/routes/routes.go --parseDependency -d . -o ./pkg/swagger`
(the command mage generate:swagger-docs runs) so the generated docs match
the annotations.
2026-07-18 17:05:32 +00:00
renovate[bot]andkolaente e10b1fcbb8 fix(deps): update dependency pinia to v4 2026-07-18 16:55:47 +00:00
TowyTowyandGitHub ffcd470adf fix(caldav): parse ISO 8601 week durations in reminder triggers (#3183) 2026-07-18 18:55:17 +02:00
Frederick [Bot] 2b7d31bfbb [skip ci] Updated swagger docs 2026-07-18 15:00:26 +00:00
kolaenteandkolaente fd2815cf73 fix(a11y): add accessible names to all icon-only buttons
Adds translated aria-labels to the 42 icon-only BaseButton/XButton
usages the new lint rule found — attachment actions, assignee/label
remove buttons, multiselect clear buttons, table sort triggers, the
TipTap bubble menu (which only had v-tooltip, which sets no accessible
name), datepicker toggles, and more. Labels reuse the existing tooltip
translation keys where present and interpolate item names where
available (e.g. "Remove {user} as assignee").

With zero remaining violations the rule is raised from warn to error.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-18 14:05:36 +00:00
kolaenteandkolaente 1d17e4cacc chore(a11y): add lint rule flagging icon-only buttons without accessible name
BaseButton renders a bare button and does not enforce a name, so icon-only
usages without aria-label are announced as just "button" — the a11y audit
found this pattern regenerating across the codebase (42 current instances,
including the TipTap bubble menu where v-tooltip provides no accessible
name). The new vikunja/icon-button-accessible-name rule flags icon-only
BaseButton/XButton usages that have no aria-label, aria-labelledby, title,
visible text, or sr-only text; unknown child components are assumed to
render text to avoid false positives.

Set to 'warn' until the existing instances get aria-labels, then raise to
'error'.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-18 14:05:36 +00:00
kolaenteandkolaente f405fc5a78 test: cover getErrorText interpolation of i18n_params
Address pr-swarm finding: design (the fixed line itself was untested).
2026-07-18 13:41:15 +00:00