From a9c0df3b36ecddf479f5983a9080b2da9c03e64c Mon Sep 17 00:00:00 2001 From: Kiran Kunigiri Date: Mon, 2 Dec 2024 17:28:47 -0800 Subject: [PATCH] Improved list component - pass typed prisma queries to list component, and use typed model in render function - example of wrapper for list component - list search example - env validation --- bun.lockb | Bin 371776 -> 313276 bytes example-client/src/form/lib/list-header.tsx | 4 +- example-client/src/form/lib/list.tsx | 43 ++++++++++ example-client/src/index.css | 33 +++----- example-client/src/routes/items/$id.tsx | 6 +- example-client/src/routes/items/layout.tsx | 56 ++++++++----- example-client/src/routes/people/$id.tsx | 2 + example-client/src/routes/people/layout.tsx | 85 ++++++++++++++++---- example-client/src/routes/rooms/$id.tsx | 2 +- example-client/src/routes/rooms/layout.tsx | 6 +- example-client/src/utils/utils.ts | 5 ++ example-server/package.json | 16 ++-- example-server/schema.zmodel | 2 +- example-server/src/env.ts | 26 +++--- example-server/src/routers/general.ts | 2 + package.json | 21 ++--- package/src/list/list.tsx | 16 ++-- 17 files changed, 222 insertions(+), 103 deletions(-) create mode 100644 example-client/src/form/lib/list.tsx create mode 100644 example-client/src/utils/utils.ts diff --git a/bun.lockb b/bun.lockb index 7a5bf12018a8c5795f8a46b8dcd73e867fbee72d..9376a283c58771fd42b4e7e74189612cde948748 100755 GIT binary patch delta 64756 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 RMxh#?IiOqwGtc4D{|646Bl7?N delta 99709 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 Wa>Qmt)Um=%hH}3mqnULzGyV^`i`&!y diff --git a/example-client/src/form/lib/list-header.tsx b/example-client/src/form/lib/list-header.tsx index 74e6fe5..8258880 100644 --- a/example-client/src/form/lib/list-header.tsx +++ b/example-client/src/form/lib/list-header.tsx @@ -27,8 +27,8 @@ export function ListHeader({ title, model, ...overrideProps }: ListHeaderProps) {/* List Header */} -
-

{title}

+
+

{title}

diff --git a/example-client/src/form/lib/list.tsx b/example-client/src/form/lib/list.tsx new file mode 100644 index 0000000..d4e3003 --- /dev/null +++ b/example-client/src/form/lib/list.tsx @@ -0,0 +1,43 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { ScrollArea } from '@mantine/core'; +import { Link } from '@tanstack/react-router'; + +import ListSkeleton from '~client/form/lib/skeleton'; +import type { RouteFullPaths } from '~client/routes/-sidebar'; +import { ZSList, type ZSListProps } from '~zenstack-ui/list/list'; + +interface ListWrapperProps extends ZSListProps { + route: RouteFullPaths + itemId?: number | string + search?: string +} + +function ListWrapper>({ itemId, search, route, ...zsListProps }: ListWrapperProps) { + return ( + + + {...zsListProps} + + // Defaults + skeleton={zsListProps.skeleton ?? } + noResults={zsListProps.noResults ??

No results found

} + + // Render + render={(item: T, id: string | number) => ( + + {zsListProps.render(item, id)} + + )} + /> +
+ ); +} + +export default ListWrapper; diff --git a/example-client/src/index.css b/example-client/src/index.css index d120b79..7cc934a 100644 --- a/example-client/src/index.css +++ b/example-client/src/index.css @@ -30,6 +30,9 @@ body { /* Temp */ --color-hover: light-dark(#eeeeef, #1e1e20); --focus-ring-color: light-dark(#A1A1AA, #D4D4D8); + + /* Layout */ + --list-margin: 1rem } /* Add custom focus ring color for Mantine (used in theme object) */ @@ -51,30 +54,21 @@ div:has(> .tsqd-open-btn) { @apply hidden; } .page { @apply flex size-full; - .left-list { - @apply flex w-2/5 min-w-[40%] max-w-[800px] flex-col border-r border-r-bd-light px-4; - - .left-list__header { - @apply flex items-center justify-between mb-2 mt-3 font-semibold; - } + .list-margin { + @apply mx-[var(--list-margin)]; + } - .left-list__title { - /* @apply mx-4 mb-1 mt-3 text-lg font-semibold; */ - } + .left-list { + @apply flex w-2/5 min-w-[40%] max-w-[800px] flex-col border-r border-r-bd-light; } .right-detail { @apply flex flex-col h-full grow p-4 pb-0 size-full; } - - .form-container { - @apply flex grow flex-col justify-between; - } - } .list-scrollarea { - @apply h-full p-4 py-0; + @apply px-[var(--list-margin)] h-full py-0; } .list-item { @@ -84,12 +78,3 @@ div:has(> .tsqd-open-btn) { @apply hidden; } @apply bg-bd-light; } } - -/* Form Section Gap */ -.form-section > div:not(:first-child) { - @apply mt-4; -} - -.custom-form .mantine-Checkbox-root { - @apply mt-2; -} diff --git a/example-client/src/routes/items/$id.tsx b/example-client/src/routes/items/$id.tsx index 4a76ddd..b1d74cf 100644 --- a/example-client/src/routes/items/$id.tsx +++ b/example-client/src/routes/items/$id.tsx @@ -22,7 +22,7 @@ function ItemsDetail() { const id = Number(params.id); return ( -
+
@@ -48,8 +48,8 @@ function ItemsDetail() { return (
- - + +
); } diff --git a/example-client/src/routes/items/layout.tsx b/example-client/src/routes/items/layout.tsx index 5af252d..00cb096 100644 --- a/example-client/src/routes/items/layout.tsx +++ b/example-client/src/routes/items/layout.tsx @@ -1,17 +1,30 @@ +import { ScrollArea, TextInput } from '@mantine/core'; import { createFileRoute, Link, Outlet } from '@tanstack/react-router'; +import { modelNames } from '~client/form/form-config'; +import ListWrapper from '~client/form/lib/list'; import { ListHeader } from '~client/form/lib/list-header'; import ListSkeleton from '~client/form/lib/skeleton'; -import type { ItemSchema } from '~zenstack/zod/models'; -import { ZenstackList } from '~zenstack-ui/list/list'; +import { validateSearch } from '~client/utils/utils'; +import type { Prisma } from '~zenstack/models'; +import { ZSList } from '~zenstack-ui/list/list'; export const Route = createFileRoute('/items')({ component: ItemsLayout, + validateSearch, }); function ItemsLayout() { const params = Route.useParams() as { id?: number }; const itemId = Number(params.id); + const search = Route.useSearch(); + const navigate = Route.useNavigate(); + + const itemQuery = { + include: {}, + where: { name: { contains: search.search, mode: 'insensitive' } }, + } satisfies Prisma.ItemFindManyArgs; + type ItemPayload = Prisma.ItemGetPayload; return (
@@ -19,27 +32,34 @@ function ItemsLayout() { {/* List View */}
- {/* Header */} - +
+ {/* Header */} + + + {/* Search Input */} + navigate({ search: { search: e.target.value } })} + className="mb-4" + /> +
- {/* This is not much better than manually calling the hook */} - {/* It will be improved when we add automatic filters, infinite scroll, etc. */} - - model="Item" - skeleton={} + {/* List */} + + model={modelNames.item} + query={itemQuery} + route="/items/$id" + itemId={itemId} + search={search.search} render={item => ( - + <>

{item.name}

-

{item.category}

- +

{item.ownerName}, {item.category}

+ )} /> +
{/* Detail View */} diff --git a/example-client/src/routes/people/$id.tsx b/example-client/src/routes/people/$id.tsx index d78b162..043ec2e 100644 --- a/example-client/src/routes/people/$id.tsx +++ b/example-client/src/routes/people/$id.tsx @@ -3,9 +3,11 @@ import { createFileRoute } from '@tanstack/react-router'; import { modelNames } from '~client/form/form-config'; import { DetailHeader } from '~client/form/lib/detail-header'; import MZSUpdateForm from '~client/form/lib/mantine-update-form'; +import { validateSearch } from '~client/utils/utils'; export const Route = createFileRoute('/people/$id')({ component: PeopleDetail, + validateSearch, }); function PeopleDetail() { diff --git a/example-client/src/routes/people/layout.tsx b/example-client/src/routes/people/layout.tsx index 603e05a..f9532e3 100644 --- a/example-client/src/routes/people/layout.tsx +++ b/example-client/src/routes/people/layout.tsx @@ -1,38 +1,95 @@ +import { Button, ScrollArea, TextInput } from '@mantine/core'; import { createFileRoute, Link, Outlet } from '@tanstack/react-router'; +import { modelNames } from '~client/form/form-config'; +import ListWrapper from '~client/form/lib/list'; import { ListHeader } from '~client/form/lib/list-header'; import ListSkeleton from '~client/form/lib/skeleton'; -import type { PersonSchema } from '~zenstack/zod/models'; -import { ZenstackList } from '~zenstack-ui/list/list'; +import { validateSearch } from '~client/utils/utils'; +import { useCreateManyPerson } from '~zenstack/hooks'; +import { type Prisma } from '~zenstack/models'; +import { ZSList } from '~zenstack-ui/list/list'; export const Route = createFileRoute('/people')({ component: PeopleLayout, + validateSearch, }); function PeopleLayout() { const params = Route.useParams() as { id?: string }; const name = params.id; + const search = Route.useSearch(); + const navigate = Route.useNavigate(); + + const createManyPerson = useCreateManyPerson(); + + const personQuery = { + include: {}, + where: { name: { contains: search.search, mode: 'insensitive' } }, + } satisfies Prisma.PersonFindManyArgs; + type PersonPayload = Prisma.PersonGetPayload; return (
{/* List View */}
- - - model="Person" - skeleton={} + +
+ {/* Header */} + + + {/* Search Input */} + navigate({ search: { search: e.target.value } })} + className="mb-4" + /> + + {/* Generator */} + +
+ + {/* List */} + + model={modelNames.person} + query={personQuery} + route="/people/$id" + itemId={name} + search={search.search} render={person => ( - + <>

{person.name}

- + )} /> +
{/* Detail View */} diff --git a/example-client/src/routes/rooms/$id.tsx b/example-client/src/routes/rooms/$id.tsx index ca233e5..e1e8ff0 100644 --- a/example-client/src/routes/rooms/$id.tsx +++ b/example-client/src/routes/rooms/$id.tsx @@ -5,7 +5,7 @@ import { useRef } from 'react'; import { modelNames, typedModelFields } from '~client/form/form-config'; import { DetailHeader } from '~client/form/lib/detail-header'; import MZSUpdateForm from '~client/form/lib/mantine-update-form'; -import { CustomRoomCreateSchema, CustomRoomUpdateSchema } from '~server/schemas'; +import { CustomRoomUpdateSchema } from '~server/schemas'; import { ZSCustomField, ZSFieldSlot, type ZSFormRef } from '~zenstack-ui/index'; export const Route = createFileRoute('/rooms/$id')({ diff --git a/example-client/src/routes/rooms/layout.tsx b/example-client/src/routes/rooms/layout.tsx index 71a7787..2b11c80 100644 --- a/example-client/src/routes/rooms/layout.tsx +++ b/example-client/src/routes/rooms/layout.tsx @@ -5,8 +5,8 @@ import { ListHeader } from '~client/form/lib/list-header'; import ListSkeleton from '~client/form/lib/skeleton'; import { trpc } from '~client/main'; import { CustomRoomCreateSchema } from '~server/schemas'; -import { type HouseRoomSchema } from '~zenstack/zod/models'; -import { ZenstackList } from '~zenstack-ui/list/list'; +import { type HouseRoom } from '~zenstack/models'; +import { ZSList } from '~zenstack-ui/list/list'; export const Route = createFileRoute('/rooms')({ component: RoomsLayout, @@ -32,7 +32,7 @@ function RoomsLayout() { - + model={modelNames.houseRoom} skeleton={} render={room => ( diff --git a/example-client/src/utils/utils.ts b/example-client/src/utils/utils.ts new file mode 100644 index 0000000..d94c1eb --- /dev/null +++ b/example-client/src/utils/utils.ts @@ -0,0 +1,5 @@ +// Tanstack Router generic search params +export interface SearchParams { + search: string | undefined +} +export const validateSearch = (search: SearchParams): SearchParams => ({ search: search.search || undefined }); diff --git a/example-server/package.json b/example-server/package.json index 671d3a5..1f98090 100644 --- a/example-server/package.json +++ b/example-server/package.json @@ -6,24 +6,24 @@ "deploy": "bun wrangler deploy" }, "dependencies": { - "@hono/trpc-server": "^0.3.3", - "@neondatabase/serverless": "^0.10.4", - "@prisma/adapter-neon": "^6.0.1", - "@prisma/adapter-pg-worker": "^6.0.1", - "@prisma/client": "^6.0.1", - "@prisma/pg-worker": "^6.0.1", + "@hono/trpc-server": "^0.3.2", + "@neondatabase/serverless": "^0.10.3", + "@prisma/adapter-neon": "^5.22.0", + "@prisma/adapter-pg-worker": "^5.22.0", + "@prisma/client": "^5.22.0", + "@prisma/pg-worker": "^5.22.0", "@trpc/server": "^11.0.0-rc.630", "@zenstackhq/runtime": "^2.9.4", "@zenstackhq/server": "^2.9.4", "dotenv-mono": "^1.3.14", "envalid": "^8.0.0", - "hono": "^4.6.12" + "hono": "^4.6.9" }, "devDependencies": { "@types/node": "22.10.1", "@types/pg": "^8.11.10", "bun-types": "^1.1.38", - "prisma": "^6.0.1", + "prisma": "^5.22.0", "typescript": "~5.7.2", "zenstack": "^2.9.4" } diff --git a/example-server/schema.zmodel b/example-server/schema.zmodel index db3a27a..5db8245 100644 --- a/example-server/schema.zmodel +++ b/example-server/schema.zmodel @@ -15,7 +15,7 @@ plugin zod { generator client { provider = "prisma-client-js" - previewFeatures = ["driverAdapters"] + previewFeatures = ["driverAdapters", "fullTextSearch"] } datasource db { diff --git a/example-server/src/env.ts b/example-server/src/env.ts index bbf976b..ba26256 100644 --- a/example-server/src/env.ts +++ b/example-server/src/env.ts @@ -2,6 +2,9 @@ import { dotenvLoad } from 'dotenv-mono'; import { cleanEnv, url } from 'envalid'; // Check client and example for .dev.vars +const rootEnv = dotenvLoad({ + path: '.env', +}).env; const clientEnv = dotenvLoad({ path: 'example-client/.dev.vars', }).env; @@ -9,16 +12,13 @@ const serverEnv = dotenvLoad({ path: 'example-server/.dev.vars', }).env; -cleanEnv(clientEnv, { - DATABASE_URL: url(), - DIRECT_URL: url(), - VITE_SERVER_URL: url(), - WEBSITE_URL: url(), -}); - -cleanEnv(serverEnv, { - DATABASE_URL: url(), - DIRECT_URL: url(), - VITE_SERVER_URL: url(), - WEBSITE_URL: url(), -}); +// Validate all envs +const envs = [rootEnv, clientEnv, serverEnv]; +for (const env of envs) { + cleanEnv(env, { + DATABASE_URL: url(), + DIRECT_URL: url(), + VITE_SERVER_URL: url(), + WEBSITE_URL: url(), + }); +} diff --git a/example-server/src/routers/general.ts b/example-server/src/routers/general.ts index 31aaa5c..f004e1d 100644 --- a/example-server/src/routers/general.ts +++ b/example-server/src/routers/general.ts @@ -5,6 +5,8 @@ export const generalRouter = t.router({ createRoom: p .input(CustomRoomCreateSchema) .mutation(async ({ input, ctx }) => { + console.log(input); + const prisma = ctx.prisma; await prisma.houseRoom.create({ diff --git a/package.json b/package.json index 7c812c1..5f5aa0f 100644 --- a/package.json +++ b/package.json @@ -7,19 +7,19 @@ "package" ], "scripts": { - "validate-env": "bun run example-server/src/env.ts", - "dev": "bun run --filter '*' dev", - "deploy": "bun run --filter '*' deploy", - "dev:client": "bun run validate-env && cd example-client && bun run dev", - "dev:server": "bun run validate-env && cd example-server && bun run dev", - "deploy:client": "bun run --filter 'example-client' deploy", - "deploy:server": "bun run --filter 'example-server' deploy", - "sync-env": "doppler -p zenstack-ui-demo -c dev secrets download --no-file --format env | tee example-client/.dev.vars example-server/.dev.vars > /dev/null", + "validate-env": "bun example-server/src/env.ts", + "dev": "bun --filter '*' dev", + "deploy": "bun --filter '*' deploy", + "dev:client": "bun validate-env && cd example-client && bun dev", + "dev:server": "bun validate-env && cd example-server && bun dev", + "deploy:client": "bun --filter 'example-client' deploy", + "deploy:server": "bun --filter 'example-server' deploy", + "sync-env": "doppler -p zenstack-ui-demo -c dev secrets download --no-file --format env | tee .env example-client/.dev.vars example-server/.dev.vars > /dev/null", "push-env-to-workers": "cd example-server && doppler secrets --project zenstack-ui-demo --config dev --json | jq -c 'with_entries(.value = .value.computed)' | wrangler secret bulk --name zenstack-ui-demo-server", - "db:push": "bun run db:gen && bunx prisma db push --schema=./example-server/prisma/schema.prisma", + "db:push": "bun db:gen && bunx prisma db push --schema=./example-server/prisma/schema.prisma", "db:gen": "bunx zenstack generate --schema=./example-server/schema.zmodel --no-compile --output ./zenstack && bunx prisma generate --schema=./example-server/prisma/schema.prisma", "db:studio": "bunx prisma studio --schema=./example-server/prisma/schema.prisma", - "reset-node": "rm -rf node_modules && rm -rf example-client/node_modules && rm -rf example-server/node_modules && bun i && bun run db:gen", + "reset-node": "rm -rf node_modules && rm -rf example-client/node_modules && rm -rf example-server/node_modules && bun i && bun db:gen", "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "devDependencies": { @@ -46,6 +46,7 @@ "prisma", "puppeteer", "server", + "workerd", "zenstack" ] } diff --git a/package/src/list/list.tsx b/package/src/list/list.tsx index a9940b4..bcd3621 100644 --- a/package/src/list/list.tsx +++ b/package/src/list/list.tsx @@ -1,29 +1,33 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ + import { UseQueryHook } from '../metadata'; import { useZenstackUIProvider } from '../utils/provider'; import { getIdField, getModelFields } from '../utils/utils'; -export interface ZenstackListProps { +export interface ZSListProps { model: string - render: (item: T) => React.ReactNode + render: (item: T, id: string | number) => React.ReactNode skeleton?: React.ReactNode + query?: any + noResults?: React.ReactNode } -export const ZenstackList = >(props: ZenstackListProps) => { - const { model, render, skeleton } = props; +export const ZSList = >(props: ZSListProps) => { + const { model, render, skeleton, query, noResults } = props; const { hooks, metadata } = useZenstackUIProvider(); const useFindManyHook = hooks[`useFindMany${model}`] as UseQueryHook; - const { data } = useFindManyHook(); + const { data } = useFindManyHook(query); const fields = getModelFields(metadata, model); const idField = getIdField(fields); if (!data) return skeleton || null; + if (data.length === 0) return noResults || null; return ( <> {data.map(item => (
- {render(item)} + {render(item, item[idField.name])}
))}