sozday-sayt-so-statistikoy-p/script.js

249 lines
8.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Данные приказов (изначально - пример из задачи)
const defaultOrders = [
{
id: 1,
date: "2026-09-15T12:07",
author: "БАКИРОВА А.Н.",
branch: "ОДС",
title: "«Желі» дивизионы» бірлестігінде штаттық бірліктерді қысқарту туралы/О сокращении штатных единиц в Объединении «Дивизион «Сеть»»",
content: `ОБЩИЕ РЕКВИЗИТЫ
Срок согласования: 06.10.2026 23:59:59
Количество согласующих: 5
Подтверждающий Руководитель: Камыспаева А.Т.
СПИСОК СОГЛАСОВАНИЯ:
Камыспаева А.Т., Раимханов Г.Ж., Бимендеев Ж.А., Баимбетов А.К., Черных О.Л.
ДОПОЛНИТЕЛЬНЫЕ СОГЛАСУЮЩИЕ:
Дуйсенбаева А.Б., Сарсенбекова Дидар Саматовна
СОДЕРЖАНИЕ:
Во исполнение подпункта 1 пункта 1 решения Правления АО «Казахтелеком» от 14.09.2026 №41/127 «Об оптимизации штатных единиц в ОДС, СФ и ДЦБ», ПРИКАЗЫВАЮ:
1. Сократить следующие штатные единицы ОДС, согласно приложению к приказу...
ПОДПИСИ:
15.09.2026 12:32:51: СОГЛАСЕН Бимендеев Ж.А. (Еmployee experiеnсe директор)
15.09.2026 14:35:44: СОГЛАСЕН Камыспаева А.Т. (Бизнес партнер по анализу и вознаграждению C&B)
16.09.2026 08:37:42: СОГЛАСЕН Раимханов Г.Ж. (Директор по эксплуатации)`
}
];
// Загрузка данных из localStorage или использование default
let orders = JSON.parse(localStorage.getItem('orders')) || defaultOrders;
// Сохранение данных
function saveOrders() {
localStorage.setItem('orders', JSON.stringify(orders));
}
// Проверка авторизации
function checkAuth() {
const isLoggedIn = localStorage.getItem('isLoggedIn');
if (isLoggedIn === 'true') {
showMainScreen();
}
}
// Вход
function login() {
localStorage.setItem('isLoggedIn', 'true');
showMainScreen();
}
// Выход
function logout() {
localStorage.setItem('isLoggedIn', 'false');
location.reload();
}
// Показать главный экран
function showMainScreen() {
document.getElementById('loginScreen').classList.add('hidden');
document.getElementById('mainScreen').classList.remove('hidden');
renderOrders();
updateStats();
}
// Рендер приказов
function renderOrders(filterBranch = '', searchQuery = '') {
const container = document.getElementById('ordersList');
let filtered = orders;
if (filterBranch) {
filtered = filtered.filter(o => o.branch === filterBranch);
}
if (searchQuery) {
const q = searchQuery.toLowerCase();
filtered = filtered.filter(o =>
o.title.toLowerCase().includes(q) ||
o.author.toLowerCase().includes(q) ||
o.content.toLowerCase().includes(q)
);
}
if (filtered.length === 0) {
container.innerHTML = '<div style="text-align: center; padding: var(--kt-ai-space-9); color: var(--kt-ai-fg-muted);">Приказы не найдены</div>';
return;
}
container.innerHTML = filtered.map(order => {
const date = new Date(order.date).toLocaleString('ru-RU', {
day: '2-digit', month: '2-digit', year: '2-digit',
hour: '2-digit', minute: '2-digit'
});
return `
<div class="order-card" onclick="viewOrder(${order.id})">
<div class="order-header">
<div class="order-title">${escapeHtml(order.title)}</div>
<span class="branch-badge" style="background: var(--kt-ai-bg-soft); border: 1px solid var(--kt-ai-border);">${order.branch}</span>
</div>
<div class="order-meta">
<span>${date}</span> • <span>${escapeHtml(order.author)}</span>
</div>
</div>
`;
}).join('');
}
// Обновление статистики
function updateStats() {
const stats = {
'Total': orders.length,
'ДРБ': orders.filter(o => o.branch === 'ДРБ').length,
'СФ': orders.filter(o => o.branch === 'СФ').length,
'ДЦБ': orders.filter(o => o.branch === 'ДЦБ').length,
'ОДС': orders.filter(o => o.branch === 'ОДС').length
};
document.getElementById('statTotal').textContent = stats['Total'];
document.getElementById('statДРБ').textContent = stats['ДРБ'];
document.getElementById('statСФ').textContent = stats['СФ'];
document.getElementById('statДЦБ').textContent = stats['ДЦБ'];
document.getElementById('statОДС').textContent = stats['ОДС'];
}
// Просмотр приказа
function viewOrder(id) {
const order = orders.find(o => o.id === id);
if (!order) return;
const date = new Date(order.date).toLocaleString('ru-RU', {
day: '2-digit', month: '2-digit', year: '2-digit',
hour: '2-digit', minute: '2-digit'
});
document.getElementById('modalTitle').textContent = order.title;
document.getElementById('modalBody').innerHTML = `
<div class="modal-section">
<div style="display: flex; gap: var(--kt-ai-space-4); margin-bottom: var(--kt-ai-space-3); flex-wrap: wrap;">
<span class="branch-badge" style="background: var(--kt-ai-bg-soft); border: 1px solid var(--kt-ai-border);">${order.branch}</span>
<span style="color: var(--kt-ai-fg-muted); font-size: var(--kt-ai-text-sm);">${date}</span>
</div>
<div style="color: var(--kt-ai-fg-muted); font-size: var(--kt-ai-text-sm); margin-bottom: var(--kt-ai-space-2);">
Автор: <strong>${escapeHtml(order.author)}</strong>
</div>
</div>
<div class="modal-section">
<h3>Содержание приказа</h3>
<pre>${escapeHtml(order.content)}</pre>
</div>
`;
document.getElementById('orderModal').classList.remove('hidden');
}
// Закрыть модальное окно
function closeModal() {
document.getElementById('orderModal').classList.add('hidden');
}
// Добавить приказ
function addOrder(orderData) {
const newOrder = {
id: Date.now(),
...orderData
};
orders.unshift(newOrder);
saveOrders();
renderOrders();
updateStats();
closeAddModal();
}
// Закрыть окно добавления
function closeAddModal() {
document.getElementById('addModal').classList.add('hidden');
document.getElementById('addOrderForm').reset();
}
// Экранирование HTML
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// Инициализация
document.addEventListener('DOMContentLoaded', () => {
checkAuth();
// Форма входа
document.getElementById('loginForm').addEventListener('submit', (e) => {
e.preventDefault();
login();
});
// Кнопка выхода
document.getElementById('logoutBtn').addEventListener('click', logout);
// Фильтр по филиалам
document.getElementById('branchFilter').addEventListener('change', (e) => {
const searchQuery = document.getElementById('searchInput').value;
renderOrders(e.target.value, searchQuery);
});
// Поиск
document.getElementById('searchInput').addEventListener('input', (e) => {
const branchFilter = document.getElementById('branchFilter').value;
renderOrders(branchFilter, e.target.value);
});
// Добавить приказ
document.getElementById('addOrderBtn').addEventListener('click', () => {
document.getElementById('addModal').classList.remove('hidden');
});
// Форма добавления приказа
document.getElementById('addOrderForm').addEventListener('submit', (e) => {
e.preventDefault();
const orderData = {
date: document.getElementById('orderDate').value,
author: document.getElementById('orderAuthor').value.toUpperCase(),
branch: document.getElementById('orderBranch').value,
title: document.getElementById('orderTitle').value,
content: document.getElementById('orderContent').value
};
addOrder(orderData);
});
// Закрытие модальных окон по клику на overlay
document.getElementById('orderModal').addEventListener('click', (e) => {
if (e.target === e.currentTarget) closeModal();
});
document.getElementById('addModal').addEventListener('click', (e) => {
if (e.target === e.currentTarget) closeAddModal();
});
// Закрытие по ESC
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
closeModal();
closeAddModal();
}
});
});