@wernfried/daterangepicker 5.1.1 → 5.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/dist/esm/daterangepicker.js +2 -10
- package/dist/esm/daterangepicker.js.map +1 -0
- package/dist/esm/daterangepicker.min.js +2 -1
- package/dist/esm/daterangepicker.min.js.map +1 -0
- package/dist/global/daterangepicker.js +89 -116
- package/dist/global/daterangepicker.js.map +1 -0
- package/dist/global/daterangepicker.min.js +2 -1
- package/dist/global/daterangepicker.min.js.map +1 -0
- package/package.json +7 -12
package/README.md
CHANGED
|
@@ -19,8 +19,8 @@ Above samples are based on the [original repository](https://github.com/dangross
|
|
|
19
19
|
#### Global import with `<script>` tags
|
|
20
20
|
```html
|
|
21
21
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
|
|
22
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
23
|
-
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
22
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/dist/global/daterangepicker.min.js"></script>
|
|
23
|
+
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/css/daterangepicker.min.css" rel="stylesheet" />
|
|
24
24
|
|
|
25
25
|
<input type="text" id="picker" />
|
|
26
26
|
|
|
@@ -40,11 +40,11 @@ Above samples are based on the [original repository](https://github.com/dangross
|
|
|
40
40
|
{
|
|
41
41
|
"imports": {
|
|
42
42
|
"luxon": "https://cdn.jsdelivr.net/npm/luxon@3.7.2/+esm",
|
|
43
|
-
"daterangepicker": "https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
43
|
+
"daterangepicker": "https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/+esm"
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
</script>
|
|
47
|
-
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
47
|
+
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/css/daterangepicker.min.css" rel="stylesheet" />
|
|
48
48
|
|
|
49
49
|
<input type="text" id="picker" />
|
|
50
50
|
|
|
@@ -63,9 +63,9 @@ Above samples are based on the [original repository](https://github.com/dangross
|
|
|
63
63
|
#### Style with Bulma
|
|
64
64
|
```html
|
|
65
65
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
|
|
66
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
66
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/dist/global/daterangepicker.min.js"></script>
|
|
67
67
|
<link type="text/css" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css" rel="stylesheet" />
|
|
68
|
-
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
68
|
+
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/css/daterangepicker.bulma.min.css" rel="stylesheet" />
|
|
69
69
|
|
|
70
70
|
<input type="text" id="picker" />
|
|
71
71
|
|
|
@@ -121,8 +121,8 @@ Initialisation with jQuery is supported in version 5.x
|
|
|
121
121
|
```html
|
|
122
122
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
|
|
123
123
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/luxon@3.5.0/build/global/luxon.min.js"></script>
|
|
124
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
125
|
-
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.
|
|
124
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/dist/global/daterangepicker.min.js"></script>
|
|
125
|
+
<link type="text/css" href="https://cdn.jsdelivr.net/npm/@wernfried/daterangepicker@5.1.2/css/daterangepicker.min.css" rel="stylesheet" />
|
|
126
126
|
|
|
127
127
|
<input type="text" id="picker" />
|
|
128
128
|
|
|
@@ -238,7 +238,6 @@ class DateRangePicker {
|
|
|
238
238
|
} else {
|
|
239
239
|
console.error(`Option '${key}' is not valid`);
|
|
240
240
|
}
|
|
241
|
-
;
|
|
242
241
|
}
|
|
243
242
|
}
|
|
244
243
|
if (this.minSpan && this.maxSpan && this.minSpan > this.maxSpan) {
|
|
@@ -267,7 +266,6 @@ class DateRangePicker {
|
|
|
267
266
|
console.error(`Option 'timePickerStepSize' is not valid`);
|
|
268
267
|
duration = this.timePickerStepSize;
|
|
269
268
|
}
|
|
270
|
-
;
|
|
271
269
|
var valid = [];
|
|
272
270
|
for (let unit of ["minutes", "seconds"])
|
|
273
271
|
valid.push(...[1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30].map((x) => {
|
|
@@ -1311,7 +1309,6 @@ class DateRangePicker {
|
|
|
1311
1309
|
html += ` class="${this.weekendDayClasses}"`;
|
|
1312
1310
|
html += `>${dayOfWeek}</th>`;
|
|
1313
1311
|
}
|
|
1314
|
-
;
|
|
1315
1312
|
html += "</tr>";
|
|
1316
1313
|
this.container.querySelector(`.drp-calendar.${side} .calendar-table thead`).innerHTML = html;
|
|
1317
1314
|
html = "";
|
|
@@ -2370,10 +2367,5 @@ Object.defineProperty(window, "jQuery", {
|
|
|
2370
2367
|
return this._jQuery;
|
|
2371
2368
|
}
|
|
2372
2369
|
});
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
DateRangePicker,
|
|
2376
|
-
daterangepicker,
|
|
2377
|
-
daterangepicker_default as default,
|
|
2378
|
-
getDateRangePicker
|
|
2379
|
-
};
|
|
2370
|
+
export { DateRangePicker, daterangepicker, getDateRangePicker };
|
|
2371
|
+
//# sourceMappingURL=daterangepicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daterangepicker.js","sources":["../../src/daterangepicker.js"],"sourcesContent":["import { DateTime, Duration, Info, Settings } from 'luxon';\r\n\r\n/**\r\n* @constructs DateRangePicker\r\n* @param {string|external:HTMLElement} element - A DOM HTMLElement or querySelector string of element where DateRangePicker is attached. Often a `<input>` element.\r\n* @param {Options} options - Object to configure the DateRangePicker\r\n* @param {function} cb - Callback function executed when new date values applied\r\n*/\r\nclass DateRangePicker {\r\n #startDate = null;\r\n #endDate = null;\r\n\r\n constructor(element, options, cb) {\r\n /**\r\n * Options for DateRangePicker\r\n * @typedef Options \r\n * @property {string|external:HTMLElement} parentEl=body - {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector#selectors|Document querySelector} \r\n * or `HTMLElement` of the parent element that the date range picker will be added to\r\n\r\n * @property {external:DateTime|external:Date|string|null} startDate - Default: `DateTime.now().startOf('day')`<br>The beginning date of the initially selected date range.<br>\r\n * Must be a `luxon.DateTime` or `Date` or `string` according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} or a string matching `locale.format`.<br>\r\n * Date value is rounded to match option `timePickerStepSize`<br>\r\n * Option `isInvalidDate` and `isInvalidTime` are not evaluated, you may set date/time which is not selectable in calendar.<br>\r\n * If the date does not fall into `minDate` and `maxDate` then date is shifted and a warning is written to console.<br>\r\n * Use `startDate: null` to show calendar without an inital selected date.\r\n * @property {external:DateTime|external:Date|string} endDate - Defautl: `DateTime.now().endOf('day')`<br>The end date of the initially selected date range.<br>\r\n * Must be a `luxon.DateTime` or `Date` or `string` according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} or a string matching `locale.format`.<br>\r\n * Date value is rounded to match option `timePickerStepSize`<br>\r\n * Option `isInvalidDate`, `isInvalidTime` and `minSpan`, `maxSpan` are not evaluated, you may set date/time which is not selectable in calendar.<br>\r\n * If the date does not fall into `minDate` and `maxDate` then date is shifted and a warning is written to console.<br>\r\n\r\n * @property {external:DateTime|external:Date|string|null} minDate - The earliest date a user may select or `null` for no limit.<br>\r\n * Must be a `luxon.DateTime` or `Date` or `string` according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} or a string matching `locale.format`.\r\n * @property {external:DateTime|external:Date|string|null} maxDate - The latest date a user may select or `null` for no limit.<br>\r\n * Must be a `luxon.DateTime` or `Date` or `string` according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} or a string matching `locale.format`.\r\n * @property {external:Duration|string|number|null} minSpan - The minimum span between the selected start and end dates.<br>\r\n * Must be a `luxon.Duration` or number of seconds or a string according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} duration.<br>\r\n * Ignored when `singleDatePicker: true`\r\n * @property {external:Duration|string|number|null} maxSpan - The maximum span between the selected start and end dates.<br>\r\n * Must be a `luxon.Duration` or number of seconds or a string according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} duration.<br>\r\n * Ignored when `singleDatePicker: true`\r\n * @property {external:Duration|string|number|null} defaultSpan - The span which is used when endDate is automatically updated due to wrong user input<br>\r\n * Must be a `luxon.Duration` or number of seconds or a string according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} duration.<br>\r\n * Ignored when `singleDatePicker: true`. Not relevant if `minSpan: null`\r\n * @property {external:DateTime|external:Date|string|null} initalMonth - Default: `DateTime.now().startOf('month')`<br>\r\n * The inital month shown when `startDate: null`. Be aware, the attached `<input>` element must be also empty.<br>\r\n * Must be a `luxon.DateTime` or `Date` or `string` according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} or a string matching `locale.format`.<br>\r\n * When `initalMonth` is used, then `endDate` is ignored and it works only with `timePicker: false`\r\n\r\n * @property {boolean} autoApply=false - Hide the `Apply` and `Cancel` buttons, and automatically apply a new date range as soon as two dates are clicked.<br>\r\n * Only useful when `timePicker: false`\r\n * @property {boolean} singleDatePicker=false - Show only a single calendar to choose one date, instead of a range picker with two calendars.<br>\r\n * If `true`, then `endDate` is always `null`.\r\n * @property {boolean} singleMonthView=false - Show only a single month calendar, useful when selected ranges are usually short<br>\r\n * or for smaller viewports like mobile devices.<br>\r\n * Ignored for `singleDatePicker: true`. \r\n * @property {boolean} showDropdowns=false - Show year and month select boxes above calendars to jump to a specific month and year\r\n * @property {number} minYear - Default: `DateTime.now().minus({year:100}).year`<br>The minimum year shown in the dropdowns when `showDropdowns: true`\r\n * @property {number} maxYear - Default: `DateTime.now().plus({year:100}).year`<br>The maximum year shown in the dropdowns when `showDropdowns: true`\r\n * @property {boolean} showWeekNumbers=false - Show **localized** week numbers at the start of each week on the calendars\r\n * @property {boolean} showISOWeekNumbers=false - Show **ISO** week numbers at the start of each week on the calendars.<br>\r\n * Takes precedence over localized `showWeekNumbers`\r\n\r\n * @property {boolean} timePicker=false - Adds select boxes to choose times in addition to dates\r\n * @property {boolean} timePicker24Hour=true|false - Use 24-hour instead of 12-hour times, removing the AM/PM selection.<br>\r\n * Default is derived from current locale [Intl.DateTimeFormat.resolvedOptions.hour12](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/resolvedOptions#hour12).\r\n * @property {external:Duration|string|number} timePickerStepSize - Default: `Duration.fromObject({minutes:1})`<br>Set the time picker step size.<br>\r\n * Must be a `luxon.Duration` or the number of seconds or a string according to {@link https://en.wikipedia.org/wiki/ISO_8601|ISO-8601} duration.<br>\r\n * Valid values are 1,2,3,4,5,6,10,12,15,20,30 for `Duration.fromObject({seconds: ...})` and `Duration.fromObject({minutes: ...})` \r\n * and 1,2,3,4,6,(8,12) for `Duration.fromObject({hours: ...})`.<br>\r\n * Duration must be greater than `minSpan` and smaller than `maxSpan`.<br>\r\n * For example `timePickerStepSize: 600` will disable time picker seconds and time picker minutes are set to step size of 10 Minutes.\r\n\r\n * @property {boolean} autoUpdateInput=true - Indicates whether the date range picker should instantly update the value of the attached `<input>` \r\n * element when the selected dates change.<br>The `<input>` element will be always updated on `Apply` and reverted when user clicks on `Cancel`.\r\n * @property {string} onOutsideClick=apply - Defines what picker shall do when user clicks outside the calendar. \r\n * `'apply'` or `'cancel'`. Event {@link #event_outsideClick|onOutsideClick} is always emitted.\r\n * @property {boolean} linkedCalendars=true - When enabled, the two calendars displayed will always be for two sequential months (i.e. January and February), \r\n * and both will be advanced when clicking the left or right arrows above the calendars.<br>\r\n * When disabled, the two calendars can be individually advanced and display any month/year\r\n * @property {function} isInvalidDate=false - A function that is passed each date in the two calendars before they are displayed,<br> \r\n * and may return `true` or `false` to indicate whether that date should be available for selection or not.<br>\r\n * Signature: `isInvalidDate(date)`<br>\r\n * @property {function} isInvalidTime=false - A function that is passed each hour/minute/second/am-pm in the two calendars before they are displayed,<br> \r\n * and may return `true` or `false` to indicate whether that date should be available for selection or not.<br>\r\n * Signature: `isInvalidTime(time, side, unit)`<br>\r\n * `side` is `'start'` or `'end'` or `null` for `singleDatePicker: true`<br>\r\n * `unit` is `'hour'`, `'minute'`, `'second'` or `'ampm'`<br>\r\n * Hours are always given as 24-hour clock<br>\r\n * Ensure that your function returns `false` for at least one item. Otherwise the calender is not rendered.<br>\r\n * @property {function} isCustomDate=false - A function that is passed each date in the two calendars before they are displayed, \r\n * and may return a string or array of CSS class names to apply to that date's calendar cell.<br>\r\n * Signature: `isCustomDate(date)`\r\n * @property {string|Array|external:HTMLInputElement} altInput=null - A {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector#selectors|Document querySelector}<br>\r\n * string or `HTMLElement` \r\n * for an alternative output (typically hidden) `<input>` element. Uses `altFormat` to format the value.<br>\r\n * Must be a single string/HTMLElement for `singleDatePicker: true` or an array of two strings or HTMLElement for `singleDatePicker: false`<br>\r\n * Example: `['#start', '#end']`\r\n * @property {function|string} altFormat - The output format used for `altInput`.<br>\r\n * Default: ISO-8601 basic format without time zone, precisison is derived from `timePicker` and `timePickerStepSize`<br>\r\n * Example `yyyyMMdd'T'HHmm` for `timePicker=true` and display of Minutes<br> \r\n * If defined, either a string used with {@link https://moment.github.io/luxon/#/formatting?id=table-of-tokens|Format tokens} or a function.<br>\r\n * Examples: `\"yyyy:MM:dd'T'HH:mm\"`,<br>`(date) => date.toUnixInteger()`\r\n\r\n * @property {string} applyButtonClasses=btn-primary - CSS class names that will be added only to the apply button\r\n * @property {string} cancelButtonClasses=btn-default - CSS class names that will be added only to the cancel button\r\n * @property {string} buttonClasses - Default: `'btn btn-sm'`<br>CSS class names that will be added to both the apply and cancel buttons.\r\n * @property {string} weekendClasses=weekend - CSS class names that will be used to highlight weekend days.<br>\r\n * Use `null` or empty string if you don't like to highlight weekend days.\r\n * @property {string} weekendDayClasses=weekend-day - CSS class names that will be used to highlight weekend day names.<br>\r\n * Weekend days are evaluated by [Info.getWeekendWeekdays](https://moment.github.io/luxon/api-docs/index.html#infogetweekendweekdays) and depend on current \r\n * locale settings.\r\n * Use `null` or empty string if you don't like to highlight weekend day names.\r\n * @property {string} todayClasses=today - CSS class names that will be used to highlight the current day.<br>\r\n * Use `null` or empty string if you don't like to highlight the current day.\r\n\r\n * @property {string} opens=right - Whether the picker appears aligned to the left, to the right, or centered under the HTML element it's attached to.<br>\r\n * `'left' \\| 'right' \\| 'center'`\r\n * @property {string} drops=down - Whether the picker appears below or above the HTML element it's attached to.<br>\r\n * `'down' \\| 'up' \\| 'auto'`\r\n\r\n * @property {object} ranges={} - Set predefined date {@link #Ranges|Ranges} the user can select from. Each key is the label for the range, \r\n * and its value an array with two dates representing the bounds of the range.\r\n * @property {boolean} showCustomRangeLabel=true - Displays \"Custom Range\" at the end of the list of predefined {@link #Ranges|Ranges}, \r\n * when the ranges option is used.<br>\r\n * This option will be highlighted whenever the current date range selection does not match one of the predefined ranges.<br>\r\n * Clicking it will display the calendars to select a new range.\r\n * @property {boolean} alwaysShowCalendars=false - Normally, if you use the ranges option to specify pre-defined date ranges, \r\n * calendars for choosing a custom date range are not shown until the user clicks \"Custom Range\".<br>\r\n * When this option is set to true, the calendars for choosing a custom date range are always shown instead.\r\n * @property {boolean} showLabel= - Shows selected range next to Apply buttons.<br>\r\n * Defaults to `false` if anchor element is `<input type=\"text\">`, otherwise `true`\r\n * @property {object} locale={} - Allows you to provide localized strings for buttons and labels, customize the date format, \r\n * and change the first day of week for the calendars.\r\n * @property {string} locale.direction=ltr - Direction of reading, `'ltr'` or `'rtl'`\r\n * @property {object|string} locale.format - Default: `DateTime.DATE_SHORT` or `DateTime.DATETIME_SHORT` when `timePicker: true`<br>Date formats. \r\n * Either given as string, see [Format Tokens](https://moment.github.io/luxon/#/formatting?id=table-of-tokens) or an object according \r\n * to [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat)<br>\r\n * I recommend to use the luxon [Presets](https://moment.github.io/luxon/#/formatting?id=presets).\r\n * @property {string} locale.separator - Defaut: `' - '`<br>Separator for start and end time\r\n * @property {string} locale.weekLabel=W - Label for week numbers\r\n * @property {Array} locale.daysOfWeek - Default: `luxon.Info.weekdays('short')`<br>Array with weekday names, from Monday to Sunday\r\n * @property {Array} locale.monthNames - Default: `luxon.Info.months('long')`<br>Array with month names\r\n * @property {number} locale.firstDay - Default: `luxon.Info.getStartOfWeek()`<br>First day of the week, 1 for Monday through 7 for Sunday\r\n * @property {string} locale.applyLabel=Apply - Label of `Apply` Button\r\n * @property {string} locale.cancelLabel=Cancel - Label of `Cancel` Button\r\n * @property {string} locale.customRangeLabel=Custom Range - Title for custom ranges\r\n * @property {object|string|function} locale.durationFormat={} - Format a custom label for selected duration, for example `'5 Days, 12 Hours'`.<br>\r\n * Define the format either as string, see [Duration.toFormat - Format Tokens](https://moment.github.io/luxon/api-docs/index.html#durationtoformat) or \r\n * an object according to [Intl.NumberFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options), \r\n * see [Duration.toHuamn](https://moment.github.io/luxon/api-docs/index.html#durationtohuman).<br>\r\n * Or custom function as `(startDate, endDate) => {}`\r\n */\r\n\r\n /**\r\n * A set of predefined ranges.<br>\r\n * Ranges are not validated against `minDate`, `maxDate`, `minSpan`, `maxSpan` or `timePickerStepSize ` constraints.\r\n * @typedef Ranges\r\n * @type {Object}\r\n * @property {string} name - The name of the range\r\n * @property {external:DateTime|external:Date|string} range - Array of 2 elements with `startDate` and `endDate`\r\n * @example {\r\n * 'Today': [DateTime.now().startOf('day'), DateTime.now().endOf('day')],\r\n * 'Yesterday': [DateTime.now().startOf('day').minus({days: 1}), DateTime.now().minus({days: 1}).endOf('day')],\r\n * 'Last 7 Days': [DateTime.now().startOf('day').minus({days: 6}), DateTime.now()],\r\n * 'Last 30 Days': [DateTime.now().startOf('day').minus({days: 29}), DateTime.now()],\r\n * 'This Month': [DateTime.now().startOf('day').startOf('month'), DateTime.now().endOf('month')],\r\n * 'Last Month': [DateTime.now().startOf('day').minus({months: 1}).startOf('month'), DateTime.now().minus({months: 1}).endOf('month')]\r\n * }\r\n */\r\n\r\n /**\r\n * A single predefined range\r\n * @typedef Range\r\n * @type {Object}\r\n * @property {string} name - The name of the range\r\n * @property {external:DateTime|external:Date|string} range - Array of 2 elements with startDate and endDate\r\n * @example { Today: [DateTime.now().startOf('day'), DateTime.now().endOf('day')] } \r\n */\r\n\r\n if (typeof element === 'string' && document.querySelectorAll(element).length > 1)\r\n throw new RangeError(`Option 'element' must match to one element only`);\r\n\r\n //default settings for options\r\n this.parentEl = 'body';\r\n this.element = element instanceof HTMLElement ? element : document.querySelector(element);\r\n this.isInputText = this.element instanceof HTMLInputElement && this.element.type === 'text';\r\n this.#startDate = DateTime.now().startOf('day');\r\n this.#endDate = DateTime.now().plus({ day: 1 }).startOf('day');\r\n this.minDate = null;\r\n this.maxDate = null;\r\n this.maxSpan = null;\r\n this.minSpan = null;\r\n this.defaultSpan = null;\r\n this.initalMonth = DateTime.now().startOf('month');\r\n this.autoApply = false;\r\n this.singleDatePicker = false;\r\n this.singleMonthView = false;\r\n this.showDropdowns = false;\r\n this.minYear = DateTime.now().minus({ year: 100 }).year;\r\n this.maxYear = DateTime.now().plus({ year: 100 }).year;\r\n this.showWeekNumbers = false;\r\n this.showISOWeekNumbers = false;\r\n this.showCustomRangeLabel = true;\r\n this.showLabel = !this.isInputText;\r\n this.timePicker = false;\r\n const usesMeridiems = new Intl.DateTimeFormat(DateTime.now().locale, { hour: 'numeric' }).resolvedOptions();\r\n this.timePicker24Hour = !usesMeridiems.hour12;\r\n this.timePickerStepSize = Duration.fromObject({ minutes: 1 });\r\n this.linkedCalendars = true;\r\n this.autoUpdateInput = true;\r\n this.alwaysShowCalendars = false;\r\n this.isInvalidDate = null;\r\n this.isInvalidTime = null;\r\n this.isCustomDate = null;\r\n this.onOutsideClick = 'apply';\r\n this.opens = this.element?.classList.contains('pull-right') ? 'left' : 'right';\r\n this.drops = this.element?.classList.contains('dropup') ? 'up' : 'down';\r\n this.buttonClasses = 'btn btn-sm';\r\n this.applyButtonClasses = 'btn-primary';\r\n this.cancelButtonClasses = 'btn-default';\r\n this.weekendClasses = 'weekend';\r\n this.weekendDayClasses = 'weekend-day';\r\n this.todayClasses = 'today';\r\n this.altInput = null;\r\n this.altFormat = null;\r\n this.externalStyle = null;\r\n this.ranges = {};\r\n\r\n this.locale = {\r\n direction: 'ltr',\r\n format: DateTime.DATE_SHORT, // or DateTime.DATETIME_SHORT when timePicker: true\r\n separator: ' - ',\r\n applyLabel: 'Apply',\r\n cancelLabel: 'Cancel',\r\n weekLabel: 'W',\r\n customRangeLabel: 'Custom Range',\r\n daysOfWeek: Info.weekdays('short'),\r\n monthNames: Info.months('long'),\r\n firstDay: Info.getStartOfWeek(),\r\n durationFormat: null\r\n };\r\n\r\n if (this.element == null)\r\n return;\r\n\r\n this.callback = function () { };\r\n\r\n //some state information\r\n this.isShowing = false;\r\n this.leftCalendar = {};\r\n this.rightCalendar = {};\r\n\r\n //custom options from user\r\n if (typeof options !== 'object' || options === null)\r\n options = {};\r\n\r\n //allow setting options with data-* attributes\r\n //do not use simple this.element.dataSet to support object values\r\n let dataOptions = {};\r\n\r\n const data = Array.from(this.element.attributes).filter(x => x.name.startsWith('data-'));\r\n for (let item of data) {\r\n const name = item.name.replace(/^data-/g, '').replace(/-([a-z])/g, function (str) { return str[1].toUpperCase() });\r\n let ts = DateTime.fromISO(item.value);\r\n const isDate = ['startDate', 'endDate', 'minDate', 'maxDate', 'initalMonth'].includes(name);\r\n dataOptions[name] = (ts.isValid && isDate) ? ts : JSON.parse(item.value);\r\n }\r\n //javascript options take precedence over data-* attributes\r\n options = { ...dataOptions, ...options };\r\n\r\n if (typeof options.singleDatePicker === 'boolean')\r\n this.singleDatePicker = options.singleDatePicker;\r\n\r\n if (!this.singleDatePicker && typeof options.singleMonthView === 'boolean') {\r\n this.singleMonthView = options.singleMonthView;\r\n } else {\r\n this.singleMonthView = false;\r\n }\r\n\r\n // #region Template\r\n // detect if Bulma stylesheet is loaded\r\n if (!(options.externalStyle === null)) {\r\n const bodyStyle = window.getComputedStyle(document.body);\r\n if (bodyStyle && typeof bodyStyle[Symbol.iterator] === 'function' && [...bodyStyle].some(x => x.startsWith('--bulma-')))\r\n this.externalStyle = 'bulma';\r\n }\r\n\r\n // html template for the picker UI. Custom template would be possible, but this option is not documented\r\n if (typeof options.template === 'string' || options.template instanceof HTMLElement) {\r\n this.container = typeof options.template === 'string' ? createElementFromHTML(options.template) : options.template;\r\n } else {\r\n let template = [\r\n '<div class=\"daterangepicker\">',\r\n '<div class=\"ranges\"></div>',\r\n '<div class=\"drp-calendar left\">',\r\n '<table class=\"calendar-table\">',\r\n '<thead></thead>',\r\n '<tbody></tbody>',\r\n '<tfoot>',\r\n '<tr class=\"calendar-time start-time\"></tr>',\r\n this.singleMonthView ? '<tr class=\"calendar-time end-time\"></tr>' : '',\r\n '</tfoot>',\r\n '</table>',\r\n '</div>'];\r\n\r\n template.push(...[\r\n '<div class=\"drp-calendar right\">',\r\n '<table class=\"calendar-table\">',\r\n '<thead></thead>',\r\n '<tbody></tbody>',\r\n '<tfoot>',\r\n this.singleMonthView ? '' : '<tr class=\"calendar-time end-time\"></tr>',\r\n '</tfoot>',\r\n '</table>',\r\n '</div>']);\r\n\r\n template.push(...[\r\n '<div class=\"drp-buttons\">',\r\n '<div class=\"drp-duration-label\"></div>',\r\n '<div class=\"drp-selected\"></div>']);\r\n if (this.externalStyle === 'bulma') {\r\n template.push(...[\r\n '<div class=\"buttons\">',\r\n '<button class=\"cancelBtn button is-small\" type=\"button\"></button>',\r\n '<button class=\"applyBtn button is-small\" disabled type=\"button\"></button>',\r\n '</div>'\r\n ]);\r\n } else {\r\n template.push(...[\r\n '<div>',\r\n '<button class=\"cancelBtn\" type=\"button\"></button>',\r\n '<button class=\"applyBtn\" disabled type=\"button\"></button>',\r\n '</div>']);\r\n }\r\n template.push('</div></div>');\r\n options.template = template.join('');\r\n this.container = createElementFromHTML(options.template);\r\n }\r\n this.parentEl = document.querySelector(typeof options.parentEl === 'string' ? options.parentEl : this.parentEl);\r\n this.parentEl.appendChild(this.container);\r\n\r\n //\r\n // handle all the possible options overriding defaults\r\n //\r\n\r\n if (typeof options.timePicker === 'boolean')\r\n this.timePicker = options.timePicker;\r\n if (this.timePicker)\r\n this.locale.format = DateTime.DATETIME_SHORT;\r\n\r\n if (typeof options.locale === 'object') {\r\n for (let key of ['separator', 'applyLabel', 'cancelLabel', 'weekLabel']) {\r\n if (typeof options.locale[key] === 'string')\r\n this.locale[key] = options.locale[key];\r\n }\r\n\r\n if (typeof options.locale.direction === 'string') {\r\n if (['rtl', 'ltr'].includes(options.locale.direction))\r\n this.locale.direction = options.locale.direction\r\n else\r\n console.error(`Option 'options.locale.direction' must be 'rtl' or 'ltr'`);\r\n }\r\n\r\n if (['string', 'object'].includes(typeof options.locale.format))\r\n this.locale.format = options.locale.format;\r\n\r\n if (Array.isArray(options.locale.daysOfWeek)) {\r\n if (options.locale.daysOfWeek.some(x => typeof x !== 'string'))\r\n console.error(`Option 'options.locale.daysOfWeek' must be an array of strings`)\r\n else\r\n this.locale.daysOfWeek = options.locale.daysOfWeek.slice();\r\n }\r\n\r\n if (Array.isArray(options.locale.monthNames)) {\r\n if (options.locale.monthNames.some(x => typeof x !== 'string'))\r\n console.error(`Option 'locale.monthNames' must be an array of strings`)\r\n else\r\n this.locale.monthNames = options.locale.monthNames.slice();\r\n }\r\n\r\n if (typeof options.locale.firstDay === 'number')\r\n this.locale.firstDay = options.locale.firstDay;\r\n\r\n if (typeof options.locale.customRangeLabel === 'string') {\r\n //Support unicode chars in the custom range name.\r\n var elem = document.createElement('textarea');\r\n elem.innerHTML = options.locale.customRangeLabel;\r\n var rangeHtml = elem.value;\r\n this.locale.customRangeLabel = rangeHtml;\r\n }\r\n\r\n if (['string', 'object', 'function'].includes(typeof options.locale.durationFormat) && options.locale.durationFormat != null)\r\n this.locale.durationFormat = options.locale.durationFormat;\r\n }\r\n this.container.classList.add(this.locale.direction);\r\n // #endregion\r\n\r\n\r\n // #region Generic Options\r\n for (let key of ['timePicker24Hour', 'showWeekNumbers', 'showISOWeekNumbers',\r\n 'showDropdowns', 'linkedCalendars', 'showCustomRangeLabel',\r\n 'alwaysShowCalendars', 'autoApply', 'autoUpdateInput', 'showLabel']) {\r\n if (typeof options[key] === 'boolean')\r\n this[key] = options[key];\r\n }\r\n\r\n for (let key of ['applyButtonClasses', 'cancelButtonClasses', 'weekendClasses', 'weekendDayClasses', 'todayClasses']) {\r\n if (typeof options[key] === 'string') {\r\n this[key] = options[key];\r\n } else if (['weekendClasses', 'weekendDayClasses', 'todayClasses'].includes(key) && options[key] === null) {\r\n this[key] = options[key];\r\n }\r\n }\r\n\r\n for (let key of ['minYear', 'maxYear']) {\r\n if (typeof options[key] === 'number')\r\n this[key] = options[key];\r\n }\r\n\r\n for (let key of ['isInvalidDate', 'isInvalidTime', 'isCustomDate']) {\r\n if (typeof options[key] === 'function')\r\n this[key] = options[key]\r\n else\r\n this[key] = function () { return false };\r\n }\r\n // #endregion\r\n\r\n // #region Inital Values\r\n if (!this.singleDatePicker) {\r\n for (let opt of ['minSpan', 'maxSpan', 'defaultSpan']) {\r\n if (['string', 'number', 'object'].includes(typeof options[opt])) {\r\n if (Duration.isDuration(options[opt]) && options[opt].isValid) {\r\n this[opt] = options[opt];\r\n } else if (Duration.fromISO(options[opt]).isValid) {\r\n this[opt] = Duration.fromISO(options[opt]);\r\n } else if (typeof options[opt] === 'number' && Duration.fromObject({ seconds: options[opt] }).isValid) {\r\n this[opt] = Duration.fromObject({ seconds: options[opt] });\r\n } else if (options[opt] === null) {\r\n this[opt] = null;\r\n } else {\r\n console.error(`Option '${key}' is not valid`);\r\n };\r\n }\r\n }\r\n if (this.minSpan && this.maxSpan && this.minSpan > this.maxSpan) {\r\n this.minSpan = null;\r\n this.maxSpan = null;\r\n console.warn(`Ignore option 'minSpan' and 'maxSpan', because 'minSpan' must be smaller than 'maxSpan'`);\r\n }\r\n if (this.defaultSpan && this.minSpan && this.minSpan > this.defaultSpan) {\r\n this.defaultSpan = null;\r\n console.warn(`Ignore option 'defaultSpan', because 'defaultSpan' must be greater than 'minSpan'`);\r\n } else if (this.defaultSpan && this.maxSpan && this.maxSpan < this.defaultSpan) {\r\n this.defaultSpan = null;\r\n console.warn(`Ignore option 'defaultSpan', because 'defaultSpan' must be smaller than 'maxSpan'`);\r\n }\r\n }\r\n\r\n if (this.timePicker) {\r\n if (['string', 'object', 'number'].includes(typeof options.timePickerStepSize)) {\r\n let duration;\r\n if (Duration.isDuration(options.timePickerStepSize) && options.timePickerStepSize.isValid) {\r\n duration = options.timePickerStepSize;\r\n } else if (Duration.fromISO(options.timePickerStepSize).isValid) {\r\n duration = Duration.fromISO(options.timePickerStepSize);\r\n } else if (typeof options.timePickerStepSize === 'number' && Duration.fromObject({ seconds: options.timePickerStepSize }).isValid) {\r\n duration = Duration.fromObject({ seconds: options.timePickerStepSize });\r\n } else {\r\n console.error(`Option 'timePickerStepSize' is not valid`);\r\n duration = this.timePickerStepSize;\r\n };\r\n var valid = [];\r\n for (let unit of ['minutes', 'seconds'])\r\n valid.push(...[1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30].map(x => { return Duration.fromObject({ [unit]: x }) }));\r\n valid.push(...[1, 2, 3, 4, 6].map(x => { return Duration.fromObject({ hours: x }) }));\r\n if (this.timePicker24Hour)\r\n valid.push(...[8, 12].map(x => { return Duration.fromObject({ hours: x }) }));\r\n\r\n if (valid.some(x => duration.rescale().equals(x))) {\r\n this.timePickerStepSize = duration.rescale();\r\n } else {\r\n console.error(`Option 'timePickerStepSize' ${JSON.stringify(duration.toObject())} is not valid`);\r\n }\r\n }\r\n if (this.maxSpan && this.timePickerStepSize > this.maxSpan)\r\n console.error(`Option 'timePickerStepSize' ${JSON.stringify(this.timePickerStepSize.toObject())} must be smaller than 'maxSpan'`);\r\n\r\n this.timePickerOpts = {\r\n showMinutes: this.timePickerStepSize < Duration.fromObject({ hours: 1 }),\r\n showSeconds: this.timePickerStepSize < Duration.fromObject({ minutes: 1 }),\r\n hourStep: this.timePickerStepSize >= Duration.fromObject({ hours: 1 }) ? this.timePickerStepSize.hours : 1,\r\n minuteStep: this.timePickerStepSize >= Duration.fromObject({ minutes: 1 }) ? this.timePickerStepSize.minutes : 1,\r\n secondStep: this.timePickerStepSize.seconds\r\n };\r\n }\r\n\r\n for (let opt of ['startDate', 'endDate', 'minDate', 'maxDate', 'initalMonth']) {\r\n if (opt === 'endDate' && this.singleDatePicker)\r\n continue;\r\n if (typeof options[opt] === 'object') {\r\n if (DateTime.isDateTime(options[opt]) && options[opt].isValid) {\r\n this[opt] = options[opt];\r\n } else if (options[opt] instanceof Date) {\r\n this[opt] = DateTime.fromJSDate(options[opt]);\r\n } else if (options[opt] === null) {\r\n this[opt] = null;\r\n } else {\r\n console.error(`Option '${opt}' must be a luxon.DateTime or Date or string`);\r\n }\r\n } else if (typeof options[opt] === 'string') {\r\n const format = typeof this.locale.format === 'string' ? this.locale.format : DateTime.parseFormatForOpts(this.locale.format);\r\n if (DateTime.fromISO(options[opt]).isValid) {\r\n this[opt] = DateTime.fromISO(options[opt]);\r\n } else if (DateTime.fromFormat(options[opt], format, { locale: DateTime.now().locale }).isValid) {\r\n this[opt] = DateTime.fromFormat(options[opt], format, { locale: DateTime.now().locale });\r\n } else {\r\n const invalid = DateTime.fromFormat(options[opt], format, { locale: DateTime.now().locale }).invalidExplanation;\r\n console.error(`Option '${opt}' is not a valid string: ${invalid}`);\r\n }\r\n }\r\n }\r\n\r\n if (this.isInputText) {\r\n //if startDate and/or endDate are not set, check if the input element contains initial values\r\n if (this.element.value != '') {\r\n const format = typeof this.locale.format === 'string' ? this.locale.format : DateTime.parseFormatForOpts(this.locale.format);\r\n if (this.singleDatePicker && typeof options.startDate === 'undefined') {\r\n const start = DateTime.fromFormat(this.element.value, format, { locale: DateTime.now().locale });\r\n if (start.isValid) {\r\n this.#startDate = start;\r\n } else {\r\n console.error(`Value \"${this.element.value}\" in <input> is not a valid string: ${start.invalidExplanation}`)\r\n }\r\n } else if (!this.singleDatePicker && typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') {\r\n const split = this.element.value.split(this.locale.separator);\r\n if (split.length === 2) {\r\n const start = DateTime.fromFormat(split[0], format, { locale: DateTime.now().locale });\r\n const end = DateTime.fromFormat(split[1], format, { locale: DateTime.now().locale });\r\n if (start.isValid && end.isValid) {\r\n this.#startDate = start;\r\n this.#endDate = end;\r\n } else {\r\n console.error(`Value in <input> is not a valid string: ${start.invalidExplanation} - ${end.invalidExplanation}`);\r\n }\r\n } else {\r\n console.error(`Value \"${this.element.value}\" in <input> is not a valid string`)\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.singleDatePicker) {\r\n // Needed to determine if a range is complete\r\n // If #endDate and #startDate exist, then click on date must be the startDate\r\n // At this point in time the range is not complete, this applies also for singleDatePicker\r\n this.#endDate = this.#startDate;\r\n } else if (this.#endDate < this.#startDate) {\r\n console.error(`Option 'endDate' ${this.#endDate} must not be earlier than 'startDate' ${this.#startDate}`);\r\n }\r\n if (!this.timePicker) {\r\n if (this.minDate) this.minDate = this.minDate.startOf('day');\r\n if (this.maxDate) this.maxDate = this.maxDate.endOf('day');\r\n this.#startDate = this.#startDate.startOf('day');\r\n this.#endDate = this.#endDate.endOf('day');\r\n }\r\n\r\n if (!this.#startDate && this.initalMonth) {\r\n // No initial date selected\r\n this.#endDate = null;\r\n if (this.timePicker)\r\n console.error(`Option 'initalMonth' works only with 'timePicker: false'`);\r\n } else {\r\n // Do some sanity checks on startDate and endDate for minDate, maxDate, minSpan, maxSpan, etc.\r\n // Otherwise you may initialize a calendar were nothing can be selected\r\n const violations = this.validateInput(null, false);\r\n if (violations != null) {\r\n let vio = violations.startDate;\r\n if (vio.length > 0) {\r\n if (vio.some(x => x.reason.startsWith('isInvalid'))) {\r\n console.error(`Value of startDate \"${this.#startDate}\" violates ${vio.find(x => x.reason.startsWith('isInvalid')).reason}`);\r\n } else {\r\n const newDate = vio.filter(x => x.new != null).at(-1).new;\r\n if (typeof process !== 'undefined' && process.env.JEST_WORKER_ID == null)\r\n console.warn(`Correcting startDate from ${this.#startDate} to ${newDate}`)\r\n this.#startDate = newDate;\r\n }\r\n }\r\n if (!this.singleDatePicker) {\r\n vio = violations.endDate.filter(x => x.new != null);\r\n if (vio.length > 0) {\r\n if (vio.some(x => x.reason.startsWith('isInvalid'))) {\r\n console.error(`Value of endDate \"${this.#endDate}\" violates ${vio.find(x => x.reason.startsWith('isInvalid')).reason}`);\r\n } else {\r\n const newDate = vio.filter(x => x.new != null).at(-1).new;\r\n if (typeof process !== 'undefined' && process.env.JEST_WORKER_ID == null)\r\n console.warn(`Correcting endDate from ${this.#endDate} to ${newDate}`)\r\n this.#endDate = newDate\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n if (this.singleDatePicker) {\r\n if (typeof options.altInput === 'string') {\r\n const el = document.querySelector(options.altInput);\r\n this.altInput = (el instanceof HTMLInputElement && el.type === 'text') ? el : null;\r\n } else if (options.altInput instanceof HTMLElement) {\r\n this.altInput = (options.altInput instanceof HTMLInputElement && options.altInput.type === 'text') ? options.altInput : null;\r\n }\r\n } else if (!this.singleDatePicker && Array.isArray(options.altInput) && options.altInput.length === 2) {\r\n this.altInput = [];\r\n for (let item of options.altInput) {\r\n const el = typeof item === 'string' ? document.querySelector(item) : item;\r\n if (el instanceof HTMLInputElement && el.type === 'text')\r\n this.altInput.push(el);\r\n }\r\n if (this.altInput.length !== 2)\r\n this.altInput = null;\r\n } else if (options.altInput != null) {\r\n console.warn(`Option 'altInput' ${JSON.stringify(options.altInput)} is not valid`);\r\n }\r\n if (options.altInput && ['function', 'string'].includes(typeof options.altFormat))\r\n this.altFormat = options.altFormat;\r\n // #endregion\r\n\r\n // #region - Localisation and Styling\r\n if (typeof options.opens === 'string') {\r\n if (['left', 'right', 'center'].includes(options.opens))\r\n this.opens = options.opens\r\n else\r\n console.error(`Option 'options.opens' must be 'left', 'right' or 'center'`);\r\n }\r\n\r\n if (typeof options.drops === 'string') {\r\n if (['up', 'down', 'auto'].includes(options.drops))\r\n this.drops = options.drops\r\n else\r\n console.error(`Option 'options.drops' must be 'up', 'down' or 'auto'`);\r\n }\r\n\r\n if (Array.isArray(options.buttonClasses)) {\r\n this.buttonClasses = options.buttonClasses.join(' ')\r\n } else if (typeof options.buttonClasses === 'string') {\r\n this.buttonClasses = options.buttonClasses;\r\n }\r\n\r\n if (typeof options.onOutsideClick === 'string') {\r\n if (['cancel', 'apply'].includes(options.onOutsideClick))\r\n this.onOutsideClick = options.onOutsideClick\r\n else\r\n console.error(`Option 'options.onOutsideClick' must be 'cancel' or 'apply'`);\r\n }\r\n\r\n // update day names order to firstDay\r\n if (this.locale.firstDay != 1) {\r\n let iterator = this.locale.firstDay;\r\n while (iterator > 1) {\r\n this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());\r\n iterator--;\r\n }\r\n }\r\n\r\n if (!this.singleDatePicker && typeof options.ranges === 'object') {\r\n // Process custom ranges\r\n for (let range in options.ranges) {\r\n let start, end;\r\n if (['string', 'object'].includes(typeof options.ranges[range][0])) {\r\n if (DateTime.isDateTime(options.ranges[range][0]) && options.ranges[range][0].isValid) {\r\n start = options.ranges[range][0];\r\n } else if (options.ranges[range][0] instanceof Date) {\r\n start = DateTime.fromJSDate(options.ranges[range][0]);\r\n } else if (typeof options.ranges[range][0] === 'string' && DateTime.fromISO(options.ranges[range][0]).isValid) {\r\n start = DateTime.fromISO(options.ranges[range][0]);\r\n } else {\r\n console.error(`Option ranges['${range}'] is not am array of valid ISO-8601 string or luxon.DateTime or Date`);\r\n }\r\n }\r\n if (['string', 'object'].includes(typeof options.ranges[range][1])) {\r\n if (DateTime.isDateTime(options.ranges[range][1]) && options.ranges[range][1].isValid) {\r\n end = options.ranges[range][1];\r\n } else if (options.ranges[range][1] instanceof Date) {\r\n end = DateTime.fromJSDate(options.ranges[range][1]);\r\n } else if (typeof options.ranges[range][1] === 'string' && DateTime.fromISO(options.ranges[range][1]).isValid) {\r\n end = DateTime.fromISO(options.ranges[range][1]);\r\n } else {\r\n console.error(`Option ranges['${range}'] is not a valid ISO-8601 string or luxon.DateTime or Date`);\r\n }\r\n }\r\n if (start == null || end == null)\r\n continue;\r\n\r\n //Support unicode chars in the range names.\r\n var elem = document.createElement('textarea');\r\n elem.innerHTML = range;\r\n this.ranges[elem.value] = [start, end];\r\n }\r\n var list = '<ul>';\r\n for (let range in this.ranges)\r\n list += `<li data-range-key=\"${range}\">${range}</li>`;\r\n if (this.showCustomRangeLabel)\r\n list += `<li data-range-key=\"${this.locale.customRangeLabel}\">${this.locale.customRangeLabel}</li>`;\r\n list += '</ul>';\r\n this.container.querySelector('.ranges').prepend(createElementFromHTML(list));\r\n this.container.classList.add('show-ranges');\r\n }\r\n\r\n if (typeof cb === 'function')\r\n this.callback = cb;\r\n\r\n if (!this.timePicker)\r\n this.container.querySelectorAll('.calendar-time').forEach(el => { el.style.display = 'none' });\r\n\r\n //can't be used together for now\r\n if (this.timePicker && this.autoApply)\r\n this.autoApply = false;\r\n\r\n if (this.autoApply)\r\n this.container.classList.add('auto-apply');\r\n\r\n if (this.singleDatePicker || this.singleMonthView) {\r\n this.container.classList.add('single');\r\n this.container.querySelector('.drp-calendar.left').classList.add('single');\r\n this.container.querySelector('.drp-calendar.left').style.display = '';\r\n this.container.querySelector('.drp-calendar.right').style.display = 'none';\r\n if (!this.timePicker && this.autoApply)\r\n this.container.classList.add('auto-apply');\r\n }\r\n\r\n if (this.singleDatePicker || !Object.keys(this.ranges).length || this.alwaysShowCalendars)\r\n this.container.classList.add('show-calendar');\r\n\r\n this.container.classList.add(`opens${this.opens}`);\r\n\r\n //apply CSS classes and labels to buttons\r\n this.container.querySelectorAll('.applyBtn, .cancelBtn').forEach(el => {\r\n el.classList.add(...this.buttonClasses.split(' '))\r\n });\r\n if (this.applyButtonClasses.length)\r\n this.container.querySelector('.applyBtn').classList.add(...this.applyButtonClasses.split(' '));\r\n if (this.cancelButtonClasses.length)\r\n this.container.querySelector('.cancelBtn').classList.add(...this.cancelButtonClasses.split(' '));\r\n this.container.querySelector('.applyBtn').innerHTML = this.locale.applyLabel;\r\n this.container.querySelector('.cancelBtn').innerHTML = this.locale.cancelLabel;\r\n // #endregion\r\n\r\n //addListener(element, eventName, selector, delegate)\r\n // #region Event Listeners\r\n this.addListener('.drp-calendar', 'click', '.prev', this.clickPrev.bind(this));\r\n this.addListener('.drp-calendar', 'click', '.next', this.clickNext.bind(this));\r\n this.addListener('.drp-calendar', 'mousedown', 'td.available', this.clickDate.bind(this));\r\n this.addListener('.drp-calendar', 'mouseenter', 'td.available', this.hoverDate.bind(this));\r\n this.addListener('.drp-calendar', 'change', 'select.yearselect,select.monthselect', this.monthOrYearChanged.bind(this));\r\n this.addListener('.drp-calendar', 'change', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', this.timeChanged.bind(this));\r\n\r\n this.addListener('.ranges', 'click', 'li', this.clickRange.bind(this));\r\n this.addListener('.ranges', 'mouseenter', 'li', this.hoverRange.bind(this));\r\n this.addListener('.ranges', 'mouseleave', 'li', this.leaveRange.bind(this));\r\n\r\n this.addListener('.drp-buttons', 'click', 'button.applyBtn', this.clickApply.bind(this));\r\n this.addListener('.drp-buttons', 'click', 'button.cancelBtn', this.clickCancel.bind(this));\r\n\r\n if (this.element.matches('input') || this.element.matches('button')) {\r\n this.element.addEventListener('click', this.#showProxy);\r\n this.element.addEventListener('focus', this.#showProxy);\r\n this.element.addEventListener('keyup', this.#elementChangedProxy);\r\n this.element.addEventListener('keydown', this.#keydownProxy); //IE 11 compatibility\r\n } else {\r\n this.element.addEventListener('click', this.#toggleProxy)\r\n this.element.addEventListener('keydown', this.#toggleProxy);\r\n }\r\n // #endregion\r\n\r\n // if attached to a text input, set the initial value\r\n this.updateElement();\r\n\r\n }\r\n /**\r\n * startDate\r\n * @type {external:DateTime}\r\n */\r\n get startDate() { return this.timePicker ? this.#startDate : this.#startDate.startOf('day'); }\r\n /**\r\n * endDate\r\n * @type {external:DateTime}\r\n */\r\n get endDate() { return this.singleDatePicker ? null : (this.timePicker ? this.#endDate : this.#endDate.endOf('day')); }\r\n set startDate(val) { this.#startDate = val }\r\n set endDate(val) { this.#endDate = val }\r\n\r\n /**\r\n * DateRangePicker specific events\r\n */\r\n #events = {\r\n /**\r\n * Emitted when the date is changed through `<input>` element or via {@link #DateRangePicker+setStartDate|setStartDate} or \r\n * {@link #DateRangePicker+setRange|setRange} and date is not valid due to \r\n * `minDate`, `maxDate`, `minSpan`, `maxSpan`, `invalidDate` and `invalidTime` constraints.<br>\r\n * Event is only triggered when date string is valid and date value is changing<br>\r\n * @event\r\n * @name \"violate\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n * @property {InputViolation} event.violation - The daterangepicker object\r\n * @property {NewDate} event.newDate - Object of corrected date values\r\n * @property {boolean} event.cancelable=true - By calling `event.preventDefault()` the `newDate` values will apply\r\n * @example\r\n * daterangepicker('#picker', {\r\n * startDate: DateTime.now(),\r\n * // allow only dates from current year\r\n * minDate: DateTime.now().startOf('year'),\r\n * manDate: DateTime.now().endOf('year'),\r\n * singleDatePicker: true,\r\n * locale: {\r\n * format: DateTime.DATETIME_SHORT\r\n * }\r\n * }).addEventListener('violate', (ev) => {\r\n * ev.newDate.startDate = DateTime.now().minus({ days: 3 }).startOf('day');\r\n * ev.preventDefault();\r\n * });\r\n *\r\n * // Try to set date outside permitted range at <input> elemet\r\n * const input = document.querySelector('#picker');\r\n * input.value = DateTime.now().minus({ years: 10 })).toLocaleString(DateTime.DATETIME_SHORT)\r\n * input.dispatchEvent(new Event('keyup'));\r\n \r\n * // Try to set date outside permitted range by code\r\n * const drp = getDateRangePicker('#picker');\r\n * drp.setStartDate(DateTime.now().minus({ years: 10 });\r\n * \r\n * // -> Calendar selects and shows \"today - 3 days\"\r\n */\r\n onViolate: { type: 'violate', param: (violation, newDate) => { return { ...violation, ...{ cancelable: true } } } },\r\n /**\r\n * Emitted before the calendar time picker is rendered.\r\n * @event\r\n * @name \"beforeRenderCalendar\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onBeforeRenderTimePicker: { type: 'beforeRenderTimePicker' },\r\n /**\r\n * Emitted before the calendar is rendered. Useful to remove any manually added elements.\r\n * @event\r\n * @name \"beforeRenderCalendar\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onBeforeRenderCalendar: { type: 'beforeRenderCalendar' },\r\n /**\r\n * Emitted when the picker is shown \r\n * @event\r\n * @name \"show\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onShow: { type: 'show' },\r\n /**\r\n * Emitted before the picker will hide.\r\n * @event\r\n * @name \"beforeHide\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n * @property {boolean} event.cancelable=true - Hide is canceled by calling `event.preventDefault()`\r\n */\r\n onBeforeHide: { type: 'beforeHide', param: { cancelable: true } },\r\n /**\r\n * Emitted when the picker is hidden\r\n * @event\r\n * @name \"hide\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onHide: { type: 'hide' },\r\n /**\r\n * Emitted when the calendar(s) are shown.\r\n * Only useful when {@link #Ranges|Ranges} are used.\r\n * @event\r\n * @name \"showCalendar\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onShowCalendar: { type: 'showCalendar' },\r\n /**\r\n * Emitted when the calendar(s) are hidden. Only used when {@link #Ranges|Ranges} are used.\r\n * @event\r\n * @name \"hideCalendar\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onHideCalendar: { type: 'hideCalendar' },\r\n /**\r\n * Emitted when user clicks outside the picker. Use option `onOutsideClick` to define the default action, then you may not need to handle this event.\r\n * @event\r\n * @name \"outsideClick\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onOutsideClick: { type: 'outsideClick' },\r\n /**\r\n * Emitted when the date changed. Does not trigger when time is changed, use {@link #event_timeChange|\"timeChange\"} to handle it\r\n * @event\r\n * @name \"dateChange\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n * @property {string} side - Either `'start'` or `'end'` indicating whether `startDate` or `endDate` was changed. `null` for singleDatePicker\r\n */\r\n onDateChange: { type: 'dateChange', param: (side) => { return side } },\r\n /**\r\n * Emitted when the time changed. Does not trigger when date is changed\r\n * @event\r\n * @name \"timeChange\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n * @property {string} side - Either `'start'` or `'end'` indicating whether `startDate` or `endDate` was changed. `null` for singleDatePicker\r\n */\r\n onTimeChange: { type: 'timeChange', param: (side) => { return side } },\r\n /**\r\n * Emitted when the `Apply` button is clicked, or when a predefined {@link #Ranges|Ranges} is clicked \r\n * @event\r\n * @name \"apply\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onApply: { type: 'apply' },\r\n /**\r\n * Emitted when the `Cancel` button is clicked\r\n * @event\r\n * @name \"cancel\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onCancel: { type: 'cancel' },\r\n /**\r\n * Emitted when the date is changed through `<input>` element. Event is only triggered when date string is valid and date value has changed\r\n * @event\r\n * @name \"inputChange\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n */\r\n onInputChange: { type: 'inputChange' },\r\n /**\r\n * Emitted after month view changed, for example by click on 'prev' or 'next'\r\n * @event\r\n * @name \"monthViewChange\"\r\n * @property {DateRangePickerEvent} event - The Event object\r\n * @property {DateRangePicker} event.picker - The daterangepicker object\r\n * @property {external:DateTime} left - The first day of month in left-hand calendar\r\n * @property {external:DateTime} right - The first day of month in left-hand calendar or `null` for singleDatePicker\r\n */\r\n onMonthViewChange: {\r\n type: 'monthViewChange',\r\n param: (left, right) => {\r\n return {\r\n left: this.leftCalendar.month.startOf('month'),\r\n right: (this.singleMonthView || this.singleDatePicker) ? null : this.rightCalendar.month.startOf('month')\r\n }\r\n }\r\n },\r\n }\r\n /**\r\n * Getter for all DateRangePickerEvents\r\n */\r\n get events() { return this.#events };\r\n\r\n #outsideClickProxy = this.outsideClick.bind(this);\r\n #onResizeProxy = this.move.bind(this);\r\n #dropdownClickWrapper = (e) => {\r\n const match = e.target.closest('[data-toggle=\"dropdown\"]');\r\n if (match && document.contains(match))\r\n this.#outsideClickProxy(e);\r\n };\r\n #showProxy = this.show.bind(this);\r\n #elementChangedProxy = this.elementChanged.bind(this);\r\n #keydownProxy = this.keydown.bind(this);\r\n #toggleProxy = this.toggle.bind(this);\r\n\r\n /* #region Set startDate/endDate */\r\n /**\r\n * Sets the date range picker's currently selected start date to the provided date.<br>\r\n * `startDate` must be a `luxon.DateTime` or `Date` or `string` according to {@link ISO-8601} or a string matching `locale.format`.<br>\r\n * Invalid date values are handled by {@link #DateRangePicker+violate|violate} Event\r\n * @param {external:DateTime|external:Date|string} startDate - startDate to be set. In case of ranges, the current `endDate` is used.\r\n * @param {boolean} updateView=true - If `true`, then calendar UI is updated to new value. Otherwise only internal values are set.\r\n * @returns {InputViolation} - Object of violations or `null` if no violation have been found\r\n * @example \r\n * const drp = getDateRangePicker('#picker');\r\n * drp.setStartDate(DateTime.now().startOf('hour'));\r\n */\r\n setStartDate(startDate, updateView = true) {\r\n if (!this.singleDatePicker)\r\n return setRange(startDate, this.#endDate, updateView);\r\n\r\n const oldDate = this.#startDate;\r\n let newDate = this.parseDate(startDate);\r\n if (newDate.equals(oldDate))\r\n return null;\r\n\r\n const violations = this.validateInput([newDate, null], true);\r\n if (violations != null) {\r\n if (violations.newDate != null) {\r\n newDate = violations.newDate.startDate\r\n } else {\r\n return violations;\r\n }\r\n }\r\n const monthChange = !this.#startDate.hasSame(newDate, 'month');\r\n this.#startDate = newDate;\r\n this.#endDate = this.#startDate;\r\n if (!this.timePicker) {\r\n this.#startDate = this.#startDate.startOf('day');\r\n this.#endDate = this.#endDate.endOf('day');\r\n }\r\n\r\n this.updateElement();\r\n if (updateView)\r\n this.updateView(monthChange);\r\n return violations;\r\n }\r\n\r\n /**\r\n * Sets the date range picker's currently selected start date to the provided date.<br>\r\n * `endDate` must be a `luxon.DateTime` or `Date` or `string` according to {@link ISO-8601} or a string matching `locale.format`.<br>\r\n * Invalid date values are handled by {@link #DateRangePicker+violate|violate} Event\r\n * @param {external:DateTime|external:Date|string} endDate - endDate to be set. In case of ranges, the current `startDate` is used.\r\n * @param {boolean} updateView=true - If `true`, then calendar UI is updated to new value. Otherwise only internal values are set.\r\n * @returns {InputViolation} - Object of violations or `null` if no violation have been found\r\n * @example \r\n * const drp = getDateRangePicker('#picker');\r\n * drp.setEndDate(DateTime.now().startOf('hour'));\r\n */\r\n setEndDate(endDate, updateView = true) {\r\n return this.singleDatePicker ? null : setRange(this.#startDate, endDate, updateView);\r\n }\r\n\r\n /**\r\n * Sets the date range picker's currently selected start date to the provided date.<br>\r\n * `startDate` and `endDate` must be a `luxon.DateTime` or `Date` or `string` according to {@link ISO-8601} or a string matching `locale.format`.<br>\r\n * Invalid date values are handled by {@link #DateRangePicker+violate|violate} Event\r\n * @param {external:DateTime|external:Date|string} startDate - startDate to be set\r\n * @param {external:DateTime|external:Date|string} endDate - endDate to be set\r\n * @param {boolean} updateView=true - If `true`, then calendar UI is updated to new value. Otherwise only internal values are set.\r\n * @returns {InputViolation} - Object of violations or `null` if no violation have been found\r\n * @example \r\n * const drp = getDateRangePicker('#picker');\r\n * drp.setRange(DateTime.now().startOf('hour'), DateTime.now().endOf('day'));\r\n */\r\n setRange(startDate, endDate, updateView = true) {\r\n if (this.singleDatePicker)\r\n return;\r\n if (!this.#endDate)\r\n this.#endDate = this.#startDate;\r\n\r\n const oldDate = [this.#startDate, this.#endDate];\r\n let newDate = [this.parseDate(startDate), this.parseDate(endDate)];\r\n\r\n if ((oldDate[0].equals(newDate[0]) && oldDate[1].equals(newDate[1]) || newDate[0] > newDate[1]))\r\n return;\r\n\r\n const violations = this.validateInput([newDate[0], newDate[1]], true);\r\n if (violations != null) {\r\n if (violations.newDate != null) {\r\n newDate[0] = violations.newDate.startDate\r\n newDate[1] = violations.newDate.endDate\r\n } else {\r\n return violations;\r\n }\r\n }\r\n const monthChange = !this.#startDate.hasSame(newDate[0], 'month') || !this.#endDate.hasSame(newDate[1], 'month');\r\n this.#startDate = newDate[0];\r\n this.#endDate = newDate[1];\r\n if (!this.timePicker) {\r\n this.#startDate = this.#startDate.startOf('day');\r\n this.#endDate = this.#endDate.endOf('day');\r\n }\r\n\r\n this.updateElement();\r\n if (updateView)\r\n this.updateView(monthChange);\r\n return violations;\r\n }\r\n\r\n /**\r\n * Parse date value\r\n * @param {sting|external:DateTime|Date} value - The value to be parsed\r\n * @returns {external:DateTime} - DateTime object\r\n */\r\n parseDate(value) {\r\n if (typeof value === 'object') {\r\n if (DateTime.isDateTime(value) && value.isValid) {\r\n return value;\r\n } else if (value instanceof Date) {\r\n return DateTime.fromJSDate(value);\r\n } else {\r\n throw RangeError(`Value must be a luxon.DateTime or Date or string`);\r\n }\r\n } else if (typeof value === 'string') {\r\n const format = typeof this.locale.format === 'string' ? this.locale.format : DateTime.parseFormatForOpts(this.locale.format);\r\n if (DateTime.fromISO(value).isValid) {\r\n return DateTime.fromISO(value);\r\n } else if (DateTime.fromFormat(value, format, { locale: DateTime.now().locale }).isValid) {\r\n return DateTime.fromFormat(value, format, { locale: DateTime.now().locale });\r\n } else {\r\n const invalid = DateTime.fromFormat(value, format, { locale: DateTime.now().locale }).invalidExplanation;\r\n throw RangeError(`Value is not a valid string: ${invalid}`);\r\n }\r\n }\r\n }\r\n\r\n /* #endregion */\r\n logDate(date) {\r\n return this.timePicker ? date.toISO({ suppressMilliseconds: true }) : date.toISODate();\r\n }\r\n\r\n /**\r\n * Format a DateTime object\r\n * @param {external:DateTime} date - The DateTime to format\r\n * @param {object|string} format=this.locale.format - The format option\r\n * @returns {string} - Formatted date string\r\n */\r\n formatDate(date, format = this.locale.format) {\r\n if (typeof format === 'object') {\r\n return date.toLocaleString(format);\r\n } else {\r\n if (Settings.defaultLocale === null) {\r\n // Limitation/bug, see https://github.com/moment/luxon/issues/1366\r\n const locale = DateTime.now().locale;\r\n return date.toFormat(format, { locale: locale });\r\n } else {\r\n return date.toFormat(format);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set Duration Label to selected range (if used) and selected dates\r\n * @private \r\n */\r\n updateLabel() {\r\n\r\n if (this.showLabel) {\r\n let text = this.formatDate(this.#startDate);\r\n if (!this.singleDatePicker) {\r\n text += this.locale.separator;\r\n if (this.#endDate)\r\n text += this.formatDate(this.#endDate);\r\n }\r\n this.container.querySelector('.drp-selected').innerHTML = text;\r\n }\r\n\r\n if (this.singleDatePicker || this.locale.durationFormat == null)\r\n return;\r\n if (!this.#endDate) {\r\n this.container.querySelector('.drp-duration-label').innerHTML = '';\r\n return;\r\n }\r\n\r\n if (typeof this.locale.durationFormat === 'function') {\r\n this.container.querySelector('.drp-duration-label').innerHTML = this.locale.durationFormat(this.#startDate, this.#endDate);\r\n } else {\r\n let duration = this.#endDate.plus({ milliseconds: 1 }).diff(this.#startDate).rescale().set({ milliseconds: 0 });\r\n if (!this.timePicker)\r\n duration = duration.set({ seconds: 0, minutes: 0, hours: 0 });\r\n duration = duration.removeZeros();\r\n\r\n if (typeof this.locale.durationFormat === 'object') {\r\n this.container.querySelector('.drp-duration-label').innerHTML = duration.toHuman(this.locale.durationFormat);\r\n } else {\r\n this.container.querySelector('.drp-duration-label').innerHTML = duration.toFormat(this.locale.durationFormat);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @typedef InputViolation\r\n * @type {Object}\r\n * @typedef {object} Violation\r\n * @property {string} reason - The type/reason of violation\r\n * @property {external:DateTime} old - Old value startDate/endDate\r\n * @property {external:DateTime} new? - Corrected value of startDate/endDate if existing\r\n * @typedef {object} NewDate\r\n * @property {external:DateTime} newDate.startDate- Object with corrected values\r\n * @property {external:DateTime} newDate.endDate - Object with corrected values\r\n * @property {Violation[]} startDate - The constraints which violates the input\r\n * @property {Violation[]?} endDate - The constraints which violates the input or `null` for singleDatePicker\r\n * @property {NewDate} newDate - Object with corrected values\r\n */\r\n /**\r\n * Validate `startDate` and `endDate` against `timePickerStepSize`, `minDate`, `maxDate`, \r\n * `minSpan`, `maxSpan`, `invalidDate` and `invalidTime`.\r\n * @param {Array} range - `[startDate, endDate]`<br>Range to be checked, defaults to current `startDate` and `endDate`\r\n * @param {boolean} dipatch=false - If `true` then event \"violate\" is dispated.<br>\r\n * If eventHandler returns `true`, then `null` is returned, otherwiese the object of violations.\r\n * @emits \"violate\"\r\n * @returns {InputViolation|null} - Object of violations and corrected values or `null` if no violation have been found\r\n * @example \r\n * options => {\r\n * minDate: DateTime.now().minus({months: 3}).startOf('day'),\r\n * maxDate: DateTime.now().minus({day: 3}).startOf('day'),\r\n * minSpan: Duration.fromObject({days: 7}),\r\n * maxSpan: Duration.fromObject({days: 70}),\r\n * timePickerStepSize: Duration.fromObject({hours: 1})\r\n * }\r\n * const result = validateInput(DateTime.now(), DateTime.now().plus({day: 3}));\r\n * \r\n * result => {\r\n * startDate: [\r\n * { old: \"2026-03-13T10:35:52\", reason: \"timePickerStepSize\", new: \"2026-03-13T11:00:00\" },\r\n * { old: \"2026-03-13T11:00:00\", reason: \"maxDate\", new: \"2026-03-10T00:00:00\" }\r\n * ],\r\n * endDate: {\r\n * { old: \"2026-03-16T10:35:52\", reason: \"stepSize\", new: \"2026-03-16T11:00:00\" },\r\n * { old: \"2026-03-16T11:00:00\", reason: \"maxDate\", new: \"2026-03-10T00:00:00\" },\r\n * { old: \"2026-03-10T00:00:00\", reason: \"minSpan\", new: \"2026-03-17T00:00:00\" }\r\n * ],\r\n * newDate: { \r\n * startDate: \"2026-03-10T00:00:00\", \r\n * endDate: \"2026-03-17T00:00:00\"\r\n * }\r\n * }\r\n */\r\n validateInput(range, dipatch = false) {\r\n let startDate = range == null ? this.#startDate : range[0];\r\n let endDate = range == null ? this.#endDate : range[1];\r\n if (startDate == null)\r\n return null;\r\n\r\n let result = { startDate: [] };\r\n\r\n let violation = { old: startDate, reason: this.timePicker ? 'timePickerStepSize' : 'timePicker' };\r\n if (this.timePicker) {\r\n // Round time to step size\r\n const secs = this.timePickerStepSize.as('seconds');\r\n startDate = DateTime.fromSeconds(secs * Math.round(startDate.toSeconds() / secs));\r\n violation.new = startDate;\r\n if (!violation.new.equals(violation.old))\r\n result.startDate.push(violation);\r\n } else {\r\n startDate = startDate.startOf('day');\r\n }\r\n\r\n const shiftStep = this.timePicker ? this.timePickerStepSize.as('seconds') : Duration.fromObject({ days: 1 }).as('seconds');\r\n\r\n if (this.minDate && startDate < this.minDate) {\r\n // If the startDate is earlier than minDate option, shift the startDate to allowable date\r\n violation = { old: startDate, reason: 'minDate' };\r\n startDate = startDate.plus({ seconds: Math.trunc(this.minDate.diff(startDate).as('seconds') / shiftStep) * shiftStep });\r\n if (startDate < this.minDate)\r\n startDate = startDate.plus(this.timePicker ? this.timePickerStepSize : { days: 1 });\r\n violation.new = startDate;\r\n if (!violation.new.equals(violation.old))\r\n result.startDate.push(violation);\r\n } else if (this.maxDate && startDate > this.maxDate) {\r\n // If the startDate is later than maxDate option, shift the startDate to allowable date\r\n violation = { old: startDate, reason: 'maxDate' };\r\n startDate = startDate.minus({ seconds: Math.trunc(startDate.diff(this.maxDate).as('seconds') / shiftStep) * shiftStep });\r\n if (startDate > this.maxDate)\r\n startDate = startDate.minus(this.timePicker ? this.timePickerStepSize : { days: 1 });\r\n violation.new = startDate;\r\n if (!violation.new.equals(violation.old))\r\n result.startDate.push(violation);\r\n }\r\n\r\n let units = ['hour'];\r\n if (this.timePicker) {\r\n if (this.timePickerOpts.showMinutes)\r\n units.push('minute');\r\n if (this.timePickerOpts.showSeconds)\r\n units.push('second');\r\n if (!this.timePicker24Hour)\r\n units.push('ampm');\r\n }\r\n\r\n if (this.isInvalidDate(startDate))\r\n result.startDate.push({ old: startDate, reason: 'isInvalidDate' });\r\n if (this.timePicker) {\r\n for (let unit of units) {\r\n if (this.isInvalidTime(startDate, unit, 'start'))\r\n result.startDate.push({ old: startDate, reason: 'isInvalidTime', unit: unit });\r\n }\r\n }\r\n\r\n if (this.singleDatePicker) {\r\n if (result.startDate.length == 0)\r\n return null;\r\n if (dipatch) {\r\n let newValues = { startDate: startDate };\r\n const event = this.triggerEvent(this.#events.onViolate, { violation: result, newDate: newValues });\r\n if (event.defaultPrevented) {\r\n result.newDate = event.newDate;\r\n return result;\r\n }\r\n return result;\r\n } else {\r\n return result;\r\n }\r\n }\r\n\r\n if (endDate == null)\r\n return null;\r\n result.endDate = [];\r\n\r\n violation = { old: endDate, reason: this.timePicker ? 'stepSize' : 'timePicker' };\r\n if (this.timePicker) {\r\n // Round time to step size\r\n const secs = this.timePickerStepSize.as('seconds');\r\n endDate = DateTime.fromSeconds(secs * Math.round(endDate.toSeconds() / secs));\r\n violation.new = endDate;\r\n if (!violation.new.equals(violation.old))\r\n result.endDate.push(violation);\r\n } else {\r\n endDate = endDate.endOf('day');\r\n }\r\n\r\n if (this.maxDate && endDate > this.maxDate) {\r\n // If the endDate is later than maxDate option, shorten the range to the allowable period.\r\n violation = { old: endDate, reason: 'maxDate' };\r\n endDate = endDate.minus({ seconds: Math.trunc(endDate.diff(this.maxDate).as('seconds') / shiftStep) * shiftStep });\r\n if (endDate > this.maxDate)\r\n endDate = endDate.minus(this.timePicker ? this.timePickerStepSize : { days: 1 });\r\n violation.new = endDate;\r\n if (!violation.new.equals(violation.old))\r\n result.endDate.push(violation);\r\n } else if (this.minDate && endDate < this.minDate) {\r\n // If the endDate is earlier than minDate option, shorten the range to the allowable period.\r\n violation = { old: endDate, reason: 'minDate' };\r\n endDate = endDate.plus({ seconds: Math.trunc(this.minDate.diff(endDate).as('seconds') / shiftStep) * shiftStep });\r\n if (endDate < this.minDate)\r\n endDate = endDate.plus(this.timePicker ? this.timePickerStepSize : { days: 1 });\r\n violation.new = endDate;\r\n if (!violation.new.equals(violation.old))\r\n result.endDate.push(violation);\r\n }\r\n\r\n if (this.maxSpan) {\r\n // If the endDate exceeds those allowed by the maxSpan option, shorten the range to the allowable period.\r\n const maxDate = startDate.plus(this.maxSpan);\r\n if (endDate > maxDate) {\r\n violation = { old: endDate, reason: 'maxSpan' };\r\n endDate = endDate.minus({ seconds: Math.trunc(maxDate.diff(endDate).as('seconds') / shiftStep) * shiftStep });\r\n if (endDate > maxDate)\r\n endDate = endDate.minus(this.timePicker ? this.timePickerStepSize : { days: 1 });\r\n violation.new = endDate;\r\n if (!violation.new.equals(violation.old))\r\n result.endDate.push(violation);\r\n }\r\n }\r\n\r\n if (this.minSpan) {\r\n // If the endDate falls below those allowed by the minSpan option, expand the range to the allowable period.\r\n const minDate = startDate.plus(this.defaultSpan ?? this.minSpan);\r\n if (endDate < minDate) {\r\n violation = { old: endDate, reason: 'minSpan' };\r\n endDate = endDate.plus({ seconds: Math.trunc(minDate.diff(endDate).as('seconds') / shiftStep) * shiftStep });\r\n if (endDate < minDate)\r\n endDate = endDate.plus(this.timePicker ? this.timePickerStepSize : { days: 1 });\r\n violation.new = endDate;\r\n if (!violation.new.equals(violation.old))\r\n result.endDate.push(violation);\r\n }\r\n }\r\n\r\n if (this.isInvalidDate(endDate))\r\n result.endDate.push({ old: endDate, reason: 'isInvalidDate' });\r\n if (this.timePicker) {\r\n for (let unit of units) {\r\n if (this.isInvalidTime(endDate, unit, 'end'))\r\n result.endDate.push({ old: endDate, reason: 'isInvalidTime', unit: unit });\r\n }\r\n }\r\n\r\n if (result.startDate.length == 0 && result.endDate.length == 0)\r\n return null;\r\n if (dipatch) {\r\n let newValues = { startDate: startDate, endDate: endDate };\r\n const event = this.triggerEvent(this.#events.onViolate, { violation: result, newDate: newValues });\r\n if (event.defaultPrevented) {\r\n result.newDate = event.newDate;\r\n return result;\r\n }\r\n return result;\r\n } else {\r\n return result;\r\n }\r\n }\r\n\r\n\r\n /* #region Rendering */\r\n\r\n /**\r\n * Updates the picker when calendar is initiated or any date has been selected. \r\n * Could be useful after running {@link #DateRangePicker+setStartDate|setStartDate} or {@link #DateRangePicker+setEndDate|setRange} \r\n * @param {boolean} monthChange - If `true` then monthView changed\r\n * @emits \"beforeRenderTimePicker\"\r\n */\r\n updateView(monthChange) {\r\n if (this.timePicker) {\r\n this.triggerEvent(this.#events.onBeforeRenderTimePicker);\r\n this.renderTimePicker('start');\r\n this.renderTimePicker('end');\r\n this.container.querySelector('.calendar-time.end-time select').disabled = !this.#endDate;\r\n this.container.querySelector('.calendar-time.end-time select').classList.toggle('disabled', !this.#endDate);\r\n }\r\n this.updateLabel();\r\n this.updateMonthsInView();\r\n this.updateCalendars(monthChange);\r\n this.setApplyBtnState();\r\n\r\n }\r\n\r\n /**\r\n * Shows calendar months based on selected date values\r\n * @private\r\n */\r\n updateMonthsInView() {\r\n if (this.#endDate) {\r\n //if both dates are visible already, do nothing\r\n if (!this.singleDatePicker\r\n && this.leftCalendar.month && this.rightCalendar.month\r\n && (this.#startDate.hasSame(this.leftCalendar.month, 'month') || this.#startDate.hasSame(this.rightCalendar.month, 'month'))\r\n && (this.#endDate.hasSame(this.leftCalendar.month, 'month') || this.#endDate.hasSame(this.rightCalendar.month, 'month'))\r\n )\r\n return;\r\n\r\n this.leftCalendar.month = this.#startDate.startOf('month');\r\n if (!this.singleMonthView) {\r\n if (!this.linkedCalendars && !this.#endDate.hasSame(this.#startDate, 'month')) {\r\n this.rightCalendar.month = this.#endDate.startOf('month');\r\n } else {\r\n this.rightCalendar.month = this.#startDate.startOf('month').plus({ month: 1 });\r\n }\r\n }\r\n } else {\r\n if (!this.#startDate && this.initalMonth) {\r\n // Inital view without date\r\n this.leftCalendar.month = this.initalMonth;\r\n if (!this.singleMonthView)\r\n this.rightCalendar.month = this.initalMonth.plus({ month: 1 });\r\n } else {\r\n if (!this.leftCalendar.month.hasSame(this.#startDate, 'month') && !this.rightCalendar.month.hasSame(this.#startDate, 'month')) {\r\n this.leftCalendar.month = this.#startDate.startOf('month');\r\n this.rightCalendar.month = this.#startDate.startOf('month').plus({ month: 1 });\r\n }\r\n }\r\n }\r\n\r\n if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && !this.singleMonthView && this.rightCalendar.month > this.maxDate) {\r\n this.rightCalendar.month = this.maxDate.startOf('month');\r\n this.leftCalendar.month = this.maxDate.startOf('month').minus({ month: 1 });\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Updates the selected day value from calendar with selected time values\r\n * @emits \"beforeRenderCalendar\"\r\n * @emits \"monthViewChange\"\r\n * @param {boolean} monthChange - If `true` then monthView changed\r\n * @private\r\n */\r\n updateCalendars(monthChange) {\r\n\r\n if (this.timePicker) {\r\n var hour, minute, second;\r\n\r\n if (this.#endDate) {\r\n hour = parseInt(this.container.querySelector('.start-time .hourselect').value, 10);\r\n if (isNaN(hour))\r\n hour = parseInt(this.container.querySelector('.start-time .hourselect option:last-child').value, 10);\r\n\r\n minute = 0;\r\n if (this.timePickerOpts.showMinutes) {\r\n minute = parseInt(this.container.querySelector('.start-time .minuteselect').value, 10);\r\n if (isNaN(minute))\r\n minute = parseInt(this.container.querySelector('.start-time .minuteselect option:last-child').value, 10);\r\n }\r\n\r\n second = 0;\r\n if (this.timePickerOpts.showSeconds) {\r\n second = parseInt(this.container.querySelector('.start-time .secondselect').value, 10);\r\n if (isNaN(second))\r\n second = parseInt(this.container.querySelector('.start-time .secondselect option:last-child').value, 10);\r\n }\r\n } else {\r\n hour = parseInt(this.container.querySelector('.end-time .hourselect').value, 10);\r\n if (isNaN(hour))\r\n hour = parseInt(this.container.querySelector('.end-time .hourselect option:last-child').value, 10);\r\n\r\n minute = 0;\r\n if (this.timePickerOpts.showMinutes) {\r\n minute = parseInt(this.container.querySelector('.end-time .minuteselect').value, 10);\r\n if (isNaN(minute))\r\n minute = parseInt(this.container.querySelector('.end-time .minuteselect option:last-child').value, 10);\r\n }\r\n\r\n second = 0;\r\n if (this.timePickerOpts.showSeconds) {\r\n second = parseInt(this.container.querySelector('.end-time .secondselect').value, 10);\r\n if (isNaN(second))\r\n second = parseInt(this.container.querySelector('.end-time .secondselect option:last-child').value, 10);\r\n }\r\n }\r\n this.leftCalendar.month = this.leftCalendar.month.set({ hour: hour, minute: minute, second: second });\r\n if (!this.singleMonthView)\r\n this.rightCalendar.month = this.rightCalendar.month.set({ hour: hour, minute: minute, second: second });\r\n } else {\r\n this.leftCalendar.month = this.leftCalendar.month.set({ hour: 0, minute: 0, second: 0 });\r\n if (!this.singleMonthView)\r\n this.rightCalendar.month = this.rightCalendar.month.set({ hour: 0, minute: 0, second: 0 });\r\n }\r\n\r\n this.triggerEvent(this.#events.onBeforeRenderCalendar);\r\n this.renderCalendar('left');\r\n //if (!this.singleMonthView)\r\n this.renderCalendar('right');\r\n\r\n if (monthChange)\r\n this.triggerEvent(this.#events.onMonthViewChange);\r\n\r\n\r\n //highlight any predefined range matching the current start and end dates\r\n this.container.querySelectorAll('.ranges li').forEach(el => { el.classList.remove('active') });\r\n if (this.#endDate == null) return;\r\n\r\n this.calculateChosenLabel();\r\n\r\n }\r\n\r\n /**\r\n * Renders the calendar month\r\n * @private\r\n */\r\n renderCalendar(side) {\r\n if (side === 'right' && this.singleMonthView)\r\n return;\r\n\r\n //\r\n // Build the matrix of dates that will populate the calendar\r\n //\r\n var calendar = side === 'left' ? this.leftCalendar : this.rightCalendar;\r\n if (calendar.month == null && !this.#startDate && this.initalMonth)\r\n calendar.month = this.initalMonth.startOf('month');\r\n\r\n const firstDay = calendar.month.startOf('month');\r\n const lastDay = calendar.month.endOf('month').startOf('day');\r\n var theDate = calendar.month.startOf('month').minus({ day: 1 });\r\n const time = { hour: calendar.month.hour, minute: calendar.month.minute, second: calendar.month.second };\r\n\r\n //initialize a 6 rows x 7 columns array for the calendar\r\n var calendar = [];\r\n calendar.firstDay = firstDay;\r\n calendar.lastDay = lastDay;\r\n\r\n for (var i = 0; i < 6; i++)\r\n calendar[i] = [];\r\n\r\n // compute the startDay in month\r\n while (theDate.weekday != this.locale.firstDay)\r\n theDate = theDate.minus({ day: 1 });\r\n\r\n for (let col = 0, row = -1; col < 42; col++, theDate = theDate.plus({ day: 1 })) {\r\n if (col % 7 === 0)\r\n row++;\r\n calendar[row][col % 7] = theDate.set(time);\r\n }\r\n\r\n //make the calendar object available to hoverDate/clickDate\r\n if (side === 'left') {\r\n this.leftCalendar.calendar = calendar;\r\n } else {\r\n this.rightCalendar.calendar = calendar;\r\n }\r\n\r\n //\r\n // Display the calendar\r\n //\r\n\r\n var minDate = side === 'left' ? this.minDate : this.#startDate;\r\n var maxDate = this.maxDate;\r\n //var selected = side === 'left' ? this.#startDate : this.#endDate;\r\n //var arrow = this.locale.direction === 'ltr' ? { left: 'chevron-left', right: 'chevron-right' } : { left: 'chevron-right', right: 'chevron-left' };\r\n\r\n var html = '<tr>';\r\n // add empty cell for week number\r\n if (this.showWeekNumbers || this.showISOWeekNumbers)\r\n html += '<th></th>';\r\n\r\n if ((!minDate || minDate < calendar.firstDay) && (!this.linkedCalendars || side === 'left')) {\r\n html += '<th class=\"prev available\"><span></span></th>';\r\n } else {\r\n html += '<th></th>';\r\n }\r\n\r\n var dateHtml = `${this.locale.monthNames[calendar.firstDay.month - 1]} ${calendar.firstDay.year}`;\r\n\r\n if (this.showDropdowns) {\r\n const maxYear = (maxDate && maxDate.year) ?? this.maxYear;\r\n const minYear = (minDate && minDate.year) ?? this.minYear;\r\n\r\n let div = this.externalStyle === 'bulma' ? '<div class=\"select is-small mr-1\">' : '';\r\n var monthHtml = `${div}<select class=\"monthselect\">`;\r\n for (var m = 1; m <= 12; m++) {\r\n monthHtml += `<option value=\"${m}\"${m === calendar.firstDay.month ? ' selected' : ''}`;\r\n if ((minDate && calendar.firstDay.set({ month: m }) < minDate.startOf('month')) || (maxDate && calendar.firstDay.set({ month: m }) > maxDate.endOf('month')))\r\n monthHtml += ` disabled`;\r\n monthHtml += `>${this.locale.monthNames[m - 1]}</option>`;\r\n }\r\n monthHtml += \"</select>\";\r\n if (this.externalStyle === 'bulma')\r\n monthHtml += \"</div>\";\r\n\r\n div = this.externalStyle === 'bulma' ? '<div class=\"select is-small ml-1\">' : '';\r\n var yearHtml = `${div}<select class=\"yearselect\">`;\r\n for (var y = minYear; y <= maxYear; y++)\r\n yearHtml += `<option value=\"${y}\"${y === calendar.firstDay.year ? ' selected' : ''}>${y}</option>`;\r\n yearHtml += '</select>';\r\n if (this.externalStyle === 'bulma')\r\n yearHtml += \"</div>\";\r\n\r\n dateHtml = monthHtml + yearHtml;\r\n }\r\n\r\n html += '<th colspan=\"5\" class=\"month\">' + dateHtml + '</th>';\r\n if ((!maxDate || maxDate > calendar.lastDay.endOf('day')) && (!this.linkedCalendars || side === 'right' || this.singleDatePicker || this.singleMonthView)) {\r\n html += '<th class=\"next available\"><span></span></th>';\r\n } else {\r\n html += '<th></th>';\r\n }\r\n html += '</tr>';\r\n\r\n // weekday header\r\n html += '<tr>';\r\n // add week number label\r\n if (this.showWeekNumbers || this.showISOWeekNumbers)\r\n html += `<th class=\"week\">${this.locale.weekLabel}</th>`;\r\n\r\n for (let [index, dayOfWeek] of this.locale.daysOfWeek.entries()) {\r\n html += '<th';\r\n if (this.weekendDayClasses && this.weekendDayClasses.length && Info.getWeekendWeekdays().includes(index + 1))\r\n //highlight weekend day\r\n html += ` class=\"${this.weekendDayClasses}\"`;\r\n html += `>${dayOfWeek}</th>`;\r\n };\r\n\r\n html += '</tr>';\r\n this.container.querySelector(`.drp-calendar.${side} .calendar-table thead`).innerHTML = html;\r\n\r\n // table body\r\n html = '';\r\n //adjust maxDate to reflect the maxSpan setting in order to\r\n //grey out end dates beyond the maxSpan\r\n if (this.#endDate == null && this.maxSpan) {\r\n var maxLimit = this.#startDate.plus(this.maxSpan).endOf('day');\r\n if (!maxDate || maxLimit < maxDate) {\r\n maxDate = maxLimit;\r\n }\r\n }\r\n\r\n var minLimit;\r\n //grey out end dates shorter than minSpan\r\n if (this.#endDate == null && this.minSpan)\r\n minLimit = this.#startDate.plus(this.minSpan).startOf('day');\r\n\r\n for (let row = 0; row < 6; row++) {\r\n html += '<tr>';\r\n\r\n // add week number\r\n if (this.showISOWeekNumbers)\r\n html += `<td class=\"week\">${calendar[row][0].weekNumber}</td>`;\r\n else if (this.showWeekNumbers)\r\n html += `<td class=\"week\">${calendar[row][0].localWeekNumber}</td>`;\r\n\r\n for (let col = 0; col < 7; col++) {\r\n var classes = [];\r\n\r\n //highlight today's date\r\n if (this.todayClasses && this.todayClasses.length && calendar[row][col].hasSame(DateTime.now(), 'day'))\r\n classes.push(this.todayClasses);\r\n\r\n //highlight weekends\r\n if (this.weekendClasses && this.weekendClasses.length && Info.getWeekendWeekdays().includes(calendar[row][col].weekday))\r\n classes.push(this.weekendClasses);\r\n\r\n //grey out the dates in other months displayed at beginning and end of this calendar\r\n if (calendar[row][col].month != calendar[1][1].month)\r\n classes.push('off', 'ends');\r\n\r\n //don't allow selection of dates before the minimum date\r\n if (this.minDate && calendar[row][col].startOf('day') < this.minDate.startOf('day'))\r\n classes.push('off', 'disabled');\r\n\r\n //don't allow selection of dates after the maximum date\r\n if (maxDate && calendar[row][col].startOf('day') > maxDate.startOf('day'))\r\n classes.push('off', 'disabled');\r\n\r\n //don't allow selection of dates before the minimun span\r\n if (minLimit && calendar[row][col].startOf('day') > this.#startDate.startOf('day') && calendar[row][col].startOf('day') < minLimit.startOf('day'))\r\n classes.push('off', 'disabled');\r\n\r\n //don't allow selection of date if a custom function decides it's invalid\r\n if (this.isInvalidDate(calendar[row][col]))\r\n classes.push('off', 'disabled');\r\n\r\n //highlight the currently selected start date\r\n if (this.#startDate != null && calendar[row][col].hasSame(this.#startDate, 'day'))\r\n classes.push('active', 'start-date');\r\n\r\n //highlight the currently selected end date\r\n if (this.#endDate != null && calendar[row][col].hasSame(this.#endDate, 'day'))\r\n classes.push('active', 'end-date');\r\n\r\n //highlight dates in-between the selected dates\r\n if (this.#endDate != null && calendar[row][col] > this.#startDate && calendar[row][col] < this.#endDate)\r\n classes.push('in-range');\r\n\r\n //apply custom classes for this date\r\n var isCustom = this.isCustomDate(calendar[row][col]);\r\n if (isCustom !== false)\r\n typeof isCustom === 'string' ? classes.push(isCustom) : classes.push(...isCustom);\r\n\r\n if (!classes.includes('disabled'))\r\n classes.push('available');\r\n\r\n html += `<td class=\"${classes.join(' ')}\" data-title=\"r${row}c${col}\">${calendar[row][col].day}</td>`;\r\n\r\n }\r\n html += '</tr>';\r\n }\r\n\r\n this.container.querySelector(`.drp-calendar.${side} .calendar-table tbody`).innerHTML = html;\r\n\r\n }\r\n\r\n /**\r\n * Emitted before the TimePicker is rendered.\r\n * Useful to remove any manually added elements.\r\n * @event\r\n * @name \"beforeRenderTimePicker\"\r\n * @param {DateRangePicker} this - The daterangepicker object\r\n */\r\n\r\n /**\r\n * Renders the time pickers\r\n * @private\r\n * @emits \"beforeRenderTimePicker\"\r\n */\r\n renderTimePicker(side) {\r\n\r\n // Don't bother updating the time picker if it's currently disabled\r\n // because an end date hasn't been clicked yet\r\n if (side === 'end' && !this.#endDate) return;\r\n\r\n var selected, minLimit, minDate, maxDate = this.maxDate;\r\n let html = '';\r\n if (this.showWeekNumbers || this.showISOWeekNumbers)\r\n html += '<th></th>';\r\n\r\n if (this.maxSpan && (!this.maxDate || this.#startDate.plus(this.maxSpan) < this.maxDate))\r\n maxDate = this.#startDate.plus(this.maxSpan);\r\n\r\n if (this.minSpan && side === 'end')\r\n minLimit = this.#startDate.plus(this.defaultSpan ?? this.minSpan);\r\n\r\n if (side === 'start') {\r\n selected = this.#startDate;\r\n minDate = this.minDate;\r\n } else if (side === 'end') {\r\n selected = this.#endDate;\r\n minDate = this.#startDate;\r\n\r\n //Preserve the time already selected\r\n let timeSelector = this.container.querySelector('.drp-calendar .calendar-time.end-time');\r\n if (timeSelector.innerHTML != '') {\r\n selected = selected.set({\r\n hour: !isNaN(selected.hour) ? selected.hour : timeSelector.querySelector('.hourselect option:selected').value,\r\n minute: !isNaN(selected.minute) ? selected.minute : timeSelector.querySelector('.minuteselect option:selected').value,\r\n second: !isNaN(selected.second) ? selected.second : timeSelector.querySelector('.secondselect option:selected').value\r\n });\r\n }\r\n\r\n if (selected < this.#startDate)\r\n selected = this.#startDate;\r\n\r\n if (maxDate && selected > maxDate)\r\n selected = maxDate;\r\n }\r\n\r\n html += `<th colspan=\"7\">`;\r\n //\r\n // hours\r\n //\r\n if (this.externalStyle === 'bulma')\r\n html += '<div class=\"select is-small mx-1\">';\r\n html += '<select class=\"hourselect\">';\r\n const ampm = selected.toFormat('a', { locale: 'en-US' });\r\n let start = 0;\r\n if (!this.timePicker24Hour)\r\n start = ampm === 'AM' ? 1 : 13;\r\n\r\n for (var i = start; i <= start + 23; i += this.timePickerOpts.hourStep) {\r\n let time = selected.set({ hour: i % 24 });\r\n let disabled = false;\r\n if (minDate && time.set({ minute: 59 }) < minDate)\r\n disabled = true;\r\n if (maxDate && time.set({ minute: 0 }) > maxDate)\r\n disabled = true;\r\n if (minLimit && time.endOf('hour') < minLimit)\r\n disabled = true;\r\n if (!disabled && this.isInvalidTime(time, this.singleDatePicker ? null : side, 'hour'))\r\n disabled = true;\r\n\r\n if (this.timePicker24Hour) {\r\n if (!disabled && i == selected.hour) {\r\n html += `<option value=\"${i}\" selected>${i}</option>`;\r\n } else if (disabled) {\r\n html += `<option value=\"${i}\" disabled class=\"disabled\">${i}</option>`;\r\n } else {\r\n html += `<option value=\"${i}\">${i}</option>`;\r\n }\r\n } else {\r\n const i_12 = DateTime.fromFormat(`${i % 24}`, 'H').toFormat('h');\r\n const i_ampm = DateTime.fromFormat(`${i % 24}`, 'H').toFormat('a', { locale: 'en-US' });\r\n if (ampm == i_ampm) {\r\n if (!disabled && i == selected.hour) {\r\n html += `<option ampm=\"${i_ampm}\" value=\"${i % 24}\" selected>${i_12}</option>`;\r\n } else if (disabled) {\r\n html += `<option ampm=\"${i_ampm}\" value=\"${i % 24}\" disabled class=\"disabled\">${i_12}</option>`;\r\n } else {\r\n html += `<option ampm=\"${i_ampm}\" value=\"${i % 24}\">${i_12}</option>`;\r\n }\r\n } else {\r\n html += `<option ampm=\"${i_ampm}\" hidden=\"hidden\" value=\"${i % 24}\">${i_12}</option>`;\r\n }\r\n }\r\n }\r\n html += '</select>';\r\n if (this.externalStyle === 'bulma')\r\n html += '</div>';\r\n\r\n //\r\n // minutes\r\n //\r\n\r\n if (this.timePickerOpts.showMinutes) {\r\n html += ' : ';\r\n if (this.externalStyle === 'bulma')\r\n html += '<div class=\"select is-small mx-1\">';\r\n html += '<select class=\"minuteselect\">';\r\n\r\n for (var i = 0; i < 60; i += this.timePickerOpts.minuteStep) {\r\n var padded = i < 10 ? '0' + i : i;\r\n let time = selected.set({ minute: i });\r\n\r\n let disabled = false;\r\n if (minDate && time.set({ second: 59 }) < minDate)\r\n disabled = true;\r\n if (maxDate && time.set({ second: 0 }) > maxDate)\r\n disabled = true;\r\n if (minLimit && time.endOf('minute') < minLimit)\r\n disabled = true;\r\n if (!disabled && this.isInvalidTime(time, this.singleDatePicker ? null : side, 'minute'))\r\n disabled = true;\r\n\r\n if (selected.minute == i && !disabled) {\r\n html += `<option value=\"${i}\" selected>${padded}</option>`;\r\n } else if (disabled) {\r\n html += `<option value=\"${i}\" disabled class=\"disabled\">${padded}</option>`;\r\n } else {\r\n html += `<option value=\"${i}\">${padded}</option>`;\r\n }\r\n }\r\n html += '</select>';\r\n if (this.externalStyle === 'bulma')\r\n html += '</div>';\r\n }\r\n\r\n //\r\n // seconds\r\n //\r\n\r\n if (this.timePickerOpts.showSeconds) {\r\n html += ' : ';\r\n if (this.externalStyle === 'bulma')\r\n html += '<div class=\"select is-small mx-1\">';\r\n html += '<select class=\"secondselect\">';\r\n\r\n for (var i = 0; i < 60; i += this.timePickerOpts.secondStep) {\r\n var padded = i < 10 ? '0' + i : i;\r\n let time = selected.set({ second: i });\r\n\r\n let disabled = false;\r\n if (minDate && time < minDate)\r\n disabled = true;\r\n if (maxDate && time > maxDate)\r\n disabled = true;\r\n if (minLimit && time < minLimit)\r\n disabled = true;\r\n if (!disabled && this.isInvalidTime(time, this.singleDatePicker ? null : side, 'second'))\r\n disabled = true;\r\n\r\n if (selected.second == i && !disabled) {\r\n html += `<option value=\"${i}\" selected>${padded}</option>`;\r\n } else if (disabled) {\r\n html += `<option value=\"${i}\" disabled class=\"disabled\">${padded}</option>`;\r\n } else {\r\n html += `<option value=\"${i}\">${padded}</option>`;\r\n }\r\n }\r\n html += '</select>';\r\n if (this.externalStyle === 'bulma')\r\n html += '</div>';\r\n }\r\n\r\n //\r\n // AM/PM\r\n //\r\n\r\n if (!this.timePicker24Hour) {\r\n if (this.externalStyle === 'bulma')\r\n html += '<div class=\"select is-small mx-1\">';\r\n html += '<select class=\"ampmselect\">';\r\n\r\n var am_html = '';\r\n var pm_html = '';\r\n let disabled = false;\r\n\r\n if (minDate && selected.startOf('day') < minDate)\r\n disabled = true;\r\n if (maxDate && selected.endOf('day') > maxDate)\r\n disabled = true;\r\n if (minLimit && selected.startOf('day') < minLimit)\r\n disabled = true;\r\n if (disabled) {\r\n am_html = ' disabled class=\"disabled \"';\r\n pm_html = ' disabled class=\"disabled\"';\r\n } else {\r\n if (this.isInvalidTime(selected, this.singleDatePicker ? null : side, 'ampm')) {\r\n if (selected.toFormat('a', { locale: 'en-US' }) === 'AM') {\r\n pm_html = ' disabled class=\"disabled\"';\r\n } else {\r\n am_html = ' disabled class=\"disabled\"';\r\n }\r\n }\r\n }\r\n\r\n html += `<option value=\"AM\"${am_html}`;\r\n if (selected.toFormat('a', { locale: 'en-US' }) === 'AM')\r\n html += ' selected';\r\n html += `>${Info.meridiems()[0]}</option><option value=\"PM\"${pm_html}`;\r\n if (selected.toFormat('a', { locale: 'en-US' }) === 'PM')\r\n html += ' selected';\r\n html += `>${Info.meridiems()[1]}</option>`;\r\n\r\n html += '</select>';\r\n if (this.externalStyle === 'bulma')\r\n html += '</div>';\r\n }\r\n\r\n html += '</div></th>';\r\n this.container.querySelector(`.drp-calendar .calendar-time.${side}-time`).innerHTML = html;\r\n\r\n }\r\n\r\n /**\r\n * Disable the `Apply` button if no date value is selected\r\n * @private\r\n */\r\n setApplyBtnState() {\r\n const state = this.singleDatePicker || (this.#endDate && this.#startDate <= this.#endDate)\r\n this.container.querySelector('button.applyBtn').disabled = !state;\r\n }\r\n /* #endregion */\r\n\r\n /* #region Move/Show/Hide */\r\n /**\r\n * Place the picker at the right place in the document\r\n * @private\r\n */\r\n move() {\r\n let parentOffset = { top: 0, left: 0 }\r\n let containerTop;\r\n let containerLeft;\r\n let drops = this.drops;\r\n\r\n let parentRightEdge = window.innerWidth;\r\n if (!this.parentEl.matches('body')) {\r\n parentOffset = {\r\n top: offset(this.parentEl).top - this.parentEl.scrollTop(),\r\n left: offset(this.parentEl).left - this.parentEl.scrollLeft()\r\n };\r\n parentRightEdge = this.parentEl[0].clientWidth + offset(this.parentEl).left;\r\n }\r\n\r\n switch (this.drops) {\r\n case 'auto':\r\n containerTop = offset(this.element).top + outerHeight(this.element) - parentOffset.top;\r\n if (containerTop + outerHeight(this.container) >= this.parentEl.scrollHeight) {\r\n containerTop = offset(this.element).top - outerHeight(this.container) - parentOffset.top;\r\n drops = 'up';\r\n }\r\n break;\r\n case 'up':\r\n containerTop = offset(this.element).top - outerHeight(this.container) - parentOffset.top;\r\n break;\r\n case 'down':\r\n containerTop = offset(this.element).top + outerHeight(this.element) - parentOffset.top;\r\n break;\r\n default:\r\n console.error(`Option drops '${drops}' not defined`)\r\n break;\r\n }\r\n\r\n // Force the container to it's actual width\r\n for (const [key, value] of Object.entries({ top: 0, left: 0, right: 'auto' }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n\r\n const containerWidth = outerWidth(this.container);\r\n\r\n this.container.classList.toggle('drop-up', drops === 'up');\r\n\r\n switch (this.opens) {\r\n case 'left':\r\n const containerRight = parentRightEdge - offset(this.element).left - outerWidth(this.element);\r\n if (containerWidth + containerRight > window.innerWidth) {\r\n for (const [key, value] of Object.entries({ top: containerTop, right: 'auto', left: 9 }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n } else {\r\n for (const [key, value] of Object.entries({ top: containerTop, right: containerRight, left: 'auto' }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n }\r\n break;\r\n case 'center':\r\n containerLeft = offset(this.element).left - parentOffset.left + outerWidth(this.element) / 2 - containerWidth / 2;\r\n if (containerLeft < 0) {\r\n for (const [key, value] of Object.entries({ top: containerTop, right: 'auto', left: 9 }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n } else if (containerLeft + containerWidth > window.innerWidth) {\r\n for (const [key, value] of Object.entries({ top: containerTop, left: 'auto', right: 0 }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n } else {\r\n for (const [key, value] of Object.entries({ top: containerTop, left: containerLeft, right: 'auto' }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n }\r\n break;\r\n case 'right':\r\n containerLeft = offset(this.element).left - parentOffset.left;\r\n if (containerLeft + containerWidth > window.innerWidth) {\r\n for (const [key, value] of Object.entries({ top: containerTop, left: 'auto', right: 0 }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n } else {\r\n for (const [key, value] of Object.entries({ top: `${containerTop}px`, left: containerLeft, right: 'auto' }))\r\n this.container.style[key] = typeof value === 'number' && value > 0 ? `${value}px` : value;\r\n }\r\n break;\r\n default:\r\n console.error(`Option opens '${this.opens}' not defined`);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Shows the picker\r\n * @emits \"show\"\r\n */\r\n show() {\r\n if (this.isShowing) return;\r\n\r\n // Bind global datepicker mousedown for hiding and\r\n document.addEventListener('mousedown', this.#outsideClickProxy);\r\n // also support mobile devices\r\n document.addEventListener('touchend', this.#outsideClickProxy);\r\n // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them\r\n document.addEventListener('click', this.#dropdownClickWrapper);\r\n // and also close when focus changes to outside the picker (eg. tabbing between controls)\r\n document.addEventListener('focusin', this.#outsideClickProxy);\r\n // Reposition the picker if the window is resized while it's open\r\n window.addEventListener('resize', this.#onResizeProxy);\r\n\r\n this.oldStartDate = this.#startDate;\r\n this.oldEndDate = this.#endDate;\r\n\r\n this.updateView(false);\r\n this.container.style.display = 'block';\r\n this.move();\r\n this.triggerEvent(this.#events.onShow);\r\n this.isShowing = true;\r\n }\r\n\r\n /**\r\n * Hides the picker\r\n * @emits \"beforeHide\"\r\n * @emits \"hide\"\r\n */\r\n hide() {\r\n if (!this.isShowing) return;\r\n\r\n //incomplete date selection, revert to last values\r\n if (!this.#endDate) {\r\n this.#startDate = this.oldStartDate;\r\n this.#endDate = this.oldEndDate;\r\n }\r\n\r\n //if a new date range was selected, invoke the user callback function\r\n if (!this.#startDate.equals(this.oldStartDate) || !this.#endDate.equals(this.oldEndDate))\r\n this.callback(this.startDate, this.endDate, this.chosenLabel);\r\n\r\n //if picker is attached to a text input, update it\r\n this.updateElement();\r\n\r\n const event = this.triggerEvent(this.#events.onBeforeHide);\r\n if (event.defaultPrevented)\r\n return;\r\n document.removeEventListener('mousedown', this.#outsideClickProxy);\r\n document.removeEventListener('touchend', this.#outsideClickProxy);\r\n document.removeEventListener('focusin', this.#outsideClickProxy);\r\n document.removeEventListener('click', this.#dropdownClickWrapper);\r\n window.removeEventListener('resize', this.#onResizeProxy);\r\n\r\n this.container.style.display = 'none';\r\n this.triggerEvent(this.#events.onHide);\r\n this.isShowing = false;\r\n }\r\n\r\n /**\r\n * Toggles visibility of the picker\r\n */\r\n toggle() {\r\n if (this.isShowing) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n /**\r\n * Shows calendar when user selects \"Custom Ranges\"\r\n * @emits \"showCalendar\"\r\n */\r\n showCalendars() {\r\n this.container.classList.add('show-calendar');\r\n this.move();\r\n this.triggerEvent(this.#events.onShowCalendar);\r\n }\r\n\r\n /**\r\n * Hides calendar when user selects a predefined range\r\n * @emits \"hideCalendar\"\r\n */\r\n hideCalendars() {\r\n this.container.classList.remove('show-calendar');\r\n this.triggerEvent(this.#events.onHideCalendar);\r\n }\r\n\r\n /* #endregion */\r\n\r\n /* #region Handle mouse related events */\r\n /**\r\n * Closes the picker when user clicks outside\r\n * @param {external:Event} e - The Event target\r\n * @emits \"outsideClick\"\r\n * @private\r\n */\r\n outsideClick(e) {\r\n const target = e.target;\r\n\r\n // implements jQuery closest(). \r\n // Web-API supports only CSS selectors string\r\n function closest(el, selector) {\r\n let parent = el.parentElement;\r\n while (parent) {\r\n if (parent == selector)\r\n return parent;\r\n parent = parent.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n // if the page is clicked anywhere except within the daterangerpicker/button\r\n // itself then call this.hide()\r\n if (\r\n // ie modal dialog fix\r\n e.type === \"focusin\" ||\r\n closest(target, this.element) ||\r\n closest(target, this.container) ||\r\n target.closest('.calendar-table')\r\n ) return;\r\n if (this.onOutsideClick === 'cancel') {\r\n this.#startDate = this.oldStartDate;\r\n this.#endDate = this.oldEndDate;\r\n }\r\n this.hide();\r\n\r\n this.triggerEvent(this.#events.onOutsideClick);\r\n }\r\n\r\n /**\r\n * Move calendar to previous month\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n clickPrev(e) {\r\n let cal = e.target.closest('.drp-calendar');\r\n if (cal.classList.contains('left')) {\r\n this.leftCalendar.month = this.leftCalendar.month.minus({ month: 1 });\r\n if (this.linkedCalendars && !this.singleMonthView)\r\n this.rightCalendar.month = this.rightCalendar.month.minus({ month: 1 });\r\n } else {\r\n this.rightCalendar.month = this.rightCalendar.month.minus({ month: 1 });\r\n }\r\n this.updateCalendars(true);\r\n }\r\n\r\n /**\r\n * Move calendar to next month\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n clickNext(e) {\r\n let cal = e.target.closest('.drp-calendar');\r\n if (cal.classList.contains('left')) {\r\n this.leftCalendar.month = this.leftCalendar.month.plus({ month: 1 });\r\n } else {\r\n this.rightCalendar.month = this.rightCalendar.month.plus({ month: 1 });\r\n if (this.linkedCalendars)\r\n this.leftCalendar.month = this.leftCalendar.month.plus({ month: 1 });\r\n }\r\n this.updateCalendars(true);\r\n }\r\n\r\n /**\r\n * User hovers over date values\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n hoverDate(e) {\r\n\r\n //ignore dates that can't be selected\r\n if (!e.target.classList.contains('available')) return;\r\n\r\n let title = e.target.dataset.title;\r\n const row = title.substring(1, 2);\r\n const col = title.substring(3, 4);\r\n const cal = e.target(closest, '.drp-calendar');\r\n var date = cal.classList.contains('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\r\n\r\n //highlight the dates between the start date and the date being hovered as a potential end date\r\n const leftCalendar = this.leftCalendar;\r\n const rightCalendar = this.rightCalendar;\r\n const startDate = this.#startDate;\r\n const initalMonth = this.initalMonth;\r\n if (!this.#endDate) {\r\n this.container.querySelectorAll('.drp-calendar tbody td').forEach(el => {\r\n\r\n //skip week numbers, only look at dates\r\n if (el.classList.contains('week')) return;\r\n\r\n const title = el.dataset.title;\r\n const row = title.substring(1, 2);\r\n const col = title.substring(3, 4);\r\n const cal = el.closest('.drp-calendar');\r\n const dt = cal.classList.contains('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col];\r\n\r\n if (!startDate && initalMonth) {\r\n el.classList.remove('in-range');\r\n } else {\r\n el.classList.toggle('in-range', (dt > startDate) && dt < date || dt.hasSame(date, 'day'));\r\n }\r\n });\r\n }\r\n\r\n }\r\n\r\n /**\r\n * User hovers over ranges\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n hoverRange(e) {\r\n const label = e.target.dataset.rangeKey;\r\n const previousDates = [this.#startDate, this.#endDate];\r\n const dates = this.ranges[label] ?? [this.#startDate, this.#endDate];\r\n const leftCalendar = this.leftCalendar;\r\n const rightCalendar = this.rightCalendar;\r\n\r\n this.container.querySelectorAll('.drp-calendar tbody td').forEach(el => {\r\n //skip week numbers, only look at dates\r\n if (el.classList.contains('week')) return;\r\n\r\n const title = el.dataset.ttitle;\r\n const row = title.substring(1, 2);\r\n const col = title.substring(3, 4);\r\n const cal = el.closest('.drp-calendar');\r\n const dt = cal.classList.contains('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col];\r\n\r\n el.classList.toggle('start-hover', dt.hasSame(dates[0], 'day'));\r\n el.classList.toggle('start-date', dt.hasSame(previousDates[0], 'day'));\r\n el.classList.toggle('end-hover', dt.hasSame(dates[1], 'day'));\r\n el.classList.toggle('end-date', previousDates[1] != null && dt.hasSame(previousDates[1], 'day'));\r\n el.classList.toggle('range-hover', dt.startOf('day') >= dates[0].startOf('day') && dt.startOf('day') <= dates[1].startOf('day'));\r\n el.classList.toggle('in-range', dt.startOf('day') >= previousDates[0].startOf('day') && previousDates[1] != null && dt.startOf('day') <= previousDates[1].startOf('day'));\r\n });\r\n }\r\n\r\n /**\r\n * User leave ranges, remove hightlight from dates\r\n * @private\r\n */\r\n leaveRange() {\r\n this.container.querySelectorAll('.drp-calendar tbody td').forEach(el => {\r\n //skip week numbers, only look at dates\r\n if (el.classList.contains('week')) return;\r\n el.classList.remove('start-hover');\r\n el.classList.remove('end-hover');\r\n el.classList.remove('range-hover');\r\n });\r\n }\r\n\r\n\r\n /* #endregion */\r\n\r\n /* #region Select values by Mouse */\r\n /**\r\n * Set date values after user selected a date\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n clickRange(e) {\r\n let label = e.target.getAttribute('data-range-key');\r\n this.chosenLabel = label;\r\n if (label == this.locale.customRangeLabel) {\r\n this.showCalendars();\r\n } else {\r\n let newDate = this.ranges[label];\r\n const monthChange = !this.#startDate.hasSame(newDate[0], 'month') || !this.#endDate.hasSame(newDate[1], 'month');\r\n this.#startDate = newDate[0];\r\n this.#endDate = newDate[1];\r\n\r\n if (!this.timePicker) {\r\n this.#startDate.startOf('day');\r\n this.#endDate.endOf('day');\r\n }\r\n\r\n if (!this.alwaysShowCalendars)\r\n this.hideCalendars();\r\n\r\n const event = this.triggerEvent(this.#events.onBeforeHide);\r\n if (event.defaultPrevented)\r\n this.updateView(monthChange);\r\n this.clickApply();\r\n }\r\n }\r\n\r\n /**\r\n * User clicked a date\r\n * @param {external:Event} e - The Event target\r\n * @emits \"dateChange\"\r\n * @private\r\n */\r\n clickDate(e) {\r\n if (!e.target.classList.contains('available')) return;\r\n\r\n let title = e.target.dataset.title;\r\n let row = title.substring(1, 2);\r\n let col = title.substring(3, 4);\r\n let cal = e.target.closest('.drp-calendar');\r\n let date = cal.classList.contains('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\r\n let side;\r\n\r\n //\r\n // this function needs to do a few things:\r\n // * alternate between selecting a start and end date for the range,\r\n // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date\r\n // * if autoapply is enabled, and an end date was chosen, apply the selection\r\n // * if single date picker mode, and time picker isn't enabled, apply the selection immediately\r\n // * if one of the inputs above the calendars was focused, cancel that manual input\r\n //\r\n\r\n if (this.#endDate || !this.#startDate || date < this.#startDate.startOf('day')) { //picking start\r\n // #endDate -> Must be the start of a new range\r\n // !#startDate -> Click on empty calendar (without any inital date)\r\n // date < #startDate -> startDate was selected, but user likes to set an earlier day\r\n if (this.timePicker) {\r\n let hour = parseInt(this.container.querySelector('.start-time .hourselect').value, 10);\r\n if (isNaN(hour))\r\n hour = parseInt(this.container.querySelector('.start-time .hourselect option:last-child').value, 10);\r\n\r\n let minute = 0;\r\n if (this.timePickerOpts.showMinutes) {\r\n minute = parseInt(this.container.querySelector('.start-time .minuteselect').value, 10);\r\n if (isNaN(minute))\r\n minute = parseInt(this.container.querySelector('.start-time .minuteselect option:last-child').value, 10);\r\n }\r\n\r\n let second = 0;\r\n if (this.timePickerOpts.showSeconds) {\r\n second = parseInt(this.container.querySelector('.start-time .secondselect').value, 10);\r\n if (isNaN(second))\r\n second = parseInt(this.container.querySelector('.start-time .secondselect option:last-child').value, 10);\r\n }\r\n\r\n date = date.set({ hour: hour, minute: minute, second: second });\r\n } else {\r\n date = date.startOf('day');\r\n }\r\n // First click, must be the startDate\r\n this.#endDate = null;\r\n this.#startDate = date;\r\n side = 'start';\r\n } else if (!this.#endDate && date < this.#startDate) {\r\n //special case: clicking the same date for start/end,\r\n //but the time of the end date is before the start date\r\n this.#endDate = this.#startDate;\r\n side = 'end';\r\n } else { // picking end\r\n if (this.timePicker) {\r\n let hour = parseInt(this.container.querySelector('.end-time .hourselect').value, 10);\r\n if (isNaN(hour))\r\n hour = parseInt(this.container.querySelector('.end-time .hourselect option:last-child').value, 10);\r\n\r\n let minute = 0;\r\n if (this.timePickerOpts.showMinutes) {\r\n minute = parseInt(this.container.querySelector('.end-time .minuteselect').value, 10);\r\n if (isNaN(minute))\r\n minute = parseInt(this.container.querySelector('.end-time .minuteselect option:last-child').value, 10);\r\n }\r\n\r\n let second = 0;\r\n if (this.timePickerOpts.showSeconds) {\r\n second = parseInt(this.container.querySelector('.end-time .secondselect').value, 10);\r\n if (isNaN(second))\r\n second = parseInt(this.container.querySelector('.end-time .secondselect option:last-child').value, 10);\r\n }\r\n\r\n date = date.set({ hour: hour, minute: minute, second: second });\r\n } else {\r\n date = date.endOf('day');\r\n }\r\n this.#endDate = date;\r\n if (this.autoApply) {\r\n this.calculateChosenLabel();\r\n this.clickApply();\r\n }\r\n side = 'end';\r\n }\r\n\r\n if (this.singleDatePicker) {\r\n this.#endDate = this.#startDate; // Date is complete\r\n if (!this.timePicker && this.autoApply)\r\n this.clickApply();\r\n side = null;\r\n }\r\n\r\n // Need updateView because right calendar depends on left selected value\r\n this.updateView(false);\r\n\r\n //This is to cancel the blur event handler if the mouse was in one of the inputs\r\n e.stopPropagation();\r\n\r\n if (this.autoUpdateInput)\r\n this.updateElement();\r\n\r\n this.triggerEvent(this.#events.onDateChange, { side: side });\r\n\r\n }\r\n\r\n /**\r\n * Hightlight selected predefined range in calendar\r\n * @private\r\n */\r\n calculateChosenLabel() {\r\n if (Object.keys(this.ranges).length === 0)\r\n return;\r\n\r\n // If selected range from calendar matches any custom range, then highlight it\r\n var customRange = true;\r\n var i = 0;\r\n for (var range in this.ranges) {\r\n var unit = this.timePicker ? 'hour' : 'day';\r\n if (this.timePicker) {\r\n if (this.timePickerOpts.showMinutes) {\r\n unit = 'minute';\r\n } else if (this.timePickerOpts.showSeconds) {\r\n unit = 'second';\r\n }\r\n }\r\n if (this.#startDate.startOf(unit).equals(this.ranges[range][0].startOf(unit)) && this.#endDate.startOf(unit).equals(this.ranges[range][1].startOf(unit))) {\r\n customRange = false;\r\n const range = this.container.querySelector(`.ranges li:eq(${i})`);\r\n this.chosenLabel = range.dataset.rangeKey;\r\n range.classList.add('active');\r\n break;\r\n }\r\n i++;\r\n }\r\n if (customRange) {\r\n if (this.showCustomRangeLabel) {\r\n const range = this.container.querySelector('.ranges li:last-child');\r\n this.chosenLabel = range.dataset.rangeKey;\r\n range.classList.add('active');\r\n } else {\r\n this.chosenLabel = null;\r\n }\r\n this.showCalendars();\r\n }\r\n }\r\n\r\n /**\r\n * User clicked a time\r\n * @param {external:Event} e - The Event target\r\n * @emits \"timeChange\"\r\n * @private\r\n */\r\n timeChanged(e) {\r\n const time = e.target.closest('.calendar-time');\r\n const side = time.classList.contains('start-time') ? 'start' : 'end';\r\n\r\n var hour = parseInt(time.querySelector('.hourselect').value, 10);\r\n if (isNaN(hour))\r\n hour = parseInt(time.querySelector('.hourselect option:last-child').value, 10);\r\n\r\n if (!this.timePicker24Hour) {\r\n const ampm = time.querySelector('.ampmselect').value;\r\n if (ampm == null)\r\n time.querySelector('.ampmselect option:last-child').value;\r\n if (ampm != DateTime.fromFormat(`${hour}`, 'H').toFormat('a', { locale: 'en-US' })) {\r\n time.querySelectorAll('.hourselect > option').forEach(el => {\r\n el.hidden = !el.hidden;\r\n });\r\n const h = DateTime.fromFormat(`${hour}`, 'H').toFormat('h')\r\n hour = DateTime.fromFormat(`${h}${ampm}`, 'ha', { locale: 'en-US' }).hour;\r\n }\r\n }\r\n\r\n var minute = 0;\r\n if (this.timePickerOpts.showMinutes) {\r\n minute = parseInt(time.querySelector('.minuteselect').value, 10);\r\n if (isNaN(minute))\r\n minute = parseInt(time.querySelector('.minuteselect option:last-child').value, 10);\r\n }\r\n\r\n var second = 0;\r\n if (this.timePickerOpts.showSeconds) {\r\n second = parseInt(time.querySelector('.secondselect').value, 10);\r\n if (isNaN(second))\r\n second = parseInt(time.querySelector('.secondselect option:last-child').value, 10);\r\n }\r\n\r\n if (side === 'start') {\r\n if (this.#startDate)\r\n this.#startDate = this.#startDate.set({ hour: hour, minute: minute, second: second });\r\n if (this.singleDatePicker) {\r\n this.#endDate = this.#startDate;\r\n } else if (this.#endDate && this.#endDate.hasSame(this.#startDate, 'day') && this.#endDate < this.#startDate) {\r\n this.#endDate = this.#startDate;\r\n }\r\n } else if (this.#endDate) {\r\n this.#endDate = this.#endDate.set({ hour: hour, minute: minute, second: second });\r\n }\r\n\r\n //update the calendars so all clickable dates reflect the new time component\r\n this.updateCalendars(false);\r\n\r\n //update the form inputs above the calendars with the new time\r\n this.setApplyBtnState();\r\n\r\n //re-render the time pickers because changing one selection can affect what's enabled in another\r\n this.triggerEvent(this.#events.onBeforeRenderTimePicker);\r\n this.renderTimePicker('start');\r\n this.renderTimePicker('end');\r\n\r\n if (this.autoUpdateInput)\r\n this.updateElement();\r\n\r\n this.triggerEvent(this.#events.onTimeChange, { side: this.singleDatePicker ? null : side });\r\n }\r\n\r\n /**\r\n * Calender month moved\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n monthOrYearChanged(e) {\r\n const isLeft = e.target.closest('.drp-calendar').classList.contains('left');\r\n const leftOrRight = isLeft ? 'left' : 'right';\r\n const cal = this.container.querySelector(`.drp-calendar.${leftOrRight}`);\r\n\r\n // Month must be Number for new DateTime versions\r\n let month = parseInt(cal.querySelector('.monthselect').value, 10);\r\n let year = cal.querySelector('.yearselect').value;\r\n let monthChange = false;\r\n\r\n if (!isLeft) {\r\n if (year < this.#startDate.year || (year == this.#startDate.year && month < this.#startDate.month)) {\r\n month = this.#startDate.month;\r\n year = this.#startDate.year;\r\n }\r\n }\r\n\r\n if (this.minDate) {\r\n if (year < this.minDate.year || (year == this.minDate.year && month < this.minDate.month)) {\r\n month = this.minDate.month;\r\n year = this.minDate.year;\r\n }\r\n }\r\n\r\n if (this.maxDate) {\r\n if (year > this.maxDate.year || (year == this.maxDate.year && month > this.maxDate.month)) {\r\n month = this.maxDate.month;\r\n year = this.maxDate.year;\r\n }\r\n }\r\n\r\n if (isLeft) {\r\n monthChange = !DateTime.fromObject({ year: year, month: month }).hasSame(this.leftCalendar.month, 'month');\r\n this.leftCalendar.month = this.leftCalendar.month.set({ year: year, month: month });\r\n if (this.linkedCalendars)\r\n this.rightCalendar.month = this.leftCalendar.month.plus({ month: 1 });\r\n } else {\r\n monthChange = !DateTime.fromObject({ year: year, month: month }).hasSame(this.leftCalendar.month, 'month');\r\n this.rightCalendar.month = this.rightCalendar.month.set({ year: year, month: month });\r\n if (this.linkedCalendars)\r\n this.leftCalendar.month = this.rightCalendar.month.minus({ month: 1 });\r\n }\r\n this.updateCalendars(monthChange);\r\n }\r\n\r\n /**\r\n* User clicked `Apply` button\r\n* @emits \"apply\"\r\n* @private\r\n */\r\n clickApply() {\r\n this.hide();\r\n this.triggerEvent(this.#events.onApply);\r\n }\r\n\r\n /**\r\n * User clicked `Cancel` button\r\n * @emits \"cancel\"\r\n * @private\r\n */\r\n clickCancel() {\r\n this.#startDate = this.oldStartDate;\r\n this.#endDate = this.oldEndDate;\r\n this.hide();\r\n this.triggerEvent(this.#events.onCancel);\r\n }\r\n\r\n /* #endregion */\r\n\r\n /**\r\n * Update the picker with value from `<input>` element.<br> \r\n * Input values must be given in format of `locale.format`. Invalid values are handles by `violate` Event\r\n * @emits \"inputChange\"\r\n * @private\r\n */\r\n elementChanged() {\r\n if (!this.isInputText) return;\r\n if (!this.element.value.length) return;\r\n\r\n const format = typeof this.locale.format === 'string' ? this.locale.format : DateTime.parseFormatForOpts(this.locale.format);\r\n const dateString = this.element.value.split(this.locale.separator);\r\n let monthChange = false;\r\n if (this.singleDatePicker) {\r\n let newDate = DateTime.fromFormat(this.element.value, format, { locale: DateTime.now().locale });\r\n const oldDate = this.#startDate;\r\n if (!newDate.isValid || oldDate.equals(newDate))\r\n return;\r\n\r\n const violations = this.validateInput([newDate, null], true);\r\n if (violations != null) {\r\n if (violations.newDate != null) {\r\n newDate = violations.newDate.startDate\r\n } else {\r\n return; // revert to old startDate\r\n }\r\n }\r\n monthChange = !this.#startDate.hasSame(newDate, 'month');\r\n this.#startDate = newDate;\r\n this.#endDate = this.#startDate;\r\n if (!this.timePicker) {\r\n this.#startDate = this.#startDate.startOf('day');\r\n this.#endDate = this.#endDate.endOf('day');\r\n }\r\n } else if (!this.singleDatePicker && dateString.length === 2) {\r\n const newDate = [0, 1].map(i => DateTime.fromFormat(dateString[i], format, { locale: DateTime.now().locale }));\r\n const oldDate = [this.#startDate, this.#endDate];\r\n if (!newDate[0].isValid || !newDate[1].isValid || (oldDate[0].equals(newDate[0]) && oldDate[1].equals(newDate[1]) || newDate[0] > newDate[1]))\r\n return;\r\n\r\n const violations = this.validateInput([newDate[0], newDate[1]], true);\r\n if (violations != null) {\r\n if (violations.newDate != null) {\r\n newDate[0] = violations.newDate.startDate\r\n newDate[1] = violations.newDate.endDate\r\n } else {\r\n return; // revert to old startDate,endDate\r\n }\r\n }\r\n monthChange = !this.#startDate.hasSame(newDate[0], 'month') || !this.#endDate.hasSame(newDate[1], 'month');\r\n this.#startDate = newDate[0];\r\n this.#endDate = newDate[1];\r\n if (!this.timePicker) {\r\n this.#startDate = this.#startDate.startOf('day');\r\n this.#endDate = this.#endDate.endOf('day');\r\n }\r\n } else {\r\n return;\r\n }\r\n\r\n this.updateView(monthChange);\r\n this.updateElement();\r\n this.triggerEvent(this.#events.onInputChange);\r\n }\r\n\r\n /**\r\n * Handles key press, IE 11 compatibility\r\n * @param {external:Event} e - The Event target\r\n * @private\r\n */\r\n keydown(e) {\r\n //hide on tab or enter\r\n if ([9, 11].includes(e.keyCode))\r\n this.hide();\r\n\r\n //hide on esc and prevent propagation\r\n if (e.keyCode === 27) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Update attached `<input>` element with selected value\r\n * @emits external:change\r\n */\r\n updateElement() {\r\n if (this.#startDate == null && this.initalMonth)\r\n return;\r\n\r\n if (this.isInputText) {\r\n let newValue = this.formatDate(this.#startDate);\r\n if (!this.singleDatePicker) {\r\n newValue += this.locale.separator;\r\n if (this.#endDate)\r\n newValue += this.formatDate(this.#endDate);\r\n }\r\n this.updateAltInput();\r\n if (newValue !== this.element.value) {\r\n this.element.value = newValue\r\n this.element.dispatchEvent(new Event('change', { bubbles: true }))\r\n }\r\n } else {\r\n this.updateAltInput()\r\n }\r\n }\r\n\r\n /**\r\n * Update altInput `<input>` element with selected value\r\n */\r\n updateAltInput() {\r\n if (this.altInput == null)\r\n return;\r\n\r\n if (this.altFormat == null) {\r\n let precision = 'day';\r\n if (this.timePicker) {\r\n if (this.timePickerOpts.showSeconds) {\r\n precision = 'second';\r\n } else if (this.timePickerOpts.showMinutes) {\r\n precision = 'minute';\r\n } else {\r\n precision = 'hour';\r\n }\r\n }\r\n const startDate = this.#startDate.toISO({ format: 'basic', precision: precision, includeOffset: false });\r\n (this.singleDatePicker ? this.altInput : this.altInput[0]).value = startDate;\r\n if (!this.singleDatePicker && this.#endDate) {\r\n const endDate = this.#endDate.toISO({ format: 'basic', precision: precision, includeOffset: false });\r\n this.altInput[1].value = endDate;\r\n }\r\n } else {\r\n const startDate = typeof this.altFormat === 'function' ? this.altFormat(this.#startDate) : this.formatDate(this.#startDate, this.altFormat);\r\n (this.singleDatePicker ? this.altInput : this.altInput[0]).value = startDate;\r\n if (!this.singleDatePicker && this.#endDate) {\r\n const endDate = typeof this.altFormat === 'function' ? this.altFormat(this.#endDate) : this.formatDate(this.#endDate, this.altFormat);\r\n this.altInput[1].value = endDate;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes the picker from document\r\n */\r\n remove() {\r\n this.element.removeEventListener('click', this.#showProxy);\r\n this.element.removeEventListener('focus', this.#showProxy);\r\n this.element.removeEventListener('keyup', this.#elementChangedProxy);\r\n this.element.removeEventListener('keydown', this.#keydownProxy);\r\n this.element.removeEventListener('click', this.#toggleProxy)\r\n this.element.removeEventListener('keydown', this.#toggleProxy);\r\n this.container.remove();\r\n }\r\n\r\n /**\r\n * Helper function to dispatch events\r\n * @param {Event} ev - From this.#events\r\n * @param {...any?} args - Additional parameters if needed\r\n * @private\r\n */\r\n triggerEvent(ev, ...args) {\r\n if (args.length === 0) {\r\n const event = new DateRangePickerEvent(this, ev);\r\n this.element.dispatchEvent(event);\r\n return event;\r\n } else {\r\n const event = new DateRangePickerEvent(this, ev, ...args);\r\n this.element.dispatchEvent(event);\r\n return event;\r\n }\r\n }\r\n\r\n /**\r\n * Helper function to add eventListener similar to jQuery .on( events [, selector ] [, data ] )\r\n * @param {string} element - Query selector of element where listener is added\r\n * @param {string} eventName - Name of the event\r\n * @param {string} selector - Query selector string to filter the descendants of the element\r\n * @param {any} delegate - Handler data\r\n */\r\n addListener(element, eventName, selector, delegate) {\r\n this.container.querySelectorAll(element).forEach(el => {\r\n el.addEventListener(eventName, function (event) {\r\n const target = event.target.closest(selector);\r\n if (target && el.contains(target))\r\n delegate.call(target, event);\r\n });\r\n });\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n// Internal helper functions\r\nfunction createElementFromHTML(html) {\r\n const template = document.createElement('template');\r\n template.innerHTML = html.trim();\r\n return template.content.firstElementChild;\r\n}\r\n\r\n/**\r\n * \r\n * @class\r\n * @extends Event\r\n */\r\nclass DateRangePickerEvent extends Event {\r\n #picker;\r\n\r\n constructor(drp, ev, args = {}) {\r\n let param = {};\r\n if (ev.param)\r\n param = typeof ev.param === 'function' ? ev.param() : ev.param;\r\n\r\n param = { ...param, ...args };\r\n super(ev.type, param);\r\n this.#picker = drp;\r\n for (const [key, value] of Object.entries(param)) {\r\n if (Object.getOwnPropertyNames(Event.prototype).includes(key)) continue;\r\n this[key] = value;\r\n }\r\n }\r\n\r\n get picker() {\r\n return this.#picker;\r\n }\r\n}\r\n\r\n// implements jQuery offset()\r\nfunction offset(el) {\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n top: rect.top + window.scrollY,\r\n left: rect.left + window.scrollX\r\n };\r\n}\r\n\r\n// implements jQuery outerWidth(withMargin)\r\nfunction outerWidth(el, withMargin = false) {\r\n if (!withMargin)\r\n return el.offsetWidth;\r\n const style = getComputedStyle(el);\r\n return el.offsetWidth + parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n}\r\n\r\n// implements jQuery outerHeight(withMargin)\r\nfunction outerHeight(el, withMargin = false) {\r\n if (!withMargin)\r\n return el.offsetHeight;\r\n const style = getComputedStyle(el);\r\n return el.offsetHeight + parseFloat(style.marginTop) + parseFloat(style.marginBottom);\r\n}\r\n/* #endregion */\r\n\r\n\r\n/**\r\n* @callback callback\r\n* @param {external:DateTime} startDate - Selected startDate\r\n* @param {external:DateTime} endDate - Selected endDate \r\n* @param {string} range\r\n*/\r\n\r\n/**\r\n* Initiate a new DateRangePicker\r\n* @function\r\n* @param {string|external:HTMLElement} elements - Element where DateRangePicker is attached\r\n* @param {Options} options - Object to configure the DateRangePicker\r\n* @param {callback} callback - Callback function executed when date is changed.<br/>\r\n* Callback function is executed if selected date values has changed, before picker is hidden and before the attached `<input>` element is updated. \r\n* As alternative listen to the {@link #event_apply|\"apply\"} event\r\n* @returns {HTMLElement|HTMLElement[]} The input `element` instance or an array of HTMLElement instances if `elements` matches more than one element\r\n*/\r\nfunction daterangepicker(elements, options, callback) {\r\n if (typeof elements === 'string')\r\n return daterangepicker(document.querySelectorAll(elements), options, callback);\r\n\r\n if (elements instanceof HTMLElement)\r\n elements = [elements];\r\n\r\n if (elements instanceof NodeList || elements instanceof HTMLCollection)\r\n elements = Array.from(elements);\r\n\r\n if (elements == null)\r\n return new DateRangePicker(null, options || {}, callback);\r\n\r\n elements.forEach(el => {\r\n if (el._daterangepicker && typeof el._daterangepicker.remove === 'function')\r\n el._daterangepicker.remove();\r\n el._daterangepicker = new DateRangePicker(el, options || {}, callback);\r\n });\r\n\r\n return elements.length === 1 ? elements[0] : elements;\r\n}\r\n\r\n\r\n/**\r\n * Returns the DateRangePicker. Equivalent to `element._daterangepicker`\r\n * @param {HTMLElement|string} target - The HTMLElement or querySelector string where the DateRangePicker is attached.\r\n * @returns {DateRangePicker} - The attached DateRangePicker\r\n */\r\nfunction getDateRangePicker(target) {\r\n if (typeof target === 'string')\r\n target = document.querySelector(target);\r\n return target instanceof HTMLElement ? target._daterangepicker : undefined;\r\n}\r\n\r\n// legacy support for jQuery \r\nif (window.jQuery?.fn) {\r\n jQuery.fn.daterangepicker = function (options, callback) {\r\n return this.each(function () {\r\n daterangepicker(this, options, callback);\r\n });\r\n };\r\n}\r\n\r\n\r\nfunction registerJqueryPlugin(jq) {\r\n if (!jq?.fn) return;\r\n jq.fn.daterangepicker = function (options, callback) {\r\n return this.each(function () {\r\n daterangepicker(this, options, callback);\r\n });\r\n };\r\n}\r\n\r\nObject.defineProperty(window, \"jQuery\", {\r\n configurable: true,\r\n set(value) {\r\n this._jQuery = value;\r\n registerJqueryPlugin(value);\r\n },\r\n get() {\r\n return this._jQuery;\r\n }\r\n});\r\n\r\nexport { daterangepicker, getDateRangePicker, DateRangePicker };\r\n\r\n\r\n/** @external HTMLElement\r\n@see {@link https://developer.mozilla.org/de/docs/Web/API/HTMLElement|HTMLElement} */\r\n\r\n/** @external HTMLInputElement\r\n@see {@link https://developer.mozilla.org/de/docs/Web/API/HTMLInputElement|HTMLInputElement} */\r\n\r\n/** @external NodeList \r\n@see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList|NodeList} */\r\n\r\n/** @external HTMLCollection \r\n@see {@link https://developer.mozilla.org/de/docs/Web/API/HTMLCollection|HTMLCollection} */\r\n\r\n/** @external selectors\r\n@see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector#selectors|selectors} */\r\n\r\n/** @external change\r\n@see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event|change event} */\r\n\r\n/** @external Event\r\n@see {@link https://developer.mozilla.org/en-US/docs/Web/API/Event|Event} */\r\n\r\n/** @external DateTime\r\n@see {@link https://moment.github.io/luxon/api-docs/index.html#datetime|DateTime} */\r\n\r\n/** @external Duration\r\n@see {@link https://moment.github.io/luxon/api-docs/index.html#duration|Duration} */\r\n\r\n/** @external Date\r\n@see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date|Date} */\r\n\r\n/** @external ISO-8601\r\n@see {@link https://en.wikipedia.org/wiki/ISO_8601} */\r\n\r\n"],"names":["key","closest","title","row","col","cal","range"],"mappings":"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"}
|