22<html>
33<head>
44 <meta charset="UTF-8">
5- <!-- ИЗМЕНЕНИЕ ЗДЕСЬ: директива connect-src была обновлена -->
65 <meta http-equiv="Content-Security-Policy" content="default-src 'self' video-archive:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; worker-src 'self' blob:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' ws: http:; img-src 'self' data:; media-src 'self' blob: video-archive:; frame-src http:;">
76 <title data-brand="appName">DASHBOARD for OpenIPC</title>
87
@@ -50,7 +49,9 @@ <h2 data-brand="appName" data-i18n-key="app_title"></h2>
5049 </div>
5150 </div>
5251
52+ <!-- VVVVVV --- НАЧАЛО ИЗМЕНЕНИЯ СТРУКТУРЫ --- VVVVVV -->
5353 <div class="main-container">
54+ <!-- Основной вид теперь всегда в DOM, но может быть скрыт -->
5455 <div id="main-view">
5556 <div class="view-container">
5657 <div id="grid-container"></div>
@@ -72,39 +73,42 @@ <h3 data-i18n-key="devices"></h3>
7273 <div id="camera-list-container"></div>
7374 </div>
7475 </div>
75-
76- <div id="archive-view" class="hidden">
77- <div class="archive-main-content">
78- <div class="archive-header">
79- <button id="archive-back-btn" class="icon-button" style="padding: 5px;"><i class="material-icons">arrow_back</i></button>
80- <h2 id="archive-camera-name"></h2>
81- <input type="text" id="archive-date-picker" placeholder="Выберите дату..." style="width: 150px; background-color: var(--bg-light); border: 1px solid var(--border-color); color: var(--text-main); padding: 5px; border-radius: 4px;">
82- </div>
83- <div class="archive-video-container">
84- <video id="archive-video-player" class="hidden"></video>
85- <div id="archive-video-placeholder" class="archive-video-placeholder" data-i18n-key="archive_placeholder"></div>
86- </div>
87- <div class="archive-controls">
88- <button id="ac-play-pause-btn" class="icon-button" title="Воспр./Пауза"><i class="material-icons">play_arrow</i></button>
89- <button id="ac-speed-btn" class="control-button">1.0x</button>
90- <span id="ac-time-display" class="time-display">00:00:00</span>
91- <button id="ac-clip-start-btn" class="icon-button" style="margin-left: auto;" title="Начало клипа"><i class="material-icons">content_cut</i></button>
92- <button id="ac-clip-export-btn" class="icon-button" title="Экспорт клипа" disabled><i class="material-icons">save</i></button>
93- </div>
94- <div class="timeline-container">
95- <div class="timeline-wrapper" id="timeline-wrapper">
96- <canvas id="timeline-canvas"></canvas>
97- <div id="timeline-labels" class="timeline-labels"></div>
98- </div>
99- </div>
76+ <!-- Архив теперь находится на том же уровне, что и main-view -->
77+ </div>
78+
79+ <!-- Архив вынесен за пределы .main-container, чтобы не влиять на его компоновку -->
80+ <div id="archive-view" class="hidden">
81+ <div class="archive-main-content">
82+ <div class="archive-header">
83+ <button id="archive-back-btn" class="icon-button" style="padding: 5px;"><i class="material-icons">arrow_back</i></button>
84+ <h2 id="archive-camera-name"></h2>
85+ <input type="text" id="archive-date-picker" placeholder="Выберите дату..." style="width: 150px; background-color: var(--bg-light); border: 1px solid var(--border-color); color: var(--text-main); padding: 5px; border-radius: 4px;">
86+ </div>
87+ <div class="archive-video-container">
88+ <video id="archive-video-player" class="hidden"></video>
89+ <div id="archive-video-placeholder" class="archive-video-placeholder" data-i18n-key="archive_placeholder"></div>
90+ </div>
91+ <div class="archive-controls">
92+ <button id="ac-play-pause-btn" class="icon-button" title="Воспр./Пауза"><i class="material-icons">play_arrow</i></button>
93+ <button id="ac-speed-btn" class="control-button">1.0x</button>
94+ <span id="ac-time-display" class="time-display">00:00:00</span>
95+ <button id="ac-clip-start-btn" class="icon-button" style="margin-left: auto;" title="Начало клипа"><i class="material-icons">content_cut</i></button>
96+ <button id="ac-clip-export-btn" class="icon-button" title="Экспорт клипа" disabled><i class="material-icons">save</i></button>
10097 </div>
101- <div class="archive-sidebar">
102- <h3>События</h3>
103- <div id="archive-filters"></div>
104- <ul id="event-list"></ul>
98+ <div class="timeline-container">
99+ <div class="timeline-wrapper" id="timeline-wrapper">
100+ <canvas id="timeline-canvas"></canvas>
101+ <div id="timeline-labels" class="timeline-labels"></div>
102+ </div>
105103 </div>
106104 </div>
105+ <div class="archive-sidebar">
106+ <h3>События</h3>
107+ <div id="archive-filters"></div>
108+ <ul id="event-list"></ul>
109+ </div>
107110 </div>
111+ <!-- ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ СТРУКТУРЫ --- ^^^^^^ -->
108112
109113 <div class="bottom-toolbar">
110114 <div class="toolbar-group">
@@ -123,10 +127,6 @@ <h3>События</h3>
123127 </div>
124128 </div>
125129
126- <!-- VVVVVV --- ИЗМЕНЕНИЕ ЗДЕСЬ: ВЕСЬ БЛОК <template> БЫЛ УДАЛЕН --- VVVVVV -->
127- <!-- Старый, захардкоженный шаблон был здесь. Теперь его нет. -->
128- <!-- ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^^^ -->
129-
130130 <div id="app-toast" class="toast-notification"></div>
131131
132132 <script src="jsmpeg.min.js"></script>
@@ -146,8 +146,6 @@ <h3>События</h3>
146146 <script src="./js/renderer.js"></script>
147147
148148 <script>
149- // Если window.api не был создан preload-скриптом Electron,
150- // значит, мы в обычном браузере. Подключаем наш веб-адаптер.
151149 if (typeof window.api === 'undefined') {
152150 const script = document.createElement('script');
153151 script.src = './js/web-api.js';
0 commit comments