From 5b4e96185919a69a681ca0b4b172660321c0164d Mon Sep 17 00:00:00 2001 From: andrzej Date: Fri, 27 Sep 2024 12:17:37 +0200 Subject: [PATCH] implement 'edit' functionality for pubs --- prisma/dev.db | Bin 69632 -> 69632 bytes src/app/lib/update.ts | 28 +++++++------ src/app/lib/validate.ts | 5 ++- src/app/publication/columns.tsx | 8 ++-- src/app/publication/edit.tsx | 35 ++++++---------- src/app/publication/page.tsx | 2 +- src/app/story/columns.tsx | 4 +- src/app/story/edit.tsx | 6 +-- src/app/submission/columns.tsx | 6 +-- src/app/tailwind.css | 66 ++++++++++++++++++++++--------- src/app/ui/forms/pub.tsx | 14 ++++--- src/app/ui/forms/schemas.ts | 1 + src/app/ui/forms/story.tsx | 7 ++-- src/app/ui/genreBadges.tsx | 2 +- src/app/ui/tables/data-table.tsx | 16 ++++++-- 15 files changed, 117 insertions(+), 83 deletions(-) diff --git a/prisma/dev.db b/prisma/dev.db index e870c4b704b5cea7c66597e7de37bbb807107b97..95ba2517c5cbe638519ed8c09907acddd55b27cd 100644 GIT binary patch delta 1530 zcmZ{iU1(cn7{}k|eB|V`Ip=AccB%B7)6=!s89^epNxPPQ&8=y>rA<=T3t?SigDu8J z(`=;EOgroB)v)C)g`P`t1pA|eQGgNd^@W6FHq6F+WjUikms zJkP_M^Zrg&&PyxjrPU_5{k*XcZohlf8ShLen&^j#V`)Q`#Q+Rv=JOeuG3Hg1$I|&F z4Rm{s*`-;xc26O*P+*tV=*j)%>(jezv0m>lDl0)v)V}_2m0Rpdt$6NC z&$6zwu+T3)H94EHhqAe}{ctX`U>9I8&Z>ZE9=2>}|<(WhpVhFV~o9~dnke6Anl zHiJsV)wB8N8mmDEa221ypYdb-0N3#c+`^Oi626JA;U<2GH}M8O;jU}A<0{vNF6)or zEISBtg0LSXjy@1MA|P;tfM*coIH46J4g*Av1`s%O5Ml%c#2BtIA4n!a28wzR4T1&& zr2=ws<<-FQXVjB>L;z__o*)ROG%l)O$`M|({|dCn{wt;!?E2?zGkE`VuQsl9{M<&3J{8ZkIx&%bm7^m9n8u zR_aEwd~;p3qYl|U!SGq~`wqT^-{ZHW^CS8@p1>FJ9R5PiFW@VGulsPvMRKo@T!#&j zT8H(LScip4tHVMh)nP$$>aaF4>M)CZI;@dwI;@UdI?NXzp!ASWO0z?zcW(#r3nm+U zYfQSCce5 zDXYRjwKCG|rDJ%dH0Xt)(n&AGG^e^rb>|!nnoEyrFi`qKgF)SKsssNvBK(9?l6FxT xE&Z;-h@f5E=&OQTP(9l6&##!JTPh50oc6(8pfe^U7=WYkQ+4;)4LVj5{sLZ8LHz&# delta 1273 zcmah`U1%It6uxI>Zf7Rhnd2rTYm=GDq|IhG5yd2%Y_|Dr3nuMux6uSeg|=I>m_l^c z-K3%PVY7xHf^B0Ky9H5;R6!A=ZZ!{D1oNO)kl=#_X+;8pL8z#CsUmpq9S|P`&%pPc z^PL~gxwCj#S-h;QG{e@5);G5OPi3{c)tAUb)0n`6!PF;|a^5@4MZ!?-GX*M8J5T7&V z)tQup4VcV%Uha%Lb?T{Xq5Qz{6XOj?$vs@pJ~5Zi%(@R{PoK&zIBc0fg8{i&FXuQC zYuzi2d-=SVcOUWcv(q!ezi%#Em?Kv&1{*1<-ag*w%DYXutS)xecAHVN$uv#bSgp3Y z4;$sxa|6Y~{~ETCDe0iRo%xsP6AF>)VP_#TS96rP4X~3b6f%J{^LMM8)8azy2#bO& zlc`NHFT~0{W_KNCK`ZP`&1Bv2YU=z5Q0^WmuUyE-PLmK$0`)$0Jj>rH~nhrCP(=^6Nv1tb(?K4jXo6Fm z_A`>=N++vxX@qMQZReUrhd8BbFvHGD06vMY;8omWYyXNbxwwGe;dM;lHhzrn;5Y2n zW!#Ss;vu|(=kQT>myAVK0X8E&B3Moj3s&ry&sK+EYDKZgR%_d(=m1uDuV0Nq z;|9yhzM2{otRx5gtlcfT>@Ht+;(nRa$L0Ot^!l;g!>(6B3Hx2CAzzLs{5ak(rnsHH zY(;$8YOmf|)7{u}>;*gtU%)?b2XA8u-@~`@3!KN#@Duh^&*CLq#h=*QT)|iICVq=w zqsJZ~fkn#RFg?Q2j&XE5Ia(cT8`>t^Fvm!}z&eh}0fGBC+T8-XI685GeFA%h-or6H z%w{o84GA3N7*7c77Xz&*53Gp5_78qg-5}ME1(uDB@vgR{^{LzXFCX3wYpSAcl0B8L zRA{MnH3CpF2t=_mtHWqOJ=~%ZA|$gis= { +export async function updateSub(data: Sub): Promise { "use server" try { subSchema.parse(data) @@ -53,12 +55,12 @@ export async function updateSub(data: Sub): Promise { return res } catch (error) { console.error(error) - return false + return null } } -export async function updateStory(data: Story & { genres: number[] }): Promise { +export async function updateStory(data: StoryWithGenres): Promise<{ success: string }> { "use server" try { @@ -66,25 +68,25 @@ export async function updateStory(data: Story & { genres: number[] }): Promise { +export async function updatePub(data: PubWithGenres): Promise<{ success: string }> { "use server" try { @@ -93,7 +95,7 @@ export async function updatePub(data: Pub & { genres: number[] }): Promise { +export async function prepStoryData(data: StoryWithGenres): Promise<{ title: string, word_count: number }> { const storyData = structuredClone(data) delete storyData.genres //throw an error if validation fails @@ -18,7 +19,7 @@ export async function prepStoryData(data: Story & { genres: number[] }): Promise return storyData } -export async function prepPubData(data: Pub & { genres: number[] }): Promise { +export async function prepPubData(data: Pub & { genres: number[] }): Promise { const pubData = structuredClone(data) delete pubData.genres pubSchemaTrimmed.safeParse(pubData) diff --git a/src/app/publication/columns.tsx b/src/app/publication/columns.tsx index 5c19fed..bac57ab 100644 --- a/src/app/publication/columns.tsx +++ b/src/app/publication/columns.tsx @@ -2,7 +2,7 @@ import { ColumnDef, createColumnHelper } from "@tanstack/react-table" import { ArrowUpDown, BookType, Clock, Drama, SquareArrowOutUpRight } from "lucide-react" import { Button } from "@/components/ui/button" -import { PubsWithGenres } from "./page" +import { PubWithGenres } from "./page" import { TextInputCell } from "app/ui/tables/inputs/textInput" import { selectCol } from "app/ui/tables/selectColumn" import NumberInputCell from "app/ui/tables/inputs/numberInput" @@ -10,9 +10,9 @@ import { pubSchema } from "app/ui/forms/schemas" import GenrePickerInputCell from "app/ui/tables/inputs/genrePickerInput" -const columnHelper = createColumnHelper() +const columnHelper = createColumnHelper() -export const columns: ColumnDef[] = [ +export const columns: ColumnDef[] = [ selectCol, { accessorKey: "title", @@ -26,7 +26,7 @@ export const columns: ColumnDef[] = [ Title - + ) }, diff --git a/src/app/publication/edit.tsx b/src/app/publication/edit.tsx index d25c862..e7162c8 100644 --- a/src/app/publication/edit.tsx +++ b/src/app/publication/edit.tsx @@ -7,34 +7,23 @@ import { createPub } from "app/lib/create"; import PubForm from "app/ui/forms/pub"; import { Plus } from "lucide-react"; import { useState } from "react"; +import { PubWithGenres } from "./page"; -export default function CreatePubDialog({ genres }: ComponentProps<"div"> & { genres: Genre[] }) { +export default function EditPubDialog({ genres, closeDialog, defaults, dbAction }: ComponentProps<"div"> & { genres: Genre[], closeDialog: () => void, defaults: PubWithGenres, dbAction: (data: PubWithGenres) => Promise<{ success: string }> }) { - const [isOpen, setIsOpen] = useState(false) - function closeDialog() { - setIsOpen(false) - } return ( - - - - - - - Edit publication - Modify an entry for an existing publication. - - - - - + <> + + Edit publication + Modify an entry for an existing publication. + + + + + + - - ) } diff --git a/src/app/publication/page.tsx b/src/app/publication/page.tsx index 2b6c301..c806182 100644 --- a/src/app/publication/page.tsx +++ b/src/app/publication/page.tsx @@ -4,7 +4,7 @@ import { columns } from "./columns"; import { DataTable } from "app/ui/tables/data-table"; import CreatePubDialog from "./create"; -export type PubsWithGenres = Pub & { genres: Array } +export type PubWithGenres = Pub & { genres: Array } diff --git a/src/app/story/columns.tsx b/src/app/story/columns.tsx index 3f92040..c075e44 100644 --- a/src/app/story/columns.tsx +++ b/src/app/story/columns.tsx @@ -25,7 +25,7 @@ export const columns: ColumnDef[] = [ Title - + ) }, @@ -52,7 +52,7 @@ export const columns: ColumnDef[] = [ - + ) }, diff --git a/src/app/story/edit.tsx b/src/app/story/edit.tsx index 423e6f3..b9b9e5a 100644 --- a/src/app/story/edit.tsx +++ b/src/app/story/edit.tsx @@ -1,13 +1,13 @@ "use client" -import { createStory } from "app/lib/create" import { Dialog, DialogHeader, DialogTrigger, DialogContent, DialogClose, DialogTitle, DialogFooter, DialogDescription } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { ComponentProps, useState } from "react"; import { Genre, Story } from "@prisma/client"; import StoryForm from "app/ui/forms/story"; +import { StoryWithGenres } from "./page"; -export default function EditStoryDialog({ genres, closeDialog, defaults }: ComponentProps<"div"> & { genres: Genre[], closeDialog: () => void, defaults: Story }) { +export default function EditStoryDialog({ genres, closeDialog, defaults, dbAction }: ComponentProps<"div"> & { genres: Genre[], closeDialog: () => void, defaults: StoryWithGenres, dbAction: (data: StoryWithGenres) => Promise<{ success: string }> }) { return ( @@ -16,7 +16,7 @@ export default function EditStoryDialog({ genres, closeDialog, defaults }: Compo Edit story Create an entry for a new story i.e. a thing you intend to submit for publication. - + diff --git a/src/app/submission/columns.tsx b/src/app/submission/columns.tsx index 8143d42..e088f20 100644 --- a/src/app/submission/columns.tsx +++ b/src/app/submission/columns.tsx @@ -50,7 +50,7 @@ export const columns: ColumnDef[] = [ return ( @@ -235,6 +244,7 @@ export function DataTable({ const res = await deleteRecords(recordIds, pathname) if (!res) toast({ title: "Oh dear...", description: "Failed to delete." }) if (res) toast({ title: "Successfully deleted records of id:", description: JSON.stringify(recordIds) }) + table.resetRowSelection() router.refresh() setIsDeleteDialogVisible(false) }}>