Загрузка данных


{% extends "base.html" %}
{% block content %}
<div class="card">
    <div class="card-title">
        <i data-lucide="users"></i>
        Список сотрудников
    </div>
    
    <div style="margin-bottom: 1rem;">
        <input type="text" id="searchInput" class="form-control" placeholder="Поиск по фамилии или таб. №" style="width: 300px; display: inline-block;">
        <button id="searchBtn" class="btn btn-primary"><i data-lucide="search"></i> Найти</button>
        <button id="resetBtn" class="btn btn-warning"><i data-lucide="refresh-cw"></i> Сбросить</button>
    </div>
    
    <table class="data-table">
        <thead>
            <tr>
                <th>Таб. №</th>
                <th>Фамилия</th>
                <th>Имя</th>
                <th>Отчество</th>
                <th>Подразделение</th>
                <th>Должность</th>
                <th>Код должности</th>
            </tr>
        </thead>
        <tbody id="tableBody"></tbody>
    </table>
</div>

<script>
    let allEmployees = [];
    
    async function loadEmployees() {
        const response = await fetch('/api/employees');
        allEmployees = await response.json();
        renderTable(allEmployees);
        lucide.createIcons();
    }
    
    function renderTable(employees) {
        const tbody = document.getElementById('tableBody');
        if (!employees || employees.length === 0) {
            tbody.innerHTML = '<tr><td colspan="7" style="text-align: center;"><i data-lucide="inbox"></i> Нет данных</td></tr>';
            return;
        }
        tbody.innerHTML = employees.map(emp => `
            <tr>
                <td>${emp.tab_no || '-'}</td>
                <td>${emp.last_name || '-'}</td>
                <td>${emp.first_name || '-'}</td>
                <td>${emp.middle_name || '-'}</td>
                <td>${emp.department || '-'}</td>
                <td>${emp.position || '-'}</td>
                <td>${emp.position_code || '-'}</td>
            </tr>
        `).join('');
        lucide.createIcons();
    }
    
    document.getElementById('searchBtn').addEventListener('click', () => {
        const query = document.getElementById('searchInput').value.toLowerCase();
        if (!query) {
            renderTable(allEmployees);
            return;
        }
        const filtered = allEmployees.filter(emp => 
            (emp.last_name && emp.last_name.toLowerCase().includes(query)) ||
            (emp.first_name && emp.first_name.toLowerCase().includes(query)) ||
            (emp.tab_no && emp.tab_no.includes(query))
        );
        renderTable(filtered);
    });
    
    document.getElementById('resetBtn').addEventListener('click', () => {
        document.getElementById('searchInput').value = '';
        renderTable(allEmployees);
    });
    
    loadEmployees();
</script>
{% endblock %}