Skip to content

Commit 37a414f

Browse files
committed
ci: Add GitHub Actions workflow for build and release
1 parent 519cda3 commit 37a414f

33 files changed

+2364
-1472
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
* text=auto
22
*.exe filter=lfs diff=lfs merge=lfs -text
33
*.pkg filter=lfs diff=lfs merge=lfs -text
4+
*.yml text eol=lf

assets/icon.png

-35.5 KB
Loading

branding.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"appName": "DASHBOARD for OpenIPC",
3+
"iconPath": "assets/icon.ico"
4+
}

builder-intellect.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
"mac": {
2727
"icon": "assets/icon.png"
2828
},
29+
"nsis": {
30+
"artifactName": "${productName}-Setup-${version}.${ext}"
31+
},
32+
"portable": {
33+
"artifactName": "${productName}-Portable-${version}.${ext}"
34+
},
2935
"extraResources": [
3036
{
3137
"from": "extra/analytics/",
@@ -42,5 +48,6 @@
4248
"asarUnpack": [
4349
"**/node_modules/@ffmpeg-installer/ffmpeg/**",
4450
"**/node_modules/keytar/**"
45-
]
51+
],
52+
"generateUpdatesFilesForAllChannels": true
4653
}

builder-lite.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,6 @@
4444
"asarUnpack": [
4545
"**/node_modules/@ffmpeg-installer/ffmpeg/**",
4646
"**/node_modules/keytar/**"
47-
]
47+
],
48+
"generateUpdatesFilesForAllChannels": true
4849
}

css/components/grid.css

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,11 @@
4242
z-index: 1;
4343
}
4444

45-
/* --- НАЧАЛО ИЗМЕНЕНИЯ --- */
4645
.grid-cell:hover {
4746
z-index: 99;
48-
/* transform: scale(1.02); <-- Эффект увеличения убран */
49-
border-color: var(--accent-color); /* Рамка становится ярче */
50-
box-shadow: 0 0 8px rgba(var(--accent-color-rgb), 0.5); /* Добавлено мягкое свечение */
47+
border-color: var(--accent-color);
48+
box-shadow: 0 0 8px rgba(var(--accent-color-rgb), 0.5);
5149
}
52-
/* --- КОНЕЦ ИЗМЕНЕНИЯ --- */
5350

5451
.video-wrapper {
5552
position: relative;
@@ -165,6 +162,21 @@
165162
transition: opacity 0.2s ease-in-out;
166163
}
167164

165+
/* VVVVVV --- НАЧАЛО НОВОГО БЛОКА ИСПРАВЛЕНИЙ --- VVVVVV */
166+
167+
/* Делаем z-index еще выше в полноэкранном режиме, чтобы гарантировать кликабельность */
168+
.grid-cell.fullscreen .cell-controls {
169+
z-index: 1002; /* Выше, чем z-index самой ячейки */
170+
}
171+
172+
/* Скрываем кнопку "Закрыть" в полноэкранном режиме */
173+
.grid-cell.fullscreen .cell-controls .close-btn {
174+
display: none;
175+
}
176+
177+
/* ^^^^^^ --- КОНЕЦ НОВОГО БЛОКА ИСПРАВЛЕНИЙ --- ^^^^^^ */
178+
179+
168180
.grid-cell:hover .cell-controls,
169181
.grid-cell:hover .cell-name {
170182
opacity: 1;
@@ -489,10 +501,24 @@
489501
opacity: 0.7;
490502
}
491503

492-
/* VVVVVV --- ИЗМЕНЕНИЕ ЗДЕСЬ: ЭТО ПРАВИЛО БЫЛО УДАЛЕНО/ЗАКОММЕНТИРОВАНО --- VVVVVV */
493504
/*
494505
.grid-cell.paused-state .cell-controls {
495506
display: none;
496507
}
497508
*/
498-
/* ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^^^ */
509+
510+
/* --- ИСПРАВЛЕНИЕ Drag-n-Drop: Делаем видео "прозрачным" для событий перетаскивания --- */
511+
.grid-cell .video-wrapper,
512+
.grid-cell .video-player {
513+
pointer-events: none;
514+
}
515+
516+
/* Возвращаем кликабельность для всех элементов управления, которые лежат поверх видео */
517+
.grid-cell .cell-controls,
518+
.grid-cell .cell-controls *,
519+
.grid-cell .ptz-overlay,
520+
.grid-cell .ptz-overlay *,
521+
.grid-cell .ptz-zoom-controls,
522+
.grid-cell .ptz-zoom-controls * {
523+
pointer-events: all;
524+
}

css/components/utility.css

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,22 @@ body.version-intellect .tab-content.intellect-only {
9292
body.version-intellect .tab-content.intellect-only.active {
9393
display: block !important;
9494
}
95-
/* ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^^^ */
95+
/* ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^^^ */
96+
97+
98+
/* VVVVVV --- НАЧАЛО НОВОГО БЛОКА ИСПРАВЛЕНИЙ --- VVVVVV */
99+
100+
/* --- Стили для полноэкранного режима просмотра --- */
101+
/* Когда на #grid-container есть класс .fullscreen-mode, скрываем все лишнее */
102+
#grid-container.fullscreen-mode ~ .sidebar,
103+
#grid-container.fullscreen-mode ~ .bottom-toolbar,
104+
body:has(#grid-container.fullscreen-mode) .header {
105+
display: none !important;
106+
}
107+
108+
/* Убираем отступы у контейнера, чтобы видео занимало 100% экрана */
109+
body:has(#grid-container.fullscreen-mode) .view-container {
110+
padding: 0 !important;
111+
}
112+
113+
/* ^^^^^^ --- КОНЕЦ НОВОГО БЛОКА ИСПРАВЛЕНИЙ --- ^^^^^^ */

index.html

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
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';

js/archive-manager.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
clipStartBtn, clipExportBtn;
1111

1212
const DAY_IN_SECONDS = 86400;
13-
// START: ИСПРАВЛЕНИЕ - Убираем скорости 8x и 16x для стабильности
13+
// Убираем нестабильные скорости 8x и 16x для HLS-воспроизведения,
14+
// чтобы повысить надежность работы архива.
1415
const PLAYBACK_SPEEDS = [1, 2, 4];
15-
// END: ИСПРАВЛЕНИЕ
1616
const MIN_ZOOM = 1;
1717
const MAX_ZOOM = 24 * 12;
1818
const COLORS = {
@@ -384,10 +384,6 @@
384384

385385
async function openArchiveForCamera(camera) {
386386
currentCamera = camera;
387-
const mainContainer = document.querySelector('.main-container');
388-
if (archiveView.parentElement !== mainContainer) {
389-
mainContainer.appendChild(archiveView);
390-
}
391387
mainView.classList.add('hidden');
392388
archiveView.classList.remove('hidden');
393389
cameraNameEl.textContent = `${App.t('archive_title')}: ${camera.name}`;
@@ -590,9 +586,27 @@
590586
drawTimeline();
591587
}
592588

589+
// VVVVVV --- НАЧАЛО НОВОГО БЛОКА --- VVVVVV
590+
/**
591+
* Вызывается из renderer.js при получении события о новой записи от MediaMTX.
592+
* Проверяет, открыт ли архив для нужной камеры, и если да - обновляет данные.
593+
* @param {string} cameraName - Имя камеры, для которой создана новая запись.
594+
*/
595+
function refreshDataIfVisible(cameraName) {
596+
if (!archiveView.classList.contains('hidden') && currentCamera && currentCamera.name === cameraName) {
597+
console.log(`[Archive] Refreshing data for visible camera: ${cameraName} due to webhook event.`);
598+
// Эта функция уже умеет перезагружать все данные для текущей даты и камеры
599+
loadDataForSelectedDate();
600+
}
601+
}
602+
// ^^^^^^ --- КОНЕЦ НОВОГО БЛОКА --- ^^^^^^
603+
593604
return {
594605
init,
595-
openArchiveForCamera
606+
openArchiveForCamera,
607+
// VVVVVV --- НАЧАЛО ИЗМЕНЕНИЯ --- VVVVVV
608+
refreshDataIfVisible // "Экспортируем" новую функцию, чтобы renderer.js мог ее вызвать
609+
// ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^^^
596610
};
597611
};
598612
})(window);

0 commit comments

Comments
 (0)