Compare commits
1 Commits
1.2.9
...
move-out-s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
746512b8b8 |
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
|||||||
/packages/node_modules/** linguist-generated=false
|
|
||||||
3
.github/ISSUE_TEMPLATE.md
vendored
@@ -28,8 +28,7 @@ To help us understand the issue, please fill-in as much of the following informa
|
|||||||
### Please tell us about your environment:
|
### Please tell us about your environment:
|
||||||
|
|
||||||
- [ ] Node-RED version:
|
- [ ] Node-RED version:
|
||||||
- [ ] Node.js version:
|
- [ ] node.js version:
|
||||||
- [ ] npm version:
|
- [ ] npm version:
|
||||||
- [ ] Platform/OS:
|
- [ ] Platform/OS:
|
||||||
- [ ] Browser:
|
- [ ] Browser:
|
||||||
- [ ] running in Docker:
|
|
||||||
|
|||||||
39
.github/ISSUE_TEMPLATE/--bug_report.md
vendored
@@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Reproducible software issues in the core of Node-RED
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
|
|
||||||
|
|
||||||
If your issue is:
|
|
||||||
- a general 'how-to' type question,
|
|
||||||
- a feature request or suggestion for a change,
|
|
||||||
- or problems with 3rd party (`node-red-contrib-`) nodes
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
To help us understand the issue, please fill-in as much of the following information as you can:
|
|
||||||
-->
|
|
||||||
|
|
||||||
### What are the steps to reproduce?
|
|
||||||
|
|
||||||
### What happens?
|
|
||||||
|
|
||||||
### What do you expect to happen?
|
|
||||||
|
|
||||||
### Please tell us about your environment:
|
|
||||||
|
|
||||||
- [ ] Node-RED version:
|
|
||||||
- [ ] Node.js version:
|
|
||||||
- [ ] npm version:
|
|
||||||
- [ ] Platform/OS:
|
|
||||||
- [ ] Browser:
|
|
||||||
17
.github/ISSUE_TEMPLATE/-anything-else.md
vendored
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
name: Anything Else
|
|
||||||
about: Something that is not a bug report
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Please DO NOT raise an issue.
|
|
||||||
|
|
||||||
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.
|
|
||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -29,6 +29,6 @@ the [forum](https://discourse.nodered.org) or
|
|||||||
<!-- Put an `x` in the boxes that apply -->
|
<!-- Put an `x` in the boxes that apply -->
|
||||||
|
|
||||||
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
|
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
|
||||||
- [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team.
|
- [ ] For non-bugfix PRs, I have discussed this change on the mailing list/slack team.
|
||||||
- [ ] I have run `grunt` to verify the unit tests pass
|
- [ ] I have run `grunt` to verify the unit tests pass
|
||||||
- [ ] I have added suitable unit tests to cover the new/changed functionality
|
- [ ] I have added suitable unit tests to cover the new/changed functionality
|
||||||
|
|||||||
29
.github/scripts/update-node-red-docker.js
vendored
@@ -1,29 +0,0 @@
|
|||||||
const fs = require("fs");
|
|
||||||
|
|
||||||
const newVersion = require("../../package.json").version;
|
|
||||||
|
|
||||||
if (process.env.GITHUB_REF !== "refs/tags/"+newVersion) {
|
|
||||||
console.log(`GITHUB_REF doesn't match the package.json version: ${process.env.GITHUB_REF} !== ${newVersion}`);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
|
|
||||||
console.log(`Not updating for a non-stable release - ${newVersion}`);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentVersion = require("../../../node-red-docker/package.json").version;
|
|
||||||
|
|
||||||
console.log(`Update from ${currentVersion} to ${newVersion}`)
|
|
||||||
|
|
||||||
updateFile(__dirname+"/../../../node-red-docker/package.json", currentVersion, newVersion);
|
|
||||||
updateFile(__dirname+"/../../../node-red-docker/docker-custom/package.json", currentVersion, newVersion);
|
|
||||||
updateFile(__dirname+"/../../../node-red-docker/README.md", currentVersion, newVersion);
|
|
||||||
|
|
||||||
console.log(`::set-env name=newVersion::${newVersion}`);
|
|
||||||
|
|
||||||
function updateFile(path,from,to) {
|
|
||||||
let contents = fs.readFileSync(path,"utf8");
|
|
||||||
contents = contents.replace(new RegExp(from.replace(/\./g,"\\."),"g"), to);
|
|
||||||
fs.writeFileSync(path, contents);
|
|
||||||
}
|
|
||||||
18
.github/scripts/update-node-red-website.js
vendored
@@ -1,18 +0,0 @@
|
|||||||
const fs = require("fs");
|
|
||||||
|
|
||||||
const newVersion = require("../../package.json").version;
|
|
||||||
|
|
||||||
if (process.env.GITHUB_REF !== "refs/tags/"+newVersion) {
|
|
||||||
console.log(`GITHUB_REF doesn't match the package.json version: ${process.env.GITHUB_REF} !== ${newVersion}`);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
|
|
||||||
console.log(`Not updating for a non-stable release - ${newVersion}`);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const path = __dirname+"/../../../node-red.github.io/index.html";
|
|
||||||
let contents = fs.readFileSync(path, "utf8");
|
|
||||||
contents = contents.replace(/<span class="node-red-latest-version">v\d+\.\d+\.\d+<\/span>/, `<span class="node-red-latest-version">v${newVersion}<\/span>` );
|
|
||||||
fs.writeFileSync(path, contents);
|
|
||||||
59
.github/workflows/build.yml
vendored
@@ -1,59 +0,0 @@
|
|||||||
name: PublishDockerImage
|
|
||||||
env:
|
|
||||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
generate:
|
|
||||||
name: 'Update node-red-docker image'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check out node-red repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: 'node-red'
|
|
||||||
- name: Check out node-red-docker repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: 'node-red/node-red-docker'
|
|
||||||
path: 'node-red-docker'
|
|
||||||
- name: Check out node-red.github.io repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: 'node-red/node-red.github.io'
|
|
||||||
path: 'node-red.github.io'
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: '12'
|
|
||||||
- run: node ./node-red/.github/scripts/update-node-red-docker.js
|
|
||||||
- name: Create Docker Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
|
||||||
committer: GitHub <noreply@github.com>
|
|
||||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
|
||||||
path: 'node-red-docker'
|
|
||||||
commit-message: 'Bump to ${{ env.newVersion }}'
|
|
||||||
title: '🚀 Update to Node-RED ${{ env.newVersion }} release'
|
|
||||||
body: |
|
|
||||||
Updates the Node-RED Docker repo for the ${{ env.newVersion }} release.
|
|
||||||
|
|
||||||
Once this is merged, you will need to create a new release with the tag `v${{ env.newVersion }}`.
|
|
||||||
|
|
||||||
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
|
|
||||||
- run: node ./node-red/.github/scripts/update-node-red-website.js
|
|
||||||
- name: Create Website Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
|
||||||
committer: GitHub <noreply@github.com>
|
|
||||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
|
||||||
path: 'node-red.github.io'
|
|
||||||
commit-message: 'Bump to ${{ env.newVersion }}'
|
|
||||||
title: '🚀 Update to Node-RED ${{ env.newVersion }} release'
|
|
||||||
body: |
|
|
||||||
Updates the Node-RED Website repo for the ${{ env.newVersion }} release.
|
|
||||||
|
|
||||||
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
|
|
||||||
7
.gitignore
vendored
@@ -17,10 +17,3 @@ node_modules
|
|||||||
public
|
public
|
||||||
locales/zz-ZZ
|
locales/zz-ZZ
|
||||||
nodes/core/locales/zz-ZZ
|
nodes/core/locales/zz-ZZ
|
||||||
!packages/node_modules
|
|
||||||
packages/node_modules/@node-red/editor-client/public
|
|
||||||
!test/**/node_modules
|
|
||||||
docs
|
|
||||||
!packages/node_modules/**/docs
|
|
||||||
.vscode
|
|
||||||
.nyc_output
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/Gruntfile.js
|
/Gruntfile.js
|
||||||
/.git/*
|
/.git/*
|
||||||
|
/lib/*
|
||||||
*.backup
|
*.backup
|
||||||
/public/*
|
/public/*
|
||||||
|
|||||||
7
.npmignore
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.settings
|
||||||
|
.jshintignore
|
||||||
|
.jshintrc
|
||||||
|
.project
|
||||||
|
.tern-project
|
||||||
|
.travis.yml
|
||||||
|
.git
|
||||||
19
.travis.yml
@@ -1,21 +1,12 @@
|
|||||||
sudo: false
|
sudo: false
|
||||||
addons:
|
|
||||||
chrome: stable
|
|
||||||
language: node_js
|
language: node_js
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- node_js: "14"
|
|
||||||
script:
|
|
||||||
- ./node_modules/.bin/grunt && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage
|
|
||||||
# - scripts/install-ui-test-dependencies.sh && grunt test-ui
|
|
||||||
before_script:
|
|
||||||
- npm install -g coveralls
|
|
||||||
- node_js: "12"
|
|
||||||
script:
|
|
||||||
- ./node_modules/.bin/grunt no-coverage
|
|
||||||
- node_js: "10"
|
- node_js: "10"
|
||||||
script:
|
script:
|
||||||
- ./node_modules/.bin/grunt no-coverage
|
- ./node_modules/.bin/grunt && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage
|
||||||
|
before_script:
|
||||||
|
- npm install -g istanbul coveralls
|
||||||
- node_js: "8"
|
- node_js: "8"
|
||||||
script:
|
- node_js: "6"
|
||||||
- ./node_modules/.bin/grunt no-coverage
|
- node_js: "4"
|
||||||
|
|||||||
15
API.md
@@ -1,15 +0,0 @@
|
|||||||
Node-RED Modules
|
|
||||||
---
|
|
||||||
|
|
||||||
Node-RED provides a set of node modules that implement different parts of the
|
|
||||||
application.
|
|
||||||
|
|
||||||
Module | Description
|
|
||||||
-------|-------
|
|
||||||
[node-red](node-red.html) | the main module that pulls together all of the internal modules and provides the executable version of Node-RED
|
|
||||||
[@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API
|
|
||||||
[@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED
|
|
||||||
[@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules
|
|
||||||
@node-red/registry | the internal node registry
|
|
||||||
@node-red/nodes | the default set of core nodes
|
|
||||||
@node-red/editor-client | the client-side resources of the Node-RED editor application
|
|
||||||
1540
CHANGELOG.md
@@ -26,7 +26,7 @@ relevant nodes, press Ctrl-E and copy the flow data from the Export dialog.
|
|||||||
At a minimum, please include:
|
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-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
|
## Feature requests
|
||||||
|
|
||||||
|
|||||||
524
Gruntfile.js
@@ -15,31 +15,15 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var fs = require("fs-extra");
|
|
||||||
var sass = require("node-sass");
|
|
||||||
|
|
||||||
module.exports = function(grunt) {
|
module.exports = function(grunt) {
|
||||||
|
|
||||||
var nodemonArgs = ["-V"];
|
var nodemonArgs = ["-v"];
|
||||||
var flowFile = grunt.option('flowFile');
|
var flowFile = grunt.option('flowFile');
|
||||||
if (flowFile) {
|
if (flowFile) {
|
||||||
nodemonArgs.push(flowFile);
|
nodemonArgs.push(flowFile);
|
||||||
process.env.NODE_RED_ENABLE_PROJECTS=false;
|
|
||||||
}
|
|
||||||
var userDir = grunt.option('userDir');
|
|
||||||
if (userDir) {
|
|
||||||
nodemonArgs.push("-u");
|
|
||||||
nodemonArgs.push(userDir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var browserstack = grunt.option('browserstack');
|
|
||||||
if (browserstack) {
|
|
||||||
process.env.BROWSERSTACK = true;
|
|
||||||
}
|
|
||||||
var nonHeadless = grunt.option('non-headless');
|
|
||||||
if (nonHeadless) {
|
|
||||||
process.env.NODE_RED_NON_HEADLESS = true;
|
|
||||||
}
|
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
paths: {
|
paths: {
|
||||||
@@ -53,8 +37,8 @@ module.exports = function(grunt) {
|
|||||||
ui: 'bdd',
|
ui: 'bdd',
|
||||||
reporter: 'spec'
|
reporter: 'spec'
|
||||||
},
|
},
|
||||||
all: { src: ["test/unit/_spec.js","test/unit/**/*_spec.js","test/nodes/**/*_spec.js"] },
|
all: { src: ['test/**/*_spec.js'] },
|
||||||
core: { src: ["test/unit/_spec.js","test/unit/**/*_spec.js"]},
|
core: { src: ["test/_spec.js","test/red/**/*_spec.js"]},
|
||||||
nodes: { src: ["test/nodes/**/*_spec.js"]}
|
nodes: { src: ["test/nodes/**/*_spec.js"]}
|
||||||
},
|
},
|
||||||
webdriver: {
|
webdriver: {
|
||||||
@@ -62,19 +46,18 @@ module.exports = function(grunt) {
|
|||||||
configFile: 'test/editor/wdio.conf.js'
|
configFile: 'test/editor/wdio.conf.js'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nyc: {
|
mocha_istanbul: {
|
||||||
options: {
|
options: {
|
||||||
cwd: '.',
|
globals: ['expect'],
|
||||||
include: ['packages/node_modules/**'],
|
timeout: 3000,
|
||||||
excludeNodeModules: false,
|
ignoreLeaks: false,
|
||||||
exclude: ['packages/node_modules/@node-red/editor-client/**'],
|
ui: 'bdd',
|
||||||
reporter: ['lcov', 'html','text-summary'],
|
reportFormats: ['lcov','html'],
|
||||||
reportDir: 'coverage',
|
print: 'both'
|
||||||
all: true
|
|
||||||
},
|
},
|
||||||
all: { cmd: false, args: ['grunt', 'simplemocha:all'] },
|
all: { src: ["test/_spec.js","test/red/**/*_spec.js","test/nodes/**/*_spec.js"] },
|
||||||
core: { options: { exclude:['packages/node_modules/@node-red/editor-client/**', 'packages/node_modules/@node-red/nodes/**']},cmd: false, args: ['grunt', 'simplemocha:core'] },
|
core: { src: ["test/_spec.js","test/red/**/*_spec.js"]},
|
||||||
nodes: { cmd: false, args: ['grunt', 'simplemocha:nodes'] }
|
nodes: { src: ["test/nodes/**/*_spec.js"]}
|
||||||
},
|
},
|
||||||
jshint: {
|
jshint: {
|
||||||
options: {
|
options: {
|
||||||
@@ -90,20 +73,22 @@ module.exports = function(grunt) {
|
|||||||
//"loopfunc": true, // allow functions to be defined in loops
|
//"loopfunc": true, // allow functions to be defined in loops
|
||||||
//"sub": true // don't warn that foo['bar'] should be written as foo.bar
|
//"sub": true // don't warn that foo['bar'] should be written as foo.bar
|
||||||
},
|
},
|
||||||
// all: [
|
all: [
|
||||||
// 'Gruntfile.js',
|
'Gruntfile.js',
|
||||||
// 'red.js',
|
'red.js',
|
||||||
// 'packages/**/*.js'
|
'red/**/*.js',
|
||||||
// ],
|
'nodes/core/*/*.js',
|
||||||
// core: {
|
'editor/js/**/*.js'
|
||||||
// files: {
|
],
|
||||||
// src: [
|
core: {
|
||||||
// 'Gruntfile.js',
|
files: {
|
||||||
// 'red.js',
|
src: [
|
||||||
// 'packages/**/*.js',
|
'Gruntfile.js',
|
||||||
// ]
|
'red.js',
|
||||||
// }
|
'red/**/*.js'
|
||||||
// },
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
files: {
|
files: {
|
||||||
src: [ 'nodes/core/*/*.js' ]
|
src: [ 'nodes/core/*/*.js' ]
|
||||||
@@ -111,7 +96,7 @@ module.exports = function(grunt) {
|
|||||||
},
|
},
|
||||||
editor: {
|
editor: {
|
||||||
files: {
|
files: {
|
||||||
src: [ 'packages/node_modules/@node-red/editor-client/src/js/**/*.js' ]
|
src: [ 'editor/js/**/*.js' ]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tests: {
|
tests: {
|
||||||
@@ -131,95 +116,79 @@ module.exports = function(grunt) {
|
|||||||
src: [
|
src: [
|
||||||
// Ensure editor source files are concatenated in
|
// Ensure editor source files are concatenated in
|
||||||
// the right order
|
// the right order
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/polyfills.js",
|
"editor/js/red.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/jquery-addons.js",
|
"editor/js/events.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/red.js",
|
"editor/js/i18n.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/events.js",
|
"editor/js/settings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/i18n.js",
|
"editor/js/user.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/settings.js",
|
"editor/js/comms.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/user.js",
|
"editor/js/text/bidi.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/comms.js",
|
"editor/js/text/format.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/text/bidi.js",
|
"editor/js/ui/state.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/text/format.js",
|
"editor/js/nodes.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/state.js",
|
"editor/js/history.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/nodes.js",
|
"editor/js/validators.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/font-awesome.js",
|
"editor/js/ui/utils.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/history.js",
|
"editor/js/ui/common/editableList.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/validators.js",
|
"editor/js/ui/common/checkboxSet.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/utils.js",
|
"editor/js/ui/common/menu.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js",
|
"editor/js/ui/common/panels.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js",
|
"editor/js/ui/common/popover.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js",
|
"editor/js/ui/common/searchBox.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js",
|
"editor/js/ui/common/tabs.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/panels.js",
|
"editor/js/ui/common/stack.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js",
|
"editor/js/ui/common/typedInput.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js",
|
"editor/js/ui/actions.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js",
|
"editor/js/ui/deploy.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js",
|
"editor/js/ui/diff.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js",
|
"editor/js/ui/keyboard.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js",
|
"editor/js/ui/workspaces.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/colorPicker.js",
|
"editor/js/ui/view.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js",
|
"editor/js/ui/view-navigator.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js",
|
"editor/js/ui/sidebar.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js",
|
"editor/js/ui/palette.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js",
|
"editor/js/ui/tab-info.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js",
|
"editor/js/ui/tab-config.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js",
|
"editor/js/ui/palette-editor.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view.js",
|
"editor/js/ui/editor.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js",
|
"editor/js/ui/tray.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js",
|
"editor/js/ui/clipboard.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js",
|
"editor/js/ui/library.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/palette.js",
|
"editor/js/ui/notifications.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js",
|
"editor/js/ui/search.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js",
|
"editor/js/ui/typeSearch.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js",
|
"editor/js/ui/subflow.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js",
|
"editor/js/ui/userSettings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js",
|
"editor/js/ui/projects/projects.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js",
|
"editor/js/ui/projects/projectSettings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/editor.js",
|
"editor/js/ui/projects/projectUserSettings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/editors/*.js",
|
"editor/js/ui/projects/tab-versionControl.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/event-log.js",
|
"editor/js/ui/touch/radialMenu.js"
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tray.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js",
|
|
||||||
"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/group.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/touch/radialMenu.js"
|
|
||||||
],
|
],
|
||||||
dest: "packages/node_modules/@node-red/editor-client/public/red/red.js"
|
dest: "public/red/red.js"
|
||||||
},
|
},
|
||||||
vendor: {
|
vendor: {
|
||||||
files: {
|
files: {
|
||||||
"packages/node_modules/@node-red/editor-client/public/vendor/vendor.js": [
|
"public/vendor/vendor.js": [
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.5.1.min.js",
|
"editor/vendor/jquery/js/jquery-1.11.3.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-migrate-3.3.0.min.js",
|
"editor/vendor/bootstrap/js/bootstrap.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui.min.js",
|
"editor/vendor/jquery/js/jquery-ui-1.10.3.custom.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js",
|
"editor/vendor/jquery/js/jquery.ui.touch-punch.min.js",
|
||||||
"node_modules/marked/marked.min.js",
|
"editor/vendor/marked/marked.min.js",
|
||||||
"node_modules/dompurify/dist/purify.min.js",
|
"editor/vendor/d3/d3.v3.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js",
|
"editor/vendor/i18next/i18next.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/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": [
|
"public/vendor/vendor.css": [
|
||||||
// // TODO: resolve relative resource paths in
|
// TODO: resolve relative resource paths in
|
||||||
// // bootstrap/FA/jquery
|
// bootstrap/FA/jquery
|
||||||
// ],
|
],
|
||||||
"packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [
|
"public/vendor/jsonata/jsonata.min.js": [
|
||||||
"node_modules/jsonata/jsonata-es5.min.js",
|
"node_modules/jsonata/jsonata-es5.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js"
|
"editor/vendor/jsonata/formatter.js"
|
||||||
|
],
|
||||||
|
"public/vendor/ace/worker-jsonata.js": [
|
||||||
|
"node_modules/jsonata/jsonata-es5.min.js",
|
||||||
|
"editor/vendor/jsonata/worker-jsonata.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -227,60 +196,63 @@ module.exports = function(grunt) {
|
|||||||
uglify: {
|
uglify: {
|
||||||
build: {
|
build: {
|
||||||
files: {
|
files: {
|
||||||
'packages/node_modules/@node-red/editor-client/public/red/red.min.js': 'packages/node_modules/@node-red/editor-client/public/red/red.js',
|
'public/red/red.min.js': 'public/red/red.js',
|
||||||
'packages/node_modules/@node-red/editor-client/public/red/main.min.js': 'packages/node_modules/@node-red/editor-client/public/red/main.js',
|
'public/red/main.min.js': 'public/red/main.js',
|
||||||
'packages/node_modules/@node-red/editor-client/public/vendor/ace/mode-jsonata.js': 'packages/node_modules/@node-red/editor-client/src/vendor/jsonata/mode-jsonata.js',
|
'public/vendor/ace/mode-jsonata.js': 'editor/vendor/jsonata/mode-jsonata.js',
|
||||||
'packages/node_modules/@node-red/editor-client/public/vendor/ace/snippets/jsonata.js': 'packages/node_modules/@node-red/editor-client/src/vendor/jsonata/snippets-jsonata.js'
|
'public/vendor/ace/snippets/jsonata.js': 'editor/vendor/jsonata/snippets-jsonata.js'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
sass: {
|
sass: {
|
||||||
build: {
|
build: {
|
||||||
options: {
|
options: {
|
||||||
implementation: sass,
|
|
||||||
outputStyle: 'compressed'
|
outputStyle: 'compressed'
|
||||||
},
|
},
|
||||||
files: [{
|
files: [{
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/style.min.css',
|
dest: 'public/red/style.min.css',
|
||||||
src: 'packages/node_modules/@node-red/editor-client/src/sass/style.scss'
|
src: 'editor/sass/style.scss'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dest: 'public/vendor/bootstrap/css/bootstrap.min.css',
|
||||||
|
src: 'editor/vendor/bootstrap/css/bootstrap.css'
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
jsonlint: {
|
jsonlint: {
|
||||||
messages: {
|
messages: {
|
||||||
src: [
|
src: [
|
||||||
'packages/node_modules/@node-red/nodes/locales/**/*.json',
|
'nodes/core/locales/en-US/messages.json',
|
||||||
'packages/node_modules/@node-red/editor-client/locales/**/*.json',
|
'red/api/locales/en-US/editor.json',
|
||||||
'packages/node_modules/@node-red/runtime/locales/**/*.json'
|
'red/runtime/locales/en-US/runtime.json'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
keymaps: {
|
keymaps: {
|
||||||
src: [
|
src: [
|
||||||
'packages/node_modules/@node-red/editor-client/src/js/keymap.json'
|
'editor/js/keymap.json'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
attachCopyright: {
|
attachCopyright: {
|
||||||
js: {
|
js: {
|
||||||
src: [
|
src: [
|
||||||
'packages/node_modules/@node-red/editor-client/public/red/red.min.js',
|
'public/red/red.min.js',
|
||||||
'packages/node_modules/@node-red/editor-client/public/red/main.min.js'
|
'public/red/main.min.js'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
css: {
|
css: {
|
||||||
src: [
|
src: [
|
||||||
'packages/node_modules/@node-red/editor-client/public/red/style.min.css'
|
'public/red/style.min.css'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
build: {
|
build: {
|
||||||
src: [
|
src: [
|
||||||
"packages/node_modules/@node-red/editor-client/public/red",
|
"public/red",
|
||||||
"packages/node_modules/@node-red/editor-client/public/index.html",
|
"public/index.html",
|
||||||
"packages/node_modules/@node-red/editor-client/public/favicon.ico",
|
"public/favicon.ico",
|
||||||
"packages/node_modules/@node-red/editor-client/public/icons",
|
"public/icons",
|
||||||
"packages/node_modules/@node-red/editor-client/public/vendor"
|
"public/vendor"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
release: {
|
release: {
|
||||||
@@ -292,27 +264,27 @@ module.exports = function(grunt) {
|
|||||||
watch: {
|
watch: {
|
||||||
js: {
|
js: {
|
||||||
files: [
|
files: [
|
||||||
'packages/node_modules/@node-red/editor-client/src/js/**/*.js'
|
'editor/js/**/*.js'
|
||||||
],
|
],
|
||||||
tasks: ['copy:build','concat',/*'uglify',*/ 'attachCopyright:js']
|
tasks: ['copy:build','concat','uglify','attachCopyright:js']
|
||||||
},
|
},
|
||||||
sass: {
|
sass: {
|
||||||
files: [
|
files: [
|
||||||
'packages/node_modules/@node-red/editor-client/src/sass/**/*.scss'
|
'editor/sass/**/*.scss'
|
||||||
],
|
],
|
||||||
tasks: ['sass','attachCopyright:css']
|
tasks: ['sass','attachCopyright:css']
|
||||||
},
|
},
|
||||||
json: {
|
json: {
|
||||||
files: [
|
files: [
|
||||||
'packages/node_modules/@node-red/nodes/locales/**/*.json',
|
'nodes/core/locales/en-US/messages.json',
|
||||||
'packages/node_modules/@node-red/editor-client/locales/**/*.json',
|
'red/api/locales/en-US/editor.json',
|
||||||
'packages/node_modules/@node-red/runtime/locales/**/*.json'
|
'red/runtime/locales/en-US/runtime.json'
|
||||||
],
|
],
|
||||||
tasks: ['jsonlint:messages']
|
tasks: ['jsonlint:messages']
|
||||||
},
|
},
|
||||||
keymaps: {
|
keymaps: {
|
||||||
files: [
|
files: [
|
||||||
'packages/node_modules/@node-red/editor-client/src/js/keymap.json'
|
'editor/js/keymap.json'
|
||||||
],
|
],
|
||||||
tasks: ['jsonlint:keymaps','copy:build']
|
tasks: ['jsonlint:keymaps','copy:build']
|
||||||
},
|
},
|
||||||
@@ -327,13 +299,12 @@ module.exports = function(grunt) {
|
|||||||
nodemon: {
|
nodemon: {
|
||||||
/* uses .nodemonignore */
|
/* uses .nodemonignore */
|
||||||
dev: {
|
dev: {
|
||||||
script: 'packages/node_modules/node-red/red.js',
|
script: 'red.js',
|
||||||
options: {
|
options: {
|
||||||
args: nodemonArgs,
|
args: nodemonArgs,
|
||||||
ext: 'js,html,json',
|
ext: 'js,html,json',
|
||||||
watch: [
|
watch: [
|
||||||
'packages/node_modules',
|
'red','nodes'
|
||||||
'!packages/node_modules/@node-red/editor-client'
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,56 +323,69 @@ module.exports = function(grunt) {
|
|||||||
build: {
|
build: {
|
||||||
files:[
|
files:[
|
||||||
{
|
{
|
||||||
src: 'packages/node_modules/@node-red/editor-client/src/js/main.js',
|
src: 'editor/js/main.js',
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/main.js'
|
dest: 'public/red/main.js'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: 'packages/node_modules/@node-red/editor-client/src/js/keymap.json',
|
src: 'editor/js/keymap.json',
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/keymap.json'
|
dest: 'public/red/keymap.json'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cwd: 'packages/node_modules/@node-red/editor-client/src/images',
|
cwd: 'editor/images',
|
||||||
src: '**',
|
src: '**',
|
||||||
expand: true,
|
expand: true,
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/images/'
|
dest: 'public/red/images/'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cwd: 'packages/node_modules/@node-red/editor-client/src/vendor',
|
cwd: 'editor/vendor',
|
||||||
src: [
|
src: [
|
||||||
'ace/**',
|
'ace/**',
|
||||||
'jquery/css/base/**',
|
//'bootstrap/css/**',
|
||||||
|
'bootstrap/img/**',
|
||||||
|
'jquery/css/**',
|
||||||
'font-awesome/**'
|
'font-awesome/**'
|
||||||
],
|
],
|
||||||
expand: true,
|
expand: true,
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/'
|
dest: 'public/vendor/'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cwd: 'packages/node_modules/@node-red/editor-client/src/icons',
|
cwd: 'editor/icons',
|
||||||
src: '**',
|
src: '**',
|
||||||
expand: true,
|
expand: true,
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/icons/'
|
dest: 'public/icons/'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expand: true,
|
expand: true,
|
||||||
src: ['packages/node_modules/@node-red/editor-client/src/index.html','packages/node_modules/@node-red/editor-client/src/favicon.ico'],
|
src: ['editor/index.html','editor/favicon.ico'],
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/',
|
dest: 'public/',
|
||||||
flatten: true
|
flatten: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: 'CHANGELOG.md',
|
src: 'CHANGELOG.md',
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/about'
|
dest: 'public/red/about'
|
||||||
},
|
|
||||||
{
|
|
||||||
src: 'CHANGELOG.md',
|
|
||||||
dest: 'packages/node_modules/node-red/'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cwd: 'packages/node_modules/@node-red/editor-client/src/ace/bin/',
|
|
||||||
src: '**',
|
|
||||||
expand: true,
|
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/ace/'
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
release: {
|
||||||
|
files: [{
|
||||||
|
mode: true,
|
||||||
|
expand: true,
|
||||||
|
src: [
|
||||||
|
'*.md',
|
||||||
|
'LICENSE',
|
||||||
|
'package.json',
|
||||||
|
'settings.js',
|
||||||
|
'red.js',
|
||||||
|
'lib/.gitignore',
|
||||||
|
'nodes/*.demo',
|
||||||
|
'nodes/core/**',
|
||||||
|
'red/**',
|
||||||
|
'public/**',
|
||||||
|
'editor/templates/**',
|
||||||
|
'bin/**'
|
||||||
|
],
|
||||||
|
dest: path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>')
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
chmod: {
|
chmod: {
|
||||||
@@ -410,93 +394,19 @@ module.exports = function(grunt) {
|
|||||||
},
|
},
|
||||||
release: {
|
release: {
|
||||||
src: [
|
src: [
|
||||||
"packages/node_modules/@node-red/nodes/core/hardware/nrgpio",
|
path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>/nodes/core/hardware/nrgpio*'),
|
||||||
"packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/node-red-*sh"
|
path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>/red/runtime/storage/localfilesystem/projects/git/node-red-*sh')
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'npm-command': {
|
|
||||||
options: {
|
|
||||||
cmd: "pack",
|
|
||||||
cwd: "<%= paths.dist %>/modules"
|
|
||||||
},
|
|
||||||
'node-red': { options: { args: [__dirname+'/packages/node_modules/node-red'] } },
|
|
||||||
'@node-red/editor-api': { options: { args: [__dirname+'/packages/node_modules/@node-red/editor-api'] } },
|
|
||||||
'@node-red/editor-client': { options: { args: [__dirname+'/packages/node_modules/@node-red/editor-client'] } },
|
|
||||||
'@node-red/nodes': { options: { args: [__dirname+'/packages/node_modules/@node-red/nodes'] } },
|
|
||||||
'@node-red/registry': { options: { args: [__dirname+'/packages/node_modules/@node-red/registry'] } },
|
|
||||||
'@node-red/runtime': { options: { args: [__dirname+'/packages/node_modules/@node-red/runtime'] } },
|
|
||||||
'@node-red/util': { options: { args: [__dirname+'/packages/node_modules/@node-red/util'] } }
|
|
||||||
|
|
||||||
|
|
||||||
},
|
|
||||||
mkdir: {
|
|
||||||
release: {
|
|
||||||
options: {
|
|
||||||
create: ['<%= paths.dist %>/modules']
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
compress: {
|
compress: {
|
||||||
release: {
|
release: {
|
||||||
options: {
|
options: {
|
||||||
archive: '<%= paths.dist %>/node-red-<%= pkg.version %>.zip'
|
archive: '<%= paths.dist %>/node-red-<%= pkg.version %>.zip'
|
||||||
},
|
},
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'packages/node_modules/',
|
cwd: '<%= paths.dist %>/',
|
||||||
src: [
|
src: ['node-red-<%= pkg.version %>/**']
|
||||||
'**',
|
|
||||||
'!@node-red/editor-client/src/**'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
jsdoc : {
|
|
||||||
modules: {
|
|
||||||
src: [
|
|
||||||
'API.md',
|
|
||||||
'packages/node_modules/node-red/lib/red.js',
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/index.js',
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/api/*.js',
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/events.js',
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/hooks.js',
|
|
||||||
'packages/node_modules/@node-red/util/**/*.js',
|
|
||||||
'packages/node_modules/@node-red/editor-api/lib/index.js',
|
|
||||||
'packages/node_modules/@node-red/editor-api/lib/auth/index.js'
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
destination: 'docs',
|
|
||||||
configure: './jsdoc.json'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
_editor: {
|
|
||||||
src: [
|
|
||||||
'packages/node_modules/@node-red/editor-client/src/js'
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
destination: 'packages/node_modules/@node-red/editor-client/docs',
|
|
||||||
configure: './jsdoc.json'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
jsdoc2md: {
|
|
||||||
runtimeAPI: {
|
|
||||||
options: {
|
|
||||||
separators: true
|
|
||||||
},
|
|
||||||
src: [
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/index.js',
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/api/*.js',
|
|
||||||
'packages/node_modules/@node-red/runtime/lib/events.js'
|
|
||||||
],
|
|
||||||
dest: 'packages/node_modules/@node-red/runtime/docs/api.md'
|
|
||||||
},
|
|
||||||
nodeREDUtil: {
|
|
||||||
options: {
|
|
||||||
separators: true
|
|
||||||
},
|
|
||||||
src: 'packages/node_modules/@node-red/util/**/*.js',
|
|
||||||
dest: 'packages/node_modules/@node-red/util/docs/api.md'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -509,37 +419,13 @@ module.exports = function(grunt) {
|
|||||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||||
grunt.loadNpmTasks('grunt-concurrent');
|
grunt.loadNpmTasks('grunt-concurrent');
|
||||||
grunt.loadNpmTasks('grunt-sass');
|
grunt.loadNpmTasks('grunt-sass');
|
||||||
|
grunt.loadNpmTasks('grunt-nodemon');
|
||||||
grunt.loadNpmTasks('grunt-contrib-compress');
|
grunt.loadNpmTasks('grunt-contrib-compress');
|
||||||
grunt.loadNpmTasks('grunt-contrib-copy');
|
grunt.loadNpmTasks('grunt-contrib-copy');
|
||||||
grunt.loadNpmTasks('grunt-chmod');
|
grunt.loadNpmTasks('grunt-chmod');
|
||||||
grunt.loadNpmTasks('grunt-jsonlint');
|
grunt.loadNpmTasks('grunt-jsonlint');
|
||||||
if (fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
|
grunt.loadNpmTasks('grunt-mocha-istanbul');
|
||||||
grunt.loadNpmTasks('grunt-webdriver');
|
grunt.loadNpmTasks('grunt-webdriver');
|
||||||
}
|
|
||||||
grunt.loadNpmTasks('grunt-jsdoc');
|
|
||||||
grunt.loadNpmTasks('grunt-jsdoc-to-markdown');
|
|
||||||
grunt.loadNpmTasks('grunt-npm-command');
|
|
||||||
grunt.loadNpmTasks('grunt-mkdir');
|
|
||||||
grunt.loadNpmTasks('grunt-simple-nyc');
|
|
||||||
|
|
||||||
grunt.registerMultiTask('nodemon', 'Runs a nodemon monitor of your node.js server.', function () {
|
|
||||||
const nodemon = require('nodemon');
|
|
||||||
this.async();
|
|
||||||
const options = this.options();
|
|
||||||
options.script = this.data.script;
|
|
||||||
let callback;
|
|
||||||
if (options.callback) {
|
|
||||||
callback = options.callback;
|
|
||||||
delete options.callback;
|
|
||||||
} else {
|
|
||||||
callback = function(nodemonApp) {
|
|
||||||
nodemonApp.on('log', function (event) {
|
|
||||||
console.log(event.colour);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
callback(nodemon(options));
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.registerMultiTask('attachCopyright', function() {
|
grunt.registerMultiTask('attachCopyright', function() {
|
||||||
var files = this.data.src;
|
var files = this.data.src;
|
||||||
@@ -581,38 +467,6 @@ module.exports = function(grunt) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
grunt.registerTask('verifyPackageDependencies', function() {
|
|
||||||
var done = this.async();
|
|
||||||
var verifyDependencies = require("./scripts/verify-package-dependencies.js");
|
|
||||||
verifyDependencies().then(function(failures) {
|
|
||||||
if (failures.length > 0) {
|
|
||||||
failures.forEach(f => grunt.log.error(f));
|
|
||||||
grunt.fail.fatal("Failed to verify package dependencies");
|
|
||||||
}
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.registerTask('verifyUiTestDependencies', function() {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
grunt.registerTask('generatePublishScript',
|
|
||||||
'Generates a script to publish build output to npm',
|
|
||||||
function () {
|
|
||||||
const done = this.async();
|
|
||||||
const generatePublishScript = require("./scripts/generate-publish-script.js");
|
|
||||||
generatePublishScript().then(function(output) {
|
|
||||||
grunt.log.writeln(output);
|
|
||||||
|
|
||||||
const filePath = path.join(grunt.config.get('paths.dist'),"modules","publish.sh");
|
|
||||||
grunt.file.write(filePath,output);
|
|
||||||
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
grunt.registerTask('setDevEnv',
|
grunt.registerTask('setDevEnv',
|
||||||
'Sets NODE_ENV=development so non-minified assets are used',
|
'Sets NODE_ENV=development so non-minified assets are used',
|
||||||
function () {
|
function () {
|
||||||
@@ -621,61 +475,37 @@ module.exports = function(grunt) {
|
|||||||
|
|
||||||
grunt.registerTask('default',
|
grunt.registerTask('default',
|
||||||
'Builds editor content then runs code style checks and unit tests on all components',
|
'Builds editor content then runs code style checks and unit tests on all components',
|
||||||
['build','verifyPackageDependencies','jshint:editor','nyc:all']);
|
['build','jshint:editor','mocha_istanbul:all']);
|
||||||
|
|
||||||
grunt.registerTask('no-coverage',
|
|
||||||
'Builds editor content then runs code style checks and unit tests on all components without code coverage',
|
|
||||||
['build','verifyPackageDependencies','jshint:editor','simplemocha:all']);
|
|
||||||
|
|
||||||
|
|
||||||
grunt.registerTask('test-core',
|
grunt.registerTask('test-core',
|
||||||
'Runs code style check and unit tests on core runtime code',
|
'Runs code style check and unit tests on core runtime code',
|
||||||
['build','nyc:core']);
|
['build','mocha_istanbul:core']);
|
||||||
|
|
||||||
grunt.registerTask('test-editor',
|
grunt.registerTask('test-editor',
|
||||||
'Runs code style check on editor code',
|
'Runs code style check on editor code',
|
||||||
['jshint:editor']);
|
['jshint:editor']);
|
||||||
|
|
||||||
if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
|
|
||||||
grunt.registerTask('test-ui',
|
grunt.registerTask('test-ui',
|
||||||
'Builds editor content then runs unit tests on editor ui',
|
'Builds editor content then runs unit tests on editor ui',
|
||||||
['verifyUiTestDependencies']);
|
['build','jshint:editor','webdriver:all']);
|
||||||
} 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',
|
grunt.registerTask('test-nodes',
|
||||||
'Runs unit tests on core nodes',
|
'Runs unit tests on core nodes',
|
||||||
['build','nyc:nodes']);
|
['build','mocha_istanbul:nodes']);
|
||||||
|
|
||||||
grunt.registerTask('build',
|
grunt.registerTask('build',
|
||||||
'Builds editor content',
|
'Builds editor content',
|
||||||
['clean:build','jsonlint','concat:build','concat:vendor','copy:build','uglify:build','sass:build','attachCopyright']);
|
['clean:build','jsonlint','concat:build','concat:vendor','copy:build','uglify:build','sass:build','attachCopyright']);
|
||||||
|
|
||||||
grunt.registerTask('build-dev',
|
|
||||||
'Developer mode: build dev version',
|
|
||||||
['clean:build','concat:build','concat:vendor','copy:build','sass:build','setDevEnv']);
|
|
||||||
|
|
||||||
grunt.registerTask('dev',
|
grunt.registerTask('dev',
|
||||||
'Developer mode: run node-red, watch for source changes and build/restart',
|
'Developer mode: run node-red, watch for source changes and build/restart',
|
||||||
['build','setDevEnv','concurrent:dev']);
|
['build','setDevEnv','concurrent:dev']);
|
||||||
|
|
||||||
grunt.registerTask('release',
|
grunt.registerTask('release',
|
||||||
'Create distribution zip file',
|
'Create distribution zip file',
|
||||||
['build','verifyPackageDependencies','clean:release','mkdir:release','chmod:release','compress:release','pack-modules','generatePublishScript']);
|
['build','clean:release','copy:release','chmod:release','compress:release']);
|
||||||
|
|
||||||
grunt.registerTask('pack-modules',
|
|
||||||
'Create module pack files for release',
|
|
||||||
['mkdir:release','npm-command']);
|
|
||||||
|
|
||||||
|
|
||||||
grunt.registerTask('coverage',
|
grunt.registerTask('coverage',
|
||||||
'Run Istanbul code test coverage task',
|
'Run Istanbul code test coverage task',
|
||||||
['build','nyc:all']);
|
['build','mocha_istanbul:all']);
|
||||||
|
|
||||||
grunt.registerTask('docs',
|
|
||||||
'Generates API documentation',
|
|
||||||
['jsdoc']);
|
|
||||||
};
|
};
|
||||||
|
|||||||
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
|
Copyright JS Foundation and other contributors, http://js.foundation
|
||||||
|
|
||||||
Apache License
|
Apache License
|
||||||
Version 2.0, January 2004
|
Version 2.0, January 2004
|
||||||
|
|||||||
13
README.md
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
http://nodered.org
|
http://nodered.org
|
||||||
|
|
||||||
[](https://travis-ci.org/node-red/node-red)
|
[](https://travis-ci.org/node-red/node-red)
|
||||||
[](https://coveralls.io/r/node-red/node-red?branch=master)
|
[](https://coveralls.io/r/node-red/node-red?branch=master)
|
||||||
|
|
||||||
Low-code programming for event-driven applications.
|
A visual tool for wiring the Internet of Things.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
@@ -44,6 +44,9 @@ If you want to run the latest code from git, here's how to get started:
|
|||||||
4. Run
|
4. Run
|
||||||
|
|
||||||
npm start
|
npm start
|
||||||
|
or
|
||||||
|
|
||||||
|
node red.js
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
@@ -56,7 +59,7 @@ This project adheres to the [Contributor Covenant 1.4](http://contributor-covena
|
|||||||
|
|
||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
Node-RED is a project of the [OpenJS Foundation](https://openjsf.org).
|
Node-RED is a project of the [JS Foundation](http://js.foundation).
|
||||||
|
|
||||||
It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/).
|
It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/).
|
||||||
|
|
||||||
@@ -67,4 +70,4 @@ It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-t
|
|||||||
|
|
||||||
## Copyright and license
|
## Copyright and license
|
||||||
|
|
||||||
Copyright OpenJS Foundation and other contributors, https://openjsf.org under [the Apache 2.0 license](LICENSE).
|
Copyright JS Foundation and other contributors, http://js.foundation under [the Apache 2.0 license](LICENSE).
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
Please report any potential security issues to `team@nodered.org`. This will notify the core project team who will respond accordingly.
|
|
||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
BIN
editor/icons/alert.png
Normal file
|
After Width: | Height: | Size: 308 B |
|
Before Width: | Height: | Size: 603 B After Width: | Height: | Size: 603 B |
|
Before Width: | Height: | Size: 393 B After Width: | Height: | Size: 393 B |
BIN
editor/icons/batch.png
Normal file
|
After Width: | Height: | Size: 712 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
BIN
editor/icons/bridge-dash.png
Normal file
|
After Width: | Height: | Size: 508 B |
BIN
editor/icons/bridge.png
Normal file
|
After Width: | Height: | Size: 575 B |
BIN
editor/icons/cog.png
Normal file
|
After Width: | Height: | Size: 493 B |
BIN
editor/icons/comment.png
Normal file
|
After Width: | Height: | Size: 601 B |
BIN
editor/icons/db.png
Normal file
|
After Width: | Height: | Size: 459 B |
BIN
editor/icons/debug.png
Normal file
|
After Width: | Height: | Size: 218 B |
BIN
editor/icons/envelope.png
Normal file
|
After Width: | Height: | Size: 324 B |
BIN
editor/icons/feed.png
Normal file
|
After Width: | Height: | Size: 378 B |
BIN
editor/icons/file.png
Normal file
|
After Width: | Height: | Size: 255 B |
BIN
editor/icons/function.png
Normal file
|
After Width: | Height: | Size: 457 B |
BIN
editor/icons/hash.png
Normal file
|
After Width: | Height: | Size: 502 B |
BIN
editor/icons/inject.png
Normal file
|
After Width: | Height: | Size: 449 B |
BIN
editor/icons/join.png
Normal file
|
After Width: | Height: | Size: 253 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
BIN
editor/icons/light.png
Normal file
|
After Width: | Height: | Size: 639 B |
BIN
editor/icons/link-out.png
Normal file
|
After Width: | Height: | Size: 402 B |
|
Before Width: | Height: | Size: 414 B After Width: | Height: | Size: 414 B |
|
Before Width: | Height: | Size: 671 B After Width: | Height: | Size: 671 B |
BIN
editor/icons/node-changed.png
Normal file
|
After Width: | Height: | Size: 386 B |
BIN
editor/icons/node-error.png
Normal file
|
After Width: | Height: | Size: 386 B |
BIN
editor/icons/parser-csv.png
Normal file
|
After Width: | Height: | Size: 413 B |
BIN
editor/icons/parser-html.png
Normal file
|
After Width: | Height: | Size: 393 B |
BIN
editor/icons/parser-json.png
Normal file
|
After Width: | Height: | Size: 467 B |
BIN
editor/icons/parser-xml.png
Normal file
|
After Width: | Height: | Size: 393 B |
BIN
editor/icons/parser-yaml.png
Normal file
|
After Width: | Height: | Size: 423 B |
BIN
editor/icons/range.png
Normal file
|
After Width: | Height: | Size: 360 B |
|
Before Width: | Height: | Size: 736 B After Width: | Height: | Size: 736 B |
BIN
editor/icons/rpi.png
Normal file
|
After Width: | Height: | Size: 482 B |
BIN
editor/icons/serial.png
Normal file
|
After Width: | Height: | Size: 273 B |
BIN
editor/icons/sort.png
Normal file
|
After Width: | Height: | Size: 793 B |
BIN
editor/icons/split.png
Normal file
|
After Width: | Height: | Size: 256 B |
BIN
editor/icons/subflow.png
Normal file
|
After Width: | Height: | Size: 439 B |
BIN
editor/icons/swap.png
Normal file
|
After Width: | Height: | Size: 592 B |
BIN
editor/icons/switch.png
Normal file
|
After Width: | Height: | Size: 509 B |
BIN
editor/icons/template.png
Normal file
|
After Width: | Height: | Size: 488 B |
BIN
editor/icons/timer.png
Normal file
|
After Width: | Height: | Size: 628 B |
BIN
editor/icons/trigger.png
Normal file
|
After Width: | Height: | Size: 258 B |
BIN
editor/icons/twitter.png
Normal file
|
After Width: | Height: | Size: 404 B |
BIN
editor/icons/watch.png
Normal file
|
After Width: | Height: | Size: 591 B |
BIN
editor/icons/white-globe.png
Normal file
|
After Width: | Height: | Size: 707 B |
BIN
editor/images/deploy-flows-o.png
Normal file
|
After Width: | Height: | Size: 291 B |
BIN
editor/images/deploy-flows.png
Normal file
|
After Width: | Height: | Size: 386 B |
BIN
editor/images/deploy-full-o.png
Normal file
|
After Width: | Height: | Size: 289 B |
BIN
editor/images/deploy-full.png
Normal file
|
After Width: | Height: | Size: 368 B |
BIN
editor/images/deploy-nodes-o.png
Normal file
|
After Width: | Height: | Size: 290 B |
BIN
editor/images/deploy-nodes.png
Normal file
|
After Width: | Height: | Size: 392 B |
|
Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 192 B |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
BIN
editor/images/node-red.png
Normal file
|
After Width: | Height: | Size: 1019 B |
BIN
editor/images/pw_maze_white.png
Normal file
|
After Width: | Height: | Size: 600 B |
BIN
editor/images/subflow_tab.png
Normal file
|
After Width: | Height: | Size: 410 B |
BIN
editor/images/typedInput/09.png
Normal file
|
After Width: | Height: | Size: 638 B |
BIN
editor/images/typedInput/az.png
Normal file
|
After Width: | Height: | Size: 546 B |
BIN
editor/images/typedInput/bin.png
Normal file
|
After Width: | Height: | Size: 638 B |
BIN
editor/images/typedInput/bool.png
Normal file
|
After Width: | Height: | Size: 646 B |
BIN
editor/images/typedInput/env.png
Normal file
|
After Width: | Height: | Size: 809 B |
BIN
editor/images/typedInput/expr.png
Normal file
|
After Width: | Height: | Size: 563 B |
BIN
editor/images/typedInput/json.png
Normal file
|
After Width: | Height: | Size: 588 B |
BIN
editor/images/typedInput/re.png
Normal file
|
After Width: | Height: | Size: 502 B |
@@ -28,15 +28,6 @@ RED.comms = (function() {
|
|||||||
|
|
||||||
function connectWS() {
|
function connectWS() {
|
||||||
active = true;
|
active = true;
|
||||||
var wspath;
|
|
||||||
|
|
||||||
if (RED.settings.apiRootUrl) {
|
|
||||||
var m = /^(https?):\/\/(.*)$/.exec(RED.settings.apiRootUrl);
|
|
||||||
if (m) {
|
|
||||||
console.log(m);
|
|
||||||
wspath = "ws"+(m[1]==="https"?"s":"")+"://"+m[2]+"comms";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var path = location.hostname;
|
var path = location.hostname;
|
||||||
var port = location.port;
|
var port = location.port;
|
||||||
if (port.length !== 0) {
|
if (port.length !== 0) {
|
||||||
@@ -44,8 +35,7 @@ RED.comms = (function() {
|
|||||||
}
|
}
|
||||||
path = path+document.location.pathname;
|
path = path+document.location.pathname;
|
||||||
path = path+(path.slice(-1) == "/"?"":"/")+"comms";
|
path = path+(path.slice(-1) == "/"?"":"/")+"comms";
|
||||||
wspath = "ws"+(document.location.protocol=="https:"?"s":"")+"://"+path;
|
path = "ws"+(document.location.protocol=="https:"?"s":"")+"://"+path;
|
||||||
}
|
|
||||||
|
|
||||||
var auth_tokens = RED.settings.get("auth-tokens");
|
var auth_tokens = RED.settings.get("auth-tokens");
|
||||||
pendingAuth = (auth_tokens!=null);
|
pendingAuth = (auth_tokens!=null);
|
||||||
@@ -58,7 +48,7 @@ RED.comms = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ws = new WebSocket(wspath);
|
ws = new WebSocket(path);
|
||||||
ws.onopen = function() {
|
ws.onopen = function() {
|
||||||
reconnectAttempts = 0;
|
reconnectAttempts = 0;
|
||||||
if (errornotification) {
|
if (errornotification) {
|
||||||
@@ -75,30 +65,21 @@ RED.comms = (function() {
|
|||||||
}
|
}
|
||||||
ws.onmessage = function(event) {
|
ws.onmessage = function(event) {
|
||||||
var message = JSON.parse(event.data);
|
var message = JSON.parse(event.data);
|
||||||
if (message.auth) {
|
for (var m = 0; m < message.length; m++) {
|
||||||
if (pendingAuth) {
|
var msg = message[m];
|
||||||
if (message.auth === "ok") {
|
if (pendingAuth && msg.auth) {
|
||||||
|
if (msg.auth === "ok") {
|
||||||
pendingAuth = false;
|
pendingAuth = false;
|
||||||
completeConnection();
|
completeConnection();
|
||||||
} else if (message.auth === "fail") {
|
} else if (msg.auth === "fail") {
|
||||||
// anything else is an error...
|
// anything else is an error...
|
||||||
active = false;
|
active = false;
|
||||||
RED.user.login({updateMenu:true},function() {
|
RED.user.login({updateMenu:true},function() {
|
||||||
connectWS();
|
connectWS();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else if (message.auth === "fail") {
|
|
||||||
// Our current session has expired
|
|
||||||
active = false;
|
|
||||||
RED.user.login({updateMenu:true},function() {
|
|
||||||
connectWS();
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
} else {
|
else if (msg.topic) {
|
||||||
// Otherwise, 'message' is an array of actual comms messages
|
|
||||||
for (var m = 0; m < message.length; m++) {
|
|
||||||
var msg = message[m];
|
|
||||||
if (msg.topic) {
|
|
||||||
for (var t in subscriptions) {
|
for (var t in subscriptions) {
|
||||||
if (subscriptions.hasOwnProperty(t)) {
|
if (subscriptions.hasOwnProperty(t)) {
|
||||||
var re = new RegExp("^"+t.replace(/([\[\]\?\(\)\\\\$\^\*\.|])/g,"\\$1").replace(/\+/g,"[^/]+").replace(/\/#$/,"(\/.*)?")+"$");
|
var re = new RegExp("^"+t.replace(/([\[\]\?\(\)\\\\$\^\*\.|])/g,"\\$1").replace(/\+/g,"[^/]+").replace(/\/#$/,"(\/.*)?")+"$");
|
||||||
@@ -114,7 +95,6 @@ RED.comms = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
ws.onclose = function() {
|
ws.onclose = function() {
|
||||||
if (!active) {
|
if (!active) {
|
||||||
@@ -142,10 +122,10 @@ RED.comms = (function() {
|
|||||||
connectWS();
|
connectWS();
|
||||||
} else {
|
} else {
|
||||||
var msg = RED._("notification.errors.lostConnectionReconnect",{time: connectCountdown})+' <a href="#">'+ RED._("notification.errors.lostConnectionTry")+'</a>';
|
var msg = RED._("notification.errors.lostConnectionReconnect",{time: connectCountdown})+' <a href="#">'+ RED._("notification.errors.lostConnectionTry")+'</a>';
|
||||||
errornotification.update(msg,{silent:true});
|
errornotification.update(msg);
|
||||||
$(errornotification).find("a").on("click", function(e) {
|
$(errornotification).find("a").click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
errornotification.update(RED._("notification.errors.lostConnection"),{silent:true});
|
errornotification.update(RED._("notification.errors.lostConnection"));
|
||||||
clearInterval(connectCountdownTimer);
|
clearInterval(connectCountdownTimer);
|
||||||
connectWS();
|
connectWS();
|
||||||
})
|
})
|
||||||
@@ -32,19 +32,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function emit() {
|
function emit(evt,arg) {
|
||||||
var evt = arguments[0]
|
|
||||||
var args = Array.prototype.slice.call(arguments,1);
|
|
||||||
if (RED.events.DEBUG) {
|
|
||||||
console.warn(evt,args);
|
|
||||||
}
|
|
||||||
if (handlers[evt]) {
|
if (handlers[evt]) {
|
||||||
for (var i=0;i<handlers[evt].length;i++) {
|
for (var i=0;i<handlers[evt].length;i++) {
|
||||||
try {
|
try {
|
||||||
handlers[evt][i].apply(null, args);
|
handlers[evt][i](arg);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
console.warn("RED.events.emit error: ["+evt+"] "+(err.toString()));
|
console.log("RED.events.emit error: ["+evt+"] "+(err.toString()));
|
||||||
console.warn(err);
|
console.log(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
332
editor/js/history.js
Normal file
@@ -0,0 +1,332 @@
|
|||||||
|
/**
|
||||||
|
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
RED.history = (function() {
|
||||||
|
var undo_history = [];
|
||||||
|
|
||||||
|
function undoEvent(ev) {
|
||||||
|
var i;
|
||||||
|
var len;
|
||||||
|
var node;
|
||||||
|
var subflow;
|
||||||
|
var modifiedTabs = {};
|
||||||
|
if (ev) {
|
||||||
|
if (ev.t == 'multi') {
|
||||||
|
len = ev.events.length;
|
||||||
|
for (i=len-1;i>=0;i--) {
|
||||||
|
undoEvent(ev.events[i]);
|
||||||
|
}
|
||||||
|
} else if (ev.t == 'replace') {
|
||||||
|
RED.nodes.clear();
|
||||||
|
var imported = RED.nodes.import(ev.config);
|
||||||
|
imported[0].forEach(function(n) {
|
||||||
|
if (ev.changed[n.id]) {
|
||||||
|
n.changed = true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
RED.nodes.version(ev.rev);
|
||||||
|
} else if (ev.t == 'add') {
|
||||||
|
if (ev.nodes) {
|
||||||
|
for (i=0;i<ev.nodes.length;i++) {
|
||||||
|
node = RED.nodes.node(ev.nodes[i]);
|
||||||
|
if (node.z) {
|
||||||
|
modifiedTabs[node.z] = true;
|
||||||
|
}
|
||||||
|
RED.nodes.remove(ev.nodes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.links) {
|
||||||
|
for (i=0;i<ev.links.length;i++) {
|
||||||
|
RED.nodes.removeLink(ev.links[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.workspaces) {
|
||||||
|
for (i=0;i<ev.workspaces.length;i++) {
|
||||||
|
RED.nodes.removeWorkspace(ev.workspaces[i].id);
|
||||||
|
RED.workspaces.remove(ev.workspaces[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflows) {
|
||||||
|
for (i=0;i<ev.subflows.length;i++) {
|
||||||
|
RED.nodes.removeSubflow(ev.subflows[i]);
|
||||||
|
RED.workspaces.remove(ev.subflows[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflow) {
|
||||||
|
if (ev.subflow.instances) {
|
||||||
|
ev.subflow.instances.forEach(function(n) {
|
||||||
|
var node = RED.nodes.node(n.id);
|
||||||
|
if (node) {
|
||||||
|
node.changed = n.changed;
|
||||||
|
node.dirty = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (ev.subflow.hasOwnProperty('changed')) {
|
||||||
|
subflow = RED.nodes.subflow(ev.subflow.id);
|
||||||
|
if (subflow) {
|
||||||
|
subflow.changed = ev.subflow.changed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.removedLinks) {
|
||||||
|
for (i=0;i<ev.removedLinks.length;i++) {
|
||||||
|
RED.nodes.addLink(ev.removedLinks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (ev.t == "delete") {
|
||||||
|
if (ev.workspaces) {
|
||||||
|
for (i=0;i<ev.workspaces.length;i++) {
|
||||||
|
RED.nodes.addWorkspace(ev.workspaces[i]);
|
||||||
|
RED.workspaces.add(ev.workspaces[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflow && ev.subflow.subflow) {
|
||||||
|
RED.nodes.addSubflow(ev.subflow.subflow);
|
||||||
|
}
|
||||||
|
if (ev.subflowInputs && ev.subflowInputs.length > 0) {
|
||||||
|
subflow = RED.nodes.subflow(ev.subflowInputs[0].z);
|
||||||
|
subflow.in.push(ev.subflowInputs[0]);
|
||||||
|
subflow.in[0].dirty = true;
|
||||||
|
}
|
||||||
|
if (ev.subflowOutputs && ev.subflowOutputs.length > 0) {
|
||||||
|
subflow = RED.nodes.subflow(ev.subflowOutputs[0].z);
|
||||||
|
ev.subflowOutputs.sort(function(a,b) { return a.i-b.i});
|
||||||
|
for (i=0;i<ev.subflowOutputs.length;i++) {
|
||||||
|
var output = ev.subflowOutputs[i];
|
||||||
|
subflow.out.splice(output.i,0,output);
|
||||||
|
for (var j=output.i+1;j<subflow.out.length;j++) {
|
||||||
|
subflow.out[j].i++;
|
||||||
|
subflow.out[j].dirty = true;
|
||||||
|
}
|
||||||
|
RED.nodes.eachLink(function(l) {
|
||||||
|
if (l.source.type == "subflow:"+subflow.id) {
|
||||||
|
if (l.sourcePort >= output.i) {
|
||||||
|
l.sourcePort++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflow && ev.subflow.hasOwnProperty('instances')) {
|
||||||
|
ev.subflow.instances.forEach(function(n) {
|
||||||
|
var node = RED.nodes.node(n.id);
|
||||||
|
if (node) {
|
||||||
|
node.changed = n.changed;
|
||||||
|
node.dirty = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (subflow) {
|
||||||
|
RED.nodes.filterNodes({type:"subflow:"+subflow.id}).forEach(function(n) {
|
||||||
|
n.inputs = subflow.in.length;
|
||||||
|
n.outputs = subflow.out.length;
|
||||||
|
while (n.outputs > n.ports.length) {
|
||||||
|
n.ports.push(n.ports.length);
|
||||||
|
}
|
||||||
|
n.resize = true;
|
||||||
|
n.dirty = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (ev.nodes) {
|
||||||
|
for (i=0;i<ev.nodes.length;i++) {
|
||||||
|
RED.nodes.add(ev.nodes[i]);
|
||||||
|
modifiedTabs[ev.nodes[i].z] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.links) {
|
||||||
|
for (i=0;i<ev.links.length;i++) {
|
||||||
|
RED.nodes.addLink(ev.links[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.changes) {
|
||||||
|
for (i in ev.changes) {
|
||||||
|
if (ev.changes.hasOwnProperty(i)) {
|
||||||
|
node = RED.nodes.node(i);
|
||||||
|
if (node) {
|
||||||
|
for (var d in ev.changes[i]) {
|
||||||
|
if (ev.changes[i].hasOwnProperty(d)) {
|
||||||
|
node[d] = ev.changes[i][d];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node.dirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else if (ev.t == "move") {
|
||||||
|
for (i=0;i<ev.nodes.length;i++) {
|
||||||
|
var n = ev.nodes[i];
|
||||||
|
n.n.x = n.ox;
|
||||||
|
n.n.y = n.oy;
|
||||||
|
n.n.dirty = true;
|
||||||
|
n.n.moved = n.moved;
|
||||||
|
}
|
||||||
|
// A move could have caused a link splice
|
||||||
|
if (ev.links) {
|
||||||
|
for (i=0;i<ev.links.length;i++) {
|
||||||
|
RED.nodes.removeLink(ev.links[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.removedLinks) {
|
||||||
|
for (i=0;i<ev.removedLinks.length;i++) {
|
||||||
|
RED.nodes.addLink(ev.removedLinks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (ev.t == "edit") {
|
||||||
|
for (i in ev.changes) {
|
||||||
|
if (ev.changes.hasOwnProperty(i)) {
|
||||||
|
if (ev.node._def.defaults && ev.node._def.defaults[i] && ev.node._def.defaults[i].type) {
|
||||||
|
// This is a config node property
|
||||||
|
var currentConfigNode = RED.nodes.node(ev.node[i]);
|
||||||
|
if (currentConfigNode) {
|
||||||
|
currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1);
|
||||||
|
}
|
||||||
|
var newConfigNode = RED.nodes.node(ev.changes[i]);
|
||||||
|
if (newConfigNode) {
|
||||||
|
newConfigNode.users.push(ev.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ev.node[i] = ev.changes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflow) {
|
||||||
|
if (ev.subflow.hasOwnProperty('inputCount')) {
|
||||||
|
if (ev.node.in.length > ev.subflow.inputCount) {
|
||||||
|
ev.node.in.splice(ev.subflow.inputCount);
|
||||||
|
} else if (ev.subflow.inputs.length > 0) {
|
||||||
|
ev.node.in = ev.node.in.concat(ev.subflow.inputs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflow.hasOwnProperty('outputCount')) {
|
||||||
|
if (ev.node.out.length > ev.subflow.outputCount) {
|
||||||
|
ev.node.out.splice(ev.subflow.outputCount);
|
||||||
|
} else if (ev.subflow.outputs.length > 0) {
|
||||||
|
ev.node.out = ev.node.out.concat(ev.subflow.outputs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.subflow.hasOwnProperty('instances')) {
|
||||||
|
ev.subflow.instances.forEach(function(n) {
|
||||||
|
var node = RED.nodes.node(n.id);
|
||||||
|
if (node) {
|
||||||
|
node.changed = n.changed;
|
||||||
|
node.dirty = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
RED.editor.validateNode(ev.node);
|
||||||
|
RED.nodes.filterNodes({type:"subflow:"+ev.node.id}).forEach(function(n) {
|
||||||
|
n.inputs = ev.node.in.length;
|
||||||
|
n.outputs = ev.node.out.length;
|
||||||
|
RED.editor.updateNodeProperties(n);
|
||||||
|
RED.editor.validateNode(n);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var outputMap;
|
||||||
|
if (ev.outputMap) {
|
||||||
|
outputMap = {};
|
||||||
|
for (var port in ev.outputMap) {
|
||||||
|
if (ev.outputMap.hasOwnProperty(port) && ev.outputMap[port] !== "-1") {
|
||||||
|
outputMap[ev.outputMap[port]] = port;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RED.editor.updateNodeProperties(ev.node,outputMap);
|
||||||
|
RED.editor.validateNode(ev.node);
|
||||||
|
}
|
||||||
|
if (ev.links) {
|
||||||
|
for (i=0;i<ev.links.length;i++) {
|
||||||
|
RED.nodes.addLink(ev.links[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ev.node.dirty = true;
|
||||||
|
ev.node.changed = ev.changed;
|
||||||
|
} else if (ev.t == "createSubflow") {
|
||||||
|
if (ev.nodes) {
|
||||||
|
RED.nodes.filterNodes({z:ev.subflow.subflow.id}).forEach(function(n) {
|
||||||
|
n.z = ev.activeWorkspace;
|
||||||
|
n.dirty = true;
|
||||||
|
});
|
||||||
|
for (i=0;i<ev.nodes.length;i++) {
|
||||||
|
RED.nodes.remove(ev.nodes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev.links) {
|
||||||
|
for (i=0;i<ev.links.length;i++) {
|
||||||
|
RED.nodes.removeLink(ev.links[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RED.nodes.removeSubflow(ev.subflow.subflow);
|
||||||
|
RED.workspaces.remove(ev.subflow.subflow);
|
||||||
|
|
||||||
|
if (ev.removedLinks) {
|
||||||
|
for (i=0;i<ev.removedLinks.length;i++) {
|
||||||
|
RED.nodes.addLink(ev.removedLinks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (ev.t == "reorder") {
|
||||||
|
if (ev.order) {
|
||||||
|
RED.workspaces.order(ev.order);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Object.keys(modifiedTabs).forEach(function(id) {
|
||||||
|
var subflow = RED.nodes.subflow(id);
|
||||||
|
if (subflow) {
|
||||||
|
RED.editor.validateNode(subflow);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
RED.nodes.dirty(ev.dirty);
|
||||||
|
RED.view.redraw(true);
|
||||||
|
RED.palette.refresh();
|
||||||
|
RED.workspaces.refresh();
|
||||||
|
RED.sidebar.config.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
//TODO: this function is a placeholder until there is a 'save' event that can be listened to
|
||||||
|
markAllDirty: function() {
|
||||||
|
for (var i=0;i<undo_history.length;i++) {
|
||||||
|
undo_history[i].dirty = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
list: function() {
|
||||||
|
return undo_history
|
||||||
|
},
|
||||||
|
depth: function() {
|
||||||
|
return undo_history.length;
|
||||||
|
},
|
||||||
|
push: function(ev) {
|
||||||
|
undo_history.push(ev);
|
||||||
|
},
|
||||||
|
pop: function() {
|
||||||
|
var ev = undo_history.pop();
|
||||||
|
undoEvent(ev);
|
||||||
|
},
|
||||||
|
peek: function() {
|
||||||
|
return undo_history[undo_history.length-1];
|
||||||
|
},
|
||||||
|
clear: function() {
|
||||||
|
undo_history = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -16,14 +16,10 @@
|
|||||||
|
|
||||||
RED.i18n = (function() {
|
RED.i18n = (function() {
|
||||||
|
|
||||||
var apiRootUrl;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
init: function(options, done) {
|
init: function(done) {
|
||||||
apiRootUrl = options.apiRootUrl||"";
|
i18n.init({
|
||||||
var preferredLanguage = localStorage.getItem("editor-language");
|
resGetPath: 'locales/__ns__?lng=__lng__',
|
||||||
var opts = {
|
|
||||||
resGetPath: apiRootUrl+'locales/__ns__?lng=__lng__',
|
|
||||||
dynamicLoad: false,
|
dynamicLoad: false,
|
||||||
load:'current',
|
load:'current',
|
||||||
ns: {
|
ns: {
|
||||||
@@ -31,40 +27,17 @@ RED.i18n = (function() {
|
|||||||
defaultNs: "editor"
|
defaultNs: "editor"
|
||||||
},
|
},
|
||||||
fallbackLng: ['en-US'],
|
fallbackLng: ['en-US'],
|
||||||
useCookie: false,
|
useCookie: false
|
||||||
returnObjectTrees: true
|
},function() {
|
||||||
};
|
|
||||||
if (preferredLanguage) {
|
|
||||||
opts.lng = preferredLanguage;
|
|
||||||
}
|
|
||||||
i18n.init(opts,function() {
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
RED["_"] = function() {
|
RED["_"] = function() {
|
||||||
var v = i18n.t.apply(null,arguments);
|
return i18n.t.apply(null,arguments);
|
||||||
if (typeof v === 'string') {
|
|
||||||
return v;
|
|
||||||
} else {
|
|
||||||
return arguments[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
lang: function() {
|
loadCatalog: function(namespace,done) {
|
||||||
// Gets the active message catalog language. This is based on what
|
var languageList = i18n.functions.toLanguages(i18n.detectLanguage());
|
||||||
// locale the editor is using and what languages are available.
|
|
||||||
//
|
|
||||||
var preferredLangs = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
|
||||||
var knownLangs = RED.settings.theme("languages")||["en-US"];
|
|
||||||
for (var i=0;i<preferredLangs.length;i++) {
|
|
||||||
if (knownLangs.indexOf(preferredLangs[i]) > -1) {
|
|
||||||
return preferredLangs[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 'end-US'
|
|
||||||
},
|
|
||||||
loadNodeCatalog: function(namespace,done) {
|
|
||||||
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
|
||||||
var toLoad = languageList.length;
|
var toLoad = languageList.length;
|
||||||
languageList.forEach(function(lang) {
|
languageList.forEach(function(lang) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -72,7 +45,7 @@ RED.i18n = (function() {
|
|||||||
"Accept":"application/json"
|
"Accept":"application/json"
|
||||||
},
|
},
|
||||||
cache: false,
|
cache: false,
|
||||||
url: apiRootUrl+'nodes/'+namespace+'/messages?lng='+lang,
|
url: 'locales/'+namespace+'?lng='+lang,
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
i18n.addResourceBundle(lang,namespace,data);
|
i18n.addResourceBundle(lang,namespace,data);
|
||||||
toLoad--;
|
toLoad--;
|
||||||
@@ -86,7 +59,7 @@ RED.i18n = (function() {
|
|||||||
},
|
},
|
||||||
|
|
||||||
loadNodeCatalogs: function(done) {
|
loadNodeCatalogs: function(done) {
|
||||||
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
var languageList = i18n.functions.toLanguages(i18n.detectLanguage());
|
||||||
var toLoad = languageList.length;
|
var toLoad = languageList.length;
|
||||||
|
|
||||||
languageList.forEach(function(lang) {
|
languageList.forEach(function(lang) {
|
||||||
@@ -95,7 +68,7 @@ RED.i18n = (function() {
|
|||||||
"Accept":"application/json"
|
"Accept":"application/json"
|
||||||
},
|
},
|
||||||
cache: false,
|
cache: false,
|
||||||
url: apiRootUrl+'nodes/messages?lng='+lang,
|
url: 'locales/nodes?lng='+lang,
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
var namespaces = Object.keys(data);
|
var namespaces = Object.keys(data);
|
||||||
namespaces.forEach(function(ns) {
|
namespaces.forEach(function(ns) {
|
||||||
@@ -1,40 +1,25 @@
|
|||||||
{
|
{
|
||||||
"*": {
|
"*": {
|
||||||
"alt-shift-p":"core:manage-palette",
|
"ctrl-shift-p":"core:manage-palette",
|
||||||
"ctrl-f": "core:search",
|
"ctrl-f": "core:search",
|
||||||
"ctrl-shift-f": "core:list-flows",
|
|
||||||
"ctrl-=": "core:zoom-in",
|
"ctrl-=": "core:zoom-in",
|
||||||
"ctrl--": "core:zoom-out",
|
"ctrl--": "core:zoom-out",
|
||||||
"ctrl-0": "core:zoom-reset",
|
"ctrl-0": "core:zoom-reset",
|
||||||
"ctrl-enter": "core:confirm-edit-tray",
|
"ctrl-enter": "core:confirm-edit-tray",
|
||||||
"ctrl-escape": "core:cancel-edit-tray",
|
"ctrl-escape": "core:cancel-edit-tray",
|
||||||
"ctrl-d": "core:deploy-flows",
|
|
||||||
"ctrl-g i": "core:show-info-tab",
|
"ctrl-g i": "core:show-info-tab",
|
||||||
"ctrl-g h": "core:show-help-tab",
|
|
||||||
"ctrl-g d": "core:show-debug-tab",
|
"ctrl-g d": "core:show-debug-tab",
|
||||||
"ctrl-g c": "core:show-config-tab",
|
"ctrl-g c": "core:show-config-tab",
|
||||||
"ctrl-g x": "core:show-context-tab",
|
|
||||||
"ctrl-e": "core:show-export-dialog",
|
"ctrl-e": "core:show-export-dialog",
|
||||||
"ctrl-i": "core:show-import-dialog",
|
"ctrl-i": "core:show-import-dialog",
|
||||||
"ctrl-space": "core:toggle-sidebar",
|
"ctrl-space": "core:toggle-sidebar",
|
||||||
"ctrl-p": "core:toggle-palette",
|
|
||||||
"ctrl-,": "core:show-user-settings",
|
"ctrl-,": "core:show-user-settings",
|
||||||
"ctrl-alt-l": "core:clear-debug-messages",
|
|
||||||
"ctrl-alt-r": "core:show-remote-diff",
|
"ctrl-alt-r": "core:show-remote-diff",
|
||||||
"ctrl-alt-n": "core:new-project",
|
"ctrl-alt-n": "core:new-project",
|
||||||
"ctrl-alt-o": "core:open-project",
|
"ctrl-alt-o": "core:open-project",
|
||||||
"ctrl-g v": "core:show-version-control-tab",
|
"ctrl-g v": "core:show-version-control-tab"
|
||||||
"ctrl-shift-l": "core:show-event-log",
|
|
||||||
"ctrl-shift-p":"core:show-action-list"
|
|
||||||
},
|
},
|
||||||
"red-ui-sidebar-node-config": {
|
"workspace": {
|
||||||
"backspace": "core:delete-config-selection",
|
|
||||||
"delete": "core:delete-config-selection",
|
|
||||||
"ctrl-a": "core:select-all-config-nodes",
|
|
||||||
"ctrl-z": "core:undo",
|
|
||||||
"ctrl-y": "core:redo"
|
|
||||||
},
|
|
||||||
"red-ui-workspace": {
|
|
||||||
"backspace": "core:delete-selection",
|
"backspace": "core:delete-selection",
|
||||||
"delete": "core:delete-selection",
|
"delete": "core:delete-selection",
|
||||||
"enter": "core:edit-selected-node",
|
"enter": "core:edit-selected-node",
|
||||||
@@ -42,17 +27,8 @@
|
|||||||
"ctrl-x": "core:cut-selection-to-internal-clipboard",
|
"ctrl-x": "core:cut-selection-to-internal-clipboard",
|
||||||
"ctrl-v": "core:paste-from-internal-clipboard",
|
"ctrl-v": "core:paste-from-internal-clipboard",
|
||||||
"ctrl-z": "core:undo",
|
"ctrl-z": "core:undo",
|
||||||
"ctrl-y": "core:redo",
|
|
||||||
"ctrl-a": "core:select-all-nodes",
|
"ctrl-a": "core:select-all-nodes",
|
||||||
"shift-?": "core:show-help",
|
"shift-?": "core:show-help",
|
||||||
"w": "core:scroll-view-up",
|
|
||||||
"d": "core:scroll-view-right",
|
|
||||||
"s": "core:scroll-view-down",
|
|
||||||
"a": "core:scroll-view-left",
|
|
||||||
"shift-w": "core:step-view-up",
|
|
||||||
"shift-d": "core:step-view-right",
|
|
||||||
"shift-s": "core:step-view-down",
|
|
||||||
"shift-a": "core:step-view-left",
|
|
||||||
"up": "core:move-selection-up",
|
"up": "core:move-selection-up",
|
||||||
"right": "core:move-selection-right",
|
"right": "core:move-selection-right",
|
||||||
"down": "core:move-selection-down",
|
"down": "core:move-selection-down",
|
||||||
@@ -62,10 +38,6 @@
|
|||||||
"shift-down": "core:step-selection-down",
|
"shift-down": "core:step-selection-down",
|
||||||
"shift-left": "core:step-selection-left",
|
"shift-left": "core:step-selection-left",
|
||||||
"ctrl-shift-j": "core:show-previous-tab",
|
"ctrl-shift-j": "core:show-previous-tab",
|
||||||
"ctrl-shift-k": "core:show-next-tab",
|
"ctrl-shift-k": "core:show-next-tab"
|
||||||
"ctrl-shift-g": "core:group-selection",
|
|
||||||
"ctrl-shift-u": "core:ungroup-selection",
|
|
||||||
"ctrl-shift-c": "core:copy-group-style",
|
|
||||||
"ctrl-shift-v": "core:paste-group-style"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,10 +13,9 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
var RED = (function() {
|
(function() {
|
||||||
|
|
||||||
function appendNodeConfig(nodeConfig,done) {
|
function appendNodeConfig(nodeConfig) {
|
||||||
done = done || function(){};
|
|
||||||
var m = /<!-- --- \[red-module:(\S+)\] --- -->/.exec(nodeConfig.trim());
|
var m = /<!-- --- \[red-module:(\S+)\] --- -->/.exec(nodeConfig.trim());
|
||||||
var moduleId;
|
var moduleId;
|
||||||
if (m) {
|
if (m) {
|
||||||
@@ -25,57 +24,17 @@ var RED = (function() {
|
|||||||
moduleId = "unknown";
|
moduleId = "unknown";
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
var hasDeferred = false;
|
$("body").append(nodeConfig);
|
||||||
|
|
||||||
var nodeConfigEls = $("<div>"+nodeConfig+"</div>");
|
|
||||||
var scripts = nodeConfigEls.find("script");
|
|
||||||
var scriptCount = scripts.length;
|
|
||||||
scripts.each(function(i,el) {
|
|
||||||
var srcUrl = $(el).attr('src');
|
|
||||||
if (srcUrl && !/^\s*(https?:|\/|\.)/.test(srcUrl)) {
|
|
||||||
$(el).remove();
|
|
||||||
var newScript = document.createElement("script");
|
|
||||||
newScript.onload = function() {
|
|
||||||
scriptCount--;
|
|
||||||
if (scriptCount === 0) {
|
|
||||||
$("#red-ui-editor-node-configs").append(nodeConfigEls);
|
|
||||||
done()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($(el).attr('type') === "module") {
|
|
||||||
newScript.type = "module";
|
|
||||||
}
|
|
||||||
$("#red-ui-editor-node-configs").append(newScript);
|
|
||||||
newScript.src = RED.settings.apiRootUrl+srcUrl;
|
|
||||||
hasDeferred = true;
|
|
||||||
} else {
|
|
||||||
if (/\/ace.js$/.test(srcUrl) || /\/ext-language_tools.js$/.test(srcUrl)) {
|
|
||||||
// Block any attempts to load ace.js from a CDN - this will
|
|
||||||
// break the version of ace included in the editor.
|
|
||||||
// At the time of commit, the contrib-python nodes did this.
|
|
||||||
// This is a crude fix until the python nodes are fixed.
|
|
||||||
console.warn("Blocked attempt to load",srcUrl,"by",moduleId)
|
|
||||||
$(el).remove();
|
|
||||||
}
|
|
||||||
scriptCount--;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (!hasDeferred) {
|
|
||||||
$("#red-ui-editor-node-configs").append(nodeConfigEls);
|
|
||||||
done();
|
|
||||||
}
|
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
RED.notify(RED._("notification.errors.failedToAppendNode",{module:moduleId, error:err.toString()}),{
|
RED.notify(RED._("notification.errors.failedToAppendNode",{module:moduleId, error:err.toString()}),{
|
||||||
type: "error",
|
type: "error",
|
||||||
timeout: 10000
|
timeout: 10000
|
||||||
});
|
});
|
||||||
console.log("["+moduleId+"] "+err.toString());
|
console.log("["+moduleId+"] "+err.toString());
|
||||||
done();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadNodeList() {
|
function loadNodeList() {
|
||||||
loader.reportProgress(RED._("event.loadPalette"), 20)
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
headers: {
|
headers: {
|
||||||
"Accept":"application/json"
|
"Accept":"application/json"
|
||||||
@@ -84,7 +43,6 @@ var RED = (function() {
|
|||||||
url: 'nodes',
|
url: 'nodes',
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
RED.nodes.setNodeList(data);
|
RED.nodes.setNodeList(data);
|
||||||
loader.reportProgress(RED._("event.loadNodeCatalogs"), 25)
|
|
||||||
RED.i18n.loadNodeCatalogs(function() {
|
RED.i18n.loadNodeCatalogs(function() {
|
||||||
loadIconList(loadNodes);
|
loadIconList(loadNodes);
|
||||||
});
|
});
|
||||||
@@ -109,31 +67,25 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function loadNodes() {
|
function loadNodes() {
|
||||||
loader.reportProgress(RED._("event.loadNodes",{count:""}), 30)
|
|
||||||
var lang = localStorage.getItem("editor-language")||i18n.detectLanguage();
|
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
headers: {
|
headers: {
|
||||||
"Accept":"text/html",
|
"Accept":"text/html"
|
||||||
"Accept-Language": lang
|
|
||||||
},
|
},
|
||||||
cache: false,
|
cache: false,
|
||||||
url: 'nodes',
|
url: 'nodes',
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
var configs = data.trim().split(/(?=<!-- --- \[red-module:\S+\] --- -->)/);
|
var configs = data.trim().split(/(?=<!-- --- \[red-module:\S+\] --- -->)/);
|
||||||
var totalCount = configs.length;
|
configs.forEach(function(data) {
|
||||||
|
appendNodeConfig(data);
|
||||||
|
});
|
||||||
|
|
||||||
var stepConfig = function() {
|
$("body").i18n();
|
||||||
loader.reportProgress(RED._("event.loadNodes",{count:(totalCount-configs.length)+"/"+totalCount}), 30 + ((totalCount-configs.length)/totalCount)*40 )
|
$("#palette > .palette-spinner").hide();
|
||||||
|
$(".palette-scroll").removeClass("hide");
|
||||||
if (configs.length === 0) {
|
$("#palette-search").removeClass("hide");
|
||||||
$("#red-ui-editor").i18n();
|
loadFlows(function() {
|
||||||
$("#red-ui-palette > .red-ui-palette-spinner").hide();
|
|
||||||
$(".red-ui-palette-scroll").removeClass("hide");
|
|
||||||
$("#red-ui-palette-search").removeClass("hide");
|
|
||||||
if (RED.settings.theme("projects.enabled",false)) {
|
if (RED.settings.theme("projects.enabled",false)) {
|
||||||
RED.projects.refresh(function(activeProject) {
|
RED.projects.refresh(function(activeProject) {
|
||||||
loadFlows(function() {
|
|
||||||
RED.sidebar.info.refresh()
|
RED.sidebar.info.refresh()
|
||||||
if (!activeProject) {
|
if (!activeProject) {
|
||||||
// Projects enabled but no active project
|
// Projects enabled but no active project
|
||||||
@@ -147,26 +99,17 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
completeLoad();
|
completeLoad();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
loadFlows(function() {
|
|
||||||
// Projects disabled by the user
|
// Projects disabled by the user
|
||||||
RED.sidebar.info.refresh()
|
RED.sidebar.info.refresh()
|
||||||
completeLoad();
|
completeLoad();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
var config = configs.shift();
|
|
||||||
appendNodeConfig(config,stepConfig);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stepConfig();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadFlows(done) {
|
function loadFlows(done) {
|
||||||
loader.reportProgress(RED._("event.loadFlows"),80 )
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
headers: {
|
headers: {
|
||||||
"Accept":"application/json",
|
"Accept":"application/json",
|
||||||
@@ -177,23 +120,12 @@ var RED = (function() {
|
|||||||
if (nodes) {
|
if (nodes) {
|
||||||
var currentHash = window.location.hash;
|
var currentHash = window.location.hash;
|
||||||
RED.nodes.version(nodes.rev);
|
RED.nodes.version(nodes.rev);
|
||||||
loader.reportProgress(RED._("event.importFlows"),90 )
|
|
||||||
try {
|
|
||||||
RED.nodes.import(nodes.flows);
|
RED.nodes.import(nodes.flows);
|
||||||
RED.nodes.dirty(false);
|
RED.nodes.dirty(false);
|
||||||
RED.view.redraw(true);
|
RED.view.redraw(true);
|
||||||
if (/^#flow\/.+$/.test(currentHash)) {
|
if (/^#flow\/.+$/.test(currentHash)) {
|
||||||
RED.workspaces.show(currentHash.substring(6));
|
RED.workspaces.show(currentHash.substring(6));
|
||||||
}
|
}
|
||||||
} catch(err) {
|
|
||||||
RED.notify(
|
|
||||||
RED._("event.importError", {message: err.message}),
|
|
||||||
{
|
|
||||||
fixed: true,
|
|
||||||
type: 'error'
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
@@ -214,7 +146,6 @@ var RED = (function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (notificationId === "project-update") {
|
if (notificationId === "project-update") {
|
||||||
loader.start("Loading project",0)
|
|
||||||
RED.nodes.clear();
|
RED.nodes.clear();
|
||||||
RED.history.clear();
|
RED.history.clear();
|
||||||
RED.view.redraw(true);
|
RED.view.redraw(true);
|
||||||
@@ -230,8 +161,7 @@ var RED = (function() {
|
|||||||
"revert": RED._("notification.project.revert", {project: msg.project}),
|
"revert": RED._("notification.project.revert", {project: msg.project}),
|
||||||
"merge-complete": RED._("notification.project.merge-complete")
|
"merge-complete": RED._("notification.project.merge-complete")
|
||||||
}[msg.action];
|
}[msg.action];
|
||||||
loader.end()
|
RED.notify("<p>"+message+"</p>");
|
||||||
RED.notify($("<p>").text(message));
|
|
||||||
RED.sidebar.info.refresh()
|
RED.sidebar.info.refresh()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -248,17 +178,8 @@ var RED = (function() {
|
|||||||
id: notificationId
|
id: notificationId
|
||||||
}
|
}
|
||||||
if (notificationId === "runtime-state") {
|
if (notificationId === "runtime-state") {
|
||||||
if (msg.error === "safe-mode") {
|
if (msg.error === "missing-types") {
|
||||||
options.buttons = [
|
text+="<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
|
||||||
{
|
|
||||||
text: RED._("common.label.close"),
|
|
||||||
click: function() {
|
|
||||||
persistentNotifications[notificationId].hideNotification();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
} else if (msg.error === "missing-types") {
|
|
||||||
text+="<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
|
||||||
if (!!RED.projects.getActiveProject()) {
|
if (!!RED.projects.getActiveProject()) {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
@@ -286,7 +207,7 @@ var RED = (function() {
|
|||||||
if (RED.user.hasPermission("projects.write")) {
|
if (RED.user.hasPermission("projects.write")) {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
text: RED._("notification.project.setupCredentials"),
|
text: RED._("notification.label.setup-cred"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
RED.projects.showCredentialsPrompt();
|
RED.projects.showCredentialsPrompt();
|
||||||
@@ -308,7 +229,7 @@ var RED = (function() {
|
|||||||
if (RED.user.hasPermission("projects.write")) {
|
if (RED.user.hasPermission("projects.write")) {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
text: RED._("notification.project.setupProjectFiles"),
|
text: RED._("notification.label.setup-project"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
RED.projects.showFilesPrompt();
|
RED.projects.showFilesPrompt();
|
||||||
@@ -320,10 +241,10 @@ var RED = (function() {
|
|||||||
if (RED.user.hasPermission("projects.write")) {
|
if (RED.user.hasPermission("projects.write")) {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
text: RED._("notification.project.setupProjectFiles"),
|
text: RED._("notification.label.create-default-package"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
RED.projects.showFilesPrompt();
|
RED.projects.createDefaultPackageFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -332,13 +253,13 @@ var RED = (function() {
|
|||||||
if (RED.user.hasPermission("projects.write")) {
|
if (RED.user.hasPermission("projects.write")) {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
text: RED._("notification.project.no"),
|
text: RED._("notification.label.no-thanks"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: RED._("notification.project.createDefault"),
|
text: RED._("notification.label.create-default-project"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
RED.projects.createDefaultFileSet();
|
RED.projects.createDefaultFileSet();
|
||||||
@@ -352,7 +273,7 @@ var RED = (function() {
|
|||||||
if (RED.user.hasPermission("projects.write")) {
|
if (RED.user.hasPermission("projects.write")) {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
text: RED._("notification.project.mergeConflict"),
|
text: RED._("notification.label.show-merge-conflicts"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
RED.sidebar.versionControl.showLocalChanges();
|
RED.sidebar.versionControl.showLocalChanges();
|
||||||
@@ -376,13 +297,14 @@ var RED = (function() {
|
|||||||
var parts = topic.split("/");
|
var parts = topic.split("/");
|
||||||
var node = RED.nodes.node(parts[1]);
|
var node = RED.nodes.node(parts[1]);
|
||||||
if (node) {
|
if (node) {
|
||||||
if (msg.hasOwnProperty("text") && msg.text !== null && /^[a-zA-Z]/.test(msg.text)) {
|
if (msg.hasOwnProperty("text")) {
|
||||||
|
if (msg.text[0] !== ".") {
|
||||||
msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()});
|
msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
node.status = msg;
|
node.status = msg;
|
||||||
node.dirtyStatus = true;
|
|
||||||
node.dirty = true;
|
node.dirty = true;
|
||||||
RED.view.redrawStatus(node);
|
RED.view.redraw();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
RED.comms.subscribe("notification/node/#",function(topic,msg) {
|
RED.comms.subscribe("notification/node/#",function(topic,msg) {
|
||||||
@@ -395,14 +317,14 @@ var RED = (function() {
|
|||||||
var id = m.id;
|
var id = m.id;
|
||||||
RED.nodes.addNodeSet(m);
|
RED.nodes.addNodeSet(m);
|
||||||
addedTypes = addedTypes.concat(m.types);
|
addedTypes = addedTypes.concat(m.types);
|
||||||
RED.i18n.loadNodeCatalog(id, function() {
|
RED.i18n.loadCatalog(id, function() {
|
||||||
$.get('nodes/'+id, function(data) {
|
$.get('nodes/'+id, function(data) {
|
||||||
appendNodeConfig(data);
|
appendNodeConfig(data);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
if (addedTypes.length) {
|
if (addedTypes.length) {
|
||||||
typeList = "<ul><li>"+addedTypes.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+addedTypes.join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeAdded", {count:addedTypes.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeAdded", {count:addedTypes.length})+typeList,"success");
|
||||||
}
|
}
|
||||||
loadIconList();
|
loadIconList();
|
||||||
@@ -411,7 +333,7 @@ var RED = (function() {
|
|||||||
m = msg[i];
|
m = msg[i];
|
||||||
info = RED.nodes.removeNodeSet(m.id);
|
info = RED.nodes.removeNodeSet(m.id);
|
||||||
if (info.added) {
|
if (info.added) {
|
||||||
typeList = "<ul><li>"+m.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+m.types.join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeRemoved", {count:m.types.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeRemoved", {count:m.types.length})+typeList,"success");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -421,12 +343,12 @@ var RED = (function() {
|
|||||||
info = RED.nodes.getNodeSet(msg.id);
|
info = RED.nodes.getNodeSet(msg.id);
|
||||||
if (info.added) {
|
if (info.added) {
|
||||||
RED.nodes.enableNodeSet(msg.id);
|
RED.nodes.enableNodeSet(msg.id);
|
||||||
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeEnabled", {count:msg.types.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeEnabled", {count:msg.types.length})+typeList,"success");
|
||||||
} else {
|
} else {
|
||||||
$.get('nodes/'+msg.id, function(data) {
|
$.get('nodes/'+msg.id, function(data) {
|
||||||
appendNodeConfig(data);
|
appendNodeConfig(data);
|
||||||
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeAdded", {count:msg.types.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeAdded", {count:msg.types.length})+typeList,"success");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -434,24 +356,16 @@ var RED = (function() {
|
|||||||
} else if (topic == "notification/node/disabled") {
|
} else if (topic == "notification/node/disabled") {
|
||||||
if (msg.types) {
|
if (msg.types) {
|
||||||
RED.nodes.disableNodeSet(msg.id);
|
RED.nodes.disableNodeSet(msg.id);
|
||||||
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeDisabled", {count:msg.types.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeDisabled", {count:msg.types.length})+typeList,"success");
|
||||||
}
|
}
|
||||||
} else if (topic == "notification/node/upgraded") {
|
} else if (topic == "node/upgraded") {
|
||||||
RED.notify(RED._("palette.event.nodeUpgraded", {module:msg.module,version:msg.version}),"success");
|
RED.notify(RED._("palette.event.nodeUpgraded", {module:msg.module,version:msg.version}),"success");
|
||||||
RED.nodes.registry.setModulePendingUpdated(msg.module,msg.version);
|
RED.nodes.registry.setModulePendingUpdated(msg.module,msg.version);
|
||||||
}
|
}
|
||||||
|
// Refresh flow library to ensure any examples are updated
|
||||||
|
RED.library.loadFlowLibrary();
|
||||||
});
|
});
|
||||||
RED.comms.subscribe("event-log/#", function(topic,payload) {
|
|
||||||
var id = topic.substring(9);
|
|
||||||
RED.eventLog.log(id,payload);
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".red-ui-header-toolbar").show();
|
|
||||||
|
|
||||||
setTimeout(function() {
|
|
||||||
loader.end();
|
|
||||||
},100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function showAbout() {
|
function showAbout() {
|
||||||
@@ -460,11 +374,12 @@ var RED = (function() {
|
|||||||
'<img width="50px" src="red/images/node-red-icon.svg" />'+
|
'<img width="50px" src="red/images/node-red-icon.svg" />'+
|
||||||
'</div>';
|
'</div>';
|
||||||
|
|
||||||
RED.sidebar.help.set(aboutHeader+RED.utils.renderMarkdown(data));
|
RED.sidebar.info.set(aboutHeader+marked(data));
|
||||||
|
RED.sidebar.info.show();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildMainMenu() {
|
function loadEditor() {
|
||||||
var menuOptions = [];
|
var menuOptions = [];
|
||||||
if (RED.settings.theme("projects.enabled",false)) {
|
if (RED.settings.theme("projects.enabled",false)) {
|
||||||
menuOptions.push({id:"menu-item-projects-menu",label:RED._("menu.label.projects"),options:[
|
menuOptions.push({id:"menu-item-projects-menu",label:RED._("menu.label.projects"),options:[
|
||||||
@@ -473,20 +388,32 @@ var RED = (function() {
|
|||||||
{id:"menu-item-projects-settings",label:RED._("menu.label.projects-settings"),disabled:false,onselect:"core:show-project-settings"}
|
{id:"menu-item-projects-settings",label:RED._("menu.label.projects-settings"),disabled:false,onselect:"core:show-project-settings"}
|
||||||
]});
|
]});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
menuOptions.push({id:"menu-item-view-menu",label:RED._("menu.label.view.view"),options:[
|
menuOptions.push({id:"menu-item-view-menu",label:RED._("menu.label.view.view"),options:[
|
||||||
{id:"menu-item-palette",label:RED._("menu.label.palette.show"),toggle:true,onselect:"core:toggle-palette", selected: true},
|
// {id:"menu-item-view-show-grid",setting:"view-show-grid",label:RED._("menu.label.view.showGrid"),toggle:true,onselect:"core:toggle-show-grid"},
|
||||||
|
// {id:"menu-item-view-snap-grid",setting:"view-snap-grid",label:RED._("menu.label.view.snapGrid"),toggle:true,onselect:"core:toggle-snap-grid"},
|
||||||
|
// {id:"menu-item-status",setting:"node-show-status",label:RED._("menu.label.displayStatus"),toggle:true,onselect:"core:toggle-status", selected: true},
|
||||||
|
//null,
|
||||||
|
// {id:"menu-item-bidi",label:RED._("menu.label.view.textDir"),options:[
|
||||||
|
// {id:"menu-item-bidi-default",toggle:"text-direction",label:RED._("menu.label.view.defaultDir"),selected: true, onselect:function(s) { if(s){RED.text.bidi.setTextDirection("")}}},
|
||||||
|
// {id:"menu-item-bidi-ltr",toggle:"text-direction",label:RED._("menu.label.view.ltr"), onselect:function(s) { if(s){RED.text.bidi.setTextDirection("ltr")}}},
|
||||||
|
// {id:"menu-item-bidi-rtl",toggle:"text-direction",label:RED._("menu.label.view.rtl"), onselect:function(s) { if(s){RED.text.bidi.setTextDirection("rtl")}}},
|
||||||
|
// {id:"menu-item-bidi-auto",toggle:"text-direction",label:RED._("menu.label.view.auto"), onselect:function(s) { if(s){RED.text.bidi.setTextDirection("auto")}}}
|
||||||
|
// ]},
|
||||||
|
// null,
|
||||||
{id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true},
|
{id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true},
|
||||||
{id:"menu-item-event-log",label:RED._("eventLog.title"),onselect:"core:show-event-log"},
|
|
||||||
{id:"menu-item-action-list",label:RED._("keyboard.actionList"),onselect:"core:show-action-list"},
|
|
||||||
null
|
null
|
||||||
]});
|
]});
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
if (RED.settings.theme("menu.menu-item-import-library", true)) {
|
menuOptions.push({id:"menu-item-import",label:RED._("menu.label.import"),options:[
|
||||||
menuOptions.push({id: "menu-item-import", label: RED._("menu.label.import"), onselect: "core:show-import-dialog"});
|
{id:"menu-item-import-clipboard",label:RED._("menu.label.clipboard"),onselect:"core:show-import-dialog"},
|
||||||
}
|
{id:"menu-item-import-library",label:RED._("menu.label.library"),options:[]}
|
||||||
if (RED.settings.theme("menu.menu-item-export-library", true)) {
|
]});
|
||||||
menuOptions.push({id: "menu-item-export", label: RED._("menu.label.export"), onselect: "core:show-export-dialog"});
|
menuOptions.push({id:"menu-item-export",label:RED._("menu.label.export"),options:[
|
||||||
}
|
{id:"menu-item-export-clipboard",label:RED._("menu.label.clipboard"),onselect:"core:show-export-dialog"},
|
||||||
|
{id:"menu-item-export-library",label:RED._("menu.label.library"),disabled:true,onselect:"core:library-export"}
|
||||||
|
]});
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
menuOptions.push({id:"menu-item-search",label:RED._("menu.label.search"),onselect:"core:search"});
|
menuOptions.push({id:"menu-item-search",label:RED._("menu.label.search"),onselect:"core:search"});
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
@@ -500,14 +427,6 @@ var RED = (function() {
|
|||||||
{id:"menu-item-subflow-create",label:RED._("menu.label.createSubflow"),onselect:"core:create-subflow"},
|
{id:"menu-item-subflow-create",label:RED._("menu.label.createSubflow"),onselect:"core:create-subflow"},
|
||||||
{id:"menu-item-subflow-convert",label:RED._("menu.label.selectionToSubflow"),disabled:true,onselect:"core:convert-to-subflow"},
|
{id:"menu-item-subflow-convert",label:RED._("menu.label.selectionToSubflow"),disabled:true,onselect:"core:convert-to-subflow"},
|
||||||
]});
|
]});
|
||||||
menuOptions.push({id:"menu-item-group",label:RED._("menu.label.groups"), options: [
|
|
||||||
{id:"menu-item-group-group",label:RED._("menu.label.groupSelection"),disabled:true,onselect:"core:group-selection"},
|
|
||||||
{id:"menu-item-group-ungroup",label:RED._("menu.label.ungroupSelection"),disabled:true,onselect:"core:ungroup-selection"},
|
|
||||||
null,
|
|
||||||
{id:"menu-item-group-merge",label:RED._("menu.label.groupMergeSelection"),disabled:true,onselect:"core:merge-selection-to-group"},
|
|
||||||
{id:"menu-item-group-remove",label:RED._("menu.label.groupRemoveSelection"),disabled:true,onselect:"core:remove-selection-from-group"}
|
|
||||||
]});
|
|
||||||
|
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
if (RED.settings.theme('palette.editable') !== false) {
|
if (RED.settings.theme('palette.editable') !== false) {
|
||||||
menuOptions.push({id:"menu-item-edit-palette",label:RED._("menu.label.editPalette"),onselect:"core:manage-palette"});
|
menuOptions.push({id:"menu-item-edit-palette",label:RED._("menu.label.editPalette"),onselect:"core:manage-palette"});
|
||||||
@@ -517,9 +436,7 @@ var RED = (function() {
|
|||||||
menuOptions.push({id:"menu-item-user-settings",label:RED._("menu.label.settings"),onselect:"core:show-user-settings"});
|
menuOptions.push({id:"menu-item-user-settings",label:RED._("menu.label.settings"),onselect:"core:show-user-settings"});
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
|
|
||||||
if (RED.settings.theme("menu.menu-item-keyboard-shortcuts", true)) {
|
menuOptions.push({id:"menu-item-keyboard-shortcuts",label:RED._("menu.label.keyboardShortcuts"),onselect:"core:show-help"});
|
||||||
menuOptions.push({id: "menu-item-keyboard-shortcuts", label: RED._("menu.label.keyboardShortcuts"), onselect: "core:show-help"});
|
|
||||||
}
|
|
||||||
menuOptions.push({id:"menu-item-help",
|
menuOptions.push({id:"menu-item-help",
|
||||||
label: RED.settings.theme("menu.menu-item-help.label",RED._("menu.label.help")),
|
label: RED.settings.theme("menu.menu-item-help.label",RED._("menu.label.help")),
|
||||||
href: RED.settings.theme("menu.menu-item-help.url","http://nodered.org/docs")
|
href: RED.settings.theme("menu.menu-item-help.url","http://nodered.org/docs")
|
||||||
@@ -527,23 +444,12 @@ var RED = (function() {
|
|||||||
menuOptions.push({id:"menu-item-node-red-version", label:"v"+RED.settings.version, onselect: "core:show-about" });
|
menuOptions.push({id:"menu-item-node-red-version", label:"v"+RED.settings.version, onselect: "core:show-about" });
|
||||||
|
|
||||||
|
|
||||||
$('<li><a id="red-ui-header-button-sidemenu" class="button" href="#"><i class="fa fa-bars"></i></a></li>').appendTo(".red-ui-header-toolbar")
|
|
||||||
RED.menu.init({id:"red-ui-header-button-sidemenu",options: menuOptions});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadEditor() {
|
|
||||||
RED.workspaces.init();
|
|
||||||
RED.statusBar.init();
|
|
||||||
RED.view.init();
|
RED.view.init();
|
||||||
RED.userSettings.init();
|
RED.userSettings.init();
|
||||||
RED.user.init();
|
RED.user.init();
|
||||||
RED.notifications.init();
|
|
||||||
RED.library.init();
|
RED.library.init();
|
||||||
RED.keyboard.init();
|
RED.keyboard.init();
|
||||||
RED.palette.init();
|
RED.palette.init();
|
||||||
RED.eventLog.init();
|
|
||||||
|
|
||||||
if (RED.settings.theme('palette.editable') !== false) {
|
if (RED.settings.theme('palette.editable') !== false) {
|
||||||
RED.palette.editor.init();
|
RED.palette.editor.init();
|
||||||
} else {
|
} else {
|
||||||
@@ -559,113 +465,37 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RED.subflow.init();
|
RED.subflow.init();
|
||||||
RED.group.init();
|
RED.workspaces.init();
|
||||||
RED.clipboard.init();
|
RED.clipboard.init();
|
||||||
RED.search.init();
|
RED.search.init();
|
||||||
RED.actionList.init();
|
|
||||||
RED.editor.init();
|
RED.editor.init();
|
||||||
RED.diff.init();
|
RED.diff.init();
|
||||||
|
|
||||||
|
RED.menu.init({id:"btn-sidemenu",options: menuOptions});
|
||||||
|
|
||||||
RED.deploy.init(RED.settings.theme("deployButton",null));
|
RED.deploy.init(RED.settings.theme("deployButton",null));
|
||||||
|
RED.notifications.init();
|
||||||
|
|
||||||
buildMainMenu();
|
RED.actions.add("core:show-about", showAbout);
|
||||||
|
|
||||||
RED.nodes.init();
|
RED.nodes.init();
|
||||||
RED.comms.connect();
|
RED.comms.connect();
|
||||||
|
|
||||||
$("#red-ui-main-container").show();
|
$("#main-container").show();
|
||||||
|
$(".header-toolbar").show();
|
||||||
|
|
||||||
RED.actions.add("core:show-about", showAbout);
|
|
||||||
|
|
||||||
loadNodeList();
|
loadNodeList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
|
||||||
function buildEditor(options) {
|
if ((window.location.hostname !== "localhost") && (window.location.hostname !== "127.0.0.1")) {
|
||||||
var header = $('<div id="red-ui-header"></div>').appendTo(options.target);
|
document.title = document.title+" : "+window.location.hostname;
|
||||||
var logo = $('<span class="red-ui-header-logo"></span>').appendTo(header);
|
|
||||||
$('<ul class="red-ui-header-toolbar hide"></ul>').appendTo(header);
|
|
||||||
$('<div id="red-ui-header-shade" class="hide"></div>').appendTo(header);
|
|
||||||
$('<div id="red-ui-main-container" class="red-ui-sidebar-closed hide">'+
|
|
||||||
'<div id="red-ui-workspace"></div>'+
|
|
||||||
'<div id="red-ui-editor-stack"></div>'+
|
|
||||||
'<div id="red-ui-palette"></div>'+
|
|
||||||
'<div id="red-ui-sidebar"></div>'+
|
|
||||||
'<div id="red-ui-sidebar-separator"></div>'+
|
|
||||||
'</div>').appendTo(options.target);
|
|
||||||
$('<div id="red-ui-editor-node-configs"></div>').appendTo(options.target);
|
|
||||||
$('<div id="red-ui-full-shade" class="hide"></div>').appendTo(options.target);
|
|
||||||
|
|
||||||
loader.init().appendTo("#red-ui-main-container");
|
|
||||||
loader.start("...",0);
|
|
||||||
|
|
||||||
$.getJSON(options.apiRootUrl+"theme", function(theme) {
|
|
||||||
if (theme.header) {
|
|
||||||
if (theme.header.url) {
|
|
||||||
logo = $("<a>",{href:theme.header.url}).appendTo(logo);
|
|
||||||
}
|
|
||||||
if (theme.header.image) {
|
|
||||||
$('<img>',{src:theme.header.image}).appendTo(logo);
|
|
||||||
}
|
|
||||||
if (theme.header.title) {
|
|
||||||
$('<span>').html(theme.header.title).appendTo(logo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var initialised = false;
|
|
||||||
|
|
||||||
function init(options) {
|
|
||||||
if (initialised) {
|
|
||||||
throw new Error("RED already initialised");
|
|
||||||
}
|
|
||||||
initialised = true;
|
|
||||||
ace.require("ace/ext/language_tools");
|
ace.require("ace/ext/language_tools");
|
||||||
options = options || {};
|
|
||||||
options.apiRootUrl = options.apiRootUrl || "";
|
|
||||||
if (options.apiRootUrl && !/\/$/.test(options.apiRootUrl)) {
|
|
||||||
options.apiRootUrl = options.apiRootUrl+"/";
|
|
||||||
}
|
|
||||||
options.target = $("#red-ui-editor");
|
|
||||||
options.target.addClass("red-ui-editor");
|
|
||||||
|
|
||||||
buildEditor(options);
|
RED.i18n.init(function() {
|
||||||
|
RED.settings.init(loadEditor);
|
||||||
RED.i18n.init(options, function() {
|
|
||||||
RED.settings.init(options, loadEditor);
|
|
||||||
})
|
})
|
||||||
}
|
});
|
||||||
|
|
||||||
var loader = {
|
|
||||||
init: function() {
|
|
||||||
var wrapper = $('<div id="red-ui-loading-progress"></div>').hide();
|
|
||||||
var container = $('<div>').appendTo(wrapper);
|
|
||||||
var label = $('<div>',{class:"red-ui-loading-bar-label"}).appendTo(container);
|
|
||||||
var bar = $('<div>',{class:"red-ui-loading-bar"}).appendTo(container);
|
|
||||||
var fill =$('<span>').appendTo(bar);
|
|
||||||
return wrapper;
|
|
||||||
},
|
|
||||||
start: function(text, prcnt) {
|
|
||||||
if (text) {
|
|
||||||
loader.reportProgress(text,prcnt)
|
|
||||||
}
|
|
||||||
$("#red-ui-loading-progress").show();
|
|
||||||
},
|
|
||||||
reportProgress: function(text, prcnt) {
|
|
||||||
$(".red-ui-loading-bar-label").text(text);
|
|
||||||
$(".red-ui-loading-bar span").width(prcnt+"%")
|
|
||||||
},
|
|
||||||
end: function() {
|
|
||||||
$("#red-ui-loading-progress").hide();
|
|
||||||
loader.reportProgress("",0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
init: init,
|
|
||||||
loader: loader
|
|
||||||
}
|
|
||||||
})();
|
})();
|
||||||
@@ -13,5 +13,4 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
var RED = {};
|
||||||
module.exports = false
|
|
||||||
@@ -37,7 +37,7 @@ RED.settings = (function () {
|
|||||||
if (key === "auth-tokens") {
|
if (key === "auth-tokens") {
|
||||||
localStorage.setItem(key, JSON.stringify(value));
|
localStorage.setItem(key, JSON.stringify(value));
|
||||||
} else {
|
} else {
|
||||||
RED.utils.setMessageProperty(userSettings,key,value);
|
userSettings[key] = value;
|
||||||
saveUserSettings();
|
saveUserSettings();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -46,26 +46,16 @@ RED.settings = (function () {
|
|||||||
* If the key is not set in the localStorage it returns <i>undefined</i>
|
* If the key is not set in the localStorage it returns <i>undefined</i>
|
||||||
* Else return the JSON parsed value
|
* Else return the JSON parsed value
|
||||||
* @param key
|
* @param key
|
||||||
* @param defaultIfUndefined
|
|
||||||
* @returns {*}
|
* @returns {*}
|
||||||
*/
|
*/
|
||||||
var get = function (key,defaultIfUndefined) {
|
var get = function (key) {
|
||||||
if (!hasLocalStorage()) {
|
if (!hasLocalStorage()) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
if (key === "auth-tokens") {
|
if (key === "auth-tokens") {
|
||||||
return JSON.parse(localStorage.getItem(key));
|
return JSON.parse(localStorage.getItem(key));
|
||||||
} else {
|
} else {
|
||||||
var v;
|
return userSettings[key];
|
||||||
try {
|
|
||||||
v = RED.utils.getMessageProperty(userSettings,key);
|
|
||||||
if (v === undefined) {
|
|
||||||
v = defaultIfUndefined;
|
|
||||||
}
|
|
||||||
} catch(err) {
|
|
||||||
v = defaultIfUndefined;
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -99,22 +89,18 @@ RED.settings = (function () {
|
|||||||
userSettings = data;
|
userSettings = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
var init = function (options, done) {
|
var init = function (done) {
|
||||||
var accessTokenMatch = /[?&]access_token=(.*?)(?:$|&)/.exec(window.location.search);
|
var accessTokenMatch = /[?&]access_token=(.*?)(?:$|&)/.exec(window.location.search);
|
||||||
if (accessTokenMatch) {
|
if (accessTokenMatch) {
|
||||||
var accessToken = accessTokenMatch[1];
|
var accessToken = accessTokenMatch[1];
|
||||||
RED.settings.set("auth-tokens",{access_token: accessToken});
|
RED.settings.set("auth-tokens",{access_token: accessToken});
|
||||||
window.location.search = "";
|
window.location.search = "";
|
||||||
}
|
}
|
||||||
RED.settings.apiRootUrl = options.apiRootUrl;
|
|
||||||
|
|
||||||
$.ajaxSetup({
|
$.ajaxSetup({
|
||||||
beforeSend: function(jqXHR,settings) {
|
beforeSend: function(jqXHR,settings) {
|
||||||
// Only attach auth header for requests to relative paths
|
// Only attach auth header for requests to relative paths
|
||||||
if (!/^\s*(https?:|\/|\.)/.test(settings.url)) {
|
if (!/^\s*(https?:|\/|\.)/.test(settings.url)) {
|
||||||
if (options.apiRootUrl) {
|
|
||||||
settings.url = options.apiRootUrl+settings.url;
|
|
||||||
}
|
|
||||||
var auth_tokens = RED.settings.get("auth-tokens");
|
var auth_tokens = RED.settings.get("auth-tokens");
|
||||||
if (auth_tokens) {
|
if (auth_tokens) {
|
||||||
jqXHR.setRequestHeader("Authorization","Bearer "+auth_tokens.access_token);
|
jqXHR.setRequestHeader("Authorization","Bearer "+auth_tokens.access_token);
|
||||||
@@ -141,12 +127,6 @@ RED.settings = (function () {
|
|||||||
RED.settings.remove("auth-tokens");
|
RED.settings.remove("auth-tokens");
|
||||||
}
|
}
|
||||||
console.log("Node-RED: " + data.version);
|
console.log("Node-RED: " + data.version);
|
||||||
console.groupCollapsed("Versions");
|
|
||||||
console.log("jQuery",$().jquery)
|
|
||||||
console.log("jQuery UI",$.ui.version);
|
|
||||||
console.log("ACE",ace.version);
|
|
||||||
console.log("D3",d3.version);
|
|
||||||
console.groupEnd();
|
|
||||||
loadUserSettings(done);
|
loadUserSettings(done);
|
||||||
},
|
},
|
||||||
error: function(jqXHR,textStatus,errorThrown) {
|
error: function(jqXHR,textStatus,errorThrown) {
|
||||||
@@ -97,14 +97,14 @@ RED.text.bidi = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enforces the text direction for all the spans with style red-ui-text-bidi-aware under
|
* Enforces the text direction for all the spans with style bidiAware under
|
||||||
* workspace or sidebar div
|
* workspace or sidebar div
|
||||||
*/
|
*/
|
||||||
function enforceTextDirectionOnPage() {
|
function enforceTextDirectionOnPage() {
|
||||||
$("#red-ui-workspace").find('span.red-ui-text-bidi-aware').each(function() {
|
$("#workspace").find('span.bidiAware').each(function() {
|
||||||
$(this).attr("dir", resolveBaseTextDir($(this).html()));
|
$(this).attr("dir", resolveBaseTextDir($(this).html()));
|
||||||
});
|
});
|
||||||
$("#red-ui-sidebar").find('span.red-ui-text-bidi-aware').each(function() {
|
$("#sidebar").find('span.bidiAware').each(function() {
|
||||||
$(this).attr("dir", resolveBaseTextDir($(this).text()));
|
$(this).attr("dir", resolveBaseTextDir($(this).text()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1304,7 +1304,7 @@ RED.text.format = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
/*!
|
/**
|
||||||
* Returns the HTML representation of a given structured text
|
* Returns the HTML representation of a given structured text
|
||||||
* @param text - the structured text
|
* @param text - the structured text
|
||||||
* @param type - could be one of filepath, url, email
|
* @param type - could be one of filepath, url, email
|
||||||
@@ -1315,7 +1315,7 @@ RED.text.format = (function() {
|
|||||||
getHtml: function (text, type, args, isRtl, locale) {
|
getHtml: function (text, type, args, isRtl, locale) {
|
||||||
return getHandler(type).format(text, args, isRtl, true, locale);
|
return getHandler(type).format(text, args, isRtl, true, locale);
|
||||||
},
|
},
|
||||||
/*!
|
/**
|
||||||
* Handle Structured text correct display for a given HTML element.
|
* Handle Structured text correct display for a given HTML element.
|
||||||
* @param element - the element : should be of type div contenteditable=true
|
* @param element - the element : should be of type div contenteditable=true
|
||||||
* @param type - could be one of filepath, url, email
|
* @param type - could be one of filepath, url, email
|
||||||
@@ -12,27 +12,16 @@ RED.actions = (function() {
|
|||||||
function getAction(name) {
|
function getAction(name) {
|
||||||
return actions[name];
|
return actions[name];
|
||||||
}
|
}
|
||||||
function invokeAction(name,args) {
|
function invokeAction(name) {
|
||||||
if (actions.hasOwnProperty(name)) {
|
if (actions.hasOwnProperty(name)) {
|
||||||
actions[name](args);
|
actions[name]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function listActions() {
|
function listActions() {
|
||||||
var result = [];
|
var result = [];
|
||||||
Object.keys(actions).forEach(function(action) {
|
Object.keys(actions).forEach(function(action) {
|
||||||
var shortcut = RED.keyboard.getShortcut(action);
|
var shortcut = RED.keyboard.getShortcut(action);
|
||||||
var isUser = false;
|
result.push({id:action,scope:shortcut?shortcut.scope:undefined,key:shortcut?shortcut.key:undefined,user:shortcut?shortcut.user:undefined})
|
||||||
if (shortcut) {
|
|
||||||
isUser = shortcut.user;
|
|
||||||
} else {
|
|
||||||
isUser = !!RED.keyboard.getUserShortcut(action);
|
|
||||||
}
|
|
||||||
result.push({
|
|
||||||
id:action,
|
|
||||||
scope:shortcut?shortcut.scope:undefined,
|
|
||||||
key:shortcut?shortcut.key:undefined,
|
|
||||||
user:isUser
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||