Feature: Allow editing claimed items in admin view
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user