@progress/kendo-ui
Version:
This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.
514 lines (394 loc) • 15.9 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__(1307);
/***/ }),
/***/ 3:
/***/ (function(module, exports) {
module.exports = function() { throw new Error("define cannot be used indirect"); };
/***/ }),
/***/ 1006:
/***/ (function(module, exports) {
module.exports = require("./kendo.core");
/***/ }),
/***/ 1040:
/***/ (function(module, exports) {
module.exports = require("./kendo.userevents");
/***/ }),
/***/ 1307:
/***/ (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__(1006), __webpack_require__(1040) ], __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: "selectable",
name: "Selectable",
category: "framework",
depends: [ "core", "userevents" ],
advanced: true
};
(function ($, undefined) {
var kendo = window.kendo,
Widget = kendo.ui.Widget,
proxy = $.proxy,
abs = Math.abs,
ARIASELECTED = "aria-selected",
SELECTED = "k-state-selected",
ACTIVE = "k-state-selecting",
SELECTABLE = "k-selectable",
CHANGE = "change",
NS = ".kendoSelectable",
UNSELECT = "unselect",
UNSELECTING = "k-state-unselecting",
INPUTSELECTOR = "input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up,label.k-checkbox-label.k-no-text,.k-icon.k-i-collapse,.k-icon.k-i-expand",
msie = kendo.support.browser.msie,
supportEventDelegation = false;
(function($) {
(function() {
$('<div class="parent"><span /></div>')
.on("click", ">*", function() {
supportEventDelegation = true;
})
.find("span")
.trigger("click")
.end()
.off();
})();
})($);
var Selectable = Widget.extend({
init: function(element, options) {
var that = this,
multiple;
Widget.fn.init.call(that, element, options);
that._marquee = $("<div class='k-marquee'><div class='k-marquee-color'></div></div>");
that._lastActive = null;
that.element.addClass(SELECTABLE);
that.relatedTarget = that.options.relatedTarget;
multiple = that.options.multiple;
if (this.options.aria && multiple) {
that.element.attr("aria-multiselectable", true);
}
that.userEvents = new kendo.UserEvents(that.element, {
global: true,
allowSelection: true,
filter: (!supportEventDelegation ? "." + SELECTABLE + " " : "") + that.options.filter,
tap: proxy(that._tap, that),
touchAction: multiple ? "none" : "pan-x pan-y"
});
if (multiple) {
that.userEvents
.bind("start", proxy(that._start, that))
.bind("move", proxy(that._move, that))
.bind("end", proxy(that._end, that))
.bind("select", proxy(that._select, that));
}
},
events: [CHANGE, UNSELECT],
options: {
name: "Selectable",
filter: ">*",
inputSelectors: INPUTSELECTOR,
multiple: false,
relatedTarget: $.noop
},
_isElement: function(target) {
var elements = this.element;
var idx, length = elements.length, result = false;
target = target[0];
for (idx = 0; idx < length; idx ++) {
if (elements[idx] === target) {
result = true;
break;
}
}
return result;
},
_tap: function(e) {
var target = $(e.target),
that = this,
ctrlKey = e.event.ctrlKey || e.event.metaKey,
multiple = that.options.multiple,
shiftKey = multiple && e.event.shiftKey,
selected,
whichCode = e.event.which,
buttonCode = e.event.button;
//in case of hierarchy or right-click
if (!that._isElement(target.closest("." + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {
return;
}
if (!this._allowSelection(e.event.target)) {
return;
}
selected = target.hasClass(SELECTED);
if (!multiple || !ctrlKey) {
that.clear();
}
target = target.add(that.relatedTarget(target));
if (shiftKey) {
that.selectRange(that._firstSelectee(), target, e);
} else {
if (selected && ctrlKey) {
that._unselect(target);
that._notify(CHANGE, e);
} else {
that.value(target, e);
}
that._lastActive = that._downTarget = target;
}
},
_start: function(e) {
var that = this,
target = $(e.target),
selected = target.hasClass(SELECTED),
currentElement,
ctrlKey = e.event.ctrlKey || e.event.metaKey;
if (!this._allowSelection(e.event.target)) {
return;
}
that._downTarget = target;
//in case of hierarchy
if (!that._isElement(target.closest("." + SELECTABLE))) {
that.userEvents.cancel();
return;
}
if (that.options.useAllItems) {
that._items = that.element.find(that.options.filter);
} else {
currentElement = target.closest(that.element);
that._items = currentElement.find(that.options.filter);
}
e.sender.capture();
that._marquee
.appendTo(document.body)
.css({
left: e.x.client + 1,
top: e.y.client + 1,
width: 0,
height: 0
});
if (!ctrlKey) {
that.clear();
}
target = target.add(that.relatedTarget(target));
if (selected) {
that._selectElement(target, true);
if (ctrlKey) {
target.addClass(UNSELECTING);
}
}
},
_move: function(e) {
var that = this,
position = {
left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,
top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,
width: abs(e.x.initialDelta),
height: abs(e.y.initialDelta)
};
that._marquee.css(position);
that._invalidateSelectables(position, (e.event.ctrlKey || e.event.metaKey));
e.preventDefault();
},
_end: function(e) {
var that = this;
that._marquee.remove();
that._unselect(that.element
.find(that.options.filter + "." + UNSELECTING))
.removeClass(UNSELECTING);
var target = that.element.find(that.options.filter + "." + ACTIVE);
target = target.add(that.relatedTarget(target));
that.value(target, e);
that._lastActive = that._downTarget;
that._items = null;
},
_invalidateSelectables: function(position, ctrlKey) {
var idx,
length,
target = this._downTarget[0],
items = this._items,
related,
toSelect;
for (idx = 0, length = items.length; idx < length; idx ++) {
toSelect = items.eq(idx);
related = toSelect.add(this.relatedTarget(toSelect));
if (collision(toSelect, position)) {
if(toSelect.hasClass(SELECTED)) {
if(ctrlKey && target !== toSelect[0]) {
related.removeClass(SELECTED).addClass(UNSELECTING);
}
} else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) {
related.addClass(ACTIVE);
}
} else {
if (toSelect.hasClass(ACTIVE)) {
related.removeClass(ACTIVE);
} else if(ctrlKey && toSelect.hasClass(UNSELECTING)) {
related.removeClass(UNSELECTING).addClass(SELECTED);
}
}
}
},
value: function(val, e) {
var that = this,
selectElement = proxy(that._selectElement, that);
if(val) {
val.each(function() {
selectElement(this);
});
that._notify(CHANGE, e);
return;
}
return that.element.find(that.options.filter + "." + SELECTED);
},
_firstSelectee: function() {
var that = this,
selected;
if(that._lastActive !== null) {
return that._lastActive;
}
selected = that.value();
return selected.length > 0 ?
selected[0] :
that.element.find(that.options.filter)[0];
},
_selectElement: function(element, preventNotify) {
var toSelect = $(element),
isPrevented = !preventNotify && this._notify("select", { element: element });
toSelect.removeClass(ACTIVE);
if(!isPrevented) {
toSelect.addClass(SELECTED);
if (this.options.aria) {
toSelect.attr(ARIASELECTED, true);
}
}
},
_notify: function(name, args) {
args = args || { };
return this.trigger(name, args);
},
_unselect: function(element) {
if (this.trigger(UNSELECT, { element: element})) {
return;
}
element.removeClass(SELECTED);
if (this.options.aria) {
element.attr(ARIASELECTED, false);
}
return element;
},
_select: function(e) {
if (this._allowSelection(e.event.target)) {
if (!msie || (msie && !$(kendo._activeElement()).is(this.options.inputSelectors))) {
e.preventDefault();
}
}
},
_allowSelection: function(target) {
if ($(target).is(this.options.inputSelectors)) {
this.userEvents.cancel();
this._downTarget = null;
return false;
}
return true;
},
resetTouchEvents: function() {
this.userEvents.cancel();
},
clear: function() {
var items = this.element.find(this.options.filter + "." + SELECTED);
this._unselect(items);
},
selectRange: function(start, end, e) {
var that = this,
idx,
tmp,
items;
that.clear();
if (that.element.length > 1) {
items = that.options.continuousItems();
}
if (!items || !items.length) {
items = that.element.find(that.options.filter);
}
start = $.inArray($(start)[0], items);
end = $.inArray($(end)[0], items);
if (start > end) {
tmp = start;
start = end;
end = tmp;
}
if (!that.options.useAllItems) {
end += that.element.length - 1;
}
for (idx = start; idx <= end; idx ++ ) {
that._selectElement(items[idx]);
}
that._notify(CHANGE, e);
},
destroy: function() {
var that = this;
Widget.fn.destroy.call(that);
that.element.off(NS);
that.userEvents.destroy();
that._marquee = that._lastActive = that.element = that.userEvents = null;
}
});
Selectable.parseOptions = function(selectable) {
var asLowerString = typeof selectable === "string" && selectable.toLowerCase();
return {
multiple: asLowerString && asLowerString.indexOf("multiple") > -1,
cell: asLowerString && asLowerString.indexOf("cell") > -1
};
};
function collision(element, position) {
if (!element.is(":visible")) {
return false;
}
var elementPosition = kendo.getOffset(element),
right = position.left + position.width,
bottom = position.top + position.height;
elementPosition.right = elementPosition.left + kendo._outerWidth(element);
elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);
return !(elementPosition.left > right||
elementPosition.right < position.left ||
elementPosition.top > bottom ||
elementPosition.bottom < position.top);
}
kendo.ui.plugin(Selectable);
})(window.kendo.jQuery);
return window.kendo;
}, __webpack_require__(3));
/***/ })
/******/ });