Commit Graph
553 Commits
Author SHA1 Message Date
Daniel Hiller ca035d670e fix: Restore two files committed empty by the list filter merge
75fcddcd wrote `client/src/models/Board.js` and the board filter bar out as
zero bytes. `BoardActions` imports `Filters` from that module, so the client
could not render a board at all.

The conflict resolution there was scripted, and the script opened each file
for writing before reading it, which truncates it first and then reads back
nothing. ESLint accepts an empty module, so lint stayed green and the commit
looked fine.

Both files are rebuilt from the two merge parents. All six conflicts resolve
to keeping both sides, which is what the merge intended: excluded labels,
cards without a member and lists are three independent filters.

One behaviour fix rides along, because the union merge would otherwise have
carried it in. The no-member branch ended its block with `return cardModels`,
which was correct while it was the last filter and wrong once the list filter
followed it: combining the two would have dropped the list filter without a
word. The three now compose.
2026-09-17 03:50:09 +02:00
Daniel Hiller f1e8c59d6e Merge pull request #1571 from lustsazeus-lab/fix/issue-165-feature-bounty
feat: improve card communication with reply and mentions
2026-09-17 03:27:21 +02:00
Daniel Hiller 67d3ccf425 chore: Add the German strings for the two new filters 2026-09-17 02:05:06 +02:00
Daniel Hiller 1c683604ea Merge pull request #1649 from symonbaikov/feat/list-view-reorder
feat: allow re-ordering cards in list view

Conflicted only on the import block, where the icon button tooltips had added
a line. Both imports stay.
2026-09-17 02:03:25 +02:00
Daniel Hiller 75fcddcd0b Merge pull request #1648 from symonbaikov/feat/list-filter
feat: add filter by list (status) in list view

Three filters landed in the same places while this was open: excluded labels,
cards without a member, and now lists. They are independent of each other, so
every conflict resolves to keeping both sides.

The selector was the one exception worth naming. Both branches had written the
same body under a different name, so the merge put one header on one body; it
is now two complete selectors.
2026-09-17 02:03:04 +02:00
Daniel Hiller bb2da7f36a Merge pull request #1236 from symonbaikov/feat/no-member-filter
Add filter for cards without members ("No member" filter)

Conflicted with the negative label filter, which had added its own field to
the board model next to this one. Both stay; they filter on different things.
2026-09-17 02:01:58 +02:00
Daniel Hiller 1f2f3f297e Merge pull request #1680 from symonbaikov/fix/new-card-disappears-with-filters
fix: inherit active board filters when creating a card ()
2026-09-17 02:00:36 +02:00
Daniel Hiller 35f14b479c Merge pull request #1650 from symonbaikov/feature/webhook-scope-filter
feat: filter webhooks per project, board, and account
2026-09-17 02:00:30 +02:00
Daniel Hiller 84827ab354 Merge pull request #1683 from symonbaikov/feat/negative-label-filter
Add negative label filtering for cards

Two conflicts, both from work that landed while this branch was open.

In the endless list query, master had added an ORDER BY so the cursor and the
limit agree. The exclusion clause belongs in the WHERE part, so it is placed
before it rather than after; the other way round the statement does not parse.

The label item had been restructured here for the tri-state filter and had
gained a tooltip on master. The restructured version is kept and the tooltip
put back on top of it, which also brings back the translation hook this branch
had dropped.
2026-09-17 00:46:31 +02:00
Daniel Hiller 6cfdf839ca Merge pull request #1719 from crmaris/fix/task-reorder-hidden-completed
fix: Fix task reordering when completed tasks are hidden

Conflicted with the icon button tooltips, which had added a Tooltip import to
the same file. Both imports stay except `useToggle`, which this branch makes
redundant by lifting the per-list eye toggle up to TaskLists so the position
calculation can see it.
2026-09-17 00:45:20 +02:00
Daniel Hiller aa7e2c49fc Merge pull request #1726 from AymanAlSuleihi/fix/login-and-user-forms-validation-feedback
fix: Show error messages on invalid login and user settings form inputs
2026-09-17 00:44:30 +02:00
Daniel Hiller c17d43b97d Merge pull request #1721 from babu-ch/fix/ime-composition-enter-submit
fix: Ignore Enter pressed during IME composition in input fields
2026-09-17 00:44:24 +02:00
Daniel Hiller 8314be0a04 fix(i18n): Correct the Swedish translations
Thanks to NickWick13, who found these while working on something else.

`removeFromBoard` and `removeFromProject` still had the English "from" in
them. `serverConnectionFailed` was never translated at all. The Pro banner
called boards "bräden", which is a plank of wood, where the rest of the file
says "tavlor". "E-mail" is written "e-postadress" in Swedish, "Timer" is a
"stoppur", and a viewer is a "läsare", not a "visare".

The date formats were still the en-US patterns, so Swedish dates rendered in
American order with the English word "at" in the middle. They now read
"d MMMM 'kl.' p".

The tooltip strings from the same pass are included here so Swedish lands in
one piece.
2026-09-17 00:42:24 +02:00
Daniel Hiller 71724a7532 chore: Translate the icon button tooltips into every locale
The tooltips arrived with their strings in en-US and ru-RU only, which would
have left the hint layer half English in thirty-two languages. The same
twenty-four keys are now in all of them.

Each locale follows its own file: the word it already uses for board, card,
list and project, its register, and its own key order. Where a locale's
existing wording for a neighbouring key is wrong, the new strings use the
correct form rather than repeating the mistake, and the mistake is left for a
separate pass.
2026-09-17 00:42:24 +02:00
Daniel Hiller 2030722242 feat: Remember which view a board was last put into
Choosing a view and finding the board's default again after every reload is
the board forgetting something the reader clearly meant.

The choice lives in `sessionStorage`, not on the account. A view is how one
person is looking at a board right now, not a property of the board: two
windows may hold the same board open as a grid and as a list, and neither is
wrong. A stored preference would make one of them change under the other's
hands.

The context is stored alongside and has to match on the way back out, so a
view picked in the archive does not follow the board into its own context. A
view this build no longer knows falls through to the board's default, as does
anything stored while the browser refuses to keep it.
2026-09-17 00:42:11 +02:00
Daniel Hiller 764bd106a7 fix: Keep tooltips off touch devices
A tooltip triggered by hover and focus also fires on a tap, because tapping a
button focuses it. On a phone the hint then covers the thing that was just
pressed, and it stays there until something else takes focus. There is no
moment before a click for it to fill.

`IS_TOUCH_PRIMARY` reads `(hover: none)` once at load, the way `IS_MAC` reads
the platform, and the tooltip renders its trigger bare when it is set.
2026-09-17 00:42:11 +02:00
Daniel Hiller 0e8a41adf8 Merge pull request #1685 from symonbaikov/codex/icon-button-tooltips
feat: add tooltips for icon buttons

Conflicts came from the branch predating the Pro banner work and the deleted
API key step. Resolved by keeping master's `onEdit` on the user actions popup
and wrapping it in the tooltip, and by leaving `ApiKeyStep.jsx` deleted.

The `switchToView` key is dropped in favour of one complete string per view.
Interpolating a view name into "Switch to {{view}} view" required
`t('common.' + view).toLowerCase()` at the call site, and lowercasing a
translated string is wrong wherever case carries meaning: German capitalises
nouns, and Turkish turns I into a dotless ı. The five replacements need no
interpolation and no lowercasing.
2026-09-17 00:41:33 +02:00
Daniel Hiller 26b512193a chore: Translate the strings missing from every locale
Thirty-three locales were short the same sixty-six keys and had been since
2.2.1. Fifty-six of them are the two-factor setup and the auto-logout
preference; six are the two-factor challenge itself; the rest are the promo
strings the banner rotates through.

The six in `login.js` were the urgent ones. They render during sign-in, before
`core.js` is fetched, so a user with two-factor enabled met the whole challenge
in English — on the one screen they cannot get past without understanding it.
Three of those six exist in `core.js` as well and now read identically in both
files, which nothing checks and which two translators working from two files
would otherwise have got subtly different.

Plural forms follow each language rather than the English pair: Arabic carries
all six CLDR categories with the agreement its counting requires, Czech,
Polish, Russian, Slovak and Ukrainian four with the right case in each, and
Chinese, Japanese, Korean, Vietnamese and Indonesian only `other`, since a
`_one` variant would be a form i18next never reads.

Every file is additions only — no existing line was moved, reworded or
reformatted, so the diff shows what was missing and nothing else. Several
existing mistranslations turned up along the way and were left alone; they are
a separate concern from filling the gaps.
2026-09-08 19:54:41 +02:00
Daniel Hiller 4e15748e4b feat: Widen the Pro banner rotation and split it by role
The banner still advertised the calendar, recurring cards and guest roles —
features from 2.3 — to everyone who ran an instance. It now carries nine
features up to 2.5.0, and the ten strings behind them sit in their
alphabetical place rather than in the middle of the two-factor block, where
the first three had ended up.

Who sees what now depends on the role. An admin can put a trial on their own
server today and a board user cannot, so admins get the trial line and land
on planka.app/trial while everyone else gets the overview on /pro. The
landing path is also what tells the two groups apart in the referral figures,
since nothing is measured in the app.

A full pass through nine features takes over two minutes, longer than most
visits, and the rotation restarted at the first entry on every load. The tail
of the list would have advertised nothing. The list now starts at an offset
picked per visit, which spreads the features over the visitors instead of over
the length of a session — the headline still opens every session, only the
feature that follows it varies.

The headline falls back per language. `proTrialSelfHosted` is new and exists
in two locales; `discoverPlankaPro` exists in all of them. Where the sharper
line is untranslated the softer one is used rather than a line of English, on
the one string that opens every session and fills every second slot. The link
still goes to the trial, and as translations land the check flips on its own.

The thirty-day dismissal is untouched, deliberately: any version-aware
dismissal would resurface the banner for every user at once on rollout,
because the entries already in local storage carry no version.
2026-09-08 19:54:07 +02:00
Daniel Hiller 6def0330c2 chore: Move the changelog to the repository root
The release notes rendered in the about modal only existed as an asset
inside the client, where nothing outside a build would look for them. The
file moves to CHANGELOG.md at the root and the about modal reads it from
there, so the client build and the Docker image copy in the same file the
repository keeps.

An unreleased section collects the orphaned reference fixes and the
pagination fixes.
2026-08-26 10:15:56 +02:00
Daniel Hiller 4add7e43af fix: Keep dangling project references from blanking the home view
`getManagerProjectsModelArray` mapped every project manager to its project
without checking that the project is in the store, so one row pointing at a
deleted project produced a null the caller then read `id` off — taking down
the whole home view. `getMembershipProjectsModelArray` had the same hole one
level up, destructuring `board.project` before testing `board`.

The projects endpoint fed exactly that state: it derived the id list for the
included records from the manager rows, so a `project_manager` row whose
project no longer exists shipped a manager for a project missing from `items`.
Board memberships had the same gap. Both id lists now come from the records
that actually exist.
2026-08-26 09:22:53 +02:00
Daniel Hiller 266246e242 chore: Update version 2026-08-10 18:28:48 +02:00
Daniel Hiller 2684198bf8 chore: Update version 2026-08-09 22:36:27 +02:00
Daniel Hiller 3ef87a8603 feat: Add configurable auto logout on inactivity
Users can pick an inactivity timeout in their preferences. A warning
appears 30 seconds before, and activity or a logout is synchronised
across open tabs.
2026-08-08 00:24:16 +02:00
Daniel Hiller a9d0c228df feat: Replace user edit popups with a single modal
Editing a user now opens a modal with an information tab and an API
key tab instead of a chain of popups. The user name in the list opens
it, and the admin two-factor reset moves in as well.
2026-08-08 00:16:35 +02:00
Daniel Hiller a6f6af8a6c fix: Replace Pro theme tokens with literal colors
The two-factor stylesheets were carried over from the Pro edition and
referenced CSS custom properties from its theme system, which this
edition does not define. They silently fell back to browser defaults.
2026-08-08 00:15:34 +02:00
Daniel Hiller 2e4904f77d feat: Add two-factor authentication via TOTP
Adds TOTP setup with QR code, login challenge, recovery codes and
trusted devices that let a browser skip the second factor for 30
days. Admins can reset another user's second factor by confirming
with their own password.
2026-08-07 20:11:55 +02:00
Daniel Hiller 36aa732fec feat: Remove OIDC and SSO support
Existing SSO accounts have no local password, so the migration
deactivates them before dropping is_sso_user and the
identity_provider_user table.
2026-08-07 19:15:43 +02:00
Ayman 9443b85517 fix: Show error messages on invalid password edit 2026-07-10 20:38:08 +01:00
Ayman 180807a0ec fix: Show error messages on invalid form inputs 2026-07-10 20:14:21 +01:00
babu-ch 9f18028337 fix: Ignore Enter pressed during IME composition in input fields
Closes #1703
2026-07-03 20:54:52 +09:00
crmarisandClaude Fable 5 8615accb66 fix: Fix task reordering when completed tasks are hidden
The index produced by drag-and-drop refers to the rendered task list,
which excludes completed tasks when hideCompletedTasks is enabled, but
selectNextTaskPosition resolved that index against the unfiltered task
array, computing positions between the wrong (often hidden) neighbors.

Lift the completed-tasks visibility state up to TaskLists so the drag
end handler can pass it through the move action, and apply the same
filter in selectNextTaskPosition that the rendered list uses.

Fixes #1718

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:27:36 +03:00
Symon 4a70e995d3 feat: add tooltips for icon buttons 2026-06-07 18:06:04 +03:00
Symon 55d0e2f877 Add negative label filtering for cards 2026-06-05 16:43:45 +03:00
Symon dcf8a6d748 fix: inherit active board filters when creating a card (#1663)
A card created while member/label filters were active was made without
any members or labels, so the all-or-nothing filter immediately excluded
it and the card vanished from the view.

After a card is created, assign the active filter users and labels to it
(reusing addUserToCard/addLabelToCard) so it stays visible. No-op when no
filters are active.
2026-06-04 20:31:01 +03:00
Symon 05979a460f feat: filter webhooks per project, board, and account
Adds optional project, board, and acting-user scope to each webhook so
events from a specific board or project can be routed to a single
endpoint without an external automation tool in the middle (closes
#1457).

A webhook now fires for an event only when every set scope matches:
empty scope still means "fire for everything", keeping existing
webhooks working unchanged. Scope filtering is centralized in the
sendWebhooks helper, which auto-derives projectId/boardId from the
event payload, so existing call sites are untouched.
2026-05-02 10:31:30 +03:00
Symon f348583977 feat: allow re-ordering cards in list view 2026-05-02 09:45:07 +03:00
Symon 401c0412cb feat: add filter by list (status) in list view
Adds a per-list filter to the board action bar, visible only in
List View. Mirrors the existing transient label/member filter
pattern: filterLists is a many-relation on the Board ORM model,
toggled via entry actions and reset on board navigation. Empty
selection keeps the current behavior; non-empty selection shows
only cards whose listId is in the chosen set. Filter UI is hidden
in Kanban/Grid views where columns already convey the same info.

Closes #1524
2026-05-02 09:24:48 +03:00
Daniel Hiller 6e2e6539d1 chore: Update what's new documentation 2026-04-18 15:19:56 +00:00
Daniel Hiller e429b478ca chore: Bump version to 2.1.1 and update release notes 2026-04-18 15:10:14 +00:00
Daniel Hiller cd9ba8ff4f feat: Add Pro features discovery banner
Adds a dismissible banner in the topbar that informs users about
PLANKA Pro features.

- Dismissible per-user (stored in localStorage)
- Reappears after 30 days
- Rotates between main message and 3 feature highlights
- Links to planka.app/pro (with ref parameter for anonymous source attribution)
2026-04-18 13:32:22 +00:00
HannesOberreiter 3bf6e6fa19 fix: allow unicodes in initials 2026-04-16 14:21:13 +02:00
Sebastian Dichler d3ff3e2db8 feat(client): Add ability for admins to edit user avatars (#1604) 2026-03-25 11:24:27 +01:00
Maksim Eltyshev 91eb43f472 chore: Update version 2026-03-19 11:13:08 +01:00
Maksim Eltyshev c342d2edd7 feat: Add ability to display card ages 2026-03-18 09:42:20 +01:00
Roberto Fernández Iglesias 5e6195b252 feat: Support running under subpath (#1451) 2026-03-12 22:11:11 +01:00
lustsazeus-lab 2413ddd1cd feat: map @username mentions when saving card descriptions 2026-03-06 09:48:20 +08:00
lustsazeus-lab f23ce6e025 feat: add comment reply shortcut and description mentions 2026-03-06 09:48:20 +08:00
Maksim Eltyshev 2685e5d5fc chore: Update version 2026-03-01 16:53:11 +01:00
Maksim Eltyshev d5d3f1de44 chore: Update version 2026-02-23 18:44:06 +01:00