Skip to main content

Manual Configuration Guide

This guide provides detailed instructions for configuring and implementing the Platform Grid Component in your application.

Basic Grid Setup

1. Grid Component Implementation

import Grid from "~/components/platform/Grid/Server";

export default async function Page() {
return (
<Grid
totalCount={totalCount}
data={items}
config={{
entity: "your_entity",
title: "Your Grid Title",
columns: gridColumns,
}}
/>
);
}

Column Configuration

1. Define Column Structure

Create a separate configuration file (e.g., _config/columns.ts) to manage your grid columns:

const gridColumns = [
{
id: "code",
header: "Code",
accessorKey: "code",
},
{
id: "name",
header: "Name",
accessorKey: "name",
},
// Add more columns as needed
];

// Optional: Define columns to hide on mobile devices
export const TO_HIDE_COLUMNS_WHEN_MOBILE = ["created_date", "updated_date"];

export default gridColumns;

2. Column Properties

Columns are defined using the ColumnDef type from TanStack Table:

import { type ColumnDef } from "@tanstack/react-table";

const gridColumns: ColumnDef[] = [ ... ];

Key column properties:

  • id: Unique identifier for the column
  • header: Display name in the grid header
  • accessorKey: Property name from your data object
  • enableSorting: Enable/disable column sorting (boolean)
  • enableFiltering: Enable/disable column filtering (boolean)
  • cell: Custom cell renderer function (optional)
  • size: Column width (number)
  • minSize: Minimum column width (number)
  • maxSize: Maximum column width (number)

Example with advanced properties:

const gridColumns: ColumnDef[] = [
{
id: "status",
header: "Status",
accessorKey: "status",
enableSorting: true,
enableFiltering: true,
size: 150,
cell: ({ row }) => (
<Badge
variant={row.original.status === "active" ? "success" : "error"}
>
{row.original.status}
</Badge>
)
},
{
id: "created_date",
header: "Created Date",
accessorKey: "created_date",
enableSorting: true,
cell: ({ row }) => formatDate(row.original.created_date)
}
];

Dynamic Data Integration

1. Configure TRPC API Integration

Prerequisites

Important Requirements

Before installing the Platform CLI, ensure you have:

  • TRPC: await api."your custom trpc".items
  • TRPC Relative Path: src/server/api/routers "you can create your own custom trpc"
// Define data fetching parameters
const _pluck = [
"id",
"code",
"name",
"status",
"created_date",
"updated_date",
];

// Fetch data using TRPC
const { items = [], totalCount } = await api.yourEntity.items({
current: +(pagination?.current_page ?? "0"),
limit: +(pagination?.limit_per_page ?? "100"),
entity: "your_entity",
pluck: _pluck,
sorting: sorting?.length ? sorting : defaultSorting,
advance_filters: filters?.advanceFilter?.length ? filters?.advanceFilter : [],
});

2. Search Configuration

searchConfig: {
router: "your_entity",
resolver: "mainGrid",
query_params: {
entity: "your_entity",
pluck: _pluck,
},
}

Advanced Features

1. Sorting Configuration

// _config/sorting.ts
export const defaultSorting = [
{
id: "created_date",
desc: true,
},
];

2. Advanced Filtering

// _config/advanceFilter.ts
export const defaultAdvanceFilter = [
{
id: "status",
operator: "equals",
value: "active",
},
];

3. Mobile Responsiveness

Configure mobile-specific behavior:

config: {
// ... other config
hideColumnsOnMobile: TO_HIDE_COLUMNS_WHEN_MOBILE,
}

4. Custom Features

config: {
// ... other config
enableAutoCreate: false, // Disable automatic creation
defaultValues: {
categories: ["Category1", "Category2"],
},
}

Best Practices

  1. Modular Configuration

    • Keep configurations in separate files
    • Use TypeScript for better type safety
  2. Performance Optimization

    • Implement proper pagination
    • Use pluck to fetch only needed fields
    • Configure appropriate page sizes
  3. Responsive Design

    • Configure mobile-specific column visibility
    • Test grid behavior across different screen sizes
  4. Error Handling

    • Implement proper error boundaries
    • Handle loading and error states

Example Implementation

Here's a complete example combining all the features:

import gridColumns from "./_config/columns";
import defaultAdvanceFilter from "./_config/advanceFilter";
import defaultSorting from "./_config/sorting";

export default async function Page() {
const { sorting, pagination, filters } = (await getGridCacheData()) ?? {};

const headerList = headers();
const pathname = headerList.get("x-pathname") || "";
const [, , main_entity] = pathname.split("/");

const _pluck = ["id", "code", "status", "created_date", "updated_date"];

const { items = [], totalCount } = await api.grid.items({
entity: main_entity!,
pluck: _pluck,
current: +(pagination?.current_page ?? "0"),
limit: +(pagination?.limit_per_page ?? "100"),
sorting: sorting?.length ? sorting : defaultSorting,
advance_filters: filters?.advanceFilter?.length
? filters?.advanceFilter
: [],
});

return (
<Grid
totalCount={totalCount || 0}
data={items}
defaultSorting={defaultSorting}
defaultAdvanceFilter={defaultAdvanceFilter}
config={{
entity: "your_entity",
title: "Your Grid",
columns: gridColumns,
hideColumnsOnMobile: TO_HIDE_COLUMNS_WHEN_MOBILE,
searchConfig: {
router: "your_entity",
resolver: "mainGrid",
query_params: {
entity: "your_entity",
pluck: _pluck,
},
},
}}
/>
);
}