From f7c4e0a54a01bbfb7837adeac65d39af6c5ba8a9 Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Mon, 8 Jan 2024 10:22:06 -0500 Subject: [PATCH] Redesign expense form --- package-lock.json | 31 +++++ package.json | 1 + src/components/expense-form.tsx | 219 ++++++++++++++++-------------- src/components/ui/collapsible.tsx | 11 ++ 4 files changed, 163 insertions(+), 99 deletions(-) create mode 100644 src/components/ui/collapsible.tsx diff --git a/package-lock.json b/package-lock.json index ecd5c82a..fcfcbfeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@hookform/resolvers": "^3.3.2", "@prisma/client": "5.6.0", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-hover-card": "^1.0.7", "@radix-ui/react-icons": "^1.3.0", @@ -628,6 +629,36 @@ } } }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", diff --git a/package.json b/package.json index 1c5a53d7..e46173fd 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@hookform/resolvers": "^3.3.2", "@prisma/client": "5.6.0", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-hover-card": "^1.0.7", "@radix-ui/react-icons": "^1.3.0", diff --git a/src/components/expense-form.tsx b/src/components/expense-form.tsx index 3e0909b3..a20bb2c6 100644 --- a/src/components/expense-form.tsx +++ b/src/components/expense-form.tsx @@ -5,11 +5,16 @@ import { Button } from '@/components/ui/button' import { Card, CardContent, - CardFooter, + CardDescription, CardHeader, CardTitle, } from '@/components/ui/card' import { Checkbox } from '@/components/ui/checkbox' +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from '@/components/ui/collapsible' import { Form, FormControl, @@ -31,6 +36,7 @@ import { getExpense, getGroup } from '@/lib/api' import { ExpenseFormValues, expenseFormSchema } from '@/lib/schemas' import { cn } from '@/lib/utils' import { zodResolver } from '@hookform/resolvers/zod' +import { Save, Trash2 } from 'lucide-react' import { useSearchParams } from 'next/navigation' import { useForm } from 'react-hook-form' import { match } from 'ts-pattern' @@ -177,89 +183,52 @@ export function ExpenseForm({ group, expense, onSubmit, onDelete }: Props) { )} /> + + - ( - - Split mode - - - - - Select how to split the expense. - - - )} - /> - + + + + Paid for + + + + Select who the expense was paid for. + + + ( - -
- - Paid for - - - - Select who the expense was paid for. - -
+ {group.participants.map(({ id, name }) => ( @@ -293,7 +262,7 @@ export function ExpenseForm({ group, expense, onSubmit, onDelete }: Props) { }} /> - + {name} @@ -313,7 +282,7 @@ export function ExpenseForm({ group, expense, onSubmit, onDelete }: Props) { participant === id, ), )} - className="text-base w-[80px]" + className="text-base w-[80px] -my-2" type="number" disabled={ !field.value?.some( @@ -379,26 +348,78 @@ export function ExpenseForm({ group, expense, onSubmit, onDelete }: Props) { )} /> + + + + + + + ( + + Split mode + + + + + Select how to split the expense. + + + )} + /> + +
+
- - Creating… : <>Saving…} +
+ Creating… : <>Saving…} + > + + {isCreate ? <>Create : <>Save} + + {!isCreate && onDelete && ( + - {isCreate ? <>Create : <>Save} - - {!isCreate && onDelete && ( - - Delete - - )} - - + + Delete + + )} +
) diff --git a/src/components/ui/collapsible.tsx b/src/components/ui/collapsible.tsx new file mode 100644 index 00000000..9fa48946 --- /dev/null +++ b/src/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent }