@node-red/editor-client 4.1.2 → 4.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-red/editor-client",
3
- "version": "4.1.2",
3
+ "version": "4.1.3",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
package/public/red/about CHANGED
@@ -1,5 +1,38 @@
1
- #### 4.1.2: Maintenance Release
1
+ #### 4.1.3: Maintenance Release
2
+
3
+ Editor
4
+
5
+ - 5343/Editor/Bug: Node help tab resets focus when arrow keys are used to switch between nodes (#5406) @piotrbogun
6
+ - Ensure quick-add filter is applied properly when retriggering add (#5427) @knolleary
7
+ - TreeList: Fix widget treeList keyboard navigation scroll behavior (#5421) @piotrbogun
8
+ - Editor: Flow & subflow names are changed to all lowercase in search dialog #5348 (#5401) @n-lark
9
+ - Allow actions show-next-tab and previous to loop (#5355) @GogoVega
10
+ - 5404/Editor/Bug: Junction error in Quick Add dialog (#5407) @piotrbogun
11
+ - Add tooltip to delete button in node property UI (#5410) @kazuhitoyokoi
12
+ - Fix invalid node size in quick add dialog (#5403) @kazuhitoyokoi
13
+ - Expand folder to avoid error in library (#5399) @kazuhitoyokoi
14
+ - Stricter validator for flow file name in project feature (#5398) @kazuhitoyokoi
15
+ - Fix size and scrolling in Git config UI (#5396) @kazuhitoyokoi
16
+ - Reveal node in search results via mouseover (#5368) @gorenje
17
+
18
+ Runtime
2
19
 
20
+ - Add package-lock.json for reproducible dependency chains (#5426) @dimitrieh
21
+ - Readme markdown refactor for legibility in IDE's (#5423) @dimitrieh
22
+ - Update body-parser (#5418) @knolleary
23
+
24
+ Nodes
25
+
26
+ - fix(http-request): prevent uncaught exceptions in async hooks (#5392) @Dennis-SEG
27
+ - Fix flushing when in variable delay mode (#5382) @dceejay
28
+ - File node TypedInput width fix (#5425) @knolleary
29
+ - Use TextDecoder() to decode UTF-8 characters (#5416) @kazuhitoyokoi
30
+ - Support source information in complete node (#5414) @kazuhitoyokoi
31
+ - Fix status node to retrieve status from all nodes (#5412) @kazuhitoyokoi
32
+ - Decrement count of http requests after error (#5409) @kazuhitoyokoi
33
+ - Fix debug tab to copy displayed value (#5400) @kazuhitoyokoi
34
+
35
+ #### 4.1.2: Maintenance Release
3
36
 
4
37
  Editor
5
38
 
package/public/red/red.js CHANGED
@@ -10047,7 +10047,13 @@ RED.utils = (function() {
10047
10047
  var copyPayload = $('<button class="red-ui-button red-ui-button-small"><i class="fa fa-clipboard"></i></button>').appendTo(copyTools).on("click", function(e) {
10048
10048
  e.preventDefault();
10049
10049
  e.stopPropagation();
10050
- RED.clipboard.copyText(msg,copyPayload,"clipboard.copyMessageValue");
10050
+ var payloadToCopy;
10051
+ if (typeof msg === "number") {
10052
+ payloadToCopy = obj.find(".red-ui-debug-msg-type-number").first().text();
10053
+ } else {
10054
+ payloadToCopy = msg;
10055
+ }
10056
+ RED.clipboard.copyText(payloadToCopy, copyPayload, "clipboard.copyMessageValue");
10051
10057
  })
10052
10058
  RED.popover.tooltip(copyPayload,RED._("node-red:debug.sidebar.copyPayload"));
10053
10059
  if (enablePinning && strippedKey !== undefined && strippedKey !== '') {
@@ -10375,7 +10381,7 @@ RED.utils = (function() {
10375
10381
  var sr = $('<div class="red-ui-debug-msg-object-entry collapsed"></div>').appendTo(stringRow);
10376
10382
  var stringEncoding = "";
10377
10383
  try {
10378
- stringEncoding = String.fromCharCode.apply(null, new Uint16Array(data))
10384
+ stringEncoding = new TextDecoder().decode(new Uint8Array(data));
10379
10385
  } catch(err) {
10380
10386
  console.log(err);
10381
10387
  }
@@ -11668,8 +11674,10 @@ RED.utils = (function() {
11668
11674
  var deleteButton = $('<a/>',{href:"#",class:"red-ui-editableList-item-remove red-ui-button red-ui-button-small"}).appendTo(li);
11669
11675
  $('<i/>',{class:"fa fa-remove"}).appendTo(deleteButton);
11670
11676
  li.addClass("red-ui-editableList-item-removable");
11677
+ var removeTip = RED.popover.tooltip(deleteButton, RED._("common.label.delete"));
11671
11678
  deleteButton.on("click", function(evt) {
11672
11679
  evt.preventDefault();
11680
+ removeTip.close();
11673
11681
  var data = row.data('data');
11674
11682
  li.addClass("red-ui-editableList-item-deleting")
11675
11683
  li.fadeOut(300, function() {
@@ -11977,7 +11985,10 @@ RED.utils = (function() {
11977
11985
  } else {
11978
11986
  that._topList.find(".focus").removeClass("focus")
11979
11987
  }
11980
- target.treeList.label.addClass('focus')
11988
+ if (target.treeList.label) {
11989
+ target.treeList.label.addClass('focus')
11990
+ }
11991
+ that.reveal(target);
11981
11992
  }
11982
11993
  });
11983
11994
  this._data = [];
@@ -12668,6 +12679,10 @@ RED.utils = (function() {
12668
12679
  }
12669
12680
 
12670
12681
  that._topList.find(".focus").removeClass("focus");
12682
+
12683
+ if (item.treeList.label) {
12684
+ item.treeList.label.addClass("focus");
12685
+ }
12671
12686
 
12672
12687
  if (triggerEvent !== false) {
12673
12688
  this._trigger("select",null,item)
@@ -14767,12 +14782,18 @@ RED.tabs = (function() {
14767
14782
  }
14768
14783
  function activatePreviousTab() {
14769
14784
  var previous = findPreviousVisibleTab();
14785
+ if (previous.length === 0) {
14786
+ previous = ul.find("li.red-ui-tab:not(.hide-tab)").last();
14787
+ }
14770
14788
  if (previous.length > 0) {
14771
14789
  activateTab(previous.find("a"));
14772
14790
  }
14773
14791
  }
14774
14792
  function activateNextTab() {
14775
14793
  var next = findNextVisibleTab();
14794
+ if (next.length === 0) {
14795
+ next = ul.find("li.red-ui-tab:not(.hide-tab)").first();
14796
+ }
14776
14797
  if (next.length > 0) {
14777
14798
  activateTab(next.find("a"));
14778
14799
  }
@@ -24023,6 +24044,13 @@ RED.view = (function() {
24023
24044
  quickAddLink.virtualLink = true;
24024
24045
  }
24025
24046
  hideDragLines();
24047
+ } else if (quickAddLink) {
24048
+ // continuing an existing quick add - set the filter accordingly
24049
+ if (quickAddLink.portType === PORT_TYPE_OUTPUT) {
24050
+ filter = {input:true}
24051
+ } else {
24052
+ filter = {output:true}
24053
+ }
24026
24054
  }
24027
24055
  if (linkToSplice || spliceMultipleLinks) {
24028
24056
  filter = {
@@ -29190,6 +29218,9 @@ RED.view = (function() {
29190
29218
  suggestedNodes = [suggestedNodes]
29191
29219
  }
29192
29220
  suggestedNodes = suggestedNodes.filter(n => {
29221
+ if (n.type === 'junction') {
29222
+ return true
29223
+ }
29193
29224
  const def = RED.nodes.getType(n.type)
29194
29225
  if (def?.set && def.set.enabled === false) {
29195
29226
  // Exclude disabled node set
@@ -47504,7 +47535,7 @@ RED.library = (function() {
47504
47535
  icon: 'fa fa-cube',
47505
47536
  label: options.type,
47506
47537
  path: "",
47507
- expanded: false,
47538
+ expanded: true,
47508
47539
  children: function(done, item) {
47509
47540
  loadLibraryFolder(lib.id, options.url, "", function(children) {
47510
47541
  item.children = children;
@@ -48447,9 +48478,13 @@ RED.search = (function() {
48447
48478
  function indexNode(n) {
48448
48479
  var l = RED.utils.getNodeLabel(n);
48449
48480
  if (l) {
48450
- l = (""+l).toLowerCase();
48451
- index[l] = index[l] || {};
48452
- index[l][n.id] = {node:n,label:l}
48481
+ const originalLabel = "" + l;
48482
+ const indexLabel = originalLabel.toLowerCase();
48483
+ index[indexLabel] = index[indexLabel] || {};
48484
+ index[indexLabel][n.id] = {
48485
+ node: n,
48486
+ label: originalLabel
48487
+ };
48453
48488
  }
48454
48489
  l = l||n.label||n.name||n.id||"";
48455
48490
 
@@ -48838,6 +48873,12 @@ RED.search = (function() {
48838
48873
  $('<div>',{class:"red-ui-search-result-node-type"}).text(node.type).appendTo(contentDiv);
48839
48874
  $('<div>',{class:"red-ui-search-result-node-id"}).text(node.id).appendTo(contentDiv);
48840
48875
 
48876
+ div.on("mouseover", function(evt) {
48877
+ if ( node.z == RED.workspaces.active() ) {
48878
+ RED.view.reveal(node.id)
48879
+ }
48880
+ });
48881
+
48841
48882
  div.on("click", function(evt) {
48842
48883
  evt.preventDefault();
48843
48884
  currentIndex = i;
@@ -49075,10 +49116,20 @@ RED.search = (function() {
49075
49116
  show: show,
49076
49117
  hide: hide,
49077
49118
  search: search,
49078
- getSearchOptions: getSearchOptions
49119
+ getSearchOptions: getSearchOptions,
49120
+ // Expose internals for testing
49121
+ _indexNode: indexNode,
49122
+ get _index() { return index; },
49123
+ set _index(val) { index = val; }
49079
49124
  };
49080
49125
 
49081
49126
  })();
49127
+
49128
+
49129
+ // Allow CommonJS import for testing
49130
+ if (typeof module !== "undefined" && module.exports) {
49131
+ module.exports = RED.search;
49132
+ }
49082
49133
  ;RED.contextMenu = (function () {
49083
49134
 
49084
49135
  let menu;
@@ -53387,7 +53438,7 @@ RED.projects = (function() {
53387
53438
  var validateForm = function() {
53388
53439
  var valid = true;
53389
53440
  var flowFile = projectFlowFileInput.val();
53390
- if (flowFile === "" || !/\.json$/.test(flowFile)) {
53441
+ if (flowFile === "" || !/^[a-zA-Z0-9\-_]+\.json$/.test(flowFile)) {
53391
53442
  valid = false;
53392
53443
  if (!projectFlowFileInput.hasClass("input-error")) {
53393
53444
  projectFlowFileInput.addClass("input-error");
@@ -53809,7 +53860,7 @@ RED.projects = (function() {
53809
53860
 
53810
53861
  } else if (projectType === 'empty') {
53811
53862
  var flowFile = projectFlowFileInput.val();
53812
- if (flowFile === "" || !/\.json$/.test(flowFile)) {
53863
+ if (flowFile === "" || !/^[a-zA-Z0-9\-_]+\.json$/.test(flowFile)) {
53813
53864
  valid = false;
53814
53865
  if (!projectFlowFileInput.hasClass("input-error")) {
53815
53866
  projectFlowFileInput.addClass("input-error");