From c1e3b0d971bd7bbd4d307453bd38202ac333730b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20L=C3=A9caud=C3=A9?= Date: Tue, 2 Apr 2019 15:00:25 -0400 Subject: [PATCH 001/137] http request node: warn user if msg.requestTimeout == 0 --- .../@node-red/nodes/core/io/21-httprequest.js | 4 ++-- test/nodes/core/io/21-httprequest_spec.js | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js index d64947e4b..d72e16bad 100644 --- a/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js @@ -94,10 +94,10 @@ module.exports = function(RED) { opts.maxRedirects = 21; opts.jar = request.jar(); opts.proxy = null; - if (msg.requestTimeout) { + if (msg.requestTimeout !== undefined) { if (isNaN(msg.requestTimeout)) { node.warn(RED._("httpin.errors.timeout-isnan")); - } else if (msg.requestTimeout < 0) { + } else if (msg.requestTimeout < 1) { node.warn(RED._("httpin.errors.timeout-isnegative")); } else { opts.timeout = msg.requestTimeout; diff --git a/test/nodes/core/io/21-httprequest_spec.js b/test/nodes/core/io/21-httprequest_spec.js index 1f37131f5..9a32cef7a 100644 --- a/test/nodes/core/io/21-httprequest_spec.js +++ b/test/nodes/core/io/21-httprequest_spec.js @@ -979,6 +979,29 @@ describe('HTTP Request Node', function() { n1.receive({payload:"foo", requestTimeout: -4}); }); }); + it('should show a warning if msg.requestTimeout is set to 0', function(done) { + var flow = [{id:"n1",type:"http request",wires:[["n2"]],method:"GET",ret:"obj",url:getTestURL('/text')}, + {id:"n2", type:"helper"}]; + helper.load(httpRequestNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + msg.should.have.property('statusCode', 200); + var logEvents = helper.log().args.filter(function(evt) { + return evt[0].type == 'http request'; + }); + logEvents.should.have.length(2); + var tstmp = logEvents[0][0].timestamp; + logEvents[0][0].should.eql({level:helper.log().WARN, id:'n1',type:'http request',msg:'httpin.errors.timeout-isnegative', timestamp:tstmp}); + done(); + } catch(err) { + done(err); + } + }); + n1.receive({payload:"foo", requestTimeout: 0}); + }); + }); it('should pass if response time is faster than timeout set via msg.requestTimeout', function(done) { var flow = [{id:"n1",type:"http request",wires:[["n2"]],method:"GET",ret:"obj",url:getTestURL('/timeout50ms')}, {id:"n2", type:"helper"}]; From 12ff3abedac15eee1b0e2e6d31dfe5af7466da2a Mon Sep 17 00:00:00 2001 From: Bernardo Belchior Date: Tue, 30 Apr 2019 14:19:51 +0100 Subject: [PATCH 002/137] Remove unnecessary ternary --- .../node_modules/@node-red/nodes/core/core/80-function.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/core/80-function.html b/packages/node_modules/@node-red/nodes/core/core/80-function.html index aaad4d6fd..5a033e5a7 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-function.html +++ b/packages/node_modules/@node-red/nodes/core/core/80-function.html @@ -27,7 +27,7 @@ name: {value:""}, func: {value:"\nreturn msg;"}, outputs: {value:1}, - noerr: {value:0,required:true,validate:function(v) { return ((!v) || (v === 0)) ? true : false; }} + noerr: {value:0,required:true,validate:function(v) { return ((!v) || (v === 0)); }} }, inputs:1, outputs:1, From 38c87a056cb3e0dc22ba44988276e4b7e9da94c9 Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Fri, 3 May 2019 19:20:19 +0200 Subject: [PATCH 003/137] i18n-german https://github.com/jwende/nodered-german/issues/1 --- .../@node-red/editor-client/locales/de/editor.json | 2 +- .../@node-red/editor-client/locales/de/jsonata.json | 8 ++++---- .../@node-red/nodes/locales/de/core/20-inject.html | 2 +- .../node_modules/@node-red/nodes/locales/de/messages.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index d477d3f0e..65d89b970 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -616,7 +616,7 @@ "bool" : "boolean", "json" : "JSON", "bin" : "Puffer", - "date" : "Zeitmarke", + "date" : "timestamp", "jsonata" : "Ausdruck", "env" : "env, Variable" } diff --git a/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json index a7cf12715..7859ca844 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json @@ -53,7 +53,7 @@ }, "$now" : { "args" : "", - "desc" : "Generiert eine Zeitmarke im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück." + "desc" : "Generiert einen Zeitstempel im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück." }, "$base64encode" : { "args" : "Zeichenfolge", @@ -201,7 +201,7 @@ }, "$fromMillis" : { "args" : "Anzahl", - "desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) in eine Zeitmarkenzeichenfolge im ISO 8601-Format darstellt." + "desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) enthält in eine Zeitangabe im ISO 8601-Format." }, "$formatNumber" : { "args" : "Zahl, Bild [, Optionen]", @@ -212,8 +212,8 @@ "desc" : "Transformiere die `Zahl` in eine Zeichenfolge und formatiert sie in eine ganze Zahl, die in der durch das `radix` -Argument angegebenen Zahlenbasis dargestellt wird. Wenn 'radix' nicht angegeben wird, wird standardmäßig die Basis 10 verwendet. 'radix` kann zwischen 2 und 36 liegen, andernfalls wird ein Fehler ausgelöst." }, "$toMillis" : { - "args" : "Zeitmarke", - "desc" : "Konvertieren Sie eine Zeichenfolge `Zeitmarke' im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat." + "args" : "timestamp", + "desc" : "Konvertieren Sie eine Zeitangabe im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat." }, "$env" : { "args" : "arg", diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html b/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html index c9e8f8c9e..9d9a7ba3f 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html @@ -26,7 +26,7 @@

Details

Der Inject-Knoten kann einen Flow mit einem bestimmten Nutzdatenwert starten. - Die Standardnutzlast ist die aktuelle Zeit als Zeitmarke seit dem 1. Januar 1970 in Millisekunden.

+ Die Standardnutzlast ist die aktuelle Zeit als Zeitstempel seit dem 1. Januar 1970 in Millisekunden.

Der Knoten unterstützt auch die Injektion von Zeichenfolgen, Zahlen, Boolescher Daten, JavaScript-Objekten oder flow/globalen Kontextwerten.

Der Knoten wird standardmäßig manuell ausgelöst, indem Sie im Editor auf seine Schaltfläche klicken. Er kann auch in regelmäßigen Abständen oder nach einem Zeitplan injizieren.

Er kann auch so konfiguriert werden, dass er jedes Mal, wenn der Flow gestartet wird einen Wert injiziert.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json index cb484a31e..178576a55 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -37,7 +37,7 @@ "label" : { "repeat" : "Wiederholen" }, - "timestamp" : "Zeitmarke", + "timestamp" : "timestamp", "none" : "keine", "interval" : "Intervall", "interval-time" : "Intervall zwischen den Uhrzeiten", From 20851664e8d6c8948613356172b252acec25ef92 Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Fri, 3 May 2019 19:21:50 +0200 Subject: [PATCH 004/137] i18n-german https://github.com/jwende/nodered-german/issues/2 --- .../@node-red/editor-client/locales/de/editor.json | 12 ++++++------ .../@node-red/nodes/locales/de/messages.json | 2 +- .../@node-red/runtime/locales/de/runtime.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 65d89b970..d7b086669 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -87,7 +87,7 @@ "notAuthorized" : "Keine Berechtigung", "errors" : { "settings" : "Sie müssen angemeldet sein, um auf die Einstellungen zuzugreifen.", - "deploy" : "Sie müssen angemeldet sein, um Änderungen implementieren zu können.", + "deploy" : "Sie müssen angemeldet sein, um Änderungen anwenden zu können.", "notAuthorized" : "Sie müssen angemeldet sein, um diese Aktion ausführen zu können." } }, @@ -164,7 +164,7 @@ "copyMessageValue_truncated" : "Abgeschnittene Wert kopiert" }, "deploy" : { - "deploy" : "Implementieren", + "deploy" : "deploy", "full" : "Voll", "fullDesc" : "Implementiert alles im Arbeitsbereich", "modifiedFlows" : "Geänderte Flows", @@ -172,7 +172,7 @@ "modifiedNodes" : "Geänderte Knoten", "modifiedNodesDesc" : "Implementiert nur Knoten, die sich geändert haben.", "successfulDeploy" : "Erfolgreich implementiert", - "deployFailed" : "Implementieren fehlgeschlagen: __message__", + "deployFailed" : "Deploy fehlgeschlagen: __message__", "unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurationsknoten.", "unusedConfigNodesLink" : "Klicken Sie hier, um sie zu sehen", "errors" : { @@ -181,16 +181,16 @@ "confirm" : { "button" : { "ignore" : "Ignorieren", - "confirm" : "Implementieren bestätigen", + "confirm" : "Deploy bestätigen", "review" : "Änderungen prüfen", "cancel" : "Abbrechen", "merge" : "Zusammenführen", - "overwrite" : "Ignorieren & implementieren" + "overwrite" : "Ignorieren & deployen" }, "undeployedChanges" : "Sie haben nicht implementierte Änderungen.\n\nWenn Sie diese Seite verlassen, gehen diese Änderungen verloren.", "improperlyConfigured" : "Der Arbeitsbereich enthält einige Knoten, die nicht ordnungsgemäß konfiguriert sind:", "unknown" : "Der Arbeitsbereich enthält einige unbekannte Knotentypen:", - "confirm" : "Sind Sie sicher, dass Sie implementieren möchten?", + "confirm" : "Sind Sie sicher, dass Sie deployen möchten?", "doNotWarn" : "warnen Sie nicht noch einmal.", "conflict" : "Auf dem Server wird eine aktuellere Gruppe von Datenflüssen ausgeführt.", "backgroundUpdate" : "Die Datenflüsse auf dem Server wurden aktualisiert.", diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json index 178576a55..a89b57eb2 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -310,7 +310,7 @@ "label" : { "unknown" : "unbekannt" }, - "tip" : "

Dieser Knoten ist ein Typ, der Ihrer Installation von Node-RED unbekannt ist.

Wenn Sie mit dem Knoten in diesem Status implementieren, wird die Konfiguration beibehalten, aber der Fluss wird erst gestartet, wenn der fehlende Typ installiert ist.

Weitere Informationen finden Sie in der Info-Seitenleiste für. Weitere Hilfe

" + "tip" : "

Dieser Knoten ist ein Typ, der Ihrer Installation von Node-RED unbekannt ist.

Wenn Sie mit dem Knoten in diesem Status deployen, wird die Konfiguration beibehalten, aber der Fluss wird erst gestartet, wenn der fehlende Typ installiert ist.

Weitere Informationen finden Sie in der Info-Seitenleiste für. Weitere Hilfe

" }, "mqtt" : { "label" : { diff --git a/packages/node_modules/@node-red/runtime/locales/de/runtime.json b/packages/node_modules/@node-red/runtime/locales/de/runtime.json index 3dd8d7a56..ee4251f3f 100755 --- a/packages/node_modules/@node-red/runtime/locales/de/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/de/runtime.json @@ -79,7 +79,7 @@ "error" : "Fehler beim Laden der Berechtigungsnachweise: __message__", "error-saving" : "Fehler beim Speichern der Berechtigungsnachweise: __message__", "not-registered" : "Der Berechtigungsnachweistyp '__type__' ist nicht registriert.", - "system-key-warning" : "\n\n---------------------------------------------------------------------\nDie Datei mit den Datenflowberechtigungsnachweisen wird mit einem vom System generierten Schlüssel verschlüsselt.\n\nWenn der vom System generierte Schlüssel aus irgendeinem Grund verloren geht, werden Ihre Berechtigungsnachweise\nDie Datei kann nicht wiederhergestellt werden. Sie müssen sie löschen und erneut eingeben.\nIhre Berechtigungsnachweise.\n\nSie sollten Ihren eigenen Schlüssel mit Hilfe der Option 'credentialSecret' in\nIhre Einstellungsdatei. Node-RED wird dann Ihre Berechtigungsnachweise erneut verschlüsseln.\nDatei mit dem ausgewählten Schlüssel beim nächsten Implementieren einer Änderung verwenden.\n---------------------------------------------------------------------\n" + "system-key-warning" : "\n\n---------------------------------------------------------------------\nDie Datei mit den Datenflowberechtigungsnachweisen wird mit einem vom System generierten Schlüssel verschlüsselt.\n\nWenn der vom System generierte Schlüssel aus irgendeinem Grund verloren geht, werden Ihre Berechtigungsnachweise\nDie Datei kann nicht wiederhergestellt werden. Sie müssen sie löschen und erneut eingeben.\nIhre Berechtigungsnachweise.\n\nSie sollten Ihren eigenen Schlüssel mit Hilfe der Option 'credentialSecret' in\nIhre Einstellungsdatei. Node-RED wird dann Ihre Berechtigungsnachweise erneut verschlüsseln.\nDatei mit dem ausgewählten Schlüssel beim nächsten Deployen einer Änderung verwenden.\n---------------------------------------------------------------------\n" }, "flows" : { "registered-missing" : "Fehlender Typ registriert: __type__", From 93674b4e29cc7e6b5daed9dde5efedc2b6f1b482 Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Fri, 3 May 2019 19:22:50 +0200 Subject: [PATCH 005/137] i18n-german https://github.com/jwende/nodered-german/issues/3 --- .../node_modules/@node-red/nodes/locales/de/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json index a89b57eb2..17b499adf 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -415,8 +415,8 @@ "url2" : "Standardmäßig enthält Nutzdaten die Daten, die über einen Websocket gesendet oder von einem Websocket empfangen werden. Der Client kann so konfiguriert werden, dass er das gesamte Nachrichtenobjekt als eine JSON-formatierte Zeichenfolge sendet oder empfängt." }, "status" : { - "connected" : "angeschlossener __count__", - "connected_plural" : "angeschlossener __count__" + "connected" : "verbunden __count__", + "connected_plural" : "verbunden __count__" }, "errors" : { "connect-error" : "Bei der WS-Verbindung ist ein Fehler aufgetreten: ", From 2f1ba6cf1f489caf5e8d979861f1d86ab39e307b Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Fri, 3 May 2019 19:47:30 +0200 Subject: [PATCH 006/137] i18n-german https://github.com/jwende/nodered-german/issues/4 --- .../editor-client/locales/de/editor.json | 150 +++++++++--------- .../editor-client/locales/de/infotips.json | 26 +-- .../nodes/locales/de/core/20-inject.html | 12 +- .../nodes/locales/de/core/25-catch.html | 20 +-- .../nodes/locales/de/core/25-status.html | 14 +- .../nodes/locales/de/core/58-debug.html | 12 +- .../nodes/locales/de/core/60-link.html | 12 +- .../nodes/locales/de/core/75-exec.html | 14 +- .../nodes/locales/de/core/80-function.html | 18 +-- .../nodes/locales/de/core/89-delay.html | 10 +- .../nodes/locales/de/core/89-trigger.html | 14 +- .../nodes/locales/de/core/90-comment.html | 4 +- .../nodes/locales/de/core/98-unknown.html | 14 +- .../locales/de/hardware/36-rpi-gpio.html | 14 +- .../nodes/locales/de/io/10-mqtt.html | 20 +-- .../nodes/locales/de/io/21-httpin.html | 16 +- .../nodes/locales/de/io/21-httprequest.html | 22 +-- .../nodes/locales/de/io/22-websocket.html | 10 +- .../nodes/locales/de/io/31-tcpin.html | 8 +- .../@node-red/nodes/locales/de/io/32-udp.html | 6 +- .../nodes/locales/de/logic/10-switch.html | 12 +- .../nodes/locales/de/logic/15-change.html | 2 +- .../nodes/locales/de/logic/16-range.html | 4 +- .../nodes/locales/de/logic/17-split.html | 36 ++--- .../nodes/locales/de/logic/18-sort.html | 10 +- .../nodes/locales/de/logic/19-batch.html | 8 +- .../@node-red/nodes/locales/de/messages.json | 56 +++---- .../nodes/locales/de/parsers/70-CSV.html | 4 +- .../nodes/locales/de/parsers/70-HTML.html | 2 +- .../nodes/locales/de/parsers/70-JSON.html | 12 +- .../nodes/locales/de/parsers/70-XML.html | 2 +- .../nodes/locales/de/storage/50-file.html | 4 +- .../@node-red/runtime/locales/de/runtime.json | 32 ++-- 33 files changed, 300 insertions(+), 300 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index d7b086669..e4b403a55 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -48,9 +48,9 @@ }, "settings" : "Einstellungen", "userSettings" : "Benutzereinstellungen", - "nodes" : "Knoten", - "displayStatus" : "Knotenstatus anzeigen", - "displayConfig" : "Konfigurationsknoten", + "nodes" : "Nodes", + "displayStatus" : "Nodestatus anzeigen", + "displayConfig" : "Konfigurations-Node", "import" : "Import", "export" : "Exportieren", "search" : "Flows durchsuchen", @@ -94,10 +94,10 @@ "notification" : { "warning" : " Warnung : __message__", "warnings" : { - "undeployedChanges" : "Knoten hat nicht implementierte Änderungen", - "nodeActionDisabled" : "In Subflow inaktivierte Knotenaktionen", - "missing-types" : "

Die Flows wurden aufgrund fehlender Knotentypen gestoppt.

", - "restartRequired" : "Knoten-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können", + "undeployedChanges" : "Node hat nicht implementierte Änderungen", + "nodeActionDisabled" : "In Subflow inaktivierte Nodeaktionen", + "missing-types" : "

Die Flows wurden aufgrund fehlender Nodetypen gestoppt.

", + "restartRequired" : "Node-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können", "credentials_load_failed" : "

Die Flows wurden gestoppt, da die Berechtigungsnachweise nicht entschlüsselt werden konnten.

Die Datei mit dem Datenflowberechtigungsnachweis ist verschlüsselt, aber der Verschlüsselungsschlüssel des Projekts fehlt oder ist ungültig.

", "credentials_load_failed_reset" : "

Die Berechtigungsnachweise konnten nicht entschlüsselt werden

Die Datei mit dem Flow-Berechtigungsnachweis ist verschlüsselt, aber der Chiffrierschlüssel des Projekts fehlt oder ist ungültig.

Die Datei des Flow-Berechtigungsnachweises wird bei der nächsten Implementierung zurückgesetzt. Alle vorhandenen Datenflowberechtigungsnachweise werden gelöscht.

", "missing_flow_file" : "

Die Projektflowdatei wurde nicht gefunden.

Das Projekt ist nicht mit einer Flow-Datei konfiguriert.

", @@ -136,19 +136,19 @@ } }, "clipboard" : { - "nodes" : "Knoten", + "nodes" : "Nodes", "selectNodes" : "Wählen Sie den Text oben aus, und kopieren Sie die Datei in die Zwischenablage.", - "pasteNodes" : "Knoten hier einfügen", - "importNodes" : "Knoten importieren", - "exportNodes" : "Knoten in Zwischenablage exportieren", + "pasteNodes" : "Nodes hier einfügen", + "importNodes" : "Nodes importieren", + "exportNodes" : "Nodes in Zwischenablage exportieren", "importUnrecognised" : "Importierter Typ nicht erkannt:", "importUnrecognised_plural" : "Importierte Typen nicht erkannt:", - "nodesExported" : "Knoten, die in die Zwischenablage exportiert wurden", - "nodeCopied" : "__count__ Knoten kopiert", - "nodeCopied_plural" : "__count__ Knoten kopiert", + "nodesExported" : "Nodes, die in die Zwischenablage exportiert wurden", + "nodeCopied" : "__count__ Node kopiert", + "nodeCopied_plural" : "__count__ Nodes kopiert", "invalidFlow" : "Ungültiger Nachrichtenflow: __message__", "export" : { - "selected" : "Ausgewählte Knoten", + "selected" : "Ausgewählte Nodes", "current" : "Aktueller Flow", "all" : "alle Flows", "compact" : "kompakt", @@ -168,12 +168,12 @@ "full" : "Voll", "fullDesc" : "Implementiert alles im Arbeitsbereich", "modifiedFlows" : "Geänderte Flows", - "modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Knoten enthalten.", - "modifiedNodes" : "Geänderte Knoten", - "modifiedNodesDesc" : "Implementiert nur Knoten, die sich geändert haben.", + "modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Nodes enthalten.", + "modifiedNodes" : "Geänderte Nodes", + "modifiedNodesDesc" : "Implementiert nur Nodes, die sich geändert haben.", "successfulDeploy" : "Erfolgreich implementiert", "deployFailed" : "Deploy fehlgeschlagen: __message__", - "unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurationsknoten.", + "unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurations-Nodes.", "unusedConfigNodesLink" : "Klicken Sie hier, um sie zu sehen", "errors" : { "noResponse" : "Keine Antwort vom Server" @@ -188,8 +188,8 @@ "overwrite" : "Ignorieren & deployen" }, "undeployedChanges" : "Sie haben nicht implementierte Änderungen.\n\nWenn Sie diese Seite verlassen, gehen diese Änderungen verloren.", - "improperlyConfigured" : "Der Arbeitsbereich enthält einige Knoten, die nicht ordnungsgemäß konfiguriert sind:", - "unknown" : "Der Arbeitsbereich enthält einige unbekannte Knotentypen:", + "improperlyConfigured" : "Der Arbeitsbereich enthält einige Nodes, die nicht ordnungsgemäß konfiguriert sind:", + "unknown" : "Der Arbeitsbereich enthält einige unbekannte Node-Typen:", "confirm" : "Sind Sie sicher, dass Sie deployen möchten?", "doNotWarn" : "warnen Sie nicht noch einmal.", "conflict" : "Auf dem Server wird eine aktuellere Gruppe von Datenflüssen ausgeführt.", @@ -203,7 +203,7 @@ "diff" : { "unresolvedCount" : "__count__ unaufgelöster Konflikt", "unresolvedCount_plural" : "__count__ unaufgelöste Konflikte", - "globalNodes" : "Globale Knoten", + "globalNodes" : "Globale Nodes", "flowProperties" : "Flow-Eigenschaften", "type" : { "added" : "hinzugefügt", @@ -215,8 +215,8 @@ "movedTo" : "verschoben zu __id__", "movedFrom" : "verschoben von __id__" }, - "nodeCount" : "__count__, Knoten", - "nodeCount_plural" : "__count__-Knoten", + "nodeCount" : "__count__, Node", + "nodeCount_plural" : "__count__-Nodes", "local" : "Lokale Änderungen", "remote" : "Ferne Änderungen", "reviewChanges" : "Änderungen prüfen", @@ -242,7 +242,7 @@ "category" : "Kategorie", "format" : "Markdown-Format", "errors" : { - "noNodesSelected" : " Subflow kann nicht erstellt werden : Es wurden keine Knoten ausgewählt.", + "noNodesSelected" : " Subflow kann nicht erstellt werden : Es wurden keine Nodes ausgewählt.", "multipleInputsToSelection" : " Subflow kann nicht erstellt werden : Mehrere Eingaben zur Auswahl" } }, @@ -252,13 +252,13 @@ "configUpdate" : "Aktualisieren", "configDelete" : "Löschen", "nodesUse" : "__count__node verwendet diese Konfiguration", - "nodesUse_plural" : "__count__ -Knoten verwenden diese Konfiguration", - "addNewConfig" : "Neuen __type__config-Knoten hinzufügen", - "editNode" : "__type__ Knoten bearbeiten", - "editConfig" : "__type__config-Knoten bearbeiten", + "nodesUse_plural" : "__count__ -Nodes verwenden diese Konfiguration", + "addNewConfig" : "Neuen __type__config-Node hinzufügen", + "editNode" : "__type__ Node bearbeiten", + "editConfig" : "__type__config-Node bearbeiten", "addNewType" : "Neuen __type__ hinzufügen ...", - "nodeProperties" : "Knoteneigenschaften", - "portLabels" : "Knoteneinstellungen", + "nodeProperties" : "Node-Eigenschaften", + "portLabels" : "Node-Einstellungen", "labelInputs" : "Eingänge", "labelOutputs" : "Ausgänge", "settingIcon" : "Symbol", @@ -267,7 +267,7 @@ "searchIcons" : "Suchsymbole", "useDefault" : "Standardwert verwenden", "errors" : { - "scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Knoten in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein." + "scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Nodes in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein." } }, "keyboard" : { @@ -279,19 +279,19 @@ "unassigned" : "Nicht zugeordnet", "global" : "global", "workspace" : "Arbeitsbereich", - "selectAll" : "Alle Knoten auswählen", - "selectAllConnected" : "Alle verbundenen Knoten auswählen", - "addRemoveNode" : "Knoten aus Auswahl hinzufügen/entfernen", - "editSelected" : "Ausgewählten Knoten bearbeiten", - "deleteSelected" : "Ausgewählte Knoten oder ausgewählten Link löschen", - "importNode" : "Knoten importieren", - "exportNode" : "Knoten exportieren", - "nudgeNode" : "Ausgewählte Knoten verschieben (1px)", - "moveNode" : "Ausgewählte Knoten verschieben (20px)", + "selectAll" : "Alle Nodes auswählen", + "selectAllConnected" : "Alle verbundenen Nodes auswählen", + "addRemoveNode" : "Node aus Auswahl hinzufügen/entfernen", + "editSelected" : "Ausgewählten Node bearbeiten", + "deleteSelected" : "Ausgewählte Node oder ausgewählten Link löschen", + "importNode" : "Node importieren", + "exportNode" : "Node exportieren", + "nudgeNode" : "Ausgewählte Nodes verschieben (1px)", + "moveNode" : "Ausgewählte Nodes verschieben (20px)", "toggleSidebar" : "Seitenleiste ein-/ausschalten", - "copyNode" : "Ausgewählte Knoten kopieren", - "cutNode" : "Ausgewählte Knoten ausschneiden", - "pasteNode" : "Knoten einfügen", + "copyNode" : "Ausgewählte Nodes kopieren", + "cutNode" : "Ausgewählte Nodes ausschneiden", + "pasteNode" : "Node einfügen", "undoChange" : "Letzte Änderung rückgängig machen", "searchBox" : "Suchfeld öffnen", "managePalette" : "Palette verwalten" @@ -301,10 +301,10 @@ "saveToLibrary" : "In Bibliothek speichern ...", "typeLibrary" : "__type__, Bibliothek", "unnamedType" : "Unbenannt __type__", - "exportToLibrary" : "Knoten in Bibliothek exportieren", + "exportToLibrary" : "Node in Bibliothek exportieren", "dialogSaveOverwrite" : "Ein __libraryType__ mit dem Namen __libraryName__ ist bereits vorhanden. Überschreiben?", "invalidFilename" : "Ungültiger Dateiname", - "savedNodes" : "Gespeicherte Knoten", + "savedNodes" : "Gespeicherte Nodes", "savedType" : "Gespeichert __type__", "saveFailed" : "Speichern fehlgeschlagen: __message__", "filename" : "Name der Datei", @@ -316,7 +316,7 @@ }, "palette" : { "noInfo" : "Keine Informationen verfügbar", - "filter" : "Filterknoten", + "filter" : "Filter Nodes", "search" : "Suchmodule", "addCategory" : "Neu hinzufügen ...", "label" : { @@ -330,15 +330,15 @@ "advanced" : "fortgeschritten" }, "event" : { - "nodeAdded" : "Knoten zur Palette hinzugefügt:", - "nodeAdded_plural" : "Die Palette wurde der Palette hinzugefügt.", - "nodeRemoved" : "Knoten aus Palette entfernt:", - "nodeRemoved_plural" : "Knoten aus Palette entfernt:", - "nodeEnabled" : "Knoten aktiviert:", - "nodeEnabled_plural" : "Knoten aktiviert:", - "nodeDisabled" : "Knoten inaktiviert:", - "nodeDisabled_plural" : "Knoten inaktiviert:", - "nodeUpgraded" : "Knotenmodul __module__ aktualisiert auf Version __version__" + "nodeAdded" : "Node zur Palette hinzugefügt:", + "nodeAdded_plural" : "Die Nodes wurde der Palette hinzugefügt.", + "nodeRemoved" : "Node aus Palette entfernt:", + "nodeRemoved_plural" : "Nodes aus Palette entfernt:", + "nodeEnabled" : "Node aktiviert:", + "nodeEnabled_plural" : "Nodes aktiviert:", + "nodeDisabled" : "Node inaktiviert:", + "nodeDisabled_plural" : "Nodes inaktiviert:", + "nodeUpgraded" : "Node-Modul __module__ aktualisiert auf Version __version__" }, "editor" : { "title" : "Palette verwalten", @@ -362,8 +362,8 @@ "yearsMonthsV" : "____ Jahre, __count__ Monat vor", "yearsMonthsV_plural" : "____ Jahre, __count__ Monaten" }, - "nodeCount" : "__label__, Knoten", - "nodeCount_plural" : "__label__ Knoten", + "nodeCount" : "__label__, Node", + "nodeCount_plural" : "__label__ Nodes", "moduleCount" : "__count__ Modul verfügbar", "moduleCount_plural" : "__count__-Module verfügbar", "inuse" : "im Gebrauch", @@ -377,14 +377,14 @@ "install" : "installieren", "installed" : "installiert", "loading" : "Kataloge werden geladen ...", - "tab-nodes" : "Knoten", + "tab-nodes" : "Nodes", "tab-install" : "installieren", "sort" : "Sortierung:", "sortAZ" : "a-z", "sortRecent" : "kürzlich", "more" : "+ __count__ mehr", "errors" : { - "catalogLoadFailed" : "

Fehler beim Laden des Knotenkatalogs.

Weitere Informationen finden Sie in der Browserkonsole.

", + "catalogLoadFailed" : "

Fehler beim Laden des Node-Katalogs.

Weitere Informationen finden Sie in der Browserkonsole.

", "installFailed" : "

Installation fehlgeschlagen: __module__

__message__

Überprüfen Sie das Protokoll auf weitere Informationen.

", "removeFailed" : "

Entfernen fehlgeschlagen: __module__

__message__

Überprüfen Sie das Protokoll auf weitere Informationen.

", "updateFailed" : "

Aktualisierung fehlgeschlagen: __module__

__message__

Überprüfen Sie das Protokoll auf weitere Informationen.

", @@ -393,22 +393,22 @@ }, "confirm" : { "install" : { - "body" : "

Installieren von '__module__'

Vor der Installation von lesen Sie bitte die Dokumentation des Knotens. Einige Knoten haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern.

", - "title" : "Knoten installieren" + "body" : "

Installieren von '__module__'

Vor der Installation von lesen Sie bitte die Dokumentation des Nodes. Einige Nodes haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern.

", + "title" : "Nodes installieren" }, "remove" : { - "body" : "

Entfernen von '__module__'

-Der Knoten deinstalliert ihn aus Node-RED. Der Knoten kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird.

", - "title" : "Knoten entfernen" + "body" : "

Entfernen von '__module__'

-Der Node deinstalliert ihn aus Node-RED. Der Node kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird.

", + "title" : "Nodes entfernen" }, "update" : { - "body" : "

Aktualisieren von '__module__'

Für die Aktualisierung des Knotens ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen.

", - "title" : "Knoten aktualisieren" + "body" : "

Aktualisieren von '__module__'

Für die Aktualisierung des Nodes ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen.

", + "title" : "Nodes aktualisieren" }, "cannotUpdate" : { - "body" : "Es ist eine Aktualisierung für diesen Knoten verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann.

Weitere Informationen zum Aktualisieren dieses Knotens finden Sie in der Dokumentation." + "body" : "Es ist eine Aktualisierung für diesen Node verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann.

Weitere Informationen zum Aktualisieren dieses Nodes finden Sie in der Dokumentation." }, "button" : { - "review" : "Knoteninformationen öffnen", + "review" : "Node-Informationen öffnen", "install" : "installieren", "remove" : "Entfernen", "update" : "Aktualisieren" @@ -418,10 +418,10 @@ }, "sidebar" : { "info" : { - "name" : "Knoteninformationen", + "name" : "Node-Informationen", "tabName" : "Name", "label" : "info", - "node" : "Knoten", + "node" : "Node", "type" : "Typ", "id" : "ID", "status" : "Status", @@ -437,16 +437,16 @@ "showLess" : "Weniger anzeigen", "flow" : "Flow", "selection" : "Auswahl", - "nodes" : "__count__ Knoten", + "nodes" : "__count__ Nodes", "flowDesc" : "Beschreibung des Flows", "subflowDesc" : "Beschreibung des Subflows", - "nodeHelp" : "Knotenhilfe", + "nodeHelp" : "Node-Hilfe", "none" : "Keine", "arrayItems" : "__count__ items", "showTips" : "Sie können die Tipps in der Anzeige \"Einstellungen\" öffnen." }, "config" : { - "name" : "Konfigurationsknoten", + "name" : "Konfigurations-Node", "label" : "Konfiguration", "global" : "Bei allen Flows", "none" : "keine", @@ -462,7 +462,7 @@ "none" : "keine ausgewählt", "refresh" : "Aktualisierung zum Laden", "empty" : "leer", - "node" : "Knoten", + "node" : "Node", "flow" : "Flow", "global" : "Global" }, @@ -626,7 +626,7 @@ }, "search" : { "empty" : "Keine Übereinstimmungen gefunden", - "addNode" : "Knoten hinzufügen ..." + "addNode" : "Node hinzufügen ..." }, "expressionEditor" : { "functions" : "Funktionen", diff --git a/packages/node_modules/@node-red/editor-client/locales/de/infotips.json b/packages/node_modules/@node-red/editor-client/locales/de/infotips.json index 59f796055..4cec02f31 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/infotips.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/infotips.json @@ -1,23 +1,23 @@ { "info" : { - "tip0" : "Sie können die ausgewählten Knoten oder Verbindungen mit {{ core:delete-selection }} entfernen.", - "tip1" : "Suche nach Knoten mit {{ core:search }}", + "tip0" : "Sie können die ausgewählten Nodes oder Verbindungen mit {{ core:delete-selection }} entfernen.", + "tip1" : "Suche nach Nodes mit {{ core:search }}", "tip2" : "{{ core:toggle-sidebar }} schaltet die Ansicht dieser Seitenleiste ein.", - "tip3" : "Sie können Ihre Palette von Knoten mit {{ core:manage-palette }} verwalten.", - "tip4" : "Ihre Flow-Konfigurationsknoten werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.", + "tip3" : "Sie können Ihre Palette von Nodes mit {{ core:manage-palette }} verwalten.", + "tip4" : "Ihre Flow-Konfigurations-Nodes werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.", "tip5" : "Aktiviert oder inaktiviert diese Tipps von der Option in den Einstellungen", - "tip6" : "Verschieben Sie die ausgewählten Knoten mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben", - "tip7" : "Wenn Sie einen Knoten auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.", - "tip8" : "Die ausgewählten Knoten exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}", + "tip6" : "Verschieben Sie die ausgewählten Nodes mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben", + "tip7" : "Wenn Sie einen Node auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.", + "tip8" : "Die ausgewählten Nodes exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}", "tip9" : "Importieren Sie einen Flow, indem Sie sein JSON in den Editor ziehen oder mit {{ core:show-import-dialog }}.", - "tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Knotenanschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.", + "tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Node-Anschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.", "tip11" : "Die Registerkarte \"Info\" mit {{ core:show-info-tab }} oder der Registerkarte \"Debug\" mit {{ core:show-debug-tab }} anzeigen", "tip12" : "[ctrl] [Klicken] in den Arbeitsbereich, um den Schnellhinzufügedialog zu öffnen.", - "tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Knotenanschluss klicken, um eine Schnellverbindung zu aktivieren.", - "tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Knoten klicken, um auch alle verbundenen Knoten auszuwählen.", - "tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Knoten klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.", + "tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Node-Anschluss klicken, um eine Schnellverbindung zu aktivieren.", + "tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Node klicken, um auch alle verbundenen Nodes auszuwählen.", + "tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Node klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.", "tip16" : "Indexzungen wechseln mit {{ core:show-previous-tab }} und {{ core:show-next-tab }}", - "tip17" : "Sie können die Änderungen im Editierrahmen des Knotens mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.", - "tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Knoten in der aktuellen Auswahl bearbeitet." + "tip17" : "Sie können die Änderungen im Editierrahmen des Nodes mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.", + "tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Node in der aktuellen Auswahl bearbeitet." } } \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html b/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html index 9d9a7ba3f..2a440db09 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html @@ -22,17 +22,17 @@
Nutzdaten verschiedene Tyoen
Die konfigurierten Nutzdaten der Nachricht.
Topic Zeichenfolge
-
Eine optionale Eigenschaft, die im Knoten konfiguriert werden kann.
+
Eine optionale Eigenschaft, die im Node konfiguriert werden kann.

Details

-

Der Inject-Knoten kann einen Flow mit einem bestimmten Nutzdatenwert starten. +

Der Inject-Node kann einen Flow mit einem bestimmten Nutzdatenwert starten. Die Standardnutzlast ist die aktuelle Zeit als Zeitstempel seit dem 1. Januar 1970 in Millisekunden.

-

Der Knoten unterstützt auch die Injektion von Zeichenfolgen, Zahlen, Boolescher Daten, JavaScript-Objekten oder flow/globalen Kontextwerten.

-

Der Knoten wird standardmäßig manuell ausgelöst, indem Sie im Editor auf seine Schaltfläche klicken. Er kann auch in regelmäßigen Abständen oder nach einem Zeitplan injizieren.

+

Der Node unterstützt auch die Injektion von Zeichenfolgen, Zahlen, Boolescher Daten, JavaScript-Objekten oder flow/globalen Kontextwerten.

+

Der Node wird standardmäßig manuell ausgelöst, indem Sie im Editor auf seine Schaltfläche klicken. Er kann auch in regelmäßigen Abständen oder nach einem Zeitplan injizieren.

Er kann auch so konfiguriert werden, dass er jedes Mal, wenn der Flow gestartet wird einen Wert injiziert.

-

Das maximale Intervall , das angegeben werden kann, beträgt etwa 596 Stunden/24 Tage. Wenn Sie jedoch Intervalle grösser als 24h verwenden wollen, sollten Sie einen Scheduler-Knoten verwenden, der mit Stromausfällen und Neustarts besser umgehen kann.

+

Das maximale Intervall , das angegeben werden kann, beträgt etwa 596 Stunden/24 Tage. Wenn Sie jedoch Intervalle grösser als 24h verwenden wollen, sollten Sie einen Scheduler-Node verwenden, der mit Stromausfällen und Neustarts besser umgehen kann.

Hinweis : Die Optionen "Intervall zwischen den Zeiten" und "Zu einem bestimmten Zeitpunkt" verwenden das Standardcron-System. Dies bedeutet, dass 20 Minuten bedeuten, dass der Event in der nächsten Stunde, 20 Minuten nach der Stunde und 40 Minuten nach der Stunde - aber nicht in 20 Minuten Zeit. Wenn Sie alle 20 Minuten ab sofort verwenden möchten, verwenden Sie die Option "interval" .

-

Hinweis : Um eine neue Zeile in eine Zeichenfolge einzuschließen, müssen Sie einen Funktionsknoten verwenden, um die Nutzdaten zu erstellen.

+

Hinweis : Um eine neue Zeile in eine Zeichenfolge einzuschließen, müssen Sie einen Funktions-Node verwenden, um die Nutzdaten zu erstellen.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/25-catch.html b/packages/node_modules/@node-red/nodes/locales/de/core/25-catch.html index 0981d7621..3f34bd407 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/25-catch.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/25-catch.html @@ -15,26 +15,26 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/58-debug.html b/packages/node_modules/@node-red/nodes/locales/de/core/58-debug.html index f94d9d8a6..3152363e5 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/58-debug.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/58-debug.html @@ -23,10 +23,10 @@

JavaScript-Objekte und -Arrays können nach Bedarf ausgeblendet und eingeblendet werden. Bufferobjekte können, wenn möglich, als Rohdaten oder als Zeichenfolge angezeigt werden.

Neben jeder Nachricht enthält die Registerkarte "Debug" Informationen über den Zeitpunkt, - zu dem die Nachricht empfangen wurde, den Knoten, der sie gesendet hat, und den Typ der Nachricht. - Wenn Sie auf die ID des Quellenknotens klicken, wird dieser Knoten innerhalb des Arbeitsbereichs angezeigt.

-

Die Schaltfläche auf dem Knoten kann verwendet werden, um die Ausgabe zu aktivieren oder zu inaktivieren. - Es wird empfohlen, alle Debugknoten, die nicht verwendet werden, zu inaktivieren oder zu entfernen.

-

Der Knoten kann auch so konfiguriert werden, dass er alle Nachrichten an das Laufzeitprotokoll sendet, - oder dass er kurze (32 Zeichen) an den Statustext unter dem Debugknoten sendet.

+ zu dem die Nachricht empfangen wurde, den Node, der sie gesendet hat, und den Typ der Nachricht. + Wenn Sie auf die ID des Quellen-Nodes klicken, wird dieser Node innerhalb des Arbeitsbereichs angezeigt.

+

Die Schaltfläche auf dem Node kann verwendet werden, um die Ausgabe zu aktivieren oder zu inaktivieren. + Es wird empfohlen, alle Debug-Nodes, die nicht verwendet werden, zu inaktivieren oder zu entfernen.

+

Der Node kann auch so konfiguriert werden, dass er alle Nachrichten an das Laufzeitprotokoll sendet, + oder dass er kurze (32 Zeichen) an den Statustext unter dem Debug-Node sendet.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/60-link.html b/packages/node_modules/@node-red/nodes/locales/de/core/60-link.html index eb11587a2..3698b82c3 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/60-link.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/60-link.html @@ -17,10 +17,10 @@ @@ -28,10 +28,10 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/75-exec.html b/packages/node_modules/@node-red/nodes/locales/de/core/75-exec.html index 8cba57880..95413097f 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/75-exec.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/75-exec.html @@ -16,18 +16,18 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/80-function.html b/packages/node_modules/@node-red/nodes/locales/de/core/80-function.html index 5ee2087fe..90e524cf7 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/80-function.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/80-function.html @@ -15,7 +15,7 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/89-trigger.html b/packages/node_modules/@node-red/nodes/locales/de/core/89-trigger.html index 6c210659e..0f4953c44 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/89-trigger.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/89-trigger.html @@ -26,19 +26,19 @@

Details

-

Dieser Knoten kann verwendet werden, um ein Zeitlimit in einem Flow zu erstellen. Wenn er eine Nachricht empfängt, wird +

Dieser Node kann verwendet werden, um ein Zeitlimit in einem Flow zu erstellen. Wenn er eine Nachricht empfängt, wird standardmäßig wird eine Nachricht mit einer payload von 1 versandt. Anschließend wartet er 250 ms, bevor er eine zweite Nachricht mit einer payload von 0 sendet. Dies kann beispielsweise zum Blinken einer LED verwendet werden, die an einen Raspberry Pi GPIO-Pin angeschlossen ist.

Die Nutzdaten jeder gesendeten Nachricht können für eine Vielzahl von Werten konfiguriert werden, einschließlich der Option, nichts zu senden. Wenn Sie beispielsweise die Anfangsnachricht auf nichts setzen und - Auswahl der Option zum Erweitern des Zeitgebers mit jeder empfangenen Nachricht dann wird der Knoten als Überwachungszeitgeber agieren + Auswahl der Option zum Erweitern des Zeitgebers mit jeder empfangenen Nachricht dann wird der Node als Überwachungszeitgeber agieren und nur dann eine Nachricht senden, wenn innerhalb des konfigurierten Erweiterungszeitraums keine Nachricht empfangen wird.

-

Wenn der Knoten auf den Typ Zeichenfolge gesetzt ist, unterstützt der Knoten die Syntax der Mustache-Vorlage.

-

Wenn der Knoten eine Nachricht mit einer Eigenschaft reset oder einer payload die mit dem Wert in der - Knotenkonfiguration übereinstimmt, wird jede beliebige Zeitlimitüberschreitung oder Wiederholung gelöscht, +

Wenn der Node auf den Typ Zeichenfolge gesetzt ist, unterstützt der Node die Syntax der Mustache-Vorlage.

+

Wenn der Node eine Nachricht mit einer Eigenschaft reset oder einer payload die mit dem Wert in der + Node-Konfiguration übereinstimmt, wird jede beliebige Zeitlimitüberschreitung oder Wiederholung gelöscht, die sich derzeit in Bearbeitung befindet und es wird keine Nachricht ausgelöst.

-

Der Knoten kann so konfiguriert werden, dass er eine Nachricht in einem regulären Intervall sendet, +

Der Node kann so konfiguriert werden, dass er eine Nachricht in einem regulären Intervall sendet, bis er durch eine empfangene Nachricht zurückgesetzt wird.

-

Optional kann der Knoten so konfiguriert werden, dass er Nachrichten für jedes msg.topic als separate Datenströme behandelt.

+

Optional kann der Node so konfiguriert werden, dass er Nachrichten für jedes msg.topic als separate Datenströme behandelt.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/90-comment.html b/packages/node_modules/@node-red/nodes/locales/de/core/90-comment.html index e00a5826a..89368f50d 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/90-comment.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/90-comment.html @@ -15,8 +15,8 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/98-unknown.html b/packages/node_modules/@node-red/nodes/locales/de/core/98-unknown.html index dc830d283..30bfa8eea 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/98-unknown.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/98-unknown.html @@ -15,14 +15,14 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html b/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html index 89d9e4a6f..1ca95c8ac 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html +++ b/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html @@ -15,7 +15,7 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/21-httpin.html b/packages/node_modules/@node-red/nodes/locales/de/io/21-httpin.html index f0847cc09..e38e9f16b 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/21-httpin.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/21-httpin.html @@ -36,11 +36,11 @@
resObjekt
Ein HTTP-Antwortobjekt. Diese Eigenschaft sollte nicht direkt verwendet werden. - Der HTTP Response Knoten dokumentiert, wie auf eine Anforderung reagiert wird. - Diese Eigenschaft muss an die Nachricht angehängt bleiben, die an den Antwortknoten übergeben wird.
+ Der HTTP Response Node dokumentiert, wie auf eine Anforderung reagiert wird. + Diese Eigenschaft muss an die Nachricht angehängt bleiben, die an den Antwort-Node übergeben wird.

Details

-

Der Knoten ist auf dem konfigurierten Pfad für Anforderungen eines bestimmten Typs empfangsbereit. +

Der Node ist auf dem konfigurierten Pfad für Anforderungen eines bestimmten Typs empfangsbereit. Der Pfad kann vollständig angegeben werden, z. B. /user oder benannte Parameter beinhalten, die einen beliebigen Wert akzeptieren, z. B. /user/:name. Wenn benannte Parameter verwendet werden, kann auf ihren tatsachlichen Wert über msg.req.params @@ -49,12 +49,12 @@ Anforderung über msg.payload verfügbar gemacht.

Wenn der Inhaltstyp der Anforderung ermittelt werden kann, wird der Hauptteil syntaktisch analysiert. Wenn zum Beispiel application/json erkannt wurde, die Darstellung in der JavaScript-Objekt Notation.

-

Hinweis: Dieser Knoten sendet keine Antwort an die Anforderung. Der Flow - muss einen code>HTTP Response Knoten enthalten, um die Anforderung abzuschließen.

+

Hinweis: Dieser Node sendet keine Antwort an die Anforderung. Der Flow + muss einen code>HTTP Response Node enthalten, um die Anforderung abzuschließen.

@@ -62,5 +62,5 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html index 27dcde602..c799452ef 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html @@ -22,7 +22,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/logic/15-change.html b/packages/node_modules/@node-red/nodes/locales/de/logic/15-change.html index 1bde419ee..b78dd0f0d 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/logic/15-change.html +++ b/packages/node_modules/@node-red/nodes/locales/de/logic/15-change.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/logic/18-sort.html b/packages/node_modules/@node-red/nodes/locales/de/logic/18-sort.html index 2bf0ff821..d2351fbea 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/logic/18-sort.html +++ b/packages/node_modules/@node-red/nodes/locales/de/logic/18-sort.html @@ -16,9 +16,9 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json index 17b499adf..da7a93c5e 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -19,13 +19,13 @@ "notification" : { "error" : " Fehler : __message__", "errors" : { - "not-deployed" : "Knoten nicht vorhanden", + "not-deployed" : "Node nicht vorhanden", "no-response" : "Keine Antwort vom Server", "unexpected" : "Unerwarteter Fehler (__status__) __message__" } }, "errors" : { - "nooverride" : "Warnung: Nachrichten-Eigenschaften können die Eigenschaften des festgelegten Knotens nicht mehr außer Kraft setzen. Siehe Bit.ly/nr-override-msg-props" + "nooverride" : "Warnung: Nachrichten-Eigenschaften können die Eigenschaften des festgelegten Nodes nicht mehr außer Kraft setzen. Siehe Bit.ly/nr-override-msg-props" } }, "inject" : { @@ -66,15 +66,15 @@ "catchNodes" : "Catch: __number__", "label" : { "source" : "Catch-Fehler von", - "node" : "Knoten", + "node" : "Node", "type" : "Typ", "selectAll" : "Alle auswählen", "sortByLabel" : "Sortieren nach Bezeichnung", "sortByType" : "Sortieren nach Typ" }, "scope" : { - "all" : "allen Knoten", - "selected" : "ausgewählten Knoten" + "all" : "allen Nodes", + "selected" : "ausgewählten Nodes" } }, "status" : { @@ -82,15 +82,15 @@ "statusNodes" : "Status: __number__", "label" : { "source" : "Berichtsstatus von", - "node" : "Knoten", + "node" : "Node", "type" : "Typ", "selectAll" : "Alle auswählen", "sortByLabel" : "Sortieren nach Bezeichnung", "sortByType" : "Sortieren nach Typ" }, "scope" : { - "all" : "allen Knoten", - "selected" : "ausgewählten Knoten" + "all" : "allen Nodes", + "selected" : "ausgewählten Nodes" } }, "debug" : { @@ -102,7 +102,7 @@ "tabcon" : "Debug-Registerkarte und -Konsole", "toSidebar" : "Debugfenster", "toConsole" : "Systemkonsole", - "toStatus" : "Knotenstatus (32 Zeichen)", + "toStatus" : "Node-Status (32 Zeichen)", "severity" : "Ebene", "notification" : { "activated" : "Erfolgreich aktiviert: __label__", @@ -111,17 +111,17 @@ "sidebar" : { "label" : "Debugging", "name" : "Debugnachrichten", - "filterAll" : "Alle Knoten", - "filterSelected" : "Ausgewählte Knoten", + "filterAll" : "Alle Nodes", + "filterSelected" : "Ausgewählte Nodes", "filterCurrent" : "Aktueller Fluss", - "debugNodes" : "Debugknoten", + "debugNodes" : "Debug-Nodes", "clearLog" : "Protokoll löschen", "openWindow" : "In neuem Fenster öffnen" }, "messageMenu" : { "collapseAll" : "Alle Pfade ausblenden", "clearPinned" : "Angeheftete Pfade löschen", - "filterNode" : "Dieser Knoten filtern", + "filterNode" : "Diesen Node filtern", "clearFilter" : "Filter löschen" } }, @@ -310,7 +310,7 @@ "label" : { "unknown" : "unbekannt" }, - "tip" : "

Dieser Knoten ist ein Typ, der Ihrer Installation von Node-RED unbekannt ist.

Wenn Sie mit dem Knoten in diesem Status deployen, wird die Konfiguration beibehalten, aber der Fluss wird erst gestartet, wenn der fehlende Typ installiert ist.

Weitere Informationen finden Sie in der Info-Seitenleiste für. Weitere Hilfe

" + "tip" : "

Dieser Node ist ein Typ, der Ihrer Installation von Node-RED unbekannt ist.

Wenn Sie mit dem Node in diesem Status deployen, wird die Konfiguration beibehalten, aber der Fluss wird erst gestartet, wenn der fehlende Typ installiert ist.

Weitere Informationen finden Sie in der Info-Seitenleiste für. Weitere Hilfe

" }, "mqtt" : { "label" : { @@ -380,12 +380,12 @@ "json" : "ein analysiertes JSON-Objekt", "tip" : { "in" : "Die URL ist relativ zu ", - "res" : "Die an diesen Knoten gesendeten Nachrichten müssen von einem http-Input -Knoten stammen", + "res" : "Die an diesen Node gesendeten Nachrichten müssen von einem http-Input -Node stammen", "req" : "Tipp: Wenn die JSON-Syntaxanalyse fehlschlägt, wird die abgerufene Zeichenfolge als-ist zurückgegeben." }, "httpreq" : "HTTP-Anforderung", "errors" : { - "not-created" : "http-in-Knoten kann nicht erstellt werden, wenn httpNodeRoot auf 'false' gesetzt ist.", + "not-created" : "http-in-Node kann nicht erstellt werden, wenn httpNodeRoot auf 'false' gesetzt ist.", "missing-path" : "Fehlendes Pfad", "no-response" : "Kein Antwortobjekt", "json-error" : "JSON-Parsing-Fehler", @@ -581,7 +581,7 @@ }, "errors" : { "invalid-expr" : "Ungültiger JSONata Ausdruck: __error__", - "too-many" : "Zu viele anstehende Nachrichten im Switchknoten" + "too-many" : "Zu viele anstehende Nachrichten im Switch-Node" } }, "change" : { @@ -630,7 +630,7 @@ "limit" : "Skalieren und Begrenzen auf den Zielbereich", "wrap" : "Skaliere und Einhüllen innerhalb des Zielbereichs" }, - "tip" : "Tipp: Dieser Knoten funktioniert NUR mit Zahlen.", + "tip" : "Tipp: Dieser Node funktioniert NUR mit Zahlen.", "errors" : { "notnumber" : "Keine Zahl" } @@ -671,7 +671,7 @@ "windows" : "Windows (\\r \\n)" }, "errors" : { - "csv_js" : "Dieser Knoten verarbeitet nur CSV-Zeichenfolgen oder JS-Objekte.", + "csv_js" : "Dieser Node verarbeitet nur CSV-Zeichenfolgen oder JS-Objekte.", "obj_csv" : "Es wurde keine Spaltenschablone für Objekt-> CSV angegeben." } }, @@ -726,7 +726,7 @@ "x2o" : "Optionen für XML zu Objekt" }, "errors" : { - "xml_js" : "Dieser Knoten verarbeitet nur XML-Zeichenfolgen oder JS-Objekte." + "xml_js" : "Dieser Node verarbeitet nur XML-Zeichenfolgen oder JS-Objekte." } }, "rpi-gpio" : { @@ -786,7 +786,7 @@ "na" : "N/A: __Wert__" }, "errors" : { - "ignorenode" : "Raspberry Pi-spezifischer Knotenset inaktiv", + "ignorenode" : "Raspberry Pi-spezifische Nodes inaktiv", "version" : "Abrufen der Version von Pi fehlgeschlagen", "sawpitype" : "Saw-Pi-Typ", "libnotfound" : "Pi RPi.GPIO-Python-Bibliothek nicht gefunden", @@ -853,7 +853,7 @@ "appendfail" : "Anhängen an Datei fehlgeschlagen: __error__", "createfail" : "Fehler beim Erstellen der Datei: __error__" }, - "tip" : "Tipp: Der Dateiname muss ein absoluter Pfad sein. Andernfalls wird er relativ zum Arbeitsverzeichnis des Knotens-RED-Prozesses verwendet." + "tip" : "Tipp: Der Dateiname muss ein absoluter Pfad sein. Andernfalls wird er relativ zum Arbeitsverzeichnis des Node-RED-Prozesses verwendet." }, "split" : { "split" : "aufteilen", @@ -895,8 +895,8 @@ "afterTimeout" : "nach Zeitlimitüberschreitung von", "seconds" : "Sekunden", "complete" : "Nach einer Nachricht mit der gesetzten Eigenschaft msg.complete", - "tip" : "Dieser Modus setzt voraus, dass dieser Knoten entweder mit einem split Knoten verbunden ist oder dass die empfangenen Nachrichten über eine ordnungsgemäß konfigurierte Eigenschaft msg.parts verfügen.", - "too-many" : "Zu viele anstehende Nachrichten im Verknüpfungsknoten", + "tip" : "Dieser Modus setzt voraus, dass dieser Node entweder mit einem split Node verbunden ist oder dass die empfangenen Nachrichten über eine ordnungsgemäß konfigurierte Eigenschaft msg.parts verfügen.", + "too-many" : "Zu viele anstehende Nachrichten im Verknüpfungs-Node", "merge" : { "topics-label" : "Zusammengemiedene Themen", "topics" : "Themen", @@ -924,9 +924,9 @@ "ascending" : "aufsteigend", "descending" : "absteigend", "as-number" : "als Zahl", - "invalid-exp" : "Ungültiger JSONata-Ausdruck in Sortierknoten: __message__", - "too-many" : "Zu viele anstehende Nachrichten in Sortierknoten", - "clear" : "Anstehende Nachricht in Sortierknoten löschen" + "invalid-exp" : "Ungültiger JSONata-Ausdruck in Sortier-Node: __message__", + "too-many" : "Zu viele anstehende Nachrichten in Sortier-Node", + "clear" : "Anstehende Nachricht in Sortier-Node löschen" }, "batch" : { "batch" : "Batch", @@ -951,7 +951,7 @@ "topics-label" : "Topics", "topic" : "Thema" }, - "too-many" : "Zu viele anstehende Nachrichten im Stapelknoten", + "too-many" : "Zu viele anstehende Nachrichten im Stapel-Node", "unexpected" : "Unerwarteter Modus", "no-parts" : "Keine Teileeigenschaft in Nachricht" } diff --git a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html index 31939c6c4..1099443f5 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html @@ -28,7 +28,7 @@
  • Wenn die Eingabe eine Zeichenkette ist, wird versucht sie als CSV zu analysieren und es wird für jede Zeile ein JavaScript-Objekt mit Schlüssel/Wertpaaren erstellt. - Der Knoten sendet dann entweder eine Nachricht für jede Zeile oder eine einzelne Nachricht mit einem Array von Objekten.
  • + Der Node sendet dann entweder eine Nachricht für jede Zeile oder eine einzelne Nachricht mit einem Array von Objekten.
  • Wenn die Eingabe ein JavaScript-Objekt ist, wird versucht eine CSV-Zeichenkette zu erzeugen.
  • Wenn die Eingabe ein Array mit einfachen Werten ist, wird eine einzeilige CSV-Zeichenkette erstellt.
  • Wenn die Eingabe ein Array von Arrays oder ein Array von Objekten ist, wird eine mehrzeilige CSV-Zeichenkette erstellt.
  • @@ -41,7 +41,7 @@

    Bei der Konvertierung nach CSV wird die Spaltenvorlage verwendet, um festzustellen, welche Eigenschaften aus dem Objekt in welcher Reihenfolge extrahiert werden sollen.

    Wenn die Eingabe ein Array ist, wird die Spaltenvorlage nur verwendet, um optional eine Reihe von Spaltentiteln zu erzeugen.

    -

    Der Knoten kann eine mehrteilige Eingabe akzeptieren, solange die Eigenschaft parts korrekt gesetzt ist.

    +

    Der Node kann eine mehrteilige Eingabe akzeptieren, solange die Eigenschaft parts korrekt gesetzt ist.

    Wenn mehrere Nachrichten ausgeben werden, sind ihre parts-Eigenschaft festgelegt und sie bilden eine vollständige Nachrichtensequenz.

    Note: die Spaltenvorlage muss kommagetrennt sein - auch wenn für die Daten ein anderes Trennzeichen gewählt wird.

    diff --git a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html index d9b02bfe4..923f4dce8 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html @@ -31,7 +31,7 @@ Wenn mehrere Nachrichten gesendet werden, haben sie auch parts gesetzt.

    Details

    -

    Dieser Knoten unterstützt eine Kombination aus CSS- und jQuery-Selektoren. Siehe die +

    Dieser Node unterstützt eine Kombination aus CSS- und jQuery-Selektoren. Siehe die css-select Dokumentation für weitere Informationen über die unterstützte Syntax.

    diff --git a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html index 6b9b1440d..544929e17 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html @@ -33,17 +33,17 @@
schemaErrorArray
-
Wenn die JSON-Schemavalidierung fehlschlägt, wird für den Catch Knoten eine schemaError Eigenschaft erstellt, +
Wenn die JSON-Schemavalidierung fehlschlägt, wird für den Catch Node eine schemaError Eigenschaft erstellt, die ein Array von Fehlern enthält.

Details

-

Standardmäßig arbeitet der Knoten mit msg.payload, kann aber so konfiguriert werden, dass eine beliebige +

Standardmäßig arbeitet der Node mit msg.payload, kann aber so konfiguriert werden, dass eine beliebige Nachrichteneigenschaft konvertiert wird.

-

Der Knoten kann auch konfiguriert werden, um eine bestimmte Kodierung sicherzustellen, anstatt zwischen den beiden umzuschalten. - Dies kann z.B. mit dem HTTP In Knoten benutzt werden, um sicherzustellen, dass die Nutzlast ein analysiertes Objekt ist, - auch wenn eine eingehende Anfrage seinen Inhaltstyp nicht korrekt eingestellt hat, damit der HTTP In Knoten +

Der Node kann auch konfiguriert werden, um eine bestimmte Kodierung sicherzustellen, anstatt zwischen den beiden umzuschalten. + Dies kann z.B. mit dem HTTP In Node benutzt werden, um sicherzustellen, dass die Nutzlast ein analysiertes Objekt ist, + auch wenn eine eingehende Anfrage seinen Inhaltstyp nicht korrekt eingestellt hat, damit der HTTP In Node die Konvertierung durchführen kann.

-

Wenn der Knoten so konfiguriert ist, dass die Eigenschaft als String kodiert wird, und es einen String empfängt, +

Wenn der Node so konfiguriert ist, dass die Eigenschaft als String kodiert wird, und es einen String empfängt, werden keine weiteren Prüfungen der Eigenschaft durchgeführt. Es wird weder prüfen, ob der String ein gültiges JSON enthält noch wird er ihn neu formatieren, wenn die Format-Option ausgewählt ist.

Für weitere Details über das JSON-Schema diff --git a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html index 49a315f4b..4f0223661 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html @@ -38,7 +38,7 @@

Details

Bei der Konvertierung zwischen XML und einem Objekt werden standardmäßig alle XML-Attribute als Eigenschaft namens $ hinzugefügt. Jeder Textinhalt wird als Eigenschaft namens _ hinzugefügt. - Diese Eigenschaftsnamen können in der Knotenkonfiguration angegeben werden.

+ Diese Eigenschaftsnamen können in der Node-Konfiguration angegeben werden.

Zum Beispiel wird das folgende XML wie dargestellt konvertiert:

<p class="tag">Hello World</p>
{
diff --git a/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html b/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html
index 487b9f1fa..5c48c17a5 100755
--- a/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html
+++ b/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html
@@ -20,7 +20,7 @@
     

Eingaben

filename Zeichenkette
-
Wenn nicht im Knoten konfiguriert, legt diese optionale Eigenschaft den Namen der zu aktualisierenden Datei fest.
+
Wenn nicht im Node konfiguriert, legt diese optionale Eigenschaft den Namen der zu aktualisierenden Datei fest.

Ausgaben

Nach Abschluss des Schreibvorgangs wird die Eingangsnachricht an den Ausgangsport gesendet.

@@ -31,7 +31,7 @@

Es kann konfiguriert werden, dass die gesamte Datei überschrieben wird und nicht angehängt wird. Zum Beispiel beim Schreiben von Binärdaten in eine Datei wie bei einem Bild, sollte diese Option verwendet werden und die Option, einen Zeilenumbruch anzuhängen, sollte deaktiviert sein.

-

Alternativ kann dieser Knoten konfiguriert werden, um die Datei zu löschen.

+

Alternativ kann dieser Node konfiguriert werden, um die Datei zu löschen.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html index c799452ef..ede33eee8 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html @@ -24,7 +24,7 @@

Bietet eine Auswahl an TCP-Ausgängen. Kann sich entweder mit einem entfernten TCP-Port verbinden, eingehende Verbindungen akzeptieren oder auf Nachrichten antworten, die von einem TCP-In-Node empfangen werden.

Nur der Inhalt von msg.payload wird gesendet.

-

Wenn msg.payload eine Zeichenkette beinhaltet, die eine Base64-Kodierung von binären +

Wenn msg.payload einen String beinhaltet, die eine Base64-Kodierung von binären Daten darstellt, wird die Dekodiere Base64 Option dazu führen, dass sie wieder in Binärdaten umgewandelt wird bevor sie verschickt werden.

Wenn msg._session nicht vorhanden ist, wird die Nutzlast an alle alle verbundenen Clients gesendet.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/32-udp.html b/packages/node_modules/@node-red/nodes/locales/de/io/32-udp.html index 23e5e8397..2b21b3694 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/32-udp.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/32-udp.html @@ -16,7 +16,7 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html b/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html index 5c48c17a5..cb21e96a8 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html +++ b/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html @@ -19,7 +19,7 @@ Alternativ kann die Datei auch gelöscht werden.

Eingaben

-
filename Zeichenkette
+
filename String
Wenn nicht im Node konfiguriert, legt diese optionale Eigenschaft den Namen der zu aktualisierenden Datei fest.

Ausgaben

From 9276988ff62f9dea21365e9962d06c4426d7b536 Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Fri, 3 May 2019 19:52:28 +0200 Subject: [PATCH 008/137] i18n-german buffer https://github.com/jwende/nodered-german/issues/6 --- .../@node-red/editor-client/locales/de/editor.json | 6 +++--- .../@node-red/nodes/locales/de/io/10-mqtt.html | 2 +- .../nodes/locales/de/io/21-httprequest.html | 4 ++-- .../@node-red/nodes/locales/de/io/31-tcpin.html | 4 ++-- .../@node-red/nodes/locales/de/io/32-udp.html | 2 +- .../nodes/locales/de/logic/10-switch.html | 2 +- .../@node-red/nodes/locales/de/logic/17-split.html | 14 +++++++------- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index e4b403a55..48bf9115d 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -615,7 +615,7 @@ "re" : "Regulärer Ausdruck", "bool" : "boolean", "json" : "JSON", - "bin" : "Puffer", + "bin" : "Buffer", "date" : "timestamp", "jsonata" : "Ausdruck", "env" : "env, Variable" @@ -658,10 +658,10 @@ "title" : "Markdown-Editor" }, "bufferEditor" : { - "title" : "Puffereditor", + "title" : "Buffereditor", "modeString" : "Als UTF-8-Zeichenfolge bearbeiten", "modeArray" : "Als JSON-Array bearbeiten", - "modeDesc" : "

Puffereditor

Der Puffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert.

Beispiel: Der Wert Hello World wird in das JSON-Array konvertiert:

 [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] 

" + "modeDesc" : "

Buffereditor

Der Buffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert.

Beispiel: Der Wert Hello World wird in das JSON-Array konvertiert:

 [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] 

" }, "projects" : { "config-git" : "Git-Client konfigurieren", diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html index 76b53c6e3..fa51572a3 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html @@ -49,7 +49,7 @@

Details

msg.payload wird als Nutzdaten der zu veröffentlichenden Nachricht verwendet. Wenn er ein Objekt enthält, wird es in eine JSON-Zeichenfolge konvertiert, bevor es gesendet wird. - Wenn er einen binären Puffer enthält, wird die Nachricht unverändert veröffentlicht.

+ Wenn er einen binären Buffer enthält, wird die Nachricht unverändert veröffentlicht.

Das verwendete Thema kann im Node konfiguriert werden oder, falls es leer gelassen wird, durch msg.topic festgelegt werden.

Ebenso können die QoS- und retain-Werte im Node konfiguriert werden oder, falls vorhanden, diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/de/io/21-httprequest.html index 9203f7e70..223854994 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/21-httprequest.html @@ -41,9 +41,9 @@

Ausgaben

-
payload String | Objekt | Puffer
+
payload String | Objekt | Buffer
Der Hauptteil der Antwort. Der Node kann konfiguriert werden, um den Hauptteil als String zurückzugeben, - zu versuchen, ihn als JSON-String zu analysieren oder ihn als binären Puffer zu belassen.
+ zu versuchen, ihn als JSON-String zu analysieren oder ihn als binären Buffer zu belassen.
statusCode Zahl
Der Statuscode der Antwort oder der Fehlercode, wenn die Anforderung nicht abgeschlossen werden konnte.
headers Objekt
diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html index ede33eee8..64f39a868 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/31-tcpin.html @@ -35,10 +35,10 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html b/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html index 1ca95c8ac..a696225c3 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html +++ b/packages/node_modules/@node-red/nodes/locales/de/hardware/36-rpi-gpio.html @@ -22,7 +22,7 @@
payload Zahl
Die Nutzdaten sind 1 oder 0.
topic Zeichenfolge
-
Das Thema wird auf pi/ { the pin number } gesetzt.
+
Das Topic wird auf pi/ { the pin number } gesetzt.

Details

Sie können auch den Eingangs-Pullup-Widerstand oder den Pulldown-Widerstand aktivieren.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html index fa51572a3..85c5d8d08 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html @@ -12,13 +12,13 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/de/logic/16-range.html b/packages/node_modules/@node-red/nodes/locales/de/logic/16-range.html index a42a28ccf..73935d1b0 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/logic/16-range.html +++ b/packages/node_modules/@node-red/nodes/locales/de/logic/16-range.html @@ -19,7 +19,7 @@

Eingaben

payload Zahl
-
Die Nutzlast muss eine Zahl sein. +
Der Payload muss eine Zahl sein. Alles andere wird versucht als Zahl interpretiert zu werden und abgelehnt, wenn das fehlschlägt.

Ausgaben

diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json index d2c270297..ee31d214a 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -441,7 +441,7 @@ "output" : "Ausgabe", "port" : "Port", "host" : "auf Host", - "payload" : "Nutzlast (en)", + "payload" : "Payload (en)", "delimited" : "begrenzt durch", "close-connection" : "Schließen Sie die Verbindung, nachdem jede Nachricht gesendet wurde?", "decode-base64" : "Nachricht aus Base64 dekodierien?", diff --git a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html index 211feae22..fb6b446d7 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html @@ -26,7 +26,7 @@

Ausgaben

payload Array | String
-
das Ergebnis kann entweder eine einzelne Nachricht mit einer Nutzlast sein, die ein Array der übereinstimmenden Elemente enthält +
das Ergebnis kann entweder eine einzelne Nachricht mit eine, Payload sein, das ein Array der übereinstimmenden Elemente enthält oder mehrere Nachrichten, die jeweils ein passendes Element enthalten. Wenn mehrere Nachrichten gesendet werden, haben sie auch parts gesetzt.
diff --git a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html index 85c7ae862..1c2311a16 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html @@ -40,7 +40,7 @@

Standardmäßig arbeitet der Node mit msg.payload, kann aber so konfiguriert werden, dass eine beliebige Nachrichteneigenschaft konvertiert wird.

Der Node kann auch konfiguriert werden, um eine bestimmte Kodierung sicherzustellen, anstatt zwischen den beiden umzuschalten. - Dies kann z.B. mit dem HTTP In Node benutzt werden, um sicherzustellen, dass die Nutzlast ein analysiertes Objekt ist, + Dies kann z.B. mit dem HTTP In Node benutzt werden, um sicherzustellen, dass der Payload ein analysiertes Objekt ist, auch wenn eine eingehende Anfrage seinen Inhaltstyp nicht korrekt eingestellt hat, damit der HTTP In Node die Konvertierung durchführen kann.

Wenn der Node so konfiguriert ist, dass die Eigenschaft als String kodiert wird, und es einen String empfängt, diff --git a/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html b/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html index cb21e96a8..964b41cef 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html +++ b/packages/node_modules/@node-red/nodes/locales/de/storage/50-file.html @@ -25,7 +25,7 @@

Ausgaben

Nach Abschluss des Schreibvorgangs wird die Eingangsnachricht an den Ausgangsport gesendet.

Details

-

Jede Nachrichten-Nutzlast wird am Ende der Datei hinzugefügt und optional dazwischen ein Zeilenumbruchzeichen.

+

Jeder Nachrichten-Payload wird am Ende der Datei hinzugefügt und optional dazwischen ein Zeilenumbruchzeichen.

Wenn msg.filename verwendet wird, wird die Datei nach jedem Schreiben geschlossen. Für eine optimale Leistung verwenden Sie einen festen Dateinamen.

Es kann konfiguriert werden, dass die gesamte Datei überschrieben wird und nicht angehängt wird. Zum Beispiel From 69db23f2f61abbe53f6afaf327ce2a09ceb06486 Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Fri, 3 May 2019 19:59:40 +0200 Subject: [PATCH 012/137] i18n-german retain https://github.com/jwende/nodered-german/issues/16 --- .../node_modules/@node-red/nodes/locales/de/io/10-mqtt.html | 4 ++-- .../node_modules/@node-red/nodes/locales/de/messages.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html index 19b2d55f3..9572a7456 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html @@ -22,7 +22,7 @@

qos Zahl
0: fire und forget 1: mindestens einmal 2: einmal und nur einmal.
retain boolean
-
true gibt an, dass die Nachricht beibehalten wurde und älter sein kann.
+
true gibt an, dass die Nachricht retained wurde und älter sein kann.

Details

Das Subscribete Topic kann MQTT-Platzhalterzeichen, + für eine Ebene, # für mehrere Ebenen umfassen.

@@ -54,7 +54,7 @@ durch msg.topic festgelegt werden.

Ebenso können die QoS- und retain-Werte im Node konfiguriert werden oder, falls vorhanden, durch msg.qos bzw. msg.retain festgelegt werden. - Sie können eine zuvor auf einem Topic auf dem Broker beibehalten Nachricht löschen, + Sie können eine zuvor auf einem Topic auf dem Broker retainte Nachricht löschen, indem eine leere Nachricht an dieses Topic gesendet wird und die Markierung 'retain' gesetzt ist.

Dieser Node erfordert eine Verbindung zu einem MQTT-Broker, der über die Auswahlliste selektiert werden kann. Eine neue Konfiguration wird durch Klicken auf das Stiftsymbol erstellt.

diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json index ee31d214a..3094d8541 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -317,7 +317,7 @@ "broker" : "Server", "example" : "z. B. lokaler_Host", "qos" : "QoS", - "retain" : "Beibehalten", + "retain" : "Retain", "clientid" : "Client-ID", "port" : "Port", "keepalive" : "Keepalive-Zeit (en)", @@ -349,7 +349,7 @@ "disconnected" : "Verbindung zum Broker __broker__ wurde beendet.", "connect-failed" : "Verbindung zum Broker __broker__ konnte nicht hergestellt werden." }, - "retain" : "Beibehalten", + "retain" : "Retain", "true" : "Wahr", "false" : "Falsch", "tip" : "Tipp: Behalten Sie das Topic \"Artikel\", \"qos\" oder \"retain\" bei, wenn Sie diese über die Eigenschaft \"msg\" festlegen", From caad0eca670f7f4af599b8735dd3aedfcac7cd0d Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Sat, 4 May 2019 09:33:54 +0200 Subject: [PATCH 013/137] i18n-german fix typo --- .../node_modules/@node-red/nodes/locales/de/core/20-inject.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html b/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html index 143af7b97..958698bcf 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html +++ b/packages/node_modules/@node-red/nodes/locales/de/core/20-inject.html @@ -26,7 +26,7 @@

Details

Der Inject-Node kann einen Flow mit einem bestimmten Nutzdatenwert starten. - Der Standardn-Payload ist die aktuelle Zeit als Zeitstempel seit dem 1. Januar 1970 in Millisekunden.

+ Der Standard-Payload ist die aktuelle Zeit als Zeitstempel seit dem 1. Januar 1970 in Millisekunden.

Der Node unterstützt auch die Injektion von Zeichenfolgen, Zahlen, Boolescher Daten, JavaScript-Objekten oder flow/globalen Kontextwerten.

Der Node wird standardmäßig manuell ausgelöst, indem Sie im Editor auf seine Schaltfläche klicken. Er kann auch in regelmäßigen Abständen oder nach einem Zeitplan injizieren.

Er kann auch so konfiguriert werden, dass er jedes Mal, wenn der Flow gestartet wird einen Wert injiziert.

From 42845cfcc02cb44b01117c8ce9c5a4c58534272b Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Sat, 4 May 2019 09:36:58 +0200 Subject: [PATCH 014/137] i18n-german subflows https://github.com/jwende/nodered-german/issues/14 --- .../node_modules/@node-red/editor-client/locales/de/editor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 2300d33af..02e3ccfdf 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -320,7 +320,7 @@ "search" : "Suchmodule", "addCategory" : "Neu hinzufügen ...", "label" : { - "subflows" : "untergeordnete Nachrichtenflüsse", + "subflows" : "Subflows", "input" : "Eingabe", "output" : "Ausgabe", "function" : "Funktion", From 5e7689a15130828e2aab295498531a14f0b59e96 Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Sat, 4 May 2019 09:47:29 +0200 Subject: [PATCH 015/137] i18n-german fix typos --- .../@node-red/nodes/locales/de/logic/17-split.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/de/logic/17-split.html b/packages/node_modules/@node-red/nodes/locales/de/logic/17-split.html index 935c8c094..eaa3f7d8c 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/logic/17-split.html +++ b/packages/node_modules/@node-red/nodes/locales/de/logic/17-split.html @@ -134,7 +134,7 @@
  • $A: der kumulierte Wert,
  • $I: Index der Nachricht innerhalb der Squenz,
  • -
  • $N: Anzahl der nachrichten in der Sequenz.
  • +
  • $N: Anzahl der Nachrichten in der Sequenz.
Fix-up Ausdruck
@@ -142,7 +142,7 @@ Im Ausdruck können folgende spezielle Variablen verwendet werden:
  • $A: der kumulierte Wert,
  • -
  • $N: Anzahl der nachrichten in der Sequenz.
  • +
  • $N: Anzahl der Nachrichten in der Sequenz.

Standardmäßig wird der Reduktionsausdruck in der Reihenfolge von der ersten bis zur letzten Nachricht der Sequenz angewendet. From f0b1585b52d139b03e37db2a557db7fe79506f55 Mon Sep 17 00:00:00 2001 From: Bernardo Belchior Date: Wed, 8 May 2019 18:51:16 +0100 Subject: [PATCH 016/137] Remove redundant conditional --- .../node_modules/@node-red/nodes/core/core/80-function.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/core/80-function.html b/packages/node_modules/@node-red/nodes/core/core/80-function.html index 5a033e5a7..13d097661 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-function.html +++ b/packages/node_modules/@node-red/nodes/core/core/80-function.html @@ -27,7 +27,7 @@ name: {value:""}, func: {value:"\nreturn msg;"}, outputs: {value:1}, - noerr: {value:0,required:true,validate:function(v) { return ((!v) || (v === 0)); }} + noerr: {value:0,required:true,validate:function(v) { return !v; }} }, inputs:1, outputs:1, From 13cf2b48e159913e2bfd965394badc03d74b2131 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Thu, 9 May 2019 18:06:10 +0900 Subject: [PATCH 017/137] use jQuery DOM manipulation instead of raw JS --- .../nodes/core/core/lib/debug/debug-utils.js | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/core/lib/debug/debug-utils.js b/packages/node_modules/@node-red/nodes/core/core/lib/debug/debug-utils.js index 47f64e887..edc349507 100644 --- a/packages/node_modules/@node-red/nodes/core/core/lib/debug/debug-utils.js +++ b/packages/node_modules/@node-red/nodes/core/core/lib/debug/debug-utils.js @@ -400,48 +400,47 @@ RED.debug = (function() { } function processDebugMessage(o) { - var msg = document.createElement("div"); + var msg = $("

"); var sourceNode = o._source; - msg.onmouseenter = function() { - $(msg).addClass('debug-message-hover'); + msg.on("mouseenter", function() { + msg.addClass('debug-message-hover'); if (o._source) { config.messageMouseEnter(o._source.id); if (o._source._alias) { config.messageMouseEnter(o._source._alias); } } - - }; - msg.onmouseleave = function() { - $(msg).removeClass('debug-message-hover'); + }); + msg.on("mouseleave", function() { + msg.removeClass('debug-message-hover'); if (o._source) { config.messageMouseLeave(o._source.id); if (o._source._alias) { config.messageMouseLeave(o._source._alias); } } - }; + }); var name = sanitize(((o.name?o.name:o.id)||"").toString()); var topic = sanitize((o.topic||"").toString()); var property = sanitize(o.property?o.property:''); var payload = o.msg; var format = sanitize((o.format||"").toString()); - msg.className = 'debug-message'+(o.level?(' debug-message-level-'+o.level):'')+ + msg.attr("class", 'debug-message'+(o.level?(' debug-message-level-'+o.level):'')+ (sourceNode?( " debug-message-node-"+sourceNode.id.replace(/\./g,"_")+ (sourceNode.z?" debug-message-flow-"+sourceNode.z.replace(/\./g,"_"):"") - ):""); + ):"")); if (sourceNode) { - $(msg).data('source',sourceNode.id); + msg.data('source',sourceNode.id); if (filterType === "filterCurrent" && activeWorkspace) { if (sourceNode.z && sourceNode.z.replace(/\./g,"_") !== activeWorkspace) { - $(msg).addClass('hide'); + msg.addClass('hide'); } } else if (filterType === 'filterSelected'){ if (!!filteredNodes[sourceNode.id]) { - $(msg).addClass('hide'); + msg.addClass('hide'); } } } @@ -481,7 +480,7 @@ RED.debug = (function() { errorLvl = 30; errorLvlType = 'warn'; } - $(msg).addClass('debug-message-level-' + errorLvl); + msg.addClass('debug-message-level-' + errorLvl); $('function : (' + errorLvlType + ')').appendTo(metaRow); } else { var tools = $('').appendTo(metaRow); From 6a57d25f4a79db96bf552b2dd04c9ac7f0dcbc78 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 17 May 2019 11:45:16 +0100 Subject: [PATCH 018/137] Trigger change evnt on typedInput when type changes and options present Fixes #2160 --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index accfff6dd..1b18968bf 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -159,11 +159,11 @@ that.uiSelect.css("margin"+d,m); that.input.css("margin"+d,0); }); - + ["type","placeholder"].forEach(function(d) { var m = that.element.attr(d); that.input.attr(d,m); - }); + }); this.uiSelect.addClass("red-ui-typedInput-container"); @@ -635,6 +635,7 @@ } } } + this.input.trigger('change',this.propertyType,this.value()); } else { if (this.optionSelectTrigger) { this.optionSelectTrigger.hide(); From cc051544f95501c7a24da2b78a511963a71d61ad Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 17 May 2019 16:32:14 +0100 Subject: [PATCH 019/137] Only NLS status text that starts with a letter Fixes #2128 --- packages/node_modules/@node-red/editor-client/src/js/red.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 011b5b8d7..2c71af8ed 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -347,10 +347,8 @@ var RED = (function() { var parts = topic.split("/"); var node = RED.nodes.node(parts[1]); if (node) { - if (msg.hasOwnProperty("text")) { - if (msg.text[0] !== ".") { - msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()}); - } + if (msg.hasOwnProperty("text") && /^[a-zA-Z]/.test(msg.text)) { + msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()}); } node.status = msg; node.dirty = true; From 87a1f616b03829fb24d5816fa99311f826dc2370 Mon Sep 17 00:00:00 2001 From: KentWood Date: Sat, 18 May 2019 17:04:56 +0800 Subject: [PATCH 020/137] Update index.js fixed a error when run node-red with httpAdminRoot=false https://github.com/node-red/node-red/issues/2166 --- packages/node_modules/@node-red/runtime/lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/lib/index.js b/packages/node_modules/@node-red/runtime/lib/index.js index 22719f008..58b7df986 100644 --- a/packages/node_modules/@node-red/runtime/lib/index.js +++ b/packages/node_modules/@node-red/runtime/lib/index.js @@ -46,7 +46,7 @@ var stubbedExpressApp = { } var adminApi = { auth: { - needsPermission: function() {} + needsPermission: function() {return function(req,res,next) {next()}} }, adminApp: stubbedExpressApp, server: {} From 5f5feaed5ffe03e33c70eef05d603d4780169635 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 19 May 2019 22:33:34 +0100 Subject: [PATCH 021/137] Add expand editor button to Template node --- .../editor-client/locales/en-US/editor.json | 3 + .../editor-client/src/js/ui/editor.js | 3 + .../editor-client/src/js/ui/editors/text.js | 90 +++++++++++++++++++ .../nodes/core/core/80-template.html | 33 +++++-- 4 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/js/ui/editors/text.js diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 0b979f5d5..4fd83854b 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -729,6 +729,9 @@ "jsEditor": { "title": "JavaScript editor" }, + "textEditor": { + "title": "Text editor" + }, "jsonEditor": { "title": "JSON editor", "format": "format JSON" diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index fe506c0e3..7bf279ff5 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -513,6 +513,8 @@ RED.editor = (function() { label = RED._("expressionEditor.title"); } else if (node.type === '_js') { label = RED._("jsEditor.title"); + } else if (node.type === '_text') { + label = RED._("textEditor.title"); } else if (node.type === '_json') { label = RED._("jsonEditor.title"); } else if (node.type === '_markdown') { @@ -2456,6 +2458,7 @@ RED.editor = (function() { editExpression: function(options) { showTypeEditor("_expression", options) }, editJSON: function(options) { showTypeEditor("_json", options) }, editMarkdown: function(options) { showTypeEditor("_markdown", options) }, + editText: function(options) { showTypeEditor("_text", options) }, editBuffer: function(options) { showTypeEditor("_buffer", options) }, buildEditForm: buildEditForm, validateNode: validateNode, diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/text.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/text.js new file mode 100644 index 000000000..1824091fe --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/text.js @@ -0,0 +1,90 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * 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() { + + + var template = ''; + + var definition = { + show: function(options) { + var value = options.value; + var onComplete = options.complete; + var type = "_text" + if ($("script[data-template-name='"+type+"']").length === 0) { + $(template).appendTo("#red-ui-editor-node-configs"); + } + RED.view.state(RED.state.EDITING); + var expressionEditor; + var changeTimer; + + var trayOptions = { + title: options.title, + width: options.width||"inherit", + buttons: [ + { + id: "node-dialog-cancel", + text: RED._("common.label.cancel"), + click: function() { + RED.tray.close(); + } + }, + { + id: "node-dialog-ok", + text: RED._("common.label.done"), + class: "primary", + click: function() { + onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition()); + RED.tray.close(); + } + } + ], + resize: function(dimensions) { + var rows = $("#dialog-form>div:not(.node-text-editor-row)"); + var editorRow = $("#dialog-form>div.node-text-editor-row"); + var height = $("#dialog-form").height(); + // for (var i=0;i
-
- - -
-
@@ -32,11 +24,19 @@ +
+
+ + +
'+ + ''+ + ''+ '
').appendTo(dialogForm); var row = $('
'+ @@ -190,33 +189,13 @@ RED.workspaces = (function() { }) }); - dialogForm.find('#node-input-disabled-btn').on("click",function(e) { - var i = $(this).find("i"); - if (i.hasClass('fa-toggle-off')) { - i.addClass('fa-toggle-on'); - i.removeClass('fa-toggle-off'); - $("#node-input-disabled").prop("checked",false); - $("#node-input-disabled-label").text(RED._("editor:workspace.enabled")); - } else { - i.addClass('fa-toggle-off'); - i.removeClass('fa-toggle-on'); - $("#node-input-disabled").prop("checked",true); - $("#node-input-disabled-label").text(RED._("editor:workspace.disabled")); - } - }) - if (workspace.hasOwnProperty("disabled")) { $("#node-input-disabled").prop("checked",workspace.disabled); - if (workspace.disabled) { - dialogForm.find("#node-input-disabled-btn i").removeClass('fa-toggle-on').addClass('fa-toggle-off'); - $("#node-input-disabled-label").text(RED._("editor:workspace.disabled")); - } else { - $("#node-input-disabled-label").text(RED._("editor:workspace.enabled")); - } } else { workspace.disabled = false; - $("#node-input-disabled-label").text(RED._("editor:workspace.enabled")); } + $("#node-input-disabled").toggleButton({invertState: true}) + $('').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss index 99ffaacab..84dbe7ade 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss @@ -34,10 +34,10 @@ $shadow: rgba(0, 0, 0, 0.2); $primary-text-color: #555;//#0f0; // UI control label text $secondary-text-color: #888;//#00f; -$secondary-text-color-focus: #999;//#009; +$secondary-text-color-focus: #666;//#009; $secondary-text-color-hover: #666;//#006; $secondary-text-color-active: #666;//#006; -$secondary-text-color-selected: #AAA;//#00A; +$secondary-text-color-selected: #666;//#00A; $secondary-text-color-inactive: #666;//#006; $secondary-text-color-disabled: #bbb;//#00C; $secondary-text-color-disabled-active: #999;//#009; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss index d7d20db0b..91978057e 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss @@ -151,6 +151,9 @@ margin-bottom: 0; cursor: default; } + &:not(.selected) { + margin-top: 1px; + } } } @mixin editor-button { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss b/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss index a73922641..53358ac98 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss @@ -247,6 +247,9 @@ &.red-ui-tab-link-button-menu { border-color: $tab-background; } + &:not(.single):not(.selected) { + margin-top: 4px; + } } } .red-ui-tab-scroll { From 78aeb949179415918791c6faf349bd35c8c7dcc1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 15:26:03 +0100 Subject: [PATCH 025/137] Line up component footer buttons better --- .../@node-red/editor-client/src/sass/workspace.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 0e06e423d..33086cf7f 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -112,6 +112,13 @@ .red-ui-component-footer { @include component-footer; + + > .button-group { + display: inline-block; + > .red-ui-footer-button { + margin-top: -1px; + } + } } a.red-ui-footer-button, From 5cb888328ede30758290137c4b952c02e5c37fd0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 15:26:15 +0100 Subject: [PATCH 026/137] Fix Deploy menu focus style --- .../@node-red/editor-client/src/sass/dropdownMenu.scss | 4 +++- .../@node-red/editor-client/src/sass/header.scss | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss b/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss index b68c70394..f79d636f1 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss @@ -43,7 +43,8 @@ overflow: hidden; background-color: $menuDivider; } - & > li > a { + & > li > a, + & > li > a:focus { display: block; padding: 4px 0 4px 32px; clear: both; @@ -51,6 +52,7 @@ line-height: 20px; color: $menuColor; white-space: normal !important; + outline: none; } & > .active > a, diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index 2dd4bae52..6f6b50c66 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss @@ -219,6 +219,8 @@ text-indent: 0px; } } + > li > a:hover, + > li > a:focus, > li:hover > a, > li:focus > a { background: $header-menu-item-hover !important; @@ -229,8 +231,8 @@ li.disabled a { color: $header-menu-color-disabled; } - > li.disabled:hover > a, - > li.disabled:focus > a { + > li.disabled > a:hover, + > li.disabled > a:focus { background: none !important; } } From afa25df1af339fde65283cf734639d16d19dede4 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 17:19:12 +0100 Subject: [PATCH 027/137] Allow RED.settings.get/set to use full property desc --- .../editor-client/src/js/settings.js | 15 ++++- .../editor-client/src/js/ui/utils.js | 57 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/settings.js b/packages/node_modules/@node-red/editor-client/src/js/settings.js index c4a164fbe..e360cea7d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/settings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/settings.js @@ -37,7 +37,7 @@ RED.settings = (function () { if (key === "auth-tokens") { localStorage.setItem(key, JSON.stringify(value)); } else { - userSettings[key] = value; + RED.utils.setMessageProperty(userSettings,key,value); saveUserSettings(); } }; @@ -46,16 +46,25 @@ RED.settings = (function () { * If the key is not set in the localStorage it returns undefined * Else return the JSON parsed value * @param key + * @param defaultIfUndefined * @returns {*} */ - var get = function (key) { + var get = function (key,defaultIfUndefined) { if (!hasLocalStorage()) { return undefined; } if (key === "auth-tokens") { return JSON.parse(localStorage.getItem(key)); } else { - return userSettings[key]; + try { + var v = RED.utils.getMessageProperty(userSettings,key); + if (v === undefined) { + v = defaultIfUndefined; + } + } catch(err) { + v = defaultIfUndefined; + } + return v; } }; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index 038caac4a..0cc78dc5c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -722,6 +722,62 @@ RED.utils = (function() { return result; } + function setMessageProperty(msg,prop,value,createMissing) { + if (typeof createMissing === 'undefined') { + createMissing = (typeof value !== 'undefined'); + } + if (prop.indexOf('msg.')===0) { + prop = prop.substring(4); + } + var msgPropParts = normalisePropertyExpression(prop); + var depth = 0; + var length = msgPropParts.length; + var obj = msg; + var key; + for (var i=0;i Date: Tue, 21 May 2019 17:19:39 +0100 Subject: [PATCH 028/137] Add auto-refresh toggle to context sidebar --- .../editor-client/locales/en-US/editor.json | 3 +- .../src/js/ui/common/toggleButton.js | 24 +++++------ .../editor-client/src/js/ui/tab-context.js | 42 ++++++++++++++----- .../editor-client/src/sass/sidebar.scss | 3 ++ .../editor-client/src/sass/tab-context.scss | 2 +- 5 files changed, 47 insertions(+), 27 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 4fd83854b..5e928915d 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -528,7 +528,8 @@ "node": "Node", "flow": "Flow", "global": "Global", - "deleteConfirm": "Are you sure you want to delete this item?" + "deleteConfirm": "Are you sure you want to delete this item?", + "autoRefresh": "Auto-refresh" }, "palette": { "name": "Palette management", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js index 8e8b13326..1a52183d3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js @@ -17,13 +17,14 @@ /** * options: - * - invertState : boolean - if "true" the button will show "enabled" when the + * - invertState : boolean - if "true" the button will show "enabled" when the * checkbox is not selected and vice versa. - * - enabledIcon : string - the icon for "enabled" state, default "fa-check-square-o" - * - enabledLabel : string - the label for "enabled" state, default "Enabled" ("editor:workspace.enabled") - * - disabledIcon : string - the icon for "disabled" state, default "fa-square-o" + * - enabledIcon : string - the icon for "enabled" state, default "fa-check-square-o" + * - enabledLabel : string - the label for "enabled" state, default "Enabled" ("editor:workspace.enabled") + * - disabledIcon : string - the icon for "disabled" state, default "fa-square-o" * - disabledLabel : string - the label for "disabled" state, default "Disabled" ("editor:workspace.disabled") - * - class: string - additional classes to apply to the button - eg "red-ui-button-small" + * - baseClass : string - the base css class to apply, default "red-ui-button" (alternative eg "red-ui-sidebar-header-button") + * - class : string - additional classes to apply to the button - eg "red-ui-button-small" * methods: * - */ @@ -35,6 +36,7 @@ if (this.options.hasOwnProperty("invertState")) { invertState = this.options.invertState; } + var baseClass = this.options.baseClass || "red-ui-button"; var enabledIcon = this.options.enabledIcon || "fa-check-square-o"; var disabledIcon = this.options.disabledIcon || "fa-square-o"; var enabledLabel = this.options.enabledLabel || RED._("editor:workspace.enabled"); @@ -45,7 +47,7 @@ this.element.on("focus", function() { that.button.focus(); }); - this.button = $(''); + this.button = $(''); if (this.options.class) { this.button.addClass(this.options.class) } @@ -71,19 +73,13 @@ } this.button.on("click",function(e) { + e.stopPropagation(); if (that.buttonIcon.hasClass(disabledIcon)) { - that.button.addClass("selected"); - that.buttonIcon.addClass(enabledIcon); - that.buttonIcon.removeClass(disabledIcon); that.element.prop("checked",!invertState); - that.buttonLabel.text(enabledLabel); } else { - that.buttonIcon.addClass(disabledIcon); - that.button.removeClass("selected"); - that.buttonIcon.removeClass(enabledIcon); that.element.prop("checked",invertState); - that.buttonLabel.text(disabledLabel); } + that.element.trigger("change"); }) this.element.on("change", function(e) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js index 57fecdbf3..438f483f8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js @@ -20,7 +20,7 @@ RED.sidebar.context = (function() { var localCache = {}; - + var flowAutoRefresh; var nodeSection; // var subflowSection; var flowSection; @@ -34,10 +34,20 @@ RED.sidebar.context = (function() { content = $("
").css({"position":"relative","height":"100%"}); content.className = "red-ui-sidebar-context" + var header = $('
').appendTo(content); + + var autoUpdate = RED.settings.get("editor.context.refresh",false); + flowAutoRefresh = $('').prop("checked",autoUpdate).appendTo(header).toggleButton({ + baseClass: "red-ui-sidebar-header-button", + enabledLabel: RED._("sidebar.context.autoRefresh"), + disabledLabel: RED._("sidebar.context.autoRefresh") + }).on("change", function() { + var value = $(this).prop("checked"); + RED.settings.set("editor.context.refresh",value); + }); + var footerToolbar = $('
'); - - var stackContainer = $("
",{class:"red-ui-sidebar-context-stack"}).appendTo(content); sections = RED.stack.create({ container: stackContainer @@ -95,7 +105,7 @@ RED.sidebar.context = (function() { .on("click", function(evt) { evt.stopPropagation(); evt.preventDefault(); - updateFlow(currentFlow); + updateFlow(currentFlow, true); }) globalSection = sections.add({ @@ -162,8 +172,13 @@ RED.sidebar.context = (function() { RED.events.on("workspace:change", function(event) { updateFlow(RED.nodes.workspace(event.workspace)); }) - - updateEntry(globalSection,"context/global","global"); + if (autoUpdate) { + updateEntry(globalSection,"context/global","global"); + } else { + $(globalSection.table).empty(); + $('').appendTo(globalSection.table).i18n(); + globalSection.timestamp.html(" "); + } } @@ -190,15 +205,20 @@ RED.sidebar.context = (function() { $('').appendTo(nodeSection.table).i18n(); } nodeSection.timestamp.html(" "); - } } - function updateFlow(flow) { + function updateFlow(flow, force) { currentFlow = flow; - if (flow) { - updateEntry(flowSection,"context/flow/"+flow.id,flow.id); + if (force || flowAutoRefresh.prop("checked")) { + if (flow) { + updateEntry(flowSection,"context/flow/"+flow.id,flow.id); + } else { + updateEntry(flowSection) + } } else { - updateEntry(flowSection) + $(flowSection.table).empty(); + $('').appendTo(flowSection.table).i18n(); + flowSection.timestamp.html(" "); } } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 46dcfddb2..d85527178 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -91,6 +91,9 @@ button.red-ui-sidebar-header-button { font-size: 13px; line-height: 13px; padding: 5px 8px; + &.toggle { + @include workspace-button-toggle; + } } a.sidebar-header-button-toggle, /* Deprecated -> red-ui-sidebar-header-button-toggle */ diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss index 46b09de43..b335ab601 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss @@ -16,7 +16,7 @@ .red-ui-sidebar-context-stack { position: absolute; - top: 0; + top: 42px; bottom: 0; left: 0; right: 0; From 42b60aef4e0416bab5a29c56d0986eb9570afed5 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 22:58:56 +0100 Subject: [PATCH 029/137] Fix library/clipboard import/export issues --- .../editor-client/src/js/ui/clipboard.js | 92 ++++++++++++------- .../src/js/ui/common/treeList.js | 19 +++- .../editor-client/src/js/ui/library.js | 48 ++++++++-- .../editor-client/src/sass/library.scss | 9 +- .../nodes/core/core/80-function.html | 3 +- .../nodes/core/core/80-template.html | 7 +- .../lib/storage/localfilesystem/library.js | 3 - 7 files changed, 127 insertions(+), 54 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 0d16a7c42..012c1ff96 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -26,6 +26,7 @@ RED.clipboard = (function() { var currentPopoverError; var activeTab; var libraryBrowser; + var examplesBrowser; function setupDialogs() { dialog = $('
') @@ -139,10 +140,15 @@ RED.clipboard = (function() { text: RED._("common.label.import"), click: function() { var addNewFlow = ($("#red-ui-clipboard-dialog-import-opt > a.selected").attr('id') === 'red-ui-clipboard-dialog-import-opt-new'); - if (activeTab === "red-ui-clipboard-dialog-red-ui-clipboard-dialog-import-opt-clipboard") { + if (activeTab === "red-ui-clipboard-dialog-import-tab-clipboard") { RED.view.importNodes($("#red-ui-clipboard-dialog-import-text").val(),addNewFlow); } else { - var selectedPath = libraryBrowser.getSelected(); + var selectedPath; + if (activeTab === "red-ui-clipboard-dialog-import-tab-library") { + selectedPath = libraryBrowser.getSelected(); + } else { + selectedPath = examplesBrowser.getSelected(); + } if (selectedPath.path) { $.get('library/'+selectedPath.library+'/'+selectedPath.type+'/'+selectedPath.path, function(data) { RED.view.importNodes(data,addNewFlow); @@ -214,9 +220,8 @@ RED.clipboard = (function() { ''+ '
'+ '
'+ - '
'+ - '
'+ - '
'+ + '
'+ + '
'+ '
'+ ''+ '
'+ @@ -386,6 +391,10 @@ RED.clipboard = (function() { id: "red-ui-clipboard-dialog-import-tab-library", label: RED._("library.library") }); + tabs.addTab({ + id: "red-ui-clipboard-dialog-import-tab-examples", + label: RED._("library.types.examples") + }); tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+mode); if (mode === 'clipboard') { @@ -400,16 +409,39 @@ RED.clipboard = (function() { $("#red-ui-clipboard-dialog-export").button("enable"); libraryBrowser = RED.library.createBrowser({ - container: $("#red-ui-clipboard-dialog-import-tab-library-browser"), + container: $("#red-ui-clipboard-dialog-import-tab-library"), onselect: function(file) { if (file && file.label && !file.children) { $("#red-ui-clipboard-dialog-ok").button("enable"); } else { $("#red-ui-clipboard-dialog-ok").button("disable"); } + }, + onconfirm: function(item) { + if (item && item.label && !item.children) { + $("#red-ui-clipboard-dialog-ok").trigger("click"); + } } }) - loadFlowLibrary(libraryBrowser,true); + loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local")); + + examplesBrowser = RED.library.createBrowser({ + container: $("#red-ui-clipboard-dialog-import-tab-examples"), + onselect: function(file) { + if (file && file.label && !file.children) { + $("#red-ui-clipboard-dialog-ok").button("enable"); + } else { + $("#red-ui-clipboard-dialog-ok").button("disable"); + } + }, + onconfirm: function(item) { + if (item && item.label && !item.children) { + $("#red-ui-clipboard-dialog-ok").trigger("click"); + } + } + }) + loadFlowLibrary(examplesBrowser,"_examples_",RED._("library.types.examples")); + dialogContainer.i18n(); @@ -504,7 +536,7 @@ RED.clipboard = (function() { } } }) - loadFlowLibrary(libraryBrowser,false); + loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local")); $("#red-ui-clipboard-dialog-tab-library-name").val("flows.json").select(); @@ -615,38 +647,36 @@ RED.clipboard = (function() { } - function loadFlowLibrary(browser,includeExamples) { - var listing = []; - if (includeExamples) { - listing.push({ - library: "_examples_", - type: "flows", - icon: 'fa fa-hdd-o', - label: RED._("library.types.examples"), - path: "", - children: function(item,done) { - RED.library.loadLibraryFolder("_examples_","flows","",function(children) { - item.children = children; - done(children); - }) - } - }) - } - listing.push({ - library: "local", + function loadFlowLibrary(browser,library,label) { + // if (includeExamples) { + // listing.push({ + // library: "_examples_", + // type: "flows", + // icon: 'fa fa-hdd-o', + // label: RED._("library.types.examples"), + // path: "", + // children: function(item,done) { + // RED.library.loadLibraryFolder("_examples_","flows","",function(children) { + // item.children = children; + // done(children); + // }) + // } + // }) + // } + browser.data([{ + library: library, type: "flows", icon: 'fa fa-hdd-o', - label: RED._("library.types.local"), + label: label, path: "", expanded: true, children: function(item,done) { - RED.library.loadLibraryFolder("local","flows","",function(children) { + RED.library.loadLibraryFolder(library,"flows","",function(children) { item.children = children; done(children); }) } - }) - browser.data(listing); + }]); } function hideDropTarget() { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js index ef7b4dd54..e775b28d0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js @@ -24,7 +24,7 @@ * * events: * - treelistselect : function(event, item) {} - * + * - treelistconfirm : function(event,item) {} * * data: * [ @@ -61,6 +61,18 @@ } var target; switch(evt.keyCode) { + case 13: // ENTER + if (selected.children) { + if (selected.treeList.container.hasClass("expanded")) { + selected.treeList.collapse() + } else { + selected.treeList.expand() + } + } else { + that._trigger("confirm",null,selected) + } + + break; case 37: // LEFT if (selected.children&& selected.treeList.container.hasClass("expanded")) { selected.treeList.collapse() @@ -290,6 +302,11 @@ label.addClass("selected"); that._trigger("select",e,item) }) + label.on("dblclick", function(e) { + if (!item.children) { + that._trigger("confirm",e,item); + } + }) } if (item.icon) { $('').appendTo(label); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js index 1d51ddd7e..d6fd27ec8 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js @@ -225,14 +225,19 @@ RED.library = (function() { expanded: true, writable: false, children: [{ + library: "local", + type: options.url, icon: 'fa fa-cube', label: options.type, - path: options.type+"/", + path: "", expanded: true, children: items }] }] loadLibraryBrowser.data(listing); + setTimeout(function() { + loadLibraryBrowser.select(listing[0].children[0]); + },200); }); libraryEditor = ace.edit('red-ui-library-dialog-load-preview-text',{ useWorker: false @@ -262,24 +267,31 @@ RED.library = (function() { if (filename === "") { filename = "unnamed-"+options.type; } - $("#red-ui-library-dialog-save-filename").attr("value",filename+".js"); + $("#red-ui-library-dialog-save-filename").attr("value",filename+"."+(options.ext||"txt")); loadLibraryFolder("local",options.url, "", function(items) { var listing = [{ - icon: 'fa fa-archive', + library: "local", + type: options.url, + icon: 'fa fa-hdd-o', label: RED._("library.types.local"), path: "", expanded: true, writable: false, children: [{ + library: "local", + type: options.url, icon: 'fa fa-cube', label: options.type, - path: options.type+"/", + path: "", expanded: true, children: items }] }] saveLibraryBrowser.data(listing); + setTimeout(function() { + saveLibraryBrowser.select(listing[0].children[0]); + },200); }); $( "#red-ui-library-dialog-save" ).dialog( "open" ); } @@ -299,6 +311,10 @@ RED.library = (function() { if (options.onselect) { options.onselect(item); } + }).on('treelistconfirm', function(event, item) { + if (options.onconfirm) { + options.onconfirm(item); + } }); var itemTools = $("
").css({position: "absolute",bottom:"6px",right:"8px"}); var menuButton = $('') @@ -406,6 +422,9 @@ RED.library = (function() { } return { + select: function(item) { + dirList.treeList('select',item); + }, getSelected: function() { return dirList.treeList('selected'); }, @@ -424,8 +443,8 @@ RED.library = (function() { return { init: function() { - $(_librarySave).appendTo("#red-ui-editor"); - $(_libraryLookup).appendTo("#red-ui-editor"); + $(_librarySave).appendTo("#red-ui-editor").i18n(); + $(_libraryLookup).appendTo("#red-ui-editor").i18n(); $( "#red-ui-library-dialog-save" ).dialog({ title: RED._("library.saveToLibrary"), @@ -459,7 +478,7 @@ RED.library = (function() { saveLibraryBrowser = RED.library.createBrowser({ container: $("#red-ui-library-dialog-save-browser"), - addFolderButton: true, + folderTools: true, onselect: function(item) { if (item.label) { if (!item.children) { @@ -482,6 +501,11 @@ RED.library = (function() { autoOpen: false, width: 800, resizable: false, + classes: { + "ui-dialog": "red-ui-editor-dialog", + "ui-dialog-titlebar-close": "hide", + "ui-widget-overlay": "red-ui-editor-dialog" + }, buttons: [ { text: RED._("common.label.cancel"), @@ -545,11 +569,17 @@ RED.library = (function() { }); RED.panels.create({ container:$("#red-ui-library-dialog-load-panes"), - dir: "horizontal" + dir: "horizontal", + resize: function() { + libraryEditor.resize(); + } }); RED.panels.create({ container:$("#red-ui-library-dialog-load-preview"), - dir: "vertical" + dir: "vertical", + resize: function() { + libraryEditor.resize(); + } }); }, create: createUI, diff --git a/packages/node_modules/@node-red/editor-client/src/sass/library.scss b/packages/node_modules/@node-red/editor-client/src/sass/library.scss index 0cfca1952..60014b2e6 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/library.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/library.scss @@ -61,7 +61,7 @@ padding: 0; background: $form-input-background; &>div { - height: calc(100% - 20px) + height: 100%; } } .red-ui-clipboard-dialog-box { @@ -88,14 +88,11 @@ width: calc(100% - 120px); } #red-ui-clipboard-dialog-export-tab-library-browser { - height: calc(100% - 40px); - margin-bottom: 10px; + height: calc(100% - 60px); + margin-bottom: 13px; border-bottom: 1px solid $primary-border-color; box-sizing: border-box; } -#red-ui-clipboard-dialog-import-tab-library { - height: 100%; -} #red-ui-clipboard-dialog-import-tab-library-browser { height: 100%; box-sizing: border-box; diff --git a/packages/node_modules/@node-red/nodes/core/core/80-function.html b/packages/node_modules/@node-red/nodes/core/core/80-function.html index 30654c493..483f1882d 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-function.html +++ b/packages/node_modules/@node-red/nodes/core/core/80-function.html @@ -75,7 +75,8 @@ type:"function", // the type of object the library is for editor:this.editor, // the field name the main text body goes to mode:"ace/mode/nrjavascript", - fields:['name','outputs'] + fields:['name','outputs'], + ext:"js" }); this.editor.focus(); diff --git a/packages/node_modules/@node-red/nodes/core/core/80-template.html b/packages/node_modules/@node-red/nodes/core/core/80-template.html index 8b96575b2..6f5129119 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-template.html +++ b/packages/node_modules/@node-red/nodes/core/core/80-template.html @@ -95,10 +95,11 @@ value: $("#node-input-template").val() }); RED.library.create({ - url:"functions", // where to get the data from - type:"function", // the type of object the library is for + url:"templates", // where to get the data from + type:"template", // the type of object the library is for editor:that.editor, // the field name the main text body goes to - fields:['name','outputs'] + fields:['name','format','output','syntax'], + ext: "txt" }); this.editor.focus(); diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js index 9e21e2089..41096addf 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js @@ -77,9 +77,6 @@ function getFileBody(root,path) { body += parts[i]+"\n"; } } - if (! /^\/\/ \w+: /.test(remaining)) { - scanning = false; - } if (!scanning) { body += remaining; } From 137a7ac48c28f00165ee93e69ec974f9295067e4 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 23:30:59 +0100 Subject: [PATCH 030/137] Fix getLibraryEntry for files missing meta data --- .../runtime/lib/storage/localfilesystem/library.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js index 41096addf..424e702fe 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js @@ -66,15 +66,19 @@ function getFileBody(root,path) { var buffer = Buffer.alloc(length); while(read < size) { var thisRead = fs.readSync(fd,buffer,0,length); - read += thisRead; if (scanning) { var data = remaining+buffer.slice(0,thisRead).toString(); + read += thisRead; var parts = data.split("\n"); - remaining = parts.splice(-1)[0]; + if (read < size) { + remaining = parts.splice(-1)[0]; + } else { + remaining = ""; + } for (var i=0;i 0?"\n":"")+parts[i]; } } if (!scanning) { From fc77c089fa0ae0a31039ad0c1c63349cc721846a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 23:31:21 +0100 Subject: [PATCH 031/137] Bump dependencies --- package.json | 14 +++++++------- .../node_modules/@node-red/editor-api/package.json | 4 ++-- packages/node_modules/@node-red/nodes/package.json | 4 ++-- .../node_modules/@node-red/registry/package.json | 2 +- .../node_modules/@node-red/runtime/package.json | 4 ++-- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index b8e9d281a..de7d4cc09 100644 --- a/package.json +++ b/package.json @@ -31,25 +31,25 @@ "cheerio": "0.22.0", "clone": "2.1.2", "content-type": "1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-parser": "1.4.4", "cors": "2.8.5", "cron": "1.7.1", "denque": "1.4.1", - "express": "4.16.4", + "express": "4.17.0", "express-session": "1.16.1", - "fs-extra": "7.0.1", + "fs-extra": "8.0.1", "fs.notify": "0.0.4", "hash-sum": "1.0.2", "https-proxy-agent": "2.2.1", - "i18next": "15.1.0", + "i18next": "15.1.2", "iconv-lite": "0.4.24", "is-utf8": "0.2.1", "js-yaml": "3.13.1", "json-stringify-safe": "5.0.1", "jsonata": "1.6.4", "memorystore": "1.6.1", - "mime": "2.4.2", + "mime": "2.4.3", "mqtt": "2.18.8", "multer": "1.4.1", "mustache": "3.0.1", @@ -68,13 +68,13 @@ "raw-body": "2.4.0", "request": "2.88.0", "semver": "6.0.0", - "uglify-js": "3.5.9", + "uglify-js": "3.5.15", "when": "3.7.8", "ws": "6.2.1", "xml2js": "0.4.19" }, "optionalDependencies": { - "bcrypt": "3.0.5" + "bcrypt": "3.0.6" }, "devDependencies": { "grunt": "~1.0.3", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 9a80f824a..e0042f4ed 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -23,9 +23,9 @@ "clone": "2.1.2", "cors": "2.8.5", "express-session": "1.16.1", - "express": "4.16.4", + "express": "4.17.0", "memorystore": "1.6.1", - "mime": "2.4.2", + "mime": "2.4.3", "mustache": "3.0.1", "oauth2orize": "1.11.0", "passport-http-bearer": "1.0.1", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index a8c020500..11e03f7d1 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -20,11 +20,11 @@ "cheerio": "0.22.0", "content-type": "1.0.4", "cookie-parser": "1.4.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cors": "2.8.5", "cron": "1.7.1", "denque": "1.4.1", - "fs-extra": "7.0.1", + "fs-extra": "8.0.1", "fs.notify": "0.0.4", "hash-sum": "1.0.2", "https-proxy-agent": "2.2.1", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 93745d7ea..c4b61c71c 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -18,7 +18,7 @@ "dependencies": { "@node-red/util": "0.21.0-alpha.0", "semver": "6.0.0", - "uglify-js": "3.5.9", + "uglify-js": "3.5.15", "when": "3.7.8" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index d1b1134e5..b6716c767 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -19,8 +19,8 @@ "@node-red/registry": "0.21.0-alpha.0", "@node-red/util": "0.21.0-alpha.0", "clone": "2.1.2", - "express": "4.16.4", - "fs-extra": "7.0.1", + "express": "4.17.0", + "fs-extra": "8.0.1", "json-stringify-safe": "5.0.1", "when": "3.7.8" } diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 2acf73ba2..55bd87364 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -16,7 +16,7 @@ ], "dependencies": { "clone": "2.1.2", - "i18next": "15.1.0", + "i18next": "15.1.2", "json-stringify-safe": "5.0.1", "jsonata": "1.6.4", "when": "3.7.8" diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 98de2315e..cc5f32af9 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -37,8 +37,8 @@ "@node-red/nodes": "0.21.0-alpha.0", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", - "express": "4.16.4", - "fs-extra": "7.0.1", + "express": "4.17.0", + "fs-extra": "8.0.1", "node-red-node-email": "^1.4.0", "node-red-node-feedparser": "^0.1.14", "node-red-node-rbe": "^0.2.4", From 359c0354f656d5bd121ec7467f05280acebe12ce Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 23:32:42 +0100 Subject: [PATCH 032/137] Set package version to 1.0.0-beta.1 --- package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index de7d4cc09..32d6d517d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "description": "A visual tool for wiring the Internet of Things", "homepage": "http://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index e0042f4ed..f823a1f34 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "0.21.0-alpha.0", - "@node-red/editor-client": "0.21.0-alpha.0", + "@node-red/util": "1.0.0-beta.1", + "@node-red/editor-client": "1.0.0-beta.1", "bcryptjs": "2.4.3", "body-parser": "1.19.0", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 86c05ea6e..04e281628 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 11e03f7d1..6a1eb3954 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index c4b61c71c..e612b6c01 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "0.21.0-alpha.0", + "@node-red/util": "1.0.0-beta.1", "semver": "6.0.0", "uglify-js": "3.5.15", "when": "3.7.8" diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index b6716c767..ab156234e 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "0.21.0-alpha.0", - "@node-red/util": "0.21.0-alpha.0", + "@node-red/registry": "1.0.0-beta.1", + "@node-red/util": "1.0.0-beta.1", "clone": "2.1.2", "express": "4.17.0", "fs-extra": "8.0.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 55bd87364..e1dc87172 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index cc5f32af9..a557d9596 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "0.21.0-alpha.0", + "version": "1.0.0-beta.1", "description": "A visual tool for wiring the Internet of Things", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "0.21.0-alpha.0", - "@node-red/runtime": "0.21.0-alpha.0", - "@node-red/util": "0.21.0-alpha.0", - "@node-red/nodes": "0.21.0-alpha.0", + "@node-red/editor-api": "1.0.0-beta.1", + "@node-red/runtime": "1.0.0-beta.1", + "@node-red/util": "1.0.0-beta.1", + "@node-red/nodes": "1.0.0-beta.1", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.17.0", From 9ed3a6748a25fb057840519a202ddf6e418239ad Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 May 2019 23:48:33 +0100 Subject: [PATCH 033/137] Fix node label size calculation --- .../@node-red/editor-client/src/js/ui/view.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) 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 614ab532e..9683bf4a9 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 @@ -1759,15 +1759,10 @@ RED.view = (function() { } function calculateTextDimensions(str,className,offsetW,offsetH) { - var sp = document.createElement("span"); - sp.className = className; - sp.style.position = "absolute"; - sp.style.top = "-1000px"; - sp.textContent = (str||""); - document.body.appendChild(sp); - var w = sp.offsetWidth; - var h = sp.offsetHeight; - document.body.removeChild(sp); + var sp = $('',{class: className,style: "position: absolute; top: -1000px"}).text(str||"").appendTo("#red-ui-editor"); + var w = sp.width(); + var h = sp.height(); + sp.remove(); return [offsetW+w,offsetH+h]; } From c4f5df0cd0db17b043690c5dc889d3304f3843e9 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 22 May 2019 00:03:26 +0100 Subject: [PATCH 034/137] Bump to jquery 3.4.1 --- Gruntfile.js | 2 +- .../editor-client/src/vendor/jquery/js/jquery-3.3.1.min.js | 2 -- .../editor-client/src/vendor/jquery/js/jquery-3.4.1.min.js | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.3.1.min.js create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.4.1.min.js diff --git a/Gruntfile.js b/Gruntfile.js index f75794e40..c301c6c9c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -183,7 +183,7 @@ module.exports = function(grunt) { vendor: { files: { "packages/node_modules/@node-red/editor-client/public/vendor/vendor.js": [ - "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.3.1.min.js", + "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.4.1.min.js", "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-migrate-3.0.1.min.js", "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui.min.js", "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js", diff --git a/packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.3.1.min.js b/packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.3.1.min.js deleted file mode 100644 index 4d9b3a258..000000000 --- a/packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.3.1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" - - diff --git a/packages/node_modules/@node-red/nodes/core/core/25-status.html b/packages/node_modules/@node-red/nodes/core/core/25-status.html index 588804ab1..bf53b78f8 100644 --- a/packages/node_modules/@node-red/nodes/core/core/25-status.html +++ b/packages/node_modules/@node-red/nodes/core/core/25-status.html @@ -7,17 +7,11 @@
-
- +
@@ -42,7 +42,7 @@
- +
diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.html index e3a3ea16c..269419baf 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.html +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.html @@ -18,7 +18,7 @@

- +

- +
From 20cba6411bab397bf955ae359fd7b60dd0cb32fe Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 23 May 2019 16:48:07 +0100 Subject: [PATCH 041/137] Disable copy/paste and enable select-all in node-select mode --- .../@node-red/editor-client/src/js/ui/view.js | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) 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 bf2e7dbf4..70feb2693 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 @@ -1388,14 +1388,19 @@ RED.view = (function() { function selectAll() { RED.nodes.eachNode(function(n) { if (n.z == RED.workspaces.active()) { - if (!n.selected) { - n.selected = true; - n.dirty = true; - moving_set.push({n:n}); + if (mouse_mode === RED.state.SELECTING_NODE) { + if (selectNodesOptions.filter && !selectNodesOptions.filter(n)) { + return; + } } } + if (!n.selected) { + n.selected = true; + n.dirty = true; + moving_set.push({n:n}); + } }); - if (activeSubflow) { + if (mouse_mode !== RED.state.SELECTING_NODE && activeSubflow) { activeSubflow.in.forEach(function(n) { if (!n.selected) { n.selected = true; @@ -1420,7 +1425,9 @@ RED.view = (function() { } selected_link = null; - updateSelection(); + if (mouse_mode !== RED.state.SELECTING_NODE) { + updateSelection(); + } redraw(); } @@ -1554,6 +1561,9 @@ RED.view = (function() { } } function deleteSelection() { + if (mouse_mode === RED.state.SELECTING_NODE) { + return; + } if (portLabelHover) { portLabelHover.remove(); portLabelHover = null; @@ -1730,6 +1740,9 @@ RED.view = (function() { } function copySelection() { + if (mouse_mode === RED.state.SELECTING_NODE) { + return; + } var nodes = []; var selection = RED.workspaces.selection(); if (selection.length > 0) { @@ -3378,6 +3391,9 @@ RED.view = (function() { * - attached to mouse for placing - "IMPORT_DRAGGING" */ function importNodes(newNodesStr,addNewFlow,touchImport) { + if (mouse_mode === RED.state.SELECTING_NODE) { + return; + } try { var activeSubflowChanged; if (activeSubflow) { From a71d4223ff761ea23770306d5ccdc0f7b4fe45b6 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 23 May 2019 23:38:42 +0100 Subject: [PATCH 042/137] Add node-select to typedInput --- .../editor-client/locales/en-US/editor.json | 2 +- .../src/images/typedInput/target.png | Bin 0 -> 944 bytes .../src/js/ui/common/typedInput.js | 70 +++++++++++++++++- .../@node-red/editor-client/src/js/ui/view.js | 59 ++++++++------- .../src/sass/ui/common/typedInput.scss | 9 +++ .../@node-red/nodes/core/core/25-catch.html | 1 - .../@node-red/nodes/core/core/25-status.html | 1 - .../nodes/locales/en-US/messages.json | 1 - 8 files changed, 113 insertions(+), 30 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/images/typedInput/target.png diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 023ca4b60..f5a3a0e8b 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -29,7 +29,7 @@ "enabled": "Enabled", "disabled":"Disabled", "info": "Description", - "selectNodes": "Select nodes" + "selectNodes": "Click nodes to select" }, "menu": { "label": { diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/target.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/target.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9833b73c2db1156146db7eec1477f77829347e GIT binary patch literal 944 zcmV;h15f;kP)m-OT_113gJZ zK~#9!?VG=E(?Aq}Kc@u=QB@2by>|dH5$QyhbgYEb`~|3689P817-0d1j_ran(5(Y3 zWndr-NGG);3~UVE=zuB}F;s-17q}jFa=uIK5Z;q2r;hL4eRybF4*@Nh%*^?OCv3We~Liy0CQsHxLn-YDub^NGa9Nxi6EM0L+7{ z3Non^t_sMR-$eyb00mG01yBG5PynTx$jd>m0v+I`$K?xJ>(hS%P$_jC*aX&rdCy^I zKo{87T7Q~aK&8|(;C`f<=UVFrQw3qSGK(I_8{jF>^HkFYwt!XZ+%eG6T7Rew&{(eLz}*9O166JSI}T(!#*(pN zqHDpO04ou2n6WEH*T9v#wOBA`Ls`jlNv-uLJw-12ZX6p=65*O3hq>h_Fb`1IU2lZA zYN(5DIvYw9T)~)KqdRZT$yv~3DBr9ge!(?E;D%VzcGWZBTG@;QW~7WC;~=Ex)9$*=_%!I`}<{RmmAV2w+40xnko z7&S*D^3hdmSkmAV^gXU=g)UBOoiyy25g={Bq?4*OO*+*x z3s11V*)&+J15zd|wXJGDC{=3&d@`p_jkaYkd;m2f$or;rTXyXk(s>KrWVWr>tERN+ z=eeqH@?B6atrpDbEps7*vMl?Wrs)E3+nl-sya&Fxn@yHwBf-)%&2!Ctr{LWSS!--h z=8!*~v=g%-^oWx-=bgAk^Z$|7x>;8oT(?rGMN_+NMCjWvIu@-oZN0WYZ(0Z)CtutF z4vZzrSnYtnJ8GTS-l#NwOM*^a>wa#WfLWHkP1AHAxD4DZaSNOQFMzwDyJaO7%*l9W z@9|kt>%b>(oW^=^<_lf{6hHwKKmim$0TjUcM1B}DNysXG+9M(&A|fL4Kg%!w2P%)& SfOeMv0000',{class:"red-ui-search-result-node"}).css({ + "margin-top": "2px", + "margin-left": "3px" + }).appendTo(container); + var nodeLabel = $('').css({ + "line-height": "32px", + "margin-left": "6px" + }).appendTo(container); + if (node) { + var colour = RED.utils.getNodeColor(node.type,node._def); + var icon_url = RED.utils.getNodeIcon(node._def,node); + if (node.type === 'tab') { + colour = "#C0DEED"; + } + nodeDiv.css('backgroundColor',colour); + var iconContainer = $('
',{class:"red-ui-palette-icon-container"}).appendTo(nodeDiv); + RED.utils.createIconElement(icon_url, iconContainer, true); + var l = RED.utils.getNodeLabel(node,node.id); + nodeLabel.text(l); + } else { + nodeDiv.css({ + 'backgroundColor': '#eee', + 'border-style' : 'dashed' + }); + + } + }, + expand: function() { + var that = this; + RED.tray.hide(); + RED.view.selectNodes({ + single: true, + selected: [that.value()], + onselect: function(selection) { + that.value(selection.id); + RED.tray.show(); + }, + oncancel: function() { + RED.tray.show(); + } + }) + } } }; var nlsd = false; @@ -212,6 +261,8 @@ that.uiSelect.addClass('red-ui-typedInput-focus'); }) + this.valueLabelContainer = $('
').appendTo(this.uiSelect) + // explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline' this.optionSelectTrigger = $('').appendTo(this.uiSelect); this.optionSelectLabel = $('').prependTo(this.optionSelectTrigger); @@ -394,10 +445,13 @@ this.selectTrigger.removeClass("red-ui-typedInput-full-width"); var labelWidth = this._getLabelWidth(this.selectTrigger); this.elementDiv.css('left',labelWidth+"px"); + this.valueLabelContainer.css('left',labelWidth+"px"); if (this.optionExpandButton.is(":visible")) { this.elementDiv.css('right',"22px"); + this.valueLabelContainer.css('right',"22px"); } else { this.elementDiv.css('right','0'); + this.valueLabelContainer.css('right','0'); this.input.css({ 'border-top-right-radius': '4px', 'border-bottom-right-radius': '4px' @@ -520,8 +574,13 @@ selectedOption = {value:""} } this._updateOptionSelectLabel(selectedOption) + } else { + this.input.val(value); + } + if (this.typeMap[this.propertyType].valueLabel) { + this.valueLabelContainer.empty(); + this.typeMap[this.propertyType].valueLabel.call(this,this.valueLabelContainer,value); } - this.input.val(value); this.input.trigger('change',this.type(),value); } }, @@ -566,8 +625,10 @@ this.optionSelectTrigger.show(); if (!opt.hasValue) { this.elementDiv.hide(); + this.valueLabelContainer.hide(); } else { this.elementDiv.show(); + this.valueLabelContainer.hide(); } this.activeOptions = {}; opt.options.forEach(function(o) { @@ -655,11 +716,18 @@ this.oldValue = this.input.val(); this.input.val(""); this.elementDiv.hide(); + this.valueLabelContainer.hide(); + } else if (opt.valueLabel) { + this.valueLabelContainer.show(); + this.valueLabelContainer.empty(); + opt.valueLabel.call(this,this.valueLabelContainer,this.input.val()); + this.elementDiv.hide(); } else { if (this.oldValue !== undefined) { this.input.val(this.oldValue); delete this.oldValue; } + this.valueLabelContainer.hide(); this.elementDiv.show(); } if (this.optionExpandButton) { 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 70feb2693..c71891c31 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 @@ -1386,6 +1386,9 @@ RED.view = (function() { } function selectAll() { + if (mouse_mode === RED.state.SELECTING_NODE && selectNodesOptions.single) { + return; + } RED.nodes.eachNode(function(n) { if (n.z == RED.workspaces.active()) { if (mouse_mode === RED.state.SELECTING_NODE) { @@ -2269,6 +2272,10 @@ RED.view = (function() { return; } else if (mouse_mode === RED.state.SELECTING_NODE) { d3.event.stopPropagation(); + if (selectNodesOptions.single) { + selectNodesOptions.done(d); + return; + } if (d.selected) { d.selected = false; for (i=0;iError: __message__", "errors": { "not-deployed": "node not deployed", From 32714c5dacde23abe75349ea503fa071b7a5d495 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 May 2019 10:26:00 +0100 Subject: [PATCH 043/137] Fix node multi-select mode --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c71891c31..50e073960 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 @@ -3730,7 +3730,7 @@ RED.view = (function() { class: "primary", click: function(e) { var selection = moving_set.map(function(n) { return n.n;}); - selectNodesOptions(selection); + selectNodesOptions.done(selection); } }); } From b68835f1711121a7fd823d39c2622e495dfb8d87 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 May 2019 10:44:46 +0100 Subject: [PATCH 044/137] Update CHANGELOG --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a99600a05..0285b4553 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,49 @@ +#### 1.0.0-beta.1: Beta Release + +Runtime + - Update runtime apis to support multiple libraries + - Add Node 12 to travis (allow_failures) + - Bump all dependencies Fixes #2152 + +Editor + - [BREAKING] complete overhaul of editor DOM/CSS structure + - [BREAKING] Get rid of Bootstrap + - Simplify index.mst to a single div to insert the editor + - Append node configs to div rather than body + - Only redraw node status when it has changed + - Minimise work done to calculate node label widths + - Allow script tags with src to reference esm modules + - Upgrade to jq 3.4.1 / jq-ui 1.12.1 + - Allow editor language to be chosen in editor settings + - Only NLS status text that starts with a letter Fixes #2128 + - Fix display of link node list within subflow Fixes #2140 + - Blur the active element when closing edit dialog via action Fixes #2097 + - Trigger change evnt on typedInput when type changes and options present Fixes #2160 + - Move library import/export to single dialog + - Move type-library dialogs to new style dialog + - Fix node drag and drop animation + - let status be simple text if wanted + - Add workspace statusBar + - Complete refresh of German translations + - Fix memory leak in Debug sidebar #2163 + - Introduce toggleButton and move flow-disabled to use it + - Allow RED.settings.get/set to use full property desc + - Add auto-refresh toggle to context sidebar + - Add build-custom-theme script + - Add RED.view.selectNodes api for node selection whilst editing + - Add node-select to typedInput + +Nodes + - http request node: warn user if msg.requestTimeout == 0 + - hide delay node reset label on deploy + - Fix CSV regex to treat strings starting e as text + - Add "don't parse numbers" option to csv node + - Add expand editor button to Template node + - Update catch/status nodes to use selectNodes api and treeList + + + + #### 0.20.5: Maintenance Release - Revert error handling in palette manager From a694b0364dfb66bc8201466d3e7e834729bd6be0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 May 2019 11:36:05 +0100 Subject: [PATCH 045/137] Fix length calculation when reading library file --- .../@node-red/runtime/lib/storage/localfilesystem/library.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js index 424e702fe..da0e1f94f 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/library.js @@ -85,6 +85,7 @@ function getFileBody(root,path) { body += remaining; } } else { + read += thisRead; body += buffer.slice(0,thisRead).toString(); } } From 16db9d4290fd39351cc3e02b49b21ba3f8ea15ad Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 May 2019 11:36:57 +0100 Subject: [PATCH 046/137] Bump for 1.0.0-beta.2 --- package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 32d6d517d..4f4db9014 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "description": "A visual tool for wiring the Internet of Things", "homepage": "http://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index f823a1f34..859eb9de4 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "1.0.0-beta.1", - "@node-red/editor-client": "1.0.0-beta.1", + "@node-red/util": "1.0.0-beta.2", + "@node-red/editor-client": "1.0.0-beta.2", "bcryptjs": "2.4.3", "body-parser": "1.19.0", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 04e281628..162b73c75 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 6a1eb3954..31e5e8b16 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index e612b6c01..098ca1321 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "1.0.0-beta.1", + "@node-red/util": "1.0.0-beta.2", "semver": "6.0.0", "uglify-js": "3.5.15", "when": "3.7.8" diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index ab156234e..d92577fa5 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "1.0.0-beta.1", - "@node-red/util": "1.0.0-beta.1", + "@node-red/registry": "1.0.0-beta.2", + "@node-red/util": "1.0.0-beta.2", "clone": "2.1.2", "express": "4.17.0", "fs-extra": "8.0.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index e1dc87172..f7b42ffc8 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index a557d9596..901dd1ee0 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "description": "A visual tool for wiring the Internet of Things", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "1.0.0-beta.1", - "@node-red/runtime": "1.0.0-beta.1", - "@node-red/util": "1.0.0-beta.1", - "@node-red/nodes": "1.0.0-beta.1", + "@node-red/editor-api": "1.0.0-beta.2", + "@node-red/runtime": "1.0.0-beta.2", + "@node-red/util": "1.0.0-beta.2", + "@node-red/nodes": "1.0.0-beta.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.17.0", From abaf363dddd9984d72a3a9e15731478dc7161462 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 May 2019 11:37:42 +0100 Subject: [PATCH 047/137] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0285b4553..51b3685e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +#### 1.0.0-beta.2: Beta Release + +Runtime + - Fix length calculation when loading library file + #### 1.0.0-beta.1: Beta Release Runtime From b105a125053714dfc9e50bf5845f3c894a192c5d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 May 2019 22:13:21 +0100 Subject: [PATCH 048/137] Fix palette node id handling so search works Fixes #2173 --- .../src/js/ui/common/searchBox.js | 1 + .../editor-client/src/js/ui/palette.js | 54 ++++++++----------- .../@node-red/editor-client/src/js/ui/view.js | 2 +- 3 files changed, 24 insertions(+), 33 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js index 3f3aa87f1..214668485 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js @@ -87,6 +87,7 @@ that._trigger("change"); },this.options.delay); } else { + this.lastSent = this.element.val(); this._trigger("change"); } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index e8fbb0460..645827d59 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -149,13 +149,11 @@ RED.palette = (function() { RED.utils.createIconElement(icon_url, iconContainer, true); } - function escapeNodeType(nt) { - return nt.replace(" ","_").replace(".","_").replace(":","_"); + function getPaletteNode(type) { + return $(".red-ui-palette-node[data-palette-type='"+type+"']"); } - function addNodeType(nt,def) { - var nodeTypeId = escapeNodeType(nt); - if ($("#red-ui-palette-node_"+nodeTypeId).length) { + if (getPaletteNode(nt).length) { return; } if (exclusion.indexOf(def.category)===-1) { @@ -164,9 +162,7 @@ RED.palette = (function() { var category = def.category.replace(/ /g,"_"); var rootCategory = category.split("-")[0]; - var d = document.createElement("div"); - d.id = "red-ui-palette-node_"+nodeTypeId; - d.type = nt; + var d = $('
',{class:"red-ui-palette-node"}).attr("data-palette-type",nt).data('category',rootCategory); var label = /^(.*?)([ -]in|[ -]out)?$/.exec(nt)[1]; if (typeof def.paletteLabel !== "undefined") { @@ -182,7 +178,6 @@ RED.palette = (function() { + (((!def.align && def.inputs !== 0 && def.outputs === 0) || "right" === def.align) ? " red-ui-palette-label-right" : "") }).appendTo(d); - d.className="red-ui-palette-node"; if (def.icon) { var icon_url = RED.utils.getNodeIcon(def); @@ -193,36 +188,35 @@ RED.palette = (function() { RED.utils.createIconElement(icon_url, iconContainer, true); } - d.style.backgroundColor = RED.utils.getNodeColor(nt,def); + d.css("backgroundColor", RED.utils.getNodeColor(nt,def)); if (def.outputs > 0) { var portOut = document.createElement("div"); portOut.className = "red-ui-palette-port red-ui-palette-port-output"; - d.appendChild(portOut); + d.append(portOut); } if (def.inputs > 0) { var portIn = document.createElement("div"); portIn.className = "red-ui-palette-port red-ui-palette-port-input"; - d.appendChild(portIn); + d.append(portIn); } createCategory(def.category,rootCategory,category,(coreCategories.indexOf(rootCategory) !== -1)?"node-red":def.set.id); $("#red-ui-palette-"+category).append(d); - $(d).data('category',rootCategory); - - d.onmousedown = function(e) { e.preventDefault(); }; + d.on("mousedown", function(e) { e.preventDefault();}); var popover = RED.popover.create({ - target:$(d), + target:d, trigger: "hover", width: "300px", content: "hi", delay: { show: 750, hide: 50 } }); - $(d).data('popover',popover); + + d.data('popover',popover); // $(d).popover({ // title:d.type, @@ -232,7 +226,7 @@ RED.palette = (function() { // html: true, // container:'body' // }); - $(d).on("click", function() { + d.on("click", function() { RED.view.focus(); var helpText; if (nt.indexOf("subflow:") === 0) { @@ -330,13 +324,13 @@ RED.palette = (function() { var nodeInfo = null; if (nt.indexOf("subflow:") === 0) { - $(d).on("dblclick", function(e) { + d.on("dblclick", function(e) { RED.workspaces.show(nt.substring(8)); e.preventDefault(); }); nodeInfo = marked(def.info||""); } - setLabel(nt,$(d),label,nodeInfo); + setLabel(nt,d,label,nodeInfo); var categoryNode = $("#red-ui-palette-container-"+rootCategory); if (categoryNode.find(".red-ui-palette-node").length === 1) { @@ -347,8 +341,7 @@ RED.palette = (function() { } function removeNodeType(nt) { - var nodeTypeId = escapeNodeType(nt); - var paletteNode = $("#red-ui-palette-node_"+nodeTypeId); + var paletteNode = getPaletteNode(nt); var categoryNode = paletteNode.closest(".red-ui-palette-category"); paletteNode.remove(); if (categoryNode.find(".red-ui-palette-node").length === 0) { @@ -360,8 +353,7 @@ RED.palette = (function() { } function hideNodeType(nt) { - var nodeTypeId = escapeNodeType(nt); - var paletteNode = $("#red-ui-palette-node_"+nodeTypeId); + var paletteNode = getPaletteNode(nt); paletteNode.hide(); var categoryNode = paletteNode.closest(".red-ui-palette-category"); var cl = categoryNode.find(".red-ui-palette-node"); @@ -373,8 +365,7 @@ RED.palette = (function() { } function showNodeType(nt) { - var nodeTypeId = escapeNodeType(nt); - var paletteNode = $("#red-ui-palette-node_"+nodeTypeId); + var paletteNode = getPaletteNode(nt); var categoryNode = paletteNode.closest(".red-ui-palette-category"); categoryNode.show(); paletteNode.show(); @@ -382,7 +373,7 @@ RED.palette = (function() { function refreshNodeTypes() { RED.nodes.eachSubflow(function(sf) { - var paletteNode = $("#red-ui-palette-node_subflow_"+sf.id.replace(".","_")); + var paletteNode = getPaletteNode('subflow:'+sf.id); var portInput = paletteNode.find(".red-ui-palette-port-input"); var portOutput = paletteNode.find(".red-ui-palette-port-output"); @@ -396,7 +387,6 @@ RED.palette = (function() { + (((!sf._def.align && sf.in.length !== 0 && sf.out.length === 0) || "right" === sf._def.align) ? " red-ui-palette-icon-container-right" : "") ); - if (portInput.length === 0 && sf.in.length > 0) { var portIn = document.createElement("div"); portIn.className = "red-ui-palette-port red-ui-palette-port-input"; @@ -446,7 +436,8 @@ RED.palette = (function() { var re = new RegExp(val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i'); $("#red-ui-palette-container .red-ui-palette-node").each(function(i,el) { var currentLabel = $(el).find(".red-ui-palette-label").text(); - if (val === "" || re.test(el.id) || re.test(currentLabel)) { + var type = $(el).attr("data-palette-type"); + if (val === "" || re.test(type) || re.test(currentLabel)) { $(this).show(); } else { $(this).hide(); @@ -459,8 +450,10 @@ RED.palette = (function() { .find(".red-ui-palette-node") .filter(function() { return $(this).css('display') !== 'none'}).length === 0) { categoryContainers[category].close(); + categoryContainers[category].container.slideUp(); } else { categoryContainers[category].open(); + categoryContainers[category].container.show(); } } } @@ -539,9 +532,6 @@ RED.palette = (function() { sidebarControls.hide(); }) - - - var categoryList = coreCategories; if (RED.settings.paletteCategories) { categoryList = RED.settings.paletteCategories; 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 50e073960..29c25cc01 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 @@ -328,7 +328,7 @@ RED.view = (function() { accept:".red-ui-palette-node", drop: function( event, ui ) { d3.event = event; - var selected_tool = ui.draggable[0].type; + var selected_tool = $(ui.draggable[0]).attr("data-palette-type"); var result = addNode(selected_tool); if (!result) { return; From 749a08039781d97cf6f07983fd7e5b9e07141987 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 25 May 2019 21:19:31 +0100 Subject: [PATCH 049/137] Fix typedInput option selection Fixes #2174 --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 83126f011..42c8ffc53 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -573,6 +573,7 @@ if (!selectedOption) { selectedOption = {value:""} } + this.input.val(value); this._updateOptionSelectLabel(selectedOption) } else { this.input.val(value); From c514d988df7a94f37ee3903321a124ce8096d575 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 25 May 2019 22:11:05 +0100 Subject: [PATCH 050/137] Revealing node position needs to account for zoom level Fixes #2172 --- .../@node-red/editor-client/src/js/ui/view.js | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) 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 29c25cc01..294ab7dc8 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 @@ -1367,24 +1367,31 @@ RED.view = (function() { function zoomIn() { if (scaleFactor < 2) { - scaleFactor += 0.1; - RED.view.navigator.resize(); - redraw(); + zoomView(scaleFactor+0.1); } } function zoomOut() { if (scaleFactor > 0.3) { - scaleFactor -= 0.1; - RED.view.navigator.resize(); - redraw(); + zoomView(scaleFactor-0.1); } } - function zoomZero() { - scaleFactor = 1; + function zoomZero() { zoomView(1); } + + function zoomView(factor) { + var screenSize = [chart.width(),chart.height()]; + var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; + var center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + scaleFactor = factor; + var newCenter = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + var delta = [(newCenter[0]-center[0])*scaleFactor,(newCenter[1]-center[1])*scaleFactor] + chart.scrollLeft(scrollPos[0]-delta[0]); + chart.scrollTop(scrollPos[1]-delta[1]); + RED.view.navigator.resize(); redraw(); } + function selectAll() { if (mouse_mode === RED.state.SELECTING_NODE && selectNodesOptions.single) { return; @@ -3632,12 +3639,12 @@ RED.view = (function() { node.dirty = true; RED.workspaces.show(node.z); - var screenSize = [chart.width(),chart.height()]; - var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; + var screenSize = [chart.width()/scaleFactor,chart.height()/scaleFactor]; + var scrollPos = [chart.scrollLeft()/scaleFactor,chart.scrollTop()/scaleFactor]; if (node.x < scrollPos[0] || node.y < scrollPos[1] || node.x > screenSize[0]+scrollPos[0] || node.y > screenSize[1]+scrollPos[1]) { - var deltaX = '-='+((scrollPos[0] - node.x) + screenSize[0]/2); - var deltaY = '-='+((scrollPos[1] - node.y) + screenSize[1]/2); + var deltaX = '-='+(((scrollPos[0] - node.x) + screenSize[0]/2)*scaleFactor); + var deltaY = '-='+(((scrollPos[1] - node.y) + screenSize[1]/2)*scaleFactor); chart.animate({ scrollLeft: deltaX, scrollTop: deltaY From 7f35e2280e55fc7bec14a8299879cb007fd9eb9e Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 27 May 2019 11:28:36 +0900 Subject: [PATCH 051/137] update editor language selection UI for i18n --- .../editor-client/locales/en-US/editor.json | 7 +++++++ .../editor-client/locales/ja/editor.json | 11 ++++++++++- .../editor-client/src/js/ui/userSettings.js | 17 ++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index f5a3a0e8b..c35189b6c 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -929,5 +929,12 @@ "description": "Description", "appearance": "Appearance", "env": "Environment Variables" + }, + "languages" : { + "de": "German", + "en-US": "English", + "ja": "Japanese", + "ko": "Korean", + "zh-CN": "Chinese(Simplified)" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 83a00a06e..1ac94d28c 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -42,7 +42,9 @@ "defaultDir": "標準", "ltr": "左から右", "rtl": "右から左", - "auto": "文脈" + "auto": "文脈", + "language": "表示言語", + "browserDefault": "ブラウザのデフォルト" }, "sidebar": { "show": "サイドバーを表示" @@ -914,5 +916,12 @@ "description": "説明", "appearance": "外観", "env": "環境変数" + }, + "languages" : { + "de": "ドイツ語", + "en-US": "英語", + "ja": "日本語", + "ko": "韓国語", + "zh-CN": "中国語(簡体)" } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js index e5c1500af..c4c4bcdec 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js @@ -101,10 +101,25 @@ RED.userSettings = (function() { RED.tray.show(trayOptions); } + function locale2Name(lc) { + var name = RED._("languages."+lc); + return {text: (name ? name : lc), val: lc}; + } + + function compText(a, b) { + if (a.text > b.text) { + return 1; + } + if (a.text < b.text) { + return -1; + } + return 0; + } + var viewSettings = [ { options: [ - {setting:"editor-language",local: true, label:"menu.label.view.language",options:function(done){ done([{val:'',text:RED._('menu.label.view.browserDefault')}].concat(RED.settings.theme("languages"))) }}, + {setting:"editor-language",local: true, label:"menu.label.view.language",options:function(done){ done([{val:'',text:RED._('menu.label.view.browserDefault')}].concat(RED.settings.theme("languages").map(locale2Name).sort(compText))) }}, ] },{ title: "menu.label.view.grid", From 320433b1bfa3b9354ff65f5edcbf26504cd98a0f Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 27 May 2019 13:13:25 +0900 Subject: [PATCH 052/137] update Japanese message catalogue --- .../editor-client/locales/ja/editor.json | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 83a00a06e..7cfd7efe8 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -28,7 +28,8 @@ "status": "状態", "enabled": "有効", "disabled": "無効", - "info": "詳細" + "info": "詳細", + "selectNodes": "ノードをクリックして選択" }, "menu": { "label": { @@ -179,7 +180,11 @@ "all": "全てのタブ", "compact": "インデントのないJSONフォーマット", "formatted": "インデント付きのJSONフォーマット", - "copy": "書き出し" + "copy": "書き出し", + "export": "ライブラリに書き出し", + "exportAs": "書き出し先", + "overwrite": "更新", + "exists": "

\"__file__\"は既に存在します。

更新しますか?

" }, "import": { "import": "読み込み先", @@ -315,7 +320,8 @@ "show": "表示", "hide": "非表示", "errors": { - "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします" + "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします", + "invalidProperties": "プロパティが不正です:" } }, "keyboard": { @@ -351,12 +357,14 @@ "saveToLibrary": "ライブラリへ保存", "typeLibrary": "__type__ ライブラリ", "unnamedType": "名前なし __type__", + "exportedToLibrary": "ライブラリにノードを書き出しました", "dialogSaveOverwrite": "__libraryName__ という __libraryType__ は既に存在しています 上書きしますか?", "invalidFilename": "不正なファイル名", "savedNodes": "フローを保存しました", "savedType": "__type__ を保存しました", "saveFailed": "保存に失敗しました: __message__", "types": { + "local": "ローカル", "examples": "サンプル" } }, @@ -519,7 +527,8 @@ "node": "Node", "flow": "Flow", "global": "Global", - "deleteConfirm": "データを削除しても良いですか?" + "deleteConfirm": "データを削除しても良いですか?", + "autoRefresh": "自動更新" }, "palette": { "name": "パレットの管理", @@ -719,6 +728,9 @@ "jsEditor": { "title": "JavaScriptエディタ" }, + "textEditor": { + "title": "テキストエディタ" + }, "jsonEditor": { "title": "JSONエディタ", "format": "JSONフォーマット" From 12ce719213039b339e938f716a3d86bdf9581110 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 27 May 2019 13:34:47 +0900 Subject: [PATCH 053/137] make new library folder interface i18n ready --- .../@node-red/editor-client/locales/en-US/editor.json | 1 + .../node_modules/@node-red/editor-client/locales/ja/editor.json | 1 + .../node_modules/@node-red/editor-client/src/js/ui/library.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index f5a3a0e8b..1239b41eb 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -365,6 +365,7 @@ "savedNodes": "Saved nodes", "savedType": "Saved __type__", "saveFailed": "Save failed: __message__", + "newFolder": "New folder", "types": { "local": "Local", "examples": "Examples" diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 83a00a06e..5d40016e2 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -356,6 +356,7 @@ "savedNodes": "フローを保存しました", "savedType": "__type__ を保存しました", "saveFailed": "保存に失敗しました: __message__", + "newFolder": "新規フォルダ", "types": { "examples": "サンプル" } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js index d6fd27ec8..ef73c5912 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js @@ -325,7 +325,7 @@ RED.library = (function() { var menuOptionMenu = RED.menu.init({id:"red-ui-library-browser-menu", options: [ - {id:"red-ui-library-browser-menu-addFolder",label:"New folder", onselect: function() { + {id:"red-ui-library-browser-menu-addFolder",label:RED._("library.newFolder"), onselect: function() { var defaultFolderName = "new-folder"; var defaultFolderNameMatches = {}; From 3b177bedf86c3b37f140d60f0622494a5966ff6e Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 27 May 2019 14:25:03 +0900 Subject: [PATCH 054/137] update Japanese message for nodes --- .../@node-red/nodes/locales/ja/messages.json | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 156612108..562deb332 100755 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -6,7 +6,8 @@ "name": "名前", "username": "ユーザ名", "password": "パスワード", - "property": "プロパティ" + "property": "プロパティ", + "selectNodes": "ノードを選択..." }, "status": { "connected": "接続済", @@ -90,11 +91,7 @@ "catchUncaught": "catch: 未補足", "label": { "source": "エラー取得元", - "node": "ノード", - "type": "型", "selectAll": "全て選択", - "sortByLabel": "ノード名で並べ替え", - "sortByType": "型で並べ替え", "uncaught": "Catchノードで処理済みのエラーを無視" }, "scope": { @@ -107,10 +104,6 @@ "statusNodes": "status: __number__", "label": { "source": "状態取得元", - "node": "ノード", - "type": "型", - "selectAll": "全て選択", - "sortByLabel": "ノード名で並べ替え", "sortByType": "型で並べ替え" }, "scope": { @@ -692,7 +685,8 @@ "firstrow": "1行目に列名を含む", "output": "出力", "includerow": "1行目を列名とする", - "newline": "改行コード" + "newline": "改行コード", + "usestrings": "数値を変換する" }, "placeholder": { "columns": "コンマ区切りで列名を入力" From dc0b9231cddfb92425260756898ad2feee2e302a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 27 May 2019 15:48:06 +0100 Subject: [PATCH 055/137] Add popover tooltips to debug sidebar,function and template path, value, pin buttons in debug expand buttons in function and template. --- .../@node-red/editor-client/src/js/ui/utils.js | 3 +++ .../@node-red/nodes/core/core/80-function.html | 2 ++ .../@node-red/nodes/core/core/80-template.html | 1 + .../@node-red/nodes/locales/en-US/messages.json | 8 ++++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index 0cc78dc5c..9613b2564 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -126,11 +126,13 @@ RED.utils = (function() { RED.clipboard.copyText(key,copyPath,"clipboard.copyMessagePath"); }) } + RED.popover.tooltip(copyPath,RED._("node-red:debug.sidebar.copyPath")); var copyPayload = $('').appendTo(copyTools).on("click", function(e) { e.preventDefault(); e.stopPropagation(); RED.clipboard.copyText(msg,copyPayload,"clipboard.copyMessageValue"); }) + RED.popover.tooltip(copyPayload,RED._("node-red:debug.sidebar.copyPayload")); if (strippedKey !== undefined && strippedKey !== '') { var isPinned = pinnedPaths[sourceId].hasOwnProperty(strippedKey); @@ -149,6 +151,7 @@ RED.utils = (function() { } }).toggleClass("selected",isPinned); obj.toggleClass("red-ui-debug-msg-row-pinned",isPinned); + RED.popover.tooltip(pinPath,RED._("node-red:debug.sidebar.pinPath")); } if (extraTools) { extraTools.addClass("red-ui-debug-msg-tools-other"); diff --git a/packages/node_modules/@node-red/nodes/core/core/80-function.html b/packages/node_modules/@node-red/nodes/core/core/80-function.html index 7d1af988b..8029d26fc 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-function.html +++ b/packages/node_modules/@node-red/nodes/core/core/80-function.html @@ -80,6 +80,8 @@ }); this.editor.focus(); + RED.popover.tooltip($("#node-function-expand-js"), RED._("node-red:common.label.expand")); + $("#node-function-expand-js").on("click", function(e) { e.preventDefault(); var value = that.editor.getValue(); diff --git a/packages/node_modules/@node-red/nodes/core/core/80-template.html b/packages/node_modules/@node-red/nodes/core/core/80-template.html index 6f5129119..bc8d1b971 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-template.html +++ b/packages/node_modules/@node-red/nodes/core/core/80-template.html @@ -110,6 +110,7 @@ v: Date.now() }); }); + RED.popover.tooltip($("#node-template-expand-editor"), RED._("node-red:common.label.expand")); $("#node-template-expand-editor").on("click", function(e) { e.preventDefault(); var value = that.editor.getValue(); diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index f559c2a1d..270434daf 100755 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -7,7 +7,8 @@ "username": "Username", "password": "Password", "property": "Property", - "selectNodes": "Select nodes..." + "selectNodes": "Select nodes...", + "expand": "Expand" }, "status": { "connected": "connected", @@ -137,7 +138,10 @@ "debugNodes": "Debug nodes", "clearLog": "Clear log", "filterLog": "Filter log", - "openWindow": "Open in new window" + "openWindow": "Open in new window", + "copyPath": "copy Path", + "copyPayload": "copy Value", + "pinPath": "pin open" }, "messageMenu": { "collapseAll": "Collapse all paths", From 423aba5bab8ec9ecd4a1ad3292c72be41daaae52 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 27 May 2019 21:06:53 +0100 Subject: [PATCH 056/137] Ensure ndoe status icon is shown when value set --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 294ab7dc8..d3d18bdb4 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 @@ -3144,7 +3144,7 @@ RED.view = (function() { } else { thisNode.selectAll(".red-ui-flow-node-status-group").attr("transform","translate(3,"+(d.h+3)+")"); var statusClass = "red-ui-flow-node-status-"+(d.status.shape||"dot")+"-"+d.status.fill; - thisNode.selectAll(".red-ui-flow-node-status").attr("class","red-ui-flow-node-status "+statusClass); + thisNode.selectAll(".red-ui-flow-node-status").style("display","inline").attr("class","red-ui-flow-node-status "+statusClass); } if (d.status.text) { thisNode.selectAll(".red-ui-flow-node-status-label").text(d.status.text); From 390b86cd8e48a43b04c3c1fc463343a94f5de8d1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 27 May 2019 21:11:50 +0100 Subject: [PATCH 057/137] Revert treeList children function signature change --- .../@node-red/editor-client/src/js/ui/clipboard.js | 4 ++-- .../@node-red/editor-client/src/js/ui/common/treeList.js | 6 +++--- .../@node-red/editor-client/src/js/ui/library.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 012c1ff96..cb8fe136f 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -655,7 +655,7 @@ RED.clipboard = (function() { // icon: 'fa fa-hdd-o', // label: RED._("library.types.examples"), // path: "", - // children: function(item,done) { + // children: function(done,item) { // RED.library.loadLibraryFolder("_examples_","flows","",function(children) { // item.children = children; // done(children); @@ -670,7 +670,7 @@ RED.clipboard = (function() { label: label, path: "", expanded: true, - children: function(item,done) { + children: function(done, item) { RED.library.loadLibraryFolder(library,"flows","",function(children) { item.children = children; done(children); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js index 8e60c1e22..e47ef4ab2 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js @@ -34,7 +34,7 @@ * label: 'Local', // label for the item * icon: 'fa fa-rocket', // (optional) icon for the item * selected: true/false, // (optional) if present, display checkbox accordingly - * children: [] | function(item,done) // (optional) an array of child items, or a function + * children: [] | function(done,item) // (optional) an array of child items, or a function * // that will call the `done` callback with an array * // of child items * } @@ -236,7 +236,7 @@ var childrenAdded = false; var spinner; var startTime = 0; - item.children(item,function(children) { + item.children(function(children) { childrenAdded = true; item.treeList.childList = that._addChildren(container,item,children,depth).hide(); var delta = Date.now() - startTime; @@ -255,7 +255,7 @@ } done && done(); that._trigger("childrenloaded",null,item) - }); + },item); if (!childrenAdded) { startTime = Date.now(); spinner = $('
').css({ diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js index d6fd27ec8..f84491c56 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js @@ -133,7 +133,7 @@ RED.library = (function() { icon: 'fa fa-folder', label: d, path: root+d+"/", - children: function(item,done) { + children: function(done, item) { loadLibraryFolder(library,type,root+d+"/", function(children) { item.children = children; // TODO: should this be done by treeList for us done(children); From 2ab19937afc47f3290957fe974972b5191c15df1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 27 May 2019 21:23:41 +0100 Subject: [PATCH 058/137] Fix pinned debug item css --- .../node_modules/@node-red/editor-client/src/sass/debug.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss index 45edf9eea..d767aaed3 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss @@ -221,7 +221,7 @@ padding: 4px 2px 2px; position: relative; &.red-ui-debug-msg-row-pinned { - background: $list-item-border-selected; + background: $secondary-background-selected; } } .red-ui-debug-msg-expandable { From 10da894124dc0d82ebbf9fdc49f94760ecf82ff0 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 28 May 2019 08:55:00 +0900 Subject: [PATCH 059/137] fix function name & string compare function --- .../editor-client/src/js/ui/userSettings.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js index c4c4bcdec..0bd241dfc 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js @@ -101,25 +101,19 @@ RED.userSettings = (function() { RED.tray.show(trayOptions); } - function locale2Name(lc) { + function localeToName(lc) { var name = RED._("languages."+lc); return {text: (name ? name : lc), val: lc}; } function compText(a, b) { - if (a.text > b.text) { - return 1; - } - if (a.text < b.text) { - return -1; - } - return 0; + return a.text.localeCompare(b.text); } var viewSettings = [ { options: [ - {setting:"editor-language",local: true, label:"menu.label.view.language",options:function(done){ done([{val:'',text:RED._('menu.label.view.browserDefault')}].concat(RED.settings.theme("languages").map(locale2Name).sort(compText))) }}, + {setting:"editor-language",local: true, label:"menu.label.view.language",options:function(done){ done([{val:'',text:RED._('menu.label.view.browserDefault')}].concat(RED.settings.theme("languages").map(localeToName).sort(compText))) }}, ] },{ title: "menu.label.view.grid", From 2d6acfae1b074f618e42ecdd4bcee60c17806fdb Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 May 2019 09:49:39 +0100 Subject: [PATCH 060/137] Restore tray component css for compatibility. Mark as deprecated --- .../node_modules/@node-red/editor-client/src/js/ui/tray.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js index 6236b3783..33a186585 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js @@ -25,9 +25,12 @@ RED.tray = (function() { } function showTray(options) { var el = $('
'); - var header = $('
').appendTo(el); + // `editor-tray-header` is deprecated - use red-ui-tray-body instead + var header = $('
').appendTo(el); var bodyWrapper = $('
').appendTo(el); - var body = $('
').appendTo(bodyWrapper); + // `editor-tray-body` is deprecated - use red-ui-tray-body instead + var body = $('
').appendTo(bodyWrapper); + // `editor-tray-footer` is deprecated - use red-ui-tray-footer instead var footer = $('').appendTo(el); var resizer = $('
').appendTo(el); // var growButton = $('').appendTo(resizer); From ed033565a4c71a2a7b16d9f78e4b7eb6dd6401d7 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 May 2019 11:21:53 +0100 Subject: [PATCH 061/137] Handle empty list of example flows Fixes #2171 --- packages/node_modules/@node-red/runtime/lib/library/examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/lib/library/examples.js b/packages/node_modules/@node-red/runtime/lib/library/examples.js index bde277a5f..28b7c76d0 100644 --- a/packages/node_modules/@node-red/runtime/lib/library/examples.js +++ b/packages/node_modules/@node-red/runtime/lib/library/examples.js @@ -23,7 +23,7 @@ function init(_runtime) { } function getEntry(type,path) { - var examples = runtime.nodes.getNodeExampleFlows(); + var examples = runtime.nodes.getNodeExampleFlows()||{}; var result = []; if (path === "") { return Promise.resolve(Object.keys(examples)); From d360f30af68514ed7217a9da3de67133ffb5a76e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 May 2019 11:23:03 +0100 Subject: [PATCH 062/137] Ensure library list has an item selected when opened --- .../@node-red/editor-client/src/js/ui/clipboard.js | 3 ++- .../editor-client/src/js/ui/common/treeList.js | 6 +++++- .../@node-red/editor-client/src/js/ui/library.js | 10 ++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index cb8fe136f..5e9bb8724 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -676,7 +676,8 @@ RED.clipboard = (function() { done(children); }) } - }]); + }], true); + } function hideDropTarget() { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js index e47ef4ab2..50757e1c7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js @@ -384,7 +384,11 @@ }) return res; } - return s.parent().data('data'); + if (s.length) { + return s.parent().data('data'); + } else { + return undefined; + } } }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js index 1c3c9d15b..e25223f94 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js @@ -431,11 +431,13 @@ RED.library = (function() { focus: function() { dirList.focus(); }, - data: function(content) { + data: function(content,selectFirst) { dirList.treeList('data',content); - // setTimeout(function() { - // dirList.treeList('select',content[0]); - // },100); + if (selectFirst) { + setTimeout(function() { + dirList.treeList('select',content[0]); + },100); + } } } } From d583c68de5dbfc79e70c5272f5c7891cb43ab5f1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 May 2019 11:51:34 +0100 Subject: [PATCH 063/137] Fix error handling in Websocket broadcast function Fixes #2182 --- .../@node-red/nodes/core/io/22-websocket.js | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js index befb8bcff..c04fd77f7 100644 --- a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js @@ -194,20 +194,23 @@ module.exports = function(RED) { } WebSocketListenerNode.prototype.broadcast = function(data) { - try { - if (this.isServer) { - for (let client in this._clients) { - if (this._clients.hasOwnProperty(client)) { + if (this.isServer) { + for (let client in this._clients) { + if (this._clients.hasOwnProperty(client)) { + try { this._clients[client].send(data); + } catch(err) { + this.warn(RED._("websocket.errors.send-error")+" "+client+" "+err.toString()) } } } - else { - this.server.send(data); - } } - catch(e) { // swallow any errors - this.warn("ws:"+i+" : "+e); + else { + try { + this.server.send(data); + } catch(err) { + this.warn(RED._("websocket.errors.send-error")+" "+err.toString()) + } } } From b1b4b3fb63d10908adc280f61b1a0775c0aa3dab Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 May 2019 13:25:03 +0100 Subject: [PATCH 064/137] Ensure tooltip popover doesn't replace normal popover --- .../editor-client/src/js/ui/common/popover.js | 12 +++++++++++- .../@node-red/nodes/locales/en-US/messages.json | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js index 5a1c8718c..00fc0d435 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js @@ -52,6 +52,11 @@ RED.popover = (function() { var openPopup = function(instant) { if (active) { + var existingPopover = target.data("red-ui-popover"); + if (options.tooltip && existingPopover) { + active = false; + return; + } div = $('
'); if (size !== "default") { div.addClass("red-ui-popover-size-"+size); @@ -122,7 +127,10 @@ RED.popover = (function() { } } div.addClass('red-ui-popover-'+d).css({top: top, left: left}); - + if (existingPopover) { + existingPopover.close(true); + } + target.data("red-ui-popover",res) if (instant) { div.show(); } else { @@ -142,6 +150,7 @@ RED.popover = (function() { }); } div = null; + target.removeData("red-ui-popover",res) } } } @@ -236,6 +245,7 @@ RED.popover = (function() { } } return RED.popover.create({ + tooltip: true, target:target, trigger: "hover", size: "small", diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 270434daf..76e1cf2f8 100755 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -139,9 +139,9 @@ "clearLog": "Clear log", "filterLog": "Filter log", "openWindow": "Open in new window", - "copyPath": "copy Path", - "copyPayload": "copy Value", - "pinPath": "pin open" + "copyPath": "Copy path", + "copyPayload": "Copy value", + "pinPath": "Pin open" }, "messageMenu": { "collapseAll": "Collapse all paths", From 109204897f5ec0f6233fa8c82afd2565249d8177 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 May 2019 16:10:21 +0100 Subject: [PATCH 065/137] Fix clipboard export download button --- .../node_modules/@node-red/editor-client/src/js/ui/clipboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 5e9bb8724..bdd57f948 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -59,7 +59,7 @@ RED.clipboard = (function() { element.setAttribute('download', "flows.json"); element.style.display = 'none'; document.body.appendChild(element); - element.trigger("click"); + element.click(); document.body.removeChild(element); $( this ).dialog( "close" ); } From 33e20c9969e90af6b48ca49587743c7f876f53e4 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 28 May 2019 21:43:21 +0100 Subject: [PATCH 066/137] Only add copypath popover if button exists. --- .../node_modules/@node-red/editor-client/src/js/ui/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index 9613b2564..a7b022172 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -125,8 +125,8 @@ RED.utils = (function() { e.stopPropagation(); RED.clipboard.copyText(key,copyPath,"clipboard.copyMessagePath"); }) + RED.popover.tooltip(copyPath,RED._("node-red:debug.sidebar.copyPath")); } - RED.popover.tooltip(copyPath,RED._("node-red:debug.sidebar.copyPath")); var copyPayload = $('').appendTo(copyTools).on("click", function(e) { e.preventDefault(); e.stopPropagation(); From dc75a5812f420d8e6613869676fef11a2dc43100 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 29 May 2019 12:49:35 +0100 Subject: [PATCH 067/137] Handle webscoket item being parseable but not an object better and add test --- .../@node-red/nodes/core/io/22-websocket.js | 3 +++ test/nodes/core/io/22-websocket_spec.js | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js index c04fd77f7..5240b544a 100644 --- a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js @@ -178,6 +178,9 @@ module.exports = function(RED) { if (this.wholemsg) { try { msg = JSON.parse(data); + if (typeof msg !== "object" && !Array.isArray(msg) && (msg !== null)) { + msg = { payload:msg }; + } } catch(err) { msg = { payload:data }; diff --git a/test/nodes/core/io/22-websocket_spec.js b/test/nodes/core/io/22-websocket_spec.js index 40f6b21be..d2af1de28 100644 --- a/test/nodes/core/io/22-websocket_spec.js +++ b/test/nodes/core/io/22-websocket_spec.js @@ -179,6 +179,24 @@ describe('websocket Node', function() { }); }); + it('should receive wholemsg when data not object', function(done) { + var flow = [ + { id: "n1", type: "websocket-listener", path: "/ws", wholemsg: "true" }, + { id: "n2", type: "websocket in", server: "n1", wires: [["n3"]] }, + { id: "n3", type: "helper" }]; + helper.load(websocketNode, flow, function() { + createClient("n1").then(function(sock) { + helper.getNode("n3").on("input", function(msg) { + msg.should.have.property("payload", 123); + done(); + }); + sock.send(123); + }).catch(function(err) { + done(err); + }); + }); + }); + it('should send', function(done) { var flow = [ { id: "n1", type: "websocket-listener", path: "/ws" }, From e56fdecdc63b664aaa1671b2a3e8ef6787128a37 Mon Sep 17 00:00:00 2001 From: Paul Williams Date: Thu, 30 May 2019 09:36:44 +0000 Subject: [PATCH 068/137] Add new shortcut to clear debug message list Clearing the debug message list is globally scoped by default to `ctrl+alt+l`. Mnemonic: similar to clearing a terminal shell using ctrl+l. --- .../node_modules/@node-red/editor-client/src/js/keymap.json | 1 + packages/node_modules/@node-red/nodes/core/core/58-debug.html | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) 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 ea32e66f3..4257960d7 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 @@ -17,6 +17,7 @@ "ctrl-space": "core:toggle-sidebar", "ctrl-p": "core:toggle-palette", "ctrl-,": "core:show-user-settings", + "ctrl-alt-l": "core:clear-debug-messages", "ctrl-alt-r": "core:show-remote-diff", "ctrl-alt-n": "core:new-project", "ctrl-alt-o": "core:open-project", diff --git a/packages/node_modules/@node-red/nodes/core/core/58-debug.html b/packages/node_modules/@node-red/nodes/core/core/58-debug.html index 39d189ca4..9725e8448 100644 --- a/packages/node_modules/@node-red/nodes/core/core/58-debug.html +++ b/packages/node_modules/@node-red/nodes/core/core/58-debug.html @@ -205,6 +205,7 @@ } }; RED.events.on("project:change", this.clearMessageList); + RED.actions.add("core:clear-debug-messages", function() { RED.debug.clearMessageList(true) }); $("#debug-tab-open").click(function(e) { e.preventDefault(); @@ -246,7 +247,8 @@ RED.sidebar.removeTab("debug"); RED.events.off("workspace:change", this.refreshMessageList); window.removeEventListener("message",this.handleWindowMessage); - RED.actions.remove("core:show-debug"); + RED.actions.remove("core:show-debug-tab"); + RED.actions.remove("core:clear-debug-messages"); delete RED._debug; }, From 22855279bd895c47cf59f443b881827844bdf058 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 30 May 2019 14:33:11 +0100 Subject: [PATCH 069/137] ensure input box has focus on repeated quick add --- .../@node-red/editor-client/src/js/ui/typeSearch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js index 7c07f5a18..48c3d01ae 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js @@ -47,7 +47,7 @@ RED.typeSearch = (function() { function createDialog() { dialog = $("
",{id:"red-ui-type-search",class:"red-ui-search red-ui-type-search"}).appendTo("#red-ui-main-container"); var searchDiv = $("
",{class:"red-ui-search-container"}).appendTo(dialog); - searchInput = $('').attr("placeholder",RED._("search.addNode")).appendTo(searchDiv).searchBox({ + searchInput = $('').attr("placeholder",RED._("search.addNode")).appendTo(searchDiv).searchBox({ delay: 50, change: function() { search($(this).val()); @@ -283,7 +283,7 @@ RED.typeSearch = (function() { function refreshTypeList(opts) { var i; searchResults.editableList('empty'); - searchInput.searchBox('value',''); + searchInput.searchBox('value','').focus(); selected = -1; var common = [ 'inject','debug','function','change','switch' From 86947a384d7fca5c33c05ecf2299d4e9aef3bfbb Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Fri, 31 May 2019 08:33:22 -0400 Subject: [PATCH 070/137] Update build-custom-theme.js --- scripts/build-custom-theme.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-custom-theme.js b/scripts/build-custom-theme.js index 129d31313..2ed07a2dc 100644 --- a/scripts/build-custom-theme.js +++ b/scripts/build-custom-theme.js @@ -81,7 +81,7 @@ const result = sass.renderSync({ contents: updatedColors.join("\n") } } - return {file:"/Users/nol/code/node-red/node-red/packages/node_modules/@node-red/editor-client/src/sass/"+url+".scss"} + return {file:"../packages/node_modules/@node-red/editor-client/src/sass/"+url+".scss"} } }); From cf8faac7ef8a73578ba712e03aea6bb80109849a Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Fri, 31 May 2019 22:20:54 +0900 Subject: [PATCH 071/137] fix width calculation of typedInput --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 42c8ffc53..e84aa461c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -426,6 +426,7 @@ if (labelWidth === 0) { var container = $('
').css({ position:"absolute", + "white-space": "nowrap", top:0 }).appendTo(document.body); var newTrigger = label.clone().appendTo(container); From 53ab6f85694d14768cfe4b6250c96ca7de073743 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 1 Jun 2019 13:21:21 +0100 Subject: [PATCH 072/137] Add popovers to context sidebar mini buttons --- .../@node-red/editor-client/locales/en-US/editor.json | 4 +++- .../@node-red/editor-client/src/js/ui/tab-context.js | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 533637005..a591ee14a 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -531,7 +531,9 @@ "flow": "Flow", "global": "Global", "deleteConfirm": "Are you sure you want to delete this item?", - "autoRefresh": "Auto-refresh" + "autoRefresh": "Auto-refresh", + "refrsh": "Refresh", + "delete": "Delete" }, "palette": { "name": "Palette management", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js index 438f483f8..d4554e1f1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js @@ -73,6 +73,7 @@ RED.sidebar.context = (function() { evt.preventDefault(); updateNode(currentNode, true); }) + RED.popover.tooltip(bg,RED._("sidebar.context.refrsh")); // subflowSection = sections.add({ // title: "Subflow", @@ -87,7 +88,7 @@ RED.sidebar.context = (function() { // evt.stopPropagation(); // evt.preventDefault(); // }) - // + // RED.popover.tooltip(bg,RED._("sidebar.context.refrsh")); // subflowSection.container.hide(); flowSection = sections.add({ @@ -107,6 +108,7 @@ RED.sidebar.context = (function() { evt.preventDefault(); updateFlow(currentFlow, true); }) + RED.popover.tooltip(bg,RED._("sidebar.context.refrsh")); globalSection = sections.add({ title: RED._("sidebar.context.global"), @@ -126,7 +128,7 @@ RED.sidebar.context = (function() { evt.preventDefault(); updateEntry(globalSection,"context/global","global"); }) - + RED.popover.tooltip(bg,RED._("sidebar.context.refrsh")); RED.actions.add("core:show-context-tab",show); @@ -272,6 +274,7 @@ RED.sidebar.context = (function() { } }) }); + RED.popover.tooltip(refreshItem,RED._("sidebar.context.refrsh")); var deleteItem = $('').appendTo(tools).on("click", function(e) { e.preventDefault(); e.stopPropagation(); @@ -324,6 +327,7 @@ RED.sidebar.context = (function() { popover.open(); }); + RED.popover.tooltip(deleteItem,RED._("sidebar.context.delete")); var payload = v.msg; var format = v.format; RED.utils.createObjectElement(RED.utils.decodeObject(payload,format), { From 2cc19e7e32416d82f0f94278bb63838125c36f97 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 1 Jun 2019 23:49:27 +0100 Subject: [PATCH 073/137] stop join tripping up if last message of buffer is blank. --- packages/node_modules/@node-red/nodes/core/logic/17-split.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/logic/17-split.js b/packages/node_modules/@node-red/nodes/core/logic/17-split.js index fc13f96a9..09ebd921e 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/17-split.js +++ b/packages/node_modules/@node-red/nodes/core/logic/17-split.js @@ -627,7 +627,9 @@ module.exports = function(RED) { var group = inflight[partId]; if (payloadType === 'buffer') { - inflight[partId].bufferLen += property.length; + if (property !== undefined) { + inflight[partId].bufferLen += property.length; + } } if (payloadType === 'object') { group.payload[propertyKey] = property; From 6b7e623d33c686f48e3f4ace335bb8d847432925 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 6 Jun 2019 11:34:20 +0100 Subject: [PATCH 074/137] Remove some hardcoded css colors --- .../node_modules/@node-red/editor-client/src/sass/jquery.scss | 4 ++++ .../@node-red/editor-client/src/sass/workspace.scss | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss b/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss index 724dafab1..b5b96162d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss @@ -26,6 +26,10 @@ box-shadow: none; } +.ui-widget-header { + color: $header-text-color; +} + /* jQuery Theme overrides */ .ui-tabs .ui-tabs-panel { padding: 0px; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index c71d0c911..f6255eacf 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -123,7 +123,7 @@ pointer-events: none; stroke: $secondary-border-color; strokeWidth: 1; - fill: white; + fill: $view-background; } .red-ui-component-footer { From 617628b88636df686a410b6e5e8b3ba9e21842bf Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 6 Jun 2019 14:16:19 +0100 Subject: [PATCH 075/137] Ensure node help is loaded in the right language Fixes #2195 --- packages/node_modules/@node-red/editor-client/src/js/i18n.js | 4 ++-- packages/node_modules/@node-red/editor-client/src/js/red.js | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/i18n.js b/packages/node_modules/@node-red/editor-client/src/js/i18n.js index 6efa12644..87afc3ebc 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/i18n.js +++ b/packages/node_modules/@node-red/editor-client/src/js/i18n.js @@ -51,7 +51,7 @@ RED.i18n = (function() { }, loadNodeCatalog: function(namespace,done) { - var languageList = i18n.functions.toLanguages(i18n.detectLanguage()); + var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage()); var toLoad = languageList.length; languageList.forEach(function(lang) { $.ajax({ @@ -73,7 +73,7 @@ RED.i18n = (function() { }, loadNodeCatalogs: function(done) { - var languageList = i18n.functions.toLanguages(i18n.detectLanguage()); + var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage()); var toLoad = languageList.length; languageList.forEach(function(lang) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 7d8257da8..e7613103d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -107,9 +107,12 @@ var RED = (function() { } function loadNodes() { + var lang = localStorage.getItem("editor-language")||i18n.detectLanguage(); + $.ajax({ headers: { - "Accept":"text/html" + "Accept":"text/html", + "Accept-Language": lang }, cache: false, url: 'nodes', From a24c66958f0ba345e84f3b4f74b8c9b94c5e8111 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 6 Jun 2019 14:38:21 +0100 Subject: [PATCH 076/137] Fix display of node help when clicking in palette Fixes #2194 --- .../@node-red/editor-client/src/js/ui/palette.js | 5 ++++- .../@node-red/editor-client/src/js/ui/tab-info.js | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 645827d59..4e825f1b7 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -232,8 +232,11 @@ RED.palette = (function() { if (nt.indexOf("subflow:") === 0) { helpText = marked(RED.nodes.subflow(nt.substring(8)).info||"")||(''+RED._("sidebar.info.none")+''); } else { - helpText = $("script[data-help-name='"+d.type+"']").html()||(''+RED._("sidebar.info.none")+''); + helpText = $("script[data-help-name='"+d.attr("data-palette-type")+"']").html()||(''+RED._("sidebar.info.none")+''); } + // Don't look too closely. RED.sidebar.info.set will set the 'Description' + // section of the sidebar. Pass in the title of the Help section so it looks + // right. RED.sidebar.info.set(helpText,RED._("sidebar.info.nodeHelp")); }); var chart = $("#red-ui-workspace-chart"); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index 209e527db..87a845466 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -128,6 +128,7 @@ RED.sidebar.info = (function() { $(propertiesSection.content).empty(); $(infoSection.content).empty(); $(helpSection.content).empty(); + infoSection.title.text(RED._("sidebar.info.desc")); var propRow; @@ -464,7 +465,7 @@ RED.sidebar.info = (function() { propertiesSection.container.hide(); helpSection.container.hide(); infoSection.container.show(); - //helpSection.title.text(title||RED._("sidebar.info.info")); + infoSection.title.text(title||RED._("sidebar.info.desc")); setInfoText(html,infoSection.content); $(".red-ui-sidebar-info-stack").scrollTop(0); } From 457ec86c25754c88ea76b28171adb70db491631d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 6 Jun 2019 17:17:05 +0100 Subject: [PATCH 077/137] Do not allow tab focus on clipboard hidden element --- .../node_modules/@node-red/editor-client/src/js/ui/clipboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index bdd57f948..67fa20364 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -731,7 +731,7 @@ RED.clipboard = (function() { init: function() { setupDialogs(); - $('').appendTo("#red-ui-editor"); + $('').appendTo("#red-ui-editor"); RED.actions.add("core:show-export-dialog",exportNodes); RED.actions.add("core:show-import-dialog",importNodes); From 7d27df1b97b6df073fe7c2c06b356da5fd28615d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 6 Jun 2019 17:17:44 +0100 Subject: [PATCH 078/137] Add shift-cursor handling for moving quick-add dialog --- .../editor-client/src/js/ui/typeSearch.js | 40 +++++++++++++++++-- .../@node-red/editor-client/src/js/ui/view.js | 9 +++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js index 48c3d01ae..d41a6a426 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js @@ -13,6 +13,7 @@ RED.typeSearch = (function() { var activeFilter = ""; var addCallback; var cancelCallback; + var moveCallback; var typesUsed = {}; @@ -44,10 +45,18 @@ RED.typeSearch = (function() { } } + function moveDialog(dx,dy) { + var pos = dialog.position(); + pos.top = (pos.top + dy)+"px"; + pos.left = (pos.left + dx)+"px"; + dialog.css(pos); + moveCallback(dx,dy); + + } function createDialog() { dialog = $("
",{id:"red-ui-type-search",class:"red-ui-search red-ui-type-search"}).appendTo("#red-ui-main-container"); var searchDiv = $("
",{class:"red-ui-search-container"}).appendTo(dialog); - searchInput = $('').attr("placeholder",RED._("search.addNode")).appendTo(searchDiv).searchBox({ + searchInput = $('').attr("placeholder",RED._("search.addNode")).appendTo(searchDiv).searchBox({ delay: 50, change: function() { search($(this).val()); @@ -55,7 +64,19 @@ RED.typeSearch = (function() { }); searchInput.on('keydown',function(evt) { var children = searchResults.children(":visible"); - if (children.length > 0) { + if (evt.keyCode === 40 && evt.shiftKey) { + evt.preventDefault(); + moveDialog(0,10); + } else if (evt.keyCode === 38 && evt.shiftKey) { + evt.preventDefault(); + moveDialog(0,-10); + } else if (evt.keyCode === 39 && evt.shiftKey) { + evt.preventDefault(); + moveDialog(10,0); + } else if (evt.keyCode === 37 && evt.shiftKey) { + evt.preventDefault(); + moveDialog(-10,0); + } else if (children.length > 0) { if (evt.keyCode === 40) { // Down if (selected < children.length-1) { @@ -68,7 +89,6 @@ RED.typeSearch = (function() { ensureSelectedIsVisible(); evt.preventDefault(); } else if (evt.keyCode === 38) { - // Up if (selected > 0) { if (selected < children.length) { $(children[selected]).removeClass('selected'); @@ -79,6 +99,7 @@ RED.typeSearch = (function() { ensureSelectedIsVisible(); evt.preventDefault(); } else if ((evt.metaKey || evt.ctrlKey) && evt.keyCode === 13 ) { + evt.preventDefault(); // (ctrl or cmd) and enter var index = Math.max(0,selected); if (index < children.length) { @@ -90,8 +111,12 @@ RED.typeSearch = (function() { addCallback(n.type,true); } $("#red-ui-type-search-input").val("").trigger("keyup"); + setTimeout(function() { + $("#red-ui-type-search-input").focus(); + },100); } } else if (evt.keyCode === 13) { + evt.preventDefault(); // Enter var index = Math.max(0,selected); if (index < children.length) { @@ -99,6 +124,12 @@ RED.typeSearch = (function() { confirm($(children[index]).find(".red-ui-editableList-item-content").data('data')); } } + } else { + if (evt.keyCode === 13 ) { + // Stop losing focus if [Cmd]-Enter is pressed on an empty list + evt.stopPropagation(); + evt.preventDefault(); + } } }); @@ -137,7 +168,7 @@ RED.typeSearch = (function() { if (object.separator) { container.addClass("red-ui-search-result-separator") } - var div = $('',{href:'#',class:"red-ui-search-result"}).appendTo(container); + var div = $('
',{class:"red-ui-search-result"}).appendTo(container); var nodeDiv = $('
',{class:"red-ui-search-result-node"}).appendTo(div); var colour = RED.utils.getNodeColor(object.type,def); @@ -219,6 +250,7 @@ RED.typeSearch = (function() { refreshTypeList(opts); addCallback = opts.add; cancelCallback = opts.cancel; + moveCallback = opts.move; RED.events.emit("type-search:open"); //shade.show(); if ($("#red-ui-main-container").height() - opts.y - 150 < 0) { 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 d3d18bdb4..d959466e8 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 @@ -773,6 +773,15 @@ RED.view = (function() { x:d3.event.clientX-mainPos.left-node_width/2 - (ox-point[0]), y:d3.event.clientY-mainPos.top+ node_height/2 + 5 - (oy-point[1]), filter: filter, + move: function(dx,dy) { + if (ghostNode) { + var pos = d3.transform(ghostNode.attr("transform")).translate; + ghostNode.attr("transform","translate("+(pos[0]+dx)+","+(pos[1]+dy)+")") + point[0] += dx; + point[1] += dy; + rebuildQuickAddLink(); + } + }, cancel: function() { if (quickAddLink) { if (quickAddLink.el) { From f0aef2b853bd3149291cfdcc98165cefc10ce587 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 11:35:04 +0100 Subject: [PATCH 079/137] Add show-library dialog actions --- .../editor-client/src/js/ui/clipboard.js | 22 +++++++++---------- .../editor-client/src/js/ui/keyboard.js | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 67fa20364..6971dc787 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -396,14 +396,6 @@ RED.clipboard = (function() { label: RED._("library.types.examples") }); - tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+mode); - if (mode === 'clipboard') { - setTimeout(function() { - $("#red-ui-clipboard-dialog-import-text").trigger("focus"); - },100) - } - - $("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename); $("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)}); $("#red-ui-clipboard-dialog-export").button("enable"); @@ -475,6 +467,14 @@ RED.clipboard = (function() { $("#red-ui-clipboard-dialog-import-file-upload").trigger("click"); }) + tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+mode); + if (mode === 'clipboard') { + setTimeout(function() { + $("#red-ui-clipboard-dialog-import-text").trigger("focus"); + },100) + } + + dialog.dialog("option","title",RED._("clipboard.importNodes")).dialog("open"); popover = RED.popover.create({ target: $("#red-ui-clipboard-dialog-import-text"), @@ -521,8 +521,6 @@ RED.clipboard = (function() { label: RED._("library.library") }); - tabs.activateTab("red-ui-clipboard-dialog-export-tab-"+mode); - $("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename); $("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)}); $("#red-ui-clipboard-dialog-export").button("enable"); @@ -638,6 +636,7 @@ RED.clipboard = (function() { } else { $("#red-ui-clipboard-dialog-export-fmt-mini").trigger("click"); } + tabs.activateTab("red-ui-clipboard-dialog-export-tab-"+mode); dialog.dialog("option","title",RED._("clipboard.exportNodes")).dialog( "open" ); $("#red-ui-clipboard-dialog-export-text").trigger("focus"); @@ -736,7 +735,8 @@ RED.clipboard = (function() { RED.actions.add("core:show-export-dialog",exportNodes); RED.actions.add("core:show-import-dialog",importNodes); - RED.actions.add("core:library-export",function() { exportNodes('library') }); + RED.actions.add("core:show-library-export-dialog",function() { exportNodes('library') }); + RED.actions.add("core:show-library-import-dialog",function() { importNodes('library') }); RED.events.on("editor:open",function() { disabled = true; }); RED.events.on("editor:close",function() { disabled = false; }); 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 b264f3bd8..524c1c16e 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, From f8dd68ecc4ac0260b248ceebfeb47bd2128aa62d Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Fri, 7 Jun 2019 21:35:36 +0900 Subject: [PATCH 080/137] Add support for env var propety in switch node --- .../@node-red/nodes/core/logic/10-switch.html | 2 +- test/nodes/core/logic/10-switch_spec.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/logic/10-switch.html b/packages/node_modules/@node-red/nodes/core/logic/10-switch.html index 45ee7a8ad..fa3046c0f 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/10-switch.html +++ b/packages/node_modules/@node-red/nodes/core/logic/10-switch.html @@ -128,7 +128,7 @@ var node = this; var previousValueType = {value:"prev",label:this._("inject.previous"),hasValue:false}; - $("#node-input-property").typedInput({default:this.propertyType||'msg',types:['msg','flow','global','jsonata']}); + $("#node-input-property").typedInput({default:this.propertyType||'msg',types:['msg','flow','global','jsonata','env']}); var outputCount = $("#node-input-outputs").val("{}"); var andLabel = this._("switch.and"); diff --git a/test/nodes/core/logic/10-switch_spec.js b/test/nodes/core/logic/10-switch_spec.js index b33f436fc..899e6edef 100644 --- a/test/nodes/core/logic/10-switch_spec.js +++ b/test/nodes/core/logic/10-switch_spec.js @@ -818,6 +818,14 @@ describe('switch Node', function() { }); }); + it('should handle env var expression', function(done) { + var flow = [{id:"switchNode1",type:"switch",name:"switchNode",property:"VAR",propertyType:"env",rules:[{"t":"eq","v":"VAL"}],checkall:true,outputs:1,wires:[["helperNode1"]]}, + {id:"helperNode1", type:"helper", wires:[]}]; + process.env.VAR = "VAL"; + customFlowSwitchTest(flow, true, "OK", done); + }); + + it('should take head of message sequence (no repair)', function(done) { var flow = [{id:"switchNode1",type:"switch",name:"switchNode",property:"payload",rules:[{"t":"head","v":3}],checkall:false,repair:false,outputs:1,wires:[["helperNode1"]]}, {id:"helperNode1", type:"helper", wires:[]}]; From 6587d12fbd014c6dc352a26332db60b969b321fd Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Fri, 7 Jun 2019 21:39:12 +0900 Subject: [PATCH 081/137] update info text --- .../@node-red/nodes/locales/en-US/logic/10-switch.html | 2 +- .../@node-red/nodes/locales/ja/logic/10-switch.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/logic/10-switch.html b/packages/node_modules/@node-red/nodes/locales/en-US/logic/10-switch.html index 2513b68e9..fb9af2a77 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/logic/10-switch.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/logic/10-switch.html @@ -22,7 +22,7 @@

Optionally, the node can be set to stop evaluating rules once it finds one that matches.

The rules can be evaluated against an individual message property, a flow or global - context property or the result of a JSONata expression.

+ context property, environment variable or the result of a JSONata expression.

Rules

There are four types of rule:

    diff --git a/packages/node_modules/@node-red/nodes/locales/ja/logic/10-switch.html b/packages/node_modules/@node-red/nodes/locales/ja/logic/10-switch.html index 8b73203a5..91ed9a717 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/logic/10-switch.html +++ b/packages/node_modules/@node-red/nodes/locales/ja/logic/10-switch.html @@ -19,7 +19,7 @@

    詳細

    受信したメッセージに対し、指定されたルールを順に評価し、マッチしたルールに対応する出力ポートにメッセージを送出します。

    最初にルールがマッチしたところで評価を止めることも可能です。

    -

    評価ルールには、メッセージプロパティ、フローコンテキスト/グローバルコンテキストのプロパティ、JSONata式の評価結果が利用できます。

    +

    評価ルールには、メッセージプロパティ、フローコンテキスト/グローバルコンテキストのプロパティ、環境変数、JSONata式の評価結果が利用できます。

    ルール

    振り分けルールは以下の4つに分類されます。

      From eed3a749db558c3aae0fef822b31479511850b31 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 14:34:35 +0100 Subject: [PATCH 082/137] Fix undefined error on typedInput due to valueLabel used before being added --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index e84aa461c..e9b53c912 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -225,6 +225,8 @@ this.selectLabel = $('').appendTo(this.selectTrigger); + this.valueLabelContainer = $('
      ').appendTo(this.uiSelect) + this.types(this.options.types); if (this.options.typeField) { @@ -261,8 +263,6 @@ that.uiSelect.addClass('red-ui-typedInput-focus'); }) - this.valueLabelContainer = $('
      ').appendTo(this.uiSelect) - // explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline' this.optionSelectTrigger = $('').appendTo(this.uiSelect); this.optionSelectLabel = $('').prependTo(this.optionSelectTrigger); From 6f08bd6fc5fbc800ea036085c851cb4dee10e15f Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 14:35:10 +0100 Subject: [PATCH 083/137] Fix delete-all action on config node sidebar --- .../@node-red/editor-client/src/js/ui/tab-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2c339f044..c7131aa7e 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 @@ -257,7 +257,7 @@ RED.sidebar.config = (function() { RED.actions.add("core:delete-config-selection", function() { var selectedNodes = []; $(content).find(".red-ui-palette-node.selected").each(function() { - selectedNodes.push($(this).data('node')); + selectedNodes.push($(this).parent().data('node')); }); if (selectedNodes.length > 0) { var historyEvent = { From 460e3ad39582efab1d89470a79b8f5773d3fc307 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 14:35:22 +0100 Subject: [PATCH 084/137] Fix select-all action in main view --- .../@node-red/editor-client/src/js/ui/view.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 d959466e8..d5a76eacd 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 @@ -1412,11 +1412,11 @@ RED.view = (function() { return; } } - } - if (!n.selected) { - n.selected = true; - n.dirty = true; - moving_set.push({n:n}); + if (!n.selected) { + n.selected = true; + n.dirty = true; + moving_set.push({n:n}); + } } }); if (mouse_mode !== RED.state.SELECTING_NODE && activeSubflow) { From 4cd6e20c9159639cdd7114cee0b15610d8c4be51 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 15:13:49 +0100 Subject: [PATCH 085/137] Fix undo of flow disable state change --- .../node_modules/@node-red/editor-client/src/js/history.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/history.js b/packages/node_modules/@node-red/editor-client/src/js/history.js index 2e256564c..930598dd5 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/history.js +++ b/packages/node_modules/@node-red/editor-client/src/js/history.js @@ -214,6 +214,10 @@ RED.history = (function() { ev.node[i] = ev.changes[i]; } } + if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('disabled')) { + $("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!ev.node.disabled); + $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!ev.node.disabled); + } if (ev.subflow) { if (ev.subflow.hasOwnProperty('inputCount')) { if (ev.node.in.length > ev.subflow.inputCount) { From 400071879f033b9508b70b8facab737126cae6bd Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 15:14:21 +0100 Subject: [PATCH 086/137] Add enable/disable-flow actions --- .../editor-client/src/js/ui/workspaces.js | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index fe87f4bbe..3fffe2e64 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -60,6 +60,13 @@ RED.workspaces = (function() { function showEditWorkspaceDialog(id) { var workspace = RED.nodes.workspace(id); + if (!workspace) { + var subflow = RED.nodes.subflow(id); + if (subflow) { + RED.editor.editSubflow(subflow); + } + return; + } RED.view.state(RED.state.EDITING); var tabflowEditor; var trayOptions = { @@ -331,6 +338,8 @@ RED.workspaces = (function() { RED.actions.add("core:add-flow",function(opts) { addWorkspace(undefined,undefined,opts?opts.index:undefined)}); RED.actions.add("core:edit-flow",editWorkspace); RED.actions.add("core:remove-flow",removeWorkspace); + RED.actions.add("core:enable-flow",enableWorkspace); + RED.actions.add("core:disable-flow",disableWorkspace); RED.actions.add("core:list-flows",function() { RED.actions.invoke("core:search","type:tab "); @@ -343,6 +352,48 @@ RED.workspaces = (function() { showEditWorkspaceDialog(id||activeWorkspace); } + function enableWorkspace(id) { + setWorkspaceState(id,false); + } + function disableWorkspace(id) { + setWorkspaceState(id,true); + } + function setWorkspaceState(id,disabled) { + var workspace = RED.nodes.workspace(id||activeWorkspace); + if (!workspace) { + return; + } + if (workspace.disabled !== disabled) { + var changes = { disabled: workspace.disabled }; + workspace.disabled = disabled; + $("#red-ui-tab-"+(workspace.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!workspace.disabled); + $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!workspace.disabled); + var historyEvent = { + t: "edit", + changes:changes, + node: workspace, + dirty: RED.nodes.dirty() + } + workspace.changed = true; + RED.history.push(historyEvent); + RED.nodes.dirty(true); + RED.sidebar.config.refresh(); + var selection = RED.view.selection(); + if (!selection.nodes && !selection.links) { + RED.sidebar.info.refresh(workspace); + } + if (changes.hasOwnProperty('disabled')) { + RED.nodes.eachNode(function(n) { + if (n.z === workspace.id) { + n.dirty = true; + } + }); + RED.view.redraw(); + } + } + } + + function removeWorkspace(ws) { if (!ws) { deleteWorkspace(RED.nodes.workspace(activeWorkspace)); @@ -406,6 +457,8 @@ RED.workspaces = (function() { }, resize: function() { workspace_tabs.resize(); - } + }, + enable: enableWorkspace, + disable: disableWorkspace } })(); From c97786e12cc1be88207c01fa47d75a38a6349a7f Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 8 Jun 2019 20:42:14 +0100 Subject: [PATCH 087/137] Improve handling of file upload in request node formData can only be Strings or Buffers - anything else will cause errors. To help matters, we now look for invalid types and json-encode them where needed. --- .../@node-red/nodes/core/io/21-httprequest.js | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js index d72e16bad..ec5290835 100644 --- a/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/io/21-httprequest.js @@ -203,8 +203,28 @@ module.exports = function(RED) { var payload = null; if (method !== 'GET' && method !== 'HEAD' && typeof msg.payload !== "undefined") { - if (opts.headers['content-type'] == 'multipart/form-data' && typeof payload === "object") { - opts.formData = msg.payload; + if (opts.headers['content-type'] == 'multipart/form-data' && typeof msg.payload === "object") { + opts.formData = {}; + + for (var opt in msg.payload) { + if (msg.payload.hasOwnProperty(opt)) { + var val = msg.payload[opt]; + if (val !== undefined && val !== null) { + if (typeof val === 'string' || Buffer.isBuffer(val)) { + opts.formData[opt] = val; + } else if (typeof val === 'object' && val.hasOwnProperty('value')) { + // Treat as file to upload - ensure it has an options object + // as request complains if it doesn't + if (!val.hasOwnProperty('options')) { + val.options = {}; + } + opts.formData[opt] = val; + } else { + opts.formData[opt] = JSON.stringify(val); + } + } + } + } } else { if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) { payload = msg.payload; From ccc3809daa3b03e7171cb6f4ccf4d6e0f1188bef Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 9 Jun 2019 17:32:14 +0100 Subject: [PATCH 088/137] Make 'anything else' template more explicit --- .github/ISSUE_TEMPLATE/-anything-else.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/-anything-else.md b/.github/ISSUE_TEMPLATE/-anything-else.md index dbf28e501..836c78967 100644 --- a/.github/ISSUE_TEMPLATE/-anything-else.md +++ b/.github/ISSUE_TEMPLATE/-anything-else.md @@ -7,8 +7,11 @@ assignees: '' --- -Please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). +Please DO NOT raise an issue. -You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`. +We DO NOT use the issue tracker for general support or feature requests. Only bug reports should be raised here using the 'Bug report' template. +For general support, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`. That way the whole Node-RED user community can help, rather than rely on the core development team. + +For feature requests, please use the Node-RED Forum](https://discourse.nodered.org). Many ideas have already been discussed there and you should search that for your request before starting a new discussion. From e3e0378857f04d12d94860bf8859a00fb63f43fd Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 11 Jun 2019 14:44:44 +0100 Subject: [PATCH 089/137] Add visual json editor --- .../editor-client/locales/en-US/editor.json | 11 +- .../src/js/ui/common/editableList.js | 14 +- .../src/js/ui/common/treeList.js | 344 +++++++++--- .../src/js/ui/common/typedInput.js | 13 + .../editor-client/src/js/ui/editors/json.js | 520 +++++++++++++++++- .../editor-client/src/sass/editor.scss | 111 ++++ 6 files changed, 923 insertions(+), 90 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index a591ee14a..37e51adf1 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -739,7 +739,16 @@ }, "jsonEditor": { "title": "JSON editor", - "format": "format JSON" + "format": "format JSON", + "rawMode": "Edit JSON", + "uiMode": "Visual editor", + "insertAbove": "Insert above", + "insertBelow": "Insert below", + "addItem": "Add item", + "copyPath": "Copy path to item", + "expandItems": "Expand items", + "collapseItems": "Collapse items", + "duplicate": "Duplicate" }, "markdownEditor": { "title": "Markdown editor", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index 0464866f7..a41ee423d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -185,6 +185,7 @@ } }, _destroy: function() { + this.topContainer.remove(); }, _refreshFilter: function() { var that = this; @@ -230,7 +231,7 @@ this.uiHeight = desiredHeight; this._resize(); }, - addItem: function(data) { + insertItemAt: function(data,index) { var that = this; data = data || {}; var li = $('
    1. '); @@ -248,7 +249,13 @@ }); } if (!added) { - li.appendTo(this.element); + if (index <= 0) { + li.prependTo(this.element); + } else if (index > that.element.children().length-1) { + li.appendTo(this.element); + } else { + li.insertBefore(this.element.children().eq(index)); + } } var row = $('
      ').addClass("red-ui-editableList-item-content").appendTo(li); row.data('data',data); @@ -293,6 +300,9 @@ },0); } }, + addItem: function(data) { + this.insertItemAt(data,this.element.children().length) + }, addItems: function(items) { for (var i=0; i").css({width: "100%", height: "100%"}).treeList({data:[...]}) * treeList.on('treelistselect', function(e,item) { console.log(item)}) * treeList.treeList('data',[ ... ] ) * + * + * After `data` has been added to the tree, each item is augmented the following + * properties and functions: + * + * item.parent - set to the parent item + * item.treeList.container + * item.treeList.label - the label element for the item + * item.treeList.depth - the depth in the tree (0 == root) + * item.treeList.parentList - the editableList instance this item is in + * item.treeList.remove() - removes the item from the tree + * item.treeList.makeLeaf(detachChildElements) - turns an element with children into a leaf node, + * removing the UI decoration etc. + * detachChildElements - any children with custom + * elements will be detached rather than removed + * so jQuery event handlers are preserved in case + * the child elements need to be reattached later + * item.treeList.makeParent(children) - turns an element into a parent node, adding the necessary + * UI decoration. + * item.treeList.insertChildAt(newItem,position,select) - adds a child item an the specified position. + * Optionally selects the item after adding. + * item.treeList.addChild(newItem,select) - appends a child item. + * Optionally selects the item after adding. + * item.treeList.expand(done) - expands the parent item to show children. Optional 'done' callback. + * item.treeList.collapse() - collapse the parent item to hide children. + * + * + * + * */ $.widget( "nodered.treeList", { @@ -116,20 +152,30 @@ }); this._data = []; - this._topList = $('
        ').css({ + this._topList = $('
          ').css({ position:'absolute', top: 0, left:0, right:0, bottom:0 - }).appendTo(wrapper).editableList({ + }).appendTo(wrapper); + + var topListOptions = { addButton: false, scrollOnAdd: false, height: '100%', addItem: function(container,i,item) { that._addSubtree(that._topList,container,item,0); } - }) + }; + if (this.options.rootSortable !== false && !!this.options.sortable) { + topListOptions.sortable = this.options.sortable; + topListOptions.connectWith = '.red-ui-treeList-sortable'; + this._topList.addClass('red-ui-treeList-sortable'); + } + this._topList.editableList(topListOptions) + + if (this.options.data) { this.data(this.options.data); } @@ -171,23 +217,82 @@ }, _addChildren: function(container,parent,children,depth) { var that = this; - var subtree = $('
            ').appendTo(container).editableList({ + var subtree = $('
              ').appendTo(container).editableList({ + connectWith: ".red-ui-treeList-sortable", + sortable: that.options.sortable, addButton: false, scrollOnAdd: false, height: 'auto', addItem: function(container,i,item) { that._addSubtree(subtree,container,item,depth+1); + }, + sortItems: function(data) { + var children = []; + var reparented = []; + data.each(function() { + var child = $(this).data('data'); + children.push(child); + var evt = that._fixDepths(parent,child); + if (evt) { + reparented.push(evt); + } + }) + if (Array.isArray(parent.children)) { + parent.children = children; + } + reparented.forEach(function(evt) { + that._trigger("changeparent",null,evt); + }); + that._trigger("sort",null,parent); } }); + if (!!that.options.sortable) { + subtree.addClass('red-ui-treeList-sortable'); + } for (var i=0;i",{class:"red-ui-treeList-label"}).appendTo(container); item.treeList.label = label; if (item.class) { label.addClass(item.class); } - label.css({ - paddingLeft: (depth*15)+'px' - }) + if (item.gutter) { + item.gutter.css({ + position: 'absolute' + }).appendTo(label) + + } + var labelPaddingWidth = (item.gutter?item.gutter.width()+2:0)+(depth*20); + item.treeList.labelPadding = $('').css({ + display: "inline-block", + width: labelPaddingWidth+'px' + }).appendTo(label); + label.on('mouseover',function(e) { that._trigger('itemmouseover',e,item); }) label.on('mouseout',function(e) { that._trigger('itemmouseout',e,item); }) label.on('mouseenter',function(e) { that._trigger('itemmouseenter',e,item); }) label.on('mouseleave',function(e) { that._trigger('itemmouseleave',e,item); }) - if (item.children) { - item.treeList.addChild = function(newItem,select) { - item.treeList.childList.editableList('addItem',newItem) - newItem.parent = item; - item.children.push(newItem); - if (select) { - setTimeout(function() { - that.select(newItem) - },100); - } + item.treeList.makeLeaf = function(detachChildElements) { + if (!treeListIcon.children().length) { + // Already a leaf + return } - item.treeList.expand = function(done) { - if (container.hasClass("expanded")) { - done && done(); - return; - } - if (!container.hasClass("built") && typeof item.children === 'function') { - container.addClass('built'); - var childrenAdded = false; - var spinner; - var startTime = 0; - item.children(function(children) { - childrenAdded = true; - item.treeList.childList = that._addChildren(container,item,children,depth).hide(); - var delta = Date.now() - startTime; - if (delta < 400) { - setTimeout(function() { - item.treeList.childList.slideDown('fast'); - if (spinner) { - spinner.remove(); - } - },400-delta); - } else { - item.treeList.childList.slideDown('fast'); - if (spinner) { - spinner.remove(); + if (detachChildElements && item.children) { + var detachChildren = function(item) { + if (item.children) { + item.children.forEach(function(child) { + if (child.element) { + child.element.detach(); } - } - done && done(); - that._trigger("childrenloaded",null,item) - },item); - if (!childrenAdded) { - startTime = Date.now(); - spinner = $('
              ').css({ - "background-position": (35+depth*15)+'px 50%' - }).appendTo(container); + if (child.gutter) { + child.gutter.detach(); + } + detachChildren(child); + }); } - - } else { - item.treeList.childList.slideDown('fast'); - done && done(); } - container.addClass("expanded"); + detachChildren(item); } - item.treeList.collapse = function() { - item.treeList.childList.slideUp('fast'); - container.removeClass("expanded"); + treeListIcon.empty(); + if (!item.deferBuild) { + item.treeList.childList.remove(); + delete item.treeList.childList; } - - $('').appendTo(label); + label.off("click.red-ui-treeList-expand"); + treeListIcon.off("click.red-ui-treeList-expand"); + delete item.children; + container.removeClass("expanded"); + } + item.treeList.makeParent = function(children) { + if (treeListIcon.children().length) { + // Already a parent because we've got the angle-right icon + return; + } + $('').appendTo(treeListIcon); + treeListIcon.on("click.red-ui-treeList-expand", function(e) { + e.stopPropagation(); + e.preventDefault(); + if (container.hasClass("expanded")) { + item.treeList.collapse(); + } else { + item.treeList.expand(); + } + }); // $('').appendTo(label); - label.on("click", function(e) { + label.on("click.red-ui-treeList-expand", function(e) { if (container.hasClass("expanded")) { if (item.hasOwnProperty('selected') || label.hasClass("selected")) { item.treeList.collapse(); @@ -285,9 +383,97 @@ item.treeList.expand(); } }) - } else { - $('').appendTo(label); + if (!item.children) { + item.children = children||[]; + item.treeList.childList = that._addChildren(container,item,item.children,depth).hide(); + } } + item.treeList.insertChildAt = function(newItem,position,select) { + newItem.parent = item; + item.children.splice(position,0,newItem); + + if (!item.deferBuild) { + item.treeList.childList.editableList('insertItemAt',newItem,position) + if (select) { + setTimeout(function() { + that.select(newItem) + },100); + } + that._trigger("sort",null,item); + } + } + item.treeList.addChild = function(newItem,select) { + item.treeList.insertChildAt(newItem,item.children.length,select); + } + item.treeList.expand = function(done) { + if (!item.children) { + return; + } + if (container.hasClass("expanded")) { + done && done(); + return; + } + if (!container.hasClass("built") && (item.deferBuild || typeof item.children === 'function')) { + container.addClass('built'); + var childrenAdded = false; + var spinner; + var startTime = 0; + var completeBuild = function(children) { + childrenAdded = true; + item.treeList.childList = that._addChildren(container,item,children,depth).hide(); + var delta = Date.now() - startTime; + if (delta < 400) { + setTimeout(function() { + item.treeList.childList.slideDown('fast'); + if (spinner) { + spinner.remove(); + } + },400-delta); + } else { + item.treeList.childList.slideDown('fast'); + if (spinner) { + spinner.remove(); + } + } + done && done(); + that._trigger("childrenloaded",null,item) + } + if (typeof item.children === 'function') { + item.children(completeBuild,item); + } else { + delete item.deferBuild; + completeBuild(item.children); + } + if (!childrenAdded) { + startTime = Date.now(); + spinner = $('
              ').css({ + "background-position": (35+depth*20)+'px 50%' + }).appendTo(container); + } + + } else { + if (that._loadingData) { + item.treeList.childList.show(); + } else { + item.treeList.childList.slideDown('fast'); + } + done && done(); + } + container.addClass("expanded"); + } + item.treeList.collapse = function() { + if (!item.children) { + return; + } + item.treeList.childList.slideUp('fast'); + container.removeClass("expanded"); + } + + var treeListIcon = $('').appendTo(label); + if (item.children) { + item.treeList.makeParent(); + } + if (item.hasOwnProperty('selected')) { var selectWrapper = $('').appendTo(label); var cb = $('').prop('checked',item.selected).appendTo(selectWrapper); @@ -326,19 +512,22 @@ if (item.icon) { $('').appendTo(label); } - if (item.label || item.sublabel) { - if (item.label) { + if (item.hasOwnProperty('label') || item.hasOwnProperty('sublabel')) { + if (item.hasOwnProperty('label')) { $('').text(item.label).appendTo(label); } - if (item.sublabel) { + if (item.hasOwnProperty('sublabel')) { $('').text(item.sublabel).appendTo(label); } } else if (item.element) { $(item.element).appendTo(label); + $(item.element).css({ + width: "calc(100% - "+(labelPaddingWidth+20+(item.icon?20:0))+"px)" + }) } if (item.children) { - if (Array.isArray(item.children)) { + if (Array.isArray(item.children) && !item.deferBuild) { item.treeList.childList = that._addChildren(container,item,item.children,depth).hide(); } if (item.expanded) { @@ -350,12 +539,17 @@ this._topList.editableList('empty'); }, data: function(items) { + var that = this; if (items !== undefined) { this._data = items; this._topList.editableList('empty'); + this._loadingData = true; for (var i=0; i= 37 && evt.keyCode <= 40) { + evt.stopPropagation(); + } }) this.selectTrigger.on("click", function(event) { event.preventDefault(); + event.stopPropagation(); that._showTypeMenu(); }); this.selectTrigger.on('keydown',function(evt) { @@ -259,6 +265,7 @@ // Down that._showTypeMenu(); } + evt.stopPropagation(); }).on('focus', function() { that.uiSelect.addClass('red-ui-typedInput-focus'); }) @@ -271,12 +278,14 @@ }); this.optionSelectTrigger.on("click", function(event) { event.preventDefault(); + event.stopPropagation(); that._showOptionSelectMenu(); }).on('keydown', function(evt) { if (evt.keyCode === 40) { // Down that._showOptionSelectMenu(); } + evt.stopPropagation(); }).on('blur', function() { that.uiSelect.removeClass('red-ui-typedInput-focus'); }).on('focus', function() { @@ -357,6 +366,7 @@ op.on("click", function(event) { event.preventDefault(); + event.stopPropagation(); callback(opt.value); that._hideMenu(menu); }); @@ -376,9 +386,11 @@ // UP $(this).children(":focus").prev().trigger("focus"); } else if (evt.keyCode === 27) { + // ESCAPE evt.preventDefault(); that._hideMenu(menu); } + evt.stopPropagation(); }) @@ -516,6 +528,7 @@ this.optionMenu.remove(); } this.menu.remove(); + this.uiSelect.remove(); }, types: function(types) { var that = this; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js index 7655e991c..26b84ecaa 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js @@ -16,7 +16,419 @@ (function() { - var template = ''; + // var template = ''; + var template = ''; + + var activeTab; + + function insertNewItem(parent,index,copyIndex) { + var newValue = ""; + + if (parent.children.length > 0) { + switch (parent.children[Math.max(0,Math.min(parent.children.length-1,copyIndex))].type) { + case 'string': newValue = ""; break; + case 'number': newValue = 0; break; + case 'boolean': newValue = true; break; + case 'null': newValue = null; break; + case 'object': newValue = {}; break; + case 'array': newValue = []; break; + } + } + var newKey; + if (parent.type === 'array') { + newKey = parent.children.length; + } else { + var usedKeys = {}; + parent.children.forEach(function(child) { usedKeys[child.key] = true }) + var keyRoot = "item"; + var keySuffix = 2; + newKey = keyRoot; + while(usedKeys[newKey]) { + newKey = keyRoot+"-"+(keySuffix++); + } + } + var newItem = handleItem(newKey,newValue,parent.depth+1,parent); + parent.treeList.insertChildAt(newItem, index, true); + parent.treeList.expand(); + } + function showObjectMenu(button,item) { + var elementPos = button.offset(); + var options = []; + if (item.parent) { + options.push({id:"red-ui-editor-type-json-menu-insert-above", icon:"fa fa-toggle-up", label:RED._('jsonEditor.insertAbove'),onselect:function(){ + var index = item.parent.children.indexOf(item); + insertNewItem(item.parent,index,index); + }}); + options.push({id:"red-ui-editor-type-json-menu-insert-below", icon:"fa fa-toggle-down", label:RED._('jsonEditor.insertBelow'),onselect:function(){ + var index = item.parent.children.indexOf(item)+1; + insertNewItem(item.parent,index,index-1); + }}); + } + if (item.type === 'array' || item.type === 'object') { + options.push({id:"red-ui-editor-type-json-menu-add-child", icon:"fa fa-plus", label:RED._('jsonEditor.addItem'),onselect:function(){ + insertNewItem(item,item.children.length,item.children.length-1); + }}); + } + if (item.parent) { + options.push({id:"red-ui-editor-type-json-menu-copy-path", icon:"fa fa-terminal", label:RED._('jsonEditor.copyPath'),onselect:function(){ + var i = item; + var path = ""; + var newPath; + while(i.parent) { + if (i.parent.type === "array") { + newPath = "["+i.key+"]"; + } else { + if (/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(i.key)) { + newPath = i.key; + } else { + newPath = "[\""+i.key.replace(/"/,"\\\"")+"\"]" + } + } + path = newPath+(path.length>0 && path[0] !== "["?".":"")+path; + i = i.parent; + } + RED.clipboard.copyText(path,item.element,"clipboard.copyMessagePath"); + }}); + + options.push({id:"red-ui-editor-type-json-menu-duplicate", icon:"fa fa-copy", label:RED._("jsonEditor.duplicate"),onselect:function(){ + var newKey = item.key; + if (item.parent.type === 'array') { + newKey = parent.children.length; + } else { + var m = /^(.*?)(-(\d+))?$/.exec(newKey); + var usedKeys = {}; + item.parent.children.forEach(function(child) { usedKeys[child.key] = true }) + var keyRoot = m[1]; + var keySuffix = 2; + if (m[3] !== undefined) { + keySuffix = parseInt(m[3]); + } + newKey = keyRoot; + while(usedKeys[newKey]) { + newKey = keyRoot+"-"+(keySuffix++); + } + } + var newItem = handleItem(newKey,convertToObject(item),item.parent.depth+1,item.parent); + var index = item.parent.children.indexOf(item)+1; + + item.parent.treeList.insertChildAt(newItem, index, true); + item.parent.treeList.expand(); + }}); + + options.push({id:"red-ui-editor-type-json-menu-delete", icon:"fa fa-times", label:RED._('common.label.delete'),onselect:function(){ + item.treeList.remove(); + }}); + } + if (item.type === 'array' || item.type === 'object') { + options.push(null) + options.push({id:"red-ui-editor-type-json-menu-expand-children",icon:"fa fa-angle-double-down", label:RED._('jsonEditor.expandItems'),onselect:function(){ + item.treeList.expand(); + item.children.forEach(function(child) { + child.treeList.expand(); + }) + }}); + options.push({id:"red-ui-editor-type-json-menu-collapse-children",icon:"fa fa-angle-double-up", label:RED._('jsonEditor.collapseItems'),onselect:function(){ + item.children.forEach(function(child) { + child.treeList.collapse(); + }) + }}); + } + + var menuOptionMenu = RED.menu.init({ + id:"red-ui-editor-type-json-menu", + options: options + }); + menuOptionMenu.css({ + position: "absolute" + }) + menuOptionMenu.on('mouseleave', function(){ $(this).hide() }); + menuOptionMenu.on('mouseup', function() { $(this).hide() }); + menuOptionMenu.appendTo("body"); + var top = elementPos.top; + var height = menuOptionMenu.height(); + var winHeight = $(window).height(); + if (top+height > winHeight) { + top -= (top+height)-winHeight + 20; + } + menuOptionMenu.css({ + top: top+"px", + left: elementPos.left+"px" + }) + menuOptionMenu.show(); + } + + function parseObject(obj,depth,parent) { + var result = []; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + result.push(handleItem(prop,obj[prop],depth,parent)); + } + } + return result; + } + function parseArray(obj,depth,parent) { + var result = []; + var l = obj.length; + for (var i=0;i'); + if (key != null) { + item.key = key; + var keyText; + if (typeof key === 'string') { + keyText = '"'+key+'"'; + } else { + keyText = key; + } + var keyLabel = $('').text(keyText).appendTo(container); + keyLabel.addClass('red-ui-debug-msg-type-'+(typeof key)); + if (parent && parent.type === "array") { + keyLabel.addClass("red-ui-editor-type-json-editor-label-array-key") + } + + keyLabel.on("click", function(evt) { + if (item.parent.type === 'array') { + return; + } + evt.preventDefault(); + evt.stopPropagation(); + var w = Math.max(150,keyLabel.width()); + var keyInput = $('').css({width:w+"px"}).val(""+item.key).insertAfter(keyLabel).typedInput({types:['str']}); + $(document).on("mousedown.nr-ui-json-editor", function(evt) { + var typedInputElement = keyInput.next(".red-ui-typedInput-container")[0]; + var target = evt.target; + while (target.nodeName !== 'BODY' && target !== typedInputElement && !$(target).hasClass("red-ui-typedInput-options")) { + target = target.parentElement; + } + if (target.nodeName === 'BODY') { + var newKey = keyInput.typedInput("value"); + item.key = newKey; + var keyText; + if (typeof newKey === 'string') { + keyText = '"'+newKey+'"'; + } else { + keyText = newKey; + } + keyLabel.text(keyText); + keyInput.remove(); + keyLabel.show(); + $(document).off("mousedown.nr-ui-json-editor"); + $(document).off("keydown.nr-ui-json-editor"); + } + }); + $(document).on("keydown.nr-ui-json-editor",function(evt) { + if (evt.keyCode === 27) { + // Escape + keyInput.remove(); + keyLabel.show(); + $(document).off("mousedown.nr-ui-json-editor"); + $(document).off("keydown.nr-ui-json-editor"); + } + }); + keyLabel.hide(); + }); + $('').text(" : ").appendTo(container); + } + + if (Array.isArray(val)) { + item.expanded = depth < 2; + item.type = "array"; + item.deferBuild = depth >= 2; + item.children = parseArray(val,depth+1,item); + } else if (val !== null && item.type === "object") { + item.expanded = depth < 2; + item.children = parseObject(val,depth+1,item); + item.deferBuild = depth >= 2; + } else { + item.value = val; + if (val === null) { + item.type = 'null' + } + } + + var valType; + var valValue = ""; + var valClass; + switch(item.type) { + case 'string': valType = 'str'; valValue = '"'+item.value+'"'; valClass = "red-ui-debug-msg-type-string"; break; + case 'number': valType = 'num'; valValue = item.value; valClass = "red-ui-debug-msg-type-number";break; + case 'boolean': valType = 'bool'; valValue = item.value; valClass = "red-ui-debug-msg-type-other";break; + case 'null': valType = item.type; valValue = item.type; valClass = "red-ui-debug-msg-type-null";break; + case 'object': + valType = item.type; + valValue = item.type;//+"{"+item.children.length+"}"; + valClass = "red-ui-debug-msg-type-meta"; + break; + case 'array': + valType = item.type; + valValue = item.type+"["+item.children.length+"]"; + valClass = "red-ui-debug-msg-type-meta"; + break; + } + // + var orphanedChildren; + var valueLabel = $('').addClass(valClass).text(valValue).appendTo(container); + valueLabel.on("click", function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + if (valType === 'str') { + valValue = valValue.substring(1,valValue.length-1); + } else if (valType === 'array') { + valValue = ""; + } else if (valType === 'object') { + valValue = ""; + } + var w = Math.max(150,valueLabel.width()); + var val = $('').css({width:w+"px"}).val(""+valValue).insertAfter(valueLabel).typedInput({ + types:[ + 'str','num','bool', + {value:"null",label:"null",hasValue:false}, + {value:"array",label:"array",hasValue:false}, + {value:"object",label:"object",hasValue:false} + ], + default: valType + }); + $(document).on("mousedown.nr-ui-json-editor", function(evt) { + var typedInputElement = val.next(".red-ui-typedInput-container")[0]; + var target = evt.target; + while (target.nodeName !== 'BODY' && target !== typedInputElement && !$(target).hasClass("red-ui-typedInput-options")) { + target = target.parentElement; + } + if (target.nodeName === 'BODY') { + valType = val.typedInput("type"); + valValue = val.typedInput("value"); + if (valType === 'num') { + valValue = valValue.trim(); + if (isNaN(valValue)) { + valType = 'str'; + } else if (valValue === "") { + valValue = 0; + } + } + item.value = valValue; + var valClass; + switch(valType) { + case 'str': item.children && (orphanedChildren = item.children); item.treeList.makeLeaf(true); item.type = "string"; valClass = "red-ui-debug-msg-type-string"; valValue = '"'+valValue+'"'; break; + case 'num': item.children && (orphanedChildren = item.children); item.treeList.makeLeaf(true); item.type = "number"; valClass = "red-ui-debug-msg-type-number"; break; + case 'bool': item.children && (orphanedChildren = item.children); item.treeList.makeLeaf(true); item.type = "boolean"; valClass = "red-ui-debug-msg-type-other"; item.value = (valValue === "true"); break; + case 'null': item.children && (orphanedChildren = item.children); item.treeList.makeLeaf(true); item.type = "null"; valClass = "red-ui-debug-msg-type-null"; item.value = valValue = "null"; break; + case 'object': + item.treeList.makeParent(orphanedChildren); + item.type = "object"; + valClass = "red-ui-debug-msg-type-meta"; + item.value = valValue = "object"; + item.children.forEach(function(child,i) { + if (child.hasOwnProperty('_key')) { + child.key = child._key; + delete child._key; + var keyText; + var keyLabel = child.element.find(".red-ui-editor-type-json-editor-label-key"); + keyLabel.removeClass("red-ui-editor-type-json-editor-label-array-key"); + if (typeof child.key === 'string') { + keyText = '"'+child.key+'"'; + keyLabel.addClass('red-ui-debug-msg-type-string'); + keyLabel.removeClass('red-ui-debug-msg-type-number'); + } else { + keyText = child.key; + keyLabel.removeClass('red-ui-debug-msg-type-string'); + keyLabel.addClass('red-ui-debug-msg-type-number'); + } + keyLabel.text(keyText); + } + }) + break; + case 'array': + item.treeList.makeParent(orphanedChildren); + item.type = "array"; + valClass = "red-ui-debug-msg-type-meta"; + item.value = valValue = "array["+(item.children.length)+"]"; + item.children.forEach(function(child,i) { + child._key = child.key; + child.key = i; + child.element.find(".red-ui-editor-type-json-editor-label-key") + .addClass("red-ui-editor-type-json-editor-label-array-key") + .text(""+child.key) + .removeClass('red-ui-debug-msg-type-string') + .addClass('red-ui-debug-msg-type-number'); + }) + break; + } + valueLabel.text(valValue).removeClass().addClass("red-ui-editor-type-json-editor-label-value "+valClass); + val.remove(); + valueLabel.show(); + $(document).off("mousedown.nr-ui-json-editor"); + $(document).off("keydown.nr-ui-json-editor"); + } + }) + + $(document).on("keydown.nr-ui-json-editor",function(evt) { + if (evt.keyCode === 27) { + // Escape + val.remove(); + valueLabel.show(); + if (valType === 'str') { + valValue = '"'+valValue+'"'; + } + $(document).off("mousedown.nr-ui-json-editor"); + $(document).off("keydown.nr-ui-json-editor"); + } + }); + valueLabel.hide(); + }) + item.gutter = $(''); + + if (parent) {//red-ui-editor-type-json-editor-item-handle + $('').appendTo(item.gutter); + } else { + $('').appendTo(item.gutter); + } + $('').appendTo(item.gutter).on("click", function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + showObjectMenu($(this), item); + }); + item.element = container; + return item; + } + function convertToObject(item) { + var element; + switch (item.type) { + case 'string': element = item.value; break; + case 'number': element = Number(item.value); break; + case 'boolean': element = item.value; break; + case 'null': element = null; break; + case 'object': + element = {}; + item.children.forEach(function(child) { + element[child.key] = convertToObject(child); + }) + break; + case 'array': + element = item.children.map(function(child) { + return convertToObject(child); + }) + break; + } + return element; + } var definition = { show: function(options) { @@ -41,9 +453,11 @@ return false; } } + var rootNode; + var trayOptions = { title: options.title, - width: "inherit", + width: options.width||700, buttons: [ { id: "node-dialog-cancel", @@ -60,25 +474,60 @@ if (options.requireValid && !checkValid()) { return; } - onComplete(expressionEditor.getValue()); + var result; + if (activeTab === "json-ui") { + if (rootNode) { + result = JSON.stringify(convertToObject(rootNode),null,4); + } else { + result = expressionEditor.getValue(); + } + } else if (activeTab === "json-raw") { + result = expressionEditor.getValue(); + } + onComplete && onComplete(result); RED.tray.close(); } } ], resize: function(dimensions) { - var rows = $("#dialog-form>div:not(.node-text-editor-row)"); - var editorRow = $("#dialog-form>div.node-text-editor-row"); - var height = $("#dialog-form").height(); - for (var i=0;i').appendTo(container).treeList({ + rootSortable: false, + sortable: ".red-ui-editor-type-json-editor-item-handle", + }).on("treelistchangeparent", function(event, evt) { + if (evt.old.type === 'array') { + evt.old.element.find(".red-ui-editor-type-json-editor-label-type").text("array["+evt.old.children.length+"]"); + } + if (evt.item.parent.type === 'array') { + evt.item.parent.element.find(".red-ui-editor-type-json-editor-label-type").text("array["+evt.item.parent.children.length+"]"); + } + }).on("treelistsort", function(event, item) { + item.children.forEach(function(child,i) { + if (item.type === 'array') { + child.key = i; + child.element.find(".red-ui-editor-type-json-editor-label-key") + .text(child.key) + .removeClass('red-ui-debug-msg-type-string') + .addClass('red-ui-debug-msg-type-number'); + } else { + child.element.find(".red-ui-editor-type-json-editor-label-key") + .text('"'+child.key+'"') + .removeClass('red-ui-debug-msg-type-number') + .addClass('red-ui-debug-msg-type-string'); + } + }) + }); + + expressionEditor = RED.editor.createEditor({ id: 'node-input-json', value: "", @@ -103,9 +552,56 @@ expressionEditor.getSession().setValue(v||"",-1); }); dialogForm.i18n(); + + var finishedBuild = false; + var tabs = RED.tabs.create({ + element: $("#red-ui-editor-type-json-tabs"), + onchange:function(tab) { + activeTab = tab.id; + $(".red-ui-editor-type-json-tab-content").hide(); + if (finishedBuild) { + if (tab.id === "json-raw") { + if (rootNode) { + var result = JSON.stringify(convertToObject(rootNode),null,4); + expressionEditor.getSession().setValue(result||"",-1); + } + + } else if (tab.id === "json-ui") { + var raw = expressionEditor.getValue().trim() ||"{}"; + try { + var parsed = JSON.parse(raw); + rootNode = handleItem(null,parsed,0,null); + rootNode.class = "red-ui-editor-type-json-root-node" + list.treeList('data',[rootNode]); + } catch(err) { + rootNode = null; + list.treeList('data',[{ + label: "Invalid JSON: "+err.toString() + }]); + } + } + } + tab.content.show(); + trayOptions.resize(); + } + }) + + tabs.addTab({ + id: 'json-raw', + label: RED._('jsonEditor.rawMode'), + content: $("#red-ui-editor-type-json-tab-raw") + }); + tabs.addTab({ + id: 'json-ui', + label: RED._('jsonEditor.uiMode'), + content: $("#red-ui-editor-type-json-tab-ui") + }); + finishedBuild = true; + + }, close: function() { - expressionEditor.destroy(); + // expressionEditor.destroy(); if (options.onclose) { options.onclose(); } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index d3f729a96..83c72b07b 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss @@ -461,3 +461,114 @@ button.red-ui-button-small margin: 2px; } } + + +.red-ui-editor input.red-ui-editor-type-json-editor-key { + width: 150px; +} + +.red-ui-editor-type-json-editor { + height: calc(100% - 10px); + .red-ui-treeList-container { + background: $secondary-background; + } + .red-ui-treeList-label { + padding-top: 0; + padding-bottom: 0; + white-space: nowrap; + min-height: 35px; + .red-ui-treeList-icon:before { + content:''; + display: inline-block; + height: 35px; + vertical-align: middle; + } + > span, > span > span { + vertical-align: middle; + } + &:hover, &:hover .red-ui-treeList-sublabel-text { + background: $secondary-background-disabled; + .red-ui-editor-type-json-editor-item-gutter { + > span, > button { + display: inline-block; + } + } + } + &.selected { + .red-ui-editor-type-json-editor-item-gutter { + background: $secondary-background-hover; + } + &:hover { + .red-ui-editor-type-json-editor-item-gutter { + background: $secondary-background-selected; + } + } + } + &.red-ui-editor-type-json-root-node { + .red-ui-editor-type-json-editor-item-gutter { + > span, > button { + display: inline-block; + } + } + } + } +} +.red-ui-editor-type-json-editor-controls { + height: 34px; + line-height: 34px; + display: none; +} +.red-ui-editor-type-json-editor-key { + width: 100px; +} +.red-ui-editor-type-json-editor-label { + display: inline-block; + white-space: pre-wrap; +} +.red-ui-editor-type-json-editor-label-value { + min-width: 200px; +} +.red-ui-editor-type-json-editor-label-value, +.red-ui-editor-type-json-editor-label-key { + display: inline-block; + box-sizing: border-box; + min-height: 34px; + line-height: 30px; + padding: 0 2px; + border: 2px solid rgba(0,0,0,0); + border-radius: 3px; + &:not(.red-ui-editor-type-json-editor-label-array-key):hover { + border-color: $list-item-background-hover; + border-style: dashed; + } +} +.red-ui-editor-type-json-editor-item-gutter { + width: 48px; + padding-left: 4px; + + height: 100%; + line-height: 35px; + color: $tertiary-text-color; + background: $secondary-background-disabled; + > span { + display: inline-block; + height: 35px; + line-height: 35px; + width: 20px; + text-align:center; + } + > span, > button { + display: none; + } +} + + + + +.red-ui-editor-type-json-editor-item-handle { + cursor: move; +} +.red-ui-editor-type-json-tab-content { + position: relative; + height: calc(100% - 40px); +} From ea0526f29adb0ece5de9206149147f2fd8fe4a4e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 11 Jun 2019 15:00:07 +0100 Subject: [PATCH 090/137] Add insertItemAt doc to editableList --- .../@node-red/editor-client/src/js/ui/common/editableList.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index a41ee423d..ee0251951 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -32,6 +32,7 @@ * - scrollOnAdd : boolean - whether to scroll to newly added items * methods: * - addItem(itemData) + * - insertItemAt : function(data,index) - add an item at the specified index * - removeItem(itemData) * - width(width) * - height(height) From 8cf5ec9e5a9e029b998d20e895210f5f0a164a0d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 11 Jun 2019 17:11:52 +0100 Subject: [PATCH 091/137] Update UI tests for new editor css --- test/editor/editor_helper.js | 3 +- .../editor/pageobjects/editor/palette_page.js | 28 +++++++++---------- .../pageobjects/editor/workspace_page.js | 4 +-- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/test/editor/editor_helper.js b/test/editor/editor_helper.js index d9eb053a5..8de197cef 100644 --- a/test/editor/editor_helper.js +++ b/test/editor/editor_helper.js @@ -77,7 +77,6 @@ module.exports = { browser.call(function () { return new Promise(function(resolve, reject) { cleanup(flowFilename); - app.use("/",express.static("public")); server = http.createServer(app); var settings = { httpAdminRoot: "/", @@ -102,7 +101,7 @@ module.exports = { }); }); browser.url(url); - browser.waitForExist('#red-ui-palette-node_inject'); + browser.waitForExist(".red-ui-palette-node[data-palette-type='inject']") } catch (err) { console.log(err); throw err; diff --git a/test/editor/pageobjects/editor/palette_page.js b/test/editor/pageobjects/editor/palette_page.js index 5ae724421..878f218fb 100644 --- a/test/editor/pageobjects/editor/palette_page.js +++ b/test/editor/pageobjects/editor/palette_page.js @@ -16,23 +16,23 @@ var idMap = { // input - "inject": "#red-ui-palette-node_inject", - "httpin": "#red-ui-palette-node_http_in", - "mqttIn": "#red-ui-palette-node_mqtt_in", + "inject": ".red-ui-palette-node[data-palette-type='inject']", + "httpin": ".red-ui-palette-node[data-palette-type='http in']", + "mqttIn": ".red-ui-palette-node[data-palette-type='mqtt in']", // output - "debug": "#red-ui-palette-node_debug", - "httpResponse": "#red-ui-palette-node_http_response", - "mqttOut": "#red-ui-palette-node_mqtt_out", + "debug": ".red-ui-palette-node[data-palette-type='debug']", + "httpResponse": ".red-ui-palette-node[data-palette-type='http response']", + "mqttOut": ".red-ui-palette-node[data-palette-type='mqtt out']", // function - "function": "#red-ui-palette-node_function", - "template": "#red-ui-palette-node_template", - "change": "#red-ui-palette-node_change", - "range": "#red-ui-palette-node_range", - "httpRequest": "#red-ui-palette-node_http_request", - "html": "#red-ui-palette-node_html", - "json": "#red-ui-palette-node_json", + "function": ".red-ui-palette-node[data-palette-type='function']", + "template": ".red-ui-palette-node[data-palette-type='template']", + "change": ".red-ui-palette-node[data-palette-type='change']", + "range": ".red-ui-palette-node[data-palette-type='range']", + "httpRequest": ".red-ui-palette-node[data-palette-type='http request']", + "html": ".red-ui-palette-node[data-palette-type='html']", + "json": ".red-ui-palette-node[data-palette-type='json']", // storage - "filein": "#red-ui-palette-node_file_in", + "filein": ".red-ui-palette-node[data-palette-type='file in']", }; function getId(type) { diff --git a/test/editor/pageobjects/editor/workspace_page.js b/test/editor/pageobjects/editor/workspace_page.js index 0706da610..18e50dcf2 100644 --- a/test/editor/pageobjects/editor/workspace_page.js +++ b/test/editor/pageobjects/editor/workspace_page.js @@ -49,14 +49,14 @@ function addNode(type, x, y) { browser.moveToObject("#red-ui-palette-search", previousX + 300, previousY + 100); // adjust to the top-left corner of workspace. browser.buttonUp(); // Last node is the one that has been created right now. - var nodeElement = browser.elements('//*[@class="red-ui-flow-node red-ui-flow-node-group"][last()]'); + var nodeElement = browser.elements('//*[contains(concat(" ", normalize-space(@class), " "), " red-ui-flow-node-group ")][last()]'); var nodeId = nodeElement.getAttribute('id'); var node = nodeFactory.create(type, nodeId); return node; } function deleteAllNodes() { - browser.click('.innerCanvas'); + browser.click('.red-ui-workspace-chart-event-layer'); browser.keys(['Control', 'a', 'a', 'Control']); // call twice to release the keys. browser.keys(['Delete']); } From ffeb2e91f41cec97e394bd89fa693e6c020e4034 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 11:29:18 +0100 Subject: [PATCH 092/137] Add command prompt dialog --- Gruntfile.js | 1 + .../editor-client/src/js/keymap.json | 3 +- .../@node-red/editor-client/src/js/red.js | 1 + .../editor-client/src/js/ui/clipboard.js | 2 + .../editor-client/src/js/ui/commandPrompt.js | 228 ++++++++++++++++++ .../editor-client/src/js/ui/search.js | 4 +- .../editor-client/src/sass/search.scss | 11 +- 7 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js diff --git a/Gruntfile.js b/Gruntfile.js index c301c6c9c..f6fb3e19a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -169,6 +169,7 @@ module.exports = function(grunt) { "packages/node_modules/@node-red/editor-client/src/js/ui/library.js", "packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js", "packages/node_modules/@node-red/editor-client/src/js/ui/search.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js", "packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js", "packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js", "packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js", 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 5ae7cd10d..b3544c124 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,7 +22,8 @@ "ctrl-alt-n": "core:new-project", "ctrl-alt-o": "core:open-project", "ctrl-g v": "core:show-version-control-tab", - "ctrl-shift-l": "core:show-event-log" + "ctrl-shift-l": "core:show-event-log", + "ctrl-shift-p":"core:show-command-prompt" }, "red-ui-sidebar-node-config": { "backspace": "core:delete-config-selection", diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index e7613103d..d8962c44a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -521,6 +521,7 @@ var RED = (function() { RED.subflow.init(); RED.clipboard.init(); RED.search.init(); + RED.commandPrompt.init(); RED.editor.init(); RED.diff.init(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 6971dc787..8c8d3a664 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -742,6 +742,8 @@ RED.clipboard = (function() { RED.events.on("editor:close",function() { disabled = false; }); RED.events.on("search:open",function() { disabled = true; }); RED.events.on("search:close",function() { disabled = false; }); + RED.events.on("commandPrompt:open",function() { disabled = true; }); + RED.events.on("commandPrompt:close",function() { disabled = false; }); RED.events.on("type-search:open",function() { disabled = true; }); RED.events.on("type-search:close",function() { disabled = false; }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js b/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js new file mode 100644 index 000000000..e86fde55a --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js @@ -0,0 +1,228 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * 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. + **/ +RED.commandPrompt = (function() { + + var disabled = false; + var dialog = null; + var searchInput; + var searchResults; + var selected = -1; + var visible = false; + var activeElement; + + var results = []; + + var scopes = {}; + + function search(val) { + scopes = {}; + val = val ||""; + searchResults.editableList('empty'); + + var actions = RED.actions.list(); + actions.sort(function(A,B) { + return A.id.localeCompare(B.id); + }); + + val = val.trim().toLowerCase(); + + actions.forEach(function(action) { + if (action.scope && action.scope !== "*") { + if (!scopes.hasOwnProperty(action.scope)) { + var target = activeElement; + while (target.nodeName !== 'BODY' && target.id !== action.scope) { + target = target.parentElement; + } + scopes[action.scope] = (target.nodeName !== 'BODY') + } + if (!scopes[action.scope]) { + return; + } + } + action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); + if (val !== "" && action.label.toLowerCase().indexOf(val) === -1) { + return; + } + results.push(action); + searchResults.editableList('addItem',action) + }) + // searchResults.editableList('addItem',{}); + console.log(document.activeElement); + + } + + function ensureSelectedIsVisible() { + var selectedEntry = searchResults.find("li.selected"); + if (selectedEntry.length === 1) { + var scrollWindow = searchResults.parent(); + var scrollHeight = scrollWindow.height(); + var scrollOffset = scrollWindow.scrollTop(); + var y = selectedEntry.position().top; + var h = selectedEntry.height(); + if (y+h > scrollHeight) { + scrollWindow.animate({scrollTop: '-='+(scrollHeight-(y+h)-10)},50); + } else if (y<0) { + scrollWindow.animate({scrollTop: '+='+(y-10)},50); + } + } + } + + function createDialog() { + dialog = $("
              ",{id:"red-ui-commandPrompt",class:"red-ui-search"}).appendTo("#red-ui-main-container"); + var searchDiv = $("
              ",{class:"red-ui-search-container"}).appendTo(dialog); + searchInput = $('').appendTo(searchDiv).searchBox({ + delay: 200, + change: function() { + search($(this).val()); + } + }); + + searchInput.on('keydown',function(evt) { + var children; + if (results.length > 0) { + if (evt.keyCode === 40) { + // Down + children = searchResults.children(); + if (selected < children.length-1) { + if (selected > -1) { + $(children[selected]).removeClass('selected'); + } + selected++; + } + $(children[selected]).addClass('selected'); + ensureSelectedIsVisible(); + evt.preventDefault(); + } else if (evt.keyCode === 38) { + // Up + children = searchResults.children(); + if (selected > 0) { + if (selected < children.length) { + $(children[selected]).removeClass('selected'); + } + selected--; + } + $(children[selected]).addClass('selected'); + ensureSelectedIsVisible(); + evt.preventDefault(); + } else if (evt.keyCode === 13) { + // Enter + if (results.length > 0) { + selectCommand(results[Math.max(0,selected)]); + } + } + } + }); + searchInput.i18n(); + + var searchResultsDiv = $("
              ",{class:"red-ui-search-results-container"}).appendTo(dialog); + searchResults = $('
                ',{style:"position: absolute;top: 5px;bottom: 5px;left: 5px;right: 5px;"}).appendTo(searchResultsDiv).editableList({ + addButton: false, + addItem: function(container,i,action) { + if (action.id === undefined) { + $('
                ',{class:"red-ui-search-empty"}).text(RED._('search.empty')).appendTo(container); + } else { + var div = $('',{href:'#',class:"red-ui-search-result"}).appendTo(container); + var contentDiv = $('
                ',{class:"red-ui-search-result-action"}).appendTo(div); + + + $('
                ').text(action.label).appendTo(contentDiv); + // $('
                ',{class:"red-ui-search-result-node-type"}).text(node.type).appendTo(contentDiv); + // $('
                ',{class:"red-ui-search-result-node-id"}).text(node.id).appendTo(contentDiv); + if (action.key) { + $('
                ',{class:"red-ui-search-result-action-key"}).html(RED.keyboard.formatKey(action.key)).appendTo(contentDiv); + } + div.on("click", function(evt) { + evt.preventDefault(); + selectCommand(action); + }); + } + }, + scrollOnAdd: false + }); + + } + + function selectCommand(command) { + hide(); + RED.actions.invoke(command.id); + console.log(command); + } + + function show(v) { + if (disabled) { + return; + } + if (!visible) { + activeElement = document.activeElement; + RED.keyboard.add("*","escape",function(){hide()}); + $("#red-ui-header-shade").show(); + $("#red-ui-editor-shade").show(); + $("#red-ui-palette-shade").show(); + $("#red-ui-sidebar-shade").show(); + $("#red-ui-sidebar-separator").hide(); + if (dialog === null) { + createDialog(); + } + dialog.slideDown(300); + searchInput.searchBox('value',v) + search(v); + RED.events.emit("commandPrompt:open"); + visible = true; + } + searchInput.trigger("focus"); + } + + function hide() { + if (visible) { + RED.keyboard.remove("escape"); + visible = false; + $("#red-ui-header-shade").hide(); + $("#red-ui-editor-shade").hide(); + $("#red-ui-palette-shade").hide(); + $("#red-ui-sidebar-shade").hide(); + $("#red-ui-sidebar-separator").show(); + if (dialog !== null) { + dialog.slideUp(200,function() { + searchInput.searchBox('value',''); + }); + } + RED.events.emit("commandPrompt:close"); + } + } + + function init() { + RED.actions.add("core:show-command-prompt",show); + + RED.events.on("editor:open",function() { disabled = true; }); + RED.events.on("editor:close",function() { disabled = false; }); + RED.events.on("search:open",function() { disabled = true; }); + RED.events.on("search:close",function() { disabled = false; }); + RED.events.on("type-search:open",function() { disabled = true; }); + RED.events.on("type-search:close",function() { disabled = false; }); + + $("#red-ui-header-shade").on('mousedown',hide); + $("#red-ui-editor-shade").on('mousedown',hide); + $("#red-ui-palette-shade").on('mousedown',hide); + $("#red-ui-sidebar-shade").on('mousedown',hide); + } + + return { + init: init, + show: show, + hide: hide + }; + +})(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index d814ab738..74072065a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -216,7 +216,7 @@ RED.search = (function() { var iconContainer = $('
                ',{class:"red-ui-palette-icon-container"}).appendTo(nodeDiv); RED.utils.createIconElement(icon_url, iconContainer, true); - var contentDiv = $('
                ',{class:"red-ui-search-result-description"}).appendTo(div); + var contentDiv = $('
                ',{class:"red-ui-search-result-node-description"}).appendTo(div); if (node.z) { var workspace = RED.nodes.workspace(node.z); if (!workspace) { @@ -296,6 +296,8 @@ RED.search = (function() { RED.events.on("editor:close",function() { disabled = false; }); RED.events.on("type-search:open",function() { disabled = true; }); RED.events.on("type-search:close",function() { disabled = false; }); + RED.events.on("commandPrompt:open",function() { disabled = true; }); + RED.events.on("commandPrompt:close",function() { disabled = false; }); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/search.scss b/packages/node_modules/@node-red/editor-client/src/sass/search.scss index a63bd4457..2fd016508 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/search.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/search.scss @@ -165,7 +165,7 @@ } } -.red-ui-search-result-description { +.red-ui-search-result-node-description { margin-left: 40px; margin-right: 5px; } @@ -193,3 +193,12 @@ font-style: italic; color: $form-placeholder-color; } + +.red-ui-search-result-action { + color: $primary-text-color; +} +.red-ui-search-result-action-key { + float:right; + margin-right: 10px; + color: $tertiary-text-color; +} From 2de9a804a00161bf25b9c52a469147a397d25d9c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 7 Jun 2019 12:07:58 +0100 Subject: [PATCH 093/137] Tidy up nls of command prompt and selection handling --- .../editor-client/locales/en-US/editor.json | 3 ++- .../editor-client/src/js/keymap.json | 2 +- .../editor-client/src/js/ui/commandPrompt.js | 21 +++---------------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 37e51adf1..a92de4304 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -710,7 +710,8 @@ }, "search": { "empty": "No matches found", - "addNode": "add a node..." + "addNode": "add a node...", + "actions": "search available actions" }, "expressionEditor": { "functions": "Functions", 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 b3544c124..db7c4f77d 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 @@ -23,7 +23,7 @@ "ctrl-alt-o": "core:open-project", "ctrl-g v": "core:show-version-control-tab", "ctrl-shift-l": "core:show-event-log", - "ctrl-shift-p":"core:show-command-prompt" + "alt-shift-p":"core:show-command-prompt" }, "red-ui-sidebar-node-config": { "backspace": "core:delete-config-selection", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js b/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js index e86fde55a..733be9aab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js @@ -21,7 +21,6 @@ RED.commandPrompt = (function() { var searchResults; var selected = -1; var visible = false; - var activeElement; var results = []; @@ -29,6 +28,8 @@ RED.commandPrompt = (function() { function search(val) { scopes = {}; + results = []; + selected = -1; val = val ||""; searchResults.editableList('empty'); @@ -40,18 +41,6 @@ RED.commandPrompt = (function() { val = val.trim().toLowerCase(); actions.forEach(function(action) { - if (action.scope && action.scope !== "*") { - if (!scopes.hasOwnProperty(action.scope)) { - var target = activeElement; - while (target.nodeName !== 'BODY' && target.id !== action.scope) { - target = target.parentElement; - } - scopes[action.scope] = (target.nodeName !== 'BODY') - } - if (!scopes[action.scope]) { - return; - } - } action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); if (val !== "" && action.label.toLowerCase().indexOf(val) === -1) { return; @@ -59,8 +48,6 @@ RED.commandPrompt = (function() { results.push(action); searchResults.editableList('addItem',action) }) - // searchResults.editableList('addItem',{}); - console.log(document.activeElement); } @@ -83,7 +70,7 @@ RED.commandPrompt = (function() { function createDialog() { dialog = $("
                ",{id:"red-ui-commandPrompt",class:"red-ui-search"}).appendTo("#red-ui-main-container"); var searchDiv = $("
                ",{class:"red-ui-search-container"}).appendTo(dialog); - searchInput = $('').appendTo(searchDiv).searchBox({ + searchInput = $('').appendTo(searchDiv).searchBox({ delay: 200, change: function() { search($(this).val()); @@ -158,7 +145,6 @@ RED.commandPrompt = (function() { function selectCommand(command) { hide(); RED.actions.invoke(command.id); - console.log(command); } function show(v) { @@ -166,7 +152,6 @@ RED.commandPrompt = (function() { return; } if (!visible) { - activeElement = document.activeElement; RED.keyboard.add("*","escape",function(){hide()}); $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); From cc0933eee4c17a24ea45884579915ebf2e9b3fc7 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 11 Jun 2019 22:43:01 +0100 Subject: [PATCH 094/137] Rename commandPrompt to actionList --- Gruntfile.js | 2 +- .../editor-client/locales/en-US/editor.json | 6 +- .../editor-client/src/js/keymap.json | 4 +- .../@node-red/editor-client/src/js/red.js | 3 +- .../js/ui/{commandPrompt.js => actionList.js} | 128 ++++++++---------- .../editor-client/src/js/ui/clipboard.js | 4 +- .../src/js/ui/common/editableList.js | 9 ++ .../editor-client/src/js/ui/search.js | 4 +- .../editor-client/src/sass/search.scss | 4 +- 9 files changed, 84 insertions(+), 80 deletions(-) rename packages/node_modules/@node-red/editor-client/src/js/ui/{commandPrompt.js => actionList.js} (65%) diff --git a/Gruntfile.js b/Gruntfile.js index f6fb3e19a..8b7b85a25 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -169,7 +169,7 @@ module.exports = function(grunt) { "packages/node_modules/@node-red/editor-client/src/js/ui/library.js", "packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js", "packages/node_modules/@node-red/editor-client/src/js/ui/search.js", - "packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js", "packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js", "packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js", "packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js", diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index a92de4304..9a53a870c 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -351,7 +351,8 @@ "pasteNode": "Paste nodes", "undoChange": "Undo the last change performed", "searchBox": "Open search box", - "managePalette": "Manage palette" + "managePalette": "Manage palette", + "actionList":"Action list" }, "library": { "library": "Library", @@ -710,8 +711,7 @@ }, "search": { "empty": "No matches found", - "addNode": "add a node...", - "actions": "search available actions" + "addNode": "add a node..." }, "expressionEditor": { "functions": "Functions", 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 db7c4f77d..2db2d4836 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 @@ -1,6 +1,6 @@ { "*": { - "ctrl-shift-p":"core:manage-palette", + "alt-shift-p":"core:manage-palette", "ctrl-f": "core:search", "ctrl-shift-f": "core:list-flows", "ctrl-=": "core:zoom-in", @@ -23,7 +23,7 @@ "ctrl-alt-o": "core:open-project", "ctrl-g v": "core:show-version-control-tab", "ctrl-shift-l": "core:show-event-log", - "alt-shift-p":"core:show-command-prompt" + "ctrl-shift-p":"core:show-action-list" }, "red-ui-sidebar-node-config": { "backspace": "core:delete-config-selection", diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index d8962c44a..715da7784 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -451,6 +451,7 @@ var RED = (function() { {id:"menu-item-palette",label:RED._("menu.label.palette.show"),toggle:true,onselect:"core:toggle-palette", selected: true}, {id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true}, {id:"menu-item-event-log",label:RED._("eventLog.title"),onselect:"core:show-event-log"}, + {id:"menu-item-action-list",label:RED._("keyboard.actionList"),onselect:"core:show-action-list"}, null ]}); menuOptions.push(null); @@ -521,7 +522,7 @@ var RED = (function() { RED.subflow.init(); RED.clipboard.init(); RED.search.init(); - RED.commandPrompt.init(); + RED.actionList.init(); RED.editor.init(); RED.diff.init(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js similarity index 65% rename from packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js rename to packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js index 733be9aab..d3155051b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/commandPrompt.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ -RED.commandPrompt = (function() { +RED.actionList = (function() { var disabled = false; var dialog = null; @@ -22,34 +22,7 @@ RED.commandPrompt = (function() { var selected = -1; var visible = false; - var results = []; - - var scopes = {}; - - function search(val) { - scopes = {}; - results = []; - selected = -1; - val = val ||""; - searchResults.editableList('empty'); - - var actions = RED.actions.list(); - actions.sort(function(A,B) { - return A.id.localeCompare(B.id); - }); - - val = val.trim().toLowerCase(); - - actions.forEach(function(action) { - action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); - if (val !== "" && action.label.toLowerCase().indexOf(val) === -1) { - return; - } - results.push(action); - searchResults.editableList('addItem',action) - }) - - } + var filterTerm = ""; function ensureSelectedIsVisible() { var selectedEntry = searchResults.find("li.selected"); @@ -68,48 +41,50 @@ RED.commandPrompt = (function() { } function createDialog() { - dialog = $("
                ",{id:"red-ui-commandPrompt",class:"red-ui-search"}).appendTo("#red-ui-main-container"); + dialog = $("
                ",{id:"red-ui-actionList",class:"red-ui-search"}).appendTo("#red-ui-main-container"); var searchDiv = $("
                ",{class:"red-ui-search-container"}).appendTo(dialog); - searchInput = $('').appendTo(searchDiv).searchBox({ - delay: 200, + searchInput = $('').appendTo(searchDiv).searchBox({ change: function() { - search($(this).val()); + filterTerm = $(this).val(); + searchResults.editableList('filter'); + searchResults.find("li.selected").removeClass("selected"); } }); searchInput.on('keydown',function(evt) { - var children; - if (results.length > 0) { - if (evt.keyCode === 40) { - // Down - children = searchResults.children(); - if (selected < children.length-1) { - if (selected > -1) { - $(children[selected]).removeClass('selected'); - } - selected++; + var selectedChild; + if (evt.keyCode === 40) { + // Down + selectedChild = searchResults.find("li.selected"); + if (!selectedChild.length) { + var children = searchResults.children(":visible"); + if (children.length) { + $(children[0]).addClass('selected'); + RED.a = children[0]; } - $(children[selected]).addClass('selected'); - ensureSelectedIsVisible(); - evt.preventDefault(); - } else if (evt.keyCode === 38) { - // Up - children = searchResults.children(); - if (selected > 0) { - if (selected < children.length) { - $(children[selected]).removeClass('selected'); - } - selected--; - } - $(children[selected]).addClass('selected'); - ensureSelectedIsVisible(); - evt.preventDefault(); - } else if (evt.keyCode === 13) { - // Enter - if (results.length > 0) { - selectCommand(results[Math.max(0,selected)]); + } else { + var nextChild = selectedChild.nextAll(":visible").first(); + if (nextChild.length) { + selectedChild.removeClass('selected'); + nextChild.addClass('selected'); } } + ensureSelectedIsVisible(); + evt.preventDefault(); + } else if (evt.keyCode === 38) { + // Up + selectedChild = searchResults.find("li.selected"); + var nextChild = selectedChild.prevAll(":visible").first(); + if (nextChild.length) { + selectedChild.removeClass('selected'); + nextChild.addClass('selected'); + } + ensureSelectedIsVisible(); + evt.preventDefault(); + } else if (evt.keyCode === 13) { + // Enter + selectedChild = searchResults.find("li.selected"); + selectCommand(searchResults.editableList('getItem',selectedChild)); } }); searchInput.i18n(); @@ -137,14 +112,22 @@ RED.commandPrompt = (function() { }); } }, - scrollOnAdd: false + scrollOnAdd: false, + filter: function(item) { + if (filterTerm !== "" && item.label.toLowerCase().indexOf(filterTerm) === -1) { + return false; + } + return true; + } }); } function selectCommand(command) { hide(); - RED.actions.invoke(command.id); + if (command) { + RED.actions.invoke(command.id); + } } function show(v) { @@ -163,8 +146,17 @@ RED.commandPrompt = (function() { } dialog.slideDown(300); searchInput.searchBox('value',v) - search(v); - RED.events.emit("commandPrompt:open"); + searchResults.editableList('empty'); + results = []; + var actions = RED.actions.list(); + actions.sort(function(A,B) { + return A.id.localeCompare(B.id); + }); + actions.forEach(function(action) { + action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); + searchResults.editableList('addItem',action) + }) + RED.events.emit("actionList:open"); visible = true; } searchInput.trigger("focus"); @@ -184,12 +176,12 @@ RED.commandPrompt = (function() { searchInput.searchBox('value',''); }); } - RED.events.emit("commandPrompt:close"); + RED.events.emit("actionList:close"); } } function init() { - RED.actions.add("core:show-command-prompt",show); + RED.actions.add("core:show-action-list",show); RED.events.on("editor:open",function() { disabled = true; }); RED.events.on("editor:close",function() { disabled = false; }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 8c8d3a664..cdff62919 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -742,8 +742,8 @@ RED.clipboard = (function() { RED.events.on("editor:close",function() { disabled = false; }); RED.events.on("search:open",function() { disabled = true; }); RED.events.on("search:close",function() { disabled = false; }); - RED.events.on("commandPrompt:open",function() { disabled = true; }); - RED.events.on("commandPrompt:close",function() { disabled = false; }); + RED.events.on("actionList:open",function() { disabled = true; }); + RED.events.on("actionList:close",function() { disabled = false; }); RED.events.on("type-search:open",function() { disabled = true; }); RED.events.on("type-search:close",function() { disabled = false; }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index ee0251951..d4fa53dfa 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -323,6 +323,7 @@ }, empty: function() { this.element.empty(); + this.uiContainer.scrollTop(0); }, filter: function(filter) { if (filter !== undefined) { @@ -346,6 +347,14 @@ if (items.length > 0) { this.uiContainer.scrollTop(this.uiContainer.scrollTop()+items.position().top) } + }, + getItem: function(li) { + var el = li.find(".red-ui-editableList-item-content"); + if (el.length) { + return el.data('data'); + } else { + return null; + } } }); })(jQuery); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 74072065a..dcb147de7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -296,8 +296,8 @@ RED.search = (function() { RED.events.on("editor:close",function() { disabled = false; }); RED.events.on("type-search:open",function() { disabled = true; }); RED.events.on("type-search:close",function() { disabled = false; }); - RED.events.on("commandPrompt:open",function() { disabled = true; }); - RED.events.on("commandPrompt:close",function() { disabled = false; }); + RED.events.on("actionList:open",function() { disabled = true; }); + RED.events.on("actionList:close",function() { disabled = false; }); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/search.scss b/packages/node_modules/@node-red/editor-client/src/sass/search.scss index 2fd016508..0ec8b6525 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/search.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/search.scss @@ -198,7 +198,9 @@ color: $primary-text-color; } .red-ui-search-result-action-key { - float:right; + position: absolute; + top: 9px; + right: 0; margin-right: 10px; color: $tertiary-text-color; } From 8abc5b38899ae7df30ecc3694e8c07e7a4965e0d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 12 Jun 2019 10:06:58 +0100 Subject: [PATCH 095/137] Add actions to change deploy type --- .../editor-client/src/js/ui/common/menu.js | 42 +++++++++++-------- .../editor-client/src/js/ui/deploy.js | 8 +++- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js index 039357c11..8de4a6e13 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js @@ -98,21 +98,10 @@ RED.menu = (function() { return; } if (opt.toggle) { - var selected = isSelected(opt.id); - if (typeof opt.toggle === "string") { - if (!selected) { - for (var m in menuItems) { - if (menuItems.hasOwnProperty(m)) { - var mi = menuItems[m]; - if (mi.id != opt.id && opt.toggle == mi.toggle) { - setSelected(mi.id,false); - } - } - } - setSelected(opt.id,true); - } + if (opt.toggle === true) { + setSelected(opt.id, !isSelected(opt.id)); } else { - setSelected(opt.id, !selected); + setSelected(opt.id, true); } } else { triggerAction(opt.id); @@ -209,8 +198,9 @@ RED.menu = (function() { } function setSelected(id,state) { + var alreadySet = false; if (isSelected(id) == state) { - return; + alreadySet = true; } var opt = menuItems[id]; if (state) { @@ -218,10 +208,26 @@ RED.menu = (function() { } else { $("#"+id).removeClass("active"); } - if (opt && opt.onselect) { - triggerAction(opt.id,state); + if (opt) { + if (opt.toggle && typeof opt.toggle === "string") { + if (state) { + for (var m in menuItems) { + if (menuItems.hasOwnProperty(m)) { + var mi = menuItems[m]; + if (mi.id != opt.id && opt.toggle == mi.toggle) { + setSelected(mi.id,false); + } + } + } + } + } + if (!alreadySet && opt.onselect) { + triggerAction(opt.id,state); + } + } + if (!alreadySet) { + RED.settings.set(opt.setting||("menu-"+opt.id), state); } - RED.settings.set(opt.setting||("menu-"+opt.id), state); } function toggleSelected(id) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index 833e8f293..16a774b0e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -99,7 +99,13 @@ RED.deploy = (function() { }); RED.actions.add("core:deploy-flows",save); - RED.actions.add("core:restart-flows",restart); + if (type === "default") { + RED.actions.add("core:restart-flows",restart); + RED.actions.add("core:set-deploy-type-to-full",function() { RED.menu.setSelected("deploymenu-item-full",true);}); + RED.actions.add("core:set-deploy-type-to-modified-flows",function() { RED.menu.setSelected("deploymenu-item-flow",true); }); + RED.actions.add("core:set-deploy-type-to-modified-nodes",function() { RED.menu.setSelected("deploymenu-item-node",true); }); + } + RED.events.on('nodes:change',function(state) { From ae2162beafb3491b98b0285ea73dc6a1def11bd5 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 13 Jun 2019 14:22:59 +0100 Subject: [PATCH 096/137] Handle subflow internal node wired to a non-existant node Fixes #2202 --- .../@node-red/runtime/lib/nodes/flows/Subflow.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js index 2bf9e9e16..dd4cc5495 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js @@ -409,7 +409,11 @@ function remapSubflowNodes(nodes,nodeMap) { for (j=0;j Date: Fri, 14 Jun 2019 10:57:12 +0100 Subject: [PATCH 097/137] Ensure focus returns to the right element after dialogs shown --- .../@node-red/editor-client/src/js/ui/actionList.js | 6 ++++++ .../@node-red/editor-client/src/js/ui/search.js | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js index d3155051b..aa5b2f900 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -23,6 +23,7 @@ RED.actionList = (function() { var visible = false; var filterTerm = ""; + var previousActiveElement; function ensureSelectedIsVisible() { var selectedEntry = searchResults.find("li.selected"); @@ -135,6 +136,7 @@ RED.actionList = (function() { return; } if (!visible) { + previousActiveElement = document.activeElement; RED.keyboard.add("*","escape",function(){hide()}); $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); @@ -177,6 +179,10 @@ RED.actionList = (function() { }); } RED.events.emit("actionList:close"); + if (previousActiveElement) { + $(previousActiveElement).trigger("focus"); + previousActiveElement = null; + } } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index dcb147de7..6799385fd 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -25,6 +25,7 @@ RED.search = (function() { var index = {}; var keys = []; var results = []; + var previousActiveElement; function indexProperty(node,label,property) { @@ -253,6 +254,7 @@ RED.search = (function() { return; } if (!visible) { + previousActiveElement = document.activeElement; RED.keyboard.add("*","escape",function(){hide()}); $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); @@ -286,6 +288,10 @@ RED.search = (function() { }); } RED.events.emit("search:close"); + if (previousActiveElement) { + $(previousActiveElement).trigger("focus"); + previousActiveElement = null; + } } } From 14f6788ab995d3b1faf65e2db758eb141ce66d1e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 14 Jun 2019 11:17:49 +0100 Subject: [PATCH 098/137] Set autocomplete to disabled in form input elements --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 2 +- .../node_modules/@node-red/editor-client/src/js/ui/editor.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 4d1f4b038..281785236 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -209,7 +209,7 @@ that.input.css("margin"+d,0); }); - ["type","placeholder"].forEach(function(d) { + ["type","placeholder","autocomplete"].forEach(function(d) { var m = that.element.attr(d); that.input.attr(d,m); }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index d55161adc..a50545dcb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -567,13 +567,13 @@ RED.editor = (function() { type: "text", style: "margin-left: 5px; width: calc(40% - 8px)", placeholder: RED._("common.label.name") - }).appendTo(row).val(opt.name); + }).attr("autocomplete","disable").appendTo(row).val(opt.name); } var valueField = $('',{ class: "node-input-env-value", type: "text", style: "margin-left: 5px; width: calc(60% - 8px)" - }).appendTo(row) + }).attr("autocomplete","disable").appendTo(row) valueField.typedInput({default:'str', types:['str','num','bool','json','bin','env'] @@ -721,6 +721,7 @@ RED.editor = (function() { $('').prependTo(dialogForm); $('').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); + dialogForm.find('input').attr("autocomplete","disable"); return dialogForm; } From 70cf7b0c5a49ebb07b5c8dc26c3c4b8b7ce9dc31 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 14 Jun 2019 11:18:07 +0100 Subject: [PATCH 099/137] Do not save subflow env vars with blank names --- .../editor-client/src/js/ui/editor.js | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index a50545dcb..b64bb8e5c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -667,17 +667,19 @@ RED.editor = (function() { list.each(function(i) { var entry = $(this); var item = entry.data('data'); - var name = item.parent?item.name:entry.find(".node-input-env-name").val(); - var valueInput = entry.find(".node-input-env-value"); - var value = valueInput.typedInput("value"); - var type = valueInput.typedInput("type"); - if (!item.parent || (item.parent.value !== value || item.parent.type !== type)) { - var item = { - name: name, - type: type, - value: value - }; - env.push(item); + var name = (item.parent?item.name:entry.find(".node-input-env-name").val()).trim(); + if (name !== "") { + var valueInput = entry.find(".node-input-env-value"); + var value = valueInput.typedInput("value"); + var type = valueInput.typedInput("type"); + if (!item.parent || (item.parent.value !== value || item.parent.type !== type)) { + var item = { + name: name, + type: type, + value: value + }; + env.push(item); + } } }); return env; From 41a0af032c47993acd49681c71c37f5842b90958 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 14 Jun 2019 22:12:47 +0100 Subject: [PATCH 100/137] Enable individual flow nodes to be disabled --- .../@node-red/editor-client/src/js/nodes.js | 7 ++- .../src/js/ui/common/toggleButton.js | 3 +- .../editor-client/src/js/ui/editor.js | 61 +++++++++++-------- .../@node-red/editor-client/src/js/ui/view.js | 2 + .../editor-client/src/sass/editor.scss | 21 ++++--- .../editor-client/src/sass/flow.scss | 19 ++++-- .../editor-client/src/sass/mixins.scss | 2 +- .../@node-red/runtime/lib/nodes/flows/Flow.js | 60 +++++++++--------- 8 files changed, 106 insertions(+), 69 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index 4a1c6e9a0..7e189ba91 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -463,7 +463,9 @@ RED.nodes = (function() { node.id = n.id; node.type = n.type; node.z = n.z; - + if (n.d === true) { + node.d = true; + } if (node.type == "unknown") { for (var p in n._orig) { if (n._orig.hasOwnProperty(p)) { @@ -1016,6 +1018,9 @@ RED.nodes = (function() { if (n.hasOwnProperty('l')) { node.l = n.l; } + if (n.hasOwnProperty('d')) { + node.d = n.d; + } if (createNewIds) { if (subflow_blacklist[n.z]) { continue; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js index 1a52183d3..999606912 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js @@ -42,12 +42,11 @@ var enabledLabel = this.options.enabledLabel || RED._("editor:workspace.enabled"); var disabledLabel = this.options.disabledLabel || RED._("editor:workspace.disabled"); - this.element.addClass("red-ui-toggleButton"); this.element.css("display","none"); this.element.on("focus", function() { that.button.focus(); }); - this.button = $(''); + this.button = $(''); if (this.options.class) { this.button.addClass(this.options.class) } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index b64bb8e5c..336b80e9c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -955,34 +955,19 @@ RED.editor = (function() { $('
                '+ ''+ - ' '+ - ''+ + ''+ '
                ').appendTo(dialogForm); - var setToggleState = function(state) { - var i = $("#node-input-show-label-btn-i"); - if (!state) { - i.addClass('fa-toggle-off'); - i.removeClass('fa-toggle-on'); - $("#node-input-show-label").prop("checked",false); - $("#node-input-show-label-label").text(RED._("editor.hide")); - } else { - i.addClass('fa-toggle-on'); - i.removeClass('fa-toggle-off'); - $("#node-input-show-label").prop("checked",true); - $("#node-input-show-label-label").text(RED._("editor.show")); - } - } - dialogForm.find('#node-input-show-label-btn').on("click",function(e) { - e.preventDefault(); - var i = $("#node-input-show-label-btn-i"); - setToggleState(i.hasClass('fa-toggle-off')); + $("#node-input-show-label").toggleButton({ + enabledLabel: RED._("editor.show"), + disabledLabel: RED._("editor.hide") }) + if (!node.hasOwnProperty("l")) { // Show label if type not link node.l = !/^link (in|out)$/.test(node._def.type); } - setToggleState(node.l); + $("#node-input-show-label").prop("checked",node.l).trigger("change"); // If a node has icon property in defaults, the icon of the node cannot be modified. (e.g, ui_button node in dashboard) if ((!node._def.defaults || !node._def.defaults.hasOwnProperty("icon"))) { @@ -1396,6 +1381,20 @@ RED.editor = (function() { node.l = true; } } + if ($("#node-input-node-disabled").prop('checked')) { + if (node.d !== true) { + changes.d = node.d; + changed = true; + node.d = true; + } + } else { + if (node.d === true) { + changes.d = node.d; + changed = true; + delete node.d; + } + } + node.resize = true; var oldInfo = node.info; @@ -1498,6 +1497,12 @@ RED.editor = (function() { var trayBody = tray.find('.red-ui-tray-body'); trayBody.parent().css('overflow','hidden'); + var trayFooterLeft = $('').appendTo(trayFooter) + + $('').prop("checked",!!node.d).appendTo(trayFooterLeft).toggleButton({ + invertState: true + }) + var editorTabEl = $('
                  ').appendTo(trayBody); var editorContent = $('
                  ').appendTo(trayBody); @@ -1675,9 +1680,15 @@ RED.editor = (function() { var trayHeader = tray.find(".red-ui-tray-header"); var trayBody = tray.find('.red-ui-tray-body'); var trayFooter = tray.find(".red-ui-tray-footer"); - var userCountDiv; + + var trayFooterLeft = $('').appendTo(trayFooter) + + $('').appendTo(trayFooterLeft).toggleButton({ + invertState: true + }) + if (node_def.hasUsers !== false) { - userCountDiv = $('').prependTo(trayFooter); + $(' ').css("margin-left", "10px").appendTo(trayFooterLeft); } trayFooter.append(''); @@ -1771,8 +1782,8 @@ RED.editor = (function() { } }); } - if (node_def.hasUsers !== false && userCountDiv) { - userCountDiv.find("span").text(RED._("editor.nodesUse", {count:editing_config_node.users.length})).parent().show(); + if (node_def.hasUsers !== false) { + $("#red-ui-editor-config-user-count").text(RED._("editor.nodesUse", {count:editing_config_node.users.length})).parent().show(); } trayBody.i18n(); trayFooter.i18n(); 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 d5a76eacd..cdc8bd311 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 @@ -2929,6 +2929,7 @@ RED.view = (function() { d.resize = false; } var thisNode = d3.select(this); + thisNode.classed("red-ui-flow-node-disabled", function(d) { return d.d === true}); thisNode.classed("red-ui-flow-subflow",function(d) { return activeSubflow != null; }) //thisNode.selectAll(".centerDot").attr({"cx":function(d) { return d.w/2;},"cy":function(d){return d.h/2}}); @@ -3248,6 +3249,7 @@ RED.view = (function() { } return path; }); + link.classed("red-ui-flow-node-disabled", function(d) { return d.source.d || d.target.d; }); } }) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index 83c72b07b..6338eb73e 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss @@ -79,15 +79,20 @@ .red-ui-tray-footer { @include component-footer; height: 35px; - font-size: 12px !important; + font-size: 14px !important; line-height: 35px; vertical-align: middle; - button { - @include editor-button; - padding: 3px 7px; - font-size: 11px; + button.red-ui-button { + padding: 0px 8px; + height: 26px; + line-height: 26px; + &.toggle:not(.selected) { + color: $workspace-button-color-selected !important; + background: $workspace-button-background-active; + } } + .red-ui-tray-footer-left { display:inline-block; margin-right: 20px; @@ -563,8 +568,6 @@ button.red-ui-button-small } - - .red-ui-editor-type-json-editor-item-handle { cursor: move; } @@ -572,3 +575,7 @@ button.red-ui-button-small position: relative; height: calc(100% - 40px); } + +button.red-ui-toggleButton.toggle { + text-align: left; +} diff --git a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss index 4f24a6f11..c440ab4a8 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss @@ -146,11 +146,11 @@ g.red-ui-flow-node-selected { border-style: dashed !important; stroke: $node-selected-color; stroke-width: 2; - stroke-dasharray: 10, 4; + stroke-dasharray: 8, 3; } .red-ui-flow-subflow .red-ui-flow-node { - stroke-dasharray:8, 3; + stroke-dasharray:8, 2; } .red-ui-workspace-disabled { .red-ui-flow-link-line { @@ -159,10 +159,21 @@ g.red-ui-flow-node-selected { stroke: $link-subflow-color; } .red-ui-flow-node { - stroke-dasharray: 10,4; + stroke-dasharray: 8, 3; + fill-opacity: 0.6; + } +} +.red-ui-flow-node-disabled { + &.red-ui-flow-node, .red-ui-flow-node { + stroke-dasharray: 8, 3; + fill-opacity: 0.6; + } + &.red-ui-flow-link-line { + stroke-dasharray: 10,5 !important; + stroke-width: 2 !important; + stroke: $link-subflow-color; } } - @each $current-color in red green yellow blue grey { .red-ui-flow-node-status-dot-#{$current-color} { fill: map-get($node-status-colors,$current-color); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss index 91978057e..dda9ef384 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss @@ -192,7 +192,7 @@ right: 0; height: 25px; line-height: 25px; - padding: 0 10px; + padding: 0 6px; user-select: none; .button-group:not(:last-child) { diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js index 8b0341463..d200a6684 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js @@ -171,37 +171,39 @@ class Flow { for (id in this.flow.nodes) { if (this.flow.nodes.hasOwnProperty(id)) { node = this.flow.nodes[id]; - if (!node.subflow) { - if (!this.activeNodes[id]) { - newNode = flowUtil.createNode(this,node); - if (newNode) { - this.activeNodes[id] = newNode; + if (node.d !== true) { + if (!node.subflow) { + if (!this.activeNodes[id]) { + newNode = flowUtil.createNode(this,node); + if (newNode) { + this.activeNodes[id] = newNode; + } } - } - } else { - if (!this.subflowInstanceNodes[id]) { - try { - var subflowDefinition = this.flow.subflows[node.subflow]||this.global.subflows[node.subflow] - // console.log("NEED TO CREATE A SUBFLOW",id,node.subflow); - this.subflowInstanceNodes[id] = true; - var subflow = Subflow.create( - this, - this.global, - subflowDefinition, - node - ); - this.subflowInstanceNodes[id] = subflow; - subflow.start(); - this.activeNodes[id] = subflow.node; + } else { + if (!this.subflowInstanceNodes[id]) { + try { + var subflowDefinition = this.flow.subflows[node.subflow]||this.global.subflows[node.subflow] + // console.log("NEED TO CREATE A SUBFLOW",id,node.subflow); + this.subflowInstanceNodes[id] = true; + var subflow = Subflow.create( + this, + this.global, + subflowDefinition, + node + ); + this.subflowInstanceNodes[id] = subflow; + subflow.start(); + this.activeNodes[id] = subflow.node; - // this.subflowInstanceNodes[id] = nodes.map(function(n) { return n.id}); - // for (var i=0;i Date: Mon, 17 Jun 2019 15:37:45 +0100 Subject: [PATCH 101/137] Don't allow a link node virtual wire to connect to normal port --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d5a76eacd..4f5e4da9b 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 @@ -1939,7 +1939,7 @@ RED.view = (function() { } var link = {source: src, sourcePort:src_port, target: dst}; if (drag_line.virtualLink) { - if (/^link (in|out)$/.test(src.type) && /^link (in|out)$/.test(dst.type)) { + if (/^link (in|out)$/.test(src.type) && /^link (in|out)$/.test(dst.type) && src.type !== dst.type) { if (src.links.indexOf(dst.id) === -1 && dst.links.indexOf(src.id) === -1) { var oldSrcLinks = $.extend(true,{},{v:src.links}).v var oldDstLinks = $.extend(true,{},{v:dst.links}).v From 2473249c8b3c91f6242d6f6656dae46031f83d74 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 17 Jun 2019 22:46:34 +0100 Subject: [PATCH 102/137] Allow config nodes to be disabled, tidy css and add actions --- .../@node-red/editor-client/src/js/nodes.js | 3 ++ .../editor-client/src/js/ui/editor.js | 18 ++++++- .../editor-client/src/js/ui/tab-config.js | 7 ++- .../@node-red/editor-client/src/js/ui/view.js | 48 +++++++++++++++++- .../editor-client/src/js/ui/workspaces.js | 7 ++- .../editor-client/src/sass/colors.scss | 6 +-- .../editor-client/src/sass/flow.scss | 42 +++++++++------- .../editor-client/src/sass/tab-config.scss | 10 +++- .../@node-red/runtime/lib/nodes/flows/Flow.js | 50 ++++++++++++------- 9 files changed, 142 insertions(+), 49 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index 7e189ba91..5c544e7b7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -969,6 +969,9 @@ RED.nodes = (function() { users:[], _config:{} }; + if (n.hasOwnProperty('d')) { + configNode.d = n.d; + } for (d in def.defaults) { if (def.defaults.hasOwnProperty(d)) { configNode[d] = n[d]; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index 336b80e9c..1b3ccea52 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -1500,6 +1500,8 @@ RED.editor = (function() { var trayFooterLeft = $('').appendTo(trayFooter) $('').prop("checked",!!node.d).appendTo(trayFooterLeft).toggleButton({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", invertState: true }) @@ -1683,7 +1685,9 @@ RED.editor = (function() { var trayFooterLeft = $('').appendTo(trayFooter) - $('').appendTo(trayFooterLeft).toggleButton({ + $('').prop("checked",!!editing_config_node.d).appendTo(trayFooterLeft).toggleButton({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", invertState: true }) @@ -1918,6 +1922,16 @@ RED.editor = (function() { editing_config_node.label = configTypeDef.label; editing_config_node.z = scope; + if ($("#node-config-input-node-disabled").prop('checked')) { + if (editing_config_node.d !== true) { + editing_config_node.d = true; + } + } else { + if (editing_config_node.d === true) { + delete editing_config_node.d; + } + } + if (scope) { // Search for nodes that use this one that are no longer // in scope, so must be removed @@ -2072,7 +2086,7 @@ RED.editor = (function() { RED.nodes.eachConfig(function(config) { if (config.type == type && (!config.z || config.z === activeWorkspace.id)) { var label = RED.utils.getNodeLabel(config,config.id); - config.__label__ = label; + config.__label__ = label+(config.d?" ["+RED._("workspace.disabled")+"]":""); configNodes.push(config); } }); 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 c7131aa7e..86785c385 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 @@ -145,7 +145,12 @@ RED.sidebar.config = (function() { var entry = $('
                • ').appendTo(list); var nodeDiv = $('
                  ').appendTo(entry); entry.data('node',node.id); - $('
                  ').text(label).appendTo(nodeDiv); + var label = $('
                  ').text(label).appendTo(nodeDiv); + if (node.d) { + nodeDiv.addClass("red-ui-palette-node-config-disabled"); + $('').prependTo(label); + } + if (node._def.hasUsers !== false) { var iconContainer = $('
                  ',{class:"red-ui-palette-icon-container red-ui-palette-icon-container-right"}).appendTo(nodeDiv); if (node.users.length === 0) { 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 cdc8bd311..81453c675 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 @@ -410,6 +410,8 @@ RED.view = (function() { RED.actions.add("core:zoom-in",zoomIn); RED.actions.add("core:zoom-out",zoomOut); RED.actions.add("core:zoom-reset",zoomZero); + RED.actions.add("core:enable-selected-nodes", function() { setSelectedNodeState(false)}); + RED.actions.add("core:disable-selected-nodes", function() { setSelectedNodeState(true)}); RED.actions.add("core:toggle-show-grid",function(state) { if (state === undefined) { @@ -2376,7 +2378,7 @@ RED.view = (function() { function isButtonEnabled(d) { var buttonEnabled = true; var ws = RED.nodes.workspace(RED.workspaces.active()); - if (ws && !ws.disabled) { + if (ws && !ws.disabled && !d.d) { if (d._def.button.hasOwnProperty('enabled')) { if (typeof d._def.button.enabled === "function") { buttonEnabled = d._def.button.enabled.call(d); @@ -2397,7 +2399,7 @@ RED.view = (function() { } var activeWorkspace = RED.workspaces.active(); var ws = RED.nodes.workspace(activeWorkspace); - if (ws && !ws.disabled) { + if (ws && !ws.disabled && !d.d) { if (d._def.button.toggle) { d[d._def.button.toggle] = !d[d._def.button.toggle]; d.dirty = true; @@ -3580,6 +3582,48 @@ RED.view = (function() { //TODO: subscribe/unsubscribe here redraw(); } + function setSelectedNodeState(isDisabled) { + if (mouse_mode === RED.state.SELECTING_NODE) { + return; + } + var workspaceSelection = RED.workspaces.selection(); + var changed = false; + if (workspaceSelection.length > 0) { + // TODO: toggle workspace state + } else if (moving_set.length > 0) { + var historyEvents = []; + for (var i=0;i 0) { + RED.history.push({ + t:"multi", + events: historyEvents, + dirty:RED.nodes.dirty() + }) + RED.nodes.dirty(true) + } + } + RED.view.redraw(); + + } return { init: init, diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index 3fffe2e64..db36004ab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -201,8 +201,11 @@ RED.workspaces = (function() { } else { workspace.disabled = false; } - $("#node-input-disabled").toggleButton({invertState: true}) - + $("#node-input-disabled").toggleButton({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", + invertState: true + }) $('').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss index 3b6d14280..8411343c5 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss @@ -224,10 +224,10 @@ $node-status-colors: ( $node-selected-color: #ff7f0e; $port-selected-color: #ff7f0e; -$link-color: #888; -$link-link-color: #ccc; +$link-color: #999; +$link-link-color: #aaa; +$link-disabled-color: #ccc; $link-link-active-color: #ff7f0e; -$link-subflow-color: #bbb; $link-unknown-color: #f00; $clipboard-textarea-background: #F3E7E7; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss index c440ab4a8..4aae0869c 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss @@ -150,28 +150,36 @@ g.red-ui-flow-node-selected { } .red-ui-flow-subflow .red-ui-flow-node { - stroke-dasharray:8, 2; } + .red-ui-workspace-disabled { - .red-ui-flow-link-line { - stroke-dasharray: 10,5 !important; - stroke-width: 2 !important; - stroke: $link-subflow-color; - } .red-ui-flow-node { stroke-dasharray: 8, 3; - fill-opacity: 0.6; + fill-opacity: 0.5; + } + .red-ui-flow-link-line { + stroke-dasharray: 10,8 !important; + stroke-width: 2 !important; + stroke: $link-disabled-color; + } + .red-ui-flow-port { + fill-opacity: 1; + stroke-dasharray: none; } } .red-ui-flow-node-disabled { &.red-ui-flow-node, .red-ui-flow-node { stroke-dasharray: 8, 3; - fill-opacity: 0.6; + fill-opacity: 0.5; } &.red-ui-flow-link-line { - stroke-dasharray: 10,5 !important; + stroke-dasharray: 10,8 !important; stroke-width: 2 !important; - stroke: $link-subflow-color; + stroke: $link-disabled-color; + } + .red-ui-flow-port { + fill-opacity: 1; + stroke-dasharray: none; } } @each $current-color in red green yellow blue grey { @@ -199,7 +207,6 @@ g.red-ui-flow-node-selected { } .red-ui-flow-subflow-port { - stroke-dasharray: 5,5; fill: $node-background-placeholder; stroke: $node-border; } @@ -219,12 +226,14 @@ g.red-ui-flow-node-selected { } .red-ui-flow-link-link { stroke-width: 2; - stroke-dasharray: 10,5; stroke: $link-link-color; fill: none; - stroke-dasharray: 15,2; - // pointer-events: none; + stroke-dasharray: 25,4; } +.red-ui-flow-link-off-flow { + stroke-width: 2; +} + .red-ui-flow-link-port { fill: $node-link-port-background; stroke: $link-link-color; @@ -236,11 +245,6 @@ g.red-ui-flow-node-selected { .red-ui-flow-link-group:hover { cursor: pointer; } -.red-ui-flow-subflow-link { - stroke: $link-subflow-color; - stroke-dasharray: 10,5; - stroke-width: 2; -} .red-ui-flow-link-outline { stroke: $view-background; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-config.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-config.scss index 69a2ee5dd..467ce8511 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-config.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-config.scss @@ -94,12 +94,20 @@ ul.red-ui-sidebar-node-config-list li.red-ui-palette-node-config-type { text-align:right; padding-right: 3px; } -.red-ui-palette-node-config-unused { +.red-ui-palette-node-config-unused,.red-ui-palette-node-config-disabled { border-color: $primary-border-color; background: $secondary-background-inactive; border-style: dashed; color: $tertiary-text-color; } +.red-ui-palette-node-config-disabled { + opacity: 0.6; + font-style: italic; + i { + color: $secondary-text-color; + margin-right: 5px; + } +} .red-ui-sidebar-node-config-filter-info { position: absolute; top: 0; diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js index d200a6684..6077f50cd 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js @@ -132,29 +132,39 @@ class Flow { id = configNodes.shift(); node = this.flow.configs[id]; if (!this.activeNodes[id]) { - var readyToCreate = true; - // This node doesn't exist. - // Check it doesn't reference another non-existent config node - for (var prop in node) { - if (node.hasOwnProperty(prop) && prop !== 'id' && prop !== 'wires' && prop !== '_users' && this.flow.configs[node[prop]]) { - if (!this.activeNodes[node[prop]]) { - // References a non-existent config node - // Add it to the back of the list to try again later - configNodes.push(id); - configNodeAttempts[id] = (configNodeAttempts[id]||0)+1; - if (configNodeAttempts[id] === 100) { - throw new Error("Circular config node dependency detected: "+id); + if (node.d !== true) { + var readyToCreate = true; + // This node doesn't exist. + // Check it doesn't reference another non-existent config node + for (var prop in node) { + if (node.hasOwnProperty(prop) && + prop !== 'id' && + prop !== 'wires' && + prop !== '_users' && + this.flow.configs[node[prop]] && + this.flow.configs[node[prop]].d !== true + ) { + if (!this.activeNodes[node[prop]]) { + // References a non-existent config node + // Add it to the back of the list to try again later + configNodes.push(id); + configNodeAttempts[id] = (configNodeAttempts[id]||0)+1; + if (configNodeAttempts[id] === 100) { + throw new Error("Circular config node dependency detected: "+id); + } + readyToCreate = false; + break; } - readyToCreate = false; - break; } } - } - if (readyToCreate) { - newNode = flowUtil.createNode(this,node); - if (newNode) { - this.activeNodes[id] = newNode; + if (readyToCreate) { + newNode = flowUtil.createNode(this,node); + if (newNode) { + this.activeNodes[id] = newNode; + } } + } else { + this.debug("not starting disabled config node : "+id); } } } @@ -206,6 +216,8 @@ class Flow { } } } + } else { + this.debug("not starting disabled node : "+id); } } } From f106019938bb90f61d89e409a3deb38c074921b9 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 18 Jun 2019 11:02:31 +0100 Subject: [PATCH 103/137] Add runtime test for disabled nodes --- .../runtime/lib/nodes/flows/Flow_spec.js | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/unit/@node-red/runtime/lib/nodes/flows/Flow_spec.js b/test/unit/@node-red/runtime/lib/nodes/flows/Flow_spec.js index 172ac11e6..e7430a6c2 100644 --- a/test/unit/@node-red/runtime/lib/nodes/flows/Flow_spec.js +++ b/test/unit/@node-red/runtime/lib/nodes/flows/Flow_spec.js @@ -319,6 +319,57 @@ describe('Flow', function() { }); }); + it("ignores disabled nodes",function(done) { + var config = flowUtils.parseConfig([ + {id:"t1",type:"tab"}, + {id:"1",x:10,y:10,z:"t1",type:"test",foo:"a",wires:["2"]}, + {id:"2",x:10,y:10,z:"t1",d:true,type:"test",foo:"a",wires:["3"]}, + {id:"3",x:10,y:10,z:"t1",type:"test",foo:"a",wires:[]}, + {id:"4",z:"t1",type:"test",foo:"a"}, + {id:"5",z:"t1",type:"test",d:true,foo:"a"} + + ]); + var flow = Flow.create({},config,config.flows["t1"]); + flow.start(); + + Object.keys(flow.getActiveNodes()).should.have.length(3); + + flow.getNode('1').should.have.a.property('id','1'); + should.not.exist(flow.getNode('2')); + flow.getNode('3').should.have.a.property('id','3'); + flow.getNode('4').should.have.a.property('id','4'); + should.not.exist(flow.getNode('5')); + + currentNodes.should.have.a.property("1"); + currentNodes.should.not.have.a.property("2"); + currentNodes.should.have.a.property("3"); + currentNodes.should.have.a.property("4"); + + currentNodes["1"].should.have.a.property("handled",0); + currentNodes["3"].should.have.a.property("handled",0); + + currentNodes["1"].receive({payload:"test"}); + + currentNodes["1"].should.have.a.property("handled",1); + // Message doesn't reach 3 as 2 is disabled + currentNodes["3"].should.have.a.property("handled",0); + + flow.stop().then(function() { + try { + currentNodes.should.not.have.a.property("1"); + currentNodes.should.not.have.a.property("2"); + currentNodes.should.not.have.a.property("3"); + currentNodes.should.not.have.a.property("4"); + stoppedNodes.should.have.a.property("1"); + stoppedNodes.should.not.have.a.property("2"); + stoppedNodes.should.have.a.property("3"); + stoppedNodes.should.have.a.property("4"); + done(); + } catch(err) { + done(err); + } + }); + }); }); From 60b1a058946adb5bbda21ecb6da1dd3be59b1479 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 18 Jun 2019 11:40:13 +0100 Subject: [PATCH 104/137] Fix styling of Debug pop-out window --- .../node_modules/@node-red/nodes/core/core/lib/debug/view.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/core/lib/debug/view.html b/packages/node_modules/@node-red/nodes/core/core/lib/debug/view.html index bd9016744..3f0bdcfa1 100644 --- a/packages/node_modules/@node-red/nodes/core/core/lib/debug/view.html +++ b/packages/node_modules/@node-red/nodes/core/core/lib/debug/view.html @@ -4,7 +4,7 @@ Node-RED Debug Tools - + From 8486f4d43a9f82e857d807fc7451cca554eff37f Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 19 Jun 2019 10:10:17 +0100 Subject: [PATCH 105/137] Copy data-i18n attribute on TypedInput Fixes #2211 --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 1b18968bf..672b69a28 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -160,7 +160,7 @@ that.input.css("margin"+d,0); }); - ["type","placeholder"].forEach(function(d) { + ["type","placeholder","data-i18n"].forEach(function(d) { var m = that.element.attr(d); that.input.attr(d,m); }); From 92cb57eb7b949f5e043f4c5c64dd8877118e5174 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 20 Jun 2019 18:14:46 +0100 Subject: [PATCH 106/137] Fix join node reset issue with merging objects and add tests to close #2188 --- .../node_modules/@node-red/nodes/core/logic/17-split.js | 5 +++-- test/nodes/core/logic/17-split_spec.js | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/logic/17-split.js b/packages/node_modules/@node-red/nodes/core/logic/17-split.js index 09ebd921e..c644b9e36 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/17-split.js +++ b/packages/node_modules/@node-red/nodes/core/logic/17-split.js @@ -572,6 +572,8 @@ module.exports = function(RED) { } } + if (msg.hasOwnProperty("reset")) { if (inflight[partId]) { delete inflight[partId] }; return; } + if ((payloadType === 'object') && (propertyKey === null || propertyKey === undefined || propertyKey === "")) { if (node.mode === "auto") { node.warn("Message missing 'msg.parts.key' property - cannot add to object"); @@ -590,7 +592,6 @@ module.exports = function(RED) { return; } - if (msg.hasOwnProperty("reset")) { if (inflight[partid]) { delete inflight[partId] } return; } if (!inflight.hasOwnProperty(partId)) { if (payloadType === 'object' || payloadType === 'merged') { inflight[partId] = { @@ -633,7 +634,7 @@ module.exports = function(RED) { } if (payloadType === 'object') { group.payload[propertyKey] = property; - group.currentCount = (group.currentCount || 0) + 1; + group.currentCount = Object.keys(group.payload).length; } else if (payloadType === 'merged') { if (Array.isArray(property) || typeof property !== 'object') { if (!msg.hasOwnProperty("complete")) { diff --git a/test/nodes/core/logic/17-split_spec.js b/test/nodes/core/logic/17-split_spec.js index 788172ebe..e55682965 100644 --- a/test/nodes/core/logic/17-split_spec.js +++ b/test/nodes/core/logic/17-split_spec.js @@ -677,6 +677,9 @@ describe('JOIN node', function() { n1.receive({payload:{f:1}, topic:"f", complete:true}); n1.receive({payload:{g:2}, topic:"g"}); n1.receive({payload:{h:1}, topic:"h"}); + n1.receive({reset:true}); + n1.receive({payload:{g:2}, topic:"g"}); + n1.receive({payload:{h:1}, topic:"h"}); n1.receive({payload:{i:3}, topic:"i"}); }); }); @@ -700,6 +703,9 @@ describe('JOIN node', function() { } catch(e) { done(e) } }); + n1.receive({payload:2, foo:"b"}); + n1.receive({payload:3, foo:"c"}); + n1.receive({reset:true}); n1.receive({payload:1, foo:"a"}); n1.receive({payload:2, foo:"b"}); n1.receive({payload:3, foo:"c"}); From f3fc08333053e7ff2280ef0fb882d81a344331ca Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 20 Jun 2019 18:14:46 +0100 Subject: [PATCH 107/137] Fix join node reset issue with merging objects and add tests to close #2188 --- .../node_modules/@node-red/nodes/core/logic/17-split.js | 5 +++-- test/nodes/core/logic/17-split_spec.js | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/logic/17-split.js b/packages/node_modules/@node-red/nodes/core/logic/17-split.js index fc13f96a9..ec879c253 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/17-split.js +++ b/packages/node_modules/@node-red/nodes/core/logic/17-split.js @@ -572,6 +572,8 @@ module.exports = function(RED) { } } + if (msg.hasOwnProperty("reset")) { if (inflight[partId]) { delete inflight[partId] }; return; } + if ((payloadType === 'object') && (propertyKey === null || propertyKey === undefined || propertyKey === "")) { if (node.mode === "auto") { node.warn("Message missing 'msg.parts.key' property - cannot add to object"); @@ -590,7 +592,6 @@ module.exports = function(RED) { return; } - if (msg.hasOwnProperty("reset")) { if (inflight[partid]) { delete inflight[partId] } return; } if (!inflight.hasOwnProperty(partId)) { if (payloadType === 'object' || payloadType === 'merged') { inflight[partId] = { @@ -631,7 +632,7 @@ module.exports = function(RED) { } if (payloadType === 'object') { group.payload[propertyKey] = property; - group.currentCount = (group.currentCount || 0) + 1; + group.currentCount = Object.keys(group.payload).length; } else if (payloadType === 'merged') { if (Array.isArray(property) || typeof property !== 'object') { if (!msg.hasOwnProperty("complete")) { diff --git a/test/nodes/core/logic/17-split_spec.js b/test/nodes/core/logic/17-split_spec.js index 788172ebe..e55682965 100644 --- a/test/nodes/core/logic/17-split_spec.js +++ b/test/nodes/core/logic/17-split_spec.js @@ -677,6 +677,9 @@ describe('JOIN node', function() { n1.receive({payload:{f:1}, topic:"f", complete:true}); n1.receive({payload:{g:2}, topic:"g"}); n1.receive({payload:{h:1}, topic:"h"}); + n1.receive({reset:true}); + n1.receive({payload:{g:2}, topic:"g"}); + n1.receive({payload:{h:1}, topic:"h"}); n1.receive({payload:{i:3}, topic:"i"}); }); }); @@ -700,6 +703,9 @@ describe('JOIN node', function() { } catch(e) { done(e) } }); + n1.receive({payload:2, foo:"b"}); + n1.receive({payload:3, foo:"c"}); + n1.receive({reset:true}); n1.receive({payload:1, foo:"a"}); n1.receive({payload:2, foo:"b"}); n1.receive({payload:3, foo:"c"}); From e315325d91b01f58e0fd0877cdb5e4a781dd8209 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 20 Jun 2019 21:15:20 +0100 Subject: [PATCH 108/137] Fix parsing of content-type header Fixes #2216 This was broken when we switched from media-typer to content-type modules for parsing the content-type header. The content-type header can handle the field with parameters, but does not do the type/sub-type parsing that media-typer does. Our code relied on that extra bit of parsing to correctly identify if the content should be parsed to String or kept as a buffer. The fix restores the use of media-typer, but using the result of the content-type module to make sure it valid --- package.json | 1 + .../@node-red/nodes/core/io/21-httpin.js | 29 +++++++++++-------- .../node_modules/@node-red/nodes/package.json | 1 + 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d401a614e..30ef53dc0 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "js-yaml": "3.13.1", "json-stringify-safe": "5.0.1", "jsonata": "1.6.4", + "media-typer": "1.1.0", "memorystore": "1.6.1", "mime": "2.4.2", "mqtt": "2.18.8", diff --git a/packages/node_modules/@node-red/nodes/core/io/21-httpin.js b/packages/node_modules/@node-red/nodes/core/io/21-httpin.js index 7e90478f7..fc3fafd28 100644 --- a/packages/node_modules/@node-red/nodes/core/io/21-httpin.js +++ b/packages/node_modules/@node-red/nodes/core/io/21-httpin.js @@ -23,6 +23,7 @@ module.exports = function(RED) { var cors = require('cors'); var onHeaders = require('on-headers'); var typer = require('content-type'); + var mediaTyper = require('media-typer'); var isUtf8 = require('is-utf8'); var hashSum = require("hash-sum"); @@ -36,18 +37,22 @@ module.exports = function(RED) { var checkUTF = false; if (req.headers['content-type']) { - var parsedType = typer.parse(req.headers['content-type']) - if (parsedType.type === "text") { - isText = true; - } else if (parsedType.subtype === "xml" || parsedType.suffix === "xml") { - isText = true; - } else if (parsedType.type !== "application") { - isText = false; - } else if (parsedType.subtype !== "octet-stream") { - checkUTF = true; - } else { - // applicatino/octet-stream - isText = false; + var contentType = typer.parse(req.headers['content-type']) + if (contentType.type) { + var parsedType = mediaTyper.parse(contentType.type); + if (parsedType.type === "text") { + isText = true; + } else if (parsedType.subtype === "xml" || parsedType.suffix === "xml") { + isText = true; + } else if (parsedType.type !== "application") { + isText = false; + } else if (parsedType.subtype !== "octet-stream") { + checkUTF = true; + } else { + // applicatino/octet-stream + isText = false; + } + } } diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 9263de215..6916eadaf 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -30,6 +30,7 @@ "https-proxy-agent": "2.2.1", "is-utf8": "0.2.1", "js-yaml": "3.13.1", + "media-typer": "1.1.0", "mqtt": "2.18.8", "multer": "1.4.1", "mustache": "3.0.1", From 46abd0cc429899b0c88fffac1b52051b44849018 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 20 Jun 2019 22:33:38 +0100 Subject: [PATCH 109/137] Clear HTTP Request node authType when auth disabled Fixes #2215 --- .../nodes/core/io/21-httprequest.html | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/21-httprequest.html b/packages/node_modules/@node-red/nodes/core/io/21-httprequest.html index 1fd10af9c..4c2a7c0d6 100644 --- a/packages/node_modules/@node-red/nodes/core/io/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/core/io/21-httprequest.html @@ -49,12 +49,13 @@
                  - - +
                  @@ -102,7 +103,7 @@ url:{value:"",validate:function(v) { return (v.trim().length === 0) || (v.indexOf("://") === -1) || (v.trim().indexOf("http") === 0)} }, tls: {type:"tls-config",required: false}, proxy: {type:"http proxy",required: false}, - authType: {value: "basic"} + authType: {value: ""} }, credentials: { user: {type:"text"}, @@ -130,7 +131,7 @@ $(".node-input-useAuth-row").show(); // Nodes (< version 0.20.x) with credentials but without authentication type, need type 'basic' if (!$('#node-input-authType').val()) { - $('#node-input-authType').val('basic'); + $("#node-input-authType-select").val('basic').trigger("change"); } } else { $(".node-input-useAuth-row").hide(); @@ -139,12 +140,14 @@ $('#node-input-password').val(''); } }); - $("#node-input-authType").change(function() { - if ($(this).val() == "basic" || $(this).val() == "digest") { + $("#node-input-authType-select").change(function() { + var val = $(this).val(); + $("#node-input-authType").val(val); + if (val === "basic" || val === "digest") { $(".node-input-basic-row").show(); $('#node-span-password').show(); $('#node-span-token').hide(); - } else if ($(this).val() == "bearer") { + } else if (val === "bearer") { $(".node-input-basic-row").hide(); $('#node-span-password').hide(); $('#node-span-token').show(); @@ -158,8 +161,9 @@ $(".node-input-paytoqs-row").hide(); } }); - if (this.credentials.user || this.credentials.has_password) { + if (this.authType) { $('#node-input-useAuth').prop('checked', true); + $("#node-input-authType-select").val(this.authType); } else { $('#node-input-useAuth').prop('checked', false); } From d623848c87f489d1ae4efd089be353c963489e22 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 21 Jun 2019 12:36:20 +0100 Subject: [PATCH 110/137] Update all node icons to SVG When listing icons provided by a module, if there is a png and svg with the same name, only the svg will be listed. If a node asks for a png icon which is not known, but there is a corresponding svg, that will be used instead. --- .../@node-red/editor-api/lib/editor/ui.js | 2 +- .../src/images/icons/arrow-in.svg | 1 + .../src/images/icons/node-changed.png | Bin 386 -> 0 bytes .../src/images/icons/node-error.png | Bin 386 -> 0 bytes .../editor-client/src/images/subflow_tab.svg | 1 + .../@node-red/editor-client/src/js/nodes.js | 4 ++-- .../@node-red/editor-client/src/js/ui/diff.js | 8 +++---- .../editor-client/src/js/ui/editor.js | 2 +- .../editor-client/src/js/ui/utils.js | 21 +++++++++++------- .../@node-red/editor-client/src/js/ui/view.js | 16 +++++++++---- .../editor-client/src/js/ui/workspaces.js | 2 +- .../@node-red/nodes/core/core/20-inject.html | 2 +- .../@node-red/nodes/core/core/25-catch.html | 2 +- .../@node-red/nodes/core/core/25-status.html | 4 ++-- .../@node-red/nodes/core/core/58-debug.html | 2 +- .../@node-red/nodes/core/core/60-link.html | 4 ++-- .../@node-red/nodes/core/core/75-exec.html | 2 +- .../nodes/core/core/80-function.html | 2 +- .../nodes/core/core/80-template.html | 2 +- .../@node-red/nodes/core/core/89-delay.html | 2 +- .../@node-red/nodes/core/core/89-trigger.html | 2 +- .../@node-red/nodes/core/core/90-comment.html | 2 +- .../@node-red/nodes/core/io/10-mqtt.html | 4 ++-- .../@node-red/nodes/core/io/21-httpin.html | 4 ++-- .../nodes/core/io/21-httprequest.html | 2 +- .../@node-red/nodes/core/io/22-websocket.html | 4 ++-- .../@node-red/nodes/core/io/23-watch.html | 2 +- .../@node-red/nodes/core/io/31-tcpin.html | 6 ++--- .../@node-red/nodes/core/io/32-udp.html | 4 ++-- .../@node-red/nodes/core/logic/10-switch.html | 2 +- .../@node-red/nodes/core/logic/15-change.html | 2 +- .../@node-red/nodes/core/logic/16-range.html | 2 +- .../@node-red/nodes/core/logic/17-split.html | 4 ++-- .../@node-red/nodes/core/logic/18-sort.html | 2 +- .../@node-red/nodes/core/logic/19-batch.html | 2 +- .../@node-red/nodes/core/parsers/70-CSV.html | 2 +- .../@node-red/nodes/core/parsers/70-HTML.html | 2 +- .../@node-red/nodes/core/parsers/70-JSON.html | 2 +- .../@node-red/nodes/core/parsers/70-XML.html | 2 +- .../@node-red/nodes/core/parsers/70-YAML.html | 2 +- .../@node-red/nodes/core/storage/50-file.html | 4 ++-- .../@node-red/nodes/icons/alert.svg | 1 + .../@node-red/nodes/icons/arrow-in.svg | 1 + .../@node-red/nodes/icons/batch.svg | 1 + .../@node-red/nodes/icons/bridge-dash.svg | 1 + .../@node-red/nodes/icons/bridge.svg | 1 + .../@node-red/nodes/icons/cog.svg | 1 + .../@node-red/nodes/icons/comment.svg | 1 + .../node_modules/@node-red/nodes/icons/db.svg | 1 + .../@node-red/nodes/icons/debug.svg | 1 + .../@node-red/nodes/icons/envelope.svg | 1 + .../@node-red/nodes/icons/feed.svg | 1 + .../@node-red/nodes/icons/file-in.svg | 1 + .../@node-red/nodes/icons/file-out.svg | 1 + .../@node-red/nodes/icons/file.svg | 1 + .../@node-red/nodes/icons/function.svg | 1 + .../@node-red/nodes/icons/hash.svg | 1 + .../@node-red/nodes/icons/inject.svg | 1 + .../@node-red/nodes/icons/join.svg | 1 + .../@node-red/nodes/icons/light.svg | 1 + .../@node-red/nodes/icons/link-out.svg | 1 + .../@node-red/nodes/icons/parser-csv.svg | 1 + .../@node-red/nodes/icons/parser-html.svg | 1 + .../@node-red/nodes/icons/parser-json.svg | 1 + .../@node-red/nodes/icons/parser-xml.svg | 1 + .../@node-red/nodes/icons/parser-yaml.svg | 1 + .../@node-red/nodes/icons/range.svg | 1 + .../@node-red/nodes/icons/serial.svg | 1 + .../@node-red/nodes/icons/sort.svg | 1 + .../@node-red/nodes/icons/split.svg | 1 + .../@node-red/nodes/icons/subflow.svg | 1 + .../@node-red/nodes/icons/swap.svg | 1 + .../@node-red/nodes/icons/switch.svg | 1 + .../@node-red/nodes/icons/template.svg | 1 + .../@node-red/nodes/icons/timer.svg | 1 + .../@node-red/nodes/icons/trigger.svg | 1 + .../@node-red/nodes/icons/watch.svg | 1 + .../@node-red/nodes/icons/white-globe.svg | 1 + .../@node-red/registry/lib/localfilesystem.js | 11 ++++++++- .../editor-api/lib/editor/ui_spec.js | 4 ++-- .../registry/lib/localfilesystem_spec.js | 4 ++-- 81 files changed, 127 insertions(+), 66 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.svg delete mode 100644 packages/node_modules/@node-red/editor-client/src/images/icons/node-changed.png delete mode 100644 packages/node_modules/@node-red/editor-client/src/images/icons/node-error.png create mode 100644 packages/node_modules/@node-red/editor-client/src/images/subflow_tab.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/alert.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/arrow-in.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/batch.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/bridge-dash.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/bridge.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/cog.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/comment.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/db.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/debug.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/envelope.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/feed.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/file-in.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/file-out.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/file.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/function.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/hash.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/inject.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/join.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/light.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/link-out.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/parser-csv.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/parser-html.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/parser-json.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/parser-xml.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/parser-yaml.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/range.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/serial.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/sort.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/split.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/subflow.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/swap.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/switch.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/template.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/timer.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/trigger.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/watch.svg create mode 100644 packages/node_modules/@node-red/nodes/icons/white-globe.svg diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/ui.js b/packages/node_modules/@node-red/editor-api/lib/editor/ui.js index ce3ec862c..24b819fec 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/ui.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/ui.js @@ -25,7 +25,7 @@ var theme = require("./theme"); var runtimeAPI; var editorClientDir = path.dirname(require.resolve("@node-red/editor-client")); -var defaultNodeIcon = path.join(editorClientDir,"public","red","images","icons","arrow-in.png"); +var defaultNodeIcon = path.join(editorClientDir,"public","red","images","icons","arrow-in.svg"); var editorTemplatePath = path.join(editorClientDir,"templates","index.mst"); var editorTemplate; diff --git a/packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.svg b/packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.svg new file mode 100644 index 000000000..a5fcb49af --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/editor-client/src/images/icons/node-changed.png b/packages/node_modules/@node-red/editor-client/src/images/icons/node-changed.png deleted file mode 100644 index 38a179444bb5a1e591e62d7946b40a44068a6ee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5n0T@ z!0ZFUjDP1=)By!0OI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe3E@9E+g zA~Ci1!bY#d0TM?){x8pOD)E}O=I*WtE3TIzEqr%NzVdeE2LyO6-{<6h*D9<)L+_yO zgB($=E>XcZlN>b~@BOxXk+7jT-FE*|nVEje8NRH4XWb>sF^NfI7I&VFW!60=iH3hU zhAz3!7B7k3b}R5^mb;zTt`%p0Z9XdC@M!X9zO2nf{~gRS`Fj`{-miRG{7tO9YlrjV z8;#w<@s13~Hh5O=u=v;|E8%!4cW-MNc) z3f{RPmK}WhdB}(J647h+pFMi><>{}F*$@8OD{N<9@jG(Hhqs+kb&n5SU)mt=+c$gq er~8NZGvur-Vn03W)hA$3FnGH9xvXg5-u&wghk1yuCk)5S4F zVruHSy_PROu+O%ggU%YSo z{_ETtbBPU~1rMK=7SWCP++D?4^816N^R$iHw=U>poGbdUx#yF@Vhx4xE`808;tIc@ bcXbTX){Yw-It2CtgMz`+)z4*}Q$iB}@;#NK diff --git a/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.svg b/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.svg new file mode 100644 index 000000000..4acb241e4 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index 5c544e7b7..62949efce 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -362,7 +362,7 @@ RED.nodes = (function() { name:{value:""}, env:{value:[]} }, - icon: function() { return sf.icon||"subflow.png" }, + icon: function() { return sf.icon||"subflow.svg" }, category: sf.category || "subflows", inputs: sf.in.length, outputs: sf.out.length, @@ -583,7 +583,7 @@ RED.nodes = (function() { node.outputLabels = n.outputLabels.slice(); } if (n.icon) { - if (n.icon !== "node-red/subflow.png") { + if (n.icon !== "node-red/subflow.svg") { node.icon = n.icon; } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js b/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js index 9ea599e3d..4ebdcdce9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js @@ -399,7 +399,7 @@ RED.diff = (function() { diff: localDiff, def: { defaults:{}, - icon:"subflow.png", + icon:"subflow.svg", category: "subflows", color: "#da9" }, @@ -422,7 +422,7 @@ RED.diff = (function() { diff: localDiff, def: { defaults:{}, - icon:"subflow.png", + icon:"subflow.svg", category: "subflows", color: "#da9" }, @@ -443,7 +443,7 @@ RED.diff = (function() { remoteDiff: remoteDiff, def: { defaults:{}, - icon:"subflow.png", + icon:"subflow.svg", category: "subflows", color: "#da9" }, @@ -549,7 +549,7 @@ RED.diff = (function() { if (def === undefined) { if (/^subflow:/.test(node.type)) { def = { - icon:"subflow.png", + icon:"subflow.svg", category: "subflows", color: "#da9", defaults:{name:{value:""}} diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index 1b3ccea52..4547dc756 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -2156,7 +2156,7 @@ RED.editor = (function() { changed = true; } var icon = $("#red-ui-editor-node-icon").text()||""; - if ((editing_node.icon === undefined && icon !== "node-red/subflow.png") || + if ((editing_node.icon === undefined && icon !== "node-red/subflow.svg") || (editing_node.icon !== undefined && editing_node.icon !== icon)) { changes.icon = editing_node.icon; editing_node.icon = icon; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index a7b022172..c11931bfb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -802,13 +802,13 @@ RED.utils = (function() { function getDefaultNodeIcon(def,node) { var icon_url; if (node && node.type === "subflow") { - icon_url = "node-red/subflow.png"; + icon_url = "node-red/subflow.svg"; } else if (typeof def.icon === "function") { try { icon_url = def.icon.call(node); } catch(err) { console.log("Definition error: "+def.type+".icon",err); - icon_url = "arrow-in.png"; + icon_url = "arrow-in.svg"; } } else { icon_url = def.icon; @@ -838,11 +838,11 @@ RED.utils = (function() { function getNodeIcon(def,node) { if (def.category === 'config') { - return RED.settings.apiRootUrl+"icons/node-red/cog.png" + return RED.settings.apiRootUrl+"icons/node-red/cog.svg" } else if (node && node.type === 'tab') { - return RED.settings.apiRootUrl+"icons/node-red/subflow.png" + return RED.settings.apiRootUrl+"icons/node-red/subflow.svg" } else if (node && node.type === 'unknown') { - return RED.settings.apiRootUrl+"icons/node-red/alert.png" + return RED.settings.apiRootUrl+"icons/node-red/alert.svg" } else if (node && node.icon) { var iconPath = separateIconPath(node.icon); if (isIconExists(iconPath)) { @@ -851,6 +851,11 @@ RED.utils = (function() { } else { return RED.settings.apiRootUrl+"icons/" + node.icon; } + } else if (iconPath.module !== "font-awesome" && /.png$/i.test(iconPath.file)) { + iconPath.file = iconPath.file.replace(/.png$/,".svg"); + if (isIconExists(iconPath)) { + return RED.settings.apiRootUrl+"icons/" + node.icon.replace(/.png$/,".svg"); + } } } @@ -867,9 +872,9 @@ RED.utils = (function() { if (isIconExists(iconPath)) { return RED.settings.apiRootUrl+"icons/"+iconPath.module+"/"+iconPath.file; } else if (def.category === 'subflows') { - return RED.settings.apiRootUrl+"icons/node-red/subflow.png"; + return RED.settings.apiRootUrl+"icons/node-red/subflow.svg"; } else { - return RED.settings.apiRootUrl+"icons/node-red/arrow-in.png"; + return RED.settings.apiRootUrl+"icons/node-red/arrow-in.svg"; } } } @@ -1007,7 +1012,7 @@ RED.utils = (function() { return; } // If the specified name is not defined in font-awesome, show arrow-in icon. - iconUrl = RED.settings.apiRootUrl+"icons/node-red/arrow-in.png" + iconUrl = RED.settings.apiRootUrl+"icons/node-red/arrow-in.svg" } var imageIconElement = $('
                  ',{class:"red-ui-palette-icon"}).appendTo(iconContainer); imageIconElement.css("backgroundImage", "url("+iconUrl+")"); 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 e3aa33a7f..57cce2852 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 @@ -2463,14 +2463,22 @@ RED.view = (function() { .attr("class","red-ui-flow-node-icon") .attr("x",0) .attr("width","30") - .attr("height","30"); + .attr("height","30") + .style("display","none"); var img = new Image(); img.src = iconUrl; img.onload = function() { - icon.attr("width",Math.min(img.width,30)); - icon.attr("height",Math.min(img.height,30)); - icon.attr("x",15-Math.min(img.width,30)/2); + var largestEdge = Math.max(img.width,img.height); + var scaleFactor = 1; + if (largestEdge > 30) { + scaleFactor = 30/largestEdge; + } + var width = img.width * scaleFactor; + var height = img.height * scaleFactor; + icon.attr("width",width); + icon.attr("height",height); + icon.attr("x",15-width/2); icon.attr("xlink:href",iconUrl); icon.style("display",null); //if ("right" == d._def.align) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index db36004ab..91fa8e34a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -439,7 +439,7 @@ RED.workspaces = (function() { if (!workspace_tabs.contains(id)) { var sf = RED.nodes.subflow(id); if (sf) { - addWorkspace({type:"subflow",id:id,icon:"red/images/subflow_tab.png",label:sf.name, closeable: true}); + addWorkspace({type:"subflow",id:id,icon:"red/images/subflow_tab.svg",label:sf.name, closeable: true}); } else { return; } diff --git a/packages/node_modules/@node-red/nodes/core/core/20-inject.html b/packages/node_modules/@node-red/nodes/core/core/20-inject.html index 558530835..69fd9c8d1 100644 --- a/packages/node_modules/@node-red/nodes/core/core/20-inject.html +++ b/packages/node_modules/@node-red/nodes/core/core/20-inject.html @@ -168,7 +168,7 @@ once: {value:false}, onceDelay: {value:0.1} }, - icon: "inject.png", + icon: "inject.svg", inputs:0, outputs:1, outputLabels: function(index) { diff --git a/packages/node_modules/@node-red/nodes/core/core/25-catch.html b/packages/node_modules/@node-red/nodes/core/core/25-catch.html index 8145fd525..97bd627d5 100644 --- a/packages/node_modules/@node-red/nodes/core/core/25-catch.html +++ b/packages/node_modules/@node-red/nodes/core/core/25-catch.html @@ -34,7 +34,7 @@ }, inputs:0, outputs:1, - icon: "alert.png", + icon: "alert.svg", label: function() { if (this.name) { return this.name; diff --git a/packages/node_modules/@node-red/nodes/core/core/25-status.html b/packages/node_modules/@node-red/nodes/core/core/25-status.html index de52ae281..68eb127a7 100644 --- a/packages/node_modules/@node-red/nodes/core/core/25-status.html +++ b/packages/node_modules/@node-red/nodes/core/core/25-status.html @@ -22,14 +22,14 @@