2023-07-18 01:32:15 +00:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
<title>Устройства</title>
|
|
|
|
|
<link rel="stylesheet" href="../styles/main.css" />
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<header>
|
2023-09-18 01:58:49 +00:00
|
|
|
|
<img src="../img/argus.png">
|
2023-07-18 01:32:15 +00:00
|
|
|
|
<h1>Аргус</h1>
|
2023-09-11 09:57:10 +00:00
|
|
|
|
<h2><span>/</span> {{Organisation}}</h2>
|
2023-07-18 01:32:15 +00:00
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<section class="account-info">
|
|
|
|
|
<div id="account-main">
|
|
|
|
|
<img id="person" src="../img/person.svg">
|
2023-09-11 09:57:10 +00:00
|
|
|
|
<span>{{User}}</span>
|
2023-07-18 01:32:15 +00:00
|
|
|
|
<img id="down" src="../img/down.svg">
|
|
|
|
|
<img id="up" src="../img/up.svg">
|
|
|
|
|
</div>
|
2023-09-11 09:57:10 +00:00
|
|
|
|
<a href="/logout"><div id="account-additional" class="additional">Выйти</div></a>
|
2023-07-18 01:32:15 +00:00
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section class="navigation">
|
|
|
|
|
<a href="/">
|
|
|
|
|
<div><img src="../img/chart.svg">Главная</div>
|
|
|
|
|
</a>
|
|
|
|
|
<a href="/devices">
|
|
|
|
|
<div class="selected"><img src="../img/cloud.svg">Устройства</div>
|
|
|
|
|
</a>
|
|
|
|
|
<a href="/reports">
|
|
|
|
|
<div><img src="../img/bubble.svg">Отчёты</div>
|
|
|
|
|
</a>
|
|
|
|
|
<a href="/live">
|
|
|
|
|
<div><img src="../img/waves.svg">Трансляция</div>
|
|
|
|
|
</a>
|
2023-08-21 03:28:58 +00:00
|
|
|
|
<a href="/videos">
|
2023-07-18 01:32:15 +00:00
|
|
|
|
<div><img src="../img/play.svg">Записи</div>
|
|
|
|
|
</a>
|
2023-09-11 09:57:10 +00:00
|
|
|
|
{{#if isAdmin}}
|
|
|
|
|
<a class="admin-panel" href="/admin">
|
|
|
|
|
<div><img src="../img/keyboard.svg">Админка</div>
|
|
|
|
|
</a>
|
|
|
|
|
{{/if}}
|
2023-08-28 04:40:58 +00:00
|
|
|
|
<a class="settings" href="/settings">
|
2023-07-18 01:32:15 +00:00
|
|
|
|
<div><img src="../img/gear.svg">Настройки</div>
|
|
|
|
|
</a>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="main">
|
|
|
|
|
<div class="name">
|
2023-09-10 16:36:39 +00:00
|
|
|
|
<span style="color: rgb(255, 69, 58);">В разработке</span>
|
2023-07-18 01:32:15 +00:00
|
|
|
|
</div>
|
|
|
|
|
<nav>
|
|
|
|
|
<a href="/devices">Список устройств</a>
|
2023-09-18 01:58:49 +00:00
|
|
|
|
{{#if EditTransport}}
|
2023-09-14 02:40:03 +00:00
|
|
|
|
<a href="/devices/groups">Группы</a>
|
2023-09-18 01:58:49 +00:00
|
|
|
|
{{/if}}
|
2023-08-08 17:46:12 +00:00
|
|
|
|
<!-- <a href="/devices/drivers">Водители</a> -->
|
2023-07-24 04:53:11 +00:00
|
|
|
|
<!-- <a href="/devices/newdevice">Добавить устройство</a> -->
|
|
|
|
|
<!-- <a href="/devices/newdriver">Добавить водителя</a> -->
|
2023-07-18 01:32:15 +00:00
|
|
|
|
|
|
|
|
|
<a class="update selected" href="/devices/update">Обновление ПО</a>
|
|
|
|
|
</nav>
|
|
|
|
|
<section class="bg">
|
|
|
|
|
<section class="content">
|
|
|
|
|
|
|
|
|
|
<section class="for-table">
|
|
|
|
|
|
|
|
|
|
<section class="organisation update">
|
|
|
|
|
<div class="update-org">
|
|
|
|
|
<h1>Организация</h1>
|
|
|
|
|
|
|
|
|
|
<ul class="area">
|
|
|
|
|
<li class="area-name"><img src="../img/ul.svg"><input type="checkbox" id="name-1" class="checkbox-input" hidden checked><label for="name-1" class="checkbox-label">Группа 1</label>
|
|
|
|
|
<ul class="area-devices" id="devices-1">
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0001" class="checkbox-input device-filter" value="0001" hidden checked><label for="0001" class="checkbox-label"><div class="checkmark"></div>0001</label></li>
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0002" class="checkbox-input device-filter" value="0002" hidden checked><label for="0002" class="checkbox-label"><div class="checkmark"></div>0002</label></li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
<li class="area-name"><img src="../img/ul.svg"><input type="checkbox" id="name-2" class="checkbox-input" hidden checked><label for="name-2" class="checkbox-label">Группа 2</label>
|
|
|
|
|
<ul class="area-devices" id="devices-2">
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0003" class="checkbox-input device-filter" value="0003" hidden checked><label for="0003" class="checkbox-label"><div class="checkmark"></div>0003</label></li>
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0004" class="checkbox-input device-filter" value="0004" hidden checked><label for="0004" class="checkbox-label"><div class="checkmark"></div>0004</label></li>
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0005" class="checkbox-input device-filter" value="0005" hidden checked><label for="0005" class="checkbox-label"><div class="checkmark"></div>0005</label></li>
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0006" class="checkbox-input device-filter" value="0006" hidden checked><label for="0006" class="checkbox-label"><div class="checkmark"></div>0006</label></li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
<li class="area-name"><img src="../img/ul.svg"><input type="checkbox" id="name-3" class="checkbox-input" hidden checked><label for="name-3" class="checkbox-label">Другое</label>
|
|
|
|
|
<ul class="area-devices" id="devices-3">
|
|
|
|
|
<li class="device"><img><input type="checkbox" id="0007" class="checkbox-input device-filter" value="0007" hidden checked><label for="0007" class="checkbox-label"><div class="checkmark"></div>0007</label></li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section class="update-info">
|
|
|
|
|
<h1>Новое обновление</h1>
|
|
|
|
|
|
|
|
|
|
<div class="update-info-area">
|
|
|
|
|
|
|
|
|
|
<div id="upload-file" class="upload-input">
|
|
|
|
|
<img src="../img/upload.svg">
|
|
|
|
|
<span class="upload-text">Загрузить файл обновления</span>
|
|
|
|
|
<span class="upload-description">ZIP, RAR, TAR (макс 100 мб)</span>
|
|
|
|
|
</div>
|
|
|
|
|
<input id="input-upload-file" type="file" name="updateFile" style="display: none;">
|
|
|
|
|
|
|
|
|
|
<label for="update-name">Название<span style="color: rgba(255, 69, 58, 1);">*</span></label>
|
|
|
|
|
<input name="updateName" type="text" id="update-name" placeholder="Название обновления" required>
|
|
|
|
|
|
|
|
|
|
<span class="input-name">Время обновления</span>
|
|
|
|
|
<ul id="time-picker">
|
|
|
|
|
<li><input type="radio" name="updateTimeRadio" id="update-time-now" value="now" checked><label class="input-radio" for="update-time-now">Сейчас</label></li>
|
|
|
|
|
<li><input type="radio" name="updateTimeRadio" id="update-time-later" value="later"><label class="input-radio" for="update-time-later">Ко времени</label></li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<input name="updateTime" type="datetime-local" id="update-time">
|
|
|
|
|
|
|
|
|
|
<button>Отправить</button>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section id="table-area" class="table update">
|
|
|
|
|
<h1>Список водителей</h1>
|
|
|
|
|
<input id="table-search" class="search" type="text" placeholder="Поиск">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<table id="deviceTable">
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>
|
|
|
|
|
<th><input id="device-all" type="checkbox"><label for="device-all"><div class="checkmark"></div></label></th>
|
|
|
|
|
<th>Группа</th>
|
|
|
|
|
<th>Номер ТС</th>
|
|
|
|
|
<th>Статус</th>
|
|
|
|
|
<th>Время</th>
|
|
|
|
|
<th>Файл</th>
|
|
|
|
|
<th></th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
<!-- Сюда будут добавляться строки таблицы -->
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<div id="count">
|
|
|
|
|
<!-- Сюда добавится итоговое количество результатов -->
|
|
|
|
|
</div>
|
|
|
|
|
<div id="pagination">
|
|
|
|
|
<!-- Сюда будут добавляться ссылки для переключения между страницами -->
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</section>
|
|
|
|
|
</section>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<script src="../scripts/table-updates.js"></script>
|
|
|
|
|
<script src="../scripts/jquery.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
const fileSelect = document.getElementById("upload-file");
|
|
|
|
|
const fileElem = document.getElementById("input-upload-file");
|
|
|
|
|
|
|
|
|
|
fileSelect.addEventListener(
|
|
|
|
|
"click",
|
|
|
|
|
(e) => {
|
|
|
|
|
if (fileElem) {
|
|
|
|
|
fileElem.click();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
|
|
|
|
$("#update-time").hide();
|
|
|
|
|
$("#time-picker").click(function () {
|
|
|
|
|
if ($("#update-time-later").is(":checked")) {
|
|
|
|
|
$("#update-time").show(50);
|
|
|
|
|
} else {
|
|
|
|
|
$("#update-time").hide(50);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
// Скрытие/Показ дополнительных меню аккаунта
|
|
|
|
|
const accountMain = document.getElementById('account-main');
|
|
|
|
|
const accountAdditional = document.getElementById('account-additional');
|
|
|
|
|
const accountUp = document.getElementById('up');
|
|
|
|
|
const accountDown = document.getElementById('down');
|
|
|
|
|
accountAdditional.style.display = 'none';
|
|
|
|
|
accountUp.style.display = 'none';
|
|
|
|
|
|
|
|
|
|
accountMain.addEventListener('click', () => {
|
|
|
|
|
if (accountAdditional.style.display === 'none') {
|
|
|
|
|
accountAdditional.style.display = 'flex';
|
|
|
|
|
accountUp.style.display = 'unset';
|
|
|
|
|
accountDown.style.display = 'none';
|
|
|
|
|
} else {
|
|
|
|
|
accountAdditional.style.display = 'none';
|
|
|
|
|
accountUp.style.display = 'none';
|
|
|
|
|
accountDown.style.display = 'unset';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
const checkboxes = document.querySelectorAll('.organisation .checkbox-input');
|
|
|
|
|
|
|
|
|
|
checkboxes.forEach((checkbox) => {
|
|
|
|
|
applyFilterAndSearch();
|
|
|
|
|
checkbox.addEventListener('change', function() {
|
|
|
|
|
document.querySelector('#device-all').checked = false;
|
|
|
|
|
applyFilterAndSearch();
|
|
|
|
|
const devices = this.parentNode.querySelector('.area-devices');
|
|
|
|
|
if (this.checked) {
|
|
|
|
|
devices.style.display = 'block';
|
|
|
|
|
|
|
|
|
|
// Активируем дочерние чекбоксы
|
|
|
|
|
const childCheckboxes = devices.querySelectorAll('.device-filter');
|
|
|
|
|
childCheckboxes.forEach((childCheckbox) => {
|
|
|
|
|
childCheckbox.checked = true;
|
|
|
|
|
applyFilterAndSearch();
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
devices.style.display = 'none';
|
|
|
|
|
applyFilterAndSearch();
|
|
|
|
|
|
|
|
|
|
// Деактивируем дочерние чекбоксы
|
|
|
|
|
const childCheckboxes = devices.querySelectorAll('.device-filter');
|
|
|
|
|
childCheckboxes.forEach((childCheckbox) => {
|
|
|
|
|
childCheckbox.checked = false;
|
|
|
|
|
applyFilterAndSearch();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Деактивируем дочерние чекбоксы, если родительский чекбокс не выбран
|
|
|
|
|
if (!this.checked) {
|
|
|
|
|
const childCheckboxes = devices.querySelectorAll('.device-filter');
|
|
|
|
|
childCheckboxes.forEach((childCheckbox) => {
|
|
|
|
|
childCheckbox.checked = false;
|
|
|
|
|
applyFilterAndSearch();
|
|
|
|
|
});
|
|
|
|
|
devices.style.display = 'none';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
|
|
|
|
var table = document.querySelector('#deviceTable');
|
|
|
|
|
var tableCheckboxAll = table.querySelector('#device-all');
|
|
|
|
|
var tableCheckboxes = table.querySelectorAll('tbody input[type="checkbox"]');
|
|
|
|
|
|
|
|
|
|
tableCheckboxAll.addEventListener('click', function(event) {
|
|
|
|
|
table = document.querySelector('#deviceTable');
|
|
|
|
|
tableCheckboxes = table.querySelectorAll('tbody input[type="checkbox"]');
|
|
|
|
|
if (tableCheckboxAll.checked) {
|
|
|
|
|
tableCheckboxes.forEach((tableCheckbox) => {
|
|
|
|
|
tableCheckbox.checked = true;
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
tableCheckboxes.forEach((tableCheckbox) => {
|
|
|
|
|
tableCheckbox.checked = false;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$('#deviceTable').click( function(event) {
|
|
|
|
|
table = document.querySelector('#deviceTable');
|
|
|
|
|
tableCheckboxes = table.querySelectorAll('tbody input[type="checkbox"]');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < tableCheckboxes.length; i++) {
|
|
|
|
|
tableCheckboxes[i].addEventListener('click', function(event) {
|
|
|
|
|
for (var j = 0; j < tableCheckboxes.length; j++) {
|
|
|
|
|
if (!tableCheckboxes[j].checked || tableCheckboxes[j].disabled) {
|
|
|
|
|
tableCheckboxAll.checked = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tableCheckboxAll.checked = true;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|