/** * =============================================================================== * FILE: modules/web_api/static/js/manual_absences.js * ROLE: Модальные окна "Мест. командир.", "Иное", живой автокомплит ФИО из 1С:ЗУП * и мгновенная синхронизация с боковой панелью SidebarManager. * =============================================================================== */ let activeAbsenceType = 'LOCAL_TRIP'; // 'LOCAL_TRIP' или 'OTHER' let reasonsCache = []; async function loadAbsenceReasons() { try { const res = await fetch('/api/v1/manual-absences/reasons'); if (res.ok) { const data = await res.json(); reasonsCache = data.reasons || []; } } catch (e) { console.error('Ошибка загрузки причин:', e); } } function openManualAbsenceModal(type) { activeAbsenceType = type; const isTrip = type === 'LOCAL_TRIP'; const titleEl = document.getElementById('manual-absence-modal-title'); const reasonBlock = document.getElementById('manual-absence-reason-block'); const reasonSelect = document.getElementById('manual-absence-reason-select'); if (titleEl) { titleEl.innerHTML = isTrip ? 'Местная командировка' : 'Иные причины отсутствия'; } if (reasonBlock && reasonSelect) { if (isTrip) { reasonBlock.classList.add('hidden'); } else { reasonBlock.classList.remove('hidden'); reasonSelect.innerHTML = reasonsCache.map(r => ``).join(''); } } // Сброс полей ввода const fioInput = document.getElementById('manual-absence-fio-input'); const deptInput = document.getElementById('manual-absence-dept'); const posInput = document.getElementById('manual-absence-pos'); const startDateInput = document.getElementById('manual-absence-start-date'); const endDateInput = document.getElementById('manual-absence-end-date'); const suggestionsBox = document.getElementById('manual-absence-suggestions'); if (fioInput) fioInput.value = ''; if (deptInput) deptInput.value = ''; if (posInput) posInput.value = ''; if (startDateInput) startDateInput.value = ''; if (suggestionsBox) { suggestionsBox.classList.add('hidden'); suggestionsBox.innerHTML = ''; } // Окончание по умолчанию — сегодняшний день if (endDateInput) { const today = new Date().toISOString().split('T')[0]; endDateInput.value = today; } loadManualAbsencesTable(); const modal = document.getElementById('manual-absence-modal'); if (modal) modal.classList.remove('hidden'); } function closeManualAbsenceModal() { const modal = document.getElementById('manual-absence-modal'); if (modal) modal.classList.add('hidden'); } // Живой автокомплит ФИО из базы zup_staff let searchTimeout = null; function setupStaffAutocomplete(inputEl, suggestionsBoxId) { const box = document.getElementById(suggestionsBoxId); if (!inputEl || !box) return; inputEl.addEventListener('input', function() { const val = this.value.trim(); clearTimeout(searchTimeout); if (val.length < 2) { box.classList.add('hidden'); box.innerHTML = ''; return; } searchTimeout = setTimeout(async () => { try { const res = await fetch(`/api/v1/manual-absences/staff-autocomplete?q=${encodeURIComponent(val)}`); if (!res.ok) return; const items = await res.json(); if (items.length === 0) { box.classList.add('hidden'); return; } box.innerHTML = items.map(it => `