Browser extensions inject third-party images (e.g. yahoo.co.jp favicons)
into the page, and their load failures were reported as ours.
Refs FRONTEND-OSS-263
Console breadcrumbs keep the raw logged arguments until Sentry normalizes
the event, which happens after event processors run. A cyclic object in
there, such as the Vue router internals a browser extension logged, sent
redactSensitiveParams into infinite recursion and the event was lost.
Fixes FRONTEND-OSS-2M2
Mandatory scroll snapping on narrow screens snapped the board back after
each small auto-scroll step from sortablejs, so tasks could only be
dropped into buckets already visible. Disable snapping while dragging.
Fixes#4163
The task detail view saves on every color picker update. The API returns
hex_color without '#', so the picker re-emitted the normalized value
after each save. While dragging, out-of-order save responses kept
flipping the color, each echo triggering another save in an endless loop.
Fixes#4156
Once the hour input holds a complete hour (two digits, or a single digit
that cannot start a valid two-digit hour in the current 12h/24h format),
the hour is committed and focus moves to the minutes input. Both inputs
select their content on focus so typing replaces the value.
Tab from the hours input now lands on minutes directly. The step buttons
stay mouse-clickable; ArrowUp/ArrowDown on the inputs remain the keyboard
path.
Starting a timer always used the click time, discarding a start time the
user had picked in the form. Only an untouched start now falls back to
the click time.
Every non-2xx response now rejects with an ApiError carrying the problem
fields and the HTTP status. A thrown plain object reached Sentry with a
meaningless title and no stack, and the 4xx/5xx split relied on duck-typing
plain objects. 4xx are dropped as ordinary request failures, 5xx stay reported.
The token refresh and /info probe told HTTP failures from transport errors by
`instanceof Error`, so they now exclude ApiError explicitly.
Fixes FRONTEND-OSS-2K0
A failed preview fetch escaped the watcher into Vue's error handler, which
toasted and reported it. Same handling as FilePreview: the card keeps working
without the decorative image.
Fixes FRONTEND-OSS-2KV
The generated client throws the raw body text when an error response is not
JSON, e.g. a proxy's "Bad Gateway" or Go's "404 page not found". Sentry wrapped
the bare string as a synthetic Error and the request-failure filter could not
see its status, so ordinary 4xx failures were reported.
Fixes FRONTEND-OSS-2KT
The edit and delete dialogs closed through router.back(), which does
nothing when the dialog is the tab's first history entry (new tab,
bookmark). Cancel, close and save then left the edit dialog open and
only "Delete" still navigated, leading users into deleting the project.
Fall back to the project, or home, when there is no entry to go back to.
Restoring a draft set the raw stored HTML as model value. When the editor
normalized it differently (collapsed whitespace, trailing paragraph after
lists), the modelValue watcher reset the editor into preview mode.
Created cards were inserted into the board cache with position 0. Dropping
another card at the top of the bucket then sent position 0, which made the
server recalculate every position in the view behind the client's back.
Create, bulk create and duplicate responses now carry the task's stored
position in every view, so clients can place the new card without
refetching the board.
v-model skips input events while an IME composition is active. Android
keyboards compose every word, so the query lagged behind the input, the
results were not filtered, and tapping a result committed the composition
and re-rendered the list under the finger.
Resolves#4120
Only the keyword expressions (today, tomorrow, ...) used the configured
default due time. Explicit dates, weekdays and ordinal days kept
whatever time the parser produced, e.g. 00:00 for 2026-10-13.
Fixes#4122
A title like "31.12.2026 - 01.01.2027 Happy new year" had its first date
taken as the due date, leaving "- 01.01.2027 Happy new year" as title.
Resolves#4123
Sockets closed at their token's expiry even after the client renewed,
forcing a reconnect and losing events in the gap. A second auth on an
open socket must match its user and session and re-runs the session
check before the expiry timer moves. The client sends the renewed token
on the open socket after every refresh, schedules the proactive refresh
for a session that existed before mount, and refreshes a token expiring
within seconds before authenticating, since its server clock can lag by
up to a second.
The server closes the socket when its token expires. Reconnecting with that token failed auth and stopped the socket for good. A transient refresh failure now retries with backoff instead of sending the stale token, and backoff only resets after a successful auth.
Removing a user or team from a project, removing a team member, leaving a team and deleting a team now say that task assignments, subscriptions and webhooks of whoever loses access are deleted too.