UNPKG

landmark-serve

Version:

Web Application Framework and Admin GUI / Content Management System built on Express.js and Mongoose

122 lines (85 loc) 2.64 kB
jQuery(function($) { // SORTABLE CLASS // ============== var Sortable = function(table) { this.table = table; this.$table = $(table); this.drag = null; } Sortable.prototype.start = function($row, startEvent) { var self = this, rowWasMoved = false, $rows = this.$table.find('tbody tr'), $blocker = $('<div class="ui-mouse-blocker move">').appendTo(document.body); $row.addClass('dragged'); this.rowPositions = this.getRowPositions(); var mousemove = function(e) { $blocker.css({ top: e.pageY - 30, left: e.pageX - 30 }); var rowIndex = $row.index(), rowHit = self.getRowHit(e); if (rowHit == -1 || rowHit == rowIndex) return; var pos = rowHit < rowIndex ? 'Before' : 'After'; $row['insert' + pos]($rows[rowHit]); $rows = self.$table.find('tbody tr'); rowWasMoved = true; }; var finish = function(e) { $row.removeClass('dragged'); $blocker.remove(); $(document).off('mousemove.ui.sortable').off('mouseup.ui.sortable'); if (rowWasMoved) { self.$table.trigger('ui.sorted'); $row.find('td').each(function() { var td = this; $(this).css('background-color', '#fffbdc'); setTimeout(function() { move(td).set('background-color', '').duration('1s').end(); }, 250); }); } }; $(document).on('mousemove.ui.sortable', mousemove).on('mouseup.ui.sortable', finish); mousemove(startEvent); }; Sortable.prototype.getRowHit = function(e) { var rowHit = -1; for (var i = 0; i < this.rowPositions.length; i++) { if (e.pageY >= this.rowPositions[i].top && e.pageY <= this.rowPositions[i].bottom) { rowHit = i; break; } } return rowHit; }; Sortable.prototype.getRowPositions = function() { return _.map(this.$table.find('tbody tr'), function(tr) { var $tr = $(tr), offset = $tr.offset(); return { top: offset.top, bottom: offset.top + $tr.height() }; }); }; // SORTABLE PLUGIN // =============== $.fn.sortable = function($row, e) { return this.each(function() { var $this = $(this); var sortable = $this.data('ui.sortable'); if (!sortable) $this.data('ui.sortable', (sortable = new Sortable(this))); sortable.start($row, e); }); }; $.fn.sortable.Constructor = Sortable; // EVENT BINDINGS // ============== $(document).on('mousedown.ui.sortable', '.control-sort', function(e) { var $row = $(e.target); if (!$row.is('tr')) $row = $row.closest('tr'); var $table = $row.closest('table'); $table.sortable($row, e); e.preventDefault(); }); });