Files
Student-Management-System-I…/static/js/hod/modals/meeting.js
T
2025-04-20 17:46:30 +05:45

332 lines
13 KiB
JavaScript

import { showToast } from '../utils/notifications.js';
// Meeting status badge helper
function getStatusBadgeClass(status) {
switch (status) {
case 'scheduled':
return 'bg-primary';
case 'completed':
return 'bg-success';
case 'cancelled':
return 'bg-danger';
case 'rescheduled':
return 'bg-warning';
default:
return 'bg-secondary';
}
}
// Meeting Modal Functions
function openAddMeetingModal() {
document.getElementById('addMeetingModal').style.display = 'block';
document.body.style.overflow = 'hidden';
}
function closeAddMeetingModal() {
document.getElementById('addMeetingModal').style.display = 'none';
document.body.style.overflow = '';
document.getElementById('addMeetingForm').reset();
}
function openEditMeetingModal(meetingId) {
fetch(`/app/api/hod/meetings/${meetingId}/`)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok: ' + response.statusText);
}
return response.json();
})
.then(data => {
document.getElementById('editMeetingId').value = meetingId;
document.getElementById('editMeetingDate').value = data.meeting_date;
document.getElementById('editMeetingTime').value = data.meeting_time;
document.getElementById('editDuration').value = data.duration;
document.getElementById('editAgenda').value = data.agenda || '';
document.getElementById('editIsOnline').checked = data.is_online;
document.getElementById('editMeetingLink').value = data.meeting_link || '';
document.getElementById('editNotes').value = data.notes || '';
if (data.is_online) {
document.getElementById('editMeetingLinkContainer').style.display = 'block';
} else {
document.getElementById('editMeetingLinkContainer').style.display = 'none';
}
// Show modal using direct style manipulation
document.getElementById('editMeetingModal').style.display = 'block';
document.body.style.overflow = 'hidden';
})
.catch(error => {
console.error('Error fetching meeting details:', error);
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Error', 'Failed to load meeting details');
} else if (typeof showToast === 'function') {
showToast('error', 'Failed to load meeting details');
} else {
alert('Failed to load meeting details');
}
});
}
function closeEditMeetingModal() {
document.getElementById('editMeetingModal').style.display = 'none';
document.body.style.overflow = '';
document.getElementById('editMeetingForm').reset();
}
function openCancelMeetingModal(meetingId) {
document.getElementById('cancelMeetingId').value = meetingId;
document.getElementById('cancellationReason').value = '';
document.getElementById('cancelMeetingModal').style.display = 'block';
document.body.style.overflow = 'hidden';
}
function closeCancelMeetingModal() {
document.getElementById('cancelMeetingModal').style.display = 'none';
document.body.style.overflow = '';
document.getElementById('cancelMeetingForm').reset();
}
function viewMeetingDetails(meetingId) {
fetch(`/app/api/hod/meetings/${meetingId}/`)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok: ' + response.statusText);
}
return response.json();
})
.then(data => {
document.getElementById('viewMeetingDate').textContent = new Date(data.meeting_date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
document.getElementById('viewMeetingTime').textContent = new Date('1970-01-01T' + data.meeting_time).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });
document.getElementById('viewMeetingDuration').textContent = `${data.duration} minutes`;
document.getElementById('viewMeetingStatus').innerHTML = `<span class="badge ${getStatusBadgeClass(data.status)}">${data.status_display}</span>`;
document.getElementById('viewMeetingAgenda').textContent = data.agenda || 'No agenda available';
document.getElementById('viewMeetingNotes').textContent = data.notes || 'No notes available';
document.getElementById('viewMeetingType').textContent = data.is_online ? 'Online Meeting' : 'In-Person Meeting';
if (data.is_online && data.meeting_link) {
document.getElementById('viewMeetingLinkContainer').style.display = 'block';
document.getElementById('viewMeetingLink').innerHTML = `<a href="${data.meeting_link}" target="_blank">${data.meeting_link}</a>`;
} else {
document.getElementById('viewMeetingLinkContainer').style.display = 'none';
}
// Handle cancellation reason
const cancellationContainer = document.getElementById('viewCancellationReasonContainer');
const cancellationReason = document.getElementById('viewCancellationReason');
if (data.status === 'cancelled' && data.cancellation_reason) {
cancellationContainer.style.display = 'block';
cancellationReason.textContent = data.cancellation_reason;
} else {
cancellationContainer.style.display = 'none';
}
// Set up edit button
const editBtn = document.getElementById('editMeetingBtn');
if (editBtn) {
editBtn.onclick = () => {
closeViewMeetingModal();
openEditMeetingModal(meetingId);
};
}
// Show modal using direct style manipulation
const modal = document.getElementById('viewMeetingModal');
if (modal) {
modal.style.display = 'block';
document.body.style.overflow = 'hidden';
} else {
console.error('Modal element not found!');
alert('Error: Modal element not found in the page.');
}
})
.catch(error => {
console.error('Error fetching meeting details:', error);
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Error', 'Failed to load meeting details');
} else if (typeof showToast === 'function') {
showToast('error', 'Failed to load meeting details');
} else {
alert('Failed to load meeting details');
}
});
}
function closeViewMeetingModal() {
document.getElementById('viewMeetingModal').style.display = 'none';
document.body.style.overflow = '';
}
function submitAddMeetingForm() {
const form = document.getElementById('addMeetingForm');
const formData = new FormData(form);
// IMPORTANT: Ensure meeting_link is always sent and not null
if (!formData.has('meeting_link') || formData.get('meeting_link') === null) {
formData.set('meeting_link', '');
}
fetch('/app/api/hod/meetings/', {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
}
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok: ' + response.statusText);
}
return response.json();
})
.then(data => {
closeAddMeetingModal();
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Success', 'Meeting scheduled successfully');
} else if (typeof showToast === 'function') {
showToast('success', 'Meeting scheduled successfully');
} else {
alert('Meeting scheduled successfully');
}
setTimeout(() => {
location.reload();
}, 1500);
})
.catch(error => {
console.error('Error scheduling meeting:', error);
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Error', 'Failed to schedule meeting. Please try again.');
} else if (typeof showToast === 'function') {
showToast('error', 'Failed to schedule meeting. Please try again.');
} else {
alert('Failed to schedule meeting. Please try again.');
}
});
}
function submitEditMeetingForm() {
const form = document.getElementById('editMeetingForm');
const formData = new FormData(form);
const meetingId = document.getElementById('editMeetingId').value;
// Update is_online to be a string
formData.set('is_online', document.getElementById('editIsOnline').checked ? 'true' : 'false');
// IMPORTANT: Always include meeting_link (empty string if not online) to satisfy NOT NULL constraint
if (!formData.has('meeting_link') || formData.get('meeting_link') === null) {
formData.set('meeting_link', '');
}
// Ensure notes field is included
if (document.getElementById('editNotes')) {
formData.set('notes', document.getElementById('editNotes').value || '');
}
console.log("Submitting edit meeting form for meeting ID:", meetingId);
fetch(`/app/api/hod/meetings/${meetingId}/edit/`, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
}
})
.then(response => {
if (!response.ok) {
return response.text().then(text => {
console.error("Server response:", text);
throw new Error('Server error: ' + response.status);
});
}
return response.json();
})
.then(data => {
// Close modal using direct style manipulation (not Bootstrap)
document.getElementById('editMeetingModal').style.display = 'none';
document.body.style.overflow = '';
document.getElementById('editMeetingForm').reset();
// Show success message
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Success', 'Meeting updated successfully');
} else if (typeof showToast === 'function') {
showToast('success', 'Meeting updated successfully');
} else {
alert('Meeting updated successfully');
}
// Reload the page after a short delay
setTimeout(() => {
location.reload();
}, 1500);
})
.catch(error => {
console.error('Error updating meeting:', error);
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Error', 'Failed to update meeting. Please try again.');
} else if (typeof showToast === 'function') {
showToast('error', 'Failed to update meeting. Please try again.');
} else {
alert('Failed to update meeting. Please try again.');
}
});
}
function submitCancelMeetingForm() {
const form = document.getElementById('cancelMeetingForm');
const formData = new FormData(form);
const meetingId = document.getElementById('cancelMeetingId').value;
fetch(`/app/api/hod/meetings/${meetingId}/cancel/`, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
}
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok: ' + response.statusText);
}
return response.json();
})
.then(data => {
closeCancelMeetingModal();
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Success', 'Meeting cancelled successfully');
} else if (typeof showToast === 'function') {
showToast('success', 'Meeting cancelled successfully');
} else {
alert('Meeting cancelled successfully');
}
setTimeout(() => {
location.reload();
}, 1500);
})
.catch(error => {
console.error('Error cancelling meeting:', error);
if (typeof window.showMessageModal === 'function') {
window.showMessageModal('Error', 'Failed to cancel meeting. Please try again.');
} else if (typeof showToast === 'function') {
showToast('error', 'Failed to cancel meeting. Please try again.');
} else {
alert('Failed to cancel meeting. Please try again.');
}
});
}
// Export functions
export {
getStatusBadgeClass,
openAddMeetingModal,
closeAddMeetingModal,
openEditMeetingModal,
closeEditMeetingModal,
openCancelMeetingModal,
closeCancelMeetingModal,
viewMeetingDetails,
closeViewMeetingModal,
submitAddMeetingForm,
submitEditMeetingForm,
submitCancelMeetingForm
};