@@ -269,6 +269,7 @@ const meta: Meta<typeof DataTableWithBazzaFilters> = {
269269 } ,
270270 } ,
271271 } ,
272+ tags : [ 'autodocs' ] ,
272273} ;
273274
274275export default meta ;
@@ -282,6 +283,136 @@ export const ServerDriven: Story = {
282283 story :
283284 'Demonstrates server-side filtering (via loader), pagination, and sorting with Bazza UI components and URL state synchronization.' ,
284285 } ,
286+ source : {
287+ code : `
288+ import { useMemo } from 'react';
289+ import { type LoaderFunctionArgs, useLoaderData } from 'react-router';
290+ import { useSearchParams } from 'react-router-dom';
291+ import {
292+ DataTable,
293+ DataTableFilter,
294+ useDataTableFilters,
295+ useFilterSync,
296+ useReactTable,
297+ getCoreRowModel,
298+ getPaginationRowModel,
299+ getSortedRowModel,
300+ } from './data-table-stories.helpers';
301+
302+ // --- Data Fetch Handler ---
303+ const handleDataFetch = async ({ request }: LoaderFunctionArgs): Promise<DataResponse> => {
304+ const url = new URL(request.url);
305+ const params = url.searchParams;
306+
307+ // Parse pagination, sorting, and filters from URL
308+ const page = dataTableRouterParsers.page.parse(params.get('page')) ?? 0;
309+ const pageSize = dataTableRouterParsers.pageSize.parse(params.get('pageSize')) ?? 10;
310+ const sortField = params.get('sortField');
311+ const sortOrder = (params.get('sortOrder') || 'asc') as 'asc' | 'desc';
312+ const filtersParam = params.get('filters');
313+
314+ // Parse filters
315+ let parsedFilters = [];
316+ try {
317+ if (filtersParam) {
318+ parsedFilters = filtersArraySchema.parse(JSON.parse(filtersParam));
319+ }
320+ } catch (error) {
321+ console.error('Filter parsing error:', error);
322+ }
323+
324+ // Apply filtering, sorting, pagination to data
325+ let processedData = [...mockDatabase];
326+
327+ // Apply filters, sorting, and pagination logic here...
328+
329+ return {
330+ data: paginatedData,
331+ meta: { total, page, pageSize, pageCount },
332+ facetedCounts,
333+ };
334+ };
335+
336+ function DataTableWithBazzaFilters() {
337+ const loaderData = useLoaderData<DataResponse>();
338+ const [searchParams, setSearchParams] = useSearchParams();
339+
340+ const data = loaderData?.data ?? [];
341+ const pageCount = loaderData?.meta.pageCount ?? 0;
342+ const facetedCounts = loaderData?.facetedCounts ?? {};
343+
344+ // --- Bazza UI Filter Setup ---
345+ const [filters, setFilters] = useFilterSync();
346+
347+ // Read pagination and sorting from URL
348+ const pageIndex = Number.parseInt(searchParams.get('page') ?? '0', 10);
349+ const pageSize = Number.parseInt(searchParams.get('pageSize') ?? '10', 10);
350+ const sortField = searchParams.get('sortField');
351+ const sortOrder = (searchParams.get('sortOrder') || 'asc') as 'asc' | 'desc';
352+
353+ const pagination = { pageIndex, pageSize };
354+ const sorting = sortField ? [{ id: sortField, desc: sortOrder === 'desc' }] : [];
355+
356+ // Event handlers update URL directly
357+ const handlePaginationChange = (updaterOrValue) => {
358+ const next = typeof updaterOrValue === 'function' ? updaterOrValue(pagination) : updaterOrValue;
359+ searchParams.set('page', next.pageIndex.toString());
360+ searchParams.set('pageSize', next.pageSize.toString());
361+ setSearchParams(searchParams);
362+ };
363+
364+ const handleSortingChange = (updaterOrValue) => {
365+ const next = typeof updaterOrValue === 'function' ? updaterOrValue(sorting) : updaterOrValue;
366+ if (next.length > 0) {
367+ searchParams.set('sortField', next[0].id);
368+ searchParams.set('sortOrder', next[0].desc ? 'desc' : 'asc');
369+ } else {
370+ searchParams.delete('sortField');
371+ searchParams.delete('sortOrder');
372+ }
373+ setSearchParams(searchParams);
374+ };
375+
376+ // Setup filter actions and strategy
377+ const {
378+ columns: filterColumns,
379+ actions,
380+ strategy,
381+ } = useDataTableFilters({
382+ columnsConfig: bazzaProcessedColumns,
383+ filters,
384+ onFiltersChange: setFilters,
385+ faceted: facetedOptionCounts,
386+ strategy: 'server',
387+ data,
388+ });
389+
390+ // TanStack Table Setup
391+ const table = useReactTable({
392+ data,
393+ columns,
394+ pageCount,
395+ state: { pagination, sorting },
396+ onPaginationChange: handlePaginationChange,
397+ onSortingChange: handleSortingChange,
398+ getCoreRowModel: getCoreRowModel(),
399+ getPaginationRowModel: getPaginationRowModel(),
400+ getSortedRowModel: getSortedRowModel(),
401+ manualPagination: true,
402+ manualSorting: true,
403+ });
404+
405+ return (
406+ <div className="space-y-4">
407+ {/* Bazza UI Filter Interface */}
408+ <DataTableFilter columns={filterColumns} filters={filters} actions={actions} strategy={strategy} />
409+
410+ {/* Data Table */}
411+ <DataTable table={table} columns={columns.length} pageCount={pageCount} />
412+ </div>
413+ );
414+ }` ,
415+ } ,
285416 } ,
286417 } ,
287418 render : ( ) => < DataTableWithBazzaFilters /> ,
0 commit comments