naeel
|
9a19b10708
|
v1.0.178: fix zipIdx → zipEntry (ссылка на объект). ZIP temp entry держится до конца обработки.
|
2026-06-25 10:36:23 +04:00 |
|
naeel
|
91f22137d7
|
v1.0.178: fix — onFilesSelected больше не удаляет существущие файлы. reconcileSelection убрана из оркестратора. Файлы из ZIP/предыдущих загрузок сохраняются при добавлении новых.
|
2026-06-25 10:33:36 +04:00 |
|
naeel
|
60dd40cf05
|
v1.0.178: унификация ZIP. addZipFile → base64→File→addRegularFile (единый путь). confirm() при дубликате. unzip.py — только распаковка, без БД.
|
2026-06-25 10:16:06 +04:00 |
|
naeel
|
b013c79190
|
v1.0.178: fix unzip — xhr.send(file) → FormData. Бэкенд ждёт multipart (ищет \r\n\r\n + PK magic), а не сырой файл.
|
2026-06-25 10:08:16 +04:00 |
|
naeel
|
9b129c3707
|
v1.0.178: fix двойной проверки дубликатов в addZipFile + console.error для диагностики unzip
|
2026-06-25 10:06:51 +04:00 |
|
naeel
|
0f6f102664
|
v1.0.178: addZipFile — дубликаты из ZIP теперь перезаписываются (как addRegularFile). Унифицировано поведение: файл из архива заменяет существующий с тем же именем.
|
2026-06-25 09:50:06 +04:00 |
|
naeel
|
b25c58ae29
|
v1.0.178: расширенные тесты (131 шт) + чистка app.js. 53 новых теста: краевые случаи statusToHTML, applyParseResult, reconcileSelection, renderGroupCard(*), applyCompareEvent, renderCompareOpsTable, escHtml. Убран неиспользуемый SITE_URL, дубль UNZIP_URL, дубль promptEditor.
|
2026-06-25 09:42:38 +04:00 |
|
naeel
|
9c08af6a1d
|
v1.0.178: убрал неиспользуемую llmStart после Фазы 3
|
2026-06-25 09:36:34 +04:00 |
|
naeel
|
691549223f
|
v1.0.178: тесты чистых функций. 78 тестов: statusToHTML, applyParseResult, reconcileSelection, renderGroupCard(*), applyCompareEvent, renderCompareSectionHeader/Body, renderCompareOpsTable. Все PASS.
|
2026-06-25 09:28:15 +04:00 |
|
naeel
|
7e76224203
|
v1.0.178: Фаза 4 — renderStepper(state). Степпер через state.ui.steps вместо прямой манипуляции DOM. stepDone/stepActive/resetStepper мутируют state → renderStepper.
|
2026-06-25 09:25:15 +04:00 |
|
naeel
|
c9d55b3d80
|
v1.0.178: Фаза 3 — compare.js. applyCompareEvent, startCompareSSE, renderCompareOpsTable. ~160 строк дублирования SSE → ~60 строк общих + 2 тонких вызова в runCompareForGroup и llmBtn.
|
2026-06-25 09:24:26 +04:00 |
|
naeel
|
e7917c8af5
|
v1.0.178: Фаза 2 — groups.js. loadGroupsAction + renderGroups + renderGroupCard + renderGroupCardDone. markGroupDone удалена, готовность = group.compare.status === 'done'. renderGroups пересобирает ВСЕ карточки из state.groups.
|
2026-06-25 09:15:54 +04:00 |
|
naeel
|
ba9a833ce8
|
v1.0.178: Фаза 1.4 — разбит fileInput handler. Чистые функции: reconcileSelection, applyParseResult. Async-actions: addZipFile, addRegularFile. Оркестратор: onFilesSelected (15 строк). finalizeUpload. app.js fileInput listener: 4 строки.
|
2026-06-25 08:59:17 +04:00 |
|
naeel
|
67658d0ef1
|
v1.0.178: Фаза 1.3 — вынос в files.js. statusToHTML, renderFiles, syncDB, toggleClassifyDetail, uploadFile, refreshSupps → files.js. app.js похудел на ~200 строк. index.cfm грузит files.js.
|
2026-06-25 08:57:22 +04:00 |
|
naeel
|
3200ce749b
|
v1.0.178: Фаза 1.2 — renderTable → renderFiles(state). render(state) теперь вызывает renderFiles(state). Имя отражает ответственность — рендерит ТОЛЬКО таблицу файлов.
|
2026-06-25 08:54:58 +04:00 |
|
naeel
|
9dd1afd832
|
v1.0.178: Фаза 1.1 — statusToHTML. Статусы из HTML-строк в структуры {kind,pct,text,count,elapsed}. Чистая функция statusToHTML(st). renderTable использует statusToHTML(f.status).
|
2026-06-25 08:54:39 +04:00 |
|
naeel
|
7490568b4b
|
v1.0.178: Фаза 0 — state + render(state). Введён state.js (центральное состояние), render(state) вызывает renderTable(). fileQueue/contractId/batchId/_activeCompare → state.*. app_utils.js адаптирован. Подробные комментарии из decoupling-final-plan.md.
|
2026-06-25 08:44:52 +04:00 |
|
naeel
|
b994da8c4c
|
v1.0.177: inline onclick на diff-section-header — переживает markGroupDone
|
2026-06-24 20:25:07 +04:00 |
|
naeel
|
6806ee5027
|
v1.0.177: клик на файл сам переключает diff-section-body (addEventListener теряется)
|
2026-06-24 20:19:21 +04:00 |
|
naeel
|
332fad2e1a
|
v1.0.177: клик на имя файла в обработанной группе — раскрыть/свернуть результаты
|
2026-06-24 20:18:29 +04:00 |
|
naeel
|
84898e10d6
|
v1.0.177: необработанная — только кнопка; обработанная — только раскрытие
|
2026-06-24 20:08:09 +04:00 |
|
naeel
|
38ade38573
|
v1.0.177: markGroupDone сохраняет HTML результатов — раскрытие работает
|
2026-06-24 20:05:02 +04:00 |
|
naeel
|
5955c03677
|
v1.0.177: buildGroupCard + markGroupDone — разная вёрстка для необработанных и готовых
|
2026-06-24 20:02:46 +04:00 |
|
naeel
|
08220fa4b9
|
v1.0.177: группы независимы — изменения в одной не касаются других
|
2026-06-24 20:01:14 +04:00 |
|
naeel
|
fa06c758f4
|
v1.0.177: Готово НЕ сбрасывается при сравнении другой группы
|
2026-06-24 19:57:55 +04:00 |
|
naeel
|
0562c16897
|
v1.0.177: блокировка ВСЕХ кнопок сравнения пока идёт процесс
|
2026-06-24 19:52:23 +04:00 |
|
naeel
|
7f6d912010
|
v1.0.177: Готово → span, не кнопка — нельзя перезапустить сравнение
|
2026-06-24 19:47:34 +04:00 |
|
naeel
|
7a780e457e
|
v1.0.177: Готово — disabled + data-done, клик не перезапускает
|
2026-06-24 19:37:58 +04:00 |
|
naeel
|
498bee90d8
|
v1.0.177: сравнение внутри карточки группы, только одно одновременно
|
2026-06-24 19:34:00 +04:00 |
|
naeel
|
2a566869aa
|
v1.0.176: classify_input + elements_json в промежуточных результатах
|
2026-06-24 19:23:34 +04:00 |
|
naeel
|
3974a032a5
|
v1.0.176: раскрывающиеся результаты классификации прямо в таблице
|
2026-06-24 18:42:47 +04:00 |
|
naeel
|
3f58f6adcd
|
v1.0.176: FOR UPDATE fix — ORDER BY LIMIT 1 вместо MAX()
|
2026-06-24 18:37:48 +04:00 |
|
naeel
|
d44f8f3e6c
|
v1.0.176: fix self.path → urlparse for ?v= cache bust
|
2026-06-24 18:27:17 +04:00 |
|
naeel
|
0b27832292
|
v1.0.176: X-Content-Type-Options nosniff for ORB fix
|
2026-06-24 18:23:19 +04:00 |
|
naeel
|
b26728d9da
|
v1.0.176: remove verify=False — MITM fix
|
2026-06-24 18:07:44 +04:00 |
|
naeel
|
a36c8fa2bf
|
v1.0.176: prompts — seed per-role + _serialize non-mutating
|
2026-06-24 18:07:02 +04:00 |
|
naeel
|
0e0939bb32
|
v1.0.176: spec_events — FOR UPDATE + transaction for seq race
|
2026-06-24 18:06:05 +04:00 |
|
naeel
|
cd5ba7470e
|
v1.0.176: spec_current cascade fix + keep_ids DoS limit
|
2026-06-24 18:04:59 +04:00 |
|
naeel
|
044a83a43d
|
v1.0.176: grouping.py — apply_groups error handling + doc_id null check
|
2026-06-24 18:04:05 +04:00 |
|
naeel
|
780e52d072
|
v1.0.176: XSS ×5 fix + syncDB await + escHtml(null)
|
2026-06-24 18:03:12 +04:00 |
|
naeel
|
666f85b743
|
v1.0.176: upload.py — path traversal + size limit + UUID + data loss
|
2026-06-24 18:01:18 +04:00 |
|
naeel
|
60dc41e83f
|
v1.0.175: общее сравнение → compareCard, diffBody только для групп
|
2026-06-24 17:42:31 +04:00 |
|
naeel
|
f205f0f547
|
v1.0.175: compareCard отдельно от diffCard — группы не исчезают при сравнении
|
2026-06-24 17:39:19 +04:00 |
|
naeel
|
475d0b8dc7
|
v1.0.175: виртуальные группы + classify_raw + stepper
|
2026-06-24 17:06:25 +04:00 |
|
naeel
|
b5d35f57fc
|
v1.0.174: reset/list_pending без фильтра status=parsed
|
2026-06-24 15:21:17 +04:00 |
|
naeel
|
e939c320cc
|
v1.0.174: classify_batch сбрасывает статус на pending — работает после удаления файлов
|
2026-06-24 15:17:45 +04:00 |
|
naeel
|
592041ab89
|
v1.0.174: 'файлов не распознано' вместо 'не распознано'
|
2026-06-24 15:13:32 +04:00 |
|
naeel
|
70a7c8bfb4
|
v1.0.174: /api/sync — БД = зеркало таблицы, удаление ВСЕГО кроме keep_ids
|
2026-06-24 15:11:57 +04:00 |
|
naeel
|
b19e6ba06e
|
v1.0.174: fix groups count — не считаем __unresolved__ за группу
|
2026-06-24 15:03:17 +04:00 |
|
naeel
|
b325a6b2c2
|
v1.0.174: sync-batch — удаление мусора после загрузки, DELETE /api/documents/<id>
|
2026-06-24 14:59:46 +04:00 |
|