1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Merge pull request #3841 from Steve-Mcl/fix-search-type-with-spaces

Fix search type with spaces
This commit is contained in:
Nick O'Leary 2022-09-12 19:27:09 +01:00 committed by GitHub
commit 6375f3c445
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 27 deletions

View File

@ -175,9 +175,19 @@ RED.palette = (function() {
$('<button type="button" onclick="RED.workspaces.show(\''+type.substring(8).replace(/'/g,"\\'")+'\'); return false;" class="red-ui-button red-ui-button-small" style="float: right; margin-left: 5px;"><i class="fa fa-pencil"></i></button>').appendTo(popOverContent) $('<button type="button" onclick="RED.workspaces.show(\''+type.substring(8).replace(/'/g,"\\'")+'\'); return false;" class="red-ui-button red-ui-button-small" style="float: right; margin-left: 5px;"><i class="fa fa-pencil"></i></button>').appendTo(popOverContent)
} }
var safeType = type.replace(/'/g,"\\'"); const safeType = type.replace(/'/g,"\\'");
const wrapStr = function (str) {
if(str.indexOf(' ') >= 0) {
return '"' + str + '"'
}
return str
}
$('<button type="button" onclick="RED.search.show(\'type:'+safeType+'\'); return false;" class="red-ui-button red-ui-button-small" style="float: right; margin-left: 5px;"><i class="fa fa-search"></i></button>').appendTo(popOverContent) $('<button type="button"; return false;" class="red-ui-button red-ui-button-small" style="float: right; margin-left: 5px;"><i class="fa fa-search"></i></button>')
.appendTo(popOverContent)
.on('click', function() {
RED.search.show('type:' + wrapStr(safeType))
})
$('<button type="button" onclick="RED.sidebar.help.show(\''+safeType+'\'); return false;" class="red-ui-button red-ui-button-small" style="float: right; margin-left: 5px;"><i class="fa fa-book"></i></button>').appendTo(popOverContent) $('<button type="button" onclick="RED.sidebar.help.show(\''+safeType+'\'); return false;" class="red-ui-button red-ui-button-small" style="float: right; margin-left: 5px;"><i class="fa fa-book"></i></button>').appendTo(popOverContent)
$('<p>',{style:"font-size: 0.8em"}).text(metaData).appendTo(popOverContent); $('<p>',{style:"font-size: 0.8em"}).text(metaData).appendTo(popOverContent);

View File

@ -106,38 +106,51 @@ RED.search = (function() {
return val; return val;
} }
function search(val) { function extractType(val, flags) {
var results = []; // extracts: type:XYZ & type:"X Y Z"
var typeFilter; const regEx = /(?:type):\s*(?:"([^"]+)"|([^" ]+))/;
var m = /(?:^| )type:([^ ]+)/.exec(val); let m
if (m) { while ((m = regEx.exec(val)) !== null) {
val = val.replace(/(?:^| )type:[^ ]+/,""); // avoid infinite loops with zero-width matches
typeFilter = m[1]; if (m.index === regEx.lastIndex) {
regEx.lastIndex++;
}
val = val.replace(m[0]," ").trim()
const flag = m[2] || m[1] // quoted entries in capture group 1, unquoted in capture group 2
flags.type = flags.type || [];
flags.type.push(flag);
} }
var flags = {}; return val;
}
function search(val) {
const results = [];
const flags = {};
val = extractFlag(val,"invalid",flags); val = extractFlag(val,"invalid",flags);
val = extractFlag(val,"unused",flags); val = extractFlag(val,"unused",flags);
val = extractFlag(val,"config",flags); val = extractFlag(val,"config",flags);
val = extractFlag(val,"subflow",flags); val = extractFlag(val,"subflow",flags);
val = extractFlag(val,"hidden",flags); val = extractFlag(val,"hidden",flags);
val = extractFlag(val,"modified",flags); val = extractFlag(val,"modified",flags);
val = extractValue(val,"flow",flags);// flow:active or flow:<flow-id> val = extractValue(val,"flow",flags);// flow:current or flow:<flow-id>
val = extractValue(val,"uses",flags);// uses:<node-id> val = extractValue(val,"uses",flags);// uses:<node-id>
val = extractType(val,flags);// type:<node-type>
val = val.trim(); val = val.trim();
var hasFlags = Object.keys(flags).length > 0; const hasFlags = Object.keys(flags).length > 0;
const hasTypeFilter = flags.type && flags.type.length > 0
if (flags.flow && flags.flow.indexOf("current") >= 0) { if (flags.flow && flags.flow.indexOf("current") >= 0) {
let idx = flags.flow.indexOf("current"); let idx = flags.flow.indexOf("current");
flags.flow[idx] = RED.workspaces.active();//convert active to flow ID flags.flow[idx] = RED.workspaces.active();//convert 'current' to active flow ID
} }
if (flags.flow && flags.flow.length) { if (flags.flow && flags.flow.length) {
flags.flow = [ ...new Set(flags.flow) ]; //deduplicate flags.flow = [ ...new Set(flags.flow) ]; //deduplicate
} }
if (val.length > 0 || typeFilter || hasFlags) { if (val.length > 0 || hasFlags) {
val = val.toLowerCase(); val = val.toLowerCase();
var i; let i;
var j; let j;
var list = []; let list = [];
var nodes = {}; const nodes = {};
let keys = []; let keys = [];
if (flags.uses) { if (flags.uses) {
keys = flags.uses; keys = flags.uses;
@ -145,10 +158,10 @@ RED.search = (function() {
keys = Object.keys(index); keys = Object.keys(index);
} }
for (i=0;i<keys.length;i++) { for (i=0;i<keys.length;i++) {
var key = keys[i]; const key = keys[i];
var kpos = keys[i].indexOf(val); const kpos = val ? keys[i].indexOf(val) : -1;
if (kpos > -1) { if (kpos > -1 || (val === "" && hasFlags)) {
var ids = Object.keys(index[key]||{}); const ids = Object.keys(index[key]||{});
for (j=0;j<ids.length;j++) { for (j=0;j<ids.length;j++) {
var node = index[key][ids[j]]; var node = index[key][ids[j]];
var isConfigNode = node.node._def.category === "config" && node.node.type !== 'group'; var isConfigNode = node.node._def.category === "config" && node.node.type !== 'group';
@ -156,7 +169,7 @@ RED.search = (function() {
continue; continue;
} }
if (flags.hasOwnProperty("invalid")) { if (flags.hasOwnProperty("invalid")) {
var nodeIsValid = !node.node.hasOwnProperty("valid") || node.node.valid; const nodeIsValid = !node.node.hasOwnProperty("valid") || node.node.valid;
if (flags.invalid === nodeIsValid) { if (flags.invalid === nodeIsValid) {
continue; continue;
} }
@ -186,7 +199,7 @@ RED.search = (function() {
} }
} }
if (flags.hasOwnProperty("unused")) { if (flags.hasOwnProperty("unused")) {
var isUnused = (node.node.type === 'subflow' && node.node.instances.length === 0) || const isUnused = (node.node.type === 'subflow' && node.node.instances.length === 0) ||
(isConfigNode && node.node.users.length === 0 && node.node._def.hasUsers !== false) (isConfigNode && node.node.users.length === 0 && node.node._def.hasUsers !== false)
if (flags.unused !== isUnused) { if (flags.unused !== isUnused) {
continue; continue;
@ -197,12 +210,16 @@ RED.search = (function() {
continue; continue;
} }
} }
if (!typeFilter || node.node.type === typeFilter) { let typeIndex = -1
nodes[node.node.id] = nodes[node.node.id] = { if(hasTypeFilter) {
typeIndex = flags.type.indexOf(node.node.type)
}
if (!hasTypeFilter || typeIndex > -1) {
nodes[node.node.id] = nodes[node.node.id] || {
node: node.node, node: node.node,
label: node.label label: node.label
}; };
nodes[node.node.id].index = Math.min(nodes[node.node.id].index||Infinity,kpos); nodes[node.node.id].index = Math.min(nodes[node.node.id].index || Infinity, typeIndex > -1 ? typeIndex : kpos);
} }
} }
} }