huge update
This commit is contained in:
1 parent
8072284990
commit
f2c72885a6
123 files changed
+25119
-4984
No files matched your search
@@ -0,0 +1,351 @@
|
||||
/**
|
||||
* Routine management functionality for HOD dashboard
|
||||
*/
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Initialize period filter
|
||||
initPeriodFilter();
|
||||
|
||||
// Initialize action buttons for existing routines
|
||||
initRoutineActionButtons();
|
||||
});
|
||||
|
||||
/**
|
||||
* Initialize period filter buttons
|
||||
*/
|
||||
function initPeriodFilter() {
|
||||
const periodFilterButtons = document.querySelectorAll('#periodFilterButtons button');
|
||||
|
||||
periodFilterButtons.forEach(button => {
|
||||
button.addEventListener('click', function() {
|
||||
// Remove active class from all buttons
|
||||
periodFilterButtons.forEach(btn => btn.classList.remove('active'));
|
||||
// Add active class to clicked button
|
||||
this.classList.add('active');
|
||||
|
||||
// Filter routines based on selected period
|
||||
const selectedPeriod = this.dataset.period;
|
||||
filterRoutineByPeriod(selectedPeriod);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize action buttons for routine rows
|
||||
*/
|
||||
function initRoutineActionButtons() {
|
||||
// Edit buttons
|
||||
document.querySelectorAll('.edit-routine-btn').forEach(btn => {
|
||||
btn.addEventListener('click', function() {
|
||||
const routineId = this.getAttribute('data-routine-id');
|
||||
openEditRoutineModal(routineId);
|
||||
});
|
||||
});
|
||||
|
||||
// Delete buttons
|
||||
document.querySelectorAll('.delete-routine-btn').forEach(btn => {
|
||||
btn.addEventListener('click', function() {
|
||||
const routineId = this.getAttribute('data-routine-id');
|
||||
openDeleteRoutineModal(routineId);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter routine table based on selected period/year
|
||||
*/
|
||||
function filterRoutineByPeriod(selectedPeriod) {
|
||||
const routineRows = document.querySelectorAll('#routineTableBody tr.routine-row');
|
||||
let visibleRows = 0;
|
||||
|
||||
routineRows.forEach(row => {
|
||||
if (selectedPeriod === 'all' || row.dataset.period === selectedPeriod) {
|
||||
row.style.display = '';
|
||||
visibleRows++;
|
||||
} else {
|
||||
row.style.display = 'none';
|
||||
}
|
||||
});
|
||||
|
||||
// Show or hide "no classes" message
|
||||
const noClassesMessage = document.getElementById('noClassesMessage');
|
||||
if (noClassesMessage) {
|
||||
noClassesMessage.style.display = visibleRows === 0 ? 'block' : 'none';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open add routine modal
|
||||
*/
|
||||
function openAddRoutineModal() {
|
||||
const modal = document.getElementById('addRoutineModal');
|
||||
if (modal) {
|
||||
// Reset form
|
||||
document.getElementById('addRoutineForm').reset();
|
||||
|
||||
// Set default period/year based on subject selection
|
||||
const subjectSelect = document.getElementById('subjectId');
|
||||
if (subjectSelect) {
|
||||
subjectSelect.addEventListener('change', function() {
|
||||
const selectedOption = this.options[this.selectedIndex];
|
||||
const periodOrYear = selectedOption.textContent.match(/\((?:Semester|Year) (\d+)\)/);
|
||||
if (periodOrYear && periodOrYear[1]) {
|
||||
document.getElementById('periodOrYear').value = periodOrYear[1];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Show modal
|
||||
modal.style.display = 'block';
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Close add routine modal
|
||||
*/
|
||||
function closeAddRoutineModal() {
|
||||
const modal = document.getElementById('addRoutineModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'none';
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit add routine form
|
||||
*/
|
||||
function submitAddRoutineForm() {
|
||||
const form = document.getElementById('addRoutineForm');
|
||||
if (!form) return;
|
||||
|
||||
// Create form data
|
||||
const formData = new FormData(form);
|
||||
|
||||
// Add course_id from the page
|
||||
const courseId = document.querySelector('#routineSection').getAttribute('data-course-id');
|
||||
if (courseId) {
|
||||
formData.append('course_id', courseId);
|
||||
} else {
|
||||
// If no explicit course ID, use the current course ID from the URL
|
||||
const urlPath = window.location.pathname;
|
||||
const urlMatch = urlPath.match(/\/hod\/(\d+)/);
|
||||
if (urlMatch && urlMatch[1]) {
|
||||
formData.append('course_id', urlMatch[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Validate form
|
||||
const subjectId = formData.get('subject_id');
|
||||
const teacherId = formData.get('teacher_id');
|
||||
const startTime = formData.get('start_time');
|
||||
const endTime = formData.get('end_time');
|
||||
|
||||
if (!subjectId || !teacherId || !startTime || !endTime) {
|
||||
showToast('error', 'Please fill in all required fields');
|
||||
return;
|
||||
}
|
||||
|
||||
// Send request to server
|
||||
fetch('/app/api/hod/routines/', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {
|
||||
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
return response.json().then(data => {
|
||||
throw new Error(data.message || 'Failed to add routine');
|
||||
});
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
showToast('success', 'Routine added successfully');
|
||||
closeAddRoutineModal();
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1000);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error adding routine:', error);
|
||||
showToast('error', error.message || 'Failed to add routine');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Open edit routine modal
|
||||
*/
|
||||
function openEditRoutineModal(routineId) {
|
||||
const modal = document.getElementById('editRoutineModal');
|
||||
if (!modal || !routineId) return;
|
||||
|
||||
// Fetch routine data
|
||||
fetch(`/app/api/hod/routines/${routineId}/`)
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to fetch routine data');
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
// Populate form fields
|
||||
document.getElementById('editRoutineId').value = routineId;
|
||||
document.getElementById('editSubjectId').value = data.subject_id;
|
||||
document.getElementById('editTeacherId').value = data.teacher_id;
|
||||
document.getElementById('editStartTime').value = data.start_time;
|
||||
document.getElementById('editEndTime').value = data.end_time;
|
||||
document.getElementById('editPeriodOrYear').value = data.period_or_year;
|
||||
|
||||
// Show modal
|
||||
modal.style.display = 'block';
|
||||
document.body.style.overflow = 'hidden';
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error fetching routine data:', error);
|
||||
showToast('error', error.message || 'Failed to fetch routine data');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Close edit routine modal
|
||||
*/
|
||||
function closeEditRoutineModal() {
|
||||
const modal = document.getElementById('editRoutineModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'none';
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit edit routine form
|
||||
*/
|
||||
function submitEditRoutineForm() {
|
||||
const form = document.getElementById('editRoutineForm');
|
||||
if (!form) return;
|
||||
|
||||
// Get routine ID
|
||||
const routineId = document.getElementById('editRoutineId').value;
|
||||
if (!routineId) {
|
||||
showToast('error', 'Routine ID is missing');
|
||||
return;
|
||||
}
|
||||
|
||||
// Create form data
|
||||
const formData = new FormData(form);
|
||||
|
||||
// Validate form
|
||||
const subjectId = formData.get('subject_id');
|
||||
const teacherId = formData.get('teacher_id');
|
||||
const startTime = formData.get('start_time');
|
||||
const endTime = formData.get('end_time');
|
||||
|
||||
if (!subjectId || !teacherId || !startTime || !endTime) {
|
||||
showToast('error', 'Please fill in all required fields');
|
||||
return;
|
||||
}
|
||||
|
||||
// Send request to server
|
||||
fetch(`/app/api/hod/routines/${routineId}/`, {
|
||||
method: 'PUT',
|
||||
body: formData,
|
||||
headers: {
|
||||
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
return response.json().then(data => {
|
||||
throw new Error(data.message || 'Failed to update routine');
|
||||
});
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
showToast('success', 'Routine updated successfully');
|
||||
closeEditRoutineModal();
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1000);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error updating routine:', error);
|
||||
showToast('error', error.message || 'Failed to update routine');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Open delete routine modal
|
||||
*/
|
||||
function openDeleteRoutineModal(routineId) {
|
||||
const modal = document.getElementById('deleteRoutineModal');
|
||||
if (!modal || !routineId) return;
|
||||
|
||||
// Set routine ID in the form
|
||||
document.getElementById('deleteRoutineId').value = routineId;
|
||||
|
||||
// Show modal
|
||||
modal.style.display = 'block';
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
|
||||
/**
|
||||
* Close delete routine modal
|
||||
*/
|
||||
function closeDeleteRoutineModal() {
|
||||
const modal = document.getElementById('deleteRoutineModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'none';
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit delete routine form
|
||||
*/
|
||||
function submitDeleteRoutineForm() {
|
||||
const routineId = document.getElementById('deleteRoutineId').value;
|
||||
if (!routineId) {
|
||||
showToast('error', 'Routine ID is missing');
|
||||
return;
|
||||
}
|
||||
|
||||
// Send request to server
|
||||
fetch(`/app/api/hod/routines/${routineId}/`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to delete routine');
|
||||
}
|
||||
showToast('success', 'Routine deleted successfully');
|
||||
closeDeleteRoutineModal();
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1000);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error deleting routine:', error);
|
||||
showToast('error', error.message || 'Failed to delete routine');
|
||||
});
|
||||
}
|
||||
|
||||
// Export functions for use in other files
|
||||
export {
|
||||
filterRoutineByPeriod,
|
||||
openAddRoutineModal,
|
||||
closeAddRoutineModal,
|
||||
submitAddRoutineForm,
|
||||
openEditRoutineModal,
|
||||
closeEditRoutineModal,
|
||||
submitEditRoutineForm,
|
||||
openDeleteRoutineModal,
|
||||
closeDeleteRoutineModal,
|
||||
submitDeleteRoutineForm
|
||||
};
|
||||
Reference in new issue
Block a user