chore: initial import for test contour with k3s CI
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user