Merge remote-tracking branch 'origin/251221-webui-redisign' into beta

# Conflicts:
#	www/index.html
#	www/links.html
#	www/main.js
This commit is contained in:
Sergey Krashevich
2026-03-11 00:02:12 +03:00
9 changed files with 2334 additions and 429 deletions
+53 -19
View File
@@ -6,8 +6,8 @@
<title>add - go2rtc</title>
<style>
main > button {
background-color: #444;
color: white;
background-color: var(--bg-secondary);
color: var(--text-secondary);
cursor: pointer;
padding: 14px;
width: 100%;
@@ -80,7 +80,8 @@
</div>
<script>
document.getElementById('stream').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
div.style.display = div.style.display === 'grid' ? 'none' : 'grid';
});
document.getElementById('stream-form').addEventListener('submit', async ev => {
@@ -102,7 +103,9 @@
</div>
<script>
document.getElementById('alsa').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('alsa-table', 'api/alsa');
});
</script>
@@ -139,7 +142,9 @@
}
document.getElementById('homekit').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await reloadHomeKit();
});
@@ -184,7 +189,9 @@
</div>
<script>
document.getElementById('dvrip').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('dvrip-table', 'api/dvrip');
});
</script>
@@ -196,7 +203,9 @@
</div>
<script>
document.getElementById('devices').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('devices-table', 'api/ffmpeg/devices');
});
</script>
@@ -208,7 +217,9 @@
</div>
<script>
document.getElementById('hardware').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('hardware-table', 'api/ffmpeg/hardware');
});
</script>
@@ -227,7 +238,8 @@
</div>
<script>
document.getElementById('nest').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
div.style.display = div.style.display === 'grid' ? 'none' : 'grid';
});
document.getElementById('nest-form').addEventListener('submit', async ev => {
@@ -247,7 +259,9 @@
</div>
<script>
document.getElementById('gopro').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('gopro-table', 'api/gopro');
});
</script>
@@ -259,7 +273,9 @@
</div>
<script>
document.getElementById('hass').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('hass-table', 'api/hass');
});
</script>
@@ -275,7 +291,9 @@
</div>
<script>
document.getElementById('onvif').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('onvif-table', 'api/onvif');
});
@@ -309,7 +327,8 @@
</div>
<script>
document.getElementById('ring').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
div.style.display = div.style.display === 'grid' ? 'none' : 'grid';
});
async function handleRingAuth(ev) {
@@ -365,7 +384,8 @@
</div>
<script>
document.getElementById('tuya').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
div.style.display = div.style.display === 'grid' ? 'none' : 'grid';
});
document.getElementById('tuya-credentials-form').addEventListener('submit', async ev => {
@@ -405,7 +425,9 @@
</div>
<script>
document.getElementById('roborock').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('roborock-table', 'api/roborock');
});
@@ -423,7 +445,9 @@
</div>
<script>
document.getElementById('v4l2').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('v4l2-table', 'api/v4l2');
});
</script>
@@ -449,7 +473,11 @@
</div>
<script>
async function wyzeReload(ev) {
if (ev) ev.target.nextElementSibling.style.display = 'grid';
if (ev) {
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
}
const r = await fetch('api/wyze', {'cache': 'no-cache'});
const data = await r.json();
@@ -520,7 +548,11 @@
</div>
<script>
async function xiaomiReload(ev) {
if (ev) ev.target.nextElementSibling.style.display = 'grid';
if (ev) {
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
}
document.getElementById('xiaomi-login-form').style.display = 'flex';
document.getElementById('xiaomi-captcha-form').style.display = 'none';
@@ -575,7 +607,9 @@
</div>
<script>
document.getElementById('webtorrent').addEventListener('click', async ev => {
ev.target.nextElementSibling.style.display = 'grid';
const div = ev.target.nextElementSibling;
if (div.style.display === 'grid') { div.style.display = 'none'; return; }
div.style.display = 'grid';
await getSources('webtorrent-table', 'api/webtorrent');
});
</script>