1 line
12 KiB
JavaScript
1 line
12 KiB
JavaScript
!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery","jquery-ui/ui/sortable"],e):e(window.jQuery)}(function(_){"use strict";function n(e,t,s){return t<e&&e<t+s}_.widget("mjs.nestedSortable",_.extend({},_.ui.sortable.prototype,{options:{disableParentChange:!1,doNotClear:!1,expandOnHover:700,isAllowed:function(){return!0},isTree:!1,listType:"ol",maxLevels:0,protectRoot:!1,rootID:null,rtl:!1,startCollapsed:!1,tabSize:20,branchClass:"mjs-nestedSortable-branch",collapsedClass:"mjs-nestedSortable-collapsed",disableNestingClass:"mjs-nestedSortable-no-nesting",errorClass:"mjs-nestedSortable-error",expandedClass:"mjs-nestedSortable-expanded",hoveringClass:"mjs-nestedSortable-hovering",leafClass:"mjs-nestedSortable-leaf",disabledClass:"mjs-nestedSortable-disabled"},_create:function(){var i=this;if(this.element.data("ui-sortable",this.element.data("mjs-nestedSortable")),!this.element.is(this.options.listType))throw new Error("nestedSortable: Please check that the listType option is set to your actual list type");this.options.isTree&&this.options.expandOnHover&&(this.options.tolerance="intersect"),_.ui.sortable.prototype._create.apply(this,arguments),this.options.isTree&&_(this.items).each(function(){var e=this.item,t=e.hasClass(i.options.collapsedClass),s=e.hasClass(i.options.expandedClass);e.children(i.options.listType).length?(e.addClass(i.options.branchClass),t||s||(i.options.startCollapsed?e.addClass(i.options.collapsedClass):e.addClass(i.options.expandedClass))):e.addClass(i.options.leafClass)})},_destroy:function(){return this.element.removeData("mjs-nestedSortable").removeData("ui-sortable"),_.ui.sortable.prototype._destroy.apply(this,arguments)},_mouseDrag:function(e){var t,s,i,o,l,r,n,a,h,p,d,c,u,f,m,v,g=this,C=this.options,b=!1,y=_(document);for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<C.scrollSensitivity?(b=this.scrollParent.scrollTop()+C.scrollSpeed,this.scrollParent.scrollTop(b)):e.pageY-this.overflowOffset.top<C.scrollSensitivity&&(b=this.scrollParent.scrollTop()-C.scrollSpeed,this.scrollParent.scrollTop(b)),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<C.scrollSensitivity?(b=this.scrollParent.scrollLeft()+C.scrollSpeed,this.scrollParent.scrollLeft(b)):e.pageX-this.overflowOffset.left<C.scrollSensitivity&&(b=this.scrollParent.scrollLeft()-C.scrollSpeed,this.scrollParent.scrollLeft(b))):(e.pageY-y.scrollTop()<C.scrollSensitivity?(b=y.scrollTop()-C.scrollSpeed,y.scrollTop(b)):_(window).height()-(e.pageY-y.scrollTop())<C.scrollSensitivity&&(b=y.scrollTop()+C.scrollSpeed,y.scrollTop(b)),e.pageX-y.scrollLeft()<C.scrollSensitivity?(b=y.scrollLeft()-C.scrollSpeed,y.scrollLeft(b)):_(window).width()-(e.pageX-y.scrollLeft())<C.scrollSensitivity&&(b=y.scrollLeft()+C.scrollSpeed,y.scrollLeft(b))),!1!==b&&_.ui.ddmanager&&!C.dropBehaviour&&_.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),l=this.placeholder.offset().top,this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),this.hovering=this.hovering?this.hovering:null,this.mouseentered=!!this.mouseentered&&this.mouseentered,function(){var e=this.placeholder.parent().parent();e&&e.closest(".ui-sortable").length&&(r=e)}.call(this),n=this._getLevel(this.placeholder),a=this._getChildLevels(this.helper),d=document.createElement(C.listType),t=this.items.length-1;0<=t;t--)if(s=this.items[t],i=s.item[0],(o=this._intersectsWithPointer(s))&&s.instance===this.currentContainer){if(-1!==i.className.indexOf(C.disabledClass))if(2===o){if((h=this.items[t+1])&&h.item.hasClass(C.disabledClass))continue}else if(1===o&&(p=this.items[t-1])&&p.item.hasClass(C.disabledClass))continue;if(c=1===o?"next":"prev",!(i===this.currentItem[0]||this.placeholder[c]()[0]===i||_.contains(this.placeholder[0],i)||"semi-dynamic"===this.options.type&&_.contains(this.element[0],i))){if(this.mouseentered||(_(i).mouseenter(),this.mouseentered=!0),C.isTree&&_(i).hasClass(C.collapsedClass)&&C.expandOnHover&&(this.hovering||(_(i).addClass(C.hoveringClass),this.hovering=window.setTimeout(function(){_(i).removeClass(C.collapsedClass).addClass(C.expandedClass),g.refreshPositions(),g._trigger("expand",e,[g._uiHash(),i])},C.expandOnHover))),this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;_(i).mouseleave(),this.mouseentered=!1,_(i).removeClass(C.hoveringClass),this.hovering&&window.clearTimeout(this.hovering),this.hovering=null,!C.protectRoot||this.currentItem[0].parentNode===this.element[0]&&i.parentNode!==this.element[0]?C.protectRoot||this._rearrange(e,s):this.currentItem[0].parentNode!==this.element[0]&&i.parentNode===this.element[0]?(_(i).children(C.listType).length||(i.appendChild(d),C.isTree&&_(i).removeClass(C.leafClass).addClass(C.branchClass+" "+C.expandedClass)),void 0!==(u="down"===this.direction?_(i).prev().children(C.listType):_(i).children(C.listType))[0]&&this._rearrange(e,null,u)):this._rearrange(e,s),this._clearEmpty(i),this._trigger("change",e,this._uiHash());break}}if(function(){var e=this.placeholder.prev();f=e.length?e:null}.call(this),null!=f)for(;"li"!==f[0].nodeName.toLowerCase()||-1!==f[0].className.indexOf(C.disabledClass)||f[0]===this.currentItem[0]||f[0]===this.helper[0];){if(!f[0].previousSibling){f=null;break}f=_(f[0].previousSibling)}if(function(){var e=this.placeholder.next();m=e.length?e:null}.call(this),null!=m)for(;"li"!==m[0].nodeName.toLowerCase()||-1!==m[0].className.indexOf(C.disabledClass)||m[0]===this.currentItem[0]||m[0]===this.helper[0];){if(!m[0].nextSibling){m=null;break}m=_(m[0].nextSibling)}return this.beyondMaxLevels=0,null==r||null!=m||C.protectRoot&&r[0].parentNode==this.element[0]||!(C.rtl&&this.positionAbs.left+this.helper.outerWidth()>r.offset().left+r.outerWidth()||!C.rtl&&this.positionAbs.left<r.offset().left)?null==f||f.hasClass(C.disableNestingClass)||!(f.children(C.listType).length&&f.children(C.listType).is(":visible")||!f.children(C.listType).length)||C.protectRoot&&this.currentItem[0].parentNode===this.element[0]||!(C.rtl&&this.positionAbs.left+this.helper.outerWidth()<f.offset().left+f.outerWidth()-C.tabSize||!C.rtl&&this.positionAbs.left>f.offset().left+C.tabSize)?this._isAllowed(r,n,n+a):(this._isAllowed(f,n,n+a+1),f.children(C.listType).length||(f[0].appendChild(d),C.isTree&&f.removeClass(C.leafClass).addClass(C.branchClass+" "+C.expandedClass)),l&&l<=f.offset().top?f.children(C.listType).prepend(this.placeholder):f.children(C.listType)[0].appendChild(this.placeholder[0]),void 0!==r&&this._clearEmpty(r[0]),this._trigger("change",e,this._uiHash())):(r.after(this.placeholder[0]),v=!r.children(C.listItem).children("li:visible:not(.ui-sortable-helper)").length,C.isTree&&v&&r.removeClass(this.options.branchClass+" "+this.options.expandedClass).addClass(this.options.leafClass),void 0!==r&&this._clearEmpty(r[0]),this._trigger("change",e,this._uiHash())),this._contactContainers(e),_.ui.ddmanager&&_.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e){this.beyondMaxLevels&&(this.placeholder.removeClass(this.options.errorClass),this.domPosition.prev?_(this.domPosition.prev).after(this.placeholder):_(this.domPosition.parent).prepend(this.placeholder),this._trigger("revert",e,this._uiHash())),_("."+this.options.hoveringClass).mouseleave().removeClass(this.options.hoveringClass),this.mouseentered=!1,this.hovering&&window.clearTimeout(this.hovering),this.hovering=null,this._relocate_event=e,this._pid_current=_(this.domPosition.parent).parent().attr("id"),this._sort_current=this.domPosition.prev?_(this.domPosition.prev).next().index():0,_.ui.sortable.prototype._mouseStop.apply(this,arguments)},_intersectsWithSides:function(e){var t=this.options.isTree?.8:.5,s=n(this.positionAbs.top+this.offset.click.top,e.top+e.height*t,e.height),i=n(this.positionAbs.top+this.offset.click.top,e.top-e.height*t,e.height),o=n(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),l=this._getDragVerticalDirection(),r=this._getDragHorizontalDirection();return this.floating&&r?"right"===r&&o||"left"===r&&!o:l&&("down"===l&&s||"up"===l&&i)},_contactContainers:function(){this.options.protectRoot&&this.currentItem[0].parentNode===this.element[0]||_.ui.sortable.prototype._contactContainers.apply(this,arguments)},_clear:function(){var e,t;for(_.ui.sortable.prototype._clear.apply(this,arguments),this._pid_current===this._uiHash().item.parent().parent().attr("id")&&this._sort_current===this._uiHash().item.index()||this._trigger("relocate",this._relocate_event,this._uiHash()),e=this.items.length-1;0<=e;e--)t=this.items[e].item[0],this._clearEmpty(t)},serialize:function(e){var s=_.extend({},this.options,e),t=this._getItemsAsjQuery(s&&s.connected),i=[];return _(t).each(function(){var e=(_(s.item||this).attr(s.attribute||"id")||"").match(s.expression||/(.+)[-=_](.+)/),t=(_(s.item||this).parent(s.listType).parent(s.items).attr(s.attribute||"id")||"").match(s.expression||/(.+)[-=_](.+)/);e&&i.push((s.key||e[1])+"["+(s.key&&s.expression?e[1]:e[2])+"]="+(t?s.key&&s.expression?t[1]:t[2]:s.rootID))}),!i.length&&s.key&&i.push(s.key+"="),i.join("&")},toHierarchy:function(e){var l=_.extend({},this.options,e),t=[];return _(this.element).children(l.items).each(function(){var e=function t(e){var s,i=(_(e).attr(l.attribute||"id")||"").match(l.expression||/(.+)[-=_](.+)/);var o=_(e).data();o.nestedSortableItem&&delete o.nestedSortableItem;if(i)return s={id:i[2]},s=_.extend({},s,o),0<_(e).children(l.listType).children(l.items).length&&(s.children=[],_(e).children(l.listType).children(l.items).each(function(){var e=t(this);s.children.push(e)})),s}(this);t.push(e)}),t},toArray:function(e){var p=_.extend({},this.options,e),d=p.startDepthCount||0,c=[],t=1;return p.excludeRoot||(c.push({item_id:p.rootID,parent_id:null,depth:d,left:t,right:2*(_(p.items,this.element).length+1)}),t++),_(this.element).children(p.items).each(function(){t=function e(t,s,i){var o,l,r,n=i+1;0<_(t).children(p.listType).children(p.items).length&&(s++,_(t).children(p.listType).children(p.items).each(function(){n=e(_(this),s,n)}),s--);o=(_(t).attr(p.attribute||"id")||"").match(p.expression||/(.+)[-=_](.+)/);s===d?l=p.rootID:(r=_(t).parent(p.listType).parent(p.items).attr(p.attribute||"id").match(p.expression||/(.+)[-=_](.+)/),l=r[2]);if(o){var a=_(t).children("div").data(),h=_.extend(a,{id:o[2],parent_id:l,depth:s,left:i,right:n});c.push(h)}i=n+1;return i}(this,d,t)}),c=c.sort(function(e,t){return e.left-t.left})},_clearEmpty:function(e){var t,s,i,o=this.options,l=_(e).children(o.listType),r=l.has("li").length,n=o.doNotClear||r||o.protectRoot&&_(e)[0]===this.element[0];o.isTree&&(t=e,s=o.branchClass,i=o.leafClass,n&&(s=[i,i=s][0]),_(t).removeClass(s).addClass(i)),n||(l.parent().removeClass(o.expandedClass),l.remove())},_getLevel:function(e){var t,s=1;if(this.options.listType)for(t=e.closest(this.options.listType);t&&0<t.length&&!t.is(".ui-sortable");)s++,t=t.parent().closest(this.options.listType);return s},_getChildLevels:function(e,s){var i=this,t=this.options,o=0;return s=s||0,_(e).children(t.listType).children(t.items).each(function(e,t){o=Math.max(i._getChildLevels(t,s+1),o)}),s?o+1:o},_isAllowed:function(e,t,s){var i=this.options,o=this.placeholder.closest(".ui-sortable").nestedSortable("option","maxLevels"),l=this.currentItem.parent().parent();i.disableParentChange&&(void 0!==e&&!l.is(e)||void 0===e&&l.is("li"))||!i.isAllowed(this.placeholder,e,this.currentItem)?(this.placeholder.addClass(i.errorClass),this.beyondMaxLevels=o<s&&0!==o?s-o:1):o<s&&0!==o?(this.placeholder.addClass(i.errorClass),this.beyondMaxLevels=s-o):(this.placeholder.removeClass(i.errorClass),this.beyondMaxLevels=0)}})),_.mjs.nestedSortable.prototype.options=_.extend({},_.ui.sortable.prototype.options,_.mjs.nestedSortable.prototype.options)}); |