fix: экран 1 — добавлены кнопки «Загрузка файлов» и «Загрузить», ждущие файлы подсвечены

This commit is contained in:
tore 2026-09-22 10:47:40 +00:00
parent 26564269d6
commit d2eeb631f1
2 changed files with 61 additions and 7 deletions

View File

@ -228,7 +228,7 @@ function vUpload() {
for (var i = 0; i < D.files.length; i++) if (D.files[i].s === "ready") readyCount++;
var all = readyCount === D.files.length;
var head = "";
var head = headReady;
if (all && !D.running) {
head = '<div class="kt-ai-banner" data-tone="ok" style="margin-bottom:var(--kt-ai-stack-block);display:flex;align-items:center;gap:var(--kt-ai-space-5)">' +
'<span style="flex:1;min-width:0">Все материалы получены — пакет готов к запуску анализа</span>' +
@ -236,15 +236,23 @@ function vUpload() {
}
var rows = D.files.map(function (f, i) {
return "<tr>" +
'<td data-label="Файл">' + esc(f.n) + '</td>' +
var statusCell = pill(f.s);
if (f.s === "wait") statusCell += ' <span class="kt-ai-chip" data-tone="orange" style="margin-left:var(--kt-ai-space-2)">ждёт загрузки</span>';
return "<tr" + (f.s === "wait" ? ' data-wait="true"' : "") + ">" +
'<td data-label="Файл">' + esc(f.n) + "</td>" +
'<td data-label="Тип"><span class="kt-ai-meta">' + esc(f.t) + "</span></td>" +
'<td data-label="Загружен"><span class="kt-ai-num" style="font-size:var(--kt-ai-text-xs)">' + esc(f.d) + "</span></td>" +
'<td data-label="Статус">' + pill(f.s) + "</td>" +
'<td><div class="row-act"><button class="kt-ai-icon-button" title="Просмотреть содержимое" onclick="S.viewFile(' + i + ")'>" + icon("eye") + "</button></div></td>" +
'<td data-label="Статус">' + statusCell + "</td>" +
'<td class="row-act"><button class="kt-ai-btn" data-size="sm" data-variant="ghost" onclick="S.viewFile(' + i + ')">Смотреть</button></td>' +
"</tr>";
}).join("");
var headReady = hasWaiting
? '<div class="kt-ai-banner" data-tone="info" style="margin-bottom:var(--kt-ai-stack-block)">' +
"<strong>Пакет не собран</strong>" +
'<span class="kt-ai-meta" style="display:block;margin-top:2px">Не все файлы получены от кандидата — анализ станет доступен после загрузки остальных материалов.</span></div>'
: "";
return '<section class="sec"><div class="sec-h">Процесс' +
'<span class="spacer"></span>' +
'<span class="kt-ai-meta">Заявка ' + num("ЭД-2026-118") + "</span></div>" + vStepper() + "</section>" +
@ -268,8 +276,8 @@ function vUpload() {
'<div>' + (s.u ? pill("ok", "Синхронизирован") : pill("checked", "Синхронизация")) + "</div></div>";
}).join("") + "</div></section>" +
'<section class="kt-ai-conclusion"><h3>Что на этом экране</h3>' +
"<p>Перед запуском анализа проверьте комплектность: для сверки нужны пояснительная записка и подтверждающие материалы. " +
"Анализ идёт по пяти источникам — законодательству и внутренним правилам. Статус «Готово к анализу» появляется после проверки каждого файла.</p></section>";
"<p>Строками идёт по заявке и пакету документов. Статусы файлов: «Ожидает проверки» — файл ещё получен не был, «Готово к анализу» — файл проверен и получен. " +
"Когда собран весь пакет, вверху экрана появляется кнопка «Запустить анализ ИИ».</p></section>";
}
/* ---------- Экран 2. Результаты анализа ИИ ---------- */
@ -477,6 +485,50 @@ function nowTime() {
}
/* ---------- Действия ---------- */
S.uploadFiles = function () {
var input = document.createElement("input");
input.type = "file";
input.multiple = true;
input.accept = ".pdf,.docx,.xlsx,.csv,.txt,.doc";
input.onchange = function () {
var files = input.files || [];
if (files.length === 0) return;
var added = 0;
for (var i = 0; i < files.length; i++) {
var f = files[i];
var exists = false;
for (var j = 0; j < D.files.length; j++) {
if (D.files[j].s === "wait" && D.files[j].n.toLowerCase().indexOf(f.name.toLowerCase().slice(0, 20)) >= 0) {
D.files[j].s = "ready";
D.files[j].d = nowTime();
exists = true;
added++;
break;
}
}
if (!exists) {
var ext = (f.name.lastIndexOf(".") >= 0) ? f.name.slice(f.name.lastIndexOf(".")) : "";
var typeLabel = "Подтверждающий документ";
if (f.name.toLowerCase().indexOf("записк") >= 0) typeLabel = "Пояснительная записка";
D.files.push({ n: f.name, t: typeLabel, d: nowTime() + " (загрузка)", s: "ready" });
added++;
}
}
save();
render();
toast(added + " файл(ов) добавлено в пакет", "ok");
var allNow = D.files.every(function (x) { return x.s === "ready"; });
if (allNow) toast("Пакет собран — анализ стал доступен", "ok");
};
input.click();
};
S.fileReady = function (i) {
D.files[i].s = "ready";
render();
toast("Файл отмечен как готовый к анализу", "ok");
};
S.go = function (id) { D.view = id; render(); };
S.analyze = function () {

View File

@ -8,6 +8,8 @@
/* Кнопки в строке таблицы */
.row-act { display: flex; align-items: center; justify-content: flex-end; gap: var(--kt-ai-space-2); }
tr[data-wait="true"] td { opacity: .7; }
tr[data-wait="true"] td:first-child { color: var(--kt-ai-status-warn-fg); font-weight: var(--kt-ai-weight-medium); }
/* Шапка приложения: заголовок + подзаголовок */
.tb-title { display: flex; flex-direction: column; gap: 1px; min-width: 0; }