/** * Модуль для загрузки и отображения новых сотрудников * Использует API для получения данных с корректными глобальными URL */ export class NewEmployeesScroller { constructor(containerId = 'newEmployeesContainer') { this.container = document.getElementById(containerId); if (!this.container) { console.warn(`Container #${containerId} not found`); return; } this.apiUrl = '/api/v1/employees/'; } /** * Инициализация - загрузка и рендеринг */ async init() { try { const employees = await this.fetchNewEmployees(); if (employees && employees.length > 0) { this.render(employees); } else { this.container.style.display = 'none'; } } catch (error) { console.error('Failed to load new employees:', error); this.container.style.display = 'none'; } } /** * Загрузка новых сотрудников через API */ async fetchNewEmployees() { // Дата 14 дней назад const since = new Date(); since.setDate(since.getDate() - 14); const sinceISO = since.toISOString(); const params = new URLSearchParams({ active: 'true', created_at__gte: sinceISO, ordering: '-created_at', page_size: '10' }); const response = await fetch(`${this.apiUrl}?${params}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); return data.results || data; } /** * Рендеринг списка сотрудников */ render(employees) { const scrollerHtml = this.createScrollerHtml(employees); this.container.innerHTML = scrollerHtml; this.container.style.display = 'block'; // Инициализируем автоскролл после рендеринга this.initAutoScroll(); } /** * Инициализация автоскролла для созданного скроллера */ async initAutoScroll() { try { // Динамический импорт модуля автоскролла // Добавляем timestamp для обхода кеша браузера const timestamp = Date.now(); const { initAutoScroller } = await import(`/static/js/components/autoScrollerHandler.js?v=${timestamp}`); // Небольшая задержка для гарантии, что DOM обновился setTimeout(() => { initAutoScroller({ selector: '.js-join-scroller', speed: 0.5 }); }, 100); } catch (error) { console.warn('Failed to initialize auto-scroller:', error); } } /** * Создание HTML разметки скроллера */ createScrollerHtml(employees) { const items = employees.map(emp => this.createEmployeeItem(emp)).join(''); return `