diff --git a/prisma/dev.db b/prisma/dev.db index 8b7105c..dffa6de 100644 Binary files a/prisma/dev.db and b/prisma/dev.db differ diff --git a/src/app/story/columns.tsx b/src/app/story/columns.tsx index 285b3b6..dca5bdf 100644 --- a/src/app/story/columns.tsx +++ b/src/app/story/columns.tsx @@ -8,7 +8,7 @@ import { actions } from "app/ui/tables/actions" import { TextInputCell } from "app/ui/tables/inputs/textInput" import { selectCol } from "app/ui/tables/selectColumn" import NumberInputCell from "app/ui/tables/inputs/numberInput" - +import { formSchema } from "app/ui/forms/story" const columnHelper = createColumnHelper() @@ -27,7 +27,8 @@ export const columns: ColumnDef[] = [ ) }, - cell: TextInputCell + cell: TextInputCell, + meta: { formSchema } }, { @@ -46,7 +47,8 @@ export const columns: ColumnDef[] = [ enableColumnFilter: false, cell: NumberInputCell, meta: { - step: 50 + step: 50, + formSchema } }, columnHelper.accessor("genres", { diff --git a/src/app/ui/forms/story.tsx b/src/app/ui/forms/story.tsx index 068731a..665bb92 100644 --- a/src/app/ui/forms/story.tsx +++ b/src/app/ui/forms/story.tsx @@ -3,7 +3,6 @@ import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" -import { Button } from "@/components/ui/button" import { Form, FormControl, @@ -16,18 +15,12 @@ import { import { Input } from "@/components/ui/input" import { toast } from "@/components/ui/use-toast" -import { - Popover, - PopoverContent, -} from "@/components/ui/popover" import { ComponentProps } from "react" import { Genre, Story } from "@prisma/client" import { randomStoryTitle } from "app/lib/shortStoryTitleGenerator" -import { usePathname } from "next/navigation" import GenrePicker from "./genrePicker" -import { StoryWithGenres } from "app/story/page" -const formSchema = z.object({ +export const formSchema = z.object({ id: z.number().optional(), title: z.string().min(2).max(50), word_count: z.coerce.number().min(100), @@ -106,7 +99,7 @@ export default function StoryForm({ genres, createStory, className, existingData Word count - + diff --git a/src/app/ui/tables/data-table.tsx b/src/app/ui/tables/data-table.tsx index cbdc633..09022db 100644 --- a/src/app/ui/tables/data-table.tsx +++ b/src/app/ui/tables/data-table.tsx @@ -253,7 +253,6 @@ export function DataTable({ size="sm" onClick={() => table.previousPage()} disabled={!table.getCanPreviousPage()} - onBlur={true} > Previous diff --git a/src/app/ui/tables/inputs/numberInput.tsx b/src/app/ui/tables/inputs/numberInput.tsx index b1ff43f..b5e0d90 100644 --- a/src/app/ui/tables/inputs/numberInput.tsx +++ b/src/app/ui/tables/inputs/numberInput.tsx @@ -1,52 +1,91 @@ +"use client" import { Input } from "@/components/ui/input"; import { CellContext } from "@tanstack/react-table"; import { updateField } from "app/lib/update"; import { useState } from "react"; import { TableInputContainer } from "./inputContainer"; - +import { z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { toast } from "@/components/ui/use-toast"; +import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; +import { Button } from "@/components/ui/button"; export default function NumberInputCell(props: CellContext) { - let initialValue = props.getValue() - const [value, setValue] = useState(initialValue) const [isActive, setIsActive] = useState(false) const table = props.table.options.meta.tableName const id = props.row.original.id const column = props.column.id const pathname = props.table.options.meta.pathname + let formSchema = props.column.columnDef.meta.formSchema - function handleConfirm() { - if (value === initialValue) { - setIsActive(false) - return + + formSchema = formSchema.pick({ [column]: true }) + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + [column]: props.cell.getValue() } - updateField({ - id, - table, - number: Number(value), - column, - pathname + }) + + + function onSubmit(value: z.infer) { + toast({ + title: "You submitted the following values:", + description: ( +
+          {JSON.stringify(value, null, 2)}
+        
+ ), }) - initialValue = value - setIsActive(false) - } - function handleExit() { - setValue(initialValue) - setIsActive(false) + // updateField({ + // id, + // table, + // number: value[column], + // column, + // pathname + // }) + // setIsActive(false) } + function onErrors(errors) { + toast({ + title: "You have errors", + description: ( +
+          {JSON.stringify(errors, null, 2)}
+        
+ ), + }) + console.log(JSON.stringify(errors)) + } return ( {isActive ? - setValue(e.target.value)} // onBlur={handleClose} - onKeyDown={e => { if (e.code === "Enter") { handleConfirm() } }} - step={props.column.columnDef.meta.step} - /> - :

{value}

+
+ + ( + + + { if (e.code === "Enter") { form.handleSubmit(onSubmit, onErrors) } }} + {...field} + /> + + + )} + /> + + + :

{props.cell.getValue()}

}
)