Files
vna_system/vna_system/web_ui/templates/index.html
2025-10-06 17:35:52 +03:00

390 lines
22 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="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Панель управления системой для сбора и обработки данных в реальном времени">
<meta name="author" content="VNA System">
<title>Радар</title>
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="/static/assets/favicon.svg">
<link rel="alternate icon" href="/static/assets/favicon.svg">
<!-- Theme color for mobile browsers -->
<meta name="theme-color" content="#1e293b">
<!-- Plotly.js -->
<script src="/static/js/vendor/plotly-2.26.0.min.js"></script>
<!-- Styles -->
<link rel="stylesheet" href="/static/css/normalize.css">
<link rel="stylesheet" href="/static/css/variables.css">
<link rel="stylesheet" href="/static/css/layout.css">
<link rel="stylesheet" href="/static/css/components.css">
<link rel="stylesheet" href="/static/css/charts.css">
<link rel="stylesheet" href="/static/css/settings.css">
<link rel="stylesheet" href="/static/css/acquisition.css">
</head>
<body>
<!-- Header -->
<header class="header">
<div class="header__container">
<div class="header__brand">
<span data-icon="activity" class="header__icon"></span>
<h1 class="header__title">МФТИ</h1>
</div>
<div class="header__status">
<div class="status-indicator" id="connectionStatus">
<div class="status-indicator__dot"></div>
<span class="status-indicator__text">Подключение...</span>
</div>
</div>
<div class="header__controls">
<button class="btn btn--primary btn--sm" id="startBtn" title="Запустить непрерывный сбор">
<span data-icon="play"></span>
<span class="btn__text">Запуск</span>
</button>
<button class="btn btn--secondary btn--sm" id="stopBtn" title="Остановить сбор">
<span data-icon="square"></span>
<span class="btn__text">Стоп</span>
</button>
<button class="btn btn--accent btn--sm" id="singleSweepBtn" title="Запустить одиночный свип">
<span data-icon="zap"></span>
<span class="btn__text">Одиночный</span>
</button>
</div>
<nav class="header__nav">
<button class="nav-btn nav-btn--active" data-view="dashboard">
<span data-icon="bar-chart-3"></span>
<span>Панель</span>
</button>
<button class="nav-btn" data-view="settings">
<span data-icon="settings"></span>
<span>Настройки</span>
</button>
</nav>
</div>
</header>
<!-- Main Content -->
<main class="main">
<!-- Dashboard View -->
<div class="view view--active" id="dashboardView">
<!-- Controls Panel -->
<div class="controls-panel">
<div class="controls-panel__container">
<div class="controls-group">
<label class="controls-label">Информация о сборе</label>
<div class="acquisition-controls">
<div class="acquisition-summary header__summary" id="headerSummary">
<div class="header-summary__item">
<span class="header-summary__label">Пресет</span>
<span class="header-summary__value" id="headerPresetSummary">Не выбран</span>
</div>
<span class="header-summary__divider" aria-hidden="true"></span>
<div class="header-summary__item">
<span class="header-summary__label">Калибровка</span>
<span class="header-summary__value" id="headerCalibrationSummary">Не задана</span>
</div>
<span class="header-summary__divider" aria-hidden="true"></span>
<div class="header-summary__item">
<span class="header-summary__label">Эталон</span>
<span class="header-summary__value" id="headerReferenceSummary">Не снят</span>
</div>
</div>
</div>
<div class="acquisition-status" id="acquisitionStatus">
<div class="status-indicator">
<div class="status-indicator__dot status-indicator__dot--idle"></div>
<span class="status-indicator__text" id="acquisitionStatusText">Ожидание</span>
</div>
<div class="acquisition-mode" id="acquisitionMode">
<span class="mode-label">Режим:</span>
<span class="mode-value" id="acquisitionModeText">Непрерывный</span>
</div>
</div>
</div>
<div class="controls-group">
<label class="controls-label">Процессоры</label>
<div class="processor-toggles" id="processorToggles">
<!-- Переключатели процессоров создаются динамически -->
</div>
</div>
</div>
</div>
<!-- Charts Grid -->
<div class="charts-container">
<div class="charts-grid" id="chartsGrid">
<!-- Графики создаются динамически -->
</div>
<div class="empty-state" id="emptyState">
<div class="empty-state__content">
<span data-icon="activity" class="empty-state__icon"></span>
<h3 class="empty-state__title">Нет данных</h3>
<p class="empty-state__description">
Ожидаем данные свипа от системы...
</p>
<div class="loading-spinner">
<div class="spinner"></div>
</div>
</div>
</div>
</div>
</div>
<!-- Settings View -->
<div class="view" id="settingsView">
<div class="settings-container">
<div class="settings-section">
<h2 class="settings-title">
<span data-icon="settings" class="settings-icon"></span>
Настройки системы
</h2>
<!-- Configuration Presets Section -->
<div class="settings-card">
<h3 class="settings-card-title">Конфигурационные пресеты</h3>
<p class="settings-card-description">Выберите конфигурацию измерений из доступных пресетов</p>
<div class="preset-controls">
<div class="control-group">
<label class="control-label">Доступные пресеты:</label>
<div class="preset-selector" id="presetSelector">
<select class="preset-dropdown settings-select" id="presetDropdown" disabled>
<option value="">Загрузка пресетов...</option>
</select>
<button class="btn btn--primary" id="setPresetBtn" disabled>
<span data-icon="check"></span>
Сделать активным
</button>
</div>
</div>
<div class="preset-info" id="presetInfo">
<div class="preset-details">
<div class="preset-param">
<span class="param-label">Текущий:</span>
<span class="param-value" id="currentPreset">Нет</span>
</div>
</div>
</div>
</div>
</div>
<!-- Calibration Section -->
<div class="settings-card">
<h3 class="settings-card-title">Управление калибровкой</h3>
<p class="settings-card-description">Управление калибровочными данными для точных измерений</p>
<!-- Current Calibration Status -->
<div class="calibration-status" id="calibrationStatus">
<div class="status-item">
<span class="status-label">Текущая калибровка:</span>
<span class="status-value" id="currentCalibration">Нет</span>
</div>
</div>
<!-- Calibration Workflow -->
<div class="calibration-workflow">
<!-- Start New Calibration -->
<div class="workflow-section">
<h4 class="workflow-title">Новая калибровка</h4>
<div class="workflow-controls">
<button class="btn btn--primary" id="startCalibrationBtn" disabled>
<span data-icon="play"></span>
Начать калибровку
</button>
</div>
</div>
<!-- Calibration Steps -->
<div class="workflow-section" id="calibrationSteps" style="display: none;">
<h4 class="workflow-title">Шаги калибровки</h4>
<div class="calibration-progress" id="calibrationProgress">
<div class="progress-info">
<span class="progress-text" id="progressText">0/0</span>
</div>
</div>
<div class="calibration-standards" id="calibrationStandards">
<!-- Кнопки стандартов создаются динамически -->
</div>
<div class="calibration-actions settings-action-group">
<button class="btn btn--secondary" id="viewCurrentPlotsBtn" disabled>
<span data-icon="bar-chart-3"></span>
Графики текущей калибровки
</button>
<input type="text" class="calibration-name-input settings-input" id="calibrationNameInput" placeholder="Введите имя калибровки" disabled>
<button class="btn btn--primary" id="saveCalibrationBtn" disabled>
<span data-icon="save"></span>
Сохранить калибровку
</button>
</div>
</div>
<!-- Existing Calibrations -->
<div class="workflow-section">
<h4 class="workflow-title">Существующие калибровки</h4>
<div class="existing-calibrations" id="existingCalibrations">
<select class="calibration-dropdown settings-select" id="calibrationDropdown" disabled>
<option value="">Калибровки отсутствуют</option>
</select>
<div class="calibration-actions settings-action-group">
<button class="btn btn--primary" id="setCalibrationBtn" disabled>
<span data-icon="check"></span>
Сделать активной
</button>
<button class="btn btn--secondary" id="clearCalibrationBtn" disabled>
<span data-icon="square"></span>
Сбросить
</button>
<button class="btn btn--secondary" id="viewPlotsBtn" disabled>
<span data-icon="bar-chart-3"></span>
Показать графики
</button>
<button class="btn btn--secondary" id="deleteCalibrationBtn" disabled>
<span data-icon="trash-2"></span>
Удалить
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Open Air Reference -->
<div class="settings-card">
<h3 class="settings-card-title">Эталон открытого пространства</h3>
<div class="settings-card-content">
<!-- Create Reference -->
<div class="workflow-section">
<h4 class="workflow-title">Создать эталон</h4>
<div class="reference-creation">
<input type="text" class="reference-name-input settings-input" id="referenceNameInput" placeholder="Введите имя эталона">
<input type="text" class="reference-description-input settings-input" id="referenceDescriptionInput" placeholder="Описание (необязательно)">
<button class="btn btn--primary" id="createReferenceBtn">
<span data-icon="target"></span>
Снять эталон
</button>
</div>
</div>
<!-- Existing References -->
<div class="workflow-section">
<h4 class="workflow-title">Существующие эталоны</h4>
<div class="reference-list" id="referenceList">
<select class="reference-dropdown settings-select" id="referenceDropdown" disabled>
<option value="">Эталоны отсутствуют</option>
</select>
<div class="reference-actions settings-action-group">
<button class="btn btn--primary" id="setReferenceBtn" disabled>
<span data-icon="check"></span>
Использовать
</button>
<button class="btn btn--secondary" id="clearReferenceBtn" disabled>
<span data-icon="square"></span>
Сбросить
</button>
<button class="btn btn--secondary" id="previewReferenceBtn" disabled>
<span data-icon="bar-chart-3"></span>
Просмотр
</button>
<button class="btn btn--secondary" id="deleteReferenceBtn" disabled>
<span data-icon="trash-2"></span>
Удалить
</button>
</div>
<div class="reference-details" id="currentReferenceInfo" style="display: none;">
<div class="reference-details__row">
<span class="reference-details__label">Имя:</span>
<span class="reference-details__value" id="currentReferenceName"></span>
</div>
<div class="reference-details__row">
<span class="reference-details__label">Дата:</span>
<span class="reference-details__value" id="currentReferenceTimestamp"></span>
</div>
<div class="reference-details__row reference-details__row--description">
<span class="reference-details__label">Описание:</span>
<span class="reference-details__value" id="currentReferenceDescription"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- System Summary -->
<div class="settings-card">
<h3 class="settings-card-title">Сводка системы</h3>
<div class="system-summary" id="systemSummary">
<div class="status-item">
<span class="status-label">Получено свипов:</span>
<span class="status-value" id="sweepCount">-</span>
</div>
<div class="status-item">
<span class="status-label">Калибровок сохранено:</span>
<span class="status-value" id="calibrationCount">-</span>
</div>
<div class="status-item">
<span class="status-label">Эталонов сохранено:</span>
<span class="status-value" id="referenceCount">-</span>
</div>
<div class="status-item">
<span class="status-label">Статус системы:</span>
<span class="status-value" id="systemStatus">Режим: —</span>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Calibration Plots Modal -->
<div class="modal" id="plotsModal">
<div class="modal__backdrop" data-modal-close></div>
<div class="modal__content modal__content--large">
<div class="modal__header">
<h2 class="modal__title">
<span data-icon="bar-chart-3"></span>
Графики стандартов калибровки
</h2>
<div class="modal__actions">
<button class="btn btn--secondary btn--sm" id="downloadAllBtn" title="Скачать все данные калибровки">
<span data-icon="download-cloud"></span>
Скачать всё
</button>
<button class="modal__close" data-modal-close title="Закрыть">
<span data-icon="x"></span>
</button>
</div>
</div>
<div class="modal__body" id="plotsModalBody">
<div class="plots-container">
<div class="plots-content">
<div class="plots-grid" id="plotsGrid">
<!-- Здесь появятся отдельные графики -->
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Notification System -->
<div class="notifications" id="notifications"></div>
<!-- Scripts -->
<script type="module" src="/static/js/main.js"></script>
</body>
</html>