LLM GuideMarkdown

Filter

Raw Markdown source for LLM and agent workflows.

# @mycrm-ui/react-table LLM Guide

## 4. Filtering

This guide is for AI agents that need to add column-level filtering to `@mycrm-ui/react-table`.

Use this part when the user wants text search, select filters, or multi-column narrowing.

## Purpose

Separate these two layers:

- filter metadata on each column
- current filter state in the `filter` prop

## Required Inputs

### Column Filter Settings

- `filterType`
- `filterPlaceholder`
- `filterOptions`

```tsx
{
  key: "name",
  label: "Name",
  render: (row) => row.name,
  filterType: "text",
  filterPlaceholder: "Search name...",
}
```

```tsx
{
  key: "role",
  label: "Role",
  render: (row) => row.role,
  filterType: "select",
  filterOptions: [
    { label: "Admin", value: "Admin" },
    { label: "User", value: "User" },
  ],
}
```

### `filter.enabled`

```tsx
filter={{ enabled: true }}
```

### `filter.values`

```tsx
const [filterValues, setFilterValues] = useState<Record<string, string>>({});
```

### `filter.onChange`

```tsx
filter={{
  enabled: true,
  values: filterValues,
  onChange: (colKey, value) =>
    setFilterValues((prev) => ({ ...prev, [colKey]: value })),
}}
```

### `filter.debounce`

Add debounce when text filtering should not react immediately.

## Minimal Pattern

```tsx
<Table
  columns={columns}
  data={rows}
  rowKey={(row) => String(row.id)}
  filter={{
    enabled: true,
    values: filterValues,
    onChange: (colKey, value) =>
      setFilterValues((prev) => ({ ...prev, [colKey]: value })),
    debounce: 300,
  }}
/>
```

## LLM Decision Rules

Use this guide when the request means:

- "Add per-column search"
- "Search by name and filter by role"
- "Show filter inputs under the header"

Then:

1. Decide which columns are filterable.
2. Pick the right filter type for each column.
3. Add filter metadata to columns.
4. Create a `Record<string, string>` state object.
5. Wire the `filter` prop.

## Common Mistakes

- Adding `filter` state without column `filterType`
- Using `select` without `filterOptions`
- Managing all filters as a single string

## Safe Output Template

```tsx
const [filterValues, setFilterValues] = useState<Record<string, string>>({});

<Table
  columns={columns}
  data={rows}
  rowKey={(row) => String(row.id)}
  filter={{
    enabled: true,
    values: filterValues,
    onChange: (colKey, value) =>
      setFilterValues((prev) => ({ ...prev, [colKey]: value })),
  }}
/>
```

## Move To The Next Guide When

- row actions or editing must be combined with filters