[PORTAL-16 PORTAL-18] Widget ms; staging
[portal.git] / ecomp-portal-FE-os / client / src / views / functionalMenu / jqTreeContextMenu.js
index 6e2be32..dba442c 100644 (file)
-/*-\r
- * ================================================================================\r
- * ECOMP Portal\r
- * ================================================================================\r
- * Copyright (C) 2017 AT&T Intellectual Property\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- * \r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- * \r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ================================================================================\r
- */\r
-(function ($) {\r
-       if (!$.fn.tree) {\r
-               throw "Error jqTree is not loaded.";\r
-       }\r
-\r
-       $.fn.jqTreeContextMenu = function (menuElement, callbacks) {\r
-               //\r
-               // TODO:\r
-               // * Make sure the useContextMenu option is set in jqTree, either complain or set it automatically\r
-               // * Make menu fade in/out\r
-               //\r
-               var self = this;\r
-               var $el = this;\r
-\r
-               // The jQuery object of the menu div.\r
-               var $menuEl = menuElement;\r
-               \r
-               // This hash holds all menu items that should be disabled for a specific node.\r
-               var nodeToDisabledMenuItems = {};\r
-               \r
-               // Hide the menu div.\r
-               $menuEl.hide();\r
-\r
-               // Disable system context menu from beeing displayed.\r
-               $el.bind("contextmenu", function (e) { \r
-                       e.preventDefault();\r
-                       return false; \r
-               });\r
-\r
-               // Handle the contextmenu event sent from jqTree when user clicks right mouse button.\r
-               $el.bind('tree.contextmenu', function (event) {\r
-                       var x = event.click_event.pageX;\r
-                       var y = event.click_event.pageY;\r
-                       var yPadding = 5;\r
-                       var xPadding = 5;\r
-                       var menuHeight = $menuEl.height();\r
-                       var menuWidth = $menuEl.width();\r
-                       var windowHeight = $(window).height();\r
-                       var windowWidth = $(window).width();\r
-                       \r
-                       if (menuHeight + y + yPadding > windowHeight) {\r
-                               // Make sure the whole menu is rendered within the viewport. \r
-                               y = y - menuHeight;\r
-                       }\r
-                       if (menuWidth + x + xPadding > windowWidth) {\r
-                               // Make sure the whole menu is rendered within the viewport. \r
-                               x = x - menuWidth;\r
-                       }\r
-\r
-                       // Handle disabling and enabling of menu items on specific nodes.\r
-                       if (Object.keys(nodeToDisabledMenuItems).length > 0) {\r
-                               if (event.node.name in nodeToDisabledMenuItems) {\r
-                                       var nodeName = event.node.name;\r
-                                       var items = nodeToDisabledMenuItems[nodeName];\r
-                                       if (items.length === 0) {\r
-                                               $menuEl.find('li').addClass('disabled');\r
-                                               $menuEl.find('li > a').unbind('click');\r
-                                       } else {\r
-                                               $menuEl.find('li > a').each(function () {\r
-                                                       $(this).closest('li').removeClass('disabled');\r
-                                                       var hrefValue = $(this).attr('href');\r
-                                                       var value = hrefValue.slice(hrefValue.indexOf("#") + 1, hrefValue.length)\r
-                                                       if ($.inArray(value, items) > -1) {\r
-                                                               $(this).closest('li').addClass('disabled');\r
-                                                               $(this).unbind('click');\r
-                                                       }\r
-                                               });     \r
-                                       }\r
-                               } else {\r
-                                       $menuEl.find('li.disabled').removeClass('disabled');\r
-                               }\r
-                       }\r
-\r
-                       // Must call show before we set the offset (offset can not be set on display: none elements).\r
-                       $menuEl.show();\r
-\r
-                       $menuEl.offset({ left: x, top: y });\r
-\r
-                       var dismissContextMenu = function () {\r
-                               $(document).unbind('click.jqtreecontextmenu');\r
-                               $el.unbind('tree.click.jqtreecontextmenu');\r
-                               $menuEl.hide();\r
-                       }\r
-                       // Make it possible to dismiss context menu by clicking somewhere in the document.\r
-                       $(document).bind('click.jqtreecontextmenu', function () {\r
-                               dismissContextMenu();\r
-                       });\r
-\r
-                       // Dismiss context menu if another node in the tree is clicked.\r
-                       $el.bind('tree.click.jqtreecontextmenu', function (e) {\r
-                               dismissContextMenu();\r
-                       });\r
-\r
-                       // Make selection follow the node that was right clicked on.\r
-                       var selectedNode = $el.tree('getSelectedNode');\r
-                       if (selectedNode !== event.node) {\r
-                               $el.tree('selectNode', event.node);\r
-                       }\r
-\r
-                       // Handle click on menu items, if it's not disabled.\r
-                       var menuItems = $menuEl.find('li:not(.disabled) a');\r
-                       if (menuItems.length !== 0) {\r
-                               menuItems.unbind('click');\r
-                               menuItems.click(function (e) {\r
-                                       e.stopImmediatePropagation();\r
-                                       dismissContextMenu();\r
-                                       var hrefAnchor = e.currentTarget.attributes.href.nodeValue;\r
-                                       var funcKey = hrefAnchor.slice(hrefAnchor.indexOf("#") + 1, hrefAnchor.length)\r
-                                       var callbackFn = callbacks[funcKey];\r
-                                       if (callbackFn) {\r
-                                               callbackFn(event.node);\r
-                                       }\r
-                                       return false;\r
-                               });\r
-                       }\r
-               });\r
-               \r
-               this.disable = function () {\r
-                       if (arguments.length === 0) {\r
-                               // Called as: api.disable()\r
-                               $menuEl.find('li:not(.disabled)').addClass('disabled');\r
-                               $menuEl.find('li a').unbind('click');\r
-                               nodeToDisabledMenuItems = {};\r
-                       } else if (arguments.length === 1) {\r
-                               // Called as: api.disable(['edit','remove'])\r
-                               var items = arguments[0];\r
-                               if (typeof items !== 'object') {\r
-                                       return;\r
-                               }\r
-                               $menuEl.find('li > a').each(function () {\r
-                                       var hrefValue = $(this).attr('href');\r
-                                       var value = hrefValue.slice(hrefValue.indexOf("#") + 1, hrefValue.length)\r
-                                       if ($.inArray(value, items) > -1) {\r
-                                               $(this).closest('li').addClass('disabled');\r
-                                               $(this).unbind('click');\r
-                                       }\r
-                               });\r
-                               nodeToDisabledMenuItems = {};\r
-                       } else if (arguments.length === 2) {\r
-                               // Called as: api.disable(nodeName, ['edit','remove'])\r
-                               var nodeName = arguments[0];\r
-                               var items = arguments[1];\r
-                               nodeToDisabledMenuItems[nodeName] = items;\r
-                       }\r
-               };\r
-\r
-               this.enable = function () {\r
-                       if (arguments.length === 0) {\r
-                               // Called as: api.enable()\r
-                               $menuEl.find('li.disabled').removeClass('disabled');\r
-                               nodeToDisabledMenuItems = {};\r
-                       } else if (arguments.length === 1) {\r
-                               // Called as: api.enable(['edit','remove'])\r
-                               var items = arguments[0];\r
-                               if (typeof items !== 'object') {\r
-                                       return;\r
-                               }\r
-                               \r
-                               $menuEl.find('li > a').each(function () {\r
-                                       var hrefValue = $(this).attr('href');\r
-                                       var value = hrefValue.slice(hrefValue.indexOf("#") + 1, hrefValue.length)\r
-                                       if ($.inArray(value, items) > -1) {\r
-                                               $(this).closest('li').removeClass('disabled');\r
-                                       }\r
-                               });\r
-\r
-                               nodeToDisabledMenuItems = {};\r
-                       } else if (arguments.length === 2) {\r
-                               // Called as: api.enable(nodeName, ['edit','remove'])\r
-                               var nodeName = arguments[0];\r
-                               var items = arguments[1];\r
-                               if (items.length === 0) {\r
-                                       delete nodeToDisabledMenuItems[nodeName];\r
-                               } else {\r
-                                       var disabledItems = nodeToDisabledMenuItems[nodeName];\r
-                                       for (var i = 0; i < items.length; i++) {\r
-                                               var idx = disabledItems.indexOf(items[i]);\r
-                                               if (idx > -1) {\r
-                                                       disabledItems.splice(idx, 1);\r
-                                               }\r
-                                       }\r
-                                       if (disabledItems.length === 0) {\r
-                                               delete nodeToDisabledMenuItems[nodeName];\r
-                                       } else {\r
-                                               nodeToDisabledMenuItems[nodeName] = disabledItems;      \r
-                                       }\r
-                               }\r
-                               if (Object.keys(nodeToDisabledMenuItems).length === 0) {\r
-                                       $menuEl.find('li.disabled').removeClass('disabled');\r
-                               }\r
-                       }\r
-               };\r
-               return this;\r
-       };\r
-} (jQuery));\r
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ================================================================================
+ */
+(function ($) {
+       if (!$.fn.tree) {
+               throw "Error jqTree is not loaded.";
+       }
+
+       $.fn.jqTreeContextMenu = function (menuElement, callbacks) {
+               //
+               // TODO:
+               // * Make sure the useContextMenu option is set in jqTree, either complain or set it automatically
+               // * Make menu fade in/out
+               //
+               var self = this;
+               var $el = this;
+
+               // The jQuery object of the menu div.
+               var $menuEl = menuElement;
+               
+               // This hash holds all menu items that should be disabled for a specific node.
+               var nodeToDisabledMenuItems = {};
+               
+               // Hide the menu div.
+               $menuEl.hide();
+
+               // Disable system context menu from beeing displayed.
+               $el.bind("contextmenu", function (e) { 
+                       e.preventDefault();
+                       return false; 
+               });
+
+               // Handle the contextmenu event sent from jqTree when user clicks right mouse button.
+               $el.bind('tree.contextmenu', function (event) {
+                       var x = event.click_event.pageX;
+                       var y = event.click_event.pageY;
+                       var yPadding = 5;
+                       var xPadding = 5;
+                       var menuHeight = $menuEl.height();
+                       var menuWidth = $menuEl.width();
+                       var windowHeight = $(window).height();
+                       var windowWidth = $(window).width();
+                       
+                       if (menuHeight + y + yPadding > windowHeight) {
+                               // Make sure the whole menu is rendered within the viewport. 
+                               y = y - menuHeight;
+                       }
+                       if (menuWidth + x + xPadding > windowWidth) {
+                               // Make sure the whole menu is rendered within the viewport. 
+                               x = x - menuWidth;
+                       }
+
+                       // Handle disabling and enabling of menu items on specific nodes.
+                       if (Object.keys(nodeToDisabledMenuItems).length > 0) {
+                               if (event.node.name in nodeToDisabledMenuItems) {
+                                       var nodeName = event.node.name;
+                                       var items = nodeToDisabledMenuItems[nodeName];
+                                       if (items.length === 0) {
+                                               $menuEl.find('li').addClass('disabled');
+                                               $menuEl.find('li > a').unbind('click');
+                                       } else {
+                                               $menuEl.find('li > a').each(function () {
+                                                       $(this).closest('li').removeClass('disabled');
+                                                       var hrefValue = $(this).attr('href');
+                                                       var value = hrefValue.slice(hrefValue.indexOf("#") + 1, hrefValue.length)
+                                                       if ($.inArray(value, items) > -1) {
+                                                               $(this).closest('li').addClass('disabled');
+                                                               $(this).unbind('click');
+                                                       }
+                                               });     
+                                       }
+                               } else {
+                                       $menuEl.find('li.disabled').removeClass('disabled');
+                               }
+                       }
+
+                       // Must call show before we set the offset (offset can not be set on display: none elements).
+                       $menuEl.show();
+
+                       $menuEl.offset({ left: x, top: y });
+
+                       var dismissContextMenu = function () {
+                               $(document).unbind('click.jqtreecontextmenu');
+                               $el.unbind('tree.click.jqtreecontextmenu');
+                               $menuEl.hide();
+                       }
+                       // Make it possible to dismiss context menu by clicking somewhere in the document.
+                       $(document).bind('click.jqtreecontextmenu', function () {
+                               dismissContextMenu();
+                       });
+
+                       // Dismiss context menu if another node in the tree is clicked.
+                       $el.bind('tree.click.jqtreecontextmenu', function (e) {
+                               dismissContextMenu();
+                       });
+
+                       // Make selection follow the node that was right clicked on.
+                       var selectedNode = $el.tree('getSelectedNode');
+                       if (selectedNode !== event.node) {
+                               $el.tree('selectNode', event.node);
+                       }
+
+                       // Handle click on menu items, if it's not disabled.
+                       var menuItems = $menuEl.find('li:not(.disabled) a');
+                       if (menuItems.length !== 0) {
+                               menuItems.unbind('click');
+                               menuItems.click(function (e) {
+                                       e.stopImmediatePropagation();
+                                       dismissContextMenu();
+                                       var hrefAnchor = e.currentTarget.attributes.href.nodeValue;
+                                       var funcKey = hrefAnchor.slice(hrefAnchor.indexOf("#") + 1, hrefAnchor.length)
+                                       var callbackFn = callbacks[funcKey];
+                                       if (callbackFn) {
+                                               callbackFn(event.node);
+                                       }
+                                       return false;
+                               });
+                       }
+               });
+               
+               this.disable = function () {
+                       if (arguments.length === 0) {
+                               // Called as: api.disable()
+                               $menuEl.find('li:not(.disabled)').addClass('disabled');
+                               $menuEl.find('li a').unbind('click');
+                               nodeToDisabledMenuItems = {};
+                       } else if (arguments.length === 1) {
+                               // Called as: api.disable(['edit','remove'])
+                               var items = arguments[0];
+                               if (typeof items !== 'object') {
+                                       return;
+                               }
+                               $menuEl.find('li > a').each(function () {
+                                       var hrefValue = $(this).attr('href');
+                                       var value = hrefValue.slice(hrefValue.indexOf("#") + 1, hrefValue.length)
+                                       if ($.inArray(value, items) > -1) {
+                                               $(this).closest('li').addClass('disabled');
+                                               $(this).unbind('click');
+                                       }
+                               });
+                               nodeToDisabledMenuItems = {};
+                       } else if (arguments.length === 2) {
+                               // Called as: api.disable(nodeName, ['edit','remove'])
+                               var nodeName = arguments[0];
+                               var items = arguments[1];
+                               nodeToDisabledMenuItems[nodeName] = items;
+                       }
+               };
+
+               this.enable = function () {
+                       if (arguments.length === 0) {
+                               // Called as: api.enable()
+                               $menuEl.find('li.disabled').removeClass('disabled');
+                               nodeToDisabledMenuItems = {};
+                       } else if (arguments.length === 1) {
+                               // Called as: api.enable(['edit','remove'])
+                               var items = arguments[0];
+                               if (typeof items !== 'object') {
+                                       return;
+                               }
+                               
+                               $menuEl.find('li > a').each(function () {
+                                       var hrefValue = $(this).attr('href');
+                                       var value = hrefValue.slice(hrefValue.indexOf("#") + 1, hrefValue.length)
+                                       if ($.inArray(value, items) > -1) {
+                                               $(this).closest('li').removeClass('disabled');
+                                       }
+                               });
+
+                               nodeToDisabledMenuItems = {};
+                       } else if (arguments.length === 2) {
+                               // Called as: api.enable(nodeName, ['edit','remove'])
+                               var nodeName = arguments[0];
+                               var items = arguments[1];
+                               if (items.length === 0) {
+                                       delete nodeToDisabledMenuItems[nodeName];
+                               } else {
+                                       var disabledItems = nodeToDisabledMenuItems[nodeName];
+                                       for (var i = 0; i < items.length; i++) {
+                                               var idx = disabledItems.indexOf(items[i]);
+                                               if (idx > -1) {
+                                                       disabledItems.splice(idx, 1);
+                                               }
+                                       }
+                                       if (disabledItems.length === 0) {
+                                               delete nodeToDisabledMenuItems[nodeName];
+                                       } else {
+                                               nodeToDisabledMenuItems[nodeName] = disabledItems;      
+                                       }
+                               }
+                               if (Object.keys(nodeToDisabledMenuItems).length === 0) {
+                                       $menuEl.find('li.disabled').removeClass('disabled');
+                               }
+                       }
+               };
+               return this;
+       };
+} (jQuery));