{"version":3,"sources":["kendo.groupable.js"],"names":["f","define","$","undefined","dropCueOffsetTop","element","position","top","kendo","window","Widget","ui","proxy","isRtl","NS","CHANGE","indicatorTmpl","template","useWithBlock","hint","target","css","width","paddingLeft","paddingRight","lineHeight","height","paddingTop","paddingBottom","html","htmlEncode","attr","prepend","dropCue","Groupable","extend","init","options","draggable","horizontalCuePosition","that","this","group","guid","intializePositions","_intializePositions","dropCuePositions","_dropCuePositions","fn","call","support","Draggable","filter","draggableElements","groupContainer","kendoDropTarget","dragenter","e","_canDrag","currentTarget","find","removeClass","addClass","appendTo","dragleave","remove","drop","targetElement","field","title","sourceIndicator","indicator","lastCuePosition","length","hasClass","_dropCuePosition","getOffset","left","parseInt","_canDrop","before","buildIndicator","after","_change","append","kendoDraggable","dragcancel","_dragCancel","dragstart","marginLeft","elementPosition","outerWidth","dragend","_dragEnd","drag","_drag","on","preventDefault","_removeIndicator","parent","current","newIndicator","bind","marginRight","allowDrag","dataSource","_refreshHandler","unbind","refresh","empty","map","item","fieldName","dir","join","_invalidateGroupContainer","destroy","off","data","name","messages","indicators","grep","replace","ns","descriptors","aggregates","names","idx","cell","aggregate","member","split","push","toArray","right","is","Math","ceil","event","x","location","source","next","result","dropped","plugin","jQuery","amd","a1","a2","a3"],"mappings":"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","file":"kendo.groupable.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('kendo.groupable', [\n 'kendo.core',\n 'kendo.draganddrop'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'groupable',\n name: 'Groupable',\n category: 'framework',\n depends: [\n 'core',\n 'draganddrop'\n ],\n advanced: true\n };\n (function ($, undefined) {\n var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, isRtl = false, NS = '.kendoGroupable', CHANGE = 'change', indicatorTmpl = kendo.template('
' + '' + '(sorted ${(data.dir || \"asc\") == \"asc\" ? \"ascending\": \"descending\"})' + '${data.title ? data.title: data.field}' + '' + '' + '' + '' + '
', { useWithBlock: false }), hint = function (target) {\n return $('
').css({\n width: target.width(),\n paddingLeft: target.css('paddingLeft'),\n paddingRight: target.css('paddingRight'),\n lineHeight: target.height() + 'px',\n paddingTop: target.css('paddingTop'),\n paddingBottom: target.css('paddingBottom')\n }).html(kendo.htmlEncode(target.attr(kendo.attr('title'))) || target.attr(kendo.attr('field'))).prepend('');\n }, dropCue = $('
');\n function dropCueOffsetTop(element) {\n return element.position().top + 3;\n }\n var Groupable = Widget.extend({\n init: function (element, options) {\n var that = this, group = kendo.guid(), intializePositions = proxy(that._intializePositions, that), draggable, horizontalCuePosition, dropCuePositions = that._dropCuePositions = [];\n Widget.fn.init.call(that, element, options);\n isRtl = kendo.support.isRtl(element);\n horizontalCuePosition = isRtl ? 'right' : 'left';\n that.draggable = draggable = that.options.draggable || new kendo.ui.Draggable(that.element, {\n filter: that.options.draggableElements,\n hint: hint,\n group: group\n });\n that.groupContainer = $(that.options.groupContainer, that.element).kendoDropTarget({\n group: draggable.options.group,\n dragenter: function (e) {\n if (that._canDrag(e.draggable.currentTarget)) {\n e.draggable.hint.find('.k-drag-status').removeClass('k-denied').addClass('k-add');\n dropCue.css('top', dropCueOffsetTop(that.groupContainer)).css(horizontalCuePosition, 0).appendTo(that.groupContainer);\n }\n },\n dragleave: function (e) {\n e.draggable.hint.find('.k-drag-status').removeClass('k-add').addClass('k-denied');\n dropCue.remove();\n },\n drop: function (e) {\n var targetElement = e.draggable.currentTarget, field = targetElement.attr(kendo.attr('field')), title = targetElement.attr(kendo.attr('title')), sourceIndicator = that.indicator(field), dropCuePositions = that._dropCuePositions, lastCuePosition = dropCuePositions[dropCuePositions.length - 1], position;\n if (!targetElement.hasClass('k-group-indicator') && !that._canDrag(targetElement)) {\n return;\n }\n if (lastCuePosition) {\n position = that._dropCuePosition(kendo.getOffset(dropCue).left + parseInt(lastCuePosition.element.css('marginLeft'), 10) * (isRtl ? -1 : 1) + parseInt(lastCuePosition.element.css('marginRight'), 10));\n if (position && that._canDrop($(sourceIndicator), position.element, position.left)) {\n if (position.before) {\n position.element.before(sourceIndicator || that.buildIndicator(field, title));\n } else {\n position.element.after(sourceIndicator || that.buildIndicator(field, title));\n }\n that._change();\n }\n } else {\n that.groupContainer.append(that.buildIndicator(field, title));\n that._change();\n }\n }\n }).kendoDraggable({\n filter: 'div.k-group-indicator',\n hint: hint,\n group: draggable.options.group,\n dragcancel: proxy(that._dragCancel, that),\n dragstart: function (e) {\n var element = e.currentTarget, marginLeft = parseInt(element.css('marginLeft'), 10), elementPosition = element.position(), left = isRtl ? elementPosition.left - marginLeft : elementPosition.left + element.outerWidth();\n intializePositions();\n dropCue.css({\n top: dropCueOffsetTop(that.groupContainer),\n left: left\n }).appendTo(that.groupContainer);\n this.hint.find('.k-drag-status').removeClass('k-denied').addClass('k-add');\n },\n dragend: function () {\n that._dragEnd(this);\n },\n drag: proxy(that._drag, that)\n }).on('click' + NS, '.k-button', function (e) {\n e.preventDefault();\n that._removeIndicator($(this).parent());\n }).on('click' + NS, '.k-link', function (e) {\n var current = $(this).parent(), newIndicator = that.buildIndicator(current.attr(kendo.attr('field')), current.attr(kendo.attr('title')), current.attr(kendo.attr('dir')) == 'asc' ? 'desc' : 'asc');\n current.before(newIndicator).remove();\n that._change();\n e.preventDefault();\n });\n draggable.bind([\n 'dragend',\n 'dragcancel',\n 'dragstart',\n 'drag'\n ], {\n dragend: function () {\n that._dragEnd(this);\n },\n dragcancel: proxy(that._dragCancel, that),\n dragstart: function (e) {\n var element, marginRight, left;\n if (!that.options.allowDrag && !that._canDrag(e.currentTarget)) {\n e.preventDefault();\n return;\n }\n intializePositions();\n if (dropCuePositions.length) {\n element = dropCuePositions[dropCuePositions.length - 1].element;\n marginRight = parseInt(element.css('marginRight'), 10);\n left = element.position().left + element.outerWidth() + marginRight;\n } else {\n left = 0;\n }\n },\n drag: proxy(that._drag, that)\n });\n that.dataSource = that.options.dataSource;\n if (that.dataSource && that._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler);\n } else {\n that._refreshHandler = proxy(that.refresh, that);\n }\n if (that.dataSource) {\n that.dataSource.bind('change', that._refreshHandler);\n that.refresh();\n }\n },\n refresh: function () {\n var that = this, dataSource = that.dataSource;\n if (that.groupContainer) {\n that.groupContainer.empty().append($.map(dataSource.group() || [], function (item) {\n var fieldName = item.field;\n var attr = kendo.attr('field');\n var element = that.element.find(that.options.filter).filter(function () {\n return $(this).attr(attr) === fieldName;\n });\n return that.buildIndicator(item.field, element.attr(kendo.attr('title')), item.dir);\n }).join(''));\n }\n that._invalidateGroupContainer();\n },\n destroy: function () {\n var that = this;\n Widget.fn.destroy.call(that);\n that.groupContainer.off(NS);\n if (that.groupContainer.data('kendoDropTarget')) {\n that.groupContainer.data('kendoDropTarget').destroy();\n }\n if (that.groupContainer.data('kendoDraggable')) {\n that.groupContainer.data('kendoDraggable').destroy();\n }\n if (!that.options.draggable) {\n that.draggable.destroy();\n }\n if (that.dataSource && that._refreshHandler) {\n that.dataSource.unbind('change', that._refreshHandler);\n that._refreshHandler = null;\n }\n that.groupContainer = that.element = that.draggable = null;\n },\n options: {\n name: 'Groupable',\n filter: 'th',\n draggableElements: 'th',\n messages: { empty: 'Drag a column header and drop it here to group by that column' }\n },\n indicator: function (field) {\n var indicators = $('.k-group-indicator', this.groupContainer);\n return $.grep(indicators, function (item) {\n return $(item).attr(kendo.attr('field')) === field;\n })[0];\n },\n buildIndicator: function (field, title, dir) {\n return indicatorTmpl({\n field: field.replace(/\"/g, '\\''),\n dir: dir,\n title: title,\n ns: kendo.ns\n });\n },\n descriptors: function () {\n var that = this, indicators = $('.k-group-indicator', that.groupContainer), aggregates, names, field, idx, length;\n aggregates = that.element.find(that.options.filter).map(function () {\n var cell = $(this), aggregate = cell.attr(kendo.attr('aggregates')), member = cell.attr(kendo.attr('field'));\n if (aggregate && aggregate !== '') {\n names = aggregate.split(',');\n aggregate = [];\n for (idx = 0, length = names.length; idx < length; idx++) {\n aggregate.push({\n field: member,\n aggregate: names[idx]\n });\n }\n }\n return aggregate;\n }).toArray();\n return $.map(indicators, function (item) {\n item = $(item);\n field = item.attr(kendo.attr('field'));\n return {\n field: field,\n dir: item.attr(kendo.attr('dir')),\n aggregates: aggregates || []\n };\n });\n },\n _removeIndicator: function (indicator) {\n var that = this;\n indicator.remove();\n that._invalidateGroupContainer();\n that._change();\n },\n _change: function () {\n var that = this;\n if (that.dataSource) {\n that.dataSource.group(that.descriptors());\n }\n },\n _dropCuePosition: function (position) {\n var dropCuePositions = this._dropCuePositions;\n if (!dropCue.is(':visible') || dropCuePositions.length === 0) {\n return;\n }\n position = Math.ceil(position);\n var lastCuePosition = dropCuePositions[dropCuePositions.length - 1], left = lastCuePosition.left, right = lastCuePosition.right, marginLeft = parseInt(lastCuePosition.element.css('marginLeft'), 10), marginRight = parseInt(lastCuePosition.element.css('marginRight'), 10);\n if (position >= right && !isRtl || position < left && isRtl) {\n position = {\n left: lastCuePosition.element.position().left + (!isRtl ? lastCuePosition.element.outerWidth() + marginRight : -marginLeft),\n element: lastCuePosition.element,\n before: false\n };\n } else {\n position = $.grep(dropCuePositions, function (item) {\n return item.left <= position && position <= item.right || isRtl && position > item.right;\n })[0];\n if (position) {\n position = {\n left: isRtl ? position.element.position().left + position.element.outerWidth() + marginRight : position.element.position().left - marginLeft,\n element: position.element,\n before: true\n };\n }\n }\n return position;\n },\n _drag: function (event) {\n var position = this._dropCuePosition(event.x.location);\n if (position) {\n dropCue.css({\n left: position.left,\n right: 'auto'\n });\n }\n },\n _canDrag: function (element) {\n var field = element.attr(kendo.attr('field'));\n return element.attr(kendo.attr('groupable')) != 'false' && field && (element.hasClass('k-group-indicator') || !this.indicator(field));\n },\n _canDrop: function (source, target, position) {\n var next = source.next(), result = source[0] !== target[0] && (!next[0] || target[0] !== next[0] || (!isRtl && position > next.position().left || isRtl && position < next.position().left));\n return result;\n },\n _dragEnd: function (draggable) {\n var that = this, field = draggable.currentTarget.attr(kendo.attr('field')), sourceIndicator = that.indicator(field);\n if (draggable !== that.options.draggable && !draggable.dropped && sourceIndicator) {\n that._removeIndicator($(sourceIndicator));\n }\n that._dragCancel();\n },\n _dragCancel: function () {\n dropCue.remove();\n this._dropCuePositions = [];\n },\n _intializePositions: function () {\n var that = this, indicators = $('.k-group-indicator', that.groupContainer), left;\n that._dropCuePositions = $.map(indicators, function (item) {\n item = $(item);\n left = kendo.getOffset(item).left;\n return {\n left: parseInt(left, 10),\n right: parseInt(left + item.outerWidth(), 10),\n element: item\n };\n });\n },\n _invalidateGroupContainer: function () {\n var groupContainer = this.groupContainer;\n if (groupContainer && groupContainer.is(':empty')) {\n groupContainer.html(this.options.messages.empty);\n }\n }\n });\n kendo.ui.plugin(Groupable);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"],"sourceRoot":"/source/"}