merge in laptop work
Merge branch 'main' of 192.168.0.184:andrzej/subman-nextjs
This commit is contained in:
commit
5de197dfe0
|
@ -3,6 +3,16 @@ import prisma from "./db"
|
||||||
export async function getStories() {
|
export async function getStories() {
|
||||||
return prisma.story.findMany()
|
return prisma.story.findMany()
|
||||||
}
|
}
|
||||||
|
export async function getStoriesWithGenres() {
|
||||||
|
return prisma.story.findMany(
|
||||||
|
{
|
||||||
|
include: {
|
||||||
|
genres: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
}
|
||||||
export async function getPubs() {
|
export async function getPubs() {
|
||||||
return prisma.pub.findMany()
|
return prisma.pub.findMany()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
"use client"
|
"use client"
|
||||||
import { ColumnDef } from "@tanstack/react-table"
|
import { ColumnDef } from "@tanstack/react-table"
|
||||||
import { Story } from "@prisma/client"
|
import { Genre, Story } from "@prisma/client"
|
||||||
import { ArrowUpDown, MoreHorizontal } from "lucide-react"
|
import { ArrowUpDown, MoreHorizontal } from "lucide-react"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
export const columns: ColumnDef<Story>[] = [
|
export const columns: ColumnDef<Story & { genres: Array<Genre> }>[] = [
|
||||||
// {
|
// {
|
||||||
// accessorKey: "id",
|
// accessorKey: "id",
|
||||||
// header: "Id",
|
// header: "Id",
|
||||||
|
@ -22,10 +22,34 @@ export const columns: ColumnDef<Story>[] = [
|
||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "word_count",
|
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",
|
// accessorKey: "deleted",
|
||||||
|
|
|
@ -5,6 +5,8 @@ import {
|
||||||
DropdownMenuCheckboxItem,
|
DropdownMenuCheckboxItem,
|
||||||
DropdownMenuContent,
|
DropdownMenuContent,
|
||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
|
DropdownMenuRadioItem,
|
||||||
|
DropdownMenuRadioGroup
|
||||||
} from "@/components/ui/dropdown-menu"
|
} from "@/components/ui/dropdown-menu"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
|
@ -39,6 +41,7 @@ export function DataTable<TData, TValue>({
|
||||||
columns,
|
columns,
|
||||||
data,
|
data,
|
||||||
}: DataTableProps<TData, TValue>) {
|
}: DataTableProps<TData, TValue>) {
|
||||||
|
console.log(data)
|
||||||
//STATE
|
//STATE
|
||||||
const [sorting, setSorting] = useState<SortingState>([])
|
const [sorting, setSorting] = useState<SortingState>([])
|
||||||
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
|
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
|
||||||
|
@ -64,20 +67,45 @@ export function DataTable<TData, TValue>({
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const [filterBy, setFilterBy] = useState(table.getAllColumns()[0])
|
||||||
|
console.log(filterBy.id)
|
||||||
return (<>
|
return (<>
|
||||||
<div className="flex items-center py-4">
|
<div className="flex items-center py-4">
|
||||||
<Input
|
<div className="">
|
||||||
placeholder="Filter emails..."
|
|
||||||
value={(table.getColumn("email")?.getFilterValue() as string) ?? ""}
|
|
||||||
onChange={(event) =>
|
|
||||||
table.getColumn("email")?.setFilterValue(event.target.value)
|
|
||||||
}
|
|
||||||
className="max-w-sm"
|
|
||||||
/>
|
|
||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button variant="outline" className="ml-auto">
|
<Button variant="outline" className="ml-auto">
|
||||||
Columns
|
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={`${filterBy.id}`}
|
||||||
|
value={(table.getColumn(filterBy.id)?.getFilterValue() as string) ?? ""}
|
||||||
|
onChange={(event) =>
|
||||||
|
table.getColumn(filterBy.id)?.setFilterValue(event.target.value)
|
||||||
|
}
|
||||||
|
className="max-w-sm"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button variant="outline" className="ml-auto">
|
||||||
|
Show/hide
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end">
|
<DropdownMenuContent align="end">
|
||||||
|
|
|
@ -1,116 +1,9 @@
|
||||||
import { Story } from "@prisma/client";
|
import { Story } from "@prisma/client";
|
||||||
import { DataTable } from "./data-table";
|
import { DataTable } from "./data-table";
|
||||||
import { columns } from "./columns";
|
import { columns } from "./columns";
|
||||||
const stories: Story[] = [
|
import { getStoriesWithGenres } from "app/lib/get";
|
||||||
{
|
import { Genre } from "@prisma/client";
|
||||||
id: 0,
|
const stories: Array<Story & { genres: Array<Genre> }> = await getStoriesWithGenres()
|
||||||
word_count: 500,
|
|
||||||
title: "Space Vampire",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Ghost Astronaut",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Elf",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 0,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Vampire",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Ghost Astronaut",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Elf",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 0,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Vampire",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Ghost Astronaut",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Elf",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 0,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Vampire",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Ghost Astronaut",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Elf",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Space Orcs",
|
|
||||||
deleted: 0,
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
word_count: 500,
|
|
||||||
title: "Spooky Space Orcs And Gandalf Too",
|
|
||||||
deleted: 0,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
export default async function Page() {
|
export default async function Page() {
|
||||||
return (
|
return (
|
||||||
<div className="container mx-auto py-10">
|
<div className="container mx-auto py-10">
|
||||||
|
|
Loading…
Reference in New Issue