Compare commits
	
		
			3 Commits
		
	
	
		
			0eb09073ca
			...
			9583d0da16
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						9583d0da16 | |
| 
							
							
								
								 | 
						b5b8d8ad09 | |
| 
							
							
								
								 | 
						13a9407caa | 
| 
						 | 
				
			
			@ -1,7 +1,14 @@
 | 
			
		|||
"use server"
 | 
			
		||||
import prisma from "./db"
 | 
			
		||||
export async function getStories() {
 | 
			
		||||
	return prisma.story.findMany()
 | 
			
		||||
	return prisma.story.findMany(
 | 
			
		||||
		{
 | 
			
		||||
			include: {
 | 
			
		||||
				genres: true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
export async function getPubs() {
 | 
			
		||||
	return prisma.pub.findMany()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
      />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,116 +1,8 @@
 | 
			
		|||
import { Story } from "@prisma/client";
 | 
			
		||||
import { DataTable } from "./data-table";
 | 
			
		||||
import { columns } from "./columns";
 | 
			
		||||
const stories: Story[] = [
 | 
			
		||||
  {
 | 
			
		||||
    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",
 | 
			
		||||
    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,
 | 
			
		||||
  },
 | 
			
		||||
]
 | 
			
		||||
import { getStories } from "app/lib/get";
 | 
			
		||||
const stories: Story[] = await getStories()
 | 
			
		||||
export default async function Page() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="container mx-auto py-10">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue