jquery.ui-contextmenu-min.js
8.94 KB
!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery","jquery-ui/ui/widgets/menu"],e):e(jQuery)}((function(e){"use strict";var t="onselectstart"in document.createElement("div"),n=e.ui.menu.version.match(/^(\d)\.(\d+)/),i=parseInt(n[1],10),s=parseInt(n[2],10),a=i<2&&s<=10,o=i<2&&s<=11;e.widget("moogle.contextmenu",{version:"1.18.1",options:{addClass:"ui-contextmenu",closeOnWindowBlur:!0,autoFocus:!1,autoTrigger:!0,delegate:null,hide:{effect:"fadeOut",duration:"fast"},ignoreParentSelect:!0,menu:null,position:null,preventContextMenuForPopup:!1,preventSelect:!1,show:{effect:"slideDown",duration:"fast"},taphold:!1,uiMenuOptions:{},beforeOpen:e.noop,blur:e.noop,close:e.noop,create:e.noop,createMenu:e.noop,focus:e.noop,open:e.noop,select:e.noop},_create:function(){var n,i,s,a=this.options;if(this.$headStyle=null,this.$menu=null,this.menuIsTemp=!1,this.currentTarget=null,this.extraData={},this.previousFocus=null,null==a.delegate&&e.error("ui-contextmenu: Missing required option `delegate`."),a.preventSelect){n="#"+(s=(e(this.element).is(document)?e("body"):this.element).uniqueId().attr("id"))+" "+a.delegate+" { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }",this.$headStyle=e("<style class='moogle-contextmenu-style' />").prop("type","text/css").appendTo("head");try{this.$headStyle.html(n)}catch(e){this.$headStyle[0].styleSheet.cssText=n}t&&this.element.on("selectstart"+this.eventNamespace,a.delegate,(function(e){e.preventDefault()}))}this._createUiMenu(a.menu),i="contextmenu"+this.eventNamespace,a.taphold&&(i+=" taphold"+this.eventNamespace),this.element.on(i,a.delegate,e.proxy(this._openMenu,this))},_destroy:function(){this.element.off(this.eventNamespace),this._createUiMenu(null),this.$headStyle&&(this.$headStyle.remove(),this.$headStyle=null)},_createUiMenu:function(t){var n,i,s=this.options;this.isOpen()&&(n=this.currentTarget,i=this.extraData,this._closeMenu(!0),this.currentTarget=n,this.extraData=i),this.menuIsTemp?this.$menu.remove():this.$menu&&this.$menu.menu("destroy").removeClass(this.options.addClass).hide(),this.$menu=null,this.menuIsTemp=!1,t&&(e.isArray(t)?(this.$menu=e.moogle.contextmenu.createMenuMarkup(t),this.menuIsTemp=!0):this.$menu="string"==typeof t?e(t):t,this.$menu.hide().addClass(s.addClass).menu(e.extend(!0,{},s.uiMenuOptions,{items:"> :not(.ui-widget-header)",blur:e.proxy(s.blur,this),create:e.proxy(s.createMenu,this),focus:e.proxy(s.focus,this),select:e.proxy((function(t,n){var i,a=e.moogle.contextmenu.isMenu(n.item),o=n.item.data("actionHandler");n.cmd=n.item.attr("data-command"),n.target=e(this.currentTarget),n.extraData=this.extraData,a&&s.ignoreParentSelect||(i=this._trigger.call(this,"select",t,n),o&&(i=o.call(this,t,n)),!1!==i&&this._closeMenu.call(this),t.preventDefault())}),this)})))},_openMenu:function(t,n){var i,s,a,o=this.options,u=o.position,r=this,l=!!t.isTrigger;if(o.autoTrigger||l){if(t.preventDefault(),this.currentTarget=t.target,this.extraData=t._extraData||{},a={menu:this.$menu,target:e(this.currentTarget),extraData:this.extraData,originalEvent:t,result:null},!n){if(i=this._trigger("beforeOpen",t,a),s=a.result&&e.isFunction(a.result.promise)?a.result:null,a.result=null,!1===i)return this.currentTarget=null,!1;if(s)return s.done((function(){r._openMenu(t,!0)})),this.currentTarget=null,!1;a.menu=this.$menu}e(document).on("keydown"+this.eventNamespace,(function(t){t.which===e.ui.keyCode.ESCAPE&&r._closeMenu()})).on("mousedown"+this.eventNamespace+" touchstart"+this.eventNamespace,(function(t){e(t.target).closest(".ui-menu-item").length||r._closeMenu()})),e(window).on("blur"+this.eventNamespace,(function(e){o.closeOnWindowBlur&&r._closeMenu()})),e.isFunction(u)&&(u=u(t,a)),u=e.extend({my:"left top",at:"left bottom",of:void 0===t.pageX?t.target:t,collision:"fit"},u),this._updateEntries(this.$menu),this.$menu.show().css({position:"absolute",left:0,top:0}).position(u).hide(),o.preventContextMenuForPopup&&this.$menu.on("contextmenu"+this.eventNamespace,(function(e){e.preventDefault()})),this._show(this.$menu,o.show,(function(){var n;o.autoFocus&&(r.previousFocus=e(t.target),n=r.$menu.children("li.ui-menu-item").not(".ui-state-disabled").first(),r.$menu.menu("focus",null,n).focus()),r._trigger.call(r,"open",t,a)}))}},_closeMenu:function(t){var n=this,i=!t&&this.options.hide,s={menu:this.$menu,target:e(this.currentTarget),extraData:this.extraData};e(document).off("mousedown"+this.eventNamespace).off("touchstart"+this.eventNamespace).off("keydown"+this.eventNamespace),e(window).off("blur"+this.eventNamespace),n.currentTarget=null,n.extraData={},this.$menu?(this.$menu.off("contextmenu"+this.eventNamespace),this._hide(this.$menu,i,(function(){n.previousFocus&&(n.previousFocus.focus(),n.previousFocus=null),n._trigger("close",null,s)}))):n._trigger("close",null,s)},_setOption:function(t,n){switch(t){case"menu":this.replaceMenu(n)}e.Widget.prototype._setOption.apply(this,arguments)},_getMenuEntry:function(e){return this.$menu.find("li[data-command="+e+"]")},close:function(){this.isOpen()&&this._closeMenu()},_updateEntries:function(){var t=this,n={menu:this.$menu,target:e(this.currentTarget),extraData:this.extraData};e.each(this.$menu.find(".ui-menu-item"),(function(i,s){var a=e(s),o=a.data("disabledHandler"),u=o?o({type:"disabled"},n):null;n.item=a,n.cmd=a.attr("data-command"),null!=u&&(t.enableEntry(n.cmd,!u),t.showEntry(n.cmd,"hide"!==u)),null!=(u=(o=a.data("titleHandler"))?o({type:"title"},n):null)&&t.setTitle(n.cmd,""+u),null!=(u=(o=a.data("tooltipHandler"))?o({type:"tooltip"},n):null)&&a.attr("title",""+u)}))},enableEntry:function(e,t){this._getMenuEntry(e).toggleClass("ui-state-disabled",!1===t)},getEntry:function(e){return this._getMenuEntry(e)},getEntryWrapper:function(e){return this._getMenuEntry(e).find(">[role=menuitem]").addBack("[role=menuitem]")},getMenu:function(){return this.$menu},isOpen:function(){return!!this.$menu&&!!this.currentTarget},open:function(t,n){n=n||{};var i=t&&t.type&&t.target,s=i?t:{},a=i?t.target:t,o=jQuery.Event("contextmenu",{target:e(a).get(0),pageX:s.pageX,pageY:s.pageY,originalEvent:i?t:void 0,_extraData:n});return this.element.trigger(o)},replaceMenu:function(e){this._createUiMenu(e)},setEntry:function(t,n){var i,s=this._getMenuEntry(t);return"string"==typeof n?(window.console&&window.console.warn("setEntry(cmd, t) with a plain string title is deprecated since v1.18.Use setTitle(cmd, '"+n+"') instead."),this.setTitle(t,n)):(s.empty(),n.cmd=n.cmd||t,e.moogle.contextmenu.createEntryMarkup(n,s),e.isArray(n.children)&&(i=e("<ul/>").appendTo(s),e.moogle.contextmenu.createMenuMarkup(n.children,i)),s.removeClass("ui-menu-item"),void this.getMenu().menu("refresh"))},setIcon:function(e,t){return this.updateEntry(e,{uiIcon:t})},setTitle:function(e,t){return this.updateEntry(e,{title:t})},showEntry:function(e,t){this._getMenuEntry(e).toggle(!1!==t)},updateEntry:function(t,n){var i,s,a=this._getMenuEntry(t);void 0!==n.title&&e.moogle.contextmenu.updateTitle(a,""+n.title),void 0!==n.tooltip&&(null===n.tooltip?a.removeAttr("title"):a.attr("title",n.tooltip)),void 0!==n.uiIcon&&((i=(s=this.getEntryWrapper(t)).find("span.ui-icon").not(".ui-menu-icon")).remove(),n.uiIcon&&s.append(e("<span class='ui-icon' />").addClass(n.uiIcon))),void 0!==n.hide?a.toggle(!n.hide):void 0!==n.show&&a.toggle(!!n.show),void 0!==n.data&&a.data(n.data),void 0===n.disabled&&(n.disabled=a.hasClass("ui-state-disabled")),n.setClass?(a.hasClass("ui-menu-item")&&(n.setClass+=" ui-menu-item"),a.removeClass(),a.addClass(n.setClass)):n.addClass&&a.addClass(n.addClass),a.toggleClass("ui-state-disabled",!!n.disabled)}}),e.extend(e.moogle.contextmenu,{createEntryMarkup:function(t,n){var i=null;n.attr("data-command",t.cmd),/[^\-\u2014\u2013\s]/.test(t.title)?(a?i=e("<a/>",{html:""+t.title,href:"#"}).appendTo(n):o?(n.html(""+t.title),i=n):i=e("<div/>",{html:""+t.title}).appendTo(n),t.uiIcon&&i.append(e("<span class='ui-icon' />").addClass(t.uiIcon)),e.each(["action","disabled","title","tooltip"],(function(i,s){e.isFunction(t[s])&&n.data(s+"Handler",t[s])})),!0===t.disabled&&n.addClass("ui-state-disabled"),t.isHeader&&n.addClass("ui-widget-header"),t.addClass&&n.addClass(t.addClass),e.isPlainObject(t.data)&&n.data(t.data),"string"==typeof t.tooltip&&n.attr("title",t.tooltip)):n.text(t.title)},createMenuMarkup:function(t,n){var i,s,a,o;for(null==n&&(n=e("<ul class='ui-helper-hidden' />").appendTo("body")),i=0;i<t.length;i++)s=t[i],o=e("<li/>").appendTo(n),e.moogle.contextmenu.createEntryMarkup(s,o),e.isArray(s.children)&&(a=e("<ul/>").appendTo(o),e.moogle.contextmenu.createMenuMarkup(s.children,a));return n},isMenu:function(e){return a?e.has(">a[aria-haspopup='true']").length>0:o?e.is("[aria-haspopup='true']"):e.has(">div[aria-haspopup='true']").length>0},replaceFirstTextNodeChild:function(e,t){var n=e.find(">span.ui-icon,>ul.ui-menu").detach();e.empty().html(t).append(n)},updateTitle:function(t,n){a?e.moogle.contextmenu.replaceFirstTextNodeChild(e("a",t),n):o?e.moogle.contextmenu.replaceFirstTextNodeChild(t,n):e.moogle.contextmenu.replaceFirstTextNodeChild(e("div",t),n)}})}));