0%
balqalam Logo
balqalam
FeaturesCommunityPricingDocumentation
Login
  • Introduction
  • Pitch
  • Hogwarts
  • Live Demo
  • MVP
  • Roadmap
  • Launch Sprint
  • PRD
  • Get Started
  • Localhost
  • Architecture
  • Structure
  • Pattern
  • Page
  • Layout
  • Content
  • Types
  • Config
  • Actions
  • Queries
  • Authorization
  • Validation
  • Form
  • Table
  • Detail
  • Card
  • Util
  • Hooks
  • List Params
  • Views
  • README.md
  • ISSUE.md
  • Technology Stack
  • Database
  • File
  • CDN Assets
  • Entry Points
  • Dashboard
  • Authentication
  • Credentials
  • OAuth
  • Flow Diagrams
  • Multi-Tenancy
  • Offline
  • Onboarding
  • Onboarding Videos
  • Add Values
  • Admission
  • Application
  • Attendance
  • Compliance
  • Profile
  • Exams
  • Exam Wizard
  • Timetable
  • Classrooms
  • Notifications
  • Conference
  • LMS (Lumos)
Finance
  • Finance
  • Fee Management
  • Invoice
  • Wallet
  • Salary
  • Payroll
  • Timesheet
  • Expenses
  • Budget
  • Receipt
  • Accounts
  • Banking
  • Reports
  • Dashboard
  • Permissions
  • Messages
  • Integration Flow
  • Provision
  • AI Document Processing
  • Document Intelligence
  • Internationalization
  • Translation
  • Translation Guide
  • Icons
  • Docs Factory
  • Inspiration
  • Listings
  • Teachers
  • Students
  • Catalog
  • Library
  • Contributing
  • Code of conduct
  • GitHub Workflow
  • Database Seeds
  • Database Safety
  • Test Accounts
  • Playwright
  • Prettier
  • Block Rebound
Sales & GTM
  • Marketing Brief
  • Sales
  • Go-to-market
  • Marketing
  • Admission — Feature Spotlight
  • Pilot Program
  • Leads
  • Proposal
  • Outreach Templates
  • Case Study
  • Competitors
  • Landing-page teardown
  • Competitor FAQ
  • Business model
  • Shared economy
  • Traction
Fundraising & Ecosystem
  • Get Support
  • Investor Deck
  • Data Room
  • Investors
  • Accelerators
  • Incubators
  • Grants
  • Sponsors
  • Partners
  • Competitions & Hackathons
  • Universities & Training Centers

List Params

PreviousNext

URL search-param cache for list views via nuqs.

list-params.ts defines the nuqs URL search-param cache for a list view. One cache per feature, exported as <feature>SearchParams plus a co-exported type alias. The pattern is uniform across ~18 files (~22 lines each).

Rules

#Rule
1Name the file list-params.ts — not searchparams.ts, page-params.ts
2Single createSearchParamsCache call per feature
3Export type alias from the parsed cache
4Column filter keys must match accessorKey in columns.tsx
5Always include page, perPage, sort

Canonical example

import {
  createSearchParamsCache,
  parseAsInteger,
  parseAsString,
} from "nuqs/server"
 
import { getSortingStateParser } from "@/components/table/lib/parsers"
 
export const teachersSearchParams = createSearchParamsCache({
  page: parseAsInteger.withDefault(1),
  perPage: parseAsInteger.withDefault(20),
  // column filters (keys must match column accessorKeys)
  name: parseAsString.withDefault(""),
  emailAddress: parseAsString.withDefault(""),
  status: parseAsString.withDefault(""),
  sort: getSortingStateParser().withDefault([]),
})
 
export type TeachersSearch = Awaited<
  ReturnType<typeof teachersSearchParams.parse>
>

Usage in page.tsx

import type { SearchParams } from "nuqs/server"
 
import { teachersSearchParams } from "@/components/.../list-params"
import { Content } from "@/components/.../content"
 
interface PageProps {
  searchParams: Promise<SearchParams>
}
 
export default async function TeachersPage({ searchParams }: PageProps) {
  const parsed = teachersSearchParams.parse(await searchParams)
  return <Content searchParams={parsed} />
}

Usage in content.tsx

import { type TeachersSearch } from "./list-params"
import { getTeacherList } from "./queries"
 
interface ContentProps {
  searchParams: TeachersSearch
}
 
export async function Content({ searchParams }: ContentProps) {
  const { page, perPage, name, status, sort } = searchParams
  const { rows, count } = await getTeacherList(schoolId, {
    page, perPage, search: name, status: status || undefined, sort,
  })
  return <Table data={rows} pageCount={Math.ceil(count / perPage)} />
}

Parser types

ParserTypeUsed for
parseAsIntegernumberpage, perPage
parseAsStringstringColumn filters, search text
getSortingStateParser()SortingStateTable sorting state

Naming

PatternExample
<feature>SearchParamsteachersSearchParams, admissionSearchParams
<Feature>SearchTeachersSearch, AdmissionSearch

Anti-patterns

  • Different filenames — saas-dashboard/billing/validation.ts mixed with Zod, attendance/page-params.ts. Standardise on list-params.ts.
  • Missing list-params.ts (~10 features with tables) — search params defined inline in content.tsx.
  • Search-param parsing inside content.tsx — extract to its own file.

File layout

src/components/<feature>/
  list-params.ts    # Search-param cache (this file)
  content.tsx       # Imports parsed params
  table.tsx         # Syncs with URL state
  columns.tsx       # accessorKeys match list-params keys

See also

  • Pattern
  • Page
  • Content
  • Table
HooksViews

On This Page

RulesCanonical exampleUsage in page.tsxUsage in content.tsxParser typesNamingAnti-patternsFile layoutSee also

Built by Databayt ·

Welcome to balqalam.

A great journey is about to begin.