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 + новые) #}