Fix 'Today' button functionality to properly set date filters and submit form
This commit is contained in:
@@ -39,14 +39,14 @@ class DateCarousel {
|
|||||||
this.today = new Date();
|
this.today = new Date();
|
||||||
this.today.setHours(0, 0, 0, 0);
|
this.today.setHours(0, 0, 0, 0);
|
||||||
this.daysCount = 0; // Будет рассчитано динамически
|
this.daysCount = 0; // Будет рассчитано динамически
|
||||||
|
|
||||||
// Загружаем сохранённую дату из localStorage или устанавливаем сегодня
|
// Загружаем сохранённую дату из localStorage или устанавливаем сегодня
|
||||||
const savedData = this.loadSavedCenterDate();
|
const savedData = this.loadSavedCenterDate();
|
||||||
if (savedData) {
|
if (savedData) {
|
||||||
// Если есть смещение, это означает, что дата была выбрана пользователем
|
// Если есть смещение, это означает, что дата была выбрана пользователем
|
||||||
if (savedData.offset !== 0) {
|
if (savedData.offset !== 0) {
|
||||||
// Проверяем, есть ли выбранная дата в фильтрах
|
// Проверяем, есть ли выбранная дата в фильтрах
|
||||||
if (this.minInput && this.minInput.value && this.maxInput.value &&
|
if (this.minInput && this.minInput.value && this.maxInput.value &&
|
||||||
this.minInput.value === this.maxInput.value) {
|
this.minInput.value === this.maxInput.value) {
|
||||||
// Получаем выбранную дату из фильтра
|
// Получаем выбранную дату из фильтра
|
||||||
const parts = this.minInput.value.split('-');
|
const parts = this.minInput.value.split('-');
|
||||||
@@ -57,7 +57,7 @@ class DateCarousel {
|
|||||||
parseInt(parts[2])
|
parseInt(parts[2])
|
||||||
);
|
);
|
||||||
selectedDate.setHours(0, 0, 0, 0);
|
selectedDate.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
// Вычисляем центральную дату: выбранная дата минус смещение
|
// Вычисляем центральную дату: выбранная дата минус смещение
|
||||||
this.centerDate = new Date(selectedDate);
|
this.centerDate = new Date(selectedDate);
|
||||||
this.centerDate.setDate(this.centerDate.getDate() - savedData.offset);
|
this.centerDate.setDate(this.centerDate.getDate() - savedData.offset);
|
||||||
@@ -84,14 +84,14 @@ class DateCarousel {
|
|||||||
init() {
|
init() {
|
||||||
this.calculateDaysCount();
|
this.calculateDaysCount();
|
||||||
this.loadSelectedDate(); // Загрузить выбранную дату из фильтра
|
this.loadSelectedDate(); // Загрузить выбранную дату из фильтра
|
||||||
|
|
||||||
// Если в localStorage есть сохраненные данные
|
// Если в localStorage есть сохраненные данные
|
||||||
const savedData = this.loadSavedCenterDate();
|
const savedData = this.loadSavedCenterDate();
|
||||||
if (savedData) {
|
if (savedData) {
|
||||||
// Если есть смещение, это означает, что дата была выбрана пользователем
|
// Если есть смещение, это означает, что дата была выбрана пользователем
|
||||||
if (savedData.offset !== 0) {
|
if (savedData.offset !== 0) {
|
||||||
// Проверяем, есть ли выбранная дата в фильтрах
|
// Проверяем, есть ли выбранная дата в фильтрах
|
||||||
if (this.minInput.value && this.maxInput.value &&
|
if (this.minInput.value && this.maxInput.value &&
|
||||||
this.minInput.value === this.maxInput.value) {
|
this.minInput.value === this.maxInput.value) {
|
||||||
// Получаем выбранную дату из фильтра
|
// Получаем выбранную дату из фильтра
|
||||||
const parts = this.minInput.value.split('-');
|
const parts = this.minInput.value.split('-');
|
||||||
@@ -102,9 +102,9 @@ class DateCarousel {
|
|||||||
parseInt(parts[2])
|
parseInt(parts[2])
|
||||||
);
|
);
|
||||||
selectedDate.setHours(0, 0, 0, 0);
|
selectedDate.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
// Вычисляем центральную дату: выбранная дата минус смещение
|
// Вычисляем центральную дату: выбранная дата минус смещение
|
||||||
// (т.к. смещение показывает, на сколько дней выбранная дата
|
// (т.к. смещение показывает, на сколько дней выбранная дата
|
||||||
// смещена вправо от центра)
|
// смещена вправо от центра)
|
||||||
this.centerDate = new Date(selectedDate);
|
this.centerDate = new Date(selectedDate);
|
||||||
this.centerDate.setDate(this.centerDate.getDate() - savedData.offset);
|
this.centerDate.setDate(this.centerDate.getDate() - savedData.offset);
|
||||||
@@ -121,9 +121,10 @@ class DateCarousel {
|
|||||||
this.centerDate = savedData.centerDate;
|
this.centerDate = savedData.centerDate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.render();
|
this.render();
|
||||||
this.attachNavHandlers();
|
this.attachNavHandlers();
|
||||||
|
this.attachTodayHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -187,6 +188,7 @@ class DateCarousel {
|
|||||||
// Перерисовываем только если количество дней изменилось
|
// Перерисовываем только если количество дней изменилось
|
||||||
if (oldDaysCount !== this.daysCount) {
|
if (oldDaysCount !== this.daysCount) {
|
||||||
this.render();
|
this.render();
|
||||||
|
this.attachTodayHandler(); // Восстанавливаем обработчик кнопки "Сегодня" после рендеринга
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,7 +363,6 @@ class DateCarousel {
|
|||||||
attachNavHandlers() {
|
attachNavHandlers() {
|
||||||
const prevBtn = this.container.parentElement.querySelector('.carousel-prev');
|
const prevBtn = this.container.parentElement.querySelector('.carousel-prev');
|
||||||
const nextBtn = this.container.parentElement.querySelector('.carousel-next');
|
const nextBtn = this.container.parentElement.querySelector('.carousel-next');
|
||||||
const todayBtn = this.container.parentElement.querySelector('.today-btn');
|
|
||||||
|
|
||||||
if (prevBtn) {
|
if (prevBtn) {
|
||||||
prevBtn.addEventListener('click', () => this.shiftDays(-1));
|
prevBtn.addEventListener('click', () => this.shiftDays(-1));
|
||||||
@@ -370,16 +371,37 @@ class DateCarousel {
|
|||||||
if (nextBtn) {
|
if (nextBtn) {
|
||||||
nextBtn.addEventListener('click', () => this.shiftDays(1));
|
nextBtn.addEventListener('click', () => this.shiftDays(1));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Подключение обработчика для кнопки "Сегодня"
|
||||||
|
* Вынесено в отдельный метод, чтобы можно было вызывать после полной отрисовки компонента
|
||||||
|
*/
|
||||||
|
attachTodayHandler() {
|
||||||
|
const todayBtn = this.container.parentElement.querySelector('.today-btn');
|
||||||
|
|
||||||
if (todayBtn) {
|
if (todayBtn) {
|
||||||
todayBtn.addEventListener('click', () => this.goToToday());
|
todayBtn.removeEventListener('click', this.boundGoToToday); // Удаляем предыдущий обработчик, если был
|
||||||
|
this.boundGoToToday = this.goToToday.bind(this);
|
||||||
|
todayBtn.addEventListener('click', this.boundGoToToday);
|
||||||
|
console.log('Today button handler attached');
|
||||||
|
} else {
|
||||||
|
console.error('Today button not found when trying to attach handler');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Переход к сегодняшней дате
|
* Переход к сегодняшней дате
|
||||||
*/
|
*/
|
||||||
goToToday() {
|
goToToday() {
|
||||||
|
console.log('Today button clicked');
|
||||||
|
|
||||||
|
// Проверяем существование элементов
|
||||||
|
if (!this.minInput || !this.maxInput) {
|
||||||
|
console.error('minInput or maxInput not found!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
today.setHours(0, 0, 0, 0);
|
today.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
@@ -387,25 +409,34 @@ class DateCarousel {
|
|||||||
const formattedDate = this.formatDate(today);
|
const formattedDate = this.formatDate(today);
|
||||||
this.minInput.value = formattedDate;
|
this.minInput.value = formattedDate;
|
||||||
this.maxInput.value = formattedDate;
|
this.maxInput.value = formattedDate;
|
||||||
|
|
||||||
|
console.log(`Set values - Min: ${this.minInput.value}, Max: ${this.maxInput.value}`);
|
||||||
|
|
||||||
// Устанавливаем сегодняшнюю дату как центральную
|
// Устанавливаем сегодняшнюю дату как центральную
|
||||||
this.centerDate = today;
|
this.centerDate = today;
|
||||||
|
|
||||||
// Сохраняем новую центральную дату без смещения
|
// При нажатии на "Сегодня" устанавливаем центральную дату на сегодня без смещения
|
||||||
this.saveCenterDate();
|
// и сохраняем без смещения, чтобы календарь центрировался на сегодня
|
||||||
|
this.saveCenterDate(0);
|
||||||
|
|
||||||
// Очищаем выделение с других кнопок и обновляем визуальное состояние
|
// Очищаем выделение с других кнопок и обновляем визуальное состояние
|
||||||
this.render();
|
this.render();
|
||||||
|
|
||||||
|
// Обновляем обработчик после перерисовки
|
||||||
|
this.attachTodayHandler();
|
||||||
|
|
||||||
console.log(`Navigated to today: ${formattedDate}`);
|
console.log(`Navigated to today: ${formattedDate}`);
|
||||||
|
|
||||||
// Автоматическая отправка формы
|
// Автоматическая отправка формы
|
||||||
const form = this.minInput.closest('form');
|
const form = this.minInput.closest('form');
|
||||||
if (form) {
|
if (form) {
|
||||||
|
console.log('Submitting form');
|
||||||
form.submit();
|
form.submit();
|
||||||
|
} else {
|
||||||
|
console.error('Form not found!');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Сохранение центральной даты и смещения в localStorage
|
* Сохранение центральной даты и смещения в localStorage
|
||||||
*/
|
*/
|
||||||
@@ -418,14 +449,14 @@ class DateCarousel {
|
|||||||
};
|
};
|
||||||
localStorage.setItem(key, JSON.stringify(saveData));
|
localStorage.setItem(key, JSON.stringify(saveData));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Загрузка центральной даты из localStorage
|
* Загрузка центральной даты из localStorage
|
||||||
*/
|
*/
|
||||||
loadSavedCenterDate() {
|
loadSavedCenterDate() {
|
||||||
const key = `date_carousel_center_${this.minInputId}`;
|
const key = `date_carousel_center_${this.minInputId}`;
|
||||||
const savedDataStr = localStorage.getItem(key);
|
const savedDataStr = localStorage.getItem(key);
|
||||||
|
|
||||||
if (savedDataStr) {
|
if (savedDataStr) {
|
||||||
try {
|
try {
|
||||||
const savedData = JSON.parse(savedDataStr);
|
const savedData = JSON.parse(savedDataStr);
|
||||||
@@ -450,10 +481,10 @@ class DateCarousel {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Вычисление смещения выбранной даты от центральной
|
* Вычисление смещения выбранной даты от центральной
|
||||||
*/
|
*/
|
||||||
@@ -461,17 +492,17 @@ class DateCarousel {
|
|||||||
// Генерируем дни с текущей центральной датой
|
// Генерируем дни с текущей центральной датой
|
||||||
const days = this.generateDays();
|
const days = this.generateDays();
|
||||||
// Находим индекс выбранной даты
|
// Находим индекс выбранной даты
|
||||||
const selectedIndex = days.findIndex(day =>
|
const selectedIndex = days.findIndex(day =>
|
||||||
day.date.getTime() === selectedDate.getTime()
|
day.date.getTime() === selectedDate.getTime()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (selectedIndex !== -1) {
|
if (selectedIndex !== -1) {
|
||||||
// Находим центральный индекс
|
// Находим центральный индекс
|
||||||
const centerIndex = Math.floor(this.daysCount / 2);
|
const centerIndex = Math.floor(this.daysCount / 2);
|
||||||
// Вычисляем смещение от центра
|
// Вычисляем смещение от центра
|
||||||
return selectedIndex - centerIndex;
|
return selectedIndex - centerIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; // Если дата не найдена, возвращаем 0
|
return 0; // Если дата не найдена, возвращаем 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,4 +514,4 @@ class DateCarousel {
|
|||||||
this.saveCenterDate(); // Сохраняем новую центральную дату (без смещения для прокрутки)
|
this.saveCenterDate(); // Сохраняем новую центральную дату (без смещения для прокрутки)
|
||||||
this.render();
|
this.render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user