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. diff --git a/CHANGELOG.md b/CHANGELOG.md index a99600a05..9bb84978a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,70 @@ +#### 1.0.0-beta.2: Beta Release + +Runtime + - Fix length calculation when loading library file + +#### 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.7: Maintenance Release + + - Update jsonata to 1.6.5 which should fix #2183 + - Ensure the subflow stop promise is waiting for before restarting + - Properly escape node types in palette + +#### 0.20.6: Maintenance Release + + - Revealing node position needs to account for zoom level Fixes #2172 + - stop join tripping up if last message of buffer is blank. + - Improve handling of file upload in request node + - Handle subflow internal node wired to a non-existant node Fixes #2202 + - Do not save subflow env vars with blank names + - Don't allow a link node virtual wire to connect to normal port + - Clear HTTP Request node authType when auth disabled Fixes #2215 + - Fix parsing of content-type header Fixes #2216 + - Fix join node reset issue with merging objects + - Copy data-i18n attribute on TypedInput Fixes #2211 + #### 0.20.5: Maintenance Release - Revert error handling in palette manager diff --git a/Gruntfile.js b/Gruntfile.js index 4d289a828..8b7b85a25 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -145,6 +145,7 @@ module.exports = function(grunt) { "packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js", "packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js", "packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js", "packages/node_modules/@node-red/editor-client/src/js/ui/actions.js", "packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js", "packages/node_modules/@node-red/editor-client/src/js/ui/diff.js", @@ -168,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/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", @@ -182,7 +184,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/package.json b/package.json index cfc2d75bb..92bc8020d 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.2", "description": "A visual tool for wiring the Internet of Things", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,25 +31,26 @@ "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-session": "1.16.1", - "fs-extra": "7.0.1", + "express": "4.17.1", + "express-session": "1.16.2", + "fs-extra": "8.1.0", "fs.notify": "0.0.4", - "hash-sum": "1.0.2", + "hash-sum": "2.0.0", "https-proxy-agent": "2.2.1", - "i18next": "15.1.0", - "iconv-lite": "0.4.24", + "i18next": "15.1.2", + "iconv-lite": "0.5.0", "is-utf8": "0.2.1", "js-yaml": "3.13.1", "json-stringify-safe": "5.0.1", - "jsonata": "1.6.4", + "jsonata": "1.6.5", + "media-typer": "1.1.0", "memorystore": "1.6.1", - "mime": "2.4.2", + "mime": "2.4.4", "mqtt": "2.18.8", "multer": "1.4.1", "mustache": "3.0.1", @@ -62,19 +63,19 @@ "passport": "0.4.0", "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", - "raw-body": "2.4.0", + "raw-body": "2.4.1", "request": "2.88.0", - "semver": "6.0.0", - "uglify-js": "3.5.9", + "semver": "6.2.0", + "uglify-js": "3.6.0", "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", + "grunt": "~1.0.4", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.3.2", "grunt-concurrent": "~2.3.1", @@ -108,7 +109,7 @@ "wdio-mocha-framework": "^0.6.4", "wdio-spec-reporter": "^0.1.5", "webdriverio": "^4.14.1", - "node-red-node-test-helper": "^0.2.2", + "node-red-node-test-helper": "^0.2.3", "jsdoc-nr-template": "node-red/jsdoc-nr-template" }, "engines": { diff --git a/packages/node_modules/@node-red/editor-api/lib/auth/tokens.js b/packages/node_modules/@node-red/editor-api/lib/auth/tokens.js index 31c12d228..6e867d7df 100644 --- a/packages/node_modules/@node-red/editor-api/lib/auth/tokens.js +++ b/packages/node_modules/@node-red/editor-api/lib/auth/tokens.js @@ -56,7 +56,7 @@ function expireSessions() { } if (nextExpiry < Number.MAX_SAFE_INTEGER) { // Allow 5 seconds grace - expiryTimeout = setTimeout(expireSessions,(nextExpiry - Date.now()) + 5000) + expiryTimeout = setTimeout(expireSessions,Math.min(2147483647,(nextExpiry - Date.now()) + 5000)) } if (modified) { return storage.saveSessions(sessions); @@ -129,7 +129,7 @@ module.exports = { sessions[accessToken] = session; if (!expiryTimeout) { - expiryTimeout = setTimeout(expireSessions,(accessTokenExpiresAt - Date.now()) + 5000) + expiryTimeout = setTimeout(expireSessions,Math.min(2147483647,(accessTokenExpiresAt - Date.now()) + 5000)) } return storage.saveSessions(sessions).then(function() { diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index 234671f2e..17dbbafea 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -28,7 +28,7 @@ var defaultContext = { }, header: { title: "Node-RED", - image: "red/images/node-red.png" + image: "red/images/node-red.svg" }, asset: { red: (process.env.NODE_ENV == "development")? "red/red.js":"red/red.min.js", 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-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 9a80f824a..e4b3b1f69 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.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,16 +16,16 @@ } ], "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.2", + "@node-red/editor-client": "1.0.0-beta.2", "bcryptjs": "2.4.3", "body-parser": "1.19.0", "clone": "2.1.2", "cors": "2.8.5", - "express-session": "1.16.1", - "express": "4.16.4", + "express-session": "1.16.2", + "express": "4.17.1", "memorystore": "1.6.1", - "mime": "2.4.2", + "mime": "2.4.4", "mustache": "3.0.1", "oauth2orize": "1.11.0", "passport-http-bearer": "1.0.1", @@ -35,6 +35,6 @@ "ws": "6.2.1" }, "optionalDependencies": { - "bcrypt": "3.0.5" + "bcrypt": "3.0.6" } } 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 d052b5ef8..05ccfbed2 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", @@ -84,17 +84,17 @@ "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." } }, "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.

", @@ -134,18 +134,18 @@ }, "clipboard" : { "clipboard" : "Zwischenablage", - "nodes" : "Knoten", - "pasteNodes" : "Knoten hier einfügen", - "importNodes" : "Knoten importieren", - "exportNodes" : "Knoten in Zwischenablage exportieren", + "nodes" : "Nodes", + "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", @@ -161,16 +161,16 @@ "copyMessageValue_truncated" : "Abgeschnittene Wert kopiert" }, "deploy" : { - "deploy" : "Implementieren", + "deploy" : "deploy", "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" : "Implementieren fehlgeschlagen: __message__", - "unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurationsknoten.", + "deployFailed" : "Deploy fehlgeschlagen: __message__", + "unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurations-Nodes.", "unusedConfigNodesLink" : "Klicken Sie hier, um sie zu sehen", "errors" : { "noResponse" : "Keine Antwort vom Server" @@ -178,16 +178,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?", + "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.", "backgroundUpdate" : "Die Datenflüsse auf dem Server wurden aktualisiert.", @@ -200,7 +200,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", @@ -212,8 +212,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", @@ -239,7 +239,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" } }, @@ -249,13 +249,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", @@ -264,7 +264,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" : { @@ -276,19 +276,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,7 +301,7 @@ "unnamedType" : "Unbenannt __type__", "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__", "types": { @@ -310,11 +310,11 @@ }, "palette" : { "noInfo" : "Keine Informationen verfügbar", - "filter" : "Filterknoten", + "filter" : "Filter Nodes", "search" : "Suchmodule", "addCategory" : "Neu hinzufügen ...", "label" : { - "subflows" : "untergeordnete Nachrichtenflüsse", + "subflows" : "Subflows", "input" : "Eingabe", "output" : "Ausgabe", "function" : "Funktion", @@ -324,15 +324,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", @@ -356,8 +356,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", @@ -371,14 +371,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.

", @@ -387,22 +387,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" @@ -412,10 +412,10 @@ }, "sidebar" : { "info" : { - "name" : "Knoteninformationen", + "name" : "Node-Informationen", "tabName" : "Name", "label" : "info", - "node" : "Knoten", + "node" : "Node", "type" : "Typ", "id" : "ID", "status" : "Status", @@ -431,16 +431,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", @@ -456,7 +456,7 @@ "none" : "keine ausgewählt", "refresh" : "Aktualisierung zum Laden", "empty" : "leer", - "node" : "Knoten", + "node" : "Node", "flow" : "Flow", "global" : "Global" }, @@ -604,13 +604,13 @@ }, "typedInput" : { "type" : { - "str" : "Zeichenfolge", - "num" : "Anzahl", + "str" : "String", + "num" : "Number", "re" : "Regulärer Ausdruck", "bool" : "boolean", "json" : "JSON", - "bin" : "Puffer", - "date" : "Zeitmarke", + "bin" : "Buffer", + "date" : "timestamp", "jsonata" : "Ausdruck", "env" : "env, Variable" } @@ -620,7 +620,7 @@ }, "search" : { "empty" : "Keine Übereinstimmungen gefunden", - "addNode" : "Knoten hinzufügen ..." + "addNode" : "Node hinzufügen ..." }, "expressionEditor" : { "functions" : "Funktionen", @@ -652,10 +652,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/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/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/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 0b979f5d5..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 @@ -28,7 +28,8 @@ "status": "Status", "enabled": "Enabled", "disabled":"Disabled", - "info": "Description" + "info": "Description", + "selectNodes": "Click nodes to select" }, "menu": { "label": { @@ -350,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", @@ -364,6 +366,7 @@ "savedNodes": "Saved nodes", "savedType": "Saved __type__", "saveFailed": "Save failed: __message__", + "newFolder": "New folder", "types": { "local": "Local", "examples": "Examples" @@ -528,7 +531,10 @@ "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", + "refrsh": "Refresh", + "delete": "Delete" }, "palette": { "name": "Palette management", @@ -729,9 +735,21 @@ "jsEditor": { "title": "JavaScript editor" }, + "textEditor": { + "title": "Text editor" + }, "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", @@ -924,5 +942,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..770c75589 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": { @@ -42,7 +43,9 @@ "defaultDir": "標準", "ltr": "左から右", "rtl": "右から左", - "auto": "文脈" + "auto": "文脈", + "language": "表示言語", + "browserDefault": "ブラウザのデフォルト" }, "sidebar": { "show": "サイドバーを表示" @@ -179,7 +182,11 @@ "all": "全てのタブ", "compact": "インデントのないJSONフォーマット", "formatted": "インデント付きのJSONフォーマット", - "copy": "書き出し" + "copy": "書き出し", + "export": "ライブラリに書き出し", + "exportAs": "書き出し先", + "overwrite": "更新", + "exists": "

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

更新しますか?

" }, "import": { "import": "読み込み先", @@ -315,7 +322,8 @@ "show": "表示", "hide": "非表示", "errors": { - "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします" + "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします", + "invalidProperties": "プロパティが不正です:" } }, "keyboard": { @@ -351,12 +359,15 @@ "saveToLibrary": "ライブラリへ保存", "typeLibrary": "__type__ ライブラリ", "unnamedType": "名前なし __type__", + "exportedToLibrary": "ライブラリにノードを書き出しました", "dialogSaveOverwrite": "__libraryName__ という __libraryType__ は既に存在しています 上書きしますか?", "invalidFilename": "不正なファイル名", "savedNodes": "フローを保存しました", "savedType": "__type__ を保存しました", "saveFailed": "保存に失敗しました: __message__", + "newFolder": "新規フォルダ", "types": { + "local": "ローカル", "examples": "サンプル" } }, @@ -519,7 +530,8 @@ "node": "Node", "flow": "Flow", "global": "Global", - "deleteConfirm": "データを削除しても良いですか?" + "deleteConfirm": "データを削除しても良いですか?", + "autoRefresh": "自動更新" }, "palette": { "name": "パレットの管理", @@ -719,6 +731,9 @@ "jsEditor": { "title": "JavaScriptエディタ" }, + "textEditor": { + "title": "テキストエディタ" + }, "jsonEditor": { "title": "JSONエディタ", "format": "JSONフォーマット" @@ -914,5 +929,12 @@ "description": "説明", "appearance": "外観", "env": "環境変数" + }, + "languages" : { + "de": "ドイツ語", + "en-US": "英語", + "ja": "日本語", + "ko": "韓国語", + "zh-CN": "中国語(簡体)" } } diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 86c05ea6e..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": "0.21.0-alpha.0", + "version": "1.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.png deleted file mode 100644 index a2f5373e2..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.svg new file mode 100644 index 000000000..c4511ba87 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.png deleted file mode 100644 index e83638234..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg new file mode 100644 index 000000000..0b0069272 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.png deleted file mode 100644 index b5f3a9870..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.svg new file mode 100644 index 000000000..fc3221f1c --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-full.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-full.png deleted file mode 100644 index 775374d17..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-full.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg new file mode 100644 index 000000000..e4448e10f --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.png deleted file mode 100644 index 3174716cc..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.svg new file mode 100644 index 000000000..af540dd3d --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.png deleted file mode 100644 index 4d982a9c8..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg new file mode 100644 index 000000000..12d4c8972 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.png b/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.png deleted file mode 100644 index 197fc610d..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg new file mode 100644 index 000000000..00f319014 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.png b/packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.png deleted file mode 100644 index e38f39146..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.png and /dev/null differ 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 38a179444..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/icons/node-changed.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/icons/node-error.png b/packages/node_modules/@node-red/editor-client/src/images/icons/node-error.png deleted file mode 100644 index c20c8e85a..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/icons/node-error.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/node-red.png b/packages/node_modules/@node-red/editor-client/src/images/node-red.png deleted file mode 100644 index a60c26729..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/node-red.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/node-red.svg b/packages/node_modules/@node-red/editor-client/src/images/node-red.svg new file mode 100644 index 000000000..c62b35866 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/node-red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/pw_maze_white.png b/packages/node_modules/@node-red/editor-client/src/images/pw_maze_white.png deleted file mode 100644 index 66464831c..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/pw_maze_white.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.png b/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.png deleted file mode 100644 index 022777c4d..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.png and /dev/null differ 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/images/typedInput/09.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/09.png deleted file mode 100644 index 247371fe5..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/09.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/09.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/09.svg new file mode 100644 index 000000000..29c54b860 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/09.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.png deleted file mode 100644 index 5f5d2404e..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.svg new file mode 100644 index 000000000..e0abbdc4a --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.png deleted file mode 100644 index 615c8dd4f..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.svg new file mode 100644 index 000000000..0ef91aed8 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.png deleted file mode 100644 index 9530983de..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.svg new file mode 100644 index 000000000..e2e4297c7 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/env.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/env.png deleted file mode 100644 index 0ea51da00..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/env.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/env.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/env.svg new file mode 100644 index 000000000..bddd1c082 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/env.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.png deleted file mode 100644 index 704105ce5..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.svg new file mode 100644 index 000000000..c6357af50 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/json.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/json.png deleted file mode 100644 index 57ac8761f..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/json.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/json.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/json.svg new file mode 100644 index 000000000..713fe7944 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/json.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/re.png b/packages/node_modules/@node-red/editor-client/src/images/typedInput/re.png deleted file mode 100644 index 87deb02ae..000000000 Binary files a/packages/node_modules/@node-red/editor-client/src/images/typedInput/re.png and /dev/null differ diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/re.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/re.svg new file mode 100644 index 000000000..c30cbff55 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/re.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/editor-client/src/images/typedInput/target.svg b/packages/node_modules/@node-red/editor-client/src/images/typedInput/target.svg new file mode 100644 index 000000000..b98996701 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/target.svg @@ -0,0 +1 @@ + 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) { 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/keymap.json b/packages/node_modules/@node-red/editor-client/src/js/keymap.json index 3f232647d..ad3307ac7 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", @@ -8,6 +8,7 @@ "ctrl-0": "core:zoom-reset", "ctrl-enter": "core:confirm-edit-tray", "ctrl-escape": "core:cancel-edit-tray", + "ctrl-d": "core:deploy-flows", "ctrl-g i": "core:show-info-tab", "ctrl-g d": "core:show-debug-tab", "ctrl-g c": "core:show-config-tab", @@ -17,11 +18,13 @@ "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", "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-action-list" }, "red-ui-sidebar-node-config": { "backspace": "core:delete-config-selection", 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..63027aed1 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 @@ -17,6 +17,8 @@ RED.nodes = (function() { var node_defs = {}; var nodes = []; + var nodeTabMap = {}; + var configNodes = {}; var links = []; var defaultWorkspace; @@ -213,6 +215,11 @@ RED.nodes = (function() { n.i = nextId+1; } nodes.push(n); + if (nodeTabMap[n.z]) { + nodeTabMap[n.z][n.id] = n; + } else { + console.warn("Node added to unknown tab/subflow:",n); + } } RED.events.emit('nodes:add',n); } @@ -246,6 +253,9 @@ RED.nodes = (function() { node = getNode(id); if (node) { nodes.splice(nodes.indexOf(node),1); + if (nodeTabMap[node.z]) { + delete nodeTabMap[node.z][node.id]; + } removedLinks = links.filter(function(l) { return (l.source === node) || (l.target === node); }); removedLinks.forEach(function(l) {links.splice(links.indexOf(l), 1); }); var updatedConfigNode = false; @@ -300,6 +310,8 @@ RED.nodes = (function() { function addWorkspace(ws,targetIndex) { workspaces[ws.id] = ws; + nodeTabMap[ws.id] = {}; + ws._def = RED.nodes.getType('tab'); if (targetIndex === undefined) { workspacesOrder.push(ws.id); @@ -312,6 +324,7 @@ RED.nodes = (function() { } function removeWorkspace(id) { delete workspaces[id]; + delete nodeTabMap[ws.id]; workspacesOrder.splice(workspacesOrder.indexOf(id),1); var removedNodes = []; @@ -357,12 +370,14 @@ RED.nodes = (function() { sf.name = subflowName; } subflows[sf.id] = sf; + nodeTabMap[sf.id] = {}; + RED.nodes.registerType("subflow:"+sf.id, { defaults:{ 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, @@ -393,6 +408,7 @@ RED.nodes = (function() { } function removeSubflow(sf) { delete subflows[sf.id]; + delete nodeTabMap[sf.id]; registry.removeNodeType("subflow:"+sf.id); } @@ -463,7 +479,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)) { @@ -581,7 +599,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; } } @@ -967,6 +985,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]; @@ -1016,6 +1037,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; @@ -1258,12 +1282,13 @@ RED.nodes = (function() { // TODO: supports filter.z|type function filterNodes(filter) { var result = []; + var searchSet = nodes; + if (filter.hasOwnProperty("z") && Object.hasOwnProperty("values") && nodeTabMap.hasOwnProperty(filter.z) ) { + searchSet = Object.values(nodeTabMap[filter.z]); + } - for (var n=0;nundefined * 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/actionList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js new file mode 100644 index 000000000..ac8a06813 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -0,0 +1,230 @@ +/** + * 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.actionList = (function() { + + var disabled = false; + var dialog = null; + var searchInput; + var searchResults; + var selected = -1; + var visible = false; + + var filterTerm = ""; + var filterTerms = []; + var previousActiveElement; + + 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-actionList",class:"red-ui-search"}).appendTo("#red-ui-main-container"); + var searchDiv = $("
",{class:"red-ui-search-container"}).appendTo(dialog); + searchInput = $('').appendTo(searchDiv).searchBox({ + change: function() { + filterTerm = $(this).val().trim(); + filterTerms = filterTerm.split(" "); + searchResults.editableList('filter'); + searchResults.find("li.selected").removeClass("selected"); + var children = searchResults.children(":visible"); + if (children.length) { + $(children[0]).addClass('selected'); + } + } + }); + + searchInput.on('keydown',function(evt) { + 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'); + } + } 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(); + + 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, + filter: function(item) { + if (filterTerm !== "") { + var pos=0; + for (var i=0;i -1) { + pos = j; + } else { + return false; + } + } + return true; + } + return true; + } + }); + + } + + function selectCommand(command) { + hide(); + if (command) { + RED.actions.invoke(command.id); + } + } + + function show(v) { + if (disabled) { + return; + } + if (!visible) { + previousActiveElement = 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) + 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()}); + action._label = action.label.toLowerCase(); + searchResults.editableList('addItem',action) + }) + RED.events.emit("actionList:open"); + visible = true; + } + searchInput.trigger("focus"); + var children = searchResults.children(":visible"); + if (children.length) { + $(children[0]).addClass('selected'); + } + } + + 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("actionList:close"); + if (previousActiveElement) { + $(previousActiveElement).trigger("focus"); + previousActiveElement = null; + } + } + } + + function init() { + RED.actions.add("core:show-action-list",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/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 0d16a7c42..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 @@ -26,6 +26,7 @@ RED.clipboard = (function() { var currentPopoverError; var activeTab; var libraryBrowser; + var examplesBrowser; function setupDialogs() { dialog = $('
    ') @@ -58,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" ); } @@ -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,30 +391,49 @@ RED.clipboard = (function() { id: "red-ui-clipboard-dialog-import-tab-library", label: RED._("library.library") }); - - tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+mode); - if (mode === 'clipboard') { - setTimeout(function() { - $("#red-ui-clipboard-dialog-import-text").trigger("focus"); - },100) - } - + tabs.addTab({ + id: "red-ui-clipboard-dialog-import-tab-examples", + label: RED._("library.types.examples") + }); $("#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"); 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(); @@ -443,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"), @@ -489,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"); @@ -504,7 +534,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(); @@ -606,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"); @@ -615,38 +646,37 @@ 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(done,item) { + // 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) { + children: function(done, item) { + RED.library.loadLibraryFolder(library,"flows","",function(children) { item.children = children; done(children); }) } - }) - browser.data(listing); + }], true); + } function hideDropTarget() { @@ -700,17 +730,20 @@ 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); - 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; }); RED.events.on("search:open",function() { disabled = true; }); RED.events.on("search: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 0464866f7..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 @@ -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) @@ -185,6 +186,7 @@ } }, _destroy: function() { + this.topContainer.remove(); }, _refreshFilter: function() { var that = this; @@ -230,7 +232,7 @@ this.uiHeight = desiredHeight; this._resize(); }, - addItem: function(data) { + insertItemAt: function(data,index) { var that = this; data = data || {}; var li = $('
  1. '); @@ -248,7 +250,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 +301,9 @@ },0); } }, + addItem: function(data) { + this.insertItemAt(data,this.element.children().length) + }, addItems: function(items) { for (var i=0; i 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/common/menu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js index 039357c11..e4599f99c 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 @@ -71,7 +71,7 @@ RED.menu = (function() { } if (opt.icon !== undefined) { - if (/\.png/.test(opt.icon)) { + if (/\.(png|svg)/.test(opt.icon)) { linkContent += ' '; } else { linkContent += ' '; @@ -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/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/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/common/toggleButton.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js new file mode 100644 index 000000000..999606912 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js @@ -0,0 +1,100 @@ +/** + * 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($) { + +/** + * options: + * - 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" + * - disabledLabel : string - the label for "disabled" state, default "Disabled" ("editor:workspace.disabled") + * - 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: + * - + */ + $.widget( "nodered.toggleButton", { + _create: function() { + var that = this; + + var invertState = false; + 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"); + var disabledLabel = this.options.disabledLabel || RED._("editor:workspace.disabled"); + + this.element.css("display","none"); + this.element.on("focus", function() { + that.button.focus(); + }); + this.button = $(''); + if (this.options.class) { + this.button.addClass(this.options.class) + } + this.element.after(this.button); + this.buttonIcon = this.button.find("i"); + this.buttonLabel = this.button.find("span"); + + // Quick hack to find the maximum width of the button + this.button.addClass("selected"); + this.buttonIcon.addClass(enabledIcon); + this.buttonLabel.text(enabledLabel); + var width = this.button.width(); + this.button.removeClass("selected"); + this.buttonIcon.removeClass(enabledIcon); + that.buttonIcon.addClass(disabledIcon); + that.buttonLabel.text(disabledLabel); + width = Math.max(width,this.button.width()); + this.buttonIcon.removeClass(disabledIcon); + + // Fix the width of the button so it doesn't jump around when toggled + if (width > 0) { + this.button.width(Math.ceil(width)); + } + + this.button.on("click",function(e) { + e.stopPropagation(); + if (that.buttonIcon.hasClass(disabledIcon)) { + that.element.prop("checked",!invertState); + } else { + that.element.prop("checked",invertState); + } + that.element.trigger("change"); + }) + + this.element.on("change", function(e) { + if ($(this).prop("checked") !== invertState) { + that.button.addClass("selected"); + that.buttonIcon.addClass(enabledIcon); + that.buttonIcon.removeClass(disabledIcon); + that.buttonLabel.text(enabledLabel); + } else { + that.button.removeClass("selected"); + that.buttonIcon.addClass(disabledIcon); + that.buttonIcon.removeClass(enabledIcon); + that.buttonLabel.text(disabledLabel); + } + }) + this.element.trigger("change"); + } + }); +})(jQuery); 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..0e391a5b8 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 @@ -18,32 +18,70 @@ /** * options: * - data : array - initial items to display in tree + * - multi : boolean - if true, .selected will return an array of results + * otherwise, returns the first selected item + * - sortable: boolean/string - TODO: see editableList + * - rootSortable: boolean - if 'sortable' is set, then setting this to + * false, prevents items being sorted to the + * top level of the tree * * methods: * - data(items) - clears existing items and replaces with new data * * events: * - treelistselect : function(event, item) {} - * + * - treelistconfirm : function(event,item) {} + * - treelistchangeparent: function(event,item, oldParent, newParent) {} * * data: * [ * { * label: 'Local', // label for the item + * sublabel: 'Local', // a sub-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 + * expanded: true/false, // show the child items by default + * deferBuild: true/false, // don't build any ui elements for the item's children + * until it is expanded by the user. + * element: // custom dom element to use for the item - ignored if `label` is set * } * ] * - * - * * var treeList = $("
    ").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", { @@ -61,6 +99,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() @@ -102,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); } @@ -157,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(item,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) - }); - 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(); @@ -271,36 +383,151 @@ 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); + label.toggleClass("selected",item.selected); cb.on('click', function(e) { e.stopPropagation(); }); cb.on('change', function(e) { item.selected = this.checked; + label.toggleClass("selected",this.checked); that._trigger("select",e,item); }) + if (!item.children) { + label.on("click", function(e) { + e.stopPropagation(); + cb.trigger("click"); + }) + } + item.treeList.select = function(v) { + if (v !== item.selected) { + cb.trigger("click"); + } + } } else { label.on("click", function(e) { that._topList.find(".selected").removeClass("selected"); 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); } - if (item.label) { - $('').text(item.label).appendTo(label); + if (item.hasOwnProperty('label') || item.hasOwnProperty('sublabel')) { + if (item.hasOwnProperty('label')) { + $('').text(item.label).appendTo(label); + } + 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) { @@ -312,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',{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; @@ -160,7 +215,7 @@ that.input.css("margin"+d,0); }); - ["type","placeholder"].forEach(function(d) { + ["type","placeholder","autocomplete","data-i18n"].forEach(function(d) { var m = that.element.attr(d); that.input.attr(d,m); }); @@ -176,6 +231,8 @@ this.selectLabel = $('').appendTo(this.selectTrigger); + this.valueLabelContainer = $('
            ').appendTo(this.uiSelect) + this.types(this.options.types); if (this.options.typeField) { @@ -198,9 +255,15 @@ that.validate(); that.element.val(that.value()); that.element.trigger('change',that.propertyType,that.value()); + }); + this.input.on('keydown', function(evt) { + if (evt.keyCode >= 37 && evt.keyCode <= 40) { + evt.stopPropagation(); + } }) this.selectTrigger.on("click", function(event) { event.preventDefault(); + event.stopPropagation(); that._showTypeMenu(); }); this.selectTrigger.on('keydown',function(evt) { @@ -208,6 +271,7 @@ // Down that._showTypeMenu(); } + evt.stopPropagation(); }).on('focus', function() { that.uiSelect.addClass('red-ui-typedInput-focus'); }) @@ -220,12 +284,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() { @@ -293,7 +359,7 @@ if (opt.icon.indexOf("<") === 0) { $(opt.icon).prependTo(op); } else if (opt.icon.indexOf("/") !== -1) { - $('',{src:opt.icon,style:"margin-right: 4px; height: 18px;"}).prependTo(op); + $('',{src:mapDeprecatedIcon(opt.icon),style:"margin-right: 4px; height: 18px;"}).prependTo(op); } else { $('',{class:"red-ui-typedInput-icon "+opt.icon}).prependTo(op); } @@ -306,6 +372,7 @@ op.on("click", function(event) { event.preventDefault(); + event.stopPropagation(); callback(opt.value); that._hideMenu(menu); }); @@ -325,9 +392,11 @@ // UP $(this).children(":focus").prev().trigger("focus"); } else if (evt.keyCode === 27) { + // ESCAPE evt.preventDefault(); that._hideMenu(menu); } + evt.stopPropagation(); }) @@ -370,20 +439,27 @@ }) }); }, - _getLabelWidth: function(label) { + _getLabelWidth: function(label, done) { var labelWidth = label.outerWidth(); if (labelWidth === 0) { - var container = $('
            ').css({ + var wrapper = $('
            ').css({ position:"absolute", - top:0 + "white-space": "nowrap", + top:-2000 }).appendTo(document.body); + var container = $('
            ').appendTo(wrapper); var newTrigger = label.clone().appendTo(container); - labelWidth = newTrigger.outerWidth(); - container.remove(); + setTimeout(function() { + labelWidth = newTrigger.outerWidth(); + wrapper.remove(); + done(labelWidth); + },50) + } else { + done(labelWidth); } - return labelWidth; }, _resize: function() { + var that = this; if (this.uiWidth !== null) { this.uiSelect.width(this.uiWidth); } @@ -392,44 +468,44 @@ this.selectTrigger.addClass("red-ui-typedInput-full-width"); } else { this.selectTrigger.removeClass("red-ui-typedInput-full-width"); - var labelWidth = this._getLabelWidth(this.selectTrigger); - this.elementDiv.css('left',labelWidth+"px"); - if (this.optionExpandButton.is(":visible")) { - this.elementDiv.css('right',"22px"); - } else { - this.elementDiv.css('right','0'); - this.input.css({ - 'border-top-right-radius': '4px', - 'border-bottom-right-radius': '4px' - }); - } - - // if (this.optionSelectTrigger) { - // this.optionSelectTrigger.css({'left':(labelWidth)+"px",'width':'calc( 100% - '+labelWidth+'px )'}); - // } - - if (this.optionSelectTrigger) { - if (type && type.options && type.hasValue === true) { - this.optionSelectLabel.css({'left':'auto'}) - var lw = this._getLabelWidth(this.optionSelectLabel); - this.optionSelectTrigger.css({'width':(23+lw)+"px"}); - this.elementDiv.css('right',(23+lw)+"px"); - this.input.css({ - 'border-top-right-radius': 0, - 'border-bottom-right-radius': 0 - }); + this._getLabelWidth(this.selectTrigger, function(labelWidth) { + that.elementDiv.css('left',labelWidth+"px"); + that.valueLabelContainer.css('left',labelWidth+"px"); + if (that.optionExpandButton.is(":visible")) { + that.elementDiv.css('right',"22px"); + that.valueLabelContainer.css('right',"22px"); } else { - this.optionSelectLabel.css({'left':'0'}) - this.optionSelectTrigger.css({'width':'calc( 100% - '+labelWidth+'px )'}); - if (!this.optionExpandButton.is(":visible")) { - this.elementDiv.css({'right':0}); - this.input.css({ - 'border-top-right-radius': '4px', - 'border-bottom-right-radius': '4px' + that.elementDiv.css('right','0'); + that.valueLabelContainer.css('right','0'); + that.input.css({ + 'border-top-right-radius': '4px', + 'border-bottom-right-radius': '4px' + }); + } + if (that.optionSelectTrigger) { + if (type && type.options && type.hasValue === true) { + that.optionSelectLabel.css({'left':'auto'}) + that._getLabelWidth(that.optionSelectLabel, function(lw) { + that.optionSelectTrigger.css({'width':(23+lw)+"px"}); + that.elementDiv.css('right',(23+lw)+"px"); + that.input.css({ + 'border-top-right-radius': 0, + 'border-bottom-right-radius': 0 + }); }); + } else { + that.optionSelectLabel.css({'left':'0'}) + that.optionSelectTrigger.css({'width':'calc( 100% - '+labelWidth+'px )'}); + if (!that.optionExpandButton.is(":visible")) { + that.elementDiv.css({'right':0}); + that.input.css({ + 'border-top-right-radius': '4px', + 'border-bottom-right-radius': '4px' + }); + } } } - } + }); } }, _updateOptionSelectLabel: function(o) { @@ -440,7 +516,7 @@ $(o.icon).prependTo(this.optionSelectLabel); } else if (o.icon.indexOf("/") !== -1) { // url - $('',{src:o.icon,style:"height: 18px;"}).prependTo(this.optionSelectLabel); + $('',{src:mapDeprecatedIcon(o.icon),style:"height: 18px;"}).prependTo(this.optionSelectLabel); } else { // icon class $('',{class:"red-ui-typedInput-icon "+o.icon}).prependTo(this.optionSelectLabel); @@ -461,6 +537,7 @@ this.optionMenu.remove(); } this.menu.remove(); + this.uiSelect.remove(); }, types: function(types) { var that = this; @@ -519,9 +596,15 @@ if (!selectedOption) { selectedOption = {value:""} } + this.input.val(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); } }, @@ -544,9 +627,11 @@ } else if (opt.icon.indexOf("/") !== -1) { image = new Image(); + image.onload = function() { that._resize(); } + image.onerror = function() { that._resize(); } image.name = opt.icon; - image.src = opt.icon; - $('',{src:opt.icon,style:"margin-right: 4px;height: 18px;"}).prependTo(this.selectLabel); + image.src = mapDeprecatedIcon(opt.icon); + $('',{src:mapDeprecatedIcon(opt.icon),style:"margin-right: 4px;height: 18px;"}).prependTo(this.selectLabel); } else { $('',{class:"red-ui-typedInput-icon "+opt.icon}).prependTo(this.selectLabel); @@ -566,8 +651,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) { @@ -647,6 +734,7 @@ } } } + this.input.trigger('change',this.propertyType,this.value()); } else { if (this.optionSelectTrigger) { this.optionSelectTrigger.hide(); @@ -655,11 +743,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) { @@ -676,10 +771,7 @@ } this.input.trigger('change',this.propertyType,this.value()); } - if (image) { - image.onload = function() { that._resize(); } - image.onerror = function() { that._resize(); } - } else { + if (!image) { this._resize(); } } 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..cdf84d02f 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 @@ -17,9 +17,9 @@ RED.deploy = (function() { var deploymentTypes = { - "full":{img:"red/images/deploy-full-o.png"}, - "nodes":{img:"red/images/deploy-nodes-o.png"}, - "flows":{img:"red/images/deploy-flows-o.png"} + "full":{img:"red/images/deploy-full-o.svg"}, + "nodes":{img:"red/images/deploy-nodes-o.svg"}, + "flows":{img:"red/images/deploy-flows-o.svg"} } var ignoreDeployWarnings = { @@ -44,7 +44,7 @@ RED.deploy = (function() { * type: "default" - Button with drop-down options - no further customisation available * type: "simple" - Button without dropdown. Customisations: * label: the text to display - default: "Deploy" - * icon : the icon to use. Null removes the icon. default: "red/images/deploy-full-o.png" + * icon : the icon to use. Null removes the icon. default: "red/images/deploy-full-o.svg" */ function init(options) { options = options || {}; @@ -54,7 +54,7 @@ RED.deploy = (function() { $('
          1. '+ ''+ ''+ - ' '+ + ' '+ ''+RED._("deploy.deploy")+''+ ''+ ''+ @@ -65,17 +65,17 @@ RED.deploy = (function() { '
          2. ').prependTo(".red-ui-header-toolbar"); RED.menu.init({id:"red-ui-header-button-deploy-options", options: [ - {id:"deploymenu-item-full",toggle:"deploy-type",icon:"red/images/deploy-full.png",label:RED._("deploy.full"),sublabel:RED._("deploy.fullDesc"),selected: true, onselect:function(s) { if(s){changeDeploymentType("full")}}}, - {id:"deploymenu-item-flow",toggle:"deploy-type",icon:"red/images/deploy-flows.png",label:RED._("deploy.modifiedFlows"),sublabel:RED._("deploy.modifiedFlowsDesc"), onselect:function(s) {if(s){changeDeploymentType("flows")}}}, - {id:"deploymenu-item-node",toggle:"deploy-type",icon:"red/images/deploy-nodes.png",label:RED._("deploy.modifiedNodes"),sublabel:RED._("deploy.modifiedNodesDesc"),onselect:function(s) { if(s){changeDeploymentType("nodes")}}}, + {id:"deploymenu-item-full",toggle:"deploy-type",icon:"red/images/deploy-full.svg",label:RED._("deploy.full"),sublabel:RED._("deploy.fullDesc"),selected: true, onselect:function(s) { if(s){changeDeploymentType("full")}}}, + {id:"deploymenu-item-flow",toggle:"deploy-type",icon:"red/images/deploy-flows.svg",label:RED._("deploy.modifiedFlows"),sublabel:RED._("deploy.modifiedFlowsDesc"), onselect:function(s) {if(s){changeDeploymentType("flows")}}}, + {id:"deploymenu-item-node",toggle:"deploy-type",icon:"red/images/deploy-nodes.svg",label:RED._("deploy.modifiedNodes"),sublabel:RED._("deploy.modifiedNodesDesc"),onselect:function(s) { if(s){changeDeploymentType("nodes")}}}, null, - {id:"deploymenu-item-reload", icon:"red/images/deploy-reload.png",label:RED._("deploy.restartFlows"),sublabel:RED._("deploy.restartFlowsDesc"),onselect:"core:restart-flows"}, + {id:"deploymenu-item-reload", icon:"red/images/deploy-reload.svg",label:RED._("deploy.restartFlows"),sublabel:RED._("deploy.restartFlowsDesc"),onselect:"core:restart-flows"}, ] }); } else if (type == "simple") { var label = options.label || RED._("deploy.deploy"); - var icon = 'red/images/deploy-full-o.png'; + var icon = 'red/images/deploy-full-o.svg'; if (options.hasOwnProperty('icon')) { icon = options.icon; } @@ -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) { 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 fe506c0e3..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 @@ -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') { @@ -565,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'] @@ -665,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; @@ -719,6 +723,7 @@ RED.editor = (function() { $('').prependTo(dialogForm); $('').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); + dialogForm.find('input').attr("autocomplete","disable"); return dialogForm; } @@ -950,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"))) { @@ -1066,7 +1056,7 @@ RED.editor = (function() { hasNonBlankLabel = false; newValue = new Array(editing_node.outputs); outputLabels.each(function() { - var index = $(this).attr('id').substring(23); // red-ui-editor-node-label-form-output- + var index = $(this).attr('id').substring("red-ui-editor-node-label-form-output-".length); if (outputMap && outputMap.hasOwnProperty(index)) { index = parseInt(outputMap[index]); if (index === -1) { @@ -1391,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; @@ -1493,6 +1497,14 @@ 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({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", + invertState: true + }) + var editorTabEl = $('
              ').appendTo(trayBody); var editorContent = $('
              ').appendTo(trayBody); @@ -1670,9 +1682,17 @@ 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) + + $('').prop("checked",!!editing_config_node.d).appendTo(trayFooterLeft).toggleButton({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", + invertState: true + }) + if (node_def.hasUsers !== false) { - userCountDiv = $('').prependTo(trayFooter); + $(' ').css("margin-left", "10px").appendTo(trayFooterLeft); } trayFooter.append(''); @@ -1766,8 +1786,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(); @@ -1902,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 @@ -2056,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); } }); @@ -2126,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; @@ -2456,6 +2486,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/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/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").css({position: "absolute",bottom:"6px",right:"8px"}); var menuButton = $('') @@ -309,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 = {}; @@ -406,17 +422,22 @@ RED.library = (function() { } return { + select: function(item) { + dirList.treeList('select',item); + }, getSelected: function() { return dirList.treeList('selected'); }, 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); + } } } } @@ -424,8 +445,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 +480,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 +503,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 +571,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/js/ui/notifications.js b/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js index 54795f568..e252570d6 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js @@ -24,7 +24,7 @@ RED.notifications = (function() { var myNotification = RED.notify("This is the message to display",{ modal: true, fixed: true, - type: 'warning', + type: 'warning', // 'compact', 'success', 'warning', 'error' buttons: [ { text: "cancel", @@ -103,7 +103,7 @@ RED.notifications = (function() { $(n).append(msg); } if (options.buttons) { - var buttonSet = $('
              ').appendTo(n) + var buttonSet = $('
              ').appendTo(n) options.buttons.forEach(function(buttonDef) { var b = $('').appendTo(tools).on("click", function(e) { e.preventDefault(); e.stopPropagation(); @@ -304,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), { 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); } 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 743fb3bb7..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 @@ -18,15 +18,19 @@ RED.tray = (function() { var stack = []; var editorStack; var openingTray = false; + var stackHidden = false; function resize() { } 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); @@ -217,7 +221,19 @@ RED.tray = (function() { }); }, show: function show(options) { - if (stack.length > 0 && !options.overlay) { + if (!options) { + if (stack.length > 0) { + var tray = stack[stack.length-1]; + tray.tray.css({right:0}); + $("#red-ui-header-shade").show(); + $("#red-ui-editor-shade").show(); + $("#red-ui-palette-shade").show(); + $(".red-ui-sidebar-shade").show(); + stackHidden = false; + } + } else if (stackHidden) { + throw new Error("Cannot add to stack whilst hidden"); + } else if (stack.length > 0 && !options.overlay) { var oldTray = stack[stack.length-1]; if (options.width === "inherit") { options.width = oldTray.tray.width(); @@ -235,6 +251,19 @@ RED.tray = (function() { } }, + hide: function hide() { + if (stack.length > 0) { + var tray = stack[stack.length-1]; + tray.tray.css({ + right: -(tray.tray.width()+10)+"px" + }); + $("#red-ui-header-shade").hide(); + $("#red-ui-editor-shade").hide(); + $("#red-ui-palette-shade").hide(); + $(".red-ui-sidebar-shade").hide(); + stackHidden = true; + } + }, resize: handleWindowResize, close: function close(done) { if (stack.length > 0) { 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..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,6 +45,14 @@ 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); @@ -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) { @@ -283,7 +315,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' 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..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,10 +101,19 @@ RED.userSettings = (function() { RED.tray.show(trayOptions); } + function localeToName(lc) { + var name = RED._("languages."+lc); + return {text: (name ? name : lc), val: lc}; + } + + function compText(a, b) { + 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"))) }}, + {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", 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..d26ed4a4c 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,12 +125,14 @@ RED.utils = (function() { e.stopPropagation(); 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"); @@ -722,6 +725,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',{class:"red-ui-palette-icon"}).appendTo(iconContainer); imageIconElement.css("backgroundImage", "url("+iconUrl+")"); @@ -957,6 +1036,7 @@ RED.utils = (function() { return { createObjectElement: buildMessageElement, getMessageProperty: getMessageProperty, + setMessageProperty: setMessageProperty, normalisePropertyExpression: normalisePropertyExpression, validatePropertyExpression: validatePropertyExpression, separateIconPath: separateIconPath, 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..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 @@ -77,6 +77,8 @@ RED.view = (function() { quickAddLink = null, showAllLinkPorts = -1; + var selectNodesOptions; + var clipboard = ""; // Note: these are the permitted status colour aliases. The actual RGB values @@ -326,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; @@ -408,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) { @@ -640,6 +644,7 @@ RED.view = (function() { nn.w = node_width; nn.h = Math.max(node_height,(nn.outputs||0) * 15); + nn.resize = true; var historyEvent = { t:"add", @@ -665,6 +670,10 @@ RED.view = (function() { function canvasMouseDown() { var point; + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } if (d3.event.button === 1) { // Middle Click pan @@ -766,6 +775,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) { @@ -1026,6 +1044,11 @@ RED.view = (function() { return; } + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } + if (mouse_mode != RED.state.QUICK_JOINING && mouse_mode != RED.state.IMPORT_DRAGGING && !mousedown_node && selected_link == null) { return; } @@ -1231,6 +1254,10 @@ RED.view = (function() { resetMouseVars(); return } + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } if (mouse_mode === RED.state.QUICK_JOINING) { return; } @@ -1351,27 +1378,42 @@ 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; + } RED.nodes.eachNode(function(n) { if (n.z == RED.workspaces.active()) { + if (mouse_mode === RED.state.SELECTING_NODE) { + if (selectNodesOptions.filter && !selectNodesOptions.filter(n)) { + return; + } + } if (!n.selected) { n.selected = true; n.dirty = true; @@ -1379,7 +1421,7 @@ RED.view = (function() { } } }); - if (activeSubflow) { + if (mouse_mode !== RED.state.SELECTING_NODE && activeSubflow) { activeSubflow.in.forEach(function(n) { if (!n.selected) { n.selected = true; @@ -1404,7 +1446,9 @@ RED.view = (function() { } selected_link = null; - updateSelection(); + if (mouse_mode !== RED.state.SELECTING_NODE) { + updateSelection(); + } redraw(); } @@ -1538,6 +1582,9 @@ RED.view = (function() { } } function deleteSelection() { + if (mouse_mode === RED.state.SELECTING_NODE) { + return; + } if (portLabelHover) { portLabelHover.remove(); portLabelHover = null; @@ -1714,6 +1761,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) { @@ -1758,16 +1808,18 @@ RED.view = (function() { return calculateTextDimensions(str,className,offset,0)[0]; } + var textDimensionPlaceholder = {}; 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); + if (!textDimensionPlaceholder[className]) { + textDimensionPlaceholder[className] = document.createElement("span"); + textDimensionPlaceholder[className].className = className; + textDimensionPlaceholder[className].style.position = "absolute"; + textDimensionPlaceholder[className].style.top = "-1000px"; + document.getElementById("red-ui-editor").appendChild(textDimensionPlaceholder[className]); + } + textDimensionPlaceholder[className].textContent = (str||""); + var w = textDimensionPlaceholder[className].offsetWidth; + var h = textDimensionPlaceholder[className].offsetHeight; return [offsetW+w,offsetH+h]; } @@ -1803,7 +1855,10 @@ RED.view = (function() { if (d3.event.button === 1) { return; } - + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } mousedown_node = d; mousedown_port_type = portType; mousedown_port_index = portIndex || 0; @@ -1821,6 +1876,10 @@ RED.view = (function() { } function portMouseUp(d,portType,portIndex) { + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } var i; if (mouse_mode === RED.state.QUICK_JOINING && drag_lines.length > 0) { if (drag_lines[0].node === d) { @@ -1882,7 +1941,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 @@ -2073,7 +2132,7 @@ RED.view = (function() { var labelHeight2 = labelHeight - 4; var path; var lx; - var ly = -labelHeight/2+3; + var ly = -labelHeight/2; var anchor; if (direction === "left") { path = "M0 0 l -5 -5 v -"+(labelHeight1)+" q 0 -2 -2 -2 h -"+labelWidth+" q -2 0 -2 2 v "+(labelHeight2)+" q 0 2 2 2 h "+labelWidth+" q 2 0 2 -2 v -"+(labelHeight1)+" l 5 -5"; @@ -2086,7 +2145,7 @@ RED.view = (function() { } else if (direction === "top") { path = "M0 0 l 5 -5 h "+(labelWidth1)+" q 2 0 2 -2 v -"+labelHeight+" q 0 -2 -2 -2 h -"+(labelWidth2)+" q -2 0 -2 2 v "+labelHeight+" q 0 2 2 2 h "+(labelWidth1)+" l 5 5" lx = -labelWidth/2 + 6; - ly = -labelHeight-lineHeight+10; + ly = -labelHeight-lineHeight+12; anchor = "start"; } tooltip.append("path").attr("d",path); @@ -2103,6 +2162,10 @@ RED.view = (function() { } function portMouseOver(port,d,portType,portIndex) { + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } clearTimeout(portLabelHoverTimeout); var active = (mouse_mode!=RED.state.JOINING && mouse_mode != RED.state.QUICK_JOINING) || // Not currently joining - all ports active ( @@ -2134,6 +2197,10 @@ RED.view = (function() { port.classed("red-ui-flow-port-hovered",active); } function portMouseOut(port,d,portType,portIndex) { + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } clearTimeout(portLabelHoverTimeout); if (portLabelHover) { portLabelHover.remove(); @@ -2143,6 +2210,10 @@ RED.view = (function() { } function nodeMouseUp(d) { + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } if (dblClickPrimed && mousedown_node == d && clickElapsed > 0 && clickElapsed < 750) { mouse_mode = RED.state.DEFAULT; if (d.type != "subflow") { @@ -2217,6 +2288,32 @@ RED.view = (function() { } else if (mouse_mode == RED.state.QUICK_JOINING) { d3.event.stopPropagation(); 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;i 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) { @@ -2522,7 +2631,7 @@ RED.view = (function() { subflowOutputs.each(function(d,i) { if (d.dirty) { var output = d3.select(this); - output.selectAll(".red-ui-flow-subflow-port").classed("red-ui-flow-node-selected",function(d) { return d.selected; }) + output.classed("red-ui-flow-node-selected",function(d) { return d.selected; }) output.selectAll(".red-ui-flow-port-index").text(function(d){ return d.i+1}); output.attr("transform", function(d) { return "translate(" + (d.x-d.w/2) + "," + (d.y-d.h/2) + ")"; }); dirtyNodes[d.id] = d; @@ -2532,7 +2641,7 @@ RED.view = (function() { subflowInputs.each(function(d,i) { if (d.dirty) { var input = d3.select(this); - input.selectAll(".red-ui-flow-subflow-port").classed("red-ui-flow-node-selected",function(d) { return d.selected; }) + input.classed("red-ui-flow-node-selected",function(d) { return d.selected; }) input.attr("transform", function(d) { return "translate(" + (d.x-d.w/2) + "," + (d.y-d.h/2) + ")"; }); dirtyNodes[d.id] = d; d.dirty = false; @@ -2541,7 +2650,7 @@ RED.view = (function() { subflowStatus.each(function(d,i) { if (d.dirty) { var output = d3.select(this); - output.selectAll(".red-ui-flow-subflow-port").classed("red-ui-flow-node-selected",function(d) { return d.selected; }) + output.classed("red-ui-flow-node-selected",function(d) { return d.selected; }) output.selectAll(".red-ui-flow-port-index").text(function(d){ return d.i+1}); output.attr("transform", function(d) { return "translate(" + (d.x-d.w/2) + "," + (d.y-d.h/2) + ")"; }); dirtyNodes[d.id] = d; @@ -2569,10 +2678,12 @@ RED.view = (function() { var hideLabel = d.hasOwnProperty('l')?!d.l : isLink; node.attr("id",d.id); var l = RED.utils.getNodeLabel(d); - if (hideLabel) { - d.w = node_height; - } else { - d.w = Math.max(node_width,20*(Math.ceil((calculateTextWidth(l, "red-ui-flow-node-label", 50)+(d._def.inputs>0?7:0))/20)) ); + if (d.resize || d.w === undefined) { + if (hideLabel) { + d.w = node_height; + } else { + d.w = Math.max(node_width,20*(Math.ceil((calculateTextWidth(l, "red-ui-flow-node-label", 50)+(d._def.inputs>0?7:0))/20)) ); + } } d.h = Math.max(node_height,(d.outputs||0) * 15); @@ -2649,9 +2760,14 @@ RED.view = (function() { nodeMouseUp.call(this,d); }) .on("mouseover",function(d) { - if (mouse_mode === 0) { - var nodeBody = d3.select(this); - nodeBody.classed("node_hovered",true); + if (mouse_mode === 0 || mouse_mode === RED.state.SELECTING_NODE) { + if (mouse_mode === RED.state.SELECTING_NODE && selectNodesOptions && selectNodesOptions.filter) { + if (selectNodesOptions.filter(d)) { + node.classed("red-ui-flow-node-hovered",true); + } + } else { + node.classed("red-ui-flow-node-hovered",true); + } clearTimeout(portLabelHoverTimeout); if (d.hasOwnProperty('l')?!d.l : (d.type === "link in" || d.type === "link out")) { portLabelHoverTimeout = setTimeout(function() { @@ -2693,8 +2809,7 @@ RED.view = (function() { } }) .on("mouseout",function(d) { - var nodeBody = d3.select(this); - nodeBody.classed("node_hovered",false); + node.classed("red-ui-flow-node-hovered",false); clearTimeout(portLabelHoverTimeout); if (portLabelHover) { portLabelHover.remove(); @@ -2824,15 +2939,16 @@ 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}}); thisNode.attr("transform", function(d) { return "translate(" + (d.x-d.w/2) + "," + (d.y-d.h/2) + ")"; }); if (mouse_mode != RED.state.MOVING_ACTIVE) { + thisNode.classed("red-ui-flow-node-selected",function(d) { return d.selected }) thisNode.selectAll(".red-ui-flow-node") .attr("width",function(d){return d.w}) .attr("height",function(d){return d.h}) - .classed("red-ui-flow-node-selected",function(d) { return d.selected; }) .classed("red-ui-flow-node-highlighted",function(d) { return d.highlighted; }) ; if ((!d._def.align && d.inputs !== 0 && d.outputs === 0) || "right" === d._def.align) { @@ -3048,7 +3164,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); @@ -3077,6 +3193,10 @@ RED.view = (function() { l.append("svg:path").attr("class","red-ui-flow-link-background red-ui-flow-link-path") .classed("red-ui-flow-link-link", function(d) { return d.link }) .on("mousedown",function(d) { + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } mousedown_link = d; clearSelection(); selected_link = mousedown_link; @@ -3086,6 +3206,10 @@ RED.view = (function() { d3.event.stopPropagation(); }) .on("touchstart",function(d) { + if (mouse_mode === RED.state.SELECTING_NODE) { + d3.event.stopPropagation(); + return; + } mousedown_link = d; clearSelection(); selected_link = mousedown_link; @@ -3135,6 +3259,7 @@ RED.view = (function() { } return path; }); + link.classed("red-ui-flow-node-disabled", function(d) { return d.source.d || d.target.d; }); } }) @@ -3301,6 +3426,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) { @@ -3462,6 +3590,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, @@ -3532,12 +3702,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 @@ -3576,6 +3746,70 @@ RED.view = (function() { }, getActiveNodes: function() { return activeNodes; + }, + selectNodes: function(options) { + $("#red-ui-workspace-tabs-shade").show(); + $("#red-ui-palette-shade").show(); + $("#red-ui-sidebar-shade").show(); + $("#red-ui-header-shade").show(); + $("#red-ui-workspace").addClass("red-ui-workspace-select-mode"); + + mouse_mode = RED.state.SELECTING_NODE; + clearSelection(); + if (options.selected) { + console.log(options.selected); + options.selected.forEach(function(id) { + var n = RED.nodes.node(id); + if (n) { + n.selected = true; + n.dirty = true; + moving_set.push({n:n}); + } + }) + } + redraw(); + selectNodesOptions = options||{}; + var closeNotification = function() { + clearSelection(); + $("#red-ui-workspace-tabs-shade").hide(); + $("#red-ui-palette-shade").hide(); + $("#red-ui-sidebar-shade").hide(); + $("#red-ui-header-shade").hide(); + $("#red-ui-workspace").removeClass("red-ui-workspace-select-mode"); + resetMouseVars(); + notification.close(); + } + selectNodesOptions.done = function(selection) { + closeNotification(); + if (selectNodesOptions.onselect) { + selectNodesOptions.onselect(selection); + } + } + var buttons = [{ + text: RED._("common.label.cancel"), + click: function(e) { + closeNotification(); + if (selectNodesOptions.oncancel) { + selectNodesOptions.oncancel(); + } + } + }]; + if (!selectNodesOptions.single) { + buttons.push({ + text: RED._("common.label.done"), + class: "primary", + click: function(e) { + var selection = moving_set.map(function(n) { return n.n;}); + selectNodesOptions.done(selection); + } + }); + } + var notification = RED.notify(selectNodesOptions.prompt || RED._("workspace.selectNodes"),{ + modal: false, + fixed: true, + type: "compact", + buttons: buttons + }) } }; })(); 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 35b62cba5..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 @@ -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 = { @@ -158,9 +165,8 @@ RED.workspaces = (function() { '
              ').appendTo(dialogForm); $('
              '+ - ''+ - ' '+ - ''+ + ''+ + ''+ '
              ').appendTo(dialogForm); var row = $('
              '+ @@ -190,33 +196,16 @@ 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({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", + invertState: true + }) $('').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); @@ -328,6 +317,7 @@ RED.workspaces = (function() { function init() { $('
                ').appendTo("#red-ui-workspace"); + $('
                ').appendTo("#red-ui-workspace"); $('
                ').appendTo("#red-ui-workspace"); $('
                ').appendTo("#red-ui-workspace"); $('').appendTo("#red-ui-workspace"); @@ -351,6 +341,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 "); @@ -363,6 +355,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)); @@ -405,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; } @@ -426,6 +460,8 @@ RED.workspaces = (function() { }, resize: function() { workspace_tabs.resize(); - } + }, + enable: enableWorkspace, + disable: disableWorkspace } })(); 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..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 @@ -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; @@ -90,6 +90,7 @@ $event-log-selection-background: #999; $list-item-color: $primary-text-color; +$list-item-secondary-color: $secondary-text-color; $list-item-background: $secondary-background; $list-item-background-disabled: $secondary-background-inactive; $list-item-background-hover: $secondary-background-hover; @@ -185,6 +186,7 @@ $view-lasso-stroke: #ff7f0e; $view-lasso-fill: rgba(20,125,255,0.1); $view-background: $secondary-background; +$view-select-mode-background: $secondary-background-selected; $view-grid-color: #eee; $node-label-color: #333; @@ -222,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/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 { 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/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index d3f729a96..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; @@ -461,3 +466,116 @@ 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); +} + +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 367a7e10a..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 @@ -54,6 +54,23 @@ cursor: move; stroke-width: 1; } +.red-ui-workspace-select-mode { + g.red-ui-flow-node.red-ui-flow-node-hovered * { + cursor: pointer !important + } + g.red-ui-flow-node, g.red-ui-flow-link { + opacity: 0.5; + } + g.red-ui-flow-node.red-ui-flow-node-hovered:not(.red-ui-flow-node-selected) { + opacity: 0.9; + .red-ui-flow-node { + stroke-width: 2; + stroke: $node-selected-color !important; + stroke-dasharray: 10, 4; + } + } +} + .red-ui-flow-node-unknown { stroke-dasharray:10,4; stroke: $node-border-unknown; @@ -115,32 +132,56 @@ stroke-linecap: round; } -.red-ui-flow-node-selected { - stroke-width: 2; - stroke: $node-selected-color !important; +g.red-ui-flow-node-selected { + .red-ui-workspace-select-mode & { + opacity: 1; + } + .red-ui-flow-node,.red-ui-flow-subflow-port { + stroke-width: 2; + stroke: $node-selected-color !important; + } } .red-ui-flow-node-highlighted { border-color: $node-selected-color !important; 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; -} -.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: 10,4; - } } +.red-ui-workspace-disabled { + .red-ui-flow-node { + stroke-dasharray: 8, 3; + 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.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; + } +} @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); @@ -166,7 +207,6 @@ } .red-ui-flow-subflow-port { - stroke-dasharray: 5,5; fill: $node-background-placeholder; stroke: $node-border; } @@ -186,12 +226,14 @@ } .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; @@ -203,11 +245,6 @@ .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/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index 29ccc0b5e..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,19 +219,20 @@ text-indent: 0px; } } + > li > a:hover, + > li > a:focus, > li:hover > a, > li:focus > a { background: $header-menu-item-hover !important; } - li.divider { + li.red-ui-menu-divider { background: $headerMenuItemDivider; - border-bottom-color: $header-menu-item-hover; } 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; } } 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/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/editor-client/src/sass/mixins.scss b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss index d7d20db0b..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 @@ -151,6 +151,9 @@ margin-bottom: 0; cursor: default; } + &:not(.selected) { + margin-top: 1px; + } } } @mixin editor-button { @@ -189,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/editor-client/src/sass/notifications.scss b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss index 0612dbc70..f7c64632f 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss @@ -33,6 +33,9 @@ border: 1px solid $notification-border-default; border-left-width: 16px; overflow: hidden; + .ui-dialog-buttonset { + margin-top: 20px; + } } .red-ui-notification p:first-child { font-size: 1.1em; @@ -55,6 +58,18 @@ border-color: $notification-border-error; } +.red-ui-notification-compact { + p { + margin: 0; + } + .ui-dialog-buttonset { + margin-top: 0; + position: absolute; + top: 8px; + right: 10px; + } +} + .red-ui-notification-shake-horizontal { -webkit-animation: red-ui-notification-shake-horizontal 0.3s steps(2, end) both; animation: red-ui-notification-shake-horizontal 0.3s steps(2, end) both; 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..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 @@ -165,7 +165,7 @@ } } -.red-ui-search-result-description { +.red-ui-search-result-node-description { margin-left: 40px; margin-right: 5px; } @@ -193,3 +193,14 @@ font-style: italic; color: $form-placeholder-color; } + +.red-ui-search-result-action { + color: $primary-text-color; +} +.red-ui-search-result-action-key { + position: absolute; + top: 9px; + right: 0; + margin-right: 10px; + color: $tertiary-text-color; +} 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-config.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-config.scss index b57e7ddfd..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 @@ -22,15 +22,28 @@ @include disable-selection; } -.red-ui-sidebar-node-config-list { +ul.red-ui-sidebar-node-config-list { margin: 0; + padding: 0; list-style-type: none; + li { + padding: 0; + margin: 0; + text-align: center; + } .red-ui-palette-node { overflow: hidden; + &.selected { - margin: 10px auto; + margin: 4px auto; border-color: $node-selected-color; border-width: 2px; + &:first-child { + margin-top: 9px; + } + &:last-child { + margin-bottom: 9px; + } } } .red-ui-palette-label { @@ -68,7 +81,7 @@ color: $primary-text-color; cursor: pointer; } -.red-ui-palette-node-config-type { +ul.red-ui-sidebar-node-config-list li.red-ui-palette-node-config-type { color: $secondary-text-color; text-align: right; padding-right: 3px; @@ -81,12 +94,20 @@ 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/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; 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 { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/treeList.scss b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/treeList.scss index 6a61e9645..8911b1140 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/treeList.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/treeList.scss @@ -77,18 +77,18 @@ margin: 0; position: relative; - // &:hover { - // background: $list-item-background-hover; - // color: $list-item-color; - // text-decoration: none; - // } - &:focus { + &:hover, &:hover .red-ui-treeList-sublabel-text { + background: $list-item-background-hover; + color: $list-item-color; + text-decoration: none; + } + &:focus, &:focus .red-ui-treeList-sublabel-text { background: $list-item-background-hover; outline: none; color: $list-item-color; text-decoration: none; } - &.selected { + &.selected, &.selected .red-ui-treeList-sublabel-text { background: $list-item-background-selected; outline: none; color: $list-item-color; @@ -101,6 +101,19 @@ .red-ui-treeList-label-text { margin-left: 4px; } +.red-ui-treeList-sublabel-text { + top: 0; + bottom: 0; + right: 0; + padding: 0 10px 0 5px; + line-height: 32px; + font-size: 0.9em; + color: $list-item-secondary-color; + position: absolute; + background: $list-item-background; +} + + .red-ui-treeList-icon { display: inline-block; width: 20px; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss index 11c910365..63e5e0d2d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss @@ -48,7 +48,16 @@ &.red-ui-typedInput-focus:not(.input-error) { border-color: $form-input-focus-color !important; } + .red-ui-typedInput-value-label { + position: absolute; + display: inline-block; + height: 32px; + box-sizing: border-box; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } button.red-ui-typedInput-type-select, button.red-ui-typedInput-option-expand, button.red-ui-typedInput-option-trigger @@ -81,6 +90,9 @@ display: inline-block; height: 100%; padding: 0 1px 0 5px; + img { + max-width: none; + } } &:not(.disabled):hover { 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..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 @@ -39,6 +39,12 @@ outline: none; } } +#red-ui-workspace-tabs-shade { + @include shade; + z-index: 2; + bottom: auto; + height: 35px; +} .red-ui-workspace-chart-background { fill: $view-background; @@ -49,6 +55,15 @@ stroke: $view-grid-color; stroke-width: 1px; } +.red-ui-workspace-select-mode { + .red-ui-workspace-chart-background { + opacity: 0.7; + // fill: $view-select-mode-background; + } + .red-ui-workspace-chart-grid line { + opacity: 0.8; + } +} .red-ui-palette-closed #red-ui-workspace { left: 7px; @@ -92,6 +107,7 @@ } } + #red-ui-navigator-canvas { position: absolute; bottom: 0; @@ -107,11 +123,18 @@ pointer-events: none; stroke: $secondary-border-color; strokeWidth: 1; - fill: white; + fill: $view-background; } .red-ui-component-footer { @include component-footer; + + > .button-group { + display: inline-block; + > .red-ui-footer-button { + margin-top: -1px; + } + } } a.red-ui-footer-button, 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..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 @@ -7,17 +7,11 @@
                - -
                - - -
                -
                @@ -32,11 +24,19 @@ +
                +
                + + +
                + + +
                @@ -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"}, @@ -117,7 +118,7 @@ obj: this._("httpin.label.jsonObject") }[this.ret]); }, - icon: "white-globe.png", + icon: "white-globe.svg", label: function() { return this.name||this._("httpin.httpreq"); }, @@ -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").on("change", function() { - if ($(this).val() == "basic" || $(this).val() == "digest") { + $("#node-input-authType-select").on("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); } 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..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 @@ -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; @@ -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; diff --git a/packages/node_modules/@node-red/nodes/core/io/22-websocket.html b/packages/node_modules/@node-red/nodes/core/io/22-websocket.html index b3847909d..403c1e5c8 100644 --- a/packages/node_modules/@node-red/nodes/core/io/22-websocket.html +++ b/packages/node_modules/@node-red/nodes/core/io/22-websocket.html @@ -106,7 +106,7 @@ color:"rgb(215, 215, 160)", inputs:0, outputs:1, - icon: "white-globe.png", + icon: "white-globe.svg", labelStyle: function() { return this.name?"node_label_italic":""; }, @@ -125,7 +125,7 @@ color:"rgb(215, 215, 160)", inputs:1, outputs:0, - icon: "white-globe.png", + icon: "white-globe.svg", align: "right", labelStyle: function() { return this.name?"node_label_italic":""; 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..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 }; @@ -194,20 +197,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()) + } } } diff --git a/packages/node_modules/@node-red/nodes/core/io/23-watch.html b/packages/node_modules/@node-red/nodes/core/io/23-watch.html index f04a264b2..e53842e2e 100644 --- a/packages/node_modules/@node-red/nodes/core/io/23-watch.html +++ b/packages/node_modules/@node-red/nodes/core/io/23-watch.html @@ -42,7 +42,7 @@ color:"BurlyWood", inputs:0, outputs:1, - icon: "watch.png", + icon: "watch.svg", label: function() { return this.name||this.files||this._("watch.watch"); }, diff --git a/packages/node_modules/@node-red/nodes/core/io/31-tcpin.html b/packages/node_modules/@node-red/nodes/core/io/31-tcpin.html index c50db4526..27629f569 100644 --- a/packages/node_modules/@node-red/nodes/core/io/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/core/io/31-tcpin.html @@ -72,7 +72,7 @@ }, inputs:0, outputs:1, - icon: "bridge-dash.png", + icon: "bridge-dash.svg", label: function() { return this.name || "tcp:"+(this.host?this.host+":":"")+this.port; }, @@ -155,7 +155,7 @@ }, inputs:1, outputs:0, - icon: "bridge-dash.png", + icon: "bridge-dash.svg", align: "right", label: function() { return this.name || "tcp:"+(this.host?this.host+":":"")+this.port; @@ -226,7 +226,7 @@ }, inputs:1, outputs:1, - icon: "bridge-dash.png", + icon: "bridge-dash.svg", label: function() { return this.name || "tcp:"+(this.server?this.server+":":"")+this.port; }, diff --git a/packages/node_modules/@node-red/nodes/core/io/32-udp.html b/packages/node_modules/@node-red/nodes/core/io/32-udp.html index d9aef89c5..89e9ded70 100644 --- a/packages/node_modules/@node-red/nodes/core/io/32-udp.html +++ b/packages/node_modules/@node-red/nodes/core/io/32-udp.html @@ -70,7 +70,7 @@ }, inputs:0, outputs:1, - icon: "bridge-dash.png", + icon: "bridge-dash.svg", label: function() { if (this.multicast=="false") { return this.name||"udp "+this.port; @@ -173,7 +173,7 @@ }, inputs:1, outputs:0, - icon: "bridge-dash.png", + icon: "bridge-dash.svg", align: "right", label: function() { return this.name||"udp "+(this.addr+":"+this.port); 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..7dbe0b0ba 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 @@ -117,7 +117,7 @@ return label; } }, - icon: "switch.png", + icon: "switch.svg", label: function() { return this.name||this._("switch.switch"); }, @@ -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/packages/node_modules/@node-red/nodes/core/logic/15-change.html b/packages/node_modules/@node-red/nodes/core/logic/15-change.html index cc0f8d817..616b03ab9 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/15-change.html +++ b/packages/node_modules/@node-red/nodes/core/logic/15-change.html @@ -28,7 +28,7 @@ }, inputs: 1, outputs: 1, - icon: "swap.png", + icon: "swap.svg", label: function() { function prop2name(type, key) { var result = RED.utils.parseContextKey(key); diff --git a/packages/node_modules/@node-red/nodes/core/logic/16-range.html b/packages/node_modules/@node-red/nodes/core/logic/16-range.html index 7f1ee3c36..77d123d56 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/16-range.html +++ b/packages/node_modules/@node-red/nodes/core/logic/16-range.html @@ -52,7 +52,7 @@ }, inputs: 1, outputs: 1, - icon: "range.png", + icon: "range.svg", label: function() { if (this.minout !== "" && this.maxout !== "") { return this.name||this.minout + " - " + this.maxout; } else { return this.name||this._("range.range"); } diff --git a/packages/node_modules/@node-red/nodes/core/logic/17-split.html b/packages/node_modules/@node-red/nodes/core/logic/17-split.html index 269b3397e..fbdb7f8b6 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/17-split.html +++ b/packages/node_modules/@node-red/nodes/core/logic/17-split.html @@ -61,7 +61,7 @@ }, inputs:1, outputs:1, - icon: "split.png", + icon: "split.svg", label: function() { return this.name||this._("split.split"); }, @@ -218,7 +218,7 @@ }, inputs:1, outputs:1, - icon: "join.png", + icon: "join.svg", label: function() { return this.name||this._("join.join"); }, 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..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] = { @@ -627,11 +628,13 @@ 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; - 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/packages/node_modules/@node-red/nodes/core/logic/18-sort.html b/packages/node_modules/@node-red/nodes/core/logic/18-sort.html index a3f3ee8cb..0093ee65d 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/18-sort.html +++ b/packages/node_modules/@node-red/nodes/core/logic/18-sort.html @@ -75,7 +75,7 @@ }, inputs:1, outputs:1, - icon: "sort.png", + icon: "sort.svg", label: function() { return this.name||this._("sort.sort"); }, diff --git a/packages/node_modules/@node-red/nodes/core/logic/19-batch.html b/packages/node_modules/@node-red/nodes/core/logic/19-batch.html index 05a64ab4d..52bb84132 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/19-batch.html +++ b/packages/node_modules/@node-red/nodes/core/logic/19-batch.html @@ -81,7 +81,7 @@ }, inputs:1, outputs:1, - icon: "batch.png", + icon: "batch.svg", label: function() { return this.name||this._("batch.batch");; }, diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.html index f7e4e3ba2..caf6fe753 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.html +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.html @@ -24,7 +24,7 @@

                - +
                @@ -42,7 +42,7 @@
                - +
                @@ -78,7 +78,7 @@ }, inputs:1, outputs:1, - icon: "parser-csv.png", + icon: "parser-csv.svg", label: function() { return this.name||"csv"; }, diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html index 843fae76f..2ce298d4b 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html @@ -49,7 +49,7 @@ }, inputs:1, outputs:1, - icon: "parser-html.png", + icon: "parser-html.svg", label: function() { return this.name||this.tag||"html"; }, 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..15bf9cf6c 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 @@

                - +

                - +
                @@ -32,7 +32,7 @@ }, inputs:1, outputs:1, - icon: "parser-xml.png", + icon: "parser-xml.svg", label: function() { return this.name||"xml"; }, diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-YAML.html b/packages/node_modules/@node-red/nodes/core/parsers/70-YAML.html index f543a7362..86ae10a98 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-YAML.html +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-YAML.html @@ -20,7 +20,7 @@ }, inputs:1, outputs:1, - icon: "parser-yaml.png", + icon: "parser-yaml.svg", label: function() { return this.name||"yaml"; }, diff --git a/packages/node_modules/@node-red/nodes/core/storage/50-file.html b/packages/node_modules/@node-red/nodes/core/storage/50-file.html index cbf7c9b5c..e48039269 100755 --- a/packages/node_modules/@node-red/nodes/core/storage/50-file.html +++ b/packages/node_modules/@node-red/nodes/core/storage/50-file.html @@ -205,7 +205,7 @@ color:"BurlyWood", inputs:1, outputs:1, - icon: "file-out.png", + icon: "file-out.svg", label: function() { if (this.overwriteFile === "delete") { return this.name||this._("file.label.deletelabel",{file:this.filename}); @@ -273,7 +273,7 @@ outputLabels: function(i) { return (this._((this.format === "utf8") ? "file.label.utf8String" : "file.label.binaryBuffer")); }, - icon: "file-in.png", + icon: "file-in.svg", label: function() { return this.name||this.filename||this._("file.label.filelabel"); }, diff --git a/packages/node_modules/@node-red/nodes/icons/alert.png b/packages/node_modules/@node-red/nodes/icons/alert.png deleted file mode 100644 index a86311109..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/alert.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/alert.svg b/packages/node_modules/@node-red/nodes/icons/alert.svg new file mode 100644 index 000000000..06f6c15f3 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/alert.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/arrow-in.png b/packages/node_modules/@node-red/nodes/icons/arrow-in.png deleted file mode 100644 index e38f39146..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/arrow-in.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/arrow-in.svg b/packages/node_modules/@node-red/nodes/icons/arrow-in.svg new file mode 100644 index 000000000..a5fcb49af --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/arrow-in.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/batch.png b/packages/node_modules/@node-red/nodes/icons/batch.png deleted file mode 100644 index 44803d185..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/batch.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/batch.svg b/packages/node_modules/@node-red/nodes/icons/batch.svg new file mode 100644 index 000000000..eb513de93 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/batch.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/bridge-dash.png b/packages/node_modules/@node-red/nodes/icons/bridge-dash.png deleted file mode 100644 index 3914cb7a5..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/bridge-dash.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/bridge-dash.svg b/packages/node_modules/@node-red/nodes/icons/bridge-dash.svg new file mode 100644 index 000000000..45f556a11 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/bridge-dash.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/bridge.png b/packages/node_modules/@node-red/nodes/icons/bridge.png deleted file mode 100644 index 2011292d6..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/bridge.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/bridge.svg b/packages/node_modules/@node-red/nodes/icons/bridge.svg new file mode 100644 index 000000000..093071ca8 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/bridge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/icons/cog.png b/packages/node_modules/@node-red/nodes/icons/cog.png deleted file mode 100644 index e84cb16b2..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/cog.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/cog.svg b/packages/node_modules/@node-red/nodes/icons/cog.svg new file mode 100644 index 000000000..ae236ff43 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/cog.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/comment.png b/packages/node_modules/@node-red/nodes/icons/comment.png deleted file mode 100644 index d64d12a7f..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/comment.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/comment.svg b/packages/node_modules/@node-red/nodes/icons/comment.svg new file mode 100644 index 000000000..43042723a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/comment.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/db.png b/packages/node_modules/@node-red/nodes/icons/db.png deleted file mode 100644 index 5e74f7480..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/db.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/db.svg b/packages/node_modules/@node-red/nodes/icons/db.svg new file mode 100644 index 000000000..5b455b606 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/db.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/debug.png b/packages/node_modules/@node-red/nodes/icons/debug.png deleted file mode 100644 index 05691562d..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/debug.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/debug.svg b/packages/node_modules/@node-red/nodes/icons/debug.svg new file mode 100644 index 000000000..f102ddb7d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/debug.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/envelope.png b/packages/node_modules/@node-red/nodes/icons/envelope.png deleted file mode 100644 index fb0d36b95..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/envelope.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/envelope.svg b/packages/node_modules/@node-red/nodes/icons/envelope.svg new file mode 100644 index 000000000..dacfd673b --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/envelope.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/feed.png b/packages/node_modules/@node-red/nodes/icons/feed.png deleted file mode 100644 index 9f2671c53..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/feed.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/feed.svg b/packages/node_modules/@node-red/nodes/icons/feed.svg new file mode 100644 index 000000000..dc22a626a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/feed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/icons/file-in.png b/packages/node_modules/@node-red/nodes/icons/file-in.png deleted file mode 100644 index d3e5cd7fe..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/file-in.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/file-in.svg b/packages/node_modules/@node-red/nodes/icons/file-in.svg new file mode 100644 index 000000000..15950f96f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/file-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/icons/file-out.png b/packages/node_modules/@node-red/nodes/icons/file-out.png deleted file mode 100644 index 051f819c8..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/file-out.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/file-out.svg b/packages/node_modules/@node-red/nodes/icons/file-out.svg new file mode 100644 index 000000000..214e307ee --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/file-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/icons/file.png b/packages/node_modules/@node-red/nodes/icons/file.png deleted file mode 100644 index 78ee09f79..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/file.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/file.svg b/packages/node_modules/@node-red/nodes/icons/file.svg new file mode 100644 index 000000000..2934c0c15 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/file.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/function.png b/packages/node_modules/@node-red/nodes/icons/function.png deleted file mode 100644 index 909505000..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/function.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/function.svg b/packages/node_modules/@node-red/nodes/icons/function.svg new file mode 100644 index 000000000..b831a21fa --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/function.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/hash.png b/packages/node_modules/@node-red/nodes/icons/hash.png deleted file mode 100644 index e68e45df1..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/hash.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/hash.svg b/packages/node_modules/@node-red/nodes/icons/hash.svg new file mode 100644 index 000000000..4c8e4370e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/hash.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/inject.png b/packages/node_modules/@node-red/nodes/icons/inject.png deleted file mode 100644 index dbf4711a3..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/inject.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/inject.svg b/packages/node_modules/@node-red/nodes/icons/inject.svg new file mode 100644 index 000000000..8038a313f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/inject.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/join.png b/packages/node_modules/@node-red/nodes/icons/join.png deleted file mode 100644 index d4a2cffb4..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/join.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/join.svg b/packages/node_modules/@node-red/nodes/icons/join.svg new file mode 100644 index 000000000..491a22b08 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/join.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/light.png b/packages/node_modules/@node-red/nodes/icons/light.png deleted file mode 100644 index ce21542bb..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/light.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/light.svg b/packages/node_modules/@node-red/nodes/icons/light.svg new file mode 100644 index 000000000..ba1c973d4 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/light.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/link-out.png b/packages/node_modules/@node-red/nodes/icons/link-out.png deleted file mode 100644 index f39ba0453..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/link-out.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/link-out.svg b/packages/node_modules/@node-red/nodes/icons/link-out.svg new file mode 100644 index 000000000..efbcd85cc --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/link-out.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/parser-csv.png b/packages/node_modules/@node-red/nodes/icons/parser-csv.png deleted file mode 100644 index 5b1c42c48..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/parser-csv.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/parser-csv.svg b/packages/node_modules/@node-red/nodes/icons/parser-csv.svg new file mode 100644 index 000000000..62698efc4 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/parser-csv.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/parser-html.png b/packages/node_modules/@node-red/nodes/icons/parser-html.png deleted file mode 100644 index fa5373713..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/parser-html.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/parser-html.svg b/packages/node_modules/@node-red/nodes/icons/parser-html.svg new file mode 100644 index 000000000..05c8c8628 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/parser-html.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/parser-json.png b/packages/node_modules/@node-red/nodes/icons/parser-json.png deleted file mode 100644 index 839d60dcb..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/parser-json.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/parser-json.svg b/packages/node_modules/@node-red/nodes/icons/parser-json.svg new file mode 100644 index 000000000..6ce3d45f5 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/parser-json.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/parser-xml.png b/packages/node_modules/@node-red/nodes/icons/parser-xml.png deleted file mode 100644 index fa5373713..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/parser-xml.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/parser-xml.svg b/packages/node_modules/@node-red/nodes/icons/parser-xml.svg new file mode 100644 index 000000000..05c8c8628 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/parser-xml.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/parser-yaml.png b/packages/node_modules/@node-red/nodes/icons/parser-yaml.png deleted file mode 100644 index e4cb2f20b..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/parser-yaml.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/parser-yaml.svg b/packages/node_modules/@node-red/nodes/icons/parser-yaml.svg new file mode 100644 index 000000000..d3a2cb9e0 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/parser-yaml.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/range.png b/packages/node_modules/@node-red/nodes/icons/range.png deleted file mode 100644 index 2e7183ce8..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/range.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/range.svg b/packages/node_modules/@node-red/nodes/icons/range.svg new file mode 100644 index 000000000..6253f01df --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/range.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/rpi.png b/packages/node_modules/@node-red/nodes/icons/rpi.png deleted file mode 100644 index 162b99dc1..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/rpi.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/rpi.svg b/packages/node_modules/@node-red/nodes/icons/rpi.svg new file mode 100644 index 000000000..99185f9b0 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/rpi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/icons/serial.png b/packages/node_modules/@node-red/nodes/icons/serial.png deleted file mode 100644 index f4bcedc3b..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/serial.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/serial.svg b/packages/node_modules/@node-red/nodes/icons/serial.svg new file mode 100644 index 000000000..53c08c448 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/serial.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/sort.png b/packages/node_modules/@node-red/nodes/icons/sort.png deleted file mode 100644 index f0fb7ead2..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/sort.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/sort.svg b/packages/node_modules/@node-red/nodes/icons/sort.svg new file mode 100644 index 000000000..6af54d712 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/sort.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/split.png b/packages/node_modules/@node-red/nodes/icons/split.png deleted file mode 100644 index bda78484f..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/split.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/split.svg b/packages/node_modules/@node-red/nodes/icons/split.svg new file mode 100644 index 000000000..a4609534a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/split.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/subflow.png b/packages/node_modules/@node-red/nodes/icons/subflow.png deleted file mode 100644 index 7c1c14f38..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/subflow.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/subflow.svg b/packages/node_modules/@node-red/nodes/icons/subflow.svg new file mode 100644 index 000000000..d211f94ce --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/subflow.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/swap.png b/packages/node_modules/@node-red/nodes/icons/swap.png deleted file mode 100644 index e9e70efbd..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/swap.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/swap.svg b/packages/node_modules/@node-red/nodes/icons/swap.svg new file mode 100644 index 000000000..0e67fda9c --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/swap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/icons/switch.png b/packages/node_modules/@node-red/nodes/icons/switch.png deleted file mode 100644 index 4d172de66..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/switch.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/switch.svg b/packages/node_modules/@node-red/nodes/icons/switch.svg new file mode 100644 index 000000000..378e84b4b --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/switch.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/template.png b/packages/node_modules/@node-red/nodes/icons/template.png deleted file mode 100644 index 1db6f273d..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/template.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/template.svg b/packages/node_modules/@node-red/nodes/icons/template.svg new file mode 100644 index 000000000..ad23bf31e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/template.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/timer.png b/packages/node_modules/@node-red/nodes/icons/timer.png deleted file mode 100644 index 4f02f4656..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/timer.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/timer.svg b/packages/node_modules/@node-red/nodes/icons/timer.svg new file mode 100644 index 000000000..c579cc298 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/timer.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/trigger.png b/packages/node_modules/@node-red/nodes/icons/trigger.png deleted file mode 100644 index 37b60f118..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/trigger.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/trigger.svg b/packages/node_modules/@node-red/nodes/icons/trigger.svg new file mode 100644 index 000000000..a7c2d87f2 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/trigger.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/twitter.png b/packages/node_modules/@node-red/nodes/icons/twitter.png deleted file mode 100644 index d06059453..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/twitter.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/watch.png b/packages/node_modules/@node-red/nodes/icons/watch.png deleted file mode 100644 index a6c1b9451..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/watch.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/watch.svg b/packages/node_modules/@node-red/nodes/icons/watch.svg new file mode 100644 index 000000000..fb9535b2d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/watch.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/nodes/icons/white-globe.png b/packages/node_modules/@node-red/nodes/icons/white-globe.png deleted file mode 100644 index 8a19079bf..000000000 Binary files a/packages/node_modules/@node-red/nodes/icons/white-globe.png and /dev/null differ diff --git a/packages/node_modules/@node-red/nodes/icons/white-globe.svg b/packages/node_modules/@node-red/nodes/icons/white-globe.svg new file mode 100644 index 000000000..474c2f9a6 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/white-globe.svg @@ -0,0 +1 @@ + \ 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 c9e8f8c9e..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 @@ -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. - Die Standardnutzlast ist die aktuelle Zeit als Zeitmarke 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 Inject-Node kann einen Flow mit einem bestimmten Nutzdatenwert starten. + 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.

                -

                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/io/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/de/io/10-mqtt.html index 60f39b403..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 @@ -12,23 +12,23 @@ --> 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..2b22418dc 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,23 +22,23 @@ 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 dd7fcb80e..acf0447c4 100755 --- a/packages/node_modules/@node-red/nodes/locales/de/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json @@ -2,7 +2,7 @@ "common" : { "label" : { "payload" : "Nutzdaten", - "topic" : "Thema", + "topic" : "Topic", "name" : "Name", "username" : "Benutzername", "password" : "Kennwort", @@ -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" : { @@ -37,7 +37,7 @@ "label" : { "repeat" : "Wiederholen" }, - "timestamp" : "Zeitmarke", + "timestamp" : "timestamp", "none" : "keine", "interval" : "Intervall", "interval-time" : "Intervall zwischen den Uhrzeiten", @@ -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" } }, @@ -217,7 +217,7 @@ "limitrate" : "Geschwindigkeitslimit", "limitall" : "Alle Nachrichten", "limittopic" : "Für jedes msg.topic", - "fairqueue" : "Jedes Thema im Gegenzug senden", + "fairqueue" : "Jedes Topic im Gegenzug senden", "timedqueue" : "Alle Themen senden", "milisecs" : "Milisekunden", "secs" : "Sekunden", @@ -237,7 +237,7 @@ "delay" : "Verzögerung", "variable" : "Variable", "limit" : "Begrenzung", - "limitTopic" : "Grenzwert, Thema", + "limitTopic" : "Grenzwert, Topic", "random" : "Zufall", "units" : { "second" : { @@ -310,14 +310,14 @@ "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 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" : { "broker" : "Server", "example" : "z. B. lokaler_Host", "qos" : "QoS", - "retain" : "Beibehalten", + "retain" : "Retain", "clientid" : "Client-ID", "port" : "Port", "keepalive" : "Keepalive-Zeit (en)", @@ -349,14 +349,14 @@ "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 Thema \"Artikel\", \"qos\" oder \"retain\" bei, wenn Sie diese über die Eigenschaft \"msg\" festlegen", + "tip" : "Tipp: Behalten Sie das Topic \"Artikel\", \"qos\" oder \"retain\" bei, wenn Sie diese über die Eigenschaft \"msg\" festlegen", "errors" : { - "not-defined" : "Thema nicht definiert", + "not-defined" : "Topic nicht definiert", "missing-config" : "Fehlende Brokerkonfiguration", - "invalid-topic" : "Ungültiges Thema angegeben", + "invalid-topic" : "Ungültiges Topic angegeben", "nonclean-missingclientid" : "Keine Client-ID-Gruppe unter Verwendung einer bereinigten Sitzung" } }, @@ -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", @@ -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: ", @@ -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?", @@ -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." } }, "tail" : { @@ -781,7 +781,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", @@ -823,13 +823,13 @@ "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", - "topic" : "Thema", - "on-change" : "Zusammengefügte Nachricht bei Ankunft eines neuen Themas senden" + "topic" : "Topic", + "on-change" : "Zusammengefügte Nachricht bei Ankunft eines neuen Topics senden" }, "reduce" : { "exp" : "Zusammenfassen durch", @@ -852,9 +852,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", @@ -877,9 +877,9 @@ }, "concat" : { "topics-label" : "Topics", - "topic" : "Thema" + "topic" : "Topic" }, - "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..1dd5b71ba 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 @@ -15,23 +15,23 @@ --> 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..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 @@ -18,20 +18,20 @@

                Extrahiert unter Verwendung eines CSS-Selektors Elemente aus einem HTML-Dokument, das sich in msg.payload befindet.

                Eingaben

                -
                payload Zeichenkette
                -
                die html-Zeichenkette, aus der Elemente extrahiert werden sollen.
                -
                select Zeichenkette
                +
                payload String
                +
                der html-String, aus der Elemente extrahiert werden sollen.
                +
                select String
                wenn nicht im Edit-Panel konfiguriert, kann der Selektor als Eigenschaft der Nachricht übergeben werden.

                Ausgaben

                -
                payload Array | Zeichenkette
                -
                das Ergebnis kann entweder eine einzelne Nachricht mit einer Nutzlast sein, die ein Array der übereinstimmenden Elemente enthält +
                payload Array | String
                +
                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.

                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..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 @@ -18,32 +18,32 @@

                Konvertiert zwischen einem JSON-String und seiner JavaScript-Objektdarstellung in beide Richtungen.

                Eingaben

                -
                payloadObjekt | Zeichenkette
                -
                Ein JavaScript Objekt oder eine Zeichenkette.
                +
                payloadObjekt | String
                +
                Ein JavaScript Objekt oder ein String.
                schemaObjekt
                Ein optionales JSON Schema Objekt gegen das das JSON Objekt validiert wird.

                Ausgaben

                -
                payloadObjekt | Zeichenkette
                +
                payloadObjekt | String
                • Wenn die Eingabe ein JSON-String ist, wird versucht ihn in ein JavaScript-Objekt zu parsen..
                • -
                • Wenn die Eingabe ein JavaScript-Objekt ist, wird ein JSON-String erstellt. Die Zeichenkette kann optional gut formatiert werden.
                • +
                • Wenn die Eingabe ein JavaScript-Objekt ist, wird ein JSON-String erstellt. Der String kann optional gut formatiert werden.
                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 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 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..2b9d172aa 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 @@ -18,16 +18,16 @@

                Konvertiert zwischen einem XML-String und seiner JavaScript-Objektdarstellung - in beiden Richtungen.

                Eingaben

                -
                payloadObjekt | Zeichenkette
                -
                Ein JavaScript Objekt oder eine XML Zeichenkette.
                +
                payloadObjekt | String
                +
                Ein JavaScript Objekt oder ein XML String.

                Ausgaben

                -
                payloadObjekt | Zeichenkette
                +
                payloadObjekt | String
                  -
                • Wenn die Eingabe eine Zeichenkette ist, wird versucht sie als XML zu analysieren und daraus ein JavaScript-Objekt zu erstellen.
                • -
                • Wenn die Eingabe ein JavaScript-Objekt ist, wird versucht eine XML-Zeichenkette zu erstellen.
                • +
                • Wenn die Eingabe ein String ist, wird versucht sie als XML zu analysieren und daraus ein JavaScript-Objekt zu erstellen.
                • +
                • Wenn die Eingabe ein JavaScript-Objekt ist, wird versucht ein XML-String zu erstellen.
                Optionen Objekt
                @@ -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/parsers/70-YAML.html b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
                index 980a812ab..3d42494be 100755
                --- a/packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
                +++ b/packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
                @@ -15,19 +15,19 @@
                 -->
                 
                 
                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..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
                @@ -19,19 +19,19 @@
                         Alternativ kann die Datei auch gelöscht werden.

                Eingaben

                -
                filename Zeichenkette
                -
                Wenn nicht im Knoten konfiguriert, legt diese optionale Eigenschaft den Namen der zu aktualisierenden Datei fest.
                +
                filename String
                +
                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.

                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 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.