Исправление путей к статическим файлам

- Перенос trips-calendar.css в /static/css/
- Перенос upcoming-trips.js и trip-form-loader.js в /static/js/
- Удаление файлов из неправильной папки /public/
This commit is contained in:
Kirik
2025-09-03 12:54:13 +02:00
parent b005106df0
commit 7eb2f8ae31
3 changed files with 399 additions and 0 deletions
+110
View File
@@ -0,0 +1,110 @@
/**
* Динамическое заполнение dropdown формы поездками из upcoming-trips.json
* Синхронизировано с Telegram Bot управлением
*/
class TripFormLoader {
constructor(selectId = 'trip_period', jsonPath = '/data/upcoming-trips.json') {
this.selectId = selectId;
this.jsonPath = jsonPath;
}
async loadTripsData() {
try {
const response = await fetch(this.jsonPath);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Ошибка загрузки данных поездок для формы:', error);
return null;
}
}
async populateTripsDropdown() {
console.log(`🔍 Ищем dropdown с ID: "${this.selectId}"`);
const select = document.getElementById(this.selectId);
if (!select) {
console.error(`❌ Dropdown с ID "${this.selectId}" не найден`);
console.log('📋 Доступные элементы с ID:', Array.from(document.querySelectorAll('[id]')).map(el => el.id));
return;
}
console.log(`✅ Dropdown найден, загружаем данные из: ${this.jsonPath}`);
const data = await this.loadTripsData();
if (!data || !data.trips) {
console.error('❌ Не удалось загрузить данные поездок');
return;
}
console.log(`📊 Данные загружены: ${data.trips.length} поездок всего`);
// Фильтруем только активные поездки и сортируем по порядку
const activeTrips = data.trips
.filter(trip => trip.active === true)
.sort((a, b) => (a.order || 0) - (b.order || 0));
// Очищаем существующие опции (кроме первой пустой)
const firstOption = select.querySelector('option[value=""]');
select.innerHTML = '';
// Возвращаем первую пустую опцию
if (firstOption) {
select.appendChild(firstOption);
} else {
const emptyOption = document.createElement('option');
emptyOption.value = '';
emptyOption.textContent = '';
select.appendChild(emptyOption);
}
// Добавляем активные поездки
activeTrips.forEach(trip => {
const option = document.createElement('option');
option.value = trip.title;
option.textContent = trip.title;
select.appendChild(option);
});
// Добавляем статичную опцию "Свой вариант без БВС"
const customOption = document.createElement('option');
customOption.value = 'Свой вариант без БВС';
customOption.textContent = 'Свой вариант без БВС';
select.appendChild(customOption);
console.log(`✅ Dropdown формы заполнен: ${activeTrips.length} активных поездок`);
}
// Метод для обновления (можно вызывать для перезагрузки)
async refresh() {
await this.populateTripsDropdown();
}
}
// Глобальная переменная для доступа к загрузчику
let tripFormLoader;
// Инициализация при загрузке DOM
document.addEventListener('DOMContentLoaded', function() {
// Проверяем, есть ли на странице dropdown для поездок
const tripSelect = document.getElementById('trip_period');
if (tripSelect) {
tripFormLoader = new TripFormLoader();
tripFormLoader.populateTripsDropdown();
console.log('🗓️ Загрузчик поездок для формы инициализирован');
}
});
// Функция для обновления dropdown (можно вызывать извне)
function refreshTripFormDropdown() {
if (tripFormLoader) {
tripFormLoader.refresh();
}
}
// Экспорт для использования в других скриптах
if (typeof module !== 'undefined' && module.exports) {
module.exports = TripFormLoader;
}