diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 5d4d87bb7..07efaf18e 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -28,7 +28,7 @@ To help us understand the issue, please fill-in as much of the following informa ### Please tell us about your environment: - [ ] Node-RED version: -- [ ] node.js version: +- [ ] Node.js version: - [ ] npm version: - [ ] Platform/OS: - [ ] Browser: diff --git a/.github/ISSUE_TEMPLATE/--bug_report.md b/.github/ISSUE_TEMPLATE/--bug_report.md index ff13e2ace..63923455e 100644 --- a/.github/ISSUE_TEMPLATE/--bug_report.md +++ b/.github/ISSUE_TEMPLATE/--bug_report.md @@ -33,7 +33,7 @@ To help us understand the issue, please fill-in as much of the following informa ### Please tell us about your environment: - [ ] Node-RED version: -- [ ] node.js version: +- [ ] Node.js version: - [ ] npm version: - [ ] Platform/OS: - [ ] Browser: 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/.travis.yml b/.travis.yml index 94bf3698c..a101eecb0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ sudo: false language: node_js matrix: include: + - node_js: "12" - node_js: "10" script: - ./node_modules/.bin/grunt && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index a99600a05..28f11c2db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,259 @@ +#### 1.0.2: Maintenance Release + +Runtime + - Allow node.status() to be passed number/bool types + - Allow node emitted events to have multiple arguments + - #2323 Fixed docstrings to have them match the function signature (name of parameters). + - #2318 NLS: Unify translations of "boolean" + +Editor + - Ensure node status is refreshed whenever node is edited + - #2315 #2316 Ensure z property included in full message debug payload + - #2321 Fixed editor.json (JA nls) + - #2313 Fix element to collapse items in visual JSON editor + - #2314 Insert divider in menu by calling RED.menu.addItem('id', null); + +Nodes + - Change: Fixup use of node.done + - #2322 Template: Fix invalid JSON data in template node docs + - #2320 File: Fixed a typo in 10-file.html (JA nls) + - #2312 Template: Remove unnecessary comma in help text + - #2319 Inject: Interval of inject node should be 596 hours or less. + +#### 1.0.1: Maintenance Release + +Runtime + - #2301 Add env vars to enable safe mode and projects + - `NODE_RED_ENABLE_SAFE_MODE` + - `NODE_RED_ENABLE_PROJECTS` + +Editor + - #2308 Fix grid setting + - #2306 i18n support in tooltips + - Fix error when setting typedInput to boolean true/false + - #2299 Fix SVG icons in IE11 + - #2303 Fix issue where subflow color did not update when not on a flow + +Nodes + - #2297 TLS: Allow TLS config node to provide just CA cert + - #2307 Inject: Fix width on inject node property + - #2305 Switch: Let switch node between rule work both ways round + - Range: Add example to range node info and make use of target consistent + - Join: node must clone group message before sending + + +#### 1.0.0: Milestone Release + +Editor + - Add click-on-tooltip to close + - Fix node draggable handling + - Ensure complete node scope property is remapped on import + - Update i18n for project feature + - Fix menu hiding function for flow editor + - Normalise default subflow color references + - Hide header text of very small screens to deploy is visible + - Fix tab access on touch screens + - Update radialMenu to use standard theme colours + - Fix undefined reference loading on mobile + - Allow word breaking of node name with long word + - Enable wrap mode in Markdown editor + - Maximize the size of markdown editor + +Nodes + - remove legacy error option from file in mode + - Change MQTT node default 3.1 compatibility mode to false + - Show clear debug shortcut in tooltip + - Fix file-in port labels for all 4 options + - Add extra comment re Mustache escapes to Template info + - Fix typo in complete node + - Allow Function node output input to go to 0 + +#### 1.0.0-beta.4: Beta Release + +Runtime + - Clone the first message passed to node.send in Function node + +Editor + - Move flow-status button to footer for consistency + - Fix node hover effect to prevent jumping position + - Filter quick-add properly when splicing a wire + - Mark workspace dirty when deleting link node link Fixes #2274 + - Add red-ui-button class to strategy login button + - Fix padding of subflow locale select Closes #2276 + - Update info text of complete node & add JP text + - Add class red-ui-button to cancel button + - Add css class to login submit button (#2275) + - Realign subflow output port labels + - Move context sidebar auto-refresh option to individual sections + - Update Japanese message catalogue + - Fix subflow UI for select + - remove padding before label text for SUBFLOW UI row + - Allow SUBFLOW UI label row without variable name + +Nodes + - Remove old rc option from exec node for 1.0 + - Add python and SQL to template language options + - Fix Switch node display of jsonata_exp type + - Remove sentiment from core nodes + +#### 1.0.0-beta.3: Beta Release + +Runtime + - [FEATURE] Add Node Done API - make message passing async + - Ensure the subflow stop promise is waiting for before restarting + - Limit the regex for the /nodes/ api end points + - Add error event handler to ssh-keygen child_process Fixes #2255 + - Fix default value handling on context array access Fixes #2252 + - Remove all ui test dependencies from package.json + - Add req back to audit log events and extend to Projects api + - Ensure 2nd arg to node.error is an object Fixes #2228 + - Use a more atomic process for writing context files Fixes #2271 + + +Editor + - [FEATURE] Change core node categories + - [FEATURE] Subflow Instance property UI (#2236) + - [FEATURE] Add visual JSON editor + - [FEATURE] Add Action List dialog + - [FEATURE] Add new shortcut to clear debug message list - ctrl-alt-l + - [FEATURE] Add show-library dialog actions + - [FEATURE] Add shift-cursor handling for moving quick-add dialog + - [FEATURE] Add enable/disable-flow actions + - [FEATURE] Add actions to change deploy type + - [FEATURE] Allow config nodes to be disabled, tidy css and add actions + - [FEATURE] Add default shortcut (ctrl-d) for deploy + - [FEATURE] Initial implementation of redo (un-undo) - ctrl-y + - [FEATURE] add support for specifying subflow template color + - [FEATURE] Use ctrl-click on wire to splice node in place + - [FEATURE] Allow search results to show more than 25 results + - [FEATURE] Allow a node to change if it has an input port Closes #2268 + - Revealing node position needs to account for zoom level Fixes #2172 + - Fix typedInput option selection Fixes #2174 + - Fix palette node id handling so search works Fixes #2173 + - Add popover tooltips to debug sidebar,function and template + - Add popovers to context sidebar mini buttons + - Ensure node status icon is shown when value set + - Revert treeList children function signature change + - Restore tray component css for compatibility. Mark as deprecated + - fix function name & string compare function + - Handle empty list of example flows Fixes #2171 + - Ensure library list has an item selected when opened + - Ensure tooltip popover doesn't replace normal popover + - Fix clipboard export download button + - Ensure input box has focus on repeated quick add + - Fix width calculation of typedInput + - Remove some hardcoded css colors + - Fix display of node help when clicking in palette Fixes #2194 + - Ensure node help is loaded in the right language Fixes #2195 + - Do not allow tab focus on clipboard hidden element + - Fix undefined error on typedInput due to valueLabel used before being added + - Fix undo of flow disable state change + - Fix select-all action in main view + - Fix delete-all action on config node sidebar + - Update UI tests for new editor css + - Add insertItemAt doc to editableList + - Ensure focus returns to the right element after dialogs shown + - Set autocomplete to disabled in form input elements + - Update all node icons to SVG + - Handle png/svg fallback for def.icon values. Remove old pngs + - Ignore empty examples directories (don't add to import menu) + - better handle example file at any depth - #2222 + - Properly escape node types in palette + - Ensure session expiry timeout doesn't exceed limit + - Use node/tab map to make filterNodes more efficient + - Rearrange contents of subflow template settings tab + - Handle undefined node.\_def in edit stack title. + - fix converting selection to subflow + - Fix inserting new subflow node to existing wire between nodes + - Support displaying falsey node status values Fixes #2246 + - Remove tab menu from node property UI for subflow and config nodes + - Mark workspace dirty when shift-click-drag detaches wires Fixes #2260 + - Fix subflow category change on palette + + +Nodes + - Remove pi gpi, twitter, email and feedparser nodes from core + - Fix error handling in Websocket broadcast function Fixes #2182 + - Handle websocket item being parseable but not an object better + - stop join tripping up if last message of buffer is blank. + - Add support for env var propety in switch node + - Improve handling of file upload in request node + - Add "has key" rule to switch node + tests + - Optimise generation of switch node edit dialog + - Add keep-alive option to HTTP Request - #2261 + +#### 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.8: Maintenance Release + + - Sanitize tab name in edit dialog + - Pass httpServer to runtime even when httpAdmin disabled Fixes #2272 + +#### 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 @@ -658,7 +914,7 @@ Nodes - Initial support of sequence rules for SWITCH node (#1545) - initial support of SORT node (#1500) - Inject node - let once delay be editable (#1541) - - Introduce `nodeMaxMessageBufferLength` setting for msg sequence nodes + - Introduce `nodeMessageBufferMaxLength` setting for msg sequence nodes - Let CSV correct parts if we remove header row. - let default apply if msg.delay not set in override mode. (#1397) - let trigger node be reset by boolean message (#1554) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 33a2f582f..f0f4096c5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ relevant nodes, press Ctrl-E and copy the flow data from the Export dialog. At a minimum, please include: - Version of Node-RED - either release number if you downloaded a zip, or the first few lines of `git log` if you are cloning the repository directly. - - Version of node.js - what does `node -v` say? + - Version of Node.js - what does `node -v` say? ## Feature requests diff --git a/Gruntfile.js b/Gruntfile.js index e11caabbc..caa043e76 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -145,11 +145,13 @@ 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", "packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js", "packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js", @@ -167,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", @@ -181,22 +184,22 @@ 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-1.11.3.min.js", - "packages/node_modules/@node-red/editor-client/src/vendor/bootstrap/js/bootstrap.min.js", - "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui-1.10.3.custom.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", "packages/node_modules/@node-red/editor-client/src/vendor/marked/marked.min.js", "packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js", - "packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js" - ], - "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [ - // TODO: resolve relative resource paths in - // bootstrap/FA/jquery - ], - "packages/node_modules/@node-red/editor-client/public/vendor/jsonata/jsonata.min.js": [ + "packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js", "node_modules/jsonata/jsonata-es5.min.js", - "packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js" + "packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js", + "packages/node_modules/@node-red/editor-client/src/vendor/ace/ace.js", + "packages/node_modules/@node-red/editor-client/src/vendor/ace/ext-language_tools.js", ], + // "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [ + // // TODO: resolve relative resource paths in + // // bootstrap/FA/jquery + // ], "packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [ "node_modules/jsonata/jsonata-es5.min.js", "packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js" @@ -222,10 +225,6 @@ module.exports = function(grunt) { files: [{ dest: 'packages/node_modules/@node-red/editor-client/public/red/style.min.css', src: 'packages/node_modules/@node-red/editor-client/src/sass/style.scss' - }, - { - dest: 'packages/node_modules/@node-red/editor-client/public/vendor/bootstrap/css/bootstrap.min.css', - src: 'packages/node_modules/@node-red/editor-client/src/vendor/bootstrap/css/bootstrap.css' }] } }, @@ -277,7 +276,7 @@ module.exports = function(grunt) { files: [ 'packages/node_modules/@node-red/editor-client/src/js/**/*.js' ], - tasks: ['copy:build','concat','uglify','attachCopyright:js'] + tasks: ['copy:build','concat',/*'uglify',*/ 'attachCopyright:js'] }, sass: { files: [ @@ -352,9 +351,7 @@ module.exports = function(grunt) { cwd: 'packages/node_modules/@node-red/editor-client/src/vendor', src: [ 'ace/**', - //'bootstrap/css/**', - 'bootstrap/img/**', - 'jquery/css/**', + 'jquery/css/base/**', 'font-awesome/**' ], expand: true, @@ -499,7 +496,9 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-chmod'); grunt.loadNpmTasks('grunt-jsonlint'); grunt.loadNpmTasks('grunt-mocha-istanbul'); - grunt.loadNpmTasks('grunt-webdriver'); + if (fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { + grunt.loadNpmTasks('grunt-webdriver'); + } grunt.loadNpmTasks('grunt-jsdoc'); grunt.loadNpmTasks('grunt-jsdoc-to-markdown'); grunt.loadNpmTasks('grunt-npm-command'); @@ -558,8 +557,8 @@ module.exports = function(grunt) { }); grunt.registerTask('verifyUiTestDependencies', function() { - if (!fs.existsSync(path.join("node_modules", "chromedriver"))) { - grunt.fail.fatal('You need to run "npm install chromedriver@2" before running UI test.'); + if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { + grunt.fail.fatal('You need to install the UI test dependencies first.\nUse the script in "scripts/install-ui-test-dependencies.sh"'); return false; } }); @@ -582,9 +581,15 @@ module.exports = function(grunt) { 'Runs code style check on editor code', ['jshint:editor']); - grunt.registerTask('test-ui', - 'Builds editor content then runs unit tests on editor ui', - ['verifyUiTestDependencies','build','jshint:editor','webdriver:all']); + if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { + grunt.registerTask('test-ui', + 'Builds editor content then runs unit tests on editor ui', + ['verifyUiTestDependencies']); + } else { + grunt.registerTask('test-ui', + 'Builds editor content then runs unit tests on editor ui', + ['verifyUiTestDependencies','build','jshint:editor','webdriver:all']); + } grunt.registerTask('test-nodes', 'Runs unit tests on core nodes', diff --git a/README.md b/README.md index 3d0acb0e3..3baa69377 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ http://nodered.org [![Build Status](https://travis-ci.org/node-red/node-red.svg?branch=master)](https://travis-ci.org/node-red/node-red) [![Coverage Status](https://coveralls.io/repos/node-red/node-red/badge.svg?branch=master)](https://coveralls.io/r/node-red/node-red?branch=master) -A visual tool for wiring the Internet of Things. +Low-code programming for event-driven applications. -![Node-RED: A visual tool for wiring the Internet of Things](http://nodered.org/images/node-red-screenshot.png) +![Node-RED: Low-code programming for event-driven applications](http://nodered.org/images/node-red-screenshot.png) ## Quick Start @@ -56,7 +56,7 @@ This project adheres to the [Contributor Covenant 1.4](http://contributor-covena ## Authors -Node-RED is a project of the [JS Foundation](http://js.foundation). +Node-RED is a project of the [OpenJS Foundation](https://openjsf.org). It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/). @@ -67,4 +67,4 @@ It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-t ## Copyright and license -Copyright JS Foundation and other contributors, http://js.foundation under [the Apache 2.0 license](LICENSE). +Copyright JS Foundation and other contributors, https://openjsf.org under [the Apache 2.0 license](LICENSE). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..a52064d59 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 1.0.0 | :white_check_mark: | +| 0.20.x | :white_check_mark: | + + +## Reporting a Vulnerability + +Please report any potential security issues to `team@nodered.org`. This will notify the core project team who will respond accordingly. diff --git a/package.json b/package.json index d401a614e..8d2ac8a4c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-red", - "version": "0.20.5", - "description": "A visual tool for wiring the Internet of Things", + "version": "1.0.2", + "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", "repository": { @@ -24,80 +24,77 @@ } ], "dependencies": { - "ajv": "6.10.0", + "ajv": "6.10.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "body-parser": "1.19.0", "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", - "https-proxy-agent": "2.2.1", - "i18next": "15.1.0", - "iconv-lite": "0.4.24", + "hash-sum": "2.0.0", + "https-proxy-agent": "2.2.2", + "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", - "node-red-node-email": "^1.4.0", - "node-red-node-feedparser": "^0.1.14", - "node-red-node-rbe": "^0.2.4", - "node-red-node-sentiment": "^0.1.3", - "node-red-node-tail": "^0.0.2", - "node-red-node-twitter": "^1.1.4", + "multer": "1.4.2", + "mustache": "3.0.2", + "node-red-node-rbe": "^0.2.5", + "node-red-node-sentiment": "^0.1.4", + "node-red-node-tail": "^0.0.3", "nopt": "4.0.1", "oauth2orize": "1.11.0", "on-headers": "1.0.2", "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.3.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", - "grunt-contrib-clean": "~1.1.0", - "grunt-contrib-compress": "~1.4.0", + "grunt-contrib-clean": "~2.0.0", + "grunt-contrib-compress": "~1.5.0", "grunt-contrib-concat": "~1.0.1", "grunt-contrib-copy": "~1.0.0", - "grunt-contrib-jshint": "~1.1.0", - "grunt-contrib-uglify": "~3.4.0", + "grunt-contrib-jshint": "~2.1.0", + "grunt-contrib-uglify": "~4.0.1", "grunt-contrib-watch": "~1.1.0", "grunt-jsdoc": "^2.2.1", "grunt-jsdoc-to-markdown": "^4.0.0", - "grunt-jsonlint": "~1.1.0", + "grunt-jsonlint": "~2.0.0", "grunt-mkdir": "~1.0.0", "grunt-mocha-istanbul": "5.0.2", "grunt-nodemon": "~0.4.2", "grunt-npm-command": "~0.1.2", "grunt-sass": "~2.0.0", "grunt-simple-mocha": "~0.4.1", - "grunt-webdriver": "^2.0.3", "http-proxy": "^1.16.2", "istanbul": "0.4.5", "minami": "1.2.3", @@ -107,11 +104,7 @@ "sinon": "1.17.7", "stoppable": "^1.1.0", "supertest": "3.4.2", - "wdio-chromedriver-service": "^0.1.5", - "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/admin/context.js b/packages/node_modules/@node-red/editor-api/lib/admin/context.js index 6a2efd82d..54bfd9f85 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/context.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/context.js @@ -30,7 +30,8 @@ module.exports = { scope: req.params.scope, id: req.params.id, key: req.params[0], - store: req.query['store'] + store: req.query['store'], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.context.getValue(opts).then(function(result) { res.json(result); @@ -45,7 +46,8 @@ module.exports = { scope: req.params.scope, id: req.params.id, key: req.params[0], - store: req.query['store'] + store: req.query['store'], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.context.delete(opts).then(function(result) { res.status(204).end(); diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/flow.js b/packages/node_modules/@node-red/editor-api/lib/admin/flow.js index 5ba5d7a04..98ae997ff 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/flow.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/flow.js @@ -24,7 +24,8 @@ module.exports = { get: function(req,res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.flows.getFlow(opts).then(function(result) { return res.json(result); @@ -35,7 +36,8 @@ module.exports = { post: function(req,res) { var opts = { user: req.user, - flow: req.body + flow: req.body, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.flows.addFlow(opts).then(function(id) { return res.json({id:id}); @@ -47,7 +49,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - flow: req.body + flow: req.body, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.flows.updateFlow(opts).then(function(id) { return res.json({id:id}); @@ -58,7 +61,8 @@ module.exports = { delete: function(req,res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.flows.deleteFlow(opts).then(function() { res.status(204).end(); diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/flows.js b/packages/node_modules/@node-red/editor-api/lib/admin/flows.js index ccad8718f..11b30e446 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/flows.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/flows.js @@ -27,7 +27,8 @@ module.exports = { return res.status(400).json({code:"invalid_api_version", message:"Invalid API Version requested"}); } var opts = { - user: req.user + user: req.user, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.flows.getFlows(opts).then(function(result) { if (version === "v1") { @@ -46,7 +47,8 @@ module.exports = { } var opts = { user: req.user, - deploymentType: req.get("Node-RED-Deployment-Type")||"full" + deploymentType: req.get("Node-RED-Deployment-Type")||"full", + req: apiUtils.getRequestLogObject(req) } if (opts.deploymentType !== 'reload') { diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/index.js b/packages/node_modules/@node-red/editor-api/lib/admin/index.js index 32bf010c5..50d7b168f 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/index.js @@ -48,13 +48,13 @@ module.exports = { // Nodes adminApp.get("/nodes",needsPermission("nodes.read"),nodes.getAll,apiUtil.errorHandler); adminApp.post("/nodes",needsPermission("nodes.write"),nodes.post,apiUtil.errorHandler); - adminApp.get(/\/nodes\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalogs,apiUtil.errorHandler); - adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalog,apiUtil.errorHandler); - adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,apiUtil.errorHandler); - adminApp.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.putModule,apiUtil.errorHandler); - adminApp.delete(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.delete,apiUtil.errorHandler); - adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.read"),nodes.getSet,apiUtil.errorHandler); - adminApp.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.write"),nodes.putSet,apiUtil.errorHandler); + adminApp.get(/^\/nodes\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalogs,apiUtil.errorHandler); + adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalog,apiUtil.errorHandler); + adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,apiUtil.errorHandler); + adminApp.put(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.putModule,apiUtil.errorHandler); + adminApp.delete(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.delete,apiUtil.errorHandler); + adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.read"),nodes.getSet,apiUtil.errorHandler); + adminApp.put(/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.write"),nodes.putSet,apiUtil.errorHandler); // Context adminApp.get("/context/:scope(global)",needsPermission("context.read"),context.get,apiUtil.errorHandler); diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js b/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js index 59a137587..2787a5c36 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js @@ -24,7 +24,8 @@ module.exports = { }, getAll: function(req,res) { var opts = { - user: req.user + user: req.user, + req: apiUtils.getRequestLogObject(req) } if (req.get("accept") == "application/json") { runtimeAPI.nodes.getNodeList(opts).then(function(list) { @@ -42,7 +43,8 @@ module.exports = { var opts = { user: req.user, module: req.body.module, - version: req.body.version + version: req.body.version, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.addModule(opts).then(function(info) { res.json(info); @@ -54,7 +56,8 @@ module.exports = { delete: function(req,res) { var opts = { user: req.user, - module: req.params[0] + module: req.params[0], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.removeModule(opts).then(function() { res.status(204).end(); @@ -66,7 +69,8 @@ module.exports = { getSet: function(req,res) { var opts = { user: req.user, - id: req.params[0] + "/" + req.params[2] + id: req.params[0] + "/" + req.params[2], + req: apiUtils.getRequestLogObject(req) } if (req.get("accept") === "application/json") { runtimeAPI.nodes.getNodeInfo(opts).then(function(result) { @@ -87,7 +91,8 @@ module.exports = { getModule: function(req,res) { var opts = { user: req.user, - module: req.params[0] + module: req.params[0], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.getModuleInfo(opts).then(function(result) { res.send(result); @@ -106,7 +111,8 @@ module.exports = { var opts = { user: req.user, id: req.params[0] + "/" + req.params[2], - enabled: body.enabled + enabled: body.enabled, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.setNodeSetState(opts).then(function(result) { res.send(result); @@ -125,7 +131,8 @@ module.exports = { var opts = { user: req.user, module: req.params[0], - enabled: body.enabled + enabled: body.enabled, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.setModuleState(opts).then(function(result) { res.send(result); @@ -139,7 +146,8 @@ module.exports = { var opts = { user: req.user, module: req.params[0], - lang: req.query.lng + lang: req.query.lng, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.getModuleCatalog(opts).then(function(result) { res.json(result); @@ -152,7 +160,8 @@ module.exports = { getModuleCatalogs: function(req,res) { var opts = { user: req.user, - lang: req.query.lng + lang: req.query.lng, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.getModuleCatalogs(opts).then(function(result) { res.json(result); @@ -164,7 +173,8 @@ module.exports = { getIcons: function(req,res) { var opts = { - user: req.user + user: req.user, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.nodes.getIconList(opts).then(function(list) { res.json(list); 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/index.js b/packages/node_modules/@node-red/editor-api/lib/editor/index.js index dbf4c18f2..3628fa702 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/index.js @@ -25,8 +25,8 @@ var auth = require("../auth"); var nodes = require("../admin/nodes"); // TODO: move /icons into here var needsPermission; var runtimeAPI; -var log = require("@node-red/util").log; // TODO: separate module -var i18n = require("@node-red/util").i18n; // TODO: separate module +var log = require("@node-red/util").log; +var i18n = require("@node-red/util").i18n; var apiUtil = require("../util"); @@ -93,9 +93,8 @@ module.exports = { // Library var library = require("./library"); library.init(runtimeAPI); - editorApp.get("/library/flows",needsPermission("library.read"),library.getAll,apiUtil.errorHandler); - editorApp.get(/library\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry); - editorApp.post(/library\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry); + editorApp.get(/library\/([^\/]+)\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry); + editorApp.post(/library\/([^\/]+)\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry); // Credentials diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/library.js b/packages/node_modules/@node-red/editor-api/lib/editor/library.js index e8b09424a..47a41bb7b 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/library.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/library.js @@ -25,23 +25,12 @@ module.exports = { init: function(_runtimeAPI) { runtimeAPI = _runtimeAPI; }, - - getAll: function(req,res) { - var opts = { - user: req.user, - type: 'flows' - } - runtimeAPI.library.getEntries(opts).then(function(result) { - res.json(result); - }).catch(function(err) { - apiUtils.rejectHandler(req,res,err); - }); - }, getEntry: function(req,res) { var opts = { user: req.user, - type: req.params[0], - path: req.params[1]||"" + library: req.params[0], + type: req.params[1], + path: req.params[2]||"" } runtimeAPI.library.getEntry(opts).then(function(result) { if (typeof result === "string") { @@ -62,8 +51,9 @@ module.exports = { saveEntry: function(req,res) { var opts = { user: req.user, - type: req.params[0], - path: req.params[1]||"" + library: req.params[0], + type: req.params[1], + path: req.params[2]||"" } // TODO: horrible inconsistencies between flows and all other types if (opts.type === "flows") { diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/projects.js b/packages/node_modules/@node-red/editor-api/lib/editor/projects.js index ff7fc5e85..0849c8ff8 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/projects.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/projects.js @@ -22,7 +22,8 @@ var needsPermission = require("../auth").needsPermission; function listProjects(req,res) { var opts = { - user: req.user + user: req.user, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.listProjects(opts).then(function(result) { res.json(result); @@ -33,7 +34,8 @@ function listProjects(req,res) { function getProject(req,res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getProject(opts).then(function(data) { if (data) { @@ -49,7 +51,8 @@ function getProjectStatus(req,res) { var opts = { user: req.user, id: req.params.id, - remote: req.query.remote + remote: req.query.remote, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getStatus(opts).then(function(data){ if (data) { @@ -64,7 +67,8 @@ function getProjectStatus(req,res) { function getProjectRemotes(req,res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getRemotes(opts).then(function(data) { res.json(data); @@ -98,7 +102,8 @@ module.exports = { app.post("/", needsPermission("projects.write"), function(req,res) { var opts = { user: req.user, - project: req.body + project: req.body, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.createProject(opts).then(function(result) { res.json(result); @@ -112,7 +117,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - project: req.body + project: req.body, + req: apiUtils.getRequestLogObject(req) } if (req.body.active) { @@ -150,7 +156,8 @@ module.exports = { app.delete("/:id", needsPermission("projects.write"), function(req,res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.deleteProject(opts).then(function() { res.status(204).end(); @@ -168,7 +175,8 @@ module.exports = { app.get("/:id/files", needsPermission("projects.read"), function(req,res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getFiles(opts).then(function(data) { res.json(data); @@ -185,7 +193,8 @@ module.exports = { user: req.user, id: req.params.id, path: req.params[0], - tree: req.params.treeish + tree: req.params.treeish, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getFile(opts).then(function(data) { res.json({content:data}); @@ -199,7 +208,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - path: req.params[0] + path: req.params[0], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.revertFile(opts).then(function() { @@ -214,7 +224,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - path: req.params[0] + path: req.params[0], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.stageFile(opts).then(function() { getProjectStatus(req,res); @@ -228,7 +239,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - path: req.body.files + path: req.body.files, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.stageFile(opts).then(function() { getProjectStatus(req,res); @@ -242,7 +254,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - message: req.body.message + message: req.body.message, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.commit(opts).then(function() { getProjectStatus(req,res); @@ -256,7 +269,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - path: req.params[0] + path: req.params[0], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.unstageFile(opts).then(function() { getProjectStatus(req,res); @@ -269,7 +283,8 @@ module.exports = { app.delete("/:id/stage", needsPermission("projects.write"), function(req, res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.unstageFile(opts).then(function() { getProjectStatus(req,res); @@ -284,7 +299,8 @@ module.exports = { user: req.user, id: req.params.id, path: req.params[0], - type: req.params.type + type: req.params.type, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getFileDiff(opts).then(function(data) { res.json({ @@ -301,7 +317,8 @@ module.exports = { user: req.user, id: req.params.id, limit: req.query.limit || 20, - before: req.query.before + before: req.query.before, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getCommits(opts).then(function(data) { res.json(data); @@ -315,7 +332,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - sha: req.params.sha + sha: req.params.sha, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getCommit(opts).then(function(data) { res.json({commit:data}); @@ -330,7 +348,8 @@ module.exports = { user: req.user, id: req.params.id, remote: req.params[0], - track: req.query.u + track: req.query.u, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.push(opts).then(function(data) { res.status(204).end(); @@ -346,7 +365,8 @@ module.exports = { id: req.params.id, remote: req.params[0], track: req.query.setUpstream, - allowUnrelatedHistories: req.query.allowUnrelatedHistories + allowUnrelatedHistories: req.query.allowUnrelatedHistories, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.pull(opts).then(function(data) { res.status(204).end(); @@ -359,7 +379,8 @@ module.exports = { app.delete("/:id/merge", needsPermission("projects.write"), function(req, res) { var opts = { user: req.user, - id: req.params.id + id: req.params.id, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.abortMerge(opts).then(function() { res.status(204).end(); @@ -374,7 +395,8 @@ module.exports = { user: req.user, id: req.params.id, path: req.params[0], - resolution: req.body.resolutions + resolution: req.body.resolutions, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.resolveMerge(opts).then(function() { res.status(204).end(); @@ -388,7 +410,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - remote: false + remote: false, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getBranches(opts).then(function(data) { res.json(data); @@ -403,7 +426,8 @@ module.exports = { user: req.user, id: req.params.id, branch: req.params.branchName, - force: !!req.query.force + force: !!req.query.force, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.deleteBranch(opts).then(function(data) { res.status(204).end(); @@ -417,7 +441,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - remote: true + remote: true, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getBranches(opts).then(function(data) { res.json(data); @@ -431,7 +456,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - branch: req.params[0] + branch: req.params[0], + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.getBranchStatus(opts).then(function(data) { res.json(data); @@ -446,7 +472,8 @@ module.exports = { user: req.user, id: req.params.id, branch: req.body.name, - create: req.body.create + create: req.body.create, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.setBranch(opts).then(function(data) { res.json(data); @@ -463,7 +490,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - remote: req.body + remote: req.body, + req: apiUtils.getRequestLogObject(req) } if (/^https?:\/\/[^/]+@/i.test(req.body.url)) { res.status(400).json({error:"unexpected_error", message:"Git http url must not include username/password"}); @@ -481,7 +509,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - remote: req.params.remoteName + remote: req.params.remoteName, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.removeRemote(opts).then(function(data) { getProjectRemotes(req,res); @@ -497,7 +526,8 @@ module.exports = { var opts = { user: req.user, id: req.params.id, - remote: remote + remote: remote, + req: apiUtils.getRequestLogObject(req) } runtimeAPI.projects.updateRemote(opts).then(function() { res.status(204).end(); diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/settings.js b/packages/node_modules/@node-red/editor-api/lib/editor/settings.js index 944792fb7..9d9867f1b 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/settings.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/settings.js @@ -19,6 +19,8 @@ var sshkeys = require("./sshkeys"); var theme = require("./theme"); var clone = require("clone"); +var i18n = require("@node-red/util").i18n + function extend(target, source) { var keys = Object.keys(source); var i = keys.length; @@ -53,12 +55,14 @@ module.exports = { user: req.user } runtimeAPI.settings.getRuntimeSettings(opts).then(function(result) { + result.editorTheme = result.editorTheme||{}; var themeSettings = theme.settings(); if (themeSettings) { // result.editorTheme may already exist with the palette // disabled. Need to merge that into the receive settings - result.editorTheme = extend(clone(themeSettings),result.editorTheme||{}); + result.editorTheme = extend(clone(themeSettings),result.editorTheme); } + result.editorTheme.languages = i18n.availableLanguages("editor"); res.json(result); }); }, 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 ea088b3eb..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", @@ -169,6 +169,9 @@ module.exports = { } } } + themeApp.get("/", function(req,res) { + res.json(themeContext); + }) if (theme.hasOwnProperty("menu")) { themeSettings.menu = theme.menu; 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/lib/util.js b/packages/node_modules/@node-red/editor-api/lib/util.js index 1984bd5f1..0cef96bbb 100644 --- a/packages/node_modules/@node-red/editor-api/lib/util.js +++ b/packages/node_modules/@node-red/editor-api/lib/util.js @@ -47,5 +47,12 @@ module.exports = { code: err.code||"unexpected_error", message: err.message||err.toString() }); + }, + getRequestLogObject: function(req) { + return { + user: req.user, + path: req.path, + ip: (req.headers && req.headers['x-forwarded-for']) || (req.connection && req.connection.remoteAddress) || undefined + } } } diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 315a1ee18..ac86c1f9b 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.20.5", + "version": "1.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,17 +16,17 @@ } ], "dependencies": { - "@node-red/util": "0.20.5", - "@node-red/editor-client": "0.20.5", + "@node-red/util": "1.0.2", + "@node-red/editor-client": "1.0.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", - "mustache": "3.0.1", + "mime": "2.4.4", + "mustache": "3.0.2", "oauth2orize": "1.11.0", "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", @@ -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 d477d3f0e..c7394c347 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 @@ -26,8 +26,7 @@ "status" : "Status", "enabled" : "Aktiviert", "disabled" : "Inaktiviert", - "info" : "Beschreibung", - "tip" : "Beschreibung akzeptiert Markdown und wird auf der Registerkarte Info angezeigt." + "info" : "Beschreibung" }, "menu" : { "label" : { @@ -48,16 +47,13 @@ }, "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", "searchInput" : "durchsuchen Sie Ihre Flows", - "clipboard" : "Zwischenablage", - "library" : "Bibliothek", - "examples" : "Beispiele", "subflows" : "Subflow", "createSubflow" : "Subflow erstellen", "selectionToSubflow" : "Auswahl für Subflow", @@ -87,17 +83,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.
", @@ -136,19 +132,19 @@ } }, "clipboard" : { - "nodes" : "Knoten", - "selectNodes" : "Wählen Sie den Text oben aus, und kopieren Sie die Datei in die Zwischenablage.", - "pasteNodes" : "Knoten hier einfügen", - "importNodes" : "Knoten importieren", - "exportNodes" : "Knoten in Zwischenablage exportieren", + "clipboard" : "Zwischenablage", + "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", @@ -164,16 +160,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" @@ -181,16 +177,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.", @@ -203,7 +199,7 @@ "diff" : { "unresolvedCount" : "__count__ unaufgelöster Konflikt", "unresolvedCount_plural" : "__count__ unaufgelöste Konflikte", - "globalNodes" : "Globale Knoten", + "globalNodes" : "Globale Nodes", "flowProperties" : "Flow-Eigenschaften", "type" : { "added" : "hinzugefügt", @@ -215,8 +211,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", @@ -240,9 +236,8 @@ "deleteSubflow" : "Subflow löschen", "info" : "Beschreibung", "category" : "Kategorie", - "format" : "Markdown-Format", "errors" : { - "noNodesSelected" : " Subflow kann nicht erstellt werden : Es wurden keine Knoten ausgewählt.", + "noNodesSelected" : " Subflow kann nicht erstellt werden : Es wurden keine Nodes ausgewählt.", "multipleInputsToSelection" : " Subflow kann nicht erstellt werden : Mehrere Eingaben zur Auswahl" } }, @@ -252,13 +247,13 @@ "configUpdate" : "Aktualisieren", "configDelete" : "Löschen", "nodesUse" : "__count__node verwendet diese Konfiguration", - "nodesUse_plural" : "__count__ -Knoten verwenden diese Konfiguration", - "addNewConfig" : "Neuen __type__config-Knoten hinzufügen", - "editNode" : "__type__ Knoten bearbeiten", - "editConfig" : "__type__config-Knoten bearbeiten", + "nodesUse_plural" : "__count__ -Nodes verwenden diese Konfiguration", + "addNewConfig" : "Neuen __type__config-Node hinzufügen", + "editNode" : "__type__ Node bearbeiten", + "editConfig" : "__type__config-Node bearbeiten", "addNewType" : "Neuen __type__ hinzufügen ...", - "nodeProperties" : "Knoteneigenschaften", - "portLabels" : "Knoteneinstellungen", + "nodeProperties" : "Node-Eigenschaften", + "portLabels" : "Node-Einstellungen", "labelInputs" : "Eingänge", "labelOutputs" : "Ausgänge", "settingIcon" : "Symbol", @@ -267,7 +262,7 @@ "searchIcons" : "Suchsymbole", "useDefault" : "Standardwert verwenden", "errors" : { - "scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Knoten in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein." + "scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Nodes in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein." } }, "keyboard" : { @@ -279,48 +274,45 @@ "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" }, "library" : { + "library" : "Bibliothek", "openLibrary" : "Bibliothek öffnen ...", "saveToLibrary" : "In Bibliothek speichern ...", "typeLibrary" : "__type__, Bibliothek", "unnamedType" : "Unbenannt __type__", - "exportToLibrary" : "Knoten in Bibliothek exportieren", "dialogSaveOverwrite" : "Ein __libraryType__ mit dem Namen __libraryName__ ist bereits vorhanden. Überschreiben?", "invalidFilename" : "Ungültiger Dateiname", - "savedNodes" : "Gespeicherte Knoten", + "savedNodes" : "Gespeicherte Nodes", "savedType" : "Gespeichert __type__", "saveFailed" : "Speichern fehlgeschlagen: __message__", - "filename" : "Name der Datei", - "folder" : "Ordner", - "filenamePlaceholder" : "Datei", - "fullFilenamePlaceholder" : "a/b/Datei", - "folderPlaceholder" : "a/b", - "breadcrumb" : "Bibliothek" + "types": { + "examples" : "Beispiele" + } }, "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", @@ -330,15 +322,15 @@ "advanced" : "fortgeschritten" }, "event" : { - "nodeAdded" : "Knoten zur Palette hinzugefügt:", - "nodeAdded_plural" : "Die Palette wurde der Palette hinzugefügt.", - "nodeRemoved" : "Knoten aus Palette entfernt:", - "nodeRemoved_plural" : "Knoten aus Palette entfernt:", - "nodeEnabled" : "Knoten aktiviert:", - "nodeEnabled_plural" : "Knoten aktiviert:", - "nodeDisabled" : "Knoten inaktiviert:", - "nodeDisabled_plural" : "Knoten inaktiviert:", - "nodeUpgraded" : "Knotenmodul __module__ aktualisiert auf Version __version__" + "nodeAdded" : "Node zur Palette hinzugefügt:", + "nodeAdded_plural" : "Die Nodes wurde der Palette hinzugefügt.", + "nodeRemoved" : "Node aus Palette entfernt:", + "nodeRemoved_plural" : "Nodes aus Palette entfernt:", + "nodeEnabled" : "Node aktiviert:", + "nodeEnabled_plural" : "Nodes aktiviert:", + "nodeDisabled" : "Node inaktiviert:", + "nodeDisabled_plural" : "Nodes inaktiviert:", + "nodeUpgraded" : "Node-Modul __module__ aktualisiert auf Version __version__" }, "editor" : { "title" : "Palette verwalten", @@ -362,8 +354,8 @@ "yearsMonthsV" : "____ Jahre, __count__ Monat vor", "yearsMonthsV_plural" : "____ Jahre, __count__ Monaten" }, - "nodeCount" : "__label__, Knoten", - "nodeCount_plural" : "__label__ Knoten", + "nodeCount" : "__label__, Node", + "nodeCount_plural" : "__label__ Nodes", "moduleCount" : "__count__ Modul verfügbar", "moduleCount_plural" : "__count__-Module verfügbar", "inuse" : "im Gebrauch", @@ -377,14 +369,14 @@ "install" : "installieren", "installed" : "installiert", "loading" : "Kataloge werden geladen ...", - "tab-nodes" : "Knoten", + "tab-nodes" : "Nodes", "tab-install" : "installieren", "sort" : "Sortierung:", "sortAZ" : "a-z", "sortRecent" : "kürzlich", "more" : "+ __count__ mehr", "errors" : { - "catalogLoadFailed" : "Fehler beim Laden des Knotenkatalogs.
Weitere Informationen finden Sie in der Browserkonsole.
", + "catalogLoadFailed" : "Fehler beim Laden des Node-Katalogs.
Weitere Informationen finden Sie in der Browserkonsole.
", "installFailed" : "Installation fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", "removeFailed" : "Entfernen fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", "updateFailed" : "Aktualisierung fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", @@ -393,22 +385,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.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" : "
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", @@ -826,4 +818,4 @@ "code" : "code" } } -} \ No newline at end of file +} 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 e8daafc65..ad985e785 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": { @@ -43,6 +44,8 @@ "ltr": "Left-to-right", "rtl": "Right-to-left", "auto": "Contextual", + "language": "Language", + "browserDefault": "Browser default", "flowVertical": "Vertical flow" }, "sidebar": { @@ -60,9 +63,6 @@ "export": "Export", "search": "Search flows", "searchInput": "search your flows", - "clipboard": "Clipboard", - "library": "Library", - "examples": "Examples", "subflows": "Subflows", "createSubflow": "Create Subflow", "selectionToSubflow": "Selection to Subflow", @@ -155,6 +155,7 @@ } }, "clipboard": { + "clipboard": "Clipboard", "nodes": "Nodes", "node": "__count__ node", "node_plural": "__count__ nodes", @@ -164,7 +165,6 @@ "flow_plural": "__count__ flows", "subflow": "__count__ subflow", "subflow_plural": "__count__ subflows", - "selectNodes": "Select the text above and copy to the clipboard.", "pasteNodes": "Paste flow json or", "selectFile": "select a file to import", "importNodes": "Import nodes", @@ -183,7 +183,11 @@ "all":"all flows", "compact":"compact", "formatted":"formatted", - "copy": "Export to clipboard" + "copy": "Copy to clipboard", + "export": "Export to library", + "exportAs": "Export as", + "overwrite": "Replace", + "exists": "
\"__file__\" already exists.
Do you want to replace it?
" }, "import": { "import": "Import to", @@ -307,10 +311,12 @@ "addNewType": "Add new __type__...", "nodeProperties": "node properties", "label": "Label", + "color": "Color", "portLabels": "Port labels", "labelInputs": "Inputs", "labelOutputs": "Outputs", "settingIcon": "Icon", + "default": "default", "noDefaultLabel": "none", "defaultLabel": "use default label", "searchIcons": "Search icons", @@ -318,8 +324,43 @@ "description": "Description", "show": "Show", "hide": "Hide", + "locale": "Select UI Language", + "icon": "Icon", + "inputType": "Input type", + "inputs" : { + "input": "input", + "select": "select", + "checkbox": "checkbox", + "spinner": "spinner", + "none": "none", + "hidden": "hide property" + }, + "types": { + "str": "string", + "num": "number", + "bool": "bool", + "json": "JSON", + "bin": "buffer", + "env": "env variable" + }, + "menu": { + "input": "input", + "select": "select", + "checkbox": "checkbox", + "spinner": "spinner", + "hidden": "label only" + }, + "select": { + "label": "Label", + "value": "Value" + }, + "spinner": { + "min": "Minimum", + "max": "Maximum" + }, "errors": { - "scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it" + "scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it", + "invalidProperties": "Invalid properties:" } }, "keyboard": { @@ -347,25 +388,26 @@ "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", "openLibrary": "Open Library...", "saveToLibrary": "Save to Library...", "typeLibrary": "__type__ library", "unnamedType": "Unnamed __type__", - "exportToLibrary": "Export nodes to library", + "exportedToLibrary": "Nodes exported to library", "dialogSaveOverwrite": "A __libraryType__ called __libraryName__ already exists. Overwrite?", "invalidFilename": "Invalid filename", "savedNodes": "Saved nodes", "savedType": "Saved __type__", "saveFailed": "Save failed: __message__", - "filename": "Filename", - "folder": "Folder", - "filenamePlaceholder": "file", - "fullFilenamePlaceholder": "a/b/file", - "folderPlaceholder": "a/b", - "breadcrumb": "Library" + "newFolder": "New folder", + "types": { + "local": "Local", + "examples": "Examples" + } }, "palette": { "noInfo": "no information available", @@ -374,9 +416,13 @@ "addCategory": "Add new...", "label": { "subflows": "subflows", + "network": "network", + "common": "common", "input": "input", "output": "output", "function": "function", + "sequence": "sequence", + "parser": "parser", "social": "social", "storage": "storage", "analysis": "analysis", @@ -513,8 +559,10 @@ "none": "none", "subflows": "subflows", "flows": "flows", - "filterUnused":"unused", - "filterAll":"all", + "filterAll": "all", + "showAllConfigNodes": "Show all config nodes", + "filterUnused": "unused", + "showAllUnusedConfigNodes": "Show all unused config nodes", "filtered": "__count__ hidden" }, "context": { @@ -526,7 +574,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": "Refresh on selection change", + "refrsh": "Refresh", + "delete": "Delete" }, "palette": { "name": "Palette management", @@ -541,6 +592,7 @@ "noSummaryAvailable": "No summary available", "editDescription": "Edit project description", "editDependencies": "Edit project dependencies", + "noDescriptionAvailable": "No description available", "editReadme": "Edit README.md", "showProjectSettings": "Show project settings", "projectSettings": { @@ -727,9 +779,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", @@ -919,8 +983,17 @@ }, "editor-tab": { "properties": "Properties", + "envProperties": "Environment Variables", "description": "Description", "appearance": "Appearance", - "env": "Environment Variables" + "preview": "UI Preview", + "defaultValue": "Default value" + }, + "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 429fb7cfd..d1d7dcefb 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": { @@ -43,6 +44,8 @@ "ltr": "左から右", "rtl": "右から左", "auto": "文脈", + "language": "表示言語", + "browserDefault": "ブラウザのデフォルト", "flowVertical": "縦フロー" }, "sidebar": { @@ -60,9 +63,6 @@ "export": "書き出し", "search": "ノードを検索", "searchInput": "ノードを検索", - "clipboard": "クリップボード", - "library": "ライブラリ", - "examples": "サンプル", "subflows": "サブフロー", "createSubflow": "サブフローを作成", "selectionToSubflow": "選択部分をサブフロー化", @@ -81,7 +81,7 @@ "projects-new": "新規", "projects-open": "開く", "projects-settings": "設定", - "showNodeLabelDefault": "追加したノードのラベルを表示する" + "showNodeLabelDefault": "追加したノードのラベルを表示" } }, "actions": { @@ -155,6 +155,7 @@ } }, "clipboard": { + "clipboard": "クリップボード", "nodes": "ノード", "node": "__count__ 個のノード", "node_plural": "__count__ 個のノード", @@ -164,7 +165,6 @@ "flow_plural": "__count__ 個のフロー", "subflow": "__count__ 個のサブフロー", "subflow_plural": "__count__ 個のサブフロー", - "selectNodes": "上のテキストを選択し、クリップボードへコピーしてください", "pasteNodes": "JSON形式のフローデータを貼り付けてください", "selectFile": "読み込むファイルを選択してください", "importNodes": "フローをクリップボートから読み込み", @@ -183,7 +183,11 @@ "all": "全てのタブ", "compact": "インデントのないJSONフォーマット", "formatted": "インデント付きのJSONフォーマット", - "copy": "書き出し" + "copy": "書き出し", + "export": "ライブラリに書き出し", + "exportAs": "書き出し先", + "overwrite": "更新", + "exists": "\"__file__\"は既に存在します。
更新しますか?
" }, "import": { "import": "読み込み先", @@ -307,10 +311,12 @@ "addNewType": "新規に __type__ を追加...", "nodeProperties": "プロパティ", "label": "ラベル", + "color": "色", "portLabels": "ポートラベル", "labelInputs": "入力", "labelOutputs": "出力", "settingIcon": "アイコン", + "default": "デフォルト", "noDefaultLabel": "なし", "defaultLabel": "既定のラベルを使用", "searchIcons": "アイコンを検索", @@ -318,8 +324,43 @@ "description": "詳細", "show": "表示", "hide": "非表示", + "locale": "UI言語の選択", + "icon": "記号", + "inputType": "入力形式", + "inputs": { + "input": "入力", + "select": "メニュー", + "checkbox": "チェックボックス", + "spinner": "スピナー", + "none": "無し", + "hidden": "非表示" + }, + "types": { + "str": "文字列", + "num": "数値", + "bool": "真偽", + "json": "JSON", + "bin": "バッファ", + "env": "環境変数" + }, + "menu": { + "input": "入力", + "select": "選択", + "checkbox": "チェックボックス", + "spinner": "数値", + "hidden": "ラベルのみ" + }, + "select": { + "label": "ラベル", + "value": "値" + }, + "spinner": { + "min": "最小値", + "max": "最大値" + }, "errors": { - "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします" + "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします", + "invalidProperties": "プロパティが不正です:" } }, "keyboard": { @@ -347,25 +388,26 @@ "pasteNode": "ノードを貼り付け", "undoChange": "変更操作を戻す", "searchBox": "ノードを検索", - "managePalette": "パレットの管理" + "managePalette": "パレットの管理", + "actionList": "動作一覧" }, "library": { + "library": "ライブラリ", "openLibrary": "ライブラリを開く", "saveToLibrary": "ライブラリへ保存", "typeLibrary": "__type__ ライブラリ", "unnamedType": "名前なし __type__", - "exportToLibrary": "ライブラリへフローを書き出す", + "exportedToLibrary": "ライブラリにノードを書き出しました", "dialogSaveOverwrite": "__libraryName__ という __libraryType__ は既に存在しています 上書きしますか?", "invalidFilename": "不正なファイル名", "savedNodes": "フローを保存しました", "savedType": "__type__ を保存しました", "saveFailed": "保存に失敗しました: __message__", - "filename": "ファイル名", - "folder": "フォルダ", - "filenamePlaceholder": "ファイル", - "fullFilenamePlaceholder": "a/b/file", - "folderPlaceholder": "a/b", - "breadcrumb": "ライブラリ" + "newFolder": "新規フォルダ", + "types": { + "local": "ローカル", + "examples": "サンプル" + } }, "palette": { "noInfo": "情報がありません", @@ -374,9 +416,13 @@ "addCategory": "新規追加...", "label": { "subflows": "サブフロー", + "network": "ネットワーク", + "common": "共通", "input": "入力", "output": "出力", "function": "機能", + "sequence": "シーケンス", + "parser": "パーサ", "social": "ソーシャル", "storage": "ストレージ", "analysis": "分析", @@ -513,8 +559,10 @@ "none": "なし", "subflows": "サブフロー", "flows": "フロー", - "filterUnused": "未使用", "filterAll": "全て", + "showAllConfigNodes": "全設定ノードを表示", + "filterUnused": "未使用", + "showAllUnusedConfigNodes": "未使用の全設定ノードを表示", "filtered": "__count__ 個が無効" }, "context": { @@ -523,10 +571,13 @@ "none": "選択されていません", "refresh": "読み込みのため更新してください", "empty": "データが存在しません", - "node": "Node", - "flow": "Flow", - "global": "Global", - "deleteConfirm": "データを削除しても良いですか?" + "node": "ノード", + "flow": "フロー", + "global": "グローバル", + "deleteConfirm": "データを削除しても良いですか?", + "autoRefresh": "選択対象が変化した場合更新", + "refrsh": "更新", + "delete": "削除" }, "palette": { "name": "パレットの管理", @@ -538,9 +589,10 @@ "description": "詳細", "dependencies": "依存関係", "settings": "設定", - "noSummaryAvailable": "サマリが存在しません", + "noSummaryAvailable": "要約が存在しません", "editDescription": "プロジェクトの詳細を編集", "editDependencies": "プロジェクトの依存関係を編集", + "noDescriptionAvailable": "詳細が存在しません", "editReadme": "README.mdを編集", "showProjectSettings": "プロジェクト設定を表示", "projectSettings": { @@ -726,9 +778,21 @@ "jsEditor": { "title": "JavaScriptエディタ" }, + "textEditor": { + "title": "テキストエディタ" + }, "jsonEditor": { "title": "JSONエディタ", - "format": "JSONフォーマット" + "format": "JSONフォーマット", + "rawMode": "JSONを編集", + "uiMode": "ビジュアルエディタ", + "insertAbove": "上に挿入", + "insertBelow": "下に挿入", + "addItem": "要素を追加", + "copyPath": "要素のパスをコピー", + "expandItems": "要素を展開", + "collapseItems": "要素を折り畳む", + "duplicate": "複製" }, "markdownEditor": { "title": "マークダウンエディタ", @@ -892,7 +956,7 @@ "confirm": "デプロイされていない変更は失われます。
続けますか?
" }, "send-req": { - "auth-req": "リポジトリ対する認証が必要です", + "auth-req": "リポジトリに対する認証が必要です", "username": "ユーザ名", "password": "パスワード", "passphrase": "パスフレーズ", @@ -918,8 +982,17 @@ }, "editor-tab": { "properties": "プロパティ", + "envProperties": "環境変数", "description": "説明", "appearance": "外観", - "env": "環境変数" + "preview": "UIプレビュー", + "defaultValue": "デフォルト値" + }, + "languages": { + "de": "ドイツ語", + "en-US": "英語", + "ja": "日本語", + "ko": "韓国語", + "zh-CN": "中国語(簡体)" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/ko/editor.json b/packages/node_modules/@node-red/editor-client/locales/ko/editor.json index da7c69e64..3c12e116a 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ko/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ko/editor.json @@ -58,9 +58,6 @@ "export": "내보내기", "search": "플로우 겅색", "searchInput": "플로우 검색", - "clipboard": "클립보드", - "library": "라이브러리", - "examples": "예시", "subflows": "보조 플로우", "createSubflow": "보조 플로우 생성", "selectionToSubflow": "보조 플로우 선택", @@ -148,6 +145,7 @@ } }, "clipboard": { + "clipboard": "클립보드", "nodes": "노드", "node": "__count__ 개의 노드", "node_plural": "__count__ 개의 노드", @@ -157,7 +155,6 @@ "flow_plural": "__count__ 개의 플로우", "subflow": "__count__ 개의 서브 플로우", "subflow_plural": "__count__ 개의 서브 플로우", - "selectNodes": "텍스트를 선택하고 클립보드에 복사하세요", "pasteNodes": "여기에 노드를 붙여넣기 하세요", "selectFile": "불러올 파일을 선택하세요", "importNodes": "노드 불러오기", @@ -276,7 +273,6 @@ "deleteSubflow": "서브 플로우 삭제", "info": "상세내역", "category": "카테고리", - "format": "Markdown 형식", "errors": { "noNodesSelected": "서브 플로우를 생성할 수 없습니다 : 노드가 선택되지 않았습니다", "multipleInputsToSelection": "서브 플로우를 생성할 수 없습니다 : 복수의 입력이 선택되었습니다" @@ -338,22 +334,19 @@ "managePalette": "팔렛트 관리" }, "library": { + "library": "라이브러리", "openLibrary": "라이브러리 열기...", "saveToLibrary": "라이브러리로 저장...", "typeLibrary": "__type__ 라이브러리", "unnamedType": "이름없는 __type__", - "exportToLibrary": "라이브러리로 노드 내보내기", "dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?", "invalidFilename": "파일명이 올바르지 않습니다", "savedNodes": "저장된 노드", "savedType": "저장된 __type__", "saveFailed": "저장 실패 : __message__", - "filename": "파일명", - "folder": "폴더명", - "filenamePlaceholder": "파일", - "fullFilenamePlaceholder": "a/b/file", - "folderPlaceholder": "a/b", - "breadcrumb": "라이브러리" + "types": { + "examples": "예시" + } }, "palette": { "noInfo": "정보 없음", @@ -501,8 +494,8 @@ "none": "없음", "subflows": "보조 플로우", "flows": "플로우", - "filterUnused": "미사용", "filterAll": "전체", + "filterUnused": "미사용", "filtered": "__count__ 개 숨김" }, "context": { @@ -904,4 +897,4 @@ "description": "상세 내역", "appearance": "모양" } -} \ No newline at end of file +} diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json index b7c1313a3..3c23fc553 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -51,9 +51,6 @@ "export": "导出", "search": "查找流程", "searchInput": "查找流程", - "clipboard": "剪贴板", - "library": "库", - "examples": "例子", "subflows": "子流程", "createSubflow": "新建子流程", "selectionToSubflow": "将选择部分更改为子流程", @@ -101,8 +98,8 @@ } }, "clipboard": { + "clipboard": "剪贴板", "nodes": "节点", - "selectNodes": "选择上面的文本并复制到剪贴板", "pasteNodes": "在这里粘贴节点", "importNodes": "导入节点", "exportNodes": "导出节点至剪贴板", @@ -238,6 +235,7 @@ "managePalette": "管理面板" }, "library": { + "library": "库", "openLibrary": "打开库...", "saveToLibrary": "保存到库...", "typeLibrary": "__type__类型库", @@ -248,12 +246,9 @@ "savedNodes": "保存的节点", "savedType": "已保存__type__", "saveFailed": "保存失败: __message__", - "filename": "文件名", - "folder": "文件夹", - "filenamePlaceholder": "文件", - "fullFilenamePlaceholder": "a/b/文件", - "folderPlaceholder": "a/b", - "breadcrumb": "库" + "types": { + "examples": "例子" + } }, "palette": { "noInfo": "无可用信息", @@ -391,8 +386,8 @@ "none": "无", "subflows": "子流程", "flows": "流程", - "filterUnused": "未使用", "filterAll": "所有", + "filterUnused": "未使用", "filtered": "__count__ 个隐藏" }, "palette": { diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 06855cca3..441a19629 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.20.5", + "version": "1.0.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..de75fbe4e --- /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..0a0f4b45f --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/subflow_tab.svg @@ -0,0 +1 @@ + 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..8e91ec38e --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/09.svg @@ -0,0 +1 @@ + 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..90105811f --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/az.svg @@ -0,0 +1 @@ + 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..efc427ac9 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.svg @@ -0,0 +1 @@ + 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..8eee38409 --- /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..a24515f30 --- /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..500ca3926 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.svg @@ -0,0 +1 @@ + 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..978c89149 --- /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..b44c5921c --- /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..41ed2e3a6 --- /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/comms.js b/packages/node_modules/@node-red/editor-client/src/js/comms.js index ea128424b..75a018a56 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/comms.js +++ b/packages/node_modules/@node-red/editor-client/src/js/comms.js @@ -143,7 +143,7 @@ RED.comms = (function() { } else { var msg = RED._("notification.errors.lostConnectionReconnect",{time: connectCountdown})+' '+ RED._("notification.errors.lostConnectionTry")+''; errornotification.update(msg,{silent:true}); - $(errornotification).find("a").click(function(e) { + $(errornotification).find("a").on("click", function(e) { e.preventDefault(); errornotification.update(RED._("notification.errors.lostConnection"),{silent:true}); clearInterval(connectCountdownTimer); 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..db54701bb 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 @@ -14,7 +14,8 @@ * limitations under the License. **/ RED.history = (function() { - var undo_history = []; + var undoHistory = []; + var redoHistory = []; function undoEvent(ev) { var i; @@ -22,52 +23,81 @@ RED.history = (function() { var node; var subflow; var modifiedTabs = {}; + var inverseEv; if (ev) { if (ev.t == 'multi') { + inverseEv = { + t: 'multi', + events: [] + }; len = ev.events.length; for (i=len-1;i>=0;i--) { - undoEvent(ev.events[i]); + var r = undoEvent(ev.events[i]); + inverseEv.events.push(r); } } else if (ev.t == 'replace') { + inverseEv = { + t: 'replace', + config: RED.nodes.createCompleteNodeSet(), + changed: [], + rev: RED.nodes.version() + }; RED.nodes.clear(); var imported = RED.nodes.import(ev.config); imported[0].forEach(function(n) { if (ev.changed[n.id]) { n.changed = true; + inverseEv.changed[n.id] = true; } }) RED.nodes.version(ev.rev); } else if (ev.t == 'add') { + inverseEv = { + t: "delete", + }; if (ev.nodes) { + inverseEv.nodes = []; for (i=0;i').appendTo(parseError);
- $('').text(v.substring(errorPos-12,errorPos)).appendTo(code)
- $('').text(v.charAt(errorPos)).appendTo(code);
- $('').text(v.substring(errorPos+1,errorPos+12)).appendTo(code);
- }
- popover.close(true).setContent(message).open();
- currentPopoverError = errString;
- }
- } else {
- currentPopoverError = null;
- }
- $("#clipboard-dialog-ok").button("disable");
+ validateExportFilenameTimeout = setTimeout(function() {
+ var filenameInput = $("#red-ui-clipboard-dialog-tab-library-name");
+ var filename = filenameInput.val().trim();
+ var valid = filename.length > 0 && !/[\/\\]/.test(filename);
+ if (valid) {
+ filenameInput.removeClass("input-error");
+ $("#red-ui-clipboard-dialog-export").button("enable");
+ } else {
+ filenameInput.addClass("input-error");
+ $("#red-ui-clipboard-dialog-export").button("disable");
}
},100);
}
- function importNodes() {
+ var validateImportTimeout;
+ function validateImport() {
+ if (activeTab === "red-ui-clipboard-dialog-import-tab-clipboard") {
+ if (validateImportTimeout) {
+ clearTimeout(validateImportTimeout);
+ }
+ validateImportTimeout = setTimeout(function() {
+ var importInput = $("#red-ui-clipboard-dialog-import-text");
+ var v = importInput.val().trim();
+ if (v === "") {
+ popover.close(true);
+ currentPopoverError = null;
+ importInput.removeClass("input-error");
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ return;
+ }
+ try {
+ if (!/^\[[\s\S]*\]$/m.test(v)) {
+ throw new Error(RED._("clipboard.import.errors.notArray"));
+ }
+ var res = JSON.parse(v);
+ for (var i=0;i
').appendTo(parseError);
+ $('').text(v.substring(errorPos-12,errorPos)).appendTo(code)
+ $('').text(v.charAt(errorPos)).appendTo(code);
+ $('').text(v.substring(errorPos+1,errorPos+12)).appendTo(code);
+ }
+ popover.close(true).setContent(message).open();
+ currentPopoverError = errString;
+ }
+ } else {
+ currentPopoverError = null;
+ }
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ }
+ },100);
+ } else {
+ var file = libraryBrowser.getSelected();
+ if (file && file.label && !file.children) {
+ $("#red-ui-clipboard-dialog-ok").button("enable");
+ } else {
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ }
+ }
+ }
+
+ function importNodes(mode) {
if (disabled) {
return;
}
+ mode = mode || "clipboard";
+
dialogContainer.empty();
dialogContainer.append($(importNodesDialog));
+
+ var tabs = RED.tabs.create({
+ id: "red-ui-clipboard-dialog-import-tabs",
+ vertical: true,
+ onchange: function(tab) {
+ $("#red-ui-clipboard-dialog-import-tabs-content").children().hide();
+ $("#" + tab.id).show();
+ activeTab = tab.id;
+ if (popover) {
+ popover.close(true);
+ currentPopoverError = null;
+ }
+ if (tab.id === "red-ui-clipboard-dialog-import-tab-clipboard") {
+ $("#red-ui-clipboard-dialog-import-text").trigger("focus");
+ } else {
+ libraryBrowser.focus();
+ }
+ validateImport();
+ }
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-import-tab-clipboard",
+ label: RED._("clipboard.clipboard")
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-import-tab-library",
+ label: RED._("library.library")
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-import-tab-examples",
+ label: RED._("library.types.examples")
+ });
+
+ $("#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"),
+ 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,"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();
- $("#clipboard-dialog-ok").show();
- $("#clipboard-dialog-cancel").show();
- $("#clipboard-dialog-close").hide();
- $("#clipboard-dialog-copy").hide();
- $("#clipboard-dialog-download").hide();
- $("#clipboard-dialog-ok").button("disable");
- $("#clipboard-import").keyup(validateImport);
- $("#clipboard-import").on('paste',function() { setTimeout(validateImport,10)});
+ $("#red-ui-clipboard-dialog-ok").show();
+ $("#red-ui-clipboard-dialog-cancel").show();
+ $("#red-ui-clipboard-dialog-export").hide();
+ $("#red-ui-clipboard-dialog-download").hide();
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ $("#red-ui-clipboard-dialog-import-text").on("keyup", validateImport);
+ $("#red-ui-clipboard-dialog-import-text").on('paste',function() { setTimeout(validateImport,10)});
- $("#import-tab > a").click(function(evt) {
+ $("#red-ui-clipboard-dialog-import-opt > a").on("click", function(evt) {
evt.preventDefault();
if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
return;
@@ -255,66 +454,122 @@ RED.clipboard = (function() {
$(this).addClass('selected');
});
- $("#import-file-upload").change(function() {
+ $("#red-ui-clipboard-dialog-import-file-upload").on("change", function() {
var fileReader = new FileReader();
fileReader.onload = function () {
- $("#clipboard-import").val(fileReader.result);
+ $("#red-ui-clipboard-dialog-import-text").val(fileReader.result);
validateImport();
};
fileReader.readAsText($(this).prop('files')[0]);
})
- $("#import-file-upload-btn").click(function(evt) {
+ $("#red-ui-clipboard-dialog-import-file-upload-btn").on("click", function(evt) {
evt.preventDefault();
- $("#import-file-upload").click();
+ $("#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: $("#clipboard-import"),
+ target: $("#red-ui-clipboard-dialog-import-text"),
trigger: "manual",
direction: "bottom",
content: ""
});
}
- function exportNodes() {
+ function exportNodes(mode) {
if (disabled) {
return;
}
+ mode = mode || "clipboard";
+
dialogContainer.empty();
dialogContainer.append($(exportNodesDialog));
- dialogContainer.i18n();
- var format = RED.settings.flowFilePretty ? "export-format-full" : "export-format-mini";
- $("#export-format-group > a").click(function(evt) {
+ var tabs = RED.tabs.create({
+ id: "red-ui-clipboard-dialog-export-tabs",
+ vertical: true,
+ onchange: function(tab) {
+ $("#red-ui-clipboard-dialog-export-tabs-content").children().hide();
+ $("#" + tab.id).show();
+ activeTab = tab.id;
+ if (tab.id === "red-ui-clipboard-dialog-export-tab-clipboard") {
+ $("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.copy"))
+ $("#red-ui-clipboard-dialog-download").show();
+ } else {
+ $("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.export"))
+ $("#red-ui-clipboard-dialog-download").hide();
+ libraryBrowser.focus();
+ }
+
+ }
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-export-tab-clipboard",
+ label: RED._("clipboard.clipboard")
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-export-tab-library",
+ label: RED._("library.library")
+ });
+
+ $("#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-export-tab-library-browser"),
+ folderTools: true,
+ onselect: function(file) {
+ if (file && file.label && !file.children) {
+ $("#red-ui-clipboard-dialog-tab-library-name").val(file.label);
+ }
+ }
+ })
+ loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local"));
+
+ $("#red-ui-clipboard-dialog-tab-library-name").val("flows.json").select();
+
+ dialogContainer.i18n();
+ var format = RED.settings.flowFilePretty ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini";
+
+ $("#red-ui-clipboard-dialog-export-fmt-group > a").on("click", function(evt) {
evt.preventDefault();
if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
- $("#clipboard-export").focus();
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
return;
}
$(this).parent().children().removeClass('selected');
$(this).addClass('selected');
- var flow = $("#clipboard-export").val();
+ var flow = $("#red-ui-clipboard-dialog-export-text").val();
if (flow.length > 0) {
var nodes = JSON.parse(flow);
format = $(this).attr('id');
- if (format === 'export-format-full') {
+ if (format === 'red-ui-clipboard-dialog-export-fmt-full') {
flow = JSON.stringify(nodes,null,4);
} else {
flow = JSON.stringify(nodes);
}
- $("#clipboard-export").val(flow);
- $("#clipboard-export").focus();
+ $("#red-ui-clipboard-dialog-export-text").val(flow);
+ setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
+
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
}
});
- $("#export-range-group > a").click(function(evt) {
+ $("#red-ui-clipboard-dialog-export-rng-group > a").on("click", function(evt) {
evt.preventDefault();
if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
- $("#clipboard-export").focus();
return;
}
$(this).parent().children().removeClass('selected');
@@ -322,7 +577,7 @@ RED.clipboard = (function() {
var type = $(this).attr('id');
var flow = "";
var nodes = null;
- if (type === 'export-range-selected') {
+ if (type === 'red-ui-clipboard-dialog-export-rng-selected') {
var selection = RED.workspaces.selection();
if (selection.length > 0) {
nodes = [];
@@ -335,77 +590,97 @@ RED.clipboard = (function() {
}
// Don't include the subflow meta-port nodes in the exported selection
nodes = RED.nodes.createExportableNodeSet(nodes.filter(function(n) { return n.type !== 'subflow'}));
- } else if (type === 'export-range-flow') {
+ } else if (type === 'red-ui-clipboard-dialog-export-rng-flow') {
var activeWorkspace = RED.workspaces.active();
nodes = RED.nodes.filterNodes({z:activeWorkspace});
var parentNode = RED.nodes.workspace(activeWorkspace)||RED.nodes.subflow(activeWorkspace);
nodes.unshift(parentNode);
nodes = RED.nodes.createExportableNodeSet(nodes);
- } else if (type === 'export-range-full') {
+ } else if (type === 'red-ui-clipboard-dialog-export-rng-full') {
nodes = RED.nodes.createCompleteNodeSet(false);
}
if (nodes !== null) {
- if (format === "export-format-full") {
+ if (format === "red-ui-clipboard-dialog-export-fmt-full") {
flow = JSON.stringify(nodes,null,4);
} else {
flow = JSON.stringify(nodes);
}
}
if (flow.length > 0) {
- $("#export-copy").removeClass('disabled');
+ $("#red-ui-clipboard-dialog-export").removeClass('disabled');
} else {
- $("#export-copy").addClass('disabled');
+ $("#red-ui-clipboard-dialog-export").addClass('disabled');
}
- $("#clipboard-export").val(flow);
- $("#clipboard-export").focus();
+ $("#red-ui-clipboard-dialog-export-text").val(flow);
+ setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
})
- $("#clipboard-dialog-ok").hide();
- $("#clipboard-dialog-cancel").hide();
- $("#clipboard-dialog-copy").hide();
- $("#clipboard-dialog-close").hide();
+ $("#red-ui-clipboard-dialog-ok").hide();
+ $("#red-ui-clipboard-dialog-cancel").hide();
+ $("#red-ui-clipboard-dialog-export").hide();
var selection = RED.workspaces.selection();
if (selection.length > 0) {
- $("#export-range-selected").click();
+ $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click");
} else {
selection = RED.view.selection();
if (selection.nodes) {
- $("#export-range-selected").click();
+ $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click");
} else {
- $("#export-range-selected").addClass('disabled').removeClass('selected');
- $("#export-range-flow").click();
+ $("#red-ui-clipboard-dialog-export-rng-selected").addClass('disabled').removeClass('selected');
+ $("#red-ui-clipboard-dialog-export-rng-flow").trigger("click");
}
}
- if (format === "export-format-full") {
- $("#export-format-full").click();
+ if (format === "red-ui-clipboard-dialog-export-fmt-full") {
+ $("#red-ui-clipboard-dialog-export-fmt-full").trigger("click");
} else {
- $("#export-format-mini").click();
+ $("#red-ui-clipboard-dialog-export-fmt-mini").trigger("click");
}
- $("#clipboard-export")
- .focus(function() {
- var textarea = $(this);
- textarea.select();
- textarea.mouseup(function() {
- textarea.unbind("mouseup");
- return false;
- })
- });
+ tabs.activateTab("red-ui-clipboard-dialog-export-tab-"+mode);
dialog.dialog("option","title",RED._("clipboard.exportNodes")).dialog( "open" );
- $("#clipboard-export").focus();
- if (!document.queryCommandSupported("copy")) {
- $("#clipboard-dialog-cancel").hide();
- $("#clipboard-dialog-close").show();
- } else {
- $("#clipboard-dialog-cancel").show();
- $("#clipboard-dialog-copy").show();
- }
- $("#clipboard-dialog-download").show();
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
+ $("#red-ui-clipboard-dialog-cancel").show();
+ $("#red-ui-clipboard-dialog-export").show();
+ $("#red-ui-clipboard-dialog-download").show();
+
+ }
+
+ 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: label,
+ path: "",
+ expanded: true,
+ children: function(done, item) {
+ RED.library.loadLibraryFolder(library,"flows","",function(children) {
+ item.children = children;
+ done(children);
+ })
+ }
+ }], true);
}
function hideDropTarget() {
- $("#dropTarget").hide();
+ $("#red-ui-drop-target").hide();
RED.keyboard.remove("escape");
}
function copyText(value,element,msg) {
@@ -435,7 +710,7 @@ RED.clipboard = (function() {
if (truncated) {
msg += "_truncated";
}
- $("#clipboard-hidden").val(value).select();
+ $("#red-ui-clipboard-hidden").val(value).select();
var result = document.execCommand("copy");
if (result && element) {
var popover = RED.popover.create({
@@ -455,29 +730,34 @@ RED.clipboard = (function() {
init: function() {
setupDialogs();
- $('').appendTo("body");
+ $('').appendTo("#red-ui-editor");
RED.actions.add("core:show-export-dialog",exportNodes);
RED.actions.add("core:show-import-dialog",importNodes);
+ 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; });
+ $('
').appendTo('#red-ui-editor');
- $('#chart').on("dragenter",function(event) {
+ $('#red-ui-workspace-chart').on("dragenter",function(event) {
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
$.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
- $("#dropTarget").css({display:'table'});
+ $("#red-ui-drop-target").css({display:'table'});
RED.keyboard.add("*", "escape" ,hideDropTarget);
}
});
- $('#dropTarget').on("dragover",function(event) {
+ $('#red-ui-drop-target').on("dragover",function(event) {
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
$.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
event.preventDefault();
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js
index be7d2d4cd..157c1e495 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js
@@ -38,7 +38,7 @@
this.options[0].show();
}
- this.element.change(function() {
+ this.element.on("change", function() {
if (this.checked) {
that.options[0].hide();
that.options[1].show();
@@ -53,7 +53,7 @@
child.checkboxSet('state',isChecked,false,true);
})
})
- this.uiElement.click(function(e) {
+ this.uiElement.on("click", function(e) {
e.stopPropagation();
// state returns null for a partial state. Clicking on that should
// result in 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 ee29a6a35..06ccc97d9 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,7 +32,10 @@
* - 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)
+ * - getItemAt(index)
+ * - indexOf(itemData)
* - width(width)
* - height(height)
* - items()
@@ -75,9 +78,9 @@
addLabel = 'add';
}
}
- $(' '+addLabel+'')
+ $(' '+addLabel+'')
.appendTo(this.topContainer)
- .click(function(evt) {
+ .on("click", function(evt) {
evt.preventDefault();
that.addItem({});
});
@@ -185,6 +188,11 @@
}
},
_destroy: function() {
+ if (this.topContainer) {
+ var tc = this.topContainer;
+ delete this.topContainer;
+ tc.remove();
+ }
},
_refreshFilter: function() {
var that = this;
@@ -230,7 +238,24 @@
this.uiHeight = desiredHeight;
this._resize();
},
- addItem: function(data) {
+ getItemAt: function(index) {
+ var items = this.items();
+ if (index >= 0 && index < items.length) {
+ return $(items[index]).data('data');
+ } else {
+ return;
+ }
+ },
+ indexOf: function(data) {
+ var items = this.items();
+ for (var i=0;i');
@@ -248,7 +273,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);
@@ -257,10 +288,10 @@
li.addClass("red-ui-editableList-item-sortable");
}
if (this.options.removable) {
- var deleteButton = $('',{href:"#",class:"red-ui-editableList-item-remove editor-button editor-button-small"}).appendTo(li);
+ var deleteButton = $('',{href:"#",class:"red-ui-editableList-item-remove red-ui-button red-ui-button-small"}).appendTo(li);
$('',{class:"fa fa-remove"}).appendTo(deleteButton);
li.addClass("red-ui-editableList-item-removable");
- deleteButton.click(function(evt) {
+ deleteButton.on("click", function(evt) {
evt.preventDefault();
var data = row.data('data');
li.addClass("red-ui-editableList-item-deleting")
@@ -293,6 +324,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 612bf4516..e73c82293 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
@@ -56,12 +56,12 @@ RED.menu = (function() {
}
if (opt === null) {
- item = $('');
+ item = $('');
} else {
item = $('');
if (opt.group) {
- item.addClass("menu-group-"+opt.group);
+ item.addClass("red-ui-menu-group-"+opt.group);
}
var linkContent = '';
@@ -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 += ' ';
@@ -79,10 +79,10 @@ RED.menu = (function() {
}
if (opt.sublabel) {
- linkContent += ' '
+ linkContent += ' '
} else {
- linkContent += ' '
+ linkContent += ' '
}
linkContent += '';
@@ -92,27 +92,16 @@ RED.menu = (function() {
menuItems[opt.id] = opt;
if (opt.onselect) {
- link.click(function(e) {
+ link.on("click", function(e) {
e.preventDefault();
if ($(this).parent().hasClass("disabled")) {
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);
@@ -125,13 +114,13 @@ RED.menu = (function() {
link.attr("target","_blank").attr("href",opt.href);
} else if (!opt.options) {
item.addClass("disabled");
- link.click(function(event) {
+ link.on("click", function(event) {
event.preventDefault();
});
}
if (opt.options) {
- item.addClass("dropdown-submenu pull-left");
- var submenu = $(' ').appendTo(item);
+ item.addClass("red-ui-menu-dropdown-submenu pull-left");
+ var submenu = $(' ').appendTo(item);
for (var i=0;i",{class:"dropdown-menu pull-right"});
+ var topMenu = $("
",{class:"red-ui-menu red-ui-menu-dropdown pull-right"});
if (options.id) {
topMenu.attr({id:options.id+"-submenu"});
var menuParent = $("#"+options.id);
if (menuParent.length === 1) {
topMenu.insertAfter(menuParent);
+ menuParent.on("click", function(evt) {
+ evt.stopPropagation();
+ evt.preventDefault();
+ if (topMenu.is(":visible")) {
+ $(document).off("click.red-ui-menu");
+ topMenu.hide();
+ } else {
+ $(document).on("click.red-ui-menu", function(evt) {
+ $(document).off("click.red-ui-menu");
+ activeMenu = null;
+ topMenu.hide();
+ });
+ $(".red-ui-menu").hide();
+ topMenu.show();
+ }
+ })
}
}
@@ -193,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) {
@@ -202,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 (!opt.local && !alreadySet) {
+ RED.settings.set(opt.setting||("menu-"+opt.id), state);
+ }
}
- RED.settings.set(opt.setting||("menu-"+opt.id), state);
}
function toggleSelected(id) {
@@ -222,14 +244,14 @@ RED.menu = (function() {
function addItem(id,opt) {
var item = createMenuItem(opt);
- if (opt.group) {
- var groupItems = $("#"+id+"-submenu").children(".menu-group-"+opt.group);
+ if (opt !== null && opt.group) {
+ var groupItems = $("#"+id+"-submenu").children(".red-ui-menu-group-"+opt.group);
if (groupItems.length === 0) {
item.appendTo("#"+id+"-submenu");
} else {
for (var i=0;i
'+RED._("deploy.successfulRestart")+'
',"success"); }).fail(function(xhr,textStatus,err) { if (deployWasEnabled) { - $("#btn-deploy").removeClass("disabled"); + $("#red-ui-header-button-deploy").removeClass("disabled"); } if (xhr.status === 401) { RED.notify(RED._("deploy.deployFailed",{message:RED._("user.notAuthorized")}),"error"); @@ -304,17 +310,17 @@ RED.deploy = (function() { deployInflight = false; var delta = Math.max(0,300-(Date.now()-startTime)); setTimeout(function() { - $(".deploy-button-content").css('opacity',1); - $(".deploy-button-spinner").hide(); - $("#header-shade").hide(); - $("#editor-shade").hide(); - $("#palette-shade").hide(); - $("#sidebar-shade").hide(); + $(".red-ui-deploy-button-content").css('opacity',1); + $(".red-ui-deploy-button-spinner").hide(); + $("#red-ui-header-shade").hide(); + $("#red-ui-editor-shade").hide(); + $("#red-ui-palette-shade").hide(); + $("#red-ui-sidebar-shade").hide(); },delta); }); } function save(skipValidation,force) { - if (!$("#btn-deploy").hasClass("disabled")) { + if (!$("#red-ui-header-button-deploy").hasClass("disabled")) { if (!RED.user.hasPermission("flows.write")) { RED.notify(RED._("user.errors.deploy"),"error"); return; @@ -355,13 +361,13 @@ RED.deploy = (function() { if (hasUnknown && !ignoreDeployWarnings.unknown) { showWarning = true; notificationMessage = ""+RED._('deploy.confirm.unknown')+"
"+ - '"+ + '
"+ RED._('deploy.confirm.confirm')+ "
"; notificationButtons= [ { - id: "node-dialog-confirm-deploy-deploy", + id: "red-ui-deploy-dialog-confirm-deploy-deploy", text: RED._("deploy.confirm.button.confirm"), class: "primary", click: function() { @@ -375,12 +381,12 @@ RED.deploy = (function() { invalidNodes.sort(sortNodeInfo); notificationMessage = ""+RED._('deploy.confirm.improperlyConfigured')+"
"+ - '"+ + '
"+ RED._('deploy.confirm.confirm')+ "
"; notificationButtons= [ { - id: "node-dialog-confirm-deploy-deploy", + id: "red-ui-deploy-dialog-confirm-deploy-deploy", text: RED._("deploy.confirm.button.confirm"), class: "primary", click: function() { @@ -411,9 +417,9 @@ RED.deploy = (function() { var nns = RED.nodes.createCompleteNodeSet(); var startTime = Date.now(); - $(".deploy-button-content").css('opacity',0); - $(".deploy-button-spinner").show(); - $("#btn-deploy").addClass("disabled"); + $(".red-ui-deploy-button-content").css('opacity',0); + $(".red-ui-deploy-button-spinner").show(); + $("#red-ui-header-button-deploy").addClass("disabled"); var data = {flows:nns}; @@ -422,10 +428,10 @@ RED.deploy = (function() { } deployInflight = true; - $("#header-shade").show(); - $("#editor-shade").show(); - $("#palette-shade").show(); - $("#sidebar-shade").show(); + $("#red-ui-header-shade").show(); + $("#red-ui-editor-shade").show(); + $("#red-ui-palette-shade").show(); + $("#red-ui-sidebar-shade").show(); $.ajax({ url:"flows", type: "POST", @@ -476,7 +482,7 @@ RED.deploy = (function() { RED.events.emit("deploy"); }).fail(function(xhr,textStatus,err) { RED.nodes.dirty(true); - $("#btn-deploy").removeClass("disabled"); + $("#red-ui-header-button-deploy").removeClass("disabled"); if (xhr.status === 401) { RED.notify(RED._("deploy.deployFailed",{message:RED._("user.notAuthorized")}),"error"); } else if (xhr.status === 409) { @@ -490,12 +496,12 @@ RED.deploy = (function() { deployInflight = false; var delta = Math.max(0,300-(Date.now()-startTime)); setTimeout(function() { - $(".deploy-button-content").css('opacity',1); - $(".deploy-button-spinner").hide(); - $("#header-shade").hide(); - $("#editor-shade").hide(); - $("#palette-shade").hide(); - $("#sidebar-shade").hide(); + $(".red-ui-deploy-button-content").css('opacity',1); + $(".red-ui-deploy-button-spinner").hide(); + $("#red-ui-header-shade").hide(); + $("#red-ui-editor-shade").hide(); + $("#red-ui-palette-shade").hide(); + $("#red-ui-sidebar-shade").hide(); },delta); }); } 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 bef2ffc69..7c5b22f26 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 @@ -22,7 +22,7 @@ RED.diff = (function() { } function createDiffTable(container,CurrentDiff) { - var diffList = $('",{class:"node-diff-property-cell-label"}).text("id").appendTo(row); - localCell = $(" | ",{class:"node-diff-property-cell node-diff-node-local"}).appendTo(row); + $(" | ",{class:"red-ui-diff-list-cell-label"}).text("id").appendTo(row); + localCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-local"}).appendTo(row); if (localNode) { - localCell.addClass("node-diff-node-unchanged"); - $('').appendTo(localCell); - element = $('').appendTo(localCell); + localCell.addClass("red-ui-diff-status-unchanged"); + $('').appendTo(localCell); + element = $('').appendTo(localCell); propertyElements['local.id'] = RED.utils.createObjectElement(localNode.id).appendTo(element); } else { - localCell.addClass("node-diff-empty"); + localCell.addClass("red-ui-diff-empty"); } if (remoteNode !== undefined) { - remoteCell = $(" | ",{class:"node-diff-property-cell node-diff-node-remote"}).appendTo(row); - remoteCell.addClass("node-diff-node-unchanged"); + remoteCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-remote"}).appendTo(row); + remoteCell.addClass("red-ui-diff-status-unchanged"); if (remoteNode) { - $('').appendTo(remoteCell); - element = $('').appendTo(remoteCell); + $('').appendTo(remoteCell); + element = $('').appendTo(remoteCell); propertyElements['remote.id'] = RED.utils.createObjectElement(remoteNode.id).appendTo(element); } else { - remoteCell.addClass("node-diff-empty"); + remoteCell.addClass("red-ui-diff-empty"); } } @@ -785,12 +784,12 @@ RED.diff = (function() { conflict = true; } row = $(" |
",{class:"node-diff-property-cell-label"}).text("position").appendTo(row); - localCell = $(" | ",{class:"node-diff-property-cell node-diff-node-local"}).appendTo(row); + $(" | ",{class:"red-ui-diff-list-cell-label"}).text("position").appendTo(row); + localCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-local"}).appendTo(row); if (localNode) { - localCell.addClass("node-diff-node-"+(localChanged?"changed":"unchanged")); - $(''+(localChanged?'':'')+'').appendTo(localCell); - element = $('').appendTo(localCell); + localCell.addClass("red-ui-diff-status-"+(localChanged?"changed":"unchanged")); + $(''+(localChanged?'':'')+'').appendTo(localCell); + element = $('').appendTo(localCell); propertyElements['local.position'] = RED.utils.createObjectElement({x:localNode.x,y:localNode.y}, { path: "position", @@ -803,15 +802,15 @@ RED.diff = (function() { } ).appendTo(element); } else { - localCell.addClass("node-diff-empty"); + localCell.addClass("red-ui-diff-empty"); } if (remoteNode !== undefined) { - remoteCell = $(" | ",{class:"node-diff-property-cell node-diff-node-remote"}).appendTo(row); - remoteCell.addClass("node-diff-node-"+(remoteChanged?"changed":"unchanged")); + remoteCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-remote"}).appendTo(row); + remoteCell.addClass("red-ui-diff-status-"+(remoteChanged?"changed":"unchanged")); if (remoteNode) { - $(''+(remoteChanged?'':'')+'').appendTo(remoteCell); - element = $('').appendTo(remoteCell); + $(''+(remoteChanged?'':'')+'').appendTo(remoteCell); + element = $('').appendTo(remoteCell); propertyElements['remote.position'] = RED.utils.createObjectElement({x:remoteNode.x,y:remoteNode.y}, { path: "position", @@ -824,7 +823,7 @@ RED.diff = (function() { } ).appendTo(element); } else { - remoteCell.addClass("node-diff-empty"); + remoteCell.addClass("red-ui-diff-empty"); } } } @@ -853,34 +852,34 @@ RED.diff = (function() { conflict = true; } row = $(" |
",{class:"node-diff-property-cell-label"}).text("wires").appendTo(row); - localCell = $(" | ",{class:"node-diff-property-cell node-diff-node-local"}).appendTo(row); + $(" | ",{class:"red-ui-diff-list-cell-label"}).text("wires").appendTo(row); + localCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-local"}).appendTo(row); if (localNode) { if (!conflict) { - localCell.addClass("node-diff-node-"+(localChanged?"changed":"unchanged")); - $(''+(localChanged?'':'')+'').appendTo(localCell); + localCell.addClass("red-ui-diff-status-"+(localChanged?"changed":"unchanged")); + $(''+(localChanged?'':'')+'').appendTo(localCell); } else { - localCell.addClass("node-diff-node-conflict"); - $('').appendTo(localCell); + localCell.addClass("red-ui-diff-status-conflict"); + $('').appendTo(localCell); } formatWireProperty(localNode.wires,localNodeObj.all).appendTo(localCell); } else { - localCell.addClass("node-diff-empty"); + localCell.addClass("red-ui-diff-empty"); } if (remoteNode !== undefined) { - remoteCell = $(" | ",{class:"node-diff-property-cell node-diff-node-remote"}).appendTo(row); + remoteCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-remote"}).appendTo(row); if (remoteNode) { if (!conflict) { - remoteCell.addClass("node-diff-node-"+(remoteChanged?"changed":"unchanged")); - $(''+(remoteChanged?'':'')+'').appendTo(remoteCell); + remoteCell.addClass("red-ui-diff-status-"+(remoteChanged?"changed":"unchanged")); + $(''+(remoteChanged?'':'')+'').appendTo(remoteCell); } else { - remoteCell.addClass("node-diff-node-conflict"); - $('').appendTo(remoteCell); + remoteCell.addClass("red-ui-diff-status-conflict"); + $('').appendTo(remoteCell); } formatWireProperty(remoteNode.wires,remoteNodeObj.all).appendTo(remoteCell); } else { - remoteCell.addClass("node-diff-empty"); + remoteCell.addClass("red-ui-diff-empty"); } } } @@ -926,17 +925,17 @@ RED.diff = (function() { } row = $(" |
",{class:"node-diff-property-cell-label"}).text(d).appendTo(row); - localCell = $(" | ",{class:"node-diff-property-cell node-diff-node-local"}).appendTo(row); + var propertyNameCell = $(" | ",{class:"red-ui-diff-list-cell-label"}).text(d).appendTo(row); + localCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-local"}).appendTo(row); if (localNode) { if (!conflict) { - localCell.addClass("node-diff-node-"+(localChanged?"changed":"unchanged")); - $(''+(localChanged?'':'')+'').appendTo(localCell); + localCell.addClass("red-ui-diff-status-"+(localChanged?"changed":"unchanged")); + $(''+(localChanged?'':'')+'').appendTo(localCell); } else { - localCell.addClass("node-diff-node-conflict"); - $('').appendTo(localCell); + localCell.addClass("red-ui-diff-status-conflict"); + $('').appendTo(localCell); } - element = $('').appendTo(localCell); + element = $('').appendTo(localCell); propertyElements['local.'+d] = RED.utils.createObjectElement(localNode[d], { path: d, @@ -949,19 +948,19 @@ RED.diff = (function() { } ).appendTo(element); } else { - localCell.addClass("node-diff-empty"); + localCell.addClass("red-ui-diff-empty"); } if (remoteNode !== undefined) { - remoteCell = $(" | ",{class:"node-diff-property-cell node-diff-node-remote"}).appendTo(row); + remoteCell = $(" | ",{class:"red-ui-diff-list-cell red-ui-diff-list-node-remote"}).appendTo(row); if (remoteNode) { if (!conflict) { - remoteCell.addClass("node-diff-node-"+(remoteChanged?"changed":"unchanged")); - $(''+(remoteChanged?'':'')+'').appendTo(remoteCell); + remoteCell.addClass("red-ui-diff-status-"+(remoteChanged?"changed":"unchanged")); + $(''+(remoteChanged?'':'')+'').appendTo(remoteCell); } else { - remoteCell.addClass("node-diff-node-conflict"); - $('').appendTo(remoteCell); + remoteCell.addClass("red-ui-diff-status-conflict"); + $('').appendTo(remoteCell); } - element = $('').appendTo(remoteCell); + element = $('').appendTo(remoteCell); propertyElements['remote.'+d] = RED.utils.createObjectElement(remoteNode[d], { path: d, @@ -974,12 +973,12 @@ RED.diff = (function() { } ).appendTo(element); } else { - remoteCell.addClass("node-diff-empty"); + remoteCell.addClass("red-ui-diff-empty"); } } if (localNode && remoteNode && typeof localNode[d] === "string") { if (/\n/.test(localNode[d]) || /\n/.test(remoteNode[d])) { - $('').click(function() { + $('').on("click", function() { showTextDiff(localNode[d],remoteNode[d]); }).appendTo(propertyNameCell); } @@ -990,10 +989,10 @@ RED.diff = (function() { return nodePropertiesDiv; } function createNodeConflictRadioBoxes(node,row,localDiv,remoteDiv,propertiesTable,hide,state,diff) { - var safeNodeId = "node-diff-selectbox-"+node.id.replace(/\./g,'-')+(propertiesTable?"-props":""); + var safeNodeId = "red-ui-diff-selectbox-"+node.id.replace(/\./g,'-')+(propertiesTable?"-props":""); var className = ""; if (node.z||propertiesTable) { - className = "node-diff-selectbox-tab-"+(propertiesTable?node.id:node.z).replace(/\./g,'-'); + className = "red-ui-diff-selectbox-tab-"+(propertiesTable?node.id:node.z).replace(/\./g,'-'); } var titleRow = !propertiesTable && (node.type === 'tab' || node.type === 'subflow'); var changeHandler = function(evt) { @@ -1001,44 +1000,44 @@ RED.diff = (function() { if (node.type === undefined) { // TODO: handle globals } else if (titleRow) { - className = "node-diff-selectbox-tab-"+node.id.replace(/\./g,'-'); + className = "red-ui-diff-selectbox-tab-"+node.id.replace(/\./g,'-'); $("."+className+"-"+this.value).prop('checked',true); if (this.value === 'local') { - $("."+className+"-"+this.value).closest(".node-diff-node-entry").addClass("node-diff-select-local"); - $("."+className+"-"+this.value).closest(".node-diff-node-entry").removeClass("node-diff-select-remote"); + $("."+className+"-"+this.value).closest(".red-ui-diff-list-node").addClass("red-ui-diff-select-local"); + $("."+className+"-"+this.value).closest(".red-ui-diff-list-node").removeClass("red-ui-diff-select-remote"); } else { - $("."+className+"-"+this.value).closest(".node-diff-node-entry").removeClass("node-diff-select-local"); - $("."+className+"-"+this.value).closest(".node-diff-node-entry").addClass("node-diff-select-remote"); + $("."+className+"-"+this.value).closest(".red-ui-diff-list-node").removeClass("red-ui-diff-select-local"); + $("."+className+"-"+this.value).closest(".red-ui-diff-list-node").addClass("red-ui-diff-select-remote"); } } else { // Individual node or properties table - var parentId = "node-diff-selectbox-"+(propertiesTable?node.id:node.z).replace(/\./g,'-'); + var parentId = "red-ui-diff-selectbox-"+(propertiesTable?node.id:node.z).replace(/\./g,'-'); $('#'+parentId+"-local").prop('checked',false); $('#'+parentId+"-remote").prop('checked',false); - var titleRowDiv = $('#'+parentId+"-local").closest(".node-diff-tab").find(".node-diff-tab-title"); - titleRowDiv.removeClass("node-diff-select-local"); - titleRowDiv.removeClass("node-diff-select-remote"); + var titleRowDiv = $('#'+parentId+"-local").closest(".red-ui-diff-list-flow").find(".red-ui-diff-list-flow-title"); + titleRowDiv.removeClass("red-ui-diff-select-local"); + titleRowDiv.removeClass("red-ui-diff-select-remote"); } if (this.value === 'local') { - row.removeClass("node-diff-select-remote"); - row.addClass("node-diff-select-local"); + row.removeClass("red-ui-diff-select-remote"); + row.addClass("red-ui-diff-select-local"); } else if (this.value === 'remote') { - row.addClass("node-diff-select-remote"); - row.removeClass("node-diff-select-local"); + row.addClass("red-ui-diff-select-remote"); + row.removeClass("red-ui-diff-select-local"); } refreshConflictHeader(diff); } - var localSelectDiv = $(' |