diff --git a/frontend/src/pages/MeetingDetailPage.jsx b/frontend/src/pages/MeetingDetailPage.jsx index 9b1e416..afbd2f7 100644 --- a/frontend/src/pages/MeetingDetailPage.jsx +++ b/frontend/src/pages/MeetingDetailPage.jsx @@ -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 = () => { {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 ( {isEditing ? setEditActionItemData({...editActionItemData, item: e.target.value})} fullWidth /> : item.item} {isEditing ? setEditActionItemData({...editActionItemData, action: e.target.value})} fullWidth /> : item.action} {isEditing ? : item.owner_name} - {isEditing ? setEditActionItemData({...editActionItemData, due_date: e.target.value})} InputLabelProps={{ shrink: true }} fullWidth /> : item.due_date} + {isEditing ? setEditActionItemData({...editActionItemData, due_date: e.target.value})} InputLabelProps={{ shrink: true }} fullWidth /> : item.due_date} {isEditing ? : item.status} {isEditing ? : (item.attachment_path && downloadFile(item.attachment_path)}>)} {isEditing && attachmentFile && {attachmentFile.name}} - {isEditing ? handleSaveActionItemClick(item.id)}> : {canEditItem && handleEditActionItemClick(item)}>}{canManageMeeting && handleDeleteActionItemClick(item.id)}>}} + {isEditing + ? handleSaveActionItemClick(item.id)}> + // FIX 2: Use a flex container to ensure alignment + : + {canEditThisSpecificItem && handleEditActionItemClick(item)}>} + {canManageMeeting && handleDeleteActionItemClick(item.id)}>} + + } );