From a694661cc13b1fc64225b7c19817626c5a0fbabf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 19 Jul 2016 16:23:28 -0400 Subject: [PATCH] update playlist drag and drop --- .../bower_components/Sortable/Sortable.js | 1249 ----------------- .../Sortable/meteor/.versions | 34 - .../example/.meteor/.finished-upgraders | 8 - .../meteor/example/.meteor/.gitignore | 1 - .../Sortable/meteor/example/.meteor/.id | 7 - .../Sortable/meteor/example/.meteor/packages | 10 - .../Sortable/meteor/example/.meteor/platforms | 2 - .../Sortable/meteor/example/.meteor/release | 1 - .../Sortable/meteor/example/.meteor/versions | 53 - .../example/client/define-object-type.css | 57 - .../example/client/define-object-type.html | 94 -- .../example/client/define-object-type.js | 101 -- .../Sortable/meteor/example/model.js | 2 - .../Sortable/meteor/example/run.bat | 7 - .../Sortable/meteor/example/run.sh | 5 - .../meteor/example/server/fixtures.js | 75 - .../example/server/sortable-collections.js | 3 - .../Sortable/meteor/methods-client.js | 16 - .../Sortable/meteor/methods-server.js | 31 - .../Sortable/meteor/package.js | 85 -- .../Sortable/meteor/publish.sh | 26 - .../Sortable/meteor/reactivize.js | 201 --- .../Sortable/meteor/runtests.bat | 8 - .../Sortable/meteor/runtests.sh | 35 - .../Sortable/meteor/template.html | 5 - .../bower_components/Sortable/meteor/test.js | 9 - .../bower_components/Sortable/st/app.css | 239 ---- .../bower_components/Sortable/st/app.js | 226 --- .../bower_components/Sortable/st/face-01.jpg | Bin 3172 -> 0 bytes .../bower_components/Sortable/st/face-02.jpg | Bin 4445 -> 0 bytes .../bower_components/Sortable/st/face-03.jpg | Bin 2907 -> 0 bytes .../bower_components/Sortable/st/face-04.jpg | Bin 4163 -> 0 bytes .../bower_components/Sortable/st/face-05.jpg | Bin 3883 -> 0 bytes .../bower_components/Sortable/st/face-06.jpg | Bin 3273 -> 0 bytes .../bower_components/Sortable/st/face-07.jpg | Bin 3867 -> 0 bytes .../bower_components/Sortable/st/face-08.jpg | Bin 3354 -> 0 bytes .../bower_components/Sortable/st/face-09.jpg | Bin 4724 -> 0 bytes .../Sortable/st/iframe/frame.html | 32 - .../Sortable/st/iframe/index.html | 49 - .../bower_components/Sortable/st/logo.png | Bin 5062 -> 0 bytes .../bower_components/Sortable/st/og-image.png | Bin 12039 -> 0 bytes .../emby-itemscontainer.js | 73 +- dashboard-ui/scripts/playlistedit.js | 45 +- 43 files changed, 74 insertions(+), 2715 deletions(-) delete mode 100644 dashboard-ui/bower_components/Sortable/Sortable.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/.versions delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/model.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/run.bat delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/run.sh delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/methods-client.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/methods-server.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/package.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/publish.sh delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/reactivize.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/runtests.bat delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/runtests.sh delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/template.html delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/test.js delete mode 100644 dashboard-ui/bower_components/Sortable/st/app.css delete mode 100644 dashboard-ui/bower_components/Sortable/st/app.js delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-01.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-02.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-03.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-04.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-05.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-06.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-07.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-08.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-09.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/iframe/frame.html delete mode 100644 dashboard-ui/bower_components/Sortable/st/iframe/index.html delete mode 100644 dashboard-ui/bower_components/Sortable/st/logo.png delete mode 100644 dashboard-ui/bower_components/Sortable/st/og-image.png diff --git a/dashboard-ui/bower_components/Sortable/Sortable.js b/dashboard-ui/bower_components/Sortable/Sortable.js deleted file mode 100644 index f4ac38dff5..0000000000 --- a/dashboard-ui/bower_components/Sortable/Sortable.js +++ /dev/null @@ -1,1249 +0,0 @@ -/**! - * Sortable - * @author RubaXa - * @license MIT - */ - - -(function (factory) { - "use strict"; - - if (typeof define === "function" && define.amd) { - define(factory); - } - else if (typeof module != "undefined" && typeof module.exports != "undefined") { - module.exports = factory(); - } - else if (typeof Package !== "undefined") { - Sortable = factory(); // export for Meteor.js - } - else { - /* jshint sub:true */ - window["Sortable"] = factory(); - } -})(function () { - "use strict"; - - var dragEl, - parentEl, - ghostEl, - cloneEl, - rootEl, - nextEl, - - scrollEl, - scrollParentEl, - - lastEl, - lastCSS, - lastParentCSS, - - oldIndex, - newIndex, - - activeGroup, - autoScroll = {}, - - tapEvt, - touchEvt, - - moved, - - /** @const */ - RSPACE = /\s+/g, - - expando = 'Sortable' + (new Date).getTime(), - - win = window, - document = win.document, - parseInt = win.parseInt, - - supportDraggable = !!('draggable' in document.createElement('div')), - supportCssPointerEvents = (function (el) { - el = document.createElement('x'); - el.style.cssText = 'pointer-events:auto'; - return el.style.pointerEvents === 'auto'; - })(), - - _silent = false, - - abs = Math.abs, - slice = [].slice, - - touchDragOverListeners = [], - - _autoScroll = _throttle(function (/**Event*/evt, /**Object*/options, /**HTMLElement*/rootEl) { - // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 - if (rootEl && options.scroll) { - var el, - rect, - sens = options.scrollSensitivity, - speed = options.scrollSpeed, - - x = evt.clientX, - y = evt.clientY, - - winWidth = window.innerWidth, - winHeight = window.innerHeight, - - vx, - vy - ; - - // Delect scrollEl - if (scrollParentEl !== rootEl) { - scrollEl = options.scroll; - scrollParentEl = rootEl; - - if (scrollEl === true) { - scrollEl = rootEl; - - do { - if ((scrollEl.offsetWidth < scrollEl.scrollWidth) || - (scrollEl.offsetHeight < scrollEl.scrollHeight) - ) { - break; - } - /* jshint boss:true */ - } while (scrollEl = scrollEl.parentNode); - } - } - - if (scrollEl) { - el = scrollEl; - rect = scrollEl.getBoundingClientRect(); - vx = (abs(rect.right - x) <= sens) - (abs(rect.left - x) <= sens); - vy = (abs(rect.bottom - y) <= sens) - (abs(rect.top - y) <= sens); - } - - - if (!(vx || vy)) { - vx = (winWidth - x <= sens) - (x <= sens); - vy = (winHeight - y <= sens) - (y <= sens); - - /* jshint expr:true */ - (vx || vy) && (el = win); - } - - - if (autoScroll.vx !== vx || autoScroll.vy !== vy || autoScroll.el !== el) { - autoScroll.el = el; - autoScroll.vx = vx; - autoScroll.vy = vy; - - clearInterval(autoScroll.pid); - - if (el) { - autoScroll.pid = setInterval(function () { - if (el === win) { - win.scrollTo(win.pageXOffset + vx * speed, win.pageYOffset + vy * speed); - } else { - vy && (el.scrollTop += vy * speed); - vx && (el.scrollLeft += vx * speed); - } - }, 24); - } - } - } - }, 30), - - _prepareGroup = function (options) { - var group = options.group; - - if (!group || typeof group != 'object') { - group = options.group = {name: group}; - } - - ['pull', 'put'].forEach(function (key) { - if (!(key in group)) { - group[key] = true; - } - }); - - options.groups = ' ' + group.name + (group.put.join ? ' ' + group.put.join(' ') : '') + ' '; - } - ; - - - - /** - * @class Sortable - * @param {HTMLElement} el - * @param {Object} [options] - */ - function Sortable(el, options) { - if (!(el && el.nodeType && el.nodeType === 1)) { - throw 'Sortable: `el` must be HTMLElement, and not ' + {}.toString.call(el); - } - - this.el = el; // root element - this.options = options = _extend({}, options); - - - // Export instance - el[expando] = this; - - - // Default options - var defaults = { - group: Math.random(), - sort: true, - disabled: false, - store: null, - handle: null, - scroll: true, - scrollSensitivity: 30, - scrollSpeed: 10, - draggable: /[uo]l/i.test(el.nodeName) ? 'li' : '>*', - ghostClass: 'sortable-ghost', - chosenClass: 'sortable-chosen', - ignore: 'a, img', - filter: null, - animation: 0, - setData: function (dataTransfer, dragEl) { - dataTransfer.setData('Text', dragEl.textContent); - }, - dropBubble: false, - dragoverBubble: false, - dataIdAttr: 'data-id', - delay: 0, - forceFallback: false, - fallbackClass: 'sortable-fallback', - fallbackOnBody: false - }; - - - // Set default options - for (var name in defaults) { - !(name in options) && (options[name] = defaults[name]); - } - - _prepareGroup(options); - - // Bind all private methods - for (var fn in this) { - if (fn.charAt(0) === '_') { - this[fn] = this[fn].bind(this); - } - } - - // Setup drag mode - this.nativeDraggable = options.forceFallback ? false : supportDraggable; - - // Bind events - _on(el, 'mousedown', this._onTapStart); - _on(el, 'touchstart', this._onTapStart); - - if (this.nativeDraggable) { - _on(el, 'dragover', this); - _on(el, 'dragenter', this); - } - - touchDragOverListeners.push(this._onDragOver); - - // Restore sorting - options.store && this.sort(options.store.get(this)); - } - - - Sortable.prototype = /** @lends Sortable.prototype */ { - constructor: Sortable, - - _onTapStart: function (/** Event|TouchEvent */evt) { - var _this = this, - el = this.el, - options = this.options, - type = evt.type, - touch = evt.touches && evt.touches[0], - target = (touch || evt).target, - originalTarget = target, - filter = options.filter; - - - if (type === 'mousedown' && evt.button !== 0 || options.disabled) { - return; // only left button or enabled - } - - target = _closest(target, options.draggable, el); - - if (!target) { - return; - } - - // get the index of the dragged element within its parent - oldIndex = _index(target); - - // Check filter - if (typeof filter === 'function') { - if (filter.call(this, evt, target, this)) { - _dispatchEvent(_this, originalTarget, 'filter', target, el, oldIndex); - evt.preventDefault(); - return; // cancel dnd - } - } - else if (filter) { - filter = filter.split(',').some(function (criteria) { - criteria = _closest(originalTarget, criteria.trim(), el); - - if (criteria) { - _dispatchEvent(_this, criteria, 'filter', target, el, oldIndex); - return true; - } - }); - - if (filter) { - evt.preventDefault(); - return; // cancel dnd - } - } - - - if (options.handle && !_closest(originalTarget, options.handle, el)) { - return; - } - - - // Prepare `dragstart` - this._prepareDragStart(evt, touch, target); - }, - - _prepareDragStart: function (/** Event */evt, /** Touch */touch, /** HTMLElement */target) { - var _this = this, - el = _this.el, - options = _this.options, - ownerDocument = el.ownerDocument, - dragStartFn; - - if (target && !dragEl && (target.parentNode === el)) { - tapEvt = evt; - - rootEl = el; - dragEl = target; - parentEl = dragEl.parentNode; - nextEl = dragEl.nextSibling; - activeGroup = options.group; - - dragStartFn = function () { - // Delayed drag has been triggered - // we can re-enable the events: touchmove/mousemove - _this._disableDelayedDrag(); - - // Make the element draggable - dragEl.draggable = true; - - // Chosen item - _toggleClass(dragEl, _this.options.chosenClass, true); - - // Bind the events: dragstart/dragend - _this._triggerDragStart(touch); - }; - - // Disable "draggable" - options.ignore.split(',').forEach(function (criteria) { - _find(dragEl, criteria.trim(), _disableDraggable); - }); - - _on(ownerDocument, 'mouseup', _this._onDrop); - _on(ownerDocument, 'touchend', _this._onDrop); - _on(ownerDocument, 'touchcancel', _this._onDrop); - - if (options.delay) { - // If the user moves the pointer or let go the click or touch - // before the delay has been reached: - // disable the delayed drag - _on(ownerDocument, 'mouseup', _this._disableDelayedDrag); - _on(ownerDocument, 'touchend', _this._disableDelayedDrag); - _on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); - _on(ownerDocument, 'mousemove', _this._disableDelayedDrag); - _on(ownerDocument, 'touchmove', _this._disableDelayedDrag); - - _this._dragStartTimer = setTimeout(dragStartFn, options.delay); - } else { - dragStartFn(); - } - } - }, - - _disableDelayedDrag: function () { - var ownerDocument = this.el.ownerDocument; - - clearTimeout(this._dragStartTimer); - _off(ownerDocument, 'mouseup', this._disableDelayedDrag); - _off(ownerDocument, 'touchend', this._disableDelayedDrag); - _off(ownerDocument, 'touchcancel', this._disableDelayedDrag); - _off(ownerDocument, 'mousemove', this._disableDelayedDrag); - _off(ownerDocument, 'touchmove', this._disableDelayedDrag); - }, - - _triggerDragStart: function (/** Touch */touch) { - if (touch) { - // Touch device support - tapEvt = { - target: dragEl, - clientX: touch.clientX, - clientY: touch.clientY - }; - - this._onDragStart(tapEvt, 'touch'); - } - else if (!this.nativeDraggable) { - this._onDragStart(tapEvt, true); - } - else { - _on(dragEl, 'dragend', this); - _on(rootEl, 'dragstart', this._onDragStart); - } - - try { - if (document.selection) { - document.selection.empty(); - } else { - window.getSelection().removeAllRanges(); - } - } catch (err) { - } - }, - - _dragStarted: function () { - if (rootEl && dragEl) { - // Apply effect - _toggleClass(dragEl, this.options.ghostClass, true); - - Sortable.active = this; - - // Drag start event - _dispatchEvent(this, rootEl, 'start', dragEl, rootEl, oldIndex); - } - }, - - _emulateDragOver: function () { - if (touchEvt) { - if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY) { - return; - } - - this._lastX = touchEvt.clientX; - this._lastY = touchEvt.clientY; - - if (!supportCssPointerEvents) { - _css(ghostEl, 'display', 'none'); - } - - var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY), - parent = target, - groupName = ' ' + this.options.group.name + '', - i = touchDragOverListeners.length; - - if (parent) { - do { - if (parent[expando] && parent[expando].options.groups.indexOf(groupName) > -1) { - while (i--) { - touchDragOverListeners[i]({ - clientX: touchEvt.clientX, - clientY: touchEvt.clientY, - target: target, - rootEl: parent - }); - } - - break; - } - - target = parent; // store last element - } - /* jshint boss:true */ - while (parent = parent.parentNode); - } - - if (!supportCssPointerEvents) { - _css(ghostEl, 'display', ''); - } - } - }, - - - _onTouchMove: function (/**TouchEvent*/evt) { - if (tapEvt) { - // only set the status to dragging, when we are actually dragging - if (!Sortable.active) { - this._dragStarted(); - } - - // as well as creating the ghost element on the document body - this._appendGhost(); - - var touch = evt.touches ? evt.touches[0] : evt, - dx = touch.clientX - tapEvt.clientX, - dy = touch.clientY - tapEvt.clientY, - translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)'; - - moved = true; - touchEvt = touch; - - _css(ghostEl, 'webkitTransform', translate3d); - _css(ghostEl, 'mozTransform', translate3d); - _css(ghostEl, 'msTransform', translate3d); - _css(ghostEl, 'transform', translate3d); - - evt.preventDefault(); - } - }, - - _appendGhost: function () { - if (!ghostEl) { - var rect = dragEl.getBoundingClientRect(), - css = _css(dragEl), - options = this.options, - ghostRect; - - ghostEl = dragEl.cloneNode(true); - - _toggleClass(ghostEl, options.ghostClass, false); - _toggleClass(ghostEl, options.fallbackClass, true); - - _css(ghostEl, 'top', rect.top - parseInt(css.marginTop, 10)); - _css(ghostEl, 'left', rect.left - parseInt(css.marginLeft, 10)); - _css(ghostEl, 'width', rect.width); - _css(ghostEl, 'height', rect.height); - _css(ghostEl, 'opacity', '0.8'); - _css(ghostEl, 'position', 'fixed'); - _css(ghostEl, 'zIndex', '100000'); - _css(ghostEl, 'pointerEvents', 'none'); - - options.fallbackOnBody && document.body.appendChild(ghostEl) || rootEl.appendChild(ghostEl); - - // Fixing dimensions. - ghostRect = ghostEl.getBoundingClientRect(); - _css(ghostEl, 'width', rect.width * 2 - ghostRect.width); - _css(ghostEl, 'height', rect.height * 2 - ghostRect.height); - } - }, - - _onDragStart: function (/**Event*/evt, /**boolean*/useFallback) { - var dataTransfer = evt.dataTransfer, - options = this.options; - - this._offUpEvents(); - - if (activeGroup.pull == 'clone') { - cloneEl = dragEl.cloneNode(true); - _css(cloneEl, 'display', 'none'); - rootEl.insertBefore(cloneEl, dragEl); - } - - if (useFallback) { - - if (useFallback === 'touch') { - // Bind touch events - _on(document, 'touchmove', this._onTouchMove); - _on(document, 'touchend', this._onDrop); - _on(document, 'touchcancel', this._onDrop); - } else { - // Old brwoser - _on(document, 'mousemove', this._onTouchMove); - _on(document, 'mouseup', this._onDrop); - } - - this._loopId = setInterval(this._emulateDragOver, 50); - } - else { - if (dataTransfer) { - dataTransfer.effectAllowed = 'move'; - options.setData && options.setData.call(this, dataTransfer, dragEl); - } - - _on(document, 'drop', this); - setTimeout(this._dragStarted, 0); - } - }, - - _onDragOver: function (/**Event*/evt) { - var el = this.el, - target, - dragRect, - revert, - options = this.options, - group = options.group, - groupPut = group.put, - isOwner = (activeGroup === group), - canSort = options.sort; - - if (evt.preventDefault !== void 0) { - evt.preventDefault(); - !options.dragoverBubble && evt.stopPropagation(); - } - - moved = true; - - if (activeGroup && !options.disabled && - (isOwner - ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list - : activeGroup.pull && groupPut && ( - (activeGroup.name === group.name) || // by Name - (groupPut.indexOf && ~groupPut.indexOf(activeGroup.name)) // by Array - ) - ) && - (evt.rootEl === void 0 || evt.rootEl === this.el) // touch fallback - ) { - // Smart auto-scrolling - _autoScroll(evt, options, this.el); - - if (_silent) { - return; - } - - target = _closest(evt.target, options.draggable, el); - dragRect = dragEl.getBoundingClientRect(); - - if (revert) { - _cloneHide(true); - - if (cloneEl || nextEl) { - rootEl.insertBefore(dragEl, cloneEl || nextEl); - } - else if (!canSort) { - rootEl.appendChild(dragEl); - } - - return; - } - - - if ((el.children.length === 0) || (el.children[0] === ghostEl) || - (el === evt.target) && (target = _ghostIsLast(el, evt)) - ) { - - if (target) { - if (target.animated) { - return; - } - - targetRect = target.getBoundingClientRect(); - } - - _cloneHide(isOwner); - - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect) !== false) { - if (!dragEl.contains(el)) { - el.appendChild(dragEl); - parentEl = el; // actualization - } - - this._animate(dragRect, dragEl); - target && this._animate(targetRect, target); - } - } - else if (target && !target.animated && target !== dragEl && (target.parentNode[expando] !== void 0)) { - if (lastEl !== target) { - lastEl = target; - lastCSS = _css(target); - lastParentCSS = _css(target.parentNode); - } - - - var targetRect = target.getBoundingClientRect(), - width = targetRect.right - targetRect.left, - height = targetRect.bottom - targetRect.top, - floating = /left|right|inline/.test(lastCSS.cssFloat + lastCSS.display) - || (lastParentCSS.display == 'flex' && lastParentCSS['flex-direction'].indexOf('row') === 0), - isWide = (target.offsetWidth > dragEl.offsetWidth), - isLong = (target.offsetHeight > dragEl.offsetHeight), - halfway = (floating ? (evt.clientX - targetRect.left) / width : (evt.clientY - targetRect.top) / height) > 0.5, - nextSibling = target.nextElementSibling, - moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect), - after - ; - - if (moveVector !== false) { - _silent = true; - setTimeout(_unsilent, 30); - - _cloneHide(isOwner); - - if (moveVector === 1 || moveVector === -1) { - after = (moveVector === 1); - } - else if (floating) { - var elTop = dragEl.offsetTop, - tgTop = target.offsetTop; - - if (elTop === tgTop) { - after = (target.previousElementSibling === dragEl) && !isWide || halfway && isWide; - } else { - after = tgTop > elTop; - } - } else { - after = (nextSibling !== dragEl) && !isLong || halfway && isLong; - } - - if (!dragEl.contains(el)) { - if (after && !nextSibling) { - el.appendChild(dragEl); - } else { - target.parentNode.insertBefore(dragEl, after ? nextSibling : target); - } - } - - parentEl = dragEl.parentNode; // actualization - - this._animate(dragRect, dragEl); - this._animate(targetRect, target); - } - } - } - }, - - _animate: function (prevRect, target) { - var ms = this.options.animation; - - if (ms) { - var currentRect = target.getBoundingClientRect(); - - _css(target, 'transition', 'none'); - _css(target, 'transform', 'translate3d(' - + (prevRect.left - currentRect.left) + 'px,' - + (prevRect.top - currentRect.top) + 'px,0)' - ); - - target.offsetWidth; // repaint - - _css(target, 'transition', 'all ' + ms + 'ms'); - _css(target, 'transform', 'translate3d(0,0,0)'); - - clearTimeout(target.animated); - target.animated = setTimeout(function () { - _css(target, 'transition', ''); - _css(target, 'transform', ''); - target.animated = false; - }, ms); - } - }, - - _offUpEvents: function () { - var ownerDocument = this.el.ownerDocument; - - _off(document, 'touchmove', this._onTouchMove); - _off(ownerDocument, 'mouseup', this._onDrop); - _off(ownerDocument, 'touchend', this._onDrop); - _off(ownerDocument, 'touchcancel', this._onDrop); - }, - - _onDrop: function (/**Event*/evt) { - var el = this.el, - options = this.options; - - clearInterval(this._loopId); - clearInterval(autoScroll.pid); - clearTimeout(this._dragStartTimer); - - // Unbind events - _off(document, 'mousemove', this._onTouchMove); - - if (this.nativeDraggable) { - _off(document, 'drop', this); - _off(el, 'dragstart', this._onDragStart); - } - - this._offUpEvents(); - - if (evt) { - if (moved) { - evt.preventDefault(); - !options.dropBubble && evt.stopPropagation(); - } - - ghostEl && ghostEl.parentNode.removeChild(ghostEl); - - if (dragEl) { - if (this.nativeDraggable) { - _off(dragEl, 'dragend', this); - } - - _disableDraggable(dragEl); - - // Remove class's - _toggleClass(dragEl, this.options.ghostClass, false); - _toggleClass(dragEl, this.options.chosenClass, false); - - if (rootEl !== parentEl) { - newIndex = _index(dragEl); - - if (newIndex >= 0) { - // drag from one list and drop into another - _dispatchEvent(null, parentEl, 'sort', dragEl, rootEl, oldIndex, newIndex); - _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); - - // Add event - _dispatchEvent(null, parentEl, 'add', dragEl, rootEl, oldIndex, newIndex); - - // Remove event - _dispatchEvent(this, rootEl, 'remove', dragEl, rootEl, oldIndex, newIndex); - } - } - else { - // Remove clone - cloneEl && cloneEl.parentNode.removeChild(cloneEl); - - if (dragEl.nextSibling !== nextEl) { - // Get the index of the dragged element within its parent - newIndex = _index(dragEl); - - if (newIndex >= 0) { - // drag & drop within the same list - _dispatchEvent(this, rootEl, 'update', dragEl, rootEl, oldIndex, newIndex); - _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); - } - } - } - - if (Sortable.active) { - if (newIndex === null || newIndex === -1) { - newIndex = oldIndex; - } - - _dispatchEvent(this, rootEl, 'end', dragEl, rootEl, oldIndex, newIndex); - - // Save sorting - this.save(); - } - } - - // Nulling - rootEl = - dragEl = - parentEl = - ghostEl = - nextEl = - cloneEl = - - scrollEl = - scrollParentEl = - - tapEvt = - touchEvt = - - moved = - newIndex = - - lastEl = - lastCSS = - - activeGroup = - Sortable.active = null; - } - }, - - - handleEvent: function (/**Event*/evt) { - var type = evt.type; - - if (type === 'dragover' || type === 'dragenter') { - if (dragEl) { - this._onDragOver(evt); - _globalDragOver(evt); - } - } - else if (type === 'drop' || type === 'dragend') { - this._onDrop(evt); - } - }, - - - /** - * Serializes the item into an array of string. - * @returns {String[]} - */ - toArray: function () { - var order = [], - el, - children = this.el.children, - i = 0, - n = children.length, - options = this.options; - - for (; i < n; i++) { - el = children[i]; - if (_closest(el, options.draggable, this.el)) { - order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); - } - } - - return order; - }, - - - /** - * Sorts the elements according to the array. - * @param {String[]} order order of the items - */ - sort: function (order) { - var items = {}, rootEl = this.el; - - this.toArray().forEach(function (id, i) { - var el = rootEl.children[i]; - - if (_closest(el, this.options.draggable, rootEl)) { - items[id] = el; - } - }, this); - - order.forEach(function (id) { - if (items[id]) { - rootEl.removeChild(items[id]); - rootEl.appendChild(items[id]); - } - }); - }, - - - /** - * Save the current sorting - */ - save: function () { - var store = this.options.store; - store && store.set(this); - }, - - - /** - * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. - * @param {HTMLElement} el - * @param {String} [selector] default: `options.draggable` - * @returns {HTMLElement|null} - */ - closest: function (el, selector) { - return _closest(el, selector || this.options.draggable, this.el); - }, - - - /** - * Set/get option - * @param {string} name - * @param {*} [value] - * @returns {*} - */ - option: function (name, value) { - var options = this.options; - - if (value === void 0) { - return options[name]; - } else { - options[name] = value; - - if (name === 'group') { - _prepareGroup(options); - } - } - }, - - - /** - * Destroy - */ - destroy: function () { - var el = this.el; - - el[expando] = null; - - _off(el, 'mousedown', this._onTapStart); - _off(el, 'touchstart', this._onTapStart); - - if (this.nativeDraggable) { - _off(el, 'dragover', this); - _off(el, 'dragenter', this); - } - - // Remove draggable attributes - Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { - el.removeAttribute('draggable'); - }); - - touchDragOverListeners.splice(touchDragOverListeners.indexOf(this._onDragOver), 1); - - this._onDrop(); - - this.el = el = null; - } - }; - - - function _cloneHide(state) { - if (cloneEl && (cloneEl.state !== state)) { - _css(cloneEl, 'display', state ? 'none' : ''); - !state && cloneEl.state && rootEl.insertBefore(cloneEl, dragEl); - cloneEl.state = state; - } - } - - - function _closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx) { - if (el) { - ctx = ctx || document; - selector = selector.split('.'); - - var tag = selector.shift().toUpperCase(), - re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g'); - - do { - if ( - (tag === '>*' && el.parentNode === ctx) || ( - (tag === '' || el.nodeName.toUpperCase() == tag) && - (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length) - ) - ) { - return el; - } - } - while (el !== ctx && (el = el.parentNode)); - } - - return null; - } - - - function _globalDragOver(/**Event*/evt) { - if (evt.dataTransfer) { - evt.dataTransfer.dropEffect = 'move'; - } - evt.preventDefault(); - } - - - function _on(el, event, fn) { - el.addEventListener(event, fn, false); - } - - - function _off(el, event, fn) { - el.removeEventListener(event, fn, false); - } - - - function _toggleClass(el, name, state) { - if (el) { - if (el.classList) { - el.classList[state ? 'add' : 'remove'](name); - } - else { - var className = (' ' + el.className + ' ').replace(RSPACE, ' ').replace(' ' + name + ' ', ' '); - el.className = (className + (state ? ' ' + name : '')).replace(RSPACE, ' '); - } - } - } - - - function _css(el, prop, val) { - var style = el && el.style; - - if (style) { - if (val === void 0) { - if (document.defaultView && document.defaultView.getComputedStyle) { - val = document.defaultView.getComputedStyle(el, ''); - } - else if (el.currentStyle) { - val = el.currentStyle; - } - - return prop === void 0 ? val : val[prop]; - } - else { - if (!(prop in style)) { - prop = '-webkit-' + prop; - } - - style[prop] = val + (typeof val === 'string' ? '' : 'px'); - } - } - } - - - function _find(ctx, tagName, iterator) { - if (ctx) { - var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length; - - if (iterator) { - for (; i < n; i++) { - iterator(list[i], i); - } - } - - return list; - } - - return []; - } - - - - function _dispatchEvent(sortable, rootEl, name, targetEl, fromEl, startIndex, newIndex) { - var evt = document.createEvent('Event'), - options = (sortable || rootEl[expando]).options, - onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); - - evt.initEvent(name, true, true); - - evt.to = rootEl; - evt.from = fromEl || rootEl; - evt.item = targetEl || rootEl; - evt.clone = cloneEl; - - evt.oldIndex = startIndex; - evt.newIndex = newIndex; - - rootEl.dispatchEvent(evt); - - if (options[onName]) { - options[onName].call(sortable, evt); - } - } - - - function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect) { - var evt, - sortable = fromEl[expando], - onMoveFn = sortable.options.onMove, - retVal; - - evt = document.createEvent('Event'); - evt.initEvent('move', true, true); - - evt.to = toEl; - evt.from = fromEl; - evt.dragged = dragEl; - evt.draggedRect = dragRect; - evt.related = targetEl || toEl; - evt.relatedRect = targetRect || toEl.getBoundingClientRect(); - - fromEl.dispatchEvent(evt); - - if (onMoveFn) { - retVal = onMoveFn.call(sortable, evt); - } - - return retVal; - } - - - function _disableDraggable(el) { - el.draggable = false; - } - - - function _unsilent() { - _silent = false; - } - - - /** @returns {HTMLElement|false} */ - function _ghostIsLast(el, evt) { - var lastEl = el.lastElementChild, - rect = lastEl.getBoundingClientRect(); - - return ((evt.clientY - (rect.top + rect.height) > 5) || (evt.clientX - (rect.right + rect.width) > 5)) && lastEl; // min delta - } - - - /** - * Generate id - * @param {HTMLElement} el - * @returns {String} - * @private - */ - function _generateId(el) { - var str = el.tagName + el.className + el.src + el.href + el.textContent, - i = str.length, - sum = 0; - - while (i--) { - sum += str.charCodeAt(i); - } - - return sum.toString(36); - } - - /** - * Returns the index of an element within its parent - * @param {HTMLElement} el - * @return {number} - */ - function _index(el) { - var index = 0; - - if (!el || !el.parentNode) { - return -1; - } - - while (el && (el = el.previousElementSibling)) { - if (el.nodeName.toUpperCase() !== 'TEMPLATE') { - index++; - } - } - - return index; - } - - function _throttle(callback, ms) { - var args, _this; - - return function () { - if (args === void 0) { - args = arguments; - _this = this; - - setTimeout(function () { - if (args.length === 1) { - callback.call(_this, args[0]); - } else { - callback.apply(_this, args); - } - - args = void 0; - }, ms); - } - }; - } - - function _extend(dst, src) { - if (dst && src) { - for (var key in src) { - if (src.hasOwnProperty(key)) { - dst[key] = src[key]; - } - } - } - - return dst; - } - - - // Export utils - Sortable.utils = { - on: _on, - off: _off, - css: _css, - find: _find, - is: function (el, selector) { - return !!_closest(el, selector, el); - }, - extend: _extend, - throttle: _throttle, - closest: _closest, - toggleClass: _toggleClass, - index: _index - }; - - - /** - * Create sortable instance - * @param {HTMLElement} el - * @param {Object} [options] - */ - Sortable.create = function (el, options) { - return new Sortable(el, options); - }; - - - // Export - Sortable.version = '1.4.2'; - return Sortable; -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/.versions b/dashboard-ui/bower_components/Sortable/meteor/.versions deleted file mode 100644 index 777e70ed92..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/.versions +++ /dev/null @@ -1,34 +0,0 @@ -base64@1.0.3 -binary-heap@1.0.3 -blaze@2.1.2 -blaze-tools@1.0.3 -callback-hook@1.0.3 -check@1.0.5 -dburles:mongo-collection-instances@0.3.4 -ddp@1.1.0 -deps@1.0.7 -ejson@1.0.6 -geojson-utils@1.0.3 -html-tools@1.0.4 -htmljs@1.0.4 -id-map@1.0.3 -jquery@1.11.3_2 -json@1.0.3 -lai:collection-extensions@0.1.4 -local-test:rubaxa:sortable@1.2.1 -logging@1.0.7 -meteor@1.1.6 -minifiers@1.1.5 -minimongo@1.0.8 -mongo@1.1.0 -observe-sequence@1.0.6 -ordered-dict@1.0.3 -random@1.0.3 -reactive-var@1.0.5 -retry@1.0.3 -rubaxa:sortable@1.2.1 -spacebars-compiler@1.0.6 -templating@1.1.1 -tinytest@1.0.5 -tracker@1.0.7 -underscore@1.0.3 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders deleted file mode 100644 index 8a761038c5..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders +++ /dev/null @@ -1,8 +0,0 @@ -# This file contains information which helps Meteor properly upgrade your -# app when you run 'meteor update'. You should check it into version control -# with your project. - -notices-for-0.9.0 -notices-for-0.9.1 -0.9.4-platform-file -notices-for-facebook-graph-api-2 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore deleted file mode 100644 index 4083037423..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id deleted file mode 100644 index b39baa1d8d..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id +++ /dev/null @@ -1,7 +0,0 @@ -# This file contains a token that is unique to your project. -# Check it into your repository along with the rest of this directory. -# It can be used for purposes such as: -# - ensuring you don't accidentally deploy one app on top of another -# - providing package authors with aggregated statistics - -ir0jg2douy3yo5mehw diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages deleted file mode 100644 index 6f65fb7c45..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages +++ /dev/null @@ -1,10 +0,0 @@ -# Meteor packages used by this project, one per line. -# -# 'meteor add' and 'meteor remove' will edit this file for you, -# but you can also edit it by hand. - -meteor-platform -autopublish -insecure -rubaxa:sortable -fezvrasta:bootstrap-material-design diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms deleted file mode 100644 index 8a3a35f9f6..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms +++ /dev/null @@ -1,2 +0,0 @@ -browser -server diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release deleted file mode 100644 index 315c635bf3..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release +++ /dev/null @@ -1 +0,0 @@ -METEOR@1.1.0.3 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions deleted file mode 100644 index a65be54d9a..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions +++ /dev/null @@ -1,53 +0,0 @@ -autopublish@1.0.3 -autoupdate@1.2.1 -base64@1.0.3 -binary-heap@1.0.3 -blaze@2.1.2 -blaze-tools@1.0.3 -boilerplate-generator@1.0.3 -callback-hook@1.0.3 -check@1.0.5 -dburles:mongo-collection-instances@0.3.4 -ddp@1.1.0 -deps@1.0.7 -ejson@1.0.6 -fastclick@1.0.3 -fezvrasta:bootstrap-material-design@0.3.0 -geojson-utils@1.0.3 -html-tools@1.0.4 -htmljs@1.0.4 -http@1.1.0 -id-map@1.0.3 -insecure@1.0.3 -jquery@1.11.3_2 -json@1.0.3 -lai:collection-extensions@0.1.4 -launch-screen@1.0.2 -livedata@1.0.13 -logging@1.0.7 -meteor@1.1.6 -meteor-platform@1.2.2 -minifiers@1.1.5 -minimongo@1.0.8 -mobile-status-bar@1.0.3 -mongo@1.1.0 -observe-sequence@1.0.6 -ordered-dict@1.0.3 -random@1.0.3 -reactive-dict@1.1.0 -reactive-var@1.0.5 -reload@1.1.3 -retry@1.0.3 -routepolicy@1.0.5 -rubaxa:sortable@1.2.1 -session@1.1.0 -spacebars@1.0.6 -spacebars-compiler@1.0.6 -templating@1.1.1 -tracker@1.0.7 -twbs:bootstrap@3.3.5 -ui@1.0.6 -underscore@1.0.3 -url@1.0.4 -webapp@1.2.0 -webapp-hashing@1.0.3 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css b/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css deleted file mode 100644 index d67b4b1d74..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css +++ /dev/null @@ -1,57 +0,0 @@ -.glyphicon { - vertical-align: baseline; - font-size: 80%; - margin-right: 0.5em; -} - -[class^="mdi-"], [class*=" mdi-"] { - vertical-align: baseline; - font-size: 90%; - margin-right: 0.4em; -} - -.list-pair { - display: flex; /* use the flexbox model */ - flex-direction: row; -} -.sortable { -/* font-size: 2em;*/ -} - -.sortable.source { - /*background: #9FA8DA;*/ - flex: 0 0 auto; - margin-right: 1em; - cursor: move; - cursor: -webkit-grabbing; -} - -.sortable.target { - /*background: #3F51B5;*/ - flex: 1 1 auto; - margin-left: 1em; -} - -.target .well { - -} - -.sortable-handle { - cursor: move; - cursor: -webkit-grabbing; -} -.sortable-handle.pull-right { - margin-top: 0.3em; -} - -.sortable-ghost { - opacity: 0.6; -} - -/* show the remove button on hover */ -.removable .close { - display: none; -} -.removable:hover .close { - display: block; -} diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html b/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html deleted file mode 100644 index d852cbcb5a..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html +++ /dev/null @@ -1,94 +0,0 @@ - - Reactive RubaXa:Sortable for Meteor - - - - {{> navbar}} - -
- - - {{> typeDefinition}} -
- - - - - - - - \ No newline at end of file diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js b/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js deleted file mode 100644 index ad2a19e2a0..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js +++ /dev/null @@ -1,101 +0,0 @@ -// Define an object type by dragging together attributes - -Template.typeDefinition.helpers({ - types: function () { - return Types.find({}, { sort: { order: 1 } }); - }, - typesOptions: { - sortField: 'order', // defaults to 'order' anyway - group: { - name: 'typeDefinition', - pull: 'clone', - put: false - }, - sort: false // don't allow reordering the types, just the attributes below - }, - - attributes: function () { - return Attributes.find({}, { - sort: { order: 1 }, - transform: function (doc) { - doc.icon = Types.findOne({name: doc.type}).icon; - return doc; - } - }); - }, - attributesOptions: { - group: { - name: 'typeDefinition', - put: true - }, - onAdd: function (event) { - delete event.data._id; // Generate a new id when inserting in the Attributes collection. Otherwise, if we add the same type twice, we'll get an error that the ids are not unique. - delete event.data.icon; - event.data.type = event.data.name; - event.data.name = 'Rename me (double click)' - }, - // event handler for reordering attributes - onSort: function (event) { - console.log('Item %s went from #%d to #%d', - event.data.name, event.oldIndex, event.newIndex - ); - } - } -}); - -Template.sortableItemTarget.events({ - 'dblclick .name': function (event, template) { - // Make the name editable. We should use an existing component, but it's - // in a sorry state - https://github.com/arillo/meteor-x-editable/issues/1 - var name = template.$('.name'); - var input = template.$('input'); - if (input.length) { // jQuery never returns null - http://stackoverflow.com/questions/920236/how-can-i-detect-if-a-selector-returns-null - input.show(); - } else { - input = $(''); - name.after(input); - } - name.hide(); - input.focus(); - }, - 'blur input[type=text]': function (event, template) { - // commit the change to the name, if any - var input = template.$('input'); - input.hide(); - template.$('.name').show(); - // TODO - what is the collection here? We'll hard-code for now. - // https://github.com/meteor/meteor/issues/3303 - if (this.name !== input.val() && this.name !== '') - Attributes.update(this._id, {$set: {name: input.val()}}); - }, - 'keydown input[type=text]': function (event, template) { - if (event.which === 27) { - // ESC - discard edits and keep existing value - template.$('input').val(this.name); - event.preventDefault(); - event.target.blur(); - } else if (event.which === 13) { - // ENTER - event.preventDefault(); - event.target.blur(); - } - } -}); - -// you can add events to all Sortable template instances -Template.sortable.events({ - 'click .close': function (event, template) { - // `this` is the data context set by the enclosing block helper (#each, here) - template.collection.remove(this._id); - // custom code, working on a specific collection - if (Attributes.find().count() === 0) { - Meteor.setTimeout(function () { - Attributes.insert({ - name: 'Not nice to delete the entire list! Add some attributes instead.', - type: 'String', - order: 0 - }) - }, 1000); - } - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/model.js b/dashboard-ui/bower_components/Sortable/meteor/example/model.js deleted file mode 100644 index 8ae88226ae..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/model.js +++ /dev/null @@ -1,2 +0,0 @@ -Types = new Mongo.Collection('types'); -Attributes = new Mongo.Collection('attributes'); diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/run.bat b/dashboard-ui/bower_components/Sortable/meteor/example/run.bat deleted file mode 100644 index b2a0d8b4e6..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/run.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -REM Sanity check: make sure we're in the directory of the script -set DIR=%~dp0 -cd %DIR% - -set PACKAGE_DIRS=..\..\ -meteor run %* diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/run.sh b/dashboard-ui/bower_components/Sortable/meteor/example/run.sh deleted file mode 100644 index 8a9123ae38..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -# sanity check: make sure we're in the root directory of the example -cd "$( dirname "$0" )" - -# let Meteor find the local package -PACKAGE_DIRS=../../ meteor run "$@" diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js b/dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js deleted file mode 100644 index 617acf948c..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js +++ /dev/null @@ -1,75 +0,0 @@ -Meteor.startup(function () { - if (Types.find().count() === 0) { - [ - { - name: 'String', - icon: '' - }, - { - name: 'Text, multi-line', - icon: '' - }, - { - name: 'Category', - icon: '' - }, - { - name: 'Number', - icon: '' - }, - { - name: 'Date', - icon: '' - }, - { - name: 'Hyperlink', - icon: '' - }, - { - name: 'Image', - icon: '' - }, - { - name: 'Progress', - icon: '' - }, - { - name: 'Duration', - icon: '' - }, - { - name: 'Map address', - icon: '' - }, - { - name: 'Relationship', - icon: '' - } - ].forEach(function (type, i) { - Types.insert({ - name: type.name, - icon: type.icon, - order: i - }); - } - ); - console.log('Initialized attribute types.'); - } - - if (Attributes.find().count() === 0) { - [ - { name: 'Name', type: 'String' }, - { name: 'Created at', type: 'Date' }, - { name: 'Link', type: 'Hyperlink' }, - { name: 'Owner', type: 'Relationship' } - ].forEach(function (attribute, i) { - Attributes.insert({ - name: attribute.name, - type: attribute.type, - order: i - }); - } - ); - console.log('Created sample object type.'); - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js b/dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js deleted file mode 100644 index 76069a5922..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -Sortable.collections = ['attributes']; diff --git a/dashboard-ui/bower_components/Sortable/meteor/methods-client.js b/dashboard-ui/bower_components/Sortable/meteor/methods-client.js deleted file mode 100644 index 52f4ebec2e..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/methods-client.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -Meteor.methods({ - /** - * Update the sortField of documents with given ids in a collection, incrementing it by incDec - * @param {String} collectionName - name of the collection to update - * @param {String[]} ids - array of document ids - * @param {String} orderField - the name of the order field, usually "order" - * @param {Number} incDec - pass 1 or -1 - */ - 'rubaxa:sortable/collection-update': function (collectionName, ids, sortField, incDec) { - var selector = {_id: {$in: ids}}, modifier = {$inc: {}}; - modifier.$inc[sortField] = incDec; - Mongo.Collection.get(collectionName).update(selector, modifier, {multi: true}); - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/methods-server.js b/dashboard-ui/bower_components/Sortable/meteor/methods-server.js deleted file mode 100644 index 9598bfc992..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/methods-server.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -Sortable = {}; -Sortable.collections = []; // array of collection names that the client is allowed to reorder - -Meteor.methods({ - /** - * Update the sortField of documents with given ids in a collection, incrementing it by incDec - * @param {String} collectionName - name of the collection to update - * @param {String[]} ids - array of document ids - * @param {String} orderField - the name of the order field, usually "order" - * @param {Number} incDec - pass 1 or -1 - */ - 'rubaxa:sortable/collection-update': function (collectionName, ids, sortField, incDec) { - check(collectionName, String); - // don't allow the client to modify just any collection - if (!Sortable || !Array.isArray(Sortable.collections)) { - throw new Meteor.Error(500, 'Please define Sortable.collections'); - } - if (Sortable.collections.indexOf(collectionName) === -1) { - throw new Meteor.Error(403, 'Collection <' + collectionName + '> is not Sortable. Please add it to Sortable.collections in server code.'); - } - - check(ids, [String]); - check(sortField, String); - check(incDec, Number); - var selector = {_id: {$in: ids}}, modifier = {$inc: {}}; - modifier.$inc[sortField] = incDec; - Mongo.Collection.get(collectionName).update(selector, modifier, {multi: true}); - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/package.js b/dashboard-ui/bower_components/Sortable/meteor/package.js deleted file mode 100644 index aaa048eea4..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/package.js +++ /dev/null @@ -1,85 +0,0 @@ -// Package metadata file for Meteor.js -'use strict'; - -var packageName = 'rubaxa:sortable'; // https://atmospherejs.com/rubaxa/sortable -var gitHubPath = 'RubaXa/Sortable'; // https://github.com/RubaXa/Sortable -var npmPackageName = 'sortablejs'; // https://www.npmjs.com/package/sortablejs - optional but recommended; used as fallback if GitHub fails - -/* All of the below is just to get the version number of the 3rd party library. - * First we'll try to read it from package.json. This works when publishing or testing the package - * but not when running an example app that uses a local copy of the package because the current - * directory will be that of the app, and it won't have package.json. Finding the path of a file is hard: - * http://stackoverflow.com/questions/27435797/how-do-i-obtain-the-path-of-a-file-in-a-meteor-package - * Therefore, we'll fall back to GitHub (which is more frequently updated), and then to NPMJS. - * We also don't have the HTTP package at this stage, and if we use Package.* in the request() callback, - * it will error that it must be run in a Fiber. So we'll use Node futures. - */ -var request = Npm.require('request'); -var Future = Npm.require('fibers/future'); - -var fut = new Future; -var version; - -if (!version) try { - var packageJson = JSON.parse(Npm.require('fs').readFileSync('../package.json')); - version = packageJson.version; -} catch (e) { - // if the file was not found, fall back to GitHub - console.warn('Could not find ../package.json to read version number from; trying GitHub...'); - var url = 'https://api.github.com/repos/' + gitHubPath + '/tags'; - request.get({ - url: url, - headers: { - 'User-Agent': 'request' // GitHub requires it - } - }, function (error, response, body) { - if (!error && response.statusCode === 200) { - var versions = JSON.parse(body).map(function (version) { - return version['name'].replace(/^\D+/, '') // trim leading non-digits from e.g. "v4.3.0" - }).sort(); - fut.return(versions[versions.length -1]); - } else { - // GitHub API rate limit reached? Fall back to npmjs. - console.warn('GitHub request to', url, 'failed:\n ', response && response.statusCode, response && response.body, error || '', '\nTrying NPMJS...'); - url = 'http://registry.npmjs.org/' + npmPackageName + '/latest'; - request.get(url, function (error, response, body) { - if (!error && response.statusCode === 200) - fut.return(JSON.parse(body).version); - else - fut.throw('Could not get version information from ' + url + ' either (incorrect package name?):\n' + (response && response.statusCode || '') + (response && response.body || '') + (error || '')); - }); - } - }); - - version = fut.wait(); -} - -// Now that we finally have an accurate version number... -Package.describe({ - name: packageName, - summary: 'Sortable: reactive minimalist reorderable drag-and-drop lists on modern browsers and touch devices', - version: version, - git: 'https://github.com/RubaXa/Sortable.git', - documentation: 'README.md' -}); - -Package.onUse(function (api) { - api.versionsFrom(['METEOR@0.9.0', 'METEOR@1.0']); - api.use('templating', 'client'); - api.use('dburles:mongo-collection-instances@0.3.4'); // to watch collections getting created - api.export('Sortable'); // exported on the server too, as a global to hold the array of sortable collections (for security) - api.addFiles([ - '../Sortable.js', - 'template.html', // the HTML comes first, so reactivize.js can refer to the template in it - 'reactivize.js' - ], 'client'); - api.addFiles('methods-client.js', 'client'); - api.addFiles('methods-server.js', 'server'); -}); - -Package.onTest(function (api) { - api.use(packageName, 'client'); - api.use('tinytest', 'client'); - - api.addFiles('test.js', 'client'); -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/publish.sh b/dashboard-ui/bower_components/Sortable/meteor/publish.sh deleted file mode 100644 index af392cac1c..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/publish.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Publish package to Meteor's repository, Atmospherejs.com - -# Make sure Meteor is installed, per https://www.meteor.com/install. -# The curl'ed script is totally safe; takes 2 minutes to read its source and check. -type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; } - -# sanity check: make sure we're in the directory of the script -cd "$( dirname "$0" )" - -# publish package, creating it if it's the first time we're publishing -PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2) - -echo "Publishing $PACKAGE_NAME..." - -# Attempt to re-publish the package - the most common operation once the initial release has -# been made. If the package name was changed (rare), you'll have to pass the --create flag. -meteor publish "$@"; EXIT_CODE=$? -if (( $EXIT_CODE == 0 )); then - echo "Thanks for releasing a new version. You can see it at" - echo "https://atmospherejs.com/${PACKAGE_NAME/://}" -else - echo "We have an error. Please post it at https://github.com/RubaXa/Sortable/issues" -fi - -exit $EXIT_CODE diff --git a/dashboard-ui/bower_components/Sortable/meteor/reactivize.js b/dashboard-ui/bower_components/Sortable/meteor/reactivize.js deleted file mode 100644 index ae7ff4b8d9..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/reactivize.js +++ /dev/null @@ -1,201 +0,0 @@ -/* -Make a Sortable reactive by binding it to a Mongo.Collection. -Calls `rubaxa:sortable/collection-update` on the server to update the sortField of affected records. - -TODO: - * supply consecutive values if the `order` field doesn't have any - * .get(DOMElement) - return the Sortable object of a DOMElement - * create a new _id automatically onAdd if the event.from list had pull: 'clone' - * support arrays - * sparse arrays - * tests - * drop onto existing empty lists - * insert back into lists emptied by dropping - * performance on dragging into long list at the beginning - * handle failures on Collection operations, e.g. add callback to .insert - * when adding elements, update ranks just for the half closer to the start/end of the list - * revisit http://programmers.stackexchange.com/questions/266451/maintain-ordered-collection-by-updating-as-few-order-fields-as-possible - * reproduce the insidious bug where the list isn't always sorted (fiddle with dragging #1 over #2, then back, then #N before #1) - - */ - -'use strict'; - -Template.sortable.created = function () { - var templateInstance = this; - // `this` is a template instance that can store properties of our choice - http://docs.meteor.com/#/full/template_inst - if (templateInstance.setupDone) return; // paranoid: only run setup once - // this.data is the data context - http://docs.meteor.com/#/full/template_data - // normalize all options into templateInstance.options, and remove them from .data - templateInstance.options = templateInstance.data.options || {}; - Object.keys(templateInstance.data).forEach(function (key) { - if (key === 'options' || key === 'items') return; - templateInstance.options[key] = templateInstance.data[key]; - delete templateInstance.data[key]; - }); - templateInstance.options.sortField = templateInstance.options.sortField || 'order'; - // We can get the collection via the .collection property of the cursor, but changes made that way - // will NOT be sent to the server - https://github.com/meteor/meteor/issues/3271#issuecomment-66656257 - // Thus we need to use dburles:mongo-collection-instances to get a *real* collection - if (templateInstance.data.items && templateInstance.data.items.collection) { - // cursor passed via items=; its .collection works client-only and has a .name property - templateInstance.collectionName = templateInstance.data.items.collection.name; - templateInstance.collection = Mongo.Collection.get(templateInstance.collectionName); - } else if (templateInstance.data.items) { - // collection passed via items=; does NOT have a .name property, but _name - templateInstance.collection = templateInstance.data.items; - templateInstance.collectionName = templateInstance.collection._name; - } else if (templateInstance.data.collection) { - // cursor passed directly - templateInstance.collectionName = templateInstance.data.collection.name; - templateInstance.collection = Mongo.Collection.get(templateInstance.collectionName); - } else { - templateInstance.collection = templateInstance.data; // collection passed directly - templateInstance.collectionName = templateInstance.collection._name; - } - - // TODO if (Array.isArray(templateInstance.collection)) - - // What if user filters some of the items in the cursor, instead of ordering the entire collection? - // Use case: reorder by preference movies of a given genre, a filter within all movies. - // A: Modify all intervening items **that are on the client**, to preserve the overall order - // TODO: update *all* orders via a server method that takes not ids, but start & end elements - mild security risk - delete templateInstance.data.options; - - /** - * When an element was moved, adjust its orders and possibly the order of - * other elements, so as to maintain a consistent and correct order. - * - * There are three approaches to this: - * 1) Using arbitrary precision arithmetic and setting only the order of the moved - * element to the average of the orders of the elements around it - - * http://programmers.stackexchange.com/questions/266451/maintain-ordered-collection-by-updating-as-few-order-fields-as-possible - * The downside is that the order field in the DB will increase by one byte every - * time an element is reordered. - * 2) Adjust the orders of the intervening items. This keeps the orders sane (integers) - * but is slower because we have to modify multiple documents. - * TODO: we may be able to update fewer records by only altering the - * order of the records between the newIndex/oldIndex and the start/end of the list. - * 3) Use regular precision arithmetic, but when the difference between the orders of the - * moved item and the one before/after it falls below a certain threshold, adjust - * the order of that other item, and cascade doing so up or down the list. - * This will keep the `order` field constant in size, and will only occasionally - * require updating the `order` of other records. - * - * For now, we use approach #2. - * - * @param {String} itemId - the _id of the item that was moved - * @param {Number} orderPrevItem - the order of the item before it, or null - * @param {Number} orderNextItem - the order of the item after it, or null - */ - templateInstance.adjustOrders = function adjustOrders(itemId, orderPrevItem, orderNextItem) { - var orderField = templateInstance.options.sortField; - var selector = templateInstance.options.selector || {}, modifier = {$set: {}}; - var ids = []; - var startOrder = templateInstance.collection.findOne(itemId)[orderField]; - if (orderPrevItem !== null) { - // Element has a previous sibling, therefore it was moved down in the list. - // Decrease the order of intervening elements. - selector[orderField] = {$lte: orderPrevItem, $gt: startOrder}; - ids = _.pluck(templateInstance.collection.find(selector, {fields: {_id: 1}}).fetch(), '_id'); - Meteor.call('rubaxa:sortable/collection-update', templateInstance.collectionName, ids, orderField, -1); - - // Set the order of the dropped element to the order of its predecessor, whose order was decreased - modifier.$set[orderField] = orderPrevItem; - } else { - // element moved up the list, increase order of intervening elements - selector[orderField] = {$gte: orderNextItem, $lt: startOrder}; - ids = _.pluck(templateInstance.collection.find(selector, {fields: {_id: 1}}).fetch(), '_id'); - Meteor.call('rubaxa:sortable/collection-update', templateInstance.collectionName, ids, orderField, 1); - - // Set the order of the dropped element to the order of its successor, whose order was increased - modifier.$set[orderField] = orderNextItem; - } - templateInstance.collection.update(itemId, modifier); - }; - - templateInstance.setupDone = true; -}; - - -Template.sortable.rendered = function () { - var templateInstance = this; - var orderField = templateInstance.options.sortField; - - // sorting was changed within the list - var optionsOnUpdate = templateInstance.options.onUpdate; - templateInstance.options.onUpdate = function sortableUpdate(/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - if (event.newIndex < event.oldIndex) { - // Element moved up in the list. The dropped element has a next sibling for sure. - var orderNextItem = Blaze.getData(itemEl.nextElementSibling)[orderField]; - templateInstance.adjustOrders(event.data._id, null, orderNextItem); - } else if (event.newIndex > event.oldIndex) { - // Element moved down in the list. The dropped element has a previous sibling for sure. - var orderPrevItem = Blaze.getData(itemEl.previousElementSibling)[orderField]; - templateInstance.adjustOrders(event.data._id, orderPrevItem, null); - } else { - // do nothing - drag and drop in the same location - } - if (optionsOnUpdate) optionsOnUpdate(event); - }; - - // element was added from another list - var optionsOnAdd = templateInstance.options.onAdd; - templateInstance.options.onAdd = function sortableAdd(/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - // let the user decorate the object with additional properties before insertion - if (optionsOnAdd) optionsOnAdd(event); - - // Insert the new element at the end of the list and move it where it was dropped. - // We could insert it at the beginning, but that would lead to negative orders. - var sortSpecifier = {}; sortSpecifier[orderField] = -1; - event.data.order = templateInstance.collection.findOne({}, { sort: sortSpecifier, limit: 1 }).order + 1; - // TODO: this can obviously be optimized by setting the order directly as the arithmetic average, with the caveats described above - var newElementId = templateInstance.collection.insert(event.data); - event.data._id = newElementId; - if (itemEl.nextElementSibling) { - var orderNextItem = Blaze.getData(itemEl.nextElementSibling)[orderField]; - templateInstance.adjustOrders(newElementId, null, orderNextItem); - } else { - // do nothing - inserted after the last element - } - // remove the dropped HTMLElement from the list because we have inserted it in the collection, which will update the template - itemEl.parentElement.removeChild(itemEl); - }; - - // element was removed by dragging into another list - var optionsOnRemove = templateInstance.options.onRemove; - templateInstance.options.onRemove = function sortableRemove(/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - // don't remove from the collection if group.pull is clone or false - if (typeof templateInstance.options.group === 'undefined' - || typeof templateInstance.options.group.pull === 'undefined' - || templateInstance.options.group.pull === true - ) templateInstance.collection.remove(event.data._id); - if (optionsOnRemove) optionsOnRemove(event); - }; - - // just compute the `data` context - ['onStart', 'onEnd', 'onSort', 'onFilter'].forEach(function (eventHandler) { - if (templateInstance.options[eventHandler]) { - var userEventHandler = templateInstance.options[eventHandler]; - templateInstance.options[eventHandler] = function (/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - userEventHandler(event); - }; - } - }); - - templateInstance.sortable = Sortable.create(templateInstance.firstNode.parentElement, templateInstance.options); - // TODO make the object accessible, e.g. via Sortable.getSortableById() or some such -}; - - -Template.sortable.destroyed = function () { - if(this.sortable) this.sortable.destroy(); -}; diff --git a/dashboard-ui/bower_components/Sortable/meteor/runtests.bat b/dashboard-ui/bower_components/Sortable/meteor/runtests.bat deleted file mode 100644 index 9bddf93487..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/runtests.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -REM Test Meteor package before publishing to Atmospherejs.com - -REM Sanity check: make sure we're in the directory of the script -set DIR=%~dp0 -cd %DIR% - -meteor test-packages ./ %* diff --git a/dashboard-ui/bower_components/Sortable/meteor/runtests.sh b/dashboard-ui/bower_components/Sortable/meteor/runtests.sh deleted file mode 100644 index 0e738a7e89..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/runtests.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -# Test Meteor package before publishing to Atmospherejs.com - -# Make sure Meteor is installed, per https://www.meteor.com/install. -# The curl'ed script is totally safe; takes 2 minutes to read its source and check. -type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; } - -# sanity check: make sure we're in the directory of the script -cd "$( dirname "$0" )" - - -# delete the temporary files even if Ctrl+C is pressed -int_trap() { - printf "\nTests interrupted. Cleaning up...\n\n" -} -trap int_trap INT - - -EXIT_CODE=0 - -PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2) - -echo "### Testing $PACKAGE_NAME..." - -# provide an invalid MONGO_URL so Meteor doesn't bog us down with an empty Mongo database -if [ $# -gt 0 ]; then - # interpret any parameter to mean we want an interactive test - MONGO_URL=mongodb:// meteor test-packages ./ -else - # automated/CI test with phantomjs - ./node_modules/.bin/spacejam --mongo-url mongodb:// test-packages ./ - EXIT_CODE=$(( $EXIT_CODE + $? )) -fi - -exit $EXIT_CODE diff --git a/dashboard-ui/bower_components/Sortable/meteor/template.html b/dashboard-ui/bower_components/Sortable/meteor/template.html deleted file mode 100644 index 3923d3d9cc..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/template.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/dashboard-ui/bower_components/Sortable/meteor/test.js b/dashboard-ui/bower_components/Sortable/meteor/test.js deleted file mode 100644 index f7c00a9fbf..0000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/test.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -Tinytest.add('Sortable.is', function (test) { - var items = document.createElement('ul'); - items.innerHTML = '
  • item 1
  • item 2
  • item 3
  • '; - var sortable = new Sortable(items); - test.instanceOf(sortable, Sortable, 'Instantiation OK'); - test.length(sortable.toArray(), 3, 'Three elements'); -}); diff --git a/dashboard-ui/bower_components/Sortable/st/app.css b/dashboard-ui/bower_components/Sortable/st/app.css deleted file mode 100644 index 6a97f8e496..0000000000 --- a/dashboard-ui/bower_components/Sortable/st/app.css +++ /dev/null @@ -1,239 +0,0 @@ -html { - background-image: -webkit-linear-gradient(bottom, #F4E2C9 20%, #F4D7C9 100%); - background-image: -ms-linear-gradient(bottom, #F4E2C9 20%, #F4D7C9 100%); - background-image: linear-gradient(to bottom, #F4E2C9 20%, #F4D7C9 100%); -} - -html, body { - margin: 0; - padding: 0; - position: relative; - color: #464637; - min-height: 100%; - font-size: 20px; - font-family: 'Roboto', sans-serif; - font-weight: 300; -} - - -h1 { - color: #FF3F00; - font-size: 20px; - font-family: 'Roboto', sans-serif; - font-weight: 300; - text-align: center; -} - - -ul { - margin: 0; - padding: 0; - list-style: none; -} - -.container { - width: 80%; - margin: auto; - min-width: 1100px; - max-width: 1300px; - position: relative; -} - -@media (min-width: 750px) and (max-width: 970px){ - .container { - width: 100%; - min-width: 750px; - } -} - - -.sortable-ghost { - opacity: .2; -} - - -img { - border: 0; - vertical-align: middle; -} - - -.logo { - top: 55px; - left: 30px; - position: absolute; -} - - -.title { - color: #fff; - padding: 3px 10px; - display: inline-block; - position: relative; - background-color: #FF7373; - z-index: 1000; -} - .title_xl { - padding: 3px 15px; - font-size: 40px; - } - - - -.tile { - width: 22%; - min-width: 245px; - color: #FF7270; - padding: 10px 30px; - text-align: center; - margin-top: 15px; - margin-left: 5px; - margin-right: 30px; - background-color: #fff; - display: inline-block; - vertical-align: top; -} - .tile__name { - cursor: move; - padding-bottom: 10px; - border-bottom: 1px solid #FF7373; - } - - .tile__list { - margin-top: 10px; - } - .tile__list:last-child { - margin-right: 0; - min-height: 80px; - } - - .tile__list img { - cursor: move; - margin: 10px; - border-radius: 100%; - } - - - -.block { - opacity: 1; - position: absolute; -} - .block__list { - padding: 20px 0; - max-width: 360px; - margin-top: -8px; - margin-left: 5px; - background-color: #fff; - } - .block__list-title { - margin: -20px 0 0; - padding: 10px; - text-align: center; - background: #5F9EDF; - } - .block__list li { cursor: move; } - - .block__list_words li { - background-color: #fff; - padding: 10px 40px; - } - .block__list_words .sortable-ghost { - opacity: 0.4; - background-color: #F4E2C9; - } - - .block__list_words li:first-letter { - text-transform: uppercase; - } - - .block__list_tags { - padding-left: 30px; - } - - .block__list_tags:after { - clear: both; - content: ''; - display: block; - } - .block__list_tags li { - color: #fff; - float: left; - margin: 8px 20px 10px 0; - padding: 5px 10px; - min-width: 10px; - background-color: #5F9EDF; - text-align: center; - } - .block__list_tags li:first-child:first-letter { - text-transform: uppercase; - } - - - -#editable {} - #editable li { - position: relative; - } - - #editable i { - -webkit-transition: opacity .2s; - transition: opacity .2s; - opacity: 0; - display: block; - cursor: pointer; - color: #c00; - top: 10px; - right: 40px; - position: absolute; - font-style: normal; - } - - #editable li:hover i { - opacity: 1; - } - - -#filter {} - #filter button { - color: #fff; - width: 100%; - border: none; - outline: 0; - opacity: .5; - margin: 10px 0 0; - transition: opacity .1s ease; - cursor: pointer; - background: #5F9EDF; - padding: 10px 0; - font-size: 20px; - } - #filter button:hover { - opacity: 1; - } - - #filter .block__list { - padding-bottom: 0; - } - -.drag-handle { - margin-right: 10px; - font: bold 20px Sans-Serif; - color: #5F9EDF; - display: inline-block; - cursor: move; - cursor: -webkit-grabbing; /* overrides 'move' */ -} - -#todos input { - padding: 5px; - font-size: 14px; - font-family: 'Roboto', sans-serif; - font-weight: 300; -} - - - -#nested ul li { - background-color: rgba(0,0,0,.05); -} diff --git a/dashboard-ui/bower_components/Sortable/st/app.js b/dashboard-ui/bower_components/Sortable/st/app.js deleted file mode 100644 index 164270d9ad..0000000000 --- a/dashboard-ui/bower_components/Sortable/st/app.js +++ /dev/null @@ -1,226 +0,0 @@ -(function () { - 'use strict'; - - var byId = function (id) { return document.getElementById(id); }, - - loadScripts = function (desc, callback) { - var deps = [], key, idx = 0; - - for (key in desc) { - deps.push(key); - } - - (function _next() { - var pid, - name = deps[idx], - script = document.createElement('script'); - - script.type = 'text/javascript'; - script.src = desc[deps[idx]]; - - pid = setInterval(function () { - if (window[name]) { - clearTimeout(pid); - - deps[idx++] = window[name]; - - if (deps[idx]) { - _next(); - } else { - callback.apply(null, deps); - } - } - }, 30); - - document.getElementsByTagName('head')[0].appendChild(script); - })() - }, - - console = window.console; - - - if (!console.log) { - console.log = function () { - alert([].join.apply(arguments, ' ')); - }; - } - - - Sortable.create(byId('foo'), { - group: "words", - animation: 150, - store: { - get: function (sortable) { - var order = localStorage.getItem(sortable.options.group); - return order ? order.split('|') : []; - }, - set: function (sortable) { - var order = sortable.toArray(); - localStorage.setItem(sortable.options.group, order.join('|')); - } - }, - onAdd: function (evt){ console.log('onAdd.foo:', [evt.item, evt.from]); }, - onUpdate: function (evt){ console.log('onUpdate.foo:', [evt.item, evt.from]); }, - onRemove: function (evt){ console.log('onRemove.foo:', [evt.item, evt.from]); }, - onStart:function(evt){ console.log('onStart.foo:', [evt.item, evt.from]);}, - onSort:function(evt){ console.log('onStart.foo:', [evt.item, evt.from]);}, - onEnd: function(evt){ console.log('onEnd.foo:', [evt.item, evt.from]);} - }); - - - Sortable.create(byId('bar'), { - group: "words", - animation: 150, - onAdd: function (evt){ console.log('onAdd.bar:', evt.item); }, - onUpdate: function (evt){ console.log('onUpdate.bar:', evt.item); }, - onRemove: function (evt){ console.log('onRemove.bar:', evt.item); }, - onStart:function(evt){ console.log('onStart.foo:', evt.item);}, - onEnd: function(evt){ console.log('onEnd.foo:', evt.item);} - }); - - - // Multi groups - Sortable.create(byId('multi'), { - animation: 150, - draggable: '.tile', - handle: '.tile__name' - }); - - [].forEach.call(byId('multi').getElementsByClassName('tile__list'), function (el){ - Sortable.create(el, { - group: 'photo', - animation: 150 - }); - }); - - - // Editable list - var editableList = Sortable.create(byId('editable'), { - animation: 150, - filter: '.js-remove', - onFilter: function (evt) { - evt.item.parentNode.removeChild(evt.item); - } - }); - - - byId('addUser').onclick = function () { - Ply.dialog('prompt', { - title: 'Add', - form: { name: 'name' } - }).done(function (ui) { - var el = document.createElement('li'); - el.innerHTML = ui.data.name + ''; - editableList.el.appendChild(el); - }); - }; - - - // Advanced groups - [{ - name: 'advanced', - pull: true, - put: true - }, - { - name: 'advanced', - pull: 'clone', - put: false - }, { - name: 'advanced', - pull: false, - put: true - }].forEach(function (groupOpts, i) { - Sortable.create(byId('advanced-' + (i + 1)), { - sort: (i != 1), - group: groupOpts, - animation: 150 - }); - }); - - - // 'handle' option - Sortable.create(byId('handle-1'), { - handle: '.drag-handle', - animation: 150 - }); - - - // Angular example - angular.module('todoApp', ['ng-sortable']) - .constant('ngSortableConfig', {onEnd: function() { - console.log('default onEnd()'); - }}) - .controller('TodoController', ['$scope', function ($scope) { - $scope.todos = [ - {text: 'learn angular', done: true}, - {text: 'build an angular app', done: false} - ]; - - $scope.addTodo = function () { - $scope.todos.push({text: $scope.todoText, done: false}); - $scope.todoText = ''; - }; - - $scope.remaining = function () { - var count = 0; - angular.forEach($scope.todos, function (todo) { - count += todo.done ? 0 : 1; - }); - return count; - }; - - $scope.archive = function () { - var oldTodos = $scope.todos; - $scope.todos = []; - angular.forEach(oldTodos, function (todo) { - if (!todo.done) $scope.todos.push(todo); - }); - }; - }]) - .controller('TodoControllerNext', ['$scope', function ($scope) { - $scope.todos = [ - {text: 'learn Sortable', done: true}, - {text: 'use ng-sortable', done: false}, - {text: 'Enjoy', done: false} - ]; - - $scope.remaining = function () { - var count = 0; - angular.forEach($scope.todos, function (todo) { - count += todo.done ? 0 : 1; - }); - return count; - }; - - $scope.sortableConfig = { group: 'todo', animation: 150 }; - 'Start End Add Update Remove Sort'.split(' ').forEach(function (name) { - $scope.sortableConfig['on' + name] = console.log.bind(console, name); - }); - }]); -})(); - - - -// Background -document.addEventListener("DOMContentLoaded", function () { - function setNoiseBackground(el, width, height, opacity) { - var canvas = document.createElement("canvas"); - var context = canvas.getContext("2d"); - - canvas.width = width; - canvas.height = height; - - for (var i = 0; i < width; i++) { - for (var j = 0; j < height; j++) { - var val = Math.floor(Math.random() * 255); - context.fillStyle = "rgba(" + val + "," + val + "," + val + "," + opacity + ")"; - context.fillRect(i, j, 1, 1); - } - } - - el.style.background = "url(" + canvas.toDataURL("image/png") + ")"; - } - - setNoiseBackground(document.getElementsByTagName('body')[0], 50, 50, 0.02); -}, false); diff --git a/dashboard-ui/bower_components/Sortable/st/face-01.jpg b/dashboard-ui/bower_components/Sortable/st/face-01.jpg deleted file mode 100644 index 06f9640b2844ddde69fb167e8709f915ef1690d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3172 zcmb_d3pCXE7yr(TnPI$U7-K@rj7LVEL**4smR*l!2qCMGO31TC9-ENI5K$&l>-|VX zY+=PB@_r;GlviwdEum8E>~FNK-E;o?Kj(kW|IV4;_jB&ObMKvdKll4%53$Dq*2Kuz z2*BU~z@QIc{|>km0DBTHVQgSg$6fJ9`Hb zdKCKA4uAkupyll9??Y!W%)r0OyQiES01PN`V*RVze>Px_yZO69rVZ%pZBMUEd#$> z@bEc@jH}29z3tu*HqiV=mCa_400V&HLZXmdC=?QfMx(efSPX`T2ZI+7Mi9}I6 zfgrY1R!U4;vY7M`v}1GUo69b4*^BQ z!Ew-Yu(E=$%}Qg(kox7aXPPuEUQ~zM@8CX4y^jhoybd6Bru$>WlduF3+IVXWd{(ziYZ%@NlxKIBt$D)c3GAC$g% zE<86Tmj(T8SuB9VxL{mx#Fvh75Eo8}gcK&LQKYeWI*mOHxFIVH37-fI;!Rsab}P)t zd&j#AE08R?kH@QOOT4 zs^TXlZ1|RX&G}PdWPYu7i|g>0y^$B;XS=a&sm;R3Xw!o9nZhv>#UY>BTb~9_+fX}( z3!Gzh#V#dLj*cKryfn|cdCP=l^R8vSr~DX@UA%u{sw$x6ec6WxVQux5=)-RW=l96` zeCmE`{s{h%NLGN%%5Ztb?%ut{=Z~d4tqvT0QihkfF&Q(jQ&Nu49@{s1qV|-RZ+B$* z#>6F>LOM00yjJ819v}Wq1vtX*aTq7AiMMt@n$6@;?cB9UHiQl7cw3bhvdq9!L3#0N=g4y`i!T`<#zK_* zB3l`t1VS{+tqjm2=)+_c^j@;QIvFZE@~kL{=WK~6AG6|4^JJ_~TkXp|re}MfH(w{muTE(0C8u{lRWE(r!F!WNx zdiu^aMVu*{Wq7!^TU-8~U9xH|Q64wtk<tfT z#V=z>GaD`U2@}4ZwrL}wWsQWIJV~4n7SH7rCfzRQdUsi^@RK}tG_%VDF=%SGfHoHH zn|7@I>5x7T*%nh|-Mnjpd$zA+TCzQ{IV;=E7Yj;NKSX@Ot3d}q51d)LKArAxaRBw_R1{u46`%94VrET8YgutKzM zu}r3T*@{uOqo})+ajaG(*4l?$>Gi-oZa6zQL(iA7df#eOn;uhZb|1? zqlH4h(wWbSo0I98W^`|@q$d?g@(q(#RO03yG;p|r_FHo{{rbilvH|0=5uRUEReb;9 z>EVI$5K46e{IL;AI0l-`)4__q1upXgVh3sqV{qXFBCAWtU+8(MfVDM7m(X|L)Mb|FsZz z7Vev!xQVbPtosux1V7fQnyq(2Yg-gA(X9Hd^p!WUu8@I{?LK%V3Vdj%`wPyU7cw+N@JWpd}FA@Ph>@({rnGe8iRoV diff --git a/dashboard-ui/bower_components/Sortable/st/face-02.jpg b/dashboard-ui/bower_components/Sortable/st/face-02.jpg deleted file mode 100644 index 9063724c897569d917d1e17e1f4be339ffa78af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4445 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 diff --git a/dashboard-ui/bower_components/Sortable/st/face-03.jpg b/dashboard-ui/bower_components/Sortable/st/face-03.jpg deleted file mode 100644 index 3e64a48bdb478019f39c1e7e96ff031f7ed59321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2907 zcmb_c2~-nV7X6jo$Wnm-A#8yFCecViKtrRf5=2o*a6x5Fpe2B^DqthXjwlGUfY{oK zf@>>_qQcOE%_0KQf@muu1hsKNG&U_R4Z~Ex5$7DI&zW=PfV$L zz$*l<0svtEfY2Y98U=?ug2Q9Nql3dE7`%lD;5)jm!r_1-cIjd^1FE03AlxN*k(X7# zR*`h0X#H|O?iyVT3y1}dtCk_=2!aHN`3Mh1#F~#-Dp1TrtP~h%IfFiXG4mtOQ>`3Y|L++i3`OEDhhV z^DJmK1p>S<)@L*{Vh4VA)xm_HqzyZ7H$6wDrluYMCqTgA33wcVfF}@%1QHo0ljqDK zQ&m)zU@a<*rbX4%r0ba&&~=!)nwpFS45sNkHixZkz(u$$#Dv9WDJFr4L?W3)Rwt9y zS#(W0>wk`^UjT&!0zn`a7y*a^VJOg4Gtfad6tA%C=fFZ39DxY%=%5DlA0vtq#WP<` z_W>m=I!wV(6c&l^k3J-Kx!CuZquH{7B{hyA==#_8Q(m&%*WaktYVh_g!`Wt?wd;Df zM8qW62QO`d_cBJx&DQSw*3Ff;Jk7CY#a&+YDW1wPW*)C^XuPjL$0ViV^|gr}d(+K# zUp^U2k$b4;*|f^CTdZ8~cQxqGD}DODY{z`P)wuzbZa8ll<8HliM>;iQ^591eryGwi z=3=ko4yCn(<~qv)DZ9;cVC!A}=3PLqKMC!}1O^Zm2jQ@vyM-`V9KgdAHG;aKIm5_- z%A4u~Bvd5`kLjw+(Dh-LAE&<`0b(3<;&FEt=?CdUe%}wiDgy2~qH*P5+G20^mOC%B z7M<#DYbl=GsIQ*tJ};nme84iwJb3R5wQF+S4R*I=qW(wS@fK&E4TkKb^J&$!1D9Lh zh>XhRy=#yoVT(CKoIr$N0Cp)a@!RbyxHc92U}#Ka(XS#ZxOvT*o~} z>!uFDL@@JQ?LLA7}R2T3<34abf6!4EJclBD1?m=a|cnR zI@Q84Aeot8^+|Ms9j2o_Bbu#;ymfvceUNNkNcMCe)|Gcf65bl-EkJ-d3T>tKH#N^7ho>s4-rYG3o>}=rMozXMQHi%Ms zz4`*)h3*%>ZM3P_lN9DVUPSoIS;zFd=80UIbo3{a%p^~@9m)wSx@>%#mLB`~{Eq{P zMg@!EhnbgdYsIleizJur9Xwxt!=JE!e&$m3%OaZ`lNITQ&)r`cU%WN5LACHqQqI-X zst4(u`F-#AdE%opPK~|DB%G=9jfI~sS+ArYUSDr*hpNVeA%MYP71t+yAwV%ShaH5G z`2oqLRq~;K8_>?s-+struIs4#2z@>I)b$K(%F*+hKW4Et1V_d7bzSi?ynsP|C5%#xzg4-#Gt;gs_Ru~YhJ(S+llK{ zSzeFN27foEUARQ==cbUvxy4X{idM$G6+Qd~_es^9(2fJYdp(>N8rHj~;^`hcRN~oh z7>o#pk9RJKHdAv{S*Rz?>UK73n6FexIvbq|t2fhRj(kZf>Gt>6HEvck3QSueoPxX(hlwV~jz z5{b?EpIeu&%kv$2?&4v#tEQ14b7`NrJ`5^Vo4u)SyIC;Lu|9L0v8dwS8@2Y2bGWhG z4$OvIXCh;lk)WD6w#;7Tz&(|ri0{3YVY|vp<;KXjN-Z0hMcv0gNC-kfDIxNd1BR7C zT+_LwRL;om+*V3-%BQ7s`jz_LL?*x7suNxA{(c#Gp}}*tJ-;YFxRzB?f4Q&cN$a|^ zs>bahIs?V;b~4oi7ZaUdSuzhAzEUo!HBf3YK6Dd)0m$v{mF_W`u>g)MofyT$`}5V&?r<&ez)|iUSN&0G=&Ru@3mhsKXXnkRf z=Dk#VenLU#x*d%>Gw*lOClmVv(i+dgc0s({u1#upTCSF^`GKRmLCZQh_@fEZofWp< zVdoWd%||!CXT@($oB~c4hH*5T9Yz;6YPyh&bqa;Gllav2!aM$F5v3z(&fo l31q9}6ZP#f#zSsg+ipy)r^OiVjJ3Hzvz5B+B2PMX|6k!M)n5Pr diff --git a/dashboard-ui/bower_components/Sortable/st/face-04.jpg b/dashboard-ui/bower_components/Sortable/st/face-04.jpg deleted file mode 100644 index 0e5c73bcc5411f8f778769bb523a4469442a94bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4163 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 WZjy4|SF7sxcp7%wZXK4oJ^D}HB{OsY diff --git a/dashboard-ui/bower_components/Sortable/st/face-05.jpg b/dashboard-ui/bower_components/Sortable/st/face-05.jpg deleted file mode 100644 index a8111224db9ace0ca61983fdc888a8a255d79921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3883 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 diff --git a/dashboard-ui/bower_components/Sortable/st/face-07.jpg b/dashboard-ui/bower_components/Sortable/st/face-07.jpg deleted file mode 100644 index aebd0112e5660f344d64bc5e17c84e19447e9017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3867 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 P9J$nk@BMQ@e{ - - - - - - - - - - - -
    -
    - 14 - - Drag me by the handle -
    -
    - 2 - - You can also select text -
    -
    - 1 - - Best of both worlds! -
    -
    - - - diff --git a/dashboard-ui/bower_components/Sortable/st/iframe/index.html b/dashboard-ui/bower_components/Sortable/st/iframe/index.html deleted file mode 100644 index fcd089857c..0000000000 --- a/dashboard-ui/bower_components/Sortable/st/iframe/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - IFrame playground - - - - - - - - - - - - - -
    -
    This is Sortable
    -
    It works with Bootstrap...
    -
    ...out of the box.
    -
    It has support for touch devices.
    -
    Just drag some elements around.
    -
    - - - - - diff --git a/dashboard-ui/bower_components/Sortable/st/logo.png b/dashboard-ui/bower_components/Sortable/st/logo.png deleted file mode 100644 index 76cc77c3474f3352898bb6a6effe6795c359b1cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5062 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 diff --git a/dashboard-ui/bower_components/Sortable/st/og-image.png b/dashboard-ui/bower_components/Sortable/st/og-image.png deleted file mode 100644 index 7d7a51da9a6fb573a5df0a4ea189dafa51e7231a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12039 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 diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js index 8ac2a9bb6b..d72ff544db 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js @@ -1,4 +1,4 @@ -define(['itemShortcuts', 'connectionManager', 'layoutManager', 'browser', 'dom', 'registerElement'], function (itemShortcuts, connectionManager, layoutManager, browser, dom) { +define(['itemShortcuts', 'connectionManager', 'layoutManager', 'browser', 'dom', 'loading', 'registerElement'], function (itemShortcuts, connectionManager, layoutManager, browser, dom, loading) { var ItemsContainerProtoType = Object.create(HTMLDivElement.prototype); @@ -105,6 +105,76 @@ }); }; + function onDrop(evt, itemsContainer) { + + var playlistId = itemsContainer.getAttribute('data-playlistid'); + + loading.show(); + + var el = evt.item; + + var newIndex = evt.newIndex; + var itemId = el.getAttribute('data-playlistitemid'); + + var serverId = el.getAttribute('data-serverid'); + var apiClient = connectionManager.getApiClient(serverId); + + apiClient.ajax({ + + url: apiClient.getUrl('Playlists/' + playlistId + '/Items/' + itemId + '/Move/' + newIndex), + + type: 'POST' + + }).then(function () { + + el.setAttribute('data-index', newIndex); + loading.hide(); + + }, function () { + + loading.hide(); + + itemsContainer.dispatchEvent(new CustomEvent('needsrefresh', { + detail: {}, + cancelable: false, + bubbles: true + })); + }); + } + + ItemsContainerProtoType.enableDragReordering = function (enabled) { + + var current = this.sortable; + + if (!enabled) { + if (current) { + current.destroy(); + this.sortable = null; + } + return; + } + + if (current) { + return; + } + + var self = this; + require(['sortable'], function (Sortable) { + + self.sortable = new Sortable(self, { + + draggable: ".listItem", + handle: '.listViewDragHandle', + + // dragging ended + onEnd: function (/**Event*/evt) { + + onDrop(evt, self); + } + }); + }); + }; + ItemsContainerProtoType.attachedCallback = function () { this.addEventListener('click', onClick); @@ -130,6 +200,7 @@ this.enableHoverMenu(false); this.enableMultiSelect(false); + this.enableDragReordering(false); this.removeEventListener('click', onClick); this.removeEventListener('contextmenu', onContextMenu); this.removeEventListener('contextmenu', disableEvent); diff --git a/dashboard-ui/scripts/playlistedit.js b/dashboard-ui/scripts/playlistedit.js index 4cb057da67..687aa88c0d 100644 --- a/dashboard-ui/scripts/playlistedit.js +++ b/dashboard-ui/scripts/playlistedit.js @@ -76,22 +76,6 @@ elem.setAttribute('data-playlistid', item.Id); elem.innerHTML = html; - var listParent = elem; - - require(['sortable'], function (Sortable) { - - var sortable = new Sortable(listParent, { - - draggable: ".listItem", - handle: '.listViewDragHandle', - - // dragging ended - onEnd: function (/**Event*/evt) { - - onDrop(evt, page, item); - } - }); - }); ImageLoader.lazyChildren(elem); $('.btnNextPage', elem).on('click', function () { @@ -108,37 +92,12 @@ }); } - function onDrop(evt, page, item) { - - Dashboard.showLoadingMsg(); - - var el = evt.item; - - var newIndex = evt.newIndex; - var itemId = el.getAttribute('data-playlistitemid'); - - ApiClient.ajax({ - - url: ApiClient.getUrl('Playlists/' + item.Id + '/Items/' + itemId + '/Move/' + newIndex), - - type: 'POST' - - }).then(function () { - - el.setAttribute('data-index', newIndex); - Dashboard.hideLoadingMsg(); - - }, function () { - - Dashboard.hideLoadingMsg(); - reloadItems(page, item); - }); - } - function init(page, item) { var elem = page.querySelector('#childrenContent .itemsContainer'); + elem.enableDragReordering(true); + elem.addEventListener('needsrefresh', function () { reloadItems(page, item);