From 024d3085ea53f47900e19c25f326c81759152d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 11 Feb 2026 12:18:54 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=83=D0=BD=D0=B8=D1=84=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D0=BA=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0=D1=80=D0=B5=D0=B9=20(legacy=20+=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - calendarManager.js: добавлена функция createLegacyCalendars() для создания pseudo-calendar объектов - loadCalendars() теперь объединяет legacy (Компания, Личный, Отделы) и новые календари в единый массив - calendarWidgetIntegration.js: обновлена логика fetchEventsForVisibleCalendars для работы с legacy ID - legacy-company: все события без фильтров - legacy-personal: события текущего сотрудника (employee_id) - legacy-dept-{id}: события конкретного отдела (department_id) - calendar_desktop.html: удален старый dropdown, оставлен только унифицированный список с чекбоксами - Все календари теперь в одном списке с возможностью выбора через чекбоксы - Цвета: Компания (красный), Личный (синий), Отделы (зеленый), новые календари (свои цвета) --- .../static/js/components/calendarManager.js | 79 ++++++++++++++--- .../components/calendarWidgetIntegration.js | 84 ++++++++++++++----- .../includes/components/calendar_desktop.html | 34 ++------ 3 files changed, 134 insertions(+), 63 deletions(-) diff --git a/backend/static/js/components/calendarManager.js b/backend/static/js/components/calendarManager.js index afc8dc9a..c9ddd887 100644 --- a/backend/static/js/components/calendarManager.js +++ b/backend/static/js/components/calendarManager.js @@ -35,25 +35,78 @@ export function initCalendarManager(options = {}) { let calendars = []; let visibleCalendarIds = new Set(); + /** + * Создать псевдо-календари для legacy режима + * @returns {Array} Legacy календари + */ + function createLegacyCalendars() { + const legacyCalendars = [ + { + id: 'legacy-company', + title: 'Компания', + description: 'Корпоративные события', + color: '#dc3545', + calendar_type: 'company', + is_legacy: true, + is_global: true, + user_can_edit: false, + user_can_view: true, + is_subscribed: true + }, + { + id: 'legacy-personal', + title: 'Личный календарь', + description: 'Мои личные события', + color: '#0d6efd', + calendar_type: 'personal', + is_legacy: true, + is_personal: true, + user_can_edit: true, + user_can_view: true, + is_subscribed: true + } + ]; + + // Добавить календари отделов + const deptIds = window.calendarWidget?.getDepartments?.() || []; + deptIds.forEach((deptId, index) => { + legacyCalendars.push({ + id: `legacy-dept-${deptId}`, + title: `Отдел ${deptId}`, + description: 'События отдела', + color: '#198754', + calendar_type: 'department', + department_id: deptId, + is_legacy: true, + is_department: true, + user_can_edit: false, + user_can_view: true, + is_subscribed: true + }); + }); + + return legacyCalendars; + } + /** * Загрузить список календарей */ async function loadCalendars() { try { - calendars = await getMyCalendars(); + // Загрузить новые Calendar записи + const newCalendars = await getMyCalendars(); - // Если календарей нет - не обновляем состояние (используем legacy режим) - if (calendars.length === 0) { - console.log('[CalendarManager] No calendars found, keeping legacy mode'); - container.innerHTML = ` -
- -

Календари не настроены

- События отображаются в классическом режиме -
- `; - return; - } + // Добавить legacy календари + const legacyCalendars = createLegacyCalendars(); + + // Объединить оба списка + calendars = [...legacyCalendars, ...newCalendars]; + + console.log('[CalendarManager] Loaded calendars:', { + legacy: legacyCalendars.length, + new: newCalendars.length, + total: calendars.length + }); // По умолчанию все календари видимы visibleCalendarIds = new Set(calendars.map(cal => cal.id)); diff --git a/backend/static/js/components/calendarWidgetIntegration.js b/backend/static/js/components/calendarWidgetIntegration.js index 5ae2cf31..76653c8a 100644 --- a/backend/static/js/components/calendarWidgetIntegration.js +++ b/backend/static/js/components/calendarWidgetIntegration.js @@ -41,27 +41,65 @@ export function integrateCalendarManager(calendarWidgetInstance, options = {}) { range: `${startStr} - ${endStr}` }); - // Если нет календарей в новой системе, используем legacy режим (показываем ВСЕ события) - if (calendars.length === 0) { - console.log('[CalendarIntegration] No calendars configured, using legacy mode (showing all events)'); - return await getCalendarEvents({ - start: startStr, - end: endStr - }); - } - - // Если ни один календарь не выбран, ТОЖЕ показываем все события (legacy режим) + // Если ни один календарь не выбран, показываем пустой результат if (visibleCalendarIds.length === 0) { - console.log('[CalendarIntegration] No calendars selected, falling back to legacy mode'); - return await getCalendarEvents({ - start: startStr, - end: endStr - }); + console.log('[CalendarIntegration] No calendars selected, showing empty'); + return []; } - // Загружаем события для каждого видимого календаря - const eventChunks = await Promise.all( - visibleCalendarIds.map(async (calendarId) => { + // Разделяем legacy и новые календари + const legacyIds = [...visibleCalendarIds].filter(id => typeof id === 'string' && id.startsWith('legacy-')); + const newIds = [...visibleCalendarIds].filter(id => typeof id === 'number'); + + console.log('[CalendarIntegration] Processing calendars:', { legacyIds, newIds }); + + let allEvents = []; + + // Загружаем события для legacy календарей + for (const legacyId of legacyIds) { + try { + let events = []; + const calendar = calendars.find(c => c.id === legacyId); + + if (legacyId === 'legacy-company') { + // Компания: все события без фильтров + console.log('[CalendarIntegration] Loading company events (all)'); + events = await getCalendarEvents({ start: startStr, end: endStr }); + } else if (legacyId === 'legacy-personal') { + // Личный: события текущего сотрудника + console.log('[CalendarIntegration] Loading personal events for current employee'); + events = await getCalendarEvents({ + start: startStr, + end: endStr, + employee_id: window.currentEmployeeId || null + }); + } else if (legacyId.startsWith('legacy-dept-')) { + // Отдел: события конкретного отдела + const deptId = parseInt(legacyId.replace('legacy-dept-', ''), 10); + console.log(`[CalendarIntegration] Loading department events for dept ${deptId}`); + events = await getCalendarEvents({ + start: startStr, + end: endStr, + department_id: deptId + }); + } + + // Добавляем информацию о legacy календаре + allEvents.push(...(events || []).map(event => ({ + ...event, + __calendar: calendar, + color: calendar?.color || event.color + }))); + + console.log(`[CalendarIntegration] Loaded ${events?.length || 0} events for legacy calendar ${legacyId}`); + } catch (error) { + console.error(`[CalendarIntegration] Error loading legacy calendar ${legacyId}:`, error); + } + } + + // Загружаем события для новых календарей + const newEventChunks = await Promise.all( + newIds.map(async (calendarId) => { try { const events = await getCalendarEvents({ start: startStr, @@ -69,14 +107,13 @@ export function integrateCalendarManager(calendarWidgetInstance, options = {}) { calendar_id: calendarId }); - console.log(`[CalendarIntegration] Loaded ${events?.length || 0} events for calendar ${calendarId}`); + console.log(`[CalendarIntegration] Loaded ${events?.length || 0} events for new calendar ${calendarId}`); - // Добавляем информацию о календаре к каждому событию + // Добавляем информацию о календаре const calendar = calendars.find(c => c.id === calendarId); return (events || []).map(event => ({ ...event, __calendar: calendar, - // Переопределяем цвет события цветом календаря color: calendar?.color || event.color })); } catch (error) { @@ -86,8 +123,9 @@ export function integrateCalendarManager(calendarWidgetInstance, options = {}) { }) ); - // Объединяем все события - const allEvents = eventChunks.flat(); + // Объединяем события из новых календарей + allEvents.push(...newEventChunks.flat()); + console.log(`[CalendarIntegration] Total events loaded: ${allEvents.length}`); // Дедупликация по ID diff --git a/backend/templates/includes/components/calendar_desktop.html b/backend/templates/includes/components/calendar_desktop.html index f716d6f5..bc1da004 100644 --- a/backend/templates/includes/components/calendar_desktop.html +++ b/backend/templates/includes/components/calendar_desktop.html @@ -6,28 +6,7 @@
Календарь
- {# Выпадающий выбор: Компания / Отделы / Личный (LEGACY) #} - - - {# Кнопка списка календарей (NEW) #} + {# Кнопка списка календарей #}
@@ -65,16 +45,16 @@ - {# Список календарей (сворачиваемый) - НОВАЯ ФУНКЦИЯ #} + {# Список календарей (сворачиваемый) - унифицированный список legacy + новые #}
- Управление несколькими календарями + Выберите календари для отображения -
+
- {# Здесь будет JS-генерируемый список календарей #} + {# Здесь будет JS-генерируемый список календарей (legacy + новые) #}
Загрузка...