@progress/kendo-ui
Version:
This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.
1,467 lines • 64.4 kB
JavaScript
Object.defineProperties(exports, {
__esModule: { value: true },
[Symbol.toStringTag]: { value: "Module" }
});
require("./kendo.core-kmRaf_Lg.js");
require("./kendo.icons.js");
require("./kendo.selectable.js");
//#region ../src/kendo.calendar.js
const __meta__ = {
id: "calendar",
name: "Calendar",
category: "web",
description: "The Calendar widget renders a graphical calendar that supports navigation and selection.",
depends: ["core", "selectable"]
};
(function($, undefined) {
let kendo = window.kendo, support = kendo.support, ui = kendo.ui, Widget = ui.Widget, keys = kendo.keys, parse = kendo.parseDate, encode = kendo.htmlEncode, adjustDST = kendo.date.adjustDST, weekInYear = kendo.date.weekInYear, Selectable = kendo.ui.Selectable, RangeSelectable = kendo.ui.RangeSelectable, extractFormat = kendo._extractFormat, template = kendo.template, getCulture = kendo.getCulture, transitionOrigin = "transform-origin", cellTemplate = template((data) => `<td class="${data.cssClass}" role="gridcell"${data.ariaDisabled ? " aria-disabled=\"true\"" : ""}><span tabindex="-1" class="k-link" data-href="#" data-${data.ns}value="${data.dateString}">${data.value}</span></td>`), emptyCellTemplate = template(() => "<td role=\"gridcell\" class=\"k-calendar-td k-empty\"></td>"), otherMonthCellTemplate = template(() => "<td role=\"gridcell\" class=\"k-calendar-td k-empty\"> </td>"), weekNumberTemplate = template((data) => `<td class="k-calendar-td k-alt">${data.weekNumber}</td>`), outerWidth = kendo._outerWidth, ns = ".kendoCalendar", CLICK = "click.kendoCalendar", KEYDOWN_NS = "keydown.kendoCalendar", ID = "id", MIN = "min", LEFT = "left", SLIDE = "slideIn", MONTH = "month", CENTURY = "century", CHANGE = "change", NAVIGATE = "navigate", VALUE = "value", HOVER = "k-hover", DISABLED = "k-disabled", FOCUSED = "k-focus", OTHERMONTH = "k-other-month", EMPTYCELL = "k-empty", TODAY = "k-calendar-nav-today", CELLSELECTOR = "td:has(.k-link)", START = "start", END = "end", CELLSELECTORVALID = "td:has(.k-link):not(.k-disabled):not(.k-empty)", WEEKCOLUMNSELECTOR = "td:not(:has(.k-link))", SELECTED = "k-selected", BLUR = "blur.kendoCalendar", FOCUS = "focus", FOCUS_WITH_NS = "focus.kendoCalendar", KENDO_KEYDOWN = "kendoKeydown", MOUSEENTER = support.touch ? "touchstart" : "mouseenter", MOUSEENTER_WITH_NS = support.touch ? "touchstart.kendoCalendar" : "mouseenter.kendoCalendar", MOUSELEAVE = support.touch ? "touchend.kendoCalendar touchmove.kendoCalendar" : "mouseleave.kendoCalendar", MS_PER_MINUTE = 6e4, MS_PER_DAY = 864e5, PREVARROW = "_prevArrow", NEXTARROW = "_nextArrow", ARIA_DISABLED = "aria-disabled", ARIA_SELECTED = "aria-selected", ARIA_LABEL = "aria-label", extend = $.extend, DATE = Date, views = {
month: 0,
year: 1,
decade: 2,
century: 3
}, HEADERSELECTOR = ".k-header, .k-calendar-header", CLASSIC_HEADER_TEMPLATE = ({ actionAttr, size, isRtl }) => `<div class="k-header k-hstack">
<span tabindex="-1" data-href="#" ${actionAttr}="prev" role="button" class="k-calendar-nav-prev k-button ${size} k-button-flat k-icon-button" ${ARIA_LABEL}="Previous">${kendo.ui.icon({
icon: `chevron-${isRtl ? "right" : "left"}`,
iconClass: "k-button-icon"
})}</span></span>
<span tabindex="-1" data-href="#" ${actionAttr}="nav-up" id="` + kendo.guid() + `" role="button" class="k-calendar-nav-fast k-button ${size} k-button-flat k-flex"></span>
<span tabindex="-1" data-href="#" ${actionAttr}="next" role="button" class="k-calendar-nav-next k-button ${size} k-button-flat k-icon-button" ${ARIA_LABEL}="Next">${kendo.ui.icon({
icon: `chevron-${isRtl ? "left" : "right"}`,
iconClass: "k-button-icon"
})}</span>
</div>`, MODERN_HEADER_TEMPLATE = ({ actionAttr, size, messages, isRtl }) => `<div class="k-calendar-header">
<button ${actionAttr}="nav-up" id="` + kendo.guid() + `" class="k-calendar-title k-button ${size} k-button-flat k-button-primary">
<span class="k-button-text"></span>
</button>
<span class="k-spacer"></span>
<span class="k-calendar-nav">
<button tabindex="-1" ${actionAttr}=${isRtl ? "next" : "prev"} class="k-calendar-nav-prev k-button ${size} k-button-flat k-icon-button" aria-label="${messages.navigateToPast}">
${kendo.ui.icon({
icon: `chevron-${isRtl ? "right" : "left"}`,
iconClass: "k-button-icon"
})}
</button>
<button tabindex="-1" ${actionAttr}="today" class="k-calendar-nav-today k-button ${size} k-button-flat">
<span class="k-button-text">${kendo.htmlEncode(messages.today)}</span>
</button>
<button tabindex="-1" ${actionAttr}=${isRtl ? "prev" : "next"} class="k-calendar-nav-next k-button ${size} k-button-flat k-icon-button" aria-label="${messages.navigateToFuture}">
${kendo.ui.icon({
icon: `chevron-${isRtl ? "left" : "right"}`,
iconClass: "k-button-icon"
})}
</button>
</span>
</div>`;
var Calendar = Widget.extend({
init: function(element, options) {
var that = this, value;
options = options || {};
options.componentType = options.componentType || "classic";
Widget.fn.init.call(that, element, options);
element = that.wrapper = that.element;
options = that.options;
options.url = kendo.unescape(options.url);
that.options.disableDates = getDisabledExpr(that.options.disableDates);
that._templates();
that._selectable();
that._header();
that._viewWrapper();
if (that.options.hasFooter) that._footer(that.footer);
else {
that._today = that.element.find(".k-calendar-nav-today");
that._toggle();
}
element.addClass("k-calendar " + (options.weekNumber ? " k-week-number" : "")).on(MOUSEENTER_WITH_NS + " " + MOUSELEAVE, CELLSELECTOR, mousetoggle).on(KEYDOWN_NS, "table.k-calendar-table", that, that._move.bind(that)).on("click.kendoCalendar touchend", CELLSELECTORVALID, function(e) {
var link = e.currentTarget.firstChild, value = toDateObject(link);
if ($(link).data("href").indexOf("#") != -1) e.preventDefault();
if (that._view.name == "month" && that.options.disableDates(value)) return;
if (that._view.name != "month" || that._isSingleSelection()) that._click($(link));
}).on("mouseup.kendoCalendar", "table.k-calendar-table, .k-calendar-footer", function() {
that._focusView(that.options.focusOnNav !== false);
}).attr(ID);
if (that.options.weekNumber) element.on(CLICK, WEEKCOLUMNSELECTOR, function(e) {
var first = $(e.currentTarget).closest("tr").find(CELLSELECTORVALID).first(), last = $(e.currentTarget).closest("tr").find(CELLSELECTORVALID).last();
if (that._isMultipleSelection()) {
that.selectable._lastActive = last;
that.selectable.selectRange(first, last);
that.selectable.trigger(CHANGE, { event: e });
}
if (that._isRangeSelection()) {
that.rangeSelectable._lastActive = last;
that.rangeSelectable.range(first, last);
that.rangeSelectable.change();
}
that._current = that._value = toDateObject(last.find("span"));
that._setCurrent(that._current);
});
normalize(options);
value = parse(options.value, options.format, options.culture);
that._selectDates = [];
that._index = views[options.start];
that._current = new DATE(+restrictValue(value, options.min, options.max));
that._addClassProxy = function() {
that._active = true;
if (that._cell.hasClass(DISABLED)) {
var todayString = that._view.toDateString(getToday());
that._cell = that._cellByDate(todayString);
}
that._cell.addClass(FOCUSED);
};
that._removeClassProxy = function() {
that._active = false;
if (that._cell) that._cell.removeClass(FOCUSED);
};
that.value(value);
if (that._isMultipleSelection() && options.selectDates.length > 0) that.selectDates(options.selectDates);
that._range = options.range;
if (that._isRangeSelection()) that.selectRange(that._range);
kendo.notify(that);
Widget.fn.endInit.call(this);
},
options: {
name: "Calendar",
value: null,
min: new DATE(1900, 0, 1),
max: new DATE(2099, 11, 31),
dates: [],
disableDates: null,
allowReverse: false,
centuryCellsFormat: "long",
url: "",
culture: "",
footer: "",
format: "",
month: {},
weekNumber: false,
range: {
start: null,
end: null,
target: START
},
selectable: "single",
selectDates: [],
start: MONTH,
depth: MONTH,
size: undefined,
showOtherMonthDays: true,
animation: {
horizontal: {
effects: SLIDE,
reverse: true,
duration: 500,
divisor: 2
},
vertical: {
effects: "zoomIn",
duration: 400
}
},
messages: {
weekColumnHeader: "",
today: "Today",
navigateTo: "Navigate to ",
navigateToPast: "Navigate to previous view",
navigateToFuture: "Navigate to next view",
navigateToParentView: "parent view",
parentViews: {
month: "year view",
year: "decade view",
decade: "century view"
}
},
componentType: "classic"
},
events: [
CHANGE,
NAVIGATE,
KENDO_KEYDOWN
],
componentTypes: {
"classic": {
header: { template: CLASSIC_HEADER_TEMPLATE },
hasFooter: true,
linksSelector: ".k-button",
contentClasses: "k-calendar-table"
},
"modern": {
header: { template: MODERN_HEADER_TEMPLATE },
hasFooter: false,
linksSelector: ".k-button",
contentClasses: "k-calendar-table"
}
},
setOptions: function(options) {
let that = this, isComponentTypeChanged = false;
if (options.componentType) isComponentTypeChanged = options.componentType !== that.options.componentType;
normalize(options);
options.disableDates = getDisabledExpr(options.disableDates);
that._destroySelectable();
if (options.messages) options.messages = $.extend({}, true, that.options.messages, options.messages);
Widget.fn.setOptions.call(that, options);
that._templates();
that._selectable();
if (isComponentTypeChanged) {
let componentTypes = Calendar.prototype.componentTypes;
that.options.header = componentTypes[options.componentType].header;
that.options.hasFooter = componentTypes[options.componentType].hasFooter;
let header = that.element.find(HEADERSELECTOR)[0];
if (header) header.remove();
that._header();
}
that._viewWrapper();
if (that.options.hasFooter) that._footer(that.footer);
else {
that.element.find(".k-calendar-footer").hide();
that._toggle();
}
that._index = views[that.options.start];
that.navigate();
let value = parse(options.value || that.options.value || that._value, options.format, options.culture);
if (isComponentTypeChanged) {
that._current = new DATE(+restrictValue(value, options.min, options.max));
that._cell = null;
that._table = null;
}
that.value(value);
if (options.weekNumber) that.element.addClass("k-week-number");
},
destroy: function() {
var that = this, today = that._today;
that.element.off(ns);
that._title.off(ns);
that[PREVARROW].off(ns);
that[NEXTARROW].off(ns);
that._destroySelectable();
kendo.destroy(that._table);
if (today) kendo.destroy(today.off(ns));
Widget.fn.destroy.call(that);
},
current: function() {
return this._current;
},
view: function() {
return this._view;
},
focus: function(table) {
table = table || this._table;
this._bindTable(table);
table.trigger("focus");
},
min: function(value) {
return this._option(MIN, value);
},
max: function(value) {
return this._option("max", value);
},
navigateToPast: function() {
this._navigate(PREVARROW, -1);
},
navigateToFuture: function() {
this._navigate(NEXTARROW, 1);
},
navigateUp: function() {
var that = this, index = that._index;
if (that._title.hasClass(DISABLED)) return;
that.navigate(that._current, ++index);
},
navigateDown: function(value) {
var that = this, index = that._index, depth = that.options.depth;
if (!value) return;
if (index === views[depth]) {
if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {
that.value(value);
that.trigger(CHANGE);
}
return;
}
that.navigate(value, --index);
},
navigate: function(value, view) {
view = isNaN(view) ? views[view] : view;
var that = this, options = that.options, culture = options.culture, min = options.min, max = options.max, title = that._title, from = that._table, old = that._oldTable, currentValue = that._current, future = value && +value > +currentValue, vertical = view !== undefined && view !== that._index, to, currentView, compare, disabled, viewWrapper = that.element.children(".k-calendar-view");
if (!value) value = currentValue;
that._current = value = new DATE(+restrictValue(value, min, max));
if (view === undefined) view = that._index;
else that._index = view;
that._view = currentView = calendar.views[view];
compare = currentView.compare;
disabled = view === views[CENTURY];
title.toggleClass(DISABLED, disabled);
if (disabled) title.attr(ARIA_DISABLED, true);
else title.removeAttr(ARIA_DISABLED);
disabled = compare(value, min) < 1;
that[PREVARROW].toggleClass(DISABLED, disabled);
if (disabled) that[PREVARROW].attr(ARIA_DISABLED, true);
else that[PREVARROW].removeAttr(ARIA_DISABLED);
disabled = compare(value, max) > -1;
that[NEXTARROW].toggleClass(DISABLED, disabled);
if (disabled) that[NEXTARROW].attr(ARIA_DISABLED, true);
else that[NEXTARROW].removeAttr(ARIA_DISABLED);
if (from && old && old.data("animating")) {
old.kendoStop(true, true);
from.kendoStop(true, true);
}
that._oldTable = from;
if (!from || that._changeView) {
var messages = that.options.messages;
var titleText = currentView.title(value, min, max, culture);
title.html("<span class=\"k-button-text\">" + titleText + "</span>");
title.attr("aria-label", messages.navigateTo + messages.navigateToParentView + ": " + titleText);
if (messages.parentViews && that._view.name !== CENTURY) title.attr("title", encode(messages.navigateTo + messages.parentViews[that._view.name]));
else title.removeAttr("title");
that._table = to = $(currentView.content(extend({
min,
max,
date: value,
url: options.url,
dates: options.dates,
format: options.format,
showOtherMonthDays: options.showOtherMonthDays,
centuryCellsFormat: options.centuryCellsFormat,
culture,
disableDates: options.disableDates,
isWeekColumnVisible: options.weekNumber,
messages: options.messages,
contentClasses: that.options.contentClasses
}, that[currentView.name])));
that._aria();
var replace = from && from.data("start") === to.data("start");
that._animate({
from,
to,
vertical,
future,
replace
});
viewWrapper.removeClass("k-calendar-monthview k-calendar-yearview k-calendar-decadeview k-calendar-centuryview");
viewWrapper.addClass("k-calendar-" + currentView.name + "view");
that.trigger(NAVIGATE);
that._focus(value);
}
if (view === views[options.depth] && that._selectDates.length > 0) that._visualizeSelectedDatesInView();
if (that._isSingleSelection()) {
if (view === views[options.depth] && that._value && !that.options.disableDates(that._value)) that._selectCell(that._value);
}
that._setCurrent(value);
if (!from && that._cell) that._cell.removeClass(FOCUSED);
that._changeView = true;
},
selectDates: function(dates) {
var that = this, validSelectedDates, datesUnique;
if (dates === undefined) return that._selectDates;
datesUnique = dates.map(function(date) {
return date.getTime();
}).filter(function(date, position, array) {
return array.indexOf(date) === position;
}).map(function(time) {
return new Date(time);
});
validSelectedDates = $.grep(datesUnique, function(value) {
if (value) return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;
});
that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : datesUnique.length === 0 ? datesUnique : that._selectDates;
that._visualizeSelectedDatesInView();
},
value: function(value) {
var that = this, old = that._view, view = that._view;
if (value === undefined) return that._value;
value = that._validateValue(value);
if (value && that._isMultipleSelection()) {
var date = /* @__PURE__ */ new Date(+value);
date.setHours(0, 0, 0, 0);
that._selectDates = [date];
that.selectable._lastActive = null;
}
if (old && value === null && that._cell) that._cell.removeClass(SELECTED);
else {
that._changeView = !value || view && view.compare(value, that._current) !== 0;
that.navigate(value);
}
},
isRtl: function() {
return kendo.support.isRtl(this.wrapper);
},
_aria: function() {
var table = this._table;
table.attr("aria-labelledby", this._title.attr("id"));
if (this._view.name === "month" && this._isMultipleSelection()) table.attr("aria-multiselectable", "true");
},
_validateValue: function(value) {
var that = this, options = that.options, min = options.min, max = options.max;
if (value === null) that._current = createDate(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());
value = parse(value, options.format, options.culture);
if (value !== null) {
value = new DATE(+value);
if (!isInRange(value, min, max)) value = null;
}
if (value === null || !that.options.disableDates(/* @__PURE__ */ new Date(+value))) that._value = value;
else if (that._value === undefined) that._value = null;
return that._value;
},
_visualizeSelectedDatesInView: function() {
var that = this;
var selectedDates = {};
$.each(that._selectDates, function(index, value) {
selectedDates[kendo.calendar.views[0].toDateString(value)] = value;
});
that.selectable.clear();
var cells = that._table.find(CELLSELECTOR).filter(function(index, element) {
return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];
});
if (cells.length > 0) that.selectable._selectElement(cells, true);
},
_isSingleSelection: function() {
let selectable = this.options.selectable;
return Selectable.parseOptions(selectable).single;
},
_isMultipleSelection: function() {
let selectable = this.options.selectable;
return Selectable.parseOptions(selectable).multiple;
},
_isRangeSelection: function() {
let selectable = this.options.selectable;
return Selectable.parseOptions(selectable).range;
},
_selectable: function() {
let that = this, selectable = that.options.selectable, selectableOptions = Selectable.parseOptions(selectable);
if (!that._isMultipleSelection() && !that._isRangeSelection()) return;
if (that.rangeSelectable) {
that.rangeSelectable.destroy();
that.rangeSelectable = null;
}
if (selectableOptions.range) {
that.rangeSelectable = new RangeSelectable(that.wrapper, {
widget: that,
filter: ".k-calendar-monthview table td:has(.k-link):not(.k-disabled):not(.k-empty)",
cellSelector: CELLSELECTOR,
cellSelectorValid: CELLSELECTORVALID,
change: that._onSelect.bind(that),
reverse: that.options.allowReverse,
resetOnStart: true,
ns
});
that.element.addClass("k-calendar-range");
} else that.selectable = new Selectable(that.wrapper, {
aria: true,
inputSelectors: "input,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,.k-icon,.k-svg-icon,.k-svg-icon *",
multiple: selectableOptions.multiple,
filter: "table.k-calendar-table:eq(0) td:has(.k-link):not(.k-disabled):not(.k-empty)",
change: that._onSelect.bind(that),
relatedTarget: that._onRelatedTarget.bind(that)
});
},
_restoreSelection: function() {
const that = this;
let range;
that._preventChange = true;
if (that._isRangeSelection()) {
range = that.selectRange();
if (!range || !range.start) {
that._preventChange = false;
return;
}
that.selectRange(range);
}
that._preventChange = false;
},
selectRange: function(range) {
const that = this, view = that._view;
let startInRange, endInRange, visibleRange;
if (range === undefined) return that._range;
that._range = range;
if (!range.start) return;
visibleRange = that._visibleRange();
startInRange = that._dateInViews(range.start);
endInRange = range.end && that._dateInViews(range.end);
if (!startInRange && endInRange) that.rangeSelectable.selectTo(that._cellByDate(view.toDateString(range.end)));
if (startInRange && endInRange) that.rangeSelectable.range(that._cellByDate(view.toDateString(range.start)), that._cellByDate(view.toDateString(range.end)), false, that.options.allowReverse);
if (range.end && startInRange && !endInRange) that.rangeSelectable.selectFrom(that._cellByDate(view.toDateString(range.start)));
if (!range.end && startInRange) that.rangeSelectable.start(that._cellByDate(view.toDateString(range.start)));
if (+visibleRange.start > +range.start && +visibleRange.end < +range.end) that.rangeSelectable.mid(that.element.find(CELLSELECTORVALID));
},
_onRelatedTarget: function(target) {
var that = this;
if (that.selectable.options.multiple && target.is(CELLSELECTORVALID)) {
that._current = toDateObject(target.find("span"));
that._setCurrent(that._current);
}
},
_onSelect: function(e) {
let that = this, eventArgs = e, range, useEnd = e.sender._useEnd, useStart = e.sender._useStart, initialRange, start, end, value, target, selectableOptions = Selectable.parseOptions(that.options.selectable);
if (that._isRangeSelection()) {
range = e.sender.range();
initialRange = that.selectRange() || {};
target = initialRange.target;
if (range.start && range.start.length) start = toDateObject(range.start.find("span"));
if (range.end && range.end.length) end = toDateObject(range.end.find("span"));
if (target === END) target = START;
else target = END;
that._range = {
start: useStart ? initialRange.start : start,
end: useEnd ? initialRange.end : end,
target
};
if (!that._preventChange) that.trigger(CHANGE);
value = end || start;
if (end && !that._dateInViews(end)) value = start;
that.selectRange(that._range);
that.value(value);
return;
}
if (!selectableOptions.multiple) {
if ($(eventArgs.event.currentTarget).is("td") && !$(eventArgs.event.currentTarget).hasClass("k-selected")) $(eventArgs.event.currentTarget).addClass("k-selected");
else that._click($(eventArgs.event.currentTarget).find("span"));
return;
}
if (eventArgs.event.ctrlKey || eventArgs.event.metaKey) if ($(eventArgs.event.currentTarget).is(CELLSELECTORVALID)) that._toggleSelection($(eventArgs.event.currentTarget));
else {
that._cellsBySelector(CELLSELECTORVALID).each(function(index, element) {
var value = toDateObject($(element).find("span"));
that._deselect(value);
});
that._addSelectedCellsToArray();
}
else if (eventArgs.event.shiftKey) that._rangeSelection(that._cell);
else if ($(eventArgs.event.currentTarget).is(CELLSELECTOR)) that.value(toDateObject($(eventArgs.event.currentTarget).find("span")));
else {
that._selectDates = [];
that._addSelectedCellsToArray();
}
that.trigger(CHANGE);
},
_destroySelectable: function() {
var that = this;
if (that.selectable) {
that.selectable.destroy();
that.selectable = null;
}
if (that.rangeSelectable) {
that.rangeSelectable.destroy();
that.rangeSelectable = null;
}
},
_toggleSelection: function(currentCell) {
var that = this, date = toDateObject(currentCell.find("span"));
if (currentCell.hasClass("k-selected")) that._selectDates.push(date);
else that._deselect(date);
},
_rangeSelection: function(toDateCell, startDate) {
var that = this, fromDate = startDate || toDateObject(that.selectable.value().first().find("span")), toDate = toDateObject(toDateCell.find("span")), daysDifference;
if (that.selectable._lastActive || that._value) fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find("span")) : /* @__PURE__ */ new Date(+that._value);
else that.selectable._lastActive = startDate ? that._cellByDate(that._view.toDateString(startDate), CELLSELECTORVALID) : that.selectable.value().first();
that._selectDates = [];
daysDifference = daysBetweenTwoDates(fromDate, toDate);
addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);
that._visualizeSelectedDatesInView();
},
_visibleRange: function() {
let table = this.element.find(".k-calendar-view table");
return {
start: toDateObject(table.first().find(CELLSELECTOR).first().find("span")),
end: toDateObject(table.last().find(CELLSELECTOR).last().find("span"))
};
},
_cellsBySelector: function(selector) {
return this._table.find(selector);
},
_addSelectedCellsToArray: function() {
var that = this;
that.selectable.value().each(function(index, item) {
var date = toDateObject($(item.firstChild));
if (!that.options.disableDates(date)) that._selectDates.push(date);
});
},
_deselect: function(date) {
var that = this;
var currentDateIndex = that._selectDates.map(Number).indexOf(+date);
if (currentDateIndex != -1) that._selectDates.splice(currentDateIndex, 1);
},
_dateInView: function(date) {
var that = this, firstDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID).first().find("span")), lastDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID).last().find("span"));
return +date <= +lastDateInView && +date >= +firstDateInView;
},
_isNavigatable: function(currentValue, cellIndex) {
var that = this;
var isDisabled = that.options.disableDates;
var cell;
var index;
if (that._view.name == "month") return !isDisabled(currentValue);
else {
index = that.wrapper.find(".k-focus").index();
cell = that.wrapper.find(".k-calendar-table td").eq(index + cellIndex);
return cell.is(CELLSELECTORVALID) || !isDisabled(currentValue);
}
},
_dateInViews: function(date) {
let tables = this.element.find(".k-calendar-view table"), firstDateInView = toDateObject(tables.first().find(CELLSELECTOR).first().find("span")), lastDateInView = toDateObject(tables.last().find(CELLSELECTOR).last().find("span"));
date = new Date(date.toDateString());
return +date <= +lastDateInView && +date >= +firstDateInView;
},
_move: function(e) {
var that = this;
if (!kendo.keyDownHandler(e, that)) return;
var options = that.options, key = e.keyCode, view = that._view, index = that._index, min = that.options.min, max = that.options.max, currentValue = new DATE(+that._current), isRtl = that.isRtl(), isDisabled = that.options.disableDates, value, prevent, method, temp, cell, lastActive;
if (e.target === that._table[0]) that._active = true;
if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {
value = 1;
prevent = true;
} else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {
value = -1;
prevent = true;
} else if (key == keys.UP) {
value = index === 0 ? -7 : -4;
prevent = true;
} else if (key == keys.DOWN) {
value = index === 0 ? 7 : 4;
prevent = true;
} else if (key == keys.SPACEBAR) {
value = 0;
prevent = true;
} else if (key == keys.HOME || key == keys.END) {
method = key == keys.HOME ? "first" : "last";
temp = view[method](currentValue);
currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());
currentValue.setFullYear(temp.getFullYear());
prevent = true;
} else if (key === 84) {
that._todayClick(e);
prevent = true;
}
if (e.ctrlKey || e.metaKey) {
if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {
that.navigateToFuture();
prevent = true;
} else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {
that.navigateToPast();
prevent = true;
} else if (key == keys.UP) {
that.navigateUp();
prevent = true;
} else if (key == keys.DOWN) {
that._click($(that._cell[0].firstChild));
prevent = true;
} else if ((key == keys.ENTER || key == keys.SPACEBAR) && that._isMultipleSelection()) {
that._keyboardToggleSelection(e);
var focusedDate = toDateObject($(that._cell[0]).find("span"));
that._setCurrent(focusedDate);
}
} else if (e.shiftKey) {
if (value !== undefined || method) {
if (!method) view.setDate(currentValue, value);
if (!isInRange(currentValue, min, max)) currentValue = restrictValue(currentValue, options.min, options.max);
if (isDisabled(currentValue)) currentValue = that._nextNavigatable(currentValue, value);
min = createDate(min.getFullYear(), min.getMonth(), min.getDate());
if (that._isMultipleSelection()) that._keyboardRangeSelection(e, currentValue);
else if (that._isRangeSelection()) {
if (!that._dateInViews(currentValue)) if (value > 0) that.navigateToFuture();
else that.navigateToPast();
} else that._focus(currentValue);
}
if (that.rangeSelectable) {
cell = that._cellByDate(view.toDateString(currentValue));
lastActive = toDateObject(that.rangeSelectable._lastActive.find("span"));
if (!that._dateInViews(lastActive)) if (+lastActive > +currentValue) {
that.rangeSelectable._end = that.rangeSelectable._lastActive;
that.rangeSelectable.selectFrom(cell);
} else that.rangeSelectable.selectTo(cell);
else {
if (that.rangeSelectable._end && that.rangeSelectable._end.is(".k-focus")) that.rangeSelectable._lastActive = that.rangeSelectable._start;
else that.rangeSelectable._lastActive = that._cellByDate(view.toDateString(lastActive));
that.rangeSelectable.range(that.rangeSelectable._lastActive, cell);
}
that.rangeSelectable.change();
that._setCurrent(currentValue);
}
} else {
if (key == keys.ENTER || key == keys.SPACEBAR) {
if (view.name == "month" && that._isMultipleSelection()) {
that.value(toDateObject($(that._cell.find("span"))));
that.selectable._lastActive = $(that._cell[0]);
that.trigger(CHANGE);
} else if (that.rangeSelectable) that.rangeSelectable.change();
else that._click($(that._cell[0].firstChild));
prevent = true;
} else if (key == keys.PAGEUP) {
prevent = true;
that.navigateToPast();
} else if (key == keys.PAGEDOWN) {
prevent = true;
that.navigateToFuture();
}
if (value || method) {
if (!method) view.setDate(currentValue, value);
min = createDate(min.getFullYear(), min.getMonth(), min.getDate());
if (!isInRange(currentValue, min, max)) currentValue = restrictValue(currentValue, options.min, options.max);
if (!that._isNavigatable(currentValue, value)) currentValue = that._nextNavigatable(currentValue, value);
if (that._isMultipleSelection()) if (!that._dateInView(currentValue)) that.navigate(currentValue);
else {
that._current = currentValue;
that._setCurrent(currentValue);
}
else that._focus(currentValue);
}
}
if (prevent) e.preventDefault();
return that._current;
},
_keyboardRangeSelection: function(event, currentValue) {
var that = this, fromDate, daysDifference;
if (!that._dateInView(currentValue)) {
that._selectDates = [];
fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find("span")) : currentValue;
daysDifference = daysBetweenTwoDates(fromDate, /* @__PURE__ */ new Date(+currentValue));
addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);
that.navigate(currentValue);
that._current = currentValue;
that.selectable._lastActive = that.selectable._lastActive || that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID);
that.trigger(CHANGE);
return;
}
that.selectable.options.filter = that.wrapper.find("table").length > 1 && +currentValue > +that._current ? "table.k-calendar-table:eq(1) td:has(.k-link):not(.k-disabled):not(.k-empty)" : "table.k-calendar-table:eq(0) td:has(.k-link):not(.k-disabled):not(.k-empty)";
that._setCurrent(currentValue);
that._current = currentValue;
that._rangeSelection(that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID), currentValue);
that.trigger(CHANGE);
that.selectable.options.filter = "table.k-calendar-table:eq(0) td:has(.k-link):not(.k-disabled):not(.k-empty)";
},
_keyboardToggleSelection: function(event) {
var that = this;
event.currentTarget = that._cell[0];
that.selectable._lastActive = $(that._cell[0]);
if ($(that._cell[0]).hasClass(SELECTED)) that.selectable._unselect($(that._cell[0]));
else that.selectable.value($(that._cell[0]));
that.selectable.trigger(CHANGE, { event });
},
_nextNavigatable: function(currentValue, value) {
var that = this, disabled = true, view = that._view, min = that.options.min, max = that.options.max, isDisabled = that.options.disableDates, navigatableDate = new Date(currentValue.getTime());
view.setDate(navigatableDate, -value);
while (disabled) {
view.setDate(currentValue, value);
if (!isInRange(currentValue, min, max)) {
currentValue = navigatableDate;
break;
}
disabled = isDisabled(currentValue);
}
return currentValue;
},
_animate: function(options) {
var that = this;
var from = options.from;
var to = options.to;
var active = that._active;
var viewWrapper = that.element.children(".k-calendar-view");
if (!from) {
viewWrapper.append(to);
that._bindTable(to);
} else if (from.parent().data("animating")) {
from.off(ns);
from.parent().kendoStop(true, true).remove();
from.remove();
viewWrapper.append(to);
that._focusView(active);
} else if (!from.is(":visible") || that.options.animation === false || options.replace) {
to.insertAfter(from);
from.off(ns).remove();
that._focusView(active);
} else that[options.vertical ? "_vertical" : "_horizontal"](from, to, options.future);
},
_horizontal: function(from, to, future) {
var that = this, active = that._active, horizontal = that.options.animation.horizontal, effects = horizontal.effects, viewWidth = outerWidth(from), margin = outerWidth(from, true) - viewWidth;
if (effects && effects.indexOf(SLIDE) != -1) {
from.add(to).css({ width: viewWidth });
from.wrap("<div/>");
that._focusView(active, from);
from.parent().css({
position: "relative",
width: viewWidth * 2 + 2 * margin,
display: "flex",
[future ? "margin-right" : "margin-left"]: -viewWidth - margin
});
to[future ? "insertAfter" : "insertBefore"](from);
extend(horizontal, {
effects: "slideIn:" + (future ? "right" : LEFT),
complete: function() {
from.off(ns).remove();
that._oldTable = null;
to.unwrap();
that._focusView(active);
}
});
from.parent().kendoStop(true, true).kendoAnimate(horizontal);
}
},
_vertical: function(from, to) {
var that = this, vertical = that.options.animation.vertical, effects = vertical.effects, active = that._active, cell, position;
if (effects && effects.indexOf("zoom") != -1) {
to.insertBefore(from);
from.css({
position: "absolute",
width: to.width()
});
cell = that._cellByDate(that._view.toDateString(that._current));
position = cell.position();
position = position.left + parseInt(cell.width() / 2, 10) + "px " + (position.top + parseInt(cell.height() / 2, 10) + "px");
to.css(transitionOrigin, position);
from.kendoStop(true, true).kendoAnimate({
effects: "fadeOut",
duration: 600,
complete: function() {
from.off(ns).remove();
that._oldTable = null;
that._focusView(active);
}
});
to.kendoStop(true, true).kendoAnimate(vertical);
}
},
_cellByDate: function(value, selector) {
return this._table.find(selector ? selector : "td:not(.k-other-month)").filter(function() {
return $(this.firstChild).attr(kendo.attr(VALUE)) === value;
});
},
_selectCell: function(date) {
var that = this, cell = that._selectedCell, value = that._view.toDateString(date);
if (cell && cell[0]) {
cell[0].removeAttribute(ARIA_SELECTED);
cell.removeClass(SELECTED);
}
cell = that._cellByDate(value, CELLSELECTOR);
that._selectedCell = cell;
cell.addClass(SELECTED).attr(ARIA_SELECTED, true);
},
_setCurrent: function(date) {
var that = this, id = kendo.guid(), cell = that._cell, value = that._view.toDateString(date);
if (cell && cell[0]) {
cell.removeClass(FOCUSED);
cell[0].removeAttribute(ARIA_LABEL);
cell[0].removeAttribute(ID);
}
cell = that._cellByDate(value, that._isMultipleSelection() ? CELLSELECTOR : "td:not(.k-other-month)");
that._cell = cell;
cell.attr(ID, id).addClass(FOCUSED);
if (that._table[0]) {
that._table[0].removeAttribute("aria-activedescendant");
that._table.attr("aria-activedescendant", id);
}
},
_bindTable: function(table) {
table.on(FOCUS_WITH_NS, this._addClassProxy).on(BLUR, this._removeClassProxy);
},
_click: function(link) {
var that = this, options = that.options, currentValue = /* @__PURE__ */ new Date(+that._current), value = toDateObject(link);
adjustDST(value, 0);
if (that._view.name == "month" && that.options.disableDates(value)) value = that._value;
that._view.setDate(currentValue, value);
that.navigateDown(restrictValue(currentValue, options.min, options.max));
},
_focus: function(value) {
var that = this;
if (that._view.compare(value, that._current) !== 0) that.navigate(value);
else {
that._current = value;
that._setCurrent(value);
}
},
_focusView: function(active, table) {
if (active) this.focus(table);
},
_viewWrapper: function() {
var element = this.element;
var viewWrapper = element.children(".k-calendar-view");
if (!viewWrapper[0]) viewWrapper = $("<div class='k-calendar-view k-align-items-start k-justify-content-center k-hstack' />").insertAfter(element.find(HEADERSELECTOR));
},
_footer: function(template) {
var that = this, today = getToday(), element = that.element, footer = element.find(".k-calendar-footer");
if (!template) {
that._toggle(false);
footer.hide();
return;
}
if (!footer[0]) footer = $(`<div class="k-calendar-footer">
<button tabindex="-1" class="k-calendar-nav-today k-flex k-button k-button-flat k-button-primary">
<span class="k-button-text"></span>
</button>
</div>`).appendTo(element);
that._today = footer.show().find(".k-button-flat.k-button-primary").attr("title", kendo.toString(today, "D", that.options.culture));
footer.find(".k-button-text").html(template(today));
that._toggle();
},
_header: function() {
var that = this, element = that.element, linksSelector = that.options.linksSelector;
if (!element.find(HEADERSELECTOR)[0]) element.html(kendo.template(that.options.header.template)($.extend(true, {}, that.options, {
actionAttr: kendo.attr("action"),
size: kendo.getValidCssClass("k-button-", "size", that.options.size),
isRtl: that.isRtl()
})));
element.find(linksSelector).on("click.kendoCalendar touchend.kendoCalendar", function() {
return false;
});
that._title = element.find("[" + kendo.attr("action") + "=\"nav-up\"]").on("click.kendoCalendar touchend.kendoCalendar", function() {
that._active = that.options.focusOnNav !== false;
that.navigateUp();
});
that[PREVARROW] = element.find("[" + kendo.attr("action") + "=\"prev\"]").on("click.kendoCalendar touchend.kendoCalendar", function() {
that._active = that.options.focusOnNav !== false;
that.navigateToPast();
});
that[NEXTARROW] = element.find("[" + kendo.attr("action") + "=\"next\"]").on("click.kendoCalendar touchend.kendoCalendar", function() {
that._active = that.options.focusOnNav !== false;
that.navigateToFuture();
});
element.find("[" + kendo.attr("action") + "=\"today\"]").on("click.kendoCalendar touchend.kendoCalendar", that._todayClick.bind(that));
},
_navigate: function(arrow, modifier) {
var that = this, index = that._index + 1, currentValue = new DATE(+that._current);
if (that._isMultipleSelection()) {
currentValue = toDateObject(that._table.find("td:not(.k-other-month):not(.k-empty)").has(".k-link").first().find("span"));
that._current = /* @__PURE__ */ new Date(+currentValue);
}
arrow = that[arrow];
if (!arrow.hasClass(DISABLED)) {
if (index > 3) currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);
else calendar.views[index].setDate(currentValue, modifier);
that.navigate(currentValue);
that._restoreSelection();
}
},
_option: function(option, value) {
var that = this, options = that.options, currentValue = that._value || that._current, isBigger;
if (value === undefined) return options[option];
value = parse(value, options.format, options.culture);
if (!value) return;
options[option] = new DATE(+value);
if (option === MIN) isBigger = value > currentValue;
else isBigger = currentValue > value;
if (isBigger || isEqualMonth(currentValue, value)) {
if (isBigger) that._value = null;
that._changeView = true;
}
if (!that._changeView) that._changeView = !!(options.month.content || options.month.empty);
that.navigate(that._value);
that._toggle();
},
_toggle: function(toggle) {
var that = this, options = that.options, isTodayDisabled = that.options.disableDates(getToday()), link = that._today, todayClass = that._todayClass();
if (toggle === undefined) toggle = isInRange(getToday(), options.min, options.max);
if (link) {
link.off(CLICK);
if (toggle && !isTodayDisabled) link.addClass(todayClass).removeClass(DISABLED).on(CLICK, that._todayClick.bind(that));
else link.removeClass(todayClass).addClass(DISABLED).on(CLICK, prevent);
}
},
_todayClass: function() {
return TODAY;
},
_todayClick: function(e) {
var that = this, depth = views[that.options.depth], disabled = that.options.disableDates, today = getToday();
e.preventDefault();
if (disabled(today)) return;
if (that._view.compare(that._current, today) === 0 && that._index == depth) that._changeView = false;
if (that._isMultipleSelection()) {
that._selectDates = [today];
that.selectable._lastActive = null;
}
that._value = today;
that.navigate(today, depth);
that.trigger(CHANGE);
},
_templates: function() {
var that = this, options = that.options, footer = options.footer, month = options.month, content = month.content, weekNumber = month.weekNumber, empty = month.empty, footerTemplate = (data) => `${kendo.toString(data, "D", options.culture)}`;
that.month = {
content: (data) => `<td class="${data.cssClass}" role="gridcell"${data.ariaDisabled ? " aria-disabled=\"true\"" : ""}><span tabindex="-1" class="k-link ${data.linkClass}" data-href="${data.url}" ${kendo.attr(VALUE)}="${data.dateString}" title="${data.title}">${executeTemplate(content, data) || data.value}</span></td>`,
empty: (data) => `<td role="gridcell">${executeTemplate(empty, data) || " "}</td>`,
weekNumber: (data) => `<td class="k-calendar-td k-alt">${executeTemplate(weekNumber, data) || data.weekNumber}</td>`
};
that.year = { content: template((data) => `<td class="${data.cssClass}" role="gridcell"><span tabindex="-1" class="k-link" data-href="#" data-${data.ns}value="${data.dateString}" aria-label="${data.label}">${data.value}</span></td>`) };
if (footer && footer !== true) footerTemplate = footer;
that.footer = footer !== false ? template(footerTemplate, { useWithBlock: false }) : null;
},
_updateAria: function(ariaTemplate, date) {
var that = this;
var cell = that._cell;
var valueType = that.view().valueType();
var current = date || that.current();
var text;
if (valueType === "month") text = kendo.toString(current, "MMMM");
else if (valueType === "date") text = kendo.toString(current, "D");
else text = cell.text();
cell.attr("aria-label", ariaTemplate({
current,
valueType,
text
}));
return cell.attr("id");
}
});
ui.plugin(Calendar);
var calendar = {
firstDayOfMonth: function(date) {
return createDate(date.getFullYear(), date.getMonth(), 1);
},
firstVisibleDay: function(date, calendarInfo) {
calendarInfo = calendarInfo || kendo.culture().calendar;
var firstDay = calendarInfo.firstDay, firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
firstVisibleDay.setFullYear(date.getFullYear());
while (firstVisibleDay.getDay() != firstDay) calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);
return firstVisibleDay;
},
setTime: function(date, time) {
var tzOffsetBefore = date.getTimezoneOffset(), resultDATE = new DATE(date.getTime() + time), tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;
date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);
},
views: [
{
name: MONTH,
title: function(date, min, max, culture) {
return getCalendarInfo(culture).months.names[date.getMonth()] + " " + date.getFullYear();
},
content: function(options) {
var that = this, idx = 0, min = options.min, max = options.max, date = options.date, dates = options.dates, format = options.format, culture = options.culture, navigateUrl = options.url, showHeader = options.showHeader, showOtherMonthDays = options.showOtherMonthDays, isWeekColumnVisible = options.isWeekColumnVisible, hasUrl = navigateUrl && dates[0], currentCalendar = getCalendarInfo(culture), firstDayIdx = currentCalendar.firstDay, days = currentCalendar.days, names = shiftArray(days.names, firstDayIdx), shortNames = shiftArray(days.namesShort, firstDayIdx), start = calendar.firstVisibleDay(date, currentCalendar), firstDayOfMonth = that.first(date), lastDayOfMonth = that.last(date), toDateString = that.toDateString, today = getToday(), html = "<table tabindex=\"0\" role=\"grid\" class=\"" + options.contentClasses + "\" cellspacing=\"0\" data-start=\"" + toDateString(start) + "\">";
if (showHeader) html += "<caption class=\"k-calendar-caption k-month-header\">" + this.title(date, min, max, culture) + "</caption>";
html += "<thead class=\"k-calendar-thead\" role=\"rowgroup\"><tr role=\"row\" class=\"k-calendar-tr\">";
if (isWeekColumnVisible) html += "<th scope=\"col\" role=\"columnheader\" class=\"k-calendar-th k-alt\" aria-label=\"" + encode(options.messages.weekColumnHeader || "") + "\">" + encode(options.messages.weekColumnHeader) + "</th>";
for (; idx < 7; idx++) html += "<th scope=\"col\" role=\"columnheader\" class=\"k-calendar-th\" aria-label=\"" + names[idx] + "\">" + shortNames[idx] + "</th>";
adjustDST(today, 0);
today = +today;
return view({
cells: 42,
perRow: 7,
html: html += "</tr></thead><tbody class=\"k-calendar-tbody\" role=\"rowgroup\"><tr role=\"row\" class=\"k-calendar-tr\">",
start: createDate(start.getFullYear(), start.getMonth(), start.getDate()),
isWeekColumnVisible,
weekNumber: options.weekNumber,
min: createDate(min.getFullYear(), min.getMonth(), min.getDate()),
max: createDate(max.getFullYear(), max.getMonth(), max.getDate()),
showOtherMonthDays,
content: options.content,
lastDayOfMonth,
empty: options.empty,
setter: that.setDate,
disableDates: options.disableDates,
build: function(date, idx, disableDates) {
var cssClass = ["k-calendar-td"], day = date.getDay(), linkClass = "", url = "#";
if (date < firstDayOfMonth || date > lastDayOfMonth) cssClass.push(OTHERMONTH);
var isDisabled = disableDates(date);
if (isDisabled) cssClass.push(DISABLED);
if (+date === today) cssClass.push("k-today");
if (day === 0 || day === 6) cssClass.push("k-weekend");
if (hasUrl && inArray(+date, dates)) {
url = navigateUrl.replace("{0}", kendo.toString(date, format, culture));
linkClass = " k-action-link";
}
return {
date,
dates,
ns: kendo.ns,
title: kendo.toString(date, "D", culture),
value: date.getDate(),
dateString: toDateString(date),
cssClass: cssClass.join(" "),
linkClass,
url,
ariaDisabled: isDisabled || undefined
};
},
weekNumberBuild: function(date) {
return {
weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),
currentDate: date
};
}
});
},
first: function(date) {
return calendar.firstDayOfMonth(date);
},
last: function(date) {
var last = createDate(date.getFullYear(), date.getMonth() + 1, 0), first = calendar.firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());
if (timeOffset) last.setHours(first.getHours() + timeOffset / 60);
return last;
},
compare: function(date1, date2) {
var result, month1 = date1.getMonth(), year1 = date1.getFullYear(), month2 = date2.getMonth(), year2 = date2.getFullYear();
if (year1 > year2) result = 1;
else if (year1 < year2) result = -1;
else result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;
return result;
},
setDate: function(date, value) {
var hours = date.getHours();
if (value instanceof DATE) date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());
else calendar.setTime(date, value * MS_PER_DAY);
adjustDST(date, hours);
},
toDateString: function(date) {
return date.getFullYear() + "/" + date.getMonth() + "/" + date.getDate();
},
valueType: function() {
return "date";
}
},
{
name: "year",
title: function(date) {
return date.getFullYear();
},
content: function(options) {
var calendarMonths = getCalendarInfo(options.culture).months, namesAbbr = calendarMonths.namesAbbr, namesFull = calendarMonths.names, toDateString = this.toDateString, min = options.min, max = options.max, html = "";
if (options.showHeader) {
html += "<table tabindex=\"0\" role=\"grid\" class=\"k-calendar-table\" cellspacing=\"0\">";
html += "<caption class=\"k-calendar-caption k-meta-header\">";
html += this.title(options.date);
html += "</caption>";
html += "<tbody class=\"k-calendar-tbody\" role=\"rowgroup\">";
html += "<tr role=\"row\" class=\"k-calendar-tr\">";
}
return view({
min: createDate(min.getFullYear(), min.getMonth(), 1),
max: createDate(max.getFullYear(), max.getMonth(), 1),
start: createDate(options.date.getFullYear(), 0, 1),
html,
setter: this.setDate,
content: options.content,
build: function(date) {
var cssClass = ["k-calendar-td"], todayDate = getToday();
if (date.getFullYear() === todayDate.getFullYear() && date.getMonth() === todayDate.getMonth()) cssClass.push("k-today");
return {
value: namesAbbr[date.getMonth()],
label: namesFull[date.getMonth()],
ns: kendo.ns,
dateString: toDateString(date),
cssClass: cssClass.join(" ")
};
}
});
},
first: function(date) {
return createDate(date.getFullYear(), 0, date.getDate());
},
last: function(date) {
return createDate(date.getFullYear(), 11, date.getDate());
},
compare: function(date1, date2) {
return compare(date1, date2);
},
setDate: function(date, value) {
var month, hours = date.getHours();
if (value instanceof DATE) {
month = value.getMonth();
date.setFullYear(value.getFullYear(), month, date.getDate());
if (month !== date.getMonth()) date.setDate(0);
} else {
month = date.getMonth() + value;
date.setMonth(month);
if (month > 11) month -= 12;
if (month > 0 && date.getMonth() != month) date.setDate(0);
}
adjustDST(date, hours);
},
toDateString: function(date) {
return date.getFullYear() + "/" + date.getMonth() + "/1";
},
valueType: function() {
return "month";
}
},
{
name: "decade",
title: function(date, min, max) {
return title(date, min, max, 10);
},
content: function(options) {
var year = options.date.getFullYear(), toDateString = this.toDateString, html = "";
if (options.showHeader) {
html += "<table tabindex=\"0\" role=\"grid\" class=\"k-calendar-table\" cellspacing=\"0\">";
html += "<caption class=\"k-meta-header\">";
html += this.title(options.date, options.min, options.max);
html += "</caption>";
html += "<tbody class=\"k-calendar-thead\">";
html += "<tr role=\"row\" class=\"k-calendar-tr\">";
}
return view({
start: createDate(year - year % 10, 0, 1),
min: createDate(options.min.getFullYear(), 0, 1),
max: createDate(options.max.getFullYear(), 0, 1),
showOtherMonthDays: options.showOtherMonthDays,
html,
setter: this.setDate,
build: function(date, idx) {
var cssClass = ["k-calendar-td"], todayYear = getToday().getFullYear();
if (idx === 10 || idx === 11) cssClass.push(EMPTYCELL);
else if (date.getFullYear() === todayYear) cssClass.push("k-today");
return {
value: date.getFullYear(),
ns: kendo.ns,
dateString: toDateString(date),
cssClass: cssClass.join(" ")
};
}
});
},
first: function(date) {
var year = date.getFullYear();
return createDate(year - year % 10, date.getMonth(), date.getDate());
},
last: function(date) {
var year = date.getFullYear();
return createDate(year - year % 10 + 9, date.getMonth(), date.getDate());
},
compare: function(date1, date2) {
return compare(date1, date2, 10);
},
setDate: function(date, value) {
setDate(date, value, 1);
},
toDateString: function(date) {
return date.getFullYear() + "/0/1";
},
valueType: function() {
return "year";
}
},
{
name: CENTURY,
title: function(date, min, max) {
return title(date, min, max, 100);
},
content: function(options) {
var year = options.date.getFullYear(), min = options.min.getFullYear(), max = options.max.getFullYear(), toDateString = this.toDateString, minYear = min, maxYear = max, html = "";
minYear = minYear - minYear % 10;
maxYear = maxYear - maxYear % 10;
if (maxYear - minYear < 10) maxYear = minYear + 9;
if (options.showHeader) {
html += "<table tabindex=\"0\" role=\"grid\" class=\"k-calendar-table\" cellspacing=\"0\">";
html += "<caption class=\"k-calendar-caption k-meta-header\">";
html += this.title(options.date, options.min, options.max);
html += "</caption>";
html += "<tbody class=\"k-calendar-tbody\">";
html += "<tr role=\"row\" class=\"k-calendar-tr\">";
}
var todayDecadeStart = getToday().getFullYear() - getToday().getFullYear() % 10;
return view({
start: createDate(year - year % 100, 0, 1),
min: createDate(minYear, 0, 1),
max: createDate(maxYear, 0, 1),
showOtherMonthDays: options.showOtherMonthDays,
html,
setter: this.setDate,
build: function(date, idx) {
var cssClass = ["k-calendar-td"];
var start = date.getFullYear(), end = start + 9;
if (idx === 10 || idx === 11) cssClass.push(EMPTYCELL);
else if (start <= todayDecadeStart && end >= todayDecadeStart) cssClass.push("k-today");
if (start < min) start = min;
if (end > max) end = max;
return {
ns: kendo.ns,
value: options.centuryCellsFormat === "long" ? `${start} - ${end}` : start,
dateString: toDateString(date),
cssClass: cssClass.join(" ")
};
}
});
},
first: function(date) {
var year = date.getFullYear();
return createDate(year - year % 100, date.getMonth(), date.getDate());
},
last: function(date) {
var year = date.getFullYear();
return createDate(year - year % 100 + 99, date.getMonth(), date.getDate());
},
compare: function(date1, date2) {
return compare(date1, date2, 100);
},
setDate: function(date, value) {
setDate(date, value, 10);
},
toDateString: function(date) {
var year = date.getFullYear();
return year - year % 10 + "/0/1";
},
valueType: function() {
return "decade";
}
}
]
};
function title(date, min, max, modular) {
var start = date.getFullYear(), minYear = min.getFullYear(), maxYear = max.getFullYear(), end;
start = start - start % modular;
end = start + (modular - 1);
if (start < minYear) start = minYear;
if (end > maxYear) end = maxYear;
return start + "-" + end;
}
function view(options) {
var idx = 0, data, min = options.min, max = options.max, start = options.start, setter = options.setter, build = options.build, weekNumberBuild = options.weekNumberBuild, length = options.cells || 12, isWeekColumnVisible = options.isWeekColumnVisible, cellsPerRow = options.perRow || 4, showOtherMonthDays = options.showOtherMonthDays, lastDayOfMonth = options.lastDayOfMonth, weekNumber = options.weekNumber || weekNumberTemplate, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, otherMonthTemplate = options.otherMonthCellTemplate || otherMonthCellTemplate, html = options.html || "<table tabindex=\"0\" role=\"grid\" class=\"k-calendar-table\" cellspacing=\"0\"><tbody class=\"k-calendar-tbody\" role=\"rowgroup\"><tr role=\"row\" class=\"k-calendar-tr\">";
if (isWeekColumnVisible) html += weekNumber(weekNumberBuild(start));
for (; idx < length; idx++) {
if (idx > 0 && idx % cellsPerRow === 0) {
html += "</tr><tr role=\"row\" class=\"k-calendar-tr\">";
if (isWeekColumnVisible) html += showOtherMonthDays || +start <= +lastDayOfMonth ? weekNumber(weekNumberBuild(start)) : weekNumber({ weekNumber: " " });
}
start = createDate(start.getFullYear(), start.getMonth(), start.getDate());
adjustDST(start, 0);
data = build(start, idx, options.disableDates);
if (data.cssClass.indexOf(OTHERMONTH) !== -1 && !showOtherMonthDays) html += otherMonthTemplate(data);
else if (isInRange(start, min, max) && data.cssClass.indexOf(EMPTYCELL) === -1) html += content(data);
else html += empty(data);
setter(start, 1);
}
return html + "</tr></tbody></table>";
}
function compare(date1, date2, modifier) {
var year1 = date1.getFullYear(), start = date2.getFullYear(), end = start, result = 0;
if (modifier) {
start = start - start % modifier;
end = start - start % modifier + modifier - 1;
}
if (year1 > end) result = 1;
else if (year1 < start) result = -1;
return result;
}
function getToday() {
var today = new DATE();
return new DATE(today.getFullYear(), today.getMonth(), today.getDate());
}
function restrictValue(value, min, max) {
var today = getToday();
if (value) today = new DATE(+value);
if (min > today) today = new DATE(+min);
else if (max < today) today = new DATE(+max);
return today;
}
function isInRange(date, min, max) {
return +date >= +min && +date <= +max;
}
function shiftArray(array, idx) {
return array.slice(idx).concat(array.slice(0, idx));
}
function setDate(date, value, multiplier) {
value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;
date.setFullYear(value);
}
function daysBetweenTwoDates(startDate, endDate) {
if (+endDate < +startDate) {
var temp = +startDate;
calendar.views[0].setDate(startDate, endDate);
calendar.views[0].setDate(endDate, new Date(temp));
}
var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());
var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());
return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);
}
function addDaysToArray(array, numberOfDays, fromDate, disableDates) {
for (var i = 0; i <= numberOfDays; i++) {
var nextDay = new Date(fromDate.getTime());
nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));
if (!disableDates(nextDay)) array.push(nextDay);
}
}
function mousetoggle(e) {
if (!$(this).hasClass("k-disabled")) $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);
}
function prevent(e) {
e.preventDefault();
}
function createDate(year, month, date) {
var dateObject = new DATE(year, month, date);
dateObject.setFullYear(year, month, date);
return dateObject;
}
function getCalendarInfo(culture) {
return getCulture(culture).calendars.standard;
}
function normalize(options) {
var start = views[options.start], depth = views[options.depth], culture = getCulture(options.culture);
options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);
if (isNaN(start)) {
start = 0;
options.start = MONTH;
}
if (depth === undefined || depth > start) options.depth = MONTH;
if (options.dates === null) options.dates = [];
}
function inArray(date, dates) {
for (var i = 0, length = dates.length; i < length; i++) if (date === +dates[i]) return true;
return false;
}
function isEqualDatePart(value1, value2) {
if (value1) return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth() && value1.getDate() === value2.getDate();
return false;
}
function isEqualMonth(value1, value2) {
if (value1) return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth();
return false;
}
function getDisabledExpr(option) {
if (kendo.isFunction(option)) return option;
if (Array.isArray(option)) return createDisabledExpr(option);
return $.noop;
}
function convertDatesArray(dates) {
var result = [];
for (var i = 0; i < dates.length; i++) result.push(dates[i].setHours(0, 0, 0, 0));
return result;
}
function createDisabledExpr(dates) {
var callback, disabledDates = [], days = [
"su",
"mo",
"tu",
"we",
"th",
"fr",
"sa"
];
if (dates[0] instanceof DATE) {
disabledDates = convertDatesArray(dates);
callback = (date) => !!(date && disabledDates.indexOf(new Date(date).setHours(0, 0, 0, 0)) > -1);
} else {
disabledDates = dates.map((day) => {
day = day.slice(0, 2).toLowerCase();
let index = days.indexOf(day);
if (index > -1) return index;
});
callback = (date) => !!(date && disabledDates.indexOf(new Date(date).getDay()) > -1);
}
return callback;
}
function isEqualDate(oldValue, newValue) {
if (oldValue instanceof Date && newValue instanceof Date) {
oldValue = oldValue.getTime();
newValue = newValue.getTime();
}
return oldValue === newValue;
}
function toDateObject(link) {
var value = $(link).attr(kendo.attr(VALUE)).split("/");
value = createDate(value[0], value[1], value[2]);
return value;
}
function executeTemplate(tmpl, data) {
if (tmpl) {
if (kendo.isFunction(tmpl)) return tmpl(data);
return template(tmpl)(data);
}
return undefined;
}
calendar.isEqualDatePart = isEqualDatePart;
calendar.isEqualDate = isEqualDate;
calendar.restrictValue = restrictValue;
calendar.isInRange = isInRange;
calendar.normalize = normalize;
calendar.viewsEnum = views;
calendar.disabled = getDisabledExpr;
calendar.toDateObject = toDateObject;
calendar.getToday = getToday;
calendar.createDate = createDate;
kendo.calendar = calendar;
})(window.kendo.jQuery);
var kendo_calendar_default = kendo;
//#endregion
exports.__meta__ = __meta__;
exports.default = kendo_calendar_default;