let currentPage = 1;
let totalPages = 1;
const perPage = 10;
let sortField = 'region_id';
let sortOrder = 'asc';
let currentFetchController = null;
// Переменные для систем
let systemsCurrentPage = 1;
let systemsTotalPages = 1;
let systemsSortField = 'system_id';
let systemsSortOrder = 'asc';
// Инициализация Toastr
toastr.options = {
"closeButton": true,
"debug": false,
"newestOnTop": false,
"progressBar": false,
"positionClass": "toast-bottom-right",
"preventDuplicates": false,
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
};
// Функция загрузки регионов
function loadRegions(page) {
if (page < 1 || page > totalPages) return;
currentPage = page;
const url = `/telezab/rest/api/regions?page=${currentPage}&per_page=${perPage}&sort_field=${sortField}&sort_order=${sortOrder}`;
if (currentFetchController) {
currentFetchController.abort();
}
currentFetchController = new AbortController();
fetch(url, { signal: currentFetchController.signal })
.then(response => response.json())
.then(data => {
currentFetchController = null;
totalPages = data.total_pages;
updateRegionsTable(data.regions);
updatePagination(data.current_page, data.total_pages);
})
.catch(error => {
if (error.name === 'AbortError') {
} else {
console.error('Error fetching regions:', error);
}
currentFetchController = null;
});
}
function updateRegionsTable(regions) {
const tableBody = document.getElementById('regions-table');
if (tableBody) {
tableBody.innerHTML = '';
regions.forEach(region => {
const row = document.createElement('tr');
row.innerHTML = `
${region.region_id} |
${region.name} |
${region.active ? 'Включен' : 'Выключен'}
|
|
`;
tableBody.appendChild(row);
});
setupRegionActions();
} else {
console.error("regions-table element not found!");
}
}
function setupRegionActions() {
document.querySelectorAll('th[data-sort]').forEach(th => {
th.replaceWith(th.cloneNode(true)); // Удаляем все обработчики
});
document.querySelectorAll('.delete-btn').forEach(button => {
button.addEventListener('click', () => deleteRegion(button.dataset.id));
});
document.querySelectorAll('.region-status-switch').forEach(switchElement => {
switchElement.addEventListener('change', (event) => {
const regionId = event.target.dataset.id;
const active = event.target.checked;
toggleRegionStatus(regionId, active);
document.getElementById(`region-status-label-${regionId}`).textContent = active ? 'Включен' : 'Выключен';
});
});
document.querySelectorAll('.edit-name-btn').forEach(button => {
button.addEventListener('click', () => {
const regionId = button.dataset.id;
const regionName = button.dataset.name;
document.getElementById('old-region-name').value = regionName;
document.getElementById('new-region-name').value = regionName;
$('#editRegionNameModal').modal('show');
let timer = 5;
document.getElementById('edit-region-name-timer').textContent = timer;
const timerInterval = setInterval(() => {
timer--;
document.getElementById('edit-region-name-timer').textContent = timer;
if (timer === 0) {
clearInterval(timerInterval);
document.getElementById('save-region-name-btn').removeAttribute('disabled');
}
}, 1000);
document.getElementById('save-region-name-btn').addEventListener('click', () => {
const newName = document.getElementById('new-region-name').value;
updateRegionName(regionId, newName);
$('#editRegionNameModal').modal('hide');
}, { once: true }); // Удаляем обработчик после первого клика
});
});
document.querySelectorAll('.subscribers-btn').forEach(button => {
button.addEventListener('click', () => {
const regionId = button.dataset.id;
showRegionSubscribers(regionId);
});
});
function showRegionSubscribers(regionId) {
fetch(`/telezab/rest/api/regions/${regionId}/subscribers`)
.then(response => {
return response.json();
})
.then(data => {
const tableBody = document.getElementById('regionSubscribersTableBody');
tableBody.innerHTML = '';
if (data.subscribers && data.subscribers.length > 0) {
data.subscribers.forEach(user => {
const row = document.createElement('tr');
row.innerHTML = `
${user.telegram_id} |
${user.email} |
`;
tableBody.appendChild(row);
});
} else {
const row = document.createElement('tr');
row.innerHTML = `Нет подписчиков для этого региона. | `;
tableBody.appendChild(row);
}
$('#regionSubscribersModal').modal('show');
})
.catch(error => {
console.error('Ошибка при получении подписчиков региона:', error);
toastr.error('Ошибка при получении подписчиков региона. Пожалуйста, попробуйте позже.');
});
}
function updateRegionName(regionId, newName) {
fetch('/telezab/rest/api/regions', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ region_id: regionId, name: newName })
})
.then(() => {
loadRegions(currentPage);
toastr.success('Название региона изменено.');
})
.catch(error => {
console.error('Ошибка при изменении названия региона:', error);
toastr.error('Ошибка при изменении названия региона. Пожалуйста, попробуйте позже.');
});
}
document.querySelectorAll('th[data-sort]').forEach(th => {
th.addEventListener('click', () => {
const field = th.dataset.sort;
if (field === sortField) {
sortOrder = sortOrder === 'asc' ? 'desc' : 'asc';
} else {
sortField = field;
sortOrder = 'asc';
}
loadRegions(currentPage);
});
});
}
function toggleRegionStatus(regionId, active) {
fetch('/telezab/rest/api/regions', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ region_id: regionId, active: active })
})
.then(() => {
loadRegions(currentPage);
if (active) {
toastr.success('Регион активирован.');
} else {
toastr.success('Регион деактивирован.');
}
})
.catch(error => {
console.error('Ошибка при изменении статуса региона:', error);
toastr.error('Ошибка при изменении статуса региона. Пожалуйста, попробуйте позже.');
});
}
function deleteRegion(regionId) {
$('#deleteRegionModal').modal('show'); // Открываем модальное окно
$(document).ready(function() {
// Обработчик события input для текстового поля подтверждения
$('#deleteConfirmationInput').on('input', function() {
const inputValue = $(this).val();
if (inputValue === 'УДАЛИТЬ') {
$('#confirmDeleteButton').prop('disabled', false); // Активируем кнопку "Удалить"
} else {
$('#confirmDeleteButton').prop('disabled', true); // Деактивируем кнопку "Удалить"
}
});
// Обработчик события click для кнопки "Удалить"
$('#confirmDeleteButton').on('click', function() {
fetch(`/telezab/rest/api/regions?region_id=${regionId}`, { method: 'DELETE' })
.then(() => {
loadRegions(currentPage);
toastr.success('Регион успешно удален.');
$('#deleteRegionModal').modal('hide'); // Закрываем модальное окно
})
.catch(error => {
console.error('Ошибка при удалении региона:', error);
toastr.error('Ошибка при удалении региона. Пожалуйста, попробуйте позже.');
});
});
// Обработчик события hidden.bs.modal для модального окна
$('#deleteRegionModal').on('hidden.bs.modal', function() {
$('#deleteConfirmationInput').val(''); // Очищаем текстовое поле при закрытии модального окна
$('#confirmDeleteButton').prop('disabled', true); // Деактивируем кнопку "Удалить"
});
});
}
document.getElementById('add-region-form').addEventListener('submit', (event) => {
event.preventDefault();
const regionId = document.getElementById('region-id').value;
const regionName = document.getElementById('region-name').value;
const regionActive = document.getElementById('region-active').checked;
// Проверка, что все символы в regionId являются числами
if (!/^\d+$/.test(regionId)) {
toastr.error('ID региона должен содержать только числа.');
return; // Прерываем выполнение функции
}
fetch('/telezab/rest/api/regions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ region_id: regionId, name: regionName, active: regionActive })
})
.then(response => response.json())
.then(data => {
const responseData = data[0];
const statusCode = data[1];
if (statusCode === 409) {
toastr.error(responseData.message);
throw new Error(responseData.message);
} else if (statusCode === 201) {
document.getElementById('region-id').value = '';
document.getElementById('region-name').value = '';
document.getElementById('region-active').checked = true;
loadRegions(currentPage);
toastr.success('Регион успешно добавлен.');
$('#addRegionModal').modal('hide');
} else {
throw new Error('Неизвестный код состояния ответа');
}
})
.catch(error => {
console.error('Ошибка при добавлении региона:', error);
if (error.message !== 'Регион с таким ID уже существует') {
toastr.error('Ошибка при добавлении региона. Пожалуйста, попробуйте позже.');
}
});
});
// Функция обновления пагинации
function updatePagination(currentPage, totalPages) {
const paginationContainer = document.getElementById('pagination');
paginationContainer.innerHTML = '';
const prevButton = document.createElement('li');
prevButton.classList.add('page-item');
prevButton.classList.toggle('disabled', currentPage === 1);
prevButton.innerHTML = `«`;
paginationContainer.appendChild(prevButton);
for (let page = 1; page <= totalPages; page++) {
const pageItem = document.createElement('li');
pageItem.classList.add('page-item');
pageItem.classList.toggle('active', page === currentPage);
const pageLink = document.createElement('a');
pageLink.classList.add('page-link');
pageLink.href = "#";
pageLink.textContent = page;
pageLink.onclick = () => loadRegions(page);
pageItem.appendChild(pageLink);
paginationContainer.appendChild(pageItem);
}
const nextButton = document.createElement('li');
nextButton.classList.add('page-item');
nextButton.classList.toggle('disabled', currentPage === totalPages);
nextButton.innerHTML = `»`;
paginationContainer.appendChild(nextButton);
}
// Функция загрузки систем
function loadSystems(page) {
if (page < 1 || page > systemsTotalPages) return;
systemsCurrentPage = page;
const url = `/telezab/rest/api/systems?page=${systemsCurrentPage}&per_page=${perPage}&sort_field=${systemsSortField}&sort_order=${systemsSortOrder}`;
if (currentFetchController) {
currentFetchController.abort();
}
currentFetchController = new AbortController();
fetch(url, { signal: currentFetchController.signal })
.then(response => response.json())
.then(data => {
currentFetchController = null;
systemsTotalPages = data.total_pages;
updateSystemsTable(data.systems);
updatePagination(data.current_page, data.total_pages);
})
.catch(error => {
if (error.name === 'AbortError') {
} else {
console.error('Error fetching systems:', error);
}
currentFetchController = null;
});
}
// Функция обновления таблицы систем
function updateSystemsTable(systems) {
const tableBody = document.getElementById('systems-table');
if (tableBody) {
tableBody.innerHTML = '';
systems.forEach(system => {
const row = document.createElement('tr');
row.innerHTML = `
${system.system_id} |
${system.system_name} |
${system.name} |
|
`;
tableBody.appendChild(row);
});
setupSystemActions();
} else {
console.error("systems-table element not found!");
}
}
// Функция настройки действий для систем
function setupSystemActions() {
document.querySelectorAll('th[data-sort]').forEach(th => {
th.replaceWith(th.cloneNode(true)); // Удаляем все обработчики
});
document.querySelectorAll('.delete-btn').forEach(button => {
button.addEventListener('click', () => deleteSystem(button.dataset.id));
});
document.querySelectorAll('.edit-name-btn').forEach(button => {
button.addEventListener('click', () => {
const systemId = button.dataset.id;
const systemName = button.dataset.name;
document.getElementById('old-system-name').value = systemName;
document.getElementById('new-system-name').value = systemName;
$('#editSystemNameModal').modal('show');
let timer = 5;
document.getElementById('edit-system-name-timer').textContent = timer;
const timerInterval = setInterval(() => {
timer--;
document.getElementById('edit-system-name-timer').textContent = timer;
if (timer === 0) {
clearInterval(timerInterval);
document.getElementById('saveSystemNameBtn').removeAttribute('disabled'); // Изменяем идентификатор
}
}, 1000);
document.getElementById('saveSystemNameBtn').addEventListener('click', () => { // Изменяем идентификатор
const newName = document.getElementById('new-system-name').value;
updateSystemName(systemId, newName);
$('#editSystemNameModal').modal('hide');
}, { once: true });
});
});
function updateSystemName(systemId, newName) {
fetch('/telezab/rest/api/systems', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ system_id: systemId, name: newName })
})
.then(() => {
loadSystems(systemsCurrentPage);
toastr.success('Название системы изменено.');
})
.catch(error => {
console.error('Ошибка при изменении названия системы:', error);
toastr.error('Ошибка при изменении названия системы. Пожалуйста, попробуйте позже.');
});
}
function deleteSystem(systemId) {
$('#deleteSystemModal').modal('show'); // Открываем модальное окно
$(document).ready(function() {
console.log(document.getElementById('deleteSystemConfirmationInput'));
// Обработчик события input для текстового поля подтверждения
$('#deleteSystemConfirmationInput').on('input', function() {
const inputValue = $(this).val();
console.log('inputValue:', inputValue); // Логируем значение inputValue
if (inputValue === 'УДАЛИТЬ') {
$('#confirmDeleteSystemButton').prop('disabled', false);
console.log('Кнопка активирована'); // Логируем активацию кнопки
} else {
$('#confirmDeleteSystemButton').prop('disabled', true);
console.log('Кнопка деактивирована'); // Логируем деактивацию кнопки
}
});
// Обработчик события click для кнопки "Удалить"
$('#confirmDeleteSystemButton').on('click', function() {
fetch(`/telezab/rest/api/systems?system_id=${systemId}`, { method: 'DELETE' })
.then(() => {
loadSystems(systemsCurrentPage);
toastr.success('Система успешно удалена.');
$('#deleteSystemModal').modal('hide'); // Закрываем модальное окно
})
.catch(error => {
console.error('Ошибка при удалении системы:', error);
toastr.error('Ошибка при удалении системы. Пожалуйста, попробуйте позже.');
});
});
// Обработчик события hidden.bs.modal для модального окна
$('#deleteSystemModal').on('hidden.bs.modal', function() {
$('#deleteSystemConfirmationInput').val(''); // Очищаем текстовое поле при закрытии модального окна
$('#confirmDeleteSystemButton').prop('disabled', true); // Деактивируем кнопку "Удалить"
});
});
}
document.querySelectorAll('th[data-sort]').forEach(th => {
th.addEventListener('click', () => {
const field = th.dataset.sort;
if (field === systemsSortField) {
systemsSortOrder = systemsSortOrder === 'asc' ? 'desc' : 'asc';
} else {
systemsSortField = field;
systemsSortOrder = 'asc';
}
loadSystems(systemsCurrentPage);
});
});
}
// Функция добавления системы
document.getElementById('add-system-form').addEventListener('submit', (event) => {
event.preventDefault();
const systemId = document.getElementById('system-id').value;
const systemNameLat = document.getElementById('system-name-lat').value;
const systemNameCyr = document.getElementById('system-name-cyr').value;
if (!/^\d+$/.test(systemId)) {
toastr.error('ID системы должен содержать только числа.');
return;
}
fetch('/telezab/rest/api/systems', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ system_id: systemId, system_name: systemNameLat, name: systemNameCyr })
})
.then(response => {
if (!response.ok) {
// Если статус ответа не OK, обрабатываем ошибку
return response.json().then(errorData => {
throw new Error(errorData.message || 'Ошибка добавления системы');
});
}
return response.json();
})
.then(data => {
// Обрабатываем успешное добавление системы
document.getElementById('system-id').value = '';
document.getElementById('system-name-lat').value = '';
document.getElementById('system-name-cyr').value = '';
loadSystems(systemsCurrentPage); // Обновляем таблицу систем
toastr.success('Система успешно добавлена.');
$('#addSystemModal').modal('hide');
})
.catch(error => {
// Обрабатываем ошибки
console.error('Ошибка при добавлении системы:', error);
toastr.error(error.message || 'Ошибка при добавлении системы. Пожалуйста, попробуйте позже.');
});
});
// Запуск загрузки данных
document.addEventListener("DOMContentLoaded", () => {
const regionsTab = document.getElementById('regions-tab');
const systemsTab = document.getElementById('systems-tab');
// Обработчик для вкладки "Регионы"
regionsTab.addEventListener('shown.bs.tab', () => {
loadRegions(currentPage);
});
// Обработчик для вкладки "Системы"
systemsTab.addEventListener('shown.bs.tab', () => {
loadSystems(systemsCurrentPage);
});
// Инициализация загрузки данных для активной вкладки
if (regionsTab.classList.contains('active')) {
loadRegions(currentPage);
}
});