mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-04 21:04:37 +08:00
## Summary Refactors the dashboard data-grid into a smaller, URL-state-aware primitive and lands several new dashboard surfaces around it: per-user session replays, team-level analytics and payments, and pagination for permission definitions. Also moves session replays out from under `/analytics` to a top-level surface and adds a `project_user.last_active_at` index that the new weekly-active metrics depend on. **Base:** `dev` → **Head:** `refactor/data-grid-and-dashboard-surfaces` **Scope:** 91 files, +5,644 / −1,858. Assets in [this gist](https://gist.github.com/mantrakp04/01bf8db4c71ec7a119b73d6ee60717a7). ## Screenshots Captured from a local dev server (dashboard at `:8101`, dummy project seeded with 26 users). Standard viewport **1920×1200**, widescreen **2560×1440**. ### Users list — data-grid overhaul in context | Light | Dark | | --- | --- | |  |  | Widescreen: | Light | Dark | | --- | --- | |  |  | ### User detail — new session-replays card + weekly metrics | Light | Dark | | --- | --- | |  |  | Widescreen: | Light | Dark | | --- | --- | |  |  | ### Session replays — moved out of `/analytics` | Light | Dark | | --- | --- | |  |  | Widescreen: | Light | Dark | | --- | --- | |  |  | ### Project permissions — new pagination | Light | Dark | | --- | --- | |  |  | Widescreen: | Light | Dark | | --- | --- | |  |  | ### Other migrated surfaces | Page | Light | Dark | | --- | --- | --- | | Project picker |  |  | | Overview / setup |  |  | | Teams list |  |  | | Team permissions |  |  | | API keys |  |  | ### Scroll behaviour — new data-grid on the users list | Light | Dark | | --- | --- | |  |  | ## What's new - **`packages/dashboard-ui-components/src/components/data-grid`** — rewritten. Trimmed `data-grid.tsx` from ~1.7k LOC, split sizing logic into `data-grid-sizing.ts`, added `use-url-state.ts` for URL-synced state, and added `data-grid.test.tsx`. - **Session replays** moved from `…/analytics/replays` to `…/session-replays` (top-level surface). New `user-session-replays.tsx` card on the user detail page; new internal `route.tsx` to feed it. - **Teams** detail page gains `team-analytics.tsx` and `team-payments.tsx`. - **Permissions** — new shared `permission-definitions-pagination.ts` consumed by both project and team permission CRUD routes. - **Backend** — Prisma migration `add_project_user_last_active_at_idx` + a `lastActiveAt` index that backs the new weekly-active metrics. - **Polish** — `editable-input`, `inline-save-discard`, `settings.tsx`, walkthrough steps, and several data-table components touched in line with the data-grid rewrite. ## Notes for reviewers - The data-grid rewrite changes the *shape* of state (now URL-synced), not just internals. Consumers in `apps/dashboard/src/components/data-table/*` were updated to match — please scan those for any missed knobs. - The `analytics/replays` → `session-replays` rename is git-tracked as renames; diffs should be small in those files. - New SDK surface in `packages/template/src/lib/stack-app/session-replays/index.ts` and additions in `admin-app-impl.ts` / `server-app-impl.ts` mean OpenAPI specs (`docs-mintlify/openapi/{admin,client}.json`) regenerate; the diff is mostly mechanical. ## Test plan - [ ] `pnpm typecheck` clean - [ ] `pnpm lint` clean - [ ] Data-grid unit tests pass (`packages/dashboard-ui-components`) - [ ] Manual: users list — column resize, sort, filter, paginate; URL state reflects each change and survives reload - [ ] Manual: user detail — session-replays card lists replays; weekly-metrics card renders without `lastActiveAt` index migration applied (i.e. on a fresh DB) and after applying it - [ ] Manual: project + team permissions — pagination cursor advances and stays consistent under search - [ ] Manual: session-replays top-level page loads; old `/analytics/replays/...` URL path is no longer expected to be linked anywhere <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Session Replays app (embedded mode, search, sorting, share links) * Tabbed Team pages with Team Analytics and Team Payments dashboards * Server-backed cursor pagination, debounced search, and infinite-scroll for teams/users/permissions * **UX** * Permission and member tables refresh after edits; permission creation triggers table refresh * Users list supports sorting by last-active * **Performance** * Index added to speed ProjectUser last-active queries * **Documentation** * API/SDK docs updated for pagination and new query params * Contributor guidance: explicit git-safety rules added (no destructive git ops without consent) * **Tests** * Added e2e tests for pagination and filtering on list endpoints <!-- end of auto-generated comment: release notes by coderabbit.ai -->
121 lines
2.1 KiB
JSON
121 lines
2.1 KiB
JSON
{
|
|
"$schema": "https://turbo.build/schema.json",
|
|
"globalEnv": [
|
|
"STACK_*",
|
|
"CRON_SECRET",
|
|
"NEXT_PUBLIC_*",
|
|
"VITE_*",
|
|
"NEXT_PUBLIC_SENTRY_*",
|
|
"SENTRY_*",
|
|
"VERCEL_GIT_COMMIT_SHA",
|
|
"NEXT_PUBLIC_POSTHOG_*",
|
|
"POSTHOG_*",
|
|
"NODE_ENV",
|
|
"QUETZAL_*",
|
|
"OTEL_*",
|
|
"DISCORD_WEBHOOK_URL",
|
|
"DISCORD_CHANNEL_ID",
|
|
"DISCORD_BOT_TOKEN",
|
|
"ENABLE_EXPERIMENTAL_COREPACK"
|
|
],
|
|
"tasks": {
|
|
"build": {
|
|
"inputs": [
|
|
"$TURBO_DEFAULT$",
|
|
".env",
|
|
".env.local",
|
|
".env.development",
|
|
".env.development.local",
|
|
".env.production",
|
|
".env.production.local",
|
|
"tsdown.config.ts"
|
|
],
|
|
"dependsOn": [
|
|
"^build"
|
|
],
|
|
"outputs": [
|
|
".next",
|
|
"dist/**",
|
|
"lib/**",
|
|
"*.js",
|
|
"*.d.ts",
|
|
"*.d.ts.map"
|
|
],
|
|
"outputLogs": "new-only"
|
|
},
|
|
"docker-build": {
|
|
"inputs": [
|
|
"$TURBO_DEFAULT$",
|
|
".env",
|
|
".env.local",
|
|
".env.development",
|
|
".env.development.local",
|
|
".env.production",
|
|
".env.production.local"
|
|
],
|
|
"dependsOn": [
|
|
"^build"
|
|
],
|
|
"outputs": [
|
|
".next",
|
|
"dist/**",
|
|
"lib/**",
|
|
"*.js",
|
|
"*.d.ts",
|
|
"*.d.ts.map"
|
|
],
|
|
"outputLogs": "new-only"
|
|
},
|
|
"@stackframe/backend#build": {
|
|
"dependsOn": [
|
|
"codegen"
|
|
]
|
|
},
|
|
"clean": {
|
|
"cache": false
|
|
},
|
|
"dev": {
|
|
"persistent": true,
|
|
"cache": false
|
|
},
|
|
"dev:tui": {
|
|
"persistent": true,
|
|
"cache": false
|
|
},
|
|
"start": {
|
|
"persistent": true,
|
|
"cache": false
|
|
},
|
|
"lint": {
|
|
"dependsOn": []
|
|
},
|
|
"codegen": {
|
|
"dependsOn": [
|
|
"^build"
|
|
],
|
|
"cache": false
|
|
},
|
|
"typecheck": {
|
|
"dependsOn": []
|
|
},
|
|
"generate-keys": {
|
|
"cache": false
|
|
},
|
|
"db:migration-gen": {
|
|
"cache": false
|
|
},
|
|
"db:reset": {
|
|
"cache": false
|
|
},
|
|
"db:seed": {
|
|
"cache": false
|
|
},
|
|
"db:init": {
|
|
"cache": false
|
|
},
|
|
"db:migrate": {
|
|
"cache": false
|
|
}
|
|
}
|
|
}
|