window.DateRangePicker = class DateRangePicker {
constructor(pConfig) {
this.#config = pConfig;
this.#disabledDates = new Set();
this.#maxDate = null;
this.#pickerItem().element.addClass("date-range-picker");
this.#assignInitialValueFromStartDate();
this.#assignDayFormatter();
this.#pickerItem().element.on("change", () => {
this.#onChanged();
});
document.getElementById(this.#resetId()).addEventListener("click", () => {
this.#reset();
});
}
#config;
#disabledDates;
#maxDate;
setDisabledDates(dates) {
this.#disabledDates = new Set(dates);
this.#pickerItem().refresh();
}
setMaxDate(date) {
this.#maxDate = date;
this.#pickerItem().refresh();
}
#pickerItem() {
return apex.items[this.#config.picker.name];
}
#pickerFormat() {
return this.#config.picker.format;
}
#pickerSingleDay() {
return this.#config.picker.allowSingleDay;
}
#startItem() {
return apex.items[this.#config.start.name];
}
#startItemLabel() {
return this.#config.start.label;
}
#endItem() {
return apex.items[this.#config.end.name];
}
#resetId() {
return this.#config.reset.id;
}
#endItemLabel() {
return this.#config.end.label;
}
#assignInitialValueFromStartDate() {
const startItemValue = this.#startItem().getValue();
if (startItemValue) {
this.#pickerItem().setValue(startItemValue,null,true);
}
}
#assignDayFormatter() {
const pickerItem = this.#pickerItem();
const startItemLabel = this.#startItemLabel();
const endItemLabel = this.#endItemLabel();
const pickerFormat = this.#pickerFormat();
const startItem = this.#startItem();
const endItem = this.#endItem();
const getDisabledDates = () => this.#disabledDates;
const getMaxDate = () => this.#maxDate;
pickerItem.dayFormatter = function(iso8860DateString) {
const disabledDates = getDisabledDates();
const maxDate = getMaxDate();
const currentDate = apex.date.parse(iso8860DateString, "YYYY-MM-DD");
const isDisabledByDate = disabledDates.has(iso8860DateString);
const isAfterMax = maxDate ?
apex.date.isAfter(currentDate, apex.date.parse(maxDate, pickerFormat)) :
false;
const isDisabled = isDisabledByDate || isAfterMax;
const startDateValue = startItem.getValue();
const startDate = startDateValue ? apex.date.parse(startDateValue, pickerFormat) : null;
const endDateValue = endItem.getValue();
const endDate = endDateValue ? apex.date.parse(endDateValue, pickerFormat) : null;
var tooltipText = "";
var dateRangeClass = "";
if (!startDateValue) {
tooltipText = "Choose " + (startItemLabel ? startItemLabel : "Start") + " Date";
} else {
if (apex.date.isSame(startDate, currentDate)) {
tooltipText = startItemLabel;
} else {
if (!endDateValue) {
tooltipText = "Choose " + (endItemLabel ? endItemLabel : "End") + " Date";
} else {
if (apex.date.isSame(endDate, currentDate)) {
tooltipText = endItemLabel;
}
}
}
}
if (startDateValue) {
if (apex.date.isSame(currentDate, startDate)) {
if (endDateValue && apex.date.isSame(currentDate, endDate)) {
dateRangeClass = "dateRangeSingleDay";
} else if (endDateValue) {
dateRangeClass = "dateRangeStart";
} else {
dateRangeClass = "dateRangeSingleDay";
}
} else if (endDateValue) {
if (apex.date.isSame(currentDate, endDate)) {
dateRangeClass = "dateRangeEnd";
} else if (apex.date.isBetween(currentDate, startDate, endDate)) {
dateRangeClass = "dateRangeMiddle";
}
}
}
return {
disabled: isDisabled,
class: dateRangeClass,
tooltip: isDisabled ? 'Not Available' : tooltipText
};
};
pickerItem.refresh();
}
#onChanged() {
const startItem = this.#startItem();
const endItem = this.#endItem();
const pickerItem = this.#pickerItem();
const pickerFormat = this.#pickerFormat();
if (!pickerItem.getValue()) {
this.#reset();
return;
}
const datepicked = pickerItem.getNativeValue();
const startDateValue = startItem.getValue();
const endDateValue = endItem.getValue();
if (startDateValue === "" || (endDateValue !== "")) {
startItem.setValue(pickerItem.getValue());
endItem.setValue(null);
} else {
const startDate = apex.date.parse(startDateValue, pickerFormat);
if (apex.date.isBefore(datepicked, startDate)) {
startItem.setValue(pickerItem.getValue());
endItem.setValue(null);
} else if (!apex.date.isSame(datepicked, startDate)) {
endItem.setValue(pickerItem.getValue());
}
}
pickerItem.refresh();
}
#reset() {
const startItem = this.#startItem();
const endItem = this.#endItem();
const pickerItem = this.#pickerItem();
startItem.setValue(null,null,true);
endItem.setValue(null,null,true);
pickerItem.setValue(null,null,true);
pickerItem.element.find('.dateRangeStart, .dateRangeEnd, .dateRangeSingleDay').removeClass('dateRangeStart dateRangeEnd dateRangeSingleDay');
pickerItem.element.find('.is-selected').removeClass('is-selected');
pickerItem.refresh();
$(document).trigger('daterangepicker-reset', {
picker: this.#config.picker.name,
start: this.#config.start.name,
end: this.#config.end.name
});
}
};