diff --git a/index.html b/index.html index 35b664a..971d24f 100644 --- a/index.html +++ b/index.html @@ -4,113 +4,67 @@ Согласование отпусков - - - - + + + + - + +
@@ -120,38 +74,38 @@

Заявки на отпуск

Согласование и учёт ежегодных отпусков отдела

-
+
-
+
+
-
-
-
0
-
Всего заявок
-
за 2026 год
+
+
+
0
+
Всего заявок
+
за 2026 год
-
-
0
-
Требуют решения
-
ожидают согласования
+
+
0
+
Требуют решения
+
ожидают согласования
-
-
0
-
Согласовано
-
в этом месяце
+
+
0
+
Согласовано
+
в этом месяце
-
-
0
-
Конфликтов
-
нарушений правил
+
+
0
+
Конфликтов
+
нарушений правил
@@ -163,24 +117,27 @@
-
+
Сотрудник
Даты
Тип
-
Остаток
+
Остаток
Статус
Действия
+
-
-

Заявка

- +
+

Заявка

+
@@ -261,8 +218,8 @@ function resetData() { function renderTeamList() { const container = document.getElementById('team-list'); container.innerHTML = employees.slice(0, 5).map(emp => ` -
-
+
+
${emp.name.split(' ').map(n=>n[0]).join('').slice(0,2)}
${emp.name.split(' ')[1] || emp.name} @@ -270,6 +227,16 @@ function renderTeamList() { `).join(''); } +function getStatusVariant(status) { + const variants = { + new: { bg: 'var(--kt-ai-status-warn-bg)', color: 'var(--kt-ai-status-warn-fg)', label: 'Новая' }, + pending: { bg: 'var(--kt-ai-status-info-bg)', color: 'var(--kt-ai-status-info-fg)', label: 'На согласовании' }, + approved: { bg: 'var(--kt-ai-status-ok-bg)', color: 'var(--kt-ai-status-ok-fg)', label: 'Согласовано' }, + rejected: { bg: 'var(--kt-ai-status-risk-bg)', color: 'var(--kt-ai-status-risk-fg)', label: 'Отклонено' } + }; + return variants[status] || variants.new; +} + function renderRequests() { const container = document.getElementById('requests-table'); let filtered = [...requests]; @@ -284,11 +251,9 @@ function renderRequests() { if (filtered.length === 0) { container.innerHTML = `
- - - -

Нет заявок

-

Заявок с выбранным статусом пока нет

+ +

Нет заявок

+

Заявок с выбранным статусом пока нет

`; return; @@ -296,26 +261,29 @@ function renderRequests() { container.innerHTML = filtered.map(req => { const emp = employees.find(e => e.id === req.employeeId); - const statusClass = `status-${req.status}`; - const statusLabels = { new: 'Новая', pending: 'На согласовании', approved: 'Согласовано', rejected: 'Отклонено' }; + const variant = getStatusVariant(req.status); return `
-
${req.employeeName}
-
${emp ? emp.position : ''}
+
${req.employeeName}
+
${emp ? emp.position : ''}
${formatDateRange(req.startDate, req.endDate)}
${req.type}
${emp ? emp.vacationDays : 0} дн.
-
${statusLabels[req.status]}
+
${variant.label}
${req.status === 'new' || req.status === 'pending' ? `
- - + +
- ` : '›'} + ` : ``}
`; @@ -374,11 +342,12 @@ function openDrawer(id) { const overlap = checkOverlaps(req); const hasConflict = overlap.length > 0; const seniorOnVacation = checkSeniorConflict(req); + const daysOk = emp && emp.vacationDays >= req.days; document.getElementById('drawer-title').textContent = `Заявка №${req.id}`; document.getElementById('drawer-content').innerHTML = `
-

Основная информация

+

Основная информация

Сотрудник ${req.employeeName} @@ -406,38 +375,32 @@ function openDrawer(id) {
-

Проверка правил

-
- - ${emp && emp.vacationDays >= req.days ? '' : ''} - +

Проверка правил

+
+ Достаточно дней отпуска (${req.days} из ${emp ? emp.vacationDays : 0})
-
- - ${!hasConflict ? '' : ''} - +
+ Лимит simultaneity (≤2 человека) ${hasConflict ? `— конфликт с: ${overlap.map(o => o.employeeName).join(', ')}` : ''}
-
- - ${!seniorOnVacation ? '' : ''} - +
+ Наличие дежурного старшего ${seniorOnVacation ? '— все старшие в отпуске' : ''}
${req.note ? `
-

Примечание

-

${req.note}

+

Примечание

+

${req.note}

` : ''} ${req.rejectReason ? `
-

Причина отказа

-

${req.rejectReason}

+

Причина отказа

+

${req.rejectReason}

` : ''} @@ -541,6 +504,7 @@ function showToast(message, type = 'success') { const toast = document.getElementById('toast'); toast.textContent = message; toast.className = `toast show ${type}`; + toast.style.borderLeft = `4px solid ${type === 'success' ? 'var(--kt-ai-status-ok)' : 'var(--kt-ai-status-risk)'}`; setTimeout(() => toast.classList.remove('show'), 3000); } @@ -581,7 +545,15 @@ init(); - + + + + + + + + +