diff --git a/app.js b/app.js
index 6acd138..66bf5a0 100644
--- a/app.js
+++ b/app.js
@@ -11,6 +11,9 @@ document.addEventListener('DOMContentLoaded', () => {
initFilters();
initModals();
renderCharts();
+ loadMotivation();
+ loadKPI();
+ loadReserve();
});
// Навигация между секциями
@@ -247,6 +250,63 @@ function initForms() {
e.target.reset();
});
+ // Форма благодарности
+ document.getElementById('thankFormEl').addEventListener('submit', (e) => {
+ e.preventDefault();
+
+ const thank = {
+ id: Date.now(),
+ to: document.getElementById('thankTo').value,
+ from: document.getElementById('thankAnonymous').checked ? 'Анонимно' : appData.profile.name,
+ reason: document.getElementById('thankReason').value,
+ type: document.getElementById('thankType').value,
+ date: new Date().toISOString().split('T')[0],
+ anonymous: document.getElementById('thankAnonymous').checked
+ };
+
+ appData.motivation.thanks.unshift(thank);
+ saveData(appData);
+
+ document.getElementById('thankForm').style.display = 'none';
+ loadMotivation();
+ alert('Благодарность отправлена!');
+ });
+
+ // Цели КПД
+ document.getElementById('kpiGoalsForm').addEventListener('submit', (e) => {
+ e.preventDefault();
+
+ appData.kpi.goals = [
+ document.getElementById('kpiGoal1').value,
+ document.getElementById('kpiGoal2').value,
+ document.getElementById('kpiGoal3').value
+ ];
+ saveData(appData);
+
+ alert('Цели сохранены!');
+ });
+
+ // Заявка в кадровый резерв
+ document.getElementById('reserveFormEl').addEventListener('submit', (e) => {
+ e.preventDefault();
+
+ const application = {
+ id: Date.now(),
+ position: document.getElementById('reservePosition').value,
+ experience: document.getElementById('reserveExperience').value,
+ motivation: document.getElementById('reserveMotivation').value,
+ skills: document.getElementById('reserveSkills').value,
+ date: new Date().toISOString().split('T')[0],
+ status: 'new'
+ };
+
+ appData.reserve.applications.push(application);
+ saveData(appData);
+
+ document.getElementById('reserveForm').style.display = 'none';
+ alert('Заявка подана! HR свяжется с вами.');
+ });
+
// Форма автоматизации
document.getElementById('automationForm').addEventListener('submit', (e) => {
e.preventDefault();
@@ -423,6 +483,122 @@ window.closeModal = function(modalId) {
document.getElementById(modalId).classList.remove('active');
};
+// Мотивация
+function loadMotivation() {
+ const mot = appData.motivation;
+
+ if (mot.employeeOfMonth) {
+ const empEl = document.getElementById('employeeOfMonth');
+ if (empEl) {
+ empEl.innerHTML = `
+
${mot.employeeOfMonth.avatar}
+ ${mot.employeeOfMonth.name}
+ ${mot.employeeOfMonth.dept}
+ `;
+ }
+ }
+
+ if (mot.ideaOfMonth) {
+ const ideaEl = document.getElementById('ideaOfMonth');
+ if (ideaEl) {
+ ideaEl.innerHTML = `
+ ${mot.ideaOfMonth.title}
+ ${mot.ideaOfMonth.author}
+ `;
+ }
+ }
+
+ const thanksList = document.getElementById('thanksList');
+ if (thanksList && mot.thanks) {
+ thanksList.innerHTML = mot.thanks.map(t => `
+
+
+
${t.reason}
+
+ От: ${t.anonymous ? 'Анонимно' : t.from}
+ ${formatDate(t.date)}
+
+
+ `).join('');
+ }
+}
+
+window.showThankForm = function() {
+ document.getElementById('thankForm').style.display = 'block';
+ document.getElementById('thankFormEl').reset();
+};
+
+window.nominateEmployee = function() {
+ alert('Форма номинации будет доступна в конце месяца');
+};
+
+window.loadAchievements = function() {
+ const achievements = appData.motivation.achievements;
+ const html = achievements.map(a => `
+
+ ${a.icon}
+ ${a.name}
+ x${a.count}
+
+ `).join('');
+ alert('Ваши достижения:\n\n' + achievements.map(a => `${a.icon} ${a.name}: ${a.count}`).join('\n'));
+};
+
+function getThankTypeName(type) {
+ const names = {
+ help: 'За помощь',
+ mentor: 'За наставничество',
+ initiative: 'За инициативу',
+ team: 'За команду',
+ other: 'Другое'
+ };
+ return names[type] || type;
+}
+
+// КПД
+function loadKPI() {
+ const kpi = appData.kpi;
+
+ document.getElementById('kpiValue').textContent = kpi.overall;
+ document.getElementById('kpiCirclePath').style.strokeDasharray = `${kpi.overall}, 100`;
+
+ const kpiChartCanvas = document.getElementById('kpiChartCanvas');
+ if (kpiChartCanvas) {
+ const ctx = kpiChartCanvas.getContext('2d');
+ drawLineChart(ctx, kpi.history, '#4A90E2', 400, 200);
+ }
+}
+
+// Кадровый резерв
+function loadReserve() {
+ const participants = appData.reserve.participants;
+ const list = document.getElementById('participantsList');
+ if (list) {
+ list.innerHTML = participants.map(p => `
+
+
👤
+
+
${p.name}
+
${p.dept}
+
Этап: ${p.stage}
+
+
+
+ `).join('');
+ }
+}
+
+window.showReserveForm = function() {
+ document.getElementById('reserveForm').style.display = 'block';
+ document.getElementById('reserveForm').scrollIntoView({ behavior: 'smooth' });
+};
+
window.resetFeedbackForm = function() {
document.getElementById('feedbackForm').reset();
document.getElementById('feedbackForm').style.display = 'flex';
diff --git a/data.js b/data.js
index ecb92c6..483c3e9 100644
--- a/data.js
+++ b/data.js
@@ -35,9 +35,42 @@ const INITIAL_DATA = {
},
settings: {
engagementIndex: 78,
- engagementTrend: 'up', // up, stable, down
+ engagementTrend: 'up',
totalEmployees: 245,
departments: ['hr', 'it', 'finance', 'procurement', 'sales', 'support']
+ },
+ motivation: {
+ employeeOfMonth: { name: 'Алексей К.', dept: 'IT Департамент', avatar: '👤' },
+ ideaOfMonth: { title: 'Чат-бот для HR', author: 'Сергей Л.' },
+ thanks: [
+ { id: 1, to: 'Мария С.', from: 'Александр И.', reason: 'За помощь в обучении новой системы', type: 'help', date: '2026-08-18', anonymous: false },
+ { id: 2, to: 'Дмитрий В.', from: 'Анонимно', reason: 'За наставничество и поддержку', type: 'mentor', date: '2026-08-17', anonymous: true },
+ { id: 3, to: 'Ольга Н.', from: 'Анна П.', reason: 'За инициативу в оптимизации закупок', type: 'initiative', date: '2026-08-15', anonymous: false }
+ ],
+ achievements: [
+ { id: 1, name: 'Новичок года', icon: '🌟', count: 1 },
+ { id: 2, name: 'Генератор идей', icon: '💡', count: 3 },
+ { id: 3, name: 'Наставник', icon: '🎓', count: 2 }
+ ]
+ },
+ kpi: {
+ overall: 75,
+ components: {
+ tasks: 85,
+ deadlines: 78,
+ quality: 82,
+ initiative: 65,
+ team: 88
+ },
+ history: [68, 70, 72, 71, 74, 75],
+ goals: ['', '', '']
+ },
+ reserve: {
+ participants: [
+ { id: 1, name: 'Мария С.', dept: 'HR Департамент', stage: 'Обучение', progress: 50 },
+ { id: 2, name: 'Дмитрий В.', dept: 'IT Департамент', stage: 'Стажировка', progress: 75 }
+ ],
+ applications: []
}
};
diff --git a/index.html b/index.html
index 1a99712..991f18a 100644
--- a/index.html
+++ b/index.html
@@ -20,6 +20,9 @@
Трудовая дисциплина
Автоматизация
Инновации
+ Мотивация
+ КПД
+ Кадровый резерв
Обратная связь
Профиль
Аналитика
@@ -410,6 +413,296 @@
+
+
+
+
+
+
+
🏆 Сотрудник месяца
+
Лучший сотрудник по итогам месяца
+
+
👤
+
Алексей К.
+
IT Департамент
+
+
+
+
+
+
⭐ Благодарности
+
Поблагодарите коллегу за помощь
+
+
+
+
+
🎖 Достижения
+
Ваши награды и значки
+
+
+
+
+
💡 Идея месяца
+
Лучшая идея месяца
+
+
Чат-бот для HR
+
Сергей Л.
+
+
+
+
+
+
Стена благодарностей
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Выполнение задач
+
+
85%
+
+
+
Соблюдение сроков
+
+
78%
+
+
+
Качество работы
+
+
82%
+
+
+
Инициативность
+
+
65%
+
+
+
Командная работа
+
+
88%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🎯 Программа кадрового резерва
+
Участвуйте в программе подготовки руководителей и получите возможность карьерного роста
+
+
+
+
+
+
Требования для участия
+
+
+
📊
+
Стаж работы
+
Не менее 2 лет в компании
+
+
+
⭐
+
Рейтинг
+
КПД не ниже 75%
+
+
+
🎓
+
Обучение
+
Пройденные курсы лидерства
+
+
+
💡
+
Инициативы
+
Реализованные проекты
+
+
+
+
+
+
Этапы программы
+
+
+
1
+
+
Отборочный этап
+
Собеседование с HR, оценка компетенций
+
+
+
+
2
+
+
Обучение
+
Курсы по управлению, лидерству, коммуникациям
+
+
+
+
3
+
+
Стажировка
+
Практика под руководством наставника
+
+
+
+
4
+
+
Аттестация
+
Финальная оценка и включение в резерв
+
+
+
+
+
+
+
Текущие участники программы
+
+
+
👤
+
+
Мария С.
+
HR Департамент
+
Этап: Обучение
+
+
+
+
+
👤
+
+
Дмитрий В.
+
IT Департамент
+
Этап: Стажировка
+
+
+
+
+
+
+
+
+