This commit is contained in:
beabigegg
2025-08-17 15:34:08 +08:00
parent 0fee703b84
commit e95d98e270

View File

@@ -118,11 +118,15 @@ const MeetingDetailPage = () => {
};
const handleGenerateSummary = async () => {
// FIX 3: Set loading state immediately to give instant feedback
setSummaryTask({ state: 'PENDING', info: 'Initializing summary task...' });
try {
const taskInfo = await summarizeMeeting(meetingId);
setSummaryTask({ ...taskInfo, state: 'PENDING' });
} catch (err) {
setError('Failed to start summary generation.');
// Clear the temporary loading state on error
setSummaryTask(null);
}
};
@@ -263,20 +267,33 @@ const MeetingDetailPage = () => {
<TableBody>
{actionItems.map((item) => {
const isEditing = editingActionItemId === item.id;
const canEditItem = currentUser && (currentUser.role === 'admin' || String(currentUser.id) === String(item.owner_id));
// FIX 1: Correct permission check for editing an action item
const canEditThisSpecificItem = currentUser && (
currentUser.role === 'admin' ||
String(currentUser.id) === String(meeting.created_by_id) ||
String(currentUser.id) === String(item.owner_id)
);
return (
<TableRow key={item.id}>
<TableCell>{isEditing ? <TextField name="item" defaultValue={item.item} onChange={e => setEditActionItemData({...editActionItemData, item: e.target.value})} fullWidth /> : item.item}</TableCell>
<TableCell>{isEditing ? <TextField name="action" defaultValue={item.action} onChange={e => setEditActionItemData({...editActionItemData, action: e.target.value})} fullWidth /> : item.action}</TableCell>
<TableCell>{isEditing ? <FormControl fullWidth><Select name="owner_id" value={editActionItemData.owner_id || ''} onChange={e => setEditActionItemData({...editActionItemData, owner_id: e.target.value})}><MenuItem value=""><em>Unassigned</em></MenuItem>{users.map(u => <MenuItem key={u.id} value={u.id}>{u.username}</MenuItem>)}</Select></FormControl> : item.owner_name}</TableCell>
<TableCell>{isEditing ? <TextField name="due_date" type="date" defaultValue={editActionItemData.due_date} onChange={e => setEditActionItemData({...editActionItemData, due_date: e.target.value})} InputLabelProps={{ shrink: true }} fullWidth /> : item.due_date}</TableCell>
<TableCell>{isEditing ? <TextField name="due_date" type="date" defaultValue={item.due_date} onChange={e => setEditActionItemData({...editActionItemData, due_date: e.target.value})} InputLabelProps={{ shrink: true }} fullWidth /> : item.due_date}</TableCell>
<TableCell>{isEditing ? <Select name="status" value={editActionItemData.status} onChange={e => setEditActionItemData({...editActionItemData, status: e.target.value})} fullWidth><MenuItem value="pending">Pending</MenuItem><MenuItem value="in_progress">In Progress</MenuItem><MenuItem value="completed">Completed</MenuItem></Select> : item.status}</TableCell>
<TableCell>
{isEditing ? <Button component="label" size="small">Upload File<input type="file" hidden onChange={handleFileChange} /></Button> : (item.attachment_path && <IconButton onClick={() => downloadFile(item.attachment_path)}><DownloadIcon /></IconButton>)}
{isEditing && attachmentFile && <Typography variant="caption">{attachmentFile.name}</Typography>}
</TableCell>
<TableCell align="center">
{isEditing ? <Box><IconButton onClick={() => handleSaveActionItemClick(item.id)}><SaveIcon /></IconButton><IconButton onClick={handleCancelActionItemClick}><CancelIcon /></IconButton></Box> : <Box>{canEditItem && <IconButton onClick={() => handleEditActionItemClick(item)}><EditIcon /></IconButton>}{canManageMeeting && <IconButton onClick={() => handleDeleteActionItemClick(item.id)}><DeleteIcon /></IconButton>}</Box>}
{isEditing
? <Box sx={{ display: 'flex', justifyContent: 'center' }}><IconButton onClick={() => handleSaveActionItemClick(item.id)}><SaveIcon /></IconButton><IconButton onClick={handleCancelActionItemClick}><CancelIcon /></IconButton></Box>
// FIX 2: Use a flex container to ensure alignment
: <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', minHeight: 48 }}>
{canEditThisSpecificItem && <IconButton onClick={() => handleEditActionItemClick(item)}><EditIcon /></IconButton>}
{canManageMeeting && <IconButton onClick={() => handleDeleteActionItemClick(item.id)}><DeleteIcon /></IconButton>}
</Box>
}
</TableCell>
</TableRow>
);