249 lines
8.8 KiB
JavaScript
249 lines
8.8 KiB
JavaScript
// Данные приказов (изначально - пример из задачи)
|
||
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();
|
||
}
|
||
});
|
||
});
|