Compare commits

...

2 Commits
main ... pages

View File

@ -83,6 +83,9 @@
<h2 id="resultTitle" style="margin-bottom:var(--kt-ai-space-3)"></h2> <h2 id="resultTitle" style="margin-bottom:var(--kt-ai-space-3)"></h2>
<div id="resultCategory" class="kb-category" style="margin-bottom:var(--kt-ai-space-4)"></div> <div id="resultCategory" class="kb-category" style="margin-bottom:var(--kt-ai-space-4)"></div>
<div id="resultContent"></div> <div id="resultContent"></div>
<p id="noSourceMsg" style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin-top:var(--kt-ai-space-4);display:none">
⚠️ Полная инструкция ещё не загружена
</p>
<a id="resultLink" class="instruction-link kt-ai-link" href="#" target="_blank" style="display:none"> <a id="resultLink" class="instruction-link kt-ai-link" href="#" target="_blank" style="display:none">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
Открыть полную инструкцию Открыть полную инструкцию
@ -134,148 +137,17 @@
<script> <script>
const KNOWLEDGE_BASE = [ const KNOWLEDGE_BASE = [
{ { id: 1, question: "Как создать новый договор?", category: "Создание", keywords: ["создать", "новый", "договор", "регистрация"] },
id: 1, { id: 2, question: "Как изменить существующий договор?", category: "Создание", keywords: ["изменить", "редактировать", "обновить", "дополнительное"] },
question: "Как создать новый договор?", { id: 3, question: "Как отправить договор на согласование?", category: "Согласование", keywords: ["отправить", "согласование", "маршрут", "визировать"] },
category: "Создание", { id: 4, question: "Как отозвать договор с согласования?", category: "Согласование", keywords: ["отозвать", "вернуть", "отменить", "согласование"] },
keywords: ["создать", "новый", "договор", "регистрация"], { id: 5, question: "Как подписать договор электронной подписью?", category: "Подписание", keywords: ["подписать", "эцп", "подпись", "нцр"] },
steps: [ { id: 6, question: "Как посмотреть статус договора?", category: "Создание", keywords: ["статус", "этап", "где находится", "отследить"] },
"Откройте раздел «Договоры» → «Создать договор»", { id: 7, question: "Как получить архивную копию договора?", category: "Архив", keywords: ["архив", "копия", "выгрузить", "скачать", "экспорт"] },
"Заполните обязательные поля: контрагент, предмет, сумма, срок действия", { id: 8, question: "Как переместить договор в архив?", category: "Архив", keywords: ["архив", "переместить", "исполнен", "закрыть"] },
"Прикрепите скан-копию договора в формате PDF", { id: 9, question: "Как назначить ответственного за договор?", category: "Создание", keywords: ["ответственный", "назначить", "владелец", "куратор"] },
"Нажмите «Сохранить и отправить на согласование»" { id: 10, question: "Как найти договор по контрагенту?", category: "Создание", keywords: ["найти", "поиск", "контрагент", "поставщик", "заказчик"] },
], { id: 11, question: "Как оформить допсоглашение после окончания договора?", category: "Создание", keywords: ["допсоглашение", "окончание", "истёк", "срок", "продлить"] }
instructionUrl: "#",
tip: "Все обязательные поля отмечены звёздочкой (*)"
},
{
id: 2,
question: "Как изменить существующий договор?",
category: "Создание",
keywords: ["изменить", "редактировать", "обновить", "дополнительное"],
steps: [
"Найдите договор в реестре через поиск или фильтры",
"Откройте карточку договора",
"Нажмите кнопку «Редактировать» или «Создать дополнительное соглашение»",
"Внесите изменения, сохраните и отправьте на согласование"
],
instructionUrl: "#",
tip: "Изменения вступают в силу после подписания обеими сторонами"
},
{
id: 3,
question: "Как отправить договор на согласование?",
category: "Согласование",
keywords: ["отправить", "согласование", "маршрут", "визировать"],
steps: [
"Откройте черновик договора",
"Проверьте заполненность всех обязательных полей",
"Нажмите «Отправить на согласование»",
"Выберите маршрут согласования или используйте стандартный",
"Подтвердите отправку — договор уйдёт первому согласующему"
],
instructionUrl: "#",
tip: "Статус изменится на «На согласовании», вы увидите текущий этап"
},
{
id: 4,
question: "Как отозвать договор с согласования?",
category: "Согласование",
keywords: ["отозвать", "вернуть", "отменить", "согласование"],
steps: [
"Откройте договор со статусом «На согласовании»",
"Нажмите кнопку «Отозвать» (доступна, если договор ещё не подписан)",
"Укажите причину отзыва в комментарии",
"Договор вернётся в статус «Черновик»"
],
instructionUrl: "#",
tip: "Отозвать можно только до момента финального подписания"
},
{
id: 5,
question: "Как подписать договор электронной подписью?",
category: "Подписание",
keywords: ["подписать", "эцп", "подпись", "нцр"],
steps: [
"Откройте договор со статусом «Готов к подписанию»",
"Нажмите «Подписать ЭЦП»",
"Выберите сертификат подписи из списка",
"Введите пароль от токена/ключа",
"Дождитесь подтверждения — статус сменится на «Подписан»"
],
instructionUrl: "#",
tip: "Требуется установленный плагин ЭЦП и действующий сертификат"
},
{
id: 6,
question: "Как посмотреть статус договора?",
category: "Создание",
keywords: ["статус", "этап", "где находится", "отследить"],
steps: [
"Откройте реестр договоров",
"Найдите нужный договор (поиск/фильтры)",
"Статус отображается в отдельной колонке цветом",
"Кликните на статус для детальной информации по этапам"
],
instructionUrl: "#",
tip: "Зелёный — подписан, жёлтый — на согласовании, серый — черновик"
},
{
id: 7,
question: "Как получить архивную копию договора?",
category: "Архив",
keywords: ["архив", "копия", "выгрузить", "скачать", "экспорт"],
steps: [
"Откройте исполненный договор (статус «Архив»)",
"Нажмите кнопку «Скачать» или «Выгрузить»",
"Выберите формат: PDF с подписями или XML",
"Файл загрузится на устройство"
],
instructionUrl: "#",
tip: "Архивные договоры хранятся 5 лет после исполнения"
},
{
id: 8,
question: "Как переместить договор в архив?",
category: "Архив",
keywords: ["архив", "переместить", "исполнен", "закрыть"],
steps: [
"Убедитесь, что договор полностью исполнен (все обязательства закрыты)",
"Откройте карточку договора",
"Нажмите «Закрыть договор» или «Переместить в архив»",
"Подтвердите действие — статус сменится на «Архив»"
],
instructionUrl: "#",
tip: "Архивный договор нельзя редактировать, только просматривать"
},
{
id: 9,
question: "Как назначить ответственного за договор?",
category: "Создание",
keywords: ["ответственный", "назначить", "владелец", "куратор"],
steps: [
"Откройте договор в режиме редактирования",
"В поле «Ответственный» начните вводить ФИО сотрудника",
"Выберите сотрудника из выпадающего списка",
"Сохраните изменения"
],
instructionUrl: "#",
tip: "Ответственный получает уведомления об этапах договора"
},
{
id: 10,
question: "Как найти договор по контрагенту?",
category: "Создание",
keywords: ["найти", "поиск", "контрагент", "поставщик", "заказчик"],
steps: [
"Откройте реестр договоров",
"В фильтре «Контрагент» введите название компании или БИН",
"Нажмите «Применить» или Enter",
"Система покажет все договоры с этим контрагентом"
],
instructionUrl: "#",
tip: "Можно искать по части названия — система подскажет варианты"
}
]; ];
let currentCategory = 'all'; let currentCategory = 'all';
@ -300,7 +172,7 @@ function renderKB() {
<div class="kb-category">${kb.category}</div> <div class="kb-category">${kb.category}</div>
<h3 style="margin:0 0 var(--kt-ai-space-2) 0">${kb.question}</h3> <h3 style="margin:0 0 var(--kt-ai-space-2) 0">${kb.question}</h3>
<p style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin:0"> <p style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin:0">
${kb.steps.length} шагов • ${kb.tip} Нажмите, чтобы увидеть ответ
</p> </p>
</article> </article>
`).join(''); `).join('');
@ -335,20 +207,16 @@ function performSearch() {
document.getElementById('resultTitle').textContent = result.question; document.getElementById('resultTitle').textContent = result.question;
document.getElementById('resultCategory').textContent = result.category; document.getElementById('resultCategory').textContent = result.category;
document.getElementById('resultContent').innerHTML = ` document.getElementById('resultContent').innerHTML = `
<ol class="steps-list"> <div class="kt-ai-empty" style="padding:var(--kt-ai-space-6);text-align:center">
${result.steps.map(s => `<li>${s}</li>`).join('')} <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="var(--kt-ai-fg-faint)" stroke-width="1.5" style="margin-bottom:var(--kt-ai-space-3)">
</ol> <circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
<p style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin-top:var(--kt-ai-space-4)"> </svg>
💡 ${result.tip} <p style="margin:0;color:var(--kt-ai-fg-muted)">Ответ ещё не загружен</p>
</p> <p style="margin:var(--kt-ai-space-2) 0 0 0;font-size:var(--kt-ai-text-sm);color:var(--kt-ai-fg-faint)">Инструкция по этому вопросу будет добавлена позже</p>
</div>
`; `;
const linkEl = document.getElementById('resultLink'); document.getElementById('resultLink').style.display = 'none';
if (result.instructionUrl && result.instructionUrl !== '#') { document.getElementById('noSourceMsg').style.display = 'none';
linkEl.href = result.instructionUrl;
linkEl.style.display = 'inline-flex';
} else {
linkEl.style.display = 'none';
}
resultBlock.style.display = 'block'; resultBlock.style.display = 'block';
emptyState.style.display = 'none'; emptyState.style.display = 'none';
} else { } else {
@ -364,18 +232,13 @@ function showKBDetail(id) {
document.getElementById('modalTitle').textContent = kb.question; document.getElementById('modalTitle').textContent = kb.question;
document.getElementById('modalBody').innerHTML = ` document.getElementById('modalBody').innerHTML = `
<div class="kb-category" style="margin-bottom:var(--kt-ai-space-4)">${kb.category}</div> <div class="kb-category" style="margin-bottom:var(--kt-ai-space-4)">${kb.category}</div>
<ol class="steps-list"> <div class="kt-ai-empty" style="padding:var(--kt-ai-space-6);text-align:center">
${kb.steps.map(s => `<li>${s}</li>`).join('')} <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="var(--kt-ai-fg-faint)" stroke-width="1.5" style="margin-bottom:var(--kt-ai-space-3)">
</ol> <circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
<div class="kt-ai-card" style="background:var(--kt-ai-bg-soft);margin-top:var(--kt-ai-space-5)"> </svg>
<strong>💡 Совет:</strong> <p style="margin:0;color:var(--kt-ai-fg-muted)">Ответ ещё не загружен</p>
<p style="margin:var(--kt-ai-space-2) 0 0 0;color:var(--kt-ai-fg-muted)">${kb.tip}</p> <p style="margin:var(--kt-ai-space-2) 0 0 0;font-size:var(--kt-ai-text-sm);color:var(--kt-ai-fg-faint)">Инструкция по этому вопросу будет добавлена позже</p>
</div> </div>
${kb.instructionUrl && kb.instructionUrl !== '#' ? `
<a href="${kb.instructionUrl}" class="kt-ai-btn" data-variant="primary" style="margin-top:var(--kt-ai-space-5);width:100%" target="_blank">
Открыть полную инструкцию
</a>
` : ''}
`; `;
document.getElementById('modalOverlay').classList.add('active'); document.getElementById('modalOverlay').classList.add('active');