56 lines
8.0 KiB
JavaScript
56 lines
8.0 KiB
JavaScript
const $ = (selector) => document.querySelector(selector);
|
||
const modal = $('#modal');
|
||
const docModal = $('#doc-modal');
|
||
const favorites = new Set(JSON.parse(localStorage.getItem('talion-favorites') || '[]'));
|
||
const history = JSON.parse(localStorage.getItem('talion-history') || '[]');
|
||
|
||
const docs = [
|
||
{ title: 'Гражданский кодекс РФ', type: 'Кодекс', description: 'Основные положения гражданского законодательства Российской Федерации.', chapters: ['Общие положения', 'Лица', 'Объекты гражданских прав', 'Сделки и представительство'], url: 'https://www.consultant.ru/document/cons_doc_LAW_5142/' },
|
||
{ title: 'Налоговый кодекс РФ', type: 'Кодекс', description: 'Налоги и сборы, права и обязанности налогоплательщиков.', chapters: ['Общие положения', 'Налогоплательщики', 'Налоговая декларация', 'Налоговый контроль'], url: 'https://www.consultant.ru/document/cons_doc_LAW_19671/' },
|
||
{ title: 'Трудовой кодекс РФ', type: 'Кодекс', description: 'Трудовые отношения, гарантии работникам и правила оформления.', chapters: ['Общие положения', 'Трудовой договор', 'Рабочее время', 'Оплата и нормирование труда'], url: 'https://www.consultant.ru/document/cons_doc_LAW_34683/' },
|
||
{ title: 'О защите прав потребителей', type: 'Федеральный закон', description: 'Права потребителей при покупке товаров и оказании услуг.', chapters: ['Общие положения', 'Защита прав потребителей', 'Общественные организации', 'Ответственность'], url: 'https://www.consultant.ru/document/cons_doc_LAW_305/' },
|
||
{ title: 'Федеральный закон «О персональных данных»', type: 'Федеральный закон', description: 'Правовые основы обработки и защиты персональных данных.', chapters: ['Общие положения', 'Принципы обработки', 'Права субъекта данных', 'Обязанности оператора'], url: 'https://www.consultant.ru/document/cons_doc_LAW_61801/' },
|
||
{ title: 'Конституция Российской Федерации', type: 'Конституция', description: 'Основной закон России: права, свободы и устройство государства.', chapters: ['Основы конституционного строя', 'Права и свободы человека', 'Федеративное устройство', 'Органы государственной власти'], url: 'https://www.consultant.ru/document/cons_doc_LAW_28399/' },
|
||
{ title: 'МРОТ 2026', type: 'Справочная информация', description: 'Минимальный размер оплаты труда и связанные расчетные данные.', chapters: ['Размер МРОТ', 'Регионы', 'Расчетные примеры'], url: 'https://www.consultant.ru/document/cons_doc_LAW_503692/' }
|
||
];
|
||
|
||
document.querySelectorAll('[data-modal]').forEach((button) => button.addEventListener('click', () => {
|
||
const trial = button.dataset.modal === 'trial';
|
||
$('#modal-kicker').textContent = trial ? 'Пробный доступ' : 'Вход в систему';
|
||
$('#modal-title').textContent = trial ? 'Получите доступ к системе' : 'Войти в систему';
|
||
$('#modal-text').textContent = trial ? 'Оставьте контакты, и специалист свяжется с вами.' : 'Демонстрационная форма входа в личный кабинет.';
|
||
$('#modal-form').style.display = 'block'; $('#form-success').style.display = 'none'; modal.classList.add('open'); modal.setAttribute('aria-hidden', 'false');
|
||
}));
|
||
document.querySelectorAll('[data-close]').forEach((element) => element.addEventListener('click', () => { modal.classList.remove('open'); modal.setAttribute('aria-hidden', 'true'); }));
|
||
$('#modal-form').addEventListener('submit', (event) => { event.preventDefault(); $('#modal-form').style.display = 'none'; $('#form-success').style.display = 'block'; });
|
||
|
||
const renderResults = (query = '', type = 'Все типы') => {
|
||
const result = $('#search-results');
|
||
const matches = docs.filter((doc) => (!query || `${doc.title} ${doc.description}`.toLowerCase().includes(query.toLowerCase())) && (type === 'Все типы' || doc.type === type));
|
||
result.innerHTML = `<div class="result-toolbar"><b>${matches.length ? `Найдено документов: ${matches.length}` : 'Ничего не найдено'}</b><select id="result-filter"><option>Все типы</option><option>Кодекс</option><option>Федеральный закон</option><option>Конституция</option><option>Справочная информация</option></select></div>${matches.map((doc) => `<button class="result-card" data-result="${doc.title}"><span class="result-type">${doc.type}</span><strong>${doc.title}</strong><small>${doc.description}</small><i>Открыть документ →</i></button>`).join('')}`;
|
||
result.style.display = 'block'; result.style.position = 'static'; result.style.marginTop = '16px';
|
||
$('#result-filter').value = type; $('#result-filter').addEventListener('change', (event) => renderResults(query, event.target.value));
|
||
result.querySelectorAll('[data-result]').forEach((card) => card.addEventListener('click', () => openDocument(card.dataset.result)));
|
||
};
|
||
$('#search-form').addEventListener('submit', (event) => { event.preventDefault(); renderResults($('#search-input').value.trim()); });
|
||
|
||
function openDocument(title) {
|
||
const doc = docs.find((item) => item.title === title) || docs[0];
|
||
$('#doc-title').textContent = doc.title; $('.doc-breadcrumb').textContent = `Документы / ${doc.type}`;
|
||
$('.doc-viewer .section-kicker').textContent = doc.type; $('.doc-layout article h3').textContent = 'О документе'; $('.doc-layout article p').textContent = doc.description;
|
||
$('.doc-layout aside').innerHTML = `<b>Оглавление</b>${doc.chapters.map((chapter) => `<a href="#doc-body">${chapter}</a>`).join('')}`;
|
||
$('.doc-layout article .button').href = doc.url; updateFavorite(doc.title);
|
||
if (!history.includes(doc.title)) { history.unshift(doc.title); history.splice(5); localStorage.setItem('talion-history', JSON.stringify(history)); }
|
||
docModal.classList.add('open'); docModal.setAttribute('aria-hidden', 'false');
|
||
}
|
||
function updateFavorite(title) {
|
||
let button = $('#doc-favorite');
|
||
if (!button) { button = document.createElement('button'); button.id = 'doc-favorite'; button.className = 'favorite-button'; $('.doc-meta').append(button); }
|
||
button.textContent = favorites.has(title) ? '★ В избранном' : '☆ В избранное'; button.onclick = () => { favorites.has(title) ? favorites.delete(title) : favorites.add(title); localStorage.setItem('talion-favorites', JSON.stringify([...favorites])); updateFavorite(title); };
|
||
}
|
||
document.querySelectorAll('[data-doc]').forEach((link) => link.addEventListener('click', (event) => { event.preventDefault(); openDocument(link.dataset.doc); }));
|
||
document.querySelectorAll('[data-doc-close]').forEach((element) => element.addEventListener('click', () => { docModal.classList.remove('open'); docModal.setAttribute('aria-hidden', 'true'); }));
|
||
document.addEventListener('keydown', (event) => { if (event.key === 'Escape') { modal.classList.remove('open'); docModal.classList.remove('open'); } });
|
||
$('#cookie-ok').addEventListener('click', () => $('#cookie').remove());
|
||
$('.search-open').addEventListener('click', () => { $('#search-input').focus(); $('#search').scrollIntoView({ behavior: 'smooth' }); });
|