diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 7d893225b..34a16d305 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -1,4 +1,4 @@ -RED.contextMenu = (function() { +RED.contextMenu = (function () { let menu; function createMenu() { @@ -15,10 +15,6 @@ RED.contextMenu = (function() { // ], // width: 200, // }) - - - - } function disposeMenu() { @@ -50,35 +46,35 @@ RED.contextMenu = (function() { if (RED.view.snapGrid) { const gridSize = RED.view.gridSize() - addX = gridSize*Math.floor(addX/gridSize) - addY = gridSize*Math.floor(addY/gridSize) + addX = gridSize * Math.floor(addX / gridSize) + addY = gridSize * Math.floor(addY / gridSize) } const menuItems = [ - { onselect: 'core:show-action-list', onpostselect: function() {} }, + { onselect: 'core:show-action-list', onpostselect: function () { } }, { label: RED._("contextMenu.insert"), options: [ { label: RED._("contextMenu.node"), - onselect: function() { + onselect: function () { RED.view.showQuickAddDialog({ - position: [ addX, addY ], + position: [addX, addY], touchTrigger: true, - splice: isSingleLink?selection.links[0]:undefined, + splice: isSingleLink ? selection.links[0] : undefined, // spliceMultiple: isMultipleLinks }) } }, - ( hasSelection || hasLinks ) ? { + (hasSelection || hasLinks) ? { label: RED._("contextMenu.junction"), onselect: 'core:split-wires-with-junctions', disabled: !hasLinks } : { label: RED._("contextMenu.junction"), - onselect: function() { + onselect: function () { const nn = { - _def: {defaults:{}}, + _def: { defaults: {} }, type: 'junction', z: RED.workspaces.active(), id: RED.nodes.id(), @@ -91,8 +87,8 @@ RED.contextMenu = (function() { } const historyEvent = { dirty: RED.nodes.dirty(), - t:'add', - junctions:[nn] + t: 'add', + junctions: [nn] } RED.nodes.addJunction(nn); RED.history.push(historyEvent); @@ -103,7 +99,7 @@ RED.contextMenu = (function() { { label: RED._("contextMenu.linkNodes"), onselect: 'core:split-wire-with-link-nodes', - disabled: hasSelection || !hasLinks + disabled: !hasLinks } ] @@ -111,28 +107,13 @@ RED.contextMenu = (function() { } ] - // menuItems.push( - // { - // label: (isSingleLink || isMultipleLinks)?'Insert into wire...':'Add node...', - // onselect: function() { - // RED.view.showQuickAddDialog({ - // position: [ options.x - offset.left, options.y - offset.top ], - // touchTrigger: true, - // splice: isSingleLink?selection.links[0]:undefined, - // spliceMultiple: isMultipleLinks - // }) - // } - // }, - // ) - // if (hasLinks && !hasSelection) { - // menuItems.push({ onselect: 'core:split-wires-with-junctions', label: 'Insert junction'}) - // } + menuItems.push( null, { onselect: 'core:undo', disabled: RED.history.list().length === 0 }, { onselect: 'core:redo', disabled: RED.history.listRedo().length === 0 }, null, - { onselect: 'core:cut-selection-to-internal-clipboard', label: RED._("keyboard.cutNode"), disabled: !hasSelection}, + { onselect: 'core:cut-selection-to-internal-clipboard', label: RED._("keyboard.cutNode"), disabled: !hasSelection }, { onselect: 'core:copy-selection-to-internal-clipboard', label: RED._("keyboard.copyNode"), disabled: !hasSelection }, { onselect: 'core:paste-from-internal-clipboard', label: RED._("keyboard.pasteNode"), disabled: !RED.view.clipboard() }, { onselect: 'core:delete-selection', disabled: !canDelete }, @@ -144,8 +125,8 @@ RED.contextMenu = (function() { menuItems.push( null, isGroup ? - { onselect: 'core:ungroup-selection', disabled: !isGroup } - : { onselect: 'core:group-selection', disabled: !hasSelection } + { onselect: 'core:ungroup-selection', disabled: !isGroup } + : { onselect: 'core:group-selection', disabled: !hasSelection } ) if (canRemoveFromGroup) { menuItems.push({ onselect: 'core:remove-selection-from-group', label: RED._("menu.label.groupRemoveSelection") }) @@ -165,13 +146,13 @@ RED.contextMenu = (function() { onpreselect: function() { disposeMenu() }, - onpostselect: function() { + onpostselect: function () { RED.view.focus() }, options: menuItems }); - menu.attr("id","red-ui-workspace-context-menu"); + menu.attr("id", "red-ui-workspace-context-menu"); menu.css({ position: "absolute" }) @@ -182,34 +163,35 @@ RED.contextMenu = (function() { var top = options.y var left = options.x - if (top+menu.height()-$(document).scrollTop() > $(window).height()) { - top -= (top+menu.height())-$(window).height() + 22; + if (top + menu.height() - $(document).scrollTop() > $(window).height()) { + top -= (top + menu.height()) - $(window).height() + 22; } - if (left+menu.width()-$(document).scrollLeft() > $(window).width()) { - left -= (left+menu.width())-$(window).width() + 18; + if (left + menu.width() - $(document).scrollLeft() > $(window).width()) { + left -= (left + menu.width()) - $(window).width() + 18; } menu.css({ - top: top+"px", - left: left+"px" + top: top + "px", + left: left + "px" }) $(".red-ui-menu.red-ui-menu-dropdown").hide(); - $(document).on("mousedown.red-ui-workspace-context-menu", function(evt) { + $(document).on("mousedown.red-ui-workspace-context-menu", function (evt) { if (menu && menu[0].contains(evt.target)) { return } disposeMenu() }); menu.show(); - - // menu.show({ - // target: $('#red-ui-main-container'), - // x: options.x, - // y: options.y - // }) - + // set focus to first item so that pressing escape key closes the menu + $("#red-ui-workspace-context-menu :first(ul) > a").trigger("focus") } - + // Allow escape key hook and other editor events to close context menu + RED.keyboard.add("red-ui-workspace-context-menu", "escape", function () { RED.contextMenu.hide() }) + RED.events.on("editor:open", function () { RED.contextMenu.hide() }); + RED.events.on("search:open", function () { RED.contextMenu.hide() }); + RED.events.on("type-search:open", function () { RED.contextMenu.hide() }); + RED.events.on("actionList:open", function () { RED.contextMenu.hide() }); + RED.events.on("view:selection-changed", function () { RED.contextMenu.hide() }); return { show: show, hide: disposeMenu diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 70583d741..5a9df8ed7 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3293,11 +3293,17 @@ RED.view = (function() { if (active && ((portType === PORT_TYPE_INPUT && ((d._def && d._def.inputLabels)||d.inputLabels)) || (portType === PORT_TYPE_OUTPUT && ((d._def && d._def.outputLabels)||d.outputLabels)))) { portLabelHoverTimeout = setTimeout(function() { + const n = port && port.node() + const nId = n && n.__data__ && n.__data__.id + //check see if node has been deleted since timeout started + if(!n || !n.parentNode || !RED.nodes.node(n.__data__.id)) { + return; //node is gone! + } var tooltip = getPortLabel(d,portType,portIndex); if (!tooltip) { return; } - var pos = getElementPosition(port.node()); + var pos = getElementPosition(n); portLabelHoverTimeout = null; portLabelHover = showTooltip( (pos[0]+(portType===PORT_TYPE_INPUT?-2:12)), @@ -3734,6 +3740,10 @@ RED.view = (function() { if (d.hasOwnProperty('l')?!d.l : (d.type === "link in" || d.type === "link out")) { var parentNode = this.parentNode; portLabelHoverTimeout = setTimeout(function() { + //check see if node has been deleted since timeout started + if(!parentNode || !parentNode.parentNode || !RED.nodes.node(parentNode.id)) { + return; //node is gone! + } var tooltip; if (d._def.label) { tooltip = d._def.label; diff --git a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js index 5782c6ffc..70dc33605 100644 --- a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js +++ b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js @@ -459,30 +459,38 @@ RED.debug = (function() { function showMessageMenu(button,dbgMessage,sourceId) { activeMenuMessage = dbgMessage; if (!menuOptionMenu) { - menuOptionMenu = RED.menu.init({id:"red-ui-debug-msg-option-menu", - options: [ - {id:"red-ui-debug-msg-menu-item-collapse",label:RED._("node-red:debug.messageMenu.collapseAll"),onselect:function(){ - activeMenuMessage.collapse(); - }}, + var opts = [ + {id:"red-ui-debug-msg-menu-item-collapse",label:RED._("node-red:debug.messageMenu.collapseAll"),onselect:function(){ + activeMenuMessage.collapse(); + }}, + ]; + if (activeMenuMessage.clearPinned) { + opts.push( {id:"red-ui-debug-msg-menu-item-clear-pins",label:RED._("node-red:debug.messageMenu.clearPinned"),onselect:function(){ activeMenuMessage.clearPinned(); }}, - null, - {id:"red-ui-debug-msg-menu-item-filter", label:RED._("node-red:debug.messageMenu.filterNode"),onselect:function(){ - var candidateNodes = RED.nodes.filterNodes({type:'debug'}); - candidateNodes.forEach(function(n) { - filteredNodes[n.id] = true; - }); - delete filteredNodes[sourceId]; - $("#red-ui-sidebar-debug-filterSelected").trigger("click"); - RED.settings.set('debug.filteredNodes',Object.keys(filteredNodes)) - refreshMessageList(); - }}, - {id:"red-ui-debug-msg-menu-item-clear-filter",label:RED._("node-red:debug.messageMenu.clearFilter"),onselect:function(){ - $("#red-ui-sidebar-debug-filterAll").trigger("click"); - refreshMessageList(); - }} - ] + ); + } + opts.push( + null, + {id:"red-ui-debug-msg-menu-item-filter", label:RED._("node-red:debug.messageMenu.filterNode"),onselect:function(){ + var candidateNodes = RED.nodes.filterNodes({type:'debug'}); + candidateNodes.forEach(function(n) { + filteredNodes[n.id] = true; + }); + delete filteredNodes[sourceId]; + $("#red-ui-sidebar-debug-filterSelected").trigger("click"); + RED.settings.set('debug.filteredNodes',Object.keys(filteredNodes)) + refreshMessageList(); + }}, + {id:"red-ui-debug-msg-menu-item-clear-filter",label:RED._("node-red:debug.messageMenu.clearFilter"),onselect:function(){ + $("#red-ui-sidebar-debug-filterAll").trigger("click"); + refreshMessageList(); + }} + ); + + menuOptionMenu = RED.menu.init({id:"red-ui-debug-msg-option-menu", + options: opts }); menuOptionMenu.css({ position: "absolute"