Игорь Надеин 28e2f1615f feat: реализован drag & drop для перемещения событий между календарями
- Создан модуль calendarEventDragDrop.js с классами DragDropState и CalendarUtils
- Реализовано перетаскивание событий между календарями через модальное окно
- Добавлена кнопка 'Переместить все' для массового перемещения
- Модальное окно отображает источник и цель перемещения
- Поддержка legacy-календарей (company/department/personal)
- Добавлены стили для подсветки drop-target (папки и календари)
- Backend: исправлена обработка null значений в serializer
- Backend: добавлен endpoint list_raw для получения немодерируемых событий
- Использованы стандартные Bootstrap стили для модалов
- Исправлено всплытие событий dragover/drop (stopPropagation)
- Эмодзи иконки для типов календарей (����)
- Toast уведомления об успехе/ошибках перемещения
2026-02-12 15:59:53 +03:00

66 lines
2.1 KiB
JavaScript

/**
* @fileoverview API URL constants - константы URL API эндпоинтов
* @module constants/apiUrls
*/
/**
* Базовые URL API эндпоинтов
* @enum {string}
*/
export const API_URLS = {
// Calendar Events API
EVENTS: "/api/v1/calendar/events/",
EVENT_DETAIL: (id) => `/api/v1/calendar/events/${id}/`,
// Calendars API
CALENDARS: "/api/v1/calendar/calendars/",
CALENDARS_MY: "/api/v1/calendar/calendars/my-calendars/",
CALENDAR_DETAIL: (id) => `/api/v1/calendar/calendars/${id}/`,
CALENDAR_SUBSCRIBE: (id) => `/api/v1/calendar/calendars/${id}/subscribe/`,
CALENDAR_UNSUBSCRIBE: (id) => `/api/v1/calendar/calendars/${id}/unsubscribe/`,
CALENDAR_INVITE: (id) => `/api/v1/calendar/calendars/${id}/invite/`,
CALENDAR_INVITE_BULK: (id) => `/api/v1/calendar/calendars/${id}/invite-bulk/`,
// Calendar Subscriptions API
SUBSCRIPTIONS: "/api/v1/calendar/subscriptions/",
SUBSCRIPTION_DETAIL: (id) => `/api/v1/calendar/subscriptions/${id}/`,
// Departments API
MY_DEPARTMENTS: "/api/v1/departments/my-departments/",
DEPARTMENT_DETAIL: (id) => `/api/v1/departments/${id}/`,
// Employees API
EMPLOYEES: "/api/v1/employees/",
EMPLOYEE_DETAIL: (id) => `/api/v1/employees/${id}/`,
};
/**
* Дефолтные параметры для API запросов
* @enum {*}
*/
export const API_DEFAULTS = {
// Time-to-live для кеша (в миллисекундах)
TTL: {
EVENTS: 30000, // 30 секунд
EVENT_DETAIL: 60000, // 1 минута
CALENDARS: 60000, // 1 минута
DEPARTMENTS: 300000, // 5 минут
},
// Таймауты для запросов
TIMEOUT: {
DEFAULT: 10000, // 10 секунд
UPLOAD: 30000, // 30 секунд
},
};
/**
* Получить полный URL для API эндпоинта
* @param {string} path - Путь к эндпоинту
* @param {string} [baseUrl] - Базовый URL (по умолчанию window.location.origin)
* @returns {string} Полный URL
*/
export function getApiUrl(path, baseUrl = window.location.origin) {
return new URL(path, baseUrl).toString();
}