add definablei, reusable filtering
This commit is contained in:
parent
f3472d2a55
commit
4353536986
|
@ -1,9 +1,9 @@
|
|||
"use client"
|
||||
import { ColumnDef } from "@tanstack/react-table"
|
||||
import { Story } from "@prisma/client"
|
||||
import { Genre, Story } from "@prisma/client"
|
||||
import { ArrowUpDown, MoreHorizontal } from "lucide-react"
|
||||
import { Button } from "@/components/ui/button"
|
||||
export const columns: ColumnDef<Story>[] = [
|
||||
export const columns: ColumnDef<Story & { genres: Array<Genre> }>[] = [
|
||||
// {
|
||||
// accessorKey: "id",
|
||||
// header: "Id",
|
||||
|
@ -22,10 +22,34 @@ export const columns: ColumnDef<Story>[] = [
|
|||
</Button>
|
||||
)
|
||||
},
|
||||
|
||||
},
|
||||
{
|
||||
accessorKey: "word_count",
|
||||
header: "Word Count",
|
||||
header: ({ column }) => {
|
||||
return (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
Word Count
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
)
|
||||
},
|
||||
enableColumnFilter: false
|
||||
},
|
||||
{
|
||||
accessorFn: row => {
|
||||
let unpacked = ""
|
||||
for (let i = 0; i < row.genres.length; i++) {
|
||||
unpacked = unpacked + " " + row.genres[i].name
|
||||
}
|
||||
return unpacked
|
||||
},
|
||||
header: "Genres"
|
||||
|
||||
|
||||
},
|
||||
// {
|
||||
// accessorKey: "deleted",
|
||||
|
|
|
@ -5,6 +5,8 @@ import {
|
|||
DropdownMenuCheckboxItem,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuTrigger,
|
||||
DropdownMenuRadioItem,
|
||||
DropdownMenuRadioGroup
|
||||
} from "@/components/ui/dropdown-menu"
|
||||
import { Input } from "@/components/ui/input"
|
||||
import { useState } from "react"
|
||||
|
@ -39,6 +41,7 @@ export function DataTable<TData, TValue>({
|
|||
columns,
|
||||
data,
|
||||
}: DataTableProps<TData, TValue>) {
|
||||
console.log(data)
|
||||
//STATE
|
||||
const [sorting, setSorting] = useState<SortingState>([])
|
||||
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
|
||||
|
@ -64,13 +67,36 @@ export function DataTable<TData, TValue>({
|
|||
},
|
||||
})
|
||||
|
||||
const [filterBy, setFilterBy] = useState(table.getAllColumns()[0])
|
||||
console.log(filterBy.id)
|
||||
return (<>
|
||||
<div className="flex items-center py-4">
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="outline" className="ml-auto">
|
||||
Filter by
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align="end">
|
||||
<DropdownMenuRadioGroup value={filterBy} onValueChange={setFilterBy} >
|
||||
{table
|
||||
.getAllColumns()
|
||||
.filter((column) => column.getCanFilter())
|
||||
.map((column) => {
|
||||
return (
|
||||
<DropdownMenuRadioItem value={column} className="capitalize" key={column.id}>
|
||||
{column.id}
|
||||
</DropdownMenuRadioItem>
|
||||
)
|
||||
})}
|
||||
</DropdownMenuRadioGroup>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
<Input
|
||||
placeholder="Filter emails..."
|
||||
value={(table.getColumn("email")?.getFilterValue() as string) ?? ""}
|
||||
placeholder={`${filterBy.id}`}
|
||||
value={(table.getColumn(filterBy.id)?.getFilterValue() as string) ?? ""}
|
||||
onChange={(event) =>
|
||||
table.getColumn("email")?.setFilterValue(event.target.value)
|
||||
table.getColumn(filterBy.id)?.setFilterValue(event.target.value)
|
||||
}
|
||||
className="max-w-sm"
|
||||
/>
|
||||
|
|
Loading…
Reference in New Issue