From 827271efc298533ab3f5192a26674a642ac0f19a Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 17 Nov 2024 19:49:39 +0100 Subject: [PATCH] Simplify guest edition by adding status to the dialog --- app/api/guests.tsx | 6 +++--- app/lib/definitions.ts | 3 ++- app/lib/utils.ts | 5 +++++ app/ui/components/guest-form-dialog.tsx | 22 +++++++++++++++++----- app/ui/guests/table.tsx | 15 --------------- 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/app/api/guests.tsx b/app/api/guests.tsx index df218b4..ffd7cf6 100644 --- a/app/api/guests.tsx +++ b/app/api/guests.tsx @@ -25,7 +25,7 @@ export function updateGuest(guest: Guest) { return fetch(`/api/guests/${guest.id}`, { method: 'PUT', - body: JSON.stringify({ guest: { name: guest.name, status: guest.status } }), + body: JSON.stringify({ guest: { name: guest.name, status: guest.status, group_id: guest.groupId } }), headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': getCsrfToken(), @@ -34,10 +34,10 @@ export function updateGuest(guest: Guest) { .catch((error) => console.error(error)); } -export function createGuest(name: string, group_id: string, onCreate?: () => void) { +export function createGuest(guest: Guest, onCreate?: () => void) { fetch("/api/guests", { method: 'POST', - body: JSON.stringify({ name: name, group_id: group_id }), + body: JSON.stringify({ name: guest.name, group_id: guest.groupId, status: guest.status }), headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': getCsrfToken(), diff --git a/app/lib/definitions.ts b/app/lib/definitions.ts index 824bc5f..c897c4b 100644 --- a/app/lib/definitions.ts +++ b/app/lib/definitions.ts @@ -18,7 +18,8 @@ export type Customer = { image_url: string; }; -export type GuestStatus = 'considered' | 'invited' | 'confirmed' | 'declined' | 'tentative'; +export const guestStatuses = ['considered', 'invited', 'confirmed', 'declined', 'tentative'] as const; +export type GuestStatus = typeof guestStatuses[number]; export type Guest = { id?: string; name?: string; diff --git a/app/lib/utils.ts b/app/lib/utils.ts index 4d9ce77..2200ed3 100644 --- a/app/lib/utils.ts +++ b/app/lib/utils.ts @@ -16,6 +16,11 @@ export const getCsrfToken = () => { ?.split("=")[1] || 'unknown'; } +// From https://stackoverflow.com/a/1026087/3607039 +export const capitalize = (val:string) => { + return String(val).charAt(0).toUpperCase() + String(val).slice(1); +} + export const formatDateToLocal = ( dateStr: string, locale: string = 'en-US', diff --git a/app/ui/components/guest-form-dialog.tsx b/app/ui/components/guest-form-dialog.tsx index c9537ce..9da1ff9 100644 --- a/app/ui/components/guest-form-dialog.tsx +++ b/app/ui/components/guest-form-dialog.tsx @@ -3,7 +3,8 @@ 'use client'; import { createGuest, updateGuest } from '@/app/api/guests'; -import { Group, Guest } from '@/app/lib/definitions'; +import { Group, Guest, GuestStatus, guestStatuses } from '@/app/lib/definitions'; +import { capitalize } from '@/app/lib/utils'; import { classNames } from '@/app/ui/components/button'; import { Dialog } from 'primereact/dialog'; import { Dropdown } from 'primereact/dropdown'; @@ -11,7 +12,7 @@ import { FloatLabel } from 'primereact/floatlabel'; import { InputText } from 'primereact/inputtext'; import { useState } from 'react'; -export default function GuestFormDialog({ groups, onCreate, onHide, guest, visible}: { +export default function GuestFormDialog({ groups, onCreate, onHide, guest, visible }: { groups: Group[], onCreate?: () => void, onHide: () => void, @@ -21,26 +22,29 @@ export default function GuestFormDialog({ groups, onCreate, onHide, guest, visib const [name, setName] = useState(guest?.name || ''); const [group, setGroup] = useState(guest?.groupId || null); + const [status, setStatus] = useState(guest?.status || null); function resetForm() { setName(''); setGroup(null); + setStatus(null); } function submitGuest() { - if (!(name && group)) { + if (!(name && group && status)) { return } if (guest?.id !== undefined) { guest.name = name; guest.groupId = group; + guest.status = status; updateGuest(guest).then(() => { resetForm(); onCreate && onCreate(); }); } else { - createGuest(name, group, () => { + guest && createGuest({name: name, groupId: group, status: status}, () => { resetForm(); onCreate && onCreate(); }); @@ -64,7 +68,15 @@ export default function GuestFormDialog({ groups, onCreate, onHide, guest, visib } /> - diff --git a/app/ui/guests/table.tsx b/app/ui/guests/table.tsx index a18dc9a..304c357 100644 --- a/app/ui/guests/table.tsx +++ b/app/ui/guests/table.tsx @@ -14,11 +14,6 @@ export default function guestsTable({ guests, onUpdate, onEdit }: { onUpdate: () => void, onEdit: (guest: Guest) => void }) { - const handleGuestChange = (guest: Guest, status: GuestStatus) => { - guest.status = status; - updateGuest(guest).then(() => onUpdate()); - } - return (
- {guest.status === 'considered' && ()} - {(guest.status === 'invited' || guest.status === 'tentative') && ( - <> - - {guest.status != 'tentative' && } - - - )} { destroyGuest(guest, () => onUpdate()) }} /> onEdit(guest)} />