Files
Atomizer/dashboard/frontend/index.html
Anto01 1dab9d638d feat: Add professional web-based optimization dashboard
Complete dashboard UI for controlling and monitoring optimization runs.

Backend API (Flask):
- RESTful endpoints for study management
- Start/stop/resume optimization runs
- Real-time status monitoring
- Configuration management
- Visualization data endpoints

Frontend (HTML/CSS/JS + Chart.js):
- Modern gradient design with cards and charts
- Study list sidebar with metadata
- Active optimizations monitoring (5s polling)
- Interactive charts (progress, design vars, constraints)
- Trial history table
- New optimization modal
- Resume/delete study actions

Features:
- List all studies with trial counts
- View detailed study results
- Start new optimizations from UI
- Resume existing studies with additional trials
- Real-time progress monitoring
- Delete unwanted studies
- Chart.js visualizations (progress, DVs, constraints)
- Configuration file selection
- Study metadata tracking

Usage:
  python dashboard/start_dashboard.py
  # Opens browser to http://localhost:5000

Dependencies:
  flask, flask-cors (auto-installed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 13:37:33 -05:00

185 lines
7.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Atomizer - Optimization Dashboard</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="dashboard-container">
<!-- Header -->
<header class="dashboard-header">
<div class="header-content">
<h1>⚛️ Atomizer</h1>
<p class="subtitle">Optimization Dashboard</p>
</div>
<div class="header-actions">
<button class="btn btn-primary" onclick="showNewOptimizationModal()">
▶️ New Optimization
</button>
<button class="btn btn-secondary" onclick="refreshStudies()">
🔄 Refresh
</button>
</div>
</header>
<!-- Main Content -->
<div class="main-content">
<!-- Sidebar -->
<aside class="sidebar">
<div class="sidebar-section">
<h3>Studies</h3>
<div id="studiesList" class="studies-list">
<p class="loading">Loading studies...</p>
</div>
</div>
<div class="sidebar-section">
<h3>Active Optimizations</h3>
<div id="activeOptimizations" class="active-list">
<p class="empty">No active optimizations</p>
</div>
</div>
</aside>
<!-- Content Area -->
<main class="content-area">
<!-- Welcome Screen -->
<div id="welcomeScreen" class="welcome-screen">
<h2>Welcome to Atomizer</h2>
<p>Select a study from the sidebar or start a new optimization</p>
<div class="quick-actions">
<button class="btn btn-large btn-primary" onclick="showNewOptimizationModal()">
Start New Optimization
</button>
<button class="btn btn-large btn-secondary" onclick="refreshStudies()">
View Existing Studies
</button>
</div>
</div>
<!-- Study Details View -->
<div id="studyDetails" class="study-details" style="display: none;">
<div class="study-header">
<div>
<h2 id="studyTitle">Study Name</h2>
<p id="studyMeta" class="study-meta"></p>
</div>
<div class="study-actions">
<button class="btn btn-primary" onclick="resumeCurrentStudy()">
▶️ Resume Study
</button>
<button class="btn btn-danger" onclick="deleteCurrentStudy()">
🗑️ Delete
</button>
</div>
</div>
<!-- Best Result Card -->
<div class="results-cards">
<div class="result-card">
<h3>Best Result</h3>
<div class="result-value" id="bestObjective">-</div>
<p class="result-label">Objective Value</p>
</div>
<div class="result-card">
<h3>Total Trials</h3>
<div class="result-value" id="totalTrials">-</div>
<p class="result-label">Completed</p>
</div>
<div class="result-card">
<h3>Best Parameters</h3>
<div id="bestParams" class="params-list"></div>
</div>
</div>
<!-- Charts -->
<div class="charts-container">
<div class="chart-card">
<h3>Optimization Progress</h3>
<canvas id="progressChart"></canvas>
</div>
<div class="chart-card">
<h3>Design Variables</h3>
<canvas id="designVarsChart"></canvas>
</div>
<div class="chart-card">
<h3>Constraints</h3>
<canvas id="constraintsChart"></canvas>
</div>
</div>
<!-- History Table -->
<div class="history-section">
<h3>Trial History</h3>
<div class="table-container">
<table id="historyTable">
<thead>
<tr>
<th>Trial</th>
<th>Objective</th>
<th>Design Variables</th>
<th>Constraints</th>
<th>Timestamp</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</main>
</div>
</div>
<!-- New Optimization Modal -->
<div id="newOptimizationModal" class="modal" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<h2>Start New Optimization</h2>
<button class="close-btn" onclick="closeNewOptimizationModal()">×</button>
</div>
<div class="modal-body">
<div class="form-group">
<label>Study Name</label>
<input type="text" id="newStudyName" placeholder="my_optimization_study" />
</div>
<div class="form-group">
<label>Number of Trials</label>
<input type="number" id="newTrials" value="50" min="1" />
</div>
<div class="form-group">
<label>Configuration File</label>
<select id="newConfigPath">
<option value="examples/bracket/optimization_config_stress_displacement.json">
Bracket - Stress Minimization
</option>
<option value="examples/bracket/optimization_config.json">
Bracket - Multi-objective
</option>
</select>
</div>
<div class="form-group">
<label>
<input type="checkbox" id="resumeExisting" />
Resume existing study (if exists)
</label>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" onclick="closeNewOptimizationModal()">
Cancel
</button>
<button class="btn btn-primary" onclick="startOptimization()">
Start Optimization
</button>
</div>
</div>
</div>
<script src="app.js"></script>
</body>
</html>