@@ -448,26 +448,25 @@ export async function initAcademicCalendar() {
|
||||
}
|
||||
|
||||
async function loadCalendars() {
|
||||
calendarsTbody.innerHTML = '<tr><td colspan="7" class="loading-row">Загрузка...</td></tr>';
|
||||
calendarsTbody.innerHTML = '<tr><td colspan="6" class="loading-row">Загрузка...</td></tr>';
|
||||
try {
|
||||
calendars = await api.get('/api/admin/academic-calendars');
|
||||
renderCalendars();
|
||||
populateEditorCalendarSelect();
|
||||
populateSubjectCalendarSelect();
|
||||
} catch (error) {
|
||||
calendarsTbody.innerHTML = `<tr><td colspan="7" class="loading-row">Ошибка загрузки: ${escapeHtml(error.message)}</td></tr>`;
|
||||
calendarsTbody.innerHTML = `<tr><td colspan="6" class="loading-row">Ошибка загрузки: ${escapeHtml(error.message)}</td></tr>`;
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
function renderCalendars() {
|
||||
if (!calendars.length) {
|
||||
calendarsTbody.innerHTML = '<tr><td colspan="7" class="loading-row">Календарные графики не созданы</td></tr>';
|
||||
calendarsTbody.innerHTML = '<tr><td colspan="6" class="loading-row">Календарные графики не созданы</td></tr>';
|
||||
return;
|
||||
}
|
||||
calendarsTbody.innerHTML = calendars.map(calendar => `
|
||||
<tr>
|
||||
<td>${escapeHtml(buildAcademicCalendarTitle(calendar) || '-')}</td>
|
||||
<td>${escapeHtml(calendar.academicYearTitle || '-')}</td>
|
||||
<td>${escapeHtml(`${calendar.specialtyCode || ''} ${calendar.specialtyName || ''}`.trim() || '-')}</td>
|
||||
<td>${escapeHtml(calendar.specialtyProfileName || '-')}</td>
|
||||
@@ -488,7 +487,6 @@ export async function initAcademicCalendar() {
|
||||
hideAlert('academic-calendar-alert');
|
||||
const payload = {
|
||||
id: calendarIdInput.value ? Number(calendarIdInput.value) : null,
|
||||
title: buildCalendarTitleFromForm(),
|
||||
academicYearId: Number(calendarYearSelect.value),
|
||||
specialtyId: Number(calendarSpecialtySelect.value),
|
||||
specialtyProfileId: Number(calendarProfileSelect.value),
|
||||
@@ -496,7 +494,7 @@ export async function initAcademicCalendar() {
|
||||
courseCount: Number(calendarCourseCountInput.value)
|
||||
};
|
||||
try {
|
||||
if (!payload.title || !payload.academicYearId || !payload.specialtyId
|
||||
if (!payload.academicYearId || !payload.specialtyId
|
||||
|| !payload.specialtyProfileId || !payload.studyFormId || !payload.courseCount) {
|
||||
throw new Error('Заполните все поля календарного графика');
|
||||
}
|
||||
@@ -504,7 +502,7 @@ export async function initAcademicCalendar() {
|
||||
const saved = id
|
||||
? await api.put('/api/admin/academic-calendars/' + id, payload)
|
||||
: await api.post('/api/admin/academic-calendars', payload);
|
||||
const savedTitle = buildAcademicCalendarTitle(saved) || payload.title;
|
||||
const savedTitle = buildAcademicCalendarTitle(saved);
|
||||
showAlert('academic-calendar-alert', `График "${escapeHtml(savedTitle)}" сохранён`, 'success');
|
||||
resetCalendarForm();
|
||||
await loadCalendars();
|
||||
@@ -1126,9 +1124,13 @@ export async function initAcademicCalendar() {
|
||||
viewportHeight: window.innerHeight
|
||||
});
|
||||
calendarDayTooltipPositionAnimation?.cancel();
|
||||
const positionedTransform = `translate3d(${left}px, ${top}px, 0) scale(1)`;
|
||||
calendarDayTooltipPositionAnimation = tooltip.animate(
|
||||
[{ left: `${left}px`, top: `${top}px` }],
|
||||
{ duration: 0, fill: 'forwards' }
|
||||
[
|
||||
{ transform: positionedTransform },
|
||||
{ transform: positionedTransform }
|
||||
],
|
||||
{ duration: 1, fill: 'forwards' }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1515,27 +1517,6 @@ export async function initAcademicCalendar() {
|
||||
|| '';
|
||||
}
|
||||
|
||||
function buildCalendarTitleFromForm() {
|
||||
const specialty = specialties.find(item =>
|
||||
String(item.id) === String(calendarSpecialtySelect.value)
|
||||
);
|
||||
const profile = (profilesBySpecialty.get(String(calendarSpecialtySelect.value)) || [])
|
||||
.find(item => String(item.id) === String(calendarProfileSelect.value));
|
||||
const studyForm = studyForms.find(item =>
|
||||
String(item.id) === String(calendarStudyFormSelect.value)
|
||||
);
|
||||
const academicYear = academicYears.find(item =>
|
||||
String(item.id) === String(calendarYearSelect.value)
|
||||
);
|
||||
|
||||
return buildAcademicCalendarTitle({
|
||||
specialtyCode: specialityCode(specialty),
|
||||
specialtyProfileName: profile?.name,
|
||||
studyFormName: studyForm?.name,
|
||||
academicYearTitle: academicYear?.title
|
||||
});
|
||||
}
|
||||
|
||||
function dayLabel(value) {
|
||||
return DAY_OPTIONS.find(day => String(day.value) === String(value))?.label || '-';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user