wedding-planner-frontend/app/ui/components/guest-form-dialog.tsx

91 lines
3.0 KiB
TypeScript
Raw Normal View History

2024-11-17 16:10:01 +01:00
/* Copyright (C) 2024 Manuel Bustillo*/
'use client';
import { AbstractApi } from '@/app/api/abstract-api';
import { Group } from '@/app/lib/group';
import { Guest, GuestSerializer, GuestStatus, guestStatuses } from '@/app/lib/guest';
import { capitalize } from '@/app/lib/utils';
2024-11-17 16:10:01 +01:00
import { classNames } from '@/app/ui/components/button';
import { Dialog } from 'primereact/dialog';
import { Dropdown } from 'primereact/dropdown';
import { FloatLabel } from 'primereact/floatlabel';
import { InputText } from 'primereact/inputtext';
import { useState } from 'react';
export default function GuestFormDialog({ groups, onCreate, onHide, guest, visible }: {
groups: Group[],
onCreate?: () => void,
onHide: () => void,
guest?: Guest,
visible: boolean,
}) {
const [name, setName] = useState(guest?.name || '');
const [group, setGroup] = useState(guest?.groupId || null);
const [status, setStatus] = useState<GuestStatus | null>(guest?.status || null);
const api = new AbstractApi<Guest>();
const serializer = new GuestSerializer();
function resetForm() {
setName('');
setGroup(null);
setStatus(null);
}
2024-11-17 16:10:01 +01:00
2024-11-17 16:32:10 +01:00
function submitGuest() {
if (!(name && group && status)) {
return
}
if (guest?.id !== undefined) {
guest.name = name;
guest.groupId = group;
guest.status = status;
api.update(serializer, guest, () => {
resetForm();
onCreate && onCreate();
});
} else {
api.create(serializer, new Guest(undefined, name, undefined, group, undefined, status), ()=> {
resetForm();
onCreate && onCreate();
});
}
2024-11-17 16:10:01 +01:00
}
return (
<>
2024-12-08 12:45:15 +01:00
<Dialog header="Add guest" visible={visible} style={{ width: '60vw' }} onHide={onHide}>
2024-11-17 16:10:01 +01:00
<div className="card flex justify-evenly py-5">
<FloatLabel>
<InputText id="username" className='rounded-sm' value={name} onChange={(e) => setName(e.target.value)} />
<label htmlFor="username">Username</label>
</FloatLabel>
<FloatLabel>
<Dropdown id="group" className='rounded-sm min-w-32' value={group} onChange={(e) => setGroup(e.target.value)} options={
groups.map((group) => {
return { label: group.name, value: group.id };
})
} />
<label htmlFor="group">Group</label>
</FloatLabel>
<FloatLabel>
<Dropdown id="status" className='rounded-sm min-w-32' value={status} onChange={(e) => setStatus(e.target.value)} options={
guestStatuses.map((status) => {
return { label: capitalize(status), value: status };
})
} />
<label htmlFor="status">Status</label>
</FloatLabel>
<button className={classNames('primary')} onClick={submitGuest} disabled={!(name.length > 0 && group && status)}>
{guest?.id !== undefined ? 'Update' : 'Create'}
</button>
2024-11-17 16:10:01 +01:00
</div>
</Dialog>
</>
);
}