176 lines
6.6 KiB
JavaScript
176 lines
6.6 KiB
JavaScript
import { Controller } from 'stimulus';
|
|
|
|
import daterangepicker from 'daterangepicker'
|
|
import 'daterangepicker/daterangepicker.css'
|
|
|
|
/*
|
|
* This is an example Stimulus controller!
|
|
*
|
|
* Any element with a data-controller="datePicker" attribute will cause
|
|
* this controller to be executed. The name "hello" comes from the filename:
|
|
* datePicker_controller.js -> "datePicker"
|
|
*
|
|
* Delete this file or adapt it for your use!
|
|
*/
|
|
export default class extends Controller {
|
|
connect() {
|
|
var locale = {
|
|
format: 'DD.MM.YYYY',
|
|
"applyLabel": "Ок",
|
|
"cancelLabel": "Отмена",
|
|
"fromLabel": "От",
|
|
"toLabel": "До",
|
|
"customRangeLabel": "Произвольный",
|
|
"daysOfWeek": [
|
|
"Вс",
|
|
"Пн",
|
|
"Вт",
|
|
"Ср",
|
|
"Чт",
|
|
"Пт",
|
|
"Сб"
|
|
],
|
|
"monthNames": [
|
|
"Январь",
|
|
"Февраль",
|
|
"Март",
|
|
"Апрель",
|
|
"Май",
|
|
"Июнь",
|
|
"Июль",
|
|
"Август",
|
|
"Сентябрь",
|
|
"Октябрь",
|
|
"Ноябрь",
|
|
"Декабрь"
|
|
],
|
|
firstDay: 1
|
|
};
|
|
|
|
var date = new Date();
|
|
var lastDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 7);
|
|
|
|
// Получаем значение даты из URL параметра или из атрибута value элемента
|
|
let currentDateValue = this.element.value || this.element.getAttribute('value');
|
|
|
|
// Если значение не установлено, пробуем получить из URL
|
|
if (!currentDateValue || currentDateValue.trim() === '') {
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
currentDateValue = urlParams.get('specialist_search[current_date]') ||
|
|
urlParams.get('specialist_search%5Bcurrent_date%5D') ||
|
|
decodeURIComponent(urlParams.get('specialist_search%5Bcurrent_date%5D') || '');
|
|
}
|
|
|
|
if (this.element.getAttribute('range') == 'true') {
|
|
let startDate = date;
|
|
let endDate = lastDate;
|
|
|
|
// Если есть значение из URL или value, парсим его
|
|
if (currentDateValue && currentDateValue.trim() !== '') {
|
|
const dateRange = this.parseDateRange(currentDateValue);
|
|
if (dateRange && dateRange.start && dateRange.end) {
|
|
startDate = dateRange.start;
|
|
endDate = dateRange.end;
|
|
}
|
|
}
|
|
|
|
// Форматируем даты для daterangepicker (формат DD.MM.YYYY)
|
|
const formattedStart = window.dateFormat(startDate, 'd.m.Y');
|
|
const formattedEnd = window.dateFormat(endDate, 'd.m.Y');
|
|
|
|
const picker = jQuery(this.element).daterangepicker({
|
|
locale: locale,
|
|
"startDate": formattedStart,
|
|
"endDate": formattedEnd
|
|
}, function(start, end, label) {
|
|
// Callback при изменении даты
|
|
});
|
|
|
|
// Устанавливаем значение в поле после инициализации
|
|
// daterangepicker автоматически форматирует значение согласно locale.format
|
|
// Используем setTimeout чтобы дать время daterangepicker инициализироваться
|
|
setTimeout(() => {
|
|
if (currentDateValue && currentDateValue.trim() !== '') {
|
|
this.element.value = currentDateValue.trim();
|
|
} else {
|
|
this.element.value = `${formattedStart} - ${formattedEnd}`;
|
|
}
|
|
}, 100);
|
|
} else {
|
|
let selectedDate = date;
|
|
|
|
// Если есть значение, парсим его
|
|
if (currentDateValue && currentDateValue.trim() !== '') {
|
|
const parsedDate = this.parseSingleDate(currentDateValue);
|
|
if (parsedDate) {
|
|
selectedDate = parsedDate;
|
|
this.element.value = currentDateValue;
|
|
}
|
|
}
|
|
|
|
jQuery(this.element).daterangepicker({
|
|
singleDatePicker: true,
|
|
autoApply: true,
|
|
showDropdowns: true,
|
|
minYear: 1930,
|
|
maxYear: new Date(),
|
|
locale: locale,
|
|
"startDate": window.dateFormat(selectedDate, 'd-m-Y')
|
|
});
|
|
}
|
|
}
|
|
|
|
parseDateRange(dateString) {
|
|
if (!dateString) return null;
|
|
|
|
// Парсим формат "13.01.2026 - 20.01.2026" или "13.01.2026+-+20.01.2026"
|
|
const match = dateString.match(/^(.+?)\s*[-+]\s*(.+)$/);
|
|
if (!match) return null;
|
|
|
|
const startStr = match[1].trim();
|
|
const endStr = match[2].trim();
|
|
|
|
const startDate = this.parseDateString(startStr);
|
|
const endDate = this.parseDateString(endStr);
|
|
|
|
if (!startDate || !endDate) return null;
|
|
|
|
return { start: startDate, end: endDate };
|
|
}
|
|
|
|
parseSingleDate(dateString) {
|
|
if (!dateString) return null;
|
|
return this.parseDateString(dateString.trim());
|
|
}
|
|
|
|
parseDateString(dateStr) {
|
|
if (!dateStr) return null;
|
|
|
|
// Формат "dd.mm.yyyy"
|
|
const match = dateStr.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/);
|
|
if (match) {
|
|
const day = parseInt(match[1], 10);
|
|
const month = parseInt(match[2], 10) - 1; // месяцы в JS начинаются с 0
|
|
const year = parseInt(match[3], 10);
|
|
return new Date(year, month, day);
|
|
}
|
|
|
|
// Формат "yyyy-mm-dd"
|
|
const match2 = dateStr.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);
|
|
if (match2) {
|
|
const year = parseInt(match2[1], 10);
|
|
const month = parseInt(match2[2], 10) - 1;
|
|
const day = parseInt(match2[3], 10);
|
|
return new Date(year, month, day);
|
|
}
|
|
|
|
// Пробуем стандартный парсинг
|
|
const parsed = new Date(dateStr);
|
|
if (!isNaN(parsed.getTime())) {
|
|
return parsed;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|