diff --git a/site/app.py b/site/app.py
index a8961ff..fbdde64 100644
--- a/site/app.py
+++ b/site/app.py
@@ -147,6 +147,23 @@ class ContractsApp:
supp_rows = [dict(zip(supps["columns"], r)) for r in supps["rows"]]
+ def _file_done(name, elapsed, elements, errors, text):
+ paragraphs = sum(1 for e in elements if e.get("type") == "paragraph")
+ tables = sum(1 for e in elements if e.get("type") == "table")
+ table_rows = sum(len(e.get("rows", [])) for e in elements if e.get("type") == "table")
+ return {
+ "type": "file_done",
+ "name": name,
+ "time_s": elapsed,
+ "elements": len(elements),
+ "paragraphs": paragraphs,
+ "tables": tables,
+ "table_rows": table_rows,
+ "errors": errors,
+ "text_len": len(text) if text else 0,
+ "text_preview": text[:200] if text else "",
+ }
+
for s in supp_rows:
# Пропустить уже распарсенные
existing, _ = db.query(
@@ -223,7 +240,7 @@ class ContractsApp:
)
zelapsed = round(time_mod.time() - zf_start, 2)
files_processed += 1
- yield f"data: {json.dumps({'type': 'file_done', 'name': zname, 'time_s': zelapsed, 'elements': len(zelements)})}\n\n"
+ yield f"data: {json.dumps(_file_done(zname, zelapsed, zelements, zpr.get('errors',[]), ztext))}\n\n"
except Exception as e:
yield f"data: {json.dumps({'type': 'file_error', 'name': zname, 'error': str(e)})}\n\n"
@@ -244,7 +261,7 @@ class ContractsApp:
)
elapsed = round(time_mod.time() - file_start, 2)
files_processed += 1
- yield f"data: {json.dumps({'type': 'file_done', 'name': s['filename'], 'time_s': elapsed, 'elements': len(elements)})}\n\n"
+ yield f"data: {json.dumps(_file_done(s['filename'], elapsed, elements, pr.get('errors',[]), text))}\n\n"
total_time = round(time_mod.time() - start_time, 2)
yield f"data: {json.dumps({'type': 'summary', 'total_time_s': total_time, 'total_bytes': total_bytes, 'files_processed': files_processed})}\n\n"
diff --git a/site/templates/upload.html b/site/templates/upload.html
index e701205..2c38d96 100644
--- a/site/templates/upload.html
+++ b/site/templates/upload.html
@@ -42,12 +42,25 @@
.empty-row td { color: var(--muted); text-align: center; padding: 24px; }
.remove-btn { cursor: pointer; color: var(--muted); background: none; border: none; padding: 2px 4px; font-size: 16px; line-height: 1; }
.remove-btn:hover { color: var(--destructive); }
+ .info-btn { cursor: pointer; color: var(--muted); background: none; border: none; padding: 2px 4px; font-size: 14px; display: none; }
+ .info-btn:hover { color: var(--brand-primary); }
+ .info-btn.visible { display: inline; }
+ /* Modal */
+ .modal-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,.4); z-index: 100; justify-content: center; align-items: center; }
+ .modal-overlay.open { display: flex; }
+ .modal { background: var(--background); border-radius: 12px; border: 1px solid var(--brand-gray); box-shadow: 0 4px 24px rgba(0,0,0,.15); max-width: 520px; width: 90%; max-height: 80vh; overflow-y: auto; }
+ .modal-header { padding: 14px 16px; border-bottom: 1px solid var(--brand-gray); display: flex; align-items: center; gap: 8px; font-weight: 600; }
+ .modal-body { padding: 16px; }
+ .modal-body .kv { display: flex; margin-bottom: 6px; font-size: 13px; }
+ .modal-body .kv .k { color: var(--muted); width: 110px; flex-shrink: 0; }
+ .modal-body .kv .v { word-break: break-all; }
+ .modal-body pre { background: var(--brand-grey-light); padding: 10px; border-radius: 6px; font-size: 12px; max-height: 200px; overflow-y: auto; white-space: pre-wrap; margin-top: 4px; }
 }})
-
Сверка договоров v1.9
+
Сверка договоров v1.10
@@ -62,7 +75,7 @@
- | Имя | Изменён | Размер | Статус | |
+ | Имя | Изменён | Размер | Статус | |
@@ -75,6 +88,18 @@
+
+
+