fix: добавлена проверка выбранного календаря в мини-календаре и исправлено отображение многодневных событий

- Добавлена проверка selectedCalendarId при создании события из мини-календаря
  * Теперь при попытке создать событие без выбранного календаря появляется предупреждение
  * selectedCalendarId передается в новое событие вместо null
  * Добавлен useCalendar() хук в AppShell для доступа к selectedCalendarId

- Исправлено отображение многодневных событий в ViewDayEventsModal
  * Изменена логика фильтрации событий: теперь проверяется диапазон [start, end]
  * Многодневные события отображаются для всех промежуточных дней, не только для начала/конца
  * Исправлена проблема, когда события не показывались в промежуточные дни

Проблема: в большом календаре проверка была, в мини-календаре - нет.
Решение: унификация логики создания события с проверкой выбранного календаря.
This commit is contained in:
igor_nadein 2026-02-25 02:10:52 +03:00
parent cd1d0f2a69
commit 1935d18482
2 changed files with 19 additions and 4 deletions

View File

@ -833,6 +833,7 @@ export function PageHeader({ title, subtitle, badge, eyebrow = "Раздел" }:
export function AppShell({ children }: AppShellProps) {
const { user, loading } = useUser();
const { selectedCalendarId } = useCalendar();
const router = useRouter();
const pathname = usePathname();
const isMessageDialogPage = pathname.startsWith('/messages/') && pathname !== '/messages';
@ -882,6 +883,11 @@ export function AppShell({ children }: AppShellProps) {
// Создание события из модала просмотра дня
const handleCreateEventFromDay = useCallback(() => {
if (!selectedCalendarId) {
alert("Сначала выберите календарь");
return;
}
if (!selectedDateForModal) return;
const startDate = new Date(selectedDateForModal);
@ -894,13 +900,13 @@ export function AppShell({ children }: AppShellProps) {
description: "",
start: startDate.toISOString(),
end: endDate.toISOString(),
calendar: null,
calendar: selectedCalendarId,
color_event: "#3498db",
});
setShowDayEventsModal(false);
setShowEventModal(true);
}, [selectedDateForModal]);
}, [selectedCalendarId, selectedDateForModal]);
// Переход к редактированию из модала просмотра
const handleEditFromDetails = useCallback(() => {

View File

@ -27,8 +27,17 @@ export function ViewDayEventsModal({
const capitalizedDate = formattedDate.charAt(0).toUpperCase() + formattedDate.slice(1);
const dayEvents = events.filter(event => {
const eventDate = new Date(event.start);
return eventDate.toDateString() === date.toDateString();
const eventStart = new Date(event.start);
const eventEnd = new Date(event.end);
const selectedDay = new Date(date);
// Сбрасываем время для корректного сравнения дат
eventStart.setHours(0, 0, 0, 0);
eventEnd.setHours(0, 0, 0, 0);
selectedDay.setHours(0, 0, 0, 0);
// Проверяем, попадает ли selectedDay в диапазон [eventStart, eventEnd]
return selectedDay >= eventStart && selectedDay <= eventEnd;
});
// Сортируем события по времени начала