class MonthRangeSliderDropdown extends Dropdown {
EVENTS = {
ON_CHANGE: 'onChange',
ON_APPLY_BUTTON_CLICK: 'onApplyButtonClick',
ON_DROPDOWN_SHOW: 'onDropdownShow',
ON_DROPDOWN_HIDE: 'onDropdownHide',
};
options = {
preventDropdownClose: true,
monthRangeSliderOptions: {
minDate: null,
maxDate: null,
startDate: null,
endDate: null,
},
};
/** @type {MonthRangeSlider|null} */
monthRangeSlider = null;
$applyButton = null;
constructor(dropdownElement, options = null) {
options = { preventDropdownClose: true, ...options };
super(dropdownElement, options);
this.options = { ...this.options, ...options };
this.$dropdown = $(dropdownElement);
this.$sliderContainer = this.$dropdown.find('.month-range-slider-wrapper').first();
if (!this.$sliderContainer.length) {
return;
}
const containerId = this.$sliderContainer.attr('id') || ('monthRange_' + Date.now());
if (!this.$sliderContainer.attr('id')) {
this.$sliderContainer.attr('id', containerId);
}
const parseDate = (str) => {
if (!str) return null;
const p = str.split('-');
return new Date(parseInt(p[0]), parseInt(p[1]) - 1, 1);
};
const sliderOpts = this.options.monthRangeSliderOptions || {};
const sliderMinDate = (sliderOpts.minDate instanceof Date ? sliderOpts.minDate : null)
|| parseDate(this.$sliderContainer.data('min-date'))
|| new Date(2025, 0, 1);
const sliderMaxDate = (sliderOpts.maxDate instanceof Date ? sliderOpts.maxDate : null)
|| parseDate(this.$sliderContainer.data('max-date'))
|| null;
const sliderStartDate = (sliderOpts.startDate instanceof Date ? sliderOpts.startDate : null)
|| parseDate(this.$sliderContainer.data('start-date'))
|| null;
const sliderEndDate = (sliderOpts.endDate instanceof Date ? sliderOpts.endDate : null)
|| parseDate(this.$sliderContainer.data('end-date'))
|| null;
this.monthRangeSlider = new MonthRangeSlider(
containerId,
sliderMinDate,
sliderMaxDate,
{
onChange: (startDate, endDate) => {
const lastDay = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0);
const lastDayStr = `${lastDay.getDate().toString().padStart(2, '0')}.${(lastDay.getMonth() + 1).toString().padStart(2, '0')}.${lastDay.getFullYear()}`;
this.setDropdownButtonText(
`${startDate.getDate().toString().padStart(2, '0')}.${(startDate.getMonth() + 1).toString().padStart(2, '0')}.${startDate.getFullYear()} – ` + lastDayStr
);
this.eventDispatcher.emit(this.EVENTS.ON_CHANGE, {
startDate,
endDate,
dropdownElement: this.dropdownElement,
});
},
startDate: sliderStartDate,
endDate: sliderEndDate,
}
);
this.$applyButton = this.$dropdown.find('.month-range-slider-apply-btn');
this.$applyButton.on('click', () => {
this.eventDispatcher.emit(this.EVENTS.ON_APPLY_BUTTON_CLICK, {
startDate: this.monthRangeSlider.getStartDate(),
endDate: this.monthRangeSlider.getEndDate(),
dropdownElement: this.dropdownElement,
});
});
}
getStartDate() {
return this.monthRangeSlider ? this.monthRangeSlider.getStartDate() : null;
}
getEndDate() {
return this.monthRangeSlider ? this.monthRangeSlider.getEndDate() : null;
}
}