templates/js/library/month_range_slider_dropdown/month_range_slider_dropdown.js.twig line 1

Open in your IDE?
  1. class MonthRangeSliderDropdown extends Dropdown {
  2.     EVENTS = {
  3.         ON_CHANGE: 'onChange',
  4.         ON_APPLY_BUTTON_CLICK: 'onApplyButtonClick',
  5.         ON_DROPDOWN_SHOW: 'onDropdownShow',
  6.         ON_DROPDOWN_HIDE: 'onDropdownHide',
  7.     };
  8.     options = {
  9.         preventDropdownClose: true,
  10.         monthRangeSliderOptions: {
  11.             minDate: null,
  12.             maxDate: null,
  13.             startDate: null,
  14.             endDate: null,
  15.         },
  16.     };
  17.     /** @type {MonthRangeSlider|null} */
  18.     monthRangeSlider = null;
  19.     $applyButton = null;
  20.     constructor(dropdownElement, options = null) {
  21.         options = { preventDropdownClose: true, ...options };
  22.         super(dropdownElement, options);
  23.         this.options = { ...this.options, ...options };
  24.         this.$dropdown = $(dropdownElement);
  25.         this.$sliderContainer = this.$dropdown.find('.month-range-slider-wrapper').first();
  26.         if (!this.$sliderContainer.length) {
  27.             return;
  28.         }
  29.         const containerId = this.$sliderContainer.attr('id') || ('monthRange_' + Date.now());
  30.         if (!this.$sliderContainer.attr('id')) {
  31.             this.$sliderContainer.attr('id', containerId);
  32.         }
  33.         const parseDate = (str) => {
  34.             if (!str) return null;
  35.             const p = str.split('-');
  36.             return new Date(parseInt(p[0]), parseInt(p[1]) - 1, 1);
  37.         };
  38.         const sliderOpts = this.options.monthRangeSliderOptions || {};
  39.         const sliderMinDate = (sliderOpts.minDate instanceof Date ? sliderOpts.minDate : null)
  40.             || parseDate(this.$sliderContainer.data('min-date'))
  41.             || new Date(2025, 0, 1);
  42.         const sliderMaxDate = (sliderOpts.maxDate instanceof Date ? sliderOpts.maxDate : null)
  43.             || parseDate(this.$sliderContainer.data('max-date'))
  44.             || null;
  45.         const sliderStartDate = (sliderOpts.startDate instanceof Date ? sliderOpts.startDate : null)
  46.             || parseDate(this.$sliderContainer.data('start-date'))
  47.             || null;
  48.         const sliderEndDate = (sliderOpts.endDate instanceof Date ? sliderOpts.endDate : null)
  49.             || parseDate(this.$sliderContainer.data('end-date'))
  50.             || null;
  51.         this.monthRangeSlider = new MonthRangeSlider(
  52.             containerId,
  53.             sliderMinDate,
  54.             sliderMaxDate,
  55.             {
  56.                 onChange: (startDate, endDate) => {
  57.                     const lastDay = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0);
  58.                     const lastDayStr = `${lastDay.getDate().toString().padStart(2, '0')}.${(lastDay.getMonth() + 1).toString().padStart(2, '0')}.${lastDay.getFullYear()}`;
  59.                     this.setDropdownButtonText(
  60.                         `${startDate.getDate().toString().padStart(2, '0')}.${(startDate.getMonth() + 1).toString().padStart(2, '0')}.${startDate.getFullYear()} – ` + lastDayStr
  61.                     );
  62.                     this.eventDispatcher.emit(this.EVENTS.ON_CHANGE, {
  63.                         startDate,
  64.                         endDate,
  65.                         dropdownElement: this.dropdownElement,
  66.                     });
  67.                 },
  68.                 startDate: sliderStartDate,
  69.                 endDate: sliderEndDate,
  70.             }
  71.         );
  72.         this.$applyButton = this.$dropdown.find('.month-range-slider-apply-btn');
  73.         this.$applyButton.on('click', () => {
  74.             this.eventDispatcher.emit(this.EVENTS.ON_APPLY_BUTTON_CLICK, {
  75.                 startDate: this.monthRangeSlider.getStartDate(),
  76.                 endDate: this.monthRangeSlider.getEndDate(),
  77.                 dropdownElement: this.dropdownElement,
  78.             });
  79.         });
  80.     }
  81.     getStartDate() {
  82.         return this.monthRangeSlider ? this.monthRangeSlider.getStartDate() : null;
  83.     }
  84.     getEndDate() {
  85.         return this.monthRangeSlider ? this.monthRangeSlider.getEndDate() : null;
  86.     }
  87. }