feat(election): committee meeting UI — schedule/edit drawer, online/offline mode toggle, soft delete

- committee-board: collapsible meetings section per card, Schedule Meeting button, meeting list with status chips and join links
- Meeting form drawer: ONLINE (platform, link, ID, password) vs OFFLINE (venue, address, city) mode toggle
- Actions: edit/complete/cancel for SCHEDULED; delete (soft) for all statuses on active committees
- election.service.ts: getMeetings, scheduleMeeting, updateMeeting, patchMeetingStatus, deleteMeeting
- election-audit-log: meeting action metas (SCHEDULE_MEETING, UPDATE_MEETING, CANCEL_MEETING, COMPLETE_MEETING, DELETE_MEETING + FAILEDs), COMMITTEE entity action list updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jaanu423
2026-07-06 10:18:00 +05:30
co-authored by Claude Sonnet 4.6
parent 3e51eae4b5
commit e952bc546f
5 changed files with 853 additions and 15 deletions
@@ -95,7 +95,15 @@ const DETAIL_LABELS: Record<string, string> = {
committeeId: 'Committee ID',
members: 'Members',
addedIds: 'Added IDs',
removedAppointmentId: 'Removed Appointment ID'
removedAppointmentId: 'Removed Appointment ID',
// Committee Meeting
meetingId: 'Meeting ID',
meetingTitle: 'Meeting Title',
meetingDate: 'Meeting Date',
mode: 'Mode',
platform: 'Platform',
venue: 'Venue',
city: 'City'
};
const ACTION_META: Record<string, { label: string; icon: string; color: string }> = {
@@ -156,7 +164,15 @@ const ACTION_META: Record<string, { label: string; icon: string; color: string }
UPDATE_COMMITTEE: { label: 'Committee Updated', icon: 'edit_note', color: '#2563eb' },
DISSOLVE_COMMITTEE: { label: 'Committee Dissolved', icon: 'group_off', color: '#dc2626' },
ADD_COMMITTEE_MEMBER: { label: 'Member Added', icon: 'group_add', color: '#0891b2' },
REMOVE_COMMITTEE_MEMBER: { label: 'Member Removed', icon: 'person_off', color: '#d97706' }
REMOVE_COMMITTEE_MEMBER: { label: 'Member Removed', icon: 'person_off', color: '#d97706' },
// Committee Meeting
SCHEDULE_MEETING: { label: 'Meeting Scheduled', icon: 'event', color: '#16a34a' },
UPDATE_MEETING: { label: 'Meeting Updated', icon: 'edit_calendar', color: '#2563eb' },
CANCEL_MEETING: { label: 'Meeting Cancelled', icon: 'event_busy', color: '#dc2626' },
COMPLETE_MEETING: { label: 'Meeting Completed', icon: 'event_available', color: '#10b981' },
DELETE_MEETING: { label: 'Meeting Deleted', icon: 'delete_outline', color: '#94a3b8' },
SCHEDULE_MEETING_FAILED: { label: 'Schedule Failed', icon: 'error_outline', color: '#dc2626' },
UPDATE_MEETING_FAILED: { label: 'Update Meeting Failed', icon: 'error_outline', color: '#dc2626' }
};
@Component({
@@ -269,7 +285,14 @@ export class ElectionAuditLogComponent implements OnInit, OnDestroy {
'UPDATE_COMMITTEE',
'DISSOLVE_COMMITTEE',
'ADD_COMMITTEE_MEMBER',
'REMOVE_COMMITTEE_MEMBER'
'REMOVE_COMMITTEE_MEMBER',
'SCHEDULE_MEETING',
'UPDATE_MEETING',
'CANCEL_MEETING',
'COMPLETE_MEETING',
'DELETE_MEETING',
'SCHEDULE_MEETING_FAILED',
'UPDATE_MEETING_FAILED'
]
};