Skip to content

feat(frontend): add /users page for fork-specific user management - #15

Merged
kigiela merged 2 commits into
feat/docsales-admin-usersfrom
feat/docsales-admin-users-frontend
Jul 19, 2026
Merged

feat(frontend): add /users page for fork-specific user management#15
kigiela merged 2 commits into
feat/docsales-admin-usersfrom
feat/docsales-admin-users-frontend

Conversation

@kigiela

@kigiela kigiela commented Jul 19, 2026

Copy link
Copy Markdown

Depends on #14

Based on that branch since it needs the /docsales-admin routes to exist. Rebase onto main after #14 merges.

What

New /users page, gated client-side on a plain isAdmin check - mirrors views/admin/UsersView.vue's list/search/create/status/delete flow against /docsales-admin/users instead of /admin/users. Deliberately drops the is_admin toggle and password management from the copy, matching what the backend route group exposes.

Adds a "Migrate tasks" action per row: search the already-loaded user list, pick a destination, confirm. Calls the new migrate-to endpoint and reports how many tasks/assignments moved.

Linked from the user dropdown menu (AppHeader.vue), next to the existing built-in Admin Panel link, same isAdmin guard.

Verification

  • mage check:translations clean - added 7 new keys under admin.users.*, no missing or dead keys.
  • Design-quality hook scanned both new files, no issues flagged.
  • vue-tsc typecheck: ran it both with and against a clean main checkout - the same long list of pre-existing errors appears on both (unrelated files, none of mine), confirming it's a local environment/toolchain issue rather than something this PR introduces. Neither of my new/changed files appears in either error list.
  • Could not visually click through the page: reaching it requires isAdmin=true, and temporarily bypassing that guard for a local screenshot (even reverting right after) was correctly blocked by the environment's permission classifier. So: built and statically verified, not manually clicked through. Please sanity-check the actual UI after merging.

New /users route (client-side gated on plain isAdmin, no PRO_FEATURE
license check) backed by pkg/routes/api/v1/docsalesadmin from #14.
Mirrors views/admin/UsersView.vue's list/search/create/status/delete
flow against /docsales-admin/users instead of /admin/users, minus the
is_admin toggle and password management (those stay admin-panel-only).

Adds a "migrate tasks" action per user: search the already-loaded user
list, pick a destination, confirm - reassigns every task the source
user created or is assigned to, via the new migrate-to endpoint.

Depends on #14 merging first; the routes this hits don't exist on
main yet.
@github-actions

Copy link
Copy Markdown

Preview Deployment

Preview deployments for this PR are available at:

URL Tag Commit
https://pr-15.preview.vikunja.dev ghcr.io/docsales/vikunja:pr-15 latest
https://sha-5427ac376323bb2ffbfe1a39eda8666352b23841.preview.vikunja.dev ghcr.io/docsales/vikunja:sha-5427ac376323bb2ffbfe1a39eda8666352b23841 5427ac3

The preview environment will start automatically on first visit. Subsequent pushes to this PR will update the pr-15 image — the preview picks up the new version on restart. The per-commit URLs point to a specific version and will not change.

Run locally with Docker
docker pull ghcr.io/docsales/vikunja:pr-15
docker run -p 3456:3456 ghcr.io/docsales/vikunja:pr-15

Last updated for commit 5427ac3

Matches the project's logical-properties stylelint rule
(csstools/use-logical), same convention already used elsewhere
(margin-block-end, inset-block-start, etc.). CI caught this on #15.
@kigiela kigiela changed the title feat(frontend): add /users page for the new unlicensed admin routes feat(frontend): add /users page for fork-specific user management Jul 19, 2026
@kigiela
kigiela merged commit c2fca0c into feat/docsales-admin-users Jul 19, 2026
38 checks passed
kigiela added a commit that referenced this pull request Jul 20, 2026
… (#20)

* feat(frontend): add /users page for the new unlicensed admin routes

New /users route (client-side gated on plain isAdmin, no PRO_FEATURE
license check) backed by pkg/routes/api/v1/docsalesadmin from #14.
Mirrors views/admin/UsersView.vue's list/search/create/status/delete
flow against /docsales-admin/users instead of /admin/users, minus the
is_admin toggle and password management (those stay admin-panel-only).

Adds a "migrate tasks" action per user: search the already-loaded user
list, pick a destination, confirm - reassigns every task the source
user created or is assigned to, via the new migrate-to endpoint.

Depends on #14 merging first; the routes this hits don't exist on
main yet.

* fix(frontend): use max-block-size instead of max-height

Matches the project's logical-properties stylelint rule
(csstools/use-logical), same convention already used elsewhere
(margin-block-end, inset-block-start, etc.). CI caught this on #15.
kigiela added a commit that referenced this pull request Jul 20, 2026
#21)

The docsales-admin create-user form (PR #14/#15) has no language field,
so CreateUserBody.Language is always sent empty - and the shared
"language" govalidator tag treated empty as invalid, rejecting every
request from that form with a generic "invalid data" error.

Treat an empty language as "not specified" (valid, left as-is) instead
of a validation failure. Non-empty values are still checked against the
registered translations exactly as before - this only affects callers
that omit the field entirely, matching how user creation already
behaves elsewhere (e.g. the CLI's `user create` command never sets a
language either).
kigiela added a commit that referenced this pull request Jul 20, 2026
Resolved and removed: instance-admin bootstrap, Marcelo/Gustavo/Rafael
account migrations, PR #15 QA pass. Recorded: PRs #20-24, the upstream
ClickUp migrator PR, and the full ClickUp reimport's discoveries and
fixes (missing tasks, dropped assignees, missing project sharing, two
separate Cloudflare issues, and the title-update field-wipe bug and its
recovery).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant