diff --git a/packages/node_modules/@node-red/editor-client/src/js/keymap.json b/packages/node_modules/@node-red/editor-client/src/js/keymap.json index b94290862..61d2fe350 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/keymap.json +++ b/packages/node_modules/@node-red/editor-client/src/js/keymap.json @@ -22,6 +22,12 @@ "ctrl-g v": "core:show-version-control-tab", "ctrl-shift-l": "core:show-event-log" }, + "sidebar-node-config": { + "backspace": "core:delete-config-selection", + "delete": "core:delete-config-selection", + "ctrl-a": "core:select-all-config-nodes", + "ctrl-z": "core:undo" + }, "workspace": { "backspace": "core:delete-selection", "delete": "core:delete-selection", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js index bb65c665d..9218ad4c8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js @@ -19,7 +19,7 @@ RED.keyboard = (function() { var handlers = {}; var partialState; - +RED.h = handlers; var keyMap = { "left":37, "up":38, @@ -161,6 +161,19 @@ RED.keyboard = (function() { return [keycode,modifiers]; } + function matchHandlerToEvent(evt,handler) { + var target = evt.target; + var depth = 0; + while (target.nodeName !== 'BODY' && target.id !== handler.scope) { + target = target.parentElement; + depth++; + } + if (target.nodeName === 'BODY' && handler.scope !== "*") { + depth = -1; + } + return depth; + } + function resolveKeyEvent(evt) { var slot = partialState||handlers; if (evt.ctrlKey || evt.metaKey) { @@ -175,7 +188,7 @@ RED.keyboard = (function() { var keyCode = firefoxKeyCodeMap[evt.keyCode] || evt.keyCode; if (slot && slot[keyCode]) { var handler = slot[keyCode]; - if (!handler.scope) { + if (!handler.handlers) { if (partialState) { partialState = null; return resolveKeyEvent(evt); @@ -186,14 +199,19 @@ RED.keyboard = (function() { } else { return null; } - } else if (handler.scope && handler.scope !== "*") { - var target = evt.target; - while (target.nodeName !== 'BODY' && target.id !== handler.scope) { - target = target.parentElement; - } - if (target.nodeName === 'BODY') { - handler = null; + } else { + var depth = Infinity; + var matchedHandler; + var i = 0; + var l = handler.handlers.length; + for (i=0;i -1 && d < depth) { + depth = d; + matchedHandler = handler.handlers[i]; + } } + handler = matchedHandler; } partialState = null; return handler; @@ -265,6 +283,8 @@ RED.keyboard = (function() { slot = slot[key]; //slot[key] = {scope: scope, ondown:cbdown}; } + slot.handlers = slot.handlers || []; + slot.handlers.push({scope:scope,ondown:cbdown}) slot.scope = scope; slot.ondown = cbdown; } @@ -315,6 +335,8 @@ RED.keyboard = (function() { } delete slot.scope; delete slot.ondown; + // TODO: this wipes everything! Need to have something to identify handler + delete slot.handlers; } var cmdCtrlKey = ''+(isMac?'⌘':'Ctrl')+''; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js index 55a24f366..d9bbd7485 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js @@ -18,11 +18,13 @@ RED.sidebar.config = (function() { var content = document.createElement("div"); content.className = "sidebar-node-config"; + content.id = "sidebar-node-config"; + content.tabIndex = 0; - $('' ).appendTo(content); @@ -138,15 +140,32 @@ RED.sidebar.config = (function() { } var entry = $('
  • ').appendTo(list); + entry.data('node',node.id); $('
    ').text(label).appendTo(entry); if (node._def.hasUsers !== false) { var iconContainer = $('
    ',{class:"palette_icon_container palette_icon_container_right"}).appendTo(entry); - var butt = $('').click(function(e) { e.preventDefault(); RED.search.show(node.id); }).text(node.users.length).appendTo(iconContainer); + if (node.users.length === 0) { + iconContainer.text(0); + } else { + $('').click(function(e) { + e.stopPropagation(); + e.preventDefault(); + RED.search.show(node.id); + }).text(node.users.length).appendTo(iconContainer); + } + RED.popover.tooltip(iconContainer,RED._('editor.nodesUse',{count:node.users.length})); if (node.users.length === 0) { entry.addClass("config_node_unused"); } } entry.on('click',function(e) { + RED.view.select(false); + if (e.metaKey) { + $(this).toggleClass("selected"); + } else { + $(content).find(".palette_node").removeClass("selected"); + $(this).addClass("selected"); + } RED.sidebar.info.refresh(node); }); entry.on('dblclick',function(e) { @@ -225,7 +244,60 @@ RED.sidebar.config = (function() { action: "core:show-config-tab", onchange: function() { refreshConfigNodeList(); } }); - RED.actions.add("core:show-config-tab",function() {RED.sidebar.show('config')}); + RED.actions.add("core:show-config-tab", function() {RED.sidebar.show('config')}); + RED.actions.add("core:select-all-config-nodes", function() { + $(content).find(".palette_node").addClass("selected"); + }) + RED.actions.add("core:delete-config-selection", function() { + var selectedNodes = []; + $(content).find(".palette_node.selected").each(function() { + selectedNodes.push($(this).data('node')); + }); + if (selectedNodes.length > 0) { + var historyEvent = { + t:'delete', + nodes:[], + changes: {}, + dirty: RED.nodes.dirty() + } + selectedNodes.forEach(function(id) { + var node = RED.nodes.node(id); + try { + if (node._def.oneditdelete) { + node._def.oneditdelete.call(node); + } + } catch(err) { + console.log("oneditdelete",node.id,node.type,err.toString()); + } + historyEvent.nodes.push(node); + for (var i=0;i