feat(calendar): добавлена опция "Все события" по умолчанию

Frontend:
- Добавлена опция "� Все события" в выбор календаря (BigCalendar и AppShell)
- selectedCalendarId === null теперь показывает все события пользователя
- Изменена логика loadEvents: при null используется apiClient.getMyEvents()
- CalendarContext: по умолчанию selectedCalendarId === null (не выбирается первый календарь)
- UX улучшение: пользователь видит все свои события сразу при загрузке страницы
This commit is contained in:
igor_nadein 2026-02-25 00:52:49 +03:00
parent 9908c11c62
commit c1ac38d5ca
3 changed files with 53 additions and 17 deletions

View File

@ -343,17 +343,31 @@ function CalendarCard({
setLoading(true);
setError(null);
// Загружаем обычные события и occurrences параллельно
// Если календарь не выбран (null) - загружаем все события пользователя
if (selectedCalendarId === null) {
const myEventsResult = await apiClient.getMyEvents({
start: formatDateKey(fetchStart),
end: formatDateKey(fetchEnd),
});
if (!cancelled) {
const eventsList = Array.isArray(myEventsResult) ? myEventsResult : (myEventsResult?.results || []);
setEvents(eventsList);
}
return;
}
// Загружаем обычные события и occurrences параллельно для конкретного календаря
const [eventsResult, occurrencesResult] = await Promise.all([
apiClient.getCalendarEvents({
start: formatDateKey(fetchStart),
end: formatDateKey(fetchEnd),
calendar: selectedCalendarId ?? undefined,
calendar: selectedCalendarId,
}),
apiClient.getOccurrences({
start: formatDateKey(fetchStart),
end: formatDateKey(fetchEnd),
calendar: selectedCalendarId ?? undefined,
calendar: selectedCalendarId,
}),
]);
@ -555,10 +569,14 @@ function CalendarCard({
) : (
<div className="flex items-center gap-2">
<select
value={selectedCalendarId || ""}
onChange={(e) => setSelectedCalendarId(Number(e.target.value))}
value={selectedCalendarId === null ? "" : selectedCalendarId}
onChange={(e) => {
const value = e.target.value;
setSelectedCalendarId(value === "" ? null : Number(value));
}}
className="flex-1 rounded-lg border border-gray-300 bg-white px-2.5 py-2 text-xs text-gray-800 outline-none transition focus:border-sky-500 focus:ring-2 focus:ring-sky-100"
>
<option value="">📅 Все события</option>
{calendars.map((cal) => (
<option key={cal.id} value={cal.id}>
{cal.name}

View File

@ -134,11 +134,6 @@ export function BigCalendar() {
// Загрузка событий
const loadEvents = useCallback(async () => {
if (!selectedCalendarId) {
setEvents([]);
return;
}
try {
setLoading(true);
@ -154,7 +149,28 @@ export function BigCalendar() {
const startStr = start.toISOString().split("T")[0];
const endStr = end.toISOString().split("T")[0];
// Загружаем обычные события и occurrences параллельно
// Если календарь не выбран (null) - загружаем все события пользователя
if (!selectedCalendarId) {
const myEventsResult = await apiClient.getMyEvents({
start: startStr,
end: endStr,
});
const eventsList = Array.isArray(myEventsResult) ? myEventsResult : (myEventsResult?.results || []);
const allEvents = eventsList.map((evt: any) => ({
...evt,
start: new Date(evt.start),
end: new Date(evt.end),
allDay: false,
title: evt.rule ? `⟲ ${evt.title}` : evt.title,
}));
setEvents(allEvents);
setLoading(false);
return;
}
// Загружаем обычные события и occurrences параллельно для выбранного календаря
const [eventsResult, occurrencesResult] = await Promise.all([
apiClient.getCalendarEvents({
calendar: selectedCalendarId,
@ -305,10 +321,14 @@ export function BigCalendar() {
) : (
<div className="flex items-center gap-2 flex-1">
<select
value={selectedCalendarId || ""}
onChange={(e) => setSelectedCalendarId(Number(e.target.value))}
value={selectedCalendarId === null ? "" : selectedCalendarId}
onChange={(e) => {
const value = e.target.value;
setSelectedCalendarId(value === "" ? null : Number(value));
}}
className="flex-1 max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 outline-none transition focus:border-sky-500 focus:ring-2 focus:ring-sky-100"
>
<option value="">📅 Все события</option>
{calendars.map((cal) => (
<option key={cal.id} value={cal.id}>
{cal.name}

View File

@ -39,10 +39,8 @@ export function CalendarProvider({ children }: { children: ReactNode }) {
console.log("Загружено календарей:", cals.length, cals);
setCalendars(cals);
// Автоматически выбираем первый календарь только при первой загрузке
if (!initialLoadDone.current && cals.length > 0 && selectedCalendarId === null) {
setSelectedCalendarId(cals[0].id);
}
// По умолчанию показываем "Все события" (selectedCalendarId === null)
// Не выбираем автоматически первый календарь
initialLoadDone.current = true;
} catch (err) {