@progress/kendo-ui
Version:
This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.
662 lines (515 loc) • 21.7 kB
JavaScript
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__(1204);
/***/ }),
/***/ 3:
/***/ (function(module, exports) {
module.exports = function() { throw new Error("define cannot be used indirect"); };
/***/ }),
/***/ 1113:
/***/ (function(module, exports) {
module.exports = require("./kendo.userevents");
/***/ }),
/***/ 1204:
/***/ (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__(1113) ], __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: "drawer",
name: "Drawer",
category: "web",
description: "The Kendo Drawer widget provides slide to reveal sidebar",
depends: [ "userevents" ]
};
(function($, undefined) {
var kendo = window.kendo,
ui = kendo.ui,
Widget = ui.Widget,
SHOW = "show",
HIDE = "hide",
NS = ".kendoDrawer",
FOCUSED = "k-state-focused",
keys = kendo.keys,
ITEMCLICK = "itemClick",
TABINDEX = "tabIndex",
PUSH = "push",
OVERLAY = "overlay",
LEFT = "left",
RIGHT = "right";
var Drawer = kendo.ui.Widget.extend({
init: function(element, options) {
var that = this;
var userEvents;
Widget.fn.init.call(this, element, options);
options = that.options;
that._element(element);
that._wrapper(element);
that._navigatable();
that.position();
that._mode();
if (options.mini) {
that._miniMode();
}
that._initDrawerItems();
if (options.mini && options.mode != PUSH) {
that._setBodyOffset();
}
userEvents = this.userEvents = new kendo.UserEvents(options.mode != PUSH ? $(document.body) : this.drawerContainer, { fastTap: true, allowSelection: true });
that.tap = function(e) {
if ($.contains(that.drawerItemsWrapper[0], e.event.target)) {
that._itemClick(e);
}
if (options.autoCollapse && that.visible && !that.trigger("hide", { sender: this })) {
that.hide();
e.preventDefault();
}
};
if (this.options.swipeToOpen) {
userEvents.bind("start", function(e) { that._start(e); });
userEvents.bind("move", function(e) { that._update(e); });
userEvents.bind("end", function(e) { that._end(e); });
userEvents.bind("tap", that.tap);
} else {
userEvents.bind("press", that.tap);
}
if (options.minHeight && options.mode == PUSH) {
that.drawerContainer.css("min-height", options.minHeight);
}
},
_element: function() {
var that = this;
var element = that.element;
var options = that.options;
var contentElement = that.contentElement = element.children().first();
that.drawerElement = $(options.template);
contentElement.addClass("k-drawer-content");
element.addClass("k-widget k-drawer");
},
_navigatable: function() {
if (!this.options.navigatable) {
return;
}
var that = this;
var element = that.element;
var drawerItems = element.find("[data-role='drawer-item']");
element.find("[data-role='drawer-separator']").attr("aria-hidden", true);
drawerItems.attr("role","tab");
drawerItems.first().parent()
.attr("role", "tablist")
.attr("aria-orientation", "vertical");
element
.attr(TABINDEX, 0)
.on("focus" + NS, that._focus.bind(that))
.on("focusout" + NS, that._blur.bind(that))
.on("keydown" + NS, that, that._keyDown.bind(that));
},
_blur: function() {
var that = this;
if (that._current) {
that._current.removeClass(FOCUSED);
}
},
_focus: function() {
var that = this;
that._setCurrent(that._current ? that._current : that.drawerItemsWrapper.find("[data-role='drawer-item']").eq(0));
},
_setCurrent: function(current) {
var that = this;
var id = kendo.guid();
var next = $(current);
if (that._current) {
$(that._current)
.removeClass(FOCUSED)
.removeAttr("id");
that.element.removeAttr("aria-activedescendant");
}
next
.attr("id", id)
.addClass(FOCUSED);
that.element.attr("aria-activedescendant", id);
that._current = next;
},
_keyDown: function(e) {
var that = this;
var handled = false;
var current = that._current;
var next;
if (e.keyCode == keys.UP) {
handled = true;
next = current.prevAll("[data-role='drawer-item']").first();
if (next.length) {
that._setCurrent(next);
} else {
that._setCurrent(current.parent().find("[data-role='drawer-item']").last());
}
}
if (e.keyCode == keys.DOWN) {
handled = true;
next = current.nextAll("[data-role='drawer-item']").first();
if (next.length) {
that._setCurrent(next);
} else {
that._setCurrent(current.parent().find("[data-role='drawer-item']").first());
}
}
if (e.keyCode == keys.HOME) {
handled = true;
that._setCurrent(that.drawerItemsWrapper.find("[data-role='drawer-item']").eq(0));
}
if (e.keyCode == keys.END) {
handled = true;
that._setCurrent(that.drawerItemsWrapper.find("[data-role='drawer-item']").last());
}
if (e.keyCode == keys.SPACEBAR || e.keyCode == keys.ENTER) {
handled = true;
that.tap({
event: { target: current[0] },
preventDefault: $.noop
});
}
if (e.keyCode == keys.ESC) {
handled = true;
that.hide();
}
if (handled) {
//prevent scrolling while pressing the keys
e.preventDefault();
}
},
_wrapper: function() {
var options = this.options;
var drawerElement = this.drawerElement;
var element = this.element;
var contentElement = this.contentElement;
var drawerItemsWrapper = this.drawerItemsWrapper = drawerElement.wrapAll("<div class='k-drawer-items'></div>").parent();
var drawerWrapper = this.drawerWrapper = drawerItemsWrapper.wrap("<div class='k-drawer-wrapper'></div>").parent();
var drawerContainer = this.drawerContainer = element.wrap("<div class='k-drawer-container'></div>").parent();
if (options.mini) {
if (options.mini.width) {
drawerWrapper.width(options.mini.width);
}
} else {
drawerWrapper.width(0);
}
if (options.mode === PUSH) {
drawerContainer.append(contentElement);
}
else if (options.mode === OVERLAY) {
drawerContainer.after(contentElement);
$(document.body).prepend(drawerContainer);
}
element.append( drawerWrapper );
},
_setBodyOffset: function() {
var overlayMiniOffset = this.element.outerWidth();
if (this.leftPositioned) {
$(document.body).css("padding-left", overlayMiniOffset);
}
else {
$(document.body).css("padding-right", overlayMiniOffset);
}
},
_initDrawerItems: function() {
var drawerItemsWrapper = this.drawerItemsWrapper;
var drawerItems = drawerItemsWrapper.find("[data-role='drawer-item']");
var separatorItems = drawerItemsWrapper.find("[data-role='drawer-separator']");
drawerItems.addClass("k-drawer-item");
separatorItems.addClass("k-drawer-item k-drawer-separator");
if (this._selectedItemIndex >= 0) {
drawerItems.removeClass("k-state-selected");
drawerItems.eq(this._selectedItemIndex).addClass("k-state-selected");
}
if (this.options.navigatable) {
drawerItems.attr("aria-selected", false);
}
},
_mode: function() {
var options = this.options;
var drawerContainer = this.drawerContainer;
var overlayContainer;
if (options.mode == PUSH) {
drawerContainer.addClass('k-drawer-' + PUSH);
}
else {
drawerContainer.addClass('k-drawer-' + OVERLAY);
overlayContainer = this.overlayContainer = $('<div class="k-overlay"></div>');
overlayContainer.hide();
drawerContainer.prepend(overlayContainer);
}
},
_miniMode: function() {
var options = this.options;
var drawerContainer = this.drawerContainer;
var miniWidth = options.mini.width;
var miniTemplate = this._miniTemplate = options.mini.template && $(options.mini.template);
var drawerItemsWrapper = this.drawerItemsWrapper;
var drawerWrapper = this.drawerWrapper;
drawerContainer.addClass("k-drawer-mini");
if (miniTemplate) {
drawerItemsWrapper.html(miniTemplate);
}
if (miniWidth) {
drawerWrapper.width(miniWidth);
}
this.minWidth = options.mini.width || this.drawerWrapper.width();
},
show: function() {
var drawerWrapper = this.drawerWrapper;
var drawerContainer = this.drawerContainer;
var options = this.options;
var isExpanded = drawerContainer.hasClass("k-drawer-expanded");
var miniTemplate = this._miniTemplate;
var drawerElement = this.drawerElement;
var drawerItemsWrapper = this.drawerItemsWrapper;
if (!isExpanded) {
drawerContainer.addClass('k-drawer-expanded');
this.visible = true;
}
if (miniTemplate) {
drawerItemsWrapper.html(drawerElement);
this._initDrawerItems();
this._selectItem();
}
drawerWrapper.width(options.width);
if (options.mode === OVERLAY) {
this.overlayContainer.show();
this.visible = true;
}
},
hide: function() {
var that = this;
var drawerWrapper = that.drawerWrapper;
var drawerContainer = that.drawerContainer;
var options = this.options;
var drawerItemsWrapper = this.drawerItemsWrapper;
var miniTemplate = this._miniTemplate;
var miniWidth = options.mini && options.mini.width;
if (this._miniTemplate) {
drawerItemsWrapper.html(miniTemplate);
that._initDrawerItems();
this._selectItem();
}
if (options.mini) {
if (miniWidth) {
drawerWrapper.width(miniWidth);
} else {
drawerWrapper.width("");
}
} else {
drawerWrapper.width(0);
}
if (this.visible) {
drawerContainer.removeClass('k-drawer-expanded');
this.visible = false;
}
if (options.mode === OVERLAY) {
this.overlayContainer.hide();
}
},
position: function(value) {
var that = this;
var options = that.options;
var position = value || options.position;
var drawerContainer = that.drawerContainer;
if (position == RIGHT) {
drawerContainer.removeClass('k-drawer-' + LEFT);
drawerContainer.addClass('k-drawer-' + RIGHT);
}
else {
drawerContainer.removeClass('k-drawer-' + RIGHT);
drawerContainer.addClass('k-drawer-' + LEFT);
}
this.leftPositioned = position === LEFT;
},
_start: function(e) {
var that = this;
var options = this.options;
var drawerWrapper = this.drawerWrapper;
var drawerItemsWrapper = this.drawerItemsWrapper;
var userEvents = e.sender;
// ignore non-horizontal swipes
if (Math.abs(e.x.velocity) < Math.abs(e.y.velocity) || kendo.triggeredByInput(e.event)) {
userEvents.cancel();
return;
}
if (this.drawerMini) {
drawerItemsWrapper.html(that.drawerElement);
}
drawerWrapper.css("transition", "none");
if (options.mode != PUSH) {
this.overlayContainer.show();
}
},
_update: function(e) {
var options = this.options;
var mode = options.mode;
if (mode == PUSH) {
this._push(e);
}
else {
this._overlay(e);
}
},
_end: function(e) {
var velocity = e.x.velocity;
var options = this.options;
var drawerWrapper = this.drawerWrapper;
var elementWidth = drawerWrapper.width();
var pastHalf = elementWidth > options.width / 2;
var velocityThreshold = 0.8;
var shouldShow;
drawerWrapper.css("transition", "all .3s ease-out");
if (this.leftPositioned) {
shouldShow = velocity > -velocityThreshold && (velocity > velocityThreshold || pastHalf);
}
else {
shouldShow = velocity < velocityThreshold && (velocity < -velocityThreshold || pastHalf);
}
if (shouldShow) {
if (this.trigger("show", { sender: this })) {
e.preventDefault();
this.hide();
} else {
this.show();
}
} else {
if (this.trigger("hide", { sender: this })) {
e.preventDefault();
this.show();
} else {
this.hide();
}
}
},
_overlay: function(moveEventArgs) {
var options = this.options;
var minWidth = (options.mini && options.mini.width) || this.minWidth || 0;
var drawerWrapper = this.drawerWrapper;
var elementWidth = drawerWrapper.width();
var limitedPosition;
var updatedPosition;
updatedPosition = elementWidth + (this.leftPositioned ? moveEventArgs.x.delta : -moveEventArgs.x.delta);
limitedPosition = Math.min(Math.max(updatedPosition, minWidth), options.width);
moveEventArgs.event.preventDefault();
moveEventArgs.event.stopPropagation();
drawerWrapper.width(limitedPosition);
},
_push: function(moveEventArgs) {
var options = this.options;
var minWidth = (options.mini && options.mini.width) || this.minWidth || 0;
var drawerWrapper = this.drawerWrapper;
var elementWidth = drawerWrapper.width();
var limitedPosition;
var updatedPosition;
updatedPosition = elementWidth + (this.leftPositioned ? moveEventArgs.x.delta : -moveEventArgs.x.delta);
limitedPosition = Math.min(Math.max(updatedPosition, minWidth), options.width);
moveEventArgs.event.preventDefault();
moveEventArgs.event.stopPropagation();
drawerWrapper.width(limitedPosition);
},
_selectItem: function(item) {
var selectedItemIndex;
if (item) {
item.addClass("k-state-selected");
this.trigger("itemClick", { item: item, sender: this });
this._selectedItemIndex = item.index();
return;
}
selectedItemIndex = this._selectedItemIndex;
if (selectedItemIndex) {
this.drawerItemsWrapper.find("[data-role='drawer-item']").eq(selectedItemIndex).addClass("k-state-selected");
}
},
_itemClick: function(e) {
var that = this;
var item;
var items;
if ($(e.event.target).find(".k-drawer-item").length > 0) {
item = $(e.event.target).find(".k-drawer-item");
}
else if ($(e.event.target).closest(".k-drawer-item").length > 0) {
item = $(e.event.target).closest(".k-drawer-item");
}
else if ($(e.event.target).hasClass(".k-drawer-item")) {
item = $(e.event.target);
}
items = that.drawerItemsWrapper.find(".k-drawer-item").removeClass("k-state-selected");
that._selectItem(item);
if (that.options.navigatable) {
items.attr("aria-selected", false);
item.attr("aria-selected", true);
that._setCurrent(item);
}
},
destroy: function() {
var options = this.options;
if (options.mode != PUSH) {
if (this.leftPositioned) {
$(document.body).css("padding-left", 0);
}
else {
$(document.body).css("padding-right", 0);
}
}
Widget.fn.destroy.call(this);
this.userEvents.destroy();
kendo.destroy(this.element);
this.element = this.drawerWrapper = this.drawerElement = this.drawerContainer = this.drawerItemsWrapper = this._miniTemplate = null;
},
options: {
name: "Drawer",
autoCollapse: true,
position: LEFT,
mode: "overlay",
swipeToOpen: true,
width: 280,
mini: false,
navigatable: false,
template: ""
},
events: [
HIDE,
SHOW,
ITEMCLICK
]
});
kendo.ui.plugin(Drawer);
})(window.kendo.jQuery);
return window.kendo;
}, __webpack_require__(3));
/***/ })
/******/ });