diff --git a/messages/en.json b/messages/en.json index 424533b..179a93d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -24,7 +24,9 @@ "sms_button_submit": "Send Message", "residents_title": "Residents", "residents_button_new": "New Resident", - "residents_modal_title": "Create a Resident", + "residents_table_edit": "Edit", + "residents_modal_title_new": "Create a Resident", + "residents_modal_title_edit": "Edit Resident", "residents_modal_submit": "Submit", "residents_modal_label_name": "Name", "residents_modal_label_phone": "Phone Number", diff --git a/src/lib/components/Residents/ResidentTable.svelte b/src/lib/components/Residents/ResidentTable.svelte index b9a9261..60caee6 100644 --- a/src/lib/components/Residents/ResidentTable.svelte +++ b/src/lib/components/Residents/ResidentTable.svelte @@ -1,23 +1,34 @@ + + - + + {#if onEdit} + + {/if} @@ -28,6 +39,13 @@ + {#if onEdit} + + {/if} {/each} {/if} diff --git a/src/lib/components/Residents/index.ts b/src/lib/components/Residents/index.ts index 08b406c..a613801 100644 --- a/src/lib/components/Residents/index.ts +++ b/src/lib/components/Residents/index.ts @@ -1 +1,2 @@ export { default as ResidentTable } from './ResidentTable.svelte'; +export * from './ResidentTable.svelte'; diff --git a/src/routes/app/residents/+page.server.ts b/src/routes/app/residents/+page.server.ts index 0f22441..df893b8 100644 --- a/src/routes/app/residents/+page.server.ts +++ b/src/routes/app/residents/+page.server.ts @@ -32,6 +32,11 @@ export const actions = { return fail(400, { error: 'message_missing' }); } + const id = form.get('id'); + if (id && typeof id !== 'string') { + return fail(400, { error: 'invalid_id' }); + } + const name = form.get('name'); if (typeof name !== 'string') { return fail(400, { error: 'invalid_name' }); @@ -47,12 +52,19 @@ export const actions = { return fail(400, { error: 'invalid_phone' }); } - await prisma.resident.create({ - data: { + await prisma.resident.upsert({ + where: { + id: id ?? '', + }, + create: { name: name, phoneNumber: phone, tenantId: event.locals.tenant.id, }, + update: { + name: name, + phoneNumber: phone, + }, }); }, }; diff --git a/src/routes/app/residents/+page.svelte b/src/routes/app/residents/+page.svelte index aa99bf6..363ac24 100644 --- a/src/routes/app/residents/+page.svelte +++ b/src/routes/app/residents/+page.svelte @@ -2,7 +2,7 @@ import { enhance } from '$app/forms'; import { Button, Modal, ModalActions, ModalBody } from '$lib/components/Actions'; import { TextInput } from '$lib/components/DataInput'; - import { ResidentTable } from '$lib/components/Residents'; + import { ResidentTable, type ResidentItem } from '$lib/components/Residents'; import { messages } from '$lib/i18n'; import { Phone, UserRound, UserRoundPlus } from 'lucide-svelte'; import { fade } from 'svelte/transition'; @@ -17,25 +17,42 @@ let residents = $derived(data.residents); - let dialog = $state(undefined); + let dialog: HTMLDialogElement | undefined = $state(undefined); + let form: HTMLFormElement | undefined = $state(undefined); + + let resident: ResidentItem | undefined = $state(undefined); - + { + resident = undefined; + form?.reset(); + }} +>
-

{messages.residents_modal_title()}

+

+ {resident + ? messages.residents_modal_title_edit() + : messages.residents_modal_title_new()} +

-
- + + {#if resident} + + {/if} + {#snippet label()} {messages.residents_modal_label_name()} {/snippet} - + {#snippet label()} {messages.residents_modal_label_phone()} @@ -61,5 +78,11 @@ >
- + { + resident = r; + dialog?.showModal(); + }} + />
# Name Phone Number
{index + 1} {resident.name} {resident.phoneNumber} + +