From a7ef17d9bf5b0439c624ca55dbf3af286a560acb Mon Sep 17 00:00:00 2001 From: "[dyad]" Date: Tue, 23 Sep 2025 16:34:26 +0200 Subject: [PATCH] [dyad] Enhanced stock search to filter by partial name, SKU, and category - wrote 2 file(s) + extra files edited outside of Dyad --- src/components/stock/data-table.tsx | 76 +++++++++++++---------------- src/pages/Stock.tsx | 5 +- 2 files changed, 36 insertions(+), 45 deletions(-) diff --git a/src/components/stock/data-table.tsx b/src/components/stock/data-table.tsx index 7c53179..0480cb9 100644 --- a/src/components/stock/data-table.tsx +++ b/src/components/stock/data-table.tsx @@ -13,8 +13,8 @@ import { getSortedRowModel, useReactTable, } from "@tanstack/react-table" -import { Columns } from "lucide-react" +import { Input } from "@/components/ui/input" import { Table, TableBody, @@ -24,42 +24,28 @@ import { TableRow, } from "@/components/ui/table" import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" +import { Columns } from "lucide-react" interface DataTableProps { columns: ColumnDef[] data: TData[] - filterValue: string - onFilterChange: (value: string) => void } export function DataTable({ columns, data, - filterValue, - onFilterChange, }: DataTableProps) { const [sorting, setSorting] = React.useState([]) const [columnFilters, setColumnFilters] = React.useState([]) - const [columnVisibility, setColumnVisibility] = React.useState(() => { - if (typeof window !== 'undefined' && window.innerWidth < 768) { - return { - sku: false, - quantity: false, - status: false, - actions: false, - costPrice: false, - }; - } - return {}; - }); + const [columnVisibility, setColumnVisibility] = React.useState({}) const [rowSelection, setRowSelection] = React.useState({}) + const [globalFilter, setGlobalFilter] = React.useState("") // Global filter state const table = useReactTable({ data, @@ -72,31 +58,41 @@ export function DataTable({ getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, onRowSelectionChange: setRowSelection, + onGlobalFilterChange: setGlobalFilter, state: { sorting, columnFilters, columnVisibility, rowSelection, + globalFilter, // Enable global filtering + }, + globalFilterFn: (row, columnId, filterValue) => { + // Custom global filter function to search across name, sku, and category + const searchValue = filterValue.toLowerCase(); + const rowValue = row.getValue("name")?.toString().toLowerCase() || ""; + const skuValue = row.getValue("sku")?.toString().toLowerCase() || ""; + const categoryValue = row.getValue("category")?.toString().toLowerCase() || ""; + + return ( + rowValue.includes(searchValue) || + skuValue.includes(searchValue) || + categoryValue.includes(searchValue) + ); }, }) - // Sync external filter value with the table's internal state - React.useEffect(() => { - table.getColumn("sku")?.setFilterValue(filterValue) - }, [filterValue, table]) - return ( -
+
onFilterChange(event.target.value)} + placeholder="Search by name, SKU, or category..." + value={globalFilter ?? ""} + onChange={(event) => table.setGlobalFilter(event.target.value)} className="max-w-sm" /> - @@ -124,23 +120,21 @@ export function DataTable({
-
+
{table.getHeaderGroups().map((headerGroup) => ( - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder - ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} - - ) - })} + {headerGroup.headers.map((header) => ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ))} ))} diff --git a/src/pages/Stock.tsx b/src/pages/Stock.tsx index 8ab03d9..65db61d 100644 --- a/src/pages/Stock.tsx +++ b/src/pages/Stock.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from "react" -import { createColumns, StockItem } from "../components/stock/columns" // Changed from 'columns' to 'createColumns' +import { createColumns, StockItem } from "../components/stock/columns" import { DataTable } from "../components/stock/data-table" import { Button } from "@/components/ui/button" import { PlusCircle } from "lucide-react" @@ -19,7 +19,6 @@ const Stock = () => { const [addItemOpen, setAddItemOpen] = useState(false); const [stockItems, setStockItems] = useState([]); const [refreshTrigger, setRefreshTrigger] = useState(0); // State to trigger data refresh - const [filterValue, setFilterValue] = useState(""); // State for filtering const fetchStockItems = useCallback(async () => { try { @@ -81,8 +80,6 @@ const Stock = () => { )