UNPKG

@progress/kendo-ui

Version:

This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.

1,069 lines (845 loc) 33.7 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(1352); /***/ }), /***/ 3: /***/ (function(module, exports) { module.exports = function() { throw new Error("define cannot be used indirect"); }; /***/ }), /***/ 1038: /***/ (function(module, exports) { module.exports = require("./kendo.popup"); /***/ }), /***/ 1119: /***/ (function(module, exports) { module.exports = require("./kendo.dateinput"); /***/ }), /***/ 1352: /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1038), __webpack_require__(1119) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); })(function(){ var __meta__ = { // jshint ignore:line id: "timepicker", name: "TimePicker", category: "web", description: "The TimePicker widget allows the end user to select a value from a list of predefined values or to type a new value.", depends: [ "popup" ] }; (function($, undefined) { var kendo = window.kendo, keys = kendo.keys, parse = kendo.parseDate, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, support = kendo.support, browser = support.browser, ui = kendo.ui, Widget = ui.Widget, OPEN = "open", CLOSE = "close", CHANGE = "change", ns = ".kendoTimePicker", CLICK = "click" + ns, DEFAULT = "k-state-default", DISABLED = "disabled", READONLY = "readonly", LI = "li", SPAN = "<span/>", FOCUSED = "k-state-focused", HOVER = "k-state-hover", HOVEREVENTS = "mouseenter" + ns + " mouseleave" + ns, MOUSEDOWN = "mousedown" + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, SELECTED = "k-state-selected", STATEDISABLED = "k-state-disabled", ARIA_SELECTED = "aria-selected", ARIA_EXPANDED = "aria-expanded", ARIA_HIDDEN = "aria-hidden", ARIA_DISABLED = "aria-disabled", ARIA_ACTIVEDESCENDANT = "aria-activedescendant", ID = "id", isArray = $.isArray, extend = $.extend, proxy = $.proxy, DATE = Date, TODAY = new DATE(); TODAY = new DATE(TODAY.getFullYear(), TODAY.getMonth(), TODAY.getDate(), 0, 0, 0); var TimeView = function(options) { var that = this, id = options.id; that.options = options; that._dates = []; that.ul = $('<ul tabindex="-1" role="listbox" aria-hidden="true" unselectable="on" class="k-list k-reset"/>') .css({ overflow: support.kineticScrollNeeded ? "": "auto" }) .on(CLICK, LI, proxy(that._click, that)) .on("mouseenter" + ns, LI, function() { $(this).addClass(HOVER); }) .on("mouseleave" + ns, LI, function() { $(this).removeClass(HOVER); }); that.list = $("<div class='k-list-container k-list-scroller' unselectable='on'/>") .append(that.ul) .on(MOUSEDOWN, preventDefault); if (id) { that._timeViewID = id + "_timeview"; that._optionID = id + "_option_selected"; that.ul.attr(ID, that._timeViewID); } that._popup(); that._heightHandler = proxy(that._height, that); that.template = kendo.template('<li tabindex="-1" role="option" class="k-item" unselectable="on">#=data#</li>', { useWithBlock: false }); }; TimeView.prototype = { current: function(candidate) { var that = this, active = that.options.active; if (candidate !== undefined) { if (that._current) { that._current .removeClass(SELECTED); if(that._current && that._current.length) { that._current[0].removeAttribute(ID); that._current[0].removeAttribute(ARIA_SELECTED); } } if (candidate) { candidate = $(candidate).addClass(SELECTED) .attr(ID, that._optionID) .attr(ARIA_SELECTED, true); that.scroll(candidate[0]); } that._current = candidate; if (active) { active(candidate); } } else { return that._current; } }, close: function() { this.popup.close(); }, destroy: function() { var that = this; that.ul.off(ns); that.list.off(ns); that.popup.destroy(); }, open: function() { var that = this; var popupHovered; if (!that.ul[0].firstChild) { that.bind(); } // In some cases when the popup is opened resize is triggered which will cause it to close // Setting the below flag will prevent this from happening // Reference: https://github.com/telerik/kendo/pull/7553 popupHovered = that.popup._hovered; that.popup._hovered = true; that.popup.open(); setTimeout(function() { that.popup._hovered = popupHovered; }, 1); if (that._current) { that.scroll(that._current[0]); } }, dataBind: function(dates) { var that = this, options = that.options, format = options.format, toString = kendo.toString, template = that.template, length = dates.length, idx = 0, date, html = ""; for (; idx < length; idx++) { date = dates[idx]; if (isInRange(date, options.min, options.max)) { html += template(toString(date, format, options.culture)); } } that._html(html); }, refresh: function() { var that = this, options = that.options, format = options.format, offset = dst(), ignoreDST = offset < 0, min = options.min, max = options.max, msMin = getMilliseconds(min), msMax = getMilliseconds(max), msLastTime = getMilliseconds(lastTimeOption(options.interval)), msInterval = options.interval * MS_PER_MINUTE, toString = kendo.toString, template = that.template, start = new DATE(+min), startDate = new DATE(start), msStart, lastIdx, idx = 0, length, html = ""; if (ignoreDST) { length = (MS_PER_DAY + (offset * MS_PER_MINUTE)) / msInterval; } else { length = MS_PER_DAY / msInterval; } if (msMin != msMax || msLastTime === msMax) { if (msMin > msMax) { msMax += MS_PER_DAY; } length = ((msMax - msMin) / msInterval) + 1; } lastIdx = parseInt(length, 10); for (; idx < length; idx++) { if (idx) { setTime(start, msInterval, ignoreDST); } if (msMax && lastIdx == idx) { msStart = getMilliseconds(start); if (startDate < start) { msStart += MS_PER_DAY; } if (msStart > msMax) { start = new DATE(+max); } } that._dates.push(getMilliseconds(start)); html += template(toString(start, format, options.culture)); } that._html(html); }, bind: function() { var that = this, dates = that.options.dates; if (dates && dates[0]) { that.dataBind(dates); } else { that.refresh(); } }, _html: function(html) { var that = this; that.ul[0].innerHTML = html; that.popup.unbind(OPEN, that._heightHandler); that.popup.one(OPEN, that._heightHandler); that.current(null); that.select(that._value); }, scroll: function(item) { if (!item) { return; } var content = this.list[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight; if (contentScrollTop > itemOffsetTop) { contentScrollTop = itemOffsetTop; } else if (bottomDistance > (contentScrollTop + contentOffsetHeight)) { contentScrollTop = (bottomDistance - contentOffsetHeight); } content.scrollTop = contentScrollTop; }, select: function(li) { var that = this, options = that.options, current = that._current, selection; if (li instanceof Date) { li = kendo.toString(li, options.format, options.culture); } if (typeof li === "string") { if (!current || current.text() !== li) { li = $.grep(that.ul[0].childNodes, function(node) { return (node.textContent || node.innerText) == li; }); li = li[0] ? li : null; } else { li = current; } } selection = that._distinctSelection(li); that.current(selection); }, _distinctSelection: function(selection) { var that = this, currentValue, selectionIndex; if (selection && selection.length > 1) { currentValue = getMilliseconds(that._value); selectionIndex = $.inArray(currentValue, that._dates); selection = that.ul.children()[selectionIndex]; } return selection; }, setOptions: function(options) { var old = this.options; options.min = parse(options.min); options.max = parse(options.max); this.options = extend(old, options, { active: old.active, change: old.change, close: old.close, open: old.open }); this.bind(); }, toggle: function() { var that = this; if (that.popup.visible()) { that.close(); } else { that.open(); } }, value: function(value) { var that = this; that._value = value; if (that.ul[0].firstChild) { that.select(value); } }, _click: function(e) { var that = this, li = $(e.currentTarget), date = li.text(), dates = that.options.dates; if (dates && dates.length > 0) { date = dates[li.index()]; } if (!e.isDefaultPrevented()) { that.select(li); that.options.change(date, true); that.close(); } }, _height: function() { var that = this; var list = that.list; var parent = list.parent(".k-animation-container"); var height = that.options.height; if (that.ul[0].children.length) { list.add(parent) .show() .height(that.ul[0].scrollHeight > height ? height : "auto") .hide(); } }, _parse: function(value) { var that = this, options = that.options, min = getMilliseconds(options.min) != getMilliseconds(TODAY) ? options.min : null, max = getMilliseconds(options.max) != getMilliseconds(TODAY) ? options.max : null, current = that._value || min || max || TODAY; if (value instanceof DATE) { return value; } value = parse(value, options.parseFormats, options.culture); if (value) { value = new DATE(current.getFullYear(), current.getMonth(), current.getDate(), value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds()); } return value; }, _adjustListWidth: function() { var list = this.list, width = list[0].style.width, wrapper = this.options.anchor, computedStyle, computedWidth, outerWidth = kendo._outerWidth; if (!list.data("width") && width) { return; } computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0; computedWidth = computedStyle ? parseFloat(computedStyle.width) : outerWidth(wrapper); if (computedStyle && (browser.mozilla || browser.msie)) { // getComputedStyle returns different box in FF and IE. computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth); } width = computedWidth - (outerWidth(list) - list.width()); list.css({ fontFamily: wrapper.css("font-family"), width: width }) .data("width", width); }, _popup: function() { var that = this, list = that.list, options = that.options, anchor = options.anchor; that.popup = new ui.Popup(list, extend(options.popup, { anchor: anchor, open: options.open, close: options.close, animation: options.animation, isRtl: support.isRtl(options.anchor) })); }, move: function(e) { var that = this, key = e.keyCode, ul = that.ul[0], current = that._current, down = key === keys.DOWN; if (key === keys.UP || down) { if (e.altKey) { that.toggle(down); return; } else if (down) { current = current ? current[0].nextSibling : ul.firstChild; } else { current = current ? current[0].previousSibling : ul.lastChild; } if (current) { that.select(current); } that.options.change(that._current.text()); e.preventDefault(); } else if (key === keys.ENTER || key === keys.TAB || key === keys.ESC) { e.preventDefault(); if (current) { that.options.change(current.text(), true); } that.close(); } } }; function setTime(date, time, ignoreDST) { var offset = date.getTimezoneOffset(), offsetDiff; date.setTime(date.getTime() + time); if (!ignoreDST) { offsetDiff = date.getTimezoneOffset() - offset; date.setTime(date.getTime() + offsetDiff * MS_PER_MINUTE); } } function dst() { var today = new DATE(), midnight = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0), noon = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 12, 0, 0); return -1 * (midnight.getTimezoneOffset() - noon.getTimezoneOffset()); } function getMilliseconds(date) { return date.getHours() * 60 * MS_PER_MINUTE + date.getMinutes() * MS_PER_MINUTE + date.getSeconds() * 1000 + date.getMilliseconds(); } function lastTimeOption(interval) { var date = new Date(2100, 0, 1); date.setMinutes(-interval); return date; } function isInRange(value, min, max) { var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue; if (!value || msMin == msMax) { return true; } msValue = getMilliseconds(value); if (msMin > msValue) { msValue += MS_PER_DAY; } if (msMax < msMin) { msMax += MS_PER_DAY; } return msValue >= msMin && msValue <= msMax; } TimeView.getMilliseconds = getMilliseconds; kendo.TimeView = TimeView; var TimePicker = Widget.extend({ init: function(element, options) { var that = this, ul, timeView, disabled; Widget.fn.init.call(that, element, options); element = that.element; options = that.options; options.min = parse(element.attr("min")) || parse(options.min); options.max = parse(element.attr("max")) || parse(options.max); normalize(options); that._initialOptions = extend({}, options); that._wrapper(); that.timeView = timeView = new TimeView(extend({}, options, { id: element.attr(ID), anchor: that.wrapper, format: options.format, change: function(value, trigger) { if (trigger) { that._change(value); } else { element.val(value); } }, open: function(e) { that.timeView._adjustListWidth(); if (that.trigger(OPEN)) { e.preventDefault(); } else { element.attr(ARIA_EXPANDED, true); ul.attr(ARIA_HIDDEN, false); } }, close: function(e) { if (that.trigger(CLOSE)) { e.preventDefault(); } else { element.attr(ARIA_EXPANDED, false); ul.attr(ARIA_HIDDEN, true); } }, active: function(current) { if(element && element.length) { element[0].removeAttribute(ARIA_ACTIVEDESCENDANT); } if (current) { element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID); } } })); ul = timeView.ul; that._icon(); that._reset(); try { element[0].setAttribute("type", "text"); } catch(e) { element[0].type = "text"; } element.addClass("k-input") .attr({ "role": "combobox", "aria-expanded": false, "aria-owns": timeView._timeViewID, "autocomplete": "off" }); disabled = element.is("[disabled]") || $(that.element).parents("fieldset").is(':disabled'); if (disabled) { that.enable(false); } else { that.readonly(element.is("[readonly]")); } if (options.dateInput) { var min = options.min; var max = options.max; var today = new DATE(); if (getMilliseconds(min) == getMilliseconds(max)) { min = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0); max = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 24, 0, 0); } that._dateInput = new ui.DateInput(element, { culture: options.culture, format: options.format, min: min, max: max, value: options.value }); } that._old = that._update(options.value || that.element.val()); that._oldText = element.val(); kendo.notify(that); }, options: { name: "TimePicker", min: TODAY, max: TODAY, format: "", dates: [], parseFormats: [], value: null, interval: 30, height: 200, animation: {}, dateInput: false }, events: [ OPEN, CLOSE, CHANGE ], setOptions: function(options) { var that = this; var value = that._value; Widget.fn.setOptions.call(that, options); options = that.options; normalize(options); that.timeView.setOptions(options); if (value) { that.element.val(kendo.toString(value, options.format, options.culture)); } }, dataBind: function(dates) { if (isArray(dates)) { this.timeView.dataBind(dates); } }, _editable: function(options) { var that = this, disable = options.disable, readonly = options.readonly, arrow = that._arrow.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns); if (that._dateInput) { that._dateInput._unbindInput(); } if (!readonly && !disable) { wrapper .addClass(DEFAULT) .removeClass(STATEDISABLED) .on(HOVEREVENTS, that._toggleHover); if(element && element.length) { element[0].removeAttribute(DISABLED); element[0].removeAttribute(READONLY); } element.attr(ARIA_DISABLED, false) .on("keydown" + ns, proxy(that._keydown, that)) .on("focusout" + ns, proxy(that._blur, that)) .on("focus" + ns, function() { that._inputWrapper.addClass(FOCUSED); }); if (that._dateInput) { that._dateInput._bindInput(); } arrow.on(CLICK, proxy(that._click, that)) .on(MOUSEDOWN, preventDefault); } else { wrapper .addClass(disable ? STATEDISABLED : DEFAULT) .removeClass(disable ? DEFAULT : STATEDISABLED); element.attr(DISABLED, disable) .attr(READONLY, readonly) .attr(ARIA_DISABLED, disable); } }, readonly: function(readonly) { this._editable({ readonly: readonly === undefined ? true : readonly, disable: false }); }, enable: function(enable) { this._editable({ readonly: false, disable: !(enable = enable === undefined ? true : enable) }); }, destroy: function() { var that = this; Widget.fn.destroy.call(that); that.timeView.destroy(); that.element.off(ns); that._arrow.off(ns); that._inputWrapper.off(ns); if (that._form) { that._form.off("reset", that._resetHandler); } }, close: function() { this.timeView.close(); }, open: function() { this.timeView.open(); }, min: function (value) { return this._option("min", value); }, max: function (value) { return this._option("max", value); }, value: function(value) { var that = this; if (value === undefined) { return that._value; } that._old = that._update(value); if (that._old === null) { that.element.val(""); } that._oldText = that.element.val(); }, _blur: function() { var that = this, value = that.element.val(); that.close(); if (value !== that._oldText) { that._change(value); } that._inputWrapper.removeClass(FOCUSED); }, _click: function() { var that = this, element = that.element; that.timeView.toggle(); if (!support.touch && element[0] !== activeElement()) { element.trigger("focus"); } }, _change: function(value) { var that = this, oldValue = that.element.val(), dateChanged; value = that._update(value); dateChanged = !kendo.calendar.isEqualDate(that._old, value); var valueUpdated = dateChanged && !that._typing; var textFormatted = oldValue !== that.element.val(); if (valueUpdated || textFormatted) { that.element.trigger(CHANGE); } if (dateChanged) { that._old = value; that._oldText = that.element.val(); that.trigger(CHANGE); } that._typing = false; }, _icon: function() { var that = this, element = that.element, arrow; arrow = element.next("span.k-select"); if (!arrow[0]) { arrow = $('<span unselectable="on" class="k-select" aria-label="select"><span class="k-icon k-i-clock"></span></span>').insertAfter(element); } that._arrow = arrow.attr({ "role": "button", "aria-controls": that.timeView._timeViewID }); }, _keydown: function(e) { var that = this, key = e.keyCode, timeView = that.timeView, value = that.element.val(); if (timeView.popup.visible() || e.altKey) { timeView.move(e); if (that._dateInput && e.stopImmediatePropagation) { e.stopImmediatePropagation(); } } else if (key === keys.ENTER && value !== that._oldText) { that._change(value); } else { that._typing = true; } }, _option: function(option, value) { var that = this, options = that.options; if (value === undefined) { return options[option]; } value = that.timeView._parse(value); if (!value) { return; } value = new DATE(+value); options[option] = value; that.timeView.options[option] = value; that.timeView.bind(); }, _toggleHover: function(e) { $(e.currentTarget).toggleClass(HOVER, e.type === "mouseenter"); }, _update: function(value) { var that = this, options = that.options, timeView = that.timeView, date = timeView._parse(value); if (!isInRange(date, options.min, options.max)) { date = null; } that._value = date; if (that._dateInput && date) { that._dateInput.value(date || value); } else { that.element.val(kendo.toString(date || value, options.format, options.culture)); } timeView.value(date); return date; }, _wrapper: function() { var that = this, element = that.element, wrapper; wrapper = element.parents(".k-timepicker"); if (!wrapper[0]) { wrapper = element.wrap(SPAN).parent().addClass("k-picker-wrap k-state-default"); wrapper = wrapper.wrap(SPAN).parent(); } wrapper[0].style.cssText = element[0].style.cssText; that.wrapper = wrapper.addClass("k-widget k-timepicker") .addClass(element[0].className); element.css({ width: "100%", height: element[0].style.height }); that._inputWrapper = $(wrapper[0].firstChild); }, _reset: function() { var that = this, element = that.element, formId = element.attr("form"), form = formId ? $("#" + formId) : element.closest("form"); if (form[0]) { that._resetHandler = function() { that.value(element[0].defaultValue); that.max(that._initialOptions.max); that.min(that._initialOptions.min); }; that._form = form.on("reset", that._resetHandler); } } }); function normalize(options) { var parseFormats = options.parseFormats; options.format = extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.t); parseFormats = isArray(parseFormats) ? parseFormats : [parseFormats]; parseFormats.splice(0, 0, options.format); options.parseFormats = parseFormats; } function preventDefault(e) { e.preventDefault(); } ui.plugin(TimePicker); })(window.kendo.jQuery); return window.kendo; }, __webpack_require__(3)); /***/ }) /******/ });