Feature: Allow editing claimed items in admin view

This commit is contained in:
2025-04-30 10:53:43 -04:00
parent 09afdfe9ef
commit 7522b04334

View File

@@ -187,9 +187,10 @@ const EventAdmin: React.FC = () => {
const handleItemsChange = (e: SelectChangeEvent<string[]>) => { const handleItemsChange = (e: SelectChangeEvent<string[]>) => {
const { value } = e.target; const { value } = e.target;
const newItems = Array.isArray(value) ? value : [];
setEditForm(prev => ({ setEditForm(prev => ({
...prev, ...prev,
items_bringing: Array.isArray(value) ? value : [] items_bringing: newItems
})); }));
}; };
@@ -198,7 +199,39 @@ const EventAdmin: React.FC = () => {
try { try {
await axios.put(`/api/events/${slug}/rsvps/${rsvpToEdit.id}`, editForm); await axios.put(`/api/events/${slug}/rsvps/${rsvpToEdit.id}`, editForm);
setRsvps(rsvps.map((r: RSVP) => r.id === rsvpToEdit.id ? { ...r, ...editForm } : r));
// Update the local state
const updatedRsvps = rsvps.map((r: RSVP) => r.id === rsvpToEdit.id ? { ...r, ...editForm } : r);
// Recalculate claimed items
const claimed = new Set<string>();
updatedRsvps.forEach((rsvp: RSVP) => {
if (Array.isArray(rsvp.items_bringing)) {
rsvp.items_bringing.forEach(item => claimed.add(item));
}
});
// Get all items from the event
let allItems: string[] = [];
if (event?.needed_items) {
try {
allItems = typeof event.needed_items === 'string'
? JSON.parse(event.needed_items)
: Array.isArray(event.needed_items)
? event.needed_items
: [];
} catch (e) {
console.error('Error parsing event needed_items:', e);
}
}
// Update needed and claimed items
const claimedArray = Array.from(claimed);
const availableItems = allItems.filter(item => !claimed.has(item));
setRsvps(updatedRsvps);
setNeededItems(availableItems);
setClaimedItems(claimedArray);
setEditDialogOpen(false); setEditDialogOpen(false);
setRsvpToEdit(null); setRsvpToEdit(null);
} catch (error) { } catch (error) {
@@ -421,34 +454,37 @@ const EventAdmin: React.FC = () => {
/> />
</> </>
)} )}
{neededItems.length > 0 && ( <FormControl fullWidth>
<FormControl fullWidth> <InputLabel>What items are you bringing?</InputLabel>
<InputLabel>What items are you bringing?</InputLabel> <Select
<Select multiple
multiple name="items_bringing"
name="items_bringing" value={editForm.items_bringing}
value={editForm.items_bringing} onChange={handleItemsChange}
onChange={handleItemsChange} input={<OutlinedInput label="What items are you bringing?" />}
input={<OutlinedInput label="What items are you bringing?" />} renderValue={(selected) => (
renderValue={(selected) => ( <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>
<Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}> {Array.isArray(selected) ? selected.map((value) => (
{Array.isArray(selected) ? selected.map((value) => ( <Chip
<Typography key={value} variant="body2"> key={value}
{value} label={value}
</Typography> color="primary"
)) : null} />
</Box> )) : null}
)} </Box>
> )}
{neededItems.map((item) => ( >
<MenuItem key={item} value={item}> {[...new Set([...neededItems, ...editForm.items_bringing])].map((item) => (
<Checkbox checked={editForm.items_bringing.indexOf(item) > -1} /> <MenuItem key={item} value={item}>
<ListItemText primary={item} /> <Checkbox checked={editForm.items_bringing.includes(item)} />
</MenuItem> <ListItemText
))} primary={item}
</Select> secondary={neededItems.includes(item) ? 'Available' : 'Currently assigned'}
</FormControl> />
)} </MenuItem>
))}
</Select>
</FormControl>
</Box> </Box>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>