UNPKG

jquery-grid

Version:

jQuery Grid by Gijgo.com is a plug-in for the jQuery Javascript library. It is a very fast and extandable datagrid, and will add advanced interaction controls to any HTML table. This plugin has build-in integration with Bootstrap and Material Design. Free

155 lines (133 loc) 5.54 kB
/* * Gijgo Droppable v1.9.13 * http://gijgo.com/droppable * * Copyright 2014, 2019 gijgo.com * Released under the MIT license */ /* global window alert jQuery */ /** */ gj.droppable = { plugins: {} }; gj.droppable.config = { /** If specified, the class will be added to the droppable while draggable is being hovered over the droppable. */ hoverClass: undefined }; gj.droppable.methods = { init: function (jsConfig) { var $dropEl = this; gj.widget.prototype.init.call(this, jsConfig, 'droppable'); $dropEl.attr('data-droppable', 'true'); gj.documentManager.subscribeForEvent('mousedown', $dropEl.data('guid'), gj.droppable.methods.createMouseDownHandler($dropEl)); gj.documentManager.subscribeForEvent('mousemove', $dropEl.data('guid'), gj.droppable.methods.createMouseMoveHandler($dropEl)); gj.documentManager.subscribeForEvent('mouseup', $dropEl.data('guid'), gj.droppable.methods.createMouseUpHandler($dropEl)); return $dropEl; }, createMouseDownHandler: function ($dropEl) { return function (e) { $dropEl.isDragging = true; } }, createMouseMoveHandler: function ($dropEl) { return function (e) { if ($dropEl.isDragging) { var hoverClass = $dropEl.data('hoverClass'), mousePosition = { x: $dropEl.mouseX(e), y: $dropEl.mouseY(e) }, newIsOver = gj.droppable.methods.isOver($dropEl, mousePosition); if (newIsOver != $dropEl.isOver) { if (newIsOver) { if (hoverClass) { $dropEl.addClass(hoverClass); } gj.droppable.events.over($dropEl, mousePosition); } else { if (hoverClass) { $dropEl.removeClass(hoverClass); } gj.droppable.events.out($dropEl); } } $dropEl.isOver = newIsOver; } } }, createMouseUpHandler: function ($dropEl) { return function (e) { var mousePosition = { left: $dropEl.mouseX(e), top: $dropEl.mouseY(e) }; $dropEl.isDragging = false; if (gj.droppable.methods.isOver($dropEl, mousePosition)) { gj.droppable.events.drop($dropEl); } } }, isOver: function ($dropEl, mousePosition) { var offsetTop = $dropEl.offset().top, offsetLeft = $dropEl.offset().left; return mousePosition.x > offsetLeft && mousePosition.x < (offsetLeft + $dropEl.outerWidth(true)) && mousePosition.y > offsetTop && mousePosition.y < (offsetTop + $dropEl.outerHeight(true)); }, destroy: function ($dropEl) { if ($dropEl.attr('data-droppable') === 'true') { gj.documentManager.unsubscribeForEvent('mousedown', $dropEl.data('guid')); gj.documentManager.unsubscribeForEvent('mousemove', $dropEl.data('guid')); gj.documentManager.unsubscribeForEvent('mouseup', $dropEl.data('guid')); $dropEl.removeData(); $dropEl.removeAttr('data-guid'); $dropEl.removeAttr('data-droppable'); $dropEl.off('drop').off('over').off('out'); } return $dropEl; } }; gj.droppable.events = { /** Triggered when a draggable element is dropped. */ drop: function ($dropEl, offsetX, offsetY) { $dropEl.trigger('drop', [{ top: offsetY, left: offsetX }]); }, /** Triggered when a draggable element is dragged over the droppable. */ over: function ($dropEl, mousePosition) { $dropEl.trigger('over', [mousePosition]); }, /** Triggered when a draggable element is dragged out of the droppable. */ out: function ($dropEl) { $dropEl.trigger('out'); } }; gj.droppable.widget = function ($element, jsConfig) { var self = this, methods = gj.droppable.methods; self.isOver = false; self.isDragging = false; /** Removes the droppable functionality. */ self.destroy = function () { return methods.destroy(this); } self.isOver = function (mousePosition) { return methods.isOver(this, mousePosition); } $.extend($element, self); if ('true' !== $element.attr('data-droppable')) { methods.init.call($element, jsConfig); } return $element; }; gj.droppable.widget.prototype = new gj.widget(); gj.droppable.widget.constructor = gj.droppable.widget; (function ($) { $.fn.droppable = function (method) { var $widget; if (this && this.length) { if (typeof method === 'object' || !method) { return new gj.droppable.widget(this, method); } else { $widget = new gj.droppable.widget(this, null); if ($widget[method]) { return $widget[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else { throw 'Method ' + method + ' does not exist.'; } } } }; })(jQuery);