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; }
Nubes - Сверка договоров v1.9 + Сверка договоров v1.10
@@ -62,7 +75,7 @@
- +
ИмяИзменёнРазмерСтатус
ИмяИзменёнРазмерСтатус
@@ -75,6 +88,18 @@
+ + +