ArgusSite/static/scripts/table-reports.js
2023-07-04 01:31:18 +03:00

314 lines
10 KiB
JavaScript
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.

const devices = [
{
id: "1",
group: "0001",
name: "Разговор по телефону",
reportID: "354",
plate: "AO30877",
numberTS: "008803559E",
time: "12.03.23 17:33",
place: "59.852371, 30.344543",
},
{
id: "2",
group: "0001",
name: "Водитель зевает",
reportID: "353",
plate: "AO64377",
numberTS: "0088036B78",
time: "12.03.23 14:26",
place: "60.058236, 30.315283",
},
{
id: "3",
group: "0002",
name: "Усталость",
reportID: "352",
plate: "ГД44377",
numberTS: "009800852A",
time: "12.03.23 10:07",
place: "59.878256, 30.31962",
},
{
id: "4",
group: "0003",
name: "Водитель зевает",
reportID: "351",
plate: "УА86577",
numberTS: "009800858D",
time: "12.03.23 09:56",
place: "60.045981, 30.4134",
},
{
id: "5",
group: "0003",
name: "Разговор по телефону",
reportID: "350",
plate: В74665",
numberTS: "00980084FD",
time: "11.03.23 20:43",
place: "59.83257, 30.389893",
},
{
id: "6",
group: "0004",
name: "Разговор по телефону",
reportID: "349",
plate: У445101",
numberTS: "0088036B7F",
time: "11.03.23 19:17",
place: "59.959926, 30.42224",
},
{
id: "7",
group: "0005",
name: "Усталость",
reportID: "348",
plate: "КТ32376",
numberTS: "00880302CD",
time: "11.03.23 15:32",
place: "60.046346, 30.405688",
},
{
id: "8",
group: "0006",
name: "Курение за рулём",
reportID: "347",
plate: "ОА33277",
numberTS: "008802A035",
time: "11.03.23 15:06",
place: "59.956626, 30.234408",
},
{
id: "9",
group: "0007",
name: "Водитель отвлекся",
reportID: "346",
plate: "КЛ987102",
numberTS: "008802A96A",
time: "11.03.23 12:44",
place: "59.956626, 30.234408",
},
{
id: "10",
group: "0002",
name: "Водитель отвлекся",
reportID: "345",
plate: "АУ22377",
numberTS: "00880302C7",
time: "11.03.23 11:40",
place: "59.956626, 30.234408",
},
];
// Получаем высоту таблицы и определяем, сколько строк помещается на странице
let currentPage = 1;
let tableHeight = document.getElementById("table-area").offsetHeight;
let rowHeight = 60;
let rowsPerPage = Math.floor(tableHeight / rowHeight) - 3;
let filteredDevices = [...devices];
let timeRangeStart = null;
let timeRangeEnd = null;
const createTable = () => {
const table = document.getElementById("deviceTable");
const tbody = table.querySelector("tbody");
// Очищаем таблицу
tbody.innerHTML = "";
// Добавляем строки таблицы
const startIndex = (currentPage - 1) * rowsPerPage;
const endIndex = startIndex + rowsPerPage;
const devicesToDisplay = filteredDevices.slice(startIndex, endIndex);
devicesToDisplay.forEach((device) => {
const row = document.createElement("tr");
// Добавляем чекбокс перед каждым рядом
const checkboxCell = document.createElement("td");
const checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.value = `device-${device.id}`;
checkbox.id = `device-${device.id}`;
const checkboxLabel = document.createElement("label");
checkboxLabel.setAttribute("for", `device-${device.id}`);
const checkboxDiv = document.createElement("div");
checkboxDiv.setAttribute("class", "checkmark");
checkboxLabel.appendChild(checkboxDiv);
checkboxCell.appendChild(checkbox);
checkboxCell.appendChild(checkboxLabel);
row.appendChild(checkboxCell);
// Добавляем ячейки с данными
const name = document.createElement("td");
name.textContent = device.name;
row.appendChild(name);
const reportID = document.createElement("td");
reportID.textContent = device.reportID;
row.appendChild(reportID);
const plate = document.createElement("td");
plate.textContent = device.plate;
row.appendChild(plate);
const numberTS = document.createElement("td");
numberTS.textContent = device.numberTS;
row.appendChild(numberTS);
const time = document.createElement("td");
time.textContent = device.time;
row.appendChild(time);
const place = document.createElement("td");
place.textContent = device.place;
row.appendChild(place);
// Добавляем кнопку удаления после каждого ряда
const shareCell = document.createElement("td");
const shareButton = document.createElement("button");
shareButton.setAttribute("class", "share");
shareButton.setAttribute("onclick", "location.href = '/reports/346';");
shareButton.value = `delete-device-${device.id}`;
shareButton.id = `delete-device-${device.id}`;
shareCell.appendChild(shareButton);
row.appendChild(shareCell);
tbody.appendChild(row);
});
};
window.addEventListener("resize", function (event) {
tableHeight = document.getElementById("table-area").offsetHeight;
rowHeight = 60;
rowsPerPage = Math.floor(tableHeight / rowHeight) - 3;
createTable();
createPagination();
});
const createPagination = () => {
const count = document.getElementById("count");
count.textContent = `Всего результатов: ${filteredDevices.length}`;
const pagination = document.getElementById("pagination");
pagination.innerHTML = "";
const pageCount = Math.ceil(filteredDevices.length / rowsPerPage);
for (let i = 1; i <= pageCount; i++) {
const pageLink = document.createElement("a");
pageLink.href = "#";
if (i === currentPage) {
document.querySelector("#device-all").checked = false;
pageLink.classList.add("active");
}
pageLink.textContent = i;
pageLink.addEventListener("click", (event) => {
event.preventDefault();
currentPage = i - 1;
currentPage = i;
createTable();
createPagination();
});
pagination.appendChild(pageLink);
}
// var currentPageSpan = document.createElement("span");
// currentPageSpan.textContent = currentPage;
// pagination.appendChild(currentPageSpan);
// Добавляем кнопки "Next" и "Previous"
// const prevButton = document.createElement("button");
// prevButton.innerText = "Previous";
// prevButton.onclick = () => {
// if (currentPage === 1) return;
// currentPage--;
// createTable();
// };
// pagination.appendChild(prevButton);
// const nextButton = document.createElement("button");
// nextButton.innerText = "Next";
// nextButton.onclick = () => {
// if (currentPage === pageCount) return;
// currentPage++;
// createTable();
// };
// pagination.appendChild(nextButton);
};
const applyFilterAndSearch = () => {
const searchValue = searchInput.value.toLowerCase();
const groupFilters = Array.from(
document.querySelectorAll('input[type="checkbox"].device-filter:checked')
).map((checkbox) => checkbox.value);
filteredDevices = devices.filter((device) => {
const searchString =
`${device.group} ${device.name} ${device.reportID} ${device.place} ${device.numberTS} ${device.time} ${device.place}`.toLowerCase();
const matchGroup =
groupFilters.length === 0 || groupFilters.includes(device.group);
const matchSearch = !searchValue || searchString.includes(searchValue);
// Фильтр по временному диапазону
let matchTimeRange = true;
if (timeRangeStart) {
const startTimestamp = new Date(timeRangeStart).getTime();
const deviceTimestamp = parseTableTime(device.time); // Преобразование времени из таблицы
matchTimeRange = startTimestamp <= deviceTimestamp;
}
if (timeRangeEnd) {
const endTimestamp = new Date(timeRangeEnd).getTime();
const deviceTimestamp = parseTableTime(device.time); // Преобразование времени из таблицы
matchTimeRange = matchTimeRange && deviceTimestamp <= endTimestamp;
}
return matchGroup && matchSearch && matchTimeRange;
});
currentPage = 1;
createTable();
createPagination();
};
// Функция для преобразования времени из таблицы в миллисекунды
function parseTableTime(tableTime) {
// Парсинг даты и времени из строки формата "12.03.23 17:33"
const parts = tableTime.split(" ");
const dateParts = parts[0].split(".");
const timeParts = parts[1].split(":");
const year = 2000 + parseInt(dateParts[2]);
const month = parseInt(dateParts[1]) - 1; // Месяцы в JavaScript начинаются с 0
const day = parseInt(dateParts[0]);
const hours = parseInt(timeParts[0]);
const minutes = parseInt(timeParts[1]);
return new Date(year, month, day, hours, minutes).getTime();
}
const searchInput = document.getElementById("table-search");
searchInput.addEventListener("input", applyFilterAndSearch);
const filterCheckboxes = Array.from(
document.querySelectorAll('input[type="checkbox"].device-filter')
);
filterCheckboxes.forEach((checkbox) => {
checkbox.addEventListener("change", applyFilterAndSearch);
});
// Обработчик изменения значения в поле начала временного диапазона
const timeRangeStartInput = document.getElementById("timeRangeStart");
timeRangeStartInput.addEventListener("change", () => {
timeRangeStart = timeRangeStartInput.value;
console.log(timeRangeStart);
applyFilterAndSearch();
});
// Обработчик изменения значения в поле конца временного диапазона
const timeRangeEndInput = document.getElementById("timeRangeEnd");
timeRangeEndInput.addEventListener("change", () => {
timeRangeEnd = timeRangeEndInput.value;
console.log(timeRangeEnd);
applyFilterAndSearch();
});
createTable();
createPagination();