-/*-\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));