Немного исправил сетку графика

This commit is contained in:
dipatrik10
2026-05-25 13:40:22 +03:00
parent f010ffc467
commit c506a905a2
4 changed files with 194 additions and 64 deletions

View File

@@ -81,6 +81,7 @@ export async function initAcademicCalendar() {
let timeSlotScopes = [];
let timeSlotDateAssignments = [];
let activeCalendarDay = null;
let selectedCalendarDayKey = null;
bindEvents();
@@ -521,17 +522,22 @@ export async function initAcademicCalendar() {
}
function renderCalendarGrid(rows) {
activeCalendarDay = null;
selectedCalendarDayKey = null;
const grouped = groupBy(rows, row => row.courseNumber);
calendarGrid.innerHTML = Array.from(grouped.entries()).map(([course, courseRows]) => `
<section class="calendar-course-block">
<div class="calendar-course-header">
<h3>${course} курс</h3>
<span>${courseRows.length} дней</span>
</div>
calendarGrid.innerHTML = Array.from(grouped.entries()).map(([course, courseRows], index) => `
<details class="calendar-course-block" ${index === 0 ? 'open' : ''}>
<summary class="calendar-course-header">
<span class="calendar-course-title">
<span class="calendar-course-chevron" aria-hidden="true"></span>
<span>${course} курс</span>
</span>
<span class="calendar-course-meta">${courseRows.length} дней</span>
</summary>
<div class="calendar-semesters-grid">
${renderCourseSemesters(Number(course), courseRows)}
</div>
</section>
</details>
`).join('');
populateFillCourseSelect();
renderCalendarTotals();
@@ -612,6 +618,7 @@ export async function initAcademicCalendar() {
function openCalendarDayDialog(day) {
activeCalendarDay = day;
selectCalendarDay(day);
calendarDayDialogDate.textContent = `${formatLongDate(day.dataset.date)} (${shortDayLabel(day.dataset.day)})`;
calendarDayDialogCourse.textContent = `${day.dataset.course} курс`;
calendarDayDialogWeek.textContent = `${day.dataset.week} неделя`;
@@ -624,6 +631,7 @@ export async function initAcademicCalendar() {
syncSelects(calendarDayDialogActivitySelect);
syncSelects(calendarDayDialogTimeScopeSelect);
updateCalendarDayDialogSummary(day);
renderCalendarTotals();
calendarDayDialog.classList.add('open');
}
@@ -730,6 +738,17 @@ export async function initAcademicCalendar() {
day.setAttribute('title', `${formatLongDate(day.dataset.date)}, ${shortDayLabel(day.dataset.day)}, ${day.dataset.week} неделя, ${code} - ${activity?.name || ''}`);
}
function selectCalendarDay(day) {
if (!day) return;
selectedCalendarDayKey = calendarDayKey(day);
calendarGrid.querySelectorAll('.calendar-day.is-selected').forEach(item => item.classList.remove('is-selected'));
day.classList.add('is-selected');
}
function calendarDayKey(day) {
return `${day.dataset.course}:${day.dataset.date}`;
}
function buildDefaultGrid(calendar) {
const rows = [];
const dates = enumerateDates(calendar.academicYearStartDate, calendar.academicYearEndDate);
@@ -788,11 +807,18 @@ export async function initAcademicCalendar() {
const key = activity ? activity.code : '-';
counts.set(key, (counts.get(key) || 0) + 1);
});
const selectedDay = selectedCalendarDayKey
? Array.from(calendarGrid.querySelectorAll('.calendar-day')).find(day => calendarDayKey(day) === selectedCalendarDayKey)
: null;
const selectedActivity = selectedDay ? activityById(selectedDay.querySelector('.calendar-day-activity').value) : null;
const selectedCode = selectedActivity?.code || null;
calendarTotals.innerHTML = Array.from(counts.entries())
.sort(([a], [b]) => a.localeCompare(b, 'ru'))
.map(([code, count]) => {
const activity = activityTypes.find(item => item.code === code);
return `<span class="calendar-total-chip" style="--chip-color:${escapeHtml(activity?.colorCode || '#64748b')}">${escapeHtml(code)}: ${count}</span>`;
const selectedClass = selectedCode === code ? ' is-selected' : '';
const suffix = selectedCode === code ? '<span class="calendar-total-selected">выбрано</span>' : '';
return `<span class="calendar-total-chip${selectedClass}" style="--chip-color:${escapeHtml(activity?.colorCode || '#64748b')}">${escapeHtml(code)}: ${count}${suffix}</span>`;
}).join('');
}