Commit Graph
14659 Commits
Author SHA1 Message Date
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
kolaenteandkolaente c34972a6ba test: assert I18nParams keys against en.json translation placeholders 2026-07-18 13:41:15 +00:00
kolaenteandkolaente f388015dda fix: interpolate dynamic values into translated error toasts
Parametrised error translations (invalid api token permission, invalid
timezone, invalid claim data) rendered their placeholders as empty text
because the backend only baked the values into the English message and
the frontend translated the error code without any interpolation params.

Carry the values as i18n_params on error responses, keyed by the
placeholder names of the frontend's error translations, on both v1 and
the v2 problem+json body, and pass them through when translating the
toast. A 14002 toast now reads e.g. "The permission time_entries of
group tasks is invalid." instead of "The permission of group is
invalid."
2026-07-18 13:41:15 +00:00
kolaenteandkolaente 0c3b63c6ee fix(a11y): move focus to main content when the skip link is activated
the target main element was not programmatically focusable, so activation only set the URL hash and screen readers never announced the jump
2026-07-18 12:24:20 +00:00
kolaenteandkolaente 54829da649 fix(a11y): show a keyboard-only focus ring on text inputs and editable titles
The .input:focus reset left text fields and the contenteditable task
title without any focus indication. Because :focus-visible matches mouse
clicks on text fields, keyboard modality is tracked via a user-is-tabbing
class on the root element instead.
2026-07-18 12:24:20 +00:00
kolaenteandkolaente e824657fcd fix(a11y): make kanban cards reachable and openable by keyboard 2026-07-18 12:24:20 +00:00
kolaenteandkolaente f428ab9e00 fix(a11y): fix light theme contrast of success and danger text 2026-07-18 12:24:20 +00:00
kolaenteandkolaente c12757127f fix(a11y): pick label text color by actual WCAG contrast ratio 2026-07-18 12:24:20 +00:00
kolaenteandkolaente 14f2a2947e fix(a11y): make task title keyboard editable 2026-07-18 12:24:20 +00:00
kolaenteandkolaente 84593438eb fix(a11y): show a visible focus ring on checkboxes and other focusable controls 2026-07-18 12:24:20 +00:00
kolaenteandkolaente 8a7e388229 fix(a11y): make list view task links keyboard focusable and openable with Enter
The task link had tabindex="-1" and the document-level list navigation
handler prevented default on every Enter press, so keyboard users could
not open a task from the list view at all.
2026-07-18 12:24:20 +00:00
TinkandGitHub 45fada10d6 feat(editor): allow setting image alt text (#3206) 2026-07-18 14:39:51 +02:00
TinkandGitHub 6b9a879574 fix(notifications): render Markdown in plain-text emails (#3219) 2026-07-18 14:39:32 +02:00
renovate[bot]andkolaente 4d8b7255e7 chore(deps): update crowdin/github-action action to v2.16.4 2026-07-18 10:42:37 +00:00
kolaenteandkolaente ab8486c258 fix(frontend): zero seconds on api token custom expiry date
On touch devices flatpickr swaps in a native datetime-local input and
writes the pre-filled date including wall-clock seconds as its default
value. With no step attribute and a date-only (thus ignored) min, those
seconds become the step base, so every value picked through the native
UI (always :00 seconds) fails validation as a stepMismatch and the
browser blocks the form submit.

Zeroing seconds on the initial date puts the step base on the :00 grid
where native picker values land.

Fixes go-vikunja/vikunja#3175
2026-07-18 09:44:53 +00:00
renovate[bot]andTink cd6331122d fix(deps): update dependency vue to v3.5.40 2026-07-18 09:30:55 +00:00
renovate[bot]andTink c8e598a1f7 fix(deps): update dependency nanoid to v6 2026-07-18 09:05:47 +00:00
renovate[bot]andTink a8d69ba65e fix(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.105.2 2026-07-18 08:25:15 +00:00
TinkandGitHub 2c82e7ebef fix(desktop): register vikunja-desktop:// scheme handler for AppImage (#3203) 2026-07-18 10:03:24 +02:00
TinkandGitHub e2c09d593c fix: hide license-gated routes from api token scope list (#3216) 2026-07-18 10:00:37 +02:00