history.component.html 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <div class="history-container">
  2. <div class="history-header glass-panel">
  3. <h1>Vault & History</h1>
  4. <p>View previous detections and industrial reports.</p>
  5. <div class="vault-tabs">
  6. <button [class.active]="viewMode === 'local'" (click)="switchTab('local')" class="tab-btn">
  7. <span class="icon">💻</span> Browser Cache
  8. </button>
  9. <button [class.active]="viewMode === 'remote'" (click)="switchTab('remote')" class="tab-btn">
  10. <span class="icon">☁️</span> Industrial Cloud (API)
  11. </button>
  12. </div>
  13. </div>
  14. <div *ngIf="loading" class="loading-state glass-panel">
  15. <div class="spinner"></div>
  16. <p>Synchronizing vault data...</p>
  17. </div>
  18. <div *ngIf="!loading && currentHistory.length === 0" class="empty-state glass-panel">
  19. <div class="empty-icon">📭</div>
  20. <p *ngIf="viewMode === 'local'">Your browser cache is empty. Run a local analysis to save records.</p>
  21. <p *ngIf="viewMode === 'remote'">No industrial records found on the server.</p>
  22. </div>
  23. <div *ngIf="!loading && currentHistory.length > 0" class="history-list">
  24. <div *ngFor="let record of currentHistory"
  25. class="history-card glass-panel"
  26. [class.expanded]="isExpanded(record.timestamp, record.filename, record.archive_id)">
  27. <div class="card-header" (click)="toggleExpand(record.timestamp, record.filename, record.archive_id)">
  28. <div class="card-main-info">
  29. <span class="timestamp">{{ record.timestamp }}</span>
  30. <span class="filename">{{ record.filename }}</span>
  31. <span class="engine-badge">{{ record.engine }}</span>
  32. </div>
  33. <div class="summary-mini">
  34. <span *ngFor="let badge of getSummaryBadge(record.summary)" class="badge">{{ badge }}</span>
  35. </div>
  36. <div class="expand-icon">{{ isExpanded(record.timestamp, record.filename, record.archive_id) ? '▾' : '▸' }}</div>
  37. </div>
  38. <div *ngIf="isExpanded(record.timestamp, record.filename, record.archive_id)" class="card-details">
  39. <hr>
  40. <div class="details-grid">
  41. <div class="preview-side">
  42. <div *ngIf="record.imageData" class="image-wrapper">
  43. <img [src]="record.imageData" alt="Analysis Preview">
  44. <div *ngFor="let det of record.detections"
  45. class="detection-box"
  46. [ngStyle]="getBoxStyles(det.box, record.dimensions)">
  47. </div>
  48. </div>
  49. <div *ngIf="!record.imageData" class="no-image-preview">
  50. <p>Cloud Archive: Metadata Only</p>
  51. </div>
  52. </div>
  53. <div class="data-side">
  54. <h3>Industrial Metrics</h3>
  55. <ul>
  56. <li><strong>Total Bunches:</strong> {{ record.detections.length }}</li>
  57. <li><strong>Archive ID:</strong> {{ record.archive_id || 'LOCAL_ONLY' }}</li>
  58. <li><strong>Inference:</strong> {{ record.inference_ms }} ms</li>
  59. <li><strong>Processing:</strong> {{ (record.processing_ms || 0).toFixed(1) }} ms</li>
  60. </ul>
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. </div>
  66. </div>