Compare commits
344 Commits
2.2.1
...
fix-drag-h
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a16032a8ed | ||
|
|
deb9c4ecc0 | ||
|
|
62cd3b2061 | ||
|
|
7924907384 | ||
|
|
51d429f9ae | ||
|
|
267aebb9cb | ||
|
|
3f9ebb588e | ||
|
|
6f0de7c80e | ||
|
|
3ace7eeafd | ||
|
|
eb9f15e4e4 | ||
|
|
a147458120 | ||
|
|
afdb15dc58 | ||
|
|
98b4b0dce0 | ||
|
|
70f26e0bea | ||
|
|
b6ad396a6c | ||
|
|
e44bb57b0e | ||
|
|
5c10b16b65 | ||
|
|
7ec1d42808 | ||
|
|
03e9e89558 | ||
|
|
3057035dec | ||
|
|
4af72cc7ba | ||
|
|
f6aee81651 | ||
|
|
a22f569ca0 | ||
|
|
8043f5d865 | ||
|
|
2ef50ab71f | ||
|
|
192a4f5e7f | ||
|
|
1af56a7f00 | ||
|
|
d2fab7fddd | ||
|
|
1818b0281d | ||
|
|
09973ba8cf | ||
|
|
dd3174c40f | ||
|
|
f0293b8f52 | ||
|
|
d549a9ad92 | ||
|
|
0385c72a8f | ||
|
|
e223b20cbd | ||
|
|
a0f7e92e40 | ||
|
|
c87ff3ca26 | ||
|
|
82672a825d | ||
|
|
98d524e82d | ||
|
|
3d3090a8f2 | ||
|
|
5561e89201 | ||
|
|
9ed96de237 | ||
|
|
0f2420576a | ||
|
|
d1b74675d9 | ||
|
|
abb81a0bac | ||
|
|
05eb055b8c | ||
|
|
e8ddd6d16d | ||
|
|
8706998c8c | ||
|
|
06e0869767 | ||
|
|
7841fc6d3e | ||
|
|
1f7311deeb | ||
|
|
07a9e69e7b | ||
|
|
9bc8adc715 | ||
|
|
7845ebffc5 | ||
|
|
b985de6df2 | ||
|
|
11f6491889 | ||
|
|
b2ec040a8d | ||
|
|
424a53da4e | ||
|
|
963c289af7 | ||
|
|
c5af71e0a2 | ||
|
|
329008bf6d | ||
|
|
531dbc5f83 | ||
|
|
851a925956 | ||
|
|
5d4e01eea6 | ||
|
|
7484dc5b4c | ||
|
|
e04f5cb277 | ||
|
|
c513cff843 | ||
|
|
a4603a4396 | ||
|
|
bc5eafce66 | ||
|
|
5fb811eb4c | ||
|
|
84a3884ffc | ||
|
|
50ae29a08c | ||
|
|
bf8bfa582a | ||
|
|
492d1ef30e | ||
|
|
bd19c203e1 | ||
|
|
1141f9de86 | ||
|
|
7955a17a17 | ||
|
|
58085e39d1 | ||
|
|
bbc32c4cd0 | ||
|
|
3841039728 | ||
|
|
f04d954882 | ||
|
|
39602ff5f2 | ||
|
|
55ecc7a92c | ||
|
|
1148960d43 | ||
|
|
415107fbf0 | ||
|
|
437cc20198 | ||
|
|
32f78a99fd | ||
|
|
65c7855afd | ||
|
|
7f68e341da | ||
|
|
a2f750ed1a | ||
|
|
b74a42cdf5 | ||
|
|
95b35be541 | ||
|
|
ea747a3d58 | ||
|
|
9b644e3c47 | ||
|
|
3f776397d1 | ||
|
|
1ec75035ba | ||
|
|
97b7b7b968 | ||
|
|
135427dcc8 | ||
|
|
a2de514c05 | ||
|
|
f1bada7fd8 | ||
|
|
ea5d25c794 | ||
|
|
193e420eb3 | ||
|
|
8a972ee543 | ||
|
|
b51eb7326f | ||
|
|
be3b5b7fe2 | ||
|
|
3a7a606f6a | ||
|
|
294fc6b62f | ||
|
|
662a44fccf | ||
|
|
b0a5d4fb6f | ||
|
|
4fb8292618 | ||
|
|
539e5899e3 | ||
|
|
bee9e20827 | ||
|
|
12f527a120 | ||
|
|
bd626899df | ||
|
|
54d036715f | ||
|
|
54c87f81a6 | ||
|
|
5de078dc61 | ||
|
|
ff57de0753 | ||
|
|
9565aee3c5 | ||
|
|
f63da0c58b | ||
|
|
205dbc1a25 | ||
|
|
12c309fd50 | ||
|
|
f04e3d5338 | ||
|
|
dc03d0b300 | ||
|
|
3e16cc4912 | ||
|
|
fcdf252f03 | ||
|
|
b23fea9cb5 | ||
|
|
e714ff35c4 | ||
|
|
4054d0eca7 | ||
|
|
367f9b6232 | ||
|
|
194eb4e266 | ||
|
|
f717eb7388 | ||
|
|
e8f20285af | ||
|
|
0fec9c7c55 | ||
|
|
f8d0ed7ca6 | ||
|
|
020eaef5ba | ||
|
|
973b31521e | ||
|
|
59e513f130 | ||
|
|
62e730b621 | ||
|
|
f4bb62adbc | ||
|
|
48a528a4b8 | ||
|
|
5aba66ea78 | ||
|
|
c5efdf5ae3 | ||
|
|
15958cd4a3 | ||
|
|
edcdc6c97c | ||
|
|
143b807e9b | ||
|
|
861379c227 | ||
|
|
2fb9f62d0b | ||
|
|
84e02fc144 | ||
|
|
57ac90f837 | ||
|
|
10a45ece76 | ||
|
|
c88a177cb2 | ||
|
|
a63dfc4650 | ||
|
|
8924ac2783 | ||
|
|
4fffa2d0ba | ||
|
|
856d2ab266 | ||
|
|
750d2c76f5 | ||
|
|
47157049c0 | ||
|
|
22000f10df | ||
|
|
d802ce1484 | ||
|
|
4b10b9ffc3 | ||
|
|
552408f488 | ||
|
|
4884938036 | ||
|
|
cdcc8cc59a | ||
|
|
f7bd600715 | ||
|
|
0014fec63f | ||
|
|
812efde342 | ||
|
|
889f0e1569 | ||
|
|
3a26c5cd65 | ||
|
|
12a25c37aa | ||
|
|
4706e20a1d | ||
|
|
14c23051ee | ||
|
|
330ddfa3ad | ||
|
|
a1e9a14ef3 | ||
|
|
958f57085f | ||
|
|
646a786b75 | ||
|
|
c8516bc5f4 | ||
|
|
58e87b3ddf | ||
|
|
ea0abb70a2 | ||
|
|
908f9562f6 | ||
|
|
8131d9a640 | ||
|
|
e092f41074 | ||
|
|
79a90dc476 | ||
|
|
25962dbf39 | ||
|
|
8df53e441d | ||
|
|
6f89efa40b | ||
|
|
d6a1b4e71f | ||
|
|
a2c0e53f87 | ||
|
|
013af7619e | ||
|
|
aa302ecc32 | ||
|
|
99b049fe2d | ||
|
|
dbdd1b8671 | ||
|
|
8ba6a7436e | ||
|
|
6e35a9f682 | ||
|
|
78f456911a | ||
|
|
8f5d3dc49c | ||
|
|
97678577fb | ||
|
|
ce67737cc9 | ||
|
|
b9919b0a9c | ||
|
|
226f45d8d5 | ||
|
|
accbf6ecfc | ||
|
|
0aa80d82d9 | ||
|
|
ace5f81a17 | ||
|
|
21a0b33645 | ||
|
|
8b991e11a2 | ||
|
|
8f013776df | ||
|
|
c30aedd309 | ||
|
|
39f303fcd6 | ||
|
|
76c0e140cf | ||
|
|
ccb3c991a6 | ||
|
|
a7932da207 | ||
|
|
5fda20c330 | ||
|
|
1be6e4565f | ||
|
|
e606d0b1de | ||
|
|
b4bcb7ace2 | ||
|
|
a63fee1223 | ||
|
|
ae76ff0aaf | ||
|
|
bba819ba84 | ||
|
|
d0d0da6cb7 | ||
|
|
475113838a | ||
|
|
b8435efc97 | ||
|
|
780e41d6a6 | ||
|
|
6d0b55f753 | ||
|
|
c9fa5c7284 | ||
|
|
e97f4c4054 | ||
|
|
96d15b7505 | ||
|
|
2f77596034 | ||
|
|
5619c105aa | ||
|
|
9a6ee023b3 | ||
|
|
77e2e44abc | ||
|
|
32bddfdd47 | ||
|
|
c9aa654ef0 | ||
|
|
5e501857aa | ||
|
|
6b00aba039 | ||
|
|
14fa9cfa4b | ||
|
|
5633c5224e | ||
|
|
03763a1423 | ||
|
|
cf6df1556c | ||
|
|
cdc8a42393 | ||
|
|
a2fd705153 | ||
|
|
3388f699a0 | ||
|
|
5e197713ff | ||
|
|
50718495da | ||
|
|
b7b604aed4 | ||
|
|
a1f5cabbba | ||
|
|
c2aae6ddf6 | ||
|
|
8a40622815 | ||
|
|
cb88409102 | ||
|
|
b918b75414 | ||
|
|
37f0e36c98 | ||
|
|
c8dc2327a3 | ||
|
|
f660973168 | ||
|
|
cf2e7744f3 | ||
|
|
855d799b21 | ||
|
|
97dd1d0f4f | ||
|
|
5b5553b9a3 | ||
|
|
702545e0b2 | ||
|
|
fa2787eb5d | ||
|
|
0f37b326a0 | ||
|
|
7f9f551cfe | ||
|
|
ecf1847dd2 | ||
|
|
40a9dce869 | ||
|
|
a6696733fa | ||
|
|
d9bd736159 | ||
|
|
4f5f5d31a3 | ||
|
|
fad1325427 | ||
|
|
8b6678a453 | ||
|
|
c7f48a83c0 | ||
|
|
af0f02d63e | ||
|
|
497d63e67e | ||
|
|
4d048af384 | ||
|
|
3649f10600 | ||
|
|
49e69a54bd | ||
|
|
a0acc89fcb | ||
|
|
64d1a82920 | ||
|
|
2396e28479 | ||
|
|
db1ad0df63 | ||
|
|
c5de18caae | ||
|
|
e57774e121 | ||
|
|
b7ee46d400 | ||
|
|
6007132640 | ||
|
|
31b3a4c342 | ||
|
|
73ff852648 | ||
|
|
6d50eb5737 | ||
|
|
3c0b74005b | ||
|
|
93ff667df1 | ||
|
|
a8579fa68a | ||
|
|
10f77fdf1a | ||
|
|
99d824a999 | ||
|
|
97d2b5df15 | ||
|
|
84a9cf7adf | ||
|
|
a49927f173 | ||
|
|
6a5c50ff77 | ||
|
|
c948573c2d | ||
|
|
5233bc501c | ||
|
|
ad96c6f838 | ||
|
|
0e92f68b4a | ||
|
|
ac97e8c613 | ||
|
|
95fe717ca7 | ||
|
|
10b18de3e0 | ||
|
|
08295eb807 | ||
|
|
fce4f0c116 | ||
|
|
cf1424976f | ||
|
|
94e8fce40a | ||
|
|
ea671bf395 | ||
|
|
fdb868516f | ||
|
|
c75bebfc90 | ||
|
|
3e102ef760 | ||
|
|
c07eddbd97 | ||
|
|
e85b925f40 | ||
|
|
27761ba6f2 | ||
|
|
b665698e78 | ||
|
|
97ebe33d68 | ||
|
|
249f7e45fb | ||
|
|
c0612e6193 | ||
|
|
79a789c557 | ||
|
|
450888f542 | ||
|
|
380a08242a | ||
|
|
e653a933f1 | ||
|
|
bda5dffa34 | ||
|
|
29df7e84a1 | ||
|
|
19cf43a10e | ||
|
|
0398ef3b90 | ||
|
|
8c19daf949 | ||
|
|
e4f0688a02 | ||
|
|
25f4fbf2bb | ||
|
|
0533c08438 | ||
|
|
5f0ea85f47 | ||
|
|
6c7c1202ed | ||
|
|
669aa769c2 | ||
|
|
fba95e6a42 | ||
|
|
95d3a8cc22 | ||
|
|
9f98b4b082 | ||
|
|
63ebadc526 | ||
|
|
fe47b07229 | ||
|
|
62315fd478 | ||
|
|
c6104195f6 | ||
|
|
56b85e4194 | ||
|
|
6431c43d0e | ||
|
|
a62107fbd1 | ||
|
|
2f66915a9f | ||
|
|
a508177e21 | ||
|
|
5a9d858604 | ||
|
|
514da83961 |
2
.github/workflows/release.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
path: 'node-red.github.io'
|
path: 'node-red.github.io'
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: '12'
|
node-version: '16'
|
||||||
- run: node ./node-red/.github/scripts/update-node-red-docker.js
|
- run: node ./node-red/.github/scripts/update-node-red-docker.js
|
||||||
- name: Create Docker Pull Request
|
- name: Create Docker Pull Request
|
||||||
uses: peter-evans/create-pull-request@v2
|
uses: peter-evans/create-pull-request@v2
|
||||||
|
|||||||
2
.github/workflows/tests.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [12, 14, 16]
|
node-version: [14, 16]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
|||||||
119
CHANGELOG.md
@@ -1,3 +1,122 @@
|
|||||||
|
#### 3.0.0-beta.2: Beta Release
|
||||||
|
|
||||||
|
**Migration from 2.x**
|
||||||
|
|
||||||
|
- The 'slice wires' action has changed from Ctrl-RightMouseButton to Alt-LeftMouseButton
|
||||||
|
|
||||||
|
Editor
|
||||||
|
|
||||||
|
- Rework Junctions to be more node like in their event handling (#3607) @knolleary
|
||||||
|
- Change slicing / slice-junction operations over to mouse button 0 (Left Mouse Button) (#3609) @Steve-Mcl
|
||||||
|
- Do not slice-junction link node wires (#3608) @knolleary
|
||||||
|
- Handle many-to-one slicing of wires (#3604) @knolleary
|
||||||
|
- Ensure ACE worker options are set (#3611) @Steve-Mcl
|
||||||
|
- Remove duplicate history add of ungroup event (#3605) @knolleary
|
||||||
|
- use text width instead of number of characters for deciding select fi… (#3603) @HiroyasuNishiyama
|
||||||
|
- Update Japanese info of link call node reflecting update of English info (#3600) @HiroyasuNishiyama
|
||||||
|
- Fix typedInput label not visible on themes (#3580) @bonanitech
|
||||||
|
- Fix project switching when junctions are present (#3595) @Steve-Mcl
|
||||||
|
- Fix junction: when wiring from a regular nodes INPUT, backwards to a junction (#3591) @Steve-Mcl
|
||||||
|
- Fix error initialising flow tab editor (#3585) @Steve-Mcl
|
||||||
|
- Add Japanese translations for v3.0-beta.1 (#3576) @kazuhitoyokoi
|
||||||
|
- Fix image paths where `red/image/typedInput/XXXX.png` should be `red/image/typedInput/XXXX.svg` (#3592) @kazuhitoyokoi
|
||||||
|
- Fix browser console error Uncaught TypeError when searching certain terms (#3584) @Steve-Mcl
|
||||||
|
|
||||||
|
Runtime
|
||||||
|
|
||||||
|
- fix error on system-info action (#3589) @HiroyasuNishiyama
|
||||||
|
|
||||||
|
Nodes
|
||||||
|
|
||||||
|
- I18n switch rule selector (#3602) @HiroyasuNishiyama
|
||||||
|
- Handle removal of event handlers to allow mqtt client.end() to work (#3594) @PhilDay-CT
|
||||||
|
- update link-call node info according to current behavior (#3597) @HiroyasuNishiyama
|
||||||
|
|
||||||
|
|
||||||
|
#### 3.0.0-beta.1: Beta Release
|
||||||
|
|
||||||
|
**Migration from 2.x**
|
||||||
|
|
||||||
|
- Node-RED now requires Node.js 14.x or later.
|
||||||
|
- New installs of Node-RED will default to the monaco editor.
|
||||||
|
|
||||||
|
|
||||||
|
Editor
|
||||||
|
|
||||||
|
- Add Junctions (#3462) @knolleary
|
||||||
|
- Allow node name to be auto-generated when added (#3478, #3538) @knolleary
|
||||||
|
- Set monaco as default code editor as of v3.x (#3543) @Steve-Mcl
|
||||||
|
- Update Monaco to V0.33.0 (#3522) @Steve-Mcl
|
||||||
|
- Auto-complete Improvements (#3521) @Steve-Mcl
|
||||||
|
- Add a tooltip to debug sidebar messages to reveal full path to node (#3503) @knolleary
|
||||||
|
- Fix down arrow triggering menu in search box (#3507) @Steve-Mcl
|
||||||
|
- Add Japanese translations for v3.0 (#3512) @kazuhitoyokoi
|
||||||
|
- Add feature: Continuous search tools (search previous, search next) (#3405) @Steve-Mcl
|
||||||
|
- Add feature: split-wire-to-links (#3399, #3476) @Steve-Mcl
|
||||||
|
- Add copy button to node properties tables (#3390) @knolleary
|
||||||
|
- Add info-tab search options dropdown to the regular search (#3395) @Steve-Mcl
|
||||||
|
- New Feature: Add ability to find modified nodes/flows. (#3392) @Steve-Mcl
|
||||||
|
- Code editor ux improvements around remembering state of each code editor in a flow (#3553) @Steve-Mcl
|
||||||
|
- Make it easier to apply themes on SVG icons (#3515) @bonanitech
|
||||||
|
- Add support of property validation message (#3438) @HiroyasuNishiyama
|
||||||
|
- Ensure node validation tooltip is closed when field becomes valid (#3570) @knolleary
|
||||||
|
- Add "search for" buttons to notifications (#3567) @Steve-Mcl
|
||||||
|
- Don't let themes change node config colors (#3564) @bonanitech
|
||||||
|
- Fix gap between typedInput containers borders (#3560) @bonanitech
|
||||||
|
- Fix recording removed links in edit history (#3547) @knolleary
|
||||||
|
- Remove unused SASS vars (#3536) @bonanitech
|
||||||
|
- Add custom style for jQuery widgets borders (#3537) @bonanitech
|
||||||
|
- fix out of scope reference of hasUnusedConfig variable (#3535) @HiroyasuNishiyama
|
||||||
|
- correct "non string" check parenthesis (#3524) @Steve-Mcl
|
||||||
|
- Ensure i18n of scoped package name (#3516) @Steve-Mcl
|
||||||
|
- Prevent shortcut deploy when deploy button shaded (#3517) @Steve-Mcl
|
||||||
|
- Fix: Sidebar "Configuration" filter button tooltip (#3500) @ralphwetzel
|
||||||
|
- Add the ability to customize diff colors even more (#3499) @bonanitech
|
||||||
|
- Do JSON comparison of old value/new value in editor (#3481) @Steve-Mcl
|
||||||
|
- Fix nodes losing their wires when in an iframe (#3484) @zettca
|
||||||
|
- Improve scroll into view (#3468) @Steve-Mcl
|
||||||
|
- Do not show 1st tab if hidden when loading (#3464) @Steve-Mcl
|
||||||
|
|
||||||
|
Runtime
|
||||||
|
|
||||||
|
- Fix importing external module from node-red module (#3541) @knolleary
|
||||||
|
- Add support for multiple static paths with optional static root (#3542) @Steve-Mcl
|
||||||
|
- Store external token when authenticating if provided (#3460) @ArFe
|
||||||
|
- Support OAuth/OpenID logout (#3388) @mw75
|
||||||
|
- Allow adminAuth to auto-login users when using passport strategy (#3519) @knolleary
|
||||||
|
- Add runtime diagnostics admin endpoint (#3511) @Steve-Mcl
|
||||||
|
- Don't start if user has no home directory (#3540) @hardillb
|
||||||
|
- Error on invalid encrypted credentials (#3498) @sammachin
|
||||||
|
|
||||||
|
Nodes
|
||||||
|
|
||||||
|
- Debug: Add message count option to Debug status (#3544 #3551) @rafaelmuynarsk @knolleary
|
||||||
|
- File: Change basic Filename field to a typedInput (#3533) @Steve-Mcl
|
||||||
|
- HTTP Request: Add UI for Http Request node headers (#3488) @Steve-Mcl
|
||||||
|
- Inject: let inject optionally fire at start in only at time mode. (#3385) @dceejay
|
||||||
|
- Link Call: Dynamic link call (#3463) @Steve-Mcl
|
||||||
|
- Link Call: Display link targets of nodes in a regular flow, for Link Call nodes inside a subflow (#3528) @Steve-Mcl
|
||||||
|
- MQTT: MQTT payload auto parsing improvements (#3530) @Steve-Mcl
|
||||||
|
- MQTT: Add client and Runtime MQTT topic validation (#3563) @Steve-Mcl [dev]
|
||||||
|
- MQTT: save and restore v5 config user props (#3562) @Steve-Mcl
|
||||||
|
- MQTT: Fix incorrect MQTT status (#3552) @Steve-Mcl
|
||||||
|
- MQTT: fix reference error of msg.status in debug node (#3526) @HiroyasuNishiyama
|
||||||
|
- MQTT: Add unit tests for MQTT nodes (#3497) @Steve-Mcl
|
||||||
|
- MQTT: fix typo of will properties (#3502) @Steve-Mcl
|
||||||
|
- MQTT: ensure mqtt v5 props can be set false (#3472) @Steve-Mcl
|
||||||
|
- Switch: add check for NaN in is of type number to be false (#3409) @dceejay
|
||||||
|
- TCP: TCP node better split (#3465) @dceejay
|
||||||
|
- Watch: Update Watch node to use node-watch module (#3559 #3569) @knolleary
|
||||||
|
- WebSocket: call done after ws disconnects (#3531) @Steve-Mcl
|
||||||
|
|
||||||
|
|
||||||
|
#### 2.2.2: Maintenance Release
|
||||||
|
|
||||||
|
Nodes
|
||||||
|
|
||||||
|
- Fix "close timed out" error when performing full deploy or modifying broker node. (#3451) @Steve-Mcl
|
||||||
|
|
||||||
|
|
||||||
#### 2.2.1: Maintenance Release
|
#### 2.2.1: Maintenance Release
|
||||||
|
|
||||||
Editor
|
Editor
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/autoComplete.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/autoComplete.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/diagnostics.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js",
|
||||||
|
|||||||
67
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "node-red",
|
"name": "node-red",
|
||||||
"version": "2.2.1",
|
"version": "3.0.0-beta.2",
|
||||||
"description": "Low-code programming for event-driven applications",
|
"description": "Low-code programming for event-driven applications",
|
||||||
"homepage": "http://nodered.org",
|
"homepage": "http://nodered.org",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
@@ -26,56 +26,57 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"acorn": "8.7.0",
|
"acorn": "8.7.1",
|
||||||
"acorn-walk": "8.2.0",
|
"acorn-walk": "8.2.0",
|
||||||
"ajv": "8.10.0",
|
"ajv": "8.11.0",
|
||||||
"async-mutex": "0.3.2",
|
"async-mutex": "0.3.2",
|
||||||
"basic-auth": "2.0.1",
|
"basic-auth": "2.0.1",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"body-parser": "1.19.1",
|
"body-parser": "1.20.0",
|
||||||
"cheerio": "1.0.0-rc.10",
|
"cheerio": "1.0.0-rc.10",
|
||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"content-type": "1.0.4",
|
"content-type": "1.0.4",
|
||||||
"cookie": "0.4.2",
|
"cookie": "0.5.0",
|
||||||
"cookie-parser": "1.4.6",
|
"cookie-parser": "1.4.6",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"cronosjs": "1.7.1",
|
"cronosjs": "1.7.1",
|
||||||
"denque": "2.0.1",
|
"denque": "2.0.1",
|
||||||
"express": "4.17.2",
|
"express": "4.18.1",
|
||||||
"express-session": "1.17.2",
|
"express-session": "1.17.3",
|
||||||
"form-data": "4.0.0",
|
"form-data": "4.0.0",
|
||||||
"fs-extra": "10.0.0",
|
"fs-extra": "10.1.0",
|
||||||
"fs.notify": "0.0.4",
|
|
||||||
"got": "11.8.3",
|
"got": "11.8.3",
|
||||||
"hash-sum": "2.0.0",
|
"hash-sum": "2.0.0",
|
||||||
"hpagent": "0.1.2",
|
"hpagent": "1.0.0",
|
||||||
"https-proxy-agent": "5.0.0",
|
"https-proxy-agent": "5.0.1",
|
||||||
"i18next": "21.6.11",
|
"i18next": "21.8.2",
|
||||||
"iconv-lite": "0.6.3",
|
"iconv-lite": "0.6.3",
|
||||||
"is-utf8": "0.2.1",
|
"is-utf8": "0.2.1",
|
||||||
"js-yaml": "3.14.1",
|
"js-yaml": "4.1.0",
|
||||||
"json-stringify-safe": "5.0.1",
|
"json-stringify-safe": "5.0.1",
|
||||||
"jsonata": "1.8.6",
|
"jsonata": "1.8.6",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
"media-typer": "1.1.0",
|
"media-typer": "1.1.0",
|
||||||
"memorystore": "1.6.7",
|
"memorystore": "1.6.7",
|
||||||
"mime": "3.0.0",
|
"mime": "3.0.0",
|
||||||
|
"moment": "2.29.3",
|
||||||
"moment-timezone": "0.5.34",
|
"moment-timezone": "0.5.34",
|
||||||
"mqtt": "4.3.5",
|
"mqtt": "4.3.7",
|
||||||
"multer": "1.4.4",
|
"multer": "1.4.4",
|
||||||
"mustache": "4.2.0",
|
"mustache": "4.2.0",
|
||||||
"node-red-admin": "^2.2.3",
|
"node-red-admin": "^3.0.0",
|
||||||
|
"node-watch": "0.7.3",
|
||||||
"nopt": "5.0.0",
|
"nopt": "5.0.0",
|
||||||
"oauth2orize": "1.11.1",
|
"oauth2orize": "1.11.1",
|
||||||
"on-headers": "1.0.2",
|
"on-headers": "1.0.2",
|
||||||
"passport": "0.5.2",
|
"passport": "0.5.2",
|
||||||
"passport-http-bearer": "1.0.1",
|
"passport-http-bearer": "1.0.1",
|
||||||
"passport-oauth2-client-password": "0.1.2",
|
"passport-oauth2-client-password": "0.1.2",
|
||||||
"raw-body": "2.4.3",
|
"raw-body": "2.5.1",
|
||||||
"semver": "7.3.5",
|
"semver": "7.3.7",
|
||||||
"tar": "6.1.11",
|
"tar": "6.1.11",
|
||||||
"tough-cookie": "4.0.0",
|
"tough-cookie": "4.0.0",
|
||||||
"uglify-js": "3.15.1",
|
"uglify-js": "3.15.5",
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
"ws": "7.5.6",
|
"ws": "7.5.6",
|
||||||
"xml2js": "0.4.23"
|
"xml2js": "0.4.23"
|
||||||
@@ -84,18 +85,18 @@
|
|||||||
"bcrypt": "5.0.1"
|
"bcrypt": "5.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"dompurify": "2.3.5",
|
"dompurify": "2.3.8",
|
||||||
"grunt": "1.4.1",
|
"grunt": "1.5.3",
|
||||||
"grunt-chmod": "~1.1.1",
|
"grunt-chmod": "~1.1.1",
|
||||||
"grunt-cli": "~1.4.3",
|
"grunt-cli": "~1.4.3",
|
||||||
"grunt-concurrent": "3.0.0",
|
"grunt-concurrent": "3.0.0",
|
||||||
"grunt-contrib-clean": "~2.0.0",
|
"grunt-contrib-clean": "2.0.1",
|
||||||
"grunt-contrib-compress": "2.0.0",
|
"grunt-contrib-compress": "2.0.0",
|
||||||
"grunt-contrib-concat": "~1.0.1",
|
"grunt-contrib-concat": "2.1.0",
|
||||||
"grunt-contrib-copy": "~1.0.0",
|
"grunt-contrib-copy": "1.0.0",
|
||||||
"grunt-contrib-jshint": "3.1.1",
|
"grunt-contrib-jshint": "3.2.0",
|
||||||
"grunt-contrib-uglify": "5.0.1",
|
"grunt-contrib-uglify": "5.2.1",
|
||||||
"grunt-contrib-watch": "~1.1.0",
|
"grunt-contrib-watch": "1.1.0",
|
||||||
"grunt-jsdoc": "2.4.1",
|
"grunt-jsdoc": "2.4.1",
|
||||||
"grunt-jsdoc-to-markdown": "6.0.0",
|
"grunt-jsdoc-to-markdown": "6.0.0",
|
||||||
"grunt-jsonlint": "2.1.3",
|
"grunt-jsonlint": "2.1.3",
|
||||||
@@ -104,22 +105,22 @@
|
|||||||
"grunt-sass": "~3.1.0",
|
"grunt-sass": "~3.1.0",
|
||||||
"grunt-simple-mocha": "~0.4.1",
|
"grunt-simple-mocha": "~0.4.1",
|
||||||
"grunt-simple-nyc": "^3.0.1",
|
"grunt-simple-nyc": "^3.0.1",
|
||||||
"i18next-http-backend": "1.3.2",
|
"i18next-http-backend": "1.4.0",
|
||||||
"jquery-i18next": "1.2.1",
|
"jquery-i18next": "1.2.1",
|
||||||
"jsdoc-nr-template": "github:node-red/jsdoc-nr-template",
|
"jsdoc-nr-template": "github:node-red/jsdoc-nr-template",
|
||||||
"marked": "4.0.12",
|
"marked": "4.0.15",
|
||||||
"minami": "1.2.3",
|
"minami": "1.2.3",
|
||||||
"mocha": "9.2.0",
|
"mocha": "9.2.2",
|
||||||
"node-red-node-test-helper": "^0.2.7",
|
"node-red-node-test-helper": "^0.2.7",
|
||||||
"nodemon": "2.0.15",
|
"nodemon": "2.0.16",
|
||||||
"proxy": "^1.0.2",
|
"proxy": "^1.0.2",
|
||||||
"sass": "1.49.7",
|
"sass": "1.51.0",
|
||||||
"should": "13.2.3",
|
"should": "13.2.3",
|
||||||
"sinon": "11.1.2",
|
"sinon": "11.1.2",
|
||||||
"stoppable": "^1.1.0",
|
"stoppable": "^1.1.0",
|
||||||
"supertest": "6.2.2"
|
"supertest": "6.2.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=14"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
23
packages/node_modules/@node-red/editor-api/lib/admin/diagnostics.js
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
let runtimeAPI;
|
||||||
|
let settings;
|
||||||
|
const apiUtil = require("../util");
|
||||||
|
module.exports = {
|
||||||
|
init: function(_settings, _runtimeAPI) {
|
||||||
|
settings = _settings;
|
||||||
|
runtimeAPI = _runtimeAPI;
|
||||||
|
},
|
||||||
|
getReport: function(req, res) {
|
||||||
|
const diagnosticsOpts = settings.diagnostics || {};
|
||||||
|
const opts = {
|
||||||
|
user: req.user,
|
||||||
|
scope: diagnosticsOpts.level || "basic"
|
||||||
|
}
|
||||||
|
if(diagnosticsOpts.enabled === false || diagnosticsOpts.enabled === "false") {
|
||||||
|
apiUtil.rejectHandler(req, res, {message: "diagnostics are disabled", status: 403, code: "diagnostics.disabled" })
|
||||||
|
} else {
|
||||||
|
runtimeAPI.diagnostics.get(opts)
|
||||||
|
.then(function(result) { res.json(result); })
|
||||||
|
.catch(err => apiUtil.rejectHandler(req, res, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ var context = require("./context");
|
|||||||
var auth = require("../auth");
|
var auth = require("../auth");
|
||||||
var info = require("./settings");
|
var info = require("./settings");
|
||||||
var plugins = require("./plugins");
|
var plugins = require("./plugins");
|
||||||
|
var diagnostics = require("./diagnostics");
|
||||||
|
|
||||||
var apiUtil = require("../util");
|
var apiUtil = require("../util");
|
||||||
|
|
||||||
@@ -34,6 +35,7 @@ module.exports = {
|
|||||||
context.init(runtimeAPI);
|
context.init(runtimeAPI);
|
||||||
info.init(settings,runtimeAPI);
|
info.init(settings,runtimeAPI);
|
||||||
plugins.init(runtimeAPI);
|
plugins.init(runtimeAPI);
|
||||||
|
diagnostics.init(settings, runtimeAPI);
|
||||||
|
|
||||||
var needsPermission = auth.needsPermission;
|
var needsPermission = auth.needsPermission;
|
||||||
|
|
||||||
@@ -95,6 +97,8 @@ module.exports = {
|
|||||||
adminApp.get("/plugins", needsPermission("plugins.read"), plugins.getAll, apiUtil.errorHandler);
|
adminApp.get("/plugins", needsPermission("plugins.read"), plugins.getAll, apiUtil.errorHandler);
|
||||||
adminApp.get("/plugins/messages", needsPermission("plugins.read"), plugins.getCatalogs, apiUtil.errorHandler);
|
adminApp.get("/plugins/messages", needsPermission("plugins.read"), plugins.getCatalogs, apiUtil.errorHandler);
|
||||||
|
|
||||||
|
adminApp.get("/diagnostics", needsPermission("diagnostics.read"), diagnostics.getReport, apiUtil.errorHandler);
|
||||||
|
|
||||||
return adminApp;
|
return adminApp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,9 +106,15 @@ async function login(req,res) {
|
|||||||
urlPrefix += "/";
|
urlPrefix += "/";
|
||||||
}
|
}
|
||||||
response = {
|
response = {
|
||||||
"type":"strategy",
|
"type":"strategy"
|
||||||
"prompts":[{type:"button",label:mergedAdminAuth.strategy.label, url: urlPrefix + "auth/strategy"}]
|
|
||||||
}
|
}
|
||||||
|
if (mergedAdminAuth.strategy.autoLogin) {
|
||||||
|
response.autoLogin = true
|
||||||
|
response.loginRedirect = urlPrefix + "auth/strategy"
|
||||||
|
}
|
||||||
|
response.prompts = [
|
||||||
|
{type:"button",label:mergedAdminAuth.strategy.label, url: urlPrefix + "auth/strategy"}
|
||||||
|
]
|
||||||
if (mergedAdminAuth.strategy.icon) {
|
if (mergedAdminAuth.strategy.icon) {
|
||||||
response.prompts[0].icon = mergedAdminAuth.strategy.icon;
|
response.prompts[0].icon = mergedAdminAuth.strategy.icon;
|
||||||
}
|
}
|
||||||
@@ -185,7 +191,7 @@ function genericStrategy(adminApp,strategy) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
options.verify.apply(null,args);
|
options.verify.apply(this,args);
|
||||||
} else {
|
} else {
|
||||||
var profile = arguments[arguments.length - 2];
|
var profile = arguments[arguments.length - 2];
|
||||||
return completeVerify(profile,originalDone);
|
return completeVerify(profile,originalDone);
|
||||||
|
|||||||
@@ -92,10 +92,16 @@ var passwordTokenExchange = function(client, username, password, scope, done) {
|
|||||||
loginAttempts = loginAttempts.filter(function(logEntry) {
|
loginAttempts = loginAttempts.filter(function(logEntry) {
|
||||||
return logEntry.user !== username;
|
return logEntry.user !== username;
|
||||||
});
|
});
|
||||||
Tokens.create(username,client.id,scope).then(function(tokens) {
|
// Check if the user contains a user defined token and use it
|
||||||
log.audit({event: "auth.login",user,username:username,client:client.id,scope:scope});
|
// instead of generating a new token
|
||||||
done(null,tokens.accessToken,null,{expires_in:tokens.expires_in});
|
if(user.token){
|
||||||
});
|
done(null,user.token,null,null);
|
||||||
|
} else {
|
||||||
|
Tokens.create(username,client.id,scope).then(function(tokens) {
|
||||||
|
log.audit({event: "auth.login",user,username:username,client:client.id,scope:scope});
|
||||||
|
done(null,tokens.accessToken,null,{expires_in:tokens.expires_in});
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
log.audit({event: "auth.login.fail.permissions",username:username,client:client.id,scope:scope});
|
log.audit({event: "auth.login.fail.permissions",username:username,client:client.id,scope:scope});
|
||||||
done(null,false);
|
done(null,false);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@node-red/editor-api",
|
"name": "@node-red/editor-api",
|
||||||
"version": "2.2.1",
|
"version": "3.0.0-beta.2",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"main": "./lib/index.js",
|
"main": "./lib/index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -16,14 +16,14 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@node-red/util": "2.2.1",
|
"@node-red/util": "3.0.0-beta.2",
|
||||||
"@node-red/editor-client": "2.2.1",
|
"@node-red/editor-client": "3.0.0-beta.2",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"body-parser": "1.19.1",
|
"body-parser": "1.20.0",
|
||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"express-session": "1.17.2",
|
"express-session": "1.17.3",
|
||||||
"express": "4.17.2",
|
"express": "4.18.1",
|
||||||
"memorystore": "1.6.7",
|
"memorystore": "1.6.7",
|
||||||
"mime": "3.0.0",
|
"mime": "3.0.0",
|
||||||
"multer": "1.4.4",
|
"multer": "1.4.4",
|
||||||
|
|||||||
@@ -185,7 +185,8 @@
|
|||||||
"create-default-package": "Standardpaketdatei erstellen",
|
"create-default-package": "Standardpaketdatei erstellen",
|
||||||
"no-thanks": "Nein, Danke",
|
"no-thanks": "Nein, Danke",
|
||||||
"create-default-project": "Standardprojektdateien erstellen",
|
"create-default-project": "Standardprojektdateien erstellen",
|
||||||
"show-merge-conflicts": "Merge-Konflikte anzeigen"
|
"show-merge-conflicts": "Merge-Konflikte anzeigen",
|
||||||
|
"unknownNodesButton": "Finden Sie unbekannte nodes"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -269,7 +270,9 @@
|
|||||||
"successfulRestart": "Flows erfolgreich neugestartet",
|
"successfulRestart": "Flows erfolgreich neugestartet",
|
||||||
"deployFailed": "Übernahme (deploy) fehlgeschlagen: __message__",
|
"deployFailed": "Übernahme (deploy) fehlgeschlagen: __message__",
|
||||||
"unusedConfigNodes": "Einige Konfigurations-Nodes werden nicht verwendet.",
|
"unusedConfigNodes": "Einige Konfigurations-Nodes werden nicht verwendet.",
|
||||||
"unusedConfigNodesLink": "Hier klicken, um sie anzuschauen.",
|
"unusedConfigNodesButton":"Finden Sie ungenutzte konfig nodes",
|
||||||
|
"unknownNodesButton":"Finden Sie unbekannte nodes",
|
||||||
|
"invalidNodesButton":"Finden Sie ungültige nodes",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "Keine Antwort vom Server"
|
"noResponse": "Keine Antwort vom Server"
|
||||||
},
|
},
|
||||||
@@ -634,14 +637,7 @@
|
|||||||
"empty": "leer",
|
"empty": "leer",
|
||||||
"globalConfig": "Globale Konfigurations-Nodes",
|
"globalConfig": "Globale Konfigurations-Nodes",
|
||||||
"triggerAction": "Auslösen",
|
"triggerAction": "Auslösen",
|
||||||
"find": "Suche im Arbeitsbereich",
|
"find": "Suche im Arbeitsbereich"
|
||||||
"search": {
|
|
||||||
"configNodes": "Konfigurations-Nodes",
|
|
||||||
"unusedConfigNodes": "Unbenutzte Konfigurations-Nodes",
|
|
||||||
"invalidNodes": "Ungültige Nodes",
|
|
||||||
"uknownNodes": "Unbekannte Nodes",
|
|
||||||
"unusedSubflows": "Unbenutzte Subflows"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "Hilfe",
|
"name": "Hilfe",
|
||||||
@@ -863,7 +859,14 @@
|
|||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "Keine Übereinstimmungen gefunden",
|
"empty": "Keine Übereinstimmungen gefunden",
|
||||||
"addNode": "Node hinzufügen ..."
|
"addNode": "Node hinzufügen ...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "Konfigurations-Nodes",
|
||||||
|
"unusedConfigNodes": "Unbenutzte Konfigurations-Nodes",
|
||||||
|
"invalidNodes": "Ungültige Nodes",
|
||||||
|
"uknownNodes": "Unbekannte Nodes",
|
||||||
|
"unusedSubflows": "Unbenutzte Subflows"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "Funktionen",
|
"functions": "Funktionen",
|
||||||
|
|||||||
@@ -149,7 +149,11 @@
|
|||||||
"toggle-navigator": "Toggle navigator",
|
"toggle-navigator": "Toggle navigator",
|
||||||
"zoom-out": "Zoom out",
|
"zoom-out": "Zoom out",
|
||||||
"zoom-reset": "Reset zoom",
|
"zoom-reset": "Reset zoom",
|
||||||
"zoom-in": "Zoom in"
|
"zoom-in": "Zoom in",
|
||||||
|
"search-flows": "Search flows",
|
||||||
|
"search-prev": "Previous",
|
||||||
|
"search-next": "Next",
|
||||||
|
"search-counter": "\"__term__\" __result__ of __count__"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"loggedInAs": "Logged in as __name__",
|
"loggedInAs": "Logged in as __name__",
|
||||||
@@ -213,7 +217,8 @@
|
|||||||
"create-default-package": "Create default package file",
|
"create-default-package": "Create default package file",
|
||||||
"no-thanks": "No thanks",
|
"no-thanks": "No thanks",
|
||||||
"create-default-project": "Create default project files",
|
"create-default-project": "Create default project files",
|
||||||
"show-merge-conflicts": "Show merge conflicts"
|
"show-merge-conflicts": "Show merge conflicts",
|
||||||
|
"unknownNodesButton": "Search for unknown nodes"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -297,7 +302,9 @@
|
|||||||
"successfulRestart": "Successfully restarted flows",
|
"successfulRestart": "Successfully restarted flows",
|
||||||
"deployFailed": "Deploy failed: __message__",
|
"deployFailed": "Deploy failed: __message__",
|
||||||
"unusedConfigNodes":"You have some unused configuration nodes.",
|
"unusedConfigNodes":"You have some unused configuration nodes.",
|
||||||
"unusedConfigNodesLink":"Click here to see them",
|
"unusedConfigNodesButton":"Search unused config nodes",
|
||||||
|
"unknownNodesButton":"Search for unknown nodes",
|
||||||
|
"invalidNodesButton":"Search for invalid nodes",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "no response from server"
|
"noResponse": "no response from server"
|
||||||
},
|
},
|
||||||
@@ -497,7 +504,8 @@
|
|||||||
"redoChange": "Redo",
|
"redoChange": "Redo",
|
||||||
"searchBox": "Open search box",
|
"searchBox": "Open search box",
|
||||||
"managePalette": "Manage palette",
|
"managePalette": "Manage palette",
|
||||||
"actionList":"Action list"
|
"actionList": "Action list",
|
||||||
|
"splitWireWithLinks": "Split selection with Link nodes"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"library": "Library",
|
"library": "Library",
|
||||||
@@ -667,15 +675,7 @@
|
|||||||
"empty": "empty",
|
"empty": "empty",
|
||||||
"globalConfig": "Global Configuration Nodes",
|
"globalConfig": "Global Configuration Nodes",
|
||||||
"triggerAction": "Trigger action",
|
"triggerAction": "Trigger action",
|
||||||
"find": "Find in workspace",
|
"find": "Find in workspace"
|
||||||
"search": {
|
|
||||||
"configNodes": "Configuration nodes",
|
|
||||||
"unusedConfigNodes": "Unused configuration nodes",
|
|
||||||
"invalidNodes": "Invalid nodes",
|
|
||||||
"uknownNodes": "Unknown nodes",
|
|
||||||
"unusedSubflows": "Unused subflows",
|
|
||||||
"hiddenFlows": "Hidden flows"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "Help",
|
"name": "Help",
|
||||||
@@ -899,7 +899,17 @@
|
|||||||
"history": "Search history",
|
"history": "Search history",
|
||||||
"clear": "clear all",
|
"clear": "clear all",
|
||||||
"empty": "No matches found",
|
"empty": "No matches found",
|
||||||
"addNode": "add a node..."
|
"addNode": "add a node...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "Configuration nodes",
|
||||||
|
"unusedConfigNodes": "Unused configuration nodes",
|
||||||
|
"invalidNodes": "Invalid nodes",
|
||||||
|
"uknownNodes": "Unknown nodes",
|
||||||
|
"unusedSubflows": "Unused subflows",
|
||||||
|
"hiddenFlows": "Hidden flows",
|
||||||
|
"modifiedNodes": "Modified nodes and flows",
|
||||||
|
"thisFlow": "Current flow"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "Functions",
|
"functions": "Functions",
|
||||||
@@ -934,6 +944,8 @@
|
|||||||
"format": "format JSON",
|
"format": "format JSON",
|
||||||
"rawMode": "Edit JSON",
|
"rawMode": "Edit JSON",
|
||||||
"uiMode": "Visual editor",
|
"uiMode": "Visual editor",
|
||||||
|
"rawMode-readonly": "JSON",
|
||||||
|
"uiMode-readonly": "Visual",
|
||||||
"insertAbove": "Insert above",
|
"insertAbove": "Insert above",
|
||||||
"insertBelow": "Insert below",
|
"insertBelow": "Insert below",
|
||||||
"addItem": "Add item",
|
"addItem": "Add item",
|
||||||
@@ -1148,6 +1160,9 @@
|
|||||||
"start": "Start",
|
"start": "Start",
|
||||||
"next": "Next"
|
"next": "Next"
|
||||||
},
|
},
|
||||||
|
"diagnostics": {
|
||||||
|
"title": "System Info"
|
||||||
|
},
|
||||||
"languages" : {
|
"languages" : {
|
||||||
"de": "German",
|
"de": "German",
|
||||||
"en-US": "English",
|
"en-US": "English",
|
||||||
@@ -1156,5 +1171,21 @@
|
|||||||
"ru": "Russian",
|
"ru": "Russian",
|
||||||
"zh-CN": "Chinese(Simplified)",
|
"zh-CN": "Chinese(Simplified)",
|
||||||
"zh-TW": "Chinese(Traditional)"
|
"zh-TW": "Chinese(Traditional)"
|
||||||
|
},
|
||||||
|
"validator": {
|
||||||
|
"errors": {
|
||||||
|
"invalid-json": "Invalid JSON data: __error__",
|
||||||
|
"invalid-json-prop": "__prop__: invalid JSON data: __error__",
|
||||||
|
"invalid-prop": "Invalid property expression",
|
||||||
|
"invalid-prop-prop": "__prop__: invalid property expression",
|
||||||
|
"invalid-num": "Invalid number",
|
||||||
|
"invalid-num-prop": "__prop__: invalid number",
|
||||||
|
"invalid-regexp": "Invalid input pattern",
|
||||||
|
"invalid-regex-prop": "__prop__: invalid input pattern",
|
||||||
|
"missing-required-prop": "__prop__: property value missing",
|
||||||
|
"invalid-config": "__prop__: invalid configuration node",
|
||||||
|
"missing-config": "__prop__: missing configuration node",
|
||||||
|
"validation-error": "__prop__: validation error: __node__, __id__: __error__"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,11 @@
|
|||||||
"toggle-navigator": "ナビゲータの表示/非表示を切替",
|
"toggle-navigator": "ナビゲータの表示/非表示を切替",
|
||||||
"zoom-out": "縮小",
|
"zoom-out": "縮小",
|
||||||
"zoom-reset": "拡大/縮小を初期化",
|
"zoom-reset": "拡大/縮小を初期化",
|
||||||
"zoom-in": "拡大"
|
"zoom-in": "拡大",
|
||||||
|
"search-flows": "フローを検索",
|
||||||
|
"search-prev": "前へ",
|
||||||
|
"search-next": "次へ",
|
||||||
|
"search-counter": "\"__term__\" __count__ 件中の __result__ 件目"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"loggedInAs": "__name__ としてログインしました",
|
"loggedInAs": "__name__ としてログインしました",
|
||||||
@@ -213,7 +217,8 @@
|
|||||||
"create-default-package": "デフォルトパッケージファイルの作成",
|
"create-default-package": "デフォルトパッケージファイルの作成",
|
||||||
"no-thanks": "不要",
|
"no-thanks": "不要",
|
||||||
"create-default-project": "デフォルトプロジェクトファイルの作成",
|
"create-default-project": "デフォルトプロジェクトファイルの作成",
|
||||||
"show-merge-conflicts": "マージ競合を表示"
|
"show-merge-conflicts": "マージ競合を表示",
|
||||||
|
"unknownNodesButton": "不明なノードを検索する"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -297,7 +302,9 @@
|
|||||||
"successfulRestart": "フローの再起動が成功しました",
|
"successfulRestart": "フローの再起動が成功しました",
|
||||||
"deployFailed": "デプロイが失敗しました: __message__",
|
"deployFailed": "デプロイが失敗しました: __message__",
|
||||||
"unusedConfigNodes": "使われていない設定ノードがあります。",
|
"unusedConfigNodes": "使われていない設定ノードがあります。",
|
||||||
"unusedConfigNodesLink": "設定を参照する",
|
"unusedConfigNodesButton": "未使用の構成ノードを検索",
|
||||||
|
"unknownNodesButton": "不明なノードを検索する",
|
||||||
|
"invalidNodesButton": "無効なノードを検索する",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "サーバの応答がありません"
|
"noResponse": "サーバの応答がありません"
|
||||||
},
|
},
|
||||||
@@ -497,7 +504,8 @@
|
|||||||
"redoChange": "変更操作をやり直し",
|
"redoChange": "変更操作をやり直し",
|
||||||
"searchBox": "ノードを検索",
|
"searchBox": "ノードを検索",
|
||||||
"managePalette": "パレットの管理",
|
"managePalette": "パレットの管理",
|
||||||
"actionList": "動作一覧"
|
"actionList": "動作一覧",
|
||||||
|
"splitWireWithLinks": "選択したワイヤーをlinkノードで分離"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"library": "ライブラリ",
|
"library": "ライブラリ",
|
||||||
@@ -667,15 +675,7 @@
|
|||||||
"empty": "空",
|
"empty": "空",
|
||||||
"globalConfig": "グローバル設定ノード",
|
"globalConfig": "グローバル設定ノード",
|
||||||
"triggerAction": "アクションを実行",
|
"triggerAction": "アクションを実行",
|
||||||
"find": "ワークスペース内を検索",
|
"find": "ワークスペース内を検索"
|
||||||
"search": {
|
|
||||||
"configNodes": "設定ノード",
|
|
||||||
"unusedConfigNodes": "未使用の設定ノード",
|
|
||||||
"invalidNodes": "不正なノード",
|
|
||||||
"uknownNodes": "未知のノード",
|
|
||||||
"unusedSubflows": "未使用のサブフロー",
|
|
||||||
"hiddenFlows": "非表示のフロー"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "ヘルプ",
|
"name": "ヘルプ",
|
||||||
@@ -899,7 +899,16 @@
|
|||||||
"history": "検索履歴",
|
"history": "検索履歴",
|
||||||
"clear": "全て削除",
|
"clear": "全て削除",
|
||||||
"empty": "一致したものが見つかりませんでした",
|
"empty": "一致したものが見つかりませんでした",
|
||||||
"addNode": "ノードを追加..."
|
"addNode": "ノードを追加...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "設定ノード",
|
||||||
|
"unusedConfigNodes": "未使用の設定ノード",
|
||||||
|
"invalidNodes": "不正なノード",
|
||||||
|
"uknownNodes": "未知のノード",
|
||||||
|
"unusedSubflows": "未使用のサブフロー",
|
||||||
|
"hiddenFlows": "非表示のフロー",
|
||||||
|
"modifiedNodes": "修正したノードやフロー"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "関数",
|
"functions": "関数",
|
||||||
@@ -934,6 +943,8 @@
|
|||||||
"format": "JSONフォーマット",
|
"format": "JSONフォーマット",
|
||||||
"rawMode": "JSONを編集",
|
"rawMode": "JSONを編集",
|
||||||
"uiMode": "ビジュアルエディタ",
|
"uiMode": "ビジュアルエディタ",
|
||||||
|
"rawMode-readonly": "JSON",
|
||||||
|
"uiMode-readonly": "ビジュアル",
|
||||||
"insertAbove": "上に挿入",
|
"insertAbove": "上に挿入",
|
||||||
"insertBelow": "下に挿入",
|
"insertBelow": "下に挿入",
|
||||||
"addItem": "要素を追加",
|
"addItem": "要素を追加",
|
||||||
@@ -1148,6 +1159,9 @@
|
|||||||
"start": "開始",
|
"start": "開始",
|
||||||
"next": "次へ"
|
"next": "次へ"
|
||||||
},
|
},
|
||||||
|
"diagnostics": {
|
||||||
|
"title": "システム情報"
|
||||||
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
"de": "ドイツ語",
|
"de": "ドイツ語",
|
||||||
"en-US": "英語",
|
"en-US": "英語",
|
||||||
@@ -1157,6 +1171,22 @@
|
|||||||
"zh-CN": "中国語(簡体)",
|
"zh-CN": "中国語(簡体)",
|
||||||
"zh-TW": "中国語(繁体)"
|
"zh-TW": "中国語(繁体)"
|
||||||
},
|
},
|
||||||
|
"validator": {
|
||||||
|
"errors": {
|
||||||
|
"invalid-json": "JSONデータが不正: __error__",
|
||||||
|
"invalid-json-prop": "__prop__: JSONデータが不正: __error__",
|
||||||
|
"invalid-prop": "プロパティ式が不正",
|
||||||
|
"invalid-prop-prop": "__prop__: プロパティ式が不正",
|
||||||
|
"invalid-num": "数値が不正",
|
||||||
|
"invalid-num-prop": "__prop__: 数値が不正",
|
||||||
|
"invalid-regexp": "入力パターンが不正",
|
||||||
|
"invalid-regex-prop": "__prop__: 入力パターンが不正",
|
||||||
|
"missing-required-prop": "__prop__: プロパティが未設定",
|
||||||
|
"invalid-config": "__prop__: 設定ノードが不正",
|
||||||
|
"missing-config": "__prop__: 設定ノードが存在しません",
|
||||||
|
"validation-error": "__prop__: チェックエラー: __node__, __id__: __error__"
|
||||||
|
}
|
||||||
|
},
|
||||||
"action-list": {
|
"action-list": {
|
||||||
"toggle-show-tips": "ヒント表示切替",
|
"toggle-show-tips": "ヒント表示切替",
|
||||||
"show-about": "Node-REDの説明を表示",
|
"show-about": "Node-REDの説明を表示",
|
||||||
@@ -1174,6 +1204,7 @@
|
|||||||
"hide-all-flows": "全てのフローを非表示",
|
"hide-all-flows": "全てのフローを非表示",
|
||||||
"show-all-flows": "全てのフローを表示",
|
"show-all-flows": "全てのフローを表示",
|
||||||
"show-last-hidden-flow": "最後に非表示にしたフローを表示",
|
"show-last-hidden-flow": "最後に非表示にしたフローを表示",
|
||||||
|
"list-modified-nodes": "修正したフローを表示",
|
||||||
"list-hidden-flows": "非表示フローを表示",
|
"list-hidden-flows": "非表示フローを表示",
|
||||||
"list-flows": "フロー一覧",
|
"list-flows": "フロー一覧",
|
||||||
"list-subflows": "サブフロー一覧",
|
"list-subflows": "サブフロー一覧",
|
||||||
@@ -1240,6 +1271,8 @@
|
|||||||
"distribute-selection-vertically": "選択を上下に整列",
|
"distribute-selection-vertically": "選択を上下に整列",
|
||||||
"wire-series-of-nodes": "ノードを一続きに接続",
|
"wire-series-of-nodes": "ノードを一続きに接続",
|
||||||
"wire-node-to-multiple": "ノードを複数に接続",
|
"wire-node-to-multiple": "ノードを複数に接続",
|
||||||
|
"split-wire-with-link-nodes": "ワイヤーをlinkノードで分割",
|
||||||
|
"generate-node-names": "ノード名を生成",
|
||||||
"show-user-settings": "ユーザ設定を表示",
|
"show-user-settings": "ユーザ設定を表示",
|
||||||
"show-help": "ヘルプを表示",
|
"show-help": "ヘルプを表示",
|
||||||
"toggle-palette": "パレットの表示切替",
|
"toggle-palette": "パレットの表示切替",
|
||||||
@@ -1266,6 +1299,8 @@
|
|||||||
"show-library-import-dialog": "ライブラリ読み込みダイアログを表示",
|
"show-library-import-dialog": "ライブラリ読み込みダイアログを表示",
|
||||||
"show-examples-import-dialog": "サンプル読み込みダイアログを表示",
|
"show-examples-import-dialog": "サンプル読み込みダイアログを表示",
|
||||||
"search": "検索",
|
"search": "検索",
|
||||||
|
"search-previous": "前を検索",
|
||||||
|
"search-next": "次を検索",
|
||||||
"show-action-list": "アクション一覧を表示",
|
"show-action-list": "アクション一覧を表示",
|
||||||
"confirm-edit-tray": "編集を完了",
|
"confirm-edit-tray": "編集を完了",
|
||||||
"cancel-edit-tray": "編集をキャンセル",
|
"cancel-edit-tray": "編集をキャンセル",
|
||||||
@@ -1276,8 +1311,8 @@
|
|||||||
"set-deploy-type-to-modified-flows": "デプロイを「変更したフロー」に設定",
|
"set-deploy-type-to-modified-flows": "デプロイを「変更したフロー」に設定",
|
||||||
"set-deploy-type-to-modified-nodes": "デプロイを「変更したノード」に設定",
|
"set-deploy-type-to-modified-nodes": "デプロイを「変更したノード」に設定",
|
||||||
"show-debug-tab": "デバッグタブを表示",
|
"show-debug-tab": "デバッグタブを表示",
|
||||||
"clear-debug-messages": "デバッグメッセージをクリア",
|
"clear-debug-messages": "デバッグメッセージを削除",
|
||||||
"clear-filtered-debug-messages": "フィルタしたデバッグメッセージをクリア",
|
"clear-filtered-debug-messages": "フィルタしたデバッグメッセージを削除",
|
||||||
"activate-selected-debug-nodes": "選択したデバッグノードを有効化",
|
"activate-selected-debug-nodes": "選択したデバッグノードを有効化",
|
||||||
"activate-all-debug-nodes": "全てのデバッグノードを有効化",
|
"activate-all-debug-nodes": "全てのデバッグノードを有効化",
|
||||||
"activate-all-flow-debug-nodes": "フロー内の全デバッグノードを有効化",
|
"activate-all-flow-debug-nodes": "フロー内の全デバッグノードを有効化",
|
||||||
@@ -1287,6 +1322,7 @@
|
|||||||
"zoom-in": "ズームイン",
|
"zoom-in": "ズームイン",
|
||||||
"zoom-out": "ズームアウト",
|
"zoom-out": "ズームアウト",
|
||||||
"zoom-reset": "ズームリセット",
|
"zoom-reset": "ズームリセット",
|
||||||
"toggle-navigator": "ナビゲータ表示切替"
|
"toggle-navigator": "ナビゲータ表示切替",
|
||||||
|
"show-system-info": "システムインフォメーション"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,8 @@
|
|||||||
"create-default-package": "기본 패키지 파일 생성",
|
"create-default-package": "기본 패키지 파일 생성",
|
||||||
"no-thanks": "괜찮습니다",
|
"no-thanks": "괜찮습니다",
|
||||||
"create-default-project": "기본 프로젝트 파일 생성",
|
"create-default-project": "기본 프로젝트 파일 생성",
|
||||||
"show-merge-conflicts": "병합 충돌 보여주기"
|
"show-merge-conflicts": "병합 충돌 보여주기",
|
||||||
|
"unknownNodesButton": "알 수 없는 노드 검색"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -203,7 +204,9 @@
|
|||||||
"successfulRestart": "플로우 재시작을 성공했습니다",
|
"successfulRestart": "플로우 재시작을 성공했습니다",
|
||||||
"deployFailed": "배포 실패 : __message__",
|
"deployFailed": "배포 실패 : __message__",
|
||||||
"unusedConfigNodes": "사용되지 않는 설정노드가 있습니다",
|
"unusedConfigNodes": "사용되지 않는 설정노드가 있습니다",
|
||||||
"unusedConfigNodesLink": "여기를 클릭하면 볼 수 있습니다",
|
"unusedConfigNodesButton":"사용하지 않는 구성 노드 검색",
|
||||||
|
"unknownNodesButton":"알 수 없는 노드 검색",
|
||||||
|
"invalidNodesButton":"잘못된 노드 검색",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "서버의 응답이 없습니다"
|
"noResponse": "서버의 응답이 없습니다"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -183,7 +183,8 @@
|
|||||||
"create-default-package": "Создать файл пакета по умолчанию",
|
"create-default-package": "Создать файл пакета по умолчанию",
|
||||||
"no-thanks": "Нет, спасибо",
|
"no-thanks": "Нет, спасибо",
|
||||||
"create-default-project": "Создать файлы проекта по умолчанию",
|
"create-default-project": "Создать файлы проекта по умолчанию",
|
||||||
"show-merge-conflicts": "Показать конфликты слияния"
|
"show-merge-conflicts": "Показать конфликты слияния",
|
||||||
|
"unknownNodesButton": "Поиск неизвестных узлов"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -277,7 +278,9 @@
|
|||||||
"successfulRestart": "Потоки успешно перезапущены",
|
"successfulRestart": "Потоки успешно перезапущены",
|
||||||
"deployFailed": "Развертывание не удалось: __message__",
|
"deployFailed": "Развертывание не удалось: __message__",
|
||||||
"unusedConfigNodes":"У вас есть неиспользуемых узлы конфигурации.",
|
"unusedConfigNodes":"У вас есть неиспользуемых узлы конфигурации.",
|
||||||
"unusedConfigNodesLink":"Нажмите здесь, чтобы их увидеть",
|
"unusedConfigNodesButton":"Поиск неиспользуемых узлов конфигурации",
|
||||||
|
"unknownNodesButton":"Поиск неизвестных узлов",
|
||||||
|
"invalidNodesButton":"Поиск недопустимых узлов",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "нет ответа от сервера"
|
"noResponse": "нет ответа от сервера"
|
||||||
},
|
},
|
||||||
@@ -650,14 +653,7 @@
|
|||||||
"empty": "пусто",
|
"empty": "пусто",
|
||||||
"globalConfig": "Глобальные конфиг узлы",
|
"globalConfig": "Глобальные конфиг узлы",
|
||||||
"triggerAction": "Вызвать действие",
|
"triggerAction": "Вызвать действие",
|
||||||
"find": "Найти в рабочей области",
|
"find": "Найти в рабочей области"
|
||||||
"search": {
|
|
||||||
"configNodes": "Узлы конфигурации",
|
|
||||||
"unusedConfigNodes": "Неиспользуемые узлы конфигурации",
|
|
||||||
"invalidNodes": "Недействительные узлы",
|
|
||||||
"uknownNodes": "Неизвестные узлы",
|
|
||||||
"unusedSubflows": "Неиспользуемые подпотоки"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "Справка",
|
"name": "Справка",
|
||||||
@@ -888,7 +884,14 @@
|
|||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "Ничего не найдено",
|
"empty": "Ничего не найдено",
|
||||||
"addNode": "добавить узел..."
|
"addNode": "добавить узел...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "Узлы конфигурации",
|
||||||
|
"unusedConfigNodes": "Неиспользуемые узлы конфигурации",
|
||||||
|
"invalidNodes": "Недействительные узлы",
|
||||||
|
"uknownNodes": "Неизвестные узлы",
|
||||||
|
"unusedSubflows": "Неиспользуемые подпотоки"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "Функции",
|
"functions": "Функции",
|
||||||
|
|||||||
@@ -182,7 +182,8 @@
|
|||||||
"create-default-package": "创建默认的包文件",
|
"create-default-package": "创建默认的包文件",
|
||||||
"no-thanks": "不了,谢谢",
|
"no-thanks": "不了,谢谢",
|
||||||
"create-default-project": "创建默认项目文件",
|
"create-default-project": "创建默认项目文件",
|
||||||
"show-merge-conflicts": "显示合并冲突"
|
"show-merge-conflicts": "显示合并冲突",
|
||||||
|
"unknownNodesButton": "搜索未知节点"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -264,7 +265,9 @@
|
|||||||
"successfulRestart": "成功重启流程",
|
"successfulRestart": "成功重启流程",
|
||||||
"deployFailed": "部署失败: __message__",
|
"deployFailed": "部署失败: __message__",
|
||||||
"unusedConfigNodes": "您有一些未使用的配置节点",
|
"unusedConfigNodes": "您有一些未使用的配置节点",
|
||||||
"unusedConfigNodesLink": "点击此处查看它们",
|
"unusedConfigNodesButton":"搜索未使用的配置节点",
|
||||||
|
"unknownNodesButton":"搜索未知节点",
|
||||||
|
"invalidNodesButton":"搜索无效节点",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "服务器没有响应"
|
"noResponse": "服务器没有响应"
|
||||||
},
|
},
|
||||||
@@ -614,14 +617,7 @@
|
|||||||
"empty": "空的",
|
"empty": "空的",
|
||||||
"globalConfig": "全局配置节点",
|
"globalConfig": "全局配置节点",
|
||||||
"triggerAction": "触发动作",
|
"triggerAction": "触发动作",
|
||||||
"find": "在工作区中查找",
|
"find": "在工作区中查找"
|
||||||
"search": {
|
|
||||||
"configNodes": "配置节点",
|
|
||||||
"unusedConfigNodes": "未使用的配置节点",
|
|
||||||
"invalidNodes": "无效的节点",
|
|
||||||
"uknownNodes": "未知的节点",
|
|
||||||
"unusedSubflows": "未使用的子流程"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "帮助",
|
"name": "帮助",
|
||||||
@@ -842,7 +838,14 @@
|
|||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "找不到匹配",
|
"empty": "找不到匹配",
|
||||||
"addNode": "添加一个节点..."
|
"addNode": "添加一个节点...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "配置节点",
|
||||||
|
"unusedConfigNodes": "未使用的配置节点",
|
||||||
|
"invalidNodes": "无效的节点",
|
||||||
|
"uknownNodes": "未知的节点",
|
||||||
|
"unusedSubflows": "未使用的子流程"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "功能",
|
"functions": "功能",
|
||||||
|
|||||||
@@ -182,7 +182,8 @@
|
|||||||
"create-default-package": "創建默認的包文件",
|
"create-default-package": "創建默認的包文件",
|
||||||
"no-thanks": "不了,謝謝",
|
"no-thanks": "不了,謝謝",
|
||||||
"create-default-project": "創建默認項目文件",
|
"create-default-project": "創建默認項目文件",
|
||||||
"show-merge-conflicts": "顯示合併衝突"
|
"show-merge-conflicts": "顯示合併衝突",
|
||||||
|
"unknownNodesButton": "搜索未知節點"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
@@ -264,7 +265,9 @@
|
|||||||
"successfulRestart": "成功重啟流程",
|
"successfulRestart": "成功重啟流程",
|
||||||
"deployFailed": "部署失敗: __message__",
|
"deployFailed": "部署失敗: __message__",
|
||||||
"unusedConfigNodes": "您有一些未使用的配置節點",
|
"unusedConfigNodes": "您有一些未使用的配置節點",
|
||||||
"unusedConfigNodesLink": "點擊此處查看它們",
|
"unusedConfigNodesButton":"搜索未使用的配置節點",
|
||||||
|
"unknownNodesButton":"搜索未知節點",
|
||||||
|
"invalidNodesButton":"搜索無效節點",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "伺服器沒有回應"
|
"noResponse": "伺服器沒有回應"
|
||||||
},
|
},
|
||||||
@@ -614,14 +617,7 @@
|
|||||||
"empty": "空的",
|
"empty": "空的",
|
||||||
"globalConfig": "全局配置節點",
|
"globalConfig": "全局配置節點",
|
||||||
"triggerAction": "觸發動作",
|
"triggerAction": "觸發動作",
|
||||||
"find": "在工作區中查找",
|
"find": "在工作區中查找"
|
||||||
"search": {
|
|
||||||
"configNodes": "配置節點",
|
|
||||||
"unusedConfigNodes": "未使用的配置節點",
|
|
||||||
"invalidNodes": "無效的節點",
|
|
||||||
"uknownNodes": "未知的節點",
|
|
||||||
"unusedSubflows": "未使用的子流程"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "幫助",
|
"name": "幫助",
|
||||||
@@ -842,7 +838,14 @@
|
|||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "找不到匹配",
|
"empty": "找不到匹配",
|
||||||
"addNode": "添加一個節點..."
|
"addNode": "添加一個節點...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "配置節點",
|
||||||
|
"unusedConfigNodes": "未使用的配置節點",
|
||||||
|
"invalidNodes": "無效的節點",
|
||||||
|
"uknownNodes": "未知的節點",
|
||||||
|
"unusedSubflows": "未使用的子流程"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "功能",
|
"functions": "功能",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@node-red/editor-client",
|
"name": "@node-red/editor-client",
|
||||||
"version": "2.2.1",
|
"version": "3.0.0-beta.2",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ oop.inherits(NRJavaScriptWorker, Mirror);
|
|||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
this.setOptions = function(options) {
|
this.setOptions = function(options) {
|
||||||
this.options = {
|
o.options = {
|
||||||
// undef: true,
|
// undef: true,
|
||||||
// unused: true,
|
// unused: true,
|
||||||
esversion: 9,
|
esversion: 9,
|
||||||
@@ -98,7 +98,7 @@ oop.inherits(NRJavaScriptWorker, Mirror);
|
|||||||
if (options) {
|
if (options) {
|
||||||
for (var opt in options) {
|
for (var opt in options) {
|
||||||
if (options.hasOwnProperty(opt)) {
|
if (options.hasOwnProperty(opt)) {
|
||||||
this.options[opt] = options.opt;
|
o.options[opt] = options[opt];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 90 B |
1
packages/node_modules/@node-red/editor-client/src/images/grip-horizontal.svg
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="50" height="5" viewBox="0, 0, 50, 5" xmlns="http://www.w3.org/2000/svg"><path d="M0 1H50V4H0Z" fill="#CCC"/></svg>
|
||||||
|
After Width: | Height: | Size: 127 B |
|
Before Width: | Height: | Size: 192 B |
1
packages/node_modules/@node-red/editor-client/src/images/grip.svg
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="5" height="50" viewBox="0, 0, 5, 50" xmlns="http://www.w3.org/2000/svg"><path d="M1 0H4V50H1Z" fill="#CCC"/></svg>
|
||||||
|
After Width: | Height: | Size: 127 B |
@@ -13,6 +13,11 @@
|
|||||||
* 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.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An API for undo / redo history buffer
|
||||||
|
* @namespace RED.history
|
||||||
|
*/
|
||||||
RED.history = (function() {
|
RED.history = (function() {
|
||||||
var undoHistory = [];
|
var undoHistory = [];
|
||||||
var redoHistory = [];
|
var redoHistory = [];
|
||||||
@@ -101,6 +106,23 @@ RED.history = (function() {
|
|||||||
RED.nodes.removeLink(ev.links[i]);
|
RED.nodes.removeLink(ev.links[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (ev.junctions) {
|
||||||
|
inverseEv.junctions = [];
|
||||||
|
for (i=0;i<ev.junctions.length;i++) {
|
||||||
|
inverseEv.junctions.push(ev.junctions[i]);
|
||||||
|
RED.nodes.removeJunction(ev.junctions[i]);
|
||||||
|
if (ev.junctions[i].g) {
|
||||||
|
var group = RED.nodes.group(ev.junctions[i].g);
|
||||||
|
var index = group.nodes.indexOf(ev.junctions[i]);
|
||||||
|
if (index !== -1) {
|
||||||
|
group.nodes.splice(index,1);
|
||||||
|
RED.group.markDirty(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ev.groups) {
|
if (ev.groups) {
|
||||||
inverseEv.groups = [];
|
inverseEv.groups = [];
|
||||||
for (i = ev.groups.length - 1;i>=0;i--) {
|
for (i = ev.groups.length - 1;i>=0;i--) {
|
||||||
@@ -267,6 +289,21 @@ RED.history = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (ev.junctions) {
|
||||||
|
inverseEv.junctions = [];
|
||||||
|
for (i=0;i<ev.junctions.length;i++) {
|
||||||
|
inverseEv.junctions.push(ev.junctions[i]);
|
||||||
|
RED.nodes.addJunction(ev.junctions[i]);
|
||||||
|
if (ev.junctions[i].g) {
|
||||||
|
group = RED.nodes.group(ev.junctions[i].g);
|
||||||
|
if (group.nodes.indexOf(ev.junctions[i]) === -1) {
|
||||||
|
group.nodes.push(ev.junctions[i]);
|
||||||
|
}
|
||||||
|
RED.group.markDirty(group)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ev.links) {
|
if (ev.links) {
|
||||||
inverseEv.links = [];
|
inverseEv.links = [];
|
||||||
for (i=0;i<ev.links.length;i++) {
|
for (i=0;i<ev.links.length;i++) {
|
||||||
|
|||||||
@@ -90,6 +90,10 @@
|
|||||||
"alt-a m": "core:align-selection-to-middle",
|
"alt-a m": "core:align-selection-to-middle",
|
||||||
"alt-a c": "core:align-selection-to-center",
|
"alt-a c": "core:align-selection-to-center",
|
||||||
"alt-a h": "core:distribute-selection-horizontally",
|
"alt-a h": "core:distribute-selection-horizontally",
|
||||||
"alt-a v": "core:distribute-selection-vertically"
|
"alt-a v": "core:distribute-selection-vertically",
|
||||||
|
"shift-f": "core:search-previous",
|
||||||
|
"f": "core:search-next",
|
||||||
|
"alt-l l": "core:split-wire-with-link-nodes"
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,11 @@
|
|||||||
* 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.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An Interface to nodes and utility functions for creating/adding/deleting nodes and links
|
||||||
|
* @namespace RED.nodes
|
||||||
|
*/
|
||||||
RED.nodes = (function() {
|
RED.nodes = (function() {
|
||||||
|
|
||||||
var PORT_TYPE_INPUT = 1;
|
var PORT_TYPE_INPUT = 1;
|
||||||
@@ -33,6 +38,9 @@ RED.nodes = (function() {
|
|||||||
var groups = {};
|
var groups = {};
|
||||||
var groupsByZ = {};
|
var groupsByZ = {};
|
||||||
|
|
||||||
|
var junctions = {};
|
||||||
|
var junctionsByZ = {};
|
||||||
|
|
||||||
var initialLoad;
|
var initialLoad;
|
||||||
|
|
||||||
var dirty = false;
|
var dirty = false;
|
||||||
@@ -814,6 +822,7 @@ RED.nodes = (function() {
|
|||||||
var removedNodes = [];
|
var removedNodes = [];
|
||||||
var removedLinks = [];
|
var removedLinks = [];
|
||||||
var removedGroups = [];
|
var removedGroups = [];
|
||||||
|
var removedJunctions = [];
|
||||||
if (ws) {
|
if (ws) {
|
||||||
delete workspaces[id];
|
delete workspaces[id];
|
||||||
delete linkTabMap[id];
|
delete linkTabMap[id];
|
||||||
@@ -822,7 +831,14 @@ RED.nodes = (function() {
|
|||||||
var node;
|
var node;
|
||||||
|
|
||||||
if (allNodes.hasTab(id)) {
|
if (allNodes.hasTab(id)) {
|
||||||
removedNodes = allNodes.getNodes(id).slice()
|
removedNodes = allNodes.getNodes(id).filter(n => {
|
||||||
|
if (n.type === 'junction') {
|
||||||
|
removedJunctions.push(n)
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
for (i in configNodes) {
|
for (i in configNodes) {
|
||||||
if (configNodes.hasOwnProperty(i)) {
|
if (configNodes.hasOwnProperty(i)) {
|
||||||
@@ -837,6 +853,10 @@ RED.nodes = (function() {
|
|||||||
var result = removeNode(removedNodes[i].id);
|
var result = removeNode(removedNodes[i].id);
|
||||||
removedLinks = removedLinks.concat(result.links);
|
removedLinks = removedLinks.concat(result.links);
|
||||||
}
|
}
|
||||||
|
for (i=0;i<removedJunctions.length;i++) {
|
||||||
|
var result = removeJunction(removedJunctions[i])
|
||||||
|
removedLinks = removedLinks.concat(result.links)
|
||||||
|
}
|
||||||
|
|
||||||
// Must get 'removedGroups' in the right order.
|
// Must get 'removedGroups' in the right order.
|
||||||
// - start with the top-most groups
|
// - start with the top-most groups
|
||||||
@@ -856,7 +876,7 @@ RED.nodes = (function() {
|
|||||||
allNodes.removeTab(id);
|
allNodes.removeTab(id);
|
||||||
RED.events.emit('flows:remove',ws);
|
RED.events.emit('flows:remove',ws);
|
||||||
}
|
}
|
||||||
return {nodes:removedNodes,links:removedLinks, groups: removedGroups};
|
return {nodes:removedNodes,links:removedLinks, groups: removedGroups, junctions: removedJunctions};
|
||||||
}
|
}
|
||||||
|
|
||||||
function addSubflow(sf, createNewIds) {
|
function addSubflow(sf, createNewIds) {
|
||||||
@@ -1113,7 +1133,7 @@ RED.nodes = (function() {
|
|||||||
delete node.env;
|
delete node.env;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (n._def.category != "config") {
|
if (n._def.category != "config" || n.type === 'junction') {
|
||||||
node.x = n.x;
|
node.x = n.x;
|
||||||
node.y = n.y;
|
node.y = n.y;
|
||||||
if (exportDimensions) {
|
if (exportDimensions) {
|
||||||
@@ -1376,6 +1396,11 @@ RED.nodes = (function() {
|
|||||||
nns.push(convertNode(groups[i], opts));
|
nns.push(convertNode(groups[i], opts));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (i in junctions) {
|
||||||
|
if (junctions.hasOwnProperty(i)) {
|
||||||
|
nns.push(convertNode(junctions[i], opts));
|
||||||
|
}
|
||||||
|
}
|
||||||
for (i in configNodes) {
|
for (i in configNodes) {
|
||||||
if (configNodes.hasOwnProperty(i)) {
|
if (configNodes.hasOwnProperty(i)) {
|
||||||
nns.push(convertNode(configNodes[i], opts));
|
nns.push(convertNode(configNodes[i], opts));
|
||||||
@@ -1457,6 +1482,7 @@ RED.nodes = (function() {
|
|||||||
tabs: {},
|
tabs: {},
|
||||||
subflows: {},
|
subflows: {},
|
||||||
groups: {},
|
groups: {},
|
||||||
|
junctions: {},
|
||||||
configs: {},
|
configs: {},
|
||||||
nodes: {},
|
nodes: {},
|
||||||
all: [],
|
all: [],
|
||||||
@@ -1472,6 +1498,8 @@ RED.nodes = (function() {
|
|||||||
imported.subflows[n.id] = n;
|
imported.subflows[n.id] = n;
|
||||||
} else if (n.type === "group") {
|
} else if (n.type === "group") {
|
||||||
imported.groups[n.id] = n;
|
imported.groups[n.id] = n;
|
||||||
|
} else if (n.type === "junction") {
|
||||||
|
imported.junctions[n.id] = n;
|
||||||
} else if (n.hasOwnProperty("x") && n.hasOwnProperty("y")) {
|
} else if (n.hasOwnProperty("x") && n.hasOwnProperty("y")) {
|
||||||
imported.nodes[n.id] = n;
|
imported.nodes[n.id] = n;
|
||||||
} else {
|
} else {
|
||||||
@@ -1480,7 +1508,7 @@ RED.nodes = (function() {
|
|||||||
var nodeZ = n.z || "__global__";
|
var nodeZ = n.z || "__global__";
|
||||||
imported.zMap[nodeZ] = imported.zMap[nodeZ] || [];
|
imported.zMap[nodeZ] = imported.zMap[nodeZ] || [];
|
||||||
imported.zMap[nodeZ].push(n)
|
imported.zMap[nodeZ].push(n)
|
||||||
if (allNodes.hasNode(n.id) || configNodes[n.id] || workspaces[n.id] || subflows[n.id] || groups[n.id]) {
|
if (allNodes.hasNode(n.id) || configNodes[n.id] || workspaces[n.id] || subflows[n.id] || groups[n.id] || junctions[n.id]) {
|
||||||
imported.conflicted[n.id] = n;
|
imported.conflicted[n.id] = n;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1646,7 +1674,7 @@ RED.nodes = (function() {
|
|||||||
if (!options.generateIds) {
|
if (!options.generateIds) {
|
||||||
if (!options.importMap[id]) {
|
if (!options.importMap[id]) {
|
||||||
// No conflict resolution for this node
|
// No conflict resolution for this node
|
||||||
var existing = allNodes.getNode(id) || configNodes[id] || workspaces[id] || subflows[id] || groups[id];
|
var existing = allNodes.getNode(id) || configNodes[id] || workspaces[id] || subflows[id] || groups[id] || junctions[id];
|
||||||
if (existing) {
|
if (existing) {
|
||||||
existingNodes.push({existing:existing, imported:n});
|
existingNodes.push({existing:existing, imported:n});
|
||||||
}
|
}
|
||||||
@@ -1700,6 +1728,7 @@ RED.nodes = (function() {
|
|||||||
n.type != "tab" &&
|
n.type != "tab" &&
|
||||||
n.type != "subflow" &&
|
n.type != "subflow" &&
|
||||||
n.type != "group" &&
|
n.type != "group" &&
|
||||||
|
n.type != 'junction' &&
|
||||||
!registry.getNodeType(n.type) &&
|
!registry.getNodeType(n.type) &&
|
||||||
n.type.substring(0,8) != "subflow:" &&
|
n.type.substring(0,8) != "subflow:" &&
|
||||||
unknownTypes.indexOf(n.type)==-1) {
|
unknownTypes.indexOf(n.type)==-1) {
|
||||||
@@ -1772,6 +1801,7 @@ RED.nodes = (function() {
|
|||||||
var new_nodes = [];
|
var new_nodes = [];
|
||||||
var new_links = [];
|
var new_links = [];
|
||||||
var new_groups = [];
|
var new_groups = [];
|
||||||
|
var new_junctions = [];
|
||||||
var new_group_set = new Set();
|
var new_group_set = new Set();
|
||||||
var nid;
|
var nid;
|
||||||
var def;
|
var def;
|
||||||
@@ -1963,12 +1993,15 @@ RED.nodes = (function() {
|
|||||||
changed:false,
|
changed:false,
|
||||||
_config:{}
|
_config:{}
|
||||||
}
|
}
|
||||||
if (n.type !== "group") {
|
if (n.type !== "group" && n.type !== 'junction') {
|
||||||
node.wires = n.wires||[];
|
node.wires = n.wires||[];
|
||||||
node.inputLabels = n.inputLabels;
|
node.inputLabels = n.inputLabels;
|
||||||
node.outputLabels = n.outputLabels;
|
node.outputLabels = n.outputLabels;
|
||||||
node.icon = n.icon;
|
node.icon = n.icon;
|
||||||
}
|
}
|
||||||
|
if (n.type === 'junction') {
|
||||||
|
node.wires = n.wires||[];
|
||||||
|
}
|
||||||
if (n.hasOwnProperty('l')) {
|
if (n.hasOwnProperty('l')) {
|
||||||
node.l = n.l;
|
node.l = n.l;
|
||||||
}
|
}
|
||||||
@@ -2037,6 +2070,15 @@ RED.nodes = (function() {
|
|||||||
node.outputs = subflow.out.length;
|
node.outputs = subflow.out.length;
|
||||||
node.inputs = subflow.in.length;
|
node.inputs = subflow.in.length;
|
||||||
node.env = n.env;
|
node.env = n.env;
|
||||||
|
} else if (n.type === 'junction') {
|
||||||
|
node._def = {defaults:{}}
|
||||||
|
node._config.x = node.x
|
||||||
|
node._config.y = node.y
|
||||||
|
node.inputs = 1
|
||||||
|
node.outputs = 1
|
||||||
|
node.w = 0;
|
||||||
|
node.h = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!node._def) {
|
if (!node._def) {
|
||||||
if (node.x && node.y) {
|
if (node.x && node.y) {
|
||||||
@@ -2120,7 +2162,9 @@ RED.nodes = (function() {
|
|||||||
node_map[n.id] = node;
|
node_map[n.id] = node;
|
||||||
// If an 'unknown' config node, it will not have been caught by the
|
// If an 'unknown' config node, it will not have been caught by the
|
||||||
// proper config node handling, so needs adding to new_nodes here
|
// proper config node handling, so needs adding to new_nodes here
|
||||||
if (node.type === "unknown" || node._def.category !== "config") {
|
if (node.type === 'junction') {
|
||||||
|
new_junctions.push(node)
|
||||||
|
} else if (node.type === "unknown" || node._def.category !== "config") {
|
||||||
new_nodes.push(node);
|
new_nodes.push(node);
|
||||||
} else if (node.type === "group") {
|
} else if (node.type === "group") {
|
||||||
new_groups.push(node);
|
new_groups.push(node);
|
||||||
@@ -2131,11 +2175,15 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remap all wires and config node references
|
// Remap all wires and config node references
|
||||||
for (i=0;i<new_nodes.length;i++) {
|
for (i=0;i<new_nodes.length+new_junctions.length;i++) {
|
||||||
n = new_nodes[i];
|
if (i<new_nodes.length) {
|
||||||
|
n = new_nodes[i];
|
||||||
|
} else {
|
||||||
|
n = new_junctions[i - new_nodes.length]
|
||||||
|
}
|
||||||
if (n.wires) {
|
if (n.wires) {
|
||||||
for (var w1=0;w1<n.wires.length;w1++) {
|
for (var w1=0;w1<n.wires.length;w1++) {
|
||||||
var wires = (n.wires[w1] instanceof Array)?n.wires[w1]:[n.wires[w1]];
|
var wires = (Array.isArray(n.wires[w1]))?n.wires[w1]:[n.wires[w1]];
|
||||||
for (var w2=0;w2<wires.length;w2++) {
|
for (var w2=0;w2<wires.length;w2++) {
|
||||||
if (node_map.hasOwnProperty(wires[w2])) {
|
if (node_map.hasOwnProperty(wires[w2])) {
|
||||||
if (n.z === node_map[wires[w2]].z) {
|
if (n.z === node_map[wires[w2]].z) {
|
||||||
@@ -2271,6 +2319,12 @@ RED.nodes = (function() {
|
|||||||
addGroup(n);
|
addGroup(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i=0;i<new_junctions.length;i++) {
|
||||||
|
var junction = new_junctions[i];
|
||||||
|
addJunction(junction);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Now the nodes have been fully updated, add them.
|
// Now the nodes have been fully updated, add them.
|
||||||
for (i=0;i<new_nodes.length;i++) {
|
for (i=0;i<new_nodes.length;i++) {
|
||||||
var node = new_nodes[i];
|
var node = new_nodes[i];
|
||||||
@@ -2301,6 +2355,7 @@ RED.nodes = (function() {
|
|||||||
nodes:new_nodes,
|
nodes:new_nodes,
|
||||||
links:new_links,
|
links:new_links,
|
||||||
groups:new_groups,
|
groups:new_groups,
|
||||||
|
junctions: new_junctions,
|
||||||
workspaces:new_workspaces,
|
workspaces:new_workspaces,
|
||||||
subflows:new_subflows,
|
subflows:new_subflows,
|
||||||
missingWorkspace: missingWorkspace,
|
missingWorkspace: missingWorkspace,
|
||||||
@@ -2407,6 +2462,8 @@ RED.nodes = (function() {
|
|||||||
workspacesOrder = [];
|
workspacesOrder = [];
|
||||||
groups = {};
|
groups = {};
|
||||||
groupsByZ = {};
|
groupsByZ = {};
|
||||||
|
junctions = {};
|
||||||
|
junctionsByZ = {};
|
||||||
|
|
||||||
var subflowIds = Object.keys(subflows);
|
var subflowIds = Object.keys(subflows);
|
||||||
subflowIds.forEach(function(id) {
|
subflowIds.forEach(function(id) {
|
||||||
@@ -2456,6 +2513,30 @@ RED.nodes = (function() {
|
|||||||
RED.events.emit("groups:remove",group);
|
RED.events.emit("groups:remove",group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addJunction(junction) {
|
||||||
|
junctionsByZ[junction.z] = junctionsByZ[junction.z] || []
|
||||||
|
junctionsByZ[junction.z].push(junction)
|
||||||
|
junctions[junction.id] = junction;
|
||||||
|
if (!nodeLinks[junction.id]) {
|
||||||
|
nodeLinks[junction.id] = {in:[],out:[]};
|
||||||
|
}
|
||||||
|
RED.events.emit("junctions:add", junction)
|
||||||
|
}
|
||||||
|
function removeJunction(junction) {
|
||||||
|
var i = junctionsByZ[junction.z].indexOf(junction)
|
||||||
|
junctionsByZ[junction.z].splice(i, 1)
|
||||||
|
if (junctionsByZ[junction.z].length === 0) {
|
||||||
|
delete junctionsByZ[junction.z]
|
||||||
|
}
|
||||||
|
delete junctions[junction.id]
|
||||||
|
delete nodeLinks[junction.id];
|
||||||
|
RED.events.emit("junctions:remove", junction)
|
||||||
|
|
||||||
|
var removedLinks = links.filter(function(l) { return (l.source === junction) || (l.target === junction); });
|
||||||
|
removedLinks.forEach(removeLink);
|
||||||
|
return { links: removedLinks }
|
||||||
|
}
|
||||||
|
|
||||||
function getNodeHelp(type) {
|
function getNodeHelp(type) {
|
||||||
var helpContent = "";
|
var helpContent = "";
|
||||||
var helpElement = $("script[data-help-name='"+type+"']");
|
var helpElement = $("script[data-help-name='"+type+"']");
|
||||||
@@ -2684,7 +2765,6 @@ RED.nodes = (function() {
|
|||||||
getType: registry.getNodeType,
|
getType: registry.getNodeType,
|
||||||
getNodeHelp: getNodeHelp,
|
getNodeHelp: getNodeHelp,
|
||||||
convertNode: convertNode,
|
convertNode: convertNode,
|
||||||
|
|
||||||
add: addNode,
|
add: addNode,
|
||||||
remove: removeNode,
|
remove: removeNode,
|
||||||
clear: clear,
|
clear: clear,
|
||||||
@@ -2730,6 +2810,11 @@ RED.nodes = (function() {
|
|||||||
group: function(id) { return groups[id] },
|
group: function(id) { return groups[id] },
|
||||||
groups: function(z) { return groupsByZ[z]?groupsByZ[z].slice():[] },
|
groups: function(z) { return groupsByZ[z]?groupsByZ[z].slice():[] },
|
||||||
|
|
||||||
|
addJunction: addJunction,
|
||||||
|
removeJunction: removeJunction,
|
||||||
|
junction: function(id) { return junctions[id] },
|
||||||
|
junctions: function(z) { return junctionsByZ[z]?junctionsByZ[z].slice():[] },
|
||||||
|
|
||||||
eachNode: function(cb) {
|
eachNode: function(cb) {
|
||||||
allNodes.eachNode(cb);
|
allNodes.eachNode(cb);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -252,8 +252,21 @@ var RED = (function() {
|
|||||||
if (/^#flow\/.+$/.test(currentHash)) {
|
if (/^#flow\/.+$/.test(currentHash)) {
|
||||||
RED.workspaces.show(currentHash.substring(6),true);
|
RED.workspaces.show(currentHash.substring(6),true);
|
||||||
}
|
}
|
||||||
if (RED.workspaces.active() === 0 && RED.workspaces.count() > 0) {
|
if (RED.workspaces.count() > 0) {
|
||||||
RED.workspaces.show(RED.nodes.getWorkspaceOrder()[0])
|
const hiddenTabs = JSON.parse(RED.settings.getLocal("hiddenTabs")||"{}");
|
||||||
|
const workspaces = RED.nodes.getWorkspaceOrder();
|
||||||
|
if (RED.workspaces.active() === 0) {
|
||||||
|
for (let index = 0; index < workspaces.length; index++) {
|
||||||
|
const ws = workspaces[index];
|
||||||
|
if (!hiddenTabs[ws]) {
|
||||||
|
RED.workspaces.show(ws);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (RED.workspaces.active() === 0) {
|
||||||
|
RED.workspaces.show(workspaces[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
console.warn(err);
|
console.warn(err);
|
||||||
@@ -345,6 +358,14 @@ var RED = (function() {
|
|||||||
} else {
|
} else {
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
|
text: RED._("notification.label.unknownNodesButton"),
|
||||||
|
class: "pull-left",
|
||||||
|
click: function() {
|
||||||
|
RED.actions.invoke("core:search", "type:unknown ");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
class: "primary",
|
||||||
text: RED._("common.label.close"),
|
text: RED._("common.label.close"),
|
||||||
click: function() {
|
click: function() {
|
||||||
persistentNotifications[notificationId].hideNotification();
|
persistentNotifications[notificationId].hideNotification();
|
||||||
@@ -461,7 +482,7 @@ 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") && msg.text !== null && /^[@a-zA-Z]/.test(msg.text)) {
|
||||||
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;
|
||||||
@@ -602,7 +623,10 @@ var RED = (function() {
|
|||||||
null,
|
null,
|
||||||
{id: "menu-item-edit-select-all", label:RED._("keyboard.selectAll"), onselect: "core:select-all-nodes"},
|
{id: "menu-item-edit-select-all", label:RED._("keyboard.selectAll"), onselect: "core:select-all-nodes"},
|
||||||
{id: "menu-item-edit-select-connected", label:RED._("keyboard.selectAllConnected"), onselect: "core:select-connected-nodes"},
|
{id: "menu-item-edit-select-connected", label:RED._("keyboard.selectAllConnected"), onselect: "core:select-connected-nodes"},
|
||||||
{id: "menu-item-edit-select-none", label:RED._("keyboard.selectNone"), onselect: "core:select-none"}
|
{id: "menu-item-edit-select-none", label:RED._("keyboard.selectNone"), onselect: "core:select-none"},
|
||||||
|
null,
|
||||||
|
{id: "menu-item-edit-split-wire-with-links", label:RED._("keyboard.splitWireWithLinks"), onselect: "core:split-wire-with-link-nodes"},
|
||||||
|
|
||||||
]});
|
]});
|
||||||
|
|
||||||
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:[
|
||||||
@@ -714,6 +738,7 @@ var RED = (function() {
|
|||||||
RED.search.init();
|
RED.search.init();
|
||||||
RED.actionList.init();
|
RED.actionList.init();
|
||||||
RED.editor.init();
|
RED.editor.init();
|
||||||
|
RED.diagnostics.init();
|
||||||
RED.diff.init();
|
RED.diff.init();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -987,6 +987,7 @@ RED.clipboard = (function() {
|
|||||||
try {
|
try {
|
||||||
RED.view.importNodes(newNodes, importOptions);
|
RED.view.importNodes(newNodes, importOptions);
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
|
console.log(error.importConfig)
|
||||||
// Thrown for import_conflict
|
// Thrown for import_conflict
|
||||||
confirmImport(error.importConfig, newNodes, importOptions);
|
confirmImport(error.importConfig, newNodes, importOptions);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,14 @@
|
|||||||
*
|
*
|
||||||
* options:
|
* options:
|
||||||
*
|
*
|
||||||
* search : function(value, [done])
|
* search: function(value, [done])
|
||||||
* A function that is passed the current contents of the input whenever
|
* A function that is passed the current contents of the input whenever
|
||||||
* it changes.
|
* it changes.
|
||||||
* The function must either return auto-complete options, or pass them
|
* The function must either return auto-complete options, or pass them
|
||||||
* to the optional 'done' parameter.
|
* to the optional 'done' parameter.
|
||||||
* If the function signature includes 'done', it must be used
|
* If the function signature includes 'done', it must be used
|
||||||
|
* minLength: number
|
||||||
|
* If `minLength` is 0, pressing down arrow will show the list
|
||||||
*
|
*
|
||||||
* The auto-complete options should be an array of objects in the form:
|
* The auto-complete options should be an array of objects in the form:
|
||||||
* {
|
* {
|
||||||
@@ -26,10 +28,11 @@
|
|||||||
|
|
||||||
$.widget( "nodered.autoComplete", {
|
$.widget( "nodered.autoComplete", {
|
||||||
_create: function() {
|
_create: function() {
|
||||||
var that = this;
|
const that = this;
|
||||||
this.completionMenuShown = false;
|
this.completionMenuShown = false;
|
||||||
this.options.search = this.options.search || function() { return [] }
|
this.options.minLength = parseInteger(this.options.minLength, 1, 0);
|
||||||
this.element.addClass("red-ui-autoComplete")
|
this.options.search = this.options.search || function() { return [] };
|
||||||
|
this.element.addClass("red-ui-autoComplete");
|
||||||
this.element.on("keydown.red-ui-autoComplete", function(evt) {
|
this.element.on("keydown.red-ui-autoComplete", function(evt) {
|
||||||
if ((evt.keyCode === 13 || evt.keyCode === 9) && that.completionMenuShown) {
|
if ((evt.keyCode === 13 || evt.keyCode === 9) && that.completionMenuShown) {
|
||||||
var opts = that.menu.options();
|
var opts = that.menu.options();
|
||||||
@@ -71,8 +74,8 @@
|
|||||||
this.completionMenuShown = true;
|
this.completionMenuShown = true;
|
||||||
},
|
},
|
||||||
_updateCompletions: function(val) {
|
_updateCompletions: function(val) {
|
||||||
var that = this;
|
const that = this;
|
||||||
if (val.trim() === "") {
|
if (val.trim().length < this.options.minLength) {
|
||||||
if (this.completionMenuShown) {
|
if (this.completionMenuShown) {
|
||||||
this.menu.hide();
|
this.menu.hide();
|
||||||
}
|
}
|
||||||
@@ -96,7 +99,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.options.search.length === 2) {
|
if (this.options.search.length === 2) {
|
||||||
var requestId = 1+Math.floor(Math.random()*10000);
|
const requestId = 1+Math.floor(Math.random()*10000);
|
||||||
this.pendingRequest = requestId;
|
this.pendingRequest = requestId;
|
||||||
this.options.search(val,function(completions) { displayResults(completions,requestId);})
|
this.options.search(val,function(completions) { displayResults(completions,requestId);})
|
||||||
} else {
|
} else {
|
||||||
@@ -112,4 +115,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
function parseInteger(input, def, min, max) {
|
||||||
|
if(input == null) { return (def || 0); }
|
||||||
|
min = min == null ? Number.NEGATIVE_INFINITY : min;
|
||||||
|
max = max == null ? Number.POSITIVE_INFINITY : max;
|
||||||
|
let n = parseInt(input);
|
||||||
|
if(isNaN(n) || n < min || n > max) { n = def || 0; }
|
||||||
|
return n;
|
||||||
|
}
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|||||||
@@ -359,6 +359,7 @@ RED.popover = (function() {
|
|||||||
setTimeout(closePopup,delay.hide);
|
setTimeout(closePopup,delay.hide);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (trigger === 'hover') {
|
if (trigger === 'hover') {
|
||||||
target.on('mouseenter',function(e) {
|
target.on('mouseenter',function(e) {
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
@@ -470,6 +471,11 @@ RED.popover = (function() {
|
|||||||
popover.setAction = function(newAction) {
|
popover.setAction = function(newAction) {
|
||||||
action = newAction;
|
action = newAction;
|
||||||
}
|
}
|
||||||
|
popover.delete = function() {
|
||||||
|
popover.close(true)
|
||||||
|
target.off("mouseenter");
|
||||||
|
target.off("mouseleave");
|
||||||
|
};
|
||||||
return popover;
|
return popover;
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -105,8 +105,8 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.element.on("keydown",function(e) {
|
this.element.on("keydown",function(e) {
|
||||||
if (!menuShown && e.keyCode === 40) {
|
if (!menuShown && e.keyCode === 40 && $(this).val() === '') {
|
||||||
//DOWN
|
//DOWN (only show menu if search field is emty)
|
||||||
showMenu();
|
showMenu();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -670,7 +670,7 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
var link = $("<a/>",{href:"#"+tab.id, class:"red-ui-tab-label"}).appendTo(li);
|
var link = $("<a/>",{href:"#"+tab.id, class:"red-ui-tab-label"}).appendTo(li);
|
||||||
if (tab.icon) {
|
if (tab.icon) {
|
||||||
$('<img src="'+tab.icon+'" class="red-ui-tab-icon"/>').appendTo(link);
|
$('<i>',{class:"red-ui-tab-icon", style:"mask-image: url("+tab.icon+"); -webkit-mask-image: url("+tab.icon+");"}).appendTo(link);
|
||||||
} else if (tab.iconClass) {
|
} else if (tab.iconClass) {
|
||||||
$('<i>',{class:"red-ui-tab-icon "+tab.iconClass}).appendTo(link);
|
$('<i>',{class:"red-ui-tab-icon "+tab.iconClass}).appendTo(link);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,34 +55,46 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
var autoComplete = function(options) {
|
var autoComplete = function(options) {
|
||||||
|
function getMatch(value, searchValue) {
|
||||||
|
const idx = value.toLowerCase().indexOf(searchValue.toLowerCase());
|
||||||
|
const len = idx > -1 ? searchValue.length : 0;
|
||||||
|
return {
|
||||||
|
index: idx,
|
||||||
|
found: idx > -1,
|
||||||
|
pre: value.substring(0,idx),
|
||||||
|
match: value.substring(idx,idx+len),
|
||||||
|
post: value.substring(idx+len),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function generateSpans(match) {
|
||||||
|
const els = [];
|
||||||
|
if(match.pre) { els.push($('<span/>').text(match.pre)); }
|
||||||
|
if(match.match) { els.push($('<span/>',{style:"font-weight: bold; color: var(--red-ui-text-color-link);"}).text(match.match)); }
|
||||||
|
if(match.post) { els.push($('<span/>').text(match.post)); }
|
||||||
|
return els;
|
||||||
|
}
|
||||||
return function(val) {
|
return function(val) {
|
||||||
var matches = [];
|
var matches = [];
|
||||||
options.forEach(opt => {
|
options.forEach(opt => {
|
||||||
let v = opt.value;
|
const optVal = opt.value;
|
||||||
var i = v.toLowerCase().indexOf(val.toLowerCase());
|
const optSrc = (opt.source||[]).join(",");
|
||||||
if (i > -1) {
|
const valMatch = getMatch(optVal, val);
|
||||||
var pre = v.substring(0,i);
|
const srcMatch = getMatch(optSrc, val);
|
||||||
var matchedVal = v.substring(i,i+val.length);
|
if (valMatch.found || srcMatch.found) {
|
||||||
var post = v.substring(i+val.length)
|
const element = $('<div>',{style: "display: flex"});
|
||||||
|
const valEl = $('<div/>',{style:"font-family: var(--red-ui-monospace-font); white-space:nowrap; overflow: hidden; flex-grow:1"});
|
||||||
var el = $('<div/>',{style:"white-space:nowrap; overflow: hidden; flex-grow:1"});
|
valEl.append(generateSpans(valMatch));
|
||||||
$('<span/>').text(pre).appendTo(el);
|
valEl.appendTo(element);
|
||||||
$('<span/>',{style:"font-weight: bold"}).text(matchedVal).appendTo(el);
|
if (optSrc) {
|
||||||
$('<span/>').text(post).appendTo(el);
|
const optEl = $('<div>').css({ "font-size": "0.8em" });
|
||||||
|
optEl.append(generateSpans(srcMatch));
|
||||||
var element = $('<div>',{style: "display: flex"});
|
optEl.appendTo(element);
|
||||||
el.appendTo(element);
|
|
||||||
if (opt.source) {
|
|
||||||
$('<div>').css({
|
|
||||||
"font-size": "0.8em"
|
|
||||||
}).text(opt.source.join(",")).appendTo(element);
|
|
||||||
}
|
}
|
||||||
|
matches.push({
|
||||||
matches.push({
|
value: optVal,
|
||||||
value: v,
|
label: element,
|
||||||
label: element,
|
i: (valMatch.found ? valMatch.index : srcMatch.index)
|
||||||
i:i
|
});
|
||||||
})
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
matches.sort(function(A,B){return A.i-B.i})
|
matches.sort(function(A,B){return A.i-B.i})
|
||||||
@@ -93,6 +105,36 @@
|
|||||||
// This is a hand-generated list of completions for the core nodes (based on the node help html).
|
// This is a hand-generated list of completions for the core nodes (based on the node help html).
|
||||||
var msgCompletions = [
|
var msgCompletions = [
|
||||||
{ value: "payload" },
|
{ value: "payload" },
|
||||||
|
{ value: "topic", source: ["mqtt","inject","rbe"] },
|
||||||
|
{ value: "action", source: ["mqtt"] },
|
||||||
|
{ value: "complete", source: ["join"] },
|
||||||
|
{ value: "contentType", source: ["mqtt"] },
|
||||||
|
{ value: "cookies", source: ["http request","http response"] },
|
||||||
|
{ value: "correlationData", source: ["mqtt"] },
|
||||||
|
{ value: "delay", source: ["delay","trigger"] },
|
||||||
|
{ value: "encoding", source: ["file"] },
|
||||||
|
{ value: "error", source: ["catch"] },
|
||||||
|
{ value: "error.message", source: ["catch"] },
|
||||||
|
{ value: "error.source", source: ["catch"] },
|
||||||
|
{ value: "error.source.id", source: ["catch"] },
|
||||||
|
{ value: "error.source.type", source: ["catch"] },
|
||||||
|
{ value: "error.source.name", source: ["catch"] },
|
||||||
|
{ value: "filename", source: ["file","file in"] },
|
||||||
|
{ value: "flush", source: ["delay"] },
|
||||||
|
{ value: "followRedirects", source: ["http request"] },
|
||||||
|
{ value: "headers", source: ["http response","http request"] },
|
||||||
|
{ value: "host", source: ["tcp request","http request"] },
|
||||||
|
{ value: "ip", source: ["udp out"] },
|
||||||
|
{ value: "kill", source: ["exec"] },
|
||||||
|
{ value: "messageExpiryInterval", source: ["mqtt"] },
|
||||||
|
{ value: "method", source: ["http request"] },
|
||||||
|
{ value: "options", source: ["xml"] },
|
||||||
|
{ value: "parts", source: ["split","join","batch","sort"] },
|
||||||
|
{ value: "pid", source: ["exec"] },
|
||||||
|
{ value: "port", source: ["tcp request"," udp out"] },
|
||||||
|
{ value: "qos", source: ["mqtt"] },
|
||||||
|
{ value: "rate", source: ["delay"] },
|
||||||
|
{ value: "rejectUnauthorized", source: ["http request"] },
|
||||||
{ value: "req", source: ["http in"]},
|
{ value: "req", source: ["http in"]},
|
||||||
{ value: "req.body", source: ["http in"]},
|
{ value: "req.body", source: ["http in"]},
|
||||||
{ value: "req.headers", source: ["http in"]},
|
{ value: "req.headers", source: ["http in"]},
|
||||||
@@ -100,38 +142,28 @@
|
|||||||
{ value: "req.params", source: ["http in"]},
|
{ value: "req.params", source: ["http in"]},
|
||||||
{ value: "req.cookies", source: ["http in"]},
|
{ value: "req.cookies", source: ["http in"]},
|
||||||
{ value: "req.files", source: ["http in"]},
|
{ value: "req.files", source: ["http in"]},
|
||||||
{ value: "complete", source: ["join"] },
|
|
||||||
{ value: "contentType", source: ["mqtt"] },
|
|
||||||
{ value: "cookies", source: ["http in","http request"] },
|
|
||||||
{ value: "correlationData", source: ["mqtt"] },
|
|
||||||
{ value: "delay", source: ["delay","trigger"] },
|
|
||||||
{ value: "encoding", source: ["file"] },
|
|
||||||
{ value: "error", source: ["catch"] },
|
|
||||||
{ value: "filename", source: ["file","file in"] },
|
|
||||||
{ value: "flush", source: ["delay"] },
|
|
||||||
{ value: "followRedirects", source: ["http request"] },
|
|
||||||
{ value: "headers", source: ["http in"," http request"] },
|
|
||||||
{ value: "kill", source: ["exec"] },
|
|
||||||
{ value: "messageExpiryInterval", source: ["mqtt"] },
|
|
||||||
{ value: "method", source: ["http-request"] },
|
|
||||||
{ value: "options", source: ["xml"] },
|
|
||||||
{ value: "parts", source: ["split","join"] },
|
|
||||||
{ value: "pid", source: ["exec"] },
|
|
||||||
{ value: "qos", source: ["mqtt"] },
|
|
||||||
{ value: "rate", source: ["delay"] },
|
|
||||||
{ value: "rejectUnauthorized", source: ["http request"] },
|
|
||||||
{ value: "requestTimeout", source: ["http request"] },
|
{ value: "requestTimeout", source: ["http request"] },
|
||||||
{ value: "reset", source: ["delay","trigger","join","rbe"] },
|
{ value: "reset", source: ["delay","trigger","join","rbe"] },
|
||||||
|
{ value: "responseCookies", source: ["http request"] },
|
||||||
{ value: "responseTopic", source: ["mqtt"] },
|
{ value: "responseTopic", source: ["mqtt"] },
|
||||||
|
{ value: "responseURL", source: ["http request"] },
|
||||||
{ value: "restartTimeout", source: ["join"] },
|
{ value: "restartTimeout", source: ["join"] },
|
||||||
{ value: "retain", source: ["mqtt"] },
|
{ value: "retain", source: ["mqtt"] },
|
||||||
|
{ value: "schema", source: ["json"] },
|
||||||
{ value: "select", source: ["html"] },
|
{ value: "select", source: ["html"] },
|
||||||
{ value: "statusCode", source: ["http in"] },
|
{ value: "statusCode", source: ["http response","http request"] },
|
||||||
|
{ value: "status", source: ["status"] },
|
||||||
|
{ value: "status.text", source: ["status"] },
|
||||||
|
{ value: "status.source", source: ["status"] },
|
||||||
|
{ value: "status.source.type", source: ["status"] },
|
||||||
|
{ value: "status.source.id", source: ["status"] },
|
||||||
|
{ value: "status.source.name", source: ["status"] },
|
||||||
|
{ value: "target", source: ["link call"] },
|
||||||
{ value: "template", source: ["template"] },
|
{ value: "template", source: ["template"] },
|
||||||
{ value: "toFront", source: ["delay"] },
|
{ value: "toFront", source: ["delay"] },
|
||||||
{ value: "topic", source: ["inject","mqtt","rbe"] },
|
|
||||||
{ value: "url", source: ["http request"] },
|
{ value: "url", source: ["http request"] },
|
||||||
{ value: "userProperties", source: ["mqtt"] }
|
{ value: "userProperties", source: ["mqtt"] },
|
||||||
|
{ value: "_session", source: ["websocket out","tcp out"] },
|
||||||
]
|
]
|
||||||
var allOptions = {
|
var allOptions = {
|
||||||
msg: {value:"msg",label:"msg.",validate:RED.utils.validatePropertyExpression, autoComplete: autoComplete(msgCompletions)},
|
msg: {value:"msg",label:"msg.",validate:RED.utils.validatePropertyExpression, autoComplete: autoComplete(msgCompletions)},
|
||||||
@@ -166,6 +198,8 @@
|
|||||||
}
|
}
|
||||||
RED.editor.editJSON({
|
RED.editor.editJSON({
|
||||||
value: value,
|
value: value,
|
||||||
|
stateId: RED.editor.generateViewStateId("typedInput", that, "json"),
|
||||||
|
focus: true,
|
||||||
complete: function(v) {
|
complete: function(v) {
|
||||||
var value = v;
|
var value = v;
|
||||||
try {
|
try {
|
||||||
@@ -188,6 +222,8 @@
|
|||||||
var that = this;
|
var that = this;
|
||||||
RED.editor.editExpression({
|
RED.editor.editExpression({
|
||||||
value: this.value().replace(/\t/g,"\n"),
|
value: this.value().replace(/\t/g,"\n"),
|
||||||
|
stateId: RED.editor.generateViewStateId("typedInput", that, "jsonata"),
|
||||||
|
focus: true,
|
||||||
complete: function(v) {
|
complete: function(v) {
|
||||||
that.value(v.replace(/\n/g,"\t"));
|
that.value(v.replace(/\n/g,"\t"));
|
||||||
}
|
}
|
||||||
@@ -202,6 +238,8 @@
|
|||||||
var that = this;
|
var that = this;
|
||||||
RED.editor.editBuffer({
|
RED.editor.editBuffer({
|
||||||
value: this.value(),
|
value: this.value(),
|
||||||
|
stateId: RED.editor.generateViewStateId("typedInput", that, "bin"),
|
||||||
|
focus: true,
|
||||||
complete: function(v) {
|
complete: function(v) {
|
||||||
that.value(v);
|
that.value(v);
|
||||||
}
|
}
|
||||||
@@ -637,7 +675,7 @@
|
|||||||
if (opt.icon.indexOf("<") === 0) {
|
if (opt.icon.indexOf("<") === 0) {
|
||||||
$(opt.icon).prependTo(op);
|
$(opt.icon).prependTo(op);
|
||||||
} else if (opt.icon.indexOf("/") !== -1) {
|
} else if (opt.icon.indexOf("/") !== -1) {
|
||||||
$('<img>',{src:mapDeprecatedIcon(opt.icon),style:"margin-right: 4px; height: 18px;"}).prependTo(op);
|
$('<i>',{class:"red-ui-typedInput-icon", style:"mask-image: url("+opt.icon+"); -webkit-mask-image: url("+opt.icon+");"}).prependTo(op);
|
||||||
} else {
|
} else {
|
||||||
$('<i>',{class:"red-ui-typedInput-icon "+opt.icon}).prependTo(op);
|
$('<i>',{class:"red-ui-typedInput-icon "+opt.icon}).prependTo(op);
|
||||||
}
|
}
|
||||||
@@ -988,10 +1026,7 @@
|
|||||||
$(opt.icon).prependTo(this.selectLabel);
|
$(opt.icon).prependTo(this.selectLabel);
|
||||||
}
|
}
|
||||||
else if (opt.icon.indexOf("/") !== -1) {
|
else if (opt.icon.indexOf("/") !== -1) {
|
||||||
image = new Image();
|
$('<i>',{class:"red-ui-typedInput-icon", style:"mask-image: url("+opt.icon+"); -webkit-mask-image: url("+opt.icon+"); margin-right: 4px;height: 18px;width:13px"}).prependTo(this.selectLabel);
|
||||||
image.name = opt.icon;
|
|
||||||
image.src = mapDeprecatedIcon(opt.icon);
|
|
||||||
$('<img>',{src:mapDeprecatedIcon(opt.icon),style:"margin-right: 4px;height: 18px;"}).prependTo(this.selectLabel);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$('<i>',{class:"red-ui-typedInput-icon "+opt.icon,style:"min-width: 13px; margin-right: 4px;"}).prependTo(this.selectLabel);
|
$('<i>',{class:"red-ui-typedInput-icon "+opt.icon,style:"min-width: 13px; margin-right: 4px;"}).prependTo(this.selectLabel);
|
||||||
@@ -1147,7 +1182,8 @@
|
|||||||
this.elementDiv.show();
|
this.elementDiv.show();
|
||||||
if (opt.autoComplete) {
|
if (opt.autoComplete) {
|
||||||
this.input.autoComplete({
|
this.input.autoComplete({
|
||||||
search: opt.autoComplete
|
search: opt.autoComplete,
|
||||||
|
minLength: 0
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -319,205 +319,248 @@ RED.deploy = (function() {
|
|||||||
},delta);
|
},delta);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function save(skipValidation,force) {
|
function save(skipValidation, force) {
|
||||||
if (!$("#red-ui-header-button-deploy").hasClass("disabled")) {
|
if ($("#red-ui-header-button-deploy").hasClass("disabled")) {
|
||||||
if (!RED.user.hasPermission("flows.write")) {
|
return; //deploy is disabled
|
||||||
RED.notify(RED._("user.errors.deploy"),"error");
|
}
|
||||||
|
if ($("#red-ui-header-shade").is(":visible")) {
|
||||||
|
return; //deploy is shaded
|
||||||
|
}
|
||||||
|
if (!RED.user.hasPermission("flows.write")) {
|
||||||
|
RED.notify(RED._("user.errors.deploy"), "error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let hasUnusedConfig = false;
|
||||||
|
if (!skipValidation) {
|
||||||
|
let hasUnknown = false;
|
||||||
|
let hasInvalid = false;
|
||||||
|
const unknownNodes = [];
|
||||||
|
const invalidNodes = [];
|
||||||
|
|
||||||
|
RED.nodes.eachConfig(function (node) {
|
||||||
|
if (node.valid === undefined) {
|
||||||
|
RED.editor.validateNode(node);
|
||||||
|
}
|
||||||
|
if (!node.valid && !node.d) {
|
||||||
|
invalidNodes.push(getNodeInfo(node));
|
||||||
|
}
|
||||||
|
if (node.type === "unknown") {
|
||||||
|
if (unknownNodes.indexOf(node.name) == -1) {
|
||||||
|
unknownNodes.push(node.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
RED.nodes.eachNode(function (node) {
|
||||||
|
if (!node.valid && !node.d) {
|
||||||
|
invalidNodes.push(getNodeInfo(node));
|
||||||
|
}
|
||||||
|
if (node.type === "unknown") {
|
||||||
|
if (unknownNodes.indexOf(node.name) == -1) {
|
||||||
|
unknownNodes.push(node.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
hasUnknown = unknownNodes.length > 0;
|
||||||
|
hasInvalid = invalidNodes.length > 0;
|
||||||
|
|
||||||
|
const unusedConfigNodes = [];
|
||||||
|
RED.nodes.eachConfig(function (node) {
|
||||||
|
if ((node._def.hasUsers !== false) && (node.users.length === 0)) {
|
||||||
|
unusedConfigNodes.push(getNodeInfo(node));
|
||||||
|
hasUnusedConfig = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let showWarning = false;
|
||||||
|
let notificationMessage;
|
||||||
|
let notificationButtons = [];
|
||||||
|
let notification;
|
||||||
|
if (hasUnknown && !ignoreDeployWarnings.unknown) {
|
||||||
|
showWarning = true;
|
||||||
|
notificationMessage = "<p>" + RED._('deploy.confirm.unknown') + "</p>" +
|
||||||
|
'<ul class="red-ui-deploy-dialog-confirm-list"><li>' + cropList(unknownNodes).map(function (n) { return sanitize(n) }).join("</li><li>") + "</li></ul><p>" +
|
||||||
|
RED._('deploy.confirm.confirm') +
|
||||||
|
"</p>";
|
||||||
|
|
||||||
|
notificationButtons = [
|
||||||
|
{
|
||||||
|
text: RED._("deploy.unknownNodesButton"),
|
||||||
|
class: "pull-left",
|
||||||
|
click: function() {
|
||||||
|
notification.close();
|
||||||
|
RED.actions.invoke("core:search","type:unknown ");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "red-ui-deploy-dialog-confirm-deploy-deploy",
|
||||||
|
text: RED._("deploy.confirm.button.confirm"),
|
||||||
|
class: "primary",
|
||||||
|
click: function () {
|
||||||
|
save(true);
|
||||||
|
notification.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
} else if (hasInvalid && !ignoreDeployWarnings.invalid) {
|
||||||
|
showWarning = true;
|
||||||
|
invalidNodes.sort(sortNodeInfo);
|
||||||
|
|
||||||
|
notificationMessage = "<p>" + RED._('deploy.confirm.improperlyConfigured') + "</p>" +
|
||||||
|
'<ul class="red-ui-deploy-dialog-confirm-list"><li>' + cropList(invalidNodes.map(function (A) { return sanitize((A.tab ? "[" + A.tab + "] " : "") + A.label + " (" + A.type + ")") })).join("</li><li>") + "</li></ul><p>" +
|
||||||
|
RED._('deploy.confirm.confirm') +
|
||||||
|
"</p>";
|
||||||
|
notificationButtons = [
|
||||||
|
{
|
||||||
|
text: RED._("deploy.invalidNodesButton"),
|
||||||
|
class: "pull-left",
|
||||||
|
click: function() {
|
||||||
|
notification.close();
|
||||||
|
RED.actions.invoke("core:search","is:invalid ");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "red-ui-deploy-dialog-confirm-deploy-deploy",
|
||||||
|
text: RED._("deploy.confirm.button.confirm"),
|
||||||
|
class: "primary",
|
||||||
|
click: function () {
|
||||||
|
save(true);
|
||||||
|
notification.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
if (showWarning) {
|
||||||
|
notificationButtons.unshift(
|
||||||
|
{
|
||||||
|
text: RED._("common.label.cancel"),
|
||||||
|
click: function () {
|
||||||
|
notification.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
notification = RED.notify(notificationMessage, {
|
||||||
|
modal: true,
|
||||||
|
fixed: true,
|
||||||
|
buttons: notificationButtons
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!skipValidation) {
|
|
||||||
var hasUnknown = false;
|
|
||||||
var hasInvalid = false;
|
|
||||||
var hasUnusedConfig = false;
|
|
||||||
|
|
||||||
var unknownNodes = [];
|
|
||||||
var invalidNodes = [];
|
|
||||||
|
|
||||||
RED.nodes.eachConfig(function(node) {
|
|
||||||
if (node.valid === undefined) {
|
|
||||||
RED.editor.validateNode(node);
|
|
||||||
}
|
|
||||||
if (!node.valid && !node.d) {
|
|
||||||
invalidNodes.push(getNodeInfo(node));
|
|
||||||
}
|
|
||||||
if (node.type === "unknown") {
|
|
||||||
if (unknownNodes.indexOf(node.name) == -1) {
|
|
||||||
unknownNodes.push(node.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
RED.nodes.eachNode(function(node) {
|
|
||||||
if (!node.valid && !node.d) {
|
|
||||||
invalidNodes.push(getNodeInfo(node));
|
|
||||||
}
|
|
||||||
if (node.type === "unknown") {
|
|
||||||
if (unknownNodes.indexOf(node.name) == -1) {
|
|
||||||
unknownNodes.push(node.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hasUnknown = unknownNodes.length > 0;
|
|
||||||
hasInvalid = invalidNodes.length > 0;
|
|
||||||
|
|
||||||
var unusedConfigNodes = [];
|
|
||||||
RED.nodes.eachConfig(function(node) {
|
|
||||||
if ((node._def.hasUsers !== false) && (node.users.length === 0)) {
|
|
||||||
unusedConfigNodes.push(getNodeInfo(node));
|
|
||||||
hasUnusedConfig = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var showWarning = false;
|
|
||||||
var notificationMessage;
|
|
||||||
var notificationButtons = [];
|
|
||||||
var notification;
|
|
||||||
if (hasUnknown && !ignoreDeployWarnings.unknown) {
|
|
||||||
showWarning = true;
|
|
||||||
notificationMessage = "<p>"+RED._('deploy.confirm.unknown')+"</p>"+
|
|
||||||
'<ul class="red-ui-deploy-dialog-confirm-list"><li>'+cropList(unknownNodes).map(function(n) { return sanitize(n) }).join("</li><li>")+"</li></ul><p>"+
|
|
||||||
RED._('deploy.confirm.confirm')+
|
|
||||||
"</p>";
|
|
||||||
|
|
||||||
notificationButtons= [
|
|
||||||
{
|
|
||||||
id: "red-ui-deploy-dialog-confirm-deploy-deploy",
|
|
||||||
text: RED._("deploy.confirm.button.confirm"),
|
|
||||||
class: "primary",
|
|
||||||
click: function() {
|
|
||||||
save(true);
|
|
||||||
notification.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
} else if (hasInvalid && !ignoreDeployWarnings.invalid) {
|
|
||||||
showWarning = true;
|
|
||||||
invalidNodes.sort(sortNodeInfo);
|
|
||||||
|
|
||||||
notificationMessage = "<p>"+RED._('deploy.confirm.improperlyConfigured')+"</p>"+
|
|
||||||
'<ul class="red-ui-deploy-dialog-confirm-list"><li>'+cropList(invalidNodes.map(function(A) { return sanitize( (A.tab?"["+A.tab+"] ":"")+A.label+" ("+A.type+")")})).join("</li><li>")+"</li></ul><p>"+
|
|
||||||
RED._('deploy.confirm.confirm')+
|
|
||||||
"</p>";
|
|
||||||
notificationButtons= [
|
|
||||||
{
|
|
||||||
id: "red-ui-deploy-dialog-confirm-deploy-deploy",
|
|
||||||
text: RED._("deploy.confirm.button.confirm"),
|
|
||||||
class: "primary",
|
|
||||||
click: function() {
|
|
||||||
save(true);
|
|
||||||
notification.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if (showWarning) {
|
|
||||||
notificationButtons.unshift(
|
|
||||||
{
|
|
||||||
text: RED._("common.label.cancel"),
|
|
||||||
click: function() {
|
|
||||||
notification.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
notification = RED.notify(notificationMessage,{
|
|
||||||
modal: true,
|
|
||||||
fixed: true,
|
|
||||||
buttons:notificationButtons
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var nns = RED.nodes.createCompleteNodeSet();
|
|
||||||
|
|
||||||
var startTime = Date.now();
|
|
||||||
$(".red-ui-deploy-button-content").css('opacity',0);
|
|
||||||
$(".red-ui-deploy-button-spinner").show();
|
|
||||||
$("#red-ui-header-button-deploy").addClass("disabled");
|
|
||||||
|
|
||||||
var data = {flows:nns};
|
|
||||||
|
|
||||||
if (!force) {
|
|
||||||
data.rev = RED.nodes.version();
|
|
||||||
}
|
|
||||||
|
|
||||||
deployInflight = true;
|
|
||||||
$("#red-ui-header-shade").show();
|
|
||||||
$("#red-ui-editor-shade").show();
|
|
||||||
$("#red-ui-palette-shade").show();
|
|
||||||
$("#red-ui-sidebar-shade").show();
|
|
||||||
$.ajax({
|
|
||||||
url:"flows",
|
|
||||||
type: "POST",
|
|
||||||
data: JSON.stringify(data),
|
|
||||||
contentType: "application/json; charset=utf-8",
|
|
||||||
headers: {
|
|
||||||
"Node-RED-Deployment-Type":deploymentType
|
|
||||||
}
|
|
||||||
}).done(function(data,textStatus,xhr) {
|
|
||||||
RED.nodes.dirty(false);
|
|
||||||
RED.nodes.version(data.rev);
|
|
||||||
RED.nodes.originalFlow(nns);
|
|
||||||
if (hasUnusedConfig) {
|
|
||||||
RED.notify(
|
|
||||||
'<p>'+RED._("deploy.successfulDeploy")+'</p>'+
|
|
||||||
'<p>'+RED._("deploy.unusedConfigNodes")+' <a href="#" onclick="RED.sidebar.config.show(true); return false;">'+RED._("deploy.unusedConfigNodesLink")+'</a></p>',"success",false,6000);
|
|
||||||
} else {
|
|
||||||
RED.notify('<p>'+RED._("deploy.successfulDeploy")+'</p>',"success");
|
|
||||||
}
|
|
||||||
RED.nodes.eachNode(function(node) {
|
|
||||||
if (node.changed) {
|
|
||||||
node.dirty = true;
|
|
||||||
node.changed = false;
|
|
||||||
}
|
|
||||||
if (node.moved) {
|
|
||||||
node.dirty = true;
|
|
||||||
node.moved = false;
|
|
||||||
}
|
|
||||||
if(node.credentials) {
|
|
||||||
delete node.credentials;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
RED.nodes.eachConfig(function (confNode) {
|
|
||||||
confNode.changed = false;
|
|
||||||
if (confNode.credentials) {
|
|
||||||
delete confNode.credentials;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
RED.nodes.eachSubflow(function(subflow) {
|
|
||||||
subflow.changed = false;
|
|
||||||
});
|
|
||||||
RED.nodes.eachWorkspace(function(ws) {
|
|
||||||
ws.changed = false;
|
|
||||||
});
|
|
||||||
// Once deployed, cannot undo back to a clean state
|
|
||||||
RED.history.markAllDirty();
|
|
||||||
RED.view.redraw();
|
|
||||||
RED.events.emit("deploy");
|
|
||||||
}).fail(function(xhr,textStatus,err) {
|
|
||||||
RED.nodes.dirty(true);
|
|
||||||
$("#red-ui-header-button-deploy").removeClass("disabled");
|
|
||||||
if (xhr.status === 401) {
|
|
||||||
RED.notify(RED._("deploy.deployFailed",{message:RED._("user.notAuthorized")}),"error");
|
|
||||||
} else if (xhr.status === 409) {
|
|
||||||
resolveConflict(nns, true);
|
|
||||||
} else if (xhr.responseText) {
|
|
||||||
RED.notify(RED._("deploy.deployFailed",{message:xhr.responseText}),"error");
|
|
||||||
} else {
|
|
||||||
RED.notify(RED._("deploy.deployFailed",{message:RED._("deploy.errors.noResponse")}),"error");
|
|
||||||
}
|
|
||||||
}).always(function() {
|
|
||||||
deployInflight = false;
|
|
||||||
var delta = Math.max(0,300-(Date.now()-startTime));
|
|
||||||
setTimeout(function() {
|
|
||||||
$(".red-ui-deploy-button-content").css('opacity',1);
|
|
||||||
$(".red-ui-deploy-button-spinner").hide();
|
|
||||||
$("#red-ui-header-shade").hide();
|
|
||||||
$("#red-ui-editor-shade").hide();
|
|
||||||
$("#red-ui-palette-shade").hide();
|
|
||||||
$("#red-ui-sidebar-shade").hide();
|
|
||||||
},delta);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const nns = RED.nodes.createCompleteNodeSet();
|
||||||
|
const startTime = Date.now();
|
||||||
|
|
||||||
|
$(".red-ui-deploy-button-content").css('opacity', 0);
|
||||||
|
$(".red-ui-deploy-button-spinner").show();
|
||||||
|
$("#red-ui-header-button-deploy").addClass("disabled");
|
||||||
|
|
||||||
|
const data = { flows: nns };
|
||||||
|
|
||||||
|
if (!force) {
|
||||||
|
data.rev = RED.nodes.version();
|
||||||
|
}
|
||||||
|
|
||||||
|
deployInflight = true;
|
||||||
|
$("#red-ui-header-shade").show();
|
||||||
|
$("#red-ui-editor-shade").show();
|
||||||
|
$("#red-ui-palette-shade").show();
|
||||||
|
$("#red-ui-sidebar-shade").show();
|
||||||
|
$.ajax({
|
||||||
|
url: "flows",
|
||||||
|
type: "POST",
|
||||||
|
data: JSON.stringify(data),
|
||||||
|
contentType: "application/json; charset=utf-8",
|
||||||
|
headers: {
|
||||||
|
"Node-RED-Deployment-Type": deploymentType
|
||||||
|
}
|
||||||
|
}).done(function (data, textStatus, xhr) {
|
||||||
|
RED.nodes.dirty(false);
|
||||||
|
RED.nodes.version(data.rev);
|
||||||
|
RED.nodes.originalFlow(nns);
|
||||||
|
if (hasUnusedConfig) {
|
||||||
|
let notification;
|
||||||
|
const opts = {
|
||||||
|
type: "success",
|
||||||
|
fixed: false,
|
||||||
|
timeout: 6000,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: RED._("deploy.unusedConfigNodesButton"),
|
||||||
|
class: "pull-left",
|
||||||
|
click: function() {
|
||||||
|
notification.close();
|
||||||
|
RED.actions.invoke("core:search","is:config is:unused ");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: RED._("common.label.close"),
|
||||||
|
class: "primary",
|
||||||
|
click: function () {
|
||||||
|
save(true);
|
||||||
|
notification.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
notification = RED.notify(
|
||||||
|
'<p>' + RED._("deploy.successfulDeploy") + '</p>' +
|
||||||
|
'<p>' + RED._("deploy.unusedConfigNodes") + '</p>', opts);
|
||||||
|
} else {
|
||||||
|
RED.notify('<p>' + RED._("deploy.successfulDeploy") + '</p>', "success");
|
||||||
|
}
|
||||||
|
RED.nodes.eachNode(function (node) {
|
||||||
|
if (node.changed) {
|
||||||
|
node.dirty = true;
|
||||||
|
node.changed = false;
|
||||||
|
}
|
||||||
|
if (node.moved) {
|
||||||
|
node.dirty = true;
|
||||||
|
node.moved = false;
|
||||||
|
}
|
||||||
|
if (node.credentials) {
|
||||||
|
delete node.credentials;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
RED.nodes.eachConfig(function (confNode) {
|
||||||
|
confNode.changed = false;
|
||||||
|
if (confNode.credentials) {
|
||||||
|
delete confNode.credentials;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
RED.nodes.eachSubflow(function (subflow) {
|
||||||
|
subflow.changed = false;
|
||||||
|
});
|
||||||
|
RED.nodes.eachWorkspace(function (ws) {
|
||||||
|
ws.changed = false;
|
||||||
|
});
|
||||||
|
// Once deployed, cannot undo back to a clean state
|
||||||
|
RED.history.markAllDirty();
|
||||||
|
RED.view.redraw();
|
||||||
|
RED.events.emit("deploy");
|
||||||
|
}).fail(function (xhr, textStatus, err) {
|
||||||
|
RED.nodes.dirty(true);
|
||||||
|
$("#red-ui-header-button-deploy").removeClass("disabled");
|
||||||
|
if (xhr.status === 401) {
|
||||||
|
RED.notify(RED._("deploy.deployFailed", { message: RED._("user.notAuthorized") }), "error");
|
||||||
|
} else if (xhr.status === 409) {
|
||||||
|
resolveConflict(nns, true);
|
||||||
|
} else if (xhr.responseText) {
|
||||||
|
RED.notify(RED._("deploy.deployFailed", { message: xhr.responseText }), "error");
|
||||||
|
} else {
|
||||||
|
RED.notify(RED._("deploy.deployFailed", { message: RED._("deploy.errors.noResponse") }), "error");
|
||||||
|
}
|
||||||
|
}).always(function () {
|
||||||
|
deployInflight = false;
|
||||||
|
const delta = Math.max(0, 300 - (Date.now() - startTime));
|
||||||
|
setTimeout(function () {
|
||||||
|
$(".red-ui-deploy-button-content").css('opacity', 1);
|
||||||
|
$(".red-ui-deploy-button-spinner").hide();
|
||||||
|
$("#red-ui-header-shade").hide();
|
||||||
|
$("#red-ui-editor-shade").hide();
|
||||||
|
$("#red-ui-palette-shade").hide();
|
||||||
|
$("#red-ui-sidebar-shade").hide();
|
||||||
|
}, delta);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
init: init,
|
init: init,
|
||||||
|
|||||||
61
packages/node_modules/@node-red/editor-client/src/js/ui/diagnostics.js
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
RED.diagnostics = (function () {
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
if (RED.settings.get('diagnostics.ui', true) === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RED.actions.add("core:show-system-info", function () { show(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
function show() {
|
||||||
|
$.ajax({
|
||||||
|
headers: {
|
||||||
|
"Accept": "application/json"
|
||||||
|
},
|
||||||
|
cache: false,
|
||||||
|
url: 'diagnostics',
|
||||||
|
success: function (data) {
|
||||||
|
var json = JSON.stringify(data || {}, "", 4);
|
||||||
|
if (json === "{}") {
|
||||||
|
json = "{\n\n}";
|
||||||
|
}
|
||||||
|
RED.editor.editJSON({
|
||||||
|
title: RED._('diagnostics.title'),
|
||||||
|
value: json,
|
||||||
|
requireValid: true,
|
||||||
|
readOnly: true,
|
||||||
|
toolbarButtons: [
|
||||||
|
{
|
||||||
|
text: RED._('clipboard.export.copy'),
|
||||||
|
icon: 'fa fa-copy',
|
||||||
|
click: function () {
|
||||||
|
RED.clipboard.copyText(json, $(this), RED._('clipboard.copyMessageValue'))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: RED._('clipboard.download'),
|
||||||
|
icon: 'fa fa-download',
|
||||||
|
click: function () {
|
||||||
|
var element = document.createElement('a');
|
||||||
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(json));
|
||||||
|
element.setAttribute('download', "system-info.json");
|
||||||
|
element.style.display = 'none';
|
||||||
|
document.body.appendChild(element);
|
||||||
|
element.click();
|
||||||
|
document.body.removeChild(element);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function (jqXHR, textStatus, errorThrown) {
|
||||||
|
console.log("Unexpected error loading system info:", jqXHR.status, textStatus, errorThrown);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
};
|
||||||
|
})();
|
||||||
@@ -110,7 +110,11 @@ RED.editor = (function() {
|
|||||||
var result = [];
|
var result = [];
|
||||||
for (var prop in definition) {
|
for (var prop in definition) {
|
||||||
if (definition.hasOwnProperty(prop)) {
|
if (definition.hasOwnProperty(prop)) {
|
||||||
if (!validateNodeProperty(node, definition, prop, properties[prop])) {
|
var valid = validateNodeProperty(node, definition, prop, properties[prop]);
|
||||||
|
if ((typeof valid) === "string") {
|
||||||
|
result.push(valid);
|
||||||
|
}
|
||||||
|
else if(!valid) {
|
||||||
result.push(prop);
|
result.push(prop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,7 +128,7 @@ RED.editor = (function() {
|
|||||||
* @param definition - the node property definitions (either def.defaults or def.creds)
|
* @param definition - the node property definitions (either def.defaults or def.creds)
|
||||||
* @param property - the property name being validated
|
* @param property - the property name being validated
|
||||||
* @param value - the property value being validated
|
* @param value - the property value being validated
|
||||||
* @returns {boolean} whether the node proprty is valid
|
* @returns {boolean|string} whether the node proprty is valid. `true`: valid `false|String`: invalid
|
||||||
*/
|
*/
|
||||||
function validateNodeProperty(node,definition,property,value) {
|
function validateNodeProperty(node,definition,property,value) {
|
||||||
var valid = true;
|
var valid = true;
|
||||||
@@ -136,22 +140,74 @@ RED.editor = (function() {
|
|||||||
if (/^\$\{[a-zA-Z_][a-zA-Z0-9_]*\}$/.test(value)) {
|
if (/^\$\{[a-zA-Z_][a-zA-Z0-9_]*\}$/.test(value)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
var label = null;
|
||||||
|
if (("label" in definition[property]) &&
|
||||||
|
((typeof definition[property].label) == "string")) {
|
||||||
|
label = definition[property].label;
|
||||||
|
}
|
||||||
if ("required" in definition[property] && definition[property].required) {
|
if ("required" in definition[property] && definition[property].required) {
|
||||||
valid = value !== "";
|
valid = value !== "";
|
||||||
|
if (!valid && label) {
|
||||||
|
return RED._("validator.errors.missing-required-prop", {
|
||||||
|
prop: label
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (valid && "validate" in definition[property]) {
|
if (valid && "validate" in definition[property]) {
|
||||||
try {
|
try {
|
||||||
valid = definition[property].validate.call(node,value);
|
var opt = {};
|
||||||
|
if (label) {
|
||||||
|
opt.label = label;
|
||||||
|
}
|
||||||
|
valid = definition[property].validate.call(node,value, opt);
|
||||||
|
// If the validator takes two arguments, it is a 3.x validator that
|
||||||
|
// can return a String to mean 'invalid' and provide a reason
|
||||||
|
if ((definition[property].validate.length === 2) &&
|
||||||
|
((typeof valid) === "string")) {
|
||||||
|
return valid;
|
||||||
|
} else {
|
||||||
|
// Otherwise, a 2.x returns a truth-like/false-like value that
|
||||||
|
// we should cooerce to a boolean.
|
||||||
|
valid = !!valid
|
||||||
|
}
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
console.log("Validation error:",node.type,node.id,"property: "+property,"value:",value,err);
|
console.log("Validation error:",node.type,node.id,"property: "+property,"value:",value,err);
|
||||||
|
return RED._("validator.errors.validation-error", {
|
||||||
|
prop: property,
|
||||||
|
node: node.type,
|
||||||
|
id: node.id,
|
||||||
|
error: err.message
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (valid && definition[property].type && RED.nodes.getType(definition[property].type) && !("validate" in definition[property])) {
|
if (valid && definition[property].type && RED.nodes.getType(definition[property].type) && !("validate" in definition[property])) {
|
||||||
if (!value || value == "_ADD_") {
|
if (!value || value == "_ADD_") {
|
||||||
valid = definition[property].hasOwnProperty("required") && !definition[property].required;
|
valid = definition[property].hasOwnProperty("required") && !definition[property].required;
|
||||||
|
if (!valid && label) {
|
||||||
|
return RED._("validator.errors.missing-required-prop", {
|
||||||
|
prop: label
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
var configNode = RED.nodes.node(value);
|
var configNode = RED.nodes.node(value);
|
||||||
valid = (configNode && (configNode.valid == null || configNode.valid));
|
if (configNode) {
|
||||||
|
if ((configNode.valid == null) || configNode.valid) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (label) {
|
||||||
|
return RED._("validator.errors.invalid-config", {
|
||||||
|
prop: label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (label) {
|
||||||
|
return RED._("validator.errors.missing-config", {
|
||||||
|
prop: label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return valid;
|
return valid;
|
||||||
@@ -179,10 +235,26 @@ RED.editor = (function() {
|
|||||||
if (defaults[property].hasOwnProperty("format") && defaults[property].format !== "" && input[0].nodeName === "DIV") {
|
if (defaults[property].hasOwnProperty("format") && defaults[property].format !== "" && input[0].nodeName === "DIV") {
|
||||||
value = input.text();
|
value = input.text();
|
||||||
}
|
}
|
||||||
if (!validateNodeProperty(node, defaults, property,value)) {
|
var valid = validateNodeProperty(node, defaults, property,value);
|
||||||
|
if (((typeof valid) === "string") || !valid) {
|
||||||
input.addClass("input-error");
|
input.addClass("input-error");
|
||||||
|
if ((typeof valid) === "string") {
|
||||||
|
var tooltip = input.data("tooltip");
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.setContent(valid);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tooltip = RED.popover.tooltip(input, valid);
|
||||||
|
input.data("tooltip", tooltip);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
input.removeClass("input-error");
|
input.removeClass("input-error");
|
||||||
|
var tooltip = input.data("tooltip");
|
||||||
|
if (tooltip) {
|
||||||
|
input.data("tooltip", null);
|
||||||
|
tooltip.delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -349,20 +421,11 @@ RED.editor = (function() {
|
|||||||
* @param prefix - the prefix to use in the input element ids (node-input|node-config-input)
|
* @param prefix - the prefix to use in the input element ids (node-input|node-config-input)
|
||||||
*/
|
*/
|
||||||
function attachPropertyChangeHandler(node,definition,property,prefix) {
|
function attachPropertyChangeHandler(node,definition,property,prefix) {
|
||||||
var input = $("#"+prefix+"-"+property);
|
$("#"+prefix+"-"+property).on("change keyup paste", function(event) {
|
||||||
if (definition !== undefined && "format" in definition[property] && definition[property].format !== "" && input[0].nodeName === "DIV") {
|
if (!$(this).attr("skipValidation")) {
|
||||||
$("#"+prefix+"-"+property).on('change keyup', function(event) {
|
validateNodeEditor(node,prefix);
|
||||||
if (!$(this).attr("skipValidation")) {
|
}
|
||||||
validateNodeEditor(node,prefix);
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
$("#"+prefix+"-"+property).on("change", function(event) {
|
|
||||||
if (!$(this).attr("skipValidation")) {
|
|
||||||
validateNodeEditor(node,prefix);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -796,6 +859,7 @@ RED.editor = (function() {
|
|||||||
if (buildingEditDialog) { return }
|
if (buildingEditDialog) { return }
|
||||||
buildingEditDialog = true;
|
buildingEditDialog = true;
|
||||||
var editing_node = node;
|
var editing_node = node;
|
||||||
|
var removeInfoEditorOnClose = false;
|
||||||
var skipInfoRefreshOnClose = false;
|
var skipInfoRefreshOnClose = false;
|
||||||
var activeEditPanes = [];
|
var activeEditPanes = [];
|
||||||
|
|
||||||
@@ -991,6 +1055,14 @@ RED.editor = (function() {
|
|||||||
}
|
}
|
||||||
if (!node._def.defaults || !node._def.defaults.hasOwnProperty('info')) {
|
if (!node._def.defaults || !node._def.defaults.hasOwnProperty('info')) {
|
||||||
nodeEditPanes.push('editor-tab-description');
|
nodeEditPanes.push('editor-tab-description');
|
||||||
|
removeInfoEditorOnClose = true;
|
||||||
|
if(node.infoEditor) {
|
||||||
|
//As 'editor-tab-description' adds `node.infoEditor` store original & set a
|
||||||
|
//flag to NOT remove this property
|
||||||
|
node.infoEditor__orig = node.infoEditor;
|
||||||
|
delete node.infoEditor;
|
||||||
|
removeInfoEditorOnClose = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nodeEditPanes.push("editor-tab-appearance");
|
nodeEditPanes.push("editor-tab-appearance");
|
||||||
|
|
||||||
@@ -1006,8 +1078,17 @@ RED.editor = (function() {
|
|||||||
if (RED.view.state() != RED.state.IMPORT_DRAGGING) {
|
if (RED.view.state() != RED.state.IMPORT_DRAGGING) {
|
||||||
RED.view.state(RED.state.DEFAULT);
|
RED.view.state(RED.state.DEFAULT);
|
||||||
}
|
}
|
||||||
if (editing_node && !skipInfoRefreshOnClose) {
|
if (editing_node) {
|
||||||
RED.sidebar.info.refresh(editing_node);
|
if (editing_node.infoEditor__orig) {
|
||||||
|
editing_node.infoEditor = editing_node.infoEditor__orig;
|
||||||
|
delete editing_node.infoEditor__orig;
|
||||||
|
}
|
||||||
|
if (removeInfoEditorOnClose) {
|
||||||
|
delete editing_node.infoEditor;
|
||||||
|
}
|
||||||
|
if (!skipInfoRefreshOnClose) {
|
||||||
|
RED.sidebar.info.refresh(editing_node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
RED.workspaces.refresh();
|
RED.workspaces.refresh();
|
||||||
|
|
||||||
@@ -1867,6 +1948,48 @@ RED.editor = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Genrate a consistent but unique ID for saving and restoring the code editors view state */
|
||||||
|
function generateViewStateId(source, thing, suffix) {
|
||||||
|
try {
|
||||||
|
thing = thing || {};
|
||||||
|
const thingOptions = typeof thing.options === "object" ? thing.options : {};
|
||||||
|
let stateId;
|
||||||
|
if (thing.hasOwnProperty("stateId")) {
|
||||||
|
stateId = thing.stateId
|
||||||
|
} else if (thingOptions.hasOwnProperty("stateId")) {
|
||||||
|
stateId = thing.stateId
|
||||||
|
}
|
||||||
|
if (stateId === false) { return false; }
|
||||||
|
if (!stateId) {
|
||||||
|
let id;
|
||||||
|
const selection = RED.view.selection();
|
||||||
|
if (source === "node" && thing.id) {
|
||||||
|
id = thing.id;
|
||||||
|
} else if (selection.nodes && selection.nodes.length) {
|
||||||
|
id = selection.nodes[0].id;
|
||||||
|
} else {
|
||||||
|
return false; //cant obtain Id.
|
||||||
|
}
|
||||||
|
//Use a string builder to build an ID
|
||||||
|
const sb = [id];
|
||||||
|
//get the index of the el - there may be more than one editor.
|
||||||
|
const el = $(thing.element || thingOptions.element);
|
||||||
|
if(el.length) {
|
||||||
|
sb.push(el.closest(".form-row").index());
|
||||||
|
sb.push(el.index());
|
||||||
|
}
|
||||||
|
if (source == "typedInput") {
|
||||||
|
sb.push(el.closest("li").index());//for when embeded in editable list
|
||||||
|
if (!suffix && thing.propertyType) { suffix = thing.propertyType }
|
||||||
|
}
|
||||||
|
stateId = sb.join("/");
|
||||||
|
}
|
||||||
|
if (stateId && suffix) { stateId += "/" + suffix; }
|
||||||
|
return stateId;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
init: function() {
|
init: function() {
|
||||||
if(window.ace) { window.ace.config.set('basePath', 'vendor/ace'); }
|
if(window.ace) { window.ace.config.set('basePath', 'vendor/ace'); }
|
||||||
@@ -1883,6 +2006,7 @@ RED.editor = (function() {
|
|||||||
});
|
});
|
||||||
RED.editor.codeEditor.init();
|
RED.editor.codeEditor.init();
|
||||||
},
|
},
|
||||||
|
generateViewStateId: generateViewStateId,
|
||||||
edit: showEditDialog,
|
edit: showEditDialog,
|
||||||
editConfig: showEditConfigNodeDialog,
|
editConfig: showEditConfigNodeDialog,
|
||||||
editFlow: showEditFlowDialog,
|
editFlow: showEditFlowDialog,
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
var definition = {
|
var definition = {
|
||||||
show: function(options) {
|
show: function(options) {
|
||||||
var value = options.value;
|
var value = options.value;
|
||||||
|
var onCancel = options.cancel;
|
||||||
var onComplete = options.complete;
|
var onComplete = options.complete;
|
||||||
var type = "_buffer"
|
var type = "_buffer"
|
||||||
if ($("script[data-template-name='"+type+"']").length === 0) {
|
if ($("script[data-template-name='"+type+"']").length === 0) {
|
||||||
@@ -60,12 +61,14 @@
|
|||||||
|
|
||||||
var trayOptions = {
|
var trayOptions = {
|
||||||
title: options.title,
|
title: options.title,
|
||||||
|
focusElement: options.focusElement,
|
||||||
width: "inherit",
|
width: "inherit",
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
id: "node-dialog-cancel",
|
id: "node-dialog-cancel",
|
||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
|
if (onCancel) { onCancel(); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -74,7 +77,8 @@
|
|||||||
text: RED._("common.label.done"),
|
text: RED._("common.label.done"),
|
||||||
class: "primary",
|
class: "primary",
|
||||||
click: function() {
|
click: function() {
|
||||||
onComplete(JSON.stringify(bufferBinValue));
|
bufferStringEditor.saveView();
|
||||||
|
if (onComplete) { onComplete(JSON.stringify(bufferBinValue),null,bufferStringEditor); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,19 +90,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
open: function(tray) {
|
open: function(tray) {
|
||||||
var trayBody = tray.find('.red-ui-tray-body');
|
|
||||||
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
||||||
|
|
||||||
bufferStringEditor = RED.editor.createEditor({
|
bufferStringEditor = RED.editor.createEditor({
|
||||||
id: 'red-ui-editor-type-buffer-str',
|
id: 'red-ui-editor-type-buffer-str',
|
||||||
value: "",
|
value: value||"",
|
||||||
|
stateId: RED.editor.generateViewStateId("buffer", options, ""),
|
||||||
|
focus: true,
|
||||||
mode:"ace/mode/text"
|
mode:"ace/mode/text"
|
||||||
});
|
});
|
||||||
bufferStringEditor.getSession().setValue(value||"",-1);
|
|
||||||
|
|
||||||
bufferBinEditor = RED.editor.createEditor({
|
bufferBinEditor = RED.editor.createEditor({
|
||||||
id: 'red-ui-editor-type-buffer-bin',
|
id: 'red-ui-editor-type-buffer-bin',
|
||||||
value: "",
|
value: "",
|
||||||
|
stateId: false,
|
||||||
|
focus: false,
|
||||||
mode:"ace/mode/text",
|
mode:"ace/mode/text",
|
||||||
readOnly: true
|
readOnly: true
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ RED.editor.codeEditor.ace = (function() {
|
|||||||
}
|
}
|
||||||
},100);
|
},100);
|
||||||
}
|
}
|
||||||
|
if (!options.stateId && options.stateId !== false) {
|
||||||
|
options.stateId = RED.editor.generateViewStateId("ace", options, (options.mode || options.title).split("/").pop());
|
||||||
|
}
|
||||||
if (options.mode === 'ace/mode/markdown') {
|
if (options.mode === 'ace/mode/markdown') {
|
||||||
$(el).addClass("red-ui-editor-text-container-toolbar");
|
$(el).addClass("red-ui-editor-text-container-toolbar");
|
||||||
editor.toolbar = RED.editor.customEditTypes['_markdown'].buildToolbar(toolbarRow,editor);
|
editor.toolbar = RED.editor.customEditTypes['_markdown'].buildToolbar(toolbarRow,editor);
|
||||||
@@ -92,11 +95,15 @@ RED.editor.codeEditor.ace = (function() {
|
|||||||
RED.editor.editMarkdown({
|
RED.editor.editMarkdown({
|
||||||
value: value,
|
value: value,
|
||||||
width: "Infinity",
|
width: "Infinity",
|
||||||
cursor: editor.getCursorPosition(),
|
stateId: options.stateId,
|
||||||
|
focus: true,
|
||||||
|
cancel: function () {
|
||||||
|
editor.focus();
|
||||||
|
},
|
||||||
complete: function(v,cursor) {
|
complete: function(v,cursor) {
|
||||||
editor.setValue(v, -1);
|
editor.setValue(v, -1);
|
||||||
editor.gotoLine(cursor.row+1,cursor.column,false);
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
|
editor.restoreView();
|
||||||
editor.focus();
|
editor.focus();
|
||||||
},300);
|
},300);
|
||||||
}
|
}
|
||||||
@@ -117,11 +124,56 @@ RED.editor.codeEditor.ace = (function() {
|
|||||||
editor._destroy = editor.destroy;
|
editor._destroy = editor.destroy;
|
||||||
editor.destroy = function() {
|
editor.destroy = function() {
|
||||||
try {
|
try {
|
||||||
|
editor.saveView();
|
||||||
|
editor._initState = null;
|
||||||
this._destroy();
|
this._destroy();
|
||||||
} catch (e) { }
|
} catch (e) { }
|
||||||
$(el).remove();
|
$(el).remove();
|
||||||
$(toolbarRow).remove();
|
$(toolbarRow).remove();
|
||||||
}
|
}
|
||||||
|
editor.on("blur", function () {
|
||||||
|
editor.focusMemory = false;
|
||||||
|
editor.saveView();
|
||||||
|
})
|
||||||
|
editor.on("focus", function () {
|
||||||
|
if (editor._initState) {
|
||||||
|
editor.restoreView(editor._initState);
|
||||||
|
editor._initState = null;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
editor.getView = function () {
|
||||||
|
var session = editor.getSession();
|
||||||
|
return {
|
||||||
|
selection: session.selection.toJSON(),
|
||||||
|
scrollTop: session.getScrollTop(),
|
||||||
|
scrollLeft: session.getScrollLeft(),
|
||||||
|
options: session.getOptions()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
editor.saveView = function () {
|
||||||
|
if (!options.stateId) { return; } //only possible if created with a unique stateId
|
||||||
|
window._editorStateAce = window._editorStateAce || {};
|
||||||
|
var state = editor.getView();
|
||||||
|
window._editorStateAce[options.stateId] = state;
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
editor.restoreView = function (state) {
|
||||||
|
if (!options.stateId) { return; } //only possible if created with a unique stateId
|
||||||
|
window._editorStateAce = window._editorStateAce || {};
|
||||||
|
var _state = state || window._editorStateAce[options.stateId];
|
||||||
|
if (!_state) { return; } //no view state available
|
||||||
|
try {
|
||||||
|
var session = editor.getSession();
|
||||||
|
session.setOptions(_state.options);
|
||||||
|
session.selection.fromJSON(_state.selection);
|
||||||
|
session.setScrollTop(_state.scrollTop);
|
||||||
|
session.setScrollLeft(_state.scrollLeft);
|
||||||
|
editor._initState = _state;
|
||||||
|
} catch (error) {
|
||||||
|
delete window._editorStateMonaco[options.stateId];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
editor.restoreView();
|
||||||
editor.type = type;
|
editor.type = type;
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
|
|
||||||
options = options || {};
|
options = options || {};
|
||||||
window.MonacoEnvironment = window.MonacoEnvironment || {};
|
window.MonacoEnvironment = window.MonacoEnvironment || {};
|
||||||
window.MonacoEnvironment.getWorkerUrl = function (moduleId, label) {
|
window.MonacoEnvironment.getWorkerUrl = window.MonacoEnvironment.getWorkerUrl || function (moduleId, label) {
|
||||||
if (label === 'json') { return './vendor/monaco/dist/json.worker.js'; }
|
if (label === 'json') { return './vendor/monaco/dist/json.worker.js'; }
|
||||||
if (label === 'css' || label === 'scss') { return './vendor/monaco/dist/css.worker.js'; }
|
if (label === 'css' || label === 'scss') { return './vendor/monaco/dist/css.worker.js'; }
|
||||||
if (label === 'html' || label === 'handlebars') { return './vendor/monaco/dist/html.worker.js'; }
|
if (label === 'html' || label === 'handlebars') { return './vendor/monaco/dist/html.worker.js'; }
|
||||||
@@ -747,13 +747,25 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
mode = "html";
|
mode = "html";
|
||||||
break;
|
break;
|
||||||
case "appcache":
|
case "appcache":
|
||||||
|
case "sh":
|
||||||
|
case "bash":
|
||||||
mode = "shell";
|
mode = "shell";
|
||||||
break;
|
break;
|
||||||
|
case "batchfile":
|
||||||
|
mode = "bat";
|
||||||
|
break;
|
||||||
|
case "protobuf":
|
||||||
|
mode = "proto";
|
||||||
|
break;
|
||||||
//TODO: add other compatability types.
|
//TODO: add other compatability types.
|
||||||
}
|
}
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(!options.stateId && options.stateId !== false) {
|
||||||
|
options.stateId = RED.editor.generateViewStateId("monaco", options, (options.mode || options.title).split("/").pop());
|
||||||
|
}
|
||||||
var el = options.element || $("#"+options.id)[0];
|
var el = options.element || $("#"+options.id)[0];
|
||||||
var toolbarRow = $("<div>").appendTo(el);
|
var toolbarRow = $("<div>").appendTo(el);
|
||||||
el = $("<div>").appendTo(el).addClass("red-ui-editor-text-container")[0];
|
el = $("<div>").appendTo(el).addClass("red-ui-editor-text-container")[0];
|
||||||
@@ -1098,6 +1110,7 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
try {
|
try {
|
||||||
var m = this.getModel();
|
var m = this.getModel();
|
||||||
if(m && !m.isDisposed()) {
|
if(m && !m.isDisposed()) {
|
||||||
|
ed._initState = null;
|
||||||
m.dispose();
|
m.dispose();
|
||||||
}
|
}
|
||||||
this.setModel(null);
|
this.setModel(null);
|
||||||
@@ -1151,7 +1164,7 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
try {
|
try {
|
||||||
var _model = ed.getModel();
|
var _model = ed.getModel();
|
||||||
if (_model !== null) {
|
if (_model !== null) {
|
||||||
var id = _model.getModeId(); // e.g. javascript
|
var id = _model._languageId; // e.g. javascript
|
||||||
var ra = _model._associatedResource.authority; //e.g. model
|
var ra = _model._associatedResource.authority; //e.g. model
|
||||||
var rp = _model._associatedResource.path; //e.g. /18
|
var rp = _model._associatedResource.path; //e.g. /18
|
||||||
var rs = _model._associatedResource.scheme; //e.g. inmemory
|
var rs = _model._associatedResource.scheme; //e.g. inmemory
|
||||||
@@ -1243,14 +1256,7 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
//#endregion "ACE compatability"
|
//#endregion "ACE compatability"
|
||||||
|
|
||||||
//final setup
|
//final setup
|
||||||
if (options.cursor) {
|
ed.focusMemory = options.focus;
|
||||||
var row = options.cursor.row || options.cursor.lineNumber;
|
|
||||||
var col = options.cursor.column || options.cursor.col;
|
|
||||||
ed.gotoLine(row, col);
|
|
||||||
}
|
|
||||||
if (options.focus) {
|
|
||||||
ed.focus();
|
|
||||||
}
|
|
||||||
ed._mode = editorOptions.language;
|
ed._mode = editorOptions.language;
|
||||||
|
|
||||||
//as models are signleton, consts and let are avialable to other javascript instances
|
//as models are signleton, consts and let are avialable to other javascript instances
|
||||||
@@ -1262,11 +1268,12 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ed.onDidBlurEditorWidget(function() {
|
ed.onDidBlurEditorWidget(function() {
|
||||||
|
ed.focusMemory = false;
|
||||||
|
ed.saveView();
|
||||||
if(isVisible(el) == false) {
|
if(isVisible(el) == false) {
|
||||||
onVisibilityChange(false, 0, el);
|
onVisibilityChange(false, 0, el);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ed.onDidFocusEditorWidget(function() {
|
ed.onDidFocusEditorWidget(function() {
|
||||||
onVisibilityChange(true, 10, el);
|
onVisibilityChange(true, 10, el);
|
||||||
});
|
});
|
||||||
@@ -1300,17 +1307,33 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onVisibilityChange(visible, delay, element) {
|
function onVisibilityChange(visible, delay, element) {
|
||||||
if(visible) {
|
delay = delay || 50;
|
||||||
if(ed._mode == "javascript" && ed._tempMode == "text") {
|
if (visible) {
|
||||||
|
if (ed.focusMemory) {
|
||||||
|
setTimeout(function () {
|
||||||
|
if (element.parentElement) { //ensure el is still in DOM
|
||||||
|
ed.focus();
|
||||||
|
}
|
||||||
|
}, 300)
|
||||||
|
}
|
||||||
|
if (ed._initState) {
|
||||||
|
setTimeout(function () {
|
||||||
|
if (element.parentElement) { //ensure el is still in DOM
|
||||||
|
ed.restoreViewState(ed._initState);
|
||||||
|
ed._initState = null;
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
|
}
|
||||||
|
if (ed._mode == "javascript" && ed._tempMode == "text") {
|
||||||
ed._tempMode = "";
|
ed._tempMode = "";
|
||||||
setTimeout(function() {
|
setTimeout(function () {
|
||||||
if(element.parentElement) { //ensure el is still in DOM
|
if (element.parentElement) { //ensure el is still in DOM
|
||||||
ed.setMode('javascript', undefined, false);
|
ed.setMode('javascript', undefined, false);
|
||||||
}
|
}
|
||||||
}, delay || 50);
|
}, delay);
|
||||||
}
|
}
|
||||||
} else if(ed._mode == "javascript" && ed._tempMode != "text") {
|
} else if (ed._mode == "javascript" && ed._tempMode != "text") {
|
||||||
if(element.parentElement) { //ensure el is still in DOM
|
if (element.parentElement) { //ensure el is still in DOM
|
||||||
ed.setMode('text', undefined, false);
|
ed.setMode('text', undefined, false);
|
||||||
ed._tempMode = "text";
|
ed._tempMode = "text";
|
||||||
}
|
}
|
||||||
@@ -1329,15 +1352,19 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
expandButton.on("click", function (e) {
|
expandButton.on("click", function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var value = ed.getValue();
|
var value = ed.getValue();
|
||||||
|
ed.saveView();
|
||||||
RED.editor.editMarkdown({
|
RED.editor.editMarkdown({
|
||||||
value: value,
|
value: value,
|
||||||
width: "Infinity",
|
width: "Infinity",
|
||||||
cursor: ed.getCursorPosition(),
|
stateId: options.stateId,
|
||||||
|
cancel: function () {
|
||||||
|
ed.focus();
|
||||||
|
},
|
||||||
complete: function (v, cursor) {
|
complete: function (v, cursor) {
|
||||||
ed.setValue(v, -1);
|
ed.setValue(v, -1);
|
||||||
ed.gotoLine(cursor.row + 1, cursor.column, false);
|
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
ed.focus();
|
ed.focus();
|
||||||
|
ed.restoreView();
|
||||||
}, 300);
|
}, 300);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1353,7 +1380,37 @@ RED.editor.codeEditor.monaco = (function() {
|
|||||||
autoClose: 50
|
autoClose: 50
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
ed.getView = function () {
|
||||||
|
return ed.saveViewState();
|
||||||
|
}
|
||||||
|
ed.saveView = function (debuginfo) {
|
||||||
|
if (!options.stateId) { return; } //only possible if created with a unique stateId
|
||||||
|
window._editorStateMonaco = window._editorStateMonaco || {};
|
||||||
|
var state = ed.getView();
|
||||||
|
window._editorStateMonaco[options.stateId] = state;
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
ed.restoreView = function (state) {
|
||||||
|
if (!options.stateId) { return; } //only possible if created with a unique stateId
|
||||||
|
window._editorStateMonaco = window._editorStateMonaco || {};
|
||||||
|
var _state = state || window._editorStateMonaco[options.stateId];
|
||||||
|
if (!_state) { return; } //no view state available
|
||||||
|
try {
|
||||||
|
if (ed.type) { //is editor already initialised?
|
||||||
|
ed.restoreViewState(_state);
|
||||||
|
} else {
|
||||||
|
ed._initState = _state;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
delete window._editorStateMonaco[options.stateId];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ed.restoreView();
|
||||||
|
if (options.cursor && !ed._initState) {
|
||||||
|
var row = options.cursor.row || options.cursor.lineNumber;
|
||||||
|
var col = options.cursor.column || options.cursor.col;
|
||||||
|
ed.gotoLine(row, col);
|
||||||
|
}
|
||||||
ed.type = type;
|
ed.type = type;
|
||||||
return ed;
|
return ed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
show: function(options) {
|
show: function(options) {
|
||||||
var expressionTestCacheId = options.parent||"_";
|
var expressionTestCacheId = options.parent||"_";
|
||||||
var value = options.value;
|
var value = options.value;
|
||||||
|
var onCancel = options.cancel;
|
||||||
var onComplete = options.complete;
|
var onComplete = options.complete;
|
||||||
var type = "_expression"
|
var type = "_expression"
|
||||||
if ($("script[data-template-name='"+type+"']").length === 0) {
|
if ($("script[data-template-name='"+type+"']").length === 0) {
|
||||||
@@ -63,12 +64,14 @@
|
|||||||
|
|
||||||
var trayOptions = {
|
var trayOptions = {
|
||||||
title: options.title,
|
title: options.title,
|
||||||
|
focusElement: options.focusElement,
|
||||||
width: "inherit",
|
width: "inherit",
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
id: "node-dialog-cancel",
|
id: "node-dialog-cancel",
|
||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
|
if(onCancel) { onCancel(); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -78,7 +81,8 @@
|
|||||||
class: "primary",
|
class: "primary",
|
||||||
click: function() {
|
click: function() {
|
||||||
$("#red-ui-editor-type-expression-help").text("");
|
$("#red-ui-editor-type-expression-help").text("");
|
||||||
onComplete(expressionEditor.getValue());
|
expressionEditor.saveView();
|
||||||
|
if (onComplete) { onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition(),expressionEditor); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,6 +114,8 @@
|
|||||||
id: 'red-ui-editor-type-expression',
|
id: 'red-ui-editor-type-expression',
|
||||||
value: "",
|
value: "",
|
||||||
mode:"ace/mode/jsonata",
|
mode:"ace/mode/jsonata",
|
||||||
|
stateId: options.stateId,
|
||||||
|
focus: true,
|
||||||
options: {
|
options: {
|
||||||
enableBasicAutocompletion:true,
|
enableBasicAutocompletion:true,
|
||||||
enableSnippets:true,
|
enableSnippets:true,
|
||||||
@@ -233,6 +239,8 @@
|
|||||||
testDataEditor = RED.editor.createEditor({
|
testDataEditor = RED.editor.createEditor({
|
||||||
id: 'red-ui-editor-type-expression-test-data',
|
id: 'red-ui-editor-type-expression-test-data',
|
||||||
value: expressionTestCache[expressionTestCacheId] || '{\n "payload": "hello world"\n}',
|
value: expressionTestCache[expressionTestCacheId] || '{\n "payload": "hello world"\n}',
|
||||||
|
stateId: false,
|
||||||
|
focus: false,
|
||||||
mode:"ace/mode/json",
|
mode:"ace/mode/json",
|
||||||
lineNumbers: false
|
lineNumbers: false
|
||||||
});
|
});
|
||||||
@@ -302,6 +310,8 @@
|
|||||||
testResultEditor = RED.editor.createEditor({
|
testResultEditor = RED.editor.createEditor({
|
||||||
id: 'red-ui-editor-type-expression-test-result',
|
id: 'red-ui-editor-type-expression-test-result',
|
||||||
value: "",
|
value: "",
|
||||||
|
stateId: false,
|
||||||
|
focus: false,
|
||||||
mode:"ace/mode/json",
|
mode:"ace/mode/json",
|
||||||
lineNumbers: false,
|
lineNumbers: false,
|
||||||
readOnly: true
|
readOnly: true
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
var definition = {
|
var definition = {
|
||||||
show: function(options) {
|
show: function(options) {
|
||||||
var value = options.value;
|
var value = options.value;
|
||||||
|
var onCancel = options.cancel;
|
||||||
var onComplete = options.complete;
|
var onComplete = options.complete;
|
||||||
var type = "_js"
|
var type = "_js"
|
||||||
if ($("script[data-template-name='"+type+"']").length === 0) {
|
if ($("script[data-template-name='"+type+"']").length === 0) {
|
||||||
@@ -28,16 +29,16 @@
|
|||||||
}
|
}
|
||||||
RED.view.state(RED.state.EDITING);
|
RED.view.state(RED.state.EDITING);
|
||||||
var expressionEditor;
|
var expressionEditor;
|
||||||
var changeTimer;
|
|
||||||
|
|
||||||
var trayOptions = {
|
var trayOptions = {
|
||||||
title: options.title,
|
title: options.title,
|
||||||
|
focusElement: options.focusElement,
|
||||||
width: options.width||"inherit",
|
width: options.width||"inherit",
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
id: "node-dialog-cancel",
|
id: "node-dialog-cancel",
|
||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
|
if (onCancel) { onCancel(); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -46,7 +47,8 @@
|
|||||||
text: RED._("common.label.done"),
|
text: RED._("common.label.done"),
|
||||||
class: "primary",
|
class: "primary",
|
||||||
click: function() {
|
click: function() {
|
||||||
onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition());
|
expressionEditor.saveView();
|
||||||
|
if (onComplete) { onComplete(expressionEditor.getValue(), expressionEditor.getCursorPosition(), expressionEditor); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,11 +64,12 @@
|
|||||||
expressionEditor.resize();
|
expressionEditor.resize();
|
||||||
},
|
},
|
||||||
open: function(tray) {
|
open: function(tray) {
|
||||||
var trayBody = tray.find('.red-ui-tray-body');
|
|
||||||
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
||||||
expressionEditor = RED.editor.createEditor({
|
expressionEditor = RED.editor.createEditor({
|
||||||
id: 'node-input-js',
|
id: 'node-input-js',
|
||||||
mode: options.mode || 'ace/mode/javascript',
|
mode: options.mode || 'ace/mode/javascript',
|
||||||
|
stateId: options.stateId,
|
||||||
|
focus: true,
|
||||||
value: value,
|
value: value,
|
||||||
globals: {
|
globals: {
|
||||||
msg:true,
|
msg:true,
|
||||||
@@ -84,19 +87,16 @@
|
|||||||
},
|
},
|
||||||
extraLibs: options.extraLibs
|
extraLibs: options.extraLibs
|
||||||
});
|
});
|
||||||
if (options.cursor) {
|
if (options.cursor && !expressionEditor._initState) {
|
||||||
expressionEditor.gotoLine(options.cursor.row+1,options.cursor.column,false);
|
expressionEditor.gotoLine(options.cursor.row+1,options.cursor.column,false);
|
||||||
}
|
}
|
||||||
dialogForm.i18n();
|
dialogForm.i18n();
|
||||||
setTimeout(function() {
|
|
||||||
expressionEditor.focus();
|
|
||||||
},300);
|
|
||||||
},
|
},
|
||||||
close: function() {
|
close: function() {
|
||||||
expressionEditor.destroy();
|
|
||||||
if (options.onclose) {
|
if (options.onclose) {
|
||||||
options.onclose();
|
options.onclose();
|
||||||
}
|
}
|
||||||
|
expressionEditor.destroy();
|
||||||
},
|
},
|
||||||
show: function() {}
|
show: function() {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,9 @@
|
|||||||
'<ul id="red-ui-editor-type-json-tabs"></ul>'+
|
'<ul id="red-ui-editor-type-json-tabs"></ul>'+
|
||||||
'<div id="red-ui-editor-type-json-tab-raw" class="red-ui-editor-type-json-tab-content hide">'+
|
'<div id="red-ui-editor-type-json-tab-raw" class="red-ui-editor-type-json-tab-content hide">'+
|
||||||
'<div class="form-row" style="margin-bottom: 3px; text-align: right;">'+
|
'<div class="form-row" style="margin-bottom: 3px; text-align: right;">'+
|
||||||
'<button id="node-input-json-reformat" class="red-ui-button red-ui-button-small"><span data-i18n="jsonEditor.format"></span></button>'+
|
'<span class="button-group">'+
|
||||||
|
'<button id="node-input-json-reformat" class="red-ui-button red-ui-button-small"><span data-i18n="jsonEditor.format"></span></button>'+
|
||||||
|
'<span class="button-group">'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'<div class="form-row node-text-editor-row">'+
|
'<div class="form-row node-text-editor-row">'+
|
||||||
'<div style="height: 200px;min-height: 150px;" class="node-text-editor" id="node-input-json"></div>'+
|
'<div style="height: 200px;min-height: 150px;" class="node-text-editor" id="node-input-json"></div>'+
|
||||||
@@ -34,7 +36,7 @@
|
|||||||
|
|
||||||
var activeTab;
|
var activeTab;
|
||||||
|
|
||||||
function insertNewItem(parent,index,copyIndex) {
|
function insertNewItem(parent,index,copyIndex,readOnly) {
|
||||||
var newValue = "";
|
var newValue = "";
|
||||||
|
|
||||||
if (parent.children.length > 0) {
|
if (parent.children.length > 0) {
|
||||||
@@ -60,26 +62,26 @@
|
|||||||
newKey = keyRoot+"-"+(keySuffix++);
|
newKey = keyRoot+"-"+(keySuffix++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var newItem = handleItem(newKey,newValue,parent.depth+1,parent);
|
var newItem = handleItem(newKey,newValue,parent.depth+1,parent,readOnly);
|
||||||
parent.treeList.insertChildAt(newItem, index, true);
|
parent.treeList.insertChildAt(newItem, index, true);
|
||||||
parent.treeList.expand();
|
parent.treeList.expand();
|
||||||
}
|
}
|
||||||
function showObjectMenu(button,item) {
|
function showObjectMenu(button,item,readOnly) {
|
||||||
var elementPos = button.offset();
|
var elementPos = button.offset();
|
||||||
var options = [];
|
var options = [];
|
||||||
if (item.parent) {
|
if (item.parent) {
|
||||||
options.push({id:"red-ui-editor-type-json-menu-insert-above", icon:"fa fa-toggle-up", label:RED._('jsonEditor.insertAbove'),onselect:function(){
|
options.push({id:"red-ui-editor-type-json-menu-insert-above", icon:"fa fa-toggle-up", label:RED._('jsonEditor.insertAbove'),onselect:function(){
|
||||||
var index = item.parent.children.indexOf(item);
|
var index = item.parent.children.indexOf(item);
|
||||||
insertNewItem(item.parent,index,index);
|
insertNewItem(item.parent,index,index,readOnly);
|
||||||
}});
|
}});
|
||||||
options.push({id:"red-ui-editor-type-json-menu-insert-below", icon:"fa fa-toggle-down", label:RED._('jsonEditor.insertBelow'),onselect:function(){
|
options.push({id:"red-ui-editor-type-json-menu-insert-below", icon:"fa fa-toggle-down", label:RED._('jsonEditor.insertBelow'),onselect:function(){
|
||||||
var index = item.parent.children.indexOf(item)+1;
|
var index = item.parent.children.indexOf(item)+1;
|
||||||
insertNewItem(item.parent,index,index-1);
|
insertNewItem(item.parent,index,index-1,readOnly);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
if (item.type === 'array' || item.type === 'object') {
|
if (item.type === 'array' || item.type === 'object') {
|
||||||
options.push({id:"red-ui-editor-type-json-menu-add-child", icon:"fa fa-plus", label:RED._('jsonEditor.addItem'),onselect:function(){
|
options.push({id:"red-ui-editor-type-json-menu-add-child", icon:"fa fa-plus", label:RED._('jsonEditor.addItem'),onselect:function(){
|
||||||
insertNewItem(item,item.children.length,item.children.length-1);
|
insertNewItem(item,item.children.length,item.children.length-1,readOnly);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
if (item.parent) {
|
if (item.parent) {
|
||||||
@@ -121,7 +123,7 @@
|
|||||||
newKey = keyRoot+"-"+(keySuffix++);
|
newKey = keyRoot+"-"+(keySuffix++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var newItem = handleItem(newKey,convertToObject(item),item.parent.depth+1,item.parent);
|
var newItem = handleItem(newKey,convertToObject(item),item.parent.depth+1,item.parent,readOnly);
|
||||||
var index = item.parent.children.indexOf(item)+1;
|
var index = item.parent.children.indexOf(item)+1;
|
||||||
|
|
||||||
item.parent.treeList.insertChildAt(newItem, index, true);
|
item.parent.treeList.insertChildAt(newItem, index, true);
|
||||||
@@ -171,24 +173,24 @@
|
|||||||
menuOptionMenu.show();
|
menuOptionMenu.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseObject(obj,depth,parent) {
|
function parseObject(obj,depth,parent,readOnly) {
|
||||||
var result = [];
|
var result = [];
|
||||||
for (var prop in obj) {
|
for (var prop in obj) {
|
||||||
if (obj.hasOwnProperty(prop)) {
|
if (obj.hasOwnProperty(prop)) {
|
||||||
result.push(handleItem(prop,obj[prop],depth,parent));
|
result.push(handleItem(prop,obj[prop],depth,parent,readOnly));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
function parseArray(obj,depth,parent) {
|
function parseArray(obj,depth,parent,readOnly) {
|
||||||
var result = [];
|
var result = [];
|
||||||
var l = obj.length;
|
var l = obj.length;
|
||||||
for (var i=0;i<l;i++) {
|
for (var i=0;i<l;i++) {
|
||||||
result.push(handleItem(i,obj[i],depth,parent));
|
result.push(handleItem(i,obj[i],depth,parent,readOnly));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
function handleItem(key,val,depth,parent) {
|
function handleItem(key,val,depth,parent,readOnly) {
|
||||||
var item = {depth:depth, type: typeof val};
|
var item = {depth:depth, type: typeof val};
|
||||||
var container = $('<span class="red-ui-editor-type-json-editor-label">');
|
var container = $('<span class="red-ui-editor-type-json-editor-label">');
|
||||||
if (key != null) {
|
if (key != null) {
|
||||||
@@ -204,11 +206,14 @@
|
|||||||
if (parent && parent.type === "array") {
|
if (parent && parent.type === "array") {
|
||||||
keyLabel.addClass("red-ui-editor-type-json-editor-label-array-key")
|
keyLabel.addClass("red-ui-editor-type-json-editor-label-array-key")
|
||||||
}
|
}
|
||||||
|
if(readOnly) {
|
||||||
|
keyLabel.addClass("readonly")
|
||||||
|
}
|
||||||
keyLabel.on("click", function(evt) {
|
keyLabel.on("click", function(evt) {
|
||||||
if (item.parent.type === 'array') {
|
if (item.parent.type === 'array') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (readOnly) { return; }
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
var w = Math.max(150,keyLabel.width());
|
var w = Math.max(150,keyLabel.width());
|
||||||
@@ -253,10 +258,10 @@
|
|||||||
item.expanded = depth < 2;
|
item.expanded = depth < 2;
|
||||||
item.type = "array";
|
item.type = "array";
|
||||||
item.deferBuild = depth >= 2;
|
item.deferBuild = depth >= 2;
|
||||||
item.children = parseArray(val,depth+1,item);
|
item.children = parseArray(val,depth+1,item,readOnly);
|
||||||
} else if (val !== null && item.type === "object") {
|
} else if (val !== null && item.type === "object") {
|
||||||
item.expanded = depth < 2;
|
item.expanded = depth < 2;
|
||||||
item.children = parseObject(val,depth+1,item);
|
item.children = parseObject(val,depth+1,item,readOnly);
|
||||||
item.deferBuild = depth >= 2;
|
item.deferBuild = depth >= 2;
|
||||||
} else {
|
} else {
|
||||||
item.value = val;
|
item.value = val;
|
||||||
@@ -287,7 +292,11 @@
|
|||||||
//
|
//
|
||||||
var orphanedChildren;
|
var orphanedChildren;
|
||||||
var valueLabel = $('<span class="red-ui-editor-type-json-editor-label-value">').addClass(valClass).text(valValue).appendTo(container);
|
var valueLabel = $('<span class="red-ui-editor-type-json-editor-label-value">').addClass(valClass).text(valValue).appendTo(container);
|
||||||
|
if (readOnly) {
|
||||||
|
valueLabel.addClass("readonly")
|
||||||
|
}
|
||||||
valueLabel.on("click", function(evt) {
|
valueLabel.on("click", function(evt) {
|
||||||
|
if (readOnly) { return; }
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
if (valType === 'str') {
|
if (valType === 'str') {
|
||||||
@@ -302,8 +311,8 @@
|
|||||||
types:[
|
types:[
|
||||||
'str','num','bool',
|
'str','num','bool',
|
||||||
{value:"null",label:RED._("common.type.null"),hasValue:false},
|
{value:"null",label:RED._("common.type.null"),hasValue:false},
|
||||||
{value:"array",label:RED._("common.type.array"),hasValue:false,icon:"red/images/typedInput/json.png"},
|
{value:"array",label:RED._("common.type.array"),hasValue:false,icon:"red/images/typedInput/json.svg"},
|
||||||
{value:"object",label:RED._("common.type.object"),hasValue:false,icon:"red/images/typedInput/json.png"}
|
{value:"object",label:RED._("common.type.object"),hasValue:false,icon:"red/images/typedInput/json.svg"}
|
||||||
],
|
],
|
||||||
default: valType
|
default: valType
|
||||||
});
|
});
|
||||||
@@ -395,17 +404,19 @@
|
|||||||
valueLabel.hide();
|
valueLabel.hide();
|
||||||
})
|
})
|
||||||
item.gutter = $('<span class="red-ui-editor-type-json-editor-item-gutter"></span>');
|
item.gutter = $('<span class="red-ui-editor-type-json-editor-item-gutter"></span>');
|
||||||
|
if(!readOnly) {
|
||||||
if (parent) {//red-ui-editor-type-json-editor-item-handle
|
if (parent) {
|
||||||
$('<span class="red-ui-editor-type-json-editor-item-handle"><i class="fa fa-bars"></span>').appendTo(item.gutter);
|
$('<span class="red-ui-editor-type-json-editor-item-handle"><i class="fa fa-bars"></span>').appendTo(item.gutter);
|
||||||
} else {
|
} else {
|
||||||
$('<span></span>').appendTo(item.gutter);
|
$('<span></span>').appendTo(item.gutter);
|
||||||
|
}
|
||||||
|
$('<button type="button" class="editor-button editor-button-small"><i class="fa fa-caret-down"></button>').appendTo(item.gutter).on("click", function(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
evt.stopPropagation();
|
||||||
|
showObjectMenu($(this), item, readOnly);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
$('<button type="button" class="editor-button editor-button-small"><i class="fa fa-caret-down"></button>').appendTo(item.gutter).on("click", function(evt) {
|
|
||||||
evt.preventDefault();
|
|
||||||
evt.stopPropagation();
|
|
||||||
showObjectMenu($(this), item);
|
|
||||||
});
|
|
||||||
item.element = container;
|
item.element = container;
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
@@ -434,6 +445,7 @@
|
|||||||
var definition = {
|
var definition = {
|
||||||
show: function(options) {
|
show: function(options) {
|
||||||
var value = options.value;
|
var value = options.value;
|
||||||
|
var onCancel = options.cancel;
|
||||||
var onComplete = options.complete;
|
var onComplete = options.complete;
|
||||||
var type = "_json"
|
var type = "_json"
|
||||||
if ($("script[data-template-name='"+type+"']").length === 0) {
|
if ($("script[data-template-name='"+type+"']").length === 0) {
|
||||||
@@ -455,15 +467,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var rootNode;
|
var rootNode;
|
||||||
|
|
||||||
var trayOptions = {
|
var trayOptions = {
|
||||||
title: options.title,
|
title: options.title,
|
||||||
|
focusElement: options.focusElement,
|
||||||
width: options.width||700,
|
width: options.width||700,
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
id: "node-dialog-cancel",
|
id: "node-dialog-cancel",
|
||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
|
if (onCancel) { onCancel(); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -485,7 +498,8 @@
|
|||||||
} else if (activeTab === "json-raw") {
|
} else if (activeTab === "json-raw") {
|
||||||
result = expressionEditor.getValue();
|
result = expressionEditor.getValue();
|
||||||
}
|
}
|
||||||
if (onComplete) { onComplete(result) }
|
expressionEditor.saveView();
|
||||||
|
if (onComplete) { onComplete(result,null,expressionEditor) }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -498,7 +512,25 @@
|
|||||||
open: function(tray) {
|
open: function(tray) {
|
||||||
var trayBody = tray.find('.red-ui-tray-body');
|
var trayBody = tray.find('.red-ui-tray-body');
|
||||||
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
||||||
|
var toolbarButtons = options.toolbarButtons || [];
|
||||||
|
if (toolbarButtons.length) {
|
||||||
|
toolbarButtons.forEach(function (button) {
|
||||||
|
var element = $('<button type="button" class="red-ui-button red-ui-button-small"> </button>')
|
||||||
|
.insertBefore("#node-input-json-reformat")
|
||||||
|
.on("click", function (evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
if (button.click !== undefined) {
|
||||||
|
button.click.call(element, evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (button.id) { element.attr("id", button.id); }
|
||||||
|
if (button.title) { element.attr("title", button.title); }
|
||||||
|
if (button.icon) { element.append($("<i></i>").attr("class", button.icon)); }
|
||||||
|
if (button.label || button.text) {
|
||||||
|
element.append($("<span></span>").text(" " + (button.label || button.text)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
var container = $("#red-ui-editor-type-json-tab-ui-container").css({"height":"100%"});
|
var container = $("#red-ui-editor-type-json-tab-ui-container").css({"height":"100%"});
|
||||||
var filterDepth = Infinity;
|
var filterDepth = Infinity;
|
||||||
var list = $('<div class="red-ui-debug-msg-payload red-ui-editor-type-json-editor">').appendTo(container).treeList({
|
var list = $('<div class="red-ui-debug-msg-payload red-ui-editor-type-json-editor">').appendTo(container).treeList({
|
||||||
@@ -528,13 +560,15 @@
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
expressionEditor = RED.editor.createEditor({
|
expressionEditor = RED.editor.createEditor({
|
||||||
id: 'node-input-json',
|
id: 'node-input-json',
|
||||||
value: "",
|
value: value||"",
|
||||||
mode:"ace/mode/json"
|
mode:"ace/mode/json",
|
||||||
|
readOnly: !!options.readOnly,
|
||||||
|
stateId: options.stateId,
|
||||||
|
focus: true
|
||||||
});
|
});
|
||||||
expressionEditor.getSession().setValue(value||"",-1);
|
|
||||||
if (options.requireValid) {
|
if (options.requireValid) {
|
||||||
expressionEditor.getSession().on('change', function() {
|
expressionEditor.getSession().on('change', function() {
|
||||||
clearTimeout(changeTimer);
|
clearTimeout(changeTimer);
|
||||||
@@ -571,7 +605,7 @@
|
|||||||
var raw = expressionEditor.getValue().trim() ||"{}";
|
var raw = expressionEditor.getValue().trim() ||"{}";
|
||||||
try {
|
try {
|
||||||
var parsed = JSON.parse(raw);
|
var parsed = JSON.parse(raw);
|
||||||
rootNode = handleItem(null,parsed,0,null);
|
rootNode = handleItem(null,parsed,0,null,options.readOnly);
|
||||||
rootNode.class = "red-ui-editor-type-json-root-node"
|
rootNode.class = "red-ui-editor-type-json-root-node"
|
||||||
list.treeList('data',[rootNode]);
|
list.treeList('data',[rootNode]);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
@@ -589,17 +623,15 @@
|
|||||||
|
|
||||||
tabs.addTab({
|
tabs.addTab({
|
||||||
id: 'json-raw',
|
id: 'json-raw',
|
||||||
label: RED._('jsonEditor.rawMode'),
|
label: options.readOnly ? RED._('jsonEditor.rawMode-readonly') : RED._('jsonEditor.rawMode'),
|
||||||
content: $("#red-ui-editor-type-json-tab-raw")
|
content: $("#red-ui-editor-type-json-tab-raw")
|
||||||
});
|
});
|
||||||
tabs.addTab({
|
tabs.addTab({
|
||||||
id: 'json-ui',
|
id: 'json-ui',
|
||||||
label: RED._('jsonEditor.uiMode'),
|
label: options.readOnly ? RED._('jsonEditor.uiMode-readonly') : RED._('jsonEditor.uiMode'),
|
||||||
content: $("#red-ui-editor-type-json-tab-ui")
|
content: $("#red-ui-editor-type-json-tab-ui")
|
||||||
});
|
});
|
||||||
finishedBuild = true;
|
finishedBuild = true;
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
close: function() {
|
close: function() {
|
||||||
if (options.onclose) {
|
if (options.onclose) {
|
||||||
|
|||||||
@@ -54,24 +54,26 @@
|
|||||||
var definition = {
|
var definition = {
|
||||||
show: function(options) {
|
show: function(options) {
|
||||||
var value = options.value;
|
var value = options.value;
|
||||||
|
var onCancel = options.cancel;
|
||||||
var onComplete = options.complete;
|
var onComplete = options.complete;
|
||||||
var type = "_markdown"
|
var type = "_markdown"
|
||||||
if ($("script[data-template-name='"+type+"']").length === 0) {
|
if ($("script[data-template-name='"+type+"']").length === 0) {
|
||||||
$(template).appendTo("#red-ui-editor-node-configs");
|
$(template).appendTo("#red-ui-editor-node-configs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RED.view.state(RED.state.EDITING);
|
RED.view.state(RED.state.EDITING);
|
||||||
var expressionEditor;
|
var expressionEditor;
|
||||||
|
|
||||||
var trayOptions = {
|
var trayOptions = {
|
||||||
title: options.title,
|
title: options.title,
|
||||||
|
focusElement: options.focusElement,
|
||||||
width: options.width||Infinity,
|
width: options.width||Infinity,
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
id: "node-dialog-cancel",
|
id: "node-dialog-cancel",
|
||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
|
if (onCancel) { onCancel(); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -80,7 +82,8 @@
|
|||||||
text: RED._("common.label.done"),
|
text: RED._("common.label.done"),
|
||||||
class: "primary",
|
class: "primary",
|
||||||
click: function() {
|
click: function() {
|
||||||
onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition());
|
expressionEditor.saveView();
|
||||||
|
if (onComplete) { onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition(), expressionEditor); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,6 +102,8 @@
|
|||||||
expressionEditor = RED.editor.createEditor({
|
expressionEditor = RED.editor.createEditor({
|
||||||
id: 'red-ui-editor-type-markdown',
|
id: 'red-ui-editor-type-markdown',
|
||||||
value: value,
|
value: value,
|
||||||
|
stateId: options.stateId,
|
||||||
|
focus: true,
|
||||||
mode:"ace/mode/markdown",
|
mode:"ace/mode/markdown",
|
||||||
expandable: false
|
expandable: false
|
||||||
});
|
});
|
||||||
@@ -143,17 +148,17 @@
|
|||||||
});
|
});
|
||||||
RED.popover.tooltip($("#node-btn-markdown-preview"), RED._("markdownEditor.toggle-preview"));
|
RED.popover.tooltip($("#node-btn-markdown-preview"), RED._("markdownEditor.toggle-preview"));
|
||||||
|
|
||||||
if (options.cursor) {
|
if (options.cursor && !expressionEditor._initState) {
|
||||||
expressionEditor.gotoLine(options.cursor.row+1,options.cursor.column,false);
|
expressionEditor.gotoLine(options.cursor.row+1,options.cursor.column,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
dialogForm.i18n();
|
dialogForm.i18n();
|
||||||
},
|
},
|
||||||
close: function() {
|
close: function() {
|
||||||
expressionEditor.destroy();
|
|
||||||
if (options.onclose) {
|
if (options.onclose) {
|
||||||
options.onclose();
|
options.onclose();
|
||||||
}
|
}
|
||||||
|
expressionEditor.destroy();
|
||||||
},
|
},
|
||||||
show: function() {}
|
show: function() {}
|
||||||
}
|
}
|
||||||
@@ -168,7 +173,7 @@
|
|||||||
'b': { before:"**", after: "**", tooltip: RED._("markdownEditor.bold")},
|
'b': { before:"**", after: "**", tooltip: RED._("markdownEditor.bold")},
|
||||||
'i': { before:"_", after: "_", tooltip: RED._("markdownEditor.italic")},
|
'i': { before:"_", after: "_", tooltip: RED._("markdownEditor.italic")},
|
||||||
'code': { before:"`", after: "`", tooltip: RED._("markdownEditor.code")},
|
'code': { before:"`", after: "`", tooltip: RED._("markdownEditor.code")},
|
||||||
'ol': { before:" * ", newline: true, tooltip: RED._("markdownEditor.ordered-list")},
|
'ol': { before:" 1. ", newline: true, tooltip: RED._("markdownEditor.ordered-list")},
|
||||||
'ul': { before:" - ", newline: true, tooltip: RED._("markdownEditor.unordered-list")},
|
'ul': { before:" - ", newline: true, tooltip: RED._("markdownEditor.unordered-list")},
|
||||||
'bq': { before:"> ", newline: true, tooltip: RED._("markdownEditor.quote")},
|
'bq': { before:"> ", newline: true, tooltip: RED._("markdownEditor.quote")},
|
||||||
'link': { before:"[", after: "]()", tooltip: RED._("markdownEditor.link")},
|
'link': { before:"[", after: "]()", tooltip: RED._("markdownEditor.link")},
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
create: function(container) {
|
create: function(container) {
|
||||||
this.editor = buildDescriptionForm(container,node);
|
this.editor = buildDescriptionForm(container,node);
|
||||||
RED.e = this.editor;
|
|
||||||
},
|
},
|
||||||
resize: function(size) {
|
resize: function(size) {
|
||||||
this.editor.resize();
|
this.editor.resize();
|
||||||
@@ -58,11 +57,9 @@
|
|||||||
var nodeInfoEditor = RED.editor.createEditor({
|
var nodeInfoEditor = RED.editor.createEditor({
|
||||||
id: editorId,
|
id: editorId,
|
||||||
mode: 'ace/mode/markdown',
|
mode: 'ace/mode/markdown',
|
||||||
value: ""
|
stateId: RED.editor.generateViewStateId("node", node, "nodeinfo"),
|
||||||
|
value: node.info || ""
|
||||||
});
|
});
|
||||||
if (node.info) {
|
|
||||||
nodeInfoEditor.getSession().setValue(node.info, -1);
|
|
||||||
}
|
|
||||||
node.infoEditor = nodeInfoEditor;
|
node.infoEditor = nodeInfoEditor;
|
||||||
return nodeInfoEditor;
|
return nodeInfoEditor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
newValue = "";
|
newValue = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (node[d] != newValue) {
|
if (!isEqual(node[d], newValue)) {
|
||||||
if (node._def.defaults[d].type) {
|
if (node._def.defaults[d].type) {
|
||||||
// Change to a related config node
|
// Change to a related config node
|
||||||
var configNode = RED.nodes.node(node[d]);
|
var configNode = RED.nodes.node(node[d]);
|
||||||
@@ -139,6 +139,23 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares `newValue` with `originalValue` for equality.
|
||||||
|
* @param {*} originalValue Original value
|
||||||
|
* @param {*} newValue New value
|
||||||
|
* @returns {boolean} true if originalValue equals newValue, otherwise false
|
||||||
|
*/
|
||||||
|
function isEqual(originalValue, newValue) {
|
||||||
|
try {
|
||||||
|
if(originalValue == newValue) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return JSON.stringify(originalValue) === JSON.stringify(newValue);
|
||||||
|
} catch (err) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the node credentials from the edit form
|
* Update the node credentials from the edit form
|
||||||
* @param node - the node containing the credentials
|
* @param node - the node containing the credentials
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
var definition = {
|
var definition = {
|
||||||
show: function(options) {
|
show: function(options) {
|
||||||
var value = options.value;
|
var value = options.value;
|
||||||
|
var onCancel = options.cancel;
|
||||||
var onComplete = options.complete;
|
var onComplete = options.complete;
|
||||||
var type = "_text"
|
var type = "_text"
|
||||||
if ($("script[data-template-name='"+type+"']").length === 0) {
|
if ($("script[data-template-name='"+type+"']").length === 0) {
|
||||||
@@ -28,16 +29,16 @@
|
|||||||
}
|
}
|
||||||
RED.view.state(RED.state.EDITING);
|
RED.view.state(RED.state.EDITING);
|
||||||
var expressionEditor;
|
var expressionEditor;
|
||||||
var changeTimer;
|
|
||||||
|
|
||||||
var trayOptions = {
|
var trayOptions = {
|
||||||
title: options.title,
|
title: options.title,
|
||||||
|
focusElement: options.focusElement,
|
||||||
width: options.width||"inherit",
|
width: options.width||"inherit",
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
id: "node-dialog-cancel",
|
id: "node-dialog-cancel",
|
||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
|
if(onCancel) { onCancel(); }
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -46,7 +47,8 @@
|
|||||||
text: RED._("common.label.done"),
|
text: RED._("common.label.done"),
|
||||||
class: "primary",
|
class: "primary",
|
||||||
click: function() {
|
click: function() {
|
||||||
onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition());
|
expressionEditor.saveView();
|
||||||
|
if (onComplete) { onComplete(expressionEditor.getValue(),expressionEditor.getCursorPosition(),expressionEditor);}
|
||||||
RED.tray.close();
|
RED.tray.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,31 +57,27 @@
|
|||||||
var rows = $("#dialog-form>div:not(.node-text-editor-row)");
|
var rows = $("#dialog-form>div:not(.node-text-editor-row)");
|
||||||
var editorRow = $("#dialog-form>div.node-text-editor-row");
|
var editorRow = $("#dialog-form>div.node-text-editor-row");
|
||||||
var height = $("#dialog-form").height();
|
var height = $("#dialog-form").height();
|
||||||
// for (var i=0;i<rows.size();i++) {
|
|
||||||
// height -= $(rows[i]).outerHeight(true);
|
|
||||||
// }
|
|
||||||
// height -= (parseInt($("#dialog-form").css("marginTop"))+parseInt($("#dialog-form").css("marginBottom")));
|
|
||||||
$(".node-text-editor").css("height",height+"px");
|
$(".node-text-editor").css("height",height+"px");
|
||||||
expressionEditor.resize();
|
expressionEditor.resize();
|
||||||
},
|
},
|
||||||
open: function(tray) {
|
open: function(tray) {
|
||||||
var trayBody = tray.find('.red-ui-tray-body');
|
|
||||||
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
var dialogForm = RED.editor.buildEditForm(tray.find('.red-ui-tray-body'),'dialog-form',type,'editor');
|
||||||
expressionEditor = RED.editor.createEditor({
|
expressionEditor = RED.editor.createEditor({
|
||||||
id: 'node-input-text',
|
id: 'node-input-text',
|
||||||
value: "",
|
value: value||"",
|
||||||
mode:"ace/mode/"+(options.mode||"text")
|
stateId: options.stateId,
|
||||||
|
mode:"ace/mode/"+(options.mode||"text"),
|
||||||
|
focus: true,
|
||||||
});
|
});
|
||||||
expressionEditor.getSession().setValue(value||"",-1);
|
if (options.cursor && !expressionEditor._initState) {
|
||||||
if (options.cursor) {
|
|
||||||
expressionEditor.gotoLine(options.cursor.row+1,options.cursor.column,false);
|
expressionEditor.gotoLine(options.cursor.row+1,options.cursor.column,false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
close: function() {
|
close: function() {
|
||||||
expressionEditor.destroy();
|
|
||||||
if (options.onclose) {
|
if (options.onclose) {
|
||||||
options.onclose();
|
options.onclose();
|
||||||
}
|
}
|
||||||
|
expressionEditor.destroy();
|
||||||
},
|
},
|
||||||
show: function() {}
|
show: function() {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,9 +323,6 @@ RED.group = (function() {
|
|||||||
groups: [ ],
|
groups: [ ],
|
||||||
dirty: RED.nodes.dirty()
|
dirty: RED.nodes.dirty()
|
||||||
}
|
}
|
||||||
RED.history.push(historyEvent);
|
|
||||||
|
|
||||||
|
|
||||||
groups.forEach(function(g) {
|
groups.forEach(function(g) {
|
||||||
newSelection = newSelection.concat(ungroup(g))
|
newSelection = newSelection.concat(ungroup(g))
|
||||||
historyEvent.groups.push(g);
|
historyEvent.groups.push(g);
|
||||||
@@ -352,8 +349,10 @@ RED.group = (function() {
|
|||||||
}
|
}
|
||||||
if (n.type === 'group') {
|
if (n.type === 'group') {
|
||||||
RED.events.emit("groups:change",n)
|
RED.events.emit("groups:change",n)
|
||||||
} else {
|
} else if (n.type !== 'junction') {
|
||||||
RED.events.emit("nodes:change",n)
|
RED.events.emit("nodes:change",n)
|
||||||
|
} else {
|
||||||
|
RED.events.emit("junctions:change",n)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
RED.nodes.removeGroup(g);
|
RED.nodes.removeGroup(g);
|
||||||
@@ -547,8 +546,10 @@ RED.group = (function() {
|
|||||||
group.h = Math.max(group.h,n.y+n.h/2+25-group.y);
|
group.h = Math.max(group.h,n.y+n.h/2+25-group.y);
|
||||||
if (n.type === 'group') {
|
if (n.type === 'group') {
|
||||||
RED.events.emit("groups:change",n)
|
RED.events.emit("groups:change",n)
|
||||||
} else {
|
} else if (n.type !== 'junction') {
|
||||||
RED.events.emit("nodes:change",n)
|
RED.events.emit("nodes:change",n)
|
||||||
|
} else {
|
||||||
|
RED.events.emit("junctions:change",n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -583,8 +584,10 @@ RED.group = (function() {
|
|||||||
}
|
}
|
||||||
if (n.type === 'group') {
|
if (n.type === 'group') {
|
||||||
RED.events.emit("groups:change",n)
|
RED.events.emit("groups:change",n)
|
||||||
} else {
|
} else if (n.type !== 'junction') {
|
||||||
RED.events.emit("nodes:change",n)
|
RED.events.emit("nodes:change",n)
|
||||||
|
} else {
|
||||||
|
RED.events.emit("junctions:change",n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
markDirty(group);
|
markDirty(group);
|
||||||
|
|||||||
@@ -224,14 +224,7 @@ RED.palette = (function() {
|
|||||||
|
|
||||||
var d = $('<div>',{class:"red-ui-palette-node"}).attr("data-palette-type",nt).data('category',rootCategory);
|
var d = $('<div>',{class:"red-ui-palette-node"}).attr("data-palette-type",nt).data('category',rootCategory);
|
||||||
|
|
||||||
var label = nt;///^(.*?)([ -]in|[ -]out)?$/.exec(nt)[1];
|
var label = RED.utils.getPaletteLabel(nt, def);///^(.*?)([ -]in|[ -]out)?$/.exec(nt)[1];
|
||||||
if (typeof def.paletteLabel !== "undefined") {
|
|
||||||
try {
|
|
||||||
label = (typeof def.paletteLabel === "function" ? def.paletteLabel.call(def) : def.paletteLabel)||"";
|
|
||||||
} catch(err) {
|
|
||||||
console.log("Definition error: "+nt+".paletteLabel",err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$('<div/>', {
|
$('<div/>', {
|
||||||
class: "red-ui-palette-label"+(((!def.align && def.inputs !== 0 && def.outputs === 0) || "right" === def.align) ? " red-ui-palette-label-right" : "")
|
class: "red-ui-palette-label"+(((!def.align && def.inputs !== 0 && def.outputs === 0) || "right" === def.align) ? " red-ui-palette-label-right" : "")
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ RED.projects.settings = (function() {
|
|||||||
title: RED._('sidebar.project.editDescription'),
|
title: RED._('sidebar.project.editDescription'),
|
||||||
header: $('<span><i class="fa fa-book"></i> README.md</span>'),
|
header: $('<span><i class="fa fa-book"></i> README.md</span>'),
|
||||||
value: activeProject.description,
|
value: activeProject.description,
|
||||||
|
stateId: "sidebar.project.editDescription",
|
||||||
complete: function(v) {
|
complete: function(v) {
|
||||||
container.empty();
|
container.empty();
|
||||||
var spinner = utils.addSpinnerOverlay(container);
|
var spinner = utils.addSpinnerOverlay(container);
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ RED.search = (function() {
|
|||||||
var searchHistory = [];
|
var searchHistory = [];
|
||||||
var index = {};
|
var index = {};
|
||||||
var currentResults = [];
|
var currentResults = [];
|
||||||
|
var activeResults = [];
|
||||||
|
var currentIndex = 0;
|
||||||
var previousActiveElement;
|
var previousActiveElement;
|
||||||
|
|
||||||
function indexProperty(node,label,property) {
|
function indexProperty(node,label,property) {
|
||||||
@@ -106,7 +108,6 @@ RED.search = (function() {
|
|||||||
|
|
||||||
function search(val) {
|
function search(val) {
|
||||||
var results = [];
|
var results = [];
|
||||||
var keys = [];
|
|
||||||
var typeFilter;
|
var typeFilter;
|
||||||
var m = /(?:^| )type:([^ ]+)/.exec(val);
|
var m = /(?:^| )type:([^ ]+)/.exec(val);
|
||||||
if (m) {
|
if (m) {
|
||||||
@@ -119,19 +120,25 @@ RED.search = (function() {
|
|||||||
val = extractFlag(val,"config",flags);
|
val = extractFlag(val,"config",flags);
|
||||||
val = extractFlag(val,"subflow",flags);
|
val = extractFlag(val,"subflow",flags);
|
||||||
val = extractFlag(val,"hidden",flags);
|
val = extractFlag(val,"hidden",flags);
|
||||||
// uses:<node-id>
|
val = extractFlag(val,"modified",flags);
|
||||||
val = extractValue(val,"uses",flags);
|
val = extractValue(val,"flow",flags);// flow:active or flow:<flow-id>
|
||||||
|
val = extractValue(val,"uses",flags);// uses:<node-id>
|
||||||
var hasFlags = Object.keys(flags).length > 0;
|
|
||||||
|
|
||||||
val = val.trim();
|
val = val.trim();
|
||||||
|
var hasFlags = Object.keys(flags).length > 0;
|
||||||
|
if (flags.flow && flags.flow.indexOf("current") >= 0) {
|
||||||
|
let idx = flags.flow.indexOf("current");
|
||||||
|
flags.flow[idx] = RED.workspaces.active();//convert active to flow ID
|
||||||
|
}
|
||||||
|
if (flags.flow && flags.flow.length) {
|
||||||
|
flags.flow = [ ...new Set(flags.flow) ]; //deduplicate
|
||||||
|
}
|
||||||
if (val.length > 0 || typeFilter || hasFlags) {
|
if (val.length > 0 || typeFilter || hasFlags) {
|
||||||
val = val.toLowerCase();
|
val = val.toLowerCase();
|
||||||
var i;
|
var i;
|
||||||
var j;
|
var j;
|
||||||
var list = [];
|
var list = [];
|
||||||
var nodes = {};
|
var nodes = {};
|
||||||
|
let keys = [];
|
||||||
if (flags.uses) {
|
if (flags.uses) {
|
||||||
keys = flags.uses;
|
keys = flags.uses;
|
||||||
} else {
|
} else {
|
||||||
@@ -141,7 +148,7 @@ RED.search = (function() {
|
|||||||
var key = keys[i];
|
var key = keys[i];
|
||||||
var kpos = keys[i].indexOf(val);
|
var kpos = keys[i].indexOf(val);
|
||||||
if (kpos > -1) {
|
if (kpos > -1) {
|
||||||
var ids = Object.keys(index[key]);
|
var ids = Object.keys(index[key]||{});
|
||||||
for (j=0;j<ids.length;j++) {
|
for (j=0;j<ids.length;j++) {
|
||||||
var node = index[key][ids[j]];
|
var node = index[key][ids[j]];
|
||||||
var isConfigNode = node.node._def.category === "config" && node.node.type !== 'group';
|
var isConfigNode = node.node._def.category === "config" && node.node.type !== 'group';
|
||||||
@@ -164,6 +171,11 @@ RED.search = (function() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (flags.hasOwnProperty("modified")) {
|
||||||
|
if (!node.node.changed && !node.node.moved) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (flags.hasOwnProperty("hidden")) {
|
if (flags.hasOwnProperty("hidden")) {
|
||||||
// Only tabs can be hidden
|
// Only tabs can be hidden
|
||||||
if (node.node.type !== 'tab') {
|
if (node.node.type !== 'tab') {
|
||||||
@@ -180,6 +192,11 @@ RED.search = (function() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (flags.hasOwnProperty("flow")) {
|
||||||
|
if (flags.flow.indexOf(node.node.z || node.node.id) < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!typeFilter || node.node.type === typeFilter) {
|
if (!typeFilter || node.node.type === typeFilter) {
|
||||||
nodes[node.node.id] = nodes[node.node.id] = {
|
nodes[node.node.id] = nodes[node.node.id] = {
|
||||||
node: node.node,
|
node: node.node,
|
||||||
@@ -247,7 +264,7 @@ RED.search = (function() {
|
|||||||
}
|
}
|
||||||
currentResults = search(value);
|
currentResults = search(value);
|
||||||
if (currentResults.length > 0) {
|
if (currentResults.length > 0) {
|
||||||
for (i=0;i<Math.min(currentResults.length,25);i++) {
|
for (let i=0;i<Math.min(currentResults.length,25);i++) {
|
||||||
searchResults.editableList('addItem',currentResults[i])
|
searchResults.editableList('addItem',currentResults[i])
|
||||||
}
|
}
|
||||||
if (currentResults.length > 25) {
|
if (currentResults.length > 25) {
|
||||||
@@ -261,9 +278,8 @@ RED.search = (function() {
|
|||||||
} else {
|
} else {
|
||||||
searchResults.editableList('addItem',{});
|
searchResults.editableList('addItem',{});
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
options: getSearchOptions()
|
||||||
}
|
|
||||||
});
|
});
|
||||||
var copySearchContainer = $('<button type="button" class="red-ui-button red-ui-button-small"><i class="fa fa-caret-right"></button>').appendTo(searchDiv).on('click', function(evt) {
|
var copySearchContainer = $('<button type="button" class="red-ui-button red-ui-button-small"><i class="fa fa-caret-right"></button>').appendTo(searchDiv).on('click', function(evt) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
@@ -324,7 +340,8 @@ RED.search = (function() {
|
|||||||
}
|
}
|
||||||
} else if (!$(children[selected]).hasClass("red-ui-search-historyHeader")) {
|
} else if (!$(children[selected]).hasClass("red-ui-search-historyHeader")) {
|
||||||
if (currentResults.length > 0) {
|
if (currentResults.length > 0) {
|
||||||
reveal(currentResults[Math.max(0,selected)].node);
|
currentIndex = Math.max(0,selected);
|
||||||
|
reveal(currentResults[currentIndex].node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -408,6 +425,7 @@ RED.search = (function() {
|
|||||||
|
|
||||||
div.on("click", function(evt) {
|
div.on("click", function(evt) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
|
currentIndex = i;
|
||||||
reveal(node);
|
reveal(node);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -423,13 +441,59 @@ RED.search = (function() {
|
|||||||
if (existingIndex > -1) {
|
if (existingIndex > -1) {
|
||||||
searchHistory.splice(existingIndex,1);
|
searchHistory.splice(existingIndex,1);
|
||||||
}
|
}
|
||||||
searchHistory.unshift(searchInput.val());
|
searchHistory.unshift(searchVal);
|
||||||
hide();
|
$("#red-ui-view-searchtools-search").data("term", searchVal);
|
||||||
|
activeResults = Object.assign([], currentResults);
|
||||||
|
hide(null, activeResults.length > 0);
|
||||||
RED.view.reveal(node.id);
|
RED.view.reveal(node.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function revealPrev() {
|
||||||
|
if (disabled) {
|
||||||
|
updateSearchToolbar();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!searchResults || !activeResults.length) {
|
||||||
|
show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (currentIndex > 0) {
|
||||||
|
currentIndex--;
|
||||||
|
} else {
|
||||||
|
currentIndex = activeResults.length - 1;
|
||||||
|
}
|
||||||
|
const n = activeResults[currentIndex];
|
||||||
|
if (n && n.node && n.node.id) {
|
||||||
|
RED.view.reveal(n.node.id);
|
||||||
|
$("#red-ui-view-searchtools-prev").trigger("focus");
|
||||||
|
}
|
||||||
|
updateSearchToolbar();
|
||||||
|
}
|
||||||
|
function revealNext() {
|
||||||
|
if (disabled) {
|
||||||
|
updateSearchToolbar();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!searchResults || !activeResults.length) {
|
||||||
|
show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (currentIndex < activeResults.length - 1) {
|
||||||
|
currentIndex++
|
||||||
|
} else {
|
||||||
|
currentIndex = 0;
|
||||||
|
}
|
||||||
|
const n = activeResults[currentIndex];
|
||||||
|
if (n && n.node && n.node.id) {
|
||||||
|
RED.view.reveal(n.node.id);
|
||||||
|
$("#red-ui-view-searchtools-next").trigger("focus");
|
||||||
|
}
|
||||||
|
updateSearchToolbar();
|
||||||
|
}
|
||||||
|
|
||||||
function show(v) {
|
function show(v) {
|
||||||
if (disabled) {
|
if (disabled) {
|
||||||
|
updateSearchToolbar();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
@@ -456,7 +520,7 @@ RED.search = (function() {
|
|||||||
searchInput.trigger("focus");
|
searchInput.trigger("focus");
|
||||||
}
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide(el, keepSearchToolbar) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
visible = false;
|
visible = false;
|
||||||
$("#red-ui-header-shade").hide();
|
$("#red-ui-header-shade").hide();
|
||||||
@@ -470,13 +534,37 @@ RED.search = (function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
RED.events.emit("search:close");
|
RED.events.emit("search:close");
|
||||||
if (previousActiveElement) {
|
if (previousActiveElement && (!keepSearchToolbar || !activeResults.length)) {
|
||||||
$(previousActiveElement).trigger("focus");
|
$(previousActiveElement).trigger("focus");
|
||||||
previousActiveElement = null;
|
|
||||||
}
|
}
|
||||||
|
previousActiveElement = null;
|
||||||
|
}
|
||||||
|
if(!keepSearchToolbar) {
|
||||||
|
clearActiveSearch();
|
||||||
|
}
|
||||||
|
updateSearchToolbar();
|
||||||
|
if(keepSearchToolbar && activeResults.length) {
|
||||||
|
$("#red-ui-view-searchtools-next").trigger("focus");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function updateSearchToolbar() {
|
||||||
|
if (!disabled && currentIndex >= 0 && activeResults && activeResults.length) {
|
||||||
|
let term = $("#red-ui-view-searchtools-search").data("term") || "";
|
||||||
|
if (term.length > 16) {
|
||||||
|
term = term.substring(0, 12) + "..."
|
||||||
|
}
|
||||||
|
const i18nSearchCounterData = {
|
||||||
|
term: term,
|
||||||
|
result: (currentIndex + 1),
|
||||||
|
count: activeResults.length
|
||||||
|
}
|
||||||
|
$("#red-ui-view-searchtools-counter").text(RED._('actions.search-counter', i18nSearchCounterData));
|
||||||
|
$("#view-search-tools > :not(:first-child)").show(); //show other tools
|
||||||
|
} else {
|
||||||
|
clearActiveSearch();
|
||||||
|
$("#view-search-tools > :not(:first-child)").hide(); //hide all but search button
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearIndex() {
|
function clearIndex() {
|
||||||
index = {};
|
index = {};
|
||||||
}
|
}
|
||||||
@@ -498,9 +586,29 @@ RED.search = (function() {
|
|||||||
addItemToIndex(item);
|
addItemToIndex(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function clearActiveSearch() {
|
||||||
|
activeResults = [];
|
||||||
|
currentIndex = 0;
|
||||||
|
$("#red-ui-view-searchtools-search").data("term", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSearchOptions() {
|
||||||
|
return [
|
||||||
|
{label:RED._("search.options.configNodes"), value:"is:config"},
|
||||||
|
{label:RED._("search.options.unusedConfigNodes"), value:"is:config is:unused"},
|
||||||
|
{label:RED._("search.options.modifiedNodes"), value:"is:modified"},
|
||||||
|
{label:RED._("search.options.invalidNodes"), value: "is:invalid"},
|
||||||
|
{label:RED._("search.options.uknownNodes"), value: "type:unknown"},
|
||||||
|
{label:RED._("search.options.unusedSubflows"), value:"is:subflow is:unused"},
|
||||||
|
{label:RED._("search.options.hiddenFlows"), value:"is:hidden"},
|
||||||
|
{label:RED._("search.options.thisFlow"), value:"flow:current"},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
RED.actions.add("core:search",show);
|
RED.actions.add("core:search",show);
|
||||||
|
RED.actions.add("core:search-previous",revealPrev);
|
||||||
|
RED.actions.add("core:search-next",revealNext);
|
||||||
|
|
||||||
RED.events.on("editor:open",function() { disabled = true; });
|
RED.events.on("editor:open",function() { disabled = true; });
|
||||||
RED.events.on("editor:close",function() { disabled = false; });
|
RED.events.on("editor:close",function() { disabled = false; });
|
||||||
@@ -511,11 +619,21 @@ RED.search = (function() {
|
|||||||
|
|
||||||
RED.keyboard.add("red-ui-search","escape",hide);
|
RED.keyboard.add("red-ui-search","escape",hide);
|
||||||
|
|
||||||
|
RED.keyboard.add("view-search-tools","escape",function() {
|
||||||
|
clearActiveSearch();
|
||||||
|
updateSearchToolbar();
|
||||||
|
});
|
||||||
|
|
||||||
$("#red-ui-header-shade").on('mousedown',hide);
|
$("#red-ui-header-shade").on('mousedown',hide);
|
||||||
$("#red-ui-editor-shade").on('mousedown',hide);
|
$("#red-ui-editor-shade").on('mousedown',hide);
|
||||||
$("#red-ui-palette-shade").on('mousedown',hide);
|
$("#red-ui-palette-shade").on('mousedown',hide);
|
||||||
$("#red-ui-sidebar-shade").on('mousedown',hide);
|
$("#red-ui-sidebar-shade").on('mousedown',hide);
|
||||||
|
|
||||||
|
$("#red-ui-view-searchtools-close").on("click", function close() {
|
||||||
|
clearActiveSearch();
|
||||||
|
updateSearchToolbar();
|
||||||
|
});
|
||||||
|
$("#red-ui-view-searchtools-close").trigger("click");
|
||||||
|
|
||||||
RED.events.on("workspace:clear", clearIndex);
|
RED.events.on("workspace:clear", clearIndex);
|
||||||
|
|
||||||
@@ -541,7 +659,8 @@ RED.search = (function() {
|
|||||||
init: init,
|
init: init,
|
||||||
show: show,
|
show: show,
|
||||||
hide: hide,
|
hide: hide,
|
||||||
search: search
|
search: search,
|
||||||
|
getSearchOptions: getSearchOptions
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -29,5 +29,6 @@ RED.state = {
|
|||||||
GROUP_DRAGGING: 12,
|
GROUP_DRAGGING: 12,
|
||||||
GROUP_RESIZE: 13,
|
GROUP_RESIZE: 13,
|
||||||
DETACHED_DRAGGING: 14,
|
DETACHED_DRAGGING: 14,
|
||||||
SLICING: 15
|
SLICING: 15,
|
||||||
|
SLICING_JUNCTION: 16
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ RED.statusBar = (function() {
|
|||||||
function addWidget(options) {
|
function addWidget(options) {
|
||||||
widgets[options.id] = options;
|
widgets[options.id] = options;
|
||||||
var el = $('<span class="red-ui-statusbar-widget"></span>');
|
var el = $('<span class="red-ui-statusbar-widget"></span>');
|
||||||
|
el.prop('id', options.id);
|
||||||
options.element.appendTo(el);
|
options.element.appendTo(el);
|
||||||
if (options.align === 'left') {
|
if (options.align === 'left') {
|
||||||
leftBucket.append(el);
|
leftBucket.append(el);
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
**/
|
**/
|
||||||
RED.sidebar.config = (function() {
|
RED.sidebar.config = (function() {
|
||||||
|
|
||||||
|
let flashingConfigNode;
|
||||||
|
let flashingConfigNodeTimer;
|
||||||
|
|
||||||
var content = document.createElement("div");
|
var content = document.createElement("div");
|
||||||
content.className = "red-ui-sidebar-node-config";
|
content.className = "red-ui-sidebar-node-config";
|
||||||
@@ -145,6 +147,7 @@ RED.sidebar.config = (function() {
|
|||||||
var entry = $('<li class="red-ui-palette-node_id_'+node.id.replace(/\./g,"-")+'"></li>').appendTo(list);
|
var entry = $('<li class="red-ui-palette-node_id_'+node.id.replace(/\./g,"-")+'"></li>').appendTo(list);
|
||||||
var nodeDiv = $('<div class="red-ui-palette-node-config red-ui-palette-node"></div>').appendTo(entry);
|
var nodeDiv = $('<div class="red-ui-palette-node-config red-ui-palette-node"></div>').appendTo(entry);
|
||||||
entry.data('node',node.id);
|
entry.data('node',node.id);
|
||||||
|
nodeDiv.data('node',node.id);
|
||||||
var label = $('<div class="red-ui-palette-label"></div>').text(label).appendTo(nodeDiv);
|
var label = $('<div class="red-ui-palette-label"></div>').text(label).appendTo(nodeDiv);
|
||||||
if (node.d) {
|
if (node.d) {
|
||||||
nodeDiv.addClass("red-ui-palette-node-config-disabled");
|
nodeDiv.addClass("red-ui-palette-node-config-disabled");
|
||||||
@@ -346,10 +349,36 @@ RED.sidebar.config = (function() {
|
|||||||
refreshConfigNodeList();
|
refreshConfigNodeList();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
RED.popover.tooltip($('#red-ui-sidebar-config-filter-all'), RED._("sidebar.config.showAllUnusedConfigNodes"));
|
RED.popover.tooltip($('#red-ui-sidebar-config-filter-all'), RED._("sidebar.config.showAllConfigNodes"));
|
||||||
RED.popover.tooltip($('#red-ui-sidebar-config-filter-unused'), RED._("sidebar.config.showAllUnusedConfigNodes"));
|
RED.popover.tooltip($('#red-ui-sidebar-config-filter-unused'), RED._("sidebar.config.showAllUnusedConfigNodes"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function flashConfigNode(el) {
|
||||||
|
if(flashingConfigNode && flashingConfigNode.length) {
|
||||||
|
//cancel current flashing node before flashing new node
|
||||||
|
clearInterval(flashingConfigNodeTimer);
|
||||||
|
flashingConfigNodeTimer = null;
|
||||||
|
flashingConfigNode.children("div").removeClass('highlighted');
|
||||||
|
flashingConfigNode = null;
|
||||||
|
}
|
||||||
|
if(!el || !el.children("div").length) { return; }
|
||||||
|
|
||||||
|
flashingConfigNodeTimer = setInterval(function(flashEndTime) {
|
||||||
|
if (flashEndTime >= Date.now()) {
|
||||||
|
const highlighted = el.children("div").hasClass("highlighted");
|
||||||
|
el.children("div").toggleClass('highlighted', !highlighted)
|
||||||
|
} else {
|
||||||
|
clearInterval(flashingConfigNodeTimer);
|
||||||
|
flashingConfigNodeTimer = null;
|
||||||
|
flashingConfigNode = null;
|
||||||
|
el.children("div").removeClass('highlighted');
|
||||||
|
}
|
||||||
|
}, 100, Date.now() + 2200);
|
||||||
|
flashingConfigNode = el;
|
||||||
|
el.children("div").addClass('highlighted');
|
||||||
|
}
|
||||||
|
|
||||||
function show(id) {
|
function show(id) {
|
||||||
if (typeof id === 'boolean') {
|
if (typeof id === 'boolean') {
|
||||||
if (id) {
|
if (id) {
|
||||||
@@ -374,19 +403,7 @@ RED.sidebar.config = (function() {
|
|||||||
} else if (y<0) {
|
} else if (y<0) {
|
||||||
scrollWindow.animate({scrollTop: '+='+(y-10)},150);
|
scrollWindow.animate({scrollTop: '+='+(y-10)},150);
|
||||||
}
|
}
|
||||||
var flash = 21;
|
flashConfigNode(node, id);
|
||||||
var flashFunc = function() {
|
|
||||||
if ((flash%2)===0) {
|
|
||||||
node.removeClass('node_highlighted');
|
|
||||||
} else {
|
|
||||||
node.addClass('node_highlighted');
|
|
||||||
}
|
|
||||||
flash--;
|
|
||||||
if (flash >= 0) {
|
|
||||||
setTimeout(flashFunc,100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
flashFunc();
|
|
||||||
},100);
|
},100);
|
||||||
}
|
}
|
||||||
RED.sidebar.show("config");
|
RED.sidebar.show("config");
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ RED.sidebar.help = (function() {
|
|||||||
var node = selection.nodes[0];
|
var node = selection.nodes[0];
|
||||||
if (node.type === "subflow" && node.direction) {
|
if (node.type === "subflow" && node.direction) {
|
||||||
// ignore subflow virtual ports
|
// ignore subflow virtual ports
|
||||||
} else if (node.type !== 'group'){
|
} else if (node.type !== 'group' && node.type !== 'junction'){
|
||||||
showNodeTypeHelp(node.type);
|
showNodeTypeHelp(node.type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -268,14 +268,7 @@ RED.sidebar.info.outliner = (function() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
options: [
|
options: RED.search.getSearchOptions()
|
||||||
{label:RED._("sidebar.info.search.configNodes"), value:"is:config"},
|
|
||||||
{label:RED._("sidebar.info.search.unusedConfigNodes"), value:"is:config is:unused"},
|
|
||||||
{label:RED._("sidebar.info.search.invalidNodes"), value: "is:invalid"},
|
|
||||||
{label:RED._("sidebar.info.search.uknownNodes"), value: "type:unknown"},
|
|
||||||
{label:RED._("sidebar.info.search.unusedSubflows"), value:"is:subflow is:unused"},
|
|
||||||
{label:RED._("sidebar.info.search.hiddenFlows"), value:"is:hidden"},
|
|
||||||
]
|
|
||||||
});
|
});
|
||||||
|
|
||||||
projectInfo = $('<div class="red-ui-treeList-label red-ui-info-outline-project"><span class="red-ui-treeList-icon"><i class="fa fa-archive"></i></span></div>').hide().appendTo(container)
|
projectInfo = $('<div class="red-ui-treeList-label red-ui-info-outline-project"><span class="red-ui-treeList-icon"><i class="fa fa-archive"></i></span></div>').hide().appendTo(container)
|
||||||
@@ -287,15 +280,18 @@ RED.sidebar.info.outliner = (function() {
|
|||||||
data:getFlowData()
|
data:getFlowData()
|
||||||
})
|
})
|
||||||
treeList.on('treelistselect', function(e,item) {
|
treeList.on('treelistselect', function(e,item) {
|
||||||
var node = RED.nodes.node(item.id) || RED.nodes.group(item.id);
|
var node = RED.nodes.node(item.id) || RED.nodes.group(item.id) || RED.nodes.workspace(item.id) || RED.nodes.subflow(item.id);
|
||||||
if (node) {
|
if (node) {
|
||||||
if (node.type === 'group' || node._def.category !== "config") {
|
RED.sidebar.info.refresh(node);
|
||||||
// RED.view.select({nodes:[node]})
|
// if (node.type === 'group' || node._def.category !== "config") {
|
||||||
} else if (node._def.category === "config") {
|
// // RED.view.select({nodes:[node]})
|
||||||
RED.sidebar.info.refresh(node);
|
// } else if (node._def.category === "config") {
|
||||||
} else {
|
// RED.sidebar.info.refresh(node);
|
||||||
// RED.view.select({nodes:[]})
|
// } else {
|
||||||
}
|
// // RED.view.select({nodes:[]})
|
||||||
|
// }
|
||||||
|
} else {
|
||||||
|
RED.sidebar.info.refresh(null);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
treeList.on('treelistconfirm', function(e,item) {
|
treeList.on('treelistconfirm', function(e,item) {
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ RED.sidebar.info = (function() {
|
|||||||
});
|
});
|
||||||
return el;
|
return el;
|
||||||
}
|
}
|
||||||
|
|
||||||
function refresh(node) {
|
function refresh(node) {
|
||||||
if (node === undefined) {
|
if (node === undefined) {
|
||||||
refreshSelection();
|
refreshSelection();
|
||||||
@@ -271,7 +272,7 @@ RED.sidebar.info = (function() {
|
|||||||
objectType = "group";
|
objectType = "group";
|
||||||
}
|
}
|
||||||
$(propRow.children()[0]).text(RED._("sidebar.info."+objectType))
|
$(propRow.children()[0]).text(RED._("sidebar.info."+objectType))
|
||||||
RED.utils.createObjectElement(node.id).appendTo(propRow.children()[1]);
|
RED.utils.createObjectElement(node.id,{sourceId: node.id}).appendTo(propRow.children()[1]);
|
||||||
|
|
||||||
if (node.type === "tab" || node.type === "subflow") {
|
if (node.type === "tab" || node.type === "subflow") {
|
||||||
// If nothing is selected, but we're on a flow or subflow tab.
|
// If nothing is selected, but we're on a flow or subflow tab.
|
||||||
@@ -301,8 +302,8 @@ RED.sidebar.info = (function() {
|
|||||||
if (typeCounts.groups > 0) {
|
if (typeCounts.groups > 0) {
|
||||||
$('<div>').text(RED._("clipboard.group",{count:typeCounts.groups})).appendTo(counts);
|
$('<div>').text(RED._("clipboard.group",{count:typeCounts.groups})).appendTo(counts);
|
||||||
}
|
}
|
||||||
|
} else if (node.type === 'junction') {
|
||||||
|
propertiesPanelHeaderHelp.hide();
|
||||||
} else {
|
} else {
|
||||||
propertiesPanelHeaderHelp.show();
|
propertiesPanelHeaderHelp.show();
|
||||||
|
|
||||||
@@ -365,7 +366,7 @@ RED.sidebar.info = (function() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
RED.utils.createObjectElement(val).appendTo(propRow.children()[1]);
|
RED.utils.createObjectElement(val,{sourceId: node.id}).appendTo(propRow.children()[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -431,6 +432,7 @@ RED.sidebar.info = (function() {
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setInfoText(infoText,target) {
|
function setInfoText(infoText,target) {
|
||||||
var info = addTargetToExternalLinks($('<div class="red-ui-help"><span class="red-ui-text-bidi-aware" dir=\"'+RED.text.bidi.resolveBaseTextDir(infoText)+'">'+infoText+'</span></div>')).appendTo(target);
|
var info = addTargetToExternalLinks($('<div class="red-ui-help"><span class="red-ui-text-bidi-aware" dir=\"'+RED.text.bidi.resolveBaseTextDir(infoText)+'">'+infoText+'</span></div>')).appendTo(target);
|
||||||
info.find(".red-ui-text-bidi-aware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "<span></span>" );
|
info.find(".red-ui-text-bidi-aware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "<span></span>" );
|
||||||
@@ -447,6 +449,7 @@ RED.sidebar.info = (function() {
|
|||||||
$(this).toggleClass('expanded',!isExpanded);
|
$(this).toggleClass('expanded',!isExpanded);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
var tips = (function() {
|
var tips = (function() {
|
||||||
var enabled = true;
|
var enabled = true;
|
||||||
var startDelay = 1000;
|
var startDelay = 1000;
|
||||||
|
|||||||
@@ -169,7 +169,13 @@
|
|||||||
raiseTrayZ();
|
raiseTrayZ();
|
||||||
handleWindowResize();//cause call to monaco layout
|
handleWindowResize();//cause call to monaco layout
|
||||||
},200);
|
},200);
|
||||||
body.find(":focusable:first").trigger("focus");
|
if(!options.hasOwnProperty("focusElement")) {
|
||||||
|
//focusElement is not inside options - default to focusing 1st
|
||||||
|
body.find(":focusable:first").trigger("focus");
|
||||||
|
} else if(options.focusElement !== false) {
|
||||||
|
//focusElement IS specified, focus that instead (if not false)
|
||||||
|
$(options.focusElement).trigger("focus");
|
||||||
|
}
|
||||||
|
|
||||||
},150);
|
},150);
|
||||||
el.css({right:0});
|
el.css({right:0});
|
||||||
|
|||||||
@@ -171,17 +171,21 @@ RED.typeSearch = (function() {
|
|||||||
var div = $('<div>',{class:"red-ui-search-result"}).appendTo(container);
|
var div = $('<div>',{class:"red-ui-search-result"}).appendTo(container);
|
||||||
|
|
||||||
var nodeDiv = $('<div>',{class:"red-ui-search-result-node"}).appendTo(div);
|
var nodeDiv = $('<div>',{class:"red-ui-search-result-node"}).appendTo(div);
|
||||||
var colour = RED.utils.getNodeColor(object.type,def);
|
if (object.type === "junction") {
|
||||||
|
nodeDiv.addClass("red-ui-palette-icon-junction");
|
||||||
|
} else {
|
||||||
|
var colour = RED.utils.getNodeColor(object.type,def);
|
||||||
|
nodeDiv.css('backgroundColor',colour);
|
||||||
|
}
|
||||||
var icon_url = RED.utils.getNodeIcon(def);
|
var icon_url = RED.utils.getNodeIcon(def);
|
||||||
nodeDiv.css('backgroundColor',colour);
|
|
||||||
|
|
||||||
var iconContainer = $('<div/>',{class:"red-ui-palette-icon-container"}).appendTo(nodeDiv);
|
var iconContainer = $('<div/>',{class:"red-ui-palette-icon-container"}).appendTo(nodeDiv);
|
||||||
RED.utils.createIconElement(icon_url, iconContainer, false);
|
RED.utils.createIconElement(icon_url, iconContainer, false);
|
||||||
|
|
||||||
if (def.inputs > 0) {
|
if (object.type !== "junction" && def.inputs > 0) {
|
||||||
$('<div/>',{class:"red-ui-search-result-node-port"}).appendTo(nodeDiv);
|
$('<div/>',{class:"red-ui-search-result-node-port"}).appendTo(nodeDiv);
|
||||||
}
|
}
|
||||||
if (def.outputs > 0) {
|
if (object.type !== "junction" && def.outputs > 0) {
|
||||||
$('<div/>',{class:"red-ui-search-result-node-port red-ui-search-result-node-output"}).appendTo(nodeDiv);
|
$('<div/>',{class:"red-ui-search-result-node-port red-ui-search-result-node-output"}).appendTo(nodeDiv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,8 +317,8 @@ RED.typeSearch = (function() {
|
|||||||
return !filter ||
|
return !filter ||
|
||||||
(
|
(
|
||||||
(!filter.type || type === filter.type) &&
|
(!filter.type || type === filter.type) &&
|
||||||
(!filter.input || def.inputs > 0) &&
|
(!filter.input || type === 'junction' || def.inputs > 0) &&
|
||||||
(!filter.output || def.outputs > 0)
|
(!filter.output || type === 'junction' || def.outputs > 0)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
function refreshTypeList(opts) {
|
function refreshTypeList(opts) {
|
||||||
@@ -323,7 +327,7 @@ RED.typeSearch = (function() {
|
|||||||
searchInput.searchBox('value','').focus();
|
searchInput.searchBox('value','').focus();
|
||||||
selected = -1;
|
selected = -1;
|
||||||
var common = [
|
var common = [
|
||||||
'inject','debug','function','change','switch'
|
'inject','debug','function','change','switch','junction'
|
||||||
].filter(function(t) { return applyFilter(opts.filter,t,RED.nodes.getType(t)); });
|
].filter(function(t) { return applyFilter(opts.filter,t,RED.nodes.getType(t)); });
|
||||||
|
|
||||||
var recentlyUsed = Object.keys(typesUsed);
|
var recentlyUsed = Object.keys(typesUsed);
|
||||||
@@ -348,6 +352,9 @@ RED.typeSearch = (function() {
|
|||||||
var index = 0;
|
var index = 0;
|
||||||
for(i=0;i<common.length;i++) {
|
for(i=0;i<common.length;i++) {
|
||||||
var itemDef = RED.nodes.getType(common[i]);
|
var itemDef = RED.nodes.getType(common[i]);
|
||||||
|
if (common[i] === 'junction') {
|
||||||
|
itemDef = { inputs:1, outputs: 1, label: 'junction', type: 'junction'}
|
||||||
|
}
|
||||||
if (itemDef) {
|
if (itemDef) {
|
||||||
item = {
|
item = {
|
||||||
type: common[i],
|
type: common[i],
|
||||||
|
|||||||
@@ -365,7 +365,16 @@ RED.utils = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildMessageElement(obj,options) {
|
/**
|
||||||
|
* Create a DOM element representation of obj - as used by Debug sidebar etc
|
||||||
|
*
|
||||||
|
* @params obj - the data to display
|
||||||
|
* @params options - a bag of options
|
||||||
|
*
|
||||||
|
* - If you want the Copy Value button, then set `sourceId`
|
||||||
|
* - If you want the Copy Path button, also set `path` to the value to be copied
|
||||||
|
*/
|
||||||
|
function createObjectElement(obj,options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var key = options.key;
|
var key = options.key;
|
||||||
var typeHint = options.typeHint;
|
var typeHint = options.typeHint;
|
||||||
@@ -555,7 +564,7 @@ RED.utils = (function() {
|
|||||||
if (fullLength <= 10) {
|
if (fullLength <= 10) {
|
||||||
for (i=0;i<fullLength;i++) {
|
for (i=0;i<fullLength;i++) {
|
||||||
row = $('<div class="red-ui-debug-msg-object-entry collapsed"></div>').appendTo(arrayRows);
|
row = $('<div class="red-ui-debug-msg-object-entry collapsed"></div>').appendTo(arrayRows);
|
||||||
subElements[path+"["+i+"]"] = buildMessageElement(
|
subElements[path+"["+i+"]"] = createObjectElement(
|
||||||
data[i],
|
data[i],
|
||||||
{
|
{
|
||||||
key: ""+i,
|
key: ""+i,
|
||||||
@@ -585,7 +594,7 @@ RED.utils = (function() {
|
|||||||
return function() {
|
return function() {
|
||||||
for (var i=min;i<=max;i++) {
|
for (var i=min;i<=max;i++) {
|
||||||
var row = $('<div class="red-ui-debug-msg-object-entry collapsed"></div>').appendTo(parent);
|
var row = $('<div class="red-ui-debug-msg-object-entry collapsed"></div>').appendTo(parent);
|
||||||
subElements[path+"["+i+"]"] = buildMessageElement(
|
subElements[path+"["+i+"]"] = createObjectElement(
|
||||||
data[i],
|
data[i],
|
||||||
{
|
{
|
||||||
key: ""+i,
|
key: ""+i,
|
||||||
@@ -641,7 +650,7 @@ RED.utils = (function() {
|
|||||||
newPath += "[\""+keys[i].replace(/"/,"\\\"")+"\"]"
|
newPath += "[\""+keys[i].replace(/"/,"\\\"")+"\"]"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
subElements[newPath] = buildMessageElement(
|
subElements[newPath] = createObjectElement(
|
||||||
data[keys[i]],
|
data[keys[i]],
|
||||||
{
|
{
|
||||||
key: keys[i],
|
key: keys[i],
|
||||||
@@ -1019,6 +1028,8 @@ RED.utils = (function() {
|
|||||||
return "font-awesome/fa-object-ungroup";
|
return "font-awesome/fa-object-ungroup";
|
||||||
} else if (node && node.type === 'group') {
|
} else if (node && node.type === 'group') {
|
||||||
return "font-awesome/fa-object-group"
|
return "font-awesome/fa-object-group"
|
||||||
|
} else if ((node && node.type === 'junction') || (def.type === "junction") ) {
|
||||||
|
return "font-awesome/fa-circle-o"
|
||||||
} else if (def.category === 'config') {
|
} else if (def.category === 'config') {
|
||||||
return RED.settings.apiRootUrl+"icons/node-red/cog.svg"
|
return RED.settings.apiRootUrl+"icons/node-red/cog.svg"
|
||||||
} else if (node && node.type === 'tab') {
|
} else if (node && node.type === 'tab') {
|
||||||
@@ -1084,6 +1095,8 @@ RED.utils = (function() {
|
|||||||
l = node.label || defaultLabel
|
l = node.label || defaultLabel
|
||||||
} else if (node.type === 'group') {
|
} else if (node.type === 'group') {
|
||||||
l = node.name || defaultLabel
|
l = node.name || defaultLabel
|
||||||
|
} else if (node.type === 'junction') {
|
||||||
|
l = 'junction'
|
||||||
} else {
|
} else {
|
||||||
l = node._def.label;
|
l = node._def.label;
|
||||||
try {
|
try {
|
||||||
@@ -1096,6 +1109,18 @@ RED.utils = (function() {
|
|||||||
return RED.text.bidi.enforceTextDirectionWithUCC(l);
|
return RED.text.bidi.enforceTextDirectionWithUCC(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getPaletteLabel(nodeType, def) {
|
||||||
|
var label = nodeType;
|
||||||
|
if (typeof def.paletteLabel !== "undefined") {
|
||||||
|
try {
|
||||||
|
label = (typeof def.paletteLabel === "function" ? def.paletteLabel.call(def) : def.paletteLabel)||"";
|
||||||
|
} catch(err) {
|
||||||
|
console.log("Definition error: "+nodeType+".paletteLabel",err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return label
|
||||||
|
}
|
||||||
|
|
||||||
var nodeColorCache = {};
|
var nodeColorCache = {};
|
||||||
function clearNodeColorCache() {
|
function clearNodeColorCache() {
|
||||||
nodeColorCache = {};
|
nodeColorCache = {};
|
||||||
@@ -1238,6 +1263,8 @@ RED.utils = (function() {
|
|||||||
nodeDiv.addClass("red-ui-palette-icon-selection");
|
nodeDiv.addClass("red-ui-palette-icon-selection");
|
||||||
} else if (node.type === "group") {
|
} else if (node.type === "group") {
|
||||||
nodeDiv.addClass("red-ui-palette-icon-group");
|
nodeDiv.addClass("red-ui-palette-icon-group");
|
||||||
|
} else if (node.type === "junction") {
|
||||||
|
nodeDiv.addClass("red-ui-palette-icon-junction");
|
||||||
} else if (node.type === 'tab') {
|
} else if (node.type === 'tab') {
|
||||||
nodeDiv.addClass("red-ui-palette-icon-flow");
|
nodeDiv.addClass("red-ui-palette-icon-flow");
|
||||||
} else {
|
} else {
|
||||||
@@ -1369,7 +1396,7 @@ RED.utils = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
createObjectElement: buildMessageElement,
|
createObjectElement: createObjectElement,
|
||||||
getMessageProperty: getMessageProperty,
|
getMessageProperty: getMessageProperty,
|
||||||
setMessageProperty: setMessageProperty,
|
setMessageProperty: setMessageProperty,
|
||||||
normalisePropertyExpression: normalisePropertyExpression,
|
normalisePropertyExpression: normalisePropertyExpression,
|
||||||
@@ -1379,6 +1406,7 @@ RED.utils = (function() {
|
|||||||
getNodeIcon: getNodeIcon,
|
getNodeIcon: getNodeIcon,
|
||||||
getNodeLabel: getNodeLabel,
|
getNodeLabel: getNodeLabel,
|
||||||
getNodeColor: getNodeColor,
|
getNodeColor: getNodeColor,
|
||||||
|
getPaletteLabel: getPaletteLabel,
|
||||||
clearNodeColorCache: clearNodeColorCache,
|
clearNodeColorCache: clearNodeColorCache,
|
||||||
addSpinnerOverlay: addSpinnerOverlay,
|
addSpinnerOverlay: addSpinnerOverlay,
|
||||||
decodeObject: decodeObject,
|
decodeObject: decodeObject,
|
||||||
|
|||||||
@@ -809,6 +809,244 @@ RED.view.tools = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits selected wires and re-joins them with link-out+link-in
|
||||||
|
* @param {Object || Object[]} wires The wire(s) to split and replace with link-out, link-in nodes.
|
||||||
|
*/
|
||||||
|
function splitWiresWithLinkNodes(wires) {
|
||||||
|
let wiresToSplit = wires || RED.view.selection().links;
|
||||||
|
if (!Array.isArray(wiresToSplit)) {
|
||||||
|
wiresToSplit = [wiresToSplit];
|
||||||
|
}
|
||||||
|
if (wiresToSplit.length < 1) {
|
||||||
|
return; //nothing selected
|
||||||
|
}
|
||||||
|
|
||||||
|
const history = {
|
||||||
|
t: 'multi',
|
||||||
|
events: [],
|
||||||
|
dirty: RED.nodes.dirty()
|
||||||
|
}
|
||||||
|
const nodeSrcMap = {};
|
||||||
|
const nodeTrgMap = {};
|
||||||
|
const _gridSize = RED.view.gridSize();
|
||||||
|
|
||||||
|
for (let wireIdx = 0; wireIdx < wiresToSplit.length; wireIdx++) {
|
||||||
|
const wire = wiresToSplit[wireIdx];
|
||||||
|
|
||||||
|
//get source and target nodes of this wire link
|
||||||
|
const nSrc = wire.source;
|
||||||
|
const nTrg = wire.target;
|
||||||
|
|
||||||
|
var updateNewNodePosXY = function (origNode, newNode, alignLeft, snap, yOffset) {
|
||||||
|
const nnSize = RED.view.calculateNodeDimensions(newNode);
|
||||||
|
newNode.w = nnSize[0];
|
||||||
|
newNode.h = nnSize[1];
|
||||||
|
const coords = { x: origNode.x || 0, y: origNode.y || 0, w: origNode.w || RED.view.node_width, h: origNode.h || RED.view.node_height };
|
||||||
|
const x = coords.x - (coords.w/2.0);
|
||||||
|
if (alignLeft) {
|
||||||
|
coords.x = x - _gridSize - (newNode.w/2.0);
|
||||||
|
} else {
|
||||||
|
coords.x = x + coords.w + _gridSize + (newNode.w/2.0);
|
||||||
|
}
|
||||||
|
newNode.x = coords.x;
|
||||||
|
newNode.y = coords.y;
|
||||||
|
if (snap !== false) {
|
||||||
|
const offsets = RED.view.tools.calculateGridSnapOffsets(newNode);
|
||||||
|
newNode.x -= offsets.x;
|
||||||
|
newNode.y -= offsets.y;
|
||||||
|
}
|
||||||
|
newNode.y += (yOffset || 0);
|
||||||
|
}
|
||||||
|
const srcPort = (wire.sourcePort || 0);
|
||||||
|
let linkOutMapId = nSrc.id + ':' + srcPort;
|
||||||
|
let nnLinkOut = nodeSrcMap[linkOutMapId];
|
||||||
|
//Create a Link Out if one is not already present
|
||||||
|
if(!nnLinkOut) {
|
||||||
|
const nLinkOut = RED.view.createNode("link out"); //create link node
|
||||||
|
nnLinkOut = nLinkOut.node;
|
||||||
|
nodeSrcMap[linkOutMapId] = nnLinkOut;
|
||||||
|
let yOffset = 0;
|
||||||
|
if(nSrc.outputs > 1) {
|
||||||
|
|
||||||
|
const CENTER_PORT = (((nSrc.outputs-1) / 2) + 1);
|
||||||
|
const offsetCount = Math.abs(CENTER_PORT - (srcPort + 1));
|
||||||
|
yOffset = (_gridSize * 2 * offsetCount);
|
||||||
|
if((srcPort + 1) < CENTER_PORT) {
|
||||||
|
yOffset = -yOffset;
|
||||||
|
}
|
||||||
|
updateNewNodePosXY(nSrc, nnLinkOut, false, false, yOffset);
|
||||||
|
} else {
|
||||||
|
updateNewNodePosXY(nSrc, nnLinkOut, false, RED.view.snapGrid, yOffset);
|
||||||
|
}
|
||||||
|
//add created node
|
||||||
|
RED.nodes.add(nnLinkOut);
|
||||||
|
RED.editor.validateNode(nnLinkOut);
|
||||||
|
history.events.push(nLinkOut.historyEvent);
|
||||||
|
//connect node to link node
|
||||||
|
const link = {
|
||||||
|
source: nSrc,
|
||||||
|
sourcePort: wire.sourcePort || 0,
|
||||||
|
target: nnLinkOut
|
||||||
|
};
|
||||||
|
RED.nodes.addLink(link);
|
||||||
|
history.events.push({
|
||||||
|
t: 'add',
|
||||||
|
links: [link],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let nnLinkIn = nodeTrgMap[nTrg.id];
|
||||||
|
//Create a Link In if one is not already present
|
||||||
|
if(!nnLinkIn) {
|
||||||
|
const nLinkIn = RED.view.createNode("link in"); //create link node
|
||||||
|
nnLinkIn = nLinkIn.node;
|
||||||
|
nodeTrgMap[nTrg.id] = nnLinkIn;
|
||||||
|
updateNewNodePosXY(nTrg, nnLinkIn, true, RED.view.snapGrid, 0);
|
||||||
|
//add created node
|
||||||
|
RED.nodes.add(nnLinkIn);
|
||||||
|
RED.editor.validateNode(nnLinkIn);
|
||||||
|
history.events.push(nLinkIn.historyEvent);
|
||||||
|
//connect node to link node
|
||||||
|
const link = {
|
||||||
|
source: nnLinkIn,
|
||||||
|
sourcePort: 0,
|
||||||
|
target: nTrg
|
||||||
|
};
|
||||||
|
RED.nodes.addLink(link);
|
||||||
|
history.events.push({
|
||||||
|
t: 'add',
|
||||||
|
links: [link],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//connect the link out/link in virtual wires
|
||||||
|
if(nnLinkIn.links.indexOf(nnLinkOut.id) == -1) {
|
||||||
|
nnLinkIn.links.push(nnLinkOut.id);
|
||||||
|
}
|
||||||
|
if(nnLinkOut.links.indexOf(nnLinkIn.id) == -1) {
|
||||||
|
nnLinkOut.links.push(nnLinkIn.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
//delete the original wire
|
||||||
|
RED.nodes.removeLink(wire);
|
||||||
|
history.events.push({
|
||||||
|
t: "delete",
|
||||||
|
links: [wire]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//add all history events to stack
|
||||||
|
RED.history.push(history);
|
||||||
|
|
||||||
|
//select all downstream of new link-in nodes so user can drag to new location
|
||||||
|
RED.view.clearSelection();
|
||||||
|
RED.view.select({nodes: Object.values(nodeTrgMap) });
|
||||||
|
selectConnected("down");
|
||||||
|
|
||||||
|
//update the view
|
||||||
|
RED.nodes.dirty(true);
|
||||||
|
RED.view.redraw(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the required offsets to snap a node
|
||||||
|
* @param {Object} node The node to calculate grid snap offsets for
|
||||||
|
* @param {Object} [options] Options: `align` can be "nearest", "left" or "right"
|
||||||
|
* @returns `{x:number, y:number}` as the offsets to deduct from `x` and `y`
|
||||||
|
*/
|
||||||
|
function calculateGridSnapOffsets(node, options) {
|
||||||
|
options = options || { align: "nearest" };
|
||||||
|
const gridOffset = { x: 0, y: 0 };
|
||||||
|
const gridSize = RED.view.gridSize();
|
||||||
|
const offsetLeft = node.x - (gridSize * Math.round((node.x - node.w / 2) / gridSize) + node.w / 2);
|
||||||
|
const offsetRight = node.x - (gridSize * Math.round((node.x + node.w / 2) / gridSize) - node.w / 2);
|
||||||
|
gridOffset.x = offsetRight;
|
||||||
|
if (options.align === "right") {
|
||||||
|
//skip - already set to right
|
||||||
|
} else if (options.align === "left" || Math.abs(offsetLeft) < Math.abs(offsetRight)) {
|
||||||
|
gridOffset.x = offsetLeft;
|
||||||
|
}
|
||||||
|
gridOffset.y = node.y - (gridSize * Math.round(node.y / gridSize));
|
||||||
|
return gridOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate names for the select nodes.
|
||||||
|
* - it only sets the name if it is currently blank
|
||||||
|
* - it uses `<paletteLabel> <N>` - where N is the next available integer that
|
||||||
|
* doesn't clash with any existing nodes of that type
|
||||||
|
* @param {Object} node The node to set the name of - if not provided, uses current selection
|
||||||
|
*/
|
||||||
|
function generateNodeNames(node, options) {
|
||||||
|
options = options || {
|
||||||
|
renameBlank: true,
|
||||||
|
renameClash: true,
|
||||||
|
generateHistory: true
|
||||||
|
}
|
||||||
|
let nodes = node;
|
||||||
|
if (node) {
|
||||||
|
if (!Array.isArray(node)) {
|
||||||
|
nodes = [ node ]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nodes = RED.view.selection().nodes;
|
||||||
|
}
|
||||||
|
if (nodes && nodes.length > 0) {
|
||||||
|
// Generate history event if using the workspace selection,
|
||||||
|
// or if the provided node already exists
|
||||||
|
const generateHistory = options.generateHistory && (!node || !!RED.nodes.node(node.id))
|
||||||
|
const historyEvents = []
|
||||||
|
const typeIndex = {}
|
||||||
|
let changed = false;
|
||||||
|
nodes.forEach(n => {
|
||||||
|
const nodeDef = n._def || RED.nodes.getType(n.type)
|
||||||
|
if (nodeDef && nodeDef.defaults && nodeDef.defaults.name) {
|
||||||
|
const paletteLabel = RED.utils.getPaletteLabel(n.type, nodeDef)
|
||||||
|
const defaultNodeNameRE = new RegExp('^'+paletteLabel+' (\\d+)$')
|
||||||
|
if (!typeIndex.hasOwnProperty(n.type)) {
|
||||||
|
const existingNodes = RED.nodes.filterNodes({type: n.type})
|
||||||
|
let maxNameNumber = 0;
|
||||||
|
existingNodes.forEach(n => {
|
||||||
|
let match = defaultNodeNameRE.exec(n.name)
|
||||||
|
if (match) {
|
||||||
|
let nodeNumber = parseInt(match[1])
|
||||||
|
if (nodeNumber > maxNameNumber) {
|
||||||
|
maxNameNumber = nodeNumber
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
typeIndex[n.type] = maxNameNumber + 1
|
||||||
|
}
|
||||||
|
if ((options.renameBlank && n.name === '') || (options.renameClash && defaultNodeNameRE.test(n.name))) {
|
||||||
|
if (generateHistory) {
|
||||||
|
historyEvents.push({
|
||||||
|
t:'edit',
|
||||||
|
node: n,
|
||||||
|
changes: { name: n.name },
|
||||||
|
dirty: RED.nodes.dirty(),
|
||||||
|
changed: n.changed
|
||||||
|
})
|
||||||
|
}
|
||||||
|
n.name = paletteLabel+" "+typeIndex[n.type]
|
||||||
|
n.dirty = true
|
||||||
|
typeIndex[n.type]++
|
||||||
|
changed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (changed) {
|
||||||
|
if (historyEvents.length > 0) {
|
||||||
|
RED.history.push({
|
||||||
|
t: 'multi',
|
||||||
|
events: historyEvents
|
||||||
|
})
|
||||||
|
}
|
||||||
|
RED.nodes.dirty(true)
|
||||||
|
RED.view.redraw()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
init: function() {
|
init: function() {
|
||||||
RED.actions.add("core:show-selected-node-labels", function() { setSelectedNodeLabelState(true); })
|
RED.actions.add("core:show-selected-node-labels", function() { setSelectedNodeLabelState(true); })
|
||||||
@@ -870,6 +1108,10 @@ RED.view.tools = (function() {
|
|||||||
RED.actions.add("core:wire-series-of-nodes", function() { wireSeriesOfNodes() })
|
RED.actions.add("core:wire-series-of-nodes", function() { wireSeriesOfNodes() })
|
||||||
RED.actions.add("core:wire-node-to-multiple", function() { wireNodeToMultiple() })
|
RED.actions.add("core:wire-node-to-multiple", function() { wireNodeToMultiple() })
|
||||||
|
|
||||||
|
RED.actions.add("core:split-wire-with-link-nodes", function () { splitWiresWithLinkNodes() });
|
||||||
|
|
||||||
|
RED.actions.add("core:generate-node-names", generateNodeNames )
|
||||||
|
|
||||||
// RED.actions.add("core:add-node", function() { addNode() })
|
// RED.actions.add("core:add-node", function() { addNode() })
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
@@ -881,7 +1123,8 @@ RED.view.tools = (function() {
|
|||||||
* @param {Number} dx
|
* @param {Number} dx
|
||||||
* @param {Number} dy
|
* @param {Number} dy
|
||||||
*/
|
*/
|
||||||
moveSelection: moveSelection
|
moveSelection: moveSelection,
|
||||||
|
calculateGridSnapOffsets: calculateGridSnapOffsets
|
||||||
}
|
}
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ RED.workspaces = (function() {
|
|||||||
var hideStack = [];
|
var hideStack = [];
|
||||||
var viewStackPos = 0;
|
var viewStackPos = 0;
|
||||||
|
|
||||||
|
let flashingTab;
|
||||||
|
let flashingTabTimer;
|
||||||
|
|
||||||
function addToViewStack(id) {
|
function addToViewStack(id) {
|
||||||
if (viewStackPos !== viewStack.length) {
|
if (viewStackPos !== viewStack.length) {
|
||||||
viewStack.splice(viewStackPos);
|
viewStack.splice(viewStackPos);
|
||||||
@@ -428,6 +431,9 @@ RED.workspaces = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
RED.actions.add("core:list-modified-nodes",function() {
|
||||||
|
RED.actions.invoke("core:search","is:modified ");
|
||||||
|
})
|
||||||
RED.actions.add("core:list-hidden-flows",function() {
|
RED.actions.add("core:list-hidden-flows",function() {
|
||||||
RED.actions.invoke("core:search","is:hidden ");
|
RED.actions.invoke("core:search","is:hidden ");
|
||||||
})
|
})
|
||||||
@@ -528,6 +534,31 @@ RED.workspaces = (function() {
|
|||||||
workspace_tabs.order(order);
|
workspace_tabs.order(order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function flashTab(tabId) {
|
||||||
|
if(flashingTab && flashingTab.length) {
|
||||||
|
//cancel current flashing node before flashing new node
|
||||||
|
clearInterval(flashingTabTimer);
|
||||||
|
flashingTabTimer = null;
|
||||||
|
flashingTab.removeClass('highlighted');
|
||||||
|
flashingTab = null;
|
||||||
|
}
|
||||||
|
let tab = $("#red-ui-tab-" + tabId);
|
||||||
|
if(!tab || !tab.length) { return; }
|
||||||
|
|
||||||
|
flashingTabTimer = setInterval(function(flashEndTime) {
|
||||||
|
if (flashEndTime >= Date.now()) {
|
||||||
|
const highlighted = tab.hasClass("highlighted");
|
||||||
|
tab.toggleClass('highlighted', !highlighted)
|
||||||
|
} else {
|
||||||
|
clearInterval(flashingTabTimer);
|
||||||
|
flashingTabTimer = null;
|
||||||
|
flashingTab = null;
|
||||||
|
tab.removeClass('highlighted');
|
||||||
|
}
|
||||||
|
}, 100, Date.now() + 2200);
|
||||||
|
flashingTab = tab;
|
||||||
|
tab.addClass('highlighted');
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
init: init,
|
init: init,
|
||||||
add: addWorkspace,
|
add: addWorkspace,
|
||||||
@@ -560,7 +591,7 @@ RED.workspaces = (function() {
|
|||||||
isHidden: function(id) {
|
isHidden: function(id) {
|
||||||
return hideStack.includes(id)
|
return hideStack.includes(id)
|
||||||
},
|
},
|
||||||
show: function(id,skipStack,unhideOnly) {
|
show: function(id,skipStack,unhideOnly,flash) {
|
||||||
if (!workspace_tabs.contains(id)) {
|
if (!workspace_tabs.contains(id)) {
|
||||||
var sf = RED.nodes.subflow(id);
|
var sf = RED.nodes.subflow(id);
|
||||||
if (sf) {
|
if (sf) {
|
||||||
@@ -582,6 +613,9 @@ RED.workspaces = (function() {
|
|||||||
}
|
}
|
||||||
workspace_tabs.activateTab(id);
|
workspace_tabs.activateTab(id);
|
||||||
}
|
}
|
||||||
|
if(flash) {
|
||||||
|
flashTab(id.replace(".","-"))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
RED.nodes.eachWorkspace(function(ws) {
|
RED.nodes.eachWorkspace(function(ws) {
|
||||||
|
|||||||
@@ -118,20 +118,26 @@ RED.user = (function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
} else if (data.type == "strategy") {
|
} else if (data.type == "strategy") {
|
||||||
|
var sessionMessage = /[?&]session_message=(.*?)(?:$|&)/.exec(window.location.search);
|
||||||
|
RED.sessionMessages = RED.sessionMessages || [];
|
||||||
|
if (sessionMessage) {
|
||||||
|
RED.sessionMessages.push(decodeURIComponent(sessionMessage[1]));
|
||||||
|
if (history.pushState) {
|
||||||
|
var newurl = window.location.protocol+"//"+window.location.host+window.location.pathname
|
||||||
|
window.history.replaceState({ path: newurl }, "", newurl);
|
||||||
|
} else {
|
||||||
|
window.location.search = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RED.sessionMessages.length === 0 && data.autoLogin) {
|
||||||
|
document.location = data.loginRedirect
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (;i<data.prompts.length;i++) {
|
for (;i<data.prompts.length;i++) {
|
||||||
var field = data.prompts[i];
|
var field = data.prompts[i];
|
||||||
var sessionMessage = /[?&]session_message=(.*?)(?:$|&)/.exec(window.location.search);
|
|
||||||
if (sessionMessage) {
|
|
||||||
RED.sessionMessages = RED.sessionMessages || [];
|
|
||||||
RED.sessionMessages.push(sessionMessage[1]);
|
|
||||||
if (history.pushState) {
|
|
||||||
var newurl = window.location.protocol+"//"+window.location.host+window.location.pathname
|
|
||||||
window.history.replaceState({ path: newurl }, "", newurl);
|
|
||||||
} else {
|
|
||||||
window.location.search = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (RED.sessionMessages) {
|
if (RED.sessionMessages) {
|
||||||
var sessionMessages = $("<div/>",{class:"form-row",style:"text-align: center"}).appendTo("#node-dialog-login-fields");
|
var sessionMessages = $("<div/>",{class:"form-row",style:"text-align: center"}).appendTo("#node-dialog-login-fields");
|
||||||
RED.sessionMessages.forEach(function (msg) {
|
RED.sessionMessages.forEach(function (msg) {
|
||||||
|
|||||||
@@ -14,22 +14,72 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
RED.validators = {
|
RED.validators = {
|
||||||
number: function(blankAllowed){return function(v) { return (blankAllowed&&(v===''||v===undefined)) || (v!=='' && !isNaN(v));}},
|
number: function(blankAllowed,mopt){
|
||||||
regex: function(re){return function(v) { return re.test(v);}},
|
return function(v, opt) {
|
||||||
typedInput: function(ptypeName,isConfig) { return function(v) {
|
if ((blankAllowed&&(v===''||v===undefined)) || (v!=='' && !isNaN(v))) {
|
||||||
var ptype = $("#node-"+(isConfig?"config-":"")+"input-"+ptypeName).val() || this[ptypeName];
|
|
||||||
if (ptype === 'json') {
|
|
||||||
try {
|
|
||||||
JSON.parse(v);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(err) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
} else if (ptype === 'msg' || ptype === 'flow' || ptype === 'global' ) {
|
if (opt && opt.label) {
|
||||||
return RED.utils.validatePropertyExpression(v);
|
return RED._("validator.errors.invalid-num-prop", {
|
||||||
} else if (ptype === 'num') {
|
prop: opt.label
|
||||||
return /^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/.test(v);
|
});
|
||||||
}
|
}
|
||||||
return true;
|
return opt ? RED._("validator.errors.invalid-num") : false;
|
||||||
}}
|
};
|
||||||
|
},
|
||||||
|
regex: function(re, mopt) {
|
||||||
|
return function(v, opt) {
|
||||||
|
if (re.test(v)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (opt && opt.label) {
|
||||||
|
return RED._("validator.errors.invalid-regex-prop", {
|
||||||
|
prop: opt.label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return opt ? RED._("validator.errors.invalid-regexp") : false;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
typedInput: function(ptypeName,isConfig,mopt) {
|
||||||
|
return function(v, opt) {
|
||||||
|
var ptype = $("#node-"+(isConfig?"config-":"")+"input-"+ptypeName).val() || this[ptypeName];
|
||||||
|
if (ptype === 'json') {
|
||||||
|
try {
|
||||||
|
JSON.parse(v);
|
||||||
|
return true;
|
||||||
|
} catch(err) {
|
||||||
|
if (opt && opt.label) {
|
||||||
|
return RED._("validator.errors.invalid-json-prop", {
|
||||||
|
error: err.message,
|
||||||
|
prop: opt.label,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return opt ? RED._("validator.errors.invalid-json", {
|
||||||
|
error: err.message
|
||||||
|
}) : false;
|
||||||
|
}
|
||||||
|
} else if (ptype === 'msg' || ptype === 'flow' || ptype === 'global' ) {
|
||||||
|
if (RED.utils.validatePropertyExpression(v)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (opt && opt.label) {
|
||||||
|
return RED._("validator.errors.invalid-prop-prop", {
|
||||||
|
prop: opt.label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return opt ? RED._("validator.errors.invalid-prop") : false;
|
||||||
|
} else if (ptype === 'num') {
|
||||||
|
if (/^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/.test(v)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (opt && opt.label) {
|
||||||
|
return RED._("validator.errors.invalid-num-prop", {
|
||||||
|
prop: opt.label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return opt ? RED._("validator.errors.invalid-num") : false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
border-radius: 1px;
|
border-radius: 1px;
|
||||||
}
|
}
|
||||||
.ace_gutter-cell {
|
.ace_gutter-cell {
|
||||||
color: $text-editor-color;
|
color: $text-editor-gutter-color;
|
||||||
}
|
}
|
||||||
.ace_gutter-active-line {
|
.ace_gutter-active-line {
|
||||||
background: $text-editor-gutter-active-line-background;
|
background: $text-editor-gutter-active-line-background;
|
||||||
|
|||||||
@@ -142,9 +142,16 @@ body {
|
|||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
vertical-align: text-top;
|
vertical-align: text-top;
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
background: url(images/spin.svg) no-repeat 50% 50%;
|
-webkit-mask-image: url(images/spin.svg);
|
||||||
background-size: contain
|
mask-image: url(images/spin.svg);
|
||||||
}
|
-webkit-mask-size: contain;
|
||||||
|
mask-size: contain;
|
||||||
|
-webkit-mask-position: 50% 50%;
|
||||||
|
mask-position: 50% 50%;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $spinner-color;
|
||||||
|
}
|
||||||
|
|
||||||
.red-ui-font-code {
|
.red-ui-font-code {
|
||||||
font-family: $monospace-font;
|
font-family: $monospace-font;
|
||||||
|
|||||||
@@ -150,7 +150,8 @@ $popover-button-border-color-hover: #666;
|
|||||||
|
|
||||||
$diff-text-header-color: $secondary-text-color;
|
$diff-text-header-color: $secondary-text-color;
|
||||||
$diff-text-header-background: #ffd;
|
$diff-text-header-background: #ffd;
|
||||||
$diff-text-header-background-hover: #ffc;
|
$diff-state-color: $primary-text-color;
|
||||||
|
$diff-state-prefix-color: $secondary-text-color;
|
||||||
$diff-state-added: #009900;
|
$diff-state-added: #009900;
|
||||||
$diff-state-deleted: #f80000;
|
$diff-state-deleted: #f80000;
|
||||||
$diff-state-changed: #f89406;
|
$diff-state-changed: #f89406;
|
||||||
@@ -193,7 +194,6 @@ $view-lasso-stroke: #ff7f0e;
|
|||||||
$view-lasso-fill: rgba(20,125,255,0.1);
|
$view-lasso-fill: rgba(20,125,255,0.1);
|
||||||
|
|
||||||
$view-background: $secondary-background;
|
$view-background: $secondary-background;
|
||||||
$view-select-mode-background: $secondary-background-selected;
|
|
||||||
$view-grid-color: #eee;
|
$view-grid-color: #eee;
|
||||||
|
|
||||||
$node-label-color: #333;
|
$node-label-color: #333;
|
||||||
@@ -212,6 +212,7 @@ $node-icon-background-color-opacity: 0.05;
|
|||||||
$node-icon-border-color: #000;
|
$node-icon-border-color: #000;
|
||||||
$node-icon-border-color-opacity: 0.1;
|
$node-icon-border-color-opacity: 0.1;
|
||||||
|
|
||||||
|
$node-config-background: #f3f3f3;
|
||||||
|
|
||||||
$node-link-port-background: #eee;
|
$node-link-port-background: #eee;
|
||||||
|
|
||||||
@@ -299,6 +300,14 @@ $group-default-label-color: #a4a4a4;
|
|||||||
$tourGuide-border: #c56c6c;
|
$tourGuide-border: #c56c6c;
|
||||||
$tourGuide-heading-color: #c56c6c;
|
$tourGuide-heading-color: #c56c6c;
|
||||||
|
|
||||||
|
$grip-color: #ccc;
|
||||||
|
|
||||||
|
$icons-flow-color: #808080;
|
||||||
|
|
||||||
|
$spinner-color: #999;
|
||||||
|
|
||||||
|
$tab-icon-color: #dedede;
|
||||||
|
|
||||||
// Deprecated
|
// Deprecated
|
||||||
$text-color-green: $text-color-success;
|
$text-color-green: $text-color-success;
|
||||||
$info-text-code-color: $text-color-code;
|
$info-text-code-color: $text-color-code;
|
||||||
|
|||||||
@@ -123,17 +123,20 @@
|
|||||||
background: $debug-message-background;
|
background: $debug-message-background;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
color: $secondary-text-color-inactive;
|
color: $secondary-text-color-inactive;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
}
|
}
|
||||||
.red-ui-debug-msg-date {
|
.red-ui-debug-msg-date {
|
||||||
padding: 1px 5px 1px 1px;
|
padding: 1px 10px 1px 0px;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.red-ui-debug-msg-topic {
|
.red-ui-debug-msg-topic {
|
||||||
display: block;
|
display: block;
|
||||||
color: $debug-message-text-color-meta;
|
color: $debug-message-text-color-meta;
|
||||||
}
|
}
|
||||||
.red-ui-debug-msg-name {
|
.red-ui-debug-msg-name {
|
||||||
padding: 1px 5px;
|
padding: 1px 0px;
|
||||||
color: $secondary-text-color-inactive;
|
color: $secondary-text-color-inactive;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.red-ui-debug-msg-tools {
|
.red-ui-debug-msg-tools {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
@@ -562,7 +562,7 @@ ul.red-ui-deploy-dialog-confirm-list {
|
|||||||
width: 30px;
|
width: 30px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: $secondary-text-color;
|
color: $diff-state-prefix-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.added {
|
&.added {
|
||||||
@@ -577,9 +577,11 @@ ul.red-ui-deploy-dialog-confirm-list {
|
|||||||
}
|
}
|
||||||
td.added {
|
td.added {
|
||||||
background: $diff-state-added-background;
|
background: $diff-state-added-background;
|
||||||
|
color: $diff-state-color;
|
||||||
}
|
}
|
||||||
td.removed {
|
td.removed {
|
||||||
background: $diff-state-deleted-background;
|
background: $diff-state-deleted-background;
|
||||||
|
color: $diff-state-color;
|
||||||
}
|
}
|
||||||
tr.mergeHeader td {
|
tr.mergeHeader td {
|
||||||
color: $diff-merge-header-color;
|
color: $diff-merge-header-color;
|
||||||
@@ -652,7 +654,7 @@ ul.red-ui-deploy-dialog-confirm-list {
|
|||||||
font-family: $monospace-font;
|
font-family: $monospace-font;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: $secondary-text-color;
|
color: $diff-text-header-color;
|
||||||
background: $diff-text-header-background;
|
background: $diff-text-header-background;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|||||||
@@ -149,11 +149,27 @@
|
|||||||
bottom: 0px;
|
bottom: 0px;
|
||||||
width: 7px;
|
width: 7px;
|
||||||
left: -9px;
|
left: -9px;
|
||||||
background: $primary-background url(images/grip.png) no-repeat 50% 50%;
|
background-color: $primary-background;
|
||||||
cursor: col-resize;
|
cursor: col-resize;
|
||||||
border-left: 1px solid $primary-border-color;
|
border-left: 1px solid $primary-border-color;
|
||||||
box-shadow: -1px 0 6px $shadow;
|
box-shadow: -1px 0 6px $shadow;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-mask-image: url(images/grip.svg);
|
||||||
|
mask-image: url(images/grip.svg);
|
||||||
|
-webkit-mask-size: auto;
|
||||||
|
mask-size: auto;
|
||||||
|
-webkit-mask-position: 50% 50%;
|
||||||
|
mask-position: 50% 50%;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $grip-color;
|
||||||
|
}
|
||||||
|
|
||||||
&.red-ui-tray-resize-maximised {
|
&.red-ui-tray-resize-maximised {
|
||||||
background: $primary-background;
|
background: $primary-background;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
@@ -685,6 +701,10 @@ div.red-ui-button-small.red-ui-color-picker-opacity-slider-handle {
|
|||||||
border-color: $list-item-background-hover;
|
border-color: $list-item-background-hover;
|
||||||
border-style: dashed;
|
border-style: dashed;
|
||||||
}
|
}
|
||||||
|
&.readonly {
|
||||||
|
cursor: pointer;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.red-ui-editor-type-json-editor-item-gutter {
|
.red-ui-editor-type-json-editor-item-gutter {
|
||||||
width: 48px;
|
width: 48px;
|
||||||
@@ -704,6 +724,10 @@ div.red-ui-button-small.red-ui-color-picker-opacity-slider-handle {
|
|||||||
> span, > button {
|
> span, > button {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
&.readonly {
|
||||||
|
cursor: pointer;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -379,3 +379,52 @@ g.red-ui-flow-link-unknown path.red-ui-flow-link-line {
|
|||||||
white-space: pre;
|
white-space: pre;
|
||||||
@include disable-selection;
|
@include disable-selection;
|
||||||
}
|
}
|
||||||
|
.red-ui-flow-junction-dragging {
|
||||||
|
.red-ui-flow-junction-background {
|
||||||
|
background: red !important
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction:not(.red-ui-flow-junction-dragging):hover {
|
||||||
|
.red-ui-flow-junction-background {
|
||||||
|
transform: scale(1.4);
|
||||||
|
stroke-width: 0.6;
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction-port {
|
||||||
|
opacity: 1;
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction-port-input {
|
||||||
|
transform: translate(-10px,0)
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction-port-output {
|
||||||
|
transform: translate(10px,0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction-port {
|
||||||
|
stroke: $node-border;
|
||||||
|
stroke-width: 1;
|
||||||
|
fill: $node-port-background;
|
||||||
|
cursor: crosshair;
|
||||||
|
transition: transform 0.1s;
|
||||||
|
opacity: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction-background {
|
||||||
|
stroke: $node-border;
|
||||||
|
stroke-width: 1;
|
||||||
|
fill: $node-port-background;
|
||||||
|
cursor: crosshair;
|
||||||
|
transform: scale(1);
|
||||||
|
transition: transform 0.1s;
|
||||||
|
&:hover {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction-hovered {
|
||||||
|
stroke: $port-selected-color;
|
||||||
|
fill: $port-selected-color;
|
||||||
|
}
|
||||||
|
.red-ui-flow-junction.selected .red-ui-flow-junction-background {
|
||||||
|
stroke: $port-selected-color;
|
||||||
|
// fill: $port-selected-color;
|
||||||
|
}
|
||||||
|
|||||||
@@ -26,6 +26,13 @@
|
|||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ui-widget.ui-widget-content {
|
||||||
|
border: 1px solid $tertiary-border-color;
|
||||||
|
}
|
||||||
|
.ui-widget-content {
|
||||||
|
border: 1px solid $secondary-border-color;
|
||||||
|
}
|
||||||
|
|
||||||
.ui-widget-header {
|
.ui-widget-header {
|
||||||
color: $header-text-color;
|
color: $header-text-color;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ button.red-ui-palette-editor-upload-button {
|
|||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
}
|
}
|
||||||
form {
|
form {
|
||||||
width: 0;
|
width: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.red-ui-palette-editor-upload {
|
.red-ui-palette-editor-upload {
|
||||||
|
|||||||
@@ -189,6 +189,7 @@
|
|||||||
.red-ui-search-result-node {
|
.red-ui-search-result-node {
|
||||||
&.red-ui-palette-icon-flow,
|
&.red-ui-palette-icon-flow,
|
||||||
&.red-ui-palette-icon-group,
|
&.red-ui-palette-icon-group,
|
||||||
|
&.red-ui-palette-icon-junction,
|
||||||
&.red-ui-palette-icon-selection {
|
&.red-ui-palette-icon-selection {
|
||||||
background: none;
|
background: none;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
@@ -268,6 +269,7 @@
|
|||||||
|
|
||||||
&.red-ui-palette-icon-flow,
|
&.red-ui-palette-icon-flow,
|
||||||
&.red-ui-palette-icon-group,
|
&.red-ui-palette-icon-group,
|
||||||
|
&.red-ui-palette-icon-junction,
|
||||||
&.red-ui-palette-icon-selection {
|
&.red-ui-palette-icon-selection {
|
||||||
background: none;
|
background: none;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
@@ -303,6 +305,7 @@
|
|||||||
&.red-ui-palette-icon-flow {
|
&.red-ui-palette-icon-flow {
|
||||||
margin-top: -2px;
|
margin-top: -2px;
|
||||||
}
|
}
|
||||||
|
&.red-ui-palette-icon-junction .red-ui-palette-icon-fa,
|
||||||
&.red-ui-palette-icon-group .red-ui-palette-icon-fa {
|
&.red-ui-palette-icon-group .red-ui-palette-icon-fa {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,23 @@
|
|||||||
height: 7px;
|
height: 7px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
cursor: ns-resize;
|
cursor: ns-resize;
|
||||||
background: $primary-background url(images/grip-horizontal.png) no-repeat 50% 50%;
|
background-color: $primary-background;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-mask-image: url(images/grip-horizontal.svg);
|
||||||
|
mask-image: url(images/grip-horizontal.svg);
|
||||||
|
-webkit-mask-size: contain;
|
||||||
|
mask-size: contain;
|
||||||
|
-webkit-mask-position: center;
|
||||||
|
mask-position: center;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $grip-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -70,6 +86,22 @@
|
|||||||
width: 7px;
|
width: 7px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
cursor: ew-resize;
|
cursor: ew-resize;
|
||||||
background: $primary-background url(images/grip.png) no-repeat 50% 50%;
|
background-color: $primary-background;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-mask-image: url(images/grip.svg);
|
||||||
|
mask-image: url(images/grip.svg);
|
||||||
|
-webkit-mask-size: contain;
|
||||||
|
mask-size: contain;
|
||||||
|
-webkit-mask-position: 50% 50%;
|
||||||
|
mask-position: 50% 50%;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $grip-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,20 @@
|
|||||||
border-radius:3px;
|
border-radius:3px;
|
||||||
padding: 1px 2px;
|
padding: 1px 2px;
|
||||||
}
|
}
|
||||||
|
.red-ui-popover {
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--red-ui-popover-color) !important;
|
||||||
|
}
|
||||||
|
a:hover,
|
||||||
|
a:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--red-ui-popover-color) !important;
|
||||||
|
}
|
||||||
|
a:focus {
|
||||||
|
outline: 1px solid $form-input-focus-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
.red-ui-popover a.red-ui-button,
|
.red-ui-popover a.red-ui-button,
|
||||||
.red-ui-popover button.red-ui-button {
|
.red-ui-popover button.red-ui-button {
|
||||||
&:not(.primary) {
|
&:not(.primary) {
|
||||||
|
|||||||
@@ -66,8 +66,9 @@
|
|||||||
border-left-width: 3px;
|
border-left-width: 3px;
|
||||||
border-right-width: 3px;
|
border-right-width: 3px;
|
||||||
.red-ui-palette-icon-fa {
|
.red-ui-palette-icon-fa {
|
||||||
|
font-size: 11px;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -2.5px;
|
top: -3px;
|
||||||
left: 0px;
|
left: 0px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,7 +84,7 @@
|
|||||||
.red-ui-search-result-node-port {
|
.red-ui-search-result-node-port {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
border: 1px solid $node-border;;
|
border: 1px solid $node-border;
|
||||||
width: 6px;
|
width: 6px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
top:4px;
|
top:4px;
|
||||||
|
|||||||
@@ -47,8 +47,24 @@
|
|||||||
bottom:10px;
|
bottom:10px;
|
||||||
width: 7px;
|
width: 7px;
|
||||||
// z-index: 11;
|
// z-index: 11;
|
||||||
background: $primary-background url(images/grip.png) no-repeat 50% 50%;
|
background-color: $primary-background;
|
||||||
cursor: col-resize;
|
cursor: col-resize;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-mask-image: url(images/grip.svg);
|
||||||
|
mask-image: url(images/grip.svg);
|
||||||
|
-webkit-mask-size: auto;
|
||||||
|
mask-size: auto;
|
||||||
|
-webkit-mask-position: 50% 50%;
|
||||||
|
mask-position: 50% 50%;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $grip-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.red-ui-sidebar-closed > #red-ui-sidebar { display: none; }
|
.red-ui-sidebar-closed > #red-ui-sidebar { display: none; }
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ ul.red-ui-sidebar-node-config-list {
|
|||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
box-shadow: 0 0 0 2px $node-selected-color;
|
box-shadow: 0 0 0 2px $node-selected-color;
|
||||||
}
|
}
|
||||||
|
&.highlighted {
|
||||||
|
border-color: transparent;
|
||||||
|
outline: dashed $node-selected-color 4px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.red-ui-palette-label {
|
.red-ui-palette-label {
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
@@ -54,7 +58,7 @@ ul.red-ui-sidebar-node-config-list {
|
|||||||
.red-ui-palette-icon-container {
|
.red-ui-palette-icon-container {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
background-color: $secondary-background-selected;
|
background-color: $node-icon-background-color;
|
||||||
border-top-right-radius: 4px;
|
border-top-right-radius: 4px;
|
||||||
border-bottom-right-radius: 4px;
|
border-bottom-right-radius: 4px;
|
||||||
a {
|
a {
|
||||||
@@ -63,10 +67,10 @@ ul.red-ui-sidebar-node-config-list {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
color: $secondary-text-color;
|
color: $node-port-label-color;
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background: $secondary-background-hover;
|
background: $node-port-background-hover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -74,7 +78,7 @@ ul.red-ui-sidebar-node-config-list {
|
|||||||
.red-ui-palette-node-config {
|
.red-ui-palette-node-config {
|
||||||
width: 160px;
|
width: 160px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
background: $primary-background;
|
background: $node-config-background;
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -530,10 +530,16 @@ div.red-ui-info-table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.red-ui-icons-flow {
|
.red-ui-icons-flow {
|
||||||
background-image: url('images/subflow_tab.svg');
|
mask-image: url(images/subflow_tab.svg);
|
||||||
background-repeat: no-repeat;
|
-webkit-mask-image: url(images/subflow_tab.svg);
|
||||||
background-size: contain;
|
mask-position: center;
|
||||||
filter: brightness(2.5);
|
-webkit-mask-position: center;
|
||||||
|
mask-size: contain;
|
||||||
|
-webkit-mask-size: contain;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
background-color: $icons-flow-color;
|
||||||
|
// filter: brightness(2.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.red-ui-info-toolbar {
|
.red-ui-info-toolbar {
|
||||||
|
|||||||
@@ -85,6 +85,10 @@
|
|||||||
&:not(.active) a:hover+a.red-ui-tab-close {
|
&:not(.active) a:hover+a.red-ui-tab-close {
|
||||||
background: $tab-background-hover;
|
background: $tab-background-hover;
|
||||||
}
|
}
|
||||||
|
&.highlighted {
|
||||||
|
box-shadow: 0px 0px 4px 2px $node-selected-color;
|
||||||
|
border: dashed 1px $node-selected-color;
|
||||||
|
}
|
||||||
&.active {
|
&.active {
|
||||||
background: $tab-background-active;
|
background: $tab-background-active;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -342,21 +346,28 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
img.red-ui-tab-icon {
|
|
||||||
margin-left: -8px;
|
|
||||||
margin-right: 3px;
|
|
||||||
margin-top: -2px;
|
|
||||||
opacity: 0.1;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
i.red-ui-tab-icon {
|
i.red-ui-tab-icon {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
width: 18px;
|
width: 18px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
&:not(.fa) {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: -8px;
|
||||||
|
margin-right: 3px;
|
||||||
|
margin-top: -2px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
vertical-align: middle;
|
||||||
|
-webkit-mask-size: contain;
|
||||||
|
mask-size: contain;
|
||||||
|
-webkit-mask-position: center;
|
||||||
|
mask-position: center;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $tab-icon-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.red-ui-tabs-badges {
|
.red-ui-tabs-badges {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top:0px;
|
top:0px;
|
||||||
|
|||||||
@@ -135,6 +135,13 @@
|
|||||||
}
|
}
|
||||||
.red-ui-treeList-spinner {
|
.red-ui-treeList-spinner {
|
||||||
height: 32px;
|
height: 32px;
|
||||||
background: url(images/spin.svg) 50% 50% no-repeat;
|
-webkit-mask-image: url(images/spin.svg);
|
||||||
background-size: auto 20px;
|
mask-image: url(images/spin.svg);
|
||||||
|
-webkit-mask-size: auto 20px;
|
||||||
|
mask-size: auto 20px;
|
||||||
|
-webkit-mask-position: 50% 50%;
|
||||||
|
mask-position: 50% 50%;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $spinner-color;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
.red-ui-typedInput-container {
|
.red-ui-typedInput-container {
|
||||||
border: 1px solid $form-input-border-color;
|
border: 1px solid $form-input-border-color;
|
||||||
border-radius: 4px;
|
border-radius: 5px;
|
||||||
height: 34px;
|
height: 34px;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
@@ -104,6 +104,17 @@
|
|||||||
}
|
}
|
||||||
.red-ui-typedInput-icon {
|
.red-ui-typedInput-icon {
|
||||||
margin-right: 6px;
|
margin-right: 6px;
|
||||||
|
&:not(.fa) {
|
||||||
|
-webkit-mask-size: cover;
|
||||||
|
mask-size: cover;
|
||||||
|
-webkit-mask-position: center;
|
||||||
|
mask-position: center;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $primary-text-color;
|
||||||
|
height: 14px;
|
||||||
|
width: 12px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
button.red-ui-typedInput-type-select,
|
button.red-ui-typedInput-type-select,
|
||||||
@@ -142,6 +153,16 @@ button.red-ui-typedInput-option-trigger
|
|||||||
img {
|
img {
|
||||||
max-width: none;
|
max-width: none;
|
||||||
}
|
}
|
||||||
|
.red-ui-typedInput-icon:not(.fa) {
|
||||||
|
display: inline-block;
|
||||||
|
-webkit-mask-size: cover;
|
||||||
|
mask-size: cover;
|
||||||
|
-webkit-mask-position: center;
|
||||||
|
mask-position: center;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
background-color: $primary-text-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.disabled):hover {
|
&:not(.disabled):hover {
|
||||||
|
|||||||
@@ -58,7 +58,6 @@
|
|||||||
.red-ui-workspace-select-mode {
|
.red-ui-workspace-select-mode {
|
||||||
.red-ui-workspace-chart-background {
|
.red-ui-workspace-chart-background {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
// fill: $view-select-mode-background;
|
|
||||||
}
|
}
|
||||||
.red-ui-workspace-chart-grid line {
|
.red-ui-workspace-chart-grid line {
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
@@ -135,6 +134,13 @@
|
|||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-counter {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: smaller;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a.red-ui-footer-button,
|
a.red-ui-footer-button,
|
||||||
|
|||||||
BIN
packages/node_modules/@node-red/editor-client/src/tours/images/continuous-search.png
vendored
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
packages/node_modules/@node-red/editor-client/src/tours/images/debug-path-tooltip.png
vendored
Normal file
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 70 KiB |
BIN
packages/node_modules/@node-red/editor-client/src/tours/images/junction-quick-add.png
vendored
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
packages/node_modules/@node-red/editor-client/src/tours/images/junction-slice.gif
vendored
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 81 KiB |
BIN
packages/node_modules/@node-red/editor-client/src/tours/images/split-wire-with-links.gif
vendored
Normal file
|
After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 29 KiB |
@@ -1,52 +1,76 @@
|
|||||||
export default {
|
export default {
|
||||||
version: "2.2.0",
|
version: "3.0.0-beta.1",
|
||||||
steps: [
|
steps: [
|
||||||
{
|
{
|
||||||
titleIcon: "fa fa-map-o",
|
titleIcon: "fa fa-map-o",
|
||||||
title: {
|
title: {
|
||||||
"en-US": "Welcome to Node-RED 2.2!",
|
"en-US": "Welcome to Node-RED 3.0 Beta 1!",
|
||||||
"ja": "Node-RED 2.2へようこそ!"
|
"ja": "Node-RED 3.0 ベータ1へようこそ!"
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
"en-US": "Let's take a moment to discover the new features in this release.",
|
"en-US": "<p>This is the first Beta release of Node-RED 3.0. It contains just about everything we have planned for the final release.</p><p>Let's take a moment to discover the new features in this release.</p>",
|
||||||
"ja": "本リリースの新機能を見つけてみましょう。"
|
"ja": "<p>これはNode-RED 3.0の最初のベータリリースです。これには、最終リリースで計画しているほぼ全ての機能が含まれています。</p><p>本リリースの新機能を見つけてみましょう。</p>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: {
|
title: {
|
||||||
"en-US": "Search history",
|
"en-US": "Wire Junctions",
|
||||||
"ja": "検索履歴"
|
"ja": "分岐点をワイヤーに追加"
|
||||||
},
|
},
|
||||||
|
image: 'images/junction-slice.gif',
|
||||||
description: {
|
description: {
|
||||||
"en-US": "<p>The Search dialog now keeps a history of your searches, making it easier to go back to a previous search.</p>",
|
"en-US": `<p>To make it easier to route wires around your flows, it is now possible to
|
||||||
"ja": "<p>検索ダイアログが検索履歴を保持するようになりました。これによって、過去の検索に戻りやすくなりました。</p>"
|
add junction nodes that give you more control.</p>
|
||||||
},
|
<p>Junctions can be added to wires by holding the Shift key, then click and drag with
|
||||||
element: "#red-ui-search .red-ui-searchBox-form",
|
the right-hand mouse button across the wires.</p>`,
|
||||||
prepare(done) {
|
"ja": `<p>フローのワイヤーの経路をより制御しやすくするために、分岐点ノードを追加できるようになりました。</p>
|
||||||
RED.search.show();
|
<p>シフトキーを押しながら、マウスの右ボタンをクリックし、ワイヤーを横切るようにドラッグすることで、分岐点を追加できます。</p>`
|
||||||
setTimeout(done,400);
|
|
||||||
},
|
|
||||||
complete() {
|
|
||||||
RED.search.hide();
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: {
|
title: {
|
||||||
"en-US": "Remembering Zoom & Position",
|
"en-US": "Wire Junctions",
|
||||||
"ja": "拡大/縮小のレベルや位置を記憶"
|
"ja": "分岐点をワイヤーに追加"
|
||||||
},
|
},
|
||||||
|
image: 'images/junction-quick-add.png',
|
||||||
description: {
|
description: {
|
||||||
"en-US": "<p>The editor has new options to restore the zoom level and scroll position when reloading the editor.</p>",
|
"en-US": `<p>Junctions can also be added using the quick-add dialog.</p>
|
||||||
"ja": "<p>エディタを再読み込みした時に、拡大/縮小のレベルやスクロール位置を復元するための新しいオプションを利用できます。</p>"
|
<p>The dialog is opened by holding the Ctrl (or Cmd) key when
|
||||||
|
clicking in the workspace.</p>`,
|
||||||
|
"ja": `<p>クイック追加ダイアログを用いて、分岐点を追加することもできます。</p>
|
||||||
|
<p>本ダイアログを開くには、Ctrl(またはCmd)キーを押しながら、ワークスペース上でクリックします。</p>`
|
||||||
},
|
},
|
||||||
element: function() { return $("#user-settings-view-store-position").parent()},
|
},
|
||||||
prepare(done) {
|
{
|
||||||
RED.actions.invoke("core:show-user-settings")
|
title: {
|
||||||
setTimeout(done,400);
|
"en-US": "Debug Path Tooltip",
|
||||||
|
"ja": "デバッグパスのツールチップ"
|
||||||
},
|
},
|
||||||
complete(done) {
|
image: 'images/debug-path-tooltip.png',
|
||||||
$("#node-dialog-ok").trigger("click");
|
description: {
|
||||||
setTimeout(done,400);
|
"en-US": `<p>When hovering over a node name in the Debug sidebar, a
|
||||||
|
new tooltip shows the full location of the node.</p>
|
||||||
|
<p>This is useful when working with subflows, making it
|
||||||
|
much easier to identify exactly which node generated
|
||||||
|
the message.</p>
|
||||||
|
<p>Clicking on any item in the list will reveal it in
|
||||||
|
the workspace.</p>`,
|
||||||
|
"ja": `<p>デバックサイドバー内のノード名の上にマウスカーソルを乗せると、新たにツールチップが表示され、ノードの場所が分かるようになっています。</p>
|
||||||
|
<p>これは、サブフローを用いる時に役立つ機能であり、メッセージがどのノードから出力されたかを正確に特定することが遥かに簡単になります。</p>
|
||||||
|
<p>本リスト内の要素をクリックすると、ワークスペース内にその要素が表示されます。</p>`
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: {
|
||||||
|
"en-US": "Continuous Search",
|
||||||
|
"ja": "連続した検索"
|
||||||
|
},
|
||||||
|
image: 'images/continuous-search.png',
|
||||||
|
description: {
|
||||||
|
"en-US": `<p>When searching for things in the editor, a new toolbar in
|
||||||
|
the workspace provides options to quickly jump between
|
||||||
|
the search results.</p>`,
|
||||||
|
"ja": `<p>ワークスペース内の新しいツールバーにあるオプションによって、エディタ内を検索する際に、検索結果の間を素早く移動できます。</p>`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -54,85 +78,44 @@ export default {
|
|||||||
"en-US": "New wiring actions",
|
"en-US": "New wiring actions",
|
||||||
"ja": "新しいワイヤー操作"
|
"ja": "新しいワイヤー操作"
|
||||||
},
|
},
|
||||||
// image: "images/",
|
image: "images/split-wire-with-links.gif",
|
||||||
description: {
|
description: {
|
||||||
"en-US": `<p>A pair of new actions have been added to help with wiring nodes together:</p>
|
"en-US": `<p>A new action has been added that will replace a wire with a pair of connected Link nodes:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><b><code>Wire Series Of Nodes</code></b> - adds a wire (if necessary) between each pair of nodes in the order they were selected.</li>
|
<li><b><code>Split Wire With Link Nodes</code></b></li>
|
||||||
<li><b><code>Wire Node To Multiple</code></b> - wires the first node selected to all of the other selected nodes.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<p>Actions can be accessed from the Action List in the main menu.</p>`,
|
<p>Actions can be accessed from the Action List in the main menu.</p>`,
|
||||||
"ja": `<p>ノード接続を支援する2つの新しい操作が追加されました:</p>
|
"ja": `<p>ワイヤーを、接続されたLinkノードのペアに置き換える動作が新たに追加されました:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><b><code>Wire Series Of Nodes</code></b> - ノードを選択した順序で、各ノードのペアの間にワイヤーを(必要に応じて)追加します。</li>
|
<li><b><code>ワイヤーをlinkノードで分割</code></b></li>
|
||||||
<li><b><code>Wire Node To Multiple</code></b> - 最初に選択したノードから、他の選択した全てのノードに対して、ワイヤーを追加します。</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<p>メインメニュー内の動作一覧から、これらの操作を利用できます。</p>`
|
<p>本アクションは、メインメニュー内の動作一覧から呼び出せます。</p>`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: {
|
title: {
|
||||||
"en-US": "Deleting nodes and reconnecting wires",
|
"en-US": "Default node names",
|
||||||
"ja": "ノードの削除とワイヤーの再接続"
|
"ja": "標準ノードの名前"
|
||||||
},
|
},
|
||||||
image: "images/delete-repair.gif",
|
// image: "images/",
|
||||||
description: {
|
description: {
|
||||||
"en-US": `<p>It is now possible to delete a selection of nodes and automatically repair the wiring behind them.</p>
|
"en-US": `<p>Some nodes have been updated to generate a unique name when
|
||||||
<p>This is really useful if you want to remove a node from the middle of the flow.</p>
|
new instances are added to the workspace. This applies to
|
||||||
<p>Hold the Ctrl (or Cmd) key when you press Delete and the nodes will be gone and the wires repaired.</p>
|
<code>Debug</code>, <code>Function</code> and <code>Link</code> nodes.</p>
|
||||||
`,
|
<p>A new action has also been added to generate default names for the selected
|
||||||
"ja": `<p>選択したノードを削除した後、その背後にあるワイヤーを自動的に修復できるようになりました。</p>
|
nodes:</p>
|
||||||
<p>これは、フローの中からノードを削除する時に、とても便利に使えます。</p>
|
<ul>
|
||||||
<p>Ctrl (またはCmd)キーを押しながらDeleteキーを押すと、ノードがなくなり、ワイヤーが修復されます。</p>
|
<li><b><code>Generate Node Names</code></b></li>
|
||||||
`
|
</ul><p>Actions can be accessed from the Action List in the main menu.</p>
|
||||||
|
`,
|
||||||
|
"ja": `<p>一部のノードは、ワークスペース上に新インスタンスとして追加した際に、一意の名前を付けるよう変更されました。この変更は、<code>Debug</code>、<code>Function</code>、<code>Link</code>ノードに適用されています。</p>
|
||||||
|
<p>選択したノードに対して、標準の名前を生成する動作も新たに追加されました:</p>
|
||||||
|
<ul>
|
||||||
|
<li><b><code>ノード名を生成</code></b></li>
|
||||||
|
</ul><p>本アクションは、メインメニュー内の動作一覧から呼び出せます。</p>
|
||||||
|
`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: {
|
|
||||||
"en-US": "Detaching nodes from a flow",
|
|
||||||
"ja": "フローからノードの切り離し"
|
|
||||||
},
|
|
||||||
image: "images/detach-repair.gif",
|
|
||||||
description: {
|
|
||||||
"en-US": `<p>If you want to remove a node from a flow without deleting it,
|
|
||||||
you can use the <b><code>Detach Selected Nodes</code></b> action.</p>
|
|
||||||
<p>The nodes will be removed from their flow, the wiring repaired behind them, and then attached to the mouse
|
|
||||||
so you can drop them wherever you want in the workspace.</p>
|
|
||||||
<p>There isn't a default keyboard shortcut assigned for this new action, but
|
|
||||||
you can add your own via the Keyboard pane of the main Settings dialog.</p>`,
|
|
||||||
"ja": `<p>ノードを削除することなく、フローからノードを除きたい場合は、<b><code>Detach Selected Nodes</code></b>操作を利用できます。</p>
|
|
||||||
<p>フローからノードが除かれた後、背後のワイヤーが修復され、ノードはマウスポインタにつながります。そのため、ワークスペースの好きな所にノードを配置できます。</p>
|
|
||||||
<p>この新しい操作に対して、デフォルトのキーボードショートカットは登録されていませんが、メイン設定ダイアログのキーボード設定から追加できます。</p>`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: {
|
|
||||||
"en-US": "More wiring tricks",
|
|
||||||
"ja": "その他のワイヤー操作"
|
|
||||||
},
|
|
||||||
image: "images/slice.gif",
|
|
||||||
description: {
|
|
||||||
"en-US": `<p>A couple more wiring tricks to share.</p>
|
|
||||||
<p>You can now select multiple wires by holding the Ctrl (or Cmd) key
|
|
||||||
when clicking on a wire. This makes it easier to delete multiple wires in one go.</p>
|
|
||||||
<p>If you hold the Ctrl (or Cmd) key, then click and drag with the right-hand mouse button,
|
|
||||||
you can slice through wires to remove them.</p>`,
|
|
||||||
"ja": `<p>その他のいくつかのワイヤー操作</p>
|
|
||||||
<p>Ctrl (またはCmd)キーを押しながらワイヤーをクリックすることで、複数のワイヤーを選択できるようになりました。これによって、複数のワイヤーを一度に削除することが簡単になりました。</p>
|
|
||||||
<p>Ctrl (またはCmd)キーを押しながら、マウスの右ボタンを用いてドラッグすると、ワイヤーを切って削除できます。</p>`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: {
|
|
||||||
"en-US": "Subflow Output Labels",
|
|
||||||
"ja": "サブフローの出力ラベル"
|
|
||||||
},
|
|
||||||
image: "images/subflow-labels.png",
|
|
||||||
description: {
|
|
||||||
"en-US": "<p>If a subflow has labels set for its outputs, they now get shown on the ports within the subflow template view.</p>",
|
|
||||||
"ja": "<p>サブフローの出力にラベルが設定されている場合、サブフローテンプレート画面内のポートにラベルが表示されるようになりました。</p>"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: {
|
title: {
|
||||||
"en-US": "Node Updates",
|
"en-US": "Node Updates",
|
||||||
@@ -141,14 +124,14 @@ export default {
|
|||||||
// image: "images/",
|
// image: "images/",
|
||||||
description: {
|
description: {
|
||||||
"en-US": `<ul>
|
"en-US": `<ul>
|
||||||
<li>The JSON node will now handle parsing Buffer payloads</li>
|
<li>The Debug node can be configured to count messages it receives</li>
|
||||||
<li>The TCP Client nodes support TLS connections</li>
|
<li>The Link Call node can use a message property to dynamically target the link it should call</li>
|
||||||
<li>The WebSocket node allows you to specify a sub-protocol when connecting</li>
|
<li>The HTTP Request node can be preconfigured with HTTP headers</li>
|
||||||
</ul>`,
|
</ul>`,
|
||||||
"ja": `<ul>
|
"ja": `<ul>
|
||||||
<li>JSONノードが、バッファ形式のペイロードを解析できるようになりました。</li>
|
<li>Debugノードは、受信したメッセージの数をカウントするよう設定できるようになりました。</li>
|
||||||
<li>TCPクライアントノードが、TLS接続をサポートしました。</li>
|
<li>Link Callノードは、メッセージのプロパティによって、呼び出し対象のlinkを動的に指定できるようになりました。</li>
|
||||||
<li>WebSocketノードで、接続時にサブプロトコルを指定できるようになりました。</li>
|
<li>HTTP Requestノードは、HTTPヘッダを事前設定できるようになりました。</li>
|
||||||
</ul>`
|
</ul>`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/node-red/nr-monaco-build */
|
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/Steve-Mcl/monaco-editor-esm-i18n */
|
||||||
|
|
||||||
declare module 'assert' {
|
declare module 'assert' {
|
||||||
/** An alias of `assert.ok()`. */
|
/** An alias of `assert.ok()`. */
|
||||||
@@ -125,3 +125,7 @@ declare module 'assert' {
|
|||||||
|
|
||||||
export = assert;
|
export = assert;
|
||||||
}
|
}
|
||||||
|
declare module 'node:assert' {
|
||||||
|
import assert = require('assert');
|
||||||
|
export = assert;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/node-red/nr-monaco-build */
|
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/Steve-Mcl/monaco-editor-esm-i18n */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Async Hooks module: https://nodejs.org/api/async_hooks.html
|
* Async Hooks module: https://nodejs.org/api/async_hooks.html
|
||||||
@@ -227,3 +227,6 @@ declare module 'async_hooks' {
|
|||||||
enterWith(store: T): void;
|
enterWith(store: T): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module 'node:async_hooks' {
|
||||||
|
export * from 'async_hooks';
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/node-red/nr-monaco-build */
|
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/Steve-Mcl/monaco-editor-esm-i18n */
|
||||||
|
|
||||||
declare module 'buffer' {
|
declare module 'buffer' {
|
||||||
|
import { BinaryLike } from 'node:crypto';
|
||||||
export const INSPECT_MAX_BYTES: number;
|
export const INSPECT_MAX_BYTES: number;
|
||||||
export const kMaxLength: number;
|
export const kMaxLength: number;
|
||||||
export const kStringMaxLength: number;
|
export const kStringMaxLength: number;
|
||||||
@@ -20,6 +21,72 @@ declare module 'buffer' {
|
|||||||
new(size: number): Buffer;
|
new(size: number): Buffer;
|
||||||
prototype: Buffer;
|
prototype: Buffer;
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* @experimental
|
||||||
|
*/
|
||||||
|
export interface BlobOptions {
|
||||||
|
/**
|
||||||
|
* @default 'utf8'
|
||||||
|
*/
|
||||||
|
encoding?: BufferEncoding | undefined;
|
||||||
|
/**
|
||||||
|
* The Blob content-type. The intent is for `type` to convey
|
||||||
|
* the MIME media type of the data, however no validation of the type format
|
||||||
|
* is performed.
|
||||||
|
*/
|
||||||
|
type?: string | undefined;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) encapsulates immutable, raw data that can be safely shared across
|
||||||
|
* multiple worker threads.
|
||||||
|
* @since v14.18.0
|
||||||
|
* @experimental
|
||||||
|
*/
|
||||||
|
export class Blob {
|
||||||
|
/**
|
||||||
|
* The total size of the `Blob` in bytes.
|
||||||
|
* @since v14.18.0
|
||||||
|
*/
|
||||||
|
readonly size: number;
|
||||||
|
/**
|
||||||
|
* The content-type of the `Blob`.
|
||||||
|
* @since v14.18.0
|
||||||
|
*/
|
||||||
|
readonly type: string;
|
||||||
|
/**
|
||||||
|
* Creates a new `Blob` object containing a concatenation of the given sources.
|
||||||
|
*
|
||||||
|
* {ArrayBuffer}, {TypedArray}, {DataView}, and {Buffer} sources are copied into
|
||||||
|
* the 'Blob' and can therefore be safely modified after the 'Blob' is created.
|
||||||
|
*
|
||||||
|
* String sources are also copied into the `Blob`.
|
||||||
|
*/
|
||||||
|
constructor(sources: Array<BinaryLike | Blob>, options?: BlobOptions);
|
||||||
|
/**
|
||||||
|
* Returns a promise that fulfills with an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) containing a copy of
|
||||||
|
* the `Blob` data.
|
||||||
|
* @since v14.18.0
|
||||||
|
*/
|
||||||
|
arrayBuffer(): Promise<ArrayBuffer>;
|
||||||
|
/**
|
||||||
|
* Creates and returns a new `Blob` containing a subset of this `Blob` objects
|
||||||
|
* data. The original `Blob` is not altered.
|
||||||
|
* @since v14.18.0
|
||||||
|
* @param start The starting index.
|
||||||
|
* @param end The ending index.
|
||||||
|
* @param type The content-type for the new `Blob`
|
||||||
|
*/
|
||||||
|
slice(start?: number, end?: number, type?: string): Blob;
|
||||||
|
/**
|
||||||
|
* Returns a promise that fulfills with the contents of the `Blob` decoded as a
|
||||||
|
* UTF-8 string.
|
||||||
|
* @since v14.18.0
|
||||||
|
*/
|
||||||
|
text(): Promise<string>;
|
||||||
|
}
|
||||||
|
|
||||||
export { BuffType as Buffer };
|
export { BuffType as Buffer };
|
||||||
}
|
}
|
||||||
|
declare module 'node:buffer' {
|
||||||
|
export * from 'buffer';
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/node-red/nr-monaco-build */
|
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/Steve-Mcl/monaco-editor-esm-i18n */
|
||||||
|
|
||||||
declare module 'child_process' {
|
declare module 'child_process' {
|
||||||
import { BaseEncodingOptions } from 'fs';
|
import { BaseEncodingOptions } from 'fs';
|
||||||
@@ -512,3 +512,6 @@ declare module 'child_process' {
|
|||||||
function execFileSync(command: string, args: ReadonlyArray<string>, options: ExecFileSyncOptionsWithBufferEncoding): Buffer;
|
function execFileSync(command: string, args: ReadonlyArray<string>, options: ExecFileSyncOptionsWithBufferEncoding): Buffer;
|
||||||
function execFileSync(command: string, args?: ReadonlyArray<string>, options?: ExecFileSyncOptions): string | Buffer;
|
function execFileSync(command: string, args?: ReadonlyArray<string>, options?: ExecFileSyncOptions): string | Buffer;
|
||||||
}
|
}
|
||||||
|
declare module 'node:child_process' {
|
||||||
|
export * from 'child_process';
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/node-red/nr-monaco-build */
|
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/Steve-Mcl/monaco-editor-esm-i18n */
|
||||||
|
|
||||||
declare module 'cluster' {
|
declare module 'cluster' {
|
||||||
import * as child from 'child_process';
|
import * as child from 'child_process';
|
||||||
@@ -263,3 +263,6 @@ declare module 'cluster' {
|
|||||||
|
|
||||||
function eventNames(): string[];
|
function eventNames(): string[];
|
||||||
}
|
}
|
||||||
|
declare module 'node:cluster' {
|
||||||
|
export * from 'cluster';
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
|
||||||
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/node-red/nr-monaco-build */
|
/* NOTE: Do not edit directly! This file is generated using `npm run update-types` in https://github.com/Steve-Mcl/monaco-editor-esm-i18n */
|
||||||
|
|
||||||
declare module 'console' {
|
declare module 'console' {
|
||||||
|
import console = require('node:console');
|
||||||
|
export = console;
|
||||||
|
}
|
||||||
|
declare module 'node:console' {
|
||||||
import { InspectOptions } from 'util';
|
import { InspectOptions } from 'util';
|
||||||
|
|
||||||
global {
|
global {
|
||||||
@@ -118,6 +122,11 @@ declare module 'console' {
|
|||||||
ignoreErrors?: boolean | undefined;
|
ignoreErrors?: boolean | undefined;
|
||||||
colorMode?: boolean | 'auto' | undefined;
|
colorMode?: boolean | 'auto' | undefined;
|
||||||
inspectOptions?: InspectOptions | undefined;
|
inspectOptions?: InspectOptions | undefined;
|
||||||
|
/**
|
||||||
|
* Set group indentation
|
||||||
|
* @default 2
|
||||||
|
*/
|
||||||
|
groupIndentation?: number | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ConsoleConstructor {
|
interface ConsoleConstructor {
|
||||||
|
|||||||