mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Compare commits
2917 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80716cc45b | ||
|
|
300ec635d5 | ||
|
|
eea7abb30b | ||
|
|
7512fdca49 | ||
|
|
fa26111339 | ||
|
|
27eb992d01 | ||
|
|
9e227a0769 | ||
|
|
1da0379b51 | ||
|
|
30d992f889 | ||
|
|
e3526cbe1c | ||
|
|
aa2b2b0fb1 | ||
|
|
50134307fe | ||
|
|
df0eb1a7e4 | ||
|
|
b22f2e704d | ||
|
|
c06ebb7e33 | ||
|
|
7e34a253b4 | ||
|
|
7322cd0a06 | ||
|
|
3fe4c12468 | ||
|
|
2a4fb7123d | ||
|
|
38a77d2b78 | ||
|
|
dc239db256 | ||
|
|
4ba3c937a8 | ||
|
|
02893d3e78 | ||
|
|
5124bc6bf8 | ||
|
|
1048b16f3c | ||
|
|
bbbbb1b1e0 | ||
|
|
14b452c996 | ||
|
|
bb91a08939 | ||
|
|
526b3fda91 | ||
|
|
d70b7ea924 | ||
|
|
1d342a778d | ||
|
|
476016cbcc | ||
|
|
61b12f6bbe | ||
|
|
d71b22412b | ||
|
|
e408c6b376 | ||
|
|
bf30c24e8e | ||
|
|
6c14ed0ef5 | ||
|
|
6d41ecdae0 | ||
|
|
3f89bc2733 | ||
|
|
87a25df162 | ||
|
|
341f43610a | ||
|
|
67cdf3ef96 | ||
|
|
cd98f448e9 | ||
|
|
fac79fd068 | ||
|
|
da97c5d558 | ||
|
|
ae7b9fe62e | ||
|
|
e52c2911da | ||
|
|
07a29ff779 | ||
|
|
1b4a8ebe83 | ||
|
|
abf2eacf18 | ||
|
|
f808f4e2e8 | ||
|
|
ca33d6b799 | ||
|
|
940740f15d | ||
|
|
51208fcd0c | ||
|
|
707152d82f | ||
|
|
5538f6dd8a | ||
|
|
d601e2caa4 | ||
|
|
46fdf56c79 | ||
|
|
f55ee6e665 | ||
|
|
03648dc7e8 | ||
|
|
66a667fe58 | ||
|
|
1bb3a0eca5 | ||
|
|
08927dfb55 | ||
|
|
b27483de9c | ||
|
|
211d420fb2 | ||
|
|
b8ca4665c1 | ||
|
|
960af87fb0 | ||
|
|
de7339ae97 | ||
|
|
0995af62b6 | ||
|
|
c2e03a40b4 | ||
|
|
c855050bcf | ||
|
|
29ed5b2792 | ||
|
|
e39216e65a | ||
|
|
7ac7f9b4c8 | ||
|
|
4709eb9d49 | ||
|
|
c13b8266dd | ||
|
|
bd58431603 | ||
|
|
9a3cb0b2b5 | ||
|
|
6beae5a806 | ||
|
|
a0636632a1 | ||
|
|
5dfa47ab6c | ||
|
|
ade4679e8c | ||
|
|
410b938442 | ||
|
|
19dcc3a683 | ||
|
|
20d067c1ea | ||
|
|
9526566799 | ||
|
|
0b9dd82c91 | ||
|
|
19213434f9 | ||
|
|
014691346a | ||
|
|
6738b95c29 | ||
|
|
6a8230ec1e | ||
|
|
5679d264b6 | ||
|
|
37265cf4ef | ||
|
|
8a63275989 | ||
|
|
7fc64a84e8 | ||
|
|
02f7cdd5aa | ||
|
|
d7dcceef60 | ||
|
|
ae5e1570ae | ||
|
|
3ca045394a | ||
|
|
179032cd4d | ||
|
|
6a6f0d04d6 | ||
|
|
add4d9758c | ||
|
|
a0d3ea62b2 | ||
|
|
7447e88a50 | ||
|
|
a193b79d3d | ||
|
|
da380f7464 | ||
|
|
269cf02c0b | ||
|
|
fb50e2772a | ||
|
|
058c97138a | ||
|
|
828ae29aed | ||
|
|
6a0f45140c | ||
|
|
50a267528d | ||
|
|
220786be60 | ||
|
|
fa78bb3d78 | ||
|
|
9a32ebd0c0 | ||
|
|
4643f5e8cc | ||
|
|
7de0984d6d | ||
|
|
635334f096 | ||
|
|
f0d0990b5a | ||
|
|
43b3589451 | ||
|
|
016a19ba7c | ||
|
|
aeb79bce2a | ||
|
|
0ab9b9a5fd | ||
|
|
56e58521bd | ||
|
|
b10ef4c98c | ||
|
|
3ff038fb98 | ||
|
|
adb498af24 | ||
|
|
fc67a2efc2 | ||
|
|
55771c7241 | ||
|
|
109fa5f04e | ||
|
|
1f412f3d78 | ||
|
|
2b69f52c92 | ||
|
|
6e90798f16 | ||
|
|
3994b404a1 | ||
|
|
0b7e8ec323 | ||
|
|
bb0b547d5a | ||
|
|
1e1acc7ad7 | ||
|
|
1419432b04 | ||
|
|
1a521d7e09 | ||
|
|
5858d2789a | ||
|
|
6a1e4fac5a | ||
|
|
bab6e57a59 | ||
|
|
4ed53fb622 | ||
|
|
e17775c435 | ||
|
|
565c212779 | ||
|
|
b54e9d8d55 | ||
|
|
861c89a0cc | ||
|
|
4268a04a04 | ||
|
|
9bd7131914 | ||
|
|
8485ca254f | ||
|
|
507f9b68eb | ||
|
|
f7b726372f | ||
|
|
14811b5aec | ||
|
|
c24f05c2cd | ||
|
|
d2dc1fcc80 | ||
|
|
28907082f1 | ||
|
|
f83174c40a | ||
|
|
ec062d008f | ||
|
|
a587655a5a | ||
|
|
97e05c8784 | ||
|
|
26cb03da42 | ||
|
|
d5a8b1592c | ||
|
|
5b096bfd5e | ||
|
|
a1e242ec1e | ||
|
|
5b9d002f56 | ||
|
|
dd57323889 | ||
|
|
6620679008 | ||
|
|
f93654f680 | ||
|
|
1bef0c32a2 | ||
|
|
a5725c59fd | ||
|
|
4168bbb751 | ||
|
|
b0086edcf9 | ||
|
|
89c2efe17d | ||
|
|
9030b7d27c | ||
|
|
de5111b13f | ||
|
|
8600f4131e | ||
|
|
8a8245b560 | ||
|
|
58e2fcbeee | ||
|
|
282bb6c414 | ||
|
|
962fc5990e | ||
|
|
eb2f57fc0d | ||
|
|
ce5b6a8024 | ||
|
|
0773edcaff | ||
|
|
68dcf7bceb | ||
|
|
d876146ea5 | ||
|
|
50627cd697 | ||
|
|
3a6b1e86dc | ||
|
|
6a4d293352 | ||
|
|
1ad4fe44e2 | ||
|
|
59ea7a4f70 | ||
|
|
6c64ba45c2 | ||
|
|
c68cc4ac19 | ||
|
|
84ed88c8dd | ||
|
|
d7345d5bc6 | ||
|
|
f0a9b0cf69 | ||
|
|
26ddb5c1b7 | ||
|
|
82f8b64599 | ||
|
|
7f24de442f | ||
|
|
c3536fd7c7 | ||
|
|
8365310ca7 | ||
|
|
aaed9882b8 | ||
|
|
8f5ebfcede | ||
|
|
83279df0fa | ||
|
|
2550da9c6e | ||
|
|
041f00b811 | ||
|
|
21cd4aaeb6 | ||
|
|
70ce1e648d | ||
|
|
eab5a9772b | ||
|
|
74ff0599d1 | ||
|
|
c31e622160 | ||
|
|
1828d8a279 | ||
|
|
70ea5c839a | ||
|
|
0b0f1f8701 | ||
|
|
e1f2e0656b | ||
|
|
b5e955bd5e | ||
|
|
b4b5d296d9 | ||
|
|
d287b8867b | ||
|
|
0e8d312794 | ||
|
|
c584d51432 | ||
|
|
2366b4508f | ||
|
|
2f1565fbc9 | ||
|
|
7fd0ecf721 | ||
|
|
37d1539fda | ||
|
|
1e518396d6 | ||
|
|
617b98ed49 | ||
|
|
6d2a870812 | ||
|
|
2963f3f1b8 | ||
|
|
17e4bdbff1 | ||
|
|
f3dd5770d9 | ||
|
|
eebab4a921 | ||
|
|
b06494c5be | ||
|
|
a0562bef81 | ||
|
|
eff063a748 | ||
|
|
94abaaff1e | ||
|
|
03732869e4 | ||
|
|
41868e2652 | ||
|
|
81bfba3cea | ||
|
|
8a04eb2e29 | ||
|
|
1777fc749d | ||
|
|
fd32ee09ff | ||
|
|
4bb2157cab | ||
|
|
47f20cc86a | ||
|
|
5fc4526c70 | ||
|
|
9fe653f821 | ||
|
|
55da21ed15 | ||
|
|
7ebf84f38c | ||
|
|
d42e75ebd0 | ||
|
|
28825049fe | ||
|
|
1c3644e338 | ||
|
|
2dfabb523b | ||
|
|
3e2d20e536 | ||
|
|
ee7ee083b0 | ||
|
|
fb54c05d9f | ||
|
|
21f807aa66 | ||
|
|
6b088bda12 | ||
|
|
a32ee869ae | ||
|
|
a2d7772958 | ||
|
|
6ec052be18 | ||
|
|
9c71d52d69 | ||
|
|
171c146ec5 | ||
|
|
bc6afa2164 | ||
|
|
3c036257ef | ||
|
|
6633730bf1 | ||
|
|
2964a4da5e | ||
|
|
a55554193b | ||
|
|
d2a8338d4a | ||
|
|
e945deeab6 | ||
|
|
722fe02933 | ||
|
|
3dec609459 | ||
|
|
e73b9f646d | ||
|
|
3cea6400d1 | ||
|
|
c6a8eee73d | ||
|
|
74d431ea36 | ||
|
|
409a559a13 | ||
|
|
6829535350 | ||
|
|
6488111f79 | ||
|
|
923339c1d8 | ||
|
|
3f4d96f4cd | ||
|
|
c52985d245 | ||
|
|
88e6c71aa0 | ||
|
|
4d08e297c4 | ||
|
|
ad2b30691f | ||
|
|
369bad01b8 | ||
|
|
b6ecc6d9ea | ||
|
|
0117df0960 | ||
|
|
6ac905f264 | ||
|
|
e5307f6604 | ||
|
|
8d9b6dd859 | ||
|
|
01821ead0f | ||
|
|
1451fb9e2f | ||
|
|
245751bb23 | ||
|
|
f07519c705 | ||
|
|
33a978a246 | ||
|
|
861dc0c383 | ||
|
|
60593fed4a | ||
|
|
fae3a5c26a | ||
|
|
1a52c0adfc | ||
|
|
44c0bbc61e | ||
|
|
3e6f0acf79 | ||
|
|
7f93d943d7 | ||
|
|
5ac50fae3a | ||
|
|
ee48a2f2bf | ||
|
|
680d5b8216 | ||
|
|
c9320c190d | ||
|
|
566c667c5d | ||
|
|
ec6e42e655 | ||
|
|
bba6b6f71d | ||
|
|
c261f6625a | ||
|
|
a489b270d1 | ||
|
|
51cb61940d | ||
|
|
ce2f896b45 | ||
|
|
6635ff9a69 | ||
|
|
41797f8cef | ||
|
|
797cea5394 | ||
|
|
2880d4120e | ||
|
|
58dec7b9b0 | ||
|
|
b0f900e25d | ||
|
|
fc54848318 | ||
|
|
2f9f8cda81 | ||
|
|
667e7ab8dc | ||
|
|
4e55408fed | ||
|
|
88aa61ea77 | ||
|
|
2ccdeb968c | ||
|
|
90045683c9 | ||
|
|
eb49b01cbc | ||
|
|
3a6062775e | ||
|
|
718a7bfc26 | ||
|
|
27ca30aa82 | ||
|
|
01b0bf1a36 | ||
|
|
e1cecc9601 | ||
|
|
4c13f5a0af | ||
|
|
f5a9942d5e | ||
|
|
ee2d91fb4a | ||
|
|
6ca41ba69d | ||
|
|
7f9d142038 | ||
|
|
44a1f83b26 | ||
|
|
d9bbac20f3 | ||
|
|
a48c57dd17 | ||
|
|
77b235655c | ||
|
|
8dc0261993 | ||
|
|
65d2ad68d3 | ||
|
|
52fde088e9 | ||
|
|
ab6d537c3e | ||
|
|
3a6078a56a | ||
|
|
b0c3fefcab | ||
|
|
2bc739194e | ||
|
|
afb06e8c9a | ||
|
|
2c1274ff76 | ||
|
|
e18721a03e | ||
|
|
25120e44ce | ||
|
|
aea32cc279 | ||
|
|
ce0feb2f42 | ||
|
|
12a1c5c2f4 | ||
|
|
d307968880 | ||
|
|
1f98d19f77 | ||
|
|
9a934c941f | ||
|
|
dbc7284b97 | ||
|
|
de63e17a4d | ||
|
|
1bad643b30 | ||
|
|
57c44d4b18 | ||
|
|
7d06133787 | ||
|
|
261998201b | ||
|
|
9a899b929e | ||
|
|
46b15a51d4 | ||
|
|
5fcace8776 | ||
|
|
a12826e719 | ||
|
|
0dc024c722 | ||
|
|
f6f36c5599 | ||
|
|
18bd318da2 | ||
|
|
e1712073c9 | ||
|
|
2478a7194e | ||
|
|
89b8e88df3 | ||
|
|
a7e80f351a | ||
|
|
c39d3db121 | ||
|
|
e7f9e61f2a | ||
|
|
3047ed1253 | ||
|
|
cf0c7ce583 | ||
|
|
206211f9ef | ||
|
|
8220ff8a35 | ||
|
|
927fc5424b | ||
|
|
64b94c68d3 | ||
|
|
3391d18942 | ||
|
|
1414fed776 | ||
|
|
f884cb015a | ||
|
|
7e6a96db87 | ||
|
|
966bbe2856 | ||
|
|
2137211d42 | ||
|
|
cc5533c183 | ||
|
|
19787e5d28 | ||
|
|
6e46666895 | ||
|
|
a87d7276c5 | ||
|
|
c630b4f770 | ||
|
|
f719e5ad49 | ||
|
|
20557f20db | ||
|
|
66144c1eb5 | ||
|
|
054d6870d5 | ||
|
|
04aa4897fe | ||
|
|
72b22a4845 | ||
|
|
3fd2b5f4e1 | ||
|
|
8a4128defb | ||
|
|
9542c22191 | ||
|
|
15b8d79489 | ||
|
|
97470e94f1 | ||
|
|
37a518b655 | ||
|
|
312b2f8ddb | ||
|
|
9caa6a3553 | ||
|
|
6c597bba5b | ||
|
|
0dd771351d | ||
|
|
f7b64b101e | ||
|
|
ec86ec188b | ||
|
|
2b01a3fcd3 | ||
|
|
9540502d06 | ||
|
|
792dedb1f1 | ||
|
|
0bf1343442 | ||
|
|
4d3e3a73fd | ||
|
|
1ffef393c2 | ||
|
|
8b7b3e22d7 | ||
|
|
877aa75e4e | ||
|
|
d21c0758b1 | ||
|
|
21be329008 | ||
|
|
e7b27ce7fb | ||
|
|
fb2c0e5441 | ||
|
|
29898ea68f | ||
|
|
9dcb8a729c | ||
|
|
b66237efa8 | ||
|
|
6d2f855227 | ||
|
|
638aa0372b | ||
|
|
d5baa402c8 | ||
|
|
ec7e594ec1 | ||
|
|
3fad690d1e | ||
|
|
15973768e2 | ||
|
|
0d73a4b013 | ||
|
|
50f11faf1f | ||
|
|
cfb7406fb8 | ||
|
|
9008f063c3 | ||
|
|
368ac4ed5c | ||
|
|
6ac2e703a6 | ||
|
|
cd9a5f112a | ||
|
|
f3847a17f3 | ||
|
|
1fa4aaf706 | ||
|
|
db108a37cf | ||
|
|
a3e41d4f35 | ||
|
|
80e33489d9 | ||
|
|
271b1327c7 | ||
|
|
5d990ff4c5 | ||
|
|
69aacc6256 | ||
|
|
a5066d529f | ||
|
|
5bf034f3c1 | ||
|
|
0743ff371c | ||
|
|
7481b78b16 | ||
|
|
bd589aa140 | ||
|
|
8fa1d4def5 | ||
|
|
fe3626035c | ||
|
|
c4019bd91d | ||
|
|
18e1b670ca | ||
|
|
cd76c934b6 | ||
|
|
db98641a32 | ||
|
|
59745fec0b | ||
|
|
8bcaea7830 | ||
|
|
56ed32e4a1 | ||
|
|
3209777aba | ||
|
|
11f9ad8ca3 | ||
|
|
26fc942c79 | ||
|
|
f196493402 | ||
|
|
1c5fdb6ab6 | ||
|
|
3ed530ed9e | ||
|
|
8db2972288 | ||
|
|
51a0b68d8e | ||
|
|
2fdbe12a7f | ||
|
|
2448e137c8 | ||
|
|
33899763ef | ||
|
|
d8f4f92e1d | ||
|
|
ce679f90ee | ||
|
|
8fb379079b | ||
|
|
b382d048de | ||
|
|
610cb170e7 | ||
|
|
4d9fcaeebf | ||
|
|
aa0225f59f | ||
|
|
2571949e90 | ||
|
|
20d2c11154 | ||
|
|
3f604e9d93 | ||
|
|
234e92db12 | ||
|
|
01c56f6515 | ||
|
|
026be5a990 | ||
|
|
aafb86ef09 | ||
|
|
1a24efe85d | ||
|
|
1ad67d5c73 | ||
|
|
0b3f7dbb1f | ||
|
|
e90007860c | ||
|
|
3b38669c04 | ||
|
|
74ab03288b | ||
|
|
502dacd865 | ||
|
|
31bc99cd61 | ||
|
|
5435c9ebd2 | ||
|
|
ceb9a320ba | ||
|
|
ee8b2a0b58 | ||
|
|
8202f1b7c6 | ||
|
|
4808cac89d | ||
|
|
c1ea3380eb | ||
|
|
694fdebc71 | ||
|
|
1cbd910e5d | ||
|
|
b102ef512e | ||
|
|
220a621dc6 | ||
|
|
0db288e6dc | ||
|
|
f8175fc325 | ||
|
|
5eee38e7de | ||
|
|
fb5b470966 | ||
|
|
876053f858 | ||
|
|
9714ef19de | ||
|
|
613a345771 | ||
|
|
4fe29dd33f | ||
|
|
4b24223290 | ||
|
|
a78da0db1e | ||
|
|
5e4fce1e12 | ||
|
|
4cb2624a5d | ||
|
|
58e045f25d | ||
|
|
26a770e490 | ||
|
|
dfe145a0ed | ||
|
|
6cb4c9224d | ||
|
|
4047612b96 | ||
|
|
1978a360af | ||
|
|
1f46b3fda9 | ||
|
|
47a945d92e | ||
|
|
59ec87a393 | ||
|
|
9423104dad | ||
|
|
614834090e | ||
|
|
2f9523a586 | ||
|
|
3a9f38a873 | ||
|
|
0697c26dd1 | ||
|
|
cfa25dc655 | ||
|
|
b3498a888d | ||
|
|
0528c12782 | ||
|
|
e19b60b202 | ||
|
|
0ed274f994 | ||
|
|
e8378b382b | ||
|
|
e6c12a0c54 | ||
|
|
70620ad12d | ||
|
|
991f13e704 | ||
|
|
14bbe79651 | ||
|
|
2388232179 | ||
|
|
11ded1e497 | ||
|
|
9479b56549 | ||
|
|
90e32f52c9 | ||
|
|
ce6a4845f2 | ||
|
|
0f5cf1d51c | ||
|
|
c2812b05a4 | ||
|
|
5d698d66d0 | ||
|
|
1a149592d6 | ||
|
|
5e2e0b2e39 | ||
|
|
7a4f48e4fb | ||
|
|
2ae2ec2578 | ||
|
|
a790136164 | ||
|
|
e6c454bba5 | ||
|
|
b904c23e4d | ||
|
|
ece3eb2e7b | ||
|
|
18610bb540 | ||
|
|
69d643942c | ||
|
|
6e1b298282 | ||
|
|
c2387777c9 | ||
|
|
32a49a1ef1 | ||
|
|
4b88775183 | ||
|
|
29db82625f | ||
|
|
2b6c9e3439 | ||
|
|
a7e0444e92 | ||
|
|
e9e32550df | ||
|
|
59b059f06f | ||
|
|
42166f5fc4 | ||
|
|
eefe69d136 | ||
|
|
aabaf7c5e2 | ||
|
|
9ea4853c89 | ||
|
|
3b5e21761b | ||
|
|
2d76bf29cf | ||
|
|
a684ec235f | ||
|
|
c21f7abe4e | ||
|
|
8c191263c0 | ||
|
|
47005043a5 | ||
|
|
1e36ba8429 | ||
|
|
2679ff277c | ||
|
|
0e52271ba9 | ||
|
|
57359d1659 | ||
|
|
2253417459 | ||
|
|
9e3f148273 | ||
|
|
7e9042e9f7 | ||
|
|
dee68b903c | ||
|
|
67c5a248ad | ||
|
|
940512fb2c | ||
|
|
e8ddee24a9 | ||
|
|
be4eab65f6 | ||
|
|
fb5ffa1c31 | ||
|
|
aff0bd3f6a | ||
|
|
c0650cc0f5 | ||
|
|
02c7d014cb | ||
|
|
e29479fd25 | ||
|
|
46ae66c8b2 | ||
|
|
20abe4a40c | ||
|
|
55a9a29f76 | ||
|
|
67dd7e30fa | ||
|
|
e9a08af73b | ||
|
|
08b1ef2766 | ||
|
|
667d8673d4 | ||
|
|
d44ea9d558 | ||
|
|
86dfe86813 | ||
|
|
b129e11c8f | ||
|
|
246409970d | ||
|
|
bd7b3bb4d7 | ||
|
|
841f1849c8 | ||
|
|
00e7e4d43c | ||
|
|
ee43a845aa | ||
|
|
a7cc66af93 | ||
|
|
f8701cfed0 | ||
|
|
6b205bf303 | ||
|
|
07729247ac | ||
|
|
792b310fad | ||
|
|
ed2c9d24e8 | ||
|
|
f917212d67 | ||
|
|
6fbcec8b98 | ||
|
|
c30e57c31d | ||
|
|
674c9f0405 | ||
|
|
e16d5cf83d | ||
|
|
df3dc36874 | ||
|
|
7b71d8d212 | ||
|
|
2eaae4b83f | ||
|
|
3c66af9506 | ||
|
|
e5d579c1bb | ||
|
|
ee811ca89b | ||
|
|
8e4933041d | ||
|
|
1f3559e14f | ||
|
|
12ac260dce | ||
|
|
53f99ecc23 | ||
|
|
347410f744 | ||
|
|
7ae3e32abd | ||
|
|
54b2215164 | ||
|
|
889489e33e | ||
|
|
4667e76c6b | ||
|
|
a10d07d1dc | ||
|
|
9f1ac733b7 | ||
|
|
33ea25922d | ||
|
|
b56bd7bb5e | ||
|
|
e7617de1ee | ||
|
|
97fbad4dc5 | ||
|
|
ddf6023983 | ||
|
|
daa84c9415 | ||
|
|
586006de4d | ||
|
|
af8ec9f02b | ||
|
|
dc6abb691e | ||
|
|
d273c38194 | ||
|
|
940a246160 | ||
|
|
6179d1eef2 | ||
|
|
9f121f4c72 | ||
|
|
4deca552fa | ||
|
|
2d066307f4 | ||
|
|
0fdf426a93 | ||
|
|
e47698bfd4 | ||
|
|
e91981207f | ||
|
|
683ae4f067 | ||
|
|
94bc887369 | ||
|
|
d1094da6c7 | ||
|
|
ee1e12eca3 | ||
|
|
307fbef5b2 | ||
|
|
f54f500e2b | ||
|
|
fd66335bd4 | ||
|
|
301343deb0 | ||
|
|
c046c8c4d3 | ||
|
|
0ceca8fc17 | ||
|
|
2ac3b50040 | ||
|
|
70771bf3d6 | ||
|
|
2ed17f0fff | ||
|
|
ca53712ee9 | ||
|
|
69e139b75b | ||
|
|
d268661f29 | ||
|
|
ed379387df | ||
|
|
1eddad82c8 | ||
|
|
d7defc011b | ||
|
|
0e4a7829fe | ||
|
|
e7c6178391 | ||
|
|
40b506b7b4 | ||
|
|
b19a679d00 | ||
|
|
81d4c60cbd | ||
|
|
a95be2aa43 | ||
|
|
5e9a815b06 | ||
|
|
010c8eccc8 | ||
|
|
4b89619ef1 | ||
|
|
e5054d306e | ||
|
|
08eaa9274f | ||
|
|
3306cdede5 | ||
|
|
e7f650a9eb | ||
|
|
2804794f7a | ||
|
|
781eaf058b | ||
|
|
b4c155bdb8 | ||
|
|
7c3e045a57 | ||
|
|
f1fa1bbe4e | ||
|
|
d4f4c7b8c6 | ||
|
|
5eb46c570d | ||
|
|
9e6d501009 | ||
|
|
27e258b19b | ||
|
|
d3615c9661 | ||
|
|
a57c449c25 | ||
|
|
07f2f0cef3 | ||
|
|
c94f0896e1 | ||
|
|
182361c176 | ||
|
|
8dcc530f44 | ||
|
|
b5dfd62c99 | ||
|
|
662b1a8100 | ||
|
|
24178beafc | ||
|
|
e30df544db | ||
|
|
25b6e214dd | ||
|
|
910f6134f6 | ||
|
|
52b4b0419f | ||
|
|
bbc1a82c2a | ||
|
|
6abe66934e | ||
|
|
2ddbb44992 | ||
|
|
363a8b8588 | ||
|
|
5ae56aaec7 | ||
|
|
37057d1da2 | ||
|
|
6044871438 | ||
|
|
e612bb6a38 | ||
|
|
196a9ae43a | ||
|
|
81ea67d6da | ||
|
|
96cd823fea | ||
|
|
196773d6ba | ||
|
|
d8dbe68425 | ||
|
|
286c0b000f | ||
|
|
dec3164fdd | ||
|
|
c2772e5038 | ||
|
|
43e4d09f72 | ||
|
|
06e35baeaa | ||
|
|
c9d72d7a1d | ||
|
|
7e0a783220 | ||
|
|
f853c9f1c3 | ||
|
|
62e9572070 | ||
|
|
fea68c8acc | ||
|
|
ce9462e6aa | ||
|
|
929f0e90ac | ||
|
|
2e57d80959 | ||
|
|
81331e68d2 | ||
|
|
4fda59a585 | ||
|
|
4477b9ac18 | ||
|
|
78f93dc11a | ||
|
|
4c7c855f2c | ||
|
|
8740ec5570 | ||
|
|
ede3ac4282 | ||
|
|
3e4cad3a79 | ||
|
|
bd0b0077a3 | ||
|
|
16f8b78b39 | ||
|
|
892d21fb77 | ||
|
|
90d1bb0ae4 | ||
|
|
adfc5b3e98 | ||
|
|
f3d7016ab2 | ||
|
|
ae776547ce | ||
|
|
da6885be62 | ||
|
|
c0fa4a077f | ||
|
|
df19e54555 | ||
|
|
19139a4dce | ||
|
|
7d1c3133b3 | ||
|
|
da9c0af854 | ||
|
|
6d717a21cf | ||
|
|
fc251d005e | ||
|
|
4624e28675 | ||
|
|
3a1cc38aaf | ||
|
|
68bb38b8d7 | ||
|
|
2ca3b3e99d | ||
|
|
67c8354f76 | ||
|
|
384377782a | ||
|
|
8382665bbb | ||
|
|
e799cfc16a | ||
|
|
055d0081e1 | ||
|
|
9035de32c8 | ||
|
|
af62a520d3 | ||
|
|
1824108d09 | ||
|
|
149e8ce9b0 | ||
|
|
f4661eec75 | ||
|
|
0f7a1a42e4 | ||
|
|
5bda221f9d | ||
|
|
fd42becbdc | ||
|
|
2759c1616c | ||
|
|
55ac98c989 | ||
|
|
c42c6a7b08 | ||
|
|
b99bd38649 | ||
|
|
013ee2f1f4 | ||
|
|
7b79d79f84 | ||
|
|
66f9686e48 | ||
|
|
9b1b7437b3 | ||
|
|
720d44d53e | ||
|
|
7dca148349 | ||
|
|
47bacaf58a | ||
|
|
ffff8aeb91 | ||
|
|
9a856f50d7 | ||
|
|
e7540de85d | ||
|
|
ba9ddefbee | ||
|
|
f1801f9662 | ||
|
|
ae92ea9476 | ||
|
|
c7017ee84b | ||
|
|
0346294c59 | ||
|
|
8d240ca797 | ||
|
|
a607ee90e0 | ||
|
|
7dbbafec1b | ||
|
|
428132ea3b | ||
|
|
c49330f9d1 | ||
|
|
937c5fe893 | ||
|
|
d2c9f12c3a | ||
|
|
10324d8260 | ||
|
|
8f27dae7ea | ||
|
|
94ae511a6d | ||
|
|
038f75e48f | ||
|
|
b9fe4c5cd3 | ||
|
|
7e8b7602b4 | ||
|
|
7c306a8430 | ||
|
|
dd2bc44c2d | ||
|
|
74794fea09 | ||
|
|
1efd1a52a7 | ||
|
|
928131cf08 | ||
|
|
4d202a7a37 | ||
|
|
e0d71abdc6 | ||
|
|
550eb6ee2f | ||
|
|
a661bc1d23 | ||
|
|
f737162697 | ||
|
|
ce57ba80eb | ||
|
|
99bd957ea0 | ||
|
|
270eb56718 | ||
|
|
b3ce0c0079 | ||
|
|
e6cee58e0d | ||
|
|
4adc6b269c | ||
|
|
920b0178ec | ||
|
|
3583b40e02 | ||
|
|
7870830367 | ||
|
|
4c1d7ad2d2 | ||
|
|
661b07c856 | ||
|
|
5670bd8265 | ||
|
|
93a1911232 | ||
|
|
2429191838 | ||
|
|
f6901cd19f | ||
|
|
156c3984a7 | ||
|
|
f91af2153a | ||
|
|
c3f13eb428 | ||
|
|
91ae0206ac | ||
|
|
19b5eda98c | ||
|
|
805f8a5ee7 | ||
|
|
6cbfe3d736 | ||
|
|
2274319274 | ||
|
|
2ab8121a4a | ||
|
|
601a4ec70d | ||
|
|
707b831c30 | ||
|
|
72ae375e44 | ||
|
|
3c1ddb5c9d | ||
|
|
817db23146 | ||
|
|
a8c820f558 | ||
|
|
6d09c81f11 | ||
|
|
192e537e5d | ||
|
|
7b52ef34be | ||
|
|
7117472e73 | ||
|
|
c24b123917 | ||
|
|
9eb8cf121c | ||
|
|
41ef9ae010 | ||
|
|
1674bbbde9 | ||
|
|
0fb739f7cd | ||
|
|
169fa940e4 | ||
|
|
c9664cc425 | ||
|
|
e61cdff655 | ||
|
|
a479b8a5d7 | ||
|
|
26462e684b | ||
|
|
113d42ef35 | ||
|
|
c18018f017 | ||
|
|
e804addf0a | ||
|
|
04cea003b9 | ||
|
|
65fcc56a56 | ||
|
|
c065d253e9 | ||
|
|
4bb2b91ee6 | ||
|
|
b3f761776d | ||
|
|
dce1cccbde | ||
|
|
3630056ed8 | ||
|
|
2d6e1d7089 | ||
|
|
71db79ba53 | ||
|
|
a6934b3cba | ||
|
|
5be378e266 | ||
|
|
a9b6eaa31f | ||
|
|
01f9ce0015 | ||
|
|
f4309f5af6 | ||
|
|
1004ce564f | ||
|
|
5a1823d13e | ||
|
|
66fb66edbc | ||
|
|
5bb66ed7d4 | ||
|
|
95a7980ada | ||
|
|
281e9d1357 | ||
|
|
14e74afb07 | ||
|
|
742f05f59d | ||
|
|
79db4f8aa1 | ||
|
|
c4e216f839 | ||
|
|
752fdfedf2 | ||
|
|
2a49e7c8ef | ||
|
|
02af01d2ca | ||
|
|
07c05c1f2a | ||
|
|
ee4af4c7bf | ||
|
|
3d565e74a5 | ||
|
|
3cb84222f8 | ||
|
|
1b013bb73b | ||
|
|
fd54e625d5 | ||
|
|
e440694987 | ||
|
|
b4a12edc61 | ||
|
|
2b04d6834f | ||
|
|
1191574e07 | ||
|
|
77f6412d3b | ||
|
|
327eab6c0d | ||
|
|
0d8a0db883 | ||
|
|
9727062d60 | ||
|
|
09979d3270 | ||
|
|
116839d6f6 | ||
|
|
bed6c48e99 | ||
|
|
4d09e90b90 | ||
|
|
1d91cc6fc1 | ||
|
|
c81cd5450f | ||
|
|
0b663abe50 | ||
|
|
3b27fb2aa7 | ||
|
|
6bd67ae68c | ||
|
|
14c362d4ba | ||
|
|
f28bc1bff7 | ||
|
|
de8a5ea262 | ||
|
|
339013434b | ||
|
|
8a3ad331d2 | ||
|
|
e3892dc26d | ||
|
|
b95df6d883 | ||
|
|
11ad03b21e | ||
|
|
9cb474ea9c | ||
|
|
fce43b4e1d | ||
|
|
1d547500e8 | ||
|
|
f23d0480e4 | ||
|
|
fe9c630572 | ||
|
|
ce94226c3c | ||
|
|
f12d36b5ed | ||
|
|
3cb5259494 | ||
|
|
a351cd9d9f | ||
|
|
d8e01584f3 | ||
|
|
dd76840568 | ||
|
|
94690fad7a | ||
|
|
d693af9615 | ||
|
|
4cc18c25fe | ||
|
|
8b398f49c0 | ||
|
|
902ce68164 | ||
|
|
cd0474ce7b | ||
|
|
946def022f | ||
|
|
fb499be979 | ||
|
|
c62a101635 | ||
|
|
69a575097d | ||
|
|
b40551a8fa | ||
|
|
5b27bcd781 | ||
|
|
75725a38df | ||
|
|
c4e277853c | ||
|
|
24b055b1b8 | ||
|
|
7da3773f7f | ||
|
|
32999ffa84 | ||
|
|
f06c53f1f1 | ||
|
|
a9eec28360 | ||
|
|
5cda972872 | ||
|
|
087946876b | ||
|
|
318f0f1b7e | ||
|
|
f4d7b71984 | ||
|
|
6d1a12af4b | ||
|
|
a40e5dbcd4 | ||
|
|
7c79ca7878 | ||
|
|
93c1600980 | ||
|
|
c3d1e6181f | ||
|
|
87e7f3a61c | ||
|
|
e724f216bf | ||
|
|
e6b379358a | ||
|
|
b0abba15a6 | ||
|
|
81b4874a7c | ||
|
|
f11b9c1e18 | ||
|
|
e15ecc00ce | ||
|
|
3e4c45ac6a | ||
|
|
fc657ecc71 | ||
|
|
87cb61750f | ||
|
|
3231247fb6 | ||
|
|
4115c13a65 | ||
|
|
f872e2ab80 | ||
|
|
a81b1aa0cb | ||
|
|
efc0f1ab91 | ||
|
|
ce31edc803 | ||
|
|
199caccbc3 | ||
|
|
313bab37e2 | ||
|
|
f060309002 | ||
|
|
fc3d86e6ff | ||
|
|
9fd4989142 | ||
|
|
7507a7b459 | ||
|
|
d657817211 | ||
|
|
954649007c | ||
|
|
0caa308757 | ||
|
|
b0d9903fe2 | ||
|
|
6375f3c445 | ||
|
|
2328f418be | ||
|
|
22b6564847 | ||
|
|
25c8bfefe2 | ||
|
|
30f4524821 | ||
|
|
9e4c3a7200 | ||
|
|
5b7e84c1b0 | ||
|
|
e6097e4968 | ||
|
|
0f2829097b | ||
|
|
e2a9f940e2 | ||
|
|
3eb2b2ac5d | ||
|
|
ce7b0a3b5e | ||
|
|
7bd7c99dd4 | ||
|
|
b0d12c4125 | ||
|
|
1fa8f30550 | ||
|
|
745607b5bc | ||
|
|
cc5a770b16 | ||
|
|
fbde0091de | ||
|
|
a533943a40 | ||
|
|
e11f17672c | ||
|
|
c038c99f9d | ||
|
|
5f159c1fbd | ||
|
|
6a19d8246c | ||
|
|
d6bb3a558f | ||
|
|
cd8ca8981b | ||
|
|
44300dbb34 | ||
|
|
a5d7f7acce | ||
|
|
a032c2e326 | ||
|
|
9d770ed436 | ||
|
|
ae753940f3 | ||
|
|
eb53054f49 | ||
|
|
d0d22c333c | ||
|
|
e147602a3a | ||
|
|
266ba17ebb | ||
|
|
0d0d5bafb0 | ||
|
|
b7a016edcf | ||
|
|
371253a4f6 | ||
|
|
08ce6cce97 | ||
|
|
d7a10328c0 | ||
|
|
58b951e134 | ||
|
|
30956b5441 | ||
|
|
9540cfe749 | ||
|
|
31b17faa2a | ||
|
|
5c6b8e9e50 | ||
|
|
5a36e8fb11 | ||
|
|
7d4c857a43 | ||
|
|
598bcf675f | ||
|
|
e7c657f82d | ||
|
|
3bae92b356 | ||
|
|
5365786386 | ||
|
|
c9b0a7c2dd | ||
|
|
371d8042d6 | ||
|
|
be343cb21e | ||
|
|
e9eabd6881 | ||
|
|
abccdc7f21 | ||
|
|
4ae914f729 | ||
|
|
86ac955b79 | ||
|
|
9734691cac | ||
|
|
d94f3a477d | ||
|
|
d53cd209f7 | ||
|
|
65cacb39d2 | ||
|
|
b008a6a2aa | ||
|
|
5c29feec63 | ||
|
|
d8e350d603 | ||
|
|
14a3366850 | ||
|
|
5ea0c6fca1 | ||
|
|
f454c29b8c | ||
|
|
1ddbeaa50f | ||
|
|
b937c37be3 | ||
|
|
0908369dba | ||
|
|
fe5132be1d | ||
|
|
b50ba3e0e4 | ||
|
|
4fb40f9077 | ||
|
|
dc7fef6395 | ||
|
|
da65bf7292 | ||
|
|
17d9c2577e | ||
|
|
bc7852c1cc | ||
|
|
51d8792f62 | ||
|
|
bfdbeb0964 | ||
|
|
ede82ad0d5 | ||
|
|
f50dcb9e40 | ||
|
|
676c5e5df5 | ||
|
|
d52be76c8a | ||
|
|
c6a517c88c | ||
|
|
96eb8719b8 | ||
|
|
bcd31610f6 | ||
|
|
a4d66622a5 | ||
|
|
af4f07cb26 | ||
|
|
f7120b32f5 | ||
|
|
273404e24d | ||
|
|
1b53b5b927 | ||
|
|
7c5413e568 | ||
|
|
39b2fe45a5 | ||
|
|
8d3c5d09f6 | ||
|
|
5944fdb5dc | ||
|
|
e120bad779 | ||
|
|
d546a4a15b | ||
|
|
93a88a83a8 | ||
|
|
660a2e0ed6 | ||
|
|
30ea300f65 | ||
|
|
04f4d5274d | ||
|
|
1f9695abd7 | ||
|
|
1b94cc3ac0 | ||
|
|
4698d5d2fc | ||
|
|
92bc9d81c5 | ||
|
|
952cfaec14 | ||
|
|
637c44aa59 | ||
|
|
6e5fc29dca | ||
|
|
8bd02d0c36 | ||
|
|
c6cfbb8755 | ||
|
|
75d3444391 | ||
|
|
c648e1e8d6 | ||
|
|
e2f42fddb5 | ||
|
|
f93fe684c0 | ||
|
|
ee378ea0c4 | ||
|
|
613d34e6e6 | ||
|
|
4c784af55d | ||
|
|
b28595c814 | ||
|
|
fca7beec01 | ||
|
|
f813f03a46 | ||
|
|
6ff2232df3 | ||
|
|
e3b1f058cd | ||
|
|
542e9cacc2 | ||
|
|
0a0a7ca39b | ||
|
|
cee287da99 | ||
|
|
c8e4df94f9 | ||
|
|
c86e4f52a0 | ||
|
|
44216310ca | ||
|
|
5c69599e78 | ||
|
|
e4098d3991 | ||
|
|
55a94d659b | ||
|
|
7a048d5b32 | ||
|
|
e14dd06a94 | ||
|
|
62332a2b56 | ||
|
|
639030924f | ||
|
|
241b47fe19 | ||
|
|
69beecf334 | ||
|
|
e308e02f9d | ||
|
|
87258e485a | ||
|
|
0682c346ea | ||
|
|
5ae566952b | ||
|
|
18f9ab0cda | ||
|
|
bd4a5ac844 | ||
|
|
257b1f89f3 | ||
|
|
12543d2c2a | ||
|
|
962672564e | ||
|
|
7216c6d62a | ||
|
|
21d3261eec | ||
|
|
03f758720c | ||
|
|
eaa85ae8d5 | ||
|
|
8cb212d897 | ||
|
|
a38d3981df | ||
|
|
af08c077d2 | ||
|
|
84e2489585 | ||
|
|
744375bd5d | ||
|
|
6c1f63bfbb | ||
|
|
7d0267c924 | ||
|
|
daa9cb65e5 | ||
|
|
7072265225 | ||
|
|
8daade0021 | ||
|
|
b4d30b462f | ||
|
|
18acd67b4f | ||
|
|
78ed53f4fb | ||
|
|
d95314c754 | ||
|
|
277cc19ec3 | ||
|
|
67f4553213 | ||
|
|
b2bb656d30 | ||
|
|
ca20f41d0e | ||
|
|
13e8aeae4e | ||
|
|
02308f9e2f | ||
|
|
0fdcbb4611 | ||
|
|
829ccc3466 | ||
|
|
9ac83cf62e | ||
|
|
f760354e82 | ||
|
|
e91e35d508 | ||
|
|
db7e196bf8 | ||
|
|
f5fe4f99f1 | ||
|
|
e2bff36395 | ||
|
|
0a5d7c2100 | ||
|
|
4d42f8ec58 | ||
|
|
81e7b052da | ||
|
|
be44b7e2c7 | ||
|
|
d8a781632c | ||
|
|
3726d6fe3b | ||
|
|
6090a5b274 | ||
|
|
d4fdf6be67 | ||
|
|
1b6cbe5c23 | ||
|
|
1d130a7857 | ||
|
|
f041159aa7 | ||
|
|
f438cbf633 | ||
|
|
51684d18cf | ||
|
|
c13d2ac044 | ||
|
|
6dd1adda2e | ||
|
|
5d0d7391e7 | ||
|
|
d37da58e87 | ||
|
|
1839c1972e | ||
|
|
b7bdcc4e57 | ||
|
|
b59a3b15f3 | ||
|
|
7580f7491a | ||
|
|
f33848e16b | ||
|
|
9b4d3ad6bf | ||
|
|
7b06d4273a | ||
|
|
95f7ea9fc0 | ||
|
|
12b64d1906 | ||
|
|
52db4b3321 | ||
|
|
388c1b4ce4 | ||
|
|
b134cdb90d | ||
|
|
c120dffbf0 | ||
|
|
3578f1b254 | ||
|
|
a7e3548f22 | ||
|
|
272e5380c2 | ||
|
|
b60fd36c6e | ||
|
|
5301798654 | ||
|
|
f7e6d7d143 | ||
|
|
b9649aed32 | ||
|
|
4467c0df31 | ||
|
|
7af3acde9e | ||
|
|
68c1e49f62 | ||
|
|
1e57190b8c | ||
|
|
1b8a4577d5 | ||
|
|
51baed4932 | ||
|
|
2f1f587c50 | ||
|
|
ab1e38dde8 | ||
|
|
dd0d1e700e | ||
|
|
51ebb2579f | ||
|
|
d1d3b805f6 | ||
|
|
a6e247326b | ||
|
|
823b7e2989 | ||
|
|
5f40dc37a2 | ||
|
|
5e5c05f0c6 | ||
|
|
ab1340d213 | ||
|
|
6b6004ee70 | ||
|
|
3cef2bb7e0 | ||
|
|
cc5a0a436c | ||
|
|
495a81768d | ||
|
|
125b37e98f | ||
|
|
f8ad75329d | ||
|
|
cb2efb14f7 | ||
|
|
78327716a4 | ||
|
|
cd71b3daf3 | ||
|
|
5393fa81b9 | ||
|
|
d1efd2137a | ||
|
|
fce8c3a8a0 | ||
|
|
4bd71da056 | ||
|
|
d2e84925f7 | ||
|
|
d81523370e | ||
|
|
6939546f22 | ||
|
|
2ea10206fa | ||
|
|
8aa922c55f | ||
|
|
d66def5530 | ||
|
|
42ecf54df6 | ||
|
|
10835968fb | ||
|
|
1f5588b803 | ||
|
|
202102ebf7 | ||
|
|
9729c89f5d | ||
|
|
71714733ad | ||
|
|
3fbbfce17c | ||
|
|
ad0a08ea0e | ||
|
|
3a2fa4073a | ||
|
|
6c2297c365 | ||
|
|
5e592427e9 | ||
|
|
643541eebd | ||
|
|
13885493ac | ||
|
|
75c9353cbd | ||
|
|
01d9affe61 | ||
|
|
3ad95bec3c | ||
|
|
418b3ee7d6 | ||
|
|
0000f2a34d | ||
|
|
fc5a5f1b73 | ||
|
|
226ab406b2 | ||
|
|
9eaf5d82b6 | ||
|
|
e3d6d242ac | ||
|
|
53184715bc | ||
|
|
1844633ff1 | ||
|
|
7d7682b34e | ||
|
|
83655a749c | ||
|
|
b9444e8197 | ||
|
|
5ff70b2a36 | ||
|
|
4ed559af95 | ||
|
|
ce529a9b9f | ||
|
|
31e472145c | ||
|
|
1664428429 | ||
|
|
1780cb9b91 | ||
|
|
ad32677263 | ||
|
|
0eba4bdd61 | ||
|
|
28238eb5a7 | ||
|
|
cce4f6f7f7 | ||
|
|
6bea3dabbb | ||
|
|
ea46947054 | ||
|
|
22879f8c23 | ||
|
|
77c4423059 | ||
|
|
62a2a4a9f5 | ||
|
|
59690328e2 | ||
|
|
e50ecd613f | ||
|
|
d873a6138a | ||
|
|
8093ae8570 | ||
|
|
98ebb02763 | ||
|
|
ba22b07dce | ||
|
|
d1312703c5 | ||
|
|
8d99a42307 | ||
|
|
3ab93ecdd4 | ||
|
|
6c0d6c5425 | ||
|
|
326f346936 | ||
|
|
8762d0e164 | ||
|
|
2b91edeb74 | ||
|
|
6c49d1aa3f | ||
|
|
f07f086d62 | ||
|
|
c28862f8c7 | ||
|
|
9cfaf567be | ||
|
|
53f453bf34 | ||
|
|
a16032a8ed | ||
|
|
8cec0d8fcd | ||
|
|
6f6f67829b | ||
|
|
94471b6d07 | ||
|
|
7eed9c0584 | ||
|
|
3e717862a4 | ||
|
|
30d88bbe7e | ||
|
|
551e73adef | ||
|
|
99d32c4758 | ||
|
|
9e52c15829 | ||
|
|
71a272f0a6 | ||
|
|
64061c3440 | ||
|
|
1b4f2b9c53 | ||
|
|
d83516584d | ||
|
|
3e34d0badb | ||
|
|
b2e8474df3 | ||
|
|
73ff7e2de4 | ||
|
|
b5d8d34718 | ||
|
|
ac44d22cee | ||
|
|
6e8fa12172 | ||
|
|
deb9c4ecc0 | ||
|
|
d4e6136b09 | ||
|
|
68331fc40c | ||
|
|
3046798ec5 | ||
|
|
c4332658ba | ||
|
|
50e3da0849 | ||
|
|
62cd3b2061 | ||
|
|
7e6dfa7b92 | ||
|
|
7fbebbf361 | ||
|
|
121372802f | ||
|
|
7924907384 | ||
|
|
51d429f9ae | ||
|
|
267aebb9cb | ||
|
|
3f9ebb588e | ||
|
|
f424f07e54 | ||
|
|
e5a21a3261 | ||
|
|
6f0de7c80e | ||
|
|
3ace7eeafd | ||
|
|
eb9f15e4e4 | ||
|
|
bc80569fe9 | ||
|
|
a147458120 | ||
|
|
6182e22d18 | ||
|
|
dda84c5cd5 | ||
|
|
6c15fb6978 | ||
|
|
b17b68c44b | ||
|
|
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 | ||
|
|
fcf2994015 | ||
|
|
bee21ddc9e | ||
|
|
263e68e677 | ||
|
|
2b958f5724 | ||
|
|
95f7177ef4 | ||
|
|
006324b78e | ||
|
|
efd8c1229d | ||
|
|
0f1aea3e0d | ||
|
|
6a41cbebc9 | ||
|
|
fba95e6a42 | ||
|
|
bffb91f196 | ||
|
|
4573b65639 | ||
|
|
3d8505385a | ||
|
|
95d3a8cc22 | ||
|
|
99c053f86b | ||
|
|
f2dde705ef | ||
|
|
be11fda814 | ||
|
|
0261105c52 | ||
|
|
264047dc0c | ||
|
|
4d84926ed2 | ||
|
|
da3211fee6 | ||
|
|
1388b03cf2 | ||
|
|
9f98b4b082 | ||
|
|
b3f1401ab4 | ||
|
|
e5e3832809 | ||
|
|
2eff7da171 | ||
|
|
e9622bcfe8 | ||
|
|
63ebadc526 | ||
|
|
fe47b07229 | ||
|
|
dc73997be3 | ||
|
|
62315fd478 | ||
|
|
fb81121bd3 | ||
|
|
5293563a6a | ||
|
|
2e1e61dabe | ||
|
|
280d63fde7 | ||
|
|
c6104195f6 | ||
|
|
e55cbb3e3d | ||
|
|
56b85e4194 | ||
|
|
6431c43d0e | ||
|
|
a62107fbd1 | ||
|
|
7959d18248 | ||
|
|
2f66915a9f | ||
|
|
a508177e21 | ||
|
|
5a9d858604 | ||
|
|
514da83961 | ||
|
|
b7bae18849 | ||
|
|
fbde247c72 | ||
|
|
3a69af9034 | ||
|
|
5c87a6cb76 | ||
|
|
9c6bb434e8 | ||
|
|
d1bd303dfa | ||
|
|
3813c32454 | ||
|
|
3b00a692ee | ||
|
|
3304ebe9d3 | ||
|
|
513120cbfe | ||
|
|
b06049d5a3 | ||
|
|
0f50355deb | ||
|
|
bd6e35fea2 | ||
|
|
a4fd63cd44 | ||
|
|
fdc4219b68 | ||
|
|
5b428bb8e6 | ||
|
|
c948ff88a5 | ||
|
|
9b9a0d7060 | ||
|
|
16578e3677 | ||
|
|
be7f84bc67 | ||
|
|
033d26f2cb | ||
|
|
4c0826b1c4 | ||
|
|
c4cc204c94 | ||
|
|
3747db18b1 | ||
|
|
4173625fca | ||
|
|
0e7863a6fb | ||
|
|
207ba00ad2 | ||
|
|
87c89586a5 | ||
|
|
1cea1ced82 | ||
|
|
08732bac0f | ||
|
|
283e8d3c08 | ||
|
|
42a7165596 | ||
|
|
aa3f5001d5 | ||
|
|
56580c4005 | ||
|
|
ba304c9651 | ||
|
|
703c5adba7 | ||
|
|
8b85f6e0a6 | ||
|
|
c136d22382 | ||
|
|
42358419ad | ||
|
|
ab2ced5c37 | ||
|
|
faf31be0dc | ||
|
|
ff4c67d068 | ||
|
|
10b133db02 | ||
|
|
f0bf607b43 | ||
|
|
8948ca5323 | ||
|
|
9c3be51fe9 | ||
|
|
2da9161f29 | ||
|
|
983dad5b53 | ||
|
|
8b23d341b4 | ||
|
|
0ad60013aa | ||
|
|
289815e128 | ||
|
|
f7ee83f1b9 | ||
|
|
f67aafa8d3 | ||
|
|
4e5ddd57bf | ||
|
|
e0d4ecf835 | ||
|
|
81a461115b | ||
|
|
d679b02658 | ||
|
|
5effcdb024 | ||
|
|
211a5eb2bb | ||
|
|
c4465ba58d | ||
|
|
7903c53876 | ||
|
|
dbefe6a560 | ||
|
|
8b1f412255 | ||
|
|
a2e0074061 | ||
|
|
5fc920087b | ||
|
|
085233ab9b | ||
|
|
6657b2629f | ||
|
|
310a279aaf | ||
|
|
58f3a76da7 | ||
|
|
a2c9458b1b | ||
|
|
75bcd9e8d5 | ||
|
|
977e7ef395 | ||
|
|
eb1b8b577f | ||
|
|
28f91685ce | ||
|
|
81a4fe59d9 | ||
|
|
e7189ab81f | ||
|
|
346db89e66 | ||
|
|
f786c7f144 | ||
|
|
51f45293b8 | ||
|
|
943b103001 | ||
|
|
f055d42277 | ||
|
|
fb7a2a8d5d | ||
|
|
1e5ed2a2e3 | ||
|
|
e1467dfe23 | ||
|
|
c480f96d30 | ||
|
|
cf613aafb2 | ||
|
|
20dbf7c5f4 | ||
|
|
47c912c25b | ||
|
|
48fb1a8127 | ||
|
|
6c1b55db16 | ||
|
|
df70c8a800 | ||
|
|
82ae2e7118 | ||
|
|
0cf9b5f3df | ||
|
|
036a825892 | ||
|
|
8b43b31c64 | ||
|
|
3abef972a7 | ||
|
|
30b00741b5 | ||
|
|
f86e743cce | ||
|
|
cb96fb735e | ||
|
|
459a52d31d | ||
|
|
44ef9a13d6 | ||
|
|
0bb3652a63 | ||
|
|
6a82d683a9 | ||
|
|
fad708e8de | ||
|
|
c6a38b8355 | ||
|
|
ee84eb666b | ||
|
|
6d2793cac6 | ||
|
|
86d518fc2e | ||
|
|
25dba1a6d5 | ||
|
|
af949c62c2 | ||
|
|
ea20342d76 | ||
|
|
7732d52583 | ||
|
|
c801bc5e6b | ||
|
|
ea43729063 | ||
|
|
e26bae8027 | ||
|
|
555f155cad | ||
|
|
f8c47f59bc | ||
|
|
f3997128b9 | ||
|
|
154a4e23dd | ||
|
|
52e4e0e569 | ||
|
|
30f2b96c68 | ||
|
|
58c94b7773 | ||
|
|
83203d5f5d | ||
|
|
f77d161643 | ||
|
|
6580b139c0 | ||
|
|
2743c7c6ac | ||
|
|
062f76214e | ||
|
|
ce98ed98a2 | ||
|
|
dce9d93f6c | ||
|
|
f7e35a6cbe | ||
|
|
931335220f | ||
|
|
3ce35a8a4b | ||
|
|
9ac4e5cf6a | ||
|
|
bd77d7eec3 | ||
|
|
b5e48aa509 | ||
|
|
b14c42b6a4 | ||
|
|
ba794ba58c | ||
|
|
b00282590d | ||
|
|
44616c6872 | ||
|
|
aaa2b4c3db | ||
|
|
8974d8e4df | ||
|
|
699063cbb0 | ||
|
|
e76000b713 | ||
|
|
332b372e31 | ||
|
|
cb3fcb7bfa | ||
|
|
bef641609e | ||
|
|
24b52f09df | ||
|
|
942b17b807 | ||
|
|
cf19d7f3ad | ||
|
|
ebd62a4112 | ||
|
|
9af7357ca4 | ||
|
|
0dbc35c252 | ||
|
|
c9f03f1ac5 | ||
|
|
02bd292b8c | ||
|
|
e5f1029d0c | ||
|
|
cae247160f | ||
|
|
6692b1992c | ||
|
|
0937837b7f | ||
|
|
828888490a | ||
|
|
91cb6ba73b | ||
|
|
4ee4d32b2e | ||
|
|
8df630a2f5 | ||
|
|
2cad42870e | ||
|
|
43651135f3 | ||
|
|
6ae42eb787 | ||
|
|
ecaf866613 | ||
|
|
5ea3329b36 | ||
|
|
7bb7149f4c | ||
|
|
5856d043ca | ||
|
|
7cd3e49f04 | ||
|
|
173e75175e | ||
|
|
800006dd76 | ||
|
|
a824b6910a | ||
|
|
dcea382b38 | ||
|
|
d9f976baea | ||
|
|
1fa13efe19 | ||
|
|
33af5cd7c6 | ||
|
|
7cb8f97ef1 | ||
|
|
bf965a9cde | ||
|
|
17ffff685a | ||
|
|
ae76271cff | ||
|
|
8f3a96d615 | ||
|
|
30e750dfe5 | ||
|
|
682dff7c6f | ||
|
|
85415eb8a8 | ||
|
|
68a80b9244 | ||
|
|
c331da7323 | ||
|
|
04ffa06221 | ||
|
|
1f0690c6ec | ||
|
|
711467abcd | ||
|
|
9439cd0e3d | ||
|
|
314c19650d | ||
|
|
ed6afcd802 | ||
|
|
082d4fe8e1 | ||
|
|
cd23b44506 | ||
|
|
46b6b024b9 | ||
|
|
cb88cc35e5 | ||
|
|
75c0c44809 | ||
|
|
a091b82ba9 | ||
|
|
a3b8f022e6 | ||
|
|
279fcb7c51 | ||
|
|
49a9376073 | ||
|
|
96840ede56 | ||
|
|
7e7f481f99 | ||
|
|
3edbf52bc6 | ||
|
|
fba6e801fc | ||
|
|
720a163273 | ||
|
|
a9b12e5172 | ||
|
|
6ac0c0a367 | ||
|
|
300402d253 | ||
|
|
0d9bfae503 | ||
|
|
bfe0d3b8a3 | ||
|
|
5fdd9c0546 | ||
|
|
b6570a16b8 | ||
|
|
8e2d3ea16f | ||
|
|
bc2c81f058 | ||
|
|
3e0f080ea7 | ||
|
|
679e07189d | ||
|
|
a38ebef100 | ||
|
|
b8ad6475e1 | ||
|
|
0f0cb3ac6d | ||
|
|
d3efb9d7cc | ||
|
|
84a237d3f5 | ||
|
|
e6de52eede | ||
|
|
98aee964d7 | ||
|
|
570e5442e0 | ||
|
|
b77a2dc353 | ||
|
|
87af31de20 | ||
|
|
cfe201dbe1 | ||
|
|
6ccdab35e0 | ||
|
|
55b9f36b45 | ||
|
|
fbcb1130c9 | ||
|
|
d4f7a6d2bc | ||
|
|
8a19f71abe | ||
|
|
fb153757b5 | ||
|
|
4f175fc93e | ||
|
|
2d4ca7cec0 | ||
|
|
bf0ea89969 | ||
|
|
073f0c2a20 | ||
|
|
ba83be9062 | ||
|
|
2e7188ea4f | ||
|
|
5a012182d9 | ||
|
|
b855438af6 | ||
|
|
2ffea143e7 | ||
|
|
61d85b49e6 | ||
|
|
35f617e96c | ||
|
|
6b6ad47c35 | ||
|
|
e57183ed0e | ||
|
|
ecfd61a822 | ||
|
|
153f87704b | ||
|
|
836f7d2163 | ||
|
|
d4d6f71cf4 | ||
|
|
42a9da006e | ||
|
|
2bd5c4f527 | ||
|
|
6a49b5c106 | ||
|
|
23e14d1b72 | ||
|
|
f4f11c8884 | ||
|
|
2b220abdb7 | ||
|
|
c1d947ebe3 | ||
|
|
d695cf392e | ||
|
|
21304a695c | ||
|
|
fa51b06c46 | ||
|
|
7560bb8d7b | ||
|
|
fc9d65abcc | ||
|
|
a7413cccd0 | ||
|
|
7610353f07 | ||
|
|
d3f978c90c | ||
|
|
b55a8ef62a | ||
|
|
8d79deffb5 | ||
|
|
8158487c3e | ||
|
|
0cc061196d | ||
|
|
d0ec055222 | ||
|
|
ae12ddd32b | ||
|
|
31da3adaa9 | ||
|
|
9fd5213f13 | ||
|
|
de882f5849 | ||
|
|
fded1e0021 | ||
|
|
6cb06c146d | ||
|
|
b8f1386ad0 | ||
|
|
2b38b5ea50 | ||
|
|
2f707a6b16 | ||
|
|
d4c2fcd559 | ||
|
|
082970cdb7 | ||
|
|
fe97c78977 | ||
|
|
79394aa69f | ||
|
|
21fd6e3c21 | ||
|
|
de4944cd83 | ||
|
|
3fde5c27ed | ||
|
|
e1d492813e | ||
|
|
48d0ee3b6d | ||
|
|
eebb64901c | ||
|
|
60e0ed2af6 | ||
|
|
f030694ef4 | ||
|
|
e9ed13459a | ||
|
|
af1e38fdf7 | ||
|
|
b12900e680 | ||
|
|
44aa1f4a5e | ||
|
|
9425548a85 | ||
|
|
bfd4fc81fe | ||
|
|
439af2a325 | ||
|
|
3204b04455 | ||
|
|
bed1be14ba | ||
|
|
7cd92faf0d | ||
|
|
be7e28af5d | ||
|
|
8eaa762ec5 | ||
|
|
953a9f7cd4 | ||
|
|
36f099d68b | ||
|
|
c8fd5090bd | ||
|
|
155e1be494 | ||
|
|
cf5e125cb3 | ||
|
|
764fc8477d | ||
|
|
d35e62f8cf | ||
|
|
904babdd13 | ||
|
|
154d3842a8 | ||
|
|
edb8a120bd | ||
|
|
cdfeba0b82 | ||
|
|
8ce1465e9f | ||
|
|
a296b1c9c8 | ||
|
|
bb8d7058a4 | ||
|
|
816cfa1c7e | ||
|
|
53938200fc | ||
|
|
3885bb039d | ||
|
|
4adad6e424 | ||
|
|
5fb9531338 | ||
|
|
273d9c76a7 | ||
|
|
79a1d6c561 | ||
|
|
4b0eb8475d | ||
|
|
3dc874b517 | ||
|
|
8a3da1ce8d | ||
|
|
42d90542b5 | ||
|
|
690a93d82d | ||
|
|
8042fe4e2b | ||
|
|
a27ce375db | ||
|
|
db3688799d | ||
|
|
a88be35292 | ||
|
|
e2d7fcbfc2 | ||
|
|
421d155586 | ||
|
|
7f9e318214 | ||
|
|
57386edb7c | ||
|
|
94d5ba4550 | ||
|
|
2a0b4ea828 | ||
|
|
893ef227d4 | ||
|
|
1fe6e5a00d | ||
|
|
6c96cde73c | ||
|
|
2b12834d53 | ||
|
|
8a2e74b3b8 | ||
|
|
aa1721ab3d | ||
|
|
c0a256306b | ||
|
|
f0b03b4ada | ||
|
|
5503f53af2 | ||
|
|
a89d294b27 | ||
|
|
012e1cbcc5 | ||
|
|
3759e0f778 | ||
|
|
1c18641699 | ||
|
|
e50e2201b1 | ||
|
|
1419729458 | ||
|
|
c14177b0e8 | ||
|
|
126df969b3 | ||
|
|
f8ee92ba06 | ||
|
|
81a278dd8c | ||
|
|
a98013806c | ||
|
|
0171ffac6a | ||
|
|
7544241316 | ||
|
|
061afb3a94 | ||
|
|
8a5eda9c1f | ||
|
|
f62040f0ec | ||
|
|
f2e51779e4 | ||
|
|
da114fa3a5 | ||
|
|
3775a1657b | ||
|
|
2bd7c4bc81 | ||
|
|
253c489a33 | ||
|
|
ac84b6fe3f | ||
|
|
8761e61439 | ||
|
|
29e903e1c8 | ||
|
|
ec27e19e3f | ||
|
|
5df0dae11a | ||
|
|
7fffc1a36d | ||
|
|
f3d0179834 | ||
|
|
8bf69c598a | ||
|
|
aa5fad6628 | ||
|
|
b0f1fad4e2 | ||
|
|
3b6d0995b4 | ||
|
|
0cbf4ac37d | ||
|
|
9ccffee82c | ||
|
|
1b38e2eedf | ||
|
|
ce87abe96e | ||
|
|
becbda8483 | ||
|
|
da210e2ae4 | ||
|
|
d4fc6feeba | ||
|
|
f1cbca8d76 | ||
|
|
dfd9364061 | ||
|
|
1931395fdb | ||
|
|
b01fd24e15 | ||
|
|
c9d1329fc2 | ||
|
|
ab2d3bfd80 | ||
|
|
36bb172f29 | ||
|
|
01e64be39d | ||
|
|
4ebe160f6c | ||
|
|
b427eca21f | ||
|
|
3eb438c8d2 | ||
|
|
068f425833 | ||
|
|
b3c84242dc | ||
|
|
24672d91d8 | ||
|
|
4422af26ec | ||
|
|
5329e803e2 | ||
|
|
ad542b91fa | ||
|
|
e9e03c945b | ||
|
|
e20cfb3dae | ||
|
|
48baac916c | ||
|
|
adadf38b08 | ||
|
|
d4e1469450 | ||
|
|
2c456f044f | ||
|
|
228c15ace3 | ||
|
|
a0d15e6e7b | ||
|
|
2fe78cf971 | ||
|
|
5ec3544340 | ||
|
|
5443a17775 | ||
|
|
40d60e4eb3 | ||
|
|
f3312a6403 | ||
|
|
e638b55b30 | ||
|
|
5caa76a8b3 | ||
|
|
901a5ce9d2 | ||
|
|
6ab74951f4 | ||
|
|
c2625d696d | ||
|
|
77fb5ef2ab | ||
|
|
c20ca3399e | ||
|
|
5825da9c76 | ||
|
|
e3853ae402 | ||
|
|
bd142a9710 | ||
|
|
4f23847546 | ||
|
|
85820c571d | ||
|
|
d9bed03025 | ||
|
|
d6e05962c9 | ||
|
|
d32636ed6b | ||
|
|
bbf066f030 | ||
|
|
a3d2f6592e | ||
|
|
87b6327c5e | ||
|
|
abaebb329d | ||
|
|
8970fe412d | ||
|
|
9dc5ae21c4 | ||
|
|
4132fb79a6 | ||
|
|
9a4dc30604 | ||
|
|
192b542fe4 | ||
|
|
490547cd3d | ||
|
|
17f9829498 | ||
|
|
234e77fd06 | ||
|
|
87ac831c8a | ||
|
|
4e92492165 | ||
|
|
c3d0b1114f | ||
|
|
4463a7d4ba | ||
|
|
741fe3dd90 | ||
|
|
e910f3915d | ||
|
|
39aafc5007 | ||
|
|
9b83afae42 | ||
|
|
bdf54f6cff | ||
|
|
f2a9887a12 | ||
|
|
4f4d78bfab | ||
|
|
3b460fb8fa | ||
|
|
ee15e9acc5 | ||
|
|
48fce35fb3 | ||
|
|
78899378c2 | ||
|
|
67404a327d | ||
|
|
702dfa4b79 | ||
|
|
2144407e41 | ||
|
|
b36dd62c50 | ||
|
|
7026df7d96 | ||
|
|
ed8e7afdf6 | ||
|
|
d78e5932f9 | ||
|
|
26d83bb9ea | ||
|
|
8e89b1bdf2 | ||
|
|
c880cc0987 | ||
|
|
0874ba7a03 | ||
|
|
7962278475 | ||
|
|
c8949f5eeb | ||
|
|
8108b93c5f | ||
|
|
9dbe531bf7 | ||
|
|
46e2ff1001 | ||
|
|
d2cdc67ec7 | ||
|
|
56121203bf | ||
|
|
e13133fd2b | ||
|
|
f20565fd16 | ||
|
|
cf2d5841f5 | ||
|
|
630d2ca926 | ||
|
|
34cb93794c | ||
|
|
122b5ba468 | ||
|
|
401466d6c0 | ||
|
|
7f2627dbc8 | ||
|
|
6aecc3915c | ||
|
|
ef1b3aa7f5 | ||
|
|
1aaab2a814 | ||
|
|
e93734b209 | ||
|
|
9e5218f6b4 | ||
|
|
711ec39327 | ||
|
|
08049252f2 | ||
|
|
f1e7ec0c6b | ||
|
|
23765d9139 | ||
|
|
43febe269c | ||
|
|
40233c7702 | ||
|
|
27ed81614b | ||
|
|
889d23e9bd | ||
|
|
f8571023f6 | ||
|
|
6364e00202 | ||
|
|
a76c6f86c6 | ||
|
|
555e815402 | ||
|
|
8a1d81989b | ||
|
|
ee9234b2c6 | ||
|
|
735b9c5844 | ||
|
|
064f3eb3bc | ||
|
|
f1775d4fd1 | ||
|
|
a9bc111c4f | ||
|
|
c100612473 | ||
|
|
26087f8dc7 | ||
|
|
36e75cb728 | ||
|
|
d7a2fc2be4 | ||
|
|
142176f194 | ||
|
|
c5892fc17e | ||
|
|
6e69cfbca4 | ||
|
|
775181f761 | ||
|
|
36e83d628e | ||
|
|
5f6fcb2bc0 | ||
|
|
7b106e5650 | ||
|
|
79d9c83a2d | ||
|
|
269669ba28 | ||
|
|
4ef7240598 | ||
|
|
efdf689c31 | ||
|
|
f7606e92ca | ||
|
|
6750be3ec9 | ||
|
|
68fb5089f8 | ||
|
|
a8d093bacd | ||
|
|
233a1995b3 | ||
|
|
8ef3baaffb | ||
|
|
c9597b9447 | ||
|
|
b2dc1d8b23 | ||
|
|
859c0c7f6c | ||
|
|
aaf18e2416 | ||
|
|
fd679ef117 | ||
|
|
6cc611b3f1 | ||
|
|
77ee726f66 | ||
|
|
dc603b76a4 | ||
|
|
bcb3371acc | ||
|
|
d14ce7e476 | ||
|
|
4d26b806dd | ||
|
|
a2b95dbb39 | ||
|
|
47f7b43bcc | ||
|
|
77fd8c120c | ||
|
|
a1a6f40158 | ||
|
|
ed09cd7489 | ||
|
|
eb3330d145 | ||
|
|
5ba0588c7b | ||
|
|
d4a199f0e1 | ||
|
|
32dd186f4d | ||
|
|
d820f55358 | ||
|
|
81f0fb3c74 | ||
|
|
972c83cd52 | ||
|
|
66a704af55 | ||
|
|
31c5d6e1c1 | ||
|
|
bf0ab95c09 | ||
|
|
c1d85f760d | ||
|
|
88ad2f4c18 | ||
|
|
be9f9e7b0c | ||
|
|
2cc1973f62 | ||
|
|
eb4625a0b9 | ||
|
|
5bfb01254b | ||
|
|
bb80fa4a2d | ||
|
|
ddb715d88d | ||
|
|
395b499856 | ||
|
|
cce6a47f11 | ||
|
|
7fd17b4ec0 | ||
|
|
e16ab2a0fd | ||
|
|
15f5364c30 | ||
|
|
65081767bf | ||
|
|
c7c595e5fa | ||
|
|
5b24e8b69c | ||
|
|
e6a845e606 | ||
|
|
ec8b8a7b87 | ||
|
|
51a9205105 | ||
|
|
ed5567fc73 | ||
|
|
4b3f5d74a0 | ||
|
|
b01c5a05e7 | ||
|
|
36eddabc1c | ||
|
|
ea11aa7a0d | ||
|
|
e7efa76e6d | ||
|
|
41c8ca8ab4 | ||
|
|
4624079be7 | ||
|
|
c6f6042271 | ||
|
|
e9e3b9b7c6 | ||
|
|
becbb09a29 | ||
|
|
6f6ab50995 | ||
|
|
d8ee766860 | ||
|
|
108c26d8af | ||
|
|
ed8d3088ca | ||
|
|
46c4e2d212 | ||
|
|
94891d45f9 | ||
|
|
7448ad109e | ||
|
|
6211dfe024 | ||
|
|
9b85200954 | ||
|
|
94ee739d91 | ||
|
|
e81a6db9a3 | ||
|
|
b2f5a259ab | ||
|
|
c8a0d3c10d | ||
|
|
97df964051 | ||
|
|
66dd05f8bc | ||
|
|
19589d9117 | ||
|
|
8147b2e0b1 | ||
|
|
be22f8cd14 | ||
|
|
868be9b7ff | ||
|
|
5011281104 | ||
|
|
42992c64ec | ||
|
|
2baff243ed | ||
|
|
83440a6b0f | ||
|
|
87c9a1c06c | ||
|
|
b848fe249f | ||
|
|
1e804d97ce | ||
|
|
218d3c144b | ||
|
|
05a4905490 | ||
|
|
75103da378 | ||
|
|
9db9b53c81 | ||
|
|
0e4787f3e8 | ||
|
|
f8d8d4b186 | ||
|
|
45e0a1ffea | ||
|
|
75c58093f1 | ||
|
|
cc708e9fb4 | ||
|
|
2ce0e38827 | ||
|
|
5b980e8c13 | ||
|
|
21b602650c | ||
|
|
fa4b7a1a69 | ||
|
|
977dfe700b | ||
|
|
48ac50e1c9 | ||
|
|
1a817947eb | ||
|
|
be64603097 | ||
|
|
f6b90c8271 | ||
|
|
26e4be87c7 | ||
|
|
cddbb8d80d | ||
|
|
58023b4bf0 | ||
|
|
4f18a5f1c3 | ||
|
|
56df8d8bd3 | ||
|
|
211ec104c2 | ||
|
|
3fb573247d | ||
|
|
6aac44db14 | ||
|
|
3255e11cfc | ||
|
|
844bf29de1 | ||
|
|
04d91d1422 | ||
|
|
db90e1f801 | ||
|
|
7f30748a41 | ||
|
|
a4e0abb48f | ||
|
|
3f27dc89d8 | ||
|
|
d6f6efc189 | ||
|
|
2cda49fc38 | ||
|
|
04f4a76b41 | ||
|
|
0a8f7085f3 | ||
|
|
7ae48d7390 | ||
|
|
c908502644 | ||
|
|
2f0631809d | ||
|
|
91ab3bd972 | ||
|
|
672636313c | ||
|
|
79875ef50d | ||
|
|
aea5445495 | ||
|
|
754a36fbc9 | ||
|
|
85dafc0b3c | ||
|
|
b516ab9b4f | ||
|
|
1a27e60e55 | ||
|
|
2c710736e8 | ||
|
|
69b9ff69be | ||
|
|
a3a4fc0cc2 | ||
|
|
ae686bb15d | ||
|
|
68a5325849 | ||
|
|
75e3bddfa9 | ||
|
|
bd3a8db438 | ||
|
|
102868bf74 | ||
|
|
1a73a27102 | ||
|
|
a9cf34ab56 | ||
|
|
46d17c3314 | ||
|
|
40f816c311 | ||
|
|
13f1c12912 | ||
|
|
93c25f5d1b | ||
|
|
aa6ec60c34 | ||
|
|
ac159bb52e | ||
|
|
919aee64f9 | ||
|
|
553bec1a1f | ||
|
|
bcb6d1cf93 | ||
|
|
7d24e5b279 | ||
|
|
12253e23b5 | ||
|
|
4acb66fb7a | ||
|
|
68ef85b64b | ||
|
|
b73efe6bb4 | ||
|
|
89c84522d2 | ||
|
|
98172764ac | ||
|
|
448e881104 | ||
|
|
f16134ab1f | ||
|
|
f5dc1564a4 | ||
|
|
133df75bd4 | ||
|
|
440be0653a | ||
|
|
d721a40ca5 | ||
|
|
a9b252b8fa | ||
|
|
8a5b3ddee7 | ||
|
|
d83e543a98 | ||
|
|
bcd6e8fd63 | ||
|
|
d5c5738aab | ||
|
|
9e4dfe081f | ||
|
|
090852b72b | ||
|
|
ff5e038c49 | ||
|
|
5cc2e5f6e1 | ||
|
|
4e8c0573c4 | ||
|
|
ce905ba2c4 | ||
|
|
3104c17fb3 | ||
|
|
7651941722 | ||
|
|
7bf938901a | ||
|
|
f8b61d2926 | ||
|
|
4edea59ab1 | ||
|
|
c8bcd2818d | ||
|
|
9b46dbaff1 | ||
|
|
17a139f27f | ||
|
|
bd00c728d1 | ||
|
|
9d510b514c | ||
|
|
00dcc5ecda | ||
|
|
dbbdd3f799 | ||
|
|
3541b4b968 | ||
|
|
5b1bf35a23 | ||
|
|
591b61945f | ||
|
|
bd1943626b | ||
|
|
f152cdef51 | ||
|
|
33f8c9747d | ||
|
|
714a5e26b3 | ||
|
|
7f2c6e40d3 | ||
|
|
db676ec223 | ||
|
|
ffb3e511a7 | ||
|
|
e9e64f6a44 | ||
|
|
a7b8adb0e1 | ||
|
|
4140ff03d7 | ||
|
|
e042ef05a4 | ||
|
|
7c02e4d66a | ||
|
|
711794cfe1 | ||
|
|
c0e4cf2358 | ||
|
|
a92f8f36c1 | ||
|
|
12698dc347 | ||
|
|
3e6a55f78e | ||
|
|
7585f14b89 | ||
|
|
01b5fc4d49 | ||
|
|
0fb7d3bfc8 | ||
|
|
2cd74d355c | ||
|
|
3d405f8c63 | ||
|
|
a92f0c4c6e | ||
|
|
de142ac9d6 | ||
|
|
468ef7ecff | ||
|
|
4d768fd236 | ||
|
|
bfc1f95190 | ||
|
|
bc17ebd90e | ||
|
|
bb1b3727cb | ||
|
|
4dbebefb45 | ||
|
|
e1c5764fbf | ||
|
|
70f975e4f0 | ||
|
|
845567d1ba | ||
|
|
f570447000 | ||
|
|
9d7b8f1f2f | ||
|
|
bae6bfc32d | ||
|
|
8a63390464 | ||
|
|
0b52cd8b31 | ||
|
|
f97569dd34 | ||
|
|
a9164e63ab | ||
|
|
8c95067ec4 | ||
|
|
4f77bbeb2b | ||
|
|
8bbed2c831 | ||
|
|
6b43a23c4b | ||
|
|
be9521f659 | ||
|
|
90761fd840 | ||
|
|
d49d9a783c | ||
|
|
d7dc7c4eda | ||
|
|
fe64c6a841 | ||
|
|
2bbdc85a29 | ||
|
|
74628b7034 | ||
|
|
15aa249f64 | ||
|
|
fdf58e1225 | ||
|
|
866f305686 | ||
|
|
1550e5343c | ||
|
|
add3dd1077 | ||
|
|
79a142fb19 | ||
|
|
1a30fe4a1a | ||
|
|
4ff991764e | ||
|
|
001f066769 | ||
|
|
c47b553a8e | ||
|
|
319af51f84 | ||
|
|
5dbaaae68e | ||
|
|
8c1a749a5a | ||
|
|
fc8643f238 | ||
|
|
c8653f19bf | ||
|
|
b01100d818 | ||
|
|
d4096a9026 | ||
|
|
b9e780cdcd | ||
|
|
b77cd56a01 | ||
|
|
9cdec156dc | ||
|
|
6aa5968863 | ||
|
|
8f7686cd7b | ||
|
|
d8d384a979 | ||
|
|
ade318bb78 | ||
|
|
ed3aa8189f | ||
|
|
3e43597617 | ||
|
|
4c8e895ac7 | ||
|
|
f6a3671366 | ||
|
|
e641b0a965 | ||
|
|
eddddc6c9b | ||
|
|
f249d6306f | ||
|
|
5c31bd54e4 | ||
|
|
71ba73b38f | ||
|
|
db0ff74857 | ||
|
|
1acb073737 | ||
|
|
251dda3652 | ||
|
|
22db24509d | ||
|
|
54c9d27fd8 | ||
|
|
01888ff078 | ||
|
|
ffbd140a97 | ||
|
|
dedf5c52d9 | ||
|
|
10465c5d68 | ||
|
|
1f4f64a7c0 | ||
|
|
a6f116b57b | ||
|
|
0a80186a92 | ||
|
|
635bdf15cb | ||
|
|
a72bdfdacc | ||
|
|
dc3e04456c | ||
|
|
b0e4fb7602 | ||
|
|
df7aa3339b | ||
|
|
c475536388 | ||
|
|
cc7def89af | ||
|
|
58da87898e | ||
|
|
bded5490d2 | ||
|
|
c3715a2a3d | ||
|
|
abf084f6c2 | ||
|
|
37ba409dc3 | ||
|
|
f29488b24f | ||
|
|
71bdade7b9 | ||
|
|
60d97c887d | ||
|
|
5bba50f01f | ||
|
|
1f7884dc70 | ||
|
|
69dafd6c68 | ||
|
|
64b79cd5ac | ||
|
|
1af21735a9 | ||
|
|
9886af3cec | ||
|
|
1eb8f9ad97 | ||
|
|
08e73d9d7d | ||
|
|
b0e349b215 | ||
|
|
caa98b08da | ||
|
|
00caa13a12 | ||
|
|
cfc0135e86 | ||
|
|
9ee8c1c791 | ||
|
|
cd3aba2b89 | ||
|
|
a150d8e289 | ||
|
|
6da8e92f20 | ||
|
|
1d4dd4be96 | ||
|
|
7df1a03b4b | ||
|
|
ad316ffd37 | ||
|
|
91f5542a57 | ||
|
|
d47a8aa562 | ||
|
|
676f790933 | ||
|
|
70433f3d05 | ||
|
|
9f2a2b9869 | ||
|
|
a0c09fc617 | ||
|
|
19d391fa05 | ||
|
|
d1aa1fd4d8 | ||
|
|
0e02d03d9a | ||
|
|
4133f9c56f | ||
|
|
53055064e1 | ||
|
|
06090d8de1 | ||
|
|
d6ccae38f8 | ||
|
|
f7210effec | ||
|
|
8e7efd98b2 | ||
|
|
ea50ba16f9 | ||
|
|
b62e4f6662 | ||
|
|
f5a1c8bc49 | ||
|
|
4cb8e99430 | ||
|
|
bbac49ff38 | ||
|
|
1d12017f11 | ||
|
|
46af2e37a7 | ||
|
|
a480919ec3 | ||
|
|
f8abf9fce1 | ||
|
|
62f2a552ea | ||
|
|
b053e02174 | ||
|
|
3798167908 | ||
|
|
56fe2014e1 | ||
|
|
be2e64433f | ||
|
|
8732e89e55 | ||
|
|
fdd0a93bad | ||
|
|
dd12572b1d | ||
|
|
e23f20227a | ||
|
|
5cc791690b | ||
|
|
9f1deb0c36 | ||
|
|
4cebbf8d22 | ||
|
|
93971537b4 | ||
|
|
87e816a7f5 | ||
|
|
0f45b1da48 | ||
|
|
a20049c82a | ||
|
|
e57ebdb583 | ||
|
|
372122037f | ||
|
|
23a5cb1917 | ||
|
|
f8d5fef3c4 | ||
|
|
250005ad16 | ||
|
|
719aea2a58 | ||
|
|
0e06da6c63 | ||
|
|
68fef169f3 | ||
|
|
c668201df4 | ||
|
|
1d68c8cc87 | ||
|
|
b9ac8b42ea | ||
|
|
b4a03a56b4 | ||
|
|
9eb668ab30 | ||
|
|
233a74c146 | ||
|
|
e0c7269b8e | ||
|
|
73063df11b | ||
|
|
ff00afb5d7 | ||
|
|
3f43dc1855 | ||
|
|
4a4e7fc7cb | ||
|
|
0253dc9623 | ||
|
|
f8855b83fa | ||
|
|
0d0459d83d | ||
|
|
374ef3902c | ||
|
|
235690064f | ||
|
|
0167c25e08 | ||
|
|
d2432716ea | ||
|
|
52ef85cba3 | ||
|
|
8140057bea | ||
|
|
22df59e229 | ||
|
|
ed351eee54 | ||
|
|
c021b4c368 | ||
|
|
04a3c4bb22 | ||
|
|
b5fda5642f | ||
|
|
b0955705be | ||
|
|
a4a624d537 | ||
|
|
6a8cf1b768 | ||
|
|
aac2a8f830 | ||
|
|
8269490dd1 | ||
|
|
39274b0c5d | ||
|
|
55c2430671 | ||
|
|
023486e175 | ||
|
|
8227643741 | ||
|
|
e44131f97a | ||
|
|
5028377d45 | ||
|
|
51aaf1b150 | ||
|
|
13406e76de | ||
|
|
4672d98e8a | ||
|
|
858b3d640a | ||
|
|
6087002562 | ||
|
|
82ced56bed | ||
|
|
982b8ea51d | ||
|
|
877c463494 | ||
|
|
9882582903 | ||
|
|
ba566657f1 | ||
|
|
cb1a178fbf | ||
|
|
ad788fbed1 | ||
|
|
749533b0b4 | ||
|
|
142a5f7ca1 | ||
|
|
28bfa8e418 | ||
|
|
7b8ed487e9 | ||
|
|
0059f9475e | ||
|
|
9429ea7c64 | ||
|
|
a157580b22 | ||
|
|
41a0147938 | ||
|
|
16e021e94f | ||
|
|
449d76a6c7 | ||
|
|
70172db693 | ||
|
|
ff93a38354 | ||
|
|
e3b70b10d1 | ||
|
|
400141b093 | ||
|
|
ca5e45a46d | ||
|
|
74b547b93c | ||
|
|
a688305572 | ||
|
|
f0f2eefb59 | ||
|
|
bdb548ffdc | ||
|
|
fe5d4abec1 | ||
|
|
70632706f9 | ||
|
|
8f424c063e | ||
|
|
9955c3dd5d | ||
|
|
d555fcf7bd | ||
|
|
8da00c0872 | ||
|
|
393290df2c | ||
|
|
f8a7835341 | ||
|
|
082bac8c3a | ||
|
|
4cafe42cf4 | ||
|
|
89485971fa | ||
|
|
cb72d5100e | ||
|
|
f103533852 | ||
|
|
55f1e7ece1 | ||
|
|
c0a765c998 | ||
|
|
ed44fb461c | ||
|
|
8543613563 | ||
|
|
734adc6445 | ||
|
|
827f8d4d51 | ||
|
|
5bbd3d6273 | ||
|
|
df90e3414d | ||
|
|
16b9abbe92 | ||
|
|
2de43b719e | ||
|
|
3b84f27f36 | ||
|
|
f7a6a333e1 | ||
|
|
c37ea90206 | ||
|
|
0b39ef68d9 | ||
|
|
40ea759e2c | ||
|
|
3671a70e3b | ||
|
|
2fa50e458f | ||
|
|
9c7db1381c | ||
|
|
2d4f5b8603 | ||
|
|
5181890433 | ||
|
|
99a9e3a91b | ||
|
|
101378c625 | ||
|
|
aa5e47b462 | ||
|
|
15715a2968 | ||
|
|
b5751e5746 | ||
|
|
7e40cb5331 | ||
|
|
4b1a86ee02 | ||
|
|
6c66ca8acf | ||
|
|
d58a091bb7 | ||
|
|
0566a2d9b1 | ||
|
|
3d23d1de4f | ||
|
|
c9c5f7f088 | ||
|
|
8e65408b1c | ||
|
|
c3adc956d7 | ||
|
|
f69d6b4eb1 | ||
|
|
916d377aaa | ||
|
|
39532a9d65 | ||
|
|
3dc696b2a9 | ||
|
|
7be7dec19a | ||
|
|
fc709ba266 | ||
|
|
080e2f2589 | ||
|
|
0dc4440a99 | ||
|
|
f770786b89 | ||
|
|
46bc331428 | ||
|
|
3af77b6a31 | ||
|
|
8c4461c4f8 | ||
|
|
bccfd21cf4 | ||
|
|
e6f1394a74 | ||
|
|
de24831fb9 | ||
|
|
e5716162ad | ||
|
|
5809a3af0d | ||
|
|
11a385550a | ||
|
|
255b8f2005 | ||
|
|
3d398cfd53 | ||
|
|
5f8804c25c | ||
|
|
02d1369d5b | ||
|
|
0fef2ab509 | ||
|
|
16088b8a08 | ||
|
|
69befe8f0e | ||
|
|
ae7a3981c0 | ||
|
|
8b4aa3f5af | ||
|
|
60c8a2c598 | ||
|
|
fbb7dd4c3f | ||
|
|
833ecfb1af | ||
|
|
c20bab2436 | ||
|
|
afb17af571 | ||
|
|
5012568464 | ||
|
|
02dd141095 | ||
|
|
0be82d964e | ||
|
|
b41c7962c2 | ||
|
|
6f9e06e78d | ||
|
|
c2347076f4 | ||
|
|
c744af161d | ||
|
|
74ea382cf2 | ||
|
|
ab4a9e72d4 | ||
|
|
3f9a29730f | ||
|
|
8a076c01ab | ||
|
|
ca75efcbaf | ||
|
|
f96ce2fd83 | ||
|
|
d5f4f987f2 | ||
|
|
11475b0c38 | ||
|
|
137fa98903 | ||
|
|
ea62c1806e | ||
|
|
45afd06047 | ||
|
|
e6ec59092c | ||
|
|
35f788693d | ||
|
|
d5314d2a85 | ||
|
|
efd8c3d6d2 | ||
|
|
7d04353843 | ||
|
|
644da0b77b | ||
|
|
785c349adc | ||
|
|
1608196cd2 | ||
|
|
9d34abf603 | ||
|
|
05beb6ca79 | ||
|
|
12c7238c72 | ||
|
|
ed359ca10c | ||
|
|
b66468c4ea | ||
|
|
d2c9ccbfdd | ||
|
|
85e05b787f | ||
|
|
e5471b44e0 | ||
|
|
e0f0a76ae4 | ||
|
|
6336ab121e | ||
|
|
e899d2d5b8 | ||
|
|
a94c19a6cf | ||
|
|
9c09ee3b71 | ||
|
|
d8e68a75b9 | ||
|
|
302c5cfe09 | ||
|
|
1be337fbc5 | ||
|
|
3ec37e2c66 | ||
|
|
3740c21bee | ||
|
|
5a6568e7c2 | ||
|
|
4cd9b7b050 | ||
|
|
dd780945e1 | ||
|
|
e86f6a841a | ||
|
|
818021e0b7 | ||
|
|
3cc6c4433f | ||
|
|
8306ddd40f | ||
|
|
024e71cdf5 | ||
|
|
4313cbaa5c | ||
|
|
f5da2eb633 | ||
|
|
ac68e9c6b5 | ||
|
|
32692dce07 | ||
|
|
64d3b8e104 | ||
|
|
a03edf3d58 | ||
|
|
e5b7ccb612 | ||
|
|
9c1ce5543d | ||
|
|
ba387a8e4e | ||
|
|
7fa25c1ff4 | ||
|
|
3bd1bfc769 | ||
|
|
dad47ade38 | ||
|
|
fa6e0c8964 | ||
|
|
bb4b252401 | ||
|
|
a50404b141 | ||
|
|
61690ecf4a | ||
|
|
f4c87af5c1 | ||
|
|
83d12f7d39 | ||
|
|
2e73b229d7 | ||
|
|
3a0074d96e | ||
|
|
7d08de9c99 | ||
|
|
575d07e41a | ||
|
|
24da3608c4 | ||
|
|
9eb7fad621 | ||
|
|
438d51d26e | ||
|
|
34ef055d7b | ||
|
|
4a1d66f210 | ||
|
|
1f6328bf4e | ||
|
|
8e7a230dbc | ||
|
|
6e718ca772 | ||
|
|
9e179170ee | ||
|
|
9f71dbb006 | ||
|
|
7531314e3f | ||
|
|
a006b52052 | ||
|
|
bebebaa3dd | ||
|
|
55ff035fc9 | ||
|
|
d8c8d7bc57 | ||
|
|
2b28ae3402 | ||
|
|
aa47bae2ad | ||
|
|
ccfde84769 | ||
|
|
b1df6d5149 | ||
|
|
d51aefa156 | ||
|
|
c40412d7c6 | ||
|
|
b0bc7ecacb | ||
|
|
5489bd37c9 | ||
|
|
ea2e3f25d8 | ||
|
|
09b37cf538 | ||
|
|
e30a01310e | ||
|
|
d5cc5b2574 | ||
|
|
160ca6add4 | ||
|
|
da96c85d32 | ||
|
|
de15a1c36f | ||
|
|
814fc8bc69 | ||
|
|
0c9fd25d3e | ||
|
|
9a660f3fe9 | ||
|
|
6e1466e411 | ||
|
|
7913b3cbc2 | ||
|
|
87c9ed6356 | ||
|
|
65b4ef6c3d | ||
|
|
0284ef401e | ||
|
|
8a87f93741 | ||
|
|
af19536222 | ||
|
|
5743a5f91d | ||
|
|
9d2d060dec | ||
|
|
b36e7e172e | ||
|
|
aacb92a7ae | ||
|
|
4943bde3d4 | ||
|
|
fc459be531 | ||
|
|
3151502a3f | ||
|
|
79b10ed18a | ||
|
|
34b27f2e68 | ||
|
|
9b1c114c3f | ||
|
|
4df27d4b0b | ||
|
|
e3445dae46 | ||
|
|
f5fcf23678 | ||
|
|
0a6c08e2c3 | ||
|
|
b80a7459cf | ||
|
|
f6480e6e0c | ||
|
|
41d12c433e | ||
|
|
169a2484f2 | ||
|
|
be52ec1390 | ||
|
|
00db43198d | ||
|
|
6bac207611 | ||
|
|
6150ae787d | ||
|
|
fc7967d455 | ||
|
|
fca21ac126 | ||
|
|
6fb96fa3c1 | ||
|
|
a1f565f756 | ||
|
|
5992ed1fab | ||
|
|
beccdac717 | ||
|
|
b72ea63100 | ||
|
|
27550f2d4b | ||
|
|
6917919f35 | ||
|
|
48d6fe5918 | ||
|
|
bbe3ee701f | ||
|
|
b1c0d6b452 | ||
|
|
3033d2086e | ||
|
|
0f7d185a61 | ||
|
|
81f200641b | ||
|
|
c6129b44a1 | ||
|
|
2a8290a4b7 | ||
|
|
f038069fe2 | ||
|
|
407cb3e7d5 | ||
|
|
b8bc62ee11 | ||
|
|
ccbd179f23 | ||
|
|
dac7830bd4 | ||
|
|
bc82ca2106 | ||
|
|
725c962236 | ||
|
|
d7dfeaf0c1 | ||
|
|
dbfbd54e1f | ||
|
|
8007bea7db | ||
|
|
dc1ab7e331 | ||
|
|
a0d197d0c0 | ||
|
|
a776ba248e | ||
|
|
195aeb5caf | ||
|
|
38649de85f | ||
|
|
33bb86cbcf |
35
.github/ISSUE_TEMPLATE.md
vendored
35
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,35 +0,0 @@
|
|||||||
<!--
|
|
||||||
## Before you hit that Submit button....
|
|
||||||
|
|
||||||
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
|
|
||||||
|
|
||||||
If your issue is:
|
|
||||||
- a general 'how-to' type question,
|
|
||||||
- a feature request or suggestion for a change,
|
|
||||||
- or problems with 3rd party (`node-red-contrib-`) nodes
|
|
||||||
|
|
||||||
please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
|
|
||||||
|
|
||||||
You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
|
|
||||||
|
|
||||||
That way the whole Node-RED user community can help, rather than rely on the core development team.
|
|
||||||
|
|
||||||
## So you have a real issue to raise...
|
|
||||||
|
|
||||||
To help us understand the issue, please fill-in as much of the following information as you can:
|
|
||||||
-->
|
|
||||||
|
|
||||||
### What are the steps to reproduce?
|
|
||||||
|
|
||||||
### What happens?
|
|
||||||
|
|
||||||
### What do you expect to happen?
|
|
||||||
|
|
||||||
### Please tell us about your environment:
|
|
||||||
|
|
||||||
- [ ] Node-RED version:
|
|
||||||
- [ ] Node.js version:
|
|
||||||
- [ ] npm version:
|
|
||||||
- [ ] Platform/OS:
|
|
||||||
- [ ] Browser:
|
|
||||||
- [ ] running in Docker:
|
|
||||||
39
.github/ISSUE_TEMPLATE/--bug_report.md
vendored
39
.github/ISSUE_TEMPLATE/--bug_report.md
vendored
@@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Reproducible software issues in the core of Node-RED
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
|
|
||||||
|
|
||||||
If your issue is:
|
|
||||||
- a general 'how-to' type question,
|
|
||||||
- a feature request or suggestion for a change,
|
|
||||||
- or problems with 3rd party (`node-red-contrib-`) nodes
|
|
||||||
|
|
||||||
please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
|
|
||||||
|
|
||||||
You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
|
|
||||||
|
|
||||||
That way the whole Node-RED user community can help, rather than rely on the core development team.
|
|
||||||
|
|
||||||
To help us understand the issue, please fill-in as much of the following information as you can:
|
|
||||||
-->
|
|
||||||
|
|
||||||
### What are the steps to reproduce?
|
|
||||||
|
|
||||||
### What happens?
|
|
||||||
|
|
||||||
### What do you expect to happen?
|
|
||||||
|
|
||||||
### Please tell us about your environment:
|
|
||||||
|
|
||||||
- [ ] Node-RED version:
|
|
||||||
- [ ] Node.js version:
|
|
||||||
- [ ] npm version:
|
|
||||||
- [ ] Platform/OS:
|
|
||||||
- [ ] Browser:
|
|
||||||
17
.github/ISSUE_TEMPLATE/-anything-else.md
vendored
17
.github/ISSUE_TEMPLATE/-anything-else.md
vendored
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
name: Anything Else
|
|
||||||
about: Something that is not a bug report
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Please DO NOT raise an issue.
|
|
||||||
|
|
||||||
We DO NOT use the issue tracker for general support or feature requests. Only bug reports should be raised here using the 'Bug report' template.
|
|
||||||
|
|
||||||
For general support, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
|
|
||||||
That way the whole Node-RED user community can help, rather than rely on the core development team.
|
|
||||||
|
|
||||||
For feature requests, please use the Node-RED Forum](https://discourse.nodered.org). Many ideas have already been discussed there and you should search that for your request before starting a new discussion.
|
|
||||||
61
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
61
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
name: 🐞 Report a bug
|
||||||
|
description: File a bug/issue on the core of Node-RED
|
||||||
|
labels: [needs-triage]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
|
||||||
|
|
||||||
|
If your issue is:
|
||||||
|
- a general 'how-to' type question,
|
||||||
|
- a feature request or suggestion for a change,
|
||||||
|
- or problems with 3rd party (`node-red-contrib-`) nodes
|
||||||
|
|
||||||
|
please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
|
||||||
|
|
||||||
|
You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
|
||||||
|
|
||||||
|
That way the whole Node-RED user community can help, rather than rely on the core development team.
|
||||||
|
|
||||||
|
To help us understand the issue, please fill-in as much of the following information as you can:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Current Behavior
|
||||||
|
description: A clear & concise description of what you're experiencing.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior
|
||||||
|
description: A clear & concise description of what you expected to happen.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce
|
||||||
|
description: Steps to reproduce the behavior.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Example flow
|
||||||
|
description: If you have a minimal example flow that demonstrates the issue, share it here.
|
||||||
|
value: |
|
||||||
|
```
|
||||||
|
paste your flow here
|
||||||
|
```
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Environment
|
||||||
|
description: Please tell us about your environment. Include any relevant information on how you are running Node-RED.
|
||||||
|
value: |
|
||||||
|
- Node-RED version:
|
||||||
|
- Node.js version:
|
||||||
|
- npm version:
|
||||||
|
- Platform/OS:
|
||||||
|
- Browser:
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: ❓ Questions
|
||||||
|
url: https://discourse.nodered.org
|
||||||
|
about: Ask your question on the Node-RED forum
|
||||||
|
- name: ⭐️ Feature Request
|
||||||
|
url: https://discourse.nodered.org/c/development/feature-requests
|
||||||
|
about: Discuss your request with the community
|
||||||
|
- name: 🗂 Documentation
|
||||||
|
url: https://nodered.org/docs
|
||||||
|
about: Go straight to the documentation
|
||||||
|
- name: 💬 Slack
|
||||||
|
url: https://nodered.org/slack
|
||||||
|
about: Chat about the project on our slack team
|
||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -30,5 +30,5 @@ the [forum](https://discourse.nodered.org) or
|
|||||||
|
|
||||||
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
|
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
|
||||||
- [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team.
|
- [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team.
|
||||||
- [ ] I have run `grunt` to verify the unit tests pass
|
- [ ] I have run `npm run test` to verify the unit tests pass
|
||||||
- [ ] I have added suitable unit tests to cover the new/changed functionality
|
- [ ] I have added suitable unit tests to cover the new/changed functionality
|
||||||
|
|||||||
15
.github/dependabot.yml
vendored
Normal file
15
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions" # See documentation for possible values
|
||||||
|
directory: "/" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
|
groups:
|
||||||
|
github-actions:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
@@ -1,35 +1,38 @@
|
|||||||
name: PublishDockerImage
|
name: Publish Release
|
||||||
env:
|
env:
|
||||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
|
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
generate:
|
generate:
|
||||||
name: 'Update node-red-docker image'
|
name: 'Update node-red-docker image'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out node-red repository
|
- name: Check out node-red repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: 'node-red'
|
path: 'node-red'
|
||||||
- name: Check out node-red-docker repository
|
- name: Check out node-red-docker repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: 'node-red/node-red-docker'
|
repository: 'node-red/node-red-docker'
|
||||||
path: 'node-red-docker'
|
path: 'node-red-docker'
|
||||||
- name: Check out node-red.github.io repository
|
- name: Check out node-red.github.io repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: 'node-red/node-red.github.io'
|
repository: 'node-red/node-red.github.io'
|
||||||
path: 'node-red.github.io'
|
path: 'node-red.github.io'
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v4
|
||||||
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@v6
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
token: ${{ secrets.NR_REPO_TOKEN }}
|
||||||
committer: GitHub <noreply@github.com>
|
committer: GitHub <noreply@github.com>
|
||||||
@@ -45,7 +48,7 @@ jobs:
|
|||||||
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
|
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
|
||||||
- run: node ./node-red/.github/scripts/update-node-red-website.js
|
- run: node ./node-red/.github/scripts/update-node-red-website.js
|
||||||
- name: Create Website Pull Request
|
- name: Create Website Pull Request
|
||||||
uses: peter-evans/create-pull-request@v2
|
uses: peter-evans/create-pull-request@v6
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
token: ${{ secrets.NR_REPO_TOKEN }}
|
||||||
committer: GitHub <noreply@github.com>
|
committer: GitHub <noreply@github.com>
|
||||||
36
.github/workflows/tests.yml
vendored
Normal file
36
.github/workflows/tests.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
name: Run tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master, dev ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master, dev ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
permissions:
|
||||||
|
checks: write # for coverallsapp/github-action to create new checks
|
||||||
|
contents: read # for actions/checkout to fetch code
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [16, 18, 20]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: npm install
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
npm run test
|
||||||
|
# - name: Publish to coveralls.io
|
||||||
|
# if: ${{ matrix.node-version == 16 }}
|
||||||
|
# uses: coverallsapp/github-action@v1.1.2
|
||||||
|
# with:
|
||||||
|
# github-token: ${{ github.token }}
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -7,7 +7,9 @@
|
|||||||
.sessions.json
|
.sessions.json
|
||||||
.settings
|
.settings
|
||||||
.tern-project
|
.tern-project
|
||||||
|
.i18n-editor-metadata
|
||||||
*.backup
|
*.backup
|
||||||
|
*.bak
|
||||||
*_cred*
|
*_cred*
|
||||||
coverage
|
coverage
|
||||||
credentials.json
|
credentials.json
|
||||||
@@ -24,3 +26,5 @@ docs
|
|||||||
!packages/node_modules/**/docs
|
!packages/node_modules/**/docs
|
||||||
.vscode
|
.vscode
|
||||||
.nyc_output
|
.nyc_output
|
||||||
|
sync.ffs_db
|
||||||
|
package-lock.json
|
||||||
|
|||||||
@@ -15,5 +15,5 @@
|
|||||||
"shadow": true, // allow variable shadowing (re-use of names...)
|
"shadow": true, // allow variable shadowing (re-use of names...)
|
||||||
"sub": true, // don't warn that foo['bar'] should be written as foo.bar
|
"sub": true, // don't warn that foo['bar'] should be written as foo.bar
|
||||||
"proto": true, // allow setting of __proto__ in node < v0.12,
|
"proto": true, // allow setting of __proto__ in node < v0.12,
|
||||||
"esversion": 6 // allow es6
|
"esversion": 11 // allow es11(ES2020)
|
||||||
}
|
}
|
||||||
|
|||||||
21
.travis.yml
21
.travis.yml
@@ -1,21 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
addons:
|
|
||||||
chrome: stable
|
|
||||||
language: node_js
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- node_js: "14"
|
|
||||||
script:
|
|
||||||
- ./node_modules/.bin/grunt && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage
|
|
||||||
# - scripts/install-ui-test-dependencies.sh && grunt test-ui
|
|
||||||
before_script:
|
|
||||||
- npm install -g coveralls
|
|
||||||
- node_js: "12"
|
|
||||||
script:
|
|
||||||
- ./node_modules/.bin/grunt no-coverage
|
|
||||||
- node_js: "10"
|
|
||||||
script:
|
|
||||||
- ./node_modules/.bin/grunt no-coverage
|
|
||||||
- node_js: "8"
|
|
||||||
script:
|
|
||||||
- ./node_modules/.bin/grunt no-coverage
|
|
||||||
16
API.md
16
API.md
@@ -1,8 +1,12 @@
|
|||||||
Node-RED Modules
|
Node-RED consists of 6 node modules under the `@node-red` scope, which are pulled together
|
||||||
---
|
by the top-level `node-red` module. The typical scenario is where you are embedding Node-RED into your
|
||||||
|
own application, in which case you would use the `node-red` module rather than any of the
|
||||||
|
internal modules directly.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
let RED = require("node-red");
|
||||||
|
```
|
||||||
|
|
||||||
Node-RED provides a set of node modules that implement different parts of the
|
|
||||||
application.
|
|
||||||
|
|
||||||
Module | Description
|
Module | Description
|
||||||
-------|-------
|
-------|-------
|
||||||
@@ -10,6 +14,6 @@ Module | Description
|
|||||||
[@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API
|
[@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API
|
||||||
[@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED
|
[@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED
|
||||||
[@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules
|
[@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules
|
||||||
@node-red/registry | the internal node registry
|
[@node-red/registry](@node-red_registry.html) | the internal node registry
|
||||||
@node-red/nodes | the default set of core nodes
|
@node-red/nodes | the default set of core nodes. This module only contains the Node-RED nodes - it does not expose any APIs.
|
||||||
@node-red/editor-client | the client-side resources of the Node-RED editor application
|
@node-red/editor-client | the client-side resources of the Node-RED editor application
|
||||||
|
|||||||
2953
CHANGELOG.md
2953
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -16,6 +16,9 @@ behavior to the project's core team at team@nodered.org.
|
|||||||
Please raise any bug reports on the relevant project's issue tracker. Be sure to
|
Please raise any bug reports on the relevant project's issue tracker. Be sure to
|
||||||
search the list to see if your issue has already been raised.
|
search the list to see if your issue has already been raised.
|
||||||
|
|
||||||
|
If your issue is more of a question on how to do something with Node-RED, please
|
||||||
|
consider using the [community forum](https://discourse.nodered.org/).
|
||||||
|
|
||||||
A good bug report is one that make it easy for us to understand what you were
|
A good bug report is one that make it easy for us to understand what you were
|
||||||
trying to do and what went wrong.
|
trying to do and what went wrong.
|
||||||
|
|
||||||
@@ -35,16 +38,25 @@ For feature requests, please raise them on the [forum](https://discourse.nodered
|
|||||||
## Pull-Requests
|
## Pull-Requests
|
||||||
|
|
||||||
If you want to raise a pull-request with a new feature, or a refactoring
|
If you want to raise a pull-request with a new feature, or a refactoring
|
||||||
of existing code, it may well get rejected if you haven't discussed it on
|
of existing code, please come and discuss it with us first. We prefer to
|
||||||
the [forum](https://discourse.nodered.org) first.
|
do it that way to make sure your time and effort is well spent on something
|
||||||
|
that fits with our goals.
|
||||||
|
|
||||||
All contributors need to sign the JS Foundation's Contributor License Agreement.
|
If you've got a bug-fix or similar for us, then you are most welcome to
|
||||||
It is an online process and quick to do. You can read the details of the agreement
|
get it raised - just make sure you link back to the issue it's fixing and
|
||||||
here: https://cla.js.foundation/node-red/node-red.
|
try to include some tests!
|
||||||
|
|
||||||
If you raise a pull-request without having signed the CLA, you will be prompted
|
All contributors need to sign the OpenJS Foundation's Contributor License Agreement.
|
||||||
to do so automatically.
|
It is an online process and quick to do. If you raise a pull-request without
|
||||||
|
having signed the CLA, you will be prompted to do so automatically.
|
||||||
|
|
||||||
|
### Code Branches
|
||||||
|
|
||||||
|
When raising a PR for a fix or a new feature, it is important to target the right branch.
|
||||||
|
|
||||||
|
- `master` - this is the main branch for the latest stable release of Node-RED. All bug fixes for that release should target this branch.
|
||||||
|
- `v1.x` - this is the maintenance branch for the 1.x stream. If a fix *only* applies to 1.x, then it should target this branch. If it applies to the current stable release as well, target `master` first. We will then decide if it needs to be back ported to the 1.x stream.
|
||||||
|
- `dev` - this is the branch for new feature development targeting the next milestone release.
|
||||||
|
|
||||||
### Coding standards
|
### Coding standards
|
||||||
|
|
||||||
|
|||||||
68
Gruntfile.js
68
Gruntfile.js
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var fs = require("fs-extra");
|
var fs = require("fs-extra");
|
||||||
var sass = require("node-sass");
|
var sass = require("sass");
|
||||||
|
|
||||||
module.exports = function(grunt) {
|
module.exports = function(grunt) {
|
||||||
|
|
||||||
@@ -40,8 +40,10 @@ module.exports = function(grunt) {
|
|||||||
if (nonHeadless) {
|
if (nonHeadless) {
|
||||||
process.env.NODE_RED_NON_HEADLESS = true;
|
process.env.NODE_RED_NON_HEADLESS = true;
|
||||||
}
|
}
|
||||||
|
const pkg = grunt.file.readJSON('package.json');
|
||||||
|
process.env.NODE_RED_PACKAGE_VERSION = pkg.version;
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
pkg: pkg,
|
||||||
paths: {
|
paths: {
|
||||||
dist: ".dist"
|
dist: ".dist"
|
||||||
},
|
},
|
||||||
@@ -135,13 +137,16 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/jquery-addons.js",
|
"packages/node_modules/@node-red/editor-client/src/js/jquery-addons.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/red.js",
|
"packages/node_modules/@node-red/editor-client/src/js/red.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/events.js",
|
"packages/node_modules/@node-red/editor-client/src/js/events.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/hooks.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/i18n.js",
|
"packages/node_modules/@node-red/editor-client/src/js/i18n.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/settings.js",
|
"packages/node_modules/@node-red/editor-client/src/js/settings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/user.js",
|
"packages/node_modules/@node-red/editor-client/src/js/user.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/comms.js",
|
"packages/node_modules/@node-red/editor-client/src/js/comms.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/runtime.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/text/bidi.js",
|
"packages/node_modules/@node-red/editor-client/src/js/text/bidi.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/text/format.js",
|
"packages/node_modules/@node-red/editor-client/src/js/text/format.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/state.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/state.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/plugins.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/nodes.js",
|
"packages/node_modules/@node-red/editor-client/src/js/nodes.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/font-awesome.js",
|
"packages/node_modules/@node-red/editor-client/src/js/font-awesome.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/history.js",
|
"packages/node_modules/@node-red/editor-client/src/js/history.js",
|
||||||
@@ -158,14 +163,17 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/colorPicker.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/env-var.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",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/view.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/view-annotations.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js",
|
||||||
@@ -177,13 +185,16 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/editor.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/editor.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/*.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/editors/*.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/editors/*.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/*.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/event-log.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/event-log.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tray.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/tray.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/library.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/library.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/search.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/search.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js",
|
||||||
@@ -193,7 +204,8 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/touch/radialMenu.js"
|
"packages/node_modules/@node-red/editor-client/src/js/ui/touch/radialMenu.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/tour/*.js"
|
||||||
],
|
],
|
||||||
dest: "packages/node_modules/@node-red/editor-client/public/red/red.js"
|
dest: "packages/node_modules/@node-red/editor-client/public/red/red.js"
|
||||||
},
|
},
|
||||||
@@ -207,11 +219,13 @@ module.exports = function(grunt) {
|
|||||||
"node_modules/marked/marked.min.js",
|
"node_modules/marked/marked.min.js",
|
||||||
"node_modules/dompurify/dist/purify.min.js",
|
"node_modules/dompurify/dist/purify.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js",
|
"packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js",
|
"node_modules/i18next/i18next.min.js",
|
||||||
|
"node_modules/i18next-http-backend/i18nextHttpBackend.min.js",
|
||||||
|
"node_modules/jquery-i18next/jquery-i18next.min.js",
|
||||||
"node_modules/jsonata/jsonata-es5.min.js",
|
"node_modules/jsonata/jsonata-es5.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js",
|
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ace.js",
|
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ace.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ext-language_tools.js",
|
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ext-language_tools.js"
|
||||||
],
|
],
|
||||||
// "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [
|
// "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [
|
||||||
// // TODO: resolve relative resource paths in
|
// // TODO: resolve relative resource paths in
|
||||||
@@ -220,6 +234,9 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [
|
"packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [
|
||||||
"node_modules/jsonata/jsonata-es5.min.js",
|
"node_modules/jsonata/jsonata-es5.min.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js"
|
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js"
|
||||||
|
],
|
||||||
|
"packages/node_modules/@node-red/editor-client/public/vendor/mermaid/mermaid.min.js": [
|
||||||
|
"node_modules/mermaid/dist/mermaid.min.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -280,7 +297,9 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/public/index.html",
|
"packages/node_modules/@node-red/editor-client/public/index.html",
|
||||||
"packages/node_modules/@node-red/editor-client/public/favicon.ico",
|
"packages/node_modules/@node-red/editor-client/public/favicon.ico",
|
||||||
"packages/node_modules/@node-red/editor-client/public/icons",
|
"packages/node_modules/@node-red/editor-client/public/icons",
|
||||||
"packages/node_modules/@node-red/editor-client/public/vendor"
|
"packages/node_modules/@node-red/editor-client/public/vendor",
|
||||||
|
"packages/node_modules/@node-red/editor-client/public/types/node",
|
||||||
|
"packages/node_modules/@node-red/editor-client/public/types/node-red",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
release: {
|
release: {
|
||||||
@@ -316,6 +335,12 @@ module.exports = function(grunt) {
|
|||||||
],
|
],
|
||||||
tasks: ['jsonlint:keymaps','copy:build']
|
tasks: ['jsonlint:keymaps','copy:build']
|
||||||
},
|
},
|
||||||
|
tours: {
|
||||||
|
files: [
|
||||||
|
'packages/node_modules/@node-red/editor-client/src/tours/**/*.js'
|
||||||
|
],
|
||||||
|
tasks: ['copy:build']
|
||||||
|
},
|
||||||
misc: {
|
misc: {
|
||||||
files: [
|
files: [
|
||||||
'CHANGELOG.md'
|
'CHANGELOG.md'
|
||||||
@@ -370,11 +395,24 @@ module.exports = function(grunt) {
|
|||||||
src: [
|
src: [
|
||||||
'ace/**',
|
'ace/**',
|
||||||
'jquery/css/base/**',
|
'jquery/css/base/**',
|
||||||
'font-awesome/**'
|
'font-awesome/**',
|
||||||
|
'monaco/dist/**',
|
||||||
|
'monaco/types/extraLibs.js',
|
||||||
|
'monaco/style.css',
|
||||||
|
'monaco/monaco-bootstrap.js'
|
||||||
],
|
],
|
||||||
expand: true,
|
expand: true,
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/'
|
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
cwd: 'packages/node_modules/@node-red/editor-client/src',
|
||||||
|
src: [
|
||||||
|
'types/node/**/*.ts',
|
||||||
|
'types/node-red/*.ts',
|
||||||
|
],
|
||||||
|
expand: true,
|
||||||
|
dest: 'packages/node_modules/@node-red/editor-client/public/'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
cwd: 'packages/node_modules/@node-red/editor-client/src/icons',
|
cwd: 'packages/node_modules/@node-red/editor-client/src/icons',
|
||||||
src: '**',
|
src: '**',
|
||||||
@@ -400,6 +438,12 @@ module.exports = function(grunt) {
|
|||||||
src: '**',
|
src: '**',
|
||||||
expand: true,
|
expand: true,
|
||||||
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/ace/'
|
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/ace/'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
cwd: 'packages/node_modules/@node-red/editor-client/src/tours',
|
||||||
|
src: '**',
|
||||||
|
expand: true,
|
||||||
|
dest: 'packages/node_modules/@node-red/editor-client/public/red/tours/'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -461,11 +505,13 @@ module.exports = function(grunt) {
|
|||||||
'packages/node_modules/@node-red/runtime/lib/hooks.js',
|
'packages/node_modules/@node-red/runtime/lib/hooks.js',
|
||||||
'packages/node_modules/@node-red/util/**/*.js',
|
'packages/node_modules/@node-red/util/**/*.js',
|
||||||
'packages/node_modules/@node-red/editor-api/lib/index.js',
|
'packages/node_modules/@node-red/editor-api/lib/index.js',
|
||||||
'packages/node_modules/@node-red/editor-api/lib/auth/index.js'
|
'packages/node_modules/@node-red/editor-api/lib/auth/index.js',
|
||||||
|
'packages/node_modules/@node-red/registry/lib/index.js'
|
||||||
],
|
],
|
||||||
options: {
|
options: {
|
||||||
destination: 'docs',
|
destination: 'docs',
|
||||||
configure: './jsdoc.json'
|
configure: './jsdoc.json',
|
||||||
|
fred: "hi there"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_editor: {
|
_editor: {
|
||||||
@@ -544,7 +590,7 @@ module.exports = function(grunt) {
|
|||||||
grunt.registerMultiTask('attachCopyright', function() {
|
grunt.registerMultiTask('attachCopyright', function() {
|
||||||
var files = this.data.src;
|
var files = this.data.src;
|
||||||
var copyright = "/**\n"+
|
var copyright = "/**\n"+
|
||||||
" * Copyright JS Foundation and other contributors, http://js.foundation\n"+
|
" * Copyright OpenJS Foundation and other contributors, https://openjsf.org/\n"+
|
||||||
" *\n"+
|
" *\n"+
|
||||||
" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"+
|
" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"+
|
||||||
" * you may not use this file except in compliance with the License.\n"+
|
" * you may not use this file except in compliance with the License.\n"+
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -1,17 +1,16 @@
|
|||||||
# Node-RED
|
# Node-RED
|
||||||
|
|
||||||
http://nodered.org
|
https://nodered.org
|
||||||
|
|
||||||
[](https://travis-ci.org/node-red/node-red)
|
[](https://github.com/node-red/node-red/actions?query=branch%3Amaster)
|
||||||
[](https://coveralls.io/r/node-red/node-red?branch=master)
|
|
||||||
|
|
||||||
Low-code programming for event-driven applications.
|
Low-code programming for event-driven applications.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
Check out http://nodered.org/docs/getting-started/ for full instructions on getting
|
Check out https://nodered.org/docs/getting-started/ for full instructions on getting
|
||||||
started.
|
started.
|
||||||
|
|
||||||
1. `sudo npm install -g --unsafe-perm node-red`
|
1. `sudo npm install -g --unsafe-perm node-red`
|
||||||
@@ -20,7 +19,7 @@ started.
|
|||||||
|
|
||||||
## Getting Help
|
## Getting Help
|
||||||
|
|
||||||
More documentation can be found [here](http://nodered.org/docs).
|
More documentation can be found [here](https://nodered.org/docs).
|
||||||
|
|
||||||
For further help, or general discussion, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
|
For further help, or general discussion, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
|
||||||
|
|
||||||
@@ -56,13 +55,13 @@ This project adheres to the [Contributor Covenant 1.4](http://contributor-covena
|
|||||||
|
|
||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
Node-RED is a project of the [OpenJS Foundation](https://openjsf.org).
|
Node-RED is a project of the [OpenJS Foundation](http://openjsf.org).
|
||||||
|
|
||||||
It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/).
|
It is maintained by:
|
||||||
|
|
||||||
* Nick O'Leary [@knolleary](http://twitter.com/knolleary)
|
* Nick O'Leary [@knolleary](http://twitter.com/knolleary)
|
||||||
* Dave Conway-Jones [@ceejay](http://twitter.com/ceejay)
|
* Dave Conway-Jones [@ceejay](http://twitter.com/ceejay)
|
||||||
|
* And many others...
|
||||||
|
|
||||||
|
|
||||||
## Copyright and license
|
## Copyright and license
|
||||||
|
|||||||
128
package.json
128
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "node-red",
|
"name": "node-red",
|
||||||
"version": "1.2.9",
|
"version": "3.1.15",
|
||||||
"description": "Low-code programming for event-driven applications",
|
"description": "Low-code programming for event-driven applications",
|
||||||
"homepage": "http://nodered.org",
|
"homepage": "https://nodered.org",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -26,96 +26,102 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ajv": "6.12.6",
|
"acorn": "8.8.2",
|
||||||
"async-mutex": "0.2.6",
|
"acorn-walk": "8.2.0",
|
||||||
|
"ajv": "8.12.0",
|
||||||
|
"async-mutex": "0.4.0",
|
||||||
"basic-auth": "2.0.1",
|
"basic-auth": "2.0.1",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"body-parser": "1.19.0",
|
"body-parser": "1.20.3",
|
||||||
"cheerio": "0.22.0",
|
"cheerio": "1.0.0-rc.10",
|
||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"content-type": "1.0.4",
|
"content-type": "1.0.5",
|
||||||
"cookie": "0.4.1",
|
"cookie": "0.7.2",
|
||||||
"cookie-parser": "1.4.5",
|
"cookie-parser": "1.4.7",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"cron": "1.7.2",
|
"cronosjs": "1.7.1",
|
||||||
"denque": "1.5.0",
|
"denque": "2.1.0",
|
||||||
"express": "4.17.1",
|
"express": "4.21.2",
|
||||||
"express-session": "1.17.1",
|
"express-session": "1.18.1",
|
||||||
"fs-extra": "8.1.0",
|
"form-data": "4.0.0",
|
||||||
"fs.notify": "0.0.4",
|
"fs-extra": "11.1.1",
|
||||||
|
"got": "12.6.0",
|
||||||
"hash-sum": "2.0.0",
|
"hash-sum": "2.0.0",
|
||||||
"https-proxy-agent": "5.0.0",
|
"hpagent": "1.2.0",
|
||||||
"i18next": "15.1.2",
|
"https-proxy-agent": "5.0.1",
|
||||||
"iconv-lite": "0.6.2",
|
"i18next": "21.10.0",
|
||||||
|
"iconv-lite": "0.6.3",
|
||||||
"is-utf8": "0.2.1",
|
"is-utf8": "0.2.1",
|
||||||
"js-yaml": "3.14.0",
|
"js-yaml": "4.1.0",
|
||||||
"json-stringify-safe": "5.0.1",
|
"json-stringify-safe": "5.0.1",
|
||||||
"jsonata": "1.8.4",
|
"jsonata": "1.8.7",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
"media-typer": "1.1.0",
|
"media-typer": "1.1.0",
|
||||||
"memorystore": "1.6.4",
|
"memorystore": "1.6.7",
|
||||||
"mime": "2.4.7",
|
"mime": "3.0.0",
|
||||||
"moment-timezone": "0.5.32",
|
"moment": "2.29.4",
|
||||||
"mqtt": "4.2.6",
|
"moment-timezone": "0.5.43",
|
||||||
"multer": "1.4.2",
|
"mqtt": "4.3.7",
|
||||||
"mustache": "4.1.0",
|
"multer": "1.4.5-lts.1",
|
||||||
"node-red-admin": "^0.2.6",
|
"mustache": "4.2.0",
|
||||||
"node-red-node-rbe": "^0.2.9",
|
"node-red-admin": "^3.1.3",
|
||||||
"node-red-node-sentiment": "^0.1.6",
|
"node-watch": "0.7.4",
|
||||||
"node-red-node-tail": "^0.1.0",
|
|
||||||
"nopt": "5.0.0",
|
"nopt": "5.0.0",
|
||||||
"oauth2orize": "1.11.0",
|
"oauth2orize": "1.11.1",
|
||||||
"on-headers": "1.0.2",
|
"on-headers": "1.0.2",
|
||||||
"passport": "0.4.1",
|
"passport": "0.6.0",
|
||||||
"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.1",
|
"raw-body": "2.5.2",
|
||||||
"request": "2.88.0",
|
"semver": "7.5.4",
|
||||||
"semver": "6.3.0",
|
"tar": "6.2.1",
|
||||||
"tar": "6.0.5",
|
"tough-cookie": "4.1.3",
|
||||||
"uglify-js": "3.12.4",
|
"uglify-js": "3.17.4",
|
||||||
"when": "3.7.8",
|
"uuid": "9.0.0",
|
||||||
"ws": "6.2.1",
|
"ws": "7.5.10",
|
||||||
"xml2js": "0.4.23"
|
"xml2js": "0.6.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"bcrypt": "3.0.8"
|
"bcrypt": "5.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"dompurify": "2.2.6",
|
"dompurify": "2.5.7",
|
||||||
"grunt": "1.3.0",
|
"grunt": "1.6.1",
|
||||||
"grunt-chmod": "~1.1.1",
|
"grunt-chmod": "~1.1.1",
|
||||||
"grunt-cli": "~1.3.2",
|
"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": "1.6.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": "~2.1.0",
|
"grunt-contrib-jshint": "3.2.0",
|
||||||
"grunt-contrib-uglify": "~4.0.1",
|
"grunt-contrib-uglify": "5.2.2",
|
||||||
"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": "5.0.0",
|
"grunt-jsdoc-to-markdown": "6.0.0",
|
||||||
"grunt-jsonlint": "2.1.3",
|
"grunt-jsonlint": "2.1.3",
|
||||||
"grunt-mkdir": "~1.1.0",
|
"grunt-mkdir": "~1.1.0",
|
||||||
"grunt-npm-command": "~0.1.2",
|
"grunt-npm-command": "~0.1.2",
|
||||||
"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",
|
||||||
"http-proxy": "1.18.1",
|
"i18next-http-backend": "1.4.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": "1.2.7",
|
"marked": "4.3.0",
|
||||||
|
"mermaid": "11.3.0",
|
||||||
"minami": "1.2.3",
|
"minami": "1.2.3",
|
||||||
"mocha": "^5.2.0",
|
"mocha": "9.2.2",
|
||||||
"node-red-node-test-helper": "^0.2.6",
|
"node-red-node-test-helper": "^0.3.3",
|
||||||
"node-sass": "^4.14.1",
|
"nodemon": "2.0.20",
|
||||||
"nodemon": "2.0.6",
|
"proxy": "^1.0.2",
|
||||||
|
"sass": "1.62.1",
|
||||||
"should": "13.2.3",
|
"should": "13.2.3",
|
||||||
"sinon": "1.17.7",
|
"sinon": "11.1.2",
|
||||||
"stoppable": "^1.1.0",
|
"stoppable": "^1.1.0",
|
||||||
"supertest": "5.0.0"
|
"supertest": "6.3.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=14"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright JS Foundation and other contributors, http://js.foundation
|
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
|
||||||
|
|
||||||
Apache License
|
Apache License
|
||||||
Version 2.0, January 2004
|
Version 2.0, January 2004
|
||||||
|
|||||||
23
packages/node_modules/@node-red/editor-api/lib/admin/diagnostics.js
vendored
Normal file
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -68,5 +68,28 @@ module.exports = {
|
|||||||
}).catch(function(err) {
|
}).catch(function(err) {
|
||||||
apiUtils.rejectHandler(req,res,err);
|
apiUtils.rejectHandler(req,res,err);
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
getState: function(req,res) {
|
||||||
|
const opts = {
|
||||||
|
user: req.user,
|
||||||
|
req: apiUtils.getRequestLogObject(req)
|
||||||
|
}
|
||||||
|
runtimeAPI.flows.getState(opts).then(function(result) {
|
||||||
|
res.json(result);
|
||||||
|
}).catch(function(err) {
|
||||||
|
apiUtils.rejectHandler(req,res,err);
|
||||||
|
})
|
||||||
|
},
|
||||||
|
postState: function(req,res) {
|
||||||
|
const opts = {
|
||||||
|
user: req.user,
|
||||||
|
state: req.body.state || "",
|
||||||
|
req: apiUtils.getRequestLogObject(req)
|
||||||
|
}
|
||||||
|
runtimeAPI.flows.setState(opts).then(function(result) {
|
||||||
|
res.json(result);
|
||||||
|
}).catch(function(err) {
|
||||||
|
apiUtils.rejectHandler(req,res,err);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var express = require("express");
|
|
||||||
|
|
||||||
var nodes = require("./nodes");
|
var nodes = require("./nodes");
|
||||||
var flows = require("./flows");
|
var flows = require("./flows");
|
||||||
var flow = require("./flow");
|
var flow = require("./flow");
|
||||||
var context = require("./context");
|
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 diagnostics = require("./diagnostics");
|
||||||
|
|
||||||
var apiUtil = require("../util");
|
var apiUtil = require("../util");
|
||||||
|
|
||||||
@@ -32,15 +32,23 @@ module.exports = {
|
|||||||
nodes.init(runtimeAPI);
|
nodes.init(runtimeAPI);
|
||||||
context.init(runtimeAPI);
|
context.init(runtimeAPI);
|
||||||
info.init(settings,runtimeAPI);
|
info.init(settings,runtimeAPI);
|
||||||
|
plugins.init(runtimeAPI);
|
||||||
|
diagnostics.init(settings, runtimeAPI);
|
||||||
|
|
||||||
var needsPermission = auth.needsPermission;
|
const needsPermission = auth.needsPermission;
|
||||||
|
|
||||||
var adminApp = express();
|
const adminApp = apiUtil.createExpressApp(settings)
|
||||||
|
|
||||||
// Flows
|
// Flows
|
||||||
adminApp.get("/flows",needsPermission("flows.read"),flows.get,apiUtil.errorHandler);
|
adminApp.get("/flows",needsPermission("flows.read"),flows.get,apiUtil.errorHandler);
|
||||||
adminApp.post("/flows",needsPermission("flows.write"),flows.post,apiUtil.errorHandler);
|
adminApp.post("/flows",needsPermission("flows.write"),flows.post,apiUtil.errorHandler);
|
||||||
|
|
||||||
|
// Flows/state
|
||||||
|
adminApp.get("/flows/state", needsPermission("flows.read"), flows.getState, apiUtil.errorHandler);
|
||||||
|
if (settings.runtimeState && settings.runtimeState.enabled === true) {
|
||||||
|
adminApp.post("/flows/state", needsPermission("flows.write"), flows.postState, apiUtil.errorHandler);
|
||||||
|
}
|
||||||
|
|
||||||
// Flow
|
// Flow
|
||||||
adminApp.get("/flow/:id",needsPermission("flows.read"),flow.get,apiUtil.errorHandler);
|
adminApp.get("/flow/:id",needsPermission("flows.read"),flow.get,apiUtil.errorHandler);
|
||||||
adminApp.post("/flow",needsPermission("flows.write"),flow.post,apiUtil.errorHandler);
|
adminApp.post("/flow",needsPermission("flows.write"),flow.post,apiUtil.errorHandler);
|
||||||
@@ -50,13 +58,15 @@ module.exports = {
|
|||||||
// Nodes
|
// Nodes
|
||||||
adminApp.get("/nodes",needsPermission("nodes.read"),nodes.getAll,apiUtil.errorHandler);
|
adminApp.get("/nodes",needsPermission("nodes.read"),nodes.getAll,apiUtil.errorHandler);
|
||||||
|
|
||||||
if (!settings.editorTheme || !settings.editorTheme.palette || settings.editorTheme.palette.upload !== false) {
|
if (!settings.externalModules || !settings.externalModules.palette || settings.externalModules.palette.allowInstall !== false) {
|
||||||
|
if (!settings.externalModules || !settings.externalModules.palette || settings.externalModules.palette.allowUpload !== false) {
|
||||||
const multer = require('multer');
|
const multer = require('multer');
|
||||||
const upload = multer({ storage: multer.memoryStorage() });
|
const upload = multer({ storage: multer.memoryStorage() });
|
||||||
adminApp.post("/nodes",needsPermission("nodes.write"),upload.single("tarball"),nodes.post,apiUtil.errorHandler);
|
adminApp.post("/nodes",needsPermission("nodes.write"),upload.single("tarball"),nodes.post,apiUtil.errorHandler);
|
||||||
} else {
|
} else {
|
||||||
adminApp.post("/nodes",needsPermission("nodes.write"),nodes.post,apiUtil.errorHandler);
|
adminApp.post("/nodes",needsPermission("nodes.write"),nodes.post,apiUtil.errorHandler);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
adminApp.get(/^\/nodes\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalogs,apiUtil.errorHandler);
|
adminApp.get(/^\/nodes\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalogs,apiUtil.errorHandler);
|
||||||
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalog,apiUtil.errorHandler);
|
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalog,apiUtil.errorHandler);
|
||||||
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,apiUtil.errorHandler);
|
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,apiUtil.errorHandler);
|
||||||
@@ -78,6 +88,12 @@ module.exports = {
|
|||||||
|
|
||||||
adminApp.get("/settings",needsPermission("settings.read"),info.runtimeSettings,apiUtil.errorHandler);
|
adminApp.get("/settings",needsPermission("settings.read"),info.runtimeSettings,apiUtil.errorHandler);
|
||||||
|
|
||||||
|
// Plugins
|
||||||
|
adminApp.get("/plugins", needsPermission("plugins.read"), plugins.getAll, 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ module.exports = {
|
|||||||
runtimeAPI.nodes.addModule(opts).then(function(info) {
|
runtimeAPI.nodes.addModule(opts).then(function(info) {
|
||||||
res.json(info);
|
res.json(info);
|
||||||
}).catch(function(err) {
|
}).catch(function(err) {
|
||||||
|
console.log(err.stack);
|
||||||
apiUtils.rejectHandler(req,res,err);
|
apiUtils.rejectHandler(req,res,err);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|||||||
44
packages/node_modules/@node-red/editor-api/lib/admin/plugins.js
vendored
Normal file
44
packages/node_modules/@node-red/editor-api/lib/admin/plugins.js
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
var apiUtils = require("../util");
|
||||||
|
|
||||||
|
var runtimeAPI;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
init: function(_runtimeAPI) {
|
||||||
|
runtimeAPI = _runtimeAPI;
|
||||||
|
},
|
||||||
|
getAll: function(req,res) {
|
||||||
|
var opts = {
|
||||||
|
user: req.user,
|
||||||
|
req: apiUtils.getRequestLogObject(req)
|
||||||
|
}
|
||||||
|
if (req.get("accept") == "application/json") {
|
||||||
|
runtimeAPI.plugins.getPluginList(opts).then(function(list) {
|
||||||
|
res.json(list);
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
opts.lang = apiUtils.determineLangFromHeaders(req.acceptsLanguages());
|
||||||
|
if (/[^0-9a-z=\-\*]/i.test(opts.lang)) {
|
||||||
|
opts.lang = "en-US";
|
||||||
|
}
|
||||||
|
runtimeAPI.plugins.getPluginConfigs(opts).then(function(configs) {
|
||||||
|
res.send(configs);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getCatalogs: function(req,res) {
|
||||||
|
var opts = {
|
||||||
|
user: req.user,
|
||||||
|
lang: req.query.lng,
|
||||||
|
req: apiUtils.getRequestLogObject(req)
|
||||||
|
}
|
||||||
|
if (/[^0-9a-z=\-\*]/i.test(opts.lang)) {
|
||||||
|
opts.lang = "en-US";
|
||||||
|
}
|
||||||
|
runtimeAPI.plugins.getPluginCatalogs(opts).then(function(result) {
|
||||||
|
res.json(result);
|
||||||
|
}).catch(function(err) {
|
||||||
|
console.log(err.stack);
|
||||||
|
apiUtils.rejectHandler(req,res,err);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
var apiUtils = require("../util");
|
|
||||||
var runtimeAPI;
|
var runtimeAPI;
|
||||||
var settings;
|
var settings;
|
||||||
var theme = require("../editor/theme");
|
var theme = require("../editor/theme");
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ function getToken(req,res,next) {
|
|||||||
return server.token()(req,res,next);
|
return server.token()(req,res,next);
|
||||||
}
|
}
|
||||||
|
|
||||||
function login(req,res) {
|
async function login(req,res) {
|
||||||
var response = {};
|
var response = {};
|
||||||
if (settings.adminAuth) {
|
if (settings.adminAuth) {
|
||||||
var mergedAdminAuth = Object.assign({}, settings.adminAuth, settings.adminAuth.module);
|
var mergedAdminAuth = Object.assign({}, settings.adminAuth, settings.adminAuth.module);
|
||||||
@@ -106,9 +106,15 @@ 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;
|
||||||
}
|
}
|
||||||
@@ -116,8 +122,9 @@ function login(req,res) {
|
|||||||
response.prompts[0].image = theme.serveFile('/login/',mergedAdminAuth.strategy.image);
|
response.prompts[0].image = theme.serveFile('/login/',mergedAdminAuth.strategy.image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (theme.context().login && theme.context().login.image) {
|
let themeContext = await theme.context();
|
||||||
response.image = theme.context().login.image;
|
if (themeContext.login && themeContext.login.image) {
|
||||||
|
response.image = themeContext.login.image;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.json(response);
|
res.json(response);
|
||||||
@@ -140,7 +147,7 @@ function completeVerify(profile,done) {
|
|||||||
Users.authenticate(profile).then(function(user) {
|
Users.authenticate(profile).then(function(user) {
|
||||||
if (user) {
|
if (user) {
|
||||||
Tokens.create(user.username,"node-red-editor",user.permissions).then(function(tokens) {
|
Tokens.create(user.username,"node-red-editor",user.permissions).then(function(tokens) {
|
||||||
log.audit({event: "auth.login",username:user.username,scope:user.permissions});
|
log.audit({event: "auth.login",user,username:user.username,scope:user.permissions});
|
||||||
user.tokens = tokens;
|
user.tokens = tokens;
|
||||||
done(null,user);
|
done(null,user);
|
||||||
});
|
});
|
||||||
@@ -172,9 +179,7 @@ function genericStrategy(adminApp,strategy) {
|
|||||||
adminApp.use(passport.session());
|
adminApp.use(passport.session());
|
||||||
|
|
||||||
var options = strategy.options;
|
var options = strategy.options;
|
||||||
|
var verify = function() {
|
||||||
passport.use(new strategy.strategy(options,
|
|
||||||
function() {
|
|
||||||
var originalDone = arguments[arguments.length-1];
|
var originalDone = arguments[arguments.length-1];
|
||||||
if (options.verify) {
|
if (options.verify) {
|
||||||
var args = Array.from(arguments);
|
var args = Array.from(arguments);
|
||||||
@@ -185,18 +190,28 @@ function genericStrategy(adminApp,strategy) {
|
|||||||
return completeVerify(profile,originalDone);
|
return completeVerify(profile,originalDone);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
// Give our callback the same arity as the original one from options
|
||||||
|
if (options.verify) {
|
||||||
|
Object.defineProperty(verify, "length", { value: options.verify.length })
|
||||||
}
|
}
|
||||||
));
|
|
||||||
|
passport.use(new strategy.strategy(options, verify));
|
||||||
|
|
||||||
adminApp.get('/auth/strategy',
|
adminApp.get('/auth/strategy',
|
||||||
passport.authenticate(strategy.name, {session:false, failureRedirect: settings.httpAdminRoot }),
|
passport.authenticate(strategy.name, {
|
||||||
completeGenerateStrategyAuth
|
session:false,
|
||||||
|
failureMessage: true,
|
||||||
|
failureRedirect: settings.httpAdminRoot + '?session_message=Login Failed'
|
||||||
|
}),
|
||||||
|
completeGenerateStrategyAuth,
|
||||||
|
handleStrategyError
|
||||||
);
|
);
|
||||||
|
|
||||||
var callbackMethodFunc = adminApp.get;
|
var callbackMethodFunc = adminApp.get;
|
||||||
@@ -204,8 +219,13 @@ function genericStrategy(adminApp,strategy) {
|
|||||||
callbackMethodFunc = adminApp.post;
|
callbackMethodFunc = adminApp.post;
|
||||||
}
|
}
|
||||||
callbackMethodFunc.call(adminApp,'/auth/strategy/callback',
|
callbackMethodFunc.call(adminApp,'/auth/strategy/callback',
|
||||||
passport.authenticate(strategy.name, {session:false, failureRedirect: settings.httpAdminRoot }),
|
passport.authenticate(strategy.name, {
|
||||||
completeGenerateStrategyAuth
|
session:false,
|
||||||
|
failureMessage: true,
|
||||||
|
failureRedirect: settings.httpAdminRoot + '?session_message=Login Failed'
|
||||||
|
}),
|
||||||
|
completeGenerateStrategyAuth,
|
||||||
|
handleStrategyError
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -215,6 +235,13 @@ function completeGenerateStrategyAuth(req,res) {
|
|||||||
// Successful authentication, redirect home.
|
// Successful authentication, redirect home.
|
||||||
res.redirect(settings.httpAdminRoot + '?access_token='+tokens.accessToken);
|
res.redirect(settings.httpAdminRoot + '?access_token='+tokens.accessToken);
|
||||||
}
|
}
|
||||||
|
function handleStrategyError(err, req, res, next) {
|
||||||
|
if (res.headersSent) {
|
||||||
|
return next(err)
|
||||||
|
}
|
||||||
|
log.audit({event: "auth.login.fail.oauth",error:err.toString()});
|
||||||
|
res.redirect(settings.httpAdminRoot + '?session_message='+err.toString());
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: init,
|
init: init,
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ var BearerStrategy = require('passport-http-bearer').Strategy;
|
|||||||
var ClientPasswordStrategy = require('passport-oauth2-client-password').Strategy;
|
var ClientPasswordStrategy = require('passport-oauth2-client-password').Strategy;
|
||||||
|
|
||||||
var passport = require("passport");
|
var passport = require("passport");
|
||||||
var crypto = require("crypto");
|
|
||||||
var util = require("util");
|
var util = require("util");
|
||||||
|
|
||||||
var Tokens = require("./tokens");
|
var Tokens = require("./tokens");
|
||||||
@@ -92,10 +91,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;
|
||||||
});
|
});
|
||||||
|
// Check if the user contains a user defined token and use it
|
||||||
|
// instead of generating a new token
|
||||||
|
if(user.token){
|
||||||
|
done(null,user.token,null,null);
|
||||||
|
} else {
|
||||||
Tokens.create(username,client.id,scope).then(function(tokens) {
|
Tokens.create(username,client.id,scope).then(function(tokens) {
|
||||||
log.audit({event: "auth.login",username:username,client:client.id,scope:scope});
|
log.audit({event: "auth.login",user,username:username,client:client.id,scope:scope});
|
||||||
done(null,tokens.accessToken,null,{expires_in:tokens.expires_in});
|
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);
|
||||||
@@ -146,7 +151,7 @@ function authenticateUserToken(req) {
|
|||||||
} else {
|
} else {
|
||||||
reject();
|
reject();
|
||||||
}
|
}
|
||||||
});
|
}).catch(reject);
|
||||||
} else {
|
} else {
|
||||||
reject();
|
reject();
|
||||||
}
|
}
|
||||||
@@ -163,6 +168,9 @@ TokensStrategy.prototype.authenticate = function(req) {
|
|||||||
authenticateUserToken(req).then(user => {
|
authenticateUserToken(req).then(user => {
|
||||||
this.success(user,{scope:user.permissions});
|
this.success(user,{scope:user.permissions});
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
|
if (err) {
|
||||||
|
log.trace("token authentication failure: "+err.stack?err.stack:err)
|
||||||
|
}
|
||||||
this.fail(401);
|
this.fail(401);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,25 +158,31 @@ function CommsConnection(ws, user) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CommsConnection.prototype.send = function(topic,data) {
|
CommsConnection.prototype.send = function(topic,data) {
|
||||||
var self = this;
|
|
||||||
if (topic && data) {
|
if (topic && data) {
|
||||||
this.stack.push({topic:topic,data:data});
|
this.stack.push({topic:topic,data:data});
|
||||||
}
|
}
|
||||||
|
this._queueSend();
|
||||||
|
}
|
||||||
|
CommsConnection.prototype._queueSend = function() {
|
||||||
|
var self = this;
|
||||||
if (!this._xmitTimer) {
|
if (!this._xmitTimer) {
|
||||||
this._xmitTimer = setTimeout(function() {
|
this._xmitTimer = setTimeout(function() {
|
||||||
try {
|
try {
|
||||||
self.ws.send(JSON.stringify(self.stack));
|
self.ws.send(JSON.stringify(self.stack.splice(0,50)));
|
||||||
self.lastSentTime = Date.now();
|
self.lastSentTime = Date.now();
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
removeActiveConnection(self);
|
removeActiveConnection(self);
|
||||||
log.warn(log._("comms.error-send",{message:err.toString()}));
|
log.warn(log._("comms.error-send",{message:err.toString()}));
|
||||||
}
|
}
|
||||||
delete self._xmitTimer;
|
delete self._xmitTimer;
|
||||||
self.stack = [];
|
if (self.stack.length > 0) {
|
||||||
|
self._queueSend();
|
||||||
|
}
|
||||||
},50);
|
},50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CommsConnection.prototype.subscribe = function(topic) {
|
CommsConnection.prototype.subscribe = function(topic) {
|
||||||
runtimeAPI.comms.subscribe({
|
runtimeAPI.comms.subscribe({
|
||||||
user: this.user,
|
user: this.user,
|
||||||
|
|||||||
@@ -14,11 +14,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var express = require("express");
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
|
|
||||||
var comms = require("./comms");
|
var comms = require("./comms");
|
||||||
var library = require("./library");
|
|
||||||
var info = require("./settings");
|
var info = require("./settings");
|
||||||
|
|
||||||
var auth = require("../auth");
|
var auth = require("../auth");
|
||||||
@@ -46,14 +44,15 @@ module.exports = {
|
|||||||
runtimeAPI = _runtimeAPI;
|
runtimeAPI = _runtimeAPI;
|
||||||
needsPermission = auth.needsPermission;
|
needsPermission = auth.needsPermission;
|
||||||
if (!settings.disableEditor) {
|
if (!settings.disableEditor) {
|
||||||
info.init(runtimeAPI);
|
info.init(settings, runtimeAPI);
|
||||||
comms.init(server,settings,runtimeAPI);
|
comms.init(server,settings,runtimeAPI);
|
||||||
|
|
||||||
var ui = require("./ui");
|
var ui = require("./ui");
|
||||||
|
|
||||||
ui.init(runtimeAPI);
|
ui.init(settings, runtimeAPI);
|
||||||
|
|
||||||
|
const editorApp = apiUtil.createExpressApp(settings)
|
||||||
|
|
||||||
var editorApp = express();
|
|
||||||
if (settings.requireHttps === true) {
|
if (settings.requireHttps === true) {
|
||||||
editorApp.enable('trust proxy');
|
editorApp.enable('trust proxy');
|
||||||
editorApp.use(function (req, res, next) {
|
editorApp.use(function (req, res, next) {
|
||||||
@@ -64,10 +63,12 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (settings.httpServerOptions) {
|
var defaultServerSettings = {
|
||||||
for (var eOption in settings.httpServerOptions) {
|
"x-powered-by": false
|
||||||
editorApp.set(eOption, settings.httpServerOptions[eOption]);
|
|
||||||
}
|
}
|
||||||
|
var serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{});
|
||||||
|
for (var eOption in serverSettings) {
|
||||||
|
editorApp.set(eOption, serverSettings[eOption]);
|
||||||
}
|
}
|
||||||
editorApp.get("/",ensureRuntimeStarted,ui.ensureSlash,ui.editor);
|
editorApp.get("/",ensureRuntimeStarted,ui.ensureSlash,ui.editor);
|
||||||
|
|
||||||
@@ -75,14 +76,16 @@ module.exports = {
|
|||||||
editorApp.get("/icons/:module/:icon",ui.icon);
|
editorApp.get("/icons/:module/:icon",ui.icon);
|
||||||
editorApp.get("/icons/:scope/:module/:icon",ui.icon);
|
editorApp.get("/icons/:scope/:module/:icon",ui.icon);
|
||||||
|
|
||||||
|
editorApp.get(/^\/resources\/((?:@[^\/]+\/)?[^\/]+)\/(.+)$/,ui.moduleResource);
|
||||||
|
|
||||||
var theme = require("./theme");
|
var theme = require("./theme");
|
||||||
theme.init(settings);
|
theme.init(settings, runtimeAPI);
|
||||||
editorApp.use("/theme",theme.app());
|
editorApp.use("/theme",theme.app());
|
||||||
editorApp.use("/",ui.editorResources);
|
editorApp.use("/",ui.editorResources);
|
||||||
|
|
||||||
//Projects
|
//Projects
|
||||||
var projects = require("./projects");
|
var projects = require("./projects");
|
||||||
projects.init(runtimeAPI);
|
projects.init(settings, runtimeAPI);
|
||||||
editorApp.use("/projects",projects.app());
|
editorApp.use("/projects",projects.app());
|
||||||
|
|
||||||
// Locales
|
// Locales
|
||||||
@@ -93,6 +96,7 @@ module.exports = {
|
|||||||
// Library
|
// Library
|
||||||
var library = require("./library");
|
var library = require("./library");
|
||||||
library.init(runtimeAPI);
|
library.init(runtimeAPI);
|
||||||
|
// editorApp.get("/library/:id",needsPermission("library.read"),library.getLibraryConfig);
|
||||||
editorApp.get(/^\/library\/([^\/]+)\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry);
|
editorApp.get(/^\/library\/([^\/]+)\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry);
|
||||||
editorApp.post(/^\/library\/([^\/]+)\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry);
|
editorApp.post(/^\/library\/([^\/]+)\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry);
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,6 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
var apiUtils = require("../util");
|
var apiUtils = require("../util");
|
||||||
var fs = require('fs');
|
|
||||||
var fspath = require('path');
|
|
||||||
var when = require('when');
|
|
||||||
|
|
||||||
var runtimeAPI;
|
var runtimeAPI;
|
||||||
|
|
||||||
@@ -25,6 +22,17 @@ module.exports = {
|
|||||||
init: function(_runtimeAPI) {
|
init: function(_runtimeAPI) {
|
||||||
runtimeAPI = _runtimeAPI;
|
runtimeAPI = _runtimeAPI;
|
||||||
},
|
},
|
||||||
|
// getLibraryConfig: function(req,res) {
|
||||||
|
// var opts = {
|
||||||
|
// user: req.user,
|
||||||
|
// library: req.params.id
|
||||||
|
// }
|
||||||
|
// runtimeAPI.library.getConfig(opts).then(function(result) {
|
||||||
|
// res.json(result);
|
||||||
|
// }).catch(function(err) {
|
||||||
|
// apiUtils.rejectHandler(req,res,err);
|
||||||
|
// });
|
||||||
|
// },
|
||||||
getEntry: function(req,res) {
|
getEntry: function(req,res) {
|
||||||
var opts = {
|
var opts = {
|
||||||
user: req.user,
|
user: req.user,
|
||||||
|
|||||||
@@ -13,9 +13,6 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
// var apiUtil = require('../util');
|
|
||||||
|
|
||||||
var i18n = require("@node-red/util").i18n; // TODO: separate module
|
var i18n = require("@node-red/util").i18n; // TODO: separate module
|
||||||
|
|
||||||
@@ -48,9 +45,10 @@ module.exports = {
|
|||||||
var prevLang = i18n.i.language;
|
var prevLang = i18n.i.language;
|
||||||
// Trigger a load from disk of the language if it is not the default
|
// Trigger a load from disk of the language if it is not the default
|
||||||
i18n.i.changeLanguage(lang, function(){
|
i18n.i.changeLanguage(lang, function(){
|
||||||
|
i18n.i.changeLanguage(prevLang, function() {
|
||||||
var catalog = loadResource(lang, namespace);
|
var catalog = loadResource(lang, namespace);
|
||||||
res.json(catalog||{});
|
res.json(catalog||{});
|
||||||
});
|
});
|
||||||
i18n.i.changeLanguage(prevLang);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var express = require("express");
|
|
||||||
var apiUtils = require("../util");
|
var apiUtils = require("../util");
|
||||||
|
|
||||||
|
var settings;
|
||||||
var runtimeAPI;
|
var runtimeAPI;
|
||||||
var needsPermission = require("../auth").needsPermission;
|
var needsPermission = require("../auth").needsPermission;
|
||||||
|
|
||||||
@@ -77,11 +77,12 @@ function getProjectRemotes(req,res) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: function(_runtimeAPI) {
|
init: function(_settings, _runtimeAPI) {
|
||||||
|
settings = _settings;
|
||||||
runtimeAPI = _runtimeAPI;
|
runtimeAPI = _runtimeAPI;
|
||||||
},
|
},
|
||||||
app: function() {
|
app: function() {
|
||||||
var app = express();
|
var app = apiUtils.createExpressApp(settings)
|
||||||
|
|
||||||
app.use(function(req,res,next) {
|
app.use(function(req,res,next) {
|
||||||
runtimeAPI.projects.available().then(function(available) {
|
runtimeAPI.projects.available().then(function(available) {
|
||||||
@@ -122,6 +123,7 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (req.body.active) {
|
if (req.body.active) {
|
||||||
|
opts.clearContext = req.body.hasOwnProperty('clearContext')?req.body.clearContext:true
|
||||||
runtimeAPI.projects.setActiveProject(opts).then(function() {
|
runtimeAPI.projects.setActiveProject(opts).then(function() {
|
||||||
listProjects(req,res);
|
listProjects(req,res);
|
||||||
}).catch(function(err) {
|
}).catch(function(err) {
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ var runtimeAPI;
|
|||||||
var sshkeys = require("./sshkeys");
|
var sshkeys = require("./sshkeys");
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: function(_runtimeAPI) {
|
init: function(settings, _runtimeAPI) {
|
||||||
runtimeAPI = _runtimeAPI;
|
runtimeAPI = _runtimeAPI;
|
||||||
sshkeys.init(runtimeAPI);
|
sshkeys.init(settings, runtimeAPI);
|
||||||
},
|
},
|
||||||
userSettings: function(req, res) {
|
userSettings: function(req, res) {
|
||||||
var opts = {
|
var opts = {
|
||||||
|
|||||||
@@ -15,23 +15,16 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
var apiUtils = require("../util");
|
var apiUtils = require("../util");
|
||||||
var express = require("express");
|
|
||||||
var runtimeAPI;
|
var runtimeAPI;
|
||||||
|
var settings;
|
||||||
function getUsername(userObj) {
|
|
||||||
var username = '__default';
|
|
||||||
if ( userObj && userObj.name ) {
|
|
||||||
username = userObj.name;
|
|
||||||
}
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: function(_runtimeAPI) {
|
init: function(_settings, _runtimeAPI) {
|
||||||
runtimeAPI = _runtimeAPI;
|
runtimeAPI = _runtimeAPI;
|
||||||
|
settings = _settings;
|
||||||
},
|
},
|
||||||
app: function() {
|
app: function() {
|
||||||
var app = express();
|
const app = apiUtils.createExpressApp(settings);
|
||||||
|
|
||||||
// List all SSH keys
|
// List all SSH keys
|
||||||
app.get("/", function(req,res) {
|
app.get("/", function(req,res) {
|
||||||
|
|||||||
@@ -14,33 +14,41 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var express = require("express");
|
|
||||||
var util = require("util");
|
var util = require("util");
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
var clone = require("clone");
|
var clone = require("clone");
|
||||||
|
const apiUtil = require("../util")
|
||||||
|
|
||||||
var defaultContext = {
|
var defaultContext = {
|
||||||
page: {
|
page: {
|
||||||
title: "Node-RED",
|
title: "Node-RED",
|
||||||
favicon: "favicon.ico",
|
favicon: "favicon.ico",
|
||||||
tabicon: "red/images/node-red-icon-black.svg"
|
tabicon: {
|
||||||
|
icon: "red/images/node-red-icon-black.svg",
|
||||||
|
colour: "#8f0000"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
header: {
|
header: {
|
||||||
title: "Node-RED",
|
title: "Node-RED",
|
||||||
image: "red/images/node-red.svg"
|
image: "red/images/node-red.svg"
|
||||||
},
|
},
|
||||||
asset: {
|
asset: {
|
||||||
red: (process.env.NODE_ENV == "development")? "red/red.js":"red/red.min.js",
|
red: "red/red.min.js",
|
||||||
main: (process.env.NODE_ENV == "development")? "red/main.js":"red/main.min.js",
|
main: "red/main.min.js",
|
||||||
|
vendorMonaco: ""
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
var settings;
|
||||||
|
|
||||||
var theme = null;
|
var theme = null;
|
||||||
var themeContext = clone(defaultContext);
|
var themeContext = clone(defaultContext);
|
||||||
var themeSettings = null;
|
var themeSettings = null;
|
||||||
|
|
||||||
|
var activeTheme = null;
|
||||||
|
var activeThemeInitialised = false;
|
||||||
|
|
||||||
|
var runtimeAPI;
|
||||||
var themeApp;
|
var themeApp;
|
||||||
|
|
||||||
function serveFile(app,baseUrl,file) {
|
function serveFile(app,baseUrl,file) {
|
||||||
@@ -58,7 +66,7 @@ function serveFile(app,baseUrl,file) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function serveFilesFromTheme(themeValue, themeApp, directory) {
|
function serveFilesFromTheme(themeValue, themeApp, directory, baseDirectory) {
|
||||||
var result = [];
|
var result = [];
|
||||||
if (themeValue) {
|
if (themeValue) {
|
||||||
var array = themeValue;
|
var array = themeValue;
|
||||||
@@ -67,7 +75,14 @@ function serveFilesFromTheme(themeValue, themeApp, directory) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (var i=0;i<array.length;i++) {
|
for (var i=0;i<array.length;i++) {
|
||||||
var url = serveFile(themeApp,directory,array[i]);
|
let fullPath = array[i];
|
||||||
|
if (baseDirectory) {
|
||||||
|
fullPath = path.resolve(baseDirectory,array[i]);
|
||||||
|
if (fullPath.indexOf(path.resolve(baseDirectory)) !== 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var url = serveFile(themeApp,directory,fullPath);
|
||||||
if (url) {
|
if (url) {
|
||||||
result.push(url);
|
result.push(url);
|
||||||
}
|
}
|
||||||
@@ -77,10 +92,21 @@ function serveFilesFromTheme(themeValue, themeApp, directory) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: function(settings) {
|
init: function(_settings, _runtimeAPI) {
|
||||||
|
settings = _settings;
|
||||||
|
runtimeAPI = _runtimeAPI;
|
||||||
themeContext = clone(defaultContext);
|
themeContext = clone(defaultContext);
|
||||||
|
if (process.env.NODE_ENV == "development") {
|
||||||
|
themeContext.asset.red = "red/red.js";
|
||||||
|
themeContext.asset.main = "red/main.js";
|
||||||
|
}
|
||||||
themeSettings = null;
|
themeSettings = null;
|
||||||
theme = settings.editorTheme || {};
|
theme = settings.editorTheme || {};
|
||||||
|
themeContext.asset.vendorMonaco = "vendor/monaco/monaco-bootstrap.js"
|
||||||
|
if (theme.codeEditor && theme.codeEditor.lib === 'ace') {
|
||||||
|
themeContext.asset.vendorMonaco = ''
|
||||||
|
}
|
||||||
|
activeTheme = theme.theme;
|
||||||
},
|
},
|
||||||
|
|
||||||
app: function() {
|
app: function() {
|
||||||
@@ -88,7 +114,15 @@ module.exports = {
|
|||||||
var url;
|
var url;
|
||||||
themeSettings = {};
|
themeSettings = {};
|
||||||
|
|
||||||
themeApp = express();
|
themeApp = apiUtil.createExpressApp(settings);
|
||||||
|
|
||||||
|
const defaultServerSettings = {
|
||||||
|
"x-powered-by": false
|
||||||
|
}
|
||||||
|
const serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{});
|
||||||
|
for (const eOption in serverSettings) {
|
||||||
|
themeApp.set(eOption, serverSettings[eOption]);
|
||||||
|
}
|
||||||
|
|
||||||
if (theme.page) {
|
if (theme.page) {
|
||||||
|
|
||||||
@@ -109,13 +143,25 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (theme.page.tabicon) {
|
if (theme.page.tabicon) {
|
||||||
url = serveFile(themeApp,"/tabicon/",theme.page.tabicon)
|
let icon = theme.page.tabicon.icon || theme.page.tabicon
|
||||||
|
url = serveFile(themeApp,"/tabicon/", icon)
|
||||||
if (url) {
|
if (url) {
|
||||||
themeContext.page.tabicon = url;
|
themeContext.page.tabicon.icon = url;
|
||||||
|
}
|
||||||
|
if (theme.page.tabicon.colour) {
|
||||||
|
themeContext.page.tabicon.colour = theme.page.tabicon.colour
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
themeContext.page.title = theme.page.title || themeContext.page.title;
|
themeContext.page.title = theme.page.title || themeContext.page.title;
|
||||||
|
|
||||||
|
// Store the resolved urls to these resources so nodes (such as Debug)
|
||||||
|
// can access them
|
||||||
|
theme.page._ = {
|
||||||
|
css: themeContext.page.css,
|
||||||
|
scripts: themeContext.page.scripts,
|
||||||
|
favicon: themeContext.page.favicon
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (theme.header) {
|
if (theme.header) {
|
||||||
@@ -169,7 +215,9 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
themeApp.get("/", function(req,res) {
|
themeApp.get("/", async function(req,res) {
|
||||||
|
const themePluginList = await runtimeAPI.plugins.getPluginsByType({type:"node-red-theme"});
|
||||||
|
themeContext.themes = themePluginList.map(theme => theme.id);
|
||||||
res.json(themeContext);
|
res.json(themeContext);
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -185,10 +233,116 @@ module.exports = {
|
|||||||
themeSettings.projects = theme.projects;
|
themeSettings.projects = theme.projects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (theme.hasOwnProperty("keymap")) {
|
||||||
|
themeSettings.keymap = theme.keymap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theme.theme) {
|
||||||
|
themeSettings.theme = theme.theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theme.hasOwnProperty("tours")) {
|
||||||
|
themeSettings.tours = theme.tours;
|
||||||
|
}
|
||||||
|
|
||||||
return themeApp;
|
return themeApp;
|
||||||
},
|
},
|
||||||
context: function() {
|
context: async function() {
|
||||||
|
if (activeTheme && !activeThemeInitialised) {
|
||||||
|
const themePlugin = await runtimeAPI.plugins.getPlugin({
|
||||||
|
id:activeTheme
|
||||||
|
});
|
||||||
|
if (themePlugin) {
|
||||||
|
if (themePlugin.css) {
|
||||||
|
const cssFiles = serveFilesFromTheme(
|
||||||
|
themePlugin.css,
|
||||||
|
themeApp,
|
||||||
|
"/css/",
|
||||||
|
themePlugin.path
|
||||||
|
);
|
||||||
|
themeContext.page.css = cssFiles.concat(themeContext.page.css || [])
|
||||||
|
theme.page = theme.page || {_:{}}
|
||||||
|
theme.page._.css = cssFiles.concat(theme.page._.css || [])
|
||||||
|
}
|
||||||
|
if (themePlugin.scripts) {
|
||||||
|
const scriptFiles = serveFilesFromTheme(
|
||||||
|
themePlugin.scripts,
|
||||||
|
themeApp,
|
||||||
|
"/scripts/",
|
||||||
|
themePlugin.path
|
||||||
|
)
|
||||||
|
themeContext.page.scripts = scriptFiles.concat(themeContext.page.scripts || [])
|
||||||
|
theme.page = theme.page || {_:{}}
|
||||||
|
theme.page._.scripts = scriptFiles.concat(theme.page._.scripts || [])
|
||||||
|
}
|
||||||
|
// check and load page settings from theme
|
||||||
|
if (themePlugin.page) {
|
||||||
|
if (themePlugin.page.favicon && !theme.page.favicon) {
|
||||||
|
const result = serveFilesFromTheme(
|
||||||
|
[themePlugin.page.favicon],
|
||||||
|
themeApp,
|
||||||
|
"/",
|
||||||
|
themePlugin.path
|
||||||
|
)
|
||||||
|
if(result && result.length > 0) {
|
||||||
|
// update themeContext page favicon
|
||||||
|
themeContext.page.favicon = result[0]
|
||||||
|
theme.page = theme.page || {_:{}}
|
||||||
|
theme.page._.favicon = result[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (themePlugin.page.tabicon && themePlugin.page.tabicon.icon && !theme.page.tabicon) {
|
||||||
|
const result = serveFilesFromTheme(
|
||||||
|
[themePlugin.page.tabicon.icon],
|
||||||
|
themeApp,
|
||||||
|
"/page/",
|
||||||
|
themePlugin.path
|
||||||
|
)
|
||||||
|
if(result && result.length > 0) {
|
||||||
|
// update themeContext page tabicon
|
||||||
|
themeContext.page.tabicon.icon = result[0]
|
||||||
|
themeContext.page.tabicon.colour = themeContext.page.tabicon.colour || themeContext.page.tabicon.colour
|
||||||
|
theme.page = theme.page || {_:{}}
|
||||||
|
theme.page._.tabicon = theme.page._.tabicon || {}
|
||||||
|
theme.page._.tabicon.icon = themeContext.page.tabicon.icon
|
||||||
|
theme.page._.tabicon.colour = themeContext.page.tabicon.colour
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if the plugin has a title AND the users settings.js does NOT
|
||||||
|
if (themePlugin.page.title && !theme.page.title) {
|
||||||
|
themeContext.page.title = themePlugin.page.title || themeContext.page.title
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check and load header settings from theme
|
||||||
|
if (themePlugin.header) {
|
||||||
|
if (themePlugin.header.image && !theme.header.image) {
|
||||||
|
const result = serveFilesFromTheme(
|
||||||
|
[themePlugin.header.image],
|
||||||
|
themeApp,
|
||||||
|
"/header/",
|
||||||
|
themePlugin.path
|
||||||
|
)
|
||||||
|
if(result && result.length > 0) {
|
||||||
|
// update themeContext header image
|
||||||
|
themeContext.header.image = result[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if the plugin has a title AND the users settings.js does NOT have a title
|
||||||
|
if (themePlugin.header.title && !theme.header.title) {
|
||||||
|
themeContext.header.title = themePlugin.header.title || themeContext.header.title
|
||||||
|
}
|
||||||
|
// if the plugin has a header url AND the users settings.js does NOT
|
||||||
|
if (themePlugin.header.url && !theme.header.url) {
|
||||||
|
themeContext.header.url = themePlugin.header.url || themeContext.header.url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
theme.codeEditor = theme.codeEditor || {}
|
||||||
|
theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options);
|
||||||
|
|
||||||
|
theme.mermaid = Object.assign({}, themePlugin.mermaid, theme.mermaid)
|
||||||
|
}
|
||||||
|
activeThemeInitialised = true;
|
||||||
|
}
|
||||||
return themeContext;
|
return themeContext;
|
||||||
},
|
},
|
||||||
settings: function() {
|
settings: function() {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
* 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.
|
||||||
**/
|
**/
|
||||||
|
const crypto = require('crypto')
|
||||||
var express = require('express');
|
var express = require('express');
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
@@ -24,13 +25,16 @@ var apiUtils = require("../util");
|
|||||||
var theme = require("./theme");
|
var theme = require("./theme");
|
||||||
|
|
||||||
var runtimeAPI;
|
var runtimeAPI;
|
||||||
|
let settings;
|
||||||
var editorClientDir = path.dirname(require.resolve("@node-red/editor-client"));
|
var editorClientDir = path.dirname(require.resolve("@node-red/editor-client"));
|
||||||
var defaultNodeIcon = path.join(editorClientDir,"public","red","images","icons","arrow-in.svg");
|
var defaultNodeIcon = path.join(editorClientDir,"public","red","images","icons","arrow-in.svg");
|
||||||
var editorTemplatePath = path.join(editorClientDir,"templates","index.mst");
|
var editorTemplatePath = path.join(editorClientDir,"templates","index.mst");
|
||||||
var editorTemplate;
|
var editorTemplate;
|
||||||
|
let cacheBuster
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: function(_runtimeAPI) {
|
init: function(_settings, _runtimeAPI) {
|
||||||
|
settings = _settings;
|
||||||
runtimeAPI = _runtimeAPI;
|
runtimeAPI = _runtimeAPI;
|
||||||
editorTemplate = fs.readFileSync(editorTemplatePath,"utf8");
|
editorTemplate = fs.readFileSync(editorTemplatePath,"utf8");
|
||||||
Mustache.parse(editorTemplate);
|
Mustache.parse(editorTemplate);
|
||||||
@@ -68,8 +72,46 @@ module.exports = {
|
|||||||
apiUtils.rejectHandler(req,res,err);
|
apiUtils.rejectHandler(req,res,err);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
editor: function(req,res) {
|
|
||||||
res.send(Mustache.render(editorTemplate,theme.context()));
|
moduleResource: function(req, res) {
|
||||||
|
let resourcePath = req.params[1];
|
||||||
|
let opts = {
|
||||||
|
user: req.user,
|
||||||
|
module: req.params[0],
|
||||||
|
path: resourcePath
|
||||||
|
}
|
||||||
|
runtimeAPI.nodes.getModuleResource(opts).then(function(data) {
|
||||||
|
if (data) {
|
||||||
|
var contentType = mime.getType(resourcePath);
|
||||||
|
res.set("Content-Type", contentType);
|
||||||
|
res.send(data);
|
||||||
|
} else {
|
||||||
|
res.status(404).end()
|
||||||
|
}
|
||||||
|
}).catch(function(err) {
|
||||||
|
console.log(err.stack);
|
||||||
|
apiUtils.rejectHandler(req,res,err);
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
editor: async function(req,res) {
|
||||||
|
if (!cacheBuster) {
|
||||||
|
// settings.instanceId is set asynchronously to the editor-api
|
||||||
|
// being initiaised. So we defer calculating the cacheBuster hash
|
||||||
|
// until the first load of the editor
|
||||||
|
cacheBuster = crypto.createHash('sha1').update(`${settings.version || 'version'}-${settings.instanceId || 'instanceId'}`).digest("hex").substring(0,12)
|
||||||
|
}
|
||||||
|
|
||||||
|
let sessionMessages;
|
||||||
|
if (req.session && req.session.messages) {
|
||||||
|
sessionMessages = JSON.stringify(req.session.messages);
|
||||||
|
delete req.session.messages
|
||||||
|
}
|
||||||
|
res.send(Mustache.render(editorTemplate,{
|
||||||
|
sessionMessages,
|
||||||
|
cacheBuster,
|
||||||
|
...await theme.context()
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
editorResources: express.static(path.join(editorClientDir,'public'))
|
editorResources: express.static(path.join(editorClientDir,'public'))
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,12 +24,8 @@
|
|||||||
* @namespace @node-red/editor-api
|
* @namespace @node-red/editor-api
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var express = require("express");
|
|
||||||
var bodyParser = require("body-parser");
|
var bodyParser = require("body-parser");
|
||||||
var util = require('util');
|
|
||||||
var passport = require('passport');
|
var passport = require('passport');
|
||||||
var when = require('when');
|
|
||||||
var cors = require('cors');
|
|
||||||
|
|
||||||
var auth = require("./auth");
|
var auth = require("./auth");
|
||||||
var apiUtil = require("./util");
|
var apiUtil = require("./util");
|
||||||
@@ -38,7 +34,6 @@ var adminApp;
|
|||||||
var server;
|
var server;
|
||||||
var editor;
|
var editor;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialise the module.
|
* Initialise the module.
|
||||||
* @param {Object} settings The runtime settings
|
* @param {Object} settings The runtime settings
|
||||||
@@ -50,7 +45,7 @@ var editor;
|
|||||||
function init(settings,_server,storage,runtimeAPI) {
|
function init(settings,_server,storage,runtimeAPI) {
|
||||||
server = _server;
|
server = _server;
|
||||||
if (settings.httpAdminRoot !== false) {
|
if (settings.httpAdminRoot !== false) {
|
||||||
adminApp = express();
|
adminApp = apiUtil.createExpressApp(settings);
|
||||||
|
|
||||||
var cors = require('cors');
|
var cors = require('cors');
|
||||||
var corsHandler = cors({
|
var corsHandler = cors({
|
||||||
@@ -60,8 +55,8 @@ function init(settings,_server,storage,runtimeAPI) {
|
|||||||
adminApp.use(corsHandler);
|
adminApp.use(corsHandler);
|
||||||
|
|
||||||
if (settings.httpAdminMiddleware) {
|
if (settings.httpAdminMiddleware) {
|
||||||
if (typeof settings.httpAdminMiddleware === "function") {
|
if (typeof settings.httpAdminMiddleware === "function" || Array.isArray(settings.httpAdminMiddleware)) {
|
||||||
adminApp.use(settings.httpAdminMiddleware)
|
adminApp.use(settings.httpAdminMiddleware);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,6 +78,8 @@ function init(settings,_server,storage,runtimeAPI) {
|
|||||||
auth.getToken,
|
auth.getToken,
|
||||||
auth.errorHandler
|
auth.errorHandler
|
||||||
);
|
);
|
||||||
|
} else if (settings.adminAuth.tokens) {
|
||||||
|
adminApp.use(passport.initialize());
|
||||||
}
|
}
|
||||||
adminApp.post("/auth/revoke",auth.needsPermission(""),auth.revoke,apiUtil.errorHandler);
|
adminApp.post("/auth/revoke",auth.needsPermission(""),auth.revoke,apiUtil.errorHandler);
|
||||||
}
|
}
|
||||||
@@ -111,11 +108,9 @@ function init(settings,_server,storage,runtimeAPI) {
|
|||||||
* @return {Promise} resolves when the application is ready to handle requests
|
* @return {Promise} resolves when the application is ready to handle requests
|
||||||
* @memberof @node-red/editor-api
|
* @memberof @node-red/editor-api
|
||||||
*/
|
*/
|
||||||
function start() {
|
async function start() {
|
||||||
if (editor) {
|
if (editor) {
|
||||||
return editor.start();
|
return editor.start();
|
||||||
} else {
|
|
||||||
return when.resolve();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,16 +119,16 @@ function start() {
|
|||||||
* @return {Promise} resolves when the application is stopped
|
* @return {Promise} resolves when the application is stopped
|
||||||
* @memberof @node-red/editor-api
|
* @memberof @node-red/editor-api
|
||||||
*/
|
*/
|
||||||
function stop() {
|
async function stop() {
|
||||||
if (editor) {
|
if (editor) {
|
||||||
editor.stop();
|
editor.stop();
|
||||||
}
|
}
|
||||||
return when.resolve();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: init,
|
init,
|
||||||
start: start,
|
start,
|
||||||
stop: stop,
|
stop,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @memberof @node-red/editor-api
|
* @memberof @node-red/editor-api
|
||||||
|
|||||||
@@ -14,10 +14,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
const express = require("express");
|
||||||
|
|
||||||
var log = require("@node-red/util").log; // TODO: separate module
|
const { log, i18n } = require("@node-red/util");
|
||||||
var i18n = require("@node-red/util").i18n; // TODO: separate module
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
errorHandler: function(err,req,res,next) {
|
errorHandler: function(err,req,res,next) {
|
||||||
@@ -64,5 +63,17 @@ module.exports = {
|
|||||||
path: req.path,
|
path: req.path,
|
||||||
ip: (req.headers && req.headers['x-forwarded-for']) || (req.connection && req.connection.remoteAddress) || undefined
|
ip: (req.headers && req.headers['x-forwarded-for']) || (req.connection && req.connection.remoteAddress) || undefined
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
createExpressApp: function(settings) {
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
const defaultServerSettings = {
|
||||||
|
"x-powered-by": false
|
||||||
|
}
|
||||||
|
const serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{});
|
||||||
|
for (let eOption in serverSettings) {
|
||||||
|
app.set(eOption, serverSettings[eOption]);
|
||||||
|
}
|
||||||
|
return app
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@node-red/editor-api",
|
"name": "@node-red/editor-api",
|
||||||
"version": "1.2.9",
|
"version": "3.1.15",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"main": "./lib/index.js",
|
"main": "./lib/index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -16,26 +16,25 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@node-red/util": "1.2.9",
|
"@node-red/util": "3.1.15",
|
||||||
"@node-red/editor-client": "1.2.9",
|
"@node-red/editor-client": "3.1.15",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"body-parser": "1.19.0",
|
"body-parser": "1.20.3",
|
||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"express-session": "1.17.1",
|
"express-session": "1.18.1",
|
||||||
"express": "4.17.1",
|
"express": "4.21.2",
|
||||||
"memorystore": "1.6.4",
|
"memorystore": "1.6.7",
|
||||||
"mime": "2.4.7",
|
"mime": "3.0.0",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.5-lts.1",
|
||||||
"mustache": "4.1.0",
|
"mustache": "4.2.0",
|
||||||
"oauth2orize": "1.11.0",
|
"oauth2orize": "1.11.1",
|
||||||
"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",
|
||||||
"passport": "0.4.1",
|
"passport": "0.6.0",
|
||||||
"when": "3.7.8",
|
"ws": "7.5.10"
|
||||||
"ws": "6.2.1"
|
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"bcrypt": "3.0.6"
|
"bcrypt": "5.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright JS Foundation and other contributors, http://js.foundation
|
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
|
||||||
|
|
||||||
Apache License
|
Apache License
|
||||||
Version 2.0, January 2004
|
Version 2.0, January 2004
|
||||||
|
|||||||
1105
packages/node_modules/@node-red/editor-client/locales/de/editor.json
vendored
Executable file → Normal file
1105
packages/node_modules/@node-red/editor-client/locales/de/editor.json
vendored
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
38
packages/node_modules/@node-red/editor-client/locales/de/infotips.json
vendored
Executable file → Normal file
38
packages/node_modules/@node-red/editor-client/locales/de/infotips.json
vendored
Executable file → Normal file
@@ -1,23 +1,23 @@
|
|||||||
{
|
{
|
||||||
"info": {
|
"info": {
|
||||||
"tip0" : "Sie können die ausgewählten Nodes oder Verbindungen mit {{ core:delete-selection }} entfernen.",
|
"tip0": "Sie können die ausgewählten Nodes oder Verbindungen mit {{ core:delete-selection }} entfernen",
|
||||||
"tip1" : "Suche nach Nodes mit {{ core:search }}",
|
"tip1": "Sie können nach Nodes mit {{ core:search }} suchen",
|
||||||
"tip2" : "{{ core:toggle-sidebar }} schaltet die Ansicht dieser Seitenleiste ein.",
|
"tip2": "{{ core:toggle-sidebar }} blendet die Seitenleiste ein/aus",
|
||||||
"tip3" : "Sie können Ihre Palette von Nodes mit {{ core:manage-palette }} verwalten.",
|
"tip3": "Sie können Ihre Node-Palette mit {{ core:manage-palette }} verwalten",
|
||||||
"tip4" : "Ihre Flow-Konfigurations-Nodes werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.",
|
"tip4": "Ihre Flow-Konfigurationsnodes werden in der Seitenleiste angezeigt, die über das Menü oder mit {{ core:show-config-tab }} angezeigt werden kann",
|
||||||
"tip5" : "Aktiviert oder inaktiviert diese Tipps von der Option in den Einstellungen",
|
"tip5": "Aktiviere oder deaktiviere diese Tipps in den Einstellungen im Tab 'Ansicht'",
|
||||||
"tip6" : "Verschieben Sie die ausgewählten Nodes mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben",
|
"tip6": "Sie können die ausgewählten Nodes mit den [left]/[up]/[down]/[right]-Tasten verschieben. Wenn Sie dabei [Shift] gedrückt halten, können Sie den Fensterausschnitt verschieben.",
|
||||||
"tip7" : "Wenn Sie einen Node auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.",
|
"tip7": "Wenn Sie ein Node auf eine Verbindung ziehen, wird es in die Verbindung eingefügt",
|
||||||
"tip8" : "Die ausgewählten Nodes exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}",
|
"tip8": "Sie können die ausgewählten Nodes oder den aktuellen Flow-Tab mit {{ core:show-export-dialog }} exportieren",
|
||||||
"tip9" : "Importieren Sie einen Flow, indem Sie sein JSON in den Editor ziehen oder mit {{ core:show-import-dialog }}.",
|
"tip9": "Sie können einen Flow importieren, indem Sie sein JSON in den Editor ziehen oder mittels {{ core:show-import-dialog }}",
|
||||||
"tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Node-Anschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.",
|
"tip10": "Halten Sie [Shift] beim [Klicken] auf ein Node gedrückt, um auch alle verbundenen Nodes mit zu verschieben",
|
||||||
"tip11" : "Die Registerkarte \"Info\" mit {{ core:show-info-tab }} oder der Registerkarte \"Debug\" mit {{ core:show-debug-tab }} anzeigen",
|
"tip11": "Sie können den Tab 'Info' mit {{ core:show-info-tab }} oder den Tab 'Debug' mit {{ core:show-debug-tab }} anzeigen lassen",
|
||||||
"tip12" : "[ctrl] [Klicken] in den Arbeitsbereich, um den Schnellhinzufügedialog zu öffnen.",
|
"tip12": "Halten Sie [Strg] beim [Klicken] in den Arbeitsbereich gedrückt, um den Schnellhinzufügedialog öffnen",
|
||||||
"tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Node-Anschluss klicken, um eine Schnellverbindung zu aktivieren.",
|
"tip13": "Halten Sie [Strg] beim [Klicken] auf einen Node-Anschluss gedrückt, um eine Verbindung nur durch kurzes [Klicken] (ohne Halten) zu verlegen",
|
||||||
"tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Node klicken, um auch alle verbundenen Nodes auszuwählen.",
|
"tip14": "Halten Sie [Shift] beim [Klicken] auf ein Node gedrückt, um auch alle verbundenen Nodes mit auszuwählen",
|
||||||
"tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Node klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.",
|
"tip15": "Halten Sie [Strg] beim [Klicken] auf ein Node gedrückt, um es zu der aktuellen Auswahl hinzuzufügen oder aus ihr zu entfernen",
|
||||||
"tip16" : "Indexzungen wechseln mit {{ core:show-previous-tab }} und {{ core:show-next-tab }}",
|
"tip16": "Sie können die Flow-Tabs mit {{ core:show-previous-tab }} und {{ core:show-next-tab }} wechseln",
|
||||||
"tip17" : "Sie können die Änderungen im Editierrahmen des Nodes mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.",
|
"tip17": "Sie können die Änderungen im Node-Editor mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} verwerfen",
|
||||||
"tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Node in der aktuellen Auswahl bearbeitet."
|
"tip18": "Sie können mit {{ core:edit-selected-node }} den ersten Node in der aktuellen Auswahl bearbeiten"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
234
packages/node_modules/@node-red/editor-client/locales/de/jsonata.json
vendored
Executable file → Normal file
234
packages/node_modules/@node-red/editor-client/locales/de/jsonata.json
vendored
Executable file → Normal file
@@ -1,95 +1,95 @@
|
|||||||
{
|
{
|
||||||
"$string": {
|
"$string": {
|
||||||
"args" : "arg",
|
"args": "arg[, prettify]",
|
||||||
"desc" : "Transformiert den Parameter *arg* in eine Zeichenfolge mit den folgenden Transformationsregeln:\n\n -Zeichenfolgen bleiben unverändert\n -Funktionen werden in eine leere Zeichenfolge konvertiert\n -Numerische Unendlichkeit und NaN lösen einen Fehler aus, da sie nicht als JSON-Nummer dargestellt werden können.\n -Alle anderen Werte werden mit Hilfe der Funktion 'JSON.stringify' in eine JSON-Zeichenfolge konvertiert."
|
"desc": "Wandelt `arg` in eine Zeichenfolge um gemäß der folgenden Regeln:\n\n- Zeichenfolgen (string) bleiben unverändert\n- Funktionen werden in eine leere Zeichenfolge konvertiert\n- Numerische Unendlichkeit und NaN lösen einen Fehler aus, da sie nicht als JSON-Zahlenwert dargestellt werden können.\n- Alle anderen Werte werden mit Hilfe der Funktion `JSON.stringify` in eine JSON-Zeichenfolge konvertiert. Wenn `prettify` `true` ist, wird \"prettified\" JSON erzeugt. Z.B. Eine Zeile pro Feld und Zeilen werden eingeschoben basierend auf der Feldtiefe."
|
||||||
},
|
},
|
||||||
"$length": {
|
"$length": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc" : "Gibt die Anzahl der Zeichen in der Zeichenfolge `str` zurück. Es wird ein Fehler ausgelöst, wenn `str` keine Zeichenfolge ist."
|
"desc": "Gibt die Zeichenanzahl von `str` zurück. Es wird ein Fehler ausgelöst, wenn `str` keine Zeichenfolge ist."
|
||||||
},
|
},
|
||||||
"$substring": {
|
"$substring": {
|
||||||
"args" : "str, start [, länge]",
|
"args": "str, start [, length]",
|
||||||
"desc" : "Gibt eine Zeichenfolge zurück, die die Zeichen im ersten Parameter `str` beginnend bei Position `start` (Null-Offset) enthält. Wenn \"length\" angegeben ist, enthält die Unterzeichenfolge maximal \"Länge\" Zeichen. Wenn `start` negativ ist, gibt es die Anzahl der Zeichen am Ende von `str` an."
|
"desc": "Gibt eine Teilzeichenfolge zurück, die die Zeichen in `str` beginnend bei Position `start` (Null-Offset) enthält. Wenn `length` vorgegeben ist, enthält die rückgegebene Zeichenfolge maximal die in `length` vorgegebene Zeichenanzahl. Wenn `start` negativ ist, werden die Zeichen vom Ende aus gezählt von `str` zurückgegeben."
|
||||||
},
|
},
|
||||||
"$substringBefore": {
|
"$substringBefore": {
|
||||||
"args": "str, chars",
|
"args": "str, chars",
|
||||||
"desc" : "Gibt die Unterzeichenfolge vor dem ersten Auftreten der Zeichenfolge `chars` in `str` zurück. Falls `str` nicht `chars` enthält, gibt es `str` zurück."
|
"desc": "Gibt die Teilzeichenfolge vor dem ersten Auftreten der Zeichenfolge `chars` in `str` zurück. Falls `str` nicht `chars` enthält, wird `str` zurückgegeben."
|
||||||
},
|
},
|
||||||
"$substringAfter": {
|
"$substringAfter": {
|
||||||
"args": "str, chars",
|
"args": "str, chars",
|
||||||
"desc" : "Gibt die Unterzeichenfolge nach dem ersten Auftreten der Zeichenfolge `chars` in `str` zurück. Falls `str` nicht `chars` enthält, gibt es `str` zurück."
|
"desc": "Gibt die Teilzeichenfolge nach dem ersten Auftreten der Zeichenfolge `chars` in `str` zurück. Falls `str` nicht `chars` enthält, wird `str` zurückgegeben."
|
||||||
},
|
},
|
||||||
"$uppercase": {
|
"$uppercase": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc" : "Gibt eine Zeichenfolge mit allen Zeichen von `str` zurück, die in Großbuchstaben konvertiert werden."
|
"desc": "Gibt veränderten `str` zurück, bei dem allen Zeichen in Großbuchstaben umgewandelt wurden."
|
||||||
},
|
},
|
||||||
"$lowercase": {
|
"$lowercase": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc" : "Gibt eine Zeichenfolge mit allen Zeichen von `str` in Kleinbuchstaben zurück."
|
"desc": "Gibt veränderten `str` zurück, bei dem allen Zeichen in Kleinbuchstaben umgewandelt wurden."
|
||||||
},
|
},
|
||||||
"$trim": {
|
"$trim": {
|
||||||
"args" : "str",
|
"args": "[str]",
|
||||||
"desc" : "Normalisiert und trimmt alle Leerzeichen in `str` durch Anwenden der folgenden Schritte:\n\n -Alle Tabulatorstopps, Wagenrückläufe und Zeilenvorschübe werden durch Leerzeichen ersetzt.\n-Zusammenhängende Folgen von Räumen werden auf einen einzigen Raum reduziert.\n-Trailing und führende Plätze werden entfernt.\n\n Wenn 'str' nicht angegeben ist (d. h. Diese Funktion wird ohne Argumente aufgerufen), dann wird der Kontextwert als Wert von `str` verwendet. Es wird ein Fehler ausgelöst, wenn `str` keine Zeichenfolge ist."
|
"desc": "Normalisiert und trimmt alle Leerzeichen in `str` durch Anwenden der folgenden Schritte:\n\n- Alle Tabulatoren, Wagenrückläufe (returns) und Zeilenvorschübe (line feeds) werden durch Leerzeichen ersetzt.\n- Zusammenhängende Folgen von Leerzeichen werden auf ein einzelnes Leerzeichen reduziert.\n- Leerzeichen am Anfang und am Ende werden entfernt.\n\nWenn `str` nicht vorgegeben ist (d.h. diese Funktion wird ohne Parameter aufgerufen), dann wird der Kontextwert als Wert von `str` verwendet. Es wird ein Fehler ausgelöst, wenn `str` keine Zeichenfolge ist."
|
||||||
},
|
},
|
||||||
"$contains": {
|
"$contains": {
|
||||||
"args" : "str, Muster",
|
"args": "str, pattern",
|
||||||
"desc" : "Gibt `true` zurück, wenn `str` durch `Muster` abgeglichen wird, sonst gibt es `false` zurück. Wenn 'str' nicht angegeben ist (d. h. Diese Funktion wird mit einem Argument aufgerufen), dann wird der Kontextwert als Wert von `str` verwendet. Der Parameter 'Muster' kann entweder eine Zeichenfolge oder ein regulärer Ausdruck sein."
|
"desc": "Gibt `false` zurück, wenn `pattern` als Teilzeichenfolge in `str` enthalten ist, sonst gibt sie `false` zurück. Wenn `str` nicht vorgegeben ist (d. h. Diese Funktion wird mit einem Parameter aufgerufen), dann wird der Kontextwert als Wert von `str` verwendet. `pattern` kann entweder eine Zeichenfolge oder ein regulärer Ausdruck sein."
|
||||||
},
|
},
|
||||||
"$split": {
|
"$split": {
|
||||||
"args" : "str [, Trennzeichen] [, Grenzwert]",
|
"args": "str [, separator] [, limit]",
|
||||||
"desc" : "Teilt den Parameter 'str' in einem Array mit Unterzeichenfolgen. Es ist ein Fehler, wenn `str` keine Zeichenfolge ist. Der optionale Parameter 'Trennzeichen' gibt die Zeichen in der `str` an, um die es entweder als Zeichenfolge oder als regulärer Ausdruck geteilt werden soll. Wenn 'Trennzeichen' nicht angegeben wird, wird die leere Zeichenfolge angenommen, und `str` wird in ein Array aus einzelnen Zeichen aufgeteilt. Es handelt sich um einen Fehler, wenn `Trennzeichen' keine Zeichenfolge ist. Der optionale Parameter 'Grenzwert' ist eine Zahl, die die maximale Anzahl von Unterzeichenfolgen angibt, die in das resultierende Array eingeschlossen werden sollen. Alle zusätzlichen Unterzeichenfolgen werden gelöscht. Wenn 'Grenzwert' nicht angegeben wird, wird ' str ` vollständig geteilt, wobei die Größe des resultierenden Arrays nicht begrenzt ist. Es handelt sich um einen Fehler, wenn `Grenzwert' keine nicht negative Zahl ist."
|
"desc": "Teilt `str` in einem Array mit Teilzeichenfolgen. Es ergibt einen Fehler, wenn `str` keine Zeichenfolge ist.\n\nDer optionale Parameter `separator` gibt die Zeichen in der `str` an, anhand dem, vorgegeben entweder als Zeichenfolge oder als regulärer Ausdruck, `str` geteilt werden soll. Wenn `separator` nicht vorgegeben wird, wird ein leerer String als `separator` angenommen und `str` wird in ein Array aus einzelnen Zeichen aufgeteilt. Es handelt sich um einen Fehler, wenn `separator` leer ist.\n\nDer optionale Parameter `limit` ist eine Zahl, die die maximale Anzahl von Teilzeichenfolgen angibt, die in dem rückzugebenen Array enthalten sein sollen. Alle zusätzlichen Teilzeichenfolgen werden verworfen. Wenn `limit` nicht vorgegeben wird, wird `str` vollständig geteilt, wobei die Größe des resultierenden Arrays nicht begrenzt ist. Es handelt sich um einen Fehler, wenn `limit` eine negative Zahl ist."
|
||||||
},
|
},
|
||||||
"$join": {
|
"$join": {
|
||||||
"args" : "array [, Trennzeichen]",
|
"args": "array [, separator]",
|
||||||
"desc" : "Verkettet ein Array von Komponentenzeichenfolgen in eine einzelne verkettete Zeichenfolge mit jeder Komponentenzeichenfolge, die durch den optionalen Parameter 'separator' getrennt ist. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zeichenfolge ist. Wenn 'Trennzeichen' nicht angegeben wird, wird davon ausgegangen, dass es sich um eine leere Zeichenfolge handelt, d. h. Zwischen den Komponentenzeichenfolgen ist kein Trennzeichen vorhanden. Es handelt sich um einen Fehler, wenn `Trennzeichen' keine Zeichenfolge ist."
|
"desc": "Verkettet ein Array von Zeichenfolgen zu einer einzigen Zeichenfolge, wobei die einzelnen Zeichenfolgen durch den optionalen Trennzeichen-Parameter `separator` getrennt sind. Es ergibt einen Fehler, wenn das `array` ein Element enthält, das keine Zeichenfolge ist. Wenn `separator` nicht vorgegeben wird, wird davon ausgegangen, dass es sich um eine leere Zeichenfolge handelt, d.h. zwischen den einzelnen Zeichenfolgen wird kein Trennzeichen eingefügt. Es handelt sich um einen Fehler, wenn `separator` keine Zeichenfolge ist."
|
||||||
},
|
},
|
||||||
"$match": {
|
"$match": {
|
||||||
"args" : "str, Muster [, Grenzwert]",
|
"args": "str, pattern [, limit]",
|
||||||
"desc" : "Wendet die Zeichenfolge `str` an den regulären Ausdruck `Muster` an und gibt ein Array von Objekten zurück, wobei jedes Objekt Informationen zu jedem Vorkommen einer Übereinstimmung in `str` enthält."
|
"desc": "Wendet den regulären Ausdruck `pattern` auf die Zeichenfolge `str` an und gibt ein Array von Objekten zurück, die Informationen zu jedem Vorkommen von `pattern` in `str` enthält."
|
||||||
},
|
},
|
||||||
"$replace": {
|
"$replace": {
|
||||||
"args" : "str, Muster, Ersatz [, Grenzwert]",
|
"args": "str, pattern, replacement [, limit]",
|
||||||
"desc" : "Findet Vorkommen von `Muster` in `str` und ersetzt sie durch `Ersatz`.\n\nDer optionale Parameter 'Grenzwert' ist die maximale Anzahl an Ersetzungen."
|
"desc": "Findet Vorkommen von `pattern` in `str` und ersetzt sie durch `replacement`.\n\nDer optionale Parameter `limit` ist die maximale Anzahl an Ersetzungen."
|
||||||
},
|
},
|
||||||
"$now": {
|
"$now": {
|
||||||
"args": "",
|
"args": "",
|
||||||
"desc": "Generiert einen Zeitstempel im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück."
|
"desc": "Generiert einen Zeitstempel im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück."
|
||||||
},
|
},
|
||||||
"$base64encode": {
|
"$base64encode": {
|
||||||
"args" : "Zeichenfolge",
|
"args": "str",
|
||||||
"desc" : "Konvertiert eine ASCII-Zeichenfolge in eine Basis-64-Darstellung. Jedes Zeichen in der Zeichenfolge wird als Byte mit binären Daten behandelt. Dies setzt voraus, dass alle Zeichen in der Zeichenfolge im Bereich von 0x00 bis 0xFF liegen, der alle Zeichen in URI-codierten Zeichenfolgen enthält. Unicode-Zeichen außerhalb dieses Bereichs werden nicht unterstützt."
|
"desc": "Konvertiert eine ASCII-Zeichenfolge `str` in eine Basis-64-Darstellung. Jedes Zeichen in `str` wird als Byte mit binären Daten behandelt. Dies setzt voraus, dass alle Zeichen in der Zeichenfolge im Bereich von 0x00 bis 0xFF liegen, der alle Zeichen in URI-codierten Zeichenfolgen enthält. Unicode-Zeichen außerhalb dieses Bereichs werden nicht unterstützt."
|
||||||
},
|
},
|
||||||
"$base64decode": {
|
"$base64decode": {
|
||||||
"args" : "Zeichenfolge",
|
"args": "str",
|
||||||
"desc" : "Konvertiert die Basis-64-codierten Byte in eine Zeichenfolge unter Verwendung einer UTF-8-Unicode-Codepage."
|
"desc": "Konvertiert den Basis-64-codierten `str` in eine Zeichenfolge unter Verwendung einer UTF-8-Unicode-Codepage."
|
||||||
},
|
},
|
||||||
"$number": {
|
"$number": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc" : "Der Parameter 'arg' wird unter Verwendung der folgenden Regeln für das Casting in eine Zahl verwendet:\n\n -Zahlen bleiben unverändert\n -Zeichenfolgen, die eine Folge von Zeichen enthalten, die eine rechtliche JSON-Nummer darstellen, werden in diese Zahl konvertiert.\n -Alle anderen Werte bewirken, dass ein Fehler ausgelöst wird."
|
"desc": "Wandelt `arg` unter Verwendung der folgenden Regeln in eine Zahl um:\n\n- Zahlen bleiben unverändert\n- Zeichenfolgen, die eine Folge von Zeichen enthalten, die einen echten JSON-Zahlenwert darstellen, werden in die entsprechende Zahl konvertiert.\n- Alle anderen Werte bewirken, dass ein Fehler ausgelöst wird."
|
||||||
},
|
},
|
||||||
"$abs": {
|
"$abs": {
|
||||||
"args" : "Anzahl",
|
"args": "number",
|
||||||
"desc" : "Gibt den absoluten Wert des Parameters 'Zahl' zurück."
|
"desc": "Gibt den absoluten Wert von `number` zurück."
|
||||||
},
|
},
|
||||||
"$floor": {
|
"$floor": {
|
||||||
"args" : "Anzahl",
|
"args": "number",
|
||||||
"desc" : "Gibt den Wert von 'Zahl' auf die nächste ganze Zahl zurück, die kleiner oder gleich 'Zahl' ist."
|
"desc": "Gibt `number` abgerundet auf die nächste ganze Zahl zurück, die kleiner oder gleich `number` ist."
|
||||||
},
|
},
|
||||||
"$ceil": {
|
"$ceil": {
|
||||||
"args" : "Anzahl",
|
"args": "number",
|
||||||
"desc" : "Gibt den Wert von 'Zahl' auf die nächste ganze Zahl zurück, die größer oder gleich 'Zahl' ist."
|
"desc": "Gibt `number` aufgerundet auf die nächste ganze Zahl zurück, die größer oder gleich `number` ist."
|
||||||
},
|
},
|
||||||
"$round": {
|
"$round": {
|
||||||
"args" : "Zahl [, Genauigkeit]",
|
"args": "number [, precision]",
|
||||||
"desc" : "Gibt den Wert des Parameters `Zahl` zurück, der auf die Anzahl der Dezimalstellen gerundet wird, die durch den optionalen Parameter 'Genauigkeit' angegeben wird."
|
"desc": "Gibt `number` gerundet auf die Anzahl der Nachkommastellen zurück, welche durch den optionalen Parameter `precision` vorgegeben ist."
|
||||||
},
|
},
|
||||||
"$power": {
|
"$power": {
|
||||||
"args" : "Basis, Exponent",
|
"args": "base, exponent",
|
||||||
"desc" : "Gibt den Wert von `Basis` potenziert mit `Exponent` zurück."
|
"desc": "Gibt `base` potenziert mit `exponent` zurück."
|
||||||
},
|
},
|
||||||
"$sqrt": {
|
"$sqrt": {
|
||||||
"args" : "Zahl",
|
"args": "number",
|
||||||
"desc" : "Gibt die Quadratwurzel des Werts des Parameters 'Zahl' zurück."
|
"desc": "Gibt die Quadratwurzel von `number` zurück."
|
||||||
},
|
},
|
||||||
"$random": {
|
"$random": {
|
||||||
"args": "",
|
"args": "",
|
||||||
@@ -97,126 +97,178 @@
|
|||||||
},
|
},
|
||||||
"$millis": {
|
"$millis": {
|
||||||
"args": "",
|
"args": "",
|
||||||
"desc" : "Gibt die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl zurück. Alle Invocationen von `$millis ()` innerhalb einer Auswertung eines Ausdrucks geben alle denselben Wert zurück."
|
"desc": "Gibt die aktuelle Anzahl der Millisekunden seit Beginn der Unix-Zeitrechnung (1. Januar 1970 UTC) als Zahl zurück. Alle Aufrufe von `$millis()` innerhalb der Auswertung eines Ausdrucks geben alle denselben Wert zurück."
|
||||||
},
|
},
|
||||||
"$sum": {
|
"$sum": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt die arithmetische Summe eines `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist."
|
"desc": "Gibt die arithmetische Summe eines `array` von Zahlen zurück. Es ergibt einen Fehler, wenn `array` ein Element enthält, das keine Zahl ist."
|
||||||
},
|
},
|
||||||
"$max": {
|
"$max": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt die maximale Anzahl in einem `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist."
|
"desc": "Gibt die größte Zahl von einem `array` von Zahlen zurück. Es ergibt einen Fehler, wenn `array` ein Element enthält, das keine Zahl ist."
|
||||||
},
|
},
|
||||||
"$min": {
|
"$min": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt die minimale Zahl in einem `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist."
|
"desc": "Gibt die kleinste Zahl von einem `array` von Zahlen zurück. Es ergibt einen Fehler, wenn `array` ein Element enthält, das keine Zahl ist."
|
||||||
},
|
},
|
||||||
"$average": {
|
"$average": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt den Mittelwert eines `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist."
|
"desc": "Gibt den Mittelwert eines `array` von Zahlen zurück. Es ergibt einen Fehler, wenn `array` ein Element enthält, das keine Zahl ist."
|
||||||
},
|
},
|
||||||
"$boolean": {
|
"$boolean": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc" : "Castet das Argument mit den folgenden Regeln in einen Booleschen Wert:\n\n -` Boolean ': nicht geändert\n -` string `: leer: `false`\n -` string `: nicht leer: `true`\n -` Zahl `: ` 0 `: ` falsch `\n -` Zahl `: Nicht-Null: `true`\n -` null `: `false`\n -` array `: leer: `false`\n -` array `: enthält ein Mitglied, das auf `true` setzt: `true`\n -` array `: alle Member werden in `false` umgesetzt: `false`\n -` object `: empty: `false`\n -` object `: non-empty: `true`\n -` Funktion `: ` falsch `"
|
"desc": "Wandelt `arg` gemäß folgender Regeln in einen booleschen Wert um:\n\n- `Boolean`: unverändert\n- `string`: leer → `false`, nicht leer → `true`\n- `Zahl`: `0` → `falsch`, Nicht-Null → `true`\n- `null` → `false`\n- `array`: leer → `false`, enthält mindestens ein Element, das `true` ist → `true`, alle Elemente sind `false` → `false`\n- `object`: leer → `false`, nicht leer → `true`\n- `function`: `false`"
|
||||||
},
|
},
|
||||||
"$not": {
|
"$not": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc" : "Gibt den Booleschen Wert NOT für das Argument zurück. `arg` wird zuerst in einen Booleschen Wert umgesetzt."
|
"desc": "Gibt den invertierten booleschen Wert von `arg` zurück. `arg` wird zuerst in einen booleschen Wert umgesetzt."
|
||||||
},
|
},
|
||||||
"$exists": {
|
"$exists": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc" : "Gibt den Booleschen Wert 'true' zurück, wenn der Ausdruck `arg` als Wert ausgewertet wird, oder 'false', wenn der Ausdruck nicht mit einem anderen Ausdruck übereinstimmt (z. B. ein Pfad zu einer nicht vorhandenen Feldreferenz)."
|
"desc": "Gibt den booleschen Wert `true` zurück, wenn der Ausdruck `arg` zu einem Wert ausgewertet wird, oder `false`, wenn der Ausdruck nicht mit einem anderen Ausdruck übereinstimmt (z.B. ein Pfad zu einer nicht vorhandenen Feldreferenz)."
|
||||||
},
|
},
|
||||||
"$count": {
|
"$count": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt die Anzahl der Elemente in dem Array zurück."
|
"desc": "Gibt die Anzahl der Elemente in dem Array `array` zurück."
|
||||||
},
|
},
|
||||||
"$append": {
|
"$append": {
|
||||||
"args" : "Array, Array",
|
"args": "array, array",
|
||||||
"desc" : "Hängen Sie zwei Arrays an."
|
"desc": "Verkettet zwei Arrays miteinander."
|
||||||
},
|
},
|
||||||
"$sort": {
|
"$sort": {
|
||||||
"args" : "array [, Funktion]",
|
"args": "array [, function]",
|
||||||
"desc" : "Gibt ein Array zurück, das alle Werte im Parameter 'array' enthält, aber in der Reihenfolge sortiert wird.\n\nWenn ein Vergleichsoperator 'function' angegeben wird, muss es sich um eine Funktion handeln, die zwei Parameter benötigt:\n\n` Funktion (links, rechts) `\n\nDiese Funktion wird durch den Sortieralgorithmus aufgerufen, um zwei Werte links und rechts zu vergleichen. Wenn der Wert von links nach dem Wert von rechts in der gewünschten Sortierreihenfolge platziert werden soll, muss die Funktion den Booleschen Wert 'true' zurückgeben, um einen Auslagerungsspeicher anzuzeigen. Andernfalls muss 'false' zurückgegeben werden."
|
"desc": "Gibt ein Array zurück, das alle Elemente vom `array` in sortierter Reihenfolge enthält.\n\nWenn ein Vergleichsoperator `function` vorgegeben wird, muss es sich um eine Funktion handeln, die zwei Parameter benötigt:\n\n`function(left, right)`\n\nDiese Funktion wird durch den Sortieralgorithmus aufgerufen, um zwei Elemente links und rechts zu vergleichen. Wenn das linke Element nach dem rechten in der gewünschten Sortierreihenfolge platziert werden soll, muss die Funktion den booleschen Wert `true` zurückgeben, um eine Vertauschung anzuzeigen. Andernfalls muss `false` zurückgegeben werden."
|
||||||
},
|
},
|
||||||
"$reverse": {
|
"$reverse": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt ein Array zurück, das alle Werte aus dem Parameter 'array' enthält, aber in umgekehrter Reihenfolge."
|
"desc": "Gibt ein Array zurück, das alle Elemente vom `array` in umgekehrter Reihenfolge enthält."
|
||||||
},
|
},
|
||||||
"$shuffle": {
|
"$shuffle": {
|
||||||
"args" : "Array",
|
"args": "array",
|
||||||
"desc" : "Gibt ein Array zurück, das alle Werte aus dem Parameter ` array ` enthält, aber in zufälliger Reihenfolge geschattiert ist."
|
"desc": "Gibt ein Array zurück, das alle Elemente vom `array` in zufälliger Reihenfolge enthält."
|
||||||
},
|
},
|
||||||
"$zip": {
|
"$zip": {
|
||||||
"args" : "Array, ...",
|
"args": "array, ...",
|
||||||
"desc" : "Gibt ein konvolviertes (gezipptes) Array zurück, das gruppierte Arrays von Werten aus den Argumenten ` array1 ` ... ` arrayN ' aus Index 0, 1, 2 ... enthält."
|
"desc": "Gibt ein gepacktes (geziptes) Array zurück, das gruppierte Arrays der Elemente von `array1` ... `arrayN` aus Index 0, 1, 2 ... enthält."
|
||||||
},
|
},
|
||||||
"$keys": {
|
"$keys": {
|
||||||
"args" : "Objekt",
|
"args": "object",
|
||||||
"desc" : "Gibt ein Array zurück, das die Schlüssel in dem Objekt enthält. Wenn es sich bei dem Argument um ein Array von Objekten handelt, enthält das zurückgegebene Array eine deduplizierte Liste aller Schlüssel in allen Objekten."
|
"desc": "Gibt ein Array zurück, das die Schlüssel in dem Objekt `object` enthält. Wenn es sich bei dem Parameter um ein Array von Objekten handelt, enthält das zurückgegebene Array eine deduplizierte Liste aller Schlüssel in allen Objekten."
|
||||||
},
|
},
|
||||||
"$lookup": {
|
"$lookup": {
|
||||||
"args" : "Objekt, Schlüssel",
|
"args": "object, key",
|
||||||
"desc" : "Gibt den Wert zurück, der dem Schlüssel im Objekt zugeordnet ist. Wenn es sich bei dem ersten Argument um ein Array von Objekten handelt, werden alle Objekte im Array durchsucht, und die Werte, die mit allen Vorkommen des Schlüssels verknüpft sind, werden zurückgegeben."
|
"desc": "Gibt den Wert zurück, der dem Schlüssel `key` im Objekt `object` zugeordnet ist. Wenn es sich bei dem ersten Parameter um ein Array von Objekten handelt, werden alle Objekte im Array durchsucht, und die Werte, die mit allen Vorkommen des Schlüssels verknüpft sind, werden zurückgegeben."
|
||||||
},
|
},
|
||||||
"$spread": {
|
"$spread": {
|
||||||
"args" : "Objekt",
|
"args": "object",
|
||||||
"desc" : "Teilt ein Objekt, das Schlüssel/Wert-Paare enthält, in ein Array von Objekten, von denen jedes ein einzelnes Schlüssel/Wert-Paar aus dem Eingabeobjekt hat. Wenn es sich bei dem Parameter um ein Array von Objekten handelt, enthält die resultierende Feldgruppe ein Objekt für jedes Schlüssel/Wert-Paar in jedem Objekt in der angegebenen Feldgruppe."
|
"desc": "Teilt ein Objekt `object`, das Schlüssel/Wert-Paare enthält, in ein Array von Objekten, von denen jedes ein einzelnes Schlüssel/Wert-Paar aus dem Eingabeobjekt hat. Wenn es sich bei dem Parameter um ein Array von Objekten handelt, enthält die resultierende Feldgruppe ein Objekt für jedes Schlüssel/Wert-Paar in jedem Objekt in der vorgegebenen Feldgruppe."
|
||||||
},
|
},
|
||||||
"$merge": {
|
"$merge": {
|
||||||
"args": "array<object>",
|
"args": "array<object>",
|
||||||
"desc" : "Mischt ein Array von ` Objekten ` in ein einzelnes ` Objekt `, das alle Schlüssel/Wert-Paare aus jedem der Objekte in dem Eingabe-Array enthält. Wenn eines der Eingabeobjekte denselben Schlüssel enthält, enthält das zurückgegebene Objekt den Wert des letzten Objekts in der Feldgruppe. Es handelt sich um einen Fehler, wenn das Eingabe-Array ein Element enthält, das kein Objekt ist."
|
"desc": "Fügt ein Array von Objekt-Elementen `object` in ein einzelnes Objekt `object` zusammen, das alle Schlüssel/Wert-Paare aus jedem der Objekte in dem Ausgangs-Array enthält. Wenn eines der Ausgangs-Objekte denselben Schlüssel enthält, enthält das zurückgegebene Objekt den Wert des letzten Objekts des Arrays. Es handelt sich um einen Fehler, wenn das Ausgangs-Array ein Element enthält, das kein Objekt ist."
|
||||||
},
|
},
|
||||||
"$sift": {
|
"$sift": {
|
||||||
"args" : "Objekt, Funktion",
|
"args": "object, function",
|
||||||
"desc" : "Gibt ein Objekt zurück, das nur die Schlüssel/Wert-Paare aus dem Parameter 'object' enthält, die die Prädikat ` funktion ' erfüllen, die als zweiter Parameter übergeben wird.\n\nDie Funktion ` function `, die als zweiter Parameter angegeben wird, muss die folgende Signatur aufweisen:\n\n` function (value [, key [, object]]) `"
|
"desc": "Gibt ein Objekt zurück, das nur die Schlüssel/Wert-Paare aus dem Parameter `object` enthält, die die Prädikat `function` erfüllen, die als zweiter Parameter übergeben wird.\n\nDie Funktion `function`, die als zweiter Parameter vorgegeben wird, muss die folgende Signatur aufweisen:\n\n`function(value [, key [, object]])`"
|
||||||
},
|
},
|
||||||
"$each": {
|
"$each": {
|
||||||
"args" : "Objekt, Funktion",
|
"args": "object, function",
|
||||||
"desc": "Gibt ein Array zurück, das die Werte enthält, die von der Funktion `function` zurückgegeben werden, wenn sie auf jedes Schlüssel/Wert-Paar im `object` angewendet werden."
|
"desc": "Gibt ein Array zurück, das die Werte enthält, die von der Funktion `function` zurückgegeben werden, wenn sie auf jedes Schlüssel/Wert-Paar im `object` angewendet werden."
|
||||||
},
|
},
|
||||||
"$map": {
|
"$map": {
|
||||||
"args" : "Array, Funktion",
|
"args": "array, function",
|
||||||
"desc" : "Gibt ein Array zurück, das die Ergebnisse der Anwendung des Parameters ` function ` auf jeden Wert im Parameter 'array' enthält.\n\nDie Funktion ` function `, die als zweiter Parameter angegeben wird, muss die folgende Signatur aufweisen:\n\n` function (value [, index [, array]]) `"
|
"desc": "Gibt ein Array zurück, das die Ergebnisse von `function`, angewendet auf jedes Element von `array`, enthält.\n\nDie Funktion `function`, die als zweiter Parameter vorgegeben wird, muss die folgende Signatur aufweisen:\n\n`function(value [, index [, array]])`"
|
||||||
},
|
},
|
||||||
"$filter": {
|
"$filter": {
|
||||||
"args" : "Array, Funktion",
|
"args": "array, function",
|
||||||
"desc" : "Gibt ein Array zurück, das nur die Werte im Parameter 'array' enthält, die das Prädikat ` funktion ` erfüllen.\n\nDie Funktion ` function `, die als zweiter Parameter angegeben wird, muss die folgende Signatur aufweisen:\n\n` function (value [, index [, array]]) `"
|
"desc": "Gibt ein Array zurück, das nur die Elemente von `array` enthält, die das Eigenschaft `function` erfüllen.\n\nDie Funktion `function`, die als zweiter Parameter vorgegeben wird, muss die folgende Signatur aufweisen:\n\n`function(value [, index [, array]])`"
|
||||||
},
|
},
|
||||||
"$reduce": {
|
"$reduce": {
|
||||||
"args": "array, function [, init]",
|
"args": "array, function [, init]",
|
||||||
"desc" : "Gibt einen aggregierten Wert zurück, der aus der Anwendung des Parameters ` function 'nacheinander auf jeden Wert in' array ` in Kombination mit dem Ergebnis der vorherigen Anwendung der Funktion angewendet wurde.\n\nDie Funktion muss zwei Argumente akzeptieren und verhält sich wie ein Infix-Operator zwischen jedem Wert innerhalb des ` Array `.\n\nDer optionale Parameter 'init' wird als Anfangswert in der Aggregation verwendet."
|
"desc": "Gibt einen aggregierten Wert zurück, der aus der Anwendung des Parameters `function` nacheinander auf jedes Element in `array` in Kombination mit dem Ergebnis der vorherigen Anwendung der Funktion angewendet wurde.\n\nDie Funktion muss zwei Parameter akzeptieren und verhält sich wie ein Infix-Operator zwischen jedem Element innerhalb des `array`.\n\nDer optionale Parameter `init` wird als Anfangswert in der Aggregation verwendet."
|
||||||
},
|
},
|
||||||
"$flowContext": {
|
"$flowContext": {
|
||||||
"args" : "Zeichenfolge [, Zeichenfolge]",
|
"args": "str [, str]",
|
||||||
"desc" : "Ruft eine Flusskontexteigenschaft ab.\n\nDies ist eine definierte Funktion vom Typ \"Node-RED\"."
|
"desc": "Ruft eine Flow-Kontexteigenschaft ab.\n\nDies ist eine definierte Funktion vom Typ `Node-RED`."
|
||||||
},
|
},
|
||||||
"$globalContext": {
|
"$globalContext": {
|
||||||
"args" : "Zeichenfolge [, Zeichenfolge]",
|
"args": "str [, str]",
|
||||||
"desc" : "Ruft eine globale Kontexteigenschaft ab.\n\nDies ist eine definierte Funktion vom Typ \"Node-RED\"."
|
"desc": "Ruft eine globale Kontexteigenschaft ab.\n\nDies ist eine definierte Funktion vom Typ `Node-RED`."
|
||||||
},
|
},
|
||||||
"$pad": {
|
"$pad": {
|
||||||
"args" : "string, width [, char]",
|
"args": "str, width [, char]",
|
||||||
"desc" : "Gibt eine Kopie der ` Zeichenfolge ` mit zusätzlichen Aufenthalten zurück, falls erforderlich, so dass die Gesamtzahl der Zeichen mindestens der absolute Wert des Parameters 'width' ist.\n\nWenn ` width ` eine positive Zahl ist, wird die Zeichenfolge nach rechts aufgefüllt. Wenn sie negativ ist, wird sie nach links geplisften.\n\nDas optionale Argument 'char' gibt die Padding-Zeichen an, die verwendet werden sollen. Wenn keine Angabe gemacht wird, wird standardmäßig der Wert für das Leerzeichen angenommen."
|
"desc": "Gibt eine aufgefüllte Kopie von `str` zurück, so dass (falls erforderlich) die Gesamtzahl der Zeichen mindestens dem absoluten Wert von `width` entspricht.\n\nWenn `width` eine positive Zahl ist, wird die Zeichenfolge nach rechts aufgefüllt. Wenn sie negativ ist, wird sie nach links aufgefüllt.\n\nDer optionale Parameter `char` gibt die Auffüll-Zeichen an, die verwendet werden sollen. Wenn keine Angabe gemacht wird, wird standardmäßig mit Leerzeichen aufgefüllt."
|
||||||
},
|
},
|
||||||
"$fromMillis": {
|
"$fromMillis": {
|
||||||
"args" : "Anzahl",
|
"args": "number",
|
||||||
"desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) enthält in eine Zeitangabe im ISO 8601-Format."
|
"desc": "Konvertiert `number`, die die Millisekunden seit Beginn der Unix-Zeitrechnung (1. Januar 1970 UTC) enthält, in eine Zeitangabe im ISO 8601-Format."
|
||||||
},
|
},
|
||||||
"$formatNumber": {
|
"$formatNumber": {
|
||||||
"args" : "Zahl, Bild [, Optionen]",
|
"args": "number, picture [, options]",
|
||||||
"desc" : "Transformiere die `Zahl` an eine Zeichenfolge und formatiert sie in eine dezimale Darstellung, wie in der 'Bild' -Zeichenfolge angegeben.\n\n Das Verhalten dieser Funktion ist mit der XPath/XQuery-Funktion fn:formatnummer konsistent, wie sie in der XPath F&O 3.1-Spezifikation definiert ist. Der Parameter für die Bildzeichenfolge definiert, wie die Zahl formatiert ist und hat die gleiche Syntax wie fn:format-number.\n\nDas optionale dritte Argument ` Optionen ` wird verwendet, um die standardmäßigen länderspezifischen Formatierungszeichen, wie z. B. das Dezimaltrennzeichen, zu überschreiben. Wenn dieses Argument angegeben wird, muss es sich um ein Objekt handeln, das Name/Wert-Paare enthält, die im Abschnitt mit dem Dezimalformat der XPath F&O 3.1-Spezifikation angegeben sind."
|
"desc": "Wandelt `number` in eine Zeichenfolge um und formatiert sie in eine dezimale Darstellung, wie im `picture`-String-Parameter vorgegeben.\n\nDas Verhalten dieser Funktion ist mit der XPath/XQuery-Funktion `fn:formatnummer` konsistent, wie sie in der XPath F&O 3.1-Spezifikation definiert ist. Der `picture`-String-Parameter definiert, wie die Zahl formatiert ist und hat die gleiche Syntax wie `fn:format-number`.\n\nDer optionale dritte Parameter `options` wird verwendet, um die standardmäßigen länderspezifischen Formatierungszeichen, wie z.B. das Dezimaltrennzeichen, zu überschreiben. Wenn dieser Parameter vorgegeben wird, muss es sich um ein Objekt handeln, das Name/Wert-Paare enthält, die im Abschnitt mit dem Dezimalformat der XPath F&O 3.1-Spezifikation vorgegeben sind."
|
||||||
},
|
},
|
||||||
"$formatBase": {
|
"$formatBase": {
|
||||||
"args" : "Zahl [, Radix]",
|
"args": "number [, radix]",
|
||||||
"desc" : "Transformiere die `Zahl` in eine Zeichenfolge und formatiert sie in eine ganze Zahl, die in der durch das `radix` -Argument angegebenen Zahlenbasis dargestellt wird. Wenn 'radix' nicht angegeben wird, wird standardmäßig die Basis 10 verwendet. 'radix` kann zwischen 2 und 36 liegen, andernfalls wird ein Fehler ausgelöst."
|
"desc": "Wandelt `number` in eine Zeichenfolge um und formatiert sie in eine ganze Zahl, die in der durch den `radix`-Parameter vorgegebenen Zahlenbasis dargestellt wird. Wenn `radix` nicht vorgegeben wird, wird standardmäßig die Basis 10 verwendet. `radix` kann zwischen 2 und 36 liegen, andernfalls wird ein Fehler ausgelöst."
|
||||||
},
|
},
|
||||||
"$toMillis": {
|
"$toMillis": {
|
||||||
"args": "timestamp",
|
"args": "timestamp",
|
||||||
"desc" : "Konvertieren Sie eine Zeitangabe im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat."
|
"desc": "Konvertiert eine Zeitangabe `timestamp` im ISO 8601-Format in die Anzahl der Millisekunden seit Beginn der Unix-Zeitrechnung (1. Januar 1970 UTC). Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat."
|
||||||
},
|
},
|
||||||
"$env": {
|
"$env": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc" : "Gibt den Wert einer Umgebungsvariablen zurück.\n\nDies ist eine definierte Funktion vom Typ \"Node-RED\"."
|
"desc": "Gibt den Wert einer Umgebungsvariablen zurück.\n\nDies ist eine definierte Funktion vom Typ `Node-RED`."
|
||||||
|
},
|
||||||
|
"$eval": {
|
||||||
|
"args": "expr [, context]",
|
||||||
|
"desc": "Analysiert (parse) und evaluiert den String `expr`, welcher JSON or a JSONata Ausdrücke enthält, unter Benutzung des aktuellen Kontextes für die Evaluierung."
|
||||||
|
},
|
||||||
|
"$formatInteger": {
|
||||||
|
"args": "number, picture",
|
||||||
|
"desc": "Wandelt `number` in eine Zeichenfolge um und formatiert sie in einer Ganzzahl-Darstellung, spezifiziert durch den `picture`-String-Parameter. Der `picture`-String-Parameter definiert, wie die Zahl `number` formatiert werden soll und hat den selben Syntax wie `fn:format-integer` der XPath F&O 3.1 Spezifikation."
|
||||||
|
},
|
||||||
|
"$parseInteger": {
|
||||||
|
"args": "str, picture",
|
||||||
|
"desc": "Wandelt den Inhalt von `str` in eine Ganzzahl `integer` (als JSON Zahl), spezifiziert durch den `picture`-String-Parameter. Der `picture`-String-Parameter hat das selbe Format wie `$formatInteger`."
|
||||||
|
},
|
||||||
|
"$error": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Erzeugt eine Fehlermeldung. Der optionale String `str` ersetzt die Standardmeldung `$error() function evaluated`."
|
||||||
|
},
|
||||||
|
"$assert": {
|
||||||
|
"args": "arg, str",
|
||||||
|
"desc": "Wenn `arg` gleich `true` ist, liefert die Function `undefined` zurück. Wenn `arg` gleich `false` ist, wird ein Ausnahmefehler gemeldet mit dem String_Parameter `str` als Meldetext."
|
||||||
|
},
|
||||||
|
"$single": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Gibt ein einziges Element aus `array` zurück, welches die Bedingung `function` erfüllt (d.h. die Funktion `function` gibt den booleschen Wert `true` zurück, wenn das Element übergeben werden soll). Sie meldet einen Ausnahmefehler, wenn die Anzahl der Elemente mit erfüllter Bedingung (`function` ist `true`) nicht genau eins ist.\n\nDie Funktion `function` sollte in der folgenden Art vorgegeben werden: `function(value [, index [, array]])` wobei `value` für jedes Element des Arrays gilt, `index` ist die Position dieses Elements und das gesamte Array `array` wird als dritter Parameter übergeben."
|
||||||
|
},
|
||||||
|
"$encodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Kodiert eine URL-Komponente (Uniform Resource Locator), indem jedes Vorkommen bestimmter Zeichen durch eine, zwei, drei oder vier Escape-Sequenzen ersetzt wird, die die UTF-8-Kodierung des Zeichens darstellen.\n\nBeispiel: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
|
},
|
||||||
|
"$encodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Kodiert eine URL (Uniform Resource Locator), indem jedes Vorkommen bestimmter Zeichen durch eine, zwei, drei oder vier Escape-Sequenzen ersetzt wird, die die UTF-8-Kodierung des Zeichens darstellen.\n\nBeispiel: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Dekodiert eine URL-Komponente (Uniform Resource Locator) zuvor erzeugt von encodeUrlComponent.\n\nBeispiel: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Dekodiert eine URL (Uniform Resource Locator) zuvor erzeugt von encodeUrl.\n\nBeispiel: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
|
},
|
||||||
|
"$distinct": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Liefert ein `array` zurück, bei dem doppelte Elemente entfernt wurden."
|
||||||
|
},
|
||||||
|
"$type": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "Liefert den Typ von `value` als String. When `value` undefiniert ist, wird `undefined` zurückgeliefert."
|
||||||
|
},
|
||||||
|
"$moment": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Liefert ein `date` Objekt unter Benutzung der Moment Library."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
225
packages/node_modules/@node-red/editor-client/locales/en-US/editor.json
vendored
Executable file → Normal file
225
packages/node_modules/@node-red/editor-client/locales/en-US/editor.json
vendored
Executable file → Normal file
@@ -23,7 +23,11 @@
|
|||||||
"position": "Position",
|
"position": "Position",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"disable": "Disable",
|
"disable": "Disable",
|
||||||
"upload": "Upload"
|
"upload": "Upload",
|
||||||
|
"lock": "Lock",
|
||||||
|
"unlock": "Unlock",
|
||||||
|
"locked": "Locked",
|
||||||
|
"unlocked": "Unlocked"
|
||||||
},
|
},
|
||||||
"type": {
|
"type": {
|
||||||
"string": "string",
|
"string": "string",
|
||||||
@@ -38,12 +42,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"event": {
|
"event": {
|
||||||
|
"loadPlugins": "Loading Plugins",
|
||||||
"loadPalette": "Loading Palette",
|
"loadPalette": "Loading Palette",
|
||||||
"loadNodeCatalogs": "Loading Node catalogs",
|
"loadNodeCatalogs": "Loading Node catalogs",
|
||||||
"loadNodes": "Loading Nodes __count__",
|
"loadNodes": "Loading Nodes __count__",
|
||||||
"loadFlows": "Loading Flows",
|
"loadFlows": "Loading Flows",
|
||||||
"importFlows": "Adding Flows to workspace",
|
"importFlows": "Adding Flows to workspace",
|
||||||
"importError": "<p>Error adding flows</p><p>__message__</p>"
|
"importError": "<p>Error adding flows</p><p>__message__</p>",
|
||||||
|
"loadingProject": "Loading project"
|
||||||
},
|
},
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"defaultName": "Flow __number__",
|
"defaultName": "Flow __number__",
|
||||||
@@ -51,19 +57,38 @@
|
|||||||
"confirmDelete": "Confirm delete",
|
"confirmDelete": "Confirm delete",
|
||||||
"delete": "Are you sure you want to delete '__label__'?",
|
"delete": "Are you sure you want to delete '__label__'?",
|
||||||
"dropFlowHere": "Drop the flow here",
|
"dropFlowHere": "Drop the flow here",
|
||||||
"addFlow": "Add Flow",
|
"dropImageHere": "Drop the image here",
|
||||||
"listFlows": "List Flows",
|
"addFlow": "Add flow",
|
||||||
|
"addFlowToRight": "Add flow to the right",
|
||||||
|
"closeFlow": "Close flow",
|
||||||
|
"hideFlow": "Hide flow",
|
||||||
|
"hideOtherFlows": "Hide other flows",
|
||||||
|
"showAllFlows": "Show all flows (__count__ hidden)",
|
||||||
|
"hideAllFlows": "Hide all flows",
|
||||||
|
"hiddenFlows": "List __count__ hidden flow",
|
||||||
|
"hiddenFlows_plural": "List __count__ hidden flows",
|
||||||
|
"showLastHiddenFlow": "Reopen hidden flow",
|
||||||
|
"listFlows": "List flows",
|
||||||
|
"listSubflows": "List subflows",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"enabled": "Enabled",
|
"enabled": "Enabled",
|
||||||
"disabled": "Disabled",
|
"disabled": "Disabled",
|
||||||
"info": "Description",
|
"info": "Description",
|
||||||
"selectNodes": "Click nodes to select"
|
"selectNodes": "Click nodes to select",
|
||||||
|
"enableFlow": "Enable flow",
|
||||||
|
"disableFlow": "Disable flow",
|
||||||
|
"lockFlow": "Lock flow",
|
||||||
|
"unlockFlow": "Unlock flow",
|
||||||
|
"moveToStart": "Move flow to start",
|
||||||
|
"moveToEnd": "Move flow to end"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"label": {
|
"label": {
|
||||||
"view": {
|
"view": {
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"grid": "Grid",
|
"grid": "Grid",
|
||||||
|
"storeZoom": "Restore zoom level on load",
|
||||||
|
"storePosition": "Restore scroll position on load",
|
||||||
"showGrid": "Show grid",
|
"showGrid": "Show grid",
|
||||||
"snapGrid": "Snap to grid",
|
"snapGrid": "Snap to grid",
|
||||||
"gridSize": "Grid size",
|
"gridSize": "Grid size",
|
||||||
@@ -81,12 +106,14 @@
|
|||||||
"palette": {
|
"palette": {
|
||||||
"show": "Show palette"
|
"show": "Show palette"
|
||||||
},
|
},
|
||||||
|
"edit": "Edit",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"userSettings": "User Settings",
|
"userSettings": "User Settings",
|
||||||
"nodes": "Nodes",
|
"nodes": "Nodes",
|
||||||
"displayStatus": "Show node status",
|
"displayStatus": "Show node status",
|
||||||
"displayConfig": "Configuration nodes",
|
"displayConfig": "Configuration nodes",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
|
"importExample": "Import example flow",
|
||||||
"export": "Export",
|
"export": "Export",
|
||||||
"search": "Search flows",
|
"search": "Search flows",
|
||||||
"searchInput": "search your flows",
|
"searchInput": "search your flows",
|
||||||
@@ -95,7 +122,6 @@
|
|||||||
"selectionToSubflow": "Selection to Subflow",
|
"selectionToSubflow": "Selection to Subflow",
|
||||||
"flows": "Flows",
|
"flows": "Flows",
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
"rename": "Rename",
|
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"keyboardShortcuts": "Keyboard shortcuts",
|
"keyboardShortcuts": "Keyboard shortcuts",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
@@ -103,24 +129,48 @@
|
|||||||
"editPalette": "Manage palette",
|
"editPalette": "Manage palette",
|
||||||
"other": "Other",
|
"other": "Other",
|
||||||
"showTips": "Show tips",
|
"showTips": "Show tips",
|
||||||
|
"showNodeHelp": "Show node help",
|
||||||
|
"enableSelectedNodes": "Enable selected nodes",
|
||||||
|
"disableSelectedNodes": "Disable selected nodes",
|
||||||
|
"showSelectedNodeLabels": "Show selected node labels",
|
||||||
|
"hideSelectedNodeLabels": "Hide selected node labels",
|
||||||
|
"showWelcomeTours": "Show guided tours for new versions",
|
||||||
"help": "Node-RED website",
|
"help": "Node-RED website",
|
||||||
"projects": "Projects",
|
"projects": "Projects",
|
||||||
"projects-new": "New",
|
"projects-new": "New",
|
||||||
"projects-open": "Open",
|
"projects-open": "Open",
|
||||||
"projects-settings": "Project Settings",
|
"projects-settings": "Project Settings",
|
||||||
"showNodeLabelDefault": "Show label of newly added nodes",
|
"showNodeLabelDefault": "Show label of newly added nodes",
|
||||||
|
"codeEditor": "Code Editor",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"groupSelection": "Group selection",
|
"groupSelection": "Group selection",
|
||||||
"ungroupSelection": "Ungroup selection",
|
"ungroupSelection": "Ungroup selection",
|
||||||
"groupMergeSelection": "Merge selection",
|
"groupMergeSelection": "Merge selection",
|
||||||
"groupRemoveSelection": "Remove from group"
|
"groupRemoveSelection": "Remove from group",
|
||||||
|
"arrange": "Arrange",
|
||||||
|
"alignLeft": "Align to left",
|
||||||
|
"alignCenter": "Align to center",
|
||||||
|
"alignRight": "Align to right",
|
||||||
|
"alignTop": "Align to top",
|
||||||
|
"alignMiddle": "Align to middle",
|
||||||
|
"alignBottom": "Align to bottom",
|
||||||
|
"distributeHorizontally": "Distribute horizontally",
|
||||||
|
"distributeVertically": "Distribute vertically",
|
||||||
|
"moveToBack": "Move to back",
|
||||||
|
"moveToFront": "Move to front",
|
||||||
|
"moveBackwards": "Move backwards",
|
||||||
|
"moveForwards": "Move forwards"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"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__",
|
||||||
@@ -136,12 +186,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification": {
|
"notification": {
|
||||||
|
"state": {
|
||||||
|
"flowsStopped": "Flows stopped",
|
||||||
|
"flowsStarted": "Flows started"
|
||||||
|
},
|
||||||
"warning": "<strong>Warning</strong>: __message__",
|
"warning": "<strong>Warning</strong>: __message__",
|
||||||
"warnings": {
|
"warnings": {
|
||||||
"undeployedChanges": "node has undeployed changes",
|
"undeployedChanges": "node has undeployed changes",
|
||||||
"nodeActionDisabled": "node actions disabled",
|
"nodeActionDisabled": "node actions disabled",
|
||||||
"nodeActionDisabledSubflow": "node actions disabled within subflow",
|
"nodeActionDisabledSubflow": "node actions disabled within subflow",
|
||||||
"missing-types": "<p>Flows stopped due to missing node types.</p>",
|
"missing-types": "<p>Flows stopped due to missing node types.</p>",
|
||||||
|
"missing-modules": "<p>Flows stopped due to missing modules.</p>",
|
||||||
"safe-mode": "<p>Flows stopped in safe mode.</p><p>You can modify your flows and deploy the changes to restart.</p>",
|
"safe-mode": "<p>Flows stopped in safe mode.</p><p>You can modify your flows and deploy the changes to restart.</p>",
|
||||||
"restartRequired": "Node-RED must be restarted to enable upgraded modules",
|
"restartRequired": "Node-RED must be restarted to enable upgraded modules",
|
||||||
"credentials_load_failed": "<p>Flows stopped as the credentials could not be decrypted.</p><p>The flow credential file is encrypted, but the project's encryption key is missing or invalid.</p>",
|
"credentials_load_failed": "<p>Flows stopped as the credentials could not be decrypted.</p><p>The flow credential file is encrypted, but the project's encryption key is missing or invalid.</p>",
|
||||||
@@ -183,7 +238,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": {
|
||||||
@@ -247,7 +303,8 @@
|
|||||||
"missingType": "Input not a valid flow - item __index__ missing 'type' property"
|
"missingType": "Input not a valid flow - item __index__ missing 'type' property"
|
||||||
},
|
},
|
||||||
"conflictNotification1": "Some of the nodes you are importing already exist in your workspace.",
|
"conflictNotification1": "Some of the nodes you are importing already exist in your workspace.",
|
||||||
"conflictNotification2": "Select which nodes to import and whether to replace the existing nodes, or to import a copy of them."
|
"conflictNotification2": "Select which nodes to import and whether to replace the existing nodes, or to import a copy of them.",
|
||||||
|
"alreadyExists": "This node already exists"
|
||||||
},
|
},
|
||||||
"copyMessagePath": "Path copied",
|
"copyMessagePath": "Path copied",
|
||||||
"copyMessageValue": "Value copied",
|
"copyMessageValue": "Value copied",
|
||||||
@@ -261,13 +318,19 @@
|
|||||||
"modifiedFlowsDesc": "Only deploys flows that contain changed nodes",
|
"modifiedFlowsDesc": "Only deploys flows that contain changed nodes",
|
||||||
"modifiedNodes": "Modified Nodes",
|
"modifiedNodes": "Modified Nodes",
|
||||||
"modifiedNodesDesc": "Only deploys nodes that have changed",
|
"modifiedNodesDesc": "Only deploys nodes that have changed",
|
||||||
|
"startFlows": "Start",
|
||||||
|
"startFlowsDesc": "Start Flows",
|
||||||
|
"stopFlows": "Stop",
|
||||||
|
"stopFlowsDesc": "Stop Flows",
|
||||||
"restartFlows": "Restart Flows",
|
"restartFlows": "Restart Flows",
|
||||||
"restartFlowsDesc": "Restarts the current deployed flows",
|
"restartFlowsDesc": "Restarts the current deployed flows",
|
||||||
"successfulDeploy": "Successfully deployed",
|
"successfulDeploy": "Successfully deployed",
|
||||||
"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"
|
||||||
},
|
},
|
||||||
@@ -337,14 +400,28 @@
|
|||||||
"output": "outputs:",
|
"output": "outputs:",
|
||||||
"status": "status node",
|
"status": "status node",
|
||||||
"deleteSubflow": "delete subflow",
|
"deleteSubflow": "delete subflow",
|
||||||
|
"confirmDelete": "Are you sure you want to delete this subflow?",
|
||||||
"info": "Description",
|
"info": "Description",
|
||||||
"category": "Category",
|
"category": "Category",
|
||||||
|
"module": "Module",
|
||||||
|
"license": "License",
|
||||||
|
"licenseNone": "none",
|
||||||
|
"licenseOther": "Other",
|
||||||
|
"type": "Node Type",
|
||||||
|
"version": "Version",
|
||||||
|
"versionPlaceholder": "x.y.z",
|
||||||
|
"keys": "Keywords",
|
||||||
|
"keysPlaceholder": "Comma-separated keywords",
|
||||||
|
"author": "Author",
|
||||||
|
"authorPlaceholder": "Your Name <email@example.com>",
|
||||||
|
"desc": "Description",
|
||||||
"env": {
|
"env": {
|
||||||
"restore": "Restore to subflow default",
|
"restore": "Restore to subflow default",
|
||||||
"remove": "Remove environment variable"
|
"remove": "Remove environment variable"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"noNodesSelected": "<strong>Cannot create subflow</strong>: no nodes selected",
|
"noNodesSelected": "<strong>Cannot create subflow</strong>: no nodes selected",
|
||||||
|
"acrossMultipleGroups": "Cannot create subflow across multiple groups",
|
||||||
"multipleInputsToSelection": "<strong>Cannot create subflow</strong>: multiple inputs to selection"
|
"multipleInputsToSelection": "<strong>Cannot create subflow</strong>: multiple inputs to selection"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -385,6 +462,7 @@
|
|||||||
"icon": "Icon",
|
"icon": "Icon",
|
||||||
"inputType": "Input type",
|
"inputType": "Input type",
|
||||||
"selectType": "select types...",
|
"selectType": "select types...",
|
||||||
|
"loadCredentials": "Loading node credentials",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"input": "input",
|
"input": "input",
|
||||||
"select": "select",
|
"select": "select",
|
||||||
@@ -419,7 +497,8 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it",
|
"scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it",
|
||||||
"invalidProperties": "Invalid properties:"
|
"invalidProperties": "Invalid properties:",
|
||||||
|
"credentialLoadFailed": "Failed to load node credentials"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keyboard": {
|
"keyboard": {
|
||||||
@@ -431,11 +510,14 @@
|
|||||||
"unassigned": "Unassigned",
|
"unassigned": "Unassigned",
|
||||||
"global": "global",
|
"global": "global",
|
||||||
"workspace": "workspace",
|
"workspace": "workspace",
|
||||||
"selectAll": "Select all nodes",
|
"editor": "edit dialog",
|
||||||
"selectAllConnected": "Select all connected nodes",
|
"selectAll": "Select all",
|
||||||
|
"selectNone": "Select none",
|
||||||
|
"selectAllConnected": "Select connected",
|
||||||
"addRemoveNode": "Add/remove node from selection",
|
"addRemoveNode": "Add/remove node from selection",
|
||||||
"editSelected": "Edit selected node",
|
"editSelected": "Edit selected node",
|
||||||
"deleteSelected": "Delete selected nodes or link",
|
"deleteSelected": "Delete selection",
|
||||||
|
"deleteReconnect": "Delete and reconnect",
|
||||||
"importNode": "Import nodes",
|
"importNode": "Import nodes",
|
||||||
"exportNode": "Export nodes",
|
"exportNode": "Export nodes",
|
||||||
"nudgeNode": "Move selected nodes (1px)",
|
"nudgeNode": "Move selected nodes (1px)",
|
||||||
@@ -445,10 +527,14 @@
|
|||||||
"copyNode": "Copy selected nodes",
|
"copyNode": "Copy selected nodes",
|
||||||
"cutNode": "Cut selected nodes",
|
"cutNode": "Cut selected nodes",
|
||||||
"pasteNode": "Paste nodes",
|
"pasteNode": "Paste nodes",
|
||||||
"undoChange": "Undo the last change performed",
|
"copyGroupStyle": "Copy group style",
|
||||||
|
"pasteGroupStyle": "Paste group style",
|
||||||
|
"undoChange": "Undo",
|
||||||
|
"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",
|
||||||
@@ -500,11 +586,13 @@
|
|||||||
"nodeEnabled_plural": "Nodes enabled:",
|
"nodeEnabled_plural": "Nodes enabled:",
|
||||||
"nodeDisabled": "Node disabled:",
|
"nodeDisabled": "Node disabled:",
|
||||||
"nodeDisabled_plural": "Nodes disabled:",
|
"nodeDisabled_plural": "Nodes disabled:",
|
||||||
"nodeUpgraded": "Node module __module__ upgraded to version __version__"
|
"nodeUpgraded": "Node module __module__ upgraded to version __version__",
|
||||||
|
"unknownNodeRegistered": "Error loading node: <ul><li>__type__<br>__error__</li></ul>"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"title": "Manage palette",
|
"title": "Manage palette",
|
||||||
"palette": "Palette",
|
"palette": "Palette",
|
||||||
|
"allCatalogs": "All Catalogs",
|
||||||
"times": {
|
"times": {
|
||||||
"seconds": "seconds ago",
|
"seconds": "seconds ago",
|
||||||
"minutes": "minutes ago",
|
"minutes": "minutes ago",
|
||||||
@@ -544,6 +632,7 @@
|
|||||||
"tab-nodes": "Nodes",
|
"tab-nodes": "Nodes",
|
||||||
"tab-install": "Install",
|
"tab-install": "Install",
|
||||||
"sort": "sort:",
|
"sort": "sort:",
|
||||||
|
"sortRelevance": "relevance",
|
||||||
"sortAZ": "a-z",
|
"sortAZ": "a-z",
|
||||||
"sortRecent": "recent",
|
"sortRecent": "recent",
|
||||||
"more": "+ __count__ more",
|
"more": "+ __count__ more",
|
||||||
@@ -618,13 +707,10 @@
|
|||||||
"globalConfig": "Global Configuration Nodes",
|
"globalConfig": "Global Configuration Nodes",
|
||||||
"triggerAction": "Trigger action",
|
"triggerAction": "Trigger action",
|
||||||
"find": "Find in workspace",
|
"find": "Find in workspace",
|
||||||
"search": {
|
"copyItemUrl": "Copy item url",
|
||||||
"configNodes": "Configuration nodes",
|
"copyURL2Clipboard": "Copied url to clipboard",
|
||||||
"unusedConfigNodes": "Unused configuration nodes",
|
"showFlow": "Show",
|
||||||
"invalidNodes": "Invalid nodes",
|
"hideFlow": "Hide"
|
||||||
"uknownNodes": "Unknown nodes",
|
|
||||||
"unusedSubflows": "Unused subflows"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "Help",
|
"name": "Help",
|
||||||
@@ -633,8 +719,10 @@
|
|||||||
"nodeHelp": "Node Help",
|
"nodeHelp": "Node Help",
|
||||||
"showHelp": "Show help",
|
"showHelp": "Show help",
|
||||||
"showInOutline": "Show in outline",
|
"showInOutline": "Show in outline",
|
||||||
|
"hideTopics": "Hide topics",
|
||||||
"showTopics": "Show topics",
|
"showTopics": "Show topics",
|
||||||
"noHelp": "No help topic selected"
|
"noHelp": "No help topic selected",
|
||||||
|
"changeLog": "Change Log"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"name": "Configuration nodes",
|
"name": "Configuration nodes",
|
||||||
@@ -827,6 +915,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"typedInput": {
|
"typedInput": {
|
||||||
|
"selected": "__count__ selected",
|
||||||
|
"selected_plural": "__count__ selected",
|
||||||
"type": {
|
"type": {
|
||||||
"str": "string",
|
"str": "string",
|
||||||
"num": "number",
|
"num": "number",
|
||||||
@@ -841,11 +931,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editableList": {
|
"editableList": {
|
||||||
"add": "add"
|
"add": "add",
|
||||||
|
"addTitle": "add an item"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
|
"history": "Search history",
|
||||||
|
"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",
|
||||||
@@ -863,9 +966,15 @@
|
|||||||
"invalid-expr": "Invalid JSONata expression:\n __message__",
|
"invalid-expr": "Invalid JSONata expression:\n __message__",
|
||||||
"invalid-msg": "Invalid example JSON message:\n __message__",
|
"invalid-msg": "Invalid example JSON message:\n __message__",
|
||||||
"context-unsupported": "Cannot test context functions\n $flowContext or $globalContext",
|
"context-unsupported": "Cannot test context functions\n $flowContext or $globalContext",
|
||||||
|
"env-unsupported": "Cannot test $env function",
|
||||||
|
"moment-unsupported": "Cannot test $moment function",
|
||||||
|
"clone-unsupported": "Cannot test $clone function",
|
||||||
"eval": "Error evaluating expression:\n __message__"
|
"eval": "Error evaluating expression:\n __message__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"monaco": {
|
||||||
|
"setTheme": "Set theme"
|
||||||
|
},
|
||||||
"jsEditor": {
|
"jsEditor": {
|
||||||
"title": "JavaScript editor"
|
"title": "JavaScript editor"
|
||||||
},
|
},
|
||||||
@@ -877,6 +986,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",
|
||||||
@@ -903,7 +1014,10 @@
|
|||||||
"quote": "Quote",
|
"quote": "Quote",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"horizontal-rule": "Horizontal rule",
|
"horizontal-rule": "Horizontal rule",
|
||||||
"toggle-preview": "Toggle preview"
|
"toggle-preview": "Toggle preview",
|
||||||
|
"mermaid": {
|
||||||
|
"summary": "Mermaid Diagram"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"bufferEditor": {
|
"bufferEditor": {
|
||||||
"title": "Buffer editor",
|
"title": "Buffer editor",
|
||||||
@@ -1038,7 +1152,8 @@
|
|||||||
"not-git": "Not a git repository",
|
"not-git": "Not a git repository",
|
||||||
"no-resource": "Repository not found",
|
"no-resource": "Repository not found",
|
||||||
"cant-get-ssh-key-path": "Error! Can't get selected SSH key path.",
|
"cant-get-ssh-key-path": "Error! Can't get selected SSH key path.",
|
||||||
"unexpected_error": "unexpected_error"
|
"unexpected_error": "unexpected_error",
|
||||||
|
"clearContext": "Clear context when switching projects"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"confirm": "Are you sure you want to delete this project?"
|
"confirm": "Are you sure you want to delete this project?"
|
||||||
@@ -1079,18 +1194,58 @@
|
|||||||
"editor-tab": {
|
"editor-tab": {
|
||||||
"properties": "Properties",
|
"properties": "Properties",
|
||||||
"envProperties": "Environment Variables",
|
"envProperties": "Environment Variables",
|
||||||
|
"module": "Module Properties",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"appearance": "Appearance",
|
"appearance": "Appearance",
|
||||||
"preview": "UI Preview",
|
"preview": "UI Preview",
|
||||||
"defaultValue": "Default value"
|
"defaultValue": "Default value"
|
||||||
},
|
},
|
||||||
|
"tourGuide": {
|
||||||
|
"takeATour": "Take a tour",
|
||||||
|
"start": "Start",
|
||||||
|
"next": "Next",
|
||||||
|
"welcomeTours": "Welcome Tours"
|
||||||
|
},
|
||||||
|
"diagnostics": {
|
||||||
|
"title": "System Info"
|
||||||
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
"de": "German",
|
"de": "Deutsch",
|
||||||
"en-US": "English",
|
"en-US": "English",
|
||||||
"ja": "Japanese",
|
"es-ES": "Español (España)",
|
||||||
|
"fr": "Français",
|
||||||
|
"ja": "日本語",
|
||||||
"ko": "Korean",
|
"ko": "Korean",
|
||||||
"ru": "Russian",
|
"pt-BR": "Português (Brasil)",
|
||||||
"zh-CN": "Chinese(Simplified)",
|
"ru": "Русский",
|
||||||
"zh-TW": "Chinese(Traditional)"
|
"zh-CN": "简体中文",
|
||||||
|
"zh-TW": "繁體中文"
|
||||||
|
},
|
||||||
|
"validator": {
|
||||||
|
"errors": {
|
||||||
|
"invalid-json": "Invalid JSON data: __error__",
|
||||||
|
"invalid-expr": "Invalid JSONata expression: __error__",
|
||||||
|
"invalid-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__"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contextMenu": {
|
||||||
|
"showActionList": "Show action list",
|
||||||
|
"insert": "Insert",
|
||||||
|
"node": "Node",
|
||||||
|
"junction": "Junction",
|
||||||
|
"linkNodes": "Link Nodes"
|
||||||
|
},
|
||||||
|
"env-var": {
|
||||||
|
"environment": "Environment",
|
||||||
|
"header": "Global Environment Variables",
|
||||||
|
"revert": "Revert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
vendored
Executable file → Normal file
26
packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
vendored
Executable file → Normal file
26
packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
vendored
Executable file → Normal file
@@ -52,8 +52,8 @@
|
|||||||
"desc": "Finds occurrences of `pattern` within `str` and replaces them with `replacement`.\n\nThe optional `limit` parameter is the maximum number of replacements."
|
"desc": "Finds occurrences of `pattern` within `str` and replaces them with `replacement`.\n\nThe optional `limit` parameter is the maximum number of replacements."
|
||||||
},
|
},
|
||||||
"$now": {
|
"$now": {
|
||||||
"args":"",
|
"args": "$[picture [, timezone]]",
|
||||||
"desc":"Generates a timestamp in ISO 8601 compatible format and returns it as a string."
|
"desc": "Generates a timestamp in ISO 8601 compatible format and returns it as a string. If the optional `picture` and `timezone` parameters are supplied, then the current timestamp is formatted as described by the `$fromMillis()` function"
|
||||||
},
|
},
|
||||||
"$base64encode": {
|
"$base64encode": {
|
||||||
"args": "string",
|
"args": "string",
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
},
|
},
|
||||||
"$sort": {
|
"$sort": {
|
||||||
"args": "array [, function]",
|
"args": "array [, function]",
|
||||||
"desc":"Returns an array containing all the values in the `array` parameter, but sorted into order.\n\nIf a comparator `function` is supplied, then it must be a function that takes two parameters:\n\n`function(left, right)`\n\nThis function gets invoked by the sorting algorithm to compare two values left and right. If the value of left should be placed after the value of right in the desired sort order, then the function must return Boolean `true` to indicate a swap. Otherwise it must return `false`."
|
"desc": "Returns an array containing all the values in the `array` parameter, but sorted into order.\n\nIf a comparator `function` is supplied, then it must be a function that takes two parameters:\n\n`function(left, right)`\n\nThis function gets invoked by the sorting algorithm to compare two values `left` and `right`. If the value of `left` should be placed after the value of `right` in the desired sort order, then the function must return Boolean `true` to indicate a swap. Otherwise it must return `false`."
|
||||||
},
|
},
|
||||||
"$reverse": {
|
"$reverse": {
|
||||||
"args": "array",
|
"args": "array",
|
||||||
@@ -200,12 +200,12 @@
|
|||||||
"desc": "Returns a copy of the `string` with extra padding, if necessary, so that its total number of characters is at least the absolute value of the `width` parameter.\n\nIf `width` is a positive number, then the string is padded to the right; if negative, it is padded to the left.\n\nThe optional `char` argument specifies the padding character(s) to use. If not specified, it defaults to the space character."
|
"desc": "Returns a copy of the `string` with extra padding, if necessary, so that its total number of characters is at least the absolute value of the `width` parameter.\n\nIf `width` is a positive number, then the string is padded to the right; if negative, it is padded to the left.\n\nThe optional `char` argument specifies the padding character(s) to use. If not specified, it defaults to the space character."
|
||||||
},
|
},
|
||||||
"$fromMillis": {
|
"$fromMillis": {
|
||||||
"args": "number",
|
"args": "number, [, picture [, timezone]]",
|
||||||
"desc": "Convert a number representing milliseconds since the Unix Epoch (1 January, 1970 UTC) to a timestamp string in the ISO 8601 format."
|
"desc": "Convert the `number` representing milliseconds since the Unix Epoch (1 January, 1970 UTC) to a formatted string representation of the timestamp as specified by the picture string.\n\nIf the optional `picture` parameter is omitted, then the timestamp is formatted in the ISO 8601 format.\n\nIf the optional `picture` string is supplied, then the timestamp is formatted according to the representation specified in that string. The behaviour of this function is consistent with the two-argument version of the XPath/XQuery function `format-dateTime` as defined in the XPath F&O 3.1 specification. The picture string parameter defines how the timestamp is formatted and has the same syntax as `format-dateTime`.\n\nIf the optional `timezone` string is supplied, then the formatted timestamp will be in that timezone. The `timezone` string should be in the format '±HHMM', where ± is either the plus or minus sign and HHMM is the offset in hours and minutes from UTC. Positive offset for timezones east of UTC, negative offset for timezones west of UTC."
|
||||||
},
|
},
|
||||||
"$formatNumber": {
|
"$formatNumber": {
|
||||||
"args": "number, picture [, options]",
|
"args": "number, picture [, options]",
|
||||||
"desc": "Casts the `number` to a string and formats it to a decimal representation as specified by the `picture` string.\n\n The behaviour of this function is consistent with the XPath/XQuery function fn:format-number as defined in the XPath F&O 3.1 specification. The picture string parameter defines how the number is formatted and has the same syntax as fn:format-number.\n\nThe optional third argument `options` is used to override the default locale specific formatting characters such as the decimal separator. If supplied, this argument must be an object containing name/value pairs specified in the decimal format section of the XPath F&O 3.1 specification."
|
"desc": "Casts the `number` to a string and formats it to a decimal representation as specified by the `picture` string.\n\n The behaviour of this function is consistent with the XPath/XQuery function `fn:format-number` as defined in the XPath F&O 3.1 specification. The `picture` string parameter defines how the number is formatted and has the same syntax as `fn:format-number`.\n\nThe optional third argument `options` is used to override the default locale specific formatting characters such as the decimal separator. If supplied, this argument must be an object containing name/value pairs specified in the decimal format section of the XPath F&O 3.1 specification."
|
||||||
},
|
},
|
||||||
"$formatBase": {
|
"$formatBase": {
|
||||||
"args": "number [, radix]",
|
"args": "number [, radix]",
|
||||||
@@ -237,25 +237,25 @@
|
|||||||
},
|
},
|
||||||
"$assert": {
|
"$assert": {
|
||||||
"args": "arg, str",
|
"args": "arg, str",
|
||||||
"desc": "If `arg` is true the function returns undefined. If `arg` is false an exception is thrown with `str` as the message of the exception."
|
"desc": "If `arg` is `true` the function returns `undefined`. If `arg` is `false` an exception is thrown with `str` as the message of the exception."
|
||||||
},
|
},
|
||||||
"$single": {
|
"$single": {
|
||||||
"args": "array, function",
|
"args": "array, function",
|
||||||
"desc": "Returns the one and only value in the `array` parameter that satisfies the `function` predicate (i.e. the `function` returns Boolean `true` when passed the value). Throws an exception if the number of matching values is not exactly one.\n\nThe function should be supplied in the following signature: `function(value [, index [, array]])` where value is each input of the array, index is the position of that value and the whole array is passed as the third argument"
|
"desc": "Returns the one and only value in the `array` parameter that satisfies the `function` predicate (i.e. the `function` returns Boolean `true` when passed the value). Throws an exception if the number of matching values is not exactly one.\n\nThe function should be supplied in the following signature: `function(value [, index [, array]])` where value is each input of the array, index is the position of that value and the whole array is passed as the third argument"
|
||||||
},
|
},
|
||||||
"$encodeUrl": {
|
"$encodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Encodes a Uniform Resource Locator (URL) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.\n\nExample: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
"desc": "Encodes a Uniform Resource Locator (URL) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.\n\nExample: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
},
|
},
|
||||||
"$encodeUrlComponent": {
|
"$encodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Encodes a Uniform Resource Locator (URL) by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.\n\nExample: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
"desc": "Encodes a Uniform Resource Locator (URL) by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.\n\nExample: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrl": {
|
"$decodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Decodes a Uniform Resource Locator (URL) component previously created by encodeUrlComponent.\n\nExample: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
"desc": "Decodes a Uniform Resource Locator (URL) component previously created by encodeUrlComponent.\n\nExample: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrlComponent": {
|
"$decodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Decodes a Uniform Resource Locator (URL) previously created by encodeUrl.\n\nExample: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
"desc": "Decodes a Uniform Resource Locator (URL) previously created by encodeUrl.\n\nExample: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
},
|
},
|
||||||
@@ -270,5 +270,9 @@
|
|||||||
"$moment": {
|
"$moment": {
|
||||||
"args": "[str]",
|
"args": "[str]",
|
||||||
"desc": "Gets a date object using the Moment library."
|
"desc": "Gets a date object using the Moment library."
|
||||||
|
},
|
||||||
|
"$clone": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "Safely clone an object."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1235
packages/node_modules/@node-red/editor-client/locales/es-ES/editor.json
vendored
Normal file
1235
packages/node_modules/@node-red/editor-client/locales/es-ES/editor.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
26
packages/node_modules/@node-red/editor-client/locales/es-ES/infotips.json
vendored
Normal file
26
packages/node_modules/@node-red/editor-client/locales/es-ES/infotips.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"tip0": "Puedes eliminar los nodos o enlaces seleccionados con {{core:delete-selection}}",
|
||||||
|
"tip1": "Busca nodos con {{core:search}}",
|
||||||
|
"tip2": "{{core:toggle-sidebar}} alternará la vista de esta barra lateral",
|
||||||
|
"tip3": "Puedes gestionar tu paleta de nodos con {{core:manage-palette}}",
|
||||||
|
"tip4": "Tus nodos de configuración de flujo aparecen en el panel de la barra lateral. Se puede acceder desde el menú o con {{core:show-config-tab}}",
|
||||||
|
"tip5": "Activa o desactiva estos consejos desde la opción en la configuración",
|
||||||
|
"tip6": "Mueve los nodos seleccionados usando las teclas [izquierda] [arriba] [abajo] y [derecha]. Mantén pulsada [Mayús] para desplazarlos más",
|
||||||
|
"tip7": "Arrastrar un nodo a un cable lo insertará en el enlace",
|
||||||
|
"tip8": "Exporta los nodos seleccionados, o la pestaña actual con {{core:show-export-dialog}}",
|
||||||
|
"tip9": "Importa un flujo arrastrando su JSON al editor, o con {{core:show-import-dialog}}",
|
||||||
|
"tip10": "[shift][clic] y arrastrar en un puerto de nodo para mover todos los cables conectados o sólo el seleccionado",
|
||||||
|
"tip11": "Mostrar la pestaña Información con {{core:show-info-tab}} o la pestaña Depuración con {{core:show-debug-tab}}",
|
||||||
|
"tip12": "[ctrl] [clic] en el área de trabajo para abrir el diálogo de adición rápida",
|
||||||
|
"tip13": "Mantén pulsada [ctrl] cuando [haces clic] en un puerto de nodo para habilitar el enlazado rápido",
|
||||||
|
"tip14": "Mantén pulsada [shift] cuando [haces clic] en un nodo para seleccionar también todos sus nodos conectados",
|
||||||
|
"tip15": "Mantén pulsada [ctrl] cuando [haces clic] en un nodo para añadirlo o eliminarlo de la selección actual",
|
||||||
|
"tip16": "Cambia de pestaña de flujo con {{core:show-previous-tab}} y {{core:show-next-tab}}",
|
||||||
|
"tip17": "Puedes confirmar tus cambios en la bandeja de edición de nodos con {{core:confirm-edit-tray}} o cancelarlos con {{core:cancel-edit-tray}}",
|
||||||
|
"tip18": "Al pulsar {{core:edit-selected-node}} se editará el primer nodo de la selección actual"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
278
packages/node_modules/@node-red/editor-client/locales/es-ES/jsonata.json
vendored
Normal file
278
packages/node_modules/@node-red/editor-client/locales/es-ES/jsonata.json
vendored
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
{
|
||||||
|
"$string": {
|
||||||
|
"args": "arg[, prettify]",
|
||||||
|
"desc": "Convierte el parámetro `arg` a una cadena usando las siguientes reglas de conversión:\n\n - Las cadenas no cambian\n - Las funciones se convierten en una cadena vacía\n - El infinito numérico y NaN arrojan un error porque no se pueden representar como un número JSON\n: todos los demás valores se convierten a una cadena JSON usando la función `JSON.stringify`. Si `prettify` es verdadero, entonces se produce JSON \"prettified\". es decir, una línea por campo y las líneas se indentarán según la profundidad del campo."
|
||||||
|
},
|
||||||
|
"$length": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Devuelve el número de caracteres de la cadena `str`. Se genera un error si `str` no es una cadena."
|
||||||
|
},
|
||||||
|
"$substring": {
|
||||||
|
"args": "str, start[, length]",
|
||||||
|
"desc": "Devuelve una cadena que contiene los caracteres del primer parámetro `str` comenzando en la posición `start` (desplazamiento cero). Si se especifica 'longitud', la subcadena contendrá el máximo de caracteres de 'longitud'. Si 'inicio' es negativo, indica el número de caracteres desde el final de 'cadena'."
|
||||||
|
},
|
||||||
|
"$substringBefore": {
|
||||||
|
"args": "str, chars",
|
||||||
|
"desc": "Devuelve la subcadena antes de la primera aparición de la secuencia de caracteres `chars` en `str`. Si `str` no contiene `caracteres`, entonces devuelve `str`."
|
||||||
|
},
|
||||||
|
"$substringAfter": {
|
||||||
|
"args": "str, chars",
|
||||||
|
"desc": "Devuelve la subcadena después de la primera aparición de la secuencia de caracteres `chars` en `str`. Si `str` no contiene `caracteres`, entonces devuelve `str`."
|
||||||
|
},
|
||||||
|
"$uppercase": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Devuelve una cadena con todos los caracteres de `str` convertidos a mayúsculas."
|
||||||
|
},
|
||||||
|
"$lowercase": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Devuelve una cadena con todos los caracteres de `str` convertidos a minúsculas."
|
||||||
|
},
|
||||||
|
"$trim": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Normaliza y recorta todos los caracteres de espacio en blanco en `str` aplicando los siguientes pasos:\n\n - Todas las tabulaciones, retornos de carro y avances de línea se reemplazan con espacios.\n- Las secuencias contiguas de espacios se reducen a un solo espacio.\n- Se eliminan los espacios iniciales y finales.\n\n Si no se especifica `str` (es decir, esta función se invoca sin argumentos), entonces el valor de contexto se utiliza como el valor de `str`. Se genera un error si `str` no es una cadena."
|
||||||
|
},
|
||||||
|
"$contains": {
|
||||||
|
"args": "str, pattern",
|
||||||
|
"desc": "Devuelve 'verdadero' si 'cadena' coincide con 'patrón', de lo contrario, devuelve 'falso'. Si no se especifica `str` (es decir, esta función se invoca con un argumento), entonces el valor del contexto se utiliza como valor de `str`. El parámetro `patrón` puede ser una cadena o una expresión regular."
|
||||||
|
},
|
||||||
|
"$split": {
|
||||||
|
"args": "str[, separator][, limit]",
|
||||||
|
"desc": "Divide el parámetro `str` en una matriz de subcadenas. Es un error si `str` no es una cadena. El parámetro opcional `separador` especifica los caracteres dentro de la `cadena` sobre los cuales se debe dividir como una cadena o una expresión regular. Si no se especifica 'separador', se supone que la cadena está vacía y 'cadena' se dividirá en una matriz de caracteres individuales. Es un error si el 'separador' no es una cadena. El parámetro opcional 'límite' es un número que especifica el número máximo de subcadenas que se incluirán en la matriz resultante. Cualquier subcadena adicional se descarta. Si no se especifica `límite`, entonces `str` se divide completamente sin límite para el tamaño de la matriz resultante. Es un error si 'límite' no es un número positivo."
|
||||||
|
},
|
||||||
|
"$join": {
|
||||||
|
"args": "array[, separator]",
|
||||||
|
"desc": "Une una matriz de cadenas de componentes en una única cadena concatenada con cada cadena de componentes separada por el parámetro 'separador' opcional. Es un error si la 'matriz' de entrada contiene un elemento que no es una cadena. Si no se especifica 'separador', se supone que es una cadena vacía, es decir, que no hay 'separador' entre las cadenas componentes. Es un error si el 'separador' no es una cadena."
|
||||||
|
},
|
||||||
|
"$match": {
|
||||||
|
"args": "str, pattern [, limit]",
|
||||||
|
"desc": "Aplica la cadena `str` a la expresión regular `pattern` y devuelve una matriz de objetos, cada objeto contiene información sobre cada aparición de una coincidencia dentro de `str`."
|
||||||
|
},
|
||||||
|
"$replace": {
|
||||||
|
"args": "str, pattern, replacement [, limit]",
|
||||||
|
"desc": "Encuentra apariciones de `patrón` dentro de `str` y las reemplaza con `reemplazo`.\n\nEl parámetro opcional `límite` es el número máximo de reemplazos."
|
||||||
|
},
|
||||||
|
"$now": {
|
||||||
|
"args": "$[picture [, timezone]]",
|
||||||
|
"desc": "Genera una marca de tiempo en formato compatible con ISO 8601 y la devuelve como una cadena. Si se proporcionan los parámetros opcionales `picture` y `zona horaria`, entonces la marca de tiempo actual se formatea como se describe en la función `$fromMillis()`"
|
||||||
|
},
|
||||||
|
"$base64encode": {
|
||||||
|
"args": "string",
|
||||||
|
"desc": "Convierte una cadena ASCII a una representación base 64. Cada carácter de la cadena se trata como un byte de datos binarios. Esto requiere que todos los caracteres de la cadena estén en el rango de 0x00 a 0xFF, que incluye todos los caracteres de las cadenas codificadas con URI. No se admiten caracteres Unicode fuera de ese rango."
|
||||||
|
},
|
||||||
|
"$base64decode": {
|
||||||
|
"args": "string",
|
||||||
|
"desc": "Convierte bytes codificados en base 64 en una cadena, utilizando una página de códigos Unicode UTF-8."
|
||||||
|
},
|
||||||
|
"$number": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Convierte el parámetro `arg` a un número usando las siguientes reglas de conversión:\n\n - Los números no cambian\n - Las cadenas que contienen una secuencia de caracteres que representan un número JSON legal se convierten a ese número\n - Todos los demás valores provocar que se arroje un error."
|
||||||
|
},
|
||||||
|
"$abs": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Devuelve el valor absoluto del parámetro 'número'."
|
||||||
|
},
|
||||||
|
"$floor": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Devuelve el valor de 'número' redondeado hacia abajo al entero más cercano que sea menor o igual a 'número'."
|
||||||
|
},
|
||||||
|
"$ceil": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Devuelve el valor de 'número' redondeado al número entero más cercano que sea mayor o igual a 'número'."
|
||||||
|
},
|
||||||
|
"$round": {
|
||||||
|
"args": "number [, precision]",
|
||||||
|
"desc": "Devuelve el valor del parámetro 'número' redondeado al número de decimales especificado por el parámetro opcional 'precisión'."
|
||||||
|
},
|
||||||
|
"$power": {
|
||||||
|
"args": "base, exponent",
|
||||||
|
"desc": "Devuelve el valor de 'base' elevado a la potencia de 'exponente'."
|
||||||
|
},
|
||||||
|
"$sqrt": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Devuelve la raíz cuadrada del valor del parámetro 'número'."
|
||||||
|
},
|
||||||
|
"$random": {
|
||||||
|
"args": "",
|
||||||
|
"desc": "Devuelve un número pseudoaleatorio mayor o igual a cero y menor que uno."
|
||||||
|
},
|
||||||
|
"$millis": {
|
||||||
|
"args": "",
|
||||||
|
"desc": "Devuelve el número de milisegundos desde la época Unix (1 de enero de 1970 UTC) como un número. Todas las invocaciones de `$millis()` dentro de una evaluación de una expresión devolverán el mismo valor."
|
||||||
|
},
|
||||||
|
"$sum": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve la suma aritmética de una 'matriz' de números. Es un error si la 'matriz' de entrada contiene un elemento que no es un número."
|
||||||
|
},
|
||||||
|
"$max": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve el número máximo en una 'matriz' de números. Es un error si la 'matriz' de entrada contiene un elemento que no es un número."
|
||||||
|
},
|
||||||
|
"$min": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve el número mínimo en una 'matriz' de números. Es un error si la 'matriz' de entrada contiene un elemento que no es un número."
|
||||||
|
},
|
||||||
|
"$average": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve el valor medio de una 'matriz' de números. Es un error si la 'matriz' de entrada contiene un elemento que no es un número."
|
||||||
|
},
|
||||||
|
"$boolean": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Convierte el argumento a un booleano usando las siguientes reglas:\n\n - `Booleano`: sin cambios\n - `cadena`: vacía: `falso`\n - `cadena`: no vacía: `verdadero`\n - `número`: `0`: `falso`\n - `número`: distinto de cero: `verdadero`\n - `nulo`: `falso`\n - `matriz`: vacía: `falso`\n - `array`: contiene un miembro que se convierte en `true`: `true`\n - `array`: todos los miembros se convierten en `false`: `false`\n - `object`: vacío: `false`\n - `objeto`: no vacío: `verdadero`\n - `función`: `falso`"
|
||||||
|
},
|
||||||
|
"$not": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Devuelve booleano NEGADO del argumento. `arg` se convierte antes en un booleano"
|
||||||
|
},
|
||||||
|
"$exists": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Devuelve booleano 'verdadero' si la expresión 'arg' se evalúa como un valor, o 'falso' si la expresión no coincide con nada (por ejemplo, una ruta a una referencia de campo inexistente)."
|
||||||
|
},
|
||||||
|
"$count": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve el número de elementos de la matriz."
|
||||||
|
},
|
||||||
|
"$append": {
|
||||||
|
"args": "array, array",
|
||||||
|
"desc": "Agrega dos matrices"
|
||||||
|
},
|
||||||
|
"$sort": {
|
||||||
|
"args": "array [, function]",
|
||||||
|
"desc": "Devuelve una matriz que contiene todos los valores en el parámetro `array`, pero ordenados.\n\nSi se proporciona una `función` de comparador, entonces debe ser una función que toma dos parámetros:\n\n`function(left , derecha)`\n\nEsta función es invocada por el algoritmo de clasificación para comparar dos valores `izquierda` y `derecha`. Si el valor de `izquierda` debe colocarse después del valor de `derecha` en el orden de clasificación deseado, entonces la función debe devolver un valor booleano 'verdadero' para indicar un intercambio. De lo contrario debe devolver 'falso'."
|
||||||
|
},
|
||||||
|
"$reverse": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve una matriz que contiene todos los valores del parámetro `matriz`, pero en orden inverso."
|
||||||
|
},
|
||||||
|
"$shuffle": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve una matriz que contiene todos los valores del parámetro `array`, pero mezclados en orden aleatorio."
|
||||||
|
},
|
||||||
|
"$zip": {
|
||||||
|
"args": "array, ...",
|
||||||
|
"desc": "Devuelve una matriz convolucionada (comprimida) que contiene matrices agrupadas de valores de los argumentos `matriz1`... `matrizN` del índice 0, 1, 2...."
|
||||||
|
},
|
||||||
|
"$keys": {
|
||||||
|
"args": "object",
|
||||||
|
"desc": "Devuelve una matriz que contiene las claves del objeto. Si el argumento es una matriz de objetos, entonces la matriz devuelta contiene una lista deduplicada de todas las claves de todos los objetos."
|
||||||
|
},
|
||||||
|
"$lookup": {
|
||||||
|
"args": "object, key",
|
||||||
|
"desc": "Devuelve el valor asociado con la clave en el objeto. Si el primer argumento es una matriz de objetos, entonces se buscan todos los objetos de la matriz y se devuelven los valores asociados con todas las apariciones de la clave."
|
||||||
|
},
|
||||||
|
"$spread": {
|
||||||
|
"args": "object",
|
||||||
|
"desc": "Divide un objeto que contiene pares clave/valor en una matriz de objetos, cada uno de los cuales tiene un único par clave/valor del objeto de entrada. Si el parámetro es una matriz de objetos, entonces la matriz resultante contiene un objeto para cada par clave/valor en cada objeto de la matriz proporcionada."
|
||||||
|
},
|
||||||
|
"$merge": {
|
||||||
|
"args": "array<object>",
|
||||||
|
"desc": "Fusiona una matriz de objetos en un único objeto que contiene todos los pares clave/valor de cada uno de los objetos en la matriz de entrada. Si alguno de los objetos de entrada contiene la misma clave, entonces el objeto devuelto contendrá el valor del último en la matriz. Es un error si la matriz de entrada contiene un elemento que no es un objeto."
|
||||||
|
},
|
||||||
|
"$sift": {
|
||||||
|
"args": "object, function",
|
||||||
|
"desc": "Devuelve un objeto que contiene solo los pares clave/valor del parámetro `objeto` que satisfacen el predicado `función` pasado como segundo parámetro.\n\nLa `función` que se proporciona como segundo parámetro debe tener la siguiente firma:\n\n`función(valor [, clave [, objeto]])`"
|
||||||
|
},
|
||||||
|
"$each": {
|
||||||
|
"args": "object, function",
|
||||||
|
"desc": "Devuelve una matriz que contiene los valores devueltos por la función cuando se aplica a cada par clave/valor en el objeto."
|
||||||
|
},
|
||||||
|
"$map": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Devuelve una matriz que contiene los resultados de aplicar el parámetro `función` a cada valor en el parámetro `matriz`.\n\nLa `función` que se proporciona como segundo parámetro debe tener la siguiente firma:\n\n`función( valor [, índice [, matriz]])`"
|
||||||
|
},
|
||||||
|
"$filter": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Devuelve una matriz que contiene solo los valores en el parámetro `matriz` que satisfacen el predicado `función`.\n\nLa `función` que se proporciona como segundo parámetro debe tener la siguiente firma:\n\n`función(valor [ , índice [, matriz]])`"
|
||||||
|
},
|
||||||
|
"$reduce": {
|
||||||
|
"args": "array, function [, init]",
|
||||||
|
"desc": "Devuelve un valor agregado derivado de aplicar el parámetro `función` sucesivamente a cada valor en `matriz` en combinación con el resultado de la aplicación anterior de la función.\n\nLa función debe aceptar dos argumentos y se comporta como un operador infijo entre cada valor dentro de la matriz. La firma de la `función` debe tener la forma: `myfunc($accumulator, $value[, $index[, $array]])`\n\nEl parámetro opcional `init` se utiliza como valor inicial en la agregación."
|
||||||
|
},
|
||||||
|
"$flowContext": {
|
||||||
|
"args": "string[, string]",
|
||||||
|
"desc": "Recupera una propiedad de contexto de flujo.\n\nEsta es una función definida por Node-RED."
|
||||||
|
},
|
||||||
|
"$globalContext": {
|
||||||
|
"args": "string[, string]",
|
||||||
|
"desc": "Recupera una propiedad de contexto global.\n\nEsta es una función definida por Node-RED."
|
||||||
|
},
|
||||||
|
"$pad": {
|
||||||
|
"args": "string, width [, char]",
|
||||||
|
"desc": "Devuelve una copia de la `cadena` con relleno adicional, si es necesario, de modo que su número total de caracteres sea al menos el valor absoluto del parámetro `ancho`.\n\nSi `ancho` es un número positivo, entonces la cadena está acolchado hacia la derecha; si es negativo, se rellena hacia la izquierda.\n\nEl argumento opcional `char` especifica los caracteres de relleno que se utilizarán. Si no se especifica, el valor predeterminado es el carácter de espacio."
|
||||||
|
},
|
||||||
|
"$fromMillis": {
|
||||||
|
"args": "number, [, picture [, timezone]]",
|
||||||
|
"desc": "Convierte el `número` que representa milisegundos desde la época Unix (1 de enero de 1970 UTC) en una representación de cadena formateada según la plantilla en picture.\n\nSi se omite el parámetro opcional `picture`, entonces la marca de tiempo es formateado en el formato ISO 8601.\n\nSi se proporciona la cadena opcional `picture`, entonces la marca de tiempo se formatea de acuerdo con la representación especificada en esa cadena. El comportamiento de esta función es consistente con la versión de dos argumentos de la función XPath/XQuery `format-dateTime` tal como se define en la especificación XPath F&O 3.1. El parámetro de plantilla define cómo se formatea la marca de tiempo y tiene la misma sintaxis que `format-dateTime`.\n\nSi se proporciona la cadena opcional `timezone`, entonces la marca de tiempo formateada estará en esa zona horaria. La cadena `timezone` debe tener el formato '±HHMM', donde ± es el signo más o menos y HHMM es el desplazamiento en horas y minutos desde UTC. Desplazamiento positivo para zonas horarias al este de UTC, desplazamiento negativo para zonas horarias al oeste de UTC."
|
||||||
|
},
|
||||||
|
"$formatNumber": {
|
||||||
|
"args": "number, picture [, options]",
|
||||||
|
"desc": "Convierte el `número` en una cadena y lo formatea en una representación decimal según lo especificado en la cadena `picture`.\n\n El comportamiento de esta función es coherente con la función XPath/XQuery `fn:format-number` tal como se define en la especificación XPath F&O 3.1. El parámetro de cadena `picture` define cómo se formatea el número y tiene la misma sintaxis que `fn:formato-número`.\n\nEl tercer argumento opcional `opciones` se utiliza para anular los caracteres de formato específicos de la configuración regional predeterminada, como el decimal. separador. Si se proporciona, este argumento debe ser un objeto que contenga pares de nombre/valor especificados en la sección de formato decimal de la especificación XPath F&O 3.1."
|
||||||
|
},
|
||||||
|
"$formatBase": {
|
||||||
|
"args": "number [, radix]",
|
||||||
|
"desc": "Convierte el número en una cadena y lo formatea como un número entero representado en la base numérica especificada por el argumento `radix`. Si no se especifica `radix`, el valor predeterminado es la base 10. `radix` puede estar entre 2 y 36; de lo contrario, se genera un error."
|
||||||
|
},
|
||||||
|
"$toMillis": {
|
||||||
|
"args": "timestamp",
|
||||||
|
"desc": "Convierte una cadena de `marca de tiempo` en el formato ISO 8601 al número de milisegundos desde la época Unix (1 de enero de 1970 UTC) como un número. Se genera un error si la cadena no tiene el formato correcto."
|
||||||
|
},
|
||||||
|
"$env": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Devuelve el valor de una variable de entorno.\n\nEsta es una función definida por Node-RED."
|
||||||
|
},
|
||||||
|
"$eval": {
|
||||||
|
"args": "expr [, context]",
|
||||||
|
"desc": "Analiza y evalúa la cadena `expr` que contiene JSON literal o una expresión JSONata utilizando el contexto actual como contexto para la evaluación."
|
||||||
|
},
|
||||||
|
"$formatInteger": {
|
||||||
|
"args": "number, picture",
|
||||||
|
"desc": "Convierte el número en una cadena y lo formatea en una representación entera como lo especifica la cadena `picture`. El parámetro de define cómo se formatea el número y tiene la misma sintaxis que `fn:format-integer` de la especificación XPath F&O 3.1."
|
||||||
|
},
|
||||||
|
"$parseInteger": {
|
||||||
|
"args": "string, picture",
|
||||||
|
"desc": "Analiza el contenido del parámetro cadena en un número entero (como un número JSON) utilizando el formato especificado por la cadena `picture`. El parámetro tiene el mismo formato que `$formatInteger`."
|
||||||
|
},
|
||||||
|
"$error": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Lanza un error con un mensaje. El parámetro `str` opcional reemplazará el mensaje predeterminado de `$error() función evaluada`"
|
||||||
|
},
|
||||||
|
"$assert": {
|
||||||
|
"args": "arg, str",
|
||||||
|
"desc": "Si `arg` es `verdadero`, la función devuelve indefinido. Si `arg` es `falso`, se lanza una excepción con `str` como mensaje de excepción."
|
||||||
|
},
|
||||||
|
"$single": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Devuelve el único valor en el parámetro `array` que satisface el predicado de `función` (es decir, la `función` devuelve booleano `verdadero` cuando se pasa el valor). Lanza una excepción si el número de valores coincidentes no es exactamente uno.\n\nLa función debe proporcionarse con la siguiente firma: `función(valor [, índice [, matriz]])` donde el valor es cada entrada de la matriz. El índice es la posición de ese valor y toda la matriz se pasa como tercer argumento."
|
||||||
|
},
|
||||||
|
"$encodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Codifica un componente de URL reemplazando cada instancia de ciertos caracteres por una, dos, tres o cuatro secuencias de escape que representan la codificación UTF-8 del carácter.\n\nEjemplo: `$encodeUrlComponent(\"?x=prueba\")` => `\"%3Fx%3Dprueba\"`"
|
||||||
|
},
|
||||||
|
"$encodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Codifica una URL reemplazando cada instancia de ciertos caracteres por una, dos, tres o cuatro secuencias de escape que representan la codificación UTF-8 del carácter.\n\nEjemplo: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Decodifica un componente de URL creado previamente por encodeUrlComponent.\n\nEjemplo: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Decodifica una URL creado previamente por encodeUrl.\n\nEjemplo: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
|
},
|
||||||
|
"$distinct": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Devuelve una matriz con valores duplicados eliminados de `matriz`"
|
||||||
|
},
|
||||||
|
"$type": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "Devuelve el tipo de `valor` como una cadena. Si `valor` no está definido, esto devolverá indefinido."
|
||||||
|
},
|
||||||
|
"$moment": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Obtiene un objeto de fecha usando la biblioteca Moment."
|
||||||
|
},
|
||||||
|
"$clone": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "Clona un objeto de forma segura."
|
||||||
|
}
|
||||||
|
}
|
||||||
1393
packages/node_modules/@node-red/editor-client/locales/fr/editor.json
vendored
Normal file
1393
packages/node_modules/@node-red/editor-client/locales/fr/editor.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
23
packages/node_modules/@node-red/editor-client/locales/fr/infotips.json
vendored
Normal file
23
packages/node_modules/@node-red/editor-client/locales/fr/infotips.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"tip0": "Vous pouvez supprimer les noeuds ou les liens sélectionnés avec {{core:delete-selection}}",
|
||||||
|
"tip1": "Rechercher des noeuds à l'aide de {{core:search}}",
|
||||||
|
"tip2": "{{core:toggle-sidebar}} basculera l'affichage de cette barre latérale",
|
||||||
|
"tip3": "Vous pouvez gérer votre palette de noeuds avec {{core:manage-palette}}",
|
||||||
|
"tip4": "Vos noeuds de configuration de flux sont répertoriés dans le panneau de la barre latérale. Ils sont accessibles depuis le menu ou avec {{core:show-config-tab}}",
|
||||||
|
"tip5": "Activer ou désactiver ces conseils à partir de l'option dans les paramètres",
|
||||||
|
"tip6": "Déplacer les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintenir la touche [shift] enfoncée pour les pousser plus loin",
|
||||||
|
"tip7": "Faire glisser un noeud sur un fil le raccordera au lien",
|
||||||
|
"tip8": "Exporter les noeuds sélectionnés, ou l'onglet actuel avec {{core:show-export-dialog}}",
|
||||||
|
"tip9": "Importer un flux en faisant glisser son JSON dans l'éditeur, ou avec {{core:show-import-dialog}}",
|
||||||
|
"tip10": "[majuscule] [clic] et faites glisser sur un port de noeud pour déplacer tous les fils attachés ou seulement celui sélectionné",
|
||||||
|
"tip11": "Afficher l'onglet Infos avec {{core:show-info-tab}} ou l'onglet Débogage avec {{core:show-debug-tab}}",
|
||||||
|
"tip12": "[ctrl] [clic] dans l'espace de travail pour ouvrir la boîte de dialogue d'ajout rapide",
|
||||||
|
"tip13": "Maintenir la touche [ctrl] enfoncée lorsque vous [cliquez] sur un port de noeud pour activer le câblage rapide",
|
||||||
|
"tip14": "Maintenir la touche [shift] enfoncée lorsque vous [cliquez] sur un noeud pour sélectionner également tous ses noeuds connectés",
|
||||||
|
"tip15": "Maintenir la touche [ctrl] enfoncée lorsque vous [cliquez] sur un noeud pour l'ajouter ou le supprimer de la sélection actuelle",
|
||||||
|
"tip16": "Changer d'onglet de flux avec {{core:show-previous-tab}} et {{core:show-next-tab}}",
|
||||||
|
"tip17": "Vous pouvez confirmer vos modifications dans le panneau d'édition du noeud avec {{core:confirm-edit-tray}} ou les annuler avec {{core:cancel-edit-tray}}",
|
||||||
|
"tip18": "Appuyer sur {{core:edit-selected-node}} modifiera le premier noeud de la sélection actuelle"
|
||||||
|
}
|
||||||
|
}
|
||||||
278
packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json
vendored
Normal file
278
packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json
vendored
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
{
|
||||||
|
"$string": {
|
||||||
|
"args": "arg[, prettify]",
|
||||||
|
"desc": "Convertit le paramètre `arg` en une chaîne de caractères en utilisant les règles de typage suivantes :\n\n - Les chaînes de caractères sont inchangées\n - Les fonctions sont converties en une chaîne vide\n - L'infini numérique et NaN renvoient une erreur car ils ne peuvent pas être représentés comme un Numéro JSON\n - Toutes les autres valeurs sont converties en une chaîne JSON à l'aide de la fonction `JSON.stringify`. Si `prettify` est vrai, alors le JSON \"prettified\" est produit. c'est-à-dire une ligne par champ et les lignes seront en retrait en fonction de la profondeur du champ."
|
||||||
|
},
|
||||||
|
"$length": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Renvoie le nombre de caractères dans la chaîne `str`. Une erreur est renvoyée si `str` n'est pas une chaîne de caractères."
|
||||||
|
},
|
||||||
|
"$substring": {
|
||||||
|
"args": "str, start[, length]",
|
||||||
|
"desc": "Renvoie une chaîne contenant les caractères du premier paramètre `str` commençant à la position `start` (pas de décalage). Si `length` est spécifié, alors la sous-chaîne contiendra un maximum de caractères `length`. Si `start` est négatif alors il indique le nombre de caractères à partir de la fin de `str`."
|
||||||
|
},
|
||||||
|
"$substringBefore": {
|
||||||
|
"args": "str, chars",
|
||||||
|
"desc": "Renvoie la sous-chaîne avant la première occurrence de la séquence de caractères `chars` dans `str`. Si `str` ne contient pas `chars`, alors il renvoie `str`."
|
||||||
|
},
|
||||||
|
"$substringAfter": {
|
||||||
|
"args": "str, chars",
|
||||||
|
"desc": "Renvoie la sous-chaîne après la première occurrence de la séquence de caractères `chars` dans `str`. Si `str` ne contient pas `chars`, alors il renvoie `str`."
|
||||||
|
},
|
||||||
|
"$uppercase": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Renvoie une chaîne avec tous les caractères de `str` convertis en majuscules."
|
||||||
|
},
|
||||||
|
"$lowercase": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Renvoie une chaîne avec tous les caractères de `str` convertis en minuscules."
|
||||||
|
},
|
||||||
|
"$trim": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Normalise et supprime tous les caractères d'espacement dans `str` en appliquant les étapes suivantes :\n\n - Toutes les tabulations, retours à la ligne et sauts de ligne sont remplacés par des espaces.\n- Les séquences contiguës d'espaces sont réduites à un seul espace.\n- Les espaces de fin et de début sont supprimés.\n\n Si `str` n'est pas spécifié (c'est-à-dire que cette fonction est invoquée sans argument), alors la valeur de contexte est utilisée comme valeur de `str`. Une erreur est renvoyée si `str` n'est pas une chaîne."
|
||||||
|
},
|
||||||
|
"$contains": {
|
||||||
|
"args": "str, pattern",
|
||||||
|
"desc": "Renvoie `true` si `str` correspond à `pattern`, sinon il renvoie `false`. Si `str` n'est pas spécifié (c'est-à-dire que cette fonction est invoquée avec un argument), alors la valeur de contexte est utilisée comme valeur de `str`. Le paramètre `pattern` peut être une chaîne ou une expression régulière."
|
||||||
|
},
|
||||||
|
"$split": {
|
||||||
|
"args": "str[, separator][, limit]",
|
||||||
|
"desc": "Divise le paramètre `str` en un tableau de sous-chaînes. C'est une erreur si `str` n'est pas une chaîne. Le paramètre facultatif `separator` spécifie les caractères à l'intérieur de `str` à propos desquels il doit être divisé en chaîne ou en expression régulière. Si `separator` n'est pas spécifié, la chaîne vide est supposée et `str` sera divisé en un tableau de caractères uniques. C'est une erreur si `separator` n'est pas une chaîne. Le paramètre facultatif `limit` est un nombre qui spécifie le nombre maximum de sous-chaînes à inclure dans le tableau résultant. Toutes les sous-chaînes supplémentaires sont ignorées. Si `limit` n'est pas spécifié, alors `str` est entièrement divisé sans limite à la taille du tableau résultant. C'est une erreur si `limit` n'est pas un nombre non négatif."
|
||||||
|
},
|
||||||
|
"$join": {
|
||||||
|
"args": "array[, separator]",
|
||||||
|
"desc": "Joint un tableau de chaînes de composants en une seule chaîne concaténée, chaque chaîne de composants étant séparée par le paramètre facultatif `separator`. C'est une erreur si l'entrée `array` contient un élément qui n'est pas une chaîne. Si `séparateur` n'est pas spécifié, il est supposé être la chaîne vide, c'est-à-dire qu'il n'y a pas de `séparateur` entre les chaînes de composants. C'est une erreur si `separator` n'est pas une chaîne."
|
||||||
|
},
|
||||||
|
"$match": {
|
||||||
|
"args": "str, pattern [, limit]",
|
||||||
|
"desc": "Applique la chaîne `str` à l'expression régulière `pattern` et renvoie un tableau d'objets, chaque objet contenant des informations sur chaque occurrence d'une correspondance dans `str`."
|
||||||
|
},
|
||||||
|
"$replace": {
|
||||||
|
"args": "str, pattern, replacement [, limit]",
|
||||||
|
"desc": "Trouve les occurrences de `pattern` dans `str` et les remplace par `replacement`.\n\nLe paramètre facultatif `limit` est le nombre maximum de remplacements."
|
||||||
|
},
|
||||||
|
"$now": {
|
||||||
|
"args": "$[picture [, timezone]]",
|
||||||
|
"desc": "Génère un horodatage au format compatible ISO 8601 et le renvoie sous forme de chaîne. Si les paramètres optionnels d'image et de fuseau horaire sont fournis, alors l'horodatage actuel est formaté comme décrit par la fonction `$fromMillis()`"
|
||||||
|
},
|
||||||
|
"$base64encode": {
|
||||||
|
"args": "string",
|
||||||
|
"desc": "Convertit une chaîne ASCII en une représentation en base 64. Chaque caractère de la chaîne est traité comme un octet de données binaires. Cela nécessite que tous les caractères de la chaîne se trouvent dans la plage 0x00 à 0xFF, qui inclut tous les caractères des chaînes encodées en URI. Les caractères Unicode en dehors de cette plage ne sont pas pris en charge."
|
||||||
|
},
|
||||||
|
"$base64decode": {
|
||||||
|
"args": "string",
|
||||||
|
"desc": "Convertit les octets encodés en base 64 en une chaîne, à l'aide d'une page de codes Unicode UTF-8."
|
||||||
|
},
|
||||||
|
"$number": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Convertit le paramètre `arg` en un nombre en utilisant les règles de conversion suivantes :\n\n - Les nombres sont inchangés\n - Les chaînes qui contiennent une séquence de caractères représentant un nombre JSON légal sont converties en ce nombre\n - Toutes les autres valeurs provoquer l'envoi d'une erreur."
|
||||||
|
},
|
||||||
|
"$abs": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Renvoie la valeur absolue du paramètre `nombre`."
|
||||||
|
},
|
||||||
|
"$floor": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Renvoie la valeur de `number` arrondie à l'entier le plus proche inférieur ou égal à `number`."
|
||||||
|
},
|
||||||
|
"$ceil": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Renvoie la valeur de `number` arrondie à l'entier le plus proche supérieur ou égal à `number`."
|
||||||
|
},
|
||||||
|
"$round": {
|
||||||
|
"args": "number [, precision]",
|
||||||
|
"desc": "Renvoie la valeur du paramètre `number` arrondie au nombre de décimales spécifié par le paramètre facultatif `precision`."
|
||||||
|
},
|
||||||
|
"$power": {
|
||||||
|
"args": "base, exponent",
|
||||||
|
"desc": "Renvoie la valeur de `base` élevée à la puissance de `exponent`."
|
||||||
|
},
|
||||||
|
"$sqrt": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Renvoie la racine carrée de la valeur du paramètre `number`."
|
||||||
|
},
|
||||||
|
"$random": {
|
||||||
|
"args": "",
|
||||||
|
"desc": "Renvoie un nombre pseudo-aléatoire supérieur ou égal à zéro et inférieur à un."
|
||||||
|
},
|
||||||
|
"$millis": {
|
||||||
|
"args": "",
|
||||||
|
"desc": "Renvoie le nombre de millisecondes depuis l'époque Unix (1er janvier 1970 UTC) sous forme de nombre. Tous les appels de `$millis()` dans une évaluation d'une expression renverront toutes la même valeur."
|
||||||
|
},
|
||||||
|
"$sum": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie la somme arithmétique d'un `tableau` de nombres. C'est une erreur si l'entrée `array` contient un élément qui n'est pas un nombre."
|
||||||
|
},
|
||||||
|
"$max": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie le nombre maximal dans un `tableau` de nombres. C'est une erreur si l'entrée `array` contient un élément qui n'est pas un nombre."
|
||||||
|
},
|
||||||
|
"$min": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie le nombre minimum dans un `tableau` de nombres. C'est une erreur si l'entrée `array` contient un élément qui n'est pas un nombre."
|
||||||
|
},
|
||||||
|
"$average": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie la valeur moyenne d'un `tableau` de nombres. C'est une erreur si l'entrée `array` contient un élément qui n'est pas un nombre."
|
||||||
|
},
|
||||||
|
"$boolean": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Transforme l'argument en booléen en utilisant les règles suivantes :\n\n - `Boolean` : inchangé\n - `string` : vide : `false`\n - `string` : non vide : `true`\n - `number` : `0` : `false`\n - `number` : non nul : `true`\n - `null` : `false`\n - `array` : vide : `false`\n - `array` : contient un membre qui convertit en `true` : `true`\n - `array` : tous les membres sont transformés en `false` : `false`\n - `object` : vide : `false`\n - `object` : non vide : `true`\n - `function` : `false`"
|
||||||
|
},
|
||||||
|
"$not": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Renvoie un booléen résultat de la négation logique de l'argument"
|
||||||
|
},
|
||||||
|
"$exists": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Renvoie la valeur booléenne `true` si l'expression `arg` est évaluée à une valeur, ou `false` si l'expression ne correspond à rien (par exemple, un chemin vers une référence de champ inexistante)."
|
||||||
|
},
|
||||||
|
"$count": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie le nombre d'éléments du tableau"
|
||||||
|
},
|
||||||
|
"$append": {
|
||||||
|
"args": "array, array",
|
||||||
|
"desc": "Combine deux tableaux"
|
||||||
|
},
|
||||||
|
"$sort": {
|
||||||
|
"args": "array [, function]",
|
||||||
|
"desc": "Renvoie un tableau contenant toutes les valeurs du paramètre `array`, mais triées dans l'ordre.\n\nSi un comparateur `function` est fourni, alors il doit s'agir d'une fonction qui prend deux paramètres :\n\n`function(left , droite)`\n\nCette fonction est invoquée par l'algorithme de tri pour comparer deux valeurs à gauche et à droite. Si la valeur de `left` doit être placée après la valeur de `right` dans l'ordre de tri souhaité, la fonction doit renvoyer un booléen `true` pour indiquer un échange. Sinon, il doit renvoyer `false`."
|
||||||
|
},
|
||||||
|
"$reverse": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie un tableau contenant toutes les valeurs du paramètre `array`, mais dans l'ordre inverse."
|
||||||
|
},
|
||||||
|
"$shuffle": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie un tableau contenant toutes les valeurs du paramètre `array`, mais mélangées dans un ordre aléatoire."
|
||||||
|
},
|
||||||
|
"$zip": {
|
||||||
|
"args": "array, ...",
|
||||||
|
"desc": "Renvoie un tableau convolué (zippé) contenant des tableaux groupés de valeurs des arguments `array1`...`arrayN` d'index 0, 1, 2...."
|
||||||
|
},
|
||||||
|
"$keys": {
|
||||||
|
"args": "object",
|
||||||
|
"desc": "Renvoie un tableau contenant les clés de l'objet. Si l'argument est un tableau d'objets, le tableau renvoyé contient une liste dédupliquée de toutes les clés de tous les objets."
|
||||||
|
},
|
||||||
|
"$lookup": {
|
||||||
|
"args": "object, key",
|
||||||
|
"desc": "Renvoie la valeur associée à la clé dans l'objet. Si le premier argument est un tableau d'objets, tous les objets du tableau sont recherchés et les valeurs associées à toutes les occurrences de key sont renvoyées."
|
||||||
|
},
|
||||||
|
"$spread": {
|
||||||
|
"args": "object",
|
||||||
|
"desc": "Divise un objet contenant des paires clé/valeur en un tableau d'objets, chacun ayant une seule paire clé/valeur de l'objet d'entrée. Si le paramètre est un tableau d'objets, alors le tableau résultant contient un objet pour chaque paire clé/valeur dans chaque objet du tableau fourni."
|
||||||
|
},
|
||||||
|
"$merge": {
|
||||||
|
"args": "array<object>",
|
||||||
|
"desc": "Fusionne un tableau d'`objets` en un seul `objet` contenant toutes les paires clé/valeur de chacun des objets du tableau d'entrée. Si l'un des objets d'entrée contient la même clé, alors l'`objet` renvoyé contiendra la valeur du dernier dans le tableau. C'est une erreur si le tableau d'entrée contient un élément qui n'est pas un objet."
|
||||||
|
},
|
||||||
|
"$sift": {
|
||||||
|
"args": "object, function",
|
||||||
|
"desc": "Renvoie un objet qui contient uniquement les paires clé/valeur du paramètre `object` qui satisfont le prédicat `function` transmis comme second paramètre.\n\nLa `function` qui est fournie comme second paramètre doit avoir la signature suivante :\n\n`fonction(valeur [, clé [, objet]])`"
|
||||||
|
},
|
||||||
|
"$each": {
|
||||||
|
"args": "object, function",
|
||||||
|
"desc": "Renvoie un tableau contenant les valeurs renvoyées par la `fonction` lorsqu'elle est appliquée à chaque paire clé/valeur dans l'`objet`."
|
||||||
|
},
|
||||||
|
"$map": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Renvoie un tableau contenant les résultats de l'application du paramètre `function` à chaque valeur du paramètre `array`.\n\nLa `function` fournie comme second paramètre doit avoir la signature suivante :\n\n`function( valeur [, indice [, tableau]])`"
|
||||||
|
},
|
||||||
|
"$filter": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Renvoie un tableau contenant uniquement les valeurs du paramètre `array` qui satisfont le prédicat `function`.\n\nLa `function` fournie comme second paramètre doit avoir la signature suivante :\n\n`function(value [ , indice [, tableau]])`"
|
||||||
|
},
|
||||||
|
"$reduce": {
|
||||||
|
"args": "array, function [, init]",
|
||||||
|
"desc": "Renvoie une valeur agrégée dérivée de l'application successive du paramètre `function` à chaque valeur de `array` en combinaison avec le résultat de l'application précédente de la fonction.\n\nLa fonction doit accepter deux arguments et se comporte comme un opérateur infixe entre chaque valeur dans le `tableau`. La signature de `function` doit être de la forme : `myfunc($accumulator, $value[, $index[, $array]])`\n\nLe paramètre facultatif `init` est utilisé comme valeur initiale dans l'agrégation ."
|
||||||
|
},
|
||||||
|
"$flowContext": {
|
||||||
|
"args": "string[, string]",
|
||||||
|
"desc": "Récupère une propriété de contexte de flux.\n\nCeci est une fonction définie par Node-RED."
|
||||||
|
},
|
||||||
|
"$globalContext": {
|
||||||
|
"args": "string[, string]",
|
||||||
|
"desc": "Récupère une propriété de contexte globale.\n\nCeci est une fonction définie par Node-RED."
|
||||||
|
},
|
||||||
|
"$pad": {
|
||||||
|
"args": "string, width [, char]",
|
||||||
|
"desc": "Renvoie une copie de la `chaîne` avec un rembourrage supplémentaire, si nécessaire, de sorte que son nombre total de caractères corresponde au moins à la valeur absolue du paramètre `width`.\n\nSi `width` est un nombre positif, alors la chaîne est rembourré à droite; s'il est négatif, il est rempli vers la gauche.\n\nL'argument optionnel `char` spécifie le(s) caractère(s) de remplissage à utiliser. S'il n'est pas spécifié, la valeur par défaut est le caractère espace."
|
||||||
|
},
|
||||||
|
"$fromMillis": {
|
||||||
|
"args": "number, [, picture [, timezone]]",
|
||||||
|
"desc": "Convertisser le « nombre » représentant les millisecondes depuis l'époque Unix (1er janvier 1970 UTC) en une représentation sous forme de chaîne formatée de l'horodatage tel que spécifié par la chaîne d'image.\n\nSi le paramètre facultatif « image » est omis, l'horodatage est formaté au format ISO 8601.\n\nSi la chaîne facultative `image` est fournie, l'horodatage est formaté selon la représentation spécifiée dans cette chaîne. Le comportement de cette fonction est cohérent avec la version à deux arguments de la fonction XPath/XQuery `format-dateTime` telle que définie dans la spécification XPath F&O 3.1. Le paramètre de chaîne d'image définit la façon dont l'horodatage est formaté et a la même syntaxe que `format-dateTime`.\n\nSi la chaîne facultative `timezone` est fournie, alors l'horodatage formaté sera dans ce fuseau horaire. La chaîne `timezone` doit être au format '±HHMM', où ± est le signe plus ou moins et HHMM est le décalage en heures et minutes par rapport à UTC. Décalage positif pour les fuseaux horaires à l'est de UTC, décalage négatif pour les fuseaux horaires à l'ouest de UTC."
|
||||||
|
},
|
||||||
|
"$formatNumber": {
|
||||||
|
"args": "number, picture [, options]",
|
||||||
|
"desc": "Convertit le `number` en une chaîne et le formate en une représentation décimale comme spécifié par la chaîne `picture`.\n\n Le comportement de cette fonction est cohérent avec la fonction XPath/XQuery `fn:format-number` telle que définie dans le Spécification XPath F&O 3.1. Le paramètre de chaîne d'image définit la façon dont le nombre est formaté et a la même syntaxe que `fn:format-number`.\n\nLe troisième argument facultatif `options` est utilisé pour remplacer les caractères de formatage spécifiques aux paramètres régionaux par défaut, tels que le séparateur décimal. S'il est fourni, cet argument doit être un objet contenant des paires nom/valeur spécifiées dans la section de format décimal de la spécification XPath F&O 3.1."
|
||||||
|
},
|
||||||
|
"$formatBase": {
|
||||||
|
"args": "number [, radix]",
|
||||||
|
"desc": "Convertit le `number` en une chaîne et le formate en un entier représenté dans la base numérique spécifiée par l'argument `radix`. Si `radix` n'est pas spécifié, la valeur par défaut est la base 10. `radix` peut être compris entre 2 et 36, sinon une erreur est renvoyée."
|
||||||
|
},
|
||||||
|
"$toMillis": {
|
||||||
|
"args": "timestamp",
|
||||||
|
"desc": "Convertit une chaîne `timestamp` au format ISO 8601 en nombre de millisecondes depuis l'époque Unix (1er janvier 1970 UTC) sous forme de nombre. Une erreur est renvoyée si la chaîne n'est pas au format correct."
|
||||||
|
},
|
||||||
|
"$env": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Renvoie la valeur d'une variable d'environnement.\n\nCeci est une fonction définie par Node-RED."
|
||||||
|
},
|
||||||
|
"$eval": {
|
||||||
|
"args": "expr [, context]",
|
||||||
|
"desc": "Analyse et évalue la chaîne `expr` qui contient un JSON littéral ou une expression JSONata en utilisant le contexte actuel comme contexte d'évaluation."
|
||||||
|
},
|
||||||
|
"$formatInteger": {
|
||||||
|
"args": "number, picture",
|
||||||
|
"desc": "Transforme le `nombre` en une chaîne et le formate en une représentation entière comme spécifié par la chaîne `image`. Le paramètre de chaîne d'image définit la façon dont le nombre est formaté et a la même syntaxe que `fn:format-integer` de la spécification XPath F&O 3.1."
|
||||||
|
},
|
||||||
|
"$parseInteger": {
|
||||||
|
"args": "string, picture",
|
||||||
|
"desc": "Analyse le contenu du paramètre `string` en un entier (comme un nombre JSON) en utilisant le format spécifié par la chaîne `picture`. Le paramètre de chaîne `picture` a le même format que `$formatInteger`."
|
||||||
|
},
|
||||||
|
"$error": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Génère une erreur avec un message. Le `str` facultatif remplacera le message par défaut de la fonction `$error() évaluée`"
|
||||||
|
},
|
||||||
|
"$assert": {
|
||||||
|
"args": "arg, str",
|
||||||
|
"desc": "Si `arg` est vrai, la fonction renvoie undefined. Si `arg` est faux, une exception est lancée avec `str` comme message de l'exception."
|
||||||
|
},
|
||||||
|
"$single": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Renvoie la seule et unique valeur du paramètre `array` qui satisfait le prédicat `function` (c'est-à-dire que la `function` renvoie la valeur booléenne `true` lorsqu'elle est transmise à la valeur). Lève une exception si le nombre de valeurs correspondantes n'est pas exactement un.\n\nLa fonction doit être fournie dans la signature suivante : `function(value [, index [, array]])` où value est chaque entrée du tableau, index est la position de cette valeur et le tableau entier est passé comme troisième argument"
|
||||||
|
},
|
||||||
|
"$encodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Encode un composant URL (Uniform Resource Locator) en remplaçant chaque instance de certains caractères par une, deux, trois ou quatre séquences d'échappement représentant l'encodage UTF-8 du caractère.\n\nExemple : `$encodeUrlComponent(\"?x =test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
|
},
|
||||||
|
"$encodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Encode une URL (Uniform Resource Locator) en remplaçant chaque instance de certains caractères par une, deux, trois ou quatre séquences d'échappement représentant l'encodage UTF-8 du caractère.\n\nExemple : `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0% B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Décode un composant URL (Uniform Resource Locator) précédemment créé par encodeUrlComponent.\n\nExemple : `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Décode une URL (Uniform Resource Locator) précédemment créée par encodeUrl.\n\nExemple : `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
|
},
|
||||||
|
"$distinct": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Renvoie un tableau avec les valeurs en double supprimées de `array`"
|
||||||
|
},
|
||||||
|
"$type": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "Renvoie le type de `value` sous forme de chaîne. Si `value` n'est pas défini, cela renverra `undefined`"
|
||||||
|
},
|
||||||
|
"$moment": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Obtient un objet de date à l'aide de la bibliothèque Moment."
|
||||||
|
},
|
||||||
|
"$clone": {
|
||||||
|
"args": "valeur",
|
||||||
|
"desc": "Cloner un objet en toute sécurité."
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,7 +23,11 @@
|
|||||||
"position": "配置",
|
"position": "配置",
|
||||||
"enable": "有効",
|
"enable": "有効",
|
||||||
"disable": "無効",
|
"disable": "無効",
|
||||||
"upload": "アップロード"
|
"upload": "アップロード",
|
||||||
|
"lock": "固定",
|
||||||
|
"unlock": "固定を解除",
|
||||||
|
"locked": "固定済み",
|
||||||
|
"unlocked": "固定なし"
|
||||||
},
|
},
|
||||||
"type": {
|
"type": {
|
||||||
"string": "文字列",
|
"string": "文字列",
|
||||||
@@ -38,12 +42,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"event": {
|
"event": {
|
||||||
|
"loadPlugins": "プラグインを読み込み中",
|
||||||
"loadPalette": "パレットを読み込み中",
|
"loadPalette": "パレットを読み込み中",
|
||||||
"loadNodeCatalogs": "ノードカタログを読み込み中",
|
"loadNodeCatalogs": "ノードカタログを読み込み中",
|
||||||
"loadNodes": "ノードを読み込み中 __count__",
|
"loadNodes": "ノードを読み込み中 __count__",
|
||||||
"loadFlows": "フローを読み込み中",
|
"loadFlows": "フローを読み込み中",
|
||||||
"importFlows": "ワークスペースにフローを追加中",
|
"importFlows": "ワークスペースにフローを追加中",
|
||||||
"importError": "<p>フロー追加エラー</p><p>__message__</p>"
|
"importError": "<p>フロー追加エラー</p><p>__message__</p>",
|
||||||
|
"loadingProject": "プロジェクトを読み込み中"
|
||||||
},
|
},
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"defaultName": "フロー __number__",
|
"defaultName": "フロー __number__",
|
||||||
@@ -51,19 +57,38 @@
|
|||||||
"confirmDelete": "削除の確認",
|
"confirmDelete": "削除の確認",
|
||||||
"delete": "本当に '__label__' を削除しますか?",
|
"delete": "本当に '__label__' を削除しますか?",
|
||||||
"dropFlowHere": "ここにフローをドロップしてください",
|
"dropFlowHere": "ここにフローをドロップしてください",
|
||||||
|
"dropImageHere": "ここに画像ファイルをドロップしてください",
|
||||||
"addFlow": "フローの追加",
|
"addFlow": "フローの追加",
|
||||||
|
"addFlowToRight": "右側にフローを追加",
|
||||||
|
"closeFlow": "フローを閉じる",
|
||||||
|
"hideFlow": "フローを非表示",
|
||||||
|
"hideOtherFlows": "他のフローを非表示",
|
||||||
|
"showAllFlows": "全てのフローを表示",
|
||||||
|
"hideAllFlows": "全てのフローを非表示",
|
||||||
|
"hiddenFlows": "__count__ 個の非表示のフロー一覧",
|
||||||
|
"hiddenFlows_plural": "__count__ 個の非表示のフロー一覧",
|
||||||
|
"showLastHiddenFlow": "最後に非表示にしたフローを表示",
|
||||||
"listFlows": "フロー一覧",
|
"listFlows": "フロー一覧",
|
||||||
|
"listSubflows": "サブフロー一覧",
|
||||||
"status": "状態",
|
"status": "状態",
|
||||||
"enabled": "有効",
|
"enabled": "有効",
|
||||||
"disabled": "無効",
|
"disabled": "無効",
|
||||||
"info": "詳細",
|
"info": "詳細",
|
||||||
"selectNodes": "ノードをクリックして選択"
|
"selectNodes": "ノードをクリックして選択",
|
||||||
|
"enableFlow": "フローを有効化",
|
||||||
|
"disableFlow": "フローを無効化",
|
||||||
|
"lockFlow": "フローを固定",
|
||||||
|
"unlockFlow": "フローの固定を解除",
|
||||||
|
"moveToStart": "フローを先頭へ移動",
|
||||||
|
"moveToEnd": "フローを最後へ移動"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"label": {
|
"label": {
|
||||||
"view": {
|
"view": {
|
||||||
"view": "表示",
|
"view": "表示",
|
||||||
"grid": "グリッド",
|
"grid": "グリッド",
|
||||||
|
"storeZoom": "読み込み時に拡大/縮小のレベルを復元",
|
||||||
|
"storePosition": "読み込み時にスクロール位置を復元",
|
||||||
"showGrid": "グリッドを表示",
|
"showGrid": "グリッドを表示",
|
||||||
"snapGrid": "ノードの配置を補助",
|
"snapGrid": "ノードの配置を補助",
|
||||||
"gridSize": "グリッドの大きさ",
|
"gridSize": "グリッドの大きさ",
|
||||||
@@ -81,12 +106,14 @@
|
|||||||
"palette": {
|
"palette": {
|
||||||
"show": "パレットを表示"
|
"show": "パレットを表示"
|
||||||
},
|
},
|
||||||
|
"edit": "編集",
|
||||||
"settings": "設定",
|
"settings": "設定",
|
||||||
"userSettings": "ユーザ設定",
|
"userSettings": "ユーザ設定",
|
||||||
"nodes": "ノード",
|
"nodes": "ノード",
|
||||||
"displayStatus": "ノードのステータスを表示",
|
"displayStatus": "ノードのステータスを表示",
|
||||||
"displayConfig": "ノードの設定",
|
"displayConfig": "設定ノード",
|
||||||
"import": "読み込み",
|
"import": "読み込み",
|
||||||
|
"importExample": "フロー例を読み込み",
|
||||||
"export": "書き出し",
|
"export": "書き出し",
|
||||||
"search": "ノードを検索",
|
"search": "ノードを検索",
|
||||||
"searchInput": "ノードを検索",
|
"searchInput": "ノードを検索",
|
||||||
@@ -95,7 +122,6 @@
|
|||||||
"selectionToSubflow": "選択部分をサブフロー化",
|
"selectionToSubflow": "選択部分をサブフロー化",
|
||||||
"flows": "フロー",
|
"flows": "フロー",
|
||||||
"add": "フローを新規追加",
|
"add": "フローを新規追加",
|
||||||
"rename": "フロー名を変更",
|
|
||||||
"delete": "フローを削除",
|
"delete": "フローを削除",
|
||||||
"keyboardShortcuts": "ショートカットキーの説明",
|
"keyboardShortcuts": "ショートカットキーの説明",
|
||||||
"login": "ログイン",
|
"login": "ログイン",
|
||||||
@@ -103,24 +129,48 @@
|
|||||||
"editPalette": "パレットの管理",
|
"editPalette": "パレットの管理",
|
||||||
"other": "その他",
|
"other": "その他",
|
||||||
"showTips": "ヒントを表示",
|
"showTips": "ヒントを表示",
|
||||||
|
"showNodeHelp": "ノードのヘルプを表示",
|
||||||
|
"enableSelectedNodes": "選択したノードを有効化",
|
||||||
|
"disableSelectedNodes": "選択したノードを無効化",
|
||||||
|
"showSelectedNodeLabels": "選択したノードのラベル表示",
|
||||||
|
"hideSelectedNodeLabels": "選択したノードのラベル非表示",
|
||||||
|
"showWelcomeTours": "新バージョンのガイドツアーを表示",
|
||||||
"help": "Node-REDウェブサイト",
|
"help": "Node-REDウェブサイト",
|
||||||
"projects": "プロジェクト",
|
"projects": "プロジェクト",
|
||||||
"projects-new": "新規",
|
"projects-new": "新規",
|
||||||
"projects-open": "開く",
|
"projects-open": "開く",
|
||||||
"projects-settings": "設定",
|
"projects-settings": "設定",
|
||||||
"showNodeLabelDefault": "追加したノードのラベルを表示",
|
"showNodeLabelDefault": "追加したノードのラベルを表示",
|
||||||
|
"codeEditor": "コードエディタ",
|
||||||
"groups": "グループ",
|
"groups": "グループ",
|
||||||
"groupSelection": "選択部分をグループ化",
|
"groupSelection": "選択部分をグループ化",
|
||||||
"ungroupSelection": "選択部分をグループ解除",
|
"ungroupSelection": "選択部分をグループ解除",
|
||||||
"groupMergeSelection": "選択部分をマージ",
|
"groupMergeSelection": "選択部分をマージ",
|
||||||
"groupRemoveSelection": "グループから削除"
|
"groupRemoveSelection": "グループから削除",
|
||||||
|
"arrange": "配置",
|
||||||
|
"alignLeft": "左揃え",
|
||||||
|
"alignCenter": "左右中央揃え",
|
||||||
|
"alignRight": "右揃え",
|
||||||
|
"alignTop": "上揃え",
|
||||||
|
"alignMiddle": "上下中央揃え",
|
||||||
|
"alignBottom": "下揃え",
|
||||||
|
"distributeHorizontally": "左右に整列",
|
||||||
|
"distributeVertically": "上下に整列",
|
||||||
|
"moveToBack": "最背面へ移動",
|
||||||
|
"moveToFront": "最前面へ移動",
|
||||||
|
"moveBackwards": "背面へ移動",
|
||||||
|
"moveForwards": "前面へ移動"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"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__ としてログインしました",
|
||||||
@@ -136,12 +186,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification": {
|
"notification": {
|
||||||
|
"state": {
|
||||||
|
"flowsStopped": "フローを停止しました",
|
||||||
|
"flowsStarted": "フローを開始しました"
|
||||||
|
},
|
||||||
"warning": "<strong>警告</strong>: __message__",
|
"warning": "<strong>警告</strong>: __message__",
|
||||||
"warnings": {
|
"warnings": {
|
||||||
"undeployedChanges": "ノードの変更をデプロイしていません",
|
"undeployedChanges": "ノードの変更をデプロイしていません",
|
||||||
"nodeActionDisabled": "ノードのアクションは無効になっています",
|
"nodeActionDisabled": "ノードのアクションは無効になっています",
|
||||||
"nodeActionDisabledSubflow": "ノードのアクションは、サブフロー内で無効になっています",
|
"nodeActionDisabledSubflow": "ノードのアクションは、サブフロー内で無効になっています",
|
||||||
"missing-types": "<p>不明なノードが存在するため、フローを停止しました。</p>",
|
"missing-types": "<p>不明なノードが存在するため、フローを停止しました。</p>",
|
||||||
|
"missing-modules": "<p>不明なモジュールが存在するため、フローを停止しました。</p>",
|
||||||
"safe-mode": "<p>セーフモードでフローを停止しました</p><p>フローを変更し、再起動するために変更をデプロイできます</p>",
|
"safe-mode": "<p>セーフモードでフローを停止しました</p><p>フローを変更し、再起動するために変更をデプロイできます</p>",
|
||||||
"restartRequired": "更新されたモジュールを有効化するため、Node-REDを再起動する必要があります",
|
"restartRequired": "更新されたモジュールを有効化するため、Node-REDを再起動する必要があります",
|
||||||
"credentials_load_failed": "<p>認証情報を復号できないため、フローを停止しました</p><p>フローの認証情報ファイルは暗号化されています。しかし、プロジェクトの暗号鍵が存在しない、または不正です</p>",
|
"credentials_load_failed": "<p>認証情報を復号できないため、フローを停止しました</p><p>フローの認証情報ファイルは暗号化されています。しかし、プロジェクトの暗号鍵が存在しない、または不正です</p>",
|
||||||
@@ -183,7 +238,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,8 +259,8 @@
|
|||||||
"replacedNodes_plural": "置換された __count__ 個のノード",
|
"replacedNodes_plural": "置換された __count__ 個のノード",
|
||||||
"pasteNodes": "JSON形式のフローデータを貼り付け",
|
"pasteNodes": "JSON形式のフローデータを貼り付け",
|
||||||
"selectFile": "読み込むファイルを選択",
|
"selectFile": "読み込むファイルを選択",
|
||||||
"importNodes": "フローをクリップボードから読み込み",
|
"importNodes": "フローを読み込み",
|
||||||
"exportNodes": "フローをクリップボードへ書き出し",
|
"exportNodes": "フローを書き出し",
|
||||||
"download": "ダウンロード",
|
"download": "ダウンロード",
|
||||||
"importUnrecognised": "認識できない型が読み込まれました:",
|
"importUnrecognised": "認識できない型が読み込まれました:",
|
||||||
"importUnrecognised_plural": "認識できない型が読み込まれました:",
|
"importUnrecognised_plural": "認識できない型が読み込まれました:",
|
||||||
@@ -247,7 +303,8 @@
|
|||||||
"missingType": "不正なフロー - __index__ 番目の要素に'type'プロパティがありません"
|
"missingType": "不正なフロー - __index__ 番目の要素に'type'プロパティがありません"
|
||||||
},
|
},
|
||||||
"conflictNotification1": "読み込もうとしているノードのいくつかは、既にワークスペース内に存在しています。",
|
"conflictNotification1": "読み込もうとしているノードのいくつかは、既にワークスペース内に存在しています。",
|
||||||
"conflictNotification2": "読み込むノードを選択し、また既存のノードを置き換えるか、もしくはそれらのコピーを読み込むかも選択してください。"
|
"conflictNotification2": "読み込むノードを選択し、また既存のノードを置き換えるか、もしくはそれらのコピーを読み込むかも選択してください。",
|
||||||
|
"alreadyExists": "本ノードは既に存在"
|
||||||
},
|
},
|
||||||
"copyMessagePath": "パスをコピーしました",
|
"copyMessagePath": "パスをコピーしました",
|
||||||
"copyMessageValue": "値をコピーしました",
|
"copyMessageValue": "値をコピーしました",
|
||||||
@@ -261,13 +318,19 @@
|
|||||||
"modifiedFlowsDesc": "変更したノードを含むフローのみデプロイ",
|
"modifiedFlowsDesc": "変更したノードを含むフローのみデプロイ",
|
||||||
"modifiedNodes": "変更したノード",
|
"modifiedNodes": "変更したノード",
|
||||||
"modifiedNodesDesc": "変更したノードのみデプロイ",
|
"modifiedNodesDesc": "変更したノードのみデプロイ",
|
||||||
|
"startFlows": "開始",
|
||||||
|
"startFlowsDesc": "フローを開始",
|
||||||
|
"stopFlows": "停止",
|
||||||
|
"stopFlowsDesc": "フローを停止",
|
||||||
"restartFlows": "フローを再起動",
|
"restartFlows": "フローを再起動",
|
||||||
"restartFlowsDesc": "デプロイされた現在のフローを再起動",
|
"restartFlowsDesc": "デプロイされた現在のフローを再起動",
|
||||||
"successfulDeploy": "デプロイが成功しました",
|
"successfulDeploy": "デプロイが成功しました",
|
||||||
"successfulRestart": "フローの再起動が成功しました",
|
"successfulRestart": "フローの再起動が成功しました",
|
||||||
"deployFailed": "デプロイが失敗しました: __message__",
|
"deployFailed": "デプロイが失敗しました: __message__",
|
||||||
"unusedConfigNodes": "使われていない「ノードの設定」があります。",
|
"unusedConfigNodes": "使われていない設定ノードがあります。",
|
||||||
"unusedConfigNodesLink": "設定を参照する",
|
"unusedConfigNodesButton": "未使用の構成ノードを検索",
|
||||||
|
"unknownNodesButton": "不明なノードを検索する",
|
||||||
|
"invalidNodesButton": "無効なノードを検索する",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "サーバの応答がありません"
|
"noResponse": "サーバの応答がありません"
|
||||||
},
|
},
|
||||||
@@ -337,14 +400,28 @@
|
|||||||
"output": "出力:",
|
"output": "出力:",
|
||||||
"status": "ステータスノード",
|
"status": "ステータスノード",
|
||||||
"deleteSubflow": "サブフローを削除",
|
"deleteSubflow": "サブフローを削除",
|
||||||
|
"confirmDelete": "このサブフローを削除しても良いですか?",
|
||||||
"info": "詳細",
|
"info": "詳細",
|
||||||
"category": "カテゴリ",
|
"category": "カテゴリ",
|
||||||
|
"module": "モジュール",
|
||||||
|
"license": "ライセンス",
|
||||||
|
"licenseNone": "なし",
|
||||||
|
"licenseOther": "その他",
|
||||||
|
"type": "ノードの型",
|
||||||
|
"version": "バージョン",
|
||||||
|
"versionPlaceholder": "x.y.z",
|
||||||
|
"keys": "キーワード",
|
||||||
|
"keysPlaceholder": "カンマ区切りのキーワード",
|
||||||
|
"author": "作者",
|
||||||
|
"authorPlaceholder": "名前 <email@example.com>",
|
||||||
|
"desc": "説明",
|
||||||
"env": {
|
"env": {
|
||||||
"restore": "デフォルト値に戻す",
|
"restore": "デフォルト値に戻す",
|
||||||
"remove": "環境変数を削除"
|
"remove": "環境変数を削除"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"noNodesSelected": "<strong>サブフローを作成できません</strong>: ノードが選択されていません",
|
"noNodesSelected": "<strong>サブフローを作成できません</strong>: ノードが選択されていません",
|
||||||
|
"acrossMultipleGroups": "複数のグループをまたがるサブフローは作成できません",
|
||||||
"multipleInputsToSelection": "<strong>サブフローを作成できません</strong>: 複数の入力が選択されています"
|
"multipleInputsToSelection": "<strong>サブフローを作成できません</strong>: 複数の入力が選択されています"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -362,9 +439,9 @@
|
|||||||
"configDelete": "削除",
|
"configDelete": "削除",
|
||||||
"nodesUse": "__count__ 個のノードが、この設定を使用しています",
|
"nodesUse": "__count__ 個のノードが、この設定を使用しています",
|
||||||
"nodesUse_plural": "__count__ 個のノードが、この設定を使用しています",
|
"nodesUse_plural": "__count__ 個のノードが、この設定を使用しています",
|
||||||
"addNewConfig": "新規に __type__ ノードの設定を追加",
|
"addNewConfig": "新規に __type__ 設定ノードを追加",
|
||||||
"editNode": "__type__ ノードを編集",
|
"editNode": "__type__ ノードを編集",
|
||||||
"editConfig": "__type__ ノードの設定を編集",
|
"editConfig": "__type__ 設定ノードを編集",
|
||||||
"addNewType": "新規に __type__ を追加...",
|
"addNewType": "新規に __type__ を追加...",
|
||||||
"nodeProperties": "プロパティ",
|
"nodeProperties": "プロパティ",
|
||||||
"label": "ラベル",
|
"label": "ラベル",
|
||||||
@@ -385,6 +462,7 @@
|
|||||||
"icon": "記号",
|
"icon": "記号",
|
||||||
"inputType": "入力形式",
|
"inputType": "入力形式",
|
||||||
"selectType": "形式選択...",
|
"selectType": "形式選択...",
|
||||||
|
"loadCredentials": "ノードの認証情報を読み込み中",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"input": "入力",
|
"input": "入力",
|
||||||
"select": "メニュー",
|
"select": "メニュー",
|
||||||
@@ -419,7 +497,8 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします",
|
"scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします",
|
||||||
"invalidProperties": "プロパティが不正です:"
|
"invalidProperties": "プロパティが不正です:",
|
||||||
|
"credentialLoadFailed": "ノードの認証情報の読み込みに失敗"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keyboard": {
|
"keyboard": {
|
||||||
@@ -431,24 +510,31 @@
|
|||||||
"unassigned": "未割当",
|
"unassigned": "未割当",
|
||||||
"global": "グローバル",
|
"global": "グローバル",
|
||||||
"workspace": "ワークスペース",
|
"workspace": "ワークスペース",
|
||||||
|
"editor": "編集ダイアログ",
|
||||||
"selectAll": "全てのノードを選択",
|
"selectAll": "全てのノードを選択",
|
||||||
"selectAllConnected": "接続された全てのノードを選択",
|
"selectNone": "選択を外す",
|
||||||
|
"selectAllConnected": "接続されたノードを選択",
|
||||||
"addRemoveNode": "ノードの選択、選択解除",
|
"addRemoveNode": "ノードの選択、選択解除",
|
||||||
"editSelected": "選択したノードを編集",
|
"editSelected": "選択したノードを編集",
|
||||||
"deleteSelected": "選択したノードや接続を削除",
|
"deleteSelected": "選択部分を削除",
|
||||||
|
"deleteReconnect": "削除と再接続",
|
||||||
"importNode": "フローの読み込み",
|
"importNode": "フローの読み込み",
|
||||||
"exportNode": "フローの書き出し",
|
"exportNode": "フローの書き出し",
|
||||||
"nudgeNode": "選択したノードを移動(移動量小)",
|
"nudgeNode": "選択したノードを移動(移動量小)",
|
||||||
"moveNode": "選択したノードを移動(移動量大)",
|
"moveNode": "選択したノードを移動(移動量大)",
|
||||||
"toggleSidebar": "サイドバーの表示/非表示",
|
"toggleSidebar": "サイドバーの表示/非表示",
|
||||||
"togglePalette": "パレットの表示/非表示",
|
"togglePalette": "パレットの表示/非表示",
|
||||||
"copyNode": "選択したノードをコピー",
|
"copyNode": "ノードをコピー",
|
||||||
"cutNode": "選択したノードを切り取り",
|
"cutNode": "ノードを切り取り",
|
||||||
"pasteNode": "ノードを貼り付け",
|
"pasteNode": "ノードを貼り付け",
|
||||||
|
"copyGroupStyle": "グループ様式をコピー",
|
||||||
|
"pasteGroupStyle": "グループ様式を貼り付け",
|
||||||
"undoChange": "変更操作を戻す",
|
"undoChange": "変更操作を戻す",
|
||||||
|
"redoChange": "変更操作をやり直し",
|
||||||
"searchBox": "ノードを検索",
|
"searchBox": "ノードを検索",
|
||||||
"managePalette": "パレットの管理",
|
"managePalette": "パレットの管理",
|
||||||
"actionList": "動作一覧"
|
"actionList": "動作一覧",
|
||||||
|
"splitWireWithLinks": "選択したワイヤーをlinkノードで分離"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"library": "ライブラリ",
|
"library": "ライブラリ",
|
||||||
@@ -500,14 +586,16 @@
|
|||||||
"nodeEnabled_plural": "ノードを有効化しました:",
|
"nodeEnabled_plural": "ノードを有効化しました:",
|
||||||
"nodeDisabled": "ノードを無効化しました:",
|
"nodeDisabled": "ノードを無効化しました:",
|
||||||
"nodeDisabled_plural": "ノードを無効化しました:",
|
"nodeDisabled_plural": "ノードを無効化しました:",
|
||||||
"nodeUpgraded": "ノードモジュール __module__ をバージョン __version__ へ更新しました"
|
"nodeUpgraded": "ノードモジュール __module__ をバージョン __version__ へ更新しました",
|
||||||
|
"unknownNodeRegistered": "ノードの読み込みエラー: <ul><li>__type__<br>__error__</li></ul>"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"title": "パレットの管理",
|
"title": "パレットの管理",
|
||||||
"palette": "パレット",
|
"palette": "パレット",
|
||||||
|
"allCatalogs": "全カタログ",
|
||||||
"times": {
|
"times": {
|
||||||
"seconds": "秒前",
|
"seconds": "数秒前",
|
||||||
"minutes": "分前",
|
"minutes": "数分前",
|
||||||
"minutesV": "__count__ 分前",
|
"minutesV": "__count__ 分前",
|
||||||
"hoursV": "__count__ 時間前",
|
"hoursV": "__count__ 時間前",
|
||||||
"hoursV_plural": "__count__ 時間前",
|
"hoursV_plural": "__count__ 時間前",
|
||||||
@@ -544,6 +632,7 @@
|
|||||||
"tab-nodes": "現在のノード",
|
"tab-nodes": "現在のノード",
|
||||||
"tab-install": "ノードを追加",
|
"tab-install": "ノードを追加",
|
||||||
"sort": "並べ替え:",
|
"sort": "並べ替え:",
|
||||||
|
"sortRelevance": "関連順",
|
||||||
"sortAZ": "辞書順",
|
"sortAZ": "辞書順",
|
||||||
"sortRecent": "日付順",
|
"sortRecent": "日付順",
|
||||||
"more": "+ さらに __count__ 個",
|
"more": "+ さらに __count__ 個",
|
||||||
@@ -618,13 +707,10 @@
|
|||||||
"globalConfig": "グローバル設定ノード",
|
"globalConfig": "グローバル設定ノード",
|
||||||
"triggerAction": "アクションを実行",
|
"triggerAction": "アクションを実行",
|
||||||
"find": "ワークスペース内を検索",
|
"find": "ワークスペース内を検索",
|
||||||
"search": {
|
"copyItemUrl": "要素のURLをコピー",
|
||||||
"configNodes": "設定ノード",
|
"copyURL2Clipboard": "URLをクリップボードにコピーしました",
|
||||||
"unusedConfigNodes": "未使用の設定ノード",
|
"showFlow": "表示",
|
||||||
"invalidNodes": "不正なノード",
|
"hideFlow": "非表示"
|
||||||
"uknownNodes": "未知のノード",
|
|
||||||
"unusedSubflows": "未使用のサブフロー"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "ヘルプ",
|
"name": "ヘルプ",
|
||||||
@@ -633,12 +719,14 @@
|
|||||||
"nodeHelp": "ノードヘルプ",
|
"nodeHelp": "ノードヘルプ",
|
||||||
"showHelp": "ヘルプを表示",
|
"showHelp": "ヘルプを表示",
|
||||||
"showInOutline": "アウトラインに表示",
|
"showInOutline": "アウトラインに表示",
|
||||||
|
"hideTopics": "トピックを非表示",
|
||||||
"showTopics": "トピックを表示",
|
"showTopics": "トピックを表示",
|
||||||
"noHelp": "ヘルプのトピックが未選択"
|
"noHelp": "ヘルプのトピックが未選択",
|
||||||
|
"changeLog": "更新履歴"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"name": "ノードの設定を表示",
|
"name": "設定ノードを表示",
|
||||||
"label": "ノードの設定",
|
"label": "設定ノード",
|
||||||
"global": "全てのフロー上",
|
"global": "全てのフロー上",
|
||||||
"none": "なし",
|
"none": "なし",
|
||||||
"subflows": "サブフロー",
|
"subflows": "サブフロー",
|
||||||
@@ -794,7 +882,7 @@
|
|||||||
"pushFailed": "リモートに新しいコミットがあるため、プッシュに失敗しました。プルしてマージしてから、再度プッシュしてください。",
|
"pushFailed": "リモートに新しいコミットがあるため、プッシュに失敗しました。プルしてマージしてから、再度プッシュしてください。",
|
||||||
"push": "プッシュ",
|
"push": "プッシュ",
|
||||||
"pull": "プル",
|
"pull": "プル",
|
||||||
"unablePull": "<p>リモートの変更のプル失敗:ステージングされていないローカルの変更を上書きされてしまいます。</p><p>変更をコミットしてから再度実行してください。</p>",
|
"unablePull": "<p>リモートの変更のプル失敗:ステージングされていないローカルの変更が上書きされてしまいます。</p><p>変更をコミットしてから再度実行してください。</p>",
|
||||||
"showUnstagedChanges": "ステージングされていない変更を表示",
|
"showUnstagedChanges": "ステージングされていない変更を表示",
|
||||||
"connectionFailed": "リモートリポジトリに接続できません: ",
|
"connectionFailed": "リモートリポジトリに接続できません: ",
|
||||||
"pullUnrelatedHistory": "<p>リモートに関連のないコミット履歴があります。</p><p>本当に変更をプルしてローカルリポジトリに反映しますか?</p>",
|
"pullUnrelatedHistory": "<p>リモートに関連のないコミット履歴があります。</p><p>本当に変更をプルしてローカルリポジトリに反映しますか?</p>",
|
||||||
@@ -841,11 +929,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editableList": {
|
"editableList": {
|
||||||
"add": "追加"
|
"add": "追加",
|
||||||
|
"addTitle": "要素を追加"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
|
"history": "検索履歴",
|
||||||
|
"clear": "全て削除",
|
||||||
"empty": "一致したものが見つかりませんでした",
|
"empty": "一致したものが見つかりませんでした",
|
||||||
"addNode": "ノードを追加..."
|
"addNode": "ノードを追加...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "設定ノード",
|
||||||
|
"unusedConfigNodes": "未使用の設定ノード",
|
||||||
|
"invalidNodes": "不正なノード",
|
||||||
|
"uknownNodes": "未知のノード",
|
||||||
|
"unusedSubflows": "未使用のサブフロー",
|
||||||
|
"hiddenFlows": "非表示のフロー",
|
||||||
|
"modifiedNodes": "修正したノードやフロー",
|
||||||
|
"thisFlow": "現在のフロー"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "関数",
|
"functions": "関数",
|
||||||
@@ -862,10 +963,16 @@
|
|||||||
"errors": {
|
"errors": {
|
||||||
"invalid-expr": "不正なJSONata式:\n __message__",
|
"invalid-expr": "不正なJSONata式:\n __message__",
|
||||||
"invalid-msg": "不正なJSONメッセージ例:\n __message__",
|
"invalid-msg": "不正なJSONメッセージ例:\n __message__",
|
||||||
"context-unsupported": "$flowContext や $globalContextの\nコンテキスト機能をテストできません",
|
"context-unsupported": "$flowContext や $globalContextの\nコンテキスト関数をテストできません",
|
||||||
"eval": "表現評価エラー:\n __message__"
|
"env-unsupported": "$env関数はテストできません",
|
||||||
|
"moment-unsupported": "$moment関数はテストできません",
|
||||||
|
"clone-unsupported": "$clone関数はテストできません",
|
||||||
|
"eval": "式評価エラー:\n __message__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"monaco": {
|
||||||
|
"setTheme": "テーマを設定:"
|
||||||
|
},
|
||||||
"jsEditor": {
|
"jsEditor": {
|
||||||
"title": "JavaScriptエディタ"
|
"title": "JavaScriptエディタ"
|
||||||
},
|
},
|
||||||
@@ -877,6 +984,8 @@
|
|||||||
"format": "JSONフォーマット",
|
"format": "JSONフォーマット",
|
||||||
"rawMode": "JSONを編集",
|
"rawMode": "JSONを編集",
|
||||||
"uiMode": "ビジュアルエディタ",
|
"uiMode": "ビジュアルエディタ",
|
||||||
|
"rawMode-readonly": "JSON",
|
||||||
|
"uiMode-readonly": "ビジュアル",
|
||||||
"insertAbove": "上に挿入",
|
"insertAbove": "上に挿入",
|
||||||
"insertBelow": "下に挿入",
|
"insertBelow": "下に挿入",
|
||||||
"addItem": "要素を追加",
|
"addItem": "要素を追加",
|
||||||
@@ -903,7 +1012,10 @@
|
|||||||
"quote": "引用",
|
"quote": "引用",
|
||||||
"link": "リンク",
|
"link": "リンク",
|
||||||
"horizontal-rule": "区切り線",
|
"horizontal-rule": "区切り線",
|
||||||
"toggle-preview": "プレビュー表示切替え"
|
"toggle-preview": "プレビュー表示切替え",
|
||||||
|
"mermaid": {
|
||||||
|
"summary": "Mermaid図"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"bufferEditor": {
|
"bufferEditor": {
|
||||||
"title": "バッファエディタ",
|
"title": "バッファエディタ",
|
||||||
@@ -1038,7 +1150,8 @@
|
|||||||
"not-git": "Gitリポジトリではありません",
|
"not-git": "Gitリポジトリではありません",
|
||||||
"no-resource": "リポジトリが見つかりません",
|
"no-resource": "リポジトリが見つかりません",
|
||||||
"cant-get-ssh-key-path": "エラー! 選択したSSHキーのパスを取得できません。",
|
"cant-get-ssh-key-path": "エラー! 選択したSSHキーのパスを取得できません。",
|
||||||
"unexpected_error": "予期しないエラー"
|
"unexpected_error": "予期しないエラー",
|
||||||
|
"clearContext": "プロジェクトを切り替る際にコンテキストを初期化"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"confirm": "プロジェクトを削除しても良いですか?"
|
"confirm": "プロジェクトを削除しても良いですか?"
|
||||||
@@ -1079,18 +1192,200 @@
|
|||||||
"editor-tab": {
|
"editor-tab": {
|
||||||
"properties": "プロパティ",
|
"properties": "プロパティ",
|
||||||
"envProperties": "環境変数",
|
"envProperties": "環境変数",
|
||||||
|
"module": "モジュールプロパティ",
|
||||||
"description": "説明",
|
"description": "説明",
|
||||||
"appearance": "外観",
|
"appearance": "外観",
|
||||||
"preview": "UIプレビュー",
|
"preview": "UIプレビュー",
|
||||||
"defaultValue": "デフォルト値"
|
"defaultValue": "デフォルト値"
|
||||||
},
|
},
|
||||||
"languages": {
|
"tourGuide": {
|
||||||
"de": "ドイツ語",
|
"takeATour": "ツアーを開始",
|
||||||
"en-US": "英語",
|
"start": "開始",
|
||||||
"ja": "日本語",
|
"next": "次へ",
|
||||||
"ko": "韓国語",
|
"welcomeTours": "ウェルカムツアー"
|
||||||
"ru": "ロシア語",
|
},
|
||||||
"zh-CN": "中国語(簡体)",
|
"diagnostics": {
|
||||||
"zh-TW": "中国語(繁体)"
|
"title": "システム情報"
|
||||||
|
},
|
||||||
|
"validator": {
|
||||||
|
"errors": {
|
||||||
|
"invalid-json": "JSONデータが不正: __error__",
|
||||||
|
"invalid-expr": "不正なJSONata式: __error__",
|
||||||
|
"invalid-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__"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contextMenu": {
|
||||||
|
"showActionList": "動作一覧を表示",
|
||||||
|
"insert": "挿入",
|
||||||
|
"node": "ノード",
|
||||||
|
"junction": "分岐点",
|
||||||
|
"linkNodes": "Linkノード"
|
||||||
|
},
|
||||||
|
"env-var": {
|
||||||
|
"environment": "環境変数",
|
||||||
|
"header": "大域環境変数",
|
||||||
|
"revert": "破棄"
|
||||||
|
},
|
||||||
|
"action-list": {
|
||||||
|
"toggle-show-tips": "ヒント表示切替",
|
||||||
|
"show-about": "Node-REDの説明を表示",
|
||||||
|
"show-welcome-tour": "ウェルカムツアー表示",
|
||||||
|
"show-next-tab": "次のタブを表示",
|
||||||
|
"show-previous-tab": "前のタブを表示",
|
||||||
|
"add-flow": "フローを追加",
|
||||||
|
"add-flow-to-right": "フローを右に追加",
|
||||||
|
"edit-flow": "フローを編集",
|
||||||
|
"remove-flow": "フローを削除",
|
||||||
|
"enable-flow": "フローを有効化",
|
||||||
|
"disable-flow": "フローを無効化",
|
||||||
|
"hide-flow": "フローを隠す",
|
||||||
|
"hide-other-flows": "他のフローを非表示",
|
||||||
|
"hide-all-flows": "全てのフローを非表示",
|
||||||
|
"show-all-flows": "全てのフローを表示",
|
||||||
|
"show-last-hidden-flow": "最後に非表示にしたフローを表示",
|
||||||
|
"list-modified-nodes": "修正したフローを表示",
|
||||||
|
"list-hidden-flows": "非表示フローを表示",
|
||||||
|
"list-flows": "フロー一覧",
|
||||||
|
"list-subflows": "サブフロー一覧",
|
||||||
|
"go-to-previous-location": "前の位置に移動",
|
||||||
|
"go-to-next-location": "次の位置に移動",
|
||||||
|
"copy-selection-to-internal-clipboard": "選択をクリップボードにコピー",
|
||||||
|
"cut-selection-to-internal-clipboard": "選択をクリップボードに切り取り",
|
||||||
|
"paste-from-internal-clipboard": "クリップボードから貼り付け",
|
||||||
|
"detach-selected-nodes": "選択ノードを接続から外す",
|
||||||
|
"delete-selection": "選択を削除",
|
||||||
|
"delete-selection-and-reconnect": "選択を削除し再接続",
|
||||||
|
"edit-selected-node": "選択したノードを編集",
|
||||||
|
"go-to-selection": "選択に移動",
|
||||||
|
"undo": "変更操作を戻す",
|
||||||
|
"redo": "変更操作をやり直し",
|
||||||
|
"select-all-nodes": "全てのノードを選択",
|
||||||
|
"select-none": "ノードを選択",
|
||||||
|
"enable-selected-nodes": "選択ノードを有効化",
|
||||||
|
"disable-selected-nodes": "選択ノードを無効化",
|
||||||
|
"toggle-show-grid": "グリッド表示切替",
|
||||||
|
"toggle-snap-grid": "ノードの配置補助切替",
|
||||||
|
"toggle-status": "ステータス表示切替",
|
||||||
|
"show-selected-node-labels": "選択したノードのラベルを表示",
|
||||||
|
"hide-selected-node-labels": "選択したノードのラベルを非表示",
|
||||||
|
"scroll-view-up": "上スクロール",
|
||||||
|
"scroll-view-right": "右スクロール",
|
||||||
|
"scroll-view-down": "下スクロール",
|
||||||
|
"scroll-view-left": "左スクロール",
|
||||||
|
"step-view-up": "一単位上スクロール",
|
||||||
|
"step-view-right": "一単位右スクロール",
|
||||||
|
"step-view-down": "一単位下スクロール",
|
||||||
|
"step-view-left": "一単位左スクロール",
|
||||||
|
"move-selection-up": "選択を上移動",
|
||||||
|
"move-selection-right": "選択を右移動",
|
||||||
|
"move-selection-down": "選択を下移動",
|
||||||
|
"move-selection-left": "選択を左移動",
|
||||||
|
"move-selection-forwards": "選択を前面に移動",
|
||||||
|
"move-selection-backwards": "選択を背面に移動",
|
||||||
|
"move-selection-to-front": "選択を最前面に移動",
|
||||||
|
"move-selection-to-back": "選択を最背面に移動",
|
||||||
|
"step-selection-up": "選択を一単位上移動",
|
||||||
|
"step-selection-right": "選択を一単位右移動",
|
||||||
|
"step-selection-down": "選択を一単位下移動",
|
||||||
|
"step-selection-left": "選択を一単位左移動",
|
||||||
|
"select-connected-nodes": "接続されたノードを選択",
|
||||||
|
"select-downstream-nodes": "後方に接続されたノードを選択",
|
||||||
|
"select-upstream-nodes": "前方に接続されたノードを選択",
|
||||||
|
"go-to-next-node": "次のノードに移動",
|
||||||
|
"go-to-previous-node": "前のノードに移動",
|
||||||
|
"go-to-next-sibling": "次の兄弟ノードに移動",
|
||||||
|
"go-to-previous-sibling": "前の兄弟ノードに移動",
|
||||||
|
"go-to-nearest-node-on-left": "最も近い左側ノードに移動",
|
||||||
|
"go-to-nearest-node-on-right": "最も近い右側ノードに移動",
|
||||||
|
"go-to-nearest-node-above": "最も近い上側ノードに移動",
|
||||||
|
"go-to-nearest-node-below": "最も近い下側ノードに移動",
|
||||||
|
"align-selection-to-grid": "選択を整列",
|
||||||
|
"align-selection-to-left": "選択を左揃え",
|
||||||
|
"align-selection-to-right": "選択を右揃え",
|
||||||
|
"align-selection-to-top": "選択を上揃え",
|
||||||
|
"align-selection-to-bottom": "選択を下揃え",
|
||||||
|
"align-selection-to-middle": "選択を上下中央揃え",
|
||||||
|
"align-selection-to-center": "選択を左右中央揃え",
|
||||||
|
"distribute-selection-horizontally": "選択を左右に整列",
|
||||||
|
"distribute-selection-vertically": "選択を上下に整列",
|
||||||
|
"wire-series-of-nodes": "ノードを一続きに接続",
|
||||||
|
"wire-node-to-multiple": "ノードを複数に接続",
|
||||||
|
"wire-multiple-to-node": "複数からノードへ接続",
|
||||||
|
"split-wire-with-link-nodes": "ワイヤーをlinkノードで分割",
|
||||||
|
"generate-node-names": "ノード名を生成",
|
||||||
|
"show-user-settings": "ユーザ設定を表示",
|
||||||
|
"show-help": "ヘルプを表示",
|
||||||
|
"toggle-palette": "パレットの表示切替",
|
||||||
|
"show-event-log": "イベントログを表示",
|
||||||
|
"manage-palette": "パレットの管理",
|
||||||
|
"toggle-sidebar": "サイドバーの表示切替",
|
||||||
|
"show-info-tab": "ノード情報タブの表示",
|
||||||
|
"show-help-tab": "ノードヘルプタブの表示",
|
||||||
|
"show-config-tab": "設定ノードタブの表示",
|
||||||
|
"select-all-config-nodes": "全ての設定ノードを選択",
|
||||||
|
"delete-config-selection": "選択した設定ノードを削除",
|
||||||
|
"show-context-tab": "コンテキストデータタブを表示",
|
||||||
|
"create-subflow": "サブフローを作成",
|
||||||
|
"convert-to-subflow": "選択をサブフローに変換",
|
||||||
|
"group-selection": "選択をグループ化",
|
||||||
|
"ungroup-selection": "選択をグループ解除",
|
||||||
|
"merge-selection-to-group": "選択をグループにマージ",
|
||||||
|
"remove-selection-from-group": "選択をグループから削除",
|
||||||
|
"copy-group-style": "グループのスタイルをコピー",
|
||||||
|
"paste-group-style": "グループのスタイルを貼り付け",
|
||||||
|
"show-export-dialog": "書き出しダイアログを表示",
|
||||||
|
"show-import-dialog": "読み込みダイアログを表示",
|
||||||
|
"show-library-export-dialog": "ライブラリ書き出しダイアログを表示",
|
||||||
|
"show-library-import-dialog": "ライブラリ読み込みダイアログを表示",
|
||||||
|
"show-examples-import-dialog": "サンプル読み込みダイアログを表示",
|
||||||
|
"search": "検索",
|
||||||
|
"search-previous": "前を検索",
|
||||||
|
"search-next": "次を検索",
|
||||||
|
"show-action-list": "動作一覧を表示",
|
||||||
|
"confirm-edit-tray": "編集を完了",
|
||||||
|
"cancel-edit-tray": "編集をキャンセル",
|
||||||
|
"show-remote-diff": "リモートとの変更差分を表示",
|
||||||
|
"deploy-flows": "フローをデプロイ",
|
||||||
|
"restart-flows": "フローを再起動",
|
||||||
|
"set-deploy-type-to-full": "デプロイを「全て」に設定",
|
||||||
|
"set-deploy-type-to-modified-flows": "デプロイを「変更したフロー」に設定",
|
||||||
|
"set-deploy-type-to-modified-nodes": "デプロイを「変更したノード」に設定",
|
||||||
|
"show-debug-tab": "デバッグタブを表示",
|
||||||
|
"clear-debug-messages": "デバッグメッセージを削除",
|
||||||
|
"clear-filtered-debug-messages": "フィルタしたデバッグメッセージを削除",
|
||||||
|
"activate-selected-debug-nodes": "選択したデバッグノードを有効化",
|
||||||
|
"activate-all-debug-nodes": "全てのデバッグノードを有効化",
|
||||||
|
"activate-all-flow-debug-nodes": "フロー内の全デバッグノードを有効化",
|
||||||
|
"deactivate-selected-debug-nodes": "選択したデバッグノードを無効化",
|
||||||
|
"deactivate-all-debug-nodes": "全てのデバッグノードを無効化",
|
||||||
|
"deactivate-all-flow-debug-nodes": "フロー内の全デバッグノードを無効化",
|
||||||
|
"zoom-in": "ズームイン",
|
||||||
|
"zoom-out": "ズームアウト",
|
||||||
|
"zoom-reset": "ズームリセット",
|
||||||
|
"toggle-navigator": "ナビゲータ表示切替",
|
||||||
|
"show-system-info": "システム情報",
|
||||||
|
"split-wires-with-junctions": "分岐点によりワイヤーを分割",
|
||||||
|
"new-project": "新しいプロジェクト",
|
||||||
|
"open-project": "プロジェクトを開く",
|
||||||
|
"show-project-settings": "プロジェクト設定を表示",
|
||||||
|
"show-version-control-tab": "バージョンコントロールタブを表示",
|
||||||
|
"start-flows": "フローを開始",
|
||||||
|
"stop-flows": "フローを停止",
|
||||||
|
"copy-item-url": "要素のURLをコピー",
|
||||||
|
"copy-item-edit-url": "要素の編集URLをコピー",
|
||||||
|
"move-flow-to-start": "フローを先頭に移動",
|
||||||
|
"move-flow-to-end": "フローを末尾に移動",
|
||||||
|
"show-global-env": "大域環境変数を表示",
|
||||||
|
"lock-flow": "フローを固定",
|
||||||
|
"unlock-flow": "フローの固定を解除",
|
||||||
|
"show-node-help": "ノードのヘルプを表示"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"tip14": "[shift] を押しながらノードを [click] すると、接続された全てのノードを選択できます。",
|
"tip14": "[shift] を押しながらノードを [click] すると、接続された全てのノードを選択できます。",
|
||||||
"tip15": "[ctrl] を押しながらノードを [click] すると、選択/非選択を切り替えできます。",
|
"tip15": "[ctrl] を押しながらノードを [click] すると、選択/非選択を切り替えできます。",
|
||||||
"tip16": "{{core:show-previous-tab}} や {{core:show-next-tab}} で、タブの切り替えができます。",
|
"tip16": "{{core:show-previous-tab}} や {{core:show-next-tab}} で、タブの切り替えができます。",
|
||||||
"tip17": "ノードのプロバティ設定画面にて {{core:confirm-edit-tray}} を押すと、変更を確定できます。また、 {{core:cancel-edit-tray}} を押すと、変更を取り消せます。",
|
"tip17": "ノードのプロパティ設定画面にて {{core:confirm-edit-tray}} を押すと、変更を確定できます。また、 {{core:cancel-edit-tray}} を押すと、変更を取り消せます。",
|
||||||
"tip18": "ノードを選択し、 {{core:edit-selected-node}} を押すとプロパティ設定画面が表示されます。"
|
"tip18": "ノードを選択し、 {{core:edit-selected-node}} を押すとプロパティ設定画面が表示されます。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,8 +52,8 @@
|
|||||||
"desc": "文字列 `str` からパターン `pattern` を検索し、置換文字列 `replacement` に置き換えます。\n\n任意の引数 `limit` には、置換回数の上限値を指定します。"
|
"desc": "文字列 `str` からパターン `pattern` を検索し、置換文字列 `replacement` に置き換えます。\n\n任意の引数 `limit` には、置換回数の上限値を指定します。"
|
||||||
},
|
},
|
||||||
"$now": {
|
"$now": {
|
||||||
"args": "",
|
"args": "$[picture [, timezone]]",
|
||||||
"desc": "ISO 8601互換形式の時刻を生成し、文字列として返します。"
|
"desc": "ISO 8601互換形式の時刻を生成し、文字列として返します。`picture` および `timezone` パラメータが指定されている場合、現在時刻を `$fromMillis()` 関数の説明に従ってフォーマットします。"
|
||||||
},
|
},
|
||||||
"$base64encode": {
|
"$base64encode": {
|
||||||
"args": "string",
|
"args": "string",
|
||||||
@@ -117,11 +117,11 @@
|
|||||||
},
|
},
|
||||||
"$boolean": {
|
"$boolean": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc": "以下のルールを用いて、ブーリアン型へ型変換します。:\n\n - `Boolean` : 変換しない\n - `string`: 空 : `false`\n - `string`: 空でない : `true`\n - `number`: `0` : `false`\n - `number`: 0でない : `true`\n - `null` : `false`\n - `array`: 空 : `false`\n - `array`: `true` に型変換された要素を持つ: `true`\n - `array`: 全ての要素が `false` に型変換: `false`\n - `object`: 空 : `false`\n - `object`: 空でない : `true`\n - `function` : `false`"
|
"desc": "以下のルールを用いて、真偽型へ型変換します。:\n\n - `Boolean` : 変換しない\n - `string`: 空 : `false`\n - `string`: 空でない : `true`\n - `number`: `0` : `false`\n - `number`: 0でない : `true`\n - `null` : `false`\n - `array`: 空 : `false`\n - `array`: `true` に型変換された要素を持つ: `true`\n - `array`: 全ての要素が `false` に型変換: `false`\n - `object`: 空 : `false`\n - `object`: 空でない : `true`\n - `function` : `false`"
|
||||||
},
|
},
|
||||||
"$not": {
|
"$not": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
"desc": "引数の否定をブーリアン型で返します。 `arg` は最初にブーリアン型に型変換されます。"
|
"desc": "引数の否定を真偽型で返します。 `arg` は最初に真偽型に型変換されます。"
|
||||||
},
|
},
|
||||||
"$exists": {
|
"$exists": {
|
||||||
"args": "arg",
|
"args": "arg",
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
},
|
},
|
||||||
"$sort": {
|
"$sort": {
|
||||||
"args": "array [, function]",
|
"args": "array [, function]",
|
||||||
"desc": "配列 `array` 内の値を並び変えた配列を返します。\n\n比較関数 `function` を用いる場合、比較関数は以下のとおり2つの引数を持つ必要があります。\n\n`function(left, right)`\n\n比較関数は、leftとrightの2つの値を比較するために、値を並び替える処理で呼び出されます。もし、求められる並び順にてleftの値をrightの値より後ろに置きたい場合は、比較関数は置き換えを表すブーリアン型の `true` を返す必要があります。一方、置き換えが不要の場合は `false` を返す必要があります。"
|
"desc": "配列 `array` 内の値を並び変えた配列を返します。\n\n比較関数 `function` を用いる場合、比較関数は以下のとおり2つの引数を持つ必要があります。\n\n`function(left, right)`\n\n比較関数は、`left` と `right` の2つの値を比較するために、値を並び替える処理で呼び出されます。もし、求められる並び順にて `left` の値を `right` の値より後ろに置きたい場合は、比較関数は置き換えを表す真偽型の `true` を返す必要があります。一方、置き換えが不要の場合は `false` を返す必要があります。"
|
||||||
},
|
},
|
||||||
"$reverse": {
|
"$reverse": {
|
||||||
"args": "array",
|
"args": "array",
|
||||||
@@ -200,12 +200,12 @@
|
|||||||
"desc": "文字数が引数 `width` の絶対値以上となるよう、必要に応じて追加文字を付け足した `string` のコピーを返します。\n\n`width` が正の値の場合、文字列の右側に追加文字を付け足します。もし負の値の場合、文字列の左側に追加文字を付け足します。\n\n任意の引数 `char` には、本関数で用いる追加文字を指定します。もし追加文字を指定しない場合は、既定値として空白文字を使用します。"
|
"desc": "文字数が引数 `width` の絶対値以上となるよう、必要に応じて追加文字を付け足した `string` のコピーを返します。\n\n`width` が正の値の場合、文字列の右側に追加文字を付け足します。もし負の値の場合、文字列の左側に追加文字を付け足します。\n\n任意の引数 `char` には、本関数で用いる追加文字を指定します。もし追加文字を指定しない場合は、既定値として空白文字を使用します。"
|
||||||
},
|
},
|
||||||
"$fromMillis": {
|
"$fromMillis": {
|
||||||
"args": "number",
|
"args": "number, [, picture [, timezone]]",
|
||||||
"desc": "Unixエポック(1 January, 1970 UTC)からの経過ミリ秒を表す数値を、ISO 8601形式のタイムスタンプの文字列に変換します。"
|
"desc": "Unixエポック(1 January, 1970 UTC)からの経過ミリ秒を表す数値を、`picture`の指定に従ってタイムスタンプの文字列に変換します。\n\n`picture`パラメータが指定されない場合、ISO 8601形式に変換します。\n\n`picture`を指定すると、指定した文字列に従って変換を行います。この変換はXPath F&O 3.1仕様におけるXPath/XQueryの2引数形式`format-dateTime`と同様です。`picture`パラメータはタイムスタンプの変換形式を定義し、その書式は`format-dateTime`と同じです。\n\n`timezone`を指定すると、指定タイムゾーンで変換します。`timezone`は'±HHMM'という形式で指定します。ここで、±は+もしくは-記号を表し、HHMMはUTCからの差分時間と分を表します。正の差分はUTCの東、負の差分は西のタイムゾーンとなります。"
|
||||||
},
|
},
|
||||||
"$formatNumber": {
|
"$formatNumber": {
|
||||||
"args": "number, picture [, options]",
|
"args": "number, picture [, options]",
|
||||||
"desc": "`number` を文字列へ変換し、文字列 `picture` に指定した数値表現になるよう書式を変更します。\n\nこの関数の動作は、XPath F&O 3.1の仕様に定義されているXPath/XQuery関数のfn:format-numberの動作と同じです。引数の文字列 picture は、fn:format-numberと同じ構文で数値の書式を定義します。\n\n任意の第三引数 `options` は、小数点記号の様な既定のロケール固有の書式設定文字を上書きするために使用します。この引数を指定する場合、XPath F&O 3.1の仕様の数値形式の項に記述されているname/valueペアを含むオブジェクトでなければなりません。"
|
"desc": "`number` を文字列へ変換し、文字列 `picture` に指定した数値表現になるよう書式を変更します。\n\nこの関数の動作は、XPath F&O 3.1の仕様に定義されているXPath/XQuery関数の `fn:format-number` の動作と同じです。引数の文字列 `picture` は、 `fn:format-number` と同じ構文で数値の書式を定義します。\n\n任意の第三引数 `options` は、小数点記号の様な既定のロケール固有の書式設定文字を上書きするために使用します。この引数を指定する場合、XPath F&O 3.1の仕様の数値形式の項に記述されているname/valueペアを含むオブジェクトでなければなりません。"
|
||||||
},
|
},
|
||||||
"$formatBase": {
|
"$formatBase": {
|
||||||
"args": "number [, radix]",
|
"args": "number [, radix]",
|
||||||
@@ -237,25 +237,25 @@
|
|||||||
},
|
},
|
||||||
"$assert": {
|
"$assert": {
|
||||||
"args": "arg, str",
|
"args": "arg, str",
|
||||||
"desc": "`arg`が真の場合、undefinedを返します。偽の場合、`str`をメッセージとする例外を送出します。"
|
"desc": "`arg`が真の場合、`undefined`を返します。偽の場合、`str`をメッセージとする例外を送出します。"
|
||||||
},
|
},
|
||||||
"$single": {
|
"$single": {
|
||||||
"args": "array, function",
|
"args": "array, function",
|
||||||
"desc": "`array`の要素のうち、条件判定関数`function`を満たす(`function`に与えた場合に真偽値`true`を返す)要素が1つのみである場合、それを返します。マッチする要素が1つのみでない場合、例外を送出します。\n\n指定する関数は`function(value [, index [, array]])`というシグネチャでなければなりません。ここで、`value`は`array`の要素値、`index`は要素の添字、第三引数には配列全体を渡します。"
|
"desc": "`array`の要素のうち、条件判定関数`function`を満たす(`function`に与えた場合に真偽値`true`を返す)要素が1つのみである場合、それを返します。マッチする要素が1つのみでない場合、例外を送出します。\n\n指定する関数は`function(value [, index [, array]])`というシグネチャでなければなりません。ここで、`value`は`array`の要素値、`index`は要素の添字、第三引数には配列全体を渡します。"
|
||||||
},
|
},
|
||||||
"$encodeUrl": {
|
"$encodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
"desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
},
|
},
|
||||||
"$encodeUrlComponent": {
|
"$encodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Uniform Resource Locator (URL)要素を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
"desc": "Uniform Resource Locator (URL)要素を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrl": {
|
"$decodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "encodeUrlComponentで置換したUniform Resource Locator (URL)をデコードします。\n\n例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
"desc": "encodeUrlComponentで置換したUniform Resource Locator (URL)をデコードします。\n\n例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrlComponent": {
|
"$decodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "encodeUrlで置換したUniform Resource Locator (URL)要素をデコードします。\n\n例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
"desc": "encodeUrlで置換したUniform Resource Locator (URL)要素をデコードします。\n\n例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
},
|
},
|
||||||
@@ -270,5 +270,9 @@
|
|||||||
"$moment": {
|
"$moment": {
|
||||||
"args": "[str]",
|
"args": "[str]",
|
||||||
"desc": "Momentライブラリを使用して日付オブジェクトを取得します。"
|
"desc": "Momentライブラリを使用して日付オブジェクトを取得します。"
|
||||||
|
},
|
||||||
|
"$clone": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "オブジェクトを安全に複製します。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
264
packages/node_modules/@node-red/editor-client/locales/ko/editor.json
vendored
Executable file → Normal file
264
packages/node_modules/@node-red/editor-client/locales/ko/editor.json
vendored
Executable file → Normal file
@@ -24,16 +24,29 @@
|
|||||||
"delete": "정말로 '__label__' 을(를) 삭제하시겠습니까?",
|
"delete": "정말로 '__label__' 을(를) 삭제하시겠습니까?",
|
||||||
"dropFlowHere": "플로우를 이곳에 가져오세요",
|
"dropFlowHere": "플로우를 이곳에 가져오세요",
|
||||||
"addFlow": "플로우 추가",
|
"addFlow": "플로우 추가",
|
||||||
|
"addFlowToRight": "오른쪽에 플로우 추가",
|
||||||
|
"hideFlow": "플로우 숨기기",
|
||||||
|
"hideOtherFlows": "다른 플로우 숨기기",
|
||||||
|
"showAllFlows": "모든 플로우 보기",
|
||||||
|
"hideAllFlows": "모든 플로우 숨기기",
|
||||||
|
"hiddenFlows": "__count__개의 숨겨진 플로우 보기",
|
||||||
|
"hiddenFlows_plural": "__count__개의 숨겨진 플로우 보기",
|
||||||
|
"showLastHiddenFlow": "마지막으로 숨겨진 플로우 보기",
|
||||||
|
"listFlows": "플로우 리스트",
|
||||||
|
"listSubflows": "서브 플로우 리스트",
|
||||||
"status": "상태",
|
"status": "상태",
|
||||||
"enabled": "사용가능",
|
"enabled": "사용가능",
|
||||||
"disabled": "사용불가능",
|
"disabled": "사용불가능",
|
||||||
"info": "상세내역"
|
"info": "상세내역",
|
||||||
|
"selectNodes": "선택할 노드 클릭"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"label": {
|
"label": {
|
||||||
"view": {
|
"view": {
|
||||||
"view": "창",
|
"view": "창",
|
||||||
"grid": "눈금선",
|
"grid": "눈금선",
|
||||||
|
"storeZoom": "불러오기 시 확대/축소 복원",
|
||||||
|
"storePosition": "불러오기 시 스크롤 위치 복원",
|
||||||
"showGrid": "눈금선 보이기",
|
"showGrid": "눈금선 보이기",
|
||||||
"snapGrid": "노드 배치 보조 켜기",
|
"snapGrid": "노드 배치 보조 켜기",
|
||||||
"gridSize": "눈금선 크기",
|
"gridSize": "눈금선 크기",
|
||||||
@@ -41,7 +54,9 @@
|
|||||||
"defaultDir": "기본",
|
"defaultDir": "기본",
|
||||||
"ltr": "왼쪽 -> 오른쪽",
|
"ltr": "왼쪽 -> 오른쪽",
|
||||||
"rtl": "오른쪽 -> 왼쪽",
|
"rtl": "오른쪽 -> 왼쪽",
|
||||||
"auto": "자동배분"
|
"auto": "자동배분",
|
||||||
|
"language": "언어",
|
||||||
|
"browserDefault": "브라우저 기본값"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"show": "우측사이드바 보이기"
|
"show": "우측사이드바 보이기"
|
||||||
@@ -49,6 +64,7 @@
|
|||||||
"palette": {
|
"palette": {
|
||||||
"show": "팔렛트 보이기"
|
"show": "팔렛트 보이기"
|
||||||
},
|
},
|
||||||
|
"edit": "수정",
|
||||||
"settings": "설정",
|
"settings": "설정",
|
||||||
"userSettings": "사용자 설정",
|
"userSettings": "사용자 설정",
|
||||||
"nodes": "노드설정",
|
"nodes": "노드설정",
|
||||||
@@ -56,14 +72,13 @@
|
|||||||
"displayConfig": "설정 노드 보기",
|
"displayConfig": "설정 노드 보기",
|
||||||
"import": "가져오기",
|
"import": "가져오기",
|
||||||
"export": "내보내기",
|
"export": "내보내기",
|
||||||
"search": "플로우 겅색",
|
"search": "플로우 검색",
|
||||||
"searchInput": "플로우 검색",
|
"searchInput": "플로우 검색",
|
||||||
"subflows": "보조 플로우",
|
"subflows": "서브 플로우",
|
||||||
"createSubflow": "보조 플로우 생성",
|
"createSubflow": "서브 플로우 생성",
|
||||||
"selectionToSubflow": "보조 플로우 선택",
|
"selectionToSubflow": "서브 플로우 선택",
|
||||||
"flows": "플로우",
|
"flows": "플로우",
|
||||||
"add": "추가",
|
"add": "추가",
|
||||||
"rename": "이름변경",
|
|
||||||
"delete": "삭제",
|
"delete": "삭제",
|
||||||
"keyboardShortcuts": "단축키",
|
"keyboardShortcuts": "단축키",
|
||||||
"login": "로그인",
|
"login": "로그인",
|
||||||
@@ -71,19 +86,43 @@
|
|||||||
"editPalette": "팔렛트 관리",
|
"editPalette": "팔렛트 관리",
|
||||||
"other": "기타",
|
"other": "기타",
|
||||||
"showTips": "Tip 보기",
|
"showTips": "Tip 보기",
|
||||||
|
"showWelcomeTours": "새 버전에 대한 가이드 보기 표시",
|
||||||
"help": "Node-RED 웹사이트",
|
"help": "Node-RED 웹사이트",
|
||||||
"projects": "프로젝트",
|
"projects": "프로젝트",
|
||||||
"projects-new": "신규",
|
"projects-new": "신규",
|
||||||
"projects-open": "열기",
|
"projects-open": "열기",
|
||||||
"projects-settings": "프로젝트 설정",
|
"projects-settings": "프로젝트 설정",
|
||||||
"showNodeLabelDefault": "새로 추가된 노드의 라벨 보이기"
|
"showNodeLabelDefault": "새로 추가된 노드의 라벨 보이기",
|
||||||
|
"codeEditor": "Code Editor",
|
||||||
|
"groups": "그룹",
|
||||||
|
"groupSelection": "그룹 선택",
|
||||||
|
"ungroupSelection": "그룹 선택 해제",
|
||||||
|
"groupMergeSelection": "선택 항목 병합",
|
||||||
|
"groupRemoveSelection": "선택 그룹 제거",
|
||||||
|
"arrange": "배치",
|
||||||
|
"alignLeft": "왼쪽으로 정렬",
|
||||||
|
"alignCenter": "가운데 정렬",
|
||||||
|
"alignRight": "오른쪽으로 정렬",
|
||||||
|
"alignTop": "맨 위에 정렬",
|
||||||
|
"alignMiddle": "맨 위에 정렬",
|
||||||
|
"alignBottom": "맨 아래 정렬",
|
||||||
|
"distributeHorizontally": "수평으로 배치",
|
||||||
|
"distributeVertically": "수직으로 배치",
|
||||||
|
"moveToBack": "맨 뒤로 이동",
|
||||||
|
"moveToFront": "맨 앞으로 이동",
|
||||||
|
"moveBackwards": "뒤로 이동",
|
||||||
|
"moveForwards": "앞으로 이동"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"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__\" __result__ of __count__"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"loggedInAs": "__name__ 에 로그인됨",
|
"loggedInAs": "__name__ 에 로그인됨",
|
||||||
@@ -99,12 +138,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification": {
|
"notification": {
|
||||||
|
"state": {
|
||||||
|
"flowsStopped": "플로우 중지됨",
|
||||||
|
"flowsStarted": "플로우 시작됨"
|
||||||
|
},
|
||||||
"warning": "<strong>경고</strong>: __message__",
|
"warning": "<strong>경고</strong>: __message__",
|
||||||
"warnings": {
|
"warnings": {
|
||||||
"undeployedChanges": "변경사항 배포가 취소되었습니다",
|
"undeployedChanges": "변경사항 배포가 취소되었습니다",
|
||||||
"nodeActionDisabled": "노드 실행이 비활성화 되었습니다",
|
"nodeActionDisabled": "노드 실행이 비활성화 되었습니다",
|
||||||
"nodeActionDisabledSubflow": "보조 플로우에서 노드 실행이 비활성화 되었습니다",
|
"nodeActionDisabledSubflow": "보조 플로우에서 노드 실행이 비활성화 되었습니다",
|
||||||
"missing-types": "<p>타입이 없는 노드로인해 플로우가 중지되었습니다</p>",
|
"missing-types": "<p>타입이 없는 노드로인해 플로우가 중지되었습니다</p>",
|
||||||
|
"missing-modules": "<p>누락된 모듈로 인해 플로우가 중지되었습니다.</p>",
|
||||||
"safe-mode": "<p>[안전모드] 플로우가 정지되었습니다.</p><p>플로우의 수정과 배포가 가능합니다. 다시 배포버튼을 누르세요.</p>",
|
"safe-mode": "<p>[안전모드] 플로우가 정지되었습니다.</p><p>플로우의 수정과 배포가 가능합니다. 다시 배포버튼을 누르세요.</p>",
|
||||||
"restartRequired": "업그레이드한 모듈을 유효화하기 위해 Node-RED를 재시작 합니다 ",
|
"restartRequired": "업그레이드한 모듈을 유효화하기 위해 Node-RED를 재시작 합니다 ",
|
||||||
"credentials_load_failed": "<p>인증정보 복호화에 실패하여 플로우가 멈췄습니다. </p><p>인증정보는 암호화 되어있습니다. 프로젝트의 암호화 키가 깨졌거나 정상적이지 않습니다.</p>",
|
"credentials_load_failed": "<p>인증정보 복호화에 실패하여 플로우가 멈췄습니다. </p><p>인증정보는 암호화 되어있습니다. 프로젝트의 암호화 키가 깨졌거나 정상적이지 않습니다.</p>",
|
||||||
@@ -132,7 +176,12 @@
|
|||||||
"updated": "'__project__'가 변경 되었습니다",
|
"updated": "'__project__'가 변경 되었습니다",
|
||||||
"pull": "'__project__'를 다시 가져왔습니다",
|
"pull": "'__project__'를 다시 가져왔습니다",
|
||||||
"revert": "'__project__'를 취소했습니다",
|
"revert": "'__project__'를 취소했습니다",
|
||||||
"merge-complete": "Git 병합이 완료되었습니다"
|
"merge-complete": "Git 병합이 완료되었습니다",
|
||||||
|
"setupCredentials": "자격 증명 설정",
|
||||||
|
"setupProjectFiles": "프로젝트 파일 설정",
|
||||||
|
"no": "취소",
|
||||||
|
"createDefault": "기본 프로젝트 파일 만들기",
|
||||||
|
"mergeConflict": "병합 충돌 표시"
|
||||||
},
|
},
|
||||||
"label": {
|
"label": {
|
||||||
"manage-project-dep": "프로젝트 의존성 관리",
|
"manage-project-dep": "프로젝트 의존성 관리",
|
||||||
@@ -141,7 +190,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": {
|
||||||
@@ -151,10 +201,14 @@
|
|||||||
"node_plural": "__count__ 개의 노드",
|
"node_plural": "__count__ 개의 노드",
|
||||||
"configNode": "__count__ 개의 설정 노드",
|
"configNode": "__count__ 개의 설정 노드",
|
||||||
"configNode_plural": "__count__ 개의 설정 노드",
|
"configNode_plural": "__count__ 개의 설정 노드",
|
||||||
|
"group": "__count__ 개의 그룹",
|
||||||
|
"group_plural": "__count__ 개의 그룹",
|
||||||
"flow": "__count__ 개의 플로우",
|
"flow": "__count__ 개의 플로우",
|
||||||
"flow_plural": "__count__ 개의 플로우",
|
"flow_plural": "__count__ 개의 플로우",
|
||||||
"subflow": "__count__ 개의 서브 플로우",
|
"subflow": "__count__ 개의 서브 플로우",
|
||||||
"subflow_plural": "__count__ 개의 서브 플로우",
|
"subflow_plural": "__count__ 개의 서브 플로우",
|
||||||
|
"replacedNodes": "__count__ 개의 교체된 노드",
|
||||||
|
"replacedNodes_plural": "__count__ 개의 교체된 노드",
|
||||||
"pasteNodes": "여기에 노드를 붙여넣기 하세요",
|
"pasteNodes": "여기에 노드를 붙여넣기 하세요",
|
||||||
"selectFile": "불러올 파일을 선택하세요",
|
"selectFile": "불러올 파일을 선택하세요",
|
||||||
"importNodes": "노드 불러오기",
|
"importNodes": "노드 불러오기",
|
||||||
@@ -162,28 +216,46 @@
|
|||||||
"download": "다운로드",
|
"download": "다운로드",
|
||||||
"importUnrecognised": "알 수 없는 형식 :",
|
"importUnrecognised": "알 수 없는 형식 :",
|
||||||
"importUnrecognised_plural": "알 수 없는 형식 :",
|
"importUnrecognised_plural": "알 수 없는 형식 :",
|
||||||
|
"importDuplicate": "가져온 중복 노드:",
|
||||||
|
"importDuplicate_plural": "가져온 중복 노드:",
|
||||||
"nodesExported": "클립보드에 노드 내보내기",
|
"nodesExported": "클립보드에 노드 내보내기",
|
||||||
"nodesImported": "불러오기 : ",
|
"nodesImported": "불러오기 : ",
|
||||||
"nodeCopied": "__count__개의 노드가 복사되었습니다",
|
"nodeCopied": "__count__개의 노드가 복사되었습니다",
|
||||||
"nodeCopied_plural": "__count__개의 노드가 복사되었습니다",
|
"nodeCopied_plural": "__count__개의 노드가 복사되었습니다",
|
||||||
|
"groupCopied": "__count__ 개의 그룹이 복사되었습니다",
|
||||||
|
"groupCopied_plural": "__count__ 개의 그룹이 복사되었습니다",
|
||||||
|
"groupStyleCopied": "그룹 스타일이 복사되었습니다",
|
||||||
"invalidFlow": "정상적지 않은 플로우 : __message__",
|
"invalidFlow": "정상적지 않은 플로우 : __message__",
|
||||||
|
"recoveredNodes": "복구된 노드",
|
||||||
|
"recoveredNodesInfo": "이 플로우의 노드를 가져올 때 유효한 플로우 ID가 누락되었습니다. 해당 플로우에 추가되었으므로 복원하거나 삭제할 수 있습니다.",
|
||||||
|
"recoveredNodesNotification": "<p>유효하지 않은 플로우 ID를 가진 노드입니다.</p><p>'__flowName__' 라는 플로우에 추가되었습니다.</p>",
|
||||||
"export": {
|
"export": {
|
||||||
"selected": "선택된 노드",
|
"selected": "선택된 노드",
|
||||||
"current": "현재 플로우",
|
"current": "현재 플로우",
|
||||||
"all": "모든 플로우",
|
"all": "모든 플로우",
|
||||||
"compact": "압축형식",
|
"compact": "압축형식",
|
||||||
"formatted": "서식유지",
|
"formatted": "서식유지",
|
||||||
"copy": "클립보드로 내보내기"
|
"copy": "클립보드로 내보내기",
|
||||||
|
"export": "라이브러리로 내보내기",
|
||||||
|
"exportAs": "내보내기",
|
||||||
|
"overwrite": "확인",
|
||||||
|
"exists": "<p><b>\"__file__\"</b> 이미 존재합니다.</p><p>교체하시겠습니까?</p>"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"import": "가져올 위치 : ",
|
"import": "가져올 위치 : ",
|
||||||
|
"importSelected": "선택 항목 가져오기",
|
||||||
|
"importCopy": "사본 가져오기",
|
||||||
|
"viewNodes": "노드 보기...",
|
||||||
"newFlow": "새로운 플로우",
|
"newFlow": "새로운 플로우",
|
||||||
|
"replace": "교체",
|
||||||
"errors": {
|
"errors": {
|
||||||
"notArray": "입력이 JSON 배열이 아닙니다",
|
"notArray": "입력이 JSON 배열이 아닙니다",
|
||||||
"itemNotObject": "입력이 올바른 플로우가 아닙니다 - __index__는 노드 오브젝트가 아닙니다",
|
"itemNotObject": "입력이 올바른 플로우가 아닙니다 - __index__는 노드 오브젝트가 아닙니다",
|
||||||
"missingId": "입력이 올바른 플로우가 아닙니다 - __index__의 'id' 속성이 없습니다",
|
"missingId": "입력이 올바른 플로우가 아닙니다 - __index__의 'id' 속성이 없습니다",
|
||||||
"missingType": "입력이 올바른 플로우가 아닙니다 - __index__의 'type' 속성이 없습니다"
|
"missingType": "입력이 올바른 플로우가 아닙니다 - __index__의 'type' 속성이 없습니다"
|
||||||
}
|
},
|
||||||
|
"conflictNotification1": "가져오는 노드 중 일부가 이미 작업 공간에 있습니다..",
|
||||||
|
"conflictNotification2": "가져올 노드와 기존 노드를 바꿀지 아니면 복사본을 가져올지 선택합니다."
|
||||||
},
|
},
|
||||||
"copyMessagePath": "Path가 복사 되었습니다",
|
"copyMessagePath": "Path가 복사 되었습니다",
|
||||||
"copyMessageValue": "Value가 복사 되었습니다",
|
"copyMessageValue": "Value가 복사 되었습니다",
|
||||||
@@ -197,13 +269,19 @@
|
|||||||
"modifiedFlowsDesc": "변경사항이 있는 플로우만 배포합니다",
|
"modifiedFlowsDesc": "변경사항이 있는 플로우만 배포합니다",
|
||||||
"modifiedNodes": "변경된 노드",
|
"modifiedNodes": "변경된 노드",
|
||||||
"modifiedNodesDesc": "변경사항이 있는 노드만 배포합니다",
|
"modifiedNodesDesc": "변경사항이 있는 노드만 배포합니다",
|
||||||
|
"startFlows": "시작",
|
||||||
|
"startFlowsDesc": "플로우를 시작합니다",
|
||||||
|
"stopFlows": "중지",
|
||||||
|
"stopFlowsDesc": "플로우를 중지합니다",
|
||||||
"restartFlows": "플로우 재시작",
|
"restartFlows": "플로우 재시작",
|
||||||
"restartFlowsDesc": "현재 배포된 플로우를 재시작합니다",
|
"restartFlowsDesc": "현재 배포된 플로우를 재시작합니다",
|
||||||
"successfulDeploy": "배포가 성공했습니다",
|
"successfulDeploy": "배포가 성공했습니다",
|
||||||
"successfulRestart": "플로우 재시작을 성공했습니다",
|
"successfulRestart": "플로우 재시작을 성공했습니다",
|
||||||
"deployFailed": "배포 실패 : __message__",
|
"deployFailed": "배포 실패 : __message__",
|
||||||
"unusedConfigNodes": "사용되지 않는 설정노드가 있습니다",
|
"unusedConfigNodes": "사용되지 않는 설정노드가 있습니다",
|
||||||
"unusedConfigNodesLink": "여기를 클릭하면 볼 수 있습니다",
|
"unusedConfigNodesButton": "사용하지 않는 구성 노드 검색",
|
||||||
|
"unknownNodesButton": "알 수 없는 노드 검색",
|
||||||
|
"invalidNodesButton": "잘못된 노드 검색",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "서버의 응답이 없습니다"
|
"noResponse": "서버의 응답이 없습니다"
|
||||||
},
|
},
|
||||||
@@ -263,6 +341,7 @@
|
|||||||
"newVersionError": "New Version의 JSON 형식이 올바르지 않습니다 :"
|
"newVersionError": "New Version의 JSON 형식이 올바르지 않습니다 :"
|
||||||
},
|
},
|
||||||
"subflow": {
|
"subflow": {
|
||||||
|
"editSubflowInstance": "서브 플로우 인스턴스 수정: __name__",
|
||||||
"editSubflow": "플로우 템플릿 수정 : __name__",
|
"editSubflow": "플로우 템플릿 수정 : __name__",
|
||||||
"edit": "플로우 템플릿 수정",
|
"edit": "플로우 템플릿 수정",
|
||||||
"subflowInstances": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다",
|
"subflowInstances": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다",
|
||||||
@@ -270,14 +349,39 @@
|
|||||||
"editSubflowProperties": "속성 수정",
|
"editSubflowProperties": "속성 수정",
|
||||||
"input": "입력:",
|
"input": "입력:",
|
||||||
"output": "출력:",
|
"output": "출력:",
|
||||||
|
"status": "상태 노드",
|
||||||
"deleteSubflow": "서브 플로우 삭제",
|
"deleteSubflow": "서브 플로우 삭제",
|
||||||
|
"confirmDelete": "서브 플로우를 삭제하시겠습니까?",
|
||||||
"info": "상세내역",
|
"info": "상세내역",
|
||||||
"category": "카테고리",
|
"category": "카테고리",
|
||||||
|
"module": "모듈",
|
||||||
|
"license": "라이선스",
|
||||||
|
"licenseNone": "없음",
|
||||||
|
"licenseOther": "Other",
|
||||||
|
"type": "노드",
|
||||||
|
"version": "버전",
|
||||||
|
"versionPlaceholder": "x.y.z",
|
||||||
|
"keys": "키워드",
|
||||||
|
"keysPlaceholder": "키워드(쉼표로 구분)를 입력해주세요",
|
||||||
|
"author": "이름",
|
||||||
|
"authorPlaceholder": "이름 또는 이메일을 입력해주세요",
|
||||||
|
"desc": "설명",
|
||||||
|
"env": {
|
||||||
|
"restore": "서브 플로우 기본값으로 복원",
|
||||||
|
"remove": "환경 변수 제거"
|
||||||
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"noNodesSelected": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 노드가 선택되지 않았습니다",
|
"noNodesSelected": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 노드가 선택되지 않았습니다",
|
||||||
"multipleInputsToSelection": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 복수의 입력이 선택되었습니다"
|
"multipleInputsToSelection": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 복수의 입력이 선택되었습니다"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"group": {
|
||||||
|
"editGroup": "그룹 수정: __name__",
|
||||||
|
"errors": {
|
||||||
|
"cannotCreateDiffGroups": "다른 그룹의 노드를 사용하여 그룹을 생성할 수 없습니다",
|
||||||
|
"cannotAddSubflowPorts": "그룹에 서브 플로우 포트를 추가할 수 없습니다"
|
||||||
|
}
|
||||||
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"configEdit": "수정",
|
"configEdit": "수정",
|
||||||
"configAdd": "추가",
|
"configAdd": "추가",
|
||||||
@@ -291,19 +395,20 @@
|
|||||||
"addNewType": "__type__의 노드타입 추가 ...",
|
"addNewType": "__type__의 노드타입 추가 ...",
|
||||||
"nodeProperties": "노드 속성",
|
"nodeProperties": "노드 속성",
|
||||||
"label": "명칭",
|
"label": "명칭",
|
||||||
|
"color": "Color",
|
||||||
"portLabels": "포트 설정",
|
"portLabels": "포트 설정",
|
||||||
"labelInputs": "입력",
|
"labelInputs": "입력",
|
||||||
"labelOutputs": "출력",
|
"labelOutputs": "출력",
|
||||||
"settingIcon": "아이콘",
|
"settingIcon": "아이콘",
|
||||||
|
"default": "default",
|
||||||
"noDefaultLabel": "없음",
|
"noDefaultLabel": "없음",
|
||||||
"defaultLabel": "기본 명칭",
|
"defaultLabel": "기본 명칭",
|
||||||
"searchIcons": "아이콘 조회",
|
"searchIcons": "아이콘 조회",
|
||||||
"useDefault": "기본설정 사용",
|
"useDefault": "기본설정 사용",
|
||||||
"description": "상세 내역",
|
"description": "상세 내역",
|
||||||
"show": "보이기",
|
|
||||||
"hide": "숨기기",
|
|
||||||
"errors": {
|
"errors": {
|
||||||
"scopeChange": "범위를 변경하게 되면 다른 플로우의 노드가 사용이 불가능해 집니다."
|
"scopeChange": "범위를 변경하게 되면 다른 플로우의 노드가 사용이 불가능해 집니다.",
|
||||||
|
"invalidProperties": "유효하지 않은 속성:"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keyboard": {
|
"keyboard": {
|
||||||
@@ -316,10 +421,11 @@
|
|||||||
"global": "글로벌",
|
"global": "글로벌",
|
||||||
"workspace": "작업공간",
|
"workspace": "작업공간",
|
||||||
"selectAll": "모든 노드 선택",
|
"selectAll": "모든 노드 선택",
|
||||||
"selectAllConnected": "모든 연결된 노드 선택",
|
"selectNone": "노드 선택 취소",
|
||||||
|
"selectAllConnected": "연결된 모든 노드 선택",
|
||||||
"addRemoveNode": "노드 추가/삭제",
|
"addRemoveNode": "노드 추가/삭제",
|
||||||
"editSelected": "선택된 노드 수정",
|
"editSelected": "선택된 노드 수정",
|
||||||
"deleteSelected": "선택된 노드나 링크를 삭제",
|
"deleteSelected": "선택된 노드 또는 링크 삭제",
|
||||||
"importNode": "노드 불러오기",
|
"importNode": "노드 불러오기",
|
||||||
"exportNode": "노드 내보내기",
|
"exportNode": "노드 내보내기",
|
||||||
"nudgeNode": "선택된 노드 이동 (1px)",
|
"nudgeNode": "선택된 노드 이동 (1px)",
|
||||||
@@ -329,9 +435,14 @@
|
|||||||
"copyNode": "선택된 노드 복사",
|
"copyNode": "선택된 노드 복사",
|
||||||
"cutNode": "선택된 노드 잘라내기",
|
"cutNode": "선택된 노드 잘라내기",
|
||||||
"pasteNode": "노드 붙여넣기",
|
"pasteNode": "노드 붙여넣기",
|
||||||
|
"copyGroupStyle": "그룹 스타일 복사하기",
|
||||||
|
"pasteGroupStyle": "그룹 스타일 붙여넣기",
|
||||||
"undoChange": "마지막 변경 되돌리기",
|
"undoChange": "마지막 변경 되돌리기",
|
||||||
|
"redoChange": "다시 실행하기",
|
||||||
"searchBox": "검색창 열기",
|
"searchBox": "검색창 열기",
|
||||||
"managePalette": "팔렛트 관리"
|
"managePalette": "팔렛트 관리",
|
||||||
|
"actionList": "액션 목록",
|
||||||
|
"splitWireWithLinks": "링크 노드로 선택 항목 분할"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"library": "라이브러리",
|
"library": "라이브러리",
|
||||||
@@ -339,12 +450,15 @@
|
|||||||
"saveToLibrary": "라이브러리로 저장...",
|
"saveToLibrary": "라이브러리로 저장...",
|
||||||
"typeLibrary": "__type__ 라이브러리",
|
"typeLibrary": "__type__ 라이브러리",
|
||||||
"unnamedType": "이름없는 __type__",
|
"unnamedType": "이름없는 __type__",
|
||||||
|
"exportedToLibrary": "노드를 라이브러리로 내보냈습니다.",
|
||||||
"dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?",
|
"dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?",
|
||||||
"invalidFilename": "파일명이 올바르지 않습니다",
|
"invalidFilename": "파일명이 올바르지 않습니다",
|
||||||
"savedNodes": "저장된 노드",
|
"savedNodes": "저장된 노드",
|
||||||
"savedType": "저장된 __type__",
|
"savedType": "저장된 __type__",
|
||||||
"saveFailed": "저장 실패 : __message__",
|
"saveFailed": "저장 실패 : __message__",
|
||||||
|
"newFolder": "새로운 폴더",
|
||||||
"types": {
|
"types": {
|
||||||
|
"local": "로컬",
|
||||||
"examples": "예시"
|
"examples": "예시"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -355,9 +469,13 @@
|
|||||||
"addCategory": "추가 ...",
|
"addCategory": "추가 ...",
|
||||||
"label": {
|
"label": {
|
||||||
"subflows": "서브 플로우",
|
"subflows": "서브 플로우",
|
||||||
|
"network": "네트워크",
|
||||||
|
"common": "일반",
|
||||||
"input": "입력",
|
"input": "입력",
|
||||||
"output": "출력",
|
"output": "출력",
|
||||||
"function": "기능",
|
"function": "기능",
|
||||||
|
"sequence": "sequence",
|
||||||
|
"parser": "parser",
|
||||||
"social": "소셜",
|
"social": "소셜",
|
||||||
"storage": "저장",
|
"storage": "저장",
|
||||||
"analysis": "분석",
|
"analysis": "분석",
|
||||||
@@ -376,7 +494,8 @@
|
|||||||
"nodeEnabled_plural": "노드가 활성화 되었습니다:",
|
"nodeEnabled_plural": "노드가 활성화 되었습니다:",
|
||||||
"nodeDisabled": "노드가 비활성화 되었습니다:",
|
"nodeDisabled": "노드가 비활성화 되었습니다:",
|
||||||
"nodeDisabled_plural": "노드가 비활성화 되었습니다:",
|
"nodeDisabled_plural": "노드가 비활성화 되었습니다:",
|
||||||
"nodeUpgraded": "__module__ 노드모듈이 __version__으로 업그레이드 되었습니다"
|
"nodeUpgraded": "__module__ 노드모듈이 __version__으로 업그레이드 되었습니다",
|
||||||
|
"unknownNodeRegistered": "Error loading node: <ul><li>__type__<br>__error__</li></ul>"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"title": "팔렛트 관리",
|
"title": "팔렛트 관리",
|
||||||
@@ -423,6 +542,8 @@
|
|||||||
"sortAZ": "a-z",
|
"sortAZ": "a-z",
|
||||||
"sortRecent": "최근",
|
"sortRecent": "최근",
|
||||||
"more": "+ __count__ 개 더 보기",
|
"more": "+ __count__ 개 더 보기",
|
||||||
|
"upload": "Upload module tgz file",
|
||||||
|
"refresh": "모듈 목록 새로 고침",
|
||||||
"errors": {
|
"errors": {
|
||||||
"catalogLoadFailed": "<p>노드 카탈로그를 설치하지 못했습니다.</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
"catalogLoadFailed": "<p>노드 카탈로그를 설치하지 못했습니다.</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||||
"installFailed": "<p>설치 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
"installFailed": "<p>설치 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||||
@@ -463,6 +584,7 @@
|
|||||||
"label": "정보",
|
"label": "정보",
|
||||||
"node": "노드",
|
"node": "노드",
|
||||||
"type": "타입",
|
"type": "타입",
|
||||||
|
"group": "Group",
|
||||||
"module": "모듈",
|
"module": "모듈",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"status": "상태",
|
"status": "상태",
|
||||||
@@ -485,7 +607,23 @@
|
|||||||
"nodeHelp": "노드 도움말",
|
"nodeHelp": "노드 도움말",
|
||||||
"none": "없음",
|
"none": "없음",
|
||||||
"arrayItems": "__count__ 개의 항목",
|
"arrayItems": "__count__ 개의 항목",
|
||||||
"showTips": "설정에서 도움말을 열 수 있습니다. "
|
"showTips": "설정에서 도움말을 열 수 있습니다. ",
|
||||||
|
"outline": "개요",
|
||||||
|
"empty": "비우기",
|
||||||
|
"globalConfig": "전역 설정 노드",
|
||||||
|
"triggerAction": "트리거 작업",
|
||||||
|
"find": "작업 공간에서 찾기"
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"name": "도움말",
|
||||||
|
"label": "도움말",
|
||||||
|
"search": "도움말 검색",
|
||||||
|
"nodeHelp": "노드 도움말 보기",
|
||||||
|
"showHelp": "도움말 보기",
|
||||||
|
"showInOutline": "요약 보기",
|
||||||
|
"showTopics": "토픽 보기",
|
||||||
|
"noHelp": "선택한 도움말 항목이 없습니다",
|
||||||
|
"changeLog": "릴리즈 정보"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"name": "노드 설정",
|
"name": "노드 설정",
|
||||||
@@ -495,7 +633,9 @@
|
|||||||
"subflows": "보조 플로우",
|
"subflows": "보조 플로우",
|
||||||
"flows": "플로우",
|
"flows": "플로우",
|
||||||
"filterAll": "전체",
|
"filterAll": "전체",
|
||||||
|
"showAllConfigNodes": "모든 설정 노드 보기",
|
||||||
"filterUnused": "미사용",
|
"filterUnused": "미사용",
|
||||||
|
"showAllUnusedConfigNodes": "사용하지 않는 모든 설정 노드 보기",
|
||||||
"filtered": "__count__ 개 숨김"
|
"filtered": "__count__ 개 숨김"
|
||||||
},
|
},
|
||||||
"context": {
|
"context": {
|
||||||
@@ -506,8 +646,11 @@
|
|||||||
"empty": "공백",
|
"empty": "공백",
|
||||||
"node": "노드",
|
"node": "노드",
|
||||||
"flow": "플로우",
|
"flow": "플로우",
|
||||||
"global": "Global",
|
"global": "글로벌",
|
||||||
"deleteConfirm": "정말로 이 아이템을 지우시겠습니까?"
|
"deleteConfirm": "정말로 이 아이템을 지우시겠습니까?",
|
||||||
|
"autoRefresh": "선택 변경 시 새로 고침",
|
||||||
|
"refrsh": "새로고침",
|
||||||
|
"delete": "삭제"
|
||||||
},
|
},
|
||||||
"palette": {
|
"palette": {
|
||||||
"name": "팔레트 관리",
|
"name": "팔레트 관리",
|
||||||
@@ -522,6 +665,7 @@
|
|||||||
"noSummaryAvailable": "요약 없음",
|
"noSummaryAvailable": "요약 없음",
|
||||||
"editDescription": "프로젝트 상세내역 수정",
|
"editDescription": "프로젝트 상세내역 수정",
|
||||||
"editDependencies": "프로젝트 의존성 수정",
|
"editDependencies": "프로젝트 의존성 수정",
|
||||||
|
"noDescriptionAvailable": "설명 없음",
|
||||||
"editReadme": "README.md 수정",
|
"editReadme": "README.md 수정",
|
||||||
"showProjectSettings": "프로젝트 설정 보이기",
|
"showProjectSettings": "프로젝트 설정 보이기",
|
||||||
"projectSettings": {
|
"projectSettings": {
|
||||||
@@ -534,6 +678,10 @@
|
|||||||
"files": "파일",
|
"files": "파일",
|
||||||
"flow": "플로우",
|
"flow": "플로우",
|
||||||
"credentials": "인증정보",
|
"credentials": "인증정보",
|
||||||
|
"package": "Package",
|
||||||
|
"packageCreate": "변경 내용이 저장될 때 파일이 생성됩니다",
|
||||||
|
"fileNotExist": "파일이 존재하지 않습니다",
|
||||||
|
"selectFile": "파일 선택",
|
||||||
"invalidEncryptionKey": "잘못된 암호화 키",
|
"invalidEncryptionKey": "잘못된 암호화 키",
|
||||||
"encryptionEnabled": "암호화 활성화",
|
"encryptionEnabled": "암호화 활성화",
|
||||||
"encryptionDisabled": "암호화 비활성화",
|
"encryptionDisabled": "암호화 비활성화",
|
||||||
@@ -671,15 +819,29 @@
|
|||||||
"bin": "buffer",
|
"bin": "buffer",
|
||||||
"date": "timestamp",
|
"date": "timestamp",
|
||||||
"jsonata": "expression",
|
"jsonata": "expression",
|
||||||
"env": "env variable"
|
"env": "env variable",
|
||||||
|
"cred": "credential"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editableList": {
|
"editableList": {
|
||||||
"add": "추가"
|
"add": "추가",
|
||||||
|
"addTitle": "add an item"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
|
"history": "Search history",
|
||||||
|
"clear": "clear all",
|
||||||
"empty": "결과 없음",
|
"empty": "결과 없음",
|
||||||
"addNode": "노드 추가 ..."
|
"addNode": "노드 추가 ...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "설정 노드",
|
||||||
|
"unusedConfigNodes": "사용되지 않는 설정 노드",
|
||||||
|
"invalidNodes": "잘못된 노드",
|
||||||
|
"uknownNodes": "알 수 없는 노드",
|
||||||
|
"unusedSubflows": "사용되지 않는 서브 플로우",
|
||||||
|
"hiddenFlows": "숨겨진 플로우",
|
||||||
|
"modifiedNodes": "수정된 노드 및 플로우",
|
||||||
|
"thisFlow": "현재 플로우"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "기능",
|
"functions": "기능",
|
||||||
@@ -700,15 +862,36 @@
|
|||||||
"eval": "형식 오류 :\n __message__"
|
"eval": "형식 오류 :\n __message__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"monaco": {
|
||||||
|
"setTheme": "테마 설정"
|
||||||
|
},
|
||||||
"jsEditor": {
|
"jsEditor": {
|
||||||
"title": "자바스크립트 에디터"
|
"title": "자바스크립트 에디터"
|
||||||
},
|
},
|
||||||
|
"textEditor": {
|
||||||
|
"title": "텍스트 에디터"
|
||||||
|
},
|
||||||
"jsonEditor": {
|
"jsonEditor": {
|
||||||
"title": "JSON 에디터",
|
"title": "JSON 에디터",
|
||||||
"format": "JSON 형식"
|
"format": "JSON 형식",
|
||||||
|
"rawMode": "JSON 수정",
|
||||||
|
"uiMode": "비주얼 편집기",
|
||||||
|
"rawMode-readonly": "JSON",
|
||||||
|
"uiMode-readonly": "비주얼",
|
||||||
|
"insertAbove": "위로 삽입",
|
||||||
|
"insertBelow": "아래로 삽입",
|
||||||
|
"addItem": "속성 추가",
|
||||||
|
"copyPath": "속성의 키값 복사",
|
||||||
|
"expandItems": "속성 펼치기",
|
||||||
|
"collapseItems": "속성 접기",
|
||||||
|
"duplicate": "복사",
|
||||||
|
"error": {
|
||||||
|
"invalidJSON": "비유효한 JSON: "
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"markdownEditor": {
|
"markdownEditor": {
|
||||||
"title": "Markdown 에디터",
|
"title": "Markdown 에디터",
|
||||||
|
"expand": "Expand",
|
||||||
"format": "Markdown 형식",
|
"format": "Markdown 형식",
|
||||||
"heading1": "제목 레벨1",
|
"heading1": "제목 레벨1",
|
||||||
"heading2": "제목 레벨2",
|
"heading2": "제목 레벨2",
|
||||||
@@ -738,6 +921,7 @@
|
|||||||
"desc2": "이 기능을 건너뛰어도 상관없습니다. 언제든지 프로젝트 메뉴에서 첫번째 프로젝트를 만들 수 있습니다.",
|
"desc2": "이 기능을 건너뛰어도 상관없습니다. 언제든지 프로젝트 메뉴에서 첫번째 프로젝트를 만들 수 있습니다.",
|
||||||
"create": "프로젝트 생성",
|
"create": "프로젝트 생성",
|
||||||
"clone": "프로젝트 복제",
|
"clone": "프로젝트 복제",
|
||||||
|
"openExistingProject": "기존 프로젝트 열기",
|
||||||
"not-right-now": "나중에"
|
"not-right-now": "나중에"
|
||||||
},
|
},
|
||||||
"git-config": {
|
"git-config": {
|
||||||
@@ -855,7 +1039,8 @@
|
|||||||
"not-git": "git 저장소가 아닙니다",
|
"not-git": "git 저장소가 아닙니다",
|
||||||
"no-resource": "저장소아 없습니다",
|
"no-resource": "저장소아 없습니다",
|
||||||
"cant-get-ssh-key-path": "에러! 선택한 SSH키 경로를 가져올 수 없습니다.",
|
"cant-get-ssh-key-path": "에러! 선택한 SSH키 경로를 가져올 수 없습니다.",
|
||||||
"unexpected_error": "예기치 않은 에러"
|
"unexpected_error": "예기치 않은 에러",
|
||||||
|
"clearContext": "프로젝트 전환 시 context 삭제"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"confirm": "프로젝트를 정말 지우시겠습니까?"
|
"confirm": "프로젝트를 정말 지우시겠습니까?"
|
||||||
@@ -894,7 +1079,26 @@
|
|||||||
},
|
},
|
||||||
"editor-tab": {
|
"editor-tab": {
|
||||||
"properties": "속성",
|
"properties": "속성",
|
||||||
|
"envProperties": "환경 변수",
|
||||||
|
"module": "모듈 속성",
|
||||||
"description": "상세 내역",
|
"description": "상세 내역",
|
||||||
"appearance": "모양"
|
"appearance": "모양",
|
||||||
|
"preview": "UI 프리뷰",
|
||||||
|
"defaultValue": "기본값"
|
||||||
|
},
|
||||||
|
"tourGuide": {
|
||||||
|
"takeATour": "둘러보기",
|
||||||
|
"start": "시작",
|
||||||
|
"next": "다음",
|
||||||
|
"welcomeTours": "버전 별 릴리즈 정보"
|
||||||
|
},
|
||||||
|
"diagnostics": {
|
||||||
|
"title": "시스템 정보"
|
||||||
|
},
|
||||||
|
"contextMenu": {
|
||||||
|
"insert": "삽입",
|
||||||
|
"node": "노드",
|
||||||
|
"junction": "접합",
|
||||||
|
"linkNodes": "링크 노드"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
vendored
Executable file → Normal file
4
packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
vendored
Executable file → Normal file
4
packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
vendored
Executable file → Normal file
@@ -137,7 +137,7 @@
|
|||||||
},
|
},
|
||||||
"$sort": {
|
"$sort": {
|
||||||
"args": "array [, function]",
|
"args": "array [, function]",
|
||||||
"desc": "배열 `array`의 모든 값을 순서대로 정렬하여 반환합니다. \n\n 비교함수 `function`을 이용하는 경우, 비교함수는 아래와 같은 두개의 인수를 가져야 합니다. \n\n `function(left,right)` \n\n 비교함수는 left와 right의 두개의 값을 비교하기에, 값을 정렬하는 처리에서 호출됩니다. 만약 요구되는 정렬에서 left값을 right값보다 뒤로 두고싶은 경우에는, 비교함수는 치환을 나타내는 Boolean형의 ``true`를, 그렇지 않은 경우에는 `false`를 반환해야 합니다."
|
"desc": "배열 `array`의 모든 값을 순서대로 정렬하여 반환합니다.\n\n 비교함수 `function`을 이용하는 경우, 비교함수는 아래와 같은 두개의 인수를 가져야 합니다.\n\n `function(left,right)`\n\n 비교함수는 `left`와 `right`의 두개의 값을 비교하기에, 값을 정렬하는 처리에서 호출됩니다. 만약 요구되는 정렬에서 left값을 `right`값보다 뒤로 두고싶은 경우에는, 비교함수는 치환을 나타내는 Boolean형의 `true`를, 그렇지 않은 경우에는 `false`를 반환해야 합니다."
|
||||||
},
|
},
|
||||||
"$reverse": {
|
"$reverse": {
|
||||||
"args": "array",
|
"args": "array",
|
||||||
@@ -205,7 +205,7 @@
|
|||||||
},
|
},
|
||||||
"$formatNumber": {
|
"$formatNumber": {
|
||||||
"args": "number, picture [, options]",
|
"args": "number, picture [, options]",
|
||||||
"desc": "`number`를 문자열로 변환하고 `picture` 문자열에 지정된 표현으로 서식을 변경합니다. \n\n 이 함수의 동작은 XPath F&O 3.1사양에 정의된 XPath/XQuery함수의 fn:format-number의 동작과 같습니다. 인수의 문자열 picture은 fn:format-number 과 같은 구문으로 수치의 서식을 정의합니다. \n\n 임의의 제3 인수 `option`은 소수점기호와 같은 기본 로케일 고유의 서식설정문자를 덮어쓰는데에 사용됩니다. 이 인수를 지정할 경우, XPath F&O 3.1사양의 수치형식에 기술되어있는 name/value 쌍을 포함하는 오브젝트여야 합니다."
|
"desc": "`number`를 문자열로 변환하고 `picture` 문자열에 지정된 표현으로 서식을 변경합니다.\n\n 이 함수의 동작은 XPath F&O 3.1사양에 정의된 XPath/XQuery함수의 `fn:format-number`의 동작과 같습니다. 인수의 문자열 `picture`은 `fn:format-number` 과 같은 구문으로 수치의 서식을 정의합니다.\n\n 임의의 제3 인수 `option`은 소수점기호와 같은 기본 로케일 고유의 서식설정문자를 덮어쓰는데에 사용됩니다. 이 인수를 지정할 경우, XPath F&O 3.1사양의 수치형식에 기술되어있는 name/value 쌍을 포함하는 오브젝트여야 합니다."
|
||||||
},
|
},
|
||||||
"$formatBase": {
|
"$formatBase": {
|
||||||
"args": "number [, radix]",
|
"args": "number [, radix]",
|
||||||
|
|||||||
1195
packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json
vendored
Normal file
1195
packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
23
packages/node_modules/@node-red/editor-client/locales/pt-BR/infotips.json
vendored
Normal file
23
packages/node_modules/@node-red/editor-client/locales/pt-BR/infotips.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"tip0": "Você pode remover os nós ou links selecionados com {{core:delete-selection}}",
|
||||||
|
"tip1": "Procure por nós usando {{core:search}}",
|
||||||
|
"tip2": "{{core:toggle-sidebar}} irá alternar a visualização desta barra lateral",
|
||||||
|
"tip3": "Você pode gerenciar sua paleta de nós com {{core:manage-palette}}",
|
||||||
|
"tip4": "Seus nós de configuração de fluxo são listados no painel da barra lateral. Pode ser acessado a partir do menu ou com{{core:show-config-tab}}",
|
||||||
|
"tip5": "Habilite ou desabilite essas dicas na opção nas configurações",
|
||||||
|
"tip6": "Mova os nós selecionados usando o [left] [up] [down] e [right] chaves. Segure [shift] para empurrá-los ainda mais",
|
||||||
|
"tip7": "Arrastar um nó para um fio o unirá no link",
|
||||||
|
"tip8": "Exporte os nós selecionados ou a guia atual com {{core:show-export-dialog}}",
|
||||||
|
"tip9": "Importe um fluxo arrastando seu JSON para o editor ou com {{core:show-import-dialog}}",
|
||||||
|
"tip10": "[shift] [click] e arraste em uma porta de nó para mover todos os fios conectados ou apenas o selecionado",
|
||||||
|
"tip11": "Mostre a guia Informações com {{core:show-info-tab}} ou a guia Depurar com {{core:show-debug-tab}}",
|
||||||
|
"tip12": "[ctrl] [click] na área de trabalho para abrir a caixa de diálogo de adição rápida",
|
||||||
|
"tip13": "Mantenha pressionado [ctrl] enquanto você [click] em uma porta de nó para habilitar a ligação rápida",
|
||||||
|
"tip14": "Mantenha pressionado [shift] enquanto você [click] em um nó para também selecionar todos os seus nós conectados",
|
||||||
|
"tip15": "Mantenha pressionado [ctrl] enquanto você [click] em um nó para adicioná-lo ou removê-lo da seleção atual",
|
||||||
|
"tip16": "Alternar guias de fluxo com {{core:show-previous-tab}} e {{core:show-next-tab}}",
|
||||||
|
"tip17": "Você pode confirmar suas alterações na bandeja de edição do nó com {{core:confirm-edit-tray}} ou cancele-os com {{core:cancel-edit-tray}}",
|
||||||
|
"tip18": "Pressionando {{core:edit-selected-node}} irá editar o primeiro nó na seleção atual"
|
||||||
|
}
|
||||||
|
}
|
||||||
274
packages/node_modules/@node-red/editor-client/locales/pt-BR/jsonata.json
vendored
Normal file
274
packages/node_modules/@node-red/editor-client/locales/pt-BR/jsonata.json
vendored
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
{
|
||||||
|
"$string": {
|
||||||
|
"args": "arg[, prettify]",
|
||||||
|
"desc": "Converte o tipo do parâmetro `arg` em uma cadeia de caracteres usando as seguintes regras de conversão de tipo:\n\n - Cadeia de caracteres não são alteradas\n - As funções são convertidas para uma cadeia de caracteres vazia\n - os tipos numérico infinito e NaN geram um erro porque não podem ser representados como um número JSON\n - Todos os outros valores são convertidos para uma cadeia de caracteres JSON usando a função `JSON.stringify`. Se `prettify` for verdadeira, então o JSON \"prettified\" é produzido. Isto é, uma linha por campo e as linhas serão indentadas com base na profundidade do campo."
|
||||||
|
},
|
||||||
|
"$length": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Retorna o número de caracteres na cadeia de caracteres `str`. Um erro é gerado se `str` não for uma cadeia de caracteres."
|
||||||
|
},
|
||||||
|
"$substring": {
|
||||||
|
"args": "str, start[, length]",
|
||||||
|
"desc": "Retorna uma cadeia de caracteres contendo os caracteres no primeiro parâmetro `str` começando na posição `start` (deslocamento zero). Se` length` for especificado, então a sub cadeia de caracteres conterá o máximo `length` de caracteres. Se` start` for negativo isso indica o número de caracteres a partir do fim de `str`."
|
||||||
|
},
|
||||||
|
"$substringBefore": {
|
||||||
|
"args": "str, chars",
|
||||||
|
"desc": "Retorna a sub cadeia de caracteres antes da primeira ocorrência da sequência de caracteres `chars` em `string`. Se` string` não contiver `chars`, então retorna `str`."
|
||||||
|
},
|
||||||
|
"$substringAfter": {
|
||||||
|
"args": "str, chars",
|
||||||
|
"desc": "Retorna a sub cadeia de caracteres após a primeira ocorrência da sequência de caracteres `chars` em `string`. Se `string` não contiver `chars`, então retorna `str`."
|
||||||
|
},
|
||||||
|
"$uppercase": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Retorna uma cadeia de caracteres com todos os caracteres de `string` convertidos em maiúsculas."
|
||||||
|
},
|
||||||
|
"$lowercase": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Retorna uma cadeia de caracteres com todos os caracteres de `string` convertidos em minúsculas."
|
||||||
|
},
|
||||||
|
"$trim": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Normaliza e retira todos os caracteres de espaço em branco em `str` aplicando as seguintes etapas:\n\n - Todas as tabulações, retornos de carro e avanços de linha são substituídos por espaços.\n- Sequências contíguas de espaços são reduzidas a um único espaço.\n- Espaços à direita e à esquerda são removidos.\n\n Se `str` não for especificado (isto é, esta função é chamada sem argumentos), então o valor do contexto é usado como o valor de `str`. Um erro é gerado se `str` não for uma cadeia de caracteres."
|
||||||
|
},
|
||||||
|
"$contains": {
|
||||||
|
"args": "str, pattern",
|
||||||
|
"desc": "Retorna `true` se `str` tiver correspondente em `pattern`, caso contrário, retorna `false`. Se `str` não for especificado (isto é, esta função é chamada com um argumento), então o valor do contexto é usado como o valor de `str`. O parâmetro `pattern` pode ser uma cadeia de caracteres ou uma expressão regular."
|
||||||
|
},
|
||||||
|
"$split": {
|
||||||
|
"args": "str[, separator][, limit]",
|
||||||
|
"desc": "Divide o parâmetro `str` em uma matriz de sub cadeia de caracteres. É um erro se `str` não for uma cadeia de caracteres. O parâmetro opcional `separator` especifica os caracteres dentro de `str` sobre os quais devem ser divididos como uma cadeia de caracteres ou expressão regular. Se `separator` não for especificado, a cadeia de caracteres vazia será assumida e `str` será dividido em uma matriz de caracteres únicos. É um erro se `separador` não for uma cadeia de caracteres. O parâmetro opcional `limit` é um número que especifica o número máximo de sub cadeia de caracteres a serem incluídas na matriz resultante. Quaisquer sub cadeia de caracteres adicionais são descartadas. Se `limit` não for especificado, então `str` será totalmente dividido sem limite para o tamanho da matriz resultante . É um erro se `limit` não for um número não negativo."
|
||||||
|
},
|
||||||
|
"$join": {
|
||||||
|
"args": "array[, separator]",
|
||||||
|
"desc": "Une uma matriz de cadeias de caracteres de componentes em uma única cadeia de caracteres concatenada com cada cadeia de caracteres de componente separada pelo parâmetro opcional `separator`. É um erro se a `matriz` de entrada contiver um item que não seja uma cadeia de caracteres. Se `separator` for não especificado, assume-se que é uma cadeia de caracteres vazia, ou seja, nenhum `separator` entre as cadeias de caracteres do componente. É um erro se `separator` não for uma cadeia de caracteres."
|
||||||
|
},
|
||||||
|
"$match": {
|
||||||
|
"args": "str, pattern [, limit]",
|
||||||
|
"desc": "Aplica a cadeia de caracteres `str` à expressão regular `pattern` e retorna uma matriz de objetos, com cada objeto contendo informações sobre cada ocorrência de uma correspondência dentro de `str`."
|
||||||
|
},
|
||||||
|
"$replace": {
|
||||||
|
"args": "str, pattern, replacement [, limit]",
|
||||||
|
"desc": "Encontra ocorrências de `pattern` dentro de `str` e as substitui por `replacement`.\n\nO parâmetro opcional `limit` é o número máximo de substituições."
|
||||||
|
},
|
||||||
|
"$now": {
|
||||||
|
"args": "$[picture [, timezone]]",
|
||||||
|
"desc": "Gera um carimbo de data/hora em formato compatível com ISO 8601 e o retorna como uma cadeia de caracteres. Se os parâmetros opcionais de imagem e fuso horário forem fornecidos, o carimbo de data/hora atual é formatado conforme descrito pela função `$fromMillis()`"
|
||||||
|
},
|
||||||
|
"$base64encode": {
|
||||||
|
"args": "string",
|
||||||
|
"desc": "Converte uma cadeia de caracteres ASCII em uma representação de base 64. Cada caractere na cadeia de caracteres é tratado como um byte de dados binários. Isso requer que todos os caracteres na cadeia de caracteres estejam no intervalo de 0x00 a 0xFF, o que inclui todos os caracteres em cadeias de caracteres codificadas em URI. Caracteres Unicode fora desse intervalo não são suportados."
|
||||||
|
},
|
||||||
|
"$base64decode": {
|
||||||
|
"args": "string",
|
||||||
|
"desc": "Converte bytes codificados de base 64 em uma cadeia de caracteres, usando uma página de código UTF-8 Unicode."
|
||||||
|
},
|
||||||
|
"$number": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Converte o parâmetro `arg` em um número usando as seguintes regras de conversão:\n\n - Os números permanecem inalterados\n - Cadeias de caracteres que contêm uma sequência de caracteres que representam um número JSON válido são convertidos para esse número\n - Todos os outros valores causam a geração de um erro."
|
||||||
|
},
|
||||||
|
"$abs": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Retorna o valor absoluto do parâmetro `number`."
|
||||||
|
},
|
||||||
|
"$floor": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Retorna o valor de `number` arredondado para baixo para o inteiro mais próximo que seja menor ou igual a `number`."
|
||||||
|
},
|
||||||
|
"$ceil": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Retorna o valor de `number` arredondado para o número inteiro mais próximo que é maior ou igual a `number`."
|
||||||
|
},
|
||||||
|
"$round": {
|
||||||
|
"args": "number [, precision]",
|
||||||
|
"desc": "Retorna o valor do parâmetro `number` arredondado para o número de casas decimais especificado pelo parâmetro opcional `precision`."
|
||||||
|
},
|
||||||
|
"$power": {
|
||||||
|
"args": "base, exponent",
|
||||||
|
"desc": "Retorna o valor de `base` elevado à potência de `exponent`."
|
||||||
|
},
|
||||||
|
"$sqrt": {
|
||||||
|
"args": "number",
|
||||||
|
"desc": "Retorna a raiz quadrada do valor do parâmetro `number`."
|
||||||
|
},
|
||||||
|
"$random": {
|
||||||
|
"args": "",
|
||||||
|
"desc": "Retorna um número pseudoaleatório maior ou igual a zero e menor que um."
|
||||||
|
},
|
||||||
|
"$millis": {
|
||||||
|
"args": "",
|
||||||
|
"desc": "Retorna o número de milissegundos desde o Unix Epoch (1º de janeiro de 1970 UTC) como um número. Todas as invocações de `$millis()` dentro de uma avaliação de uma expressão retornarão todas o mesmo valor."
|
||||||
|
},
|
||||||
|
"$sum": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna a soma aritmética de uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número."
|
||||||
|
},
|
||||||
|
"$max": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna o número máximo em uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número."
|
||||||
|
},
|
||||||
|
"$min": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna o número mínimo em uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número."
|
||||||
|
},
|
||||||
|
"$average": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna o valor médio de uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número."
|
||||||
|
},
|
||||||
|
"$boolean": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Converte o argumento em um booliano usando as seguintes regras:\n\n - `Boolean` : inalterado\n - `string`: vazio : `false`\n - `string`: não-vazio : `true`\n - `number`: `0` : `false`\n - `number`: não-zero : `true`\n - `null` : `false`\n - `array`: vazio : `false`\n - `array`: contém um membro que converte de tipo para `true` : `true`\n - `array`: todos os membros convertidos de tipo para `false` : `false`\n - `object`: vazio : `false`\n - `object`: não-vazio : `true`\n - `function` : `false`"
|
||||||
|
},
|
||||||
|
"$not": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Retorna booliano NOT no argumento. `Arg` é convertido de tipo primeiro para um booliano"
|
||||||
|
},
|
||||||
|
"$exists": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Retorna booliano `true` se a expressão `arg` for avaliada como um valor, ou `false` se a expressão não corresponder a nada (por exemplo, um caminho para uma referência de campo inexistente)."
|
||||||
|
},
|
||||||
|
"$count": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna o número de itens na matriz"
|
||||||
|
},
|
||||||
|
"$append": {
|
||||||
|
"args": "array, array",
|
||||||
|
"desc": "Anexa duas matrizes"
|
||||||
|
},
|
||||||
|
"$sort": {
|
||||||
|
"args": "array [, function]",
|
||||||
|
"desc": "Retorna uma matriz contendo todos os valores no parâmetro `array`, mas classificados em ordem.\n\nSe um comparador `function` for fornecido, então deve ser uma função que leva dois parâmetros:\n\n`function(left, right)`\n\nEsta função é invocada pelo algoritmo de classificação para comparar dois valores à esquerda e à direita. Se o valor de esquerda deve ser colocado após o valor de direita na ordem de classificação desejada, a função deve retornar o booliano `true` para indicar uma troca. Caso contrário, deve retornar `false`."
|
||||||
|
},
|
||||||
|
"$reverse": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna uma matriz contendo todos os valores do parâmetro `array`, mas na ordem reversa."
|
||||||
|
},
|
||||||
|
"$shuffle": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna uma matriz contendo todos os valores do parâmetro `array`, mas misturados em ordem aleatória."
|
||||||
|
},
|
||||||
|
"$zip": {
|
||||||
|
"args": "array, ...",
|
||||||
|
"desc": "Retorna uma matriz convolucional (compactada) contendo matrizes agrupadas de valores dos argumentos `array1`… `arrayN` do índice 0, 1, 2 ...."
|
||||||
|
},
|
||||||
|
"$keys": {
|
||||||
|
"args": "object",
|
||||||
|
"desc": "Retorna uma matriz contendo as chaves do objeto. Se o argumento for uma matriz de objetos, então a matriz retornada contém uma lista não duplicada de todas as chaves em todos os objetos."
|
||||||
|
},
|
||||||
|
"$lookup": {
|
||||||
|
"args": "object, key",
|
||||||
|
"desc": "Retorna o valor associado à chave no objeto. Se o primeiro argumento for uma matriz de objetos, todos os objetos na matriz são pesquisados e os valores associados a todas as ocorrências da chave são retornados."
|
||||||
|
},
|
||||||
|
"$spread": {
|
||||||
|
"args": "object",
|
||||||
|
"desc": "Divide um objeto que contém pares de chave/valor em uma matriz de objetos, cada um com um único par de chave/valor do objeto de entrada. Se o parâmetro for uma matriz de objetos, a matriz resultante conterá um objeto para cada par de chave/valor em todo objeto na matriz fornecida."
|
||||||
|
},
|
||||||
|
"$merge": {
|
||||||
|
"args": "array<object>",
|
||||||
|
"desc": "Mescla uma matriz de `objects` em um único `object` contendo todos os pares de chave/valor de cada um dos objetos na matriz de entrada. Se qualquer um dos objetos de entrada contiver a mesma chave, então o `object` retornado conterá o valor do último na matriz. É um erro se a matriz de entrada contiver um item que não seja um objeto."
|
||||||
|
},
|
||||||
|
"$sift": {
|
||||||
|
"args": "object, function",
|
||||||
|
"desc": "Retorna um objeto que contém apenas os pares de chave/valor do parâmetro `object` que satisfazem o predicado `function` passado como o segundo parâmetro.\n\nA `function` que é fornecida como o segundo parâmetro deve ter o seguinte assinatura:\n\n`function(value [, key [, object]])`"
|
||||||
|
},
|
||||||
|
"$each": {
|
||||||
|
"args": "object, function",
|
||||||
|
"desc": "Retorna uma matriz contendo os valores retornados por `function` quando aplicado a cada par chave/valor no `object`."
|
||||||
|
},
|
||||||
|
"$map": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Retorna uma matriz contendo os resultados da aplicação do parâmetro `function` a cada valor no parâmetro `array`.\n\nA `function` que é fornecido como o segundo parâmetro deve ter a seguinte assinatura:\n\n`function(value [, index [, array]])`"
|
||||||
|
},
|
||||||
|
"$filter": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Retorna uma matriz contendo apenas os valores no parâmetro `array` que satisfazem o predicado `function`.\n\nThe `function` que é fornecido como o segundo parâmetro deve ter a seguinte assinatura:\n\n`function(value [, index [, array]])`"
|
||||||
|
},
|
||||||
|
"$reduce": {
|
||||||
|
"args": "array, function [, init]",
|
||||||
|
"desc": "Retorna um valor agregado derivado da aplicação do parâmetro `function` sucessivamente a cada valor em `array` em combinação com o resultado da aplicação anterior da função.\n\nA função deve aceitar dois argumentos e se comportar como um operador inserido entre cada valor dentro de `array`. A assinatura da `function` deve estar no formato: `myfunc($accumulator, $value[, $index[, $array]])`\n\nO parâmetro opcional `init` é usado como o valor inicial na agregação."
|
||||||
|
},
|
||||||
|
"$flowContext": {
|
||||||
|
"args": "string[, string]",
|
||||||
|
"desc": "Recupera uma propriedade de contexto de fluxo.\n\nEsta é uma função definida pelo Node-RED."
|
||||||
|
},
|
||||||
|
"$globalContext": {
|
||||||
|
"args": "string[, string]",
|
||||||
|
"desc": "Recupera uma propriedade de contexto global.\n\nEsta é uma função definida pelo Node-RED."
|
||||||
|
},
|
||||||
|
"$pad": {
|
||||||
|
"args": "string, width [, char]",
|
||||||
|
"desc": "Retorna uma cópia da `string` com preenchimento extra, se necessário, de forma que seu número total de caracteres seja pelo menos o valor absoluto do parâmetro `width`.\n\nSe `width` for um número positivo, a cadeia de caracteres será preenchida à direita; se negativo, é preenchida à esquerda.\n\nO argumento opcional `char` especifica os caracteres de preenchimento a serem usados. Se não for especificado, o padrão é o caractere de espaço."
|
||||||
|
},
|
||||||
|
"$fromMillis": {
|
||||||
|
"args": "number, [, picture [, timezone]]",
|
||||||
|
"desc": "Converta o `number` que representa os milissegundos desde a época do Unix (1 January, 1970 UTC) em uma representação de cadeia de caracteres formatada do carimbo de data/hora conforme especificado pela cadeia de caracteres de imagem.\n\nSe o parâmetro opcional `image` for omitido, o carimbo de data/hora será formatado no formato ISO 8601.\n\nSe a cadeia de caracteresopcional `picture` for fornecida, o carimbo de data/hora é formatado de acordo com a representação especificada nessa cadeia de caracteres. O comportamento desta função é consistente com a versão de dois argumentos da função XPath/XQuery `format-dateTime` conforme definido na especificação XPath F&O 3.1. O parâmetro de cadeia de caracteres de imagem define como o carimbo de data/hora é formatado e tem a mesma sintaxe de `format-dateTime`.\n\nSe a cadeia de caracteres opcional `timezone` for fornecida, o carimbo de data/hora formatado estará nesse fuso horário. A cadeia de caracteres `timezone` deve estar no formato '± HHMM', onde ± é o sinal de mais ou menos e HHMM é o deslocamento em horas e minutos do UTC. Deslocamento positivo para fusos horários a leste do UTC, deslocamento negativo para fusos horários a oeste do UTC."
|
||||||
|
},
|
||||||
|
"$formatNumber": {
|
||||||
|
"args": "number, picture [, options]",
|
||||||
|
"desc": "Converte o tipo de `number` em uma cadeia de caracteres e o formata em uma representação decimal conforme especificado pela cadeia de caracteres `picture`.\n\n O comportamento desta função é consistente com a função XPath/XQuery `fn:format-number` conforme definido na especificação XPath F&O 3.1. O parâmetro de cadeia de caracteres de imagem define como o número é formatado e tem a mesma sintaxe de `fn:format-number`.\n\nO terceiro argumento opcional `options` é usado para substituir os caracteres de formatação específicos da localidade padrão, como o separador decimal. Se fornecido, este argumento deve ser um objeto contendo pares de nome/valor especificados na seção de formato decimal da especificação XPath F&O 3.1."
|
||||||
|
},
|
||||||
|
"$formatBase": {
|
||||||
|
"args": "number [, radix]",
|
||||||
|
"desc": "Converte o `number` em uma cadeia de caracteres e o formata em um inteiro representado na base do número especificada pelo argumento `radix`. Se `radix` não for especificado, o padrão é a base 10. `radix` pode estar entre 2 e 36, caso contrário, um erro será gerado."
|
||||||
|
},
|
||||||
|
"$toMillis": {
|
||||||
|
"args": "timestamp",
|
||||||
|
"desc": "Converta o tipo de uma cadeia de caracteres `timestamp` no formato ISO 8601 para o número de milissegundos desde a época do Unix (1 January, 1970 UTC) como um número. Um erro é gerado se a cadeia de caracteres não estiver no formato correto."
|
||||||
|
},
|
||||||
|
"$env": {
|
||||||
|
"args": "arg",
|
||||||
|
"desc": "Retorna o valor de uma variável de ambiente.\n\nEsta é uma função definida pelo Node-RED."
|
||||||
|
},
|
||||||
|
"$eval": {
|
||||||
|
"args": "expr [, context]",
|
||||||
|
"desc": "Analisa e avalia a cadeia de caracteres `expr` que contém um JSON literal ou uma expressão JSONata usando o contexto atual como o contexto para avaliação."
|
||||||
|
},
|
||||||
|
"$formatInteger": {
|
||||||
|
"args": "number, picture",
|
||||||
|
"desc": "Converte o tipo de `number` em uma cadeia de caracteres e o formata em uma representação inteira conforme especificado pela cadeia de caracteres `picture`. O parâmetro da cadeia de caracteres de imagem define como o número é formatado e tem a mesma sintaxe de `fn:format-integer` do Especificação XPath F&O 3.1."
|
||||||
|
},
|
||||||
|
"$parseInteger": {
|
||||||
|
"args": "string, picture",
|
||||||
|
"desc": "Examina e troca o conteúdo do parâmetro `string` para um inteiro (como um número JSON) usando o formato especificado pela cadeia de caracteres `picture`. O parâmetro da cadeia de caracteres `picture` tem o mesmo formato que `$formatInteger`."
|
||||||
|
},
|
||||||
|
"$error": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Gera um erro com uma mensagem. O (parâmetro) opcional `str` substituirá a mensagem padrão de `$error() function evaluated`"
|
||||||
|
},
|
||||||
|
"$assert": {
|
||||||
|
"args": "arg, str",
|
||||||
|
"desc": "Se `arg` for verdadeiro, a função retorna indefinido. Se `arg` for falso, uma exceção é gerada com `str` como a mensagem da exceção."
|
||||||
|
},
|
||||||
|
"$single": {
|
||||||
|
"args": "array, function",
|
||||||
|
"desc": "Retorna o único valor no parâmetro `array` que satisfaz o predicado `function` (isto é, O (parâmetro) `function` retorna o booliano `true` quando passado o valor). Gera uma exceção se o número de valores correspondentes não for exatamente um .\n\nA função deve ser fornecida na seguinte assinatura: `function(value [, index [, array]])` onde 'value' é cada entrada da matriz, 'index' é a posição desse valor e toda a matriz é passada como o terceiro argumento"
|
||||||
|
},
|
||||||
|
"$encodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Codifica um componente Localizador Uniforme de Recursos (URL) substituindo cada instância de certos caracteres por uma, duas, três ou quatro sequências de escape que representam a codificação UTF-8 do caractere.\n\nExemplo: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
|
},
|
||||||
|
"$encodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Codifica um Localizador Uniforme de Recursos (URL) substituindo cada instância de certos caracteres por uma, duas, três ou quatro sequências de escape que representam a codificação UTF-8 do caractere.\n\nExemplo: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrlComponent": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Decodifica um componente Localizador Uniforme de Recursos (URL) criado anteriormente por encodeUrlComponent.\n\nExemplo: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
|
},
|
||||||
|
"$decodeUrl": {
|
||||||
|
"args": "str",
|
||||||
|
"desc": "Decodifica um Localizador Uniforme de Recursos (URL) criado anteriormente por encodeUrl.\n\nExemplo: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
|
},
|
||||||
|
"$distinct": {
|
||||||
|
"args": "array",
|
||||||
|
"desc": "Retorna uma matriz com valores duplicados removidos da `array`"
|
||||||
|
},
|
||||||
|
"$type": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "Retorna o tipo de `value` como uma cadeia de caracteres. Se `value` for indefinido, retornará `undefined`"
|
||||||
|
},
|
||||||
|
"$moment": {
|
||||||
|
"args": "[str]",
|
||||||
|
"desc": "Obtém um objeto de dados usando a biblioteca 'Moment'."
|
||||||
|
}
|
||||||
|
}
|
||||||
35
packages/node_modules/@node-red/editor-client/locales/ru/editor.json
vendored
Executable file → Normal file
35
packages/node_modules/@node-red/editor-client/locales/ru/editor.json
vendored
Executable file → Normal file
@@ -95,7 +95,6 @@
|
|||||||
"selectionToSubflow": "Выделение в подпоток",
|
"selectionToSubflow": "Выделение в подпоток",
|
||||||
"flows": "Потоки",
|
"flows": "Потоки",
|
||||||
"add": "Добавить",
|
"add": "Добавить",
|
||||||
"rename": "Переименовать",
|
|
||||||
"delete": "Удалить",
|
"delete": "Удалить",
|
||||||
"keyboardShortcuts": "Сочетания клавиш",
|
"keyboardShortcuts": "Сочетания клавиш",
|
||||||
"login": "Войти",
|
"login": "Войти",
|
||||||
@@ -183,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": {
|
||||||
@@ -277,7 +277,9 @@
|
|||||||
"successfulRestart": "Потоки успешно перезапущены",
|
"successfulRestart": "Потоки успешно перезапущены",
|
||||||
"deployFailed": "Развертывание не удалось: __message__",
|
"deployFailed": "Развертывание не удалось: __message__",
|
||||||
"unusedConfigNodes":"У вас есть неиспользуемых узлы конфигурации.",
|
"unusedConfigNodes":"У вас есть неиспользуемых узлы конфигурации.",
|
||||||
"unusedConfigNodesLink":"Нажмите здесь, чтобы их увидеть",
|
"unusedConfigNodesButton":"Поиск неиспользуемых узлов конфигурации",
|
||||||
|
"unknownNodesButton":"Поиск неизвестных узлов",
|
||||||
|
"invalidNodesButton":"Поиск недопустимых узлов",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "нет ответа от сервера"
|
"noResponse": "нет ответа от сервера"
|
||||||
},
|
},
|
||||||
@@ -650,14 +652,7 @@
|
|||||||
"empty": "пусто",
|
"empty": "пусто",
|
||||||
"globalConfig": "Глобальные конфиг узлы",
|
"globalConfig": "Глобальные конфиг узлы",
|
||||||
"triggerAction": "Вызвать действие",
|
"triggerAction": "Вызвать действие",
|
||||||
"find": "Найти в рабочей области",
|
"find": "Найти в рабочей области"
|
||||||
"search": {
|
|
||||||
"configNodes": "Узлы конфигурации",
|
|
||||||
"unusedConfigNodes": "Неиспользуемые узлы конфигурации",
|
|
||||||
"invalidNodes": "Недействительные узлы",
|
|
||||||
"uknownNodes": "Неизвестные узлы",
|
|
||||||
"unusedSubflows": "Неиспользуемые подпотоки"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "Справка",
|
"name": "Справка",
|
||||||
@@ -888,7 +883,14 @@
|
|||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "Ничего не найдено",
|
"empty": "Ничего не найдено",
|
||||||
"addNode": "добавить узел..."
|
"addNode": "добавить узел...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "Узлы конфигурации",
|
||||||
|
"unusedConfigNodes": "Неиспользуемые узлы конфигурации",
|
||||||
|
"invalidNodes": "Недействительные узлы",
|
||||||
|
"uknownNodes": "Неизвестные узлы",
|
||||||
|
"unusedSubflows": "Неиспользуемые подпотоки"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "Функции",
|
"functions": "Функции",
|
||||||
@@ -1126,14 +1128,5 @@
|
|||||||
"appearance": "Внешний вид",
|
"appearance": "Внешний вид",
|
||||||
"preview": "Предпросмотр редактора",
|
"preview": "Предпросмотр редактора",
|
||||||
"defaultValue": "Значение по умолчанию"
|
"defaultValue": "Значение по умолчанию"
|
||||||
},
|
|
||||||
"languages" : {
|
|
||||||
"de": "Немецкий",
|
|
||||||
"en-US": "Английский",
|
|
||||||
"ja": "Японский",
|
|
||||||
"ko": "Корейский",
|
|
||||||
"ru": "Русский",
|
|
||||||
"zh-CN": "Китайский (упрощенный)",
|
|
||||||
"zh-TW": "Китайский (традиционный)"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/locales/ru/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/infotips.json
vendored
Executable file → Normal file
10
packages/node_modules/@node-red/editor-client/locales/ru/jsonata.json
vendored
Executable file → Normal file
10
packages/node_modules/@node-red/editor-client/locales/ru/jsonata.json
vendored
Executable file → Normal file
@@ -237,25 +237,25 @@
|
|||||||
},
|
},
|
||||||
"$assert": {
|
"$assert": {
|
||||||
"args": "arg, str",
|
"args": "arg, str",
|
||||||
"desc": "Если значение `arg` равно true, функция возвращает значение undefined. Если значение `arg` равно false, генерируется исключение с `str` в качестве сообщения об исключении."
|
"desc": "Если значение `arg` равно `true`, функция возвращает значение undefined. Если значение `arg` равно `false`, генерируется исключение с `str` в качестве сообщения об исключении."
|
||||||
},
|
},
|
||||||
"$single": {
|
"$single": {
|
||||||
"args": "array, function",
|
"args": "array, function",
|
||||||
"desc": "Возвращает одно-единственное значение из массива `array`, которое удовлетворяет предикату `function` (то есть когда `function` возвращает логическое `true` при передаче значения). Выдает исключение, если число подходящих значений не одно.\n\nФункция должна соответствовать следующей сигнатуре: `function(value [, index [, array]])` где value - элемент массива, index - позиция этого значения, а весь массив передается в качестве третьего аргумента"
|
"desc": "Возвращает одно-единственное значение из массива `array`, которое удовлетворяет предикату `function` (то есть когда `function` возвращает логическое `true` при передаче значения). Выдает исключение, если число подходящих значений не одно.\n\nФункция должна соответствовать следующей сигнатуре: `function(value [, index [, array]])` где value - элемент массива, index - позиция этого значения, а весь массив передается в качестве третьего аргумента"
|
||||||
},
|
},
|
||||||
"$encodeUrl": {
|
"$encodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Кодирует компонент Uniform Resource Locator (URL), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку UTF-8 символа.\n\nПример: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
"desc": "Кодирует компонент Uniform Resource Locator (URL), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку UTF-8 символа.\n\nПример: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
},
|
},
|
||||||
"$encodeUrlComponent": {
|
"$encodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Кодирует Uniform Resource Locator (URL), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку UTF-8 символа.\n\nПример: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
"desc": "Кодирует Uniform Resource Locator (URL), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку UTF-8 символа.\n\nПример: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrl": {
|
"$decodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Декодирует компонент Uniform Resource Locator (URL), ранее созданный с помощью encodeUrlComponent.\n\nПример: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
"desc": "Декодирует компонент Uniform Resource Locator (URL), ранее созданный с помощью encodeUrlComponent.\n\nПример: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrlComponent": {
|
"$decodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "Декодирует компонент Uniform Resource Locator (URL), ранее созданный с помощью encodeUrl.\n\nПример: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
"desc": "Декодирует компонент Uniform Resource Locator (URL), ранее созданный с помощью encodeUrl.\n\nПример: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"common": {
|
"common": {
|
||||||
"label": {
|
"label": {
|
||||||
"name": "姓名",
|
"name": "名称",
|
||||||
"ok": "确认",
|
"ok": "确认",
|
||||||
"done": "完成",
|
"done": "完成",
|
||||||
"cancel": "取消",
|
"cancel": "取消",
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
"next": "下一个",
|
"next": "下一个",
|
||||||
"clone": "克隆项目",
|
"clone": "克隆项目",
|
||||||
"cont": "继续",
|
"cont": "继续",
|
||||||
"style": "风格",
|
"style": "样式",
|
||||||
"line": "大纲",
|
"line": "大纲",
|
||||||
"fill": "填充",
|
"fill": "填充",
|
||||||
"label": "标签",
|
"label": "标签",
|
||||||
@@ -23,7 +23,11 @@
|
|||||||
"position": "位置",
|
"position": "位置",
|
||||||
"enable": "启用",
|
"enable": "启用",
|
||||||
"disable": "禁用",
|
"disable": "禁用",
|
||||||
"upload": "上传"
|
"upload": "上传",
|
||||||
|
"lock": "锁定",
|
||||||
|
"unlock": "解锁",
|
||||||
|
"locked": "锁定",
|
||||||
|
"unlocked": "解锁"
|
||||||
},
|
},
|
||||||
"type": {
|
"type": {
|
||||||
"string": "字符串",
|
"string": "字符串",
|
||||||
@@ -38,11 +42,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"event": {
|
"event": {
|
||||||
|
"loadPlugins": "加载插件",
|
||||||
"loadPalette": "加载控制板",
|
"loadPalette": "加载控制板",
|
||||||
"loadNodeCatalogs": "加载节点目录",
|
"loadNodeCatalogs": "加载节点目录",
|
||||||
"loadNodes": "加载 __count__ 个节点",
|
"loadNodes": "加载 __count__ 个节点",
|
||||||
"loadFlows": "加载流程",
|
"loadFlows": "加载流程",
|
||||||
"importFlows": "往工作区中加载流程"
|
"importFlows": "往工作区中加载流程",
|
||||||
|
"importError": "<p>加载流程错误</p><p>__message__</p>",
|
||||||
|
"loadingProject": "加载项目"
|
||||||
},
|
},
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"defaultName": "流程 __number__",
|
"defaultName": "流程 __number__",
|
||||||
@@ -51,18 +58,35 @@
|
|||||||
"delete": "你确定要删除 __label__ ?",
|
"delete": "你确定要删除 __label__ ?",
|
||||||
"dropFlowHere": "把流程放到这里",
|
"dropFlowHere": "把流程放到这里",
|
||||||
"addFlow": "添加流程",
|
"addFlow": "添加流程",
|
||||||
|
"addFlowToRight": "在右侧新增流程",
|
||||||
|
"hideFlow": "隐藏流程",
|
||||||
|
"hideOtherFlows": "隐藏其它流程",
|
||||||
|
"showAllFlows": "显示所有流程",
|
||||||
|
"hideAllFlows": "隐藏所有流程",
|
||||||
|
"hiddenFlows": "列出 __count__ 个隐藏流程",
|
||||||
|
"hiddenFlows_plural": "列出 __count__ 个隐藏流程",
|
||||||
|
"showLastHiddenFlow": "显示最后一个隐藏流程",
|
||||||
"listFlows": "流程一览",
|
"listFlows": "流程一览",
|
||||||
|
"listSubflows": "列出子流程",
|
||||||
"status": "状态",
|
"status": "状态",
|
||||||
"enabled": "有效",
|
"enabled": "有效",
|
||||||
"disabled": "无效",
|
"disabled": "无效",
|
||||||
"info": "详细描述",
|
"info": "详细描述",
|
||||||
"selectNodes": "点击节点来选择"
|
"selectNodes": "点击节点来选择",
|
||||||
|
"enableFlow": "启用流程",
|
||||||
|
"disableFlow": "禁用流程",
|
||||||
|
"lockFlow": "锁定流程",
|
||||||
|
"unlockFlow": "解除锁定",
|
||||||
|
"moveToStart": "移动到起始",
|
||||||
|
"moveToEnd": "移动到末尾"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"label": {
|
"label": {
|
||||||
"view": {
|
"view": {
|
||||||
"view": "显示",
|
"view": "显示",
|
||||||
"grid": "网格",
|
"grid": "网格",
|
||||||
|
"storeZoom": "加载时还原缩放尺寸",
|
||||||
|
"storePosition": "加载时还原滚动位置",
|
||||||
"showGrid": "显示网格",
|
"showGrid": "显示网格",
|
||||||
"snapGrid": "对齐网格",
|
"snapGrid": "对齐网格",
|
||||||
"gridSize": "网格尺寸",
|
"gridSize": "网格尺寸",
|
||||||
@@ -80,12 +104,14 @@
|
|||||||
"palette": {
|
"palette": {
|
||||||
"show": "显示控制板"
|
"show": "显示控制板"
|
||||||
},
|
},
|
||||||
|
"edit": "编辑",
|
||||||
"settings": "设置",
|
"settings": "设置",
|
||||||
"userSettings": "用户设置",
|
"userSettings": "用户设置",
|
||||||
"nodes": "节点",
|
"nodes": "节点",
|
||||||
"displayStatus": "显示节点状态",
|
"displayStatus": "显示节点状态",
|
||||||
"displayConfig": "修改节点配置",
|
"displayConfig": "修改节点配置",
|
||||||
"import": "导入",
|
"import": "导入",
|
||||||
|
"importExample": "导入示例流程",
|
||||||
"export": "导出",
|
"export": "导出",
|
||||||
"search": "查找流程",
|
"search": "查找流程",
|
||||||
"searchInput": "查找流程",
|
"searchInput": "查找流程",
|
||||||
@@ -94,53 +120,81 @@
|
|||||||
"selectionToSubflow": "将选择部分更改为子流程",
|
"selectionToSubflow": "将选择部分更改为子流程",
|
||||||
"flows": "流程",
|
"flows": "流程",
|
||||||
"add": "增加",
|
"add": "增加",
|
||||||
"rename": "重命名",
|
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"keyboardShortcuts": "键盘快捷方式",
|
"keyboardShortcuts": "键盘快捷方式",
|
||||||
"login": "登陆",
|
"login": "登录",
|
||||||
"logout": "退出",
|
"logout": "退出",
|
||||||
"editPalette": "节点管理",
|
"editPalette": "节点管理",
|
||||||
"other": "其他",
|
"other": "其他",
|
||||||
"showTips": "显示小提示",
|
"showTips": "显示小提示",
|
||||||
"help": "Node-RED网页",
|
"showWelcomeTours": "显示新版本向导",
|
||||||
|
"help": "Node-RED 文档主页",
|
||||||
"projects": "项目",
|
"projects": "项目",
|
||||||
"projects-new": "新建",
|
"projects-new": "新建",
|
||||||
"projects-open": "打开",
|
"projects-open": "打开",
|
||||||
"projects-settings": "项目设定",
|
"projects-settings": "项目设定",
|
||||||
"showNodeLabelDefault": "显示新添加的节点的标签",
|
"showNodeLabelDefault": "显示新添加的节点的标签",
|
||||||
|
"codeEditor": "代码编辑器",
|
||||||
"groups": "组",
|
"groups": "组",
|
||||||
"groupSelection": "选择组",
|
"groupSelection": "选择组",
|
||||||
"ungroupSelection": "取消选择组",
|
"ungroupSelection": "取消选择组",
|
||||||
"groupMergeSelection": "合并选择",
|
"groupMergeSelection": "合并选择",
|
||||||
"groupRemoveSelection": "从组中移除"
|
"groupRemoveSelection": "从组中移除",
|
||||||
|
"arrange": "布局",
|
||||||
|
"alignLeft": "左对齐",
|
||||||
|
"alignCenter": "居中对齐",
|
||||||
|
"alignRight": "右对齐",
|
||||||
|
"alignTop": "顶部对齐",
|
||||||
|
"alignMiddle": "垂直居中对齐",
|
||||||
|
"alignBottom": "底部对齐",
|
||||||
|
"distributeHorizontally": "横向分布",
|
||||||
|
"distributeVertically": "垂直分布",
|
||||||
|
"moveToBack": "置于底层",
|
||||||
|
"moveToFront": "置于顶层",
|
||||||
|
"moveBackwards": "向后移动",
|
||||||
|
"moveForwards": "向前移动",
|
||||||
|
"showNodeHelp":"显示节点帮助",
|
||||||
|
"enableSelectedNodes":"启用当前选中节点",
|
||||||
|
"disableSelectedNodes":"禁用当前选中节点",
|
||||||
|
"showSelectedNodeLabels":"显示选中的节点标签",
|
||||||
|
"hideSelectedNodeLabels":"隐藏选中的节点标签"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"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__\" __result__ of __count__"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"loggedInAs": "作为 __name__ 登陆",
|
"loggedInAs": "作为 __name__ 登录",
|
||||||
"username": "账号",
|
"username": "账号",
|
||||||
"password": "密码",
|
"password": "密码",
|
||||||
"login": "登陆",
|
"login": "登录",
|
||||||
"loginFailed": "登陆失败",
|
"loginFailed": "登录失败",
|
||||||
"notAuthorized": "未授权",
|
"notAuthorized": "未授权",
|
||||||
"errors": {
|
"errors": {
|
||||||
"settings": "设置信息需要登陆后才能访问",
|
"settings": "设置信息需要登录后才能访问",
|
||||||
"deploy": "改动需要登陆后才能部署",
|
"deploy": "改动需要登录后才能部署",
|
||||||
"notAuthorized": "此操作需要登陆后才能执行"
|
"notAuthorized": "此操作需要登录后才能执行"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification": {
|
"notification": {
|
||||||
|
"state": {
|
||||||
|
"flowsStopped": "流程已停止",
|
||||||
|
"flowsStarted": "流程已启动"
|
||||||
|
},
|
||||||
"warning": "<strong>警告</strong>: __message__",
|
"warning": "<strong>警告</strong>: __message__",
|
||||||
"warnings": {
|
"warnings": {
|
||||||
"undeployedChanges": "节点中存在未部署的更改",
|
"undeployedChanges": "节点中存在未部署的更改",
|
||||||
"nodeActionDisabled": "节点操作已禁用",
|
"nodeActionDisabled": "节点操作已禁用",
|
||||||
"nodeActionDisabledSubflow": "节点动作在子流程中被禁用",
|
"nodeActionDisabledSubflow": "节点动作在子流程中被禁用",
|
||||||
"missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息",
|
"missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息",
|
||||||
|
"missing-modules": "<p>流程因缺少模块而停止。</p>",
|
||||||
"safe-mode": "<p>流程以安全模式停止。</p><p>您可以修改流程并部署更改以重新启动。</p>",
|
"safe-mode": "<p>流程以安全模式停止。</p><p>您可以修改流程并部署更改以重新启动。</p>",
|
||||||
"restartRequired": "Node-RED必须重新启动,以启用升级的模块",
|
"restartRequired": "Node-RED必须重新启动,以启用升级的模块",
|
||||||
"credentials_load_failed": "<p>由于无法解密凭据,因此流程停止。</p><p>流程凭据文件已加密,但是项目的加密密钥丢失或无效。</p>",
|
"credentials_load_failed": "<p>由于无法解密凭据,因此流程停止。</p><p>流程凭据文件已加密,但是项目的加密密钥丢失或无效。</p>",
|
||||||
@@ -182,7 +236,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": {
|
||||||
@@ -200,13 +255,15 @@
|
|||||||
"subflow_plural": "__count__ 子流程",
|
"subflow_plural": "__count__ 子流程",
|
||||||
"replacedNodes": "__count__ 个节点被置换",
|
"replacedNodes": "__count__ 个节点被置换",
|
||||||
"replacedNodes_plural": "__count__ 个节点被置换",
|
"replacedNodes_plural": "__count__ 个节点被置换",
|
||||||
"pasteNodes": "在这里粘贴节点",
|
"pasteNodes": "在下方粘贴节点 ",
|
||||||
"selectFile": "选择要导入的文件",
|
"selectFile": "导入节点文件",
|
||||||
"importNodes": "导入节点",
|
"importNodes": "导入节点",
|
||||||
"exportNodes": "导出节点至剪贴板",
|
"exportNodes": "导出节点至剪贴板",
|
||||||
"download": "下载",
|
"download": "下载",
|
||||||
"importUnrecognised": "导入了无法识别的类型:",
|
"importUnrecognised": "导入了无法识别的类型:",
|
||||||
"importUnrecognised_plural": "导入了无法识别的类型:",
|
"importUnrecognised_plural": "导入了无法识别的类型:",
|
||||||
|
"importDuplicate": "导入了重复节点:",
|
||||||
|
"importDuplicate_plural": "导入了重复节点:",
|
||||||
"nodesExported": "节点导出到了剪贴板",
|
"nodesExported": "节点导出到了剪贴板",
|
||||||
"nodesImported": "导入:",
|
"nodesImported": "导入:",
|
||||||
"nodeCopied": "已复制 __count__ 个节点",
|
"nodeCopied": "已复制 __count__ 个节点",
|
||||||
@@ -220,12 +277,12 @@
|
|||||||
"recoveredNodesNotification": "<p>导入的节点缺少有效的流ID</p><p>已将它们添加到名为 '__flowName__'的新流中。</p>",
|
"recoveredNodesNotification": "<p>导入的节点缺少有效的流ID</p><p>已将它们添加到名为 '__flowName__'的新流中。</p>",
|
||||||
"export": {
|
"export": {
|
||||||
"selected": "已选择的节点",
|
"selected": "已选择的节点",
|
||||||
"current": "现在的节点",
|
"current": "当前节点",
|
||||||
"all": "所有流程",
|
"all": "所有流程",
|
||||||
"compact": "紧凑",
|
"compact": "紧凑",
|
||||||
"formatted": "已格式化",
|
"formatted": "已格式化",
|
||||||
"copy": "导出到剪贴板",
|
"copy": "导出到剪贴板",
|
||||||
"export": "到处到库",
|
"export": "导出到库",
|
||||||
"exportAs": "导出为",
|
"exportAs": "导出为",
|
||||||
"overwrite": "替换",
|
"overwrite": "替换",
|
||||||
"exists": "<p><b>\"__file__\"</b>已存在</p><p>是否要替换它?</p>"
|
"exists": "<p><b>\"__file__\"</b>已存在</p><p>是否要替换它?</p>"
|
||||||
@@ -252,19 +309,25 @@
|
|||||||
},
|
},
|
||||||
"deploy": {
|
"deploy": {
|
||||||
"deploy": "部署",
|
"deploy": "部署",
|
||||||
"full": "全面",
|
"full": "全部",
|
||||||
"fullDesc": "在工作区中部署所有内容",
|
"fullDesc": "在工作区中部署所有内容",
|
||||||
"modifiedFlows": "已修改的流程",
|
"modifiedFlows": "已修改的流程",
|
||||||
"modifiedFlowsDesc": "只部署包含已更改节点的流",
|
"modifiedFlowsDesc": "只部署包含已更改节点的流",
|
||||||
"modifiedNodes": "已更改的节点",
|
"modifiedNodes": "已更改的节点",
|
||||||
"modifiedNodesDesc": "只部署已经更改的节点",
|
"modifiedNodesDesc": "只部署已经更改的节点",
|
||||||
|
"startFlows": "启动",
|
||||||
|
"startFlowsDesc": "启动流程",
|
||||||
|
"stopFlows": "停止",
|
||||||
|
"stopFlowsDesc": "停止流程",
|
||||||
"restartFlows": "重启流程",
|
"restartFlows": "重启流程",
|
||||||
"restartFlowsDesc": "重新启动当前部署的流程",
|
"restartFlowsDesc": "重新启动当前部署的流程",
|
||||||
"successfulDeploy": "部署成功",
|
"successfulDeploy": "部署成功",
|
||||||
"successfulRestart": "成功重启流程",
|
"successfulRestart": "成功重启流程",
|
||||||
"deployFailed": "部署失败: __message__",
|
"deployFailed": "部署失败: __message__",
|
||||||
"unusedConfigNodes": "您有一些未使用的配置节点",
|
"unusedConfigNodes": "您有一些未使用的配置节点",
|
||||||
"unusedConfigNodesLink": "点击此处查看它们",
|
"unusedConfigNodesButton": "搜索未使用的配置节点",
|
||||||
|
"unknownNodesButton": "查找未知节点",
|
||||||
|
"invalidNodesButton": "查找无效节点",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "服务器没有响应"
|
"noResponse": "服务器没有响应"
|
||||||
},
|
},
|
||||||
@@ -334,14 +397,28 @@
|
|||||||
"output": "输出:",
|
"output": "输出:",
|
||||||
"status": "状态节点",
|
"status": "状态节点",
|
||||||
"deleteSubflow": "删除子流程",
|
"deleteSubflow": "删除子流程",
|
||||||
|
"confirmDelete": "您确定要删除此子流程?",
|
||||||
"info": "详细描述",
|
"info": "详细描述",
|
||||||
"category": "类别",
|
"category": "类别",
|
||||||
|
"module": "模块",
|
||||||
|
"license": "许可",
|
||||||
|
"licenseNone": "无",
|
||||||
|
"licenseOther": "其它",
|
||||||
|
"type": "节点类型",
|
||||||
|
"version": "版本",
|
||||||
|
"versionPlaceholder": "x.y.z",
|
||||||
|
"keys": "关键字",
|
||||||
|
"keysPlaceholder": "使用英文逗号分隔关键字",
|
||||||
|
"author": "作者",
|
||||||
|
"authorPlaceholder": "名字 <email@example.com>",
|
||||||
|
"desc": "描述",
|
||||||
"env": {
|
"env": {
|
||||||
"restore": "恢复为默认子流",
|
"restore": "恢复为默认子流",
|
||||||
"remove": "删除环境变量"
|
"remove": "删除环境变量"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"noNodesSelected": "<strong>无法创建子流程</strong>: 未选择节点",
|
"noNodesSelected": "<strong>无法创建子流程</strong>: 未选择节点",
|
||||||
|
"acrossMultipleGroups": "无法跨多个组创建子流",
|
||||||
"multipleInputsToSelection": "<strong>无法创建子流程</strong>: 多个输入到了选择"
|
"multipleInputsToSelection": "<strong>无法创建子流程</strong>: 多个输入到了选择"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -382,6 +459,7 @@
|
|||||||
"icon": "图标",
|
"icon": "图标",
|
||||||
"inputType": "输入类型",
|
"inputType": "输入类型",
|
||||||
"selectType": "选择类型...",
|
"selectType": "选择类型...",
|
||||||
|
"loadCredentials": "加载节点凭证",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"input": "输入",
|
"input": "输入",
|
||||||
"select": "选择",
|
"select": "选择",
|
||||||
@@ -416,7 +494,8 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"scopeChange": "更改范围将使其他流中的节点无法使用",
|
"scopeChange": "更改范围将使其他流中的节点无法使用",
|
||||||
"invalidProperties": "无效的属性:"
|
"invalidProperties": "无效的属性:",
|
||||||
|
"credentialLoadFailed": "无法加载节点凭据"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keyboard": {
|
"keyboard": {
|
||||||
@@ -428,11 +507,14 @@
|
|||||||
"unassigned": "未分配",
|
"unassigned": "未分配",
|
||||||
"global": "全局",
|
"global": "全局",
|
||||||
"workspace": "工作区",
|
"workspace": "工作区",
|
||||||
|
"editor": "编辑对话框",
|
||||||
"selectAll": "选择所有节点",
|
"selectAll": "选择所有节点",
|
||||||
|
"selectNone": "取消所有选择",
|
||||||
"selectAllConnected": "选择所有连接的节点",
|
"selectAllConnected": "选择所有连接的节点",
|
||||||
"addRemoveNode": "从选择中添加/删除节点",
|
"addRemoveNode": "从选择中添加/删除节点",
|
||||||
"editSelected": "编辑选定节点",
|
"editSelected": "编辑选定节点",
|
||||||
"deleteSelected": "删除选定节点或链接",
|
"deleteSelected": "删除选定节点或链接",
|
||||||
|
"deleteReconnect": "删除并重新连接",
|
||||||
"importNode": "导入节点",
|
"importNode": "导入节点",
|
||||||
"exportNode": "导出节点",
|
"exportNode": "导出节点",
|
||||||
"nudgeNode": "移动所选节点(1px)",
|
"nudgeNode": "移动所选节点(1px)",
|
||||||
@@ -442,10 +524,14 @@
|
|||||||
"copyNode": "复制所选节点",
|
"copyNode": "复制所选节点",
|
||||||
"cutNode": "剪切所选节点",
|
"cutNode": "剪切所选节点",
|
||||||
"pasteNode": "粘贴节点",
|
"pasteNode": "粘贴节点",
|
||||||
"undoChange": "撤消上次执行的更改",
|
"copyGroupStyle": "复制组样式",
|
||||||
|
"pasteGroupStyle": "粘贴组样式",
|
||||||
|
"undoChange": "撤消",
|
||||||
|
"redoChange": "重做",
|
||||||
"searchBox": "打开搜索框",
|
"searchBox": "打开搜索框",
|
||||||
"managePalette": "管理面板",
|
"managePalette": "管理面板",
|
||||||
"actionList": "动作列表"
|
"actionList": "动作列表",
|
||||||
|
"splitWireWithLinks": "使用Link节点拆分已选项"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"library": "库",
|
"library": "库",
|
||||||
@@ -461,24 +547,23 @@
|
|||||||
"saveFailed": "保存失败: __message__",
|
"saveFailed": "保存失败: __message__",
|
||||||
"newFolder": "新文件夹",
|
"newFolder": "新文件夹",
|
||||||
"types": {
|
"types": {
|
||||||
"local": "本地的",
|
"local": "本地存储",
|
||||||
"examples": "例子"
|
"examples": "示例"
|
||||||
},
|
}
|
||||||
"exportToLibrary": "将节点导出到库"
|
|
||||||
},
|
},
|
||||||
"palette": {
|
"palette": {
|
||||||
"noInfo": "无可用信息",
|
"noInfo": "无可用信息",
|
||||||
"filter": "过滤节点",
|
"filter": "过滤已安装模块",
|
||||||
"search": "搜索模块",
|
"search": "搜索模块",
|
||||||
"addCategory": "添加新的...",
|
"addCategory": "添加新的...",
|
||||||
"label": {
|
"label": {
|
||||||
"subflows": "子流程",
|
"subflows": "子流程",
|
||||||
"network": "网络",
|
"network": "网络",
|
||||||
"common": "共通",
|
"common": "通用",
|
||||||
"input": "输入",
|
"input": "输入",
|
||||||
"output": "输出",
|
"output": "输出",
|
||||||
"function": "功能",
|
"function": "功能",
|
||||||
"sequence": "序列",
|
"sequence": "序列化",
|
||||||
"parser": "解析",
|
"parser": "解析",
|
||||||
"social": "社交",
|
"social": "社交",
|
||||||
"storage": "存储",
|
"storage": "存储",
|
||||||
@@ -498,11 +583,13 @@
|
|||||||
"nodeEnabled_plural": "启用多个节点:",
|
"nodeEnabled_plural": "启用多个节点:",
|
||||||
"nodeDisabled": "禁用节点:",
|
"nodeDisabled": "禁用节点:",
|
||||||
"nodeDisabled_plural": "禁用多个节点:",
|
"nodeDisabled_plural": "禁用多个节点:",
|
||||||
"nodeUpgraded": "节点模块__module__升级到__version__版本"
|
"nodeUpgraded": "节点模块__module__升级到__version__版本",
|
||||||
|
"unknownNodeRegistered": "加载节点错误: <ul><li>__type__<br>__error__</li></ul>"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"title": "面板管理",
|
"title": "面板管理",
|
||||||
"palette": "控制板",
|
"palette": "控制板",
|
||||||
|
"allCatalogs": "所有目录",
|
||||||
"times": {
|
"times": {
|
||||||
"seconds": "秒前",
|
"seconds": "秒前",
|
||||||
"minutes": "分前",
|
"minutes": "分前",
|
||||||
@@ -542,10 +629,12 @@
|
|||||||
"tab-nodes": "节点",
|
"tab-nodes": "节点",
|
||||||
"tab-install": "安装",
|
"tab-install": "安装",
|
||||||
"sort": "排序:",
|
"sort": "排序:",
|
||||||
|
"sortRelevance": "关联",
|
||||||
"sortAZ": "a-z顺序",
|
"sortAZ": "a-z顺序",
|
||||||
"sortRecent": "日期顺序",
|
"sortRecent": "日期顺序",
|
||||||
"more": "增加 __count__ 个",
|
"more": "增加 __count__ 个",
|
||||||
"upload": "上传模块tgz文件",
|
"upload": "上传模块tgz文件",
|
||||||
|
"refresh": "更新模块列表",
|
||||||
"errors": {
|
"errors": {
|
||||||
"catalogLoadFailed": "无法加载节点目录。<br>查看浏览器控制台了解更多信息",
|
"catalogLoadFailed": "无法加载节点目录。<br>查看浏览器控制台了解更多信息",
|
||||||
"installFailed": "无法安装: __module__<br>__message__<br>查看日志了解更多信息",
|
"installFailed": "无法安装: __module__<br>__message__<br>查看日志了解更多信息",
|
||||||
@@ -615,13 +704,10 @@
|
|||||||
"globalConfig": "全局配置节点",
|
"globalConfig": "全局配置节点",
|
||||||
"triggerAction": "触发动作",
|
"triggerAction": "触发动作",
|
||||||
"find": "在工作区中查找",
|
"find": "在工作区中查找",
|
||||||
"search": {
|
"copyItemUrl": "复制地址",
|
||||||
"configNodes": "配置节点",
|
"copyURL2Clipboard": "复制地址到剪贴板",
|
||||||
"unusedConfigNodes": "未使用的配置节点",
|
"showFlow": "显示流程",
|
||||||
"invalidNodes": "无效的节点",
|
"hideFlow": "隐藏流程"
|
||||||
"uknownNodes": "未知的节点",
|
|
||||||
"unusedSubflows": "未使用的子流程"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "帮助",
|
"name": "帮助",
|
||||||
@@ -631,7 +717,8 @@
|
|||||||
"showHelp": "显示帮助",
|
"showHelp": "显示帮助",
|
||||||
"showInOutline": "在大纲中显示",
|
"showInOutline": "在大纲中显示",
|
||||||
"showTopics": "显示主题",
|
"showTopics": "显示主题",
|
||||||
"noHelp": "未选择帮助主题"
|
"noHelp": "未选择帮助主题",
|
||||||
|
"changeLog": "更新日志"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"name": "配置节点",
|
"name": "配置节点",
|
||||||
@@ -648,21 +735,21 @@
|
|||||||
},
|
},
|
||||||
"context": {
|
"context": {
|
||||||
"name": "上下文数据",
|
"name": "上下文数据",
|
||||||
"label": "上下午",
|
"label": "上下文",
|
||||||
"none": "未选择",
|
"none": "未选择",
|
||||||
"refresh": "刷新以加载",
|
"refresh": "刷新以加载",
|
||||||
"empty": "空",
|
"empty": "空",
|
||||||
"node": "节点",
|
"node": "节点",
|
||||||
"flow": "流程",
|
"flow": "流程",
|
||||||
"global": "全局",
|
"global": "全局",
|
||||||
"deleteConfirm": "你确定要删除这个项目吗?",
|
"deleteConfirm": "确定要删除这个项目吗?",
|
||||||
"autoRefresh": "刷新选择更改",
|
"autoRefresh": "刷新选择更改",
|
||||||
"refrsh": "刷新",
|
"refrsh": "刷新",
|
||||||
"delete": "删除"
|
"delete": "删除"
|
||||||
},
|
},
|
||||||
"palette": {
|
"palette": {
|
||||||
"name": "节点管理",
|
"name": "模块管理",
|
||||||
"label": "节点"
|
"label": "模块"
|
||||||
},
|
},
|
||||||
"project": {
|
"project": {
|
||||||
"label": "项目",
|
"label": "项目",
|
||||||
@@ -698,7 +785,7 @@
|
|||||||
"changeTheEncryptionKey": "更改加密密钥",
|
"changeTheEncryptionKey": "更改加密密钥",
|
||||||
"currentKey": "当前密钥",
|
"currentKey": "当前密钥",
|
||||||
"newKey": "新密钥",
|
"newKey": "新密钥",
|
||||||
"credentialsAlert": "这将删除所有现有证书",
|
"credentialsAlert": "将删除所有现有证书",
|
||||||
"versionControl": "版本控制",
|
"versionControl": "版本控制",
|
||||||
"branches": "分支",
|
"branches": "分支",
|
||||||
"noBranches": "没有分支",
|
"noBranches": "没有分支",
|
||||||
@@ -711,7 +798,7 @@
|
|||||||
"remoteName": "远程仓库名",
|
"remoteName": "远程仓库名",
|
||||||
"nameRule": "只能包含A-Z 0-9 _ -",
|
"nameRule": "只能包含A-Z 0-9 _ -",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"urlRule": "https://, ssh:// or file://",
|
"urlRule": "https://, ssh:// 或 file://",
|
||||||
"urlRule2": "网址中不能包含用户名/密码",
|
"urlRule2": "网址中不能包含用户名/密码",
|
||||||
"noRemotes": "没有远程仓库",
|
"noRemotes": "没有远程仓库",
|
||||||
"deleteRemoteConfrim": "您确定要删除远程仓库'__name__'吗?",
|
"deleteRemoteConfrim": "您确定要删除远程仓库'__name__'吗?",
|
||||||
@@ -825,7 +912,7 @@
|
|||||||
},
|
},
|
||||||
"typedInput": {
|
"typedInput": {
|
||||||
"type": {
|
"type": {
|
||||||
"str": "文字列",
|
"str": "文本",
|
||||||
"num": "数字",
|
"num": "数字",
|
||||||
"re": "正则表达式",
|
"re": "正则表达式",
|
||||||
"bool": "布尔值",
|
"bool": "布尔值",
|
||||||
@@ -838,21 +925,34 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editableList": {
|
"editableList": {
|
||||||
"add": "添加"
|
"add": "添加",
|
||||||
|
"addTitle": "添加项"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "找不到匹配",
|
"history": "搜索历史",
|
||||||
"addNode": "添加一个节点..."
|
"clear": "清除所有",
|
||||||
|
"empty": "找不到匹配项",
|
||||||
|
"addNode": "添加节点...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "配置节点",
|
||||||
|
"unusedConfigNodes": "未使用的配置节点",
|
||||||
|
"invalidNodes": "无效的节点",
|
||||||
|
"uknownNodes": "未知的节点",
|
||||||
|
"unusedSubflows": "未使用的子流程",
|
||||||
|
"hiddenFlows": "隐藏的流程",
|
||||||
|
"modifiedNodes": "已修改的节点或流程",
|
||||||
|
"thisFlow": "当前流程"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "功能",
|
"functions": "函数",
|
||||||
"functionReference": "功能reference",
|
"functionReference": "函数引用",
|
||||||
"insert": "插入",
|
"insert": "插入",
|
||||||
"title": "JSONata 表达式编辑器",
|
"title": "JSONata 表达式编辑器",
|
||||||
"test": "测试",
|
"test": "测试",
|
||||||
"data": "示例消息",
|
"data": "示例消息",
|
||||||
"result": "结果",
|
"result": "结果",
|
||||||
"format": "格式表达方法",
|
"format": "格式表达式",
|
||||||
"compatMode": "兼容模式启用",
|
"compatMode": "兼容模式启用",
|
||||||
"compatModeDesc": "<h3>JSONata的兼容模式</h3><p> 目前的表达式仍然参考<code>msg</code>,所以将以兼容性模式进行评估。请更新表达式,使其不使用<code>msg</code>,因为此模式将在将来删除。</p><p> 当JSONata支持首次添加到Node-RED时,它需要表达式引用<code>msg</code>对象。例如<code>msg.payload</code>将用于访问有效负载。</p><p> 这样便不再需要表达式直接针对消息进行评估。要访问有效负载,表达式应该只是<code>payload</code>.</p>",
|
"compatModeDesc": "<h3>JSONata的兼容模式</h3><p> 目前的表达式仍然参考<code>msg</code>,所以将以兼容性模式进行评估。请更新表达式,使其不使用<code>msg</code>,因为此模式将在将来删除。</p><p> 当JSONata支持首次添加到Node-RED时,它需要表达式引用<code>msg</code>对象。例如<code>msg.payload</code>将用于访问有效负载。</p><p> 这样便不再需要表达式直接针对消息进行评估。要访问有效负载,表达式应该只是<code>payload</code>.</p>",
|
||||||
"noMatch": "无匹配结果",
|
"noMatch": "无匹配结果",
|
||||||
@@ -860,9 +960,15 @@
|
|||||||
"invalid-expr": "无效的JSONata表达式:\n __message__",
|
"invalid-expr": "无效的JSONata表达式:\n __message__",
|
||||||
"invalid-msg": "无效的示例JSON消息:\n __message__",
|
"invalid-msg": "无效的示例JSON消息:\n __message__",
|
||||||
"context-unsupported": "无法测试上下文函数\n $flowContext 或 $globalContext",
|
"context-unsupported": "无法测试上下文函数\n $flowContext 或 $globalContext",
|
||||||
"eval": "评估表达式错误:\n __message__"
|
"env-unsupported": "无法测试 $env 函数",
|
||||||
|
"moment-unsupported": "无法测试 $moment 函数",
|
||||||
|
"clone-unsupported": "无法测试 $clone 函数",
|
||||||
|
"eval": "计算表达式错误:\n __message__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"monaco": {
|
||||||
|
"setTheme": "设置主题"
|
||||||
|
},
|
||||||
"jsEditor": {
|
"jsEditor": {
|
||||||
"title": "JavaScript 编辑器"
|
"title": "JavaScript 编辑器"
|
||||||
},
|
},
|
||||||
@@ -873,13 +979,15 @@
|
|||||||
"title": "JSON 编辑器",
|
"title": "JSON 编辑器",
|
||||||
"format": "格式化JSON",
|
"format": "格式化JSON",
|
||||||
"rawMode": "编辑 JSON",
|
"rawMode": "编辑 JSON",
|
||||||
"uiMode": "Visual编辑器",
|
"uiMode": "可视化编辑器",
|
||||||
|
"rawMode-readonly": "原始JSON",
|
||||||
|
"uiMode-readonly": "可视化",
|
||||||
"insertAbove": "在上方插入",
|
"insertAbove": "在上方插入",
|
||||||
"insertBelow": "在下方插入",
|
"insertBelow": "在下方插入",
|
||||||
"addItem": "添加项目",
|
"addItem": "添加项目",
|
||||||
"copyPath": "复制路径到项目",
|
"copyPath": "复制路径到项目",
|
||||||
"expandItems": "展开项目",
|
"expandItems": "展开项目",
|
||||||
"collapseItems": "收合项目",
|
"collapseItems": "折叠项目",
|
||||||
"duplicate": "重复",
|
"duplicate": "重复",
|
||||||
"error": {
|
"error": {
|
||||||
"invalidJSON": "无效的JSON: "
|
"invalidJSON": "无效的JSON: "
|
||||||
@@ -900,13 +1008,16 @@
|
|||||||
"quote": "引用",
|
"quote": "引用",
|
||||||
"link": "链接",
|
"link": "链接",
|
||||||
"horizontal-rule": "水平线",
|
"horizontal-rule": "水平线",
|
||||||
"toggle-preview": "切换预览"
|
"toggle-preview": "切换预览",
|
||||||
|
"mermaid": {
|
||||||
|
"summary": "美人鱼图"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"bufferEditor": {
|
"bufferEditor": {
|
||||||
"title": "缓冲区编辑器",
|
"title": "Buffer 编辑器",
|
||||||
"modeString": "作为UTF-8字符串处理",
|
"modeString": "作为UTF-8字符串处理",
|
||||||
"modeArray": "作为JSON数组处理",
|
"modeArray": "作为JSON数组处理",
|
||||||
"modeDesc": "<h3>缓冲区编辑器</h3><p>缓冲区类型被存储为字节值的JSON数组。编辑器将尝试将输入的数值解析为JSON数组。如果它不是有效的JSON,它将被视为UTF-8字符串,并被转换为单个字符代码点的数组。</p><p>例如,<code>Hello World</code>的值会被转换为JSON数组:<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>"
|
"modeDesc": "<h3>Buffer 编辑器</h3><p>Buffer类型被存储为字节值的JSON数组。编辑器将尝试将输入的数值解析为JSON数组。如果它不是有效的JSON,它将被视为UTF-8字符串,并被转换为单个字符代码点的数组。</p><p>例如,<code>Hello World</code>的值会被转换为JSON数组:<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>"
|
||||||
},
|
},
|
||||||
"projects": {
|
"projects": {
|
||||||
"config-git": "配置Git客户端",
|
"config-git": "配置Git客户端",
|
||||||
@@ -918,7 +1029,7 @@
|
|||||||
"create": "建立专案",
|
"create": "建立专案",
|
||||||
"clone": "克隆仓库",
|
"clone": "克隆仓库",
|
||||||
"openExistingProject": "打开现有项目",
|
"openExistingProject": "打开现有项目",
|
||||||
"not-right-now": "不是现在"
|
"not-right-now": "稍后"
|
||||||
},
|
},
|
||||||
"git-config": {
|
"git-config": {
|
||||||
"setup": "设置您的版本控制客户端",
|
"setup": "设置您的版本控制客户端",
|
||||||
@@ -1020,7 +1131,7 @@
|
|||||||
"desc0": "用来保护您的凭证的短语",
|
"desc0": "用来保护您的凭证的短语",
|
||||||
"desc1": "凭证文件不会被加密,其内容很容易阅读",
|
"desc1": "凭证文件不会被加密,其内容很容易阅读",
|
||||||
"git-url": "Git存储库URL",
|
"git-url": "Git存储库URL",
|
||||||
"protocols": "https://, ssh:// or file://",
|
"protocols": "https://, ssh:// 或 file://",
|
||||||
"auth-failed": "验证失败",
|
"auth-failed": "验证失败",
|
||||||
"username": "用户名",
|
"username": "用户名",
|
||||||
"password": "密码",
|
"password": "密码",
|
||||||
@@ -1035,7 +1146,8 @@
|
|||||||
"not-git": "不是git仓库",
|
"not-git": "不是git仓库",
|
||||||
"no-resource": "找不到存储库",
|
"no-resource": "找不到存储库",
|
||||||
"cant-get-ssh-key-path": "错误!无法获取所选的SSH密钥路径。",
|
"cant-get-ssh-key-path": "错误!无法获取所选的SSH密钥路径。",
|
||||||
"unexpected_error": "意外的错误"
|
"unexpected_error": "意外的错误",
|
||||||
|
"clearContext": "更改项目时清除上下文"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"confirm": "您确定要删除此项目吗?"
|
"confirm": "您确定要删除此项目吗?"
|
||||||
@@ -1076,17 +1188,46 @@
|
|||||||
"editor-tab": {
|
"editor-tab": {
|
||||||
"properties": "属性",
|
"properties": "属性",
|
||||||
"envProperties": "环境变量",
|
"envProperties": "环境变量",
|
||||||
|
"module": "模块属性",
|
||||||
"description": "描述",
|
"description": "描述",
|
||||||
"appearance": "外观",
|
"appearance": "外观",
|
||||||
"preview": "UI预览",
|
"preview": "UI预览",
|
||||||
"defaultValue": "默认值"
|
"defaultValue": "默认值"
|
||||||
},
|
},
|
||||||
"languages": {
|
"tourGuide": {
|
||||||
"de": "德语",
|
"takeATour": "查看更新内容",
|
||||||
"en-US": "英文",
|
"start": "开始",
|
||||||
"ja": "日语",
|
"next": "下一个",
|
||||||
"ko": "韩文",
|
"welcomeTours": "欢迎使用 Node-RED"
|
||||||
"zh-CN": "简体中文",
|
},
|
||||||
"zh-TW": "繁体中文"
|
"diagnostics": {
|
||||||
|
"title": "系统信息"
|
||||||
|
},
|
||||||
|
"validator": {
|
||||||
|
"errors": {
|
||||||
|
"invalid-json": "无效的 JSON 数据: __error__",
|
||||||
|
"invalid-expr": "无效的 JSONata 表达式: __error__",
|
||||||
|
"invalid-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__"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contextMenu": {
|
||||||
|
"showActionList":"显示动作列表",
|
||||||
|
"insert": "插入",
|
||||||
|
"node": "节点",
|
||||||
|
"junction": "连接点",
|
||||||
|
"linkNodes": "链接节点"
|
||||||
|
},
|
||||||
|
"env-var": {
|
||||||
|
"environment": "环境配置",
|
||||||
|
"header": "全局环境变量",
|
||||||
|
"revert": "重置"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,7 @@
|
|||||||
},
|
},
|
||||||
"$sort": {
|
"$sort": {
|
||||||
"args": "array [, function]",
|
"args": "array [, function]",
|
||||||
"desc": "输出排序后的数组 `array` 。\n\n如果使用了比较函数 `function` ,则下述两个参数需要被指定。\n\n `function(left, right)` \n\n该比较函数是为了比较left和right两个值而被排序算法调用的。如果用户希望left的值被置于right的值之后,那么该函数必须输出布尔值 `true` 来表示位置交换。而在不需要位置交换时函数必须输出 `false` 。"
|
"desc": "输出排序后的数组 `array` 。\n\n如果使用了比较函数 `function` ,则下述两个参数需要被指定。\n\n `function(left, right)`\n\n该比较函数是为了比较`left`和`right`两个值而被排序算法调用的。如果用户希望`left`的值被置于`right`的值之后,那么该函数必须输出布尔值 `true` 来表示位置交换。而在不需要位置交换时函数必须输出 `false` 。"
|
||||||
},
|
},
|
||||||
"$reverse": {
|
"$reverse": {
|
||||||
"args": "array",
|
"args": "array",
|
||||||
@@ -237,25 +237,25 @@
|
|||||||
},
|
},
|
||||||
"$assert": {
|
"$assert": {
|
||||||
"args": "arg, str",
|
"args": "arg, str",
|
||||||
"desc": "如果 `arg` 为真,则该函数返回。 如果arg为假,则抛出带有str的异常作为异常消息。"
|
"desc": "如果 `arg` 为真,则该函数返回。 如果`arg`为假,则抛出带有`str`的异常作为异常消息。"
|
||||||
},
|
},
|
||||||
"$single": {
|
"$single": {
|
||||||
"args": "array, function",
|
"args": "array, function",
|
||||||
"desc": "返回满足参数function谓语的array参数中的唯一值 (比如:传递值时,函数返回布尔值“true”)。如果匹配值的数量不唯一时,则抛出异常。\n\n应在以下签名中提供函数: `function(value [,index [,array []]])` 其中value是数组的每个输入,index是该值的位置,整个数组作为第三个参数传递。"
|
"desc": "返回满足参数function谓语的array参数中的唯一值 (比如:传递值时,函数返回布尔值“true”)。如果匹配值的数量不唯一时,则抛出异常。\n\n应在以下签名中提供函数: `function(value [,index [,array []]])` 其中value是数组的每个输入,index是该值的位置,整个数组作为第三个参数传递。"
|
||||||
},
|
},
|
||||||
"$encodeUrl": {
|
"$encodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)组件进行编码。\n\n示例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)组件进行编码。\n\n示例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
},
|
},
|
||||||
"$encodeUrlComponent": {
|
"$encodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)进行编码。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)进行编码。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrl": {
|
"$decodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "解码以前由encodeUrlComponent创建的统一资源定位器(URL)组件。\n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
"desc": "解码以前由encodeUrlComponent创建的统一资源定位器(URL)组件。\n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrlComponent": {
|
"$decodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "解码先前由encodeUrl创建的统一资源定位符(URL)。\n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
"desc": "解码先前由encodeUrl创建的统一资源定位符(URL)。\n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
},
|
},
|
||||||
@@ -270,5 +270,9 @@
|
|||||||
"$moment": {
|
"$moment": {
|
||||||
"args": "[str]",
|
"args": "[str]",
|
||||||
"desc": "使用Moment库获取日期对象。"
|
"desc": "使用Moment库获取日期对象。"
|
||||||
|
},
|
||||||
|
"$clone": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "安全克隆对象."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,11 @@
|
|||||||
"position": "位置",
|
"position": "位置",
|
||||||
"enable": "啟用",
|
"enable": "啟用",
|
||||||
"disable": "禁用",
|
"disable": "禁用",
|
||||||
"upload": "上傳"
|
"upload": "上傳",
|
||||||
|
"lock": "鎖定",
|
||||||
|
"unlock": "解鎖",
|
||||||
|
"locked": "鎖定",
|
||||||
|
"unlocked": "解鎖"
|
||||||
},
|
},
|
||||||
"type": {
|
"type": {
|
||||||
"string": "字符串",
|
"string": "字符串",
|
||||||
@@ -38,11 +42,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"event": {
|
"event": {
|
||||||
|
"loadPlugins": "加載插件",
|
||||||
"loadPalette": "加載控制板",
|
"loadPalette": "加載控制板",
|
||||||
"loadNodeCatalogs": "加載節點目錄",
|
"loadNodeCatalogs": "加載節點目錄",
|
||||||
"loadNodes": "加載 __count__ 個節點",
|
"loadNodes": "加載 __count__ 個節點",
|
||||||
"loadFlows": "加載流程",
|
"loadFlows": "加載流程",
|
||||||
"importFlows": "往工作區中加載流程"
|
"importFlows": "往工作區中加載流程",
|
||||||
|
"importError": "<p>加載流程錯誤</p><p>__message__</p>",
|
||||||
|
"loadingProject": "加載項目"
|
||||||
},
|
},
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"defaultName": "流程__number__",
|
"defaultName": "流程__number__",
|
||||||
@@ -51,18 +58,35 @@
|
|||||||
"delete": "確定想要刪除 '__label__'?",
|
"delete": "確定想要刪除 '__label__'?",
|
||||||
"dropFlowHere": "把流程放到這裡",
|
"dropFlowHere": "把流程放到這裡",
|
||||||
"addFlow": "新增流程",
|
"addFlow": "新增流程",
|
||||||
"listFlows": "流程列表",
|
"addFlowToRight": "在右側新增流程",
|
||||||
|
"hideFlow": "隱藏流程",
|
||||||
|
"hideOtherFlows": "隱藏其它流程",
|
||||||
|
"showAllFlows": "顯示所有流程",
|
||||||
|
"hideAllFlows": "隱藏所有流程",
|
||||||
|
"hiddenFlows": "列出 __count__ 個隱藏流程",
|
||||||
|
"hiddenFlows_plural": "列出 __count__ 個隱藏流程",
|
||||||
|
"showLastHiddenFlow": "顯示最後一個隱藏流程",
|
||||||
|
" ": "流程列表",
|
||||||
|
"listSubflows": "列出子流程",
|
||||||
"status": "狀態",
|
"status": "狀態",
|
||||||
"enabled": "有效",
|
"enabled": "有效",
|
||||||
"disabled": "無效",
|
"disabled": "無效",
|
||||||
"info": "詳細描述",
|
"info": "詳細描述",
|
||||||
"selectNodes": "點擊節點用於選擇"
|
"selectNodes": "點擊節點用於選擇",
|
||||||
|
"enableFlow": "啟用流程",
|
||||||
|
"disableFlow": "禁用流程",
|
||||||
|
"lockFlow": "鎖定流程",
|
||||||
|
"unlockFlow": "解除鎖定",
|
||||||
|
"moveToStart": "移動到起始",
|
||||||
|
"moveToEnd": "移動到末尾"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"label": {
|
"label": {
|
||||||
"view": {
|
"view": {
|
||||||
"view": "顯示",
|
"view": "顯示",
|
||||||
"grid": "格線",
|
"grid": "格線",
|
||||||
|
"storeZoom": "加載時還原縮放尺寸",
|
||||||
|
"storePosition": "加載時還原滾動位置",
|
||||||
"showGrid": "顯示格線",
|
"showGrid": "顯示格線",
|
||||||
"snapGrid": "對齊格線",
|
"snapGrid": "對齊格線",
|
||||||
"gridSize": "格線尺寸",
|
"gridSize": "格線尺寸",
|
||||||
@@ -80,12 +104,14 @@
|
|||||||
"palette": {
|
"palette": {
|
||||||
"show": "顯示控制板"
|
"show": "顯示控制板"
|
||||||
},
|
},
|
||||||
|
"edit": "編輯",
|
||||||
"settings": "設置",
|
"settings": "設置",
|
||||||
"userSettings": "使用者設置",
|
"userSettings": "使用者設置",
|
||||||
"nodes": "節點",
|
"nodes": "節點",
|
||||||
"displayStatus": "顯示節點狀態",
|
"displayStatus": "顯示節點狀態",
|
||||||
"displayConfig": "修改節點配置",
|
"displayConfig": "修改節點配置",
|
||||||
"import": "匯入",
|
"import": "匯入",
|
||||||
|
"importExample": "導入示例流程",
|
||||||
"export": "匯出",
|
"export": "匯出",
|
||||||
"search": "搜尋流程",
|
"search": "搜尋流程",
|
||||||
"searchInput": "搜尋流程",
|
"searchInput": "搜尋流程",
|
||||||
@@ -94,7 +120,6 @@
|
|||||||
"selectionToSubflow": "將選擇部分更改為子流程",
|
"selectionToSubflow": "將選擇部分更改為子流程",
|
||||||
"flows": "流程",
|
"flows": "流程",
|
||||||
"add": "增加",
|
"add": "增加",
|
||||||
"rename": "重新命名",
|
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
"keyboardShortcuts": "鍵盤快速鍵",
|
"keyboardShortcuts": "鍵盤快速鍵",
|
||||||
"login": "登入",
|
"login": "登入",
|
||||||
@@ -102,24 +127,48 @@
|
|||||||
"editPalette": "節點管理",
|
"editPalette": "節點管理",
|
||||||
"other": "其他",
|
"other": "其他",
|
||||||
"showTips": "顯示小提示",
|
"showTips": "顯示小提示",
|
||||||
"help": "Node-RED website",
|
"showWelcomeTours": "顯示新版本向導",
|
||||||
|
"help": "Node-RED 文檔主頁",
|
||||||
"projects": "專案",
|
"projects": "專案",
|
||||||
"projects-new": "新專案",
|
"projects-new": "新專案",
|
||||||
"projects-open": "開啟專案",
|
"projects-open": "開啟專案",
|
||||||
"projects-settings": "專案設定",
|
"projects-settings": "專案設定",
|
||||||
"showNodeLabelDefault": "顯示新添加節點的標籤",
|
"showNodeLabelDefault": "顯示新添加節點的標籤",
|
||||||
|
"codeEditor": "代碼編輯器",
|
||||||
"groups": "組",
|
"groups": "組",
|
||||||
"groupSelection": "選擇組",
|
"groupSelection": "選擇組",
|
||||||
"ungroupSelection": "取消選擇組",
|
"ungroupSelection": "取消選擇組",
|
||||||
"groupMergeSelection": "合并選擇",
|
"groupMergeSelection": "合并選擇",
|
||||||
"groupRemoveSelection": "從組中移除"
|
"groupRemoveSelection": "從組中移除",
|
||||||
|
"arrange": "布局",
|
||||||
|
"alignLeft": "左對齊",
|
||||||
|
"alignCenter": "居中對齊",
|
||||||
|
"alignRight": "右對齊",
|
||||||
|
"alignTop": "頂部對齊",
|
||||||
|
"alignMiddle": "垂直居中對齊",
|
||||||
|
"alignBottom": "底部對齊",
|
||||||
|
"distributeHorizontally": "横向分布",
|
||||||
|
"distributeVertically": "垂直分布",
|
||||||
|
"moveToBack": "置於底層",
|
||||||
|
"moveToFront": "置於頂層",
|
||||||
|
"moveBackwards": "向後移動",
|
||||||
|
"moveForwards": "向前移動",
|
||||||
|
"showNodeHelp":"顯示節點幫助",
|
||||||
|
"enableSelectedNodes":"啟用當前選中節點",
|
||||||
|
"disableSelectedNodes":"禁用當前選中節點",
|
||||||
|
"showSelectedNodeLabels":"顯示選中的節點標簽",
|
||||||
|
"hideSelectedNodeLabels":"隱藏選中的節點標簽"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"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__\" __result__ of __count__"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"loggedInAs": "作為 __name__ 登入",
|
"loggedInAs": "作為 __name__ 登入",
|
||||||
@@ -135,12 +184,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification": {
|
"notification": {
|
||||||
|
"state": {
|
||||||
|
"flowsStopped": "流程已停止",
|
||||||
|
"flowsStarted": "流程已啟動"
|
||||||
|
},
|
||||||
"warning": "<strong>警告</strong>: __message__",
|
"warning": "<strong>警告</strong>: __message__",
|
||||||
"warnings": {
|
"warnings": {
|
||||||
"undeployedChanges": "節點中存在未部署的更改",
|
"undeployedChanges": "節點中存在未部署的更改",
|
||||||
"nodeActionDisabled": "節點動作在子流程中被禁用",
|
"nodeActionDisabled": "節點動作在子流程中被禁用",
|
||||||
"nodeActionDisabledSubflow": "子流程中禁用了節點操作",
|
"nodeActionDisabledSubflow": "子流程中禁用了節點操作",
|
||||||
"missing-types": "流程由於缺少節點類型而停止。請檢查日誌的詳細資訊",
|
"missing-types": "流程由於缺少節點類型而停止。請檢查日誌的詳細資訊",
|
||||||
|
"missing-modules": "<p>流程因缺少模塊而停止。</p>",
|
||||||
"safe-mode": "<p>流程在安全模式下停止。</p><p>您可以修改流程並部署更改以重新啟動。</p>",
|
"safe-mode": "<p>流程在安全模式下停止。</p><p>您可以修改流程並部署更改以重新啟動。</p>",
|
||||||
"restartRequired": "Node-RED必須重新啟動,以啟用升級的模組",
|
"restartRequired": "Node-RED必須重新啟動,以啟用升級的模組",
|
||||||
"credentials_load_failed": "<p>流程由於無法解密證書而停止。</p> <p>流程證書文件已加密,但是項目的加密密鑰丟失或無效。</p>",
|
"credentials_load_failed": "<p>流程由於無法解密證書而停止。</p> <p>流程證書文件已加密,但是項目的加密密鑰丟失或無效。</p>",
|
||||||
@@ -151,7 +205,7 @@
|
|||||||
"project_not_found": "<p>找不到項目的'__project__'</p>",
|
"project_not_found": "<p>找不到項目的'__project__'</p>",
|
||||||
"git_merge_conflict": "<p>自動合併更改失敗。</p><p>修復未合併的衝突,然後提交結果。</p>"
|
"git_merge_conflict": "<p>自動合併更改失敗。</p><p>修復未合併的衝突,然後提交結果。</p>"
|
||||||
},
|
},
|
||||||
"error": "<strong>Error</strong>: __message__",
|
"error": "<strong>錯誤</strong>: __message__",
|
||||||
"errors": {
|
"errors": {
|
||||||
"lostConnection": "丟失與伺服器的連接,重新連接...",
|
"lostConnection": "丟失與伺服器的連接,重新連接...",
|
||||||
"lostConnectionReconnect": "丟失與伺服器的連接,__time__ 秒後重新連接",
|
"lostConnectionReconnect": "丟失與伺服器的連接,__time__ 秒後重新連接",
|
||||||
@@ -182,7 +236,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": {
|
||||||
@@ -207,6 +262,8 @@
|
|||||||
"download": "下載",
|
"download": "下載",
|
||||||
"importUnrecognised": "匯入了無法識別的類型:",
|
"importUnrecognised": "匯入了無法識別的類型:",
|
||||||
"importUnrecognised_plural": "匯入了無法識別的類型:",
|
"importUnrecognised_plural": "匯入了無法識別的類型:",
|
||||||
|
"importDuplicate": "導入了重復節點:",
|
||||||
|
"importDuplicate_plural": "導入了重復節點:",
|
||||||
"nodesExported": "節點匯出到了剪貼簿",
|
"nodesExported": "節點匯出到了剪貼簿",
|
||||||
"nodesImported": "已匯入:",
|
"nodesImported": "已匯入:",
|
||||||
"nodeCopied": "已複製 __count__ 個節點",
|
"nodeCopied": "已複製 __count__ 個節點",
|
||||||
@@ -258,13 +315,19 @@
|
|||||||
"modifiedFlowsDesc": "只部署包含已更改節點的流程",
|
"modifiedFlowsDesc": "只部署包含已更改節點的流程",
|
||||||
"modifiedNodes": "已更改的節點",
|
"modifiedNodes": "已更改的節點",
|
||||||
"modifiedNodesDesc": "只部署已經更改的節點",
|
"modifiedNodesDesc": "只部署已經更改的節點",
|
||||||
|
"startFlows": "啟動",
|
||||||
|
"startFlowsDesc": "啟動流程",
|
||||||
|
"stopFlows": "停止",
|
||||||
|
"stopFlowsDesc": "停止流程",
|
||||||
"restartFlows": "重新啟動流程",
|
"restartFlows": "重新啟動流程",
|
||||||
"restartFlowsDesc": "重新啟動當前部署的流程",
|
"restartFlowsDesc": "重新啟動當前部署的流程",
|
||||||
"successfulDeploy": "部署成功",
|
"successfulDeploy": "部署成功",
|
||||||
"successfulRestart": "成功重啟流程",
|
"successfulRestart": "成功重啟流程",
|
||||||
"deployFailed": "部署失敗: __message__",
|
"deployFailed": "部署失敗: __message__",
|
||||||
"unusedConfigNodes": "您有一些未使用的配置節點",
|
"unusedConfigNodes": "您有一些未使用的配置節點",
|
||||||
"unusedConfigNodesLink": "點擊此處查看它們",
|
"unusedConfigNodesButton":"搜索未使用的配置節點",
|
||||||
|
"unknownNodesButton":"搜索未知節點",
|
||||||
|
"invalidNodesButton":"搜索無效節點",
|
||||||
"errors": {
|
"errors": {
|
||||||
"noResponse": "伺服器沒有回應"
|
"noResponse": "伺服器沒有回應"
|
||||||
},
|
},
|
||||||
@@ -334,14 +397,28 @@
|
|||||||
"output": "輸出:",
|
"output": "輸出:",
|
||||||
"status": "狀態節點",
|
"status": "狀態節點",
|
||||||
"deleteSubflow": "刪除子流程",
|
"deleteSubflow": "刪除子流程",
|
||||||
|
"confirmDelete": "您確定要刪除此子流程?",
|
||||||
"info": "詳細描述",
|
"info": "詳細描述",
|
||||||
"category": "類別",
|
"category": "類別",
|
||||||
|
"module": "模塊",
|
||||||
|
"license": "許可",
|
||||||
|
"licenseNone": "無",
|
||||||
|
"licenseOther": "其它",
|
||||||
|
"type": "節點類型",
|
||||||
|
"version": "版本",
|
||||||
|
"versionPlaceholder": "x.y.z",
|
||||||
|
"keys": "關鍵字",
|
||||||
|
"keysPlaceholder": "使用英文逗號分隔關鍵字",
|
||||||
|
"author": "作者",
|
||||||
|
"authorPlaceholder": "名字 <email@example.com>",
|
||||||
|
"desc": "描述",
|
||||||
"env": {
|
"env": {
|
||||||
"restore": "恢復為默認子流程",
|
"restore": "恢復為默認子流程",
|
||||||
"remove": "類別刪除環境變量"
|
"remove": "類別刪除環境變量"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"noNodesSelected": "<strong>無法創建子流程</strong>: 未選擇節點",
|
"noNodesSelected": "<strong>無法創建子流程</strong>: 未選擇節點",
|
||||||
|
"acrossMultipleGroups": "無法跨多個組創建子流",
|
||||||
"multipleInputsToSelection": "<strong>無法創建子流程</strong>: 多個輸入到了選擇"
|
"multipleInputsToSelection": "<strong>無法創建子流程</strong>: 多個輸入到了選擇"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -364,12 +441,12 @@
|
|||||||
"editConfig": "編輯 __type__ 配置",
|
"editConfig": "編輯 __type__ 配置",
|
||||||
"addNewType": "添加新的 __type__ 節點",
|
"addNewType": "添加新的 __type__ 節點",
|
||||||
"nodeProperties": "節點屬性",
|
"nodeProperties": "節點屬性",
|
||||||
"label": "Label",
|
"label": "標簽",
|
||||||
"color": "顏色",
|
"color": "顏色",
|
||||||
"portLabels": "埠標籤",
|
"portLabels": "埠標籤",
|
||||||
"labelInputs": "輸入",
|
"labelInputs": "輸入",
|
||||||
"labelOutputs": "輸出",
|
"labelOutputs": "輸出",
|
||||||
"settingIcon": "Icon",
|
"settingIcon": "圖標",
|
||||||
"default": "默認",
|
"default": "默認",
|
||||||
"noDefaultLabel": "無",
|
"noDefaultLabel": "無",
|
||||||
"defaultLabel": "使用默認標籤",
|
"defaultLabel": "使用默認標籤",
|
||||||
@@ -382,6 +459,7 @@
|
|||||||
"icon": "圖標",
|
"icon": "圖標",
|
||||||
"inputType": "輸入類型",
|
"inputType": "輸入類型",
|
||||||
"selectType": "選擇類型...",
|
"selectType": "選擇類型...",
|
||||||
|
"loadCredentials": "加載節點憑證",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"input": "輸入",
|
"input": "輸入",
|
||||||
"select": "選擇",
|
"select": "選擇",
|
||||||
@@ -416,7 +494,8 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"scopeChange": "更改範圍將使其他流程中的節點無法使用",
|
"scopeChange": "更改範圍將使其他流程中的節點無法使用",
|
||||||
"invalidProperties": "無效的屬性:"
|
"invalidProperties": "無效的屬性:",
|
||||||
|
"credentialLoadFailed": "無法加載節點憑據"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keyboard": {
|
"keyboard": {
|
||||||
@@ -428,11 +507,14 @@
|
|||||||
"unassigned": "未分配",
|
"unassigned": "未分配",
|
||||||
"global": "全局",
|
"global": "全局",
|
||||||
"workspace": "工作區",
|
"workspace": "工作區",
|
||||||
|
"editor": "編輯對話框",
|
||||||
"selectAll": "選擇所有節點",
|
"selectAll": "選擇所有節點",
|
||||||
|
"selectNone": "取消所有選擇",
|
||||||
"selectAllConnected": "選擇所有連接的節點",
|
"selectAllConnected": "選擇所有連接的節點",
|
||||||
"addRemoveNode": "從選擇中添加/刪除節點",
|
"addRemoveNode": "從選擇中添加/刪除節點",
|
||||||
"editSelected": "編輯選定節點",
|
"editSelected": "編輯選定節點",
|
||||||
"deleteSelected": "刪除選定節點或連結",
|
"deleteSelected": "刪除選定節點或連結",
|
||||||
|
"deleteReconnect": "刪除並重新連接",
|
||||||
"importNode": "匯入節點",
|
"importNode": "匯入節點",
|
||||||
"exportNode": "匯出節點",
|
"exportNode": "匯出節點",
|
||||||
"nudgeNode": "移動所選節點(1px)",
|
"nudgeNode": "移動所選節點(1px)",
|
||||||
@@ -442,10 +524,14 @@
|
|||||||
"copyNode": "複製所選節點",
|
"copyNode": "複製所選節點",
|
||||||
"cutNode": "剪切所選節點",
|
"cutNode": "剪切所選節點",
|
||||||
"pasteNode": "粘貼節點",
|
"pasteNode": "粘貼節點",
|
||||||
|
"copyGroupStyle": "復製組樣式",
|
||||||
|
"pasteGroupStyle": "粘貼組樣式",
|
||||||
"undoChange": "撤銷上次執行的更改",
|
"undoChange": "撤銷上次執行的更改",
|
||||||
|
"redoChange": "重做",
|
||||||
"searchBox": "打開搜尋框",
|
"searchBox": "打開搜尋框",
|
||||||
"managePalette": "管理面板",
|
"managePalette": "管理面板",
|
||||||
"actionList": "動作列表"
|
"actionList": "動作列表",
|
||||||
|
"splitWireWithLinks": "使用Link節點拆分已選項"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"library": "庫",
|
"library": "庫",
|
||||||
@@ -463,12 +549,11 @@
|
|||||||
"types": {
|
"types": {
|
||||||
"local": "本地",
|
"local": "本地",
|
||||||
"examples": "例子"
|
"examples": "例子"
|
||||||
},
|
}
|
||||||
"exportToLibrary": "將節點匯出到庫"
|
|
||||||
},
|
},
|
||||||
"palette": {
|
"palette": {
|
||||||
"noInfo": "無可用資訊",
|
"noInfo": "無可用資訊",
|
||||||
"filter": "過濾節點",
|
"filter": "過濾已安裝模組",
|
||||||
"search": "搜尋模組",
|
"search": "搜尋模組",
|
||||||
"addCategory": "添加新的...",
|
"addCategory": "添加新的...",
|
||||||
"label": {
|
"label": {
|
||||||
@@ -498,11 +583,13 @@
|
|||||||
"nodeEnabled_plural": "啟用多個節點:",
|
"nodeEnabled_plural": "啟用多個節點:",
|
||||||
"nodeDisabled": "禁用節點:",
|
"nodeDisabled": "禁用節點:",
|
||||||
"nodeDisabled_plural": "禁用多個節點:",
|
"nodeDisabled_plural": "禁用多個節點:",
|
||||||
"nodeUpgraded": "節點模組__module__升級到__version__版本"
|
"nodeUpgraded": "節點模組__module__升級到__version__版本",
|
||||||
|
"unknownNodeRegistered": "加載節點錯誤: <ul><li>__type__<br>__error__</li></ul>"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"title": "面板管理",
|
"title": "面板管理",
|
||||||
"palette": "Palette",
|
"palette": "控製板",
|
||||||
|
"allCatalogs": "所有目錄",
|
||||||
"times": {
|
"times": {
|
||||||
"seconds": "秒前",
|
"seconds": "秒前",
|
||||||
"minutes": "分前",
|
"minutes": "分前",
|
||||||
@@ -542,10 +629,12 @@
|
|||||||
"tab-nodes": "節點",
|
"tab-nodes": "節點",
|
||||||
"tab-install": "安裝",
|
"tab-install": "安裝",
|
||||||
"sort": "排序:",
|
"sort": "排序:",
|
||||||
|
"sortRelevance": "關聯",
|
||||||
"sortAZ": "a-z順序",
|
"sortAZ": "a-z順序",
|
||||||
"sortRecent": "日期順序",
|
"sortRecent": "日期順序",
|
||||||
"more": "增加 __count__ 個",
|
"more": "增加 __count__ 個",
|
||||||
"upload": "上傳模塊tgz文件",
|
"upload": "上傳模塊tgz文件",
|
||||||
|
"refresh": "更新模塊列表",
|
||||||
"errors": {
|
"errors": {
|
||||||
"catalogLoadFailed": "無法載入節點目錄。<br>查看瀏覽器控制臺瞭解更多資訊",
|
"catalogLoadFailed": "無法載入節點目錄。<br>查看瀏覽器控制臺瞭解更多資訊",
|
||||||
"installFailed": "無法安裝: __module__<br>__message__<br>查看日誌瞭解更多資訊",
|
"installFailed": "無法安裝: __module__<br>__message__<br>查看日誌瞭解更多資訊",
|
||||||
@@ -615,13 +704,10 @@
|
|||||||
"globalConfig": "全局配置節點",
|
"globalConfig": "全局配置節點",
|
||||||
"triggerAction": "觸發動作",
|
"triggerAction": "觸發動作",
|
||||||
"find": "在工作區中查找",
|
"find": "在工作區中查找",
|
||||||
"search": {
|
"copyItemUrl": "復製地址",
|
||||||
"configNodes": "配置節點",
|
"copyURL2Clipboard": "復製地址到剪貼板",
|
||||||
"unusedConfigNodes": "未使用的配置節點",
|
"showFlow": "顯示流程",
|
||||||
"invalidNodes": "無效的節點",
|
"hideFlow": "隱藏流程"
|
||||||
"uknownNodes": "未知的節點",
|
|
||||||
"unusedSubflows": "未使用的子流程"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"name": "幫助",
|
"name": "幫助",
|
||||||
@@ -631,7 +717,8 @@
|
|||||||
"showHelp": "顯示幫助",
|
"showHelp": "顯示幫助",
|
||||||
"showInOutline": "在大綱中顯示",
|
"showInOutline": "在大綱中顯示",
|
||||||
"showTopics": "顯示主題",
|
"showTopics": "顯示主題",
|
||||||
"noHelp": "未選擇幫助主題"
|
"noHelp": "未選擇幫助主題",
|
||||||
|
"changeLog": "更新日誌"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"name": "配置節點",
|
"name": "配置節點",
|
||||||
@@ -832,24 +919,37 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"bin": "二進位流",
|
"bin": "二進位流",
|
||||||
"date": "時間戳記",
|
"date": "時間戳記",
|
||||||
"jsonata": "expression",
|
"jsonata": "表達式",
|
||||||
"env": "env variable",
|
"env": "環境變量",
|
||||||
"cred": "證書"
|
"cred": "證書"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editableList": {
|
"editableList": {
|
||||||
"add": "添加"
|
"add": "添加",
|
||||||
|
"addTitle": "添加項"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"empty": "找不到匹配",
|
"history": "搜索歷史",
|
||||||
"addNode": "添加一個節點..."
|
"clear": "清除所有",
|
||||||
|
"empty": "找不到匹配項",
|
||||||
|
"addNode": "添加一個節點...",
|
||||||
|
"options": {
|
||||||
|
"configNodes": "配置節點",
|
||||||
|
"unusedConfigNodes": "未使用的配置節點",
|
||||||
|
"invalidNodes": "無效的節點",
|
||||||
|
"uknownNodes": "未知的節點",
|
||||||
|
"unusedSubflows": "未使用的子流程",
|
||||||
|
"hiddenFlows": "隱藏的流程",
|
||||||
|
"modifiedNodes": "已修改的節點或流程",
|
||||||
|
"thisFlow": "當前流程"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"expressionEditor": {
|
"expressionEditor": {
|
||||||
"functions": "功能",
|
"functions": "功能",
|
||||||
"functionReference": "Function reference",
|
"functionReference": "功能參考",
|
||||||
"insert": "插入",
|
"insert": "插入",
|
||||||
"title": "JSONata運算式編輯器",
|
"title": "JSONata運算式編輯器",
|
||||||
"test": "Test",
|
"test": "測試",
|
||||||
"data": "示例消息",
|
"data": "示例消息",
|
||||||
"result": "結果",
|
"result": "結果",
|
||||||
"format": "格式表達方法",
|
"format": "格式表達方法",
|
||||||
@@ -860,20 +960,28 @@
|
|||||||
"invalid-expr": "無效的JSONata運算式:\n __message__",
|
"invalid-expr": "無效的JSONata運算式:\n __message__",
|
||||||
"invalid-msg": "無效的示例JSON消息:\n __message__",
|
"invalid-msg": "無效的示例JSON消息:\n __message__",
|
||||||
"context-unsupported": "無法測試上下文函數\n $flowContext 或 $globalContext",
|
"context-unsupported": "無法測試上下文函數\n $flowContext 或 $globalContext",
|
||||||
|
"env-unsupported": "無法測試 $env 函數",
|
||||||
|
"moment-unsupported": "無法測試 $moment 函數",
|
||||||
|
"clone-unsupported": "無法測試 $clone 函數",
|
||||||
"eval": "評估運算式錯誤:\n __message__"
|
"eval": "評估運算式錯誤:\n __message__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"monaco": {
|
||||||
|
"setTheme": "設置主題"
|
||||||
|
},
|
||||||
"jsEditor": {
|
"jsEditor": {
|
||||||
"title": "JavaScript 編輯器"
|
"title": "JavaScript 編輯器"
|
||||||
},
|
},
|
||||||
"textEditor": {
|
"textEditor": {
|
||||||
"title": "Text 編輯器"
|
"title": "文本編輯器"
|
||||||
},
|
},
|
||||||
"jsonEditor": {
|
"jsonEditor": {
|
||||||
"title": "JSON編輯器",
|
"title": "JSON編輯器",
|
||||||
"format": "格式化JSON",
|
"format": "格式化JSON",
|
||||||
"rawMode": "編輯 JSON",
|
"rawMode": "編輯 JSON",
|
||||||
"uiMode": "Visual編輯器",
|
"uiMode": "可視化編輯器",
|
||||||
|
"rawMode-readonly": "原始JSON",
|
||||||
|
"uiMode-readonly": "可視化",
|
||||||
"insertAbove": "在上方插入",
|
"insertAbove": "在上方插入",
|
||||||
"insertBelow": "在下方插入",
|
"insertBelow": "在下方插入",
|
||||||
"addItem": "添加項目",
|
"addItem": "添加項目",
|
||||||
@@ -889,9 +997,9 @@
|
|||||||
"title": "Markdown 編輯器",
|
"title": "Markdown 編輯器",
|
||||||
"expand": "展開",
|
"expand": "展開",
|
||||||
"format": "F使用markdown格式化",
|
"format": "F使用markdown格式化",
|
||||||
"heading1": "Heading 1",
|
"heading1": "標題 1",
|
||||||
"heading2": "Heading 2",
|
"heading2": "標題 2",
|
||||||
"heading3": "Heading 3",
|
"heading3": "標題 3",
|
||||||
"bold": "粗體",
|
"bold": "粗體",
|
||||||
"italic": "斜體",
|
"italic": "斜體",
|
||||||
"code": "程式碼",
|
"code": "程式碼",
|
||||||
@@ -900,7 +1008,10 @@
|
|||||||
"quote": "引用",
|
"quote": "引用",
|
||||||
"link": "連結",
|
"link": "連結",
|
||||||
"horizontal-rule": "分隔線",
|
"horizontal-rule": "分隔線",
|
||||||
"toggle-preview": "預覽"
|
"toggle-preview": "切換預覽",
|
||||||
|
"mermaid": {
|
||||||
|
"summary": "美人魚圖"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"bufferEditor": {
|
"bufferEditor": {
|
||||||
"title": "緩衝區編輯器",
|
"title": "緩衝區編輯器",
|
||||||
@@ -1035,7 +1146,8 @@
|
|||||||
"not-git": "不是git倉庫",
|
"not-git": "不是git倉庫",
|
||||||
"no-resource": "找不到存儲庫",
|
"no-resource": "找不到存儲庫",
|
||||||
"cant-get-ssh-key-path": "錯誤! 無法獲取所選的SSH密鑰路徑。",
|
"cant-get-ssh-key-path": "錯誤! 無法獲取所選的SSH密鑰路徑。",
|
||||||
"unexpected_error": "意外的錯誤"
|
"unexpected_error": "意外的錯誤",
|
||||||
|
"clearContext": "更改項目時清除上下文"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"confirm": "您確定要刪除此項目嗎?"
|
"confirm": "您確定要刪除此項目嗎?"
|
||||||
@@ -1065,7 +1177,7 @@
|
|||||||
"create-default-file-set": {
|
"create-default-file-set": {
|
||||||
"no-active": "沒有活動項目就無法創建默認文件集",
|
"no-active": "沒有活動項目就無法創建默認文件集",
|
||||||
"no-empty": "無法在非空項目上創建默認文件集",
|
"no-empty": "無法在非空項目上創建默認文件集",
|
||||||
"git-error": "git error"
|
"git-error": "git錯誤"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"no-username-email": "您的Git客戶端未配置用戶名/電子郵件。",
|
"no-username-email": "您的Git客戶端未配置用戶名/電子郵件。",
|
||||||
@@ -1076,18 +1188,45 @@
|
|||||||
"editor-tab": {
|
"editor-tab": {
|
||||||
"properties": "屬性",
|
"properties": "屬性",
|
||||||
"envProperties": "環境變量",
|
"envProperties": "環境變量",
|
||||||
|
"module": "模塊屬性",
|
||||||
"description": "描述",
|
"description": "描述",
|
||||||
"appearance": "外觀",
|
"appearance": "外觀",
|
||||||
"preview": "UI預覽",
|
"preview": "UI預覽",
|
||||||
"defaultValue": "默認值",
|
"defaultValue": "默認值"
|
||||||
"env": "環境變量"
|
|
||||||
},
|
},
|
||||||
"languages": {
|
"tourGuide": {
|
||||||
"de": "德語",
|
"takeATour": "查看更新內容",
|
||||||
"en-US": "英語",
|
"start": "開始",
|
||||||
"ja": "日語",
|
"next": "下一個",
|
||||||
"ko": "韓語",
|
"welcomeTours": "歡迎使用 Node-RED"
|
||||||
"zh-CN": "簡體中文",
|
},
|
||||||
"zh-TW": "繁體中文"
|
"diagnostics": {
|
||||||
|
"title": "系统信息"
|
||||||
|
},
|
||||||
|
"validator": {
|
||||||
|
"errors": {
|
||||||
|
"invalid-json": "無效的 JSON 數據: __error__",
|
||||||
|
"invalid-expr": "無效的 JSONata 表達式: __error__",
|
||||||
|
"invalid-prop": "無效的屬性表達式",
|
||||||
|
"invalid-num": "無效的數字",
|
||||||
|
"invalid-regexp": "輸入格式無效",
|
||||||
|
"invalid-regex-prop": "__prop__: 輸入格式無效",
|
||||||
|
"missing-required-prop": "__prop__: 缺少屬性值",
|
||||||
|
"invalid-config": "__prop__: 無效的配置節點",
|
||||||
|
"missing-config": "__prop__: 缺少配置節點",
|
||||||
|
"validation-error": "__prop__: 驗證錯誤: __node__, __id__: __error__"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contextMenu": {
|
||||||
|
"showActionList":"顯示動作列表",
|
||||||
|
"insert": "插入",
|
||||||
|
"node": "節點",
|
||||||
|
"junction": "連接點",
|
||||||
|
"linkNodes": "鏈接節點"
|
||||||
|
},
|
||||||
|
"env-var": {
|
||||||
|
"environment": "環境配置",
|
||||||
|
"header": "全局環境變量",
|
||||||
|
"revert": "重置"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,7 @@
|
|||||||
},
|
},
|
||||||
"$sort": {
|
"$sort": {
|
||||||
"args": "array [, function]",
|
"args": "array [, function]",
|
||||||
"desc": "輸出排序後的陣列`array`。\n\n如果使用了比較函數`function`,則下述兩個參數需要被指定。\n\n`function(left, right)`\n\n該比較函數是為了比較left和right兩個值而被排序演算法調用的。如果使用者希望left的值被置於right的值之後,那麼該函數必須輸出布林值`true`來表示位置交換。而在不需要位置交換時函數必須輸出`false`。"
|
"desc": "輸出排序後的陣列`array`。\n\n如果使用了比較函數`function`,則下述兩個參數需要被指定。\n\n`function(left, right)`\n\n該比較函數是為了比較`left`和`right`兩個值而被排序演算法調用的。如果使用者希望left的值被置於`right`的值之後,那麼該函數必須輸出布林值`true`來表示位置交換。而在不需要位置交換時函數必須輸出`false`。"
|
||||||
},
|
},
|
||||||
"$reverse": {
|
"$reverse": {
|
||||||
"args": "array",
|
"args": "array",
|
||||||
@@ -237,25 +237,25 @@
|
|||||||
},
|
},
|
||||||
"$assert": {
|
"$assert": {
|
||||||
"args": "arg, str",
|
"args": "arg, str",
|
||||||
"desc": "如果`arg`為真,則該函數返回。 如果arg為假,則拋出帶有str的異常作為異常消息。"
|
"desc": "如果`arg`為真,則該函數返回。 如果`arg`為假,則拋出帶有`str`的異常作為異常消息。"
|
||||||
},
|
},
|
||||||
"$single": {
|
"$single": {
|
||||||
"args": "array, function",
|
"args": "array, function",
|
||||||
"desc": "返回滿足參數function謂語的array參數中的唯一值 (比如:傳遞值時,函數返回布林值“true”)。如果匹配值的數量不唯一時,則拋出異常。\n\n應在以下簽名中提供函數:`function(value [,index [,array []]])`其中value是數組的每個輸入,index是該值的位置,整個數組作為第三個參數傳遞。"
|
"desc": "返回滿足參數function謂語的array參數中的唯一值 (比如:傳遞值時,函數返回布林值“true”)。如果匹配值的數量不唯一時,則拋出異常。\n\n應在以下簽名中提供函數:`function(value [,index [,array []]])`其中value是數組的每個輸入,index是該值的位置,整個數組作為第三個參數傳遞。"
|
||||||
},
|
},
|
||||||
"$encodeUrl": {
|
"$encodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)組件進行編碼。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)組件進行編碼。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||||
},
|
},
|
||||||
"$encodeUrlComponent": {
|
"$encodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)進行編碼。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)進行編碼。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrl": {
|
"$decodeUrlComponent": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "解碼以前由encodeUrlComponent創建的統一資源定位器(URL)組件。\n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
"desc": "解碼以前由encodeUrlComponent創建的統一資源定位器(URL)組件。\n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||||
},
|
},
|
||||||
"$decodeUrlComponent": {
|
"$decodeUrl": {
|
||||||
"args": "str",
|
"args": "str",
|
||||||
"desc": "解碼先前由encodeUrl創建的統一資源定位符(URL)。\n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
"desc": "解碼先前由encodeUrl創建的統一資源定位符(URL)。\n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||||
},
|
},
|
||||||
@@ -270,5 +270,9 @@
|
|||||||
"$moment": {
|
"$moment": {
|
||||||
"args": "[str]",
|
"args": "[str]",
|
||||||
"desc": "使用Moment庫獲取日期對象。"
|
"desc": "使用Moment庫獲取日期對象。"
|
||||||
|
},
|
||||||
|
"$clone": {
|
||||||
|
"args": "value",
|
||||||
|
"desc": "安全克隆對象."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@node-red/editor-client",
|
"name": "@node-red/editor-client",
|
||||||
"version": "1.2.9",
|
"version": "3.1.15",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -14,5 +14,5 @@
|
|||||||
"name": "Dave Conway-Jones"
|
"name": "Dave Conway-Jones"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"main": "./lib/index.js"
|
"main": "./index.js"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
packages/node_modules/@node-red/editor-client/src/images/grip-horizontal.svg
vendored
Normal file
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 |
Binary file not shown.
|
Before Width: | Height: | Size: 192 B |
1
packages/node_modules/@node-red/editor-client/src/images/grip.svg
vendored
Normal file
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 |
1
packages/node_modules/@node-red/editor-client/src/images/node-red-256.svg
vendored
Normal file
1
packages/node_modules/@node-red/editor-client/src/images/node-red-256.svg
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" height="512" width="512"><g transform="translate(0 -540.36)"><path fill="#8f0000" color="#000" d="M0 540.36h512v392H0z"/><rect ry="0" height="108.23" width="500.23" stroke="#fff" y="938.25" x="5.89" stroke-width="11.77" fill="#fff"/><path style="text-decoration-color:#000;isolation:auto;mix-blend-mode:normal;solid-color:#000;block-progression:tb;text-decoration-line:none;white-space:normal;text-indent:0;text-transform:none;text-decoration-style:solid" d="M122.88 305.82a4.46 4.46 0 0 0-4.38 4.42v.78c-2.23.1-4.04.54-5.33 1.43a10.5 10.5 0 0 0-3.18 3.87c-.71 1.3-1.3 2.41-2.15 3.2-.72.66-1.8 1.12-3.45 1.32a4.37 4.37 0 0 0-4.3-3.95H82.91a4.43 4.43 0 0 0-4.42 4.35v4.24a4.43 4.43 0 0 0 4.42 4.36h17.16a4.4 4.4 0 0 0 4.4-4.36v-1.6c9.72.14 12.46 2.6 15.59 5.33 3 2.62 6.66 5.38 15.43 5.5v.73a4.49 4.49 0 0 0 4.46 4.38h17.09c2.38 0 4.45-2 4.45-4.38v-4.24a4.49 4.49 0 0 0-4.45-4.38h-17.1c-2.38 0-4.45 2-4.45 4.38v.58c-8.1-.06-10.48-2.15-13.5-4.79-2.5-2.19-5.64-4.58-11.94-5.58 1.17-1.18 1.88-2.52 2.51-3.66.68-1.23 1.29-2.2 2.27-2.88.76-.52 1.98-.84 3.66-.94v.55c0 2.39 2 4.34 4.38 4.34h17.24a4.39 4.39 0 0 0 4.38-4.34v-4.24c0-2.38-2-4.42-4.38-4.42zm0 3h17.24c.8 0 1.38.62 1.38 1.42v4.24c0 .81-.57 1.34-1.38 1.34h-17.24c-.8 0-1.38-.53-1.38-1.34v-4.24c0-.8.57-1.42 1.38-1.42zm-39.96 11.02h17.16c.81 0 1.42.6 1.42 1.4v4.24c0 .81-.61 1.41-1.42 1.41H82.92c-.8 0-1.42-.6-1.42-1.4v-4.25c0-.8.61-1.4 1.42-1.4zm57.04 9.98h17.09c.8 0 1.45.57 1.45 1.38v4.17c0 .8-.65 1.45-1.45 1.45h-17.1c-.8 0-1.45-.65-1.45-1.45v-4.17c0-.8.65-1.38 1.46-1.38z" fill="#fff" color="#000" transform="matrix(4 0 0 4 -162 -450.91)"/><g fill="#8f0000"><path d="M91 954.34v8.45l-8 1.45v60.07H69.03l-28.53-47.1-.5.05v37.2l8 1.44v8.41H19v-8.4l7.45-1.45v-50.22L19 962.79v-8.46h21.48l28.37 47.1.15-.04v-37.15l-7-1.45v-8.45h29zM95 997.83q0-11.63 6.49-19.03 6.53-7.45 18.02-7.45 11.53 0 18.02 7.4 6.54 7.4 6.54 19.08v1q0 11.74-6.54 19.14-6.49 7.35-17.93 7.35-11.58 0-18.11-7.35-6.5-7.4-6.5-19.13v-1.01zm14.03 1q0 7.12 2.5 11.45 2.5 4.28 8.08 4.28 5.43 0 7.93-4.33 2.54-4.33 2.54-11.4v-1q0-6.92-2.54-11.3-2.55-4.37-8.03-4.37t-7.98 4.37-2.5 11.3v1zM184.48 1017.96a17.15 17.15 0 0 1-5.82 5.48 15.17 15.17 0 0 1-7.59 1.88c-6.4 0-11.4-2.35-14.95-7.03-3.52-4.67-5.13-10.86-5.13-18.55v-1c0-8.21 1.62-14.83 5.18-19.86 3.56-5.03 8.56-7.54 15-7.54 2.6 0 4.93.57 7.01 1.73a17.94 17.94 0 0 1 5.81 4.8v-18.64l-8-1.45v-8.46h22v65.13l6 1.44v8.43h-18.45l-1.06-6.36zm-19.49-18.22c0 4.55.63 8.14 2.14 10.77 1.54 2.6 4.04 3.9 7.5 3.9 2.05 0 3.83-.43 5.33-1.26 1.5-.83 3.07-2.03 4.03-3.6v-22.06a11.27 11.27 0 0 0-4.03-3.85 9.62 9.62 0 0 0-5.24-1.4c-3.43 0-5.92 1.53-7.5 4.57s-2.23 7.02-2.23 11.92v1.01zM233.7 1025.28c-7.5 0-13.5-2.4-17.98-7.21-4.48-4.81-6.73-10.91-6.73-18.32v-1.92c0-7.72 2.12-14.08 6.35-19.08 4.26-5 9.96-7.46 17.1-7.43 7.03 0 12.47 2.1 16.35 6.33a23.46 23.46 0 0 1 6.2 17.15v7.52h-31.43l-.1.41c.26 3.43 1.4 6.25 3.41 8.46 2.05 2.21 4.83 3.32 8.32 3.32 3.1 0 5.69-.3 7.74-.91 2.05-.64 4.29-1.64 6.73-2.98l3.8 8.65a27.59 27.59 0 0 1-8.37 4.28 35.28 35.28 0 0 1-11.4 1.73zm-1.25-43.16c-2.6 0-4.65.99-6.15 2.98s-2.44 4.6-2.8 7.83l.15.4H241v-1.41c0-2.98-.84-5.35-2.25-7.11-1.37-1.8-3.47-2.7-6.3-2.7zM291.99 1000.32h-27v-11h27zM331.88 954.34c7.95 0 14.18 1.82 18.7 5.47 4.52 3.63 6.4 8.64 6.4 15.05 0 3.52-.57 6.58-2.46 9.18-1.89 2.6-4.66 4.7-8.31 6.3 4.13 1.21 7.1 3.25 8.89 6.1a19.02 19.02 0 0 1 2.89 10.52v3.56c0 1.54.15 2.74.76 3.6.6.84 1.62 1.34 3.03 1.5l1.2.24v8.46h-6.73c-4.58 0-7.8-1.24-9.66-3.7s-2.6-5.66-2.6-9.57v-3.99c0-3.4-1.1-6.05-2.93-7.98-1.8-1.95-4.34-2.98-7.64-3.07H322v18.45l7 1.44v8.42h-29v-8.42l8-1.44v-50.22l-8-1.44v-8.46h31.89zm-9.95 30.85h9.71c3.91 0 6.84-.83 8.8-2.5s2.93-4.07 2.93-7.2c0-3.15-.98-5.65-2.93-7.5-1.92-1.9-4.78-2.84-8.56-2.84h-9.9v20.04zM412.99 993.32h-23v20h22.21l.63-8h10.2v18.99H368v-8.42l8-1.44v-50.22l-8-1.44v-8.47h54.95v19h-10.3l-.63-8H390v17h23v11zM462.48 954.36c8.55 0 15.6 2.71 21.14 8.19 5.55 5.45 8.36 12.42 8.36 20.98v11.58c0 8.59-2.81 15.63-8.36 21.08-5.54 5.41-12.59 8.12-21.14 8.12h-31.5v-8.41l7-1.52v-50.22l-7-1.37v-8.43l7.46-.08 24.04.08zm-10.5 10.76v48.4l9.77.02c5.03.02 8.98-1.7 11.83-5.1 2.85-3.39 4.4-7.8 4.4-13.28v-11.68c0-5.42-1.55-9.84-4.4-13.24-2.85-3.4-6.8-5.1-11.83-5.1l-9.77-.02z"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 4.2 KiB |
4
packages/node_modules/@node-red/editor-client/src/images/start.svg
vendored
Normal file
4
packages/node_modules/@node-red/editor-client/src/images/start.svg
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path color="#000" fill="#8c101c" d="M0 0h32v32H0z"></path>
|
||||||
|
<path style="fill:#ffffff;stroke:#000000;stroke-width:0" d="M 24,16 8,24 8,8 Z" fill="none" stroke="#000" stroke-width="1.5"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 271 B |
4
packages/node_modules/@node-red/editor-client/src/images/stop.svg
vendored
Normal file
4
packages/node_modules/@node-red/editor-client/src/images/stop.svg
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path color="#000" fill="#8c101c" d="M0 0h32v32H0z"></path>
|
||||||
|
<rect style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0;" width="15" height="15" x="8" y="8.5"></rect>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 256 B |
@@ -39,15 +39,16 @@
|
|||||||
console.warn(evt,args);
|
console.warn(evt,args);
|
||||||
}
|
}
|
||||||
if (handlers[evt]) {
|
if (handlers[evt]) {
|
||||||
for (var i=0;i<handlers[evt].length;i++) {
|
let cpyHandlers = [...handlers[evt]];
|
||||||
|
|
||||||
|
for (var i=0;i<cpyHandlers.length;i++) {
|
||||||
try {
|
try {
|
||||||
handlers[evt][i].apply(null, args);
|
cpyHandlers[i].apply(null, args);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
console.warn("RED.events.emit error: ["+evt+"] "+(err.toString()));
|
console.warn("RED.events.emit error: ["+evt+"] "+(err.toString()));
|
||||||
console.warn(err);
|
console.warn(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -13,10 +13,23 @@
|
|||||||
* 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 = [];
|
||||||
|
|
||||||
|
function nodeOrJunction(id) {
|
||||||
|
var node = RED.nodes.node(id);
|
||||||
|
if (node) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
return RED.nodes.junction(id);
|
||||||
|
}
|
||||||
|
|
||||||
function undoEvent(ev) {
|
function undoEvent(ev) {
|
||||||
var i;
|
var i;
|
||||||
var len;
|
var len;
|
||||||
@@ -66,12 +79,14 @@ RED.history = (function() {
|
|||||||
var importedResult = RED.nodes.import(ev.config,{importMap: importMap})
|
var importedResult = RED.nodes.import(ev.config,{importMap: importMap})
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: 'replace',
|
t: 'replace',
|
||||||
config: importedResult.removedNodes
|
config: importedResult.removedNodes,
|
||||||
|
dirty: RED.nodes.dirty()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (ev.t == 'add') {
|
} else if (ev.t == 'add') {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: "delete",
|
t: "delete",
|
||||||
|
dirty: RED.nodes.dirty()
|
||||||
};
|
};
|
||||||
if (ev.nodes) {
|
if (ev.nodes) {
|
||||||
inverseEv.nodes = [];
|
inverseEv.nodes = [];
|
||||||
@@ -99,6 +114,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--) {
|
||||||
@@ -158,7 +190,8 @@ RED.history = (function() {
|
|||||||
|
|
||||||
} else if (ev.t == "delete") {
|
} else if (ev.t == "delete") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: "add"
|
t: "add",
|
||||||
|
dirty: RED.nodes.dirty()
|
||||||
};
|
};
|
||||||
if (ev.workspaces) {
|
if (ev.workspaces) {
|
||||||
inverseEv.workspaces = [];
|
inverseEv.workspaces = [];
|
||||||
@@ -264,6 +297,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++) {
|
||||||
@@ -300,11 +348,12 @@ RED.history = (function() {
|
|||||||
} else if (ev.t == "move") {
|
} else if (ev.t == "move") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: 'move',
|
t: 'move',
|
||||||
nodes: []
|
nodes: [],
|
||||||
|
dirty: RED.nodes.dirty()
|
||||||
};
|
};
|
||||||
for (i=0;i<ev.nodes.length;i++) {
|
for (i=0;i<ev.nodes.length;i++) {
|
||||||
var n = ev.nodes[i];
|
var n = ev.nodes[i];
|
||||||
var rn = {n: n.n, ox: n.n.x, oy: n.n.y, dirty: true, moved: n.moved};
|
var rn = {n: n.n, ox: n.n.x, oy: n.n.y, dirty: true, moved: n.n.moved};
|
||||||
inverseEv.nodes.push(rn);
|
inverseEv.nodes.push(rn);
|
||||||
n.n.x = n.ox;
|
n.n.x = n.ox;
|
||||||
n.n.y = n.oy;
|
n.n.y = n.oy;
|
||||||
@@ -329,35 +378,53 @@ RED.history = (function() {
|
|||||||
if (ev.addToGroup) {
|
if (ev.addToGroup) {
|
||||||
RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }),false);
|
RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }),false);
|
||||||
inverseEv.removeFromGroup = ev.addToGroup;
|
inverseEv.removeFromGroup = ev.addToGroup;
|
||||||
} else if (ev.removeFromGroup) {
|
}
|
||||||
|
if (ev.removeFromGroup) {
|
||||||
RED.group.addToGroup(ev.removeFromGroup,ev.nodes.map(function(n) { return n.n }));
|
RED.group.addToGroup(ev.removeFromGroup,ev.nodes.map(function(n) { return n.n }));
|
||||||
inverseEv.addToGroup = ev.removeFromGroup;
|
inverseEv.addToGroup = ev.removeFromGroup;
|
||||||
}
|
}
|
||||||
} else if (ev.t == "edit") {
|
} else if (ev.t == "edit") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: "edit",
|
t: "edit",
|
||||||
changes: {}
|
changes: {},
|
||||||
|
changed: ev.node.changed,
|
||||||
|
dirty: RED.nodes.dirty()
|
||||||
};
|
};
|
||||||
inverseEv.node = ev.node;
|
inverseEv.node = ev.node;
|
||||||
for (i in ev.changes) {
|
for (i in ev.changes) {
|
||||||
if (ev.changes.hasOwnProperty(i)) {
|
if (ev.changes.hasOwnProperty(i)) {
|
||||||
inverseEv.changes[i] = ev.node[i];
|
inverseEv.changes[i] = ev.node[i];
|
||||||
if (ev.node._def.defaults && ev.node._def.defaults[i] && ev.node._def.defaults[i].type) {
|
if (ev.node._def.defaults && ev.node._def.defaults[i] && ev.node._def.defaults[i].type) {
|
||||||
// This is a config node property
|
// This property is a reference to another node or nodes.
|
||||||
var currentConfigNode = RED.nodes.node(ev.node[i]);
|
var nodeList = ev.node[i];
|
||||||
if (currentConfigNode) {
|
if (!Array.isArray(nodeList)) {
|
||||||
|
nodeList = [nodeList];
|
||||||
|
}
|
||||||
|
nodeList.forEach(function(id) {
|
||||||
|
var currentConfigNode = RED.nodes.node(id);
|
||||||
|
if (currentConfigNode && currentConfigNode._def.category === "config") {
|
||||||
currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1);
|
currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1);
|
||||||
RED.events.emit("nodes:change",currentConfigNode);
|
RED.events.emit("nodes:change",currentConfigNode);
|
||||||
}
|
}
|
||||||
var newConfigNode = RED.nodes.node(ev.changes[i]);
|
});
|
||||||
if (newConfigNode) {
|
nodeList = ev.changes[i];
|
||||||
|
if (!Array.isArray(nodeList)) {
|
||||||
|
nodeList = [nodeList];
|
||||||
|
}
|
||||||
|
nodeList.forEach(function(id) {
|
||||||
|
var newConfigNode = RED.nodes.node(id);
|
||||||
|
if (newConfigNode && newConfigNode._def.category === "config") {
|
||||||
newConfigNode.users.push(ev.node);
|
newConfigNode.users.push(ev.node);
|
||||||
RED.events.emit("nodes:change",newConfigNode);
|
RED.events.emit("nodes:change",newConfigNode);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
ev.node[i] = ev.changes[i];
|
ev.node[i] = ev.changes[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ev.node.dirty = true;
|
||||||
|
ev.node.changed = ev.changed;
|
||||||
|
|
||||||
var eventType;
|
var eventType;
|
||||||
switch(ev.node.type) {
|
switch(ev.node.type) {
|
||||||
case 'tab': eventType = "flows"; break;
|
case 'tab': eventType = "flows"; break;
|
||||||
@@ -371,7 +438,9 @@ RED.history = (function() {
|
|||||||
|
|
||||||
if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('disabled')) {
|
if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('disabled')) {
|
||||||
$("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!ev.node.disabled);
|
$("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!ev.node.disabled);
|
||||||
$("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!ev.node.disabled);
|
}
|
||||||
|
if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('locked')) {
|
||||||
|
$("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-locked',!!ev.node.locked);
|
||||||
}
|
}
|
||||||
if (ev.subflow) {
|
if (ev.subflow) {
|
||||||
inverseEv.subflow = {};
|
inverseEv.subflow = {};
|
||||||
@@ -446,8 +515,6 @@ RED.history = (function() {
|
|||||||
inverseEv.links.push(ev.createdLinks[i]);
|
inverseEv.links.push(ev.createdLinks[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ev.node.dirty = true;
|
|
||||||
ev.node.changed = ev.changed;
|
|
||||||
} else if (ev.t == "createSubflow") {
|
} else if (ev.t == "createSubflow") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: "deleteSubflow",
|
t: "deleteSubflow",
|
||||||
@@ -459,6 +526,7 @@ RED.history = (function() {
|
|||||||
var z = ev.activeWorkspace;
|
var z = ev.activeWorkspace;
|
||||||
var fullNodeList = RED.nodes.filterNodes({z:ev.subflow.subflow.id});
|
var fullNodeList = RED.nodes.filterNodes({z:ev.subflow.subflow.id});
|
||||||
fullNodeList = fullNodeList.concat(RED.nodes.groups(ev.subflow.subflow.id))
|
fullNodeList = fullNodeList.concat(RED.nodes.groups(ev.subflow.subflow.id))
|
||||||
|
fullNodeList = fullNodeList.concat(RED.nodes.junctions(ev.subflow.subflow.id))
|
||||||
fullNodeList.forEach(function(n) {
|
fullNodeList.forEach(function(n) {
|
||||||
n.x += ev.subflow.offsetX;
|
n.x += ev.subflow.offsetX;
|
||||||
n.y += ev.subflow.offsetY;
|
n.y += ev.subflow.offsetY;
|
||||||
@@ -468,7 +536,7 @@ RED.history = (function() {
|
|||||||
});
|
});
|
||||||
inverseEv.subflows = [];
|
inverseEv.subflows = [];
|
||||||
for (i=0;i<ev.nodes.length;i++) {
|
for (i=0;i<ev.nodes.length;i++) {
|
||||||
inverseEv.subflows.push(RED.nodes.node(ev.nodes[i]));
|
inverseEv.subflows.push(nodeOrJunction(ev.nodes[i]));
|
||||||
RED.nodes.remove(ev.nodes[i]);
|
RED.nodes.remove(ev.nodes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -540,10 +608,22 @@ RED.history = (function() {
|
|||||||
} else if (ev.t == "reorder") {
|
} else if (ev.t == "reorder") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: 'reorder',
|
t: 'reorder',
|
||||||
order: RED.nodes.getWorkspaceOrder()
|
dirty: RED.nodes.dirty()
|
||||||
};
|
};
|
||||||
if (ev.order) {
|
if (ev.workspaces) {
|
||||||
RED.workspaces.order(ev.order);
|
inverseEv.workspaces = {
|
||||||
|
from: ev.workspaces.to,
|
||||||
|
to: ev.workspaces.from
|
||||||
|
}
|
||||||
|
RED.workspaces.order(ev.workspaces.from);
|
||||||
|
}
|
||||||
|
if (ev.nodes) {
|
||||||
|
inverseEv.nodes = {
|
||||||
|
z: ev.nodes.z,
|
||||||
|
from: ev.nodes.to,
|
||||||
|
to: ev.nodes.from
|
||||||
|
}
|
||||||
|
RED.nodes.setNodeOrder(ev.nodes.z,ev.nodes.from);
|
||||||
}
|
}
|
||||||
} else if (ev.t == "createGroup") {
|
} else if (ev.t == "createGroup") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
@@ -570,6 +650,12 @@ RED.history = (function() {
|
|||||||
ev.groups[i].nodes = [];
|
ev.groups[i].nodes = [];
|
||||||
RED.nodes.addGroup(ev.groups[i]);
|
RED.nodes.addGroup(ev.groups[i]);
|
||||||
RED.group.addToGroup(ev.groups[i],nodes);
|
RED.group.addToGroup(ev.groups[i],nodes);
|
||||||
|
if (ev.groups[i].g) {
|
||||||
|
const parentGroup = RED.nodes.group(ev.groups[i].g)
|
||||||
|
if (parentGroup) {
|
||||||
|
RED.group.addToGroup(parentGroup, ev.groups[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (ev.t == "addToGroup") {
|
} else if (ev.t == "addToGroup") {
|
||||||
@@ -639,6 +725,8 @@ RED.history = (function() {
|
|||||||
push: function(ev) {
|
push: function(ev) {
|
||||||
undoHistory.push(ev);
|
undoHistory.push(ev);
|
||||||
redoHistory = [];
|
redoHistory = [];
|
||||||
|
RED.menu.setDisabled("menu-item-edit-undo", false);
|
||||||
|
RED.menu.setDisabled("menu-item-edit-redo", true);
|
||||||
},
|
},
|
||||||
pop: function() {
|
pop: function() {
|
||||||
var ev = undoHistory.pop();
|
var ev = undoHistory.pop();
|
||||||
@@ -646,13 +734,24 @@ RED.history = (function() {
|
|||||||
if (rev) {
|
if (rev) {
|
||||||
redoHistory.push(rev);
|
redoHistory.push(rev);
|
||||||
}
|
}
|
||||||
|
RED.menu.setDisabled("menu-item-edit-undo", undoHistory.length === 0);
|
||||||
|
RED.menu.setDisabled("menu-item-edit-redo", redoHistory.length === 0);
|
||||||
},
|
},
|
||||||
peek: function() {
|
peek: function() {
|
||||||
return undoHistory[undoHistory.length-1];
|
return undoHistory[undoHistory.length-1];
|
||||||
},
|
},
|
||||||
|
replace: function(ev) {
|
||||||
|
if (undoHistory.length === 0) {
|
||||||
|
RED.history.push(ev);
|
||||||
|
} else {
|
||||||
|
undoHistory[undoHistory.length-1] = ev;
|
||||||
|
}
|
||||||
|
},
|
||||||
clear: function() {
|
clear: function() {
|
||||||
undoHistory = [];
|
undoHistory = [];
|
||||||
redoHistory = [];
|
redoHistory = [];
|
||||||
|
RED.menu.setDisabled("menu-item-edit-undo", true);
|
||||||
|
RED.menu.setDisabled("menu-item-edit-redo", true);
|
||||||
},
|
},
|
||||||
redo: function() {
|
redo: function() {
|
||||||
var ev = redoHistory.pop();
|
var ev = redoHistory.pop();
|
||||||
@@ -662,6 +761,8 @@ RED.history = (function() {
|
|||||||
undoHistory.push(uev);
|
undoHistory.push(uev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
RED.menu.setDisabled("menu-item-edit-undo", undoHistory.length === 0);
|
||||||
|
RED.menu.setDisabled("menu-item-edit-redo", redoHistory.length === 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
156
packages/node_modules/@node-red/editor-client/src/js/hooks.js
vendored
Normal file
156
packages/node_modules/@node-red/editor-client/src/js/hooks.js
vendored
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
RED.hooks = (function() {
|
||||||
|
|
||||||
|
var VALID_HOOKS = [
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
var hooks = { }
|
||||||
|
var labelledHooks = { }
|
||||||
|
|
||||||
|
function add(hookId, callback) {
|
||||||
|
var parts = hookId.split(".");
|
||||||
|
var id = parts[0], label = parts[1];
|
||||||
|
|
||||||
|
// if (VALID_HOOKS.indexOf(id) === -1) {
|
||||||
|
// throw new Error("Invalid hook '"+id+"'");
|
||||||
|
// }
|
||||||
|
if (label && labelledHooks[label] && labelledHooks[label][id]) {
|
||||||
|
throw new Error("Hook "+hookId+" already registered")
|
||||||
|
}
|
||||||
|
var hookItem = {cb:callback, previousHook: null, nextHook: null }
|
||||||
|
|
||||||
|
var tailItem = hooks[id];
|
||||||
|
if (tailItem === undefined) {
|
||||||
|
hooks[id] = hookItem;
|
||||||
|
} else {
|
||||||
|
while(tailItem.nextHook !== null) {
|
||||||
|
tailItem = tailItem.nextHook
|
||||||
|
}
|
||||||
|
tailItem.nextHook = hookItem;
|
||||||
|
hookItem.previousHook = tailItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (label) {
|
||||||
|
labelledHooks[label] = labelledHooks[label]||{};
|
||||||
|
labelledHooks[label][id] = hookItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function remove(hookId) {
|
||||||
|
var parts = hookId.split(".");
|
||||||
|
var id = parts[0], label = parts[1];
|
||||||
|
if ( !label) {
|
||||||
|
throw new Error("Cannot remove hook without label: "+hookId)
|
||||||
|
}
|
||||||
|
if (labelledHooks[label]) {
|
||||||
|
if (id === "*") {
|
||||||
|
// Remove all hooks for this label
|
||||||
|
var hookList = Object.keys(labelledHooks[label]);
|
||||||
|
for (var i=0;i<hookList.length;i++) {
|
||||||
|
removeHook(hookList[i],labelledHooks[label][hookList[i]])
|
||||||
|
}
|
||||||
|
delete labelledHooks[label];
|
||||||
|
} else if (labelledHooks[label][id]) {
|
||||||
|
removeHook(id,labelledHooks[label][id])
|
||||||
|
delete labelledHooks[label][id];
|
||||||
|
if (Object.keys(labelledHooks[label]).length === 0){
|
||||||
|
delete labelledHooks[label];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeHook(id,hookItem) {
|
||||||
|
var previousHook = hookItem.previousHook;
|
||||||
|
var nextHook = hookItem.nextHook;
|
||||||
|
|
||||||
|
if (previousHook) {
|
||||||
|
previousHook.nextHook = nextHook;
|
||||||
|
} else {
|
||||||
|
hooks[id] = nextHook;
|
||||||
|
}
|
||||||
|
if (nextHook) {
|
||||||
|
nextHook.previousHook = previousHook;
|
||||||
|
}
|
||||||
|
hookItem.removed = true;
|
||||||
|
if (!previousHook && !nextHook) {
|
||||||
|
delete hooks[id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function trigger(hookId, payload, done) {
|
||||||
|
var hookItem = hooks[hookId];
|
||||||
|
if (!hookItem) {
|
||||||
|
if (done) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function callNextHook(err) {
|
||||||
|
if (!hookItem || err) {
|
||||||
|
if (done) { done(err) }
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (hookItem.removed) {
|
||||||
|
hookItem = hookItem.nextHook;
|
||||||
|
return callNextHook();
|
||||||
|
}
|
||||||
|
var callback = hookItem.cb;
|
||||||
|
if (callback.length === 1) {
|
||||||
|
try {
|
||||||
|
let result = callback(payload);
|
||||||
|
if (result === false) {
|
||||||
|
// Halting the flow
|
||||||
|
if (done) { done(false) }
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
hookItem = hookItem.nextHook;
|
||||||
|
return callNextHook();
|
||||||
|
} catch(e) {
|
||||||
|
console.warn(e);
|
||||||
|
if (done) { done(e);}
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// There is a done callback
|
||||||
|
try {
|
||||||
|
callback(payload,function(result) {
|
||||||
|
if (result === undefined) {
|
||||||
|
hookItem = hookItem.nextHook;
|
||||||
|
callNextHook();
|
||||||
|
} else {
|
||||||
|
if (done) { done(result)}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch(e) {
|
||||||
|
console.warn(e);
|
||||||
|
if (done) { done(e) }
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return callNextHook();
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear() {
|
||||||
|
hooks = {}
|
||||||
|
labelledHooks = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function has(hookId) {
|
||||||
|
var parts = hookId.split(".");
|
||||||
|
var id = parts[0], label = parts[1];
|
||||||
|
if (label) {
|
||||||
|
return !!(labelledHooks[label] && labelledHooks[label][id])
|
||||||
|
}
|
||||||
|
return !!hooks[id]
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
has: has,
|
||||||
|
clear: clear,
|
||||||
|
add: add,
|
||||||
|
remove: remove,
|
||||||
|
trigger: trigger
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -18,53 +18,69 @@ RED.i18n = (function() {
|
|||||||
|
|
||||||
var apiRootUrl;
|
var apiRootUrl;
|
||||||
|
|
||||||
|
function detectLanguage() {
|
||||||
|
return navigator.language
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
init: function(options, done) {
|
init: function(options, done) {
|
||||||
apiRootUrl = options.apiRootUrl||"";
|
apiRootUrl = options.apiRootUrl||"";
|
||||||
var preferredLanguage = localStorage.getItem("editor-language");
|
var preferredLanguage = localStorage.getItem("editor-language") || detectLanguage();
|
||||||
var opts = {
|
var opts = {
|
||||||
resGetPath: apiRootUrl+'locales/__ns__?lng=__lng__',
|
compatibilityJSON: 'v3',
|
||||||
dynamicLoad: false,
|
backend: {
|
||||||
load:'current',
|
loadPath: apiRootUrl+'locales/__ns__?lng=__lng__',
|
||||||
ns: {
|
|
||||||
namespaces: ["editor","node-red","jsonata","infotips"],
|
|
||||||
defaultNs: "editor"
|
|
||||||
},
|
},
|
||||||
|
lng: 'en-US',
|
||||||
|
// debug: true,
|
||||||
|
preload:['en-US'],
|
||||||
|
ns: ["editor","node-red","jsonata","infotips"],
|
||||||
|
defaultNS: "editor",
|
||||||
fallbackLng: ['en-US'],
|
fallbackLng: ['en-US'],
|
||||||
useCookie: false,
|
returnObjects: true,
|
||||||
returnObjectTrees: true
|
keySeparator: ".",
|
||||||
|
nsSeparator: ":",
|
||||||
|
interpolation: {
|
||||||
|
unescapeSuffix: 'HTML',
|
||||||
|
escapeValue: false,
|
||||||
|
prefix: '__',
|
||||||
|
suffix: '__'
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if (preferredLanguage) {
|
if (preferredLanguage) {
|
||||||
opts.lng = preferredLanguage;
|
opts.lng = preferredLanguage;
|
||||||
}
|
}
|
||||||
i18n.init(opts,function() {
|
|
||||||
|
i18next.use(i18nextHttpBackend).init(opts,function() {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
jqueryI18next.init(i18next, $, { handleName: 'i18n' });
|
||||||
|
|
||||||
|
|
||||||
RED["_"] = function() {
|
RED["_"] = function() {
|
||||||
var v = i18n.t.apply(null,arguments);
|
var v = i18next.t.apply(i18next,arguments);
|
||||||
if (typeof v === 'string') {
|
if (typeof v === 'string') {
|
||||||
return v;
|
return v;
|
||||||
} else {
|
} else {
|
||||||
return arguments[0];
|
return arguments[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
lang: function() {
|
lang: function() {
|
||||||
// Gets the active message catalog language. This is based on what
|
// Gets the active message catalog language. This is based on what
|
||||||
// locale the editor is using and what languages are available.
|
// locale the editor is using and what languages are available.
|
||||||
//
|
//
|
||||||
var preferredLangs = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
var preferredLangs = [localStorage.getItem("editor-language")|| detectLanguage()].concat(i18next.languages);
|
||||||
var knownLangs = RED.settings.theme("languages")||["en-US"];
|
var knownLangs = RED.settings.theme("languages")||["en-US"];
|
||||||
for (var i=0;i<preferredLangs.length;i++) {
|
for (var i=0;i<preferredLangs.length;i++) {
|
||||||
if (knownLangs.indexOf(preferredLangs[i]) > -1) {
|
if (knownLangs.indexOf(preferredLangs[i]) > -1) {
|
||||||
return preferredLangs[i]
|
return preferredLangs[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 'end-US'
|
return 'en-US'
|
||||||
},
|
},
|
||||||
loadNodeCatalog: function(namespace,done) {
|
loadNodeCatalog: function(namespace,done) {
|
||||||
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
var languageList = [localStorage.getItem("editor-language")|| detectLanguage()].concat(i18next.languages);
|
||||||
var toLoad = languageList.length;
|
var toLoad = languageList.length;
|
||||||
languageList.forEach(function(lang) {
|
languageList.forEach(function(lang) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -74,7 +90,7 @@ RED.i18n = (function() {
|
|||||||
cache: false,
|
cache: false,
|
||||||
url: apiRootUrl+'nodes/'+namespace+'/messages?lng='+lang,
|
url: apiRootUrl+'nodes/'+namespace+'/messages?lng='+lang,
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
i18n.addResourceBundle(lang,namespace,data);
|
i18next.addResourceBundle(lang,namespace,data);
|
||||||
toLoad--;
|
toLoad--;
|
||||||
if (toLoad === 0) {
|
if (toLoad === 0) {
|
||||||
done();
|
done();
|
||||||
@@ -86,7 +102,7 @@ RED.i18n = (function() {
|
|||||||
},
|
},
|
||||||
|
|
||||||
loadNodeCatalogs: function(done) {
|
loadNodeCatalogs: function(done) {
|
||||||
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
var languageList = [localStorage.getItem("editor-language")|| detectLanguage()].concat(i18next.languages);
|
||||||
var toLoad = languageList.length;
|
var toLoad = languageList.length;
|
||||||
|
|
||||||
languageList.forEach(function(lang) {
|
languageList.forEach(function(lang) {
|
||||||
@@ -99,7 +115,7 @@ RED.i18n = (function() {
|
|||||||
success: function(data) {
|
success: function(data) {
|
||||||
var namespaces = Object.keys(data);
|
var namespaces = Object.keys(data);
|
||||||
namespaces.forEach(function(ns) {
|
namespaces.forEach(function(ns) {
|
||||||
i18n.addResourceBundle(lang,ns,data[ns]);
|
i18next.addResourceBundle(lang,ns,data[ns]);
|
||||||
});
|
});
|
||||||
toLoad--;
|
toLoad--;
|
||||||
if (toLoad === 0) {
|
if (toLoad === 0) {
|
||||||
@@ -108,6 +124,32 @@ RED.i18n = (function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
loadPluginCatalogs: function(done) {
|
||||||
|
var languageList = [localStorage.getItem("editor-language")|| detectLanguage()].concat(i18next.languages);
|
||||||
|
var toLoad = languageList.length;
|
||||||
|
|
||||||
|
languageList.forEach(function(lang) {
|
||||||
|
$.ajax({
|
||||||
|
headers: {
|
||||||
|
"Accept":"application/json"
|
||||||
|
},
|
||||||
|
cache: false,
|
||||||
|
url: apiRootUrl+'plugins/messages?lng='+lang,
|
||||||
|
success: function(data) {
|
||||||
|
var namespaces = Object.keys(data);
|
||||||
|
namespaces.forEach(function(ns) {
|
||||||
|
i18next.addResourceBundle(lang,ns,data[ns]);
|
||||||
|
});
|
||||||
|
toLoad--;
|
||||||
|
if (toLoad === 0) {
|
||||||
|
done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
},
|
||||||
|
detectLanguage: detectLanguage
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -3,16 +3,12 @@
|
|||||||
"alt-shift-p":"core:manage-palette",
|
"alt-shift-p":"core:manage-palette",
|
||||||
"ctrl-f": "core:search",
|
"ctrl-f": "core:search",
|
||||||
"ctrl-shift-f": "core:list-flows",
|
"ctrl-shift-f": "core:list-flows",
|
||||||
"ctrl-=": "core:zoom-in",
|
|
||||||
"ctrl--": "core:zoom-out",
|
|
||||||
"ctrl-0": "core:zoom-reset",
|
|
||||||
"ctrl-enter": "core:confirm-edit-tray",
|
|
||||||
"ctrl-escape": "core:cancel-edit-tray",
|
|
||||||
"ctrl-d": "core:deploy-flows",
|
"ctrl-d": "core:deploy-flows",
|
||||||
"ctrl-g i": "core:show-info-tab",
|
|
||||||
"ctrl-g h": "core:show-help-tab",
|
|
||||||
"ctrl-g d": "core:show-debug-tab",
|
|
||||||
"ctrl-g c": "core:show-config-tab",
|
"ctrl-g c": "core:show-config-tab",
|
||||||
|
"ctrl-g d": "core:show-debug-tab",
|
||||||
|
"ctrl-g h": "core:show-help-tab",
|
||||||
|
"ctrl-g i": "core:show-info-tab",
|
||||||
|
"ctrl-g v": "core:show-version-control-tab",
|
||||||
"ctrl-g x": "core:show-context-tab",
|
"ctrl-g x": "core:show-context-tab",
|
||||||
"ctrl-e": "core:show-export-dialog",
|
"ctrl-e": "core:show-export-dialog",
|
||||||
"ctrl-i": "core:show-import-dialog",
|
"ctrl-i": "core:show-import-dialog",
|
||||||
@@ -23,7 +19,6 @@
|
|||||||
"ctrl-alt-r": "core:show-remote-diff",
|
"ctrl-alt-r": "core:show-remote-diff",
|
||||||
"ctrl-alt-n": "core:new-project",
|
"ctrl-alt-n": "core:new-project",
|
||||||
"ctrl-alt-o": "core:open-project",
|
"ctrl-alt-o": "core:open-project",
|
||||||
"ctrl-g v": "core:show-version-control-tab",
|
|
||||||
"ctrl-shift-l": "core:show-event-log",
|
"ctrl-shift-l": "core:show-event-log",
|
||||||
"ctrl-shift-p":"core:show-action-list"
|
"ctrl-shift-p":"core:show-action-list"
|
||||||
},
|
},
|
||||||
@@ -36,14 +31,21 @@
|
|||||||
},
|
},
|
||||||
"red-ui-workspace": {
|
"red-ui-workspace": {
|
||||||
"backspace": "core:delete-selection",
|
"backspace": "core:delete-selection",
|
||||||
|
"ctrl-backspace": "core:delete-selection-and-reconnect",
|
||||||
"delete": "core:delete-selection",
|
"delete": "core:delete-selection",
|
||||||
|
"ctrl-delete": "core:delete-selection-and-reconnect",
|
||||||
"enter": "core:edit-selected-node",
|
"enter": "core:edit-selected-node",
|
||||||
|
"ctrl-enter": "core:go-to-selection",
|
||||||
"ctrl-c": "core:copy-selection-to-internal-clipboard",
|
"ctrl-c": "core:copy-selection-to-internal-clipboard",
|
||||||
"ctrl-x": "core:cut-selection-to-internal-clipboard",
|
"ctrl-x": "core:cut-selection-to-internal-clipboard",
|
||||||
"ctrl-v": "core:paste-from-internal-clipboard",
|
"ctrl-v": "core:paste-from-internal-clipboard",
|
||||||
"ctrl-z": "core:undo",
|
"ctrl-z": "core:undo",
|
||||||
"ctrl-y": "core:redo",
|
"ctrl-y": "core:redo",
|
||||||
"ctrl-a": "core:select-all-nodes",
|
"ctrl-a": "core:select-all-nodes",
|
||||||
|
"escape": "core:select-none",
|
||||||
|
"alt-s u": "core:select-upstream-nodes",
|
||||||
|
"alt-s d": "core:select-downstream-nodes",
|
||||||
|
"alt-s c": "core:select-connected-nodes",
|
||||||
"shift-?": "core:show-help",
|
"shift-?": "core:show-help",
|
||||||
"w": "core:scroll-view-up",
|
"w": "core:scroll-view-up",
|
||||||
"d": "core:scroll-view-right",
|
"d": "core:scroll-view-right",
|
||||||
@@ -53,19 +55,47 @@
|
|||||||
"shift-d": "core:step-view-right",
|
"shift-d": "core:step-view-right",
|
||||||
"shift-s": "core:step-view-down",
|
"shift-s": "core:step-view-down",
|
||||||
"shift-a": "core:step-view-left",
|
"shift-a": "core:step-view-left",
|
||||||
"up": "core:move-selection-up",
|
"ctrl-up": "core:move-selection-up",
|
||||||
"right": "core:move-selection-right",
|
"ctrl-right": "core:move-selection-right",
|
||||||
"down": "core:move-selection-down",
|
"ctrl-down": "core:move-selection-down",
|
||||||
"left": "core:move-selection-left",
|
"ctrl-left": "core:move-selection-left",
|
||||||
"shift-up": "core:step-selection-up",
|
"shift-up": "core:step-selection-up",
|
||||||
"shift-right": "core:step-selection-right",
|
"shift-right": "core:step-selection-right",
|
||||||
"shift-down": "core:step-selection-down",
|
"shift-down": "core:step-selection-down",
|
||||||
"shift-left": "core:step-selection-left",
|
"shift-left": "core:step-selection-left",
|
||||||
"ctrl-shift-j": "core:show-previous-tab",
|
"ctrl-[": "core:show-previous-tab",
|
||||||
"ctrl-shift-k": "core:show-next-tab",
|
"ctrl-]": "core:show-next-tab",
|
||||||
|
"ctrl-shift-left": "core:go-to-previous-location",
|
||||||
|
"ctrl-shift-right": "core:go-to-next-location",
|
||||||
"ctrl-shift-g": "core:group-selection",
|
"ctrl-shift-g": "core:group-selection",
|
||||||
"ctrl-shift-u": "core:ungroup-selection",
|
"ctrl-shift-u": "core:ungroup-selection",
|
||||||
"ctrl-shift-c": "core:copy-group-style",
|
"ctrl-shift-c": "core:copy-group-style",
|
||||||
"ctrl-shift-v": "core:paste-group-style"
|
"ctrl-shift-v": "core:paste-group-style",
|
||||||
|
"right": "core:go-to-nearest-node-on-right",
|
||||||
|
"left": "core:go-to-nearest-node-on-left",
|
||||||
|
"up": "core:go-to-nearest-node-above",
|
||||||
|
"down": "core:go-to-nearest-node-below",
|
||||||
|
"alt-a g": "core:align-selection-to-grid",
|
||||||
|
"alt-a l": "core:align-selection-to-left",
|
||||||
|
"alt-a r": "core:align-selection-to-right",
|
||||||
|
"alt-a t": "core:align-selection-to-top",
|
||||||
|
"alt-a b": "core:align-selection-to-bottom",
|
||||||
|
"alt-a m": "core:align-selection-to-middle",
|
||||||
|
"alt-a c": "core:align-selection-to-center",
|
||||||
|
"alt-a h": "core:distribute-selection-horizontally",
|
||||||
|
"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",
|
||||||
|
"alt-w": "core:hide-flow",
|
||||||
|
"alt-shift-w": "core:show-last-hidden-flow",
|
||||||
|
"ctrl-+": "core:zoom-in",
|
||||||
|
"ctrl--": "core:zoom-out",
|
||||||
|
"ctrl-0": "core:zoom-reset"
|
||||||
|
|
||||||
|
},
|
||||||
|
"red-ui-editor-stack": {
|
||||||
|
"ctrl-enter": "core:confirm-edit-tray",
|
||||||
|
"ctrl-escape": "core:cancel-edit-tray"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
46
packages/node_modules/@node-red/editor-client/src/js/plugins.js
vendored
Normal file
46
packages/node_modules/@node-red/editor-client/src/js/plugins.js
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
RED.plugins = (function() {
|
||||||
|
var plugins = {};
|
||||||
|
var pluginsByType = {};
|
||||||
|
|
||||||
|
function registerPlugin(id,definition) {
|
||||||
|
plugins[id] = definition;
|
||||||
|
if (definition.type) {
|
||||||
|
pluginsByType[definition.type] = pluginsByType[definition.type] || [];
|
||||||
|
pluginsByType[definition.type].push(definition);
|
||||||
|
}
|
||||||
|
if (RED._loadingModule) {
|
||||||
|
definition.module = RED._loadingModule;
|
||||||
|
definition["_"] = function() {
|
||||||
|
var args = Array.prototype.slice.call(arguments);
|
||||||
|
var originalKey = args[0];
|
||||||
|
if (!/:/.test(args[0])) {
|
||||||
|
args[0] = definition.module+":"+args[0];
|
||||||
|
}
|
||||||
|
var result = RED._.apply(null,args);
|
||||||
|
if (result === args[0]) {
|
||||||
|
return originalKey;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
definition["_"] = RED["_"]
|
||||||
|
}
|
||||||
|
if (definition.onadd && typeof definition.onadd === 'function') {
|
||||||
|
definition.onadd();
|
||||||
|
}
|
||||||
|
RED.events.emit("registry:plugin-added",id);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPlugin(id) {
|
||||||
|
return plugins[id]
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPluginsByType(type) {
|
||||||
|
return pluginsByType[type] || [];
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
registerPlugin: registerPlugin,
|
||||||
|
getPlugin: getPlugin,
|
||||||
|
getPluginsByType: getPluginsByType
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -52,6 +52,5 @@
|
|||||||
Set.prototype = _Set.prototype;
|
Set.prototype = _Set.prototype;
|
||||||
Set.prototype.constructor = Set;
|
Set.prototype.constructor = Set;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -15,19 +15,65 @@
|
|||||||
**/
|
**/
|
||||||
var RED = (function() {
|
var RED = (function() {
|
||||||
|
|
||||||
function appendNodeConfig(nodeConfig,done) {
|
|
||||||
|
function loadPluginList() {
|
||||||
|
loader.reportProgress(RED._("event.loadPlugins"), 10)
|
||||||
|
$.ajax({
|
||||||
|
headers: {
|
||||||
|
"Accept":"application/json"
|
||||||
|
},
|
||||||
|
cache: false,
|
||||||
|
url: 'plugins',
|
||||||
|
success: function(data) {
|
||||||
|
loader.reportProgress(RED._("event.loadPlugins"), 13)
|
||||||
|
RED.i18n.loadPluginCatalogs(function() {
|
||||||
|
loadPlugins(function() {
|
||||||
|
loadNodeList();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function loadPlugins(done) {
|
||||||
|
loader.reportProgress(RED._("event.loadPlugins",{count:""}), 17)
|
||||||
|
var lang = localStorage.getItem("editor-language")||RED.i18n.detectLanguage();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
headers: {
|
||||||
|
"Accept":"text/html",
|
||||||
|
"Accept-Language": lang
|
||||||
|
},
|
||||||
|
cache: false,
|
||||||
|
url: 'plugins',
|
||||||
|
success: function(data) {
|
||||||
|
var configs = data.trim().split(/(?=<!-- --- \[red-plugin:\S+\] --- -->)/);
|
||||||
|
var totalCount = configs.length;
|
||||||
|
var stepConfig = function() {
|
||||||
|
// loader.reportProgress(RED._("event.loadNodes",{count:(totalCount-configs.length)+"/"+totalCount}), 30 + ((totalCount-configs.length)/totalCount)*40 )
|
||||||
|
if (configs.length === 0) {
|
||||||
|
done();
|
||||||
|
} else {
|
||||||
|
var config = configs.shift();
|
||||||
|
appendPluginConfig(config,stepConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stepConfig();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function appendConfig(config, moduleIdMatch, targetContainer, done) {
|
||||||
done = done || function(){};
|
done = done || function(){};
|
||||||
var m = /<!-- --- \[red-module:(\S+)\] --- -->/.exec(nodeConfig.trim());
|
|
||||||
var moduleId;
|
var moduleId;
|
||||||
if (m) {
|
if (moduleIdMatch) {
|
||||||
moduleId = m[1];
|
moduleId = moduleIdMatch[1];
|
||||||
|
RED._loadingModule = moduleId;
|
||||||
} else {
|
} else {
|
||||||
moduleId = "unknown";
|
moduleId = "unknown";
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
var hasDeferred = false;
|
var hasDeferred = false;
|
||||||
|
var nodeConfigEls = $("<div>"+config+"</div>");
|
||||||
var nodeConfigEls = $("<div>"+nodeConfig+"</div>");
|
|
||||||
var scripts = nodeConfigEls.find("script");
|
var scripts = nodeConfigEls.find("script");
|
||||||
var scriptCount = scripts.length;
|
var scriptCount = scripts.length;
|
||||||
scripts.each(function(i,el) {
|
scripts.each(function(i,el) {
|
||||||
@@ -38,14 +84,15 @@ var RED = (function() {
|
|||||||
newScript.onload = function() {
|
newScript.onload = function() {
|
||||||
scriptCount--;
|
scriptCount--;
|
||||||
if (scriptCount === 0) {
|
if (scriptCount === 0) {
|
||||||
$("#red-ui-editor-node-configs").append(nodeConfigEls);
|
$(targetContainer).append(nodeConfigEls);
|
||||||
|
delete RED._loadingModule;
|
||||||
done()
|
done()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($(el).attr('type') === "module") {
|
if ($(el).attr('type') === "module") {
|
||||||
newScript.type = "module";
|
newScript.type = "module";
|
||||||
}
|
}
|
||||||
$("#red-ui-editor-node-configs").append(newScript);
|
$(targetContainer).append(newScript);
|
||||||
newScript.src = RED.settings.apiRootUrl+srcUrl;
|
newScript.src = RED.settings.apiRootUrl+srcUrl;
|
||||||
hasDeferred = true;
|
hasDeferred = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -61,7 +108,8 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
if (!hasDeferred) {
|
if (!hasDeferred) {
|
||||||
$("#red-ui-editor-node-configs").append(nodeConfigEls);
|
$(targetContainer).append(nodeConfigEls);
|
||||||
|
delete RED._loadingModule;
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
@@ -70,9 +118,27 @@ var RED = (function() {
|
|||||||
timeout: 10000
|
timeout: 10000
|
||||||
});
|
});
|
||||||
console.log("["+moduleId+"] "+err.toString());
|
console.log("["+moduleId+"] "+err.toString());
|
||||||
|
delete RED._loadingModule;
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function appendPluginConfig(pluginConfig,done) {
|
||||||
|
appendConfig(
|
||||||
|
pluginConfig,
|
||||||
|
/<!-- --- \[red-plugin:(\S+)\] --- -->/.exec(pluginConfig.trim()),
|
||||||
|
"#red-ui-editor-plugin-configs",
|
||||||
|
done
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function appendNodeConfig(nodeConfig,done) {
|
||||||
|
appendConfig(
|
||||||
|
nodeConfig,
|
||||||
|
/<!-- --- \[red-module:(\S+)\] --- -->/.exec(nodeConfig.trim()),
|
||||||
|
"#red-ui-editor-node-configs",
|
||||||
|
done
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function loadNodeList() {
|
function loadNodeList() {
|
||||||
loader.reportProgress(RED._("event.loadPalette"), 20)
|
loader.reportProgress(RED._("event.loadPalette"), 20)
|
||||||
@@ -110,7 +176,7 @@ var RED = (function() {
|
|||||||
|
|
||||||
function loadNodes() {
|
function loadNodes() {
|
||||||
loader.reportProgress(RED._("event.loadNodes",{count:""}), 30)
|
loader.reportProgress(RED._("event.loadNodes",{count:""}), 30)
|
||||||
var lang = localStorage.getItem("editor-language")||i18n.detectLanguage();
|
var lang = localStorage.getItem("editor-language")||RED.i18n.detectLanguage();
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
headers: {
|
headers: {
|
||||||
@@ -135,6 +201,7 @@ var RED = (function() {
|
|||||||
RED.projects.refresh(function(activeProject) {
|
RED.projects.refresh(function(activeProject) {
|
||||||
loadFlows(function() {
|
loadFlows(function() {
|
||||||
RED.sidebar.info.refresh()
|
RED.sidebar.info.refresh()
|
||||||
|
var showProjectWelcome = false;
|
||||||
if (!activeProject) {
|
if (!activeProject) {
|
||||||
// Projects enabled but no active project
|
// Projects enabled but no active project
|
||||||
RED.menu.setDisabled('menu-item-projects-open',true);
|
RED.menu.setDisabled('menu-item-projects-open',true);
|
||||||
@@ -142,10 +209,10 @@ var RED = (function() {
|
|||||||
if (activeProject === false) {
|
if (activeProject === false) {
|
||||||
// User previously decline the migration to projects.
|
// User previously decline the migration to projects.
|
||||||
} else { // null/undefined
|
} else { // null/undefined
|
||||||
RED.projects.showStartup();
|
showProjectWelcome = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
completeLoad();
|
completeLoad(showProjectWelcome);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -182,10 +249,56 @@ var RED = (function() {
|
|||||||
RED.nodes.import(nodes.flows);
|
RED.nodes.import(nodes.flows);
|
||||||
RED.nodes.dirty(false);
|
RED.nodes.dirty(false);
|
||||||
RED.view.redraw(true);
|
RED.view.redraw(true);
|
||||||
if (/^#flow\/.+$/.test(currentHash)) {
|
if (/^#(flow|node|group)\/.+$/.test(currentHash)) {
|
||||||
RED.workspaces.show(currentHash.substring(6));
|
const hashParts = currentHash.split('/')
|
||||||
|
const showEditDialog = hashParts.length > 2 && hashParts[2] === 'edit'
|
||||||
|
if (hashParts[0] === '#flow') {
|
||||||
|
RED.workspaces.show(hashParts[1], true);
|
||||||
|
if (showEditDialog) {
|
||||||
|
RED.workspaces.edit()
|
||||||
|
}
|
||||||
|
} else if (hashParts[0] === '#node') {
|
||||||
|
const nodeToShow = RED.nodes.node(hashParts[1])
|
||||||
|
if (nodeToShow) {
|
||||||
|
setTimeout(() => {
|
||||||
|
RED.view.reveal(nodeToShow.id)
|
||||||
|
window.location.hash = currentHash
|
||||||
|
RED.view.select(nodeToShow.id)
|
||||||
|
if (showEditDialog) {
|
||||||
|
RED.editor.edit(nodeToShow)
|
||||||
|
}
|
||||||
|
}, 50)
|
||||||
|
}
|
||||||
|
} else if (hashParts[0] === '#group') {
|
||||||
|
const nodeToShow = RED.nodes.group(hashParts[1])
|
||||||
|
if (nodeToShow) {
|
||||||
|
RED.view.reveal(nodeToShow.id)
|
||||||
|
window.location.hash = currentHash
|
||||||
|
RED.view.select(nodeToShow.id)
|
||||||
|
if (showEditDialog) {
|
||||||
|
RED.editor.editGroup(nodeToShow)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (RED.workspaces.count() > 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);
|
||||||
RED.notify(
|
RED.notify(
|
||||||
RED._("event.importError", {message: err.message}),
|
RED._("event.importError", {message: err.message}),
|
||||||
{
|
{
|
||||||
@@ -200,7 +313,7 @@ var RED = (function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function completeLoad() {
|
function completeLoad(showProjectWelcome) {
|
||||||
var persistentNotifications = {};
|
var persistentNotifications = {};
|
||||||
RED.comms.subscribe("notification/#",function(topic,msg) {
|
RED.comms.subscribe("notification/#",function(topic,msg) {
|
||||||
var parts = topic.split("/");
|
var parts = topic.split("/");
|
||||||
@@ -213,8 +326,12 @@ var RED = (function() {
|
|||||||
// handled below
|
// handled below
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (notificationId === "flows-run-state") {
|
||||||
|
// handled in editor-client/src/js/runtime.js
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (notificationId === "project-update") {
|
if (notificationId === "project-update") {
|
||||||
loader.start("Loading project",0)
|
loader.start(RED._("event.loadingProject"), 0);
|
||||||
RED.nodes.clear();
|
RED.nodes.clear();
|
||||||
RED.history.clear();
|
RED.history.clear();
|
||||||
RED.view.redraw(true);
|
RED.view.redraw(true);
|
||||||
@@ -233,6 +350,8 @@ var RED = (function() {
|
|||||||
loader.end()
|
loader.end()
|
||||||
RED.notify($("<p>").text(message));
|
RED.notify($("<p>").text(message));
|
||||||
RED.sidebar.info.refresh()
|
RED.sidebar.info.refresh()
|
||||||
|
RED.menu.setDisabled('menu-item-projects-open',false);
|
||||||
|
RED.menu.setDisabled('menu-item-projects-settings',false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -269,8 +388,27 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
// } else if (RED.settings.theme('palette.editable') !== false) {
|
// } else if (RED.settings.get('externalModules.palette.allowInstall', true) !== false) {
|
||||||
} else {
|
} else {
|
||||||
|
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"),
|
||||||
|
click: function() {
|
||||||
|
persistentNotifications[notificationId].hideNotification();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
} else if (msg.error === "missing-modules") {
|
||||||
|
text+="<ul><li>"+msg.modules.map(function(m) { return RED.utils.sanitize(m.module)+(m.error?(" - <small>"+RED.utils.sanitize(""+m.error)+"</small>"):"")}).join("</li><li>")+"</li></ul>";
|
||||||
options.buttons = [
|
options.buttons = [
|
||||||
{
|
{
|
||||||
text: RED._("common.label.close"),
|
text: RED._("common.label.close"),
|
||||||
@@ -279,7 +417,6 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
|
||||||
} else if (msg.error === "credentials_load_failed") {
|
} else if (msg.error === "credentials_load_failed") {
|
||||||
if (RED.settings.theme("projects.enabled",false)) {
|
if (RED.settings.theme("projects.enabled",false)) {
|
||||||
// projects enabled
|
// projects enabled
|
||||||
@@ -361,6 +498,15 @@ var RED = (function() {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (notificationId === 'restart-required') {
|
||||||
|
options.buttons = [
|
||||||
|
{
|
||||||
|
text: RED._("common.label.close"),
|
||||||
|
click: function() {
|
||||||
|
persistentNotifications[notificationId].hideNotification();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
if (!persistentNotifications.hasOwnProperty(notificationId)) {
|
if (!persistentNotifications.hasOwnProperty(notificationId)) {
|
||||||
persistentNotifications[notificationId] = RED.notify(text,options);
|
persistentNotifications[notificationId] = RED.notify(text,options);
|
||||||
@@ -371,12 +517,15 @@ var RED = (function() {
|
|||||||
persistentNotifications[notificationId].close();
|
persistentNotifications[notificationId].close();
|
||||||
delete persistentNotifications[notificationId];
|
delete persistentNotifications[notificationId];
|
||||||
}
|
}
|
||||||
|
if (notificationId === 'runtime-state') {
|
||||||
|
RED.events.emit("runtime-state",msg);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
RED.comms.subscribe("status/#",function(topic,msg) {
|
RED.comms.subscribe("status/#",function(topic,msg) {
|
||||||
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;
|
||||||
@@ -385,19 +534,33 @@ var RED = (function() {
|
|||||||
RED.view.redrawStatus(node);
|
RED.view.redrawStatus(node);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let pendingNodeRemovedNotifications = []
|
||||||
|
let pendingNodeRemovedTimeout
|
||||||
|
|
||||||
RED.comms.subscribe("notification/node/#",function(topic,msg) {
|
RED.comms.subscribe("notification/node/#",function(topic,msg) {
|
||||||
var i,m;
|
var i,m;
|
||||||
var typeList;
|
var typeList;
|
||||||
var info;
|
var info;
|
||||||
if (topic == "notification/node/added") {
|
if (topic == "notification/node/added") {
|
||||||
|
RED.settings.refreshSettings(function(err, data) {
|
||||||
var addedTypes = [];
|
var addedTypes = [];
|
||||||
msg.forEach(function(m) {
|
msg.forEach(function(m) {
|
||||||
var id = m.id;
|
var id = m.id;
|
||||||
RED.nodes.addNodeSet(m);
|
RED.nodes.addNodeSet(m);
|
||||||
addedTypes = addedTypes.concat(m.types);
|
addedTypes = addedTypes.concat(m.types);
|
||||||
RED.i18n.loadNodeCatalog(id, function() {
|
RED.i18n.loadNodeCatalog(id, function() {
|
||||||
$.get('nodes/'+id, function(data) {
|
var lang = localStorage.getItem("editor-language")||RED.i18n.detectLanguage();
|
||||||
|
$.ajax({
|
||||||
|
headers: {
|
||||||
|
"Accept":"text/html",
|
||||||
|
"Accept-Language": lang
|
||||||
|
},
|
||||||
|
cache: false,
|
||||||
|
url: 'nodes/'+id,
|
||||||
|
success: function(data) {
|
||||||
appendNodeConfig(data);
|
appendNodeConfig(data);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -406,30 +569,49 @@ var RED = (function() {
|
|||||||
RED.notify(RED._("palette.event.nodeAdded", {count:addedTypes.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeAdded", {count:addedTypes.length})+typeList,"success");
|
||||||
}
|
}
|
||||||
loadIconList();
|
loadIconList();
|
||||||
|
})
|
||||||
} else if (topic == "notification/node/removed") {
|
} else if (topic == "notification/node/removed") {
|
||||||
for (i=0;i<msg.length;i++) {
|
for (i=0;i<msg.length;i++) {
|
||||||
m = msg[i];
|
m = msg[i];
|
||||||
info = RED.nodes.removeNodeSet(m.id);
|
info = RED.nodes.removeNodeSet(m.id);
|
||||||
if (info.added) {
|
if (info.added) {
|
||||||
typeList = "<ul><li>"+m.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
pendingNodeRemovedNotifications = pendingNodeRemovedNotifications.concat(m.types.map(RED.utils.sanitize))
|
||||||
RED.notify(RED._("palette.event.nodeRemoved", {count:m.types.length})+typeList,"success");
|
if (pendingNodeRemovedTimeout) {
|
||||||
|
clearTimeout(pendingNodeRemovedTimeout)
|
||||||
|
}
|
||||||
|
pendingNodeRemovedTimeout = setTimeout(function () {
|
||||||
|
typeList = "<ul><li>"+pendingNodeRemovedNotifications.join("</li><li>")+"</li></ul>";
|
||||||
|
RED.notify(RED._("palette.event.nodeRemoved", {count:pendingNodeRemovedNotifications.length})+typeList,"success");
|
||||||
|
pendingNodeRemovedNotifications = []
|
||||||
|
}, 200)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loadIconList();
|
loadIconList();
|
||||||
} else if (topic == "notification/node/enabled") {
|
} else if (topic == "notification/node/enabled") {
|
||||||
if (msg.types) {
|
if (msg.types) {
|
||||||
|
RED.settings.refreshSettings(function(err, data) {
|
||||||
info = RED.nodes.getNodeSet(msg.id);
|
info = RED.nodes.getNodeSet(msg.id);
|
||||||
if (info.added) {
|
if (info.added) {
|
||||||
RED.nodes.enableNodeSet(msg.id);
|
RED.nodes.enableNodeSet(msg.id);
|
||||||
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeEnabled", {count:msg.types.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeEnabled", {count:msg.types.length})+typeList,"success");
|
||||||
} else {
|
} else {
|
||||||
$.get('nodes/'+msg.id, function(data) {
|
var lang = localStorage.getItem("editor-language")||RED.i18n.detectLanguage();
|
||||||
|
$.ajax({
|
||||||
|
headers: {
|
||||||
|
"Accept":"text/html",
|
||||||
|
"Accept-Language": lang
|
||||||
|
},
|
||||||
|
cache: false,
|
||||||
|
url: 'nodes/'+msg.id,
|
||||||
|
success: function(data) {
|
||||||
appendNodeConfig(data);
|
appendNodeConfig(data);
|
||||||
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
|
||||||
RED.notify(RED._("palette.event.nodeAdded", {count:msg.types.length})+typeList,"success");
|
RED.notify(RED._("palette.event.nodeAdded", {count:msg.types.length})+typeList,"success");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else if (topic == "notification/node/disabled") {
|
} else if (topic == "notification/node/disabled") {
|
||||||
if (msg.types) {
|
if (msg.types) {
|
||||||
@@ -449,19 +631,28 @@ var RED = (function() {
|
|||||||
|
|
||||||
$(".red-ui-header-toolbar").show();
|
$(".red-ui-header-toolbar").show();
|
||||||
|
|
||||||
|
RED.sidebar.show(":first", true);
|
||||||
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
loader.end();
|
loader.end();
|
||||||
|
checkFirstRun(function() {
|
||||||
|
if (showProjectWelcome) {
|
||||||
|
RED.projects.showStartup();
|
||||||
|
}
|
||||||
|
});
|
||||||
},100);
|
},100);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showAbout() {
|
function checkFirstRun(done) {
|
||||||
$.get('red/about', function(data) {
|
if (RED.settings.theme("tours") === false) {
|
||||||
var aboutHeader = '<div style="text-align:center;">'+
|
done();
|
||||||
'<img width="50px" src="red/images/node-red-icon.svg" />'+
|
return;
|
||||||
'</div>';
|
}
|
||||||
|
if (!RED.settings.get("editor.view.view-show-welcome-tours", true)) {
|
||||||
RED.sidebar.help.set(aboutHeader+RED.utils.renderMarkdown(data));
|
done();
|
||||||
});
|
return;
|
||||||
|
}
|
||||||
|
RED.actions.invoke("core:show-welcome-tour", RED.settings.get("editor.tours.welcome"), done);
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildMainMenu() {
|
function buildMainMenu() {
|
||||||
@@ -473,6 +664,25 @@ var RED = (function() {
|
|||||||
{id:"menu-item-projects-settings",label:RED._("menu.label.projects-settings"),disabled:false,onselect:"core:show-project-settings"}
|
{id:"menu-item-projects-settings",label:RED._("menu.label.projects-settings"),disabled:false,onselect:"core:show-project-settings"}
|
||||||
]});
|
]});
|
||||||
}
|
}
|
||||||
|
menuOptions.push({id:"menu-item-edit-menu", label:RED._("menu.label.edit"), options: [
|
||||||
|
{id: "menu-item-edit-undo", label:RED._("keyboard.undoChange"), disabled: true, onselect: "core:undo"},
|
||||||
|
{id: "menu-item-edit-redo", label:RED._("keyboard.redoChange"), disabled: true, onselect: "core:redo"},
|
||||||
|
null,
|
||||||
|
{id: "menu-item-edit-cut", label:RED._("keyboard.cutNode"), onselect: "core:cut-selection-to-internal-clipboard"},
|
||||||
|
{id: "menu-item-edit-copy", label:RED._("keyboard.copyNode"), onselect: "core:copy-selection-to-internal-clipboard"},
|
||||||
|
{id: "menu-item-edit-paste", label:RED._("keyboard.pasteNode"), disabled: true, onselect: "core:paste-from-internal-clipboard"},
|
||||||
|
null,
|
||||||
|
{id: "menu-item-edit-copy-group-style", label:RED._("keyboard.copyGroupStyle"), onselect: "core:copy-group-style"},
|
||||||
|
{id: "menu-item-edit-paste-group-style", label:RED._("keyboard.pasteGroupStyle"), disabled: true, onselect: "core:paste-group-style"},
|
||||||
|
null,
|
||||||
|
{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-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:[
|
||||||
{id:"menu-item-palette",label:RED._("menu.label.palette.show"),toggle:true,onselect:"core:toggle-palette", selected: true},
|
{id:"menu-item-palette",label:RED._("menu.label.palette.show"),toggle:true,onselect:"core:toggle-palette", selected: true},
|
||||||
{id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true},
|
{id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true},
|
||||||
@@ -480,6 +690,25 @@ var RED = (function() {
|
|||||||
{id:"menu-item-action-list",label:RED._("keyboard.actionList"),onselect:"core:show-action-list"},
|
{id:"menu-item-action-list",label:RED._("keyboard.actionList"),onselect:"core:show-action-list"},
|
||||||
null
|
null
|
||||||
]});
|
]});
|
||||||
|
|
||||||
|
menuOptions.push({id:"menu-item-arrange-menu", label:RED._("menu.label.arrange"), options: [
|
||||||
|
{id: "menu-item-view-tools-align-left", label:RED._("menu.label.alignLeft"), disabled: true, onselect: "core:align-selection-to-left"},
|
||||||
|
{id: "menu-item-view-tools-align-center", label:RED._("menu.label.alignCenter"), disabled: true, onselect: "core:align-selection-to-center"},
|
||||||
|
{id: "menu-item-view-tools-align-right", label:RED._("menu.label.alignRight"), disabled: true, onselect: "core:align-selection-to-right"},
|
||||||
|
null,
|
||||||
|
{id: "menu-item-view-tools-align-top", label:RED._("menu.label.alignTop"), disabled: true, onselect: "core:align-selection-to-top"},
|
||||||
|
{id: "menu-item-view-tools-align-middle", label:RED._("menu.label.alignMiddle"), disabled: true, onselect: "core:align-selection-to-middle"},
|
||||||
|
{id: "menu-item-view-tools-align-bottom", label:RED._("menu.label.alignBottom"), disabled: true, onselect: "core:align-selection-to-bottom"},
|
||||||
|
null,
|
||||||
|
{id: "menu-item-view-tools-distribute-horizontally", label:RED._("menu.label.distributeHorizontally"), disabled: true, onselect: "core:distribute-selection-horizontally"},
|
||||||
|
{id: "menu-item-view-tools-distribute-veritcally", label:RED._("menu.label.distributeVertically"), disabled: true, onselect: "core:distribute-selection-vertically"},
|
||||||
|
null,
|
||||||
|
{id: "menu-item-view-tools-move-to-back", label:RED._("menu.label.moveToBack"), disabled: true, onselect: "core:move-selection-to-back"},
|
||||||
|
{id: "menu-item-view-tools-move-to-front", label:RED._("menu.label.moveToFront"), disabled: true, onselect: "core:move-selection-to-front"},
|
||||||
|
{id: "menu-item-view-tools-move-backwards", label:RED._("menu.label.moveBackwards"), disabled: true, onselect: "core:move-selection-backwards"},
|
||||||
|
{id: "menu-item-view-tools-move-forwards", label:RED._("menu.label.moveForwards"), disabled: true, onselect: "core:move-selection-forwards"}
|
||||||
|
]});
|
||||||
|
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
if (RED.settings.theme("menu.menu-item-import-library", true)) {
|
if (RED.settings.theme("menu.menu-item-import-library", true)) {
|
||||||
menuOptions.push({id: "menu-item-import", label: RED._("menu.label.import"), onselect: "core:show-import-dialog"});
|
menuOptions.push({id: "menu-item-import", label: RED._("menu.label.import"), onselect: "core:show-import-dialog"});
|
||||||
@@ -493,7 +722,7 @@ var RED = (function() {
|
|||||||
menuOptions.push({id:"menu-item-config-nodes",label:RED._("menu.label.displayConfig"),onselect:"core:show-config-tab"});
|
menuOptions.push({id:"menu-item-config-nodes",label:RED._("menu.label.displayConfig"),onselect:"core:show-config-tab"});
|
||||||
menuOptions.push({id:"menu-item-workspace",label:RED._("menu.label.flows"),options:[
|
menuOptions.push({id:"menu-item-workspace",label:RED._("menu.label.flows"),options:[
|
||||||
{id:"menu-item-workspace-add",label:RED._("menu.label.add"),onselect:"core:add-flow"},
|
{id:"menu-item-workspace-add",label:RED._("menu.label.add"),onselect:"core:add-flow"},
|
||||||
{id:"menu-item-workspace-edit",label:RED._("menu.label.rename"),onselect:"core:edit-flow"},
|
{id:"menu-item-workspace-edit",label:RED._("menu.label.edit"),onselect:"core:edit-flow"},
|
||||||
{id:"menu-item-workspace-delete",label:RED._("menu.label.delete"),onselect:"core:remove-flow"}
|
{id:"menu-item-workspace-delete",label:RED._("menu.label.delete"),onselect:"core:remove-flow"}
|
||||||
]});
|
]});
|
||||||
menuOptions.push({id:"menu-item-subflow",label:RED._("menu.label.subflows"), options: [
|
menuOptions.push({id:"menu-item-subflow",label:RED._("menu.label.subflows"), options: [
|
||||||
@@ -509,7 +738,7 @@ var RED = (function() {
|
|||||||
]});
|
]});
|
||||||
|
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
if (RED.settings.theme('palette.editable') !== false) {
|
if (RED.settings.get('externalModules.palette.allowInstall', true) !== false) {
|
||||||
menuOptions.push({id:"menu-item-edit-palette",label:RED._("menu.label.editPalette"),onselect:"core:manage-palette"});
|
menuOptions.push({id:"menu-item-edit-palette",label:RED._("menu.label.editPalette"),onselect:"core:manage-palette"});
|
||||||
menuOptions.push(null);
|
menuOptions.push(null);
|
||||||
}
|
}
|
||||||
@@ -522,7 +751,7 @@ var RED = (function() {
|
|||||||
}
|
}
|
||||||
menuOptions.push({id:"menu-item-help",
|
menuOptions.push({id:"menu-item-help",
|
||||||
label: RED.settings.theme("menu.menu-item-help.label",RED._("menu.label.help")),
|
label: RED.settings.theme("menu.menu-item-help.label",RED._("menu.label.help")),
|
||||||
href: RED.settings.theme("menu.menu-item-help.url","http://nodered.org/docs")
|
href: RED.settings.theme("menu.menu-item-help.url","https://nodered.org/docs")
|
||||||
});
|
});
|
||||||
menuOptions.push({id:"menu-item-node-red-version", label:"v"+RED.settings.version, onselect: "core:show-about" });
|
menuOptions.push({id:"menu-item-node-red-version", label:"v"+RED.settings.version, onselect: "core:show-about" });
|
||||||
|
|
||||||
@@ -540,11 +769,10 @@ var RED = (function() {
|
|||||||
RED.user.init();
|
RED.user.init();
|
||||||
RED.notifications.init();
|
RED.notifications.init();
|
||||||
RED.library.init();
|
RED.library.init();
|
||||||
RED.keyboard.init();
|
|
||||||
RED.palette.init();
|
RED.palette.init();
|
||||||
RED.eventLog.init();
|
RED.eventLog.init();
|
||||||
|
|
||||||
if (RED.settings.theme('palette.editable') !== false) {
|
if (RED.settings.get('externalModules.palette.allowInstall', true) !== false) {
|
||||||
RED.palette.editor.init();
|
RED.palette.editor.init();
|
||||||
} else {
|
} else {
|
||||||
console.log("Palette editor disabled");
|
console.log("Palette editor disabled");
|
||||||
@@ -564,22 +792,22 @@ 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();
|
||||||
|
|
||||||
|
|
||||||
RED.deploy.init(RED.settings.theme("deployButton",null));
|
RED.deploy.init(RED.settings.theme("deployButton",null));
|
||||||
|
|
||||||
buildMainMenu();
|
RED.keyboard.init(buildMainMenu);
|
||||||
|
RED.envVar.init();
|
||||||
|
|
||||||
RED.nodes.init();
|
RED.nodes.init();
|
||||||
|
RED.runtime.init()
|
||||||
RED.comms.connect();
|
RED.comms.connect();
|
||||||
|
|
||||||
$("#red-ui-main-container").show();
|
$("#red-ui-main-container").show();
|
||||||
|
|
||||||
|
loadPluginList();
|
||||||
RED.actions.add("core:show-about", showAbout);
|
|
||||||
|
|
||||||
loadNodeList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -590,11 +818,12 @@ var RED = (function() {
|
|||||||
$('<div id="red-ui-header-shade" class="hide"></div>').appendTo(header);
|
$('<div id="red-ui-header-shade" class="hide"></div>').appendTo(header);
|
||||||
$('<div id="red-ui-main-container" class="red-ui-sidebar-closed hide">'+
|
$('<div id="red-ui-main-container" class="red-ui-sidebar-closed hide">'+
|
||||||
'<div id="red-ui-workspace"></div>'+
|
'<div id="red-ui-workspace"></div>'+
|
||||||
'<div id="red-ui-editor-stack"></div>'+
|
'<div id="red-ui-editor-stack" tabindex="-1"></div>'+
|
||||||
'<div id="red-ui-palette"></div>'+
|
'<div id="red-ui-palette"></div>'+
|
||||||
'<div id="red-ui-sidebar"></div>'+
|
'<div id="red-ui-sidebar"></div>'+
|
||||||
'<div id="red-ui-sidebar-separator"></div>'+
|
'<div id="red-ui-sidebar-separator"></div>'+
|
||||||
'</div>').appendTo(options.target);
|
'</div>').appendTo(options.target);
|
||||||
|
$('<div id="red-ui-editor-plugin-configs"></div>').appendTo(options.target);
|
||||||
$('<div id="red-ui-editor-node-configs"></div>').appendTo(options.target);
|
$('<div id="red-ui-editor-node-configs"></div>').appendTo(options.target);
|
||||||
$('<div id="red-ui-full-shade" class="hide"></div>').appendTo(options.target);
|
$('<div id="red-ui-full-shade" class="hide"></div>').appendTo(options.target);
|
||||||
|
|
||||||
@@ -613,9 +842,12 @@ var RED = (function() {
|
|||||||
$('<span>').html(theme.header.title).appendTo(logo);
|
$('<span>').html(theme.header.title).appendTo(logo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (theme.themes) {
|
||||||
|
knownThemes = theme.themes;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
var knownThemes = null;
|
||||||
var initialised = false;
|
var initialised = false;
|
||||||
|
|
||||||
function init(options) {
|
function init(options) {
|
||||||
@@ -623,7 +855,7 @@ var RED = (function() {
|
|||||||
throw new Error("RED already initialised");
|
throw new Error("RED already initialised");
|
||||||
}
|
}
|
||||||
initialised = true;
|
initialised = true;
|
||||||
ace.require("ace/ext/language_tools");
|
if(window.ace) { window.ace.require("ace/ext/language_tools"); }
|
||||||
options = options || {};
|
options = options || {};
|
||||||
options.apiRootUrl = options.apiRootUrl || "";
|
options.apiRootUrl = options.apiRootUrl || "";
|
||||||
if (options.apiRootUrl && !/\/$/.test(options.apiRootUrl)) {
|
if (options.apiRootUrl && !/\/$/.test(options.apiRootUrl)) {
|
||||||
@@ -635,7 +867,13 @@ var RED = (function() {
|
|||||||
buildEditor(options);
|
buildEditor(options);
|
||||||
|
|
||||||
RED.i18n.init(options, function() {
|
RED.i18n.init(options, function() {
|
||||||
RED.settings.init(options, loadEditor);
|
RED.settings.init(options, function() {
|
||||||
|
if (knownThemes) {
|
||||||
|
RED.settings.editorTheme = RED.settings.editorTheme || {};
|
||||||
|
RED.settings.editorTheme.themes = knownThemes;
|
||||||
|
}
|
||||||
|
loadEditor();
|
||||||
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
36
packages/node_modules/@node-red/editor-client/src/js/runtime.js
vendored
Normal file
36
packages/node_modules/@node-red/editor-client/src/js/runtime.js
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
RED.runtime = (function() {
|
||||||
|
let state = ""
|
||||||
|
let settings = { ui: false, enabled: false };
|
||||||
|
const STOPPED = "stop"
|
||||||
|
const STARTED = "start"
|
||||||
|
const SAFE = "safe"
|
||||||
|
|
||||||
|
return {
|
||||||
|
init: function() {
|
||||||
|
// refresh the current runtime status from server
|
||||||
|
settings = Object.assign({}, settings, RED.settings.runtimeState);
|
||||||
|
RED.events.on("runtime-state", function(msg) {
|
||||||
|
if (msg.state) {
|
||||||
|
const currentState = state
|
||||||
|
state = msg.state
|
||||||
|
$(".red-ui-flow-node-button").toggleClass("red-ui-flow-node-button-stopped", state !== STARTED)
|
||||||
|
if(settings.enabled === true && settings.ui === true) {
|
||||||
|
RED.menu.setVisible("deploymenu-item-runtime-stop", state === STARTED)
|
||||||
|
RED.menu.setVisible("deploymenu-item-runtime-start", state !== STARTED)
|
||||||
|
}
|
||||||
|
// Do not notify the user about this event if:
|
||||||
|
// - This is the very first event we've received after loading the editor (currentState = '')
|
||||||
|
// - The state matches what we already thought was the case (state === currentState)
|
||||||
|
// - The event was triggered by a deploy (msg.deploy === true)
|
||||||
|
// - The event is a safe mode event - that gets notified separately
|
||||||
|
if (currentState !== '' && state !== currentState && !msg.deploy && state !== SAFE) {
|
||||||
|
RED.notify(RED._("notification.state.flows"+(state === STOPPED?'Stopped':'Started'), msg), "success")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
get started() {
|
||||||
|
return state === STARTED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
||||||
@@ -19,7 +19,6 @@ RED.settings = (function () {
|
|||||||
|
|
||||||
var loadedSettings = {};
|
var loadedSettings = {};
|
||||||
var userSettings = {};
|
var userSettings = {};
|
||||||
var settingsDirty = false;
|
|
||||||
var pendingSave;
|
var pendingSave;
|
||||||
|
|
||||||
var hasLocalStorage = function () {
|
var hasLocalStorage = function () {
|
||||||
@@ -34,8 +33,8 @@ RED.settings = (function () {
|
|||||||
if (!hasLocalStorage()) {
|
if (!hasLocalStorage()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (key === "auth-tokens") {
|
if (key.startsWith("auth-tokens")) {
|
||||||
localStorage.setItem(key, JSON.stringify(value));
|
localStorage.setItem(key+this.authTokensSuffix, JSON.stringify(value));
|
||||||
} else {
|
} else {
|
||||||
RED.utils.setMessageProperty(userSettings,key,value);
|
RED.utils.setMessageProperty(userSettings,key,value);
|
||||||
saveUserSettings();
|
saveUserSettings();
|
||||||
@@ -53,16 +52,15 @@ RED.settings = (function () {
|
|||||||
if (!hasLocalStorage()) {
|
if (!hasLocalStorage()) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
if (key === "auth-tokens") {
|
if (key.startsWith("auth-tokens")) {
|
||||||
return JSON.parse(localStorage.getItem(key));
|
return JSON.parse(localStorage.getItem(key+this.authTokensSuffix));
|
||||||
} else {
|
} else {
|
||||||
var v;
|
var v;
|
||||||
try {
|
try { v = RED.utils.getMessageProperty(userSettings,key); } catch(err) {}
|
||||||
v = RED.utils.getMessageProperty(userSettings,key);
|
|
||||||
if (v === undefined) {
|
if (v === undefined) {
|
||||||
v = defaultIfUndefined;
|
try { v = RED.utils.getMessageProperty(RED.settings,key); } catch(err) {}
|
||||||
}
|
}
|
||||||
} catch(err) {
|
if (v === undefined) {
|
||||||
v = defaultIfUndefined;
|
v = defaultIfUndefined;
|
||||||
}
|
}
|
||||||
return v;
|
return v;
|
||||||
@@ -73,8 +71,8 @@ RED.settings = (function () {
|
|||||||
if (!hasLocalStorage()) {
|
if (!hasLocalStorage()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (key === "auth-tokens") {
|
if (key.startsWith("auth-tokens")) {
|
||||||
localStorage.removeItem(key);
|
localStorage.removeItem(key+this.authTokensSuffix);
|
||||||
} else {
|
} else {
|
||||||
delete userSettings[key];
|
delete userSettings[key];
|
||||||
saveUserSettings();
|
saveUserSettings();
|
||||||
@@ -101,6 +99,8 @@ RED.settings = (function () {
|
|||||||
|
|
||||||
var init = function (options, done) {
|
var init = function (options, done) {
|
||||||
var accessTokenMatch = /[?&]access_token=(.*?)(?:$|&)/.exec(window.location.search);
|
var accessTokenMatch = /[?&]access_token=(.*?)(?:$|&)/.exec(window.location.search);
|
||||||
|
var path=window.location.pathname.slice(0,-1);
|
||||||
|
RED.settings.authTokensSuffix=path.replace(/\//g, '-');
|
||||||
if (accessTokenMatch) {
|
if (accessTokenMatch) {
|
||||||
var accessToken = accessTokenMatch[1];
|
var accessToken = accessTokenMatch[1];
|
||||||
RED.settings.set("auth-tokens",{access_token: accessToken});
|
RED.settings.set("auth-tokens",{access_token: accessToken});
|
||||||
@@ -127,7 +127,7 @@ RED.settings = (function () {
|
|||||||
load(done);
|
load(done);
|
||||||
}
|
}
|
||||||
|
|
||||||
var load = function(done) {
|
var refreshSettings = function(done) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
headers: {
|
headers: {
|
||||||
"Accept": "application/json"
|
"Accept": "application/json"
|
||||||
@@ -137,6 +137,23 @@ RED.settings = (function () {
|
|||||||
url: 'settings',
|
url: 'settings',
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
setProperties(data);
|
setProperties(data);
|
||||||
|
done(null, data);
|
||||||
|
},
|
||||||
|
error: function(jqXHR,textStatus,errorThrown) {
|
||||||
|
if (jqXHR.status === 401) {
|
||||||
|
if (/[?&]access_token=(.*?)(?:$|&)/.test(window.location.search)) {
|
||||||
|
window.location.search = "";
|
||||||
|
}
|
||||||
|
RED.user.login(function() { refreshSettings(done); });
|
||||||
|
} else {
|
||||||
|
console.log("Unexpected error loading settings:",jqXHR.status,textStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var load = function(done) {
|
||||||
|
refreshSettings(function(err, data) {
|
||||||
|
if (!err) {
|
||||||
if (!RED.settings.user || RED.settings.user.anonymous) {
|
if (!RED.settings.user || RED.settings.user.anonymous) {
|
||||||
RED.settings.remove("auth-tokens");
|
RED.settings.remove("auth-tokens");
|
||||||
}
|
}
|
||||||
@@ -144,22 +161,13 @@ RED.settings = (function () {
|
|||||||
console.groupCollapsed("Versions");
|
console.groupCollapsed("Versions");
|
||||||
console.log("jQuery",$().jquery)
|
console.log("jQuery",$().jquery)
|
||||||
console.log("jQuery UI",$.ui.version);
|
console.log("jQuery UI",$.ui.version);
|
||||||
console.log("ACE",ace.version);
|
if(window.ace) { console.log("ACE",ace.version); }
|
||||||
|
if(window.monaco) { console.log("MONACO",monaco.version || "unknown"); }
|
||||||
console.log("D3",d3.version);
|
console.log("D3",d3.version);
|
||||||
console.groupEnd();
|
console.groupEnd();
|
||||||
loadUserSettings(done);
|
loadUserSettings(done);
|
||||||
},
|
|
||||||
error: function(jqXHR,textStatus,errorThrown) {
|
|
||||||
if (jqXHR.status === 401) {
|
|
||||||
if (/[?&]access_token=(.*?)(?:$|&)/.test(window.location.search)) {
|
|
||||||
window.location.search = "";
|
|
||||||
}
|
}
|
||||||
RED.user.login(function() { load(done); });
|
})
|
||||||
} else {
|
|
||||||
console.log("Unexpected error loading settings:",jqXHR.status,textStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function loadUserSettings(done) {
|
function loadUserSettings(done) {
|
||||||
@@ -220,14 +228,28 @@ RED.settings = (function () {
|
|||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function getLocal(key) {
|
||||||
|
return localStorage.getItem(key)
|
||||||
|
}
|
||||||
|
function setLocal(key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
}
|
||||||
|
function removeLocal(key) {
|
||||||
|
localStorage.removeItem(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
init: init,
|
init: init,
|
||||||
load: load,
|
load: load,
|
||||||
loadUserSettings: loadUserSettings,
|
loadUserSettings: loadUserSettings,
|
||||||
|
refreshSettings: refreshSettings,
|
||||||
set: set,
|
set: set,
|
||||||
get: get,
|
get: get,
|
||||||
remove: remove,
|
remove: remove,
|
||||||
theme: theme
|
theme: theme,
|
||||||
|
setLocal: setLocal,
|
||||||
|
getLocal: getLocal,
|
||||||
|
removeLocal: removeLocal
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ RED.actionList = (function() {
|
|||||||
var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog);
|
var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog);
|
||||||
searchInput = $('<input type="text" data-i18n="[placeholder]keyboard.filterActions">').appendTo(searchDiv).searchBox({
|
searchInput = $('<input type="text" data-i18n="[placeholder]keyboard.filterActions">').appendTo(searchDiv).searchBox({
|
||||||
change: function() {
|
change: function() {
|
||||||
filterTerm = $(this).val().trim();
|
filterTerm = $(this).val().trim().toLowerCase();
|
||||||
filterTerms = filterTerm.split(" ");
|
filterTerms = filterTerm.split(" ");
|
||||||
searchResults.editableList('filter');
|
searchResults.editableList('filter');
|
||||||
searchResults.find("li.selected").removeClass("selected");
|
searchResults.find("li.selected").removeClass("selected");
|
||||||
@@ -151,7 +151,6 @@ RED.actionList = (function() {
|
|||||||
}
|
}
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
previousActiveElement = document.activeElement;
|
previousActiveElement = document.activeElement;
|
||||||
RED.keyboard.add("*","escape",function(){hide()});
|
|
||||||
$("#red-ui-header-shade").show();
|
$("#red-ui-header-shade").show();
|
||||||
$("#red-ui-editor-shade").show();
|
$("#red-ui-editor-shade").show();
|
||||||
$("#red-ui-palette-shade").show();
|
$("#red-ui-palette-shade").show();
|
||||||
@@ -161,18 +160,19 @@ RED.actionList = (function() {
|
|||||||
createDialog();
|
createDialog();
|
||||||
}
|
}
|
||||||
dialog.slideDown(300);
|
dialog.slideDown(300);
|
||||||
searchInput.searchBox('value',v)
|
searchInput.searchBox('value',v);
|
||||||
searchResults.editableList('empty');
|
searchResults.editableList('empty');
|
||||||
results = [];
|
results = [];
|
||||||
var actions = RED.actions.list();
|
var actions = RED.actions.list();
|
||||||
actions.sort(function(A,B) {
|
actions.sort(function(A,B) {
|
||||||
return A.id.localeCompare(B.id);
|
var Akey = A.label;
|
||||||
|
var Bkey = B.label;
|
||||||
|
return Akey.localeCompare(Bkey);
|
||||||
});
|
});
|
||||||
actions.forEach(function(action) {
|
actions.forEach(function(action) {
|
||||||
action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()});
|
|
||||||
action._label = action.label.toLowerCase();
|
action._label = action.label.toLowerCase();
|
||||||
searchResults.editableList('addItem',action)
|
searchResults.editableList('addItem',action);
|
||||||
})
|
});
|
||||||
RED.events.emit("actionList:open");
|
RED.events.emit("actionList:open");
|
||||||
visible = true;
|
visible = true;
|
||||||
}
|
}
|
||||||
@@ -185,7 +185,6 @@ RED.actionList = (function() {
|
|||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
RED.keyboard.remove("escape");
|
|
||||||
visible = false;
|
visible = false;
|
||||||
$("#red-ui-header-shade").hide();
|
$("#red-ui-header-shade").hide();
|
||||||
$("#red-ui-editor-shade").hide();
|
$("#red-ui-editor-shade").hide();
|
||||||
@@ -215,6 +214,9 @@ RED.actionList = (function() {
|
|||||||
RED.events.on("type-search:open",function() { disabled = true; });
|
RED.events.on("type-search:open",function() { disabled = true; });
|
||||||
RED.events.on("type-search:close",function() { disabled = false; });
|
RED.events.on("type-search:close",function() { disabled = false; });
|
||||||
|
|
||||||
|
RED.keyboard.add("red-ui-actionList","escape",function(){hide()});
|
||||||
|
|
||||||
|
|
||||||
$("#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);
|
||||||
|
|||||||
@@ -1,25 +1,67 @@
|
|||||||
RED.actions = (function() {
|
RED.actions = (function() {
|
||||||
var actions = {
|
var actions = {
|
||||||
|
|
||||||
}
|
};
|
||||||
|
|
||||||
function addAction(name,handler) {
|
function addAction(name,handler,options) {
|
||||||
actions[name] = handler;
|
if (typeof handler !== 'function') {
|
||||||
|
throw new Error("Action handler not a function");
|
||||||
|
}
|
||||||
|
if (actions[name]) {
|
||||||
|
throw new Error("Cannot override existing action");
|
||||||
|
}
|
||||||
|
actions[name] = {
|
||||||
|
handler: handler,
|
||||||
|
options: options,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
function removeAction(name) {
|
function removeAction(name) {
|
||||||
delete actions[name];
|
delete actions[name];
|
||||||
}
|
}
|
||||||
function getAction(name) {
|
function getAction(name) {
|
||||||
return actions[name];
|
return actions[name].handler;
|
||||||
}
|
}
|
||||||
function invokeAction(name,args) {
|
function getActionLabel(name) {
|
||||||
|
let def = actions[name]
|
||||||
|
if (!def) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (!def.label) {
|
||||||
|
var options = def.options;
|
||||||
|
var key = options ? options.label : undefined;
|
||||||
|
if (!key) {
|
||||||
|
key = "action-list." +name.replace(/^.*:/,"");
|
||||||
|
}
|
||||||
|
var label = RED._(key);
|
||||||
|
if (label === key) {
|
||||||
|
// no translation. convert `name` to description
|
||||||
|
label = name.replace(/(^.+:([a-z]))|(-([a-z]))/g, function() {
|
||||||
|
if (arguments[5] === 0) {
|
||||||
|
return arguments[2].toUpperCase();
|
||||||
|
} else {
|
||||||
|
return " "+arguments[4].toUpperCase();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
def.label = label;
|
||||||
|
}
|
||||||
|
return def.label
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function invokeAction() {
|
||||||
|
var args = Array.prototype.slice.call(arguments);
|
||||||
|
var name = args.shift();
|
||||||
if (actions.hasOwnProperty(name)) {
|
if (actions.hasOwnProperty(name)) {
|
||||||
actions[name](args);
|
var handler = actions[name].handler;
|
||||||
|
handler.apply(null, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function listActions() {
|
function listActions() {
|
||||||
var result = [];
|
var result = [];
|
||||||
|
|
||||||
Object.keys(actions).forEach(function(action) {
|
Object.keys(actions).forEach(function(action) {
|
||||||
|
var def = actions[action];
|
||||||
var shortcut = RED.keyboard.getShortcut(action);
|
var shortcut = RED.keyboard.getShortcut(action);
|
||||||
var isUser = false;
|
var isUser = false;
|
||||||
if (shortcut) {
|
if (shortcut) {
|
||||||
@@ -27,19 +69,25 @@ RED.actions = (function() {
|
|||||||
} else {
|
} else {
|
||||||
isUser = !!RED.keyboard.getUserShortcut(action);
|
isUser = !!RED.keyboard.getUserShortcut(action);
|
||||||
}
|
}
|
||||||
|
if (!def.label) {
|
||||||
|
def.label = getActionLabel(action)
|
||||||
|
}
|
||||||
result.push({
|
result.push({
|
||||||
id:action,
|
id:action,
|
||||||
scope:shortcut?shortcut.scope:undefined,
|
scope:shortcut?shortcut.scope:undefined,
|
||||||
key:shortcut?shortcut.key:undefined,
|
key:shortcut?shortcut.key:undefined,
|
||||||
user:isUser
|
user:isUser,
|
||||||
})
|
label: def.label,
|
||||||
})
|
options: def.options,
|
||||||
|
});
|
||||||
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
add: addAction,
|
add: addAction,
|
||||||
remove: removeAction,
|
remove: removeAction,
|
||||||
get: getAction,
|
get: getAction,
|
||||||
|
getLabel: getActionLabel,
|
||||||
invoke: invokeAction,
|
invoke: invokeAction,
|
||||||
list: listActions
|
list: listActions
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,10 +26,32 @@ RED.clipboard = (function() {
|
|||||||
var currentPopoverError;
|
var currentPopoverError;
|
||||||
var activeTab;
|
var activeTab;
|
||||||
var libraryBrowser;
|
var libraryBrowser;
|
||||||
var examplesBrowser;
|
|
||||||
|
var activeLibraries = {};
|
||||||
|
|
||||||
var pendingImportConfig;
|
var pendingImportConfig;
|
||||||
|
|
||||||
|
|
||||||
|
function downloadData(file, data) {
|
||||||
|
if (window.navigator.msSaveBlob) {
|
||||||
|
// IE11 workaround
|
||||||
|
// IE does not support data uri scheme for downloading data
|
||||||
|
var blob = new Blob([data], {
|
||||||
|
type: "data:application/json;charset=utf-8"
|
||||||
|
});
|
||||||
|
navigator.msSaveBlob(blob, file);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var element = document.createElement('a');
|
||||||
|
element.setAttribute('href', 'data:application/json;charset=utf-8,' + encodeURIComponent(data));
|
||||||
|
element.setAttribute('download', file);
|
||||||
|
element.style.display = 'none';
|
||||||
|
document.body.appendChild(element);
|
||||||
|
element.click();
|
||||||
|
document.body.removeChild(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function setupDialogs() {
|
function setupDialogs() {
|
||||||
dialog = $('<div id="red-ui-clipboard-dialog" class="hide"><form class="dialog-form form-horizontal"></form></div>')
|
dialog = $('<div id="red-ui-clipboard-dialog" class="hide"><form class="dialog-form form-horizontal"></form></div>')
|
||||||
.appendTo("#red-ui-editor")
|
.appendTo("#red-ui-editor")
|
||||||
@@ -49,6 +71,7 @@ RED.clipboard = (function() {
|
|||||||
text: RED._("common.label.cancel"),
|
text: RED._("common.label.cancel"),
|
||||||
click: function() {
|
click: function() {
|
||||||
$( this ).dialog( "close" );
|
$( this ).dialog( "close" );
|
||||||
|
RED.view.focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ // red-ui-clipboard-dialog-download
|
{ // red-ui-clipboard-dialog-download
|
||||||
@@ -56,14 +79,10 @@ RED.clipboard = (function() {
|
|||||||
class: "primary",
|
class: "primary",
|
||||||
text: RED._("clipboard.download"),
|
text: RED._("clipboard.download"),
|
||||||
click: function() {
|
click: function() {
|
||||||
var element = document.createElement('a');
|
var data = $("#red-ui-clipboard-dialog-export-text").val();
|
||||||
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent($("#red-ui-clipboard-dialog-export-text").val()));
|
downloadData("flows.json", data);
|
||||||
element.setAttribute('download', "flows.json");
|
|
||||||
element.style.display = 'none';
|
|
||||||
document.body.appendChild(element);
|
|
||||||
element.click();
|
|
||||||
document.body.removeChild(element);
|
|
||||||
$( this ).dialog( "close" );
|
$( this ).dialog( "close" );
|
||||||
|
RED.view.focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ // red-ui-clipboard-dialog-export
|
{ // red-ui-clipboard-dialog-export
|
||||||
@@ -72,14 +91,16 @@ RED.clipboard = (function() {
|
|||||||
text: RED._("clipboard.export.copy"),
|
text: RED._("clipboard.export.copy"),
|
||||||
click: function() {
|
click: function() {
|
||||||
if (activeTab === "red-ui-clipboard-dialog-export-tab-clipboard") {
|
if (activeTab === "red-ui-clipboard-dialog-export-tab-clipboard") {
|
||||||
$("#red-ui-clipboard-dialog-export-text").select();
|
var flowData = $("#red-ui-clipboard-dialog-export-text").val();
|
||||||
document.execCommand("copy");
|
// Close the dialog first otherwise FireFox won't focus the hidden
|
||||||
document.getSelection().removeAllRanges();
|
// clipboard element in copyText
|
||||||
RED.notify(RED._("clipboard.nodesExported"),{id:"clipboard"});
|
|
||||||
$( this ).dialog( "close" );
|
$( this ).dialog( "close" );
|
||||||
|
copyText(flowData);
|
||||||
|
RED.notify(RED._("clipboard.nodesExported"),{id:"clipboard"});
|
||||||
|
RED.view.focus();
|
||||||
} else {
|
} else {
|
||||||
var flowToExport = $("#red-ui-clipboard-dialog-export-text").val();
|
var flowToExport = $("#red-ui-clipboard-dialog-export-text").val();
|
||||||
var selectedPath = libraryBrowser.getSelected();
|
var selectedPath = activeLibraries[activeTab].getSelected();
|
||||||
if (!selectedPath.children) {
|
if (!selectedPath.children) {
|
||||||
selectedPath = selectedPath.parent;
|
selectedPath = selectedPath.parent;
|
||||||
}
|
}
|
||||||
@@ -92,6 +113,7 @@ RED.clipboard = (function() {
|
|||||||
contentType: "application/json; charset=utf-8"
|
contentType: "application/json; charset=utf-8"
|
||||||
}).done(function() {
|
}).done(function() {
|
||||||
$(dialog).dialog( "close" );
|
$(dialog).dialog( "close" );
|
||||||
|
RED.view.focus();
|
||||||
RED.notify(RED._("library.exportedToLibrary"),"success");
|
RED.notify(RED._("library.exportedToLibrary"),"success");
|
||||||
}).fail(function(xhr,textStatus,err) {
|
}).fail(function(xhr,textStatus,err) {
|
||||||
if (xhr.status === 401) {
|
if (xhr.status === 401) {
|
||||||
@@ -145,12 +167,7 @@ RED.clipboard = (function() {
|
|||||||
if (activeTab === "red-ui-clipboard-dialog-import-tab-clipboard") {
|
if (activeTab === "red-ui-clipboard-dialog-import-tab-clipboard") {
|
||||||
importNodes($("#red-ui-clipboard-dialog-import-text").val(),addNewFlow);
|
importNodes($("#red-ui-clipboard-dialog-import-text").val(),addNewFlow);
|
||||||
} else {
|
} else {
|
||||||
var selectedPath;
|
var selectedPath = activeLibraries[activeTab].getSelected();
|
||||||
if (activeTab === "red-ui-clipboard-dialog-import-tab-library") {
|
|
||||||
selectedPath = libraryBrowser.getSelected();
|
|
||||||
} else {
|
|
||||||
selectedPath = examplesBrowser.getSelected();
|
|
||||||
}
|
|
||||||
if (selectedPath.path) {
|
if (selectedPath.path) {
|
||||||
$.get('library/'+selectedPath.library+'/'+selectedPath.type+'/'+selectedPath.path, function(data) {
|
$.get('library/'+selectedPath.library+'/'+selectedPath.type+'/'+selectedPath.path, function(data) {
|
||||||
importNodes(data,addNewFlow);
|
importNodes(data,addNewFlow);
|
||||||
@@ -158,6 +175,7 @@ RED.clipboard = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$( this ).dialog( "close" );
|
$( this ).dialog( "close" );
|
||||||
|
RED.view.focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ // red-ui-clipboard-dialog-import-conflict
|
{ // red-ui-clipboard-dialog-import-conflict
|
||||||
@@ -190,6 +208,7 @@ RED.clipboard = (function() {
|
|||||||
// console.table(pendingImportConfig.importNodes.map(function(n) { return {id:n.id,type:n.type,result:importMap[n.id]}}))
|
// console.table(pendingImportConfig.importNodes.map(function(n) { return {id:n.id,type:n.type,result:importMap[n.id]}}))
|
||||||
RED.view.importNodes(newNodes, pendingImportConfig.importOptions);
|
RED.view.importNodes(newNodes, pendingImportConfig.importOptions);
|
||||||
$( this ).dialog( "close" );
|
$( this ).dialog( "close" );
|
||||||
|
RED.view.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -222,7 +241,14 @@ RED.clipboard = (function() {
|
|||||||
'</div>'+
|
'</div>'+
|
||||||
'<div id="red-ui-clipboard-dialog-export-tabs-content" class="red-ui-clipboard-dialog-tabs-content">'+
|
'<div id="red-ui-clipboard-dialog-export-tabs-content" class="red-ui-clipboard-dialog-tabs-content">'+
|
||||||
'<div id="red-ui-clipboard-dialog-export-tab-clipboard" class="red-ui-clipboard-dialog-tab-clipboard">'+
|
'<div id="red-ui-clipboard-dialog-export-tab-clipboard" class="red-ui-clipboard-dialog-tab-clipboard">'+
|
||||||
'<div class="form-row" style="height:calc(100% - 30px)">'+
|
'<div id="red-ui-clipboard-dialog-export-tab-clipboard-tab-bar">'+
|
||||||
|
'<ul id="red-ui-clipboard-dialog-export-tab-clipboard-tabs"></ul>'+
|
||||||
|
'</div>'+
|
||||||
|
'<div class="red-ui-clipboard-dialog-export-tab-clipboard-tab" id="red-ui-clipboard-dialog-export-tab-clipboard-preview">'+
|
||||||
|
'<div id="red-ui-clipboard-dialog-export-tab-clipboard-preview-list"></div>'+
|
||||||
|
'</div>'+
|
||||||
|
'<div class="red-ui-clipboard-dialog-export-tab-clipboard-tab" id="red-ui-clipboard-dialog-export-tab-clipboard-json">'+
|
||||||
|
'<div class="form-row" style="height:calc(100% - 40px)">'+
|
||||||
'<textarea readonly id="red-ui-clipboard-dialog-export-text"></textarea>'+
|
'<textarea readonly id="red-ui-clipboard-dialog-export-text"></textarea>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'<div class="form-row" style="text-align: right;">'+
|
'<div class="form-row" style="text-align: right;">'+
|
||||||
@@ -232,11 +258,9 @@ RED.clipboard = (function() {
|
|||||||
'</span>'+
|
'</span>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'<div id="red-ui-clipboard-dialog-export-tab-library" class="red-ui-clipboard-dialog-tab-library">'+
|
|
||||||
'<div id="red-ui-clipboard-dialog-export-tab-library-browser"></div>'+
|
|
||||||
'<div class="form-row">'+
|
|
||||||
'<label data-i18n="clipboard.export.exportAs"></label><input id="red-ui-clipboard-dialog-tab-library-name" type="text">'+
|
|
||||||
'</div>'+
|
'</div>'+
|
||||||
|
'<div class="form-row" id="red-ui-clipboard-dialog-export-tab-library-filename">'+
|
||||||
|
'<label data-i18n="clipboard.export.exportAs"></label><input id="red-ui-clipboard-dialog-tab-library-name" type="text">'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'</div>'
|
'</div>'
|
||||||
@@ -258,8 +282,6 @@ RED.clipboard = (function() {
|
|||||||
'<textarea id="red-ui-clipboard-dialog-import-text"></textarea>'+
|
'<textarea id="red-ui-clipboard-dialog-import-text"></textarea>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'<div id="red-ui-clipboard-dialog-import-tab-library" class="red-ui-clipboard-dialog-tab-library"></div>'+
|
|
||||||
'<div id="red-ui-clipboard-dialog-import-tab-examples" class="red-ui-clipboard-dialog-tab-library"></div>'+
|
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'<div class="form-row">'+
|
'<div class="form-row">'+
|
||||||
@@ -392,7 +414,7 @@ RED.clipboard = (function() {
|
|||||||
}
|
}
|
||||||
},100);
|
},100);
|
||||||
} else {
|
} else {
|
||||||
var file = libraryBrowser.getSelected();
|
var file = activeLibraries[activeTab].getSelected();
|
||||||
if (file && file.label && !file.children) {
|
if (file && file.label && !file.children) {
|
||||||
$("#red-ui-clipboard-dialog-ok").button("enable");
|
$("#red-ui-clipboard-dialog-ok").button("enable");
|
||||||
} else {
|
} else {
|
||||||
@@ -401,11 +423,10 @@ RED.clipboard = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showImportNodes(mode) {
|
function showImportNodes(library = 'clipboard') {
|
||||||
if (disabled) {
|
if (disabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mode = mode || "clipboard";
|
|
||||||
|
|
||||||
dialogContainer.empty();
|
dialogContainer.empty();
|
||||||
dialogContainer.append($(importNodesDialog));
|
dialogContainer.append($(importNodesDialog));
|
||||||
@@ -424,7 +445,7 @@ RED.clipboard = (function() {
|
|||||||
if (tab.id === "red-ui-clipboard-dialog-import-tab-clipboard") {
|
if (tab.id === "red-ui-clipboard-dialog-import-tab-clipboard") {
|
||||||
$("#red-ui-clipboard-dialog-import-text").trigger("focus");
|
$("#red-ui-clipboard-dialog-import-text").trigger("focus");
|
||||||
} else {
|
} else {
|
||||||
libraryBrowser.focus();
|
activeLibraries[tab.id].focus();
|
||||||
}
|
}
|
||||||
validateImport();
|
validateImport();
|
||||||
}
|
}
|
||||||
@@ -433,54 +454,43 @@ RED.clipboard = (function() {
|
|||||||
id: "red-ui-clipboard-dialog-import-tab-clipboard",
|
id: "red-ui-clipboard-dialog-import-tab-clipboard",
|
||||||
label: RED._("clipboard.clipboard")
|
label: RED._("clipboard.clipboard")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var libraries = RED.settings.libraries || [];
|
||||||
|
libraries.forEach(function(lib) {
|
||||||
|
var tabId = "red-ui-clipboard-dialog-import-tab-"+lib.id
|
||||||
tabs.addTab({
|
tabs.addTab({
|
||||||
id: "red-ui-clipboard-dialog-import-tab-library",
|
id: tabId,
|
||||||
label: RED._("library.library")
|
label: RED._(lib.label||lib.id)
|
||||||
});
|
})
|
||||||
tabs.addTab({
|
|
||||||
id: "red-ui-clipboard-dialog-import-tab-examples",
|
var content = $('<div id="red-ui-clipboard-dialog-import-tab-library" class="red-ui-clipboard-dialog-tab-library"></div>')
|
||||||
label: RED._("library.types.examples")
|
.attr("id",tabId)
|
||||||
});
|
.hide()
|
||||||
|
.appendTo("#red-ui-clipboard-dialog-import-tabs-content");
|
||||||
|
|
||||||
|
var browser = RED.library.createBrowser({
|
||||||
|
container: content,
|
||||||
|
onselect: function(file) {
|
||||||
|
if (file && file.label && !file.children) {
|
||||||
|
$("#red-ui-clipboard-dialog-ok").button("enable");
|
||||||
|
} else {
|
||||||
|
$("#red-ui-clipboard-dialog-ok").button("disable");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onconfirm: function(item) {
|
||||||
|
if (item && item.label && !item.children) {
|
||||||
|
$("#red-ui-clipboard-dialog-ok").trigger("click");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
loadFlowLibrary(browser,lib);
|
||||||
|
activeLibraries[tabId] = browser;
|
||||||
|
})
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename);
|
$("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename);
|
||||||
$("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
|
$("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
|
||||||
$("#red-ui-clipboard-dialog-export").button("enable");
|
$("#red-ui-clipboard-dialog-export").button("enable");
|
||||||
|
|
||||||
libraryBrowser = RED.library.createBrowser({
|
|
||||||
container: $("#red-ui-clipboard-dialog-import-tab-library"),
|
|
||||||
onselect: function(file) {
|
|
||||||
if (file && file.label && !file.children) {
|
|
||||||
$("#red-ui-clipboard-dialog-ok").button("enable");
|
|
||||||
} else {
|
|
||||||
$("#red-ui-clipboard-dialog-ok").button("disable");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onconfirm: function(item) {
|
|
||||||
if (item && item.label && !item.children) {
|
|
||||||
$("#red-ui-clipboard-dialog-ok").trigger("click");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local"));
|
|
||||||
|
|
||||||
examplesBrowser = RED.library.createBrowser({
|
|
||||||
container: $("#red-ui-clipboard-dialog-import-tab-examples"),
|
|
||||||
onselect: function(file) {
|
|
||||||
if (file && file.label && !file.children) {
|
|
||||||
$("#red-ui-clipboard-dialog-ok").button("enable");
|
|
||||||
} else {
|
|
||||||
$("#red-ui-clipboard-dialog-ok").button("disable");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onconfirm: function(item) {
|
|
||||||
if (item && item.label && !item.children) {
|
|
||||||
$("#red-ui-clipboard-dialog-ok").trigger("click");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
loadFlowLibrary(examplesBrowser,"_examples_",RED._("library.types.examples"));
|
|
||||||
|
|
||||||
|
|
||||||
dialogContainer.i18n();
|
dialogContainer.i18n();
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-ok").show();
|
$("#red-ui-clipboard-dialog-ok").show();
|
||||||
@@ -493,6 +503,13 @@ RED.clipboard = (function() {
|
|||||||
$("#red-ui-clipboard-dialog-import-text").on("keyup", validateImport);
|
$("#red-ui-clipboard-dialog-import-text").on("keyup", validateImport);
|
||||||
$("#red-ui-clipboard-dialog-import-text").on('paste',function() { setTimeout(validateImport,10)});
|
$("#red-ui-clipboard-dialog-import-text").on('paste',function() { setTimeout(validateImport,10)});
|
||||||
|
|
||||||
|
if (RED.workspaces.active() === 0 || RED.workspaces.isLocked()) {
|
||||||
|
$("#red-ui-clipboard-dialog-import-opt-current").addClass('disabled').removeClass("selected");
|
||||||
|
$("#red-ui-clipboard-dialog-import-opt-new").addClass("selected");
|
||||||
|
} else {
|
||||||
|
$("#red-ui-clipboard-dialog-import-opt-current").removeClass('disabled').addClass("selected");
|
||||||
|
$("#red-ui-clipboard-dialog-import-opt-new").removeClass("selected");
|
||||||
|
}
|
||||||
$("#red-ui-clipboard-dialog-import-opt > a").on("click", function(evt) {
|
$("#red-ui-clipboard-dialog-import-opt > a").on("click", function(evt) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
|
if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
|
||||||
@@ -515,8 +532,8 @@ RED.clipboard = (function() {
|
|||||||
$("#red-ui-clipboard-dialog-import-file-upload").trigger("click");
|
$("#red-ui-clipboard-dialog-import-file-upload").trigger("click");
|
||||||
})
|
})
|
||||||
|
|
||||||
tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+mode);
|
tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+library);
|
||||||
if (mode === 'clipboard') {
|
if (library === 'clipboard') {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
$("#red-ui-clipboard-dialog-import-text").trigger("focus");
|
$("#red-ui-clipboard-dialog-import-text").trigger("focus");
|
||||||
},100)
|
},100)
|
||||||
@@ -540,13 +557,16 @@ RED.clipboard = (function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showExportNodes(mode) {
|
/**
|
||||||
|
* Show the export dialog
|
||||||
|
* @params library which export destination to show
|
||||||
|
* @params mode whether to default to 'auto' (default) or 'flow'
|
||||||
|
**/
|
||||||
|
function showExportNodes(library = 'clipboard', mode = 'auto' ) {
|
||||||
if (disabled) {
|
if (disabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mode = mode || "clipboard";
|
|
||||||
|
|
||||||
dialogContainer.empty();
|
dialogContainer.empty();
|
||||||
dialogContainer.append($(exportNodesDialog));
|
dialogContainer.append($(exportNodesDialog));
|
||||||
|
|
||||||
@@ -560,10 +580,12 @@ RED.clipboard = (function() {
|
|||||||
if (tab.id === "red-ui-clipboard-dialog-export-tab-clipboard") {
|
if (tab.id === "red-ui-clipboard-dialog-export-tab-clipboard") {
|
||||||
$("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.copy"))
|
$("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.copy"))
|
||||||
$("#red-ui-clipboard-dialog-download").show();
|
$("#red-ui-clipboard-dialog-download").show();
|
||||||
|
$("#red-ui-clipboard-dialog-export-tab-library-filename").hide();
|
||||||
} else {
|
} else {
|
||||||
$("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.export"))
|
$("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.export"))
|
||||||
$("#red-ui-clipboard-dialog-download").hide();
|
$("#red-ui-clipboard-dialog-download").hide();
|
||||||
libraryBrowser.focus();
|
$("#red-ui-clipboard-dialog-export-tab-library-filename").show();
|
||||||
|
activeLibraries[activeTab].focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -572,30 +594,74 @@ RED.clipboard = (function() {
|
|||||||
id: "red-ui-clipboard-dialog-export-tab-clipboard",
|
id: "red-ui-clipboard-dialog-export-tab-clipboard",
|
||||||
label: RED._("clipboard.clipboard")
|
label: RED._("clipboard.clipboard")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var libraries = RED.settings.libraries || [];
|
||||||
|
|
||||||
|
libraries.forEach(function(lib) {
|
||||||
|
if (lib.readOnly) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var tabId = "red-ui-clipboard-dialog-export-tab-library-"+lib.id
|
||||||
tabs.addTab({
|
tabs.addTab({
|
||||||
id: "red-ui-clipboard-dialog-export-tab-library",
|
id: tabId,
|
||||||
label: RED._("library.library")
|
label: RED._(lib.label||lib.id)
|
||||||
});
|
})
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename);
|
var content = $('<div class="red-ui-clipboard-dialog-export-tab-library-browser red-ui-clipboard-dialog-tab-library"></div>')
|
||||||
$("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
|
.attr("id",tabId)
|
||||||
$("#red-ui-clipboard-dialog-export").button("enable");
|
.hide()
|
||||||
|
.insertBefore("#red-ui-clipboard-dialog-export-tab-library-filename");
|
||||||
|
|
||||||
libraryBrowser = RED.library.createBrowser({
|
var browser = RED.library.createBrowser({
|
||||||
container: $("#red-ui-clipboard-dialog-export-tab-library-browser"),
|
container: content,
|
||||||
folderTools: true,
|
folderTools: true,
|
||||||
onselect: function(file) {
|
onselect: function(file) {
|
||||||
if (file && file.label && !file.children) {
|
if (file && file.label && !file.children) {
|
||||||
$("#red-ui-clipboard-dialog-tab-library-name").val(file.label);
|
$("#red-ui-clipboard-dialog-tab-library-name").val(file.label);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local"));
|
loadFlowLibrary(browser,lib);
|
||||||
|
activeLibraries[tabId] = browser;
|
||||||
|
})
|
||||||
|
|
||||||
|
$("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename);
|
||||||
|
$("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
|
||||||
|
$("#red-ui-clipboard-dialog-export").button("enable");
|
||||||
|
|
||||||
|
var clipboardTabs = RED.tabs.create({
|
||||||
|
id: "red-ui-clipboard-dialog-export-tab-clipboard-tabs",
|
||||||
|
onchange: function(tab) {
|
||||||
|
$(".red-ui-clipboard-dialog-export-tab-clipboard-tab").hide();
|
||||||
|
$("#" + tab.id).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboardTabs.addTab({
|
||||||
|
id: "red-ui-clipboard-dialog-export-tab-clipboard-preview",
|
||||||
|
label: RED._("clipboard.exportNodes")
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboardTabs.addTab({
|
||||||
|
id: "red-ui-clipboard-dialog-export-tab-clipboard-json",
|
||||||
|
label: RED._("editor.types.json")
|
||||||
|
});
|
||||||
|
|
||||||
|
var previewList = $("#red-ui-clipboard-dialog-export-tab-clipboard-preview-list").css({position:"absolute",top:0,right:0,bottom:0,left:0}).treeList({
|
||||||
|
data: []
|
||||||
|
})
|
||||||
|
refreshExportPreview();
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-tab-library-name").val("flows.json").select();
|
$("#red-ui-clipboard-dialog-tab-library-name").val("flows.json").select();
|
||||||
|
|
||||||
dialogContainer.i18n();
|
dialogContainer.i18n();
|
||||||
|
|
||||||
var format = RED.settings.flowFilePretty ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini";
|
var format = RED.settings.flowFilePretty ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini";
|
||||||
|
const userFormat = RED.settings.get("editor.dialog.export.pretty")
|
||||||
|
if (userFormat === false || userFormat === true) {
|
||||||
|
format = userFormat ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini";
|
||||||
|
}
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-export-fmt-group > a").on("click", function(evt) {
|
$("#red-ui-clipboard-dialog-export-fmt-group > a").on("click", function(evt) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
@@ -611,7 +677,8 @@ RED.clipboard = (function() {
|
|||||||
var nodes = JSON.parse(flow);
|
var nodes = JSON.parse(flow);
|
||||||
|
|
||||||
format = $(this).attr('id');
|
format = $(this).attr('id');
|
||||||
if (format === 'red-ui-clipboard-dialog-export-fmt-full') {
|
const pretty = format === "red-ui-clipboard-dialog-export-fmt-full";
|
||||||
|
if (pretty) {
|
||||||
flow = JSON.stringify(nodes,null,4);
|
flow = JSON.stringify(nodes,null,4);
|
||||||
} else {
|
} else {
|
||||||
flow = JSON.stringify(nodes);
|
flow = JSON.stringify(nodes);
|
||||||
@@ -620,6 +687,7 @@ RED.clipboard = (function() {
|
|||||||
setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
|
setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-export-text").trigger("focus");
|
$("#red-ui-clipboard-dialog-export-text").trigger("focus");
|
||||||
|
RED.settings.set("editor.dialog.export.pretty", pretty)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -630,10 +698,10 @@ RED.clipboard = (function() {
|
|||||||
}
|
}
|
||||||
$(this).parent().children().removeClass('selected');
|
$(this).parent().children().removeClass('selected');
|
||||||
$(this).addClass('selected');
|
$(this).addClass('selected');
|
||||||
var type = $(this).attr('id');
|
var type = $(this).attr('id').substring("red-ui-clipboard-dialog-export-rng-".length);
|
||||||
var flow = "";
|
var flow = "";
|
||||||
var nodes = null;
|
var nodes = null;
|
||||||
if (type === 'red-ui-clipboard-dialog-export-rng-selected') {
|
if (type === 'selected') {
|
||||||
var selection = RED.workspaces.selection();
|
var selection = RED.workspaces.selection();
|
||||||
if (selection.length > 0) {
|
if (selection.length > 0) {
|
||||||
nodes = [];
|
nodes = [];
|
||||||
@@ -647,15 +715,23 @@ RED.clipboard = (function() {
|
|||||||
}
|
}
|
||||||
// Don't include the subflow meta-port nodes in the exported selection
|
// Don't include the subflow meta-port nodes in the exported selection
|
||||||
nodes = RED.nodes.createExportableNodeSet(nodes.filter(function(n) { return n.type !== 'subflow'}));
|
nodes = RED.nodes.createExportableNodeSet(nodes.filter(function(n) { return n.type !== 'subflow'}));
|
||||||
} else if (type === 'red-ui-clipboard-dialog-export-rng-flow') {
|
} else if (type === 'flow') {
|
||||||
var activeWorkspace = RED.workspaces.active();
|
var activeWorkspace = RED.workspaces.active();
|
||||||
nodes = RED.nodes.groups(activeWorkspace);
|
nodes = RED.nodes.groups(activeWorkspace);
|
||||||
|
nodes = nodes.concat(RED.nodes.junctions(activeWorkspace));
|
||||||
nodes = nodes.concat(RED.nodes.filterNodes({z:activeWorkspace}));
|
nodes = nodes.concat(RED.nodes.filterNodes({z:activeWorkspace}));
|
||||||
|
RED.nodes.eachConfig(function(n) {
|
||||||
|
if (n.z === RED.workspaces.active() && n._def.hasUsers === false) {
|
||||||
|
// Grab any config nodes scoped to this flow that don't
|
||||||
|
// require any flow-nodes to use them
|
||||||
|
nodes.push(n);
|
||||||
|
}
|
||||||
|
});
|
||||||
var parentNode = RED.nodes.workspace(activeWorkspace)||RED.nodes.subflow(activeWorkspace);
|
var parentNode = RED.nodes.workspace(activeWorkspace)||RED.nodes.subflow(activeWorkspace);
|
||||||
nodes.unshift(parentNode);
|
nodes.unshift(parentNode);
|
||||||
nodes = RED.nodes.createExportableNodeSet(nodes);
|
nodes = RED.nodes.createExportableNodeSet(nodes);
|
||||||
} else if (type === 'red-ui-clipboard-dialog-export-rng-full') {
|
} else if (type === 'full') {
|
||||||
nodes = RED.nodes.createCompleteNodeSet(false);
|
nodes = RED.nodes.createCompleteNodeSet({ credentials: false });
|
||||||
}
|
}
|
||||||
if (nodes !== null) {
|
if (nodes !== null) {
|
||||||
if (format === "red-ui-clipboard-dialog-export-fmt-full") {
|
if (format === "red-ui-clipboard-dialog-export-fmt-full") {
|
||||||
@@ -670,8 +746,10 @@ RED.clipboard = (function() {
|
|||||||
$("#red-ui-clipboard-dialog-export").addClass('disabled');
|
$("#red-ui-clipboard-dialog-export").addClass('disabled');
|
||||||
}
|
}
|
||||||
$("#red-ui-clipboard-dialog-export-text").val(flow);
|
$("#red-ui-clipboard-dialog-export-text").val(flow);
|
||||||
setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
|
setTimeout(function() {
|
||||||
$("#red-ui-clipboard-dialog-export-text").trigger("focus");
|
$("#red-ui-clipboard-dialog-export-text").scrollTop(0);
|
||||||
|
refreshExportPreview(type);
|
||||||
|
},50);
|
||||||
})
|
})
|
||||||
|
|
||||||
$("#red-ui-clipboard-dialog-ok").hide();
|
$("#red-ui-clipboard-dialog-ok").hide();
|
||||||
@@ -679,6 +757,11 @@ RED.clipboard = (function() {
|
|||||||
$("#red-ui-clipboard-dialog-export").hide();
|
$("#red-ui-clipboard-dialog-export").hide();
|
||||||
$("#red-ui-clipboard-dialog-import-conflict").hide();
|
$("#red-ui-clipboard-dialog-import-conflict").hide();
|
||||||
|
|
||||||
|
if (RED.workspaces.active() === 0) {
|
||||||
|
$("#red-ui-clipboard-dialog-export-rng-selected").addClass('disabled').removeClass('selected');
|
||||||
|
$("#red-ui-clipboard-dialog-export-rng-flow").addClass('disabled').removeClass('selected');
|
||||||
|
$("#red-ui-clipboard-dialog-export-rng-full").trigger("click");
|
||||||
|
} else {
|
||||||
var selection = RED.workspaces.selection();
|
var selection = RED.workspaces.selection();
|
||||||
if (selection.length > 0) {
|
if (selection.length > 0) {
|
||||||
$("#red-ui-clipboard-dialog-export-rng-selected").trigger("click");
|
$("#red-ui-clipboard-dialog-export-rng-selected").trigger("click");
|
||||||
@@ -691,12 +774,16 @@ RED.clipboard = (function() {
|
|||||||
$("#red-ui-clipboard-dialog-export-rng-flow").trigger("click");
|
$("#red-ui-clipboard-dialog-export-rng-flow").trigger("click");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (mode === 'flow' && !$("#red-ui-clipboard-dialog-export-rng-flow").hasClass('disabled')) {
|
||||||
|
$("#red-ui-clipboard-dialog-export-rng-flow").trigger("click");
|
||||||
|
}
|
||||||
if (format === "red-ui-clipboard-dialog-export-fmt-full") {
|
if (format === "red-ui-clipboard-dialog-export-fmt-full") {
|
||||||
$("#red-ui-clipboard-dialog-export-fmt-full").trigger("click");
|
$("#red-ui-clipboard-dialog-export-fmt-full").trigger("click");
|
||||||
} else {
|
} else {
|
||||||
$("#red-ui-clipboard-dialog-export-fmt-mini").trigger("click");
|
$("#red-ui-clipboard-dialog-export-fmt-mini").trigger("click");
|
||||||
}
|
}
|
||||||
tabs.activateTab("red-ui-clipboard-dialog-export-tab-"+mode);
|
tabs.activateTab("red-ui-clipboard-dialog-export-tab-"+library);
|
||||||
|
|
||||||
var dialogHeight = 400;
|
var dialogHeight = 400;
|
||||||
var winHeight = $(window).height();
|
var winHeight = $(window).height();
|
||||||
@@ -717,45 +804,130 @@ RED.clipboard = (function() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadFlowLibrary(browser,library,label) {
|
function refreshExportPreview(type) {
|
||||||
// if (includeExamples) {
|
|
||||||
// listing.push({
|
var flowData = $("#red-ui-clipboard-dialog-export-text").val() || "[]";
|
||||||
// library: "_examples_",
|
var flow = JSON.parse(flowData);
|
||||||
// type: "flows",
|
var flows = {};
|
||||||
// icon: 'fa fa-hdd-o',
|
var subflows = {};
|
||||||
// label: RED._("library.types.examples"),
|
var nodes = [];
|
||||||
// path: "",
|
var nodesByZ = {};
|
||||||
// children: function(done,item) {
|
|
||||||
// RED.library.loadLibraryFolder("_examples_","flows","",function(children) {
|
var treeFlows = [];
|
||||||
// item.children = children;
|
var treeSubflows = [];
|
||||||
// done(children);
|
|
||||||
// })
|
flow.forEach(function(node) {
|
||||||
// }
|
if (node.type === "tab") {
|
||||||
// })
|
flows[node.id] = {
|
||||||
// }
|
element: getFlowLabel(node),
|
||||||
|
deferBuild: type !== "flow",
|
||||||
|
expanded: type === "flow",
|
||||||
|
children: []
|
||||||
|
};
|
||||||
|
treeFlows.push(flows[node.id])
|
||||||
|
} else if (node.type === "subflow") {
|
||||||
|
subflows[node.id] = {
|
||||||
|
element: getNodeLabel(node,false),
|
||||||
|
deferBuild: true,
|
||||||
|
children: []
|
||||||
|
};
|
||||||
|
treeSubflows.push(subflows[node.id])
|
||||||
|
} else {
|
||||||
|
nodes.push(node);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var globalNodes = [];
|
||||||
|
var parentlessNodes = [];
|
||||||
|
|
||||||
|
nodes.forEach(function(node) {
|
||||||
|
var treeNode = {
|
||||||
|
element: getNodeLabel(node, false, false)
|
||||||
|
};
|
||||||
|
if (node.z) {
|
||||||
|
if (!flows[node.z] && !subflows[node.z]) {
|
||||||
|
parentlessNodes.push(treeNode)
|
||||||
|
} else if (flows[node.z]) {
|
||||||
|
flows[node.z].children.push(treeNode)
|
||||||
|
} else if (subflows[node.z]) {
|
||||||
|
subflows[node.z].children.push(treeNode)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
globalNodes.push(treeNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var treeData = [];
|
||||||
|
|
||||||
|
if (parentlessNodes.length > 0) {
|
||||||
|
treeData = treeData.concat(parentlessNodes);
|
||||||
|
}
|
||||||
|
if (type === "flow") {
|
||||||
|
treeData = treeData.concat(treeFlows);
|
||||||
|
} else if (treeFlows.length > 0) {
|
||||||
|
treeData.push({
|
||||||
|
label: RED._("menu.label.flows"),
|
||||||
|
deferBuild: treeFlows.length > 20,
|
||||||
|
expanded: treeFlows.length <= 20,
|
||||||
|
children: treeFlows
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (treeSubflows.length > 0) {
|
||||||
|
treeData.push({
|
||||||
|
label: RED._("menu.label.subflows"),
|
||||||
|
deferBuild: treeSubflows.length > 10,
|
||||||
|
expanded: treeSubflows.length <= 10,
|
||||||
|
children: treeSubflows
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (globalNodes.length > 0) {
|
||||||
|
treeData.push({
|
||||||
|
label: RED._("sidebar.info.globalConfig"),
|
||||||
|
deferBuild: globalNodes.length > 10,
|
||||||
|
expanded: globalNodes.length <= 10,
|
||||||
|
children: globalNodes
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#red-ui-clipboard-dialog-export-tab-clipboard-preview-list").treeList('data',treeData);
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadFlowLibrary(browser,library) {
|
||||||
|
var icon = 'fa fa-hdd-o';
|
||||||
|
if (library.icon) {
|
||||||
|
var fullIcon = RED.utils.separateIconPath(library.icon);
|
||||||
|
icon = (fullIcon.module==="font-awesome"?"fa ":"")+fullIcon.file;
|
||||||
|
}
|
||||||
browser.data([{
|
browser.data([{
|
||||||
library: library,
|
library: library.id,
|
||||||
type: "flows",
|
type: "flows",
|
||||||
icon: 'fa fa-hdd-o',
|
icon: icon,
|
||||||
label: label,
|
label: RED._(library.label||library.id),
|
||||||
|
path: "",
|
||||||
|
expanded: true,
|
||||||
|
children: [{
|
||||||
|
library: library.id,
|
||||||
|
type: "flows",
|
||||||
|
icon: 'fa fa-cube',
|
||||||
|
label: "flows",
|
||||||
path: "",
|
path: "",
|
||||||
expanded: true,
|
expanded: true,
|
||||||
children: function(done, item) {
|
children: function(done, item) {
|
||||||
RED.library.loadLibraryFolder(library,"flows","",function(children) {
|
RED.library.loadLibraryFolder(library.id,"flows","",function(children) {
|
||||||
item.children = children;
|
item.children = children;
|
||||||
done(children);
|
done(children);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}]
|
||||||
}], true);
|
}], true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideDropTarget() {
|
function hideDropTarget() {
|
||||||
$("#red-ui-drop-target").hide();
|
$("#red-ui-drop-target").hide();
|
||||||
RED.keyboard.remove("escape");
|
|
||||||
}
|
}
|
||||||
function copyText(value,element,msg) {
|
function copyText(value,element,msg) {
|
||||||
var truncated = false;
|
var truncated = false;
|
||||||
|
var currentFocus = document.activeElement;
|
||||||
if (typeof value !== "string" ) {
|
if (typeof value !== "string" ) {
|
||||||
value = JSON.stringify(value, function(key,value) {
|
value = JSON.stringify(value, function(key,value) {
|
||||||
if (value !== null && typeof value === 'object') {
|
if (value !== null && typeof value === 'object') {
|
||||||
@@ -787,7 +959,8 @@ RED.clipboard = (function() {
|
|||||||
if (truncated) {
|
if (truncated) {
|
||||||
msg += "_truncated";
|
msg += "_truncated";
|
||||||
}
|
}
|
||||||
$("#red-ui-clipboard-hidden").val(value).select();
|
var clipboardHidden = $('<textarea type="text" id="red-ui-clipboard-hidden" tabIndex="-1">').appendTo(document.body);
|
||||||
|
clipboardHidden.val(value).focus().select();
|
||||||
var result = document.execCommand("copy");
|
var result = document.execCommand("copy");
|
||||||
if (result && element) {
|
if (result && element) {
|
||||||
var popover = RED.popover.create({
|
var popover = RED.popover.create({
|
||||||
@@ -801,10 +974,13 @@ RED.clipboard = (function() {
|
|||||||
},1000);
|
},1000);
|
||||||
popover.open();
|
popover.open();
|
||||||
}
|
}
|
||||||
|
clipboardHidden.remove();
|
||||||
|
if (currentFocus) {
|
||||||
|
$(currentFocus).focus();
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function importNodes(nodesStr,addFlow) {
|
function importNodes(nodesStr,addFlow) {
|
||||||
var newNodes = nodesStr;
|
var newNodes = nodesStr;
|
||||||
if (typeof nodesStr === 'string') {
|
if (typeof nodesStr === 'string') {
|
||||||
@@ -993,9 +1169,9 @@ RED.clipboard = (function() {
|
|||||||
function getNodeElement(n, isConflicted, isSelected, parent) {
|
function getNodeElement(n, isConflicted, isSelected, parent) {
|
||||||
var element;
|
var element;
|
||||||
if (n.type === "tab") {
|
if (n.type === "tab") {
|
||||||
element = getFlowLabel(n, isSelected);
|
element = getFlowLabel(n, isConflicted);
|
||||||
} else {
|
} else {
|
||||||
element = getNodeLabel(n, isConflicted, isSelected);
|
element = getNodeLabel(n, isConflicted, isSelected, parent);
|
||||||
}
|
}
|
||||||
var controls = $('<div>',{class:"red-ui-clipboard-dialog-import-conflicts-controls"}).appendTo(element);
|
var controls = $('<div>',{class:"red-ui-clipboard-dialog-import-conflicts-controls"}).appendTo(element);
|
||||||
controls.on("click", function(evt) { evt.stopPropagation(); });
|
controls.on("click", function(evt) { evt.stopPropagation(); });
|
||||||
@@ -1045,30 +1221,14 @@ RED.clipboard = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNodeLabelText(n) {
|
function getFlowLabel(n, isConflicted) {
|
||||||
var label = n.name || n.type+": "+n.id;
|
|
||||||
if (n._def.label) {
|
|
||||||
try {
|
|
||||||
label = (typeof n._def.label === "function" ? n._def.label.call(n) : n._def.label)||"";
|
|
||||||
} catch(err) {
|
|
||||||
console.log("Definition error: "+n.type+".label",err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var newlineIndex = label.indexOf("\\n");
|
|
||||||
if (newlineIndex > -1) {
|
|
||||||
label = label.substring(0,newlineIndex)+"...";
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFlowLabel(n) {
|
|
||||||
n = JSON.parse(JSON.stringify(n));
|
n = JSON.parse(JSON.stringify(n));
|
||||||
n._def = RED.nodes.getType(n.type) || {};
|
n._def = RED.nodes.getType(n.type) || {};
|
||||||
if (n._def) {
|
if (n._def) {
|
||||||
n._ = n._def._;
|
n._ = n._def._;
|
||||||
}
|
}
|
||||||
|
|
||||||
var div = $('<div>',{class:"red-ui-info-outline-item red-ui-info-outline-item-flow"});
|
var div = $('<div>',{class:"red-ui-info-outline-item red-ui-info-outline-item-flow red-ui-node-list-item"});
|
||||||
var contentDiv = $('<div>',{class:"red-ui-search-result-description red-ui-info-outline-item-label"}).appendTo(div);
|
var contentDiv = $('<div>',{class:"red-ui-search-result-description red-ui-info-outline-item-label"}).appendTo(div);
|
||||||
var label = (typeof n === "string")? n : n.label;
|
var label = (typeof n === "string")? n : n.label;
|
||||||
var newlineIndex = label.indexOf("\\n");
|
var newlineIndex = label.indexOf("\\n");
|
||||||
@@ -1076,25 +1236,28 @@ RED.clipboard = (function() {
|
|||||||
label = label.substring(0,newlineIndex)+"...";
|
label = label.substring(0,newlineIndex)+"...";
|
||||||
}
|
}
|
||||||
contentDiv.text(label);
|
contentDiv.text(label);
|
||||||
|
|
||||||
|
if (!!isConflicted) {
|
||||||
|
const conflictIcon = $('<span style="padding: 0 10px;"><i class="fa fa-exclamation-circle"></span>').appendTo(div)
|
||||||
|
RED.popover.tooltip(conflictIcon, RED._('clipboard.import.alreadyExists'))
|
||||||
|
}
|
||||||
|
|
||||||
// A conflicted flow should not be imported by default.
|
// A conflicted flow should not be imported by default.
|
||||||
return div;
|
return div;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNodeLabel(n, isConflicted) {
|
function getNodeLabel(n, isConflicted, isSelected, parent) {
|
||||||
n = JSON.parse(JSON.stringify(n));
|
n = JSON.parse(JSON.stringify(n));
|
||||||
n._def = RED.nodes.getType(n.type) || {};
|
n._def = RED.nodes.getType(n.type) || {};
|
||||||
if (n._def) {
|
if (n._def) {
|
||||||
n._ = n._def._;
|
n._ = n._def._;
|
||||||
}
|
}
|
||||||
var div = $('<div>',{class:"red-ui-info-outline-item"});
|
var div = $('<div>',{class:"red-ui-node-list-item"});
|
||||||
RED.utils.createNodeIcon(n).appendTo(div);
|
RED.utils.createNodeIcon(n,true).appendTo(div);
|
||||||
var contentDiv = $('<div>',{class:"red-ui-search-result-description"}).appendTo(div);
|
|
||||||
var labelText = getNodeLabelText(n);
|
if (!parent && !!isConflicted) {
|
||||||
var label = $('<div>',{class:"red-ui-search-result-node-label red-ui-info-outline-item-label"}).appendTo(contentDiv);
|
const conflictIcon = $('<span style="padding: 0 10px;"><i class="fa fa-exclamation-circle"></span>').appendTo(div)
|
||||||
if (labelText) {
|
RED.popover.tooltip(conflictIcon, RED._('clipboard.import.alreadyExists'))
|
||||||
label.text(labelText)
|
|
||||||
} else {
|
|
||||||
label.html(n.type)
|
|
||||||
}
|
}
|
||||||
return div;
|
return div;
|
||||||
}
|
}
|
||||||
@@ -1103,8 +1266,6 @@ RED.clipboard = (function() {
|
|||||||
init: function() {
|
init: function() {
|
||||||
setupDialogs();
|
setupDialogs();
|
||||||
|
|
||||||
$('<input type="text" id="red-ui-clipboard-hidden" tabIndex="-1">').appendTo("#red-ui-editor");
|
|
||||||
|
|
||||||
RED.actions.add("core:show-export-dialog",showExportNodes);
|
RED.actions.add("core:show-export-dialog",showExportNodes);
|
||||||
RED.actions.add("core:show-import-dialog",showImportNodes);
|
RED.actions.add("core:show-import-dialog",showImportNodes);
|
||||||
|
|
||||||
@@ -1124,17 +1285,20 @@ RED.clipboard = (function() {
|
|||||||
|
|
||||||
$('<div id="red-ui-drop-target"><div data-i18n="[append]workspace.dropFlowHere"><i class="fa fa-download"></i><br></div></div>').appendTo('#red-ui-editor');
|
$('<div id="red-ui-drop-target"><div data-i18n="[append]workspace.dropFlowHere"><i class="fa fa-download"></i><br></div></div>').appendTo('#red-ui-editor');
|
||||||
|
|
||||||
|
RED.keyboard.add("#red-ui-drop-target", "escape" ,hideDropTarget);
|
||||||
|
|
||||||
$('#red-ui-workspace-chart').on("dragenter",function(event) {
|
$('#red-ui-workspace-chart').on("dragenter",function(event) {
|
||||||
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
|
if (!RED.workspaces.isLocked() && (
|
||||||
$.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
|
$.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
|
||||||
$("#red-ui-drop-target").css({display:'table'});
|
$.inArray("Files",event.originalEvent.dataTransfer.types) != -1)) {
|
||||||
RED.keyboard.add("*", "escape" ,hideDropTarget);
|
$("#red-ui-drop-target").css({display:'table'}).focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#red-ui-drop-target').on("dragover",function(event) {
|
$('#red-ui-drop-target').on("dragover",function(event) {
|
||||||
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
|
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
|
||||||
$.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
|
$.inArray("Files",event.originalEvent.dataTransfer.types) != -1 ||
|
||||||
|
RED.workspaces.isLocked()) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1142,6 +1306,8 @@ RED.clipboard = (function() {
|
|||||||
hideDropTarget();
|
hideDropTarget();
|
||||||
})
|
})
|
||||||
.on("drop",function(event) {
|
.on("drop",function(event) {
|
||||||
|
if (!RED.workspaces.isLocked()) {
|
||||||
|
try {
|
||||||
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1) {
|
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1) {
|
||||||
var data = event.originalEvent.dataTransfer.getData("text/plain");
|
var data = event.originalEvent.dataTransfer.getData("text/plain");
|
||||||
data = data.substring(data.indexOf('['),data.lastIndexOf(']')+1);
|
data = data.substring(data.indexOf('['),data.lastIndexOf(']')+1);
|
||||||
@@ -1159,6 +1325,11 @@ RED.clipboard = (function() {
|
|||||||
reader.readAsText(file);
|
reader.readAsText(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch(err) {
|
||||||
|
// Ensure any errors throw above doesn't stop the drop target from
|
||||||
|
// being hidden.
|
||||||
|
}
|
||||||
|
}
|
||||||
hideDropTarget();
|
hideDropTarget();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
});
|
});
|
||||||
|
|||||||
126
packages/node_modules/@node-red/editor-client/src/js/ui/common/autoComplete.js
vendored
Normal file
126
packages/node_modules/@node-red/editor-client/src/js/ui/common/autoComplete.js
vendored
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
(function($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attach to an <input type="text"> to provide auto-complete
|
||||||
|
*
|
||||||
|
* $("#node-red-text").autoComplete({
|
||||||
|
* search: function(value) { return ['a','b','c'] }
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
* options:
|
||||||
|
*
|
||||||
|
* search: function(value, [done])
|
||||||
|
* A function that is passed the current contents of the input whenever
|
||||||
|
* it changes.
|
||||||
|
* The function must either return auto-complete options, or pass them
|
||||||
|
* to the optional 'done' parameter.
|
||||||
|
* 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:
|
||||||
|
* {
|
||||||
|
* value: String : the value to insert if selected
|
||||||
|
* label: String|DOM Element : the label to display in the dropdown.
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.widget( "nodered.autoComplete", {
|
||||||
|
_create: function() {
|
||||||
|
const that = this;
|
||||||
|
this.completionMenuShown = false;
|
||||||
|
this.options.minLength = parseInteger(this.options.minLength, 1, 0);
|
||||||
|
this.options.search = this.options.search || function() { return [] };
|
||||||
|
this.element.addClass("red-ui-autoComplete");
|
||||||
|
this.element.on("keydown.red-ui-autoComplete", function(evt) {
|
||||||
|
if ((evt.keyCode === 13 || evt.keyCode === 9) && that.completionMenuShown) {
|
||||||
|
var opts = that.menu.options();
|
||||||
|
that.element.val(opts[0].value);
|
||||||
|
that.menu.hide();
|
||||||
|
evt.preventDefault();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.element.on("keyup.red-ui-autoComplete", function(evt) {
|
||||||
|
if (evt.keyCode === 13 || evt.keyCode === 9 || evt.keyCode === 27) {
|
||||||
|
// ENTER / TAB / ESCAPE
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (evt.keyCode === 8 || evt.keyCode === 46) {
|
||||||
|
// Delete/Backspace
|
||||||
|
if (!that.completionMenuShown) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
that._updateCompletions(this.value);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
_showCompletionMenu: function(completions) {
|
||||||
|
if (this.completionMenuShown) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.menu = RED.popover.menu({
|
||||||
|
tabSelect: true,
|
||||||
|
width: 300,
|
||||||
|
maxHeight: 200,
|
||||||
|
class: "red-ui-autoComplete-container",
|
||||||
|
options: completions,
|
||||||
|
onselect: (opt) => { this.element.val(opt.value); this.element.focus(); this.element.trigger("change") },
|
||||||
|
onclose: () => { this.completionMenuShown = false; delete this.menu; this.element.focus()}
|
||||||
|
});
|
||||||
|
this.menu.show({
|
||||||
|
target: this.element
|
||||||
|
})
|
||||||
|
this.completionMenuShown = true;
|
||||||
|
},
|
||||||
|
_updateCompletions: function(val) {
|
||||||
|
const that = this;
|
||||||
|
if (val.trim().length < this.options.minLength) {
|
||||||
|
if (this.completionMenuShown) {
|
||||||
|
this.menu.hide();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function displayResults(completions,requestId) {
|
||||||
|
if (requestId && requestId !== that.pendingRequest) {
|
||||||
|
// This request has been superseded
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!completions || completions.length === 0) {
|
||||||
|
if (that.completionMenuShown) {
|
||||||
|
that.menu.hide();
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (that.completionMenuShown) {
|
||||||
|
that.menu.options(completions);
|
||||||
|
} else {
|
||||||
|
that._showCompletionMenu(completions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.options.search.length === 2) {
|
||||||
|
const requestId = 1+Math.floor(Math.random()*10000);
|
||||||
|
this.pendingRequest = requestId;
|
||||||
|
this.options.search(val,function(completions) { displayResults(completions,requestId);})
|
||||||
|
} else {
|
||||||
|
displayResults(this.options.search(val))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_destroy: function() {
|
||||||
|
this.element.removeClass("red-ui-autoComplete")
|
||||||
|
this.element.off("keydown.red-ui-autoComplete")
|
||||||
|
this.element.off("keyup.red-ui-autoComplete")
|
||||||
|
if (this.completionMenuShown) {
|
||||||
|
this.menu.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
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);
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
/**
|
/**
|
||||||
* options:
|
* options:
|
||||||
* - addButton : boolean|string - text for add label, default 'add'
|
* - addButton : boolean|string - text for add label, default 'add'
|
||||||
|
* - buttons : array - list of custom buttons (objects with fields 'id', 'label', 'icon', 'title', 'click')
|
||||||
* - height : number|'auto'
|
* - height : number|'auto'
|
||||||
* - resize : function - called when list as a whole is resized
|
* - resize : function - called when list as a whole is resized
|
||||||
* - resizeItem : function(item) - called to resize individual item
|
* - resizeItem : function(item) - called to resize individual item
|
||||||
@@ -67,24 +68,55 @@
|
|||||||
this.topContainer.addClass(this.options.class);
|
this.topContainer.addClass(this.options.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var buttons = this.options.buttons || [];
|
||||||
|
|
||||||
if (this.options.addButton !== false) {
|
if (this.options.addButton !== false) {
|
||||||
var addLabel;
|
var addLabel, addTitle;
|
||||||
if (typeof this.options.addButton === 'string') {
|
if (typeof this.options.addButton === 'string') {
|
||||||
addLabel = this.options.addButton
|
addLabel = this.options.addButton
|
||||||
} else {
|
} else {
|
||||||
if (RED && RED._) {
|
if (RED && RED._) {
|
||||||
addLabel = RED._("editableList.add");
|
addLabel = RED._("editableList.add");
|
||||||
|
addTitle = RED._("editableList.addTitle");
|
||||||
} else {
|
} else {
|
||||||
addLabel = 'add';
|
addLabel = 'add';
|
||||||
|
addTitle = 'add new item';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$('<a href="#" class="red-ui-button red-ui-button-small red-ui-editableList-addButton" style="margin-top: 4px;"><i class="fa fa-plus"></i> '+addLabel+'</a>')
|
buttons.unshift({
|
||||||
.appendTo(this.topContainer)
|
label: addLabel,
|
||||||
.on("click", function(evt) {
|
icon: "fa fa-plus",
|
||||||
evt.preventDefault();
|
click: function(evt) {
|
||||||
that.addItem({});
|
that.addItem({});
|
||||||
|
},
|
||||||
|
title: addTitle
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buttons.forEach(function(button) {
|
||||||
|
var element = $('<button type="button" class="red-ui-button red-ui-button-small red-ui-editableList-addButton" style="margin-top: 4px; margin-right: 5px;"></button>')
|
||||||
|
.appendTo(that.topContainer)
|
||||||
|
.on("click", function(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
if (button.click !== undefined) {
|
||||||
|
button.click(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) {
|
||||||
|
element.append($("<span></span>").text(" " + button.label));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (this.element.css("position") === "absolute") {
|
if (this.element.css("position") === "absolute") {
|
||||||
["top","left","bottom","right"].forEach(function(s) {
|
["top","left","bottom","right"].forEach(function(s) {
|
||||||
var v = that.element.css(s);
|
var v = that.element.css(s);
|
||||||
@@ -128,7 +160,7 @@
|
|||||||
this.element.css("maxHeight",null);
|
this.element.css("maxHeight",null);
|
||||||
}
|
}
|
||||||
if (this.options.height !== 'auto') {
|
if (this.options.height !== 'auto') {
|
||||||
this.uiContainer.css("overflow-y","scroll");
|
this.uiContainer.css("overflow-y","auto");
|
||||||
if (!isNaN(this.options.height)) {
|
if (!isNaN(this.options.height)) {
|
||||||
this.uiHeight = this.options.height;
|
this.uiHeight = this.options.height;
|
||||||
}
|
}
|
||||||
@@ -385,6 +417,9 @@
|
|||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
cancel: function() {
|
||||||
|
this.element.sortable("cancel");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
RED.menu = (function() {
|
RED.menu = (function() {
|
||||||
|
|
||||||
var menuItems = {};
|
var menuItems = {};
|
||||||
|
let menuItemCount = 0
|
||||||
|
|
||||||
function createMenuItem(opt) {
|
function createMenuItem(opt) {
|
||||||
var item;
|
var item;
|
||||||
@@ -59,15 +60,16 @@ RED.menu = (function() {
|
|||||||
item = $('<li class="red-ui-menu-divider"></li>');
|
item = $('<li class="red-ui-menu-divider"></li>');
|
||||||
} else {
|
} else {
|
||||||
item = $('<li></li>');
|
item = $('<li></li>');
|
||||||
|
if (!opt.id) {
|
||||||
|
opt.id = 'red-ui-menu-item-'+(menuItemCount++)
|
||||||
|
}
|
||||||
if (opt.group) {
|
if (opt.group) {
|
||||||
item.addClass("red-ui-menu-group-"+opt.group);
|
item.addClass("red-ui-menu-group-"+opt.group);
|
||||||
|
|
||||||
}
|
}
|
||||||
var linkContent = '<a '+(opt.id?'id="'+opt.id+'" ':'')+'tabindex="-1" href="#">';
|
var linkContent = '<a '+(opt.id?'id="'+opt.id+'" ':'')+'tabindex="-1" href="#">';
|
||||||
if (opt.toggle) {
|
if (opt.toggle) {
|
||||||
linkContent += '<i class="fa fa-square pull-left"></i>';
|
linkContent += '<i class="fa fa-square'+(opt.direction!=='right'?" pull-left":"")+'"></i>';
|
||||||
linkContent += '<i class="fa fa-check-square pull-left"></i>';
|
linkContent += '<i class="fa fa-check-square'+(opt.direction!=='right'?" pull-left":"")+'"></i>';
|
||||||
|
|
||||||
}
|
}
|
||||||
if (opt.icon !== undefined) {
|
if (opt.icon !== undefined) {
|
||||||
@@ -77,17 +79,27 @@ RED.menu = (function() {
|
|||||||
linkContent += '<i class="'+(opt.icon?opt.icon:'" style="display: inline-block;"')+'"></i> ';
|
linkContent += '<i class="'+(opt.icon?opt.icon:'" style="display: inline-block;"')+'"></i> ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let label = opt.label
|
||||||
|
if (!opt.label && typeof opt.onselect === 'string') {
|
||||||
|
label = RED.actions.getLabel(opt.onselect)
|
||||||
|
}
|
||||||
if (opt.sublabel) {
|
if (opt.sublabel) {
|
||||||
linkContent += '<span class="red-ui-menu-label-container"><span class="red-ui-menu-label">'+opt.label+'</span>'+
|
linkContent += '<span class="red-ui-menu-label-container"><span class="red-ui-menu-label">'+label+'</span>'+
|
||||||
'<span class="red-ui-menu-sublabel">'+opt.sublabel+'</span></span>'
|
'<span class="red-ui-menu-sublabel">'+opt.sublabel+'</span></span>'
|
||||||
} else {
|
} else {
|
||||||
linkContent += '<span class="red-ui-menu-label">'+opt.label+'</span>'
|
linkContent += '<span class="red-ui-menu-label"><span>'+label+'</span></span>'
|
||||||
}
|
}
|
||||||
|
|
||||||
linkContent += '</a>';
|
linkContent += '</a>';
|
||||||
|
|
||||||
var link = $(linkContent).appendTo(item);
|
var link = $(linkContent).appendTo(item);
|
||||||
|
opt.link = link;
|
||||||
|
if (typeof opt.onselect === 'string' || opt.shortcut) {
|
||||||
|
var shortcut = opt.shortcut || RED.keyboard.getShortcut(opt.onselect);
|
||||||
|
if (shortcut && shortcut.key) {
|
||||||
|
opt.shortcutSpan = $('<span class="red-ui-popover-key">'+RED.keyboard.formatKey(shortcut.key, true)+'</span>').appendTo(link.find(".red-ui-menu-label"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
menuItems[opt.id] = opt;
|
menuItems[opt.id] = opt;
|
||||||
|
|
||||||
@@ -119,19 +131,45 @@ RED.menu = (function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (opt.options) {
|
if (opt.options) {
|
||||||
item.addClass("red-ui-menu-dropdown-submenu pull-left");
|
item.addClass("red-ui-menu-dropdown-submenu"+(opt.direction!=='right'?" pull-left":""));
|
||||||
var submenu = $('<ul id="'+opt.id+'-submenu" class="red-ui-menu-dropdown"></ul>').appendTo(item);
|
var submenu = $('<ul id="'+opt.id+'-submenu" class="red-ui-menu-dropdown"></ul>').appendTo(item);
|
||||||
|
var hasIcons = false
|
||||||
|
var hasSubmenus = false
|
||||||
|
|
||||||
for (var i=0;i<opt.options.length;i++) {
|
for (var i=0;i<opt.options.length;i++) {
|
||||||
|
|
||||||
|
if (opt.options[i]) {
|
||||||
|
if (opt.onpreselect && opt.options[i].onpreselect === undefined) {
|
||||||
|
opt.options[i].onpreselect = opt.onpreselect
|
||||||
|
}
|
||||||
|
if (opt.onpostselect && opt.options[i].onpostselect === undefined) {
|
||||||
|
opt.options[i].onpostselect = opt.onpostselect
|
||||||
|
}
|
||||||
|
opt.options[i].direction = opt.direction
|
||||||
|
hasIcons = hasIcons || (opt.options[i].icon);
|
||||||
|
hasSubmenus = hasSubmenus || (opt.options[i].options);
|
||||||
|
}
|
||||||
|
|
||||||
var li = createMenuItem(opt.options[i]);
|
var li = createMenuItem(opt.options[i]);
|
||||||
if (li) {
|
if (li) {
|
||||||
li.appendTo(submenu);
|
li.appendTo(submenu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!hasIcons) {
|
||||||
|
submenu.addClass("red-ui-menu-dropdown-noicons")
|
||||||
|
}
|
||||||
|
if (hasSubmenus) {
|
||||||
|
submenu.addClass("red-ui-menu-dropdown-submenus")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (opt.disabled) {
|
if (opt.disabled) {
|
||||||
item.addClass("disabled");
|
item.addClass("disabled");
|
||||||
}
|
}
|
||||||
|
if (opt.visible === false) {
|
||||||
|
item.addClass("hide");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -140,7 +178,9 @@ RED.menu = (function() {
|
|||||||
}
|
}
|
||||||
function createMenu(options) {
|
function createMenu(options) {
|
||||||
var topMenu = $("<ul/>",{class:"red-ui-menu red-ui-menu-dropdown pull-right"});
|
var topMenu = $("<ul/>",{class:"red-ui-menu red-ui-menu-dropdown pull-right"});
|
||||||
|
if (options.direction) {
|
||||||
|
topMenu.addClass("red-ui-menu-dropdown-direction-"+options.direction)
|
||||||
|
}
|
||||||
if (options.id) {
|
if (options.id) {
|
||||||
topMenu.attr({id:options.id+"-submenu"});
|
topMenu.attr({id:options.id+"-submenu"});
|
||||||
var menuParent = $("#"+options.id);
|
var menuParent = $("#"+options.id);
|
||||||
@@ -166,9 +206,22 @@ RED.menu = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var lastAddedSeparator = false;
|
var lastAddedSeparator = false;
|
||||||
|
var hasSubmenus = false;
|
||||||
|
var hasIcons = false;
|
||||||
for (var i=0;i<options.options.length;i++) {
|
for (var i=0;i<options.options.length;i++) {
|
||||||
var opt = options.options[i];
|
var opt = options.options[i];
|
||||||
|
if (opt) {
|
||||||
|
if (options.onpreselect && opt.onpreselect === undefined) {
|
||||||
|
opt.onpreselect = options.onpreselect
|
||||||
|
}
|
||||||
|
if (options.onpostselect && opt.onpostselect === undefined) {
|
||||||
|
opt.onpostselect = options.onpostselect
|
||||||
|
}
|
||||||
|
opt.direction = options.direction || 'left'
|
||||||
|
}
|
||||||
if (opt !== null || !lastAddedSeparator) {
|
if (opt !== null || !lastAddedSeparator) {
|
||||||
|
hasIcons = hasIcons || (opt && opt.icon);
|
||||||
|
hasSubmenus = hasSubmenus || (opt && opt.options);
|
||||||
var li = createMenuItem(opt);
|
var li = createMenuItem(opt);
|
||||||
if (li) {
|
if (li) {
|
||||||
li.appendTo(topMenu);
|
li.appendTo(topMenu);
|
||||||
@@ -176,13 +229,21 @@ RED.menu = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!hasIcons) {
|
||||||
|
topMenu.addClass("red-ui-menu-dropdown-noicons")
|
||||||
|
}
|
||||||
|
if (hasSubmenus) {
|
||||||
|
topMenu.addClass("red-ui-menu-dropdown-submenus")
|
||||||
|
}
|
||||||
return topMenu;
|
return topMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
function triggerAction(id, args) {
|
function triggerAction(id, args) {
|
||||||
var opt = menuItems[id];
|
var opt = menuItems[id];
|
||||||
var callback = opt.onselect;
|
var callback = opt.onselect;
|
||||||
|
if (opt.onpreselect) {
|
||||||
|
opt.onpreselect.call(opt,args)
|
||||||
|
}
|
||||||
if (typeof opt.onselect === 'string') {
|
if (typeof opt.onselect === 'string') {
|
||||||
callback = RED.actions.get(opt.onselect);
|
callback = RED.actions.get(opt.onselect);
|
||||||
}
|
}
|
||||||
@@ -191,6 +252,9 @@ RED.menu = (function() {
|
|||||||
} else {
|
} else {
|
||||||
console.log("No callback for",id,opt.onselect);
|
console.log("No callback for",id,opt.onselect);
|
||||||
}
|
}
|
||||||
|
if (opt.onpostselect) {
|
||||||
|
opt.onpostselect.call(opt,args)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isSelected(id) {
|
function isSelected(id) {
|
||||||
@@ -242,6 +306,14 @@ RED.menu = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setVisible(id,state) {
|
||||||
|
if (!state) {
|
||||||
|
$("#"+id).parent().addClass("hide");
|
||||||
|
} else {
|
||||||
|
$("#"+id).parent().removeClass("hide");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function addItem(id,opt) {
|
function addItem(id,opt) {
|
||||||
var item = createMenuItem(opt);
|
var item = createMenuItem(opt);
|
||||||
if (opt !== null && opt.group) {
|
if (opt !== null && opt.group) {
|
||||||
@@ -276,14 +348,32 @@ RED.menu = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function refreshShortcuts() {
|
||||||
|
for (var id in menuItems) {
|
||||||
|
if (menuItems.hasOwnProperty(id)) {
|
||||||
|
var opt = menuItems[id];
|
||||||
|
if (typeof opt.onselect === "string" && opt.shortcutSpan) {
|
||||||
|
opt.shortcutSpan.remove();
|
||||||
|
delete opt.shortcutSpan;
|
||||||
|
var shortcut = RED.keyboard.getShortcut(opt.onselect);
|
||||||
|
if (shortcut && shortcut.key) {
|
||||||
|
opt.shortcutSpan = $('<span class="red-ui-popover-key">'+RED.keyboard.formatKey(shortcut.key, true)+'</span>').appendTo(opt.link.find(".red-ui-menu-label"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
init: createMenu,
|
init: createMenu,
|
||||||
setSelected: setSelected,
|
setSelected: setSelected,
|
||||||
isSelected: isSelected,
|
isSelected: isSelected,
|
||||||
toggleSelected: toggleSelected,
|
toggleSelected: toggleSelected,
|
||||||
setDisabled: setDisabled,
|
setDisabled: setDisabled,
|
||||||
|
setVisible: setVisible,
|
||||||
addItem: addItem,
|
addItem: addItem,
|
||||||
removeItem: removeItem,
|
removeItem: removeItem,
|
||||||
setAction: setAction
|
setAction: setAction,
|
||||||
|
refreshShortcuts: refreshShortcuts
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -13,24 +13,138 @@
|
|||||||
* 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.
|
||||||
**/
|
**/
|
||||||
|
/*
|
||||||
|
* RED.popover.create(options) - create a popover callout box
|
||||||
|
* RED.popover.tooltip(target,content, action) - add a tooltip to an element
|
||||||
|
* RED.popover.menu(options) - create a dropdown menu
|
||||||
|
* RED.popover.panel(content) - create a dropdown container element
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RED.popover.create(options)
|
||||||
|
*
|
||||||
|
* options
|
||||||
|
* - target : DOM element - the element to target with the popover
|
||||||
|
* - direction : string - position of the popover relative to target
|
||||||
|
* 'top', 'right'(default), 'bottom', 'left', 'inset-[top,right,bottom,left]'
|
||||||
|
* - trigger : string - what triggers the popover to be displayed
|
||||||
|
* 'hover' - display when hovering the target
|
||||||
|
* 'click' - display when target is clicked
|
||||||
|
* 'modal' - hmm not sure, need to find where we use that mode
|
||||||
|
* - content : string|function - contents of the popover. If a string, handled
|
||||||
|
* as raw HTML, so take care.
|
||||||
|
* If a function, can return a String to be added
|
||||||
|
* as text (not HTML), or a DOM element to append
|
||||||
|
* - delay : object - sets show/hide delays after mouseover/out events
|
||||||
|
* { show: 750, hide: 50 }
|
||||||
|
* - autoClose : number - delay before closing the popover in some cases
|
||||||
|
* if trigger is click - delay after mouseout
|
||||||
|
* else if trigger not hover/modal - delay after showing
|
||||||
|
* - width : number - width of popover, default 'auto'
|
||||||
|
* - maxWidth : number - max width of popover, default 'auto'
|
||||||
|
* - size : string - scale of popover. 'default', 'small'
|
||||||
|
* - offset : number - px offset from target
|
||||||
|
* - tooltip : boolean - if true, clicking on popover closes it
|
||||||
|
* - class : string - optional css class to apply to popover
|
||||||
|
* - interactive : if trigger is 'hover' and this is set to true, allow the mouse
|
||||||
|
* to move over the popover without hiding it.
|
||||||
|
*
|
||||||
|
* Returns the popover object with the following properties/functions:
|
||||||
|
* properties:
|
||||||
|
* - element : DOM element - the popover dom element
|
||||||
|
* functions:
|
||||||
|
* - setContent(content) - change the popover content. This only works if the
|
||||||
|
* popover is not currently displayed. It does not
|
||||||
|
* change the content of a visible popover.
|
||||||
|
* - open(instant) - show the popover. If 'instant' is true, don't fade in
|
||||||
|
* - close(instant) - hide the popover. If 'instant' is true, don't fade out
|
||||||
|
* - move(options) - move the popover. The options parameter can take many
|
||||||
|
* of the options detailed above including:
|
||||||
|
* target,direction,content,width,offset
|
||||||
|
* Other settings probably won't work because we haven't needed to change them
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RED.popover.tooltip(target,content, action)
|
||||||
|
*
|
||||||
|
* - target : DOM element - the element to apply the tooltip to
|
||||||
|
* - content : string - the text of the tooltip
|
||||||
|
* - action : string - *optional* the name of an Action this tooltip is tied to
|
||||||
|
* For example, it 'target' is a button that triggers a particular action.
|
||||||
|
* The tooltip will include the keyboard shortcut for the action
|
||||||
|
* if one is defined
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RED.popover.menu(options)
|
||||||
|
*
|
||||||
|
* options
|
||||||
|
* - options : array - list of menu options - see below for format
|
||||||
|
* - width : number - width of the menu. Default: 'auto'
|
||||||
|
* - class : string - class to apply to the menu container
|
||||||
|
* - maxHeight : number - maximum height of menu before scrolling items. Default: none
|
||||||
|
* - onselect : function(item) - called when a menu item is selected, if that item doesn't
|
||||||
|
* have its own onselect function
|
||||||
|
* - onclose : function(cancelled) - called when the menu is closed
|
||||||
|
* - disposeOnClose : boolean - by default, the menu is discarded when it closes
|
||||||
|
* and mustbe rebuilt to redisplay. Setting this to 'false'
|
||||||
|
* keeps the menu on the DOM so it can be shown again.
|
||||||
|
*
|
||||||
|
* Menu Options array:
|
||||||
|
* [
|
||||||
|
* label : string|DOM element - the label of the item. Can be custom DOM element
|
||||||
|
* onselect : function - called when the item is selected
|
||||||
|
* ]
|
||||||
|
*
|
||||||
|
* Returns the menu object with the following functions:
|
||||||
|
*
|
||||||
|
* - options([menuItems]) - if menuItems is undefined, returns the current items.
|
||||||
|
* otherwise, sets the current menu items
|
||||||
|
* - show(opts) - shows the menu. `opts` is an object of options. See RED.popover.panel.show(opts)
|
||||||
|
* for the full list of options. In most scenarios, this just needs:
|
||||||
|
* - target : DOM element - the element to display the menu below
|
||||||
|
* - hide(cancelled) - hide the menu
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RED.popover.panel(content)
|
||||||
|
* Create a UI panel that can be displayed relative to any target element.
|
||||||
|
* Handles auto-closing when mouse clicks outside the panel
|
||||||
|
*
|
||||||
|
* - 'content' - DOM element to display in the panel
|
||||||
|
*
|
||||||
|
* Returns the panel object with the following functions:
|
||||||
|
*
|
||||||
|
* properties:
|
||||||
|
* - container : DOM element - the panel element
|
||||||
|
*
|
||||||
|
* functions:
|
||||||
|
* - show(opts) - show the panel.
|
||||||
|
* opts:
|
||||||
|
* - onclose : function - called when the panel closes
|
||||||
|
* - closeButton : DOM element - if the panel is closeable by a click of a button,
|
||||||
|
* by providing a reference to it here, we can
|
||||||
|
* handle the events properly to hide the panel
|
||||||
|
* - target : DOM element - the element to display the panel relative to
|
||||||
|
* - align : string - should the panel align to the left or right edge of target
|
||||||
|
* default: 'right'
|
||||||
|
* - offset : Array - px offset to apply from the target. [width, height]
|
||||||
|
* - dispose : boolean - whether the panel should be removed from DOM when hidden
|
||||||
|
* default: true
|
||||||
|
* - hide(dispose) - hide the panel.
|
||||||
|
*/
|
||||||
|
|
||||||
RED.popover = (function() {
|
RED.popover = (function() {
|
||||||
var deltaSizes = {
|
var deltaSizes = {
|
||||||
"default": {
|
"default": {
|
||||||
top: 10,
|
x: 12,
|
||||||
topTop: 30,
|
y: 12
|
||||||
leftRight: 17,
|
|
||||||
leftLeft: 25,
|
|
||||||
leftBottom: 8,
|
|
||||||
leftTop: 11
|
|
||||||
},
|
},
|
||||||
"small": {
|
"small": {
|
||||||
top: 6,
|
x:8,
|
||||||
topTop: 20,
|
y:8
|
||||||
leftRight: 8,
|
|
||||||
leftLeft: 26,
|
|
||||||
leftBottom: 8,
|
|
||||||
leftTop: 9
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function createPopover(options) {
|
function createPopover(options) {
|
||||||
@@ -41,7 +155,9 @@ RED.popover = (function() {
|
|||||||
var delay = options.delay || { show: 750, hide: 50 };
|
var delay = options.delay || { show: 750, hide: 50 };
|
||||||
var autoClose = options.autoClose;
|
var autoClose = options.autoClose;
|
||||||
var width = options.width||"auto";
|
var width = options.width||"auto";
|
||||||
|
var maxWidth = options.maxWidth;
|
||||||
var size = options.size||"default";
|
var size = options.size||"default";
|
||||||
|
var popupOffset = options.offset || 0;
|
||||||
if (!deltaSizes[size]) {
|
if (!deltaSizes[size]) {
|
||||||
throw new Error("Invalid RED.popover size value:",size);
|
throw new Error("Invalid RED.popover size value:",size);
|
||||||
}
|
}
|
||||||
@@ -49,6 +165,8 @@ RED.popover = (function() {
|
|||||||
var timer = null;
|
var timer = null;
|
||||||
var active;
|
var active;
|
||||||
var div;
|
var div;
|
||||||
|
var contentDiv;
|
||||||
|
var currentStyle;
|
||||||
|
|
||||||
var openPopup = function(instant) {
|
var openPopup = function(instant) {
|
||||||
if (active) {
|
if (active) {
|
||||||
@@ -58,6 +176,10 @@ RED.popover = (function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
div = $('<div class="red-ui-popover"></div>');
|
div = $('<div class="red-ui-popover"></div>');
|
||||||
|
if (options.class) {
|
||||||
|
div.addClass(options.class);
|
||||||
|
}
|
||||||
|
contentDiv = $('<div class="red-ui-popover-content">').appendTo(div);
|
||||||
if (size !== "default") {
|
if (size !== "default") {
|
||||||
div.addClass("red-ui-popover-size-"+size);
|
div.addClass("red-ui-popover-size-"+size);
|
||||||
}
|
}
|
||||||
@@ -67,71 +189,23 @@ RED.popover = (function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (typeof result === 'string') {
|
if (typeof result === 'string') {
|
||||||
div.text(result);
|
contentDiv.text(result);
|
||||||
} else {
|
} else {
|
||||||
div.append(result);
|
contentDiv.append(result);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
div.html(content);
|
contentDiv.html(content);
|
||||||
}
|
|
||||||
if (width !== "auto") {
|
|
||||||
div.width(width);
|
|
||||||
}
|
}
|
||||||
div.appendTo("body");
|
div.appendTo("body");
|
||||||
|
|
||||||
var targetPos = target.offset();
|
movePopup({target,direction,width,maxWidth});
|
||||||
var targetWidth = target.outerWidth();
|
|
||||||
var targetHeight = target.outerHeight();
|
|
||||||
var divHeight = div.height();
|
|
||||||
var divWidth = div.width();
|
|
||||||
var paddingRight = 10;
|
|
||||||
|
|
||||||
var viewportTop = $(window).scrollTop();
|
|
||||||
var viewportLeft = $(window).scrollLeft();
|
|
||||||
var viewportBottom = viewportTop + $(window).height();
|
|
||||||
var viewportRight = viewportLeft + $(window).width();
|
|
||||||
var top = 0;
|
|
||||||
var left = 0;
|
|
||||||
var d = direction;
|
|
||||||
if (d === 'right') {
|
|
||||||
top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
|
|
||||||
left = targetPos.left+targetWidth+deltaSizes[size].leftRight;
|
|
||||||
} else if (d === 'left') {
|
|
||||||
top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
|
|
||||||
left = targetPos.left-deltaSizes[size].leftLeft-divWidth;
|
|
||||||
} else if (d === 'bottom') {
|
|
||||||
top = targetPos.top+targetHeight+deltaSizes[size].top;
|
|
||||||
left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftBottom;
|
|
||||||
if (left < 0) {
|
|
||||||
d = "right";
|
|
||||||
top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
|
|
||||||
left = targetPos.left+targetWidth+deltaSizes[size].leftRight;
|
|
||||||
} else if (left+divWidth+paddingRight > viewportRight) {
|
|
||||||
d = "left";
|
|
||||||
top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
|
|
||||||
left = targetPos.left-deltaSizes[size].leftLeft-divWidth;
|
|
||||||
if (top+divHeight+targetHeight/2 + 5 > viewportBottom) {
|
|
||||||
top -= (top+divHeight+targetHeight/2 - viewportBottom + 5)
|
|
||||||
}
|
|
||||||
} else if (top+divHeight > viewportBottom) {
|
|
||||||
d = 'top';
|
|
||||||
top = targetPos.top-deltaSizes[size].topTop-divHeight;
|
|
||||||
left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftTop;
|
|
||||||
}
|
|
||||||
} else if (d === 'top') {
|
|
||||||
top = targetPos.top-deltaSizes[size].topTop-divHeight;
|
|
||||||
left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftTop;
|
|
||||||
if (top < 0) {
|
|
||||||
d = 'bottom';
|
|
||||||
top = targetPos.top+targetHeight+deltaSizes[size].top;
|
|
||||||
left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftBottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
div.addClass('red-ui-popover-'+d).css({top: top, left: left});
|
|
||||||
if (existingPopover) {
|
if (existingPopover) {
|
||||||
existingPopover.close(true);
|
existingPopover.close(true);
|
||||||
}
|
}
|
||||||
|
if (options.trigger !== 'manual') {
|
||||||
target.data("red-ui-popover",res)
|
target.data("red-ui-popover",res)
|
||||||
|
}
|
||||||
if (options.tooltip) {
|
if (options.tooltip) {
|
||||||
div.on("mousedown", function(evt) {
|
div.on("mousedown", function(evt) {
|
||||||
closePopup(true);
|
closePopup(true);
|
||||||
@@ -161,6 +235,104 @@ RED.popover = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var movePopup = function(options) {
|
||||||
|
target = options.target || target;
|
||||||
|
direction = options.direction || direction || "right";
|
||||||
|
popupOffset = options.offset || popupOffset;
|
||||||
|
var transition = options.transition;
|
||||||
|
|
||||||
|
var width = options.width||"auto";
|
||||||
|
div.width(width);
|
||||||
|
if (options.maxWidth) {
|
||||||
|
div.css("max-width",options.maxWidth)
|
||||||
|
} else {
|
||||||
|
div.css("max-width", 'auto');
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetPos = target[0].getBoundingClientRect();
|
||||||
|
var targetHeight = targetPos.height;
|
||||||
|
var targetWidth = targetPos.width;
|
||||||
|
|
||||||
|
var divHeight = div.outerHeight();
|
||||||
|
var divWidth = div.outerWidth();
|
||||||
|
var paddingRight = 10;
|
||||||
|
|
||||||
|
var viewportTop = $(window).scrollTop();
|
||||||
|
var viewportLeft = $(window).scrollLeft();
|
||||||
|
var viewportBottom = viewportTop + $(window).height();
|
||||||
|
var viewportRight = viewportLeft + $(window).width();
|
||||||
|
var top = 0;
|
||||||
|
var left = 0;
|
||||||
|
if (direction === 'right') {
|
||||||
|
top = targetPos.top+targetHeight/2-divHeight/2;
|
||||||
|
left = targetPos.left+targetWidth+deltaSizes[size].x+popupOffset;
|
||||||
|
} else if (direction === 'left') {
|
||||||
|
top = targetPos.top+targetHeight/2-divHeight/2;
|
||||||
|
left = targetPos.left-deltaSizes[size].x-divWidth-popupOffset;
|
||||||
|
} else if (direction === 'bottom') {
|
||||||
|
top = targetPos.top+targetHeight+deltaSizes[size].y+popupOffset;
|
||||||
|
left = targetPos.left+targetWidth/2-divWidth/2;
|
||||||
|
if (left < 0) {
|
||||||
|
direction = "right";
|
||||||
|
top = targetPos.top+targetHeight/2-divHeight/2;
|
||||||
|
left = targetPos.left+targetWidth+deltaSizes[size].x+popupOffset;
|
||||||
|
} else if (left+divWidth+paddingRight > viewportRight) {
|
||||||
|
direction = "left";
|
||||||
|
top = targetPos.top+targetHeight/2-divHeight/2;
|
||||||
|
left = targetPos.left-deltaSizes[size].x-divWidth-popupOffset;
|
||||||
|
if (top+divHeight+targetHeight/2 + 5 > viewportBottom) {
|
||||||
|
top -= (top+divHeight+targetHeight/2 - viewportBottom + 5)
|
||||||
|
}
|
||||||
|
} else if (top+divHeight > viewportBottom) {
|
||||||
|
direction = 'top';
|
||||||
|
top = targetPos.top-deltaSizes[size].y-divHeight-popupOffset;
|
||||||
|
left = targetPos.left+targetWidth/2-divWidth/2;
|
||||||
|
}
|
||||||
|
} else if (direction === 'top') {
|
||||||
|
top = targetPos.top-deltaSizes[size].y-divHeight-popupOffset;
|
||||||
|
left = targetPos.left+targetWidth/2-divWidth/2;
|
||||||
|
if (top < 0) {
|
||||||
|
direction = 'bottom';
|
||||||
|
top = targetPos.top+targetHeight+deltaSizes[size].y+popupOffset;
|
||||||
|
left = targetPos.left+targetWidth/2-divWidth/2;
|
||||||
|
}
|
||||||
|
} else if (/inset/.test(direction)) {
|
||||||
|
top = targetPos.top + targetHeight/2 - divHeight/2;
|
||||||
|
left = targetPos.left + targetWidth/2 - divWidth/2;
|
||||||
|
|
||||||
|
if (/bottom/.test(direction)) {
|
||||||
|
top = targetPos.top + targetHeight - divHeight-popupOffset;
|
||||||
|
}
|
||||||
|
if (/top/.test(direction)) {
|
||||||
|
top = targetPos.top+popupOffset;
|
||||||
|
}
|
||||||
|
if (/left/.test(direction)) {
|
||||||
|
left = targetPos.left+popupOffset;
|
||||||
|
}
|
||||||
|
if (/right/.test(direction)) {
|
||||||
|
left = targetPos.left + targetWidth - divWidth-popupOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentStyle) {
|
||||||
|
div.removeClass(currentStyle);
|
||||||
|
}
|
||||||
|
if (transition) {
|
||||||
|
div.css({
|
||||||
|
"transition": "0.6s ease",
|
||||||
|
"transition-property": "top,left,right,bottom"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
currentStyle = 'red-ui-popover-'+direction;
|
||||||
|
div.addClass(currentStyle).css({top: top, left: left});
|
||||||
|
if (transition) {
|
||||||
|
setTimeout(function() {
|
||||||
|
div.css({
|
||||||
|
"transition": "none"
|
||||||
|
});
|
||||||
|
},600);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
var closePopup = function(instant) {
|
var closePopup = function(instant) {
|
||||||
$(document).off('mousedown.red-ui-popover');
|
$(document).off('mousedown.red-ui-popover');
|
||||||
if (!active) {
|
if (!active) {
|
||||||
@@ -178,6 +350,16 @@ RED.popover = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
target.on("remove", function (ev) {
|
||||||
|
if (timer) {
|
||||||
|
clearTimeout(timer);
|
||||||
|
}
|
||||||
|
if (active) {
|
||||||
|
active = false;
|
||||||
|
setTimeout(closePopup,delay.hide);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (trigger === 'hover') {
|
if (trigger === 'hover') {
|
||||||
target.on('mouseenter',function(e) {
|
target.on('mouseenter',function(e) {
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
@@ -236,8 +418,10 @@ RED.popover = (function() {
|
|||||||
},autoClose);
|
},autoClose);
|
||||||
}
|
}
|
||||||
var res = {
|
var res = {
|
||||||
|
get element() { return div },
|
||||||
setContent: function(_content) {
|
setContent: function(_content) {
|
||||||
content = _content;
|
content = _content;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
},
|
},
|
||||||
open: function (instant) {
|
open: function (instant) {
|
||||||
@@ -249,6 +433,10 @@ RED.popover = (function() {
|
|||||||
active = false;
|
active = false;
|
||||||
closePopup(instant);
|
closePopup(instant);
|
||||||
return res;
|
return res;
|
||||||
|
},
|
||||||
|
move: function(options) {
|
||||||
|
movePopup(options);
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
@@ -258,18 +446,17 @@ RED.popover = (function() {
|
|||||||
return {
|
return {
|
||||||
create: createPopover,
|
create: createPopover,
|
||||||
tooltip: function(target,content, action) {
|
tooltip: function(target,content, action) {
|
||||||
|
var label = function() {
|
||||||
var label = content;
|
var label = content;
|
||||||
if (action) {
|
if (action) {
|
||||||
label = function() {
|
|
||||||
var label = content;
|
|
||||||
var shortcut = RED.keyboard.getShortcut(action);
|
var shortcut = RED.keyboard.getShortcut(action);
|
||||||
if (shortcut && shortcut.key) {
|
if (shortcut && shortcut.key) {
|
||||||
label = $('<span>'+content+' <span class="red-ui-popover-key">'+RED.keyboard.formatKey(shortcut.key, true)+'</span></span>');
|
label = $('<span>'+content+' <span class="red-ui-popover-key">'+RED.keyboard.formatKey(shortcut.key, true)+'</span></span>');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
}
|
var popover = RED.popover.create({
|
||||||
return RED.popover.create({
|
|
||||||
tooltip: true,
|
tooltip: true,
|
||||||
target:target,
|
target:target,
|
||||||
trigger: "hover",
|
trigger: "hover",
|
||||||
@@ -278,6 +465,19 @@ RED.popover = (function() {
|
|||||||
content: label,
|
content: label,
|
||||||
delay: { show: 750, hide: 50 }
|
delay: { show: 750, hide: 50 }
|
||||||
});
|
});
|
||||||
|
popover.setContent = function(newContent) {
|
||||||
|
content = newContent;
|
||||||
|
}
|
||||||
|
popover.setAction = function(newAction) {
|
||||||
|
action = newAction;
|
||||||
|
}
|
||||||
|
popover.delete = function() {
|
||||||
|
popover.close(true)
|
||||||
|
target.off("mouseenter");
|
||||||
|
target.off("mouseleave");
|
||||||
|
};
|
||||||
|
return popover;
|
||||||
|
|
||||||
},
|
},
|
||||||
menu: function(options) {
|
menu: function(options) {
|
||||||
var list = $('<ul class="red-ui-menu"></ul>');
|
var list = $('<ul class="red-ui-menu"></ul>');
|
||||||
@@ -286,20 +486,47 @@ RED.popover = (function() {
|
|||||||
}
|
}
|
||||||
var menuOptions = options.options || [];
|
var menuOptions = options.options || [];
|
||||||
var first;
|
var first;
|
||||||
|
|
||||||
|
var container = RED.popover.panel(list);
|
||||||
|
if (options.width) {
|
||||||
|
container.container.width(options.width);
|
||||||
|
}
|
||||||
|
if (options.class) {
|
||||||
|
container.container.addClass(options.class);
|
||||||
|
}
|
||||||
|
if (options.maxHeight) {
|
||||||
|
container.container.css({
|
||||||
|
"max-height": options.maxHeight,
|
||||||
|
"overflow-y": 'auto'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
var menu = {
|
||||||
|
options: function(opts) {
|
||||||
|
if (opts === undefined) {
|
||||||
|
return menuOptions
|
||||||
|
}
|
||||||
|
menuOptions = opts || [];
|
||||||
|
list.empty();
|
||||||
menuOptions.forEach(function(opt) {
|
menuOptions.forEach(function(opt) {
|
||||||
var item = $('<li>').appendTo(list);
|
var item = $('<li>').appendTo(list);
|
||||||
var link = $('<a href="#"></a>').text(opt.label).appendTo(item);
|
var link = $('<a href="#"></a>').appendTo(item);
|
||||||
|
if (typeof opt.label == "string") {
|
||||||
|
link.text(opt.label)
|
||||||
|
} else if (opt.label){
|
||||||
|
opt.label.appendTo(link);
|
||||||
|
}
|
||||||
link.on("click", function(evt) {
|
link.on("click", function(evt) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
if (opt.onselect) {
|
if (opt.onselect) {
|
||||||
opt.onselect();
|
opt.onselect();
|
||||||
|
} else if (options.onselect) {
|
||||||
|
options.onselect(opt);
|
||||||
}
|
}
|
||||||
menu.hide();
|
menu.hide();
|
||||||
})
|
})
|
||||||
if (!first) { first = link}
|
if (!first) { first = link}
|
||||||
})
|
})
|
||||||
var container = RED.popover.panel(list);
|
},
|
||||||
var menu = {
|
|
||||||
show: function(opts) {
|
show: function(opts) {
|
||||||
$(document).on("keydown.red-ui-menu", function(evt) {
|
$(document).on("keydown.red-ui-menu", function(evt) {
|
||||||
var currentItem = list.find(":focus").parent();
|
var currentItem = list.find(":focus").parent();
|
||||||
@@ -308,11 +535,9 @@ RED.popover = (function() {
|
|||||||
// DOWN
|
// DOWN
|
||||||
if (currentItem.length > 0) {
|
if (currentItem.length > 0) {
|
||||||
if (currentItem.index() === menuOptions.length-1) {
|
if (currentItem.index() === menuOptions.length-1) {
|
||||||
console.log("WARP TO TOP")
|
|
||||||
// Wrap to top of list
|
// Wrap to top of list
|
||||||
list.children().first().children().first().focus();
|
list.children().first().children().first().focus();
|
||||||
} else {
|
} else {
|
||||||
console.log("GO DOWN ONE")
|
|
||||||
currentItem.next().children().first().focus();
|
currentItem.next().children().first().focus();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -323,11 +548,9 @@ RED.popover = (function() {
|
|||||||
// UP
|
// UP
|
||||||
if (currentItem.length > 0) {
|
if (currentItem.length > 0) {
|
||||||
if (currentItem.index() === 0) {
|
if (currentItem.index() === 0) {
|
||||||
console.log("WARP TO BOTTOM")
|
|
||||||
// Wrap to bottom of list
|
// Wrap to bottom of list
|
||||||
list.children().last().children().first().focus();
|
list.children().last().children().first().focus();
|
||||||
} else {
|
} else {
|
||||||
console.log("GO UP ONE")
|
|
||||||
currentItem.prev().children().first().focus();
|
currentItem.prev().children().first().focus();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -337,6 +560,11 @@ RED.popover = (function() {
|
|||||||
// ESCAPE
|
// ESCAPE
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
menu.hide(true);
|
menu.hide(true);
|
||||||
|
} else if (evt.keyCode === 9 && options.tabSelect) {
|
||||||
|
// TAB - with tabSelect enabled
|
||||||
|
evt.preventDefault();
|
||||||
|
currentItem.find("a").trigger("click");
|
||||||
|
|
||||||
}
|
}
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
})
|
})
|
||||||
@@ -356,6 +584,7 @@ RED.popover = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
menu.options(menuOptions);
|
||||||
return menu;
|
return menu;
|
||||||
},
|
},
|
||||||
panel: function(content) {
|
panel: function(content) {
|
||||||
@@ -363,7 +592,6 @@ RED.popover = (function() {
|
|||||||
panel.css({ display: "none" });
|
panel.css({ display: "none" });
|
||||||
panel.appendTo(document.body);
|
panel.appendTo(document.body);
|
||||||
content.appendTo(panel);
|
content.appendTo(panel);
|
||||||
var closeCallback;
|
|
||||||
|
|
||||||
function hide(dispose) {
|
function hide(dispose) {
|
||||||
$(document).off("mousedown.red-ui-popover-panel-close");
|
$(document).off("mousedown.red-ui-popover-panel-close");
|
||||||
@@ -378,22 +606,26 @@ RED.popover = (function() {
|
|||||||
}
|
}
|
||||||
function show(options) {
|
function show(options) {
|
||||||
var closeCallback = options.onclose;
|
var closeCallback = options.onclose;
|
||||||
|
var closeButton = options.closeButton;
|
||||||
var target = options.target;
|
var target = options.target;
|
||||||
var align = options.align || "right";
|
var align = options.align || "right";
|
||||||
var offset = options.offset || [0,0];
|
var offset = options.offset || [0,0];
|
||||||
|
var xPos = options.x;
|
||||||
|
var yPos = options.y;
|
||||||
|
var isAbsolutePosition = (xPos !== undefined && yPos !== undefined)
|
||||||
|
|
||||||
var pos = target.offset();
|
var pos = isAbsolutePosition?{left:xPos, top: yPos}:target.offset();
|
||||||
var targetWidth = target.width();
|
var targetWidth = isAbsolutePosition?0:target.width();
|
||||||
var targetHeight = target.height();
|
var targetHeight = isAbsolutePosition?0:target.outerHeight();
|
||||||
var panelHeight = panel.height();
|
var panelHeight = panel.height();
|
||||||
var panelWidth = panel.width();
|
var panelWidth = panel.width();
|
||||||
|
|
||||||
var top = (targetHeight+pos.top) + offset[1];
|
var top = (targetHeight+pos.top) + offset[1];
|
||||||
if (top+panelHeight > $(window).height()) {
|
if (top+panelHeight-$(document).scrollTop() > $(window).height()) {
|
||||||
top -= (top+panelHeight)-$(window).height() + 5;
|
top -= (top+panelHeight)-$(window).height() + 5;
|
||||||
}
|
}
|
||||||
if (top < 0) {
|
if (top < 0) {
|
||||||
panelHeight.height(panelHeight+top)
|
panel.height(panelHeight+top)
|
||||||
top = 0;
|
top = 0;
|
||||||
}
|
}
|
||||||
if (align === "right") {
|
if (align === "right") {
|
||||||
@@ -420,7 +652,8 @@ RED.popover = (function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$(document).on("mousedown.red-ui-popover-panel-close", function(event) {
|
$(document).on("mousedown.red-ui-popover-panel-close", function(event) {
|
||||||
if(!$(event.target).closest(panel).length && !$(event.target).closest(".red-ui-editor-dialog").length) {
|
var hitCloseButton = closeButton && $(event.target).closest(closeButton).length;
|
||||||
|
if(!hitCloseButton && !$(event.target).closest(panel).length && !$(event.target).closest(".red-ui-editor-dialog").length) {
|
||||||
if (closeCallback) {
|
if (closeCallback) {
|
||||||
closeCallback();
|
closeCallback();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ RED.tabs = (function() {
|
|||||||
var currentTabWidth;
|
var currentTabWidth;
|
||||||
var currentActiveTabWidth = 0;
|
var currentActiveTabWidth = 0;
|
||||||
var collapsibleMenu;
|
var collapsibleMenu;
|
||||||
|
var mousedownTab;
|
||||||
var preferredOrder = options.order;
|
var preferredOrder = options.order;
|
||||||
var ul = options.element || $("#"+options.id);
|
var ul = options.element || $("#"+options.id);
|
||||||
var wrapper = ul.wrap( "<div>" ).parent();
|
var wrapper = ul.wrap( "<div>" ).parent();
|
||||||
@@ -37,6 +38,7 @@ RED.tabs = (function() {
|
|||||||
if (options.vertical) {
|
if (options.vertical) {
|
||||||
wrapper.addClass("red-ui-tabs-vertical");
|
wrapper.addClass("red-ui-tabs-vertical");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.addButton) {
|
if (options.addButton) {
|
||||||
wrapper.addClass("red-ui-tabs-add");
|
wrapper.addClass("red-ui-tabs-add");
|
||||||
var addButton = $('<div class="red-ui-tab-button red-ui-tabs-add"><a href="#"><i class="fa fa-plus"></i></a></div>').appendTo(wrapper);
|
var addButton = $('<div class="red-ui-tab-button red-ui-tabs-add"><a href="#"><i class="fa fa-plus"></i></a></div>').appendTo(wrapper);
|
||||||
@@ -74,6 +76,8 @@ RED.tabs = (function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (options.searchButton) {
|
if (options.searchButton) {
|
||||||
|
// This is soft-deprecated as we don't use this in the core anymore
|
||||||
|
// We no use the `menu` option to provide a drop-down list of actions
|
||||||
wrapper.addClass("red-ui-tabs-search");
|
wrapper.addClass("red-ui-tabs-search");
|
||||||
var searchButton = $('<div class="red-ui-tab-button red-ui-tabs-search"><a href="#"><i class="fa fa-list-ul"></i></a></div>').appendTo(wrapper);
|
var searchButton = $('<div class="red-ui-tab-button red-ui-tabs-search"><a href="#"><i class="fa fa-list-ul"></i></a></div>').appendTo(wrapper);
|
||||||
searchButton.find('a').on("click", function(evt) {
|
searchButton.find('a').on("click", function(evt) {
|
||||||
@@ -93,17 +97,100 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (options.menu) {
|
||||||
|
wrapper.addClass("red-ui-tabs-menu");
|
||||||
|
var menuButton = $('<div class="red-ui-tab-button red-ui-tabs-menu"><a href="#"><i class="fa fa-caret-down"></i></a></div>').appendTo(wrapper);
|
||||||
|
var menuButtonLink = menuButton.find('a')
|
||||||
|
var menuOpen = false;
|
||||||
|
var menu;
|
||||||
|
menuButtonLink.on("click", function(evt) {
|
||||||
|
evt.stopPropagation();
|
||||||
|
evt.preventDefault();
|
||||||
|
if (menuOpen) {
|
||||||
|
menu.remove();
|
||||||
|
menuOpen = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
menuOpen = true;
|
||||||
|
var menuOptions = [];
|
||||||
|
if (typeof options.searchButton === 'function') {
|
||||||
|
menuOptions = options.menu()
|
||||||
|
} else if (Array.isArray(options.menu)) {
|
||||||
|
menuOptions = options.menu;
|
||||||
|
} else if (typeof options.menu === 'function') {
|
||||||
|
menuOptions = options.menu();
|
||||||
|
}
|
||||||
|
menu = RED.menu.init({options: menuOptions});
|
||||||
|
menu.attr("id",options.id+"-menu");
|
||||||
|
menu.css({
|
||||||
|
position: "absolute"
|
||||||
|
})
|
||||||
|
menu.appendTo("body");
|
||||||
|
var elementPos = menuButton.offset();
|
||||||
|
menu.css({
|
||||||
|
top: (elementPos.top+menuButton.height()-2)+"px",
|
||||||
|
left: (elementPos.left - menu.width() + menuButton.width())+"px"
|
||||||
|
})
|
||||||
|
$(".red-ui-menu.red-ui-menu-dropdown").hide();
|
||||||
|
$(document).on("click.red-ui-tabmenu", function(evt) {
|
||||||
|
$(document).off("click.red-ui-tabmenu");
|
||||||
|
menuOpen = false;
|
||||||
|
menu.remove();
|
||||||
|
});
|
||||||
|
menu.show();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.contextmenu) {
|
||||||
|
wrapper.on('contextmenu', function(evt) {
|
||||||
|
let clickedTab
|
||||||
|
let target = evt.target
|
||||||
|
while(target.nodeName !== 'A' && target.nodeName !== 'UL' && target.nodeName !== 'BODY') {
|
||||||
|
target = target.parentNode
|
||||||
|
}
|
||||||
|
if (target.nodeName === 'A') {
|
||||||
|
const href = target.getAttribute('href')
|
||||||
|
if (href) {
|
||||||
|
clickedTab = tabs[href.slice(1)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
evt.preventDefault()
|
||||||
|
evt.stopPropagation()
|
||||||
|
RED.contextMenu.show({
|
||||||
|
x:evt.clientX-5,
|
||||||
|
y:evt.clientY-5,
|
||||||
|
options: options.contextmenu(clickedTab)
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
var scrollLeft;
|
var scrollLeft;
|
||||||
var scrollRight;
|
var scrollRight;
|
||||||
|
|
||||||
if (options.scrollable) {
|
if (options.scrollable) {
|
||||||
wrapper.addClass("red-ui-tabs-scrollable");
|
wrapper.addClass("red-ui-tabs-scrollable");
|
||||||
scrollContainer.addClass("red-ui-tabs-scroll-container");
|
scrollContainer.addClass("red-ui-tabs-scroll-container");
|
||||||
scrollContainer.on("scroll",updateScroll);
|
scrollContainer.on("scroll",function(evt) {
|
||||||
|
// Generated by trackpads - not mousewheel
|
||||||
|
updateScroll(evt);
|
||||||
|
});
|
||||||
|
scrollContainer.on("wheel", function(evt) {
|
||||||
|
if (evt.originalEvent.deltaX === 0) {
|
||||||
|
// Prevent the scroll event from firing
|
||||||
|
evt.preventDefault();
|
||||||
|
|
||||||
|
// Assume this is wheel event which might not trigger
|
||||||
|
// the scroll event, so do things manually
|
||||||
|
var sl = scrollContainer.scrollLeft();
|
||||||
|
sl += evt.originalEvent.deltaY;
|
||||||
|
scrollContainer.scrollLeft(sl);
|
||||||
|
}
|
||||||
|
})
|
||||||
scrollLeft = $('<div class="red-ui-tab-button red-ui-tab-scroll red-ui-tab-scroll-left"><a href="#" style="display:none;"><i class="fa fa-caret-left"></i></a></div>').appendTo(wrapper).find("a");
|
scrollLeft = $('<div class="red-ui-tab-button red-ui-tab-scroll red-ui-tab-scroll-left"><a href="#" style="display:none;"><i class="fa fa-caret-left"></i></a></div>').appendTo(wrapper).find("a");
|
||||||
scrollLeft.on('mousedown',function(evt) { scrollEventHandler(evt,'-=150') }).on('click',function(evt){ evt.preventDefault();});
|
scrollLeft.on('mousedown',function(evt) {scrollEventHandler(evt, evt.shiftKey?('-='+scrollContainer.scrollLeft()):'-=150') }).on('click',function(evt){ evt.preventDefault();});
|
||||||
scrollRight = $('<div class="red-ui-tab-button red-ui-tab-scroll red-ui-tab-scroll-right"><a href="#" style="display:none;"><i class="fa fa-caret-right"></i></a></div>').appendTo(wrapper).find("a");
|
scrollRight = $('<div class="red-ui-tab-button red-ui-tab-scroll red-ui-tab-scroll-right"><a href="#" style="display:none;"><i class="fa fa-caret-right"></i></a></div>').appendTo(wrapper).find("a");
|
||||||
scrollRight.on('mousedown',function(evt) { scrollEventHandler(evt,'+=150') }).on('click',function(evt){ evt.preventDefault();});
|
scrollRight.on('mousedown',function(evt) { scrollEventHandler(evt,evt.shiftKey?('+='+(scrollContainer[0].scrollWidth - scrollContainer.width()-scrollContainer.scrollLeft())):'+=150') }).on('click',function(evt){ evt.preventDefault();});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.collapsible) {
|
if (options.collapsible) {
|
||||||
@@ -207,6 +294,11 @@ RED.tabs = (function() {
|
|||||||
if (dragActive) {
|
if (dragActive) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (evt.currentTarget !== mousedownTab) {
|
||||||
|
mousedownTab = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mousedownTab = null;
|
||||||
if (dblClickTime && Date.now()-dblClickTime < 400) {
|
if (dblClickTime && Date.now()-dblClickTime < 400) {
|
||||||
dblClickTime = 0;
|
dblClickTime = 0;
|
||||||
dblClickArmed = true;
|
dblClickArmed = true;
|
||||||
@@ -316,6 +408,12 @@ RED.tabs = (function() {
|
|||||||
if (link.length === 0) {
|
if (link.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (link.parent().hasClass("hide-tab")) {
|
||||||
|
link.parent().removeClass("hide-tab").removeClass("hide");
|
||||||
|
if (options.onshow) {
|
||||||
|
options.onshow(tabs[link.attr('href').slice(1)])
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!link.parent().hasClass("active")) {
|
if (!link.parent().hasClass("active")) {
|
||||||
ul.children().removeClass("active");
|
ul.children().removeClass("active");
|
||||||
ul.children().css({"transition": "width 100ms"});
|
ul.children().css({"transition": "width 100ms"});
|
||||||
@@ -341,13 +439,13 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function activatePreviousTab() {
|
function activatePreviousTab() {
|
||||||
var previous = ul.find("li.active").prev();
|
var previous = findPreviousVisibleTab();
|
||||||
if (previous.length > 0) {
|
if (previous.length > 0) {
|
||||||
activateTab(previous.find("a"));
|
activateTab(previous.find("a"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function activateNextTab() {
|
function activateNextTab() {
|
||||||
var next = ul.find("li.active").next();
|
var next = findNextVisibleTab();
|
||||||
if (next.length > 0) {
|
if (next.length > 0) {
|
||||||
activateTab(next.find("a"));
|
activateTab(next.find("a"));
|
||||||
}
|
}
|
||||||
@@ -357,7 +455,9 @@ RED.tabs = (function() {
|
|||||||
if (options.vertical) {
|
if (options.vertical) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var tabs = ul.find("li.red-ui-tab");
|
var allTabs = ul.find("li.red-ui-tab");
|
||||||
|
var tabs = allTabs.filter(":not(.hide-tab)");
|
||||||
|
var hiddenTabs = allTabs.filter(".hide-tab");
|
||||||
var width = wrapper.width();
|
var width = wrapper.width();
|
||||||
var tabCount = tabs.length;
|
var tabCount = tabs.length;
|
||||||
var tabWidth;
|
var tabWidth;
|
||||||
@@ -367,7 +467,7 @@ RED.tabs = (function() {
|
|||||||
var visibleCount = collapsedButtonsRow.children(":visible").length;
|
var visibleCount = collapsedButtonsRow.children(":visible").length;
|
||||||
tabWidth = width - collapsedButtonsRow.width()-10;
|
tabWidth = width - collapsedButtonsRow.width()-10;
|
||||||
var maxTabWidth = 198;
|
var maxTabWidth = 198;
|
||||||
var minTabWidth = 80;
|
var minTabWidth = 120;
|
||||||
if (tabWidth <= minTabWidth || (tabWidth < maxTabWidth && visibleCount > 5)) {
|
if (tabWidth <= minTabWidth || (tabWidth < maxTabWidth && visibleCount > 5)) {
|
||||||
// The tab is too small. Hide the next button to make room
|
// The tab is too small. Hide the next button to make room
|
||||||
// Start at the end of the button row, -1 for the menu button
|
// Start at the end of the button row, -1 for the menu button
|
||||||
@@ -425,6 +525,7 @@ RED.tabs = (function() {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
tabs.css({width:currentTabWidth});
|
tabs.css({width:currentTabWidth});
|
||||||
|
hiddenTabs.css({width:"0px"});
|
||||||
if (tabWidth < 50) {
|
if (tabWidth < 50) {
|
||||||
// ul.find(".red-ui-tab-close").hide();
|
// ul.find(".red-ui-tab-close").hide();
|
||||||
ul.find(".red-ui-tab-icon").hide();
|
ul.find(".red-ui-tab-icon").hide();
|
||||||
@@ -445,6 +546,7 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ul.find("li.red-ui-tab a")
|
ul.find("li.red-ui-tab a")
|
||||||
|
.on("mousedown", function(evt) { mousedownTab = evt.currentTarget })
|
||||||
.on("mouseup",onTabClick)
|
.on("mouseup",onTabClick)
|
||||||
.on("click", function(evt) {evt.preventDefault(); })
|
.on("click", function(evt) {evt.preventDefault(); })
|
||||||
.on("dblclick", function(evt) {evt.stopPropagation(); evt.preventDefault(); })
|
.on("dblclick", function(evt) {evt.stopPropagation(); evt.preventDefault(); })
|
||||||
@@ -464,12 +566,19 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
var li = ul.find("a[href='#"+id+"']").parent();
|
var li = ul.find("a[href='#"+id+"']").parent();
|
||||||
if (li.hasClass("active")) {
|
if (li.hasClass("active")) {
|
||||||
var tab = li.prev();
|
var tab = findPreviousVisibleTab(li);
|
||||||
if (tab.length === 0) {
|
if (tab.length === 0) {
|
||||||
tab = li.next();
|
tab = findNextVisibleTab(li);
|
||||||
}
|
}
|
||||||
|
if (tab.length > 0) {
|
||||||
activateTab(tab.find("a"));
|
activateTab(tab.find("a"));
|
||||||
|
} else {
|
||||||
|
if (options.onchange) {
|
||||||
|
options.onchange(null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
li.remove();
|
li.remove();
|
||||||
if (tabs[id].pinned) {
|
if (tabs[id].pinned) {
|
||||||
pinnedTabsCount--;
|
pinnedTabsCount--;
|
||||||
@@ -485,6 +594,75 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findPreviousVisibleTab(li) {
|
||||||
|
if (!li) {
|
||||||
|
li = ul.find("li.active");
|
||||||
|
}
|
||||||
|
var previous = li.prev();
|
||||||
|
while(previous.length > 0 && previous.hasClass("hide-tab")) {
|
||||||
|
previous = previous.prev();
|
||||||
|
}
|
||||||
|
return previous;
|
||||||
|
}
|
||||||
|
function findNextVisibleTab(li) {
|
||||||
|
if (!li) {
|
||||||
|
li = ul.find("li.active");
|
||||||
|
}
|
||||||
|
var next = li.next();
|
||||||
|
while(next.length > 0 && next.hasClass("hide-tab")) {
|
||||||
|
next = next.next();
|
||||||
|
}
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
function showTab(id) {
|
||||||
|
if (tabs[id]) {
|
||||||
|
var li = ul.find("a[href='#"+id+"']").parent();
|
||||||
|
if (li.hasClass("hide-tab")) {
|
||||||
|
li.removeClass("hide-tab").removeClass("hide");
|
||||||
|
if (ul.find("li.red-ui-tab:not(.hide-tab)").length === 1) {
|
||||||
|
activateTab(li.find("a"))
|
||||||
|
}
|
||||||
|
updateTabWidths();
|
||||||
|
if (options.onshow) {
|
||||||
|
options.onshow(tabs[id])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideTab(id) {
|
||||||
|
if (tabs[id]) {
|
||||||
|
var li = ul.find("a[href='#"+id+"']").parent();
|
||||||
|
if (!li.hasClass("hide-tab")) {
|
||||||
|
if (li.hasClass("active")) {
|
||||||
|
var tab = findPreviousVisibleTab(li);
|
||||||
|
if (tab.length === 0) {
|
||||||
|
tab = findNextVisibleTab(li);
|
||||||
|
}
|
||||||
|
if (tab.length > 0) {
|
||||||
|
activateTab(tab.find("a"));
|
||||||
|
} else {
|
||||||
|
if (options.onchange) {
|
||||||
|
options.onchange(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
li.removeClass("active");
|
||||||
|
li.one("transitionend", function(evt) {
|
||||||
|
li.addClass("hide");
|
||||||
|
updateTabWidths();
|
||||||
|
if (options.onhide) {
|
||||||
|
options.onhide(tabs[id])
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
updateScroll()
|
||||||
|
},200)
|
||||||
|
})
|
||||||
|
li.addClass("hide-tab");
|
||||||
|
li.css({width:0})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var tabAPI = {
|
var tabAPI = {
|
||||||
addTab: function(tab,targetIndex) {
|
addTab: function(tab,targetIndex) {
|
||||||
if (options.onselect) {
|
if (options.onselect) {
|
||||||
@@ -509,12 +687,12 @@ RED.tabs = (function() {
|
|||||||
li.attr('id',"red-ui-tab-"+(tab.id.replace(".","-")));
|
li.attr('id',"red-ui-tab-"+(tab.id.replace(".","-")));
|
||||||
li.data("tabId",tab.id);
|
li.data("tabId",tab.id);
|
||||||
|
|
||||||
if (options.maximumTabWidth) {
|
if (options.maximumTabWidth || tab.maximumTabWidth) {
|
||||||
li.css("maxWidth",options.maximumTabWidth+"px");
|
li.css("maxWidth",(options.maximumTabWidth || tab.maximumTabWidth) +"px");
|
||||||
}
|
}
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -636,10 +814,12 @@ RED.tabs = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
link.on("mousedown", function(evt) { mousedownTab = evt.currentTarget })
|
||||||
link.on("mouseup",onTabClick);
|
link.on("mouseup",onTabClick);
|
||||||
link.on("click", function(evt) { evt.preventDefault(); })
|
link.on("click", function(evt) { evt.preventDefault(); })
|
||||||
link.on("dblclick", function(evt) { evt.stopPropagation(); evt.preventDefault(); })
|
link.on("dblclick", function(evt) { evt.stopPropagation(); evt.preventDefault(); })
|
||||||
|
|
||||||
|
$('<span class="red-ui-tabs-fade"></span>').appendTo(li);
|
||||||
|
|
||||||
if (tab.closeable) {
|
if (tab.closeable) {
|
||||||
li.addClass("red-ui-tabs-closeable")
|
li.addClass("red-ui-tabs-closeable")
|
||||||
@@ -649,17 +829,31 @@ RED.tabs = (function() {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
removeTab(tab.id);
|
removeTab(tab.id);
|
||||||
});
|
});
|
||||||
|
RED.popover.tooltip(closeLink,RED._("workspace.closeFlow"));
|
||||||
}
|
}
|
||||||
|
// if (tab.hideable) {
|
||||||
|
// li.addClass("red-ui-tabs-closeable")
|
||||||
|
// var closeLink = $("<a/>",{href:"#",class:"red-ui-tab-close red-ui-tab-hide"}).appendTo(li);
|
||||||
|
// closeLink.append('<i class="fa fa-eye" />');
|
||||||
|
// closeLink.append('<i class="fa fa-eye-slash" />');
|
||||||
|
// closeLink.on("click",function(event) {
|
||||||
|
// event.preventDefault();
|
||||||
|
// hideTab(tab.id);
|
||||||
|
// });
|
||||||
|
// RED.popover.tooltip(closeLink,RED._("workspace.hideFlow"));
|
||||||
|
// }
|
||||||
|
|
||||||
var badges = $('<span class="red-ui-tabs-badges"></span>').appendTo(li);
|
var badges = $('<span class="red-ui-tabs-badges"></span>').appendTo(li);
|
||||||
if (options.onselect) {
|
if (options.onselect) {
|
||||||
$('<i class="red-ui-tabs-badge-changed fa fa-circle"></i>').appendTo(badges);
|
|
||||||
$('<i class="red-ui-tabs-badge-selected fa fa-check-circle"></i>').appendTo(badges);
|
$('<i class="red-ui-tabs-badge-selected fa fa-check-circle"></i>').appendTo(badges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// link.attr("title",tab.label);
|
||||||
|
RED.popover.tooltip(link,function() { return RED.utils.sanitize(tab.label); });
|
||||||
|
|
||||||
if (options.onadd) {
|
if (options.onadd) {
|
||||||
options.onadd(tab);
|
options.onadd(tab);
|
||||||
}
|
}
|
||||||
link.attr("title",tab.label);
|
|
||||||
if (ul.find("li.red-ui-tab").length == 1) {
|
if (ul.find("li.red-ui-tab").length == 1) {
|
||||||
activateTab(link);
|
activateTab(link);
|
||||||
}
|
}
|
||||||
@@ -760,19 +954,40 @@ RED.tabs = (function() {
|
|||||||
previousTab: activatePreviousTab,
|
previousTab: activatePreviousTab,
|
||||||
resize: updateTabWidths,
|
resize: updateTabWidths,
|
||||||
count: function() {
|
count: function() {
|
||||||
return ul.find("li.red-ui-tab").length;
|
return ul.find("li.red-ui-tab:not(.hide)").length;
|
||||||
|
},
|
||||||
|
activeIndex: function() {
|
||||||
|
return ul.find("li.active").index()
|
||||||
|
},
|
||||||
|
getTabIndex: function (id) {
|
||||||
|
return ul.find("a[href='#"+id+"']").parent().index()
|
||||||
},
|
},
|
||||||
contains: function(id) {
|
contains: function(id) {
|
||||||
return ul.find("a[href='#"+id+"']").length > 0;
|
return ul.find("a[href='#"+id+"']").length > 0;
|
||||||
},
|
},
|
||||||
|
showTab: showTab,
|
||||||
|
hideTab: hideTab,
|
||||||
|
|
||||||
renameTab: function(id,label) {
|
renameTab: function(id,label) {
|
||||||
tabs[id].label = label;
|
tabs[id].label = label;
|
||||||
var tab = ul.find("a[href='#"+id+"']");
|
var tab = ul.find("a[href='#"+id+"']");
|
||||||
tab.attr("title",label);
|
|
||||||
tab.find("span.red-ui-text-bidi-aware").text(label).attr('dir', RED.text.bidi.resolveBaseTextDir(label));
|
tab.find("span.red-ui-text-bidi-aware").text(label).attr('dir', RED.text.bidi.resolveBaseTextDir(label));
|
||||||
updateTabWidths();
|
updateTabWidths();
|
||||||
},
|
},
|
||||||
|
listTabs: function() {
|
||||||
|
return $.makeArray(ul.children().map(function() { return $(this).data('tabId');}));
|
||||||
|
},
|
||||||
selection: getSelection,
|
selection: getSelection,
|
||||||
|
clearSelection: function() {
|
||||||
|
if (options.onselect) {
|
||||||
|
var selection = ul.find("li.red-ui-tab.selected");
|
||||||
|
if (selection.length > 0) {
|
||||||
|
selection.removeClass("selected");
|
||||||
|
selectionChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
order: function(order) {
|
order: function(order) {
|
||||||
preferredOrder = order;
|
preferredOrder = order;
|
||||||
var existingTabOrder = $.makeArray(ul.children().map(function() { return $(this).data('tabId');}));
|
var existingTabOrder = $.makeArray(ul.children().map(function() { return $(this).data('tabId');}));
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
});
|
});
|
||||||
this.button = $('<button type="button" class="red-ui-toggleButton '+baseClass+' toggle single"></button>');
|
this.button = $('<button type="button" class="red-ui-toggleButton '+baseClass+' toggle single"></button>');
|
||||||
if (enabledLabel || disabledLabel) {
|
if (enabledLabel || disabledLabel) {
|
||||||
this.buttonLabel = $("<span>").appendTo(this.button);
|
this.buttonLabel = $("<span>").appendTo(this.button).css("margin-left", "5px");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.options.class) {
|
if (this.options.class) {
|
||||||
|
|||||||
@@ -21,9 +21,13 @@
|
|||||||
* - multi : boolean - if true, .selected will return an array of results
|
* - multi : boolean - if true, .selected will return an array of results
|
||||||
* otherwise, returns the first selected item
|
* otherwise, returns the first selected item
|
||||||
* - sortable: boolean/string - TODO: see editableList
|
* - sortable: boolean/string - TODO: see editableList
|
||||||
|
* - selectable: boolean - default true - whether individual items can be selected
|
||||||
* - rootSortable: boolean - if 'sortable' is set, then setting this to
|
* - rootSortable: boolean - if 'sortable' is set, then setting this to
|
||||||
* false, prevents items being sorted to the
|
* false, prevents items being sorted to the
|
||||||
* top level of the tree
|
* top level of the tree
|
||||||
|
* - autoSelect: boolean - default true - triggers item selection when navigating
|
||||||
|
* list by keyboard. If the list has checkboxed items
|
||||||
|
* you probably want to set this to false
|
||||||
*
|
*
|
||||||
* methods:
|
* methods:
|
||||||
* - data(items) - clears existing items and replaces with new data
|
* - data(items) - clears existing items and replaces with new data
|
||||||
@@ -41,6 +45,7 @@
|
|||||||
* sublabel: 'Local', // a sub-label for the item
|
* sublabel: 'Local', // a sub-label for the item
|
||||||
* icon: 'fa fa-rocket', // (optional) icon for the item
|
* icon: 'fa fa-rocket', // (optional) icon for the item
|
||||||
* checkbox: true/false, // (optional) if present, display checkbox accordingly
|
* checkbox: true/false, // (optional) if present, display checkbox accordingly
|
||||||
|
* radio: 'group-name', // (optional) if present, display radio box - using group-name to set radio group
|
||||||
* selected: true/false, // (optional) whether the item is selected or not
|
* selected: true/false, // (optional) whether the item is selected or not
|
||||||
* children: [] | function(done,item) // (optional) an array of child items, or a function
|
* children: [] | function(done,item) // (optional) an array of child items, or a function
|
||||||
* // that will call the `done` callback with an array
|
* // that will call the `done` callback with an array
|
||||||
@@ -49,6 +54,7 @@
|
|||||||
* deferBuild: true/false, // don't build any ui elements for the item's children
|
* deferBuild: true/false, // don't build any ui elements for the item's children
|
||||||
* until it is expanded by the user.
|
* until it is expanded by the user.
|
||||||
* element: // custom dom element to use for the item - ignored if `label` is set
|
* element: // custom dom element to use for the item - ignored if `label` is set
|
||||||
|
* collapsible: true/false, // prevent a parent item from being collapsed. default true.
|
||||||
* }
|
* }
|
||||||
* ]
|
* ]
|
||||||
*
|
*
|
||||||
@@ -89,77 +95,100 @@
|
|||||||
$.widget( "nodered.treeList", {
|
$.widget( "nodered.treeList", {
|
||||||
_create: function() {
|
_create: function() {
|
||||||
var that = this;
|
var that = this;
|
||||||
|
var autoSelect = true;
|
||||||
|
if (that.options.autoSelect === false) {
|
||||||
|
autoSelect = false;
|
||||||
|
}
|
||||||
this.element.addClass('red-ui-treeList');
|
this.element.addClass('red-ui-treeList');
|
||||||
this.element.attr("tabIndex",0);
|
this.element.attr("tabIndex",0);
|
||||||
var wrapper = $('<div>',{class:'red-ui-treeList-container'}).appendTo(this.element);
|
var wrapper = $('<div>',{class:'red-ui-treeList-container'}).appendTo(this.element);
|
||||||
this.element.on('keydown', function(evt) {
|
this.element.on('keydown', function(evt) {
|
||||||
var selected = that._topList.find(".selected").parent().data('data');
|
var focussed = that._topList.find(".focus").parent().data('data');
|
||||||
if (!selected && (evt.keyCode === 40 || evt.keyCode === 38)) {
|
if (!focussed && (evt.keyCode === 40 || evt.keyCode === 38)) {
|
||||||
|
if (that._data[0]) {
|
||||||
|
if (autoSelect) {
|
||||||
that.select(that._data[0]);
|
that.select(that._data[0]);
|
||||||
|
} else {
|
||||||
|
that._topList.find(".focus").removeClass("focus")
|
||||||
|
}
|
||||||
|
that._data[0].treeList.label.addClass('focus')
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var target;
|
var target;
|
||||||
switch(evt.keyCode) {
|
switch(evt.keyCode) {
|
||||||
|
case 32: // SPACE
|
||||||
case 13: // ENTER
|
case 13: // ENTER
|
||||||
|
if (!that.options.selectable) { return }
|
||||||
|
if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) {
|
||||||
|
return
|
||||||
|
}
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
if (selected.children) {
|
if (focussed.checkbox) {
|
||||||
if (selected.treeList.container.hasClass("expanded")) {
|
focussed.treeList.checkbox.trigger("click");
|
||||||
selected.treeList.collapse()
|
} else if (focussed.radio) {
|
||||||
|
focussed.treeList.radio.trigger("click");
|
||||||
|
} else if (focussed.children) {
|
||||||
|
if (focussed.treeList.container.hasClass("expanded")) {
|
||||||
|
focussed.treeList.collapse()
|
||||||
} else {
|
} else {
|
||||||
selected.treeList.expand()
|
focussed.treeList.expand()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
that._trigger("confirm",null,selected)
|
that._trigger("confirm",null,focussed)
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 37: // LEFT
|
case 37: // LEFT
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
if (selected.children&& selected.treeList.container.hasClass("expanded")) {
|
if (focussed.children&& focussed.treeList.container.hasClass("expanded")) {
|
||||||
selected.treeList.collapse()
|
focussed.treeList.collapse()
|
||||||
} else if (selected.parent) {
|
} else if (focussed.parent) {
|
||||||
target = selected.parent;
|
target = focussed.parent;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 38: // UP
|
case 38: // UP
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
target = that._getPreviousSibling(selected);
|
target = that._getPreviousSibling(focussed);
|
||||||
if (target) {
|
if (target) {
|
||||||
target = that._getLastDescendant(target);
|
target = that._getLastDescendant(target);
|
||||||
}
|
}
|
||||||
if (!target && selected.parent) {
|
if (!target && focussed.parent) {
|
||||||
target = selected.parent;
|
target = focussed.parent;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 39: // RIGHT
|
case 39: // RIGHT
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
if (selected.children) {
|
if (focussed.children) {
|
||||||
if (!selected.treeList.container.hasClass("expanded")) {
|
if (!focussed.treeList.container.hasClass("expanded")) {
|
||||||
selected.treeList.expand()
|
focussed.treeList.expand()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 40: //DOWN
|
case 40: //DOWN
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
if (selected.children && Array.isArray(selected.children) && selected.children.length > 0 && selected.treeList.container.hasClass("expanded")) {
|
if (focussed.children && Array.isArray(focussed.children) && focussed.children.length > 0 && focussed.treeList.container.hasClass("expanded")) {
|
||||||
target = selected.children[0];
|
target = focussed.children[0];
|
||||||
} else {
|
} else {
|
||||||
target = that._getNextSibling(selected);
|
target = that._getNextSibling(focussed);
|
||||||
while (!target && selected.parent) {
|
while (!target && focussed.parent) {
|
||||||
selected = selected.parent;
|
focussed = focussed.parent;
|
||||||
target = that._getNextSibling(selected);
|
target = that._getNextSibling(focussed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if (target) {
|
if (target) {
|
||||||
|
if (autoSelect) {
|
||||||
that.select(target);
|
that.select(target);
|
||||||
|
} else {
|
||||||
|
that._topList.find(".focus").removeClass("focus")
|
||||||
|
}
|
||||||
|
target.treeList.label.addClass('focus')
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._data = [];
|
this._data = [];
|
||||||
@@ -312,7 +341,8 @@
|
|||||||
}
|
}
|
||||||
if (child.depth !== parent.depth+1) {
|
if (child.depth !== parent.depth+1) {
|
||||||
child.depth = parent.depth+1;
|
child.depth = parent.depth+1;
|
||||||
var labelPaddingWidth = ((child.gutter?child.gutter.width()+2:0)+(child.depth*20));
|
// var labelPaddingWidth = ((child.gutter ? child.gutter[0].offsetWidth + 2 : 0) + (child.depth * 20));
|
||||||
|
var labelPaddingWidth = (((child.gutter&&!child.gutter.hasClass("red-ui-treeList-gutter-float"))?child.gutter.width()+2:0)+(child.depth*20));
|
||||||
child.treeList.labelPadding.width(labelPaddingWidth+'px');
|
child.treeList.labelPadding.width(labelPaddingWidth+'px');
|
||||||
if (child.element) {
|
if (child.element) {
|
||||||
$(child.element).css({
|
$(child.element).css({
|
||||||
@@ -348,6 +378,18 @@
|
|||||||
that._selected.delete(item);
|
that._selected.delete(item);
|
||||||
delete item.treeList;
|
delete item.treeList;
|
||||||
delete that._items[item.id];
|
delete that._items[item.id];
|
||||||
|
if(item.depth === 0) {
|
||||||
|
for(var key in that._items) {
|
||||||
|
if (that._items.hasOwnProperty(key)) {
|
||||||
|
var child = that._items[key];
|
||||||
|
if(child.parent && child.parent.id === item.id) {
|
||||||
|
delete that._items[key].treeList;
|
||||||
|
delete that._items[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
that._data = that._data.filter(function(data) { return data.id !== item.id})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
item.treeList.insertChildAt = function(newItem,position,select) {
|
item.treeList.insertChildAt = function(newItem,position,select) {
|
||||||
newItem.parent = item;
|
newItem.parent = item;
|
||||||
@@ -449,6 +491,9 @@
|
|||||||
container.addClass("expanded");
|
container.addClass("expanded");
|
||||||
}
|
}
|
||||||
item.treeList.collapse = function() {
|
item.treeList.collapse = function() {
|
||||||
|
if (item.collapsible === false) {
|
||||||
|
return
|
||||||
|
}
|
||||||
if (!item.children) {
|
if (!item.children) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -480,7 +525,10 @@
|
|||||||
if (item.treeList.container) {
|
if (item.treeList.container) {
|
||||||
$(item.element).remove();
|
$(item.element).remove();
|
||||||
$(element).appendTo(item.treeList.label);
|
$(element).appendTo(item.treeList.label);
|
||||||
var labelPaddingWidth = (item.gutter?item.gutter.width()+2:0)+(item.depth*20);
|
// using the JQuery Object, the gutter width will
|
||||||
|
// be wrong when the element is reattached the second time
|
||||||
|
var labelPaddingWidth = (item.gutter ? item.gutter[0].offsetWidth + 2 : 0) + (item.depth * 20);
|
||||||
|
|
||||||
$(element).css({
|
$(element).css({
|
||||||
width: "calc(100% - "+(labelPaddingWidth+20+(item.icon?20:0))+"px)"
|
width: "calc(100% - "+(labelPaddingWidth+20+(item.icon?20:0))+"px)"
|
||||||
})
|
})
|
||||||
@@ -516,9 +564,12 @@
|
|||||||
}).appendTo(label)
|
}).appendTo(label)
|
||||||
|
|
||||||
}
|
}
|
||||||
var labelPaddingWidth = (item.gutter?item.gutter.width()+2:0)+(depth*20);
|
|
||||||
|
var labelPaddingWidth = ((item.gutter&&!item.gutter.hasClass("red-ui-treeList-gutter-float"))?item.gutter.width()+2:0)+(depth*20);
|
||||||
|
|
||||||
item.treeList.labelPadding = $('<span>').css({
|
item.treeList.labelPadding = $('<span>').css({
|
||||||
display: "inline-block",
|
display: "inline-block",
|
||||||
|
"flex-shrink": 0,
|
||||||
width: labelPaddingWidth+'px'
|
width: labelPaddingWidth+'px'
|
||||||
}).appendTo(label);
|
}).appendTo(label);
|
||||||
|
|
||||||
@@ -564,7 +615,7 @@
|
|||||||
// Already a parent because we've got the angle-right icon
|
// Already a parent because we've got the angle-right icon
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$('<i class="fa fa-angle-right" />').appendTo(treeListIcon);
|
$('<i class="fa fa-angle-right" />').toggleClass("hide",item.collapsible === false).appendTo(treeListIcon);
|
||||||
treeListIcon.on("click.red-ui-treeList-expand", function(e) {
|
treeListIcon.on("click.red-ui-treeList-expand", function(e) {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -615,6 +666,46 @@
|
|||||||
label.on("click", function(e) {
|
label.on("click", function(e) {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
cb.trigger("click");
|
cb.trigger("click");
|
||||||
|
that._topList.find(".focus").removeClass("focus")
|
||||||
|
label.addClass('focus')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
item.treeList.select = function(v) {
|
||||||
|
if (v !== item.selected) {
|
||||||
|
cb.trigger("click");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
item.treeList.checkbox = cb;
|
||||||
|
selectWrapper.appendTo(label)
|
||||||
|
} else if (item.radio) {
|
||||||
|
var selectWrapper = $('<span class="red-ui-treeList-icon"></span>');
|
||||||
|
var cb = $('<input class="red-ui-treeList-radio" type="radio">').prop('name', item.radio).prop('checked',item.selected).appendTo(selectWrapper);
|
||||||
|
cb.on('click', function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
cb.on('change', function(e) {
|
||||||
|
item.selected = this.checked;
|
||||||
|
that._selected.forEach(function(selectedItem) {
|
||||||
|
if (selectedItem.radio === item.radio) {
|
||||||
|
selectedItem.treeList.label.removeClass("selected");
|
||||||
|
selectedItem.selected = false;
|
||||||
|
that._selected.delete(selectedItem);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (item.selected) {
|
||||||
|
that._selected.add(item);
|
||||||
|
} else {
|
||||||
|
that._selected.delete(item);
|
||||||
|
}
|
||||||
|
label.toggleClass("selected",this.checked);
|
||||||
|
that._trigger("select",e,item);
|
||||||
|
})
|
||||||
|
if (!item.children) {
|
||||||
|
label.on("click", function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
cb.trigger("click");
|
||||||
|
that._topList.find(".focus").removeClass("focus")
|
||||||
|
label.addClass('focus')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
item.treeList.select = function(v) {
|
item.treeList.select = function(v) {
|
||||||
@@ -623,6 +714,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
selectWrapper.appendTo(label)
|
selectWrapper.appendTo(label)
|
||||||
|
item.treeList.radio = cb;
|
||||||
} else {
|
} else {
|
||||||
label.on("click", function(e) {
|
label.on("click", function(e) {
|
||||||
if (!that.options.multi) {
|
if (!that.options.multi) {
|
||||||
@@ -630,10 +722,14 @@
|
|||||||
}
|
}
|
||||||
label.addClass("selected");
|
label.addClass("selected");
|
||||||
that._selected.add(item);
|
that._selected.add(item);
|
||||||
|
that._topList.find(".focus").removeClass("focus")
|
||||||
|
label.addClass('focus')
|
||||||
|
|
||||||
that._trigger("select",e,item)
|
that._trigger("select",e,item)
|
||||||
})
|
})
|
||||||
label.on("dblclick", function(e) {
|
label.on("dblclick", function(e) {
|
||||||
|
that._topList.find(".focus").removeClass("focus")
|
||||||
|
label.addClass('focus')
|
||||||
if (!item.children) {
|
if (!item.children) {
|
||||||
that._trigger("confirm",e,item);
|
that._trigger("confirm",e,item);
|
||||||
}
|
}
|
||||||
@@ -781,6 +877,9 @@
|
|||||||
if (item.treeList.label) {
|
if (item.treeList.label) {
|
||||||
item.treeList.label.addClass("selected");
|
item.treeList.label.addClass("selected");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
that._topList.find(".focus").removeClass("focus");
|
||||||
|
|
||||||
if (triggerEvent !== false) {
|
if (triggerEvent !== false) {
|
||||||
this._trigger("select",null,item)
|
this._trigger("select",null,item)
|
||||||
}
|
}
|
||||||
@@ -788,6 +887,9 @@
|
|||||||
clearSelection: function() {
|
clearSelection: function() {
|
||||||
this._selected.forEach(function(item) {
|
this._selected.forEach(function(item) {
|
||||||
item.selected = false;
|
item.selected = false;
|
||||||
|
if (item.treeList.checkbox) {
|
||||||
|
item.treeList.checkbox.prop('checked',false)
|
||||||
|
}
|
||||||
if (item.treeList.label) {
|
if (item.treeList.label) {
|
||||||
item.treeList.label.removeClass("selected")
|
item.treeList.label.removeClass("selected")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
(function($) {
|
(function($) {
|
||||||
var contextParse = function(v) {
|
var contextParse = function(v,defaultStore) {
|
||||||
var parts = RED.utils.parseContextKey(v);
|
var parts = RED.utils.parseContextKey(v, defaultStore&&defaultStore.value);
|
||||||
return {
|
return {
|
||||||
option: parts.store,
|
option: parts.store,
|
||||||
value: parts.key
|
value: parts.key
|
||||||
@@ -32,28 +32,159 @@
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var contextLabel = function(container,value) {
|
||||||
|
var that = this;
|
||||||
|
container.css("pointer-events","none");
|
||||||
|
container.css("flex-grow",0);
|
||||||
|
container.css("position",'relative');
|
||||||
|
container.css("overflow",'visible');
|
||||||
|
$('<div></div>').text(value).css({
|
||||||
|
position: "absolute",
|
||||||
|
bottom:"-2px",
|
||||||
|
right: "5px",
|
||||||
|
"font-size": "0.7em",
|
||||||
|
opacity: 0.3
|
||||||
|
}).appendTo(container);
|
||||||
|
this.elementDiv.show();
|
||||||
|
}
|
||||||
var mapDeprecatedIcon = function(icon) {
|
var mapDeprecatedIcon = function(icon) {
|
||||||
if (/^red\/images\/typedInput\/.+\.png$/.test(icon)) {
|
if (/^red\/images\/typedInput\/.+\.png$/.test(icon)) {
|
||||||
icon = icon.replace(/.png$/,".svg");
|
icon = icon.replace(/.png$/,".svg");
|
||||||
}
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
var matches = [];
|
||||||
|
options.forEach(opt => {
|
||||||
|
const optVal = opt.value;
|
||||||
|
const optSrc = (opt.source||[]).join(",");
|
||||||
|
const valMatch = getMatch(optVal, val);
|
||||||
|
const srcMatch = getMatch(optSrc, val);
|
||||||
|
if (valMatch.found || srcMatch.found) {
|
||||||
|
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"});
|
||||||
|
valEl.append(generateSpans(valMatch));
|
||||||
|
valEl.appendTo(element);
|
||||||
|
if (optSrc) {
|
||||||
|
const optEl = $('<div>').css({ "font-size": "0.8em" });
|
||||||
|
optEl.append(generateSpans(srcMatch));
|
||||||
|
optEl.appendTo(element);
|
||||||
|
}
|
||||||
|
matches.push({
|
||||||
|
value: optVal,
|
||||||
|
label: element,
|
||||||
|
i: (valMatch.found ? valMatch.index : srcMatch.index)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
matches.sort(function(A,B){return A.i-B.i})
|
||||||
|
return matches;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a hand-generated list of completions for the core nodes (based on the node help html).
|
||||||
|
var msgCompletions = [
|
||||||
|
{ 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.body", source: ["http in"]},
|
||||||
|
{ value: "req.headers", source: ["http in"]},
|
||||||
|
{ value: "req.query", source: ["http in"]},
|
||||||
|
{ value: "req.params", source: ["http in"]},
|
||||||
|
{ value: "req.cookies", source: ["http in"]},
|
||||||
|
{ value: "req.files", source: ["http in"]},
|
||||||
|
{ value: "requestTimeout", source: ["http request"] },
|
||||||
|
{ value: "reset", source: ["delay","trigger","join","rbe"] },
|
||||||
|
{ value: "responseCookies", source: ["http request"] },
|
||||||
|
{ value: "responseTopic", source: ["mqtt"] },
|
||||||
|
{ value: "responseUrl", source: ["http request"] },
|
||||||
|
{ value: "restartTimeout", source: ["join"] },
|
||||||
|
{ value: "retain", source: ["mqtt"] },
|
||||||
|
{ value: "schema", source: ["json"] },
|
||||||
|
{ value: "select", source: ["html"] },
|
||||||
|
{ 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: "toFront", source: ["delay"] },
|
||||||
|
{ value: "url", source: ["http request"] },
|
||||||
|
{ value: "userProperties", source: ["mqtt"] },
|
||||||
|
{ value: "_session", source: ["websocket out","tcp out"] },
|
||||||
|
]
|
||||||
var allOptions = {
|
var allOptions = {
|
||||||
msg: {value:"msg",label:"msg.",validate:RED.utils.validatePropertyExpression},
|
msg: {value:"msg",label:"msg.",validate:RED.utils.validatePropertyExpression, autoComplete: autoComplete(msgCompletions)},
|
||||||
flow: {value:"flow",label:"flow.",hasValue:true,
|
flow: {value:"flow",label:"flow.",hasValue:true,
|
||||||
options:[],
|
options:[],
|
||||||
validate:RED.utils.validatePropertyExpression,
|
validate:RED.utils.validatePropertyExpression,
|
||||||
parse: contextParse,
|
parse: contextParse,
|
||||||
export: contextExport
|
export: contextExport,
|
||||||
|
valueLabel: contextLabel
|
||||||
},
|
},
|
||||||
global: {value:"global",label:"global.",hasValue:true,
|
global: {value:"global",label:"global.",hasValue:true,
|
||||||
options:[],
|
options:[],
|
||||||
validate:RED.utils.validatePropertyExpression,
|
validate:RED.utils.validatePropertyExpression,
|
||||||
parse: contextParse,
|
parse: contextParse,
|
||||||
export: contextExport
|
export: contextExport,
|
||||||
|
valueLabel: contextLabel
|
||||||
},
|
},
|
||||||
str: {value:"str",label:"string",icon:"red/images/typedInput/az.svg"},
|
str: {value:"str",label:"string",icon:"red/images/typedInput/az.svg"},
|
||||||
num: {value:"num",label:"number",icon:"red/images/typedInput/09.svg",validate:/^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/},
|
num: {value:"num",label:"number",icon:"red/images/typedInput/09.svg",validate: function(v) {
|
||||||
|
return (true === RED.utils.validateTypedProperty(v, "num"));
|
||||||
|
} },
|
||||||
bool: {value:"bool",label:"boolean",icon:"red/images/typedInput/bool.svg",options:["true","false"]},
|
bool: {value:"bool",label:"boolean",icon:"red/images/typedInput/bool.svg",options:["true","false"]},
|
||||||
json: {
|
json: {
|
||||||
value:"json",
|
value:"json",
|
||||||
@@ -69,6 +200,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 {
|
||||||
@@ -91,6 +224,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"));
|
||||||
}
|
}
|
||||||
@@ -105,6 +240,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);
|
||||||
}
|
}
|
||||||
@@ -248,6 +385,47 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// For a type with options, check value is a valid selection
|
||||||
|
// If !opt.multiple, returns the valid option object
|
||||||
|
// if opt.multiple, returns an array of valid option objects
|
||||||
|
// If not valid, returns null;
|
||||||
|
|
||||||
|
function isOptionValueValid(opt, currentVal) {
|
||||||
|
if (!opt.multiple) {
|
||||||
|
for (var i=0;i<opt.options.length;i++) {
|
||||||
|
op = opt.options[i];
|
||||||
|
if (typeof op === "string" && op === currentVal) {
|
||||||
|
return {value:currentVal}
|
||||||
|
} else if (op.value === currentVal) {
|
||||||
|
return op;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Check to see if value is a valid csv of
|
||||||
|
// options.
|
||||||
|
var currentValues = {};
|
||||||
|
var selected = [];
|
||||||
|
currentVal.split(",").forEach(function(v) {
|
||||||
|
if (v) {
|
||||||
|
currentValues[v] = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (var i=0;i<opt.options.length;i++) {
|
||||||
|
op = opt.options[i];
|
||||||
|
var val = typeof op === "string" ? op : op.value;
|
||||||
|
if (currentValues.hasOwnProperty(val)) {
|
||||||
|
delete currentValues[val];
|
||||||
|
selected.push(typeof op === "string" ? {value:op} : op.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$.isEmptyObject(currentValues)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return selected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var nlsd = false;
|
var nlsd = false;
|
||||||
|
|
||||||
$.widget( "nodered.typedInput", {
|
$.widget( "nodered.typedInput", {
|
||||||
@@ -262,6 +440,14 @@
|
|||||||
var contextStores = RED.settings.context.stores;
|
var contextStores = RED.settings.context.stores;
|
||||||
var contextOptions = contextStores.map(function(store) {
|
var contextOptions = contextStores.map(function(store) {
|
||||||
return {value:store,label: store, icon:'<i class="red-ui-typedInput-icon fa fa-database"></i>'}
|
return {value:store,label: store, icon:'<i class="red-ui-typedInput-icon fa fa-database"></i>'}
|
||||||
|
}).sort(function(A,B) {
|
||||||
|
if (A.value === RED.settings.context.default) {
|
||||||
|
return -1;
|
||||||
|
} else if (B.value === RED.settings.context.default) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return A.value.localeCompare(B.value);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
if (contextOptions.length < 2) {
|
if (contextOptions.length < 2) {
|
||||||
allOptions.flow.options = [];
|
allOptions.flow.options = [];
|
||||||
@@ -273,7 +459,8 @@
|
|||||||
}
|
}
|
||||||
nlsd = true;
|
nlsd = true;
|
||||||
var that = this;
|
var that = this;
|
||||||
|
this.identifier = this.element.attr('id') || "TypedInput-"+Math.floor(Math.random()*100);
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"Create",{defaultType:this.options.default, value:this.element.val()}) }
|
||||||
this.disarmClick = false;
|
this.disarmClick = false;
|
||||||
this.input = $('<input class="red-ui-typedInput-input" type="text"></input>');
|
this.input = $('<input class="red-ui-typedInput-input" type="text"></input>');
|
||||||
this.input.insertAfter(this.element);
|
this.input.insertAfter(this.element);
|
||||||
@@ -303,6 +490,8 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.defaultInputType = this.input.attr('type');
|
this.defaultInputType = this.input.attr('type');
|
||||||
|
// Used to remember selections per-type to restore them when switching between types
|
||||||
|
this.oldValues = {};
|
||||||
|
|
||||||
this.uiSelect.addClass("red-ui-typedInput-container");
|
this.uiSelect.addClass("red-ui-typedInput-container");
|
||||||
|
|
||||||
@@ -314,7 +503,7 @@
|
|||||||
this.options.types = this.options.types||Object.keys(allOptions);
|
this.options.types = this.options.types||Object.keys(allOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.selectTrigger = $('<button class="red-ui-typedInput-type-select" tabindex="0"></button>').prependTo(this.uiSelect);
|
this.selectTrigger = $('<button type="button" class="red-ui-typedInput-type-select" tabindex="0"></button>').prependTo(this.uiSelect);
|
||||||
$('<i class="red-ui-typedInput-icon fa fa-caret-down"></i>').toggle(this.options.types.length > 1).appendTo(this.selectTrigger);
|
$('<i class="red-ui-typedInput-icon fa fa-caret-down"></i>').toggle(this.options.types.length > 1).appendTo(this.selectTrigger);
|
||||||
|
|
||||||
this.selectLabel = $('<span class="red-ui-typedInput-type-label"></span>').appendTo(this.selectTrigger);
|
this.selectLabel = $('<span class="red-ui-typedInput-type-label"></span>').appendTo(this.selectTrigger);
|
||||||
@@ -342,9 +531,22 @@
|
|||||||
this.input.on('change', function() {
|
this.input.on('change', function() {
|
||||||
that.validate();
|
that.validate();
|
||||||
that.element.val(that.value());
|
that.element.val(that.value());
|
||||||
that.element.trigger('change',that.propertyType,that.value());
|
that.element.trigger('change',[that.propertyType,that.value()]);
|
||||||
|
});
|
||||||
|
this.input.on('keyup', function(evt) {
|
||||||
|
that.validate();
|
||||||
|
that.element.val(that.value());
|
||||||
|
that.element.trigger('keyup',evt);
|
||||||
|
});
|
||||||
|
this.input.on('paste', function(evt) {
|
||||||
|
that.validate();
|
||||||
|
that.element.val(that.value());
|
||||||
|
that.element.trigger('paste',evt);
|
||||||
});
|
});
|
||||||
this.input.on('keydown', function(evt) {
|
this.input.on('keydown', function(evt) {
|
||||||
|
if (that.typeMap[that.propertyType].autoComplete) {
|
||||||
|
return
|
||||||
|
}
|
||||||
if (evt.keyCode >= 37 && evt.keyCode <= 40) {
|
if (evt.keyCode >= 37 && evt.keyCode <= 40) {
|
||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
}
|
}
|
||||||
@@ -362,14 +564,19 @@
|
|||||||
evt.stopPropagation();
|
evt.stopPropagation();
|
||||||
}).on('focus', function() {
|
}).on('focus', function() {
|
||||||
that.uiSelect.addClass('red-ui-typedInput-focus');
|
that.uiSelect.addClass('red-ui-typedInput-focus');
|
||||||
|
}).on('blur', function() {
|
||||||
|
var opt = that.typeMap[that.propertyType];
|
||||||
|
if (opt.hasValue === false) {
|
||||||
|
that.uiSelect.removeClass('red-ui-typedInput-focus');
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline'
|
// explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline'
|
||||||
this.optionSelectTrigger = $('<button tabindex="0" class="red-ui-typedInput-option-trigger" style="display:inline-block"><span class="red-ui-typedInput-option-caret"><i class="red-ui-typedInput-icon fa fa-caret-down"></i></span></button>').appendTo(this.uiSelect);
|
this.optionSelectTrigger = $('<button type="button" tabindex="0" class="red-ui-typedInput-option-trigger" style="display:inline-block"><span class="red-ui-typedInput-option-caret"><i class="red-ui-typedInput-icon fa fa-caret-down"></i></span></button>').appendTo(this.uiSelect);
|
||||||
this.optionSelectLabel = $('<span class="red-ui-typedInput-option-label"></span>').prependTo(this.optionSelectTrigger);
|
this.optionSelectLabel = $('<span class="red-ui-typedInput-option-label"></span>').prependTo(this.optionSelectTrigger);
|
||||||
RED.popover.tooltip(this.optionSelectLabel,function() {
|
// RED.popover.tooltip(this.optionSelectLabel,function() {
|
||||||
return that.optionValue;
|
// return that.optionValue;
|
||||||
});
|
// });
|
||||||
this.optionSelectTrigger.on("click", function(event) {
|
this.optionSelectTrigger.on("click", function(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
@@ -386,9 +593,11 @@
|
|||||||
that.uiSelect.addClass('red-ui-typedInput-focus');
|
that.uiSelect.addClass('red-ui-typedInput-focus');
|
||||||
});
|
});
|
||||||
|
|
||||||
this.optionExpandButton = $('<button tabindex="0" class="red-ui-typedInput-option-expand" style="display:inline-block"></button>').appendTo(this.uiSelect);
|
this.optionExpandButton = $('<button type="button" tabindex="0" class="red-ui-typedInput-option-expand" style="display:inline-block"></button>').appendTo(this.uiSelect);
|
||||||
this.optionExpandButtonIcon = $('<i class="red-ui-typedInput-icon fa fa-ellipsis-h"></i>').appendTo(this.optionExpandButton);
|
this.optionExpandButtonIcon = $('<i class="red-ui-typedInput-icon fa fa-ellipsis-h"></i>').appendTo(this.optionExpandButton);
|
||||||
this.type(this.options.default||this.typeList[0].value);
|
|
||||||
|
this.type(this.typeField.val() || this.options.default||this.typeList[0].value);
|
||||||
|
this.typeChanged = !!this.options.default;
|
||||||
}catch(err) {
|
}catch(err) {
|
||||||
console.log(err.stack);
|
console.log(err.stack);
|
||||||
}
|
}
|
||||||
@@ -411,7 +620,11 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
this._showMenu(this.optionMenu,this.optionSelectTrigger);
|
this._showMenu(this.optionMenu,this.optionSelectTrigger);
|
||||||
var selectedOption = this.optionMenu.find("[value='"+this.optionValue+"']");
|
var targetValue = this.optionValue;
|
||||||
|
if (this.optionValue === null || this.optionValue === undefined) {
|
||||||
|
targetValue = this.value();
|
||||||
|
}
|
||||||
|
var selectedOption = this.optionMenu.find("[value='"+targetValue+"']");
|
||||||
if (selectedOption.length === 0) {
|
if (selectedOption.length === 0) {
|
||||||
selectedOption = this.optionMenu.children(":first");
|
selectedOption = this.optionMenu.children(":first");
|
||||||
}
|
}
|
||||||
@@ -464,7 +677,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);
|
||||||
}
|
}
|
||||||
@@ -523,10 +736,10 @@
|
|||||||
var selected = {};
|
var selected = {};
|
||||||
this.value().split(",").forEach(function(f) {
|
this.value().split(",").forEach(function(f) {
|
||||||
selected[f] = true;
|
selected[f] = true;
|
||||||
})
|
});
|
||||||
menu.find('input[type="checkbox"]').each(function() {
|
menu.find('input[type="checkbox"]').each(function() {
|
||||||
$(this).prop("checked",selected[$(this).data('value')])
|
$(this).prop("checked", selected[$(this).data('value')] || false);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -535,7 +748,7 @@
|
|||||||
var height = relativeTo.height();
|
var height = relativeTo.height();
|
||||||
var menuHeight = menu.height();
|
var menuHeight = menu.height();
|
||||||
var top = (height+pos.top);
|
var top = (height+pos.top);
|
||||||
if (top+menuHeight > $(window).height()) {
|
if (top+menuHeight-$(document).scrollTop() > $(window).height()) {
|
||||||
top -= (top+menuHeight)-$(window).height()+5;
|
top -= (top+menuHeight)-$(window).height()+5;
|
||||||
}
|
}
|
||||||
if (top < 0) {
|
if (top < 0) {
|
||||||
@@ -582,13 +795,21 @@
|
|||||||
_updateOptionSelectLabel: function(o) {
|
_updateOptionSelectLabel: function(o) {
|
||||||
var opt = this.typeMap[this.propertyType];
|
var opt = this.typeMap[this.propertyType];
|
||||||
this.optionSelectLabel.empty();
|
this.optionSelectLabel.empty();
|
||||||
|
if (opt.hasValue) {
|
||||||
|
this.valueLabelContainer.empty();
|
||||||
|
this.valueLabelContainer.show();
|
||||||
|
} else {
|
||||||
|
this.valueLabelContainer.hide();
|
||||||
|
}
|
||||||
if (this.typeMap[this.propertyType].valueLabel) {
|
if (this.typeMap[this.propertyType].valueLabel) {
|
||||||
if (opt.multiple) {
|
if (opt.multiple) {
|
||||||
this.typeMap[this.propertyType].valueLabel.call(this,this.optionSelectLabel,o);
|
this.typeMap[this.propertyType].valueLabel.call(this,opt.hasValue?this.valueLabelContainer:this.optionSelectLabel,o);
|
||||||
} else {
|
} else {
|
||||||
this.typeMap[this.propertyType].valueLabel.call(this,this.optionSelectLabel,o.value);
|
this.typeMap[this.propertyType].valueLabel.call(this,opt.hasValue?this.valueLabelContainer:this.optionSelectLabel,o.value);
|
||||||
}
|
}
|
||||||
} else if (!opt.multiple) {
|
}
|
||||||
|
if (!this.typeMap[this.propertyType].valueLabel || opt.hasValue) {
|
||||||
|
if (!opt.multiple) {
|
||||||
if (o.icon) {
|
if (o.icon) {
|
||||||
if (o.icon.indexOf("<") === 0) {
|
if (o.icon.indexOf("<") === 0) {
|
||||||
$(o.icon).prependTo(this.optionSelectLabel);
|
$(o.icon).prependTo(this.optionSelectLabel);
|
||||||
@@ -606,10 +827,11 @@
|
|||||||
}
|
}
|
||||||
if (opt.hasValue) {
|
if (opt.hasValue) {
|
||||||
this.optionValue = o.value;
|
this.optionValue = o.value;
|
||||||
this.input.trigger('change',this.propertyType,this.value());
|
this.input.trigger('change',[this.propertyType,this.value()]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.optionSelectLabel.text(o.length+" selected");
|
this.optionSelectLabel.text(RED._("typedInput.selected", { count: o.length }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_destroy: function() {
|
_destroy: function() {
|
||||||
@@ -623,6 +845,7 @@
|
|||||||
var that = this;
|
var that = this;
|
||||||
var currentType = this.type();
|
var currentType = this.type();
|
||||||
this.typeMap = {};
|
this.typeMap = {};
|
||||||
|
var firstCall = (this.typeList === undefined);
|
||||||
this.typeList = types.map(function(opt) {
|
this.typeList = types.map(function(opt) {
|
||||||
var result;
|
var result;
|
||||||
if (typeof opt === 'string') {
|
if (typeof opt === 'string') {
|
||||||
@@ -633,6 +856,13 @@
|
|||||||
that.typeMap[result.value] = result;
|
that.typeMap[result.value] = result;
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
if (this.typeList.length < 2) {
|
||||||
|
this.selectTrigger.attr("tabindex", -1)
|
||||||
|
this.selectTrigger.on("mousedown.red-ui-typedInput-focus-block", function(evt) { evt.preventDefault(); })
|
||||||
|
} else {
|
||||||
|
this.selectTrigger.attr("tabindex", 0)
|
||||||
|
this.selectTrigger.off("mousedown.red-ui-typedInput-focus-block")
|
||||||
|
}
|
||||||
this.selectTrigger.toggleClass("disabled", this.typeList.length === 1);
|
this.selectTrigger.toggleClass("disabled", this.typeList.length === 1);
|
||||||
this.selectTrigger.find(".fa-caret-down").toggle(this.typeList.length > 1)
|
this.selectTrigger.find(".fa-caret-down").toggle(this.typeList.length > 1)
|
||||||
if (this.menu) {
|
if (this.menu) {
|
||||||
@@ -640,11 +870,20 @@
|
|||||||
}
|
}
|
||||||
this.menu = this._createMenu(this.typeList,{},function(v) { that.type(v) });
|
this.menu = this._createMenu(this.typeList,{},function(v) { that.type(v) });
|
||||||
if (currentType && !this.typeMap.hasOwnProperty(currentType)) {
|
if (currentType && !this.typeMap.hasOwnProperty(currentType)) {
|
||||||
|
if (!firstCall) {
|
||||||
this.type(this.typeList[0].value);
|
this.type(this.typeList[0].value);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.propertyType = null;
|
this.propertyType = null;
|
||||||
|
if (!firstCall) {
|
||||||
this.type(currentType);
|
this.type(currentType);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (this.typeList.length === 1 && !this.typeList[0].icon && (!this.typeList[0].label || this.typeList[0].showLabel === false)) {
|
||||||
|
this.selectTrigger.hide()
|
||||||
|
} else {
|
||||||
|
this.selectTrigger.show()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
width: function(desiredWidth) {
|
width: function(desiredWidth) {
|
||||||
this.uiWidth = desiredWidth;
|
this.uiWidth = desiredWidth;
|
||||||
@@ -654,7 +893,10 @@
|
|||||||
},
|
},
|
||||||
value: function(value) {
|
value: function(value) {
|
||||||
var that = this;
|
var that = this;
|
||||||
var opt = this.typeMap[this.propertyType];
|
// If the default type has been set to an invalid type, then on first
|
||||||
|
// creation, the current propertyType will not exist. Default to an
|
||||||
|
// empty object on the assumption the corrent type will be set shortly
|
||||||
|
var opt = this.typeMap[this.propertyType] || {};
|
||||||
if (!arguments.length) {
|
if (!arguments.length) {
|
||||||
var v = this.input.val();
|
var v = this.input.val();
|
||||||
if (opt.export) {
|
if (opt.export) {
|
||||||
@@ -662,27 +904,38 @@
|
|||||||
}
|
}
|
||||||
return v;
|
return v;
|
||||||
} else {
|
} else {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"----- SET VALUE ------",value) }
|
||||||
var selectedOption = [];
|
var selectedOption = [];
|
||||||
|
var valueToCheck = value;
|
||||||
if (opt.options) {
|
if (opt.options) {
|
||||||
var checkValues = [value];
|
if (opt.hasValue && opt.parse) {
|
||||||
|
var parts = opt.parse(value);
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"new parse",parts) }
|
||||||
|
value = parts.value;
|
||||||
|
valueToCheck = parts.option || parts.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
var checkValues = [valueToCheck];
|
||||||
if (opt.multiple) {
|
if (opt.multiple) {
|
||||||
selectedOption = [];
|
selectedOption = [];
|
||||||
checkValues = value.split(",");
|
checkValues = valueToCheck.split(",");
|
||||||
}
|
}
|
||||||
checkValues.forEach(function(value) {
|
checkValues.forEach(function(valueToCheck) {
|
||||||
for (var i=0;i<opt.options.length;i++) {
|
for (var i=0;i<opt.options.length;i++) {
|
||||||
var op = opt.options[i];
|
var op = opt.options[i];
|
||||||
if (typeof op === "string") {
|
if (typeof op === "string") {
|
||||||
if (op === value || op === ""+value) {
|
if (op === valueToCheck || op === ""+valueToCheck) {
|
||||||
selectedOption.push(that.activeOptions[op]);
|
selectedOption.push(that.activeOptions[op]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (op.value === value) {
|
} else if (op.value === valueToCheck) {
|
||||||
selectedOption.push(op);
|
selectedOption.push(op);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"set value to",value) }
|
||||||
|
|
||||||
this.input.val(value);
|
this.input.val(value);
|
||||||
if (!opt.multiple) {
|
if (!opt.multiple) {
|
||||||
if (selectedOption.length === 0) {
|
if (selectedOption.length === 0) {
|
||||||
@@ -699,7 +952,7 @@
|
|||||||
opt.valueLabel.call(this,this.valueLabelContainer,value);
|
opt.valueLabel.call(this,this.valueLabelContainer,value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.input.trigger('change',this.type(),value);
|
this.input.trigger('change',[this.type(),value]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
type: function(type) {
|
type: function(type) {
|
||||||
@@ -707,9 +960,64 @@
|
|||||||
return this.propertyType;
|
return this.propertyType;
|
||||||
} else {
|
} else {
|
||||||
var that = this;
|
var that = this;
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"----- SET TYPE -----",type) }
|
||||||
|
var previousValue = null;
|
||||||
var opt = this.typeMap[type];
|
var opt = this.typeMap[type];
|
||||||
if (opt && this.propertyType !== type) {
|
if (opt && this.propertyType !== type) {
|
||||||
|
// If previousType is !null, then this is a change of the type, rather than the initialisation
|
||||||
|
var previousType = this.typeMap[this.propertyType];
|
||||||
|
previousValue = this.input.val();
|
||||||
|
|
||||||
|
if (previousType && this.typeChanged) {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"typeChanged",{previousType,previousValue}) }
|
||||||
|
if (previousType.options && opt.hasValue !== true) {
|
||||||
|
this.oldValues[previousType.value] = previousValue;
|
||||||
|
} else if (previousType.hasValue === false) {
|
||||||
|
this.oldValues[previousType.value] = previousValue;
|
||||||
|
} else {
|
||||||
|
this.oldValues["_"] = previousValue;
|
||||||
|
}
|
||||||
|
if ((opt.options && opt.hasValue !== true) || opt.hasValue === false) {
|
||||||
|
if (this.oldValues.hasOwnProperty(opt.value)) {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored previous (1)",this.oldValues[opt.value]) }
|
||||||
|
this.input.val(this.oldValues[opt.value]);
|
||||||
|
} else if (opt.options) {
|
||||||
|
// No old value for the option type.
|
||||||
|
// It is possible code has called 'value' then 'type'
|
||||||
|
// to set the selected option. This is what the Inject/Switch/Change
|
||||||
|
// nodes did before 2.1.
|
||||||
|
// So we need to be careful to not reset the value if it is a valid option.
|
||||||
|
var validOptions = isOptionValueValid(opt,previousValue);
|
||||||
|
if (this.options.debug) { console.log(this.identifier,{previousValue,opt,validOptions}) }
|
||||||
|
if ((previousValue || previousValue === '') && validOptions) {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored previous (2)") }
|
||||||
|
this.input.val(previousValue);
|
||||||
|
} else {
|
||||||
|
if (typeof opt.default === "string") {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored previous (3)",opt.default) }
|
||||||
|
this.input.val(opt.default);
|
||||||
|
} else if (Array.isArray(opt.default)) {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored previous (4)",opt.default.join(",")) }
|
||||||
|
this.input.val(opt.default.join(","))
|
||||||
|
} else {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored previous (5)") }
|
||||||
|
this.input.val("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored default/blank",opt.default||"") }
|
||||||
|
this.input.val(opt.default||"")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"restored old/default/blank") }
|
||||||
|
this.input.val(this.oldValues.hasOwnProperty("_")?this.oldValues["_"]:(opt.default||""))
|
||||||
|
}
|
||||||
|
if (previousType.autoComplete) {
|
||||||
|
this.input.autoComplete("destroy");
|
||||||
|
}
|
||||||
|
}
|
||||||
this.propertyType = type;
|
this.propertyType = type;
|
||||||
|
this.typeChanged = true;
|
||||||
if (this.typeField) {
|
if (this.typeField) {
|
||||||
this.typeField.val(type);
|
this.typeField.val(type);
|
||||||
}
|
}
|
||||||
@@ -720,10 +1028,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);
|
||||||
@@ -732,6 +1037,11 @@
|
|||||||
if (opt.hasValue === false || (opt.showLabel !== false && !opt.icon)) {
|
if (opt.hasValue === false || (opt.showLabel !== false && !opt.icon)) {
|
||||||
this.selectLabel.text(opt.label);
|
this.selectLabel.text(opt.label);
|
||||||
}
|
}
|
||||||
|
if (opt.label) {
|
||||||
|
this.selectTrigger.attr("title",opt.label);
|
||||||
|
} else {
|
||||||
|
this.selectTrigger.attr("title","");
|
||||||
|
}
|
||||||
if (opt.hasValue === false) {
|
if (opt.hasValue === false) {
|
||||||
this.selectTrigger.addClass("red-ui-typedInput-full-width");
|
this.selectTrigger.addClass("red-ui-typedInput-full-width");
|
||||||
} else {
|
} else {
|
||||||
@@ -773,22 +1083,12 @@
|
|||||||
|
|
||||||
var op;
|
var op;
|
||||||
if (!opt.hasValue) {
|
if (!opt.hasValue) {
|
||||||
var validValue = false;
|
// Check the value is valid for the available options
|
||||||
var currentVal = this.input.val();
|
var validValues = isOptionValueValid(opt,this.input.val());
|
||||||
if (!opt.multiple) {
|
if (!opt.multiple) {
|
||||||
for (var i=0;i<opt.options.length;i++) {
|
if (validValues) {
|
||||||
op = opt.options[i];
|
that._updateOptionSelectLabel(validValues)
|
||||||
if (typeof op === "string" && op === currentVal) {
|
} else {
|
||||||
that._updateOptionSelectLabel({value:currentVal});
|
|
||||||
validValue = true;
|
|
||||||
break;
|
|
||||||
} else if (op.value === currentVal) {
|
|
||||||
that._updateOptionSelectLabel(op);
|
|
||||||
validValue = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!validValue) {
|
|
||||||
op = opt.options[0];
|
op = opt.options[0];
|
||||||
if (typeof op === "string") {
|
if (typeof op === "string") {
|
||||||
this.value(op);
|
this.value(op);
|
||||||
@@ -799,27 +1099,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Check to see if value is a valid csv of
|
if (!validValues) {
|
||||||
// options.
|
validValues = (opt.default || []).map(function(v) {
|
||||||
var currentValues = {};
|
return typeof v === "string"?v:v.value
|
||||||
currentVal.split(",").forEach(function(v) {
|
|
||||||
if (v) {
|
|
||||||
currentValues[v] = true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
for (var i=0;i<opt.options.length;i++) {
|
this.value(validValues.join(","));
|
||||||
op = opt.options[i];
|
|
||||||
delete currentValues[op.value||op];
|
|
||||||
}
|
|
||||||
if (!$.isEmptyObject(currentValues)) {
|
|
||||||
// Invalid, set to default/empty
|
|
||||||
this.value((opt.default||[]).join(","));
|
|
||||||
}
|
}
|
||||||
|
that._updateOptionSelectLabel(validValues);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var selectedOption = this.optionValue||opt.options[0];
|
var selectedOption = this.optionValue||opt.options[0];
|
||||||
if (opt.parse) {
|
if (opt.parse) {
|
||||||
var parts = opt.parse(this.input.val());
|
var selectedOptionObj = typeof selectedOption === "string"?{value:selectedOption}:selectedOption
|
||||||
|
var parts = opt.parse(this.input.val(),selectedOptionObj);
|
||||||
if (parts.option) {
|
if (parts.option) {
|
||||||
selectedOption = parts.option;
|
selectedOption = parts.option;
|
||||||
if (!this.activeOptions.hasOwnProperty(selectedOption)) {
|
if (!this.activeOptions.hasOwnProperty(selectedOption)) {
|
||||||
@@ -843,6 +1135,7 @@
|
|||||||
this._updateOptionSelectLabel(this.activeOptions[selectedOption]);
|
this._updateOptionSelectLabel(this.activeOptions[selectedOption]);
|
||||||
}
|
}
|
||||||
} else if (selectedOption) {
|
} else if (selectedOption) {
|
||||||
|
if (this.options.debug) { console.log(this.identifier,"HERE",{optionValue:selectedOption.value}) }
|
||||||
this.optionValue = selectedOption.value;
|
this.optionValue = selectedOption.value;
|
||||||
this._updateOptionSelectLabel(selectedOption);
|
this._updateOptionSelectLabel(selectedOption);
|
||||||
} else {
|
} else {
|
||||||
@@ -864,7 +1157,7 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
this._trigger("typechange",null,this.propertyType);
|
this._trigger("typechange",null,this.propertyType);
|
||||||
this.input.trigger('change',this.propertyType,this.value());
|
this.input.trigger('change',[this.propertyType,this.value()]);
|
||||||
} else {
|
} else {
|
||||||
if (this.optionSelectTrigger) {
|
if (this.optionSelectTrigger) {
|
||||||
this.optionSelectTrigger.hide();
|
this.optionSelectTrigger.hide();
|
||||||
@@ -875,25 +1168,26 @@
|
|||||||
this.input.attr('type',this.defaultInputType)
|
this.input.attr('type',this.defaultInputType)
|
||||||
}
|
}
|
||||||
if (opt.hasValue === false) {
|
if (opt.hasValue === false) {
|
||||||
this.oldValue = this.input.val();
|
|
||||||
this.input.val("");
|
|
||||||
this.elementDiv.hide();
|
this.elementDiv.hide();
|
||||||
this.valueLabelContainer.hide();
|
this.valueLabelContainer.hide();
|
||||||
} else if (opt.valueLabel) {
|
} else if (opt.valueLabel) {
|
||||||
// Reset any CSS the custom label may have set
|
// Reset any CSS the custom label may have set
|
||||||
this.valueLabelContainer.css("pointer-events","");
|
this.valueLabelContainer.css("pointer-events","");
|
||||||
this.valueLabelContainer.css("flex-grow",1);
|
this.valueLabelContainer.css("flex-grow",1);
|
||||||
|
this.valueLabelContainer.css("overflow","hidden");
|
||||||
this.valueLabelContainer.show();
|
this.valueLabelContainer.show();
|
||||||
this.valueLabelContainer.empty();
|
this.valueLabelContainer.empty();
|
||||||
this.elementDiv.hide();
|
this.elementDiv.hide();
|
||||||
opt.valueLabel.call(this,this.valueLabelContainer,this.input.val());
|
opt.valueLabel.call(this,this.valueLabelContainer,this.input.val());
|
||||||
} else {
|
} else {
|
||||||
if (this.oldValue !== undefined) {
|
|
||||||
this.input.val(this.oldValue);
|
|
||||||
delete this.oldValue;
|
|
||||||
}
|
|
||||||
this.valueLabelContainer.hide();
|
this.valueLabelContainer.hide();
|
||||||
this.elementDiv.show();
|
this.elementDiv.show();
|
||||||
|
if (opt.autoComplete) {
|
||||||
|
this.input.autoComplete({
|
||||||
|
search: opt.autoComplete,
|
||||||
|
minLength: 0
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (this.optionExpandButton) {
|
if (this.optionExpandButton) {
|
||||||
if (opt.expand) {
|
if (opt.expand) {
|
||||||
@@ -934,7 +1228,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this._trigger("typechange",null,this.propertyType);
|
this._trigger("typechange",null,this.propertyType);
|
||||||
this.input.trigger('change',this.propertyType,this.value());
|
this.input.trigger('change',[this.propertyType,this.value()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -967,16 +1261,20 @@
|
|||||||
this.uiSelect.hide();
|
this.uiSelect.hide();
|
||||||
},
|
},
|
||||||
disable: function(val) {
|
disable: function(val) {
|
||||||
if(val === true) {
|
if(val === undefined || !!val ) {
|
||||||
this.uiSelect.attr("disabled", "disabled");
|
this.uiSelect.attr("disabled", "disabled");
|
||||||
} else if (val === false) {
|
|
||||||
this.uiSelect.attr("disabled", null); //remove attr
|
|
||||||
} else {
|
} else {
|
||||||
this.uiSelect.attr("disabled", val); //user value
|
this.uiSelect.attr("disabled", null); //remove attr
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
enable: function() {
|
||||||
|
this.uiSelect.attr("disabled", null); //remove attr
|
||||||
|
},
|
||||||
disabled: function() {
|
disabled: function() {
|
||||||
return this.uiSelect.attr("disabled");
|
return this.uiSelect.attr("disabled") === "disabled";
|
||||||
|
},
|
||||||
|
focus: function() {
|
||||||
|
this.input.focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|||||||
276
packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js
vendored
Normal file
276
packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js
vendored
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
RED.contextMenu = (function () {
|
||||||
|
|
||||||
|
let menu;
|
||||||
|
|
||||||
|
function disposeMenu() {
|
||||||
|
$(document).off("mousedown.red-ui-workspace-context-menu");
|
||||||
|
if (menu) {
|
||||||
|
menu.remove();
|
||||||
|
}
|
||||||
|
menu = null;
|
||||||
|
}
|
||||||
|
function show(options) {
|
||||||
|
if (menu) {
|
||||||
|
menu.remove()
|
||||||
|
}
|
||||||
|
let menuItems = []
|
||||||
|
if (options.options) {
|
||||||
|
menuItems = options.options
|
||||||
|
} else if (options.type === 'workspace') {
|
||||||
|
const selection = RED.view.selection()
|
||||||
|
const noSelection = !selection || Object.keys(selection).length === 0
|
||||||
|
const hasSelection = (selection.nodes && selection.nodes.length > 0);
|
||||||
|
const hasMultipleSelection = hasSelection && selection.nodes.length > 1;
|
||||||
|
const virtulLinks = (selection.links && selection.links.filter(e => !!e.link)) || [];
|
||||||
|
const wireLinks = (selection.links && selection.links.filter(e => !e.link)) || [];
|
||||||
|
const hasLinks = wireLinks.length > 0;
|
||||||
|
const isSingleLink = !hasSelection && hasLinks && wireLinks.length === 1
|
||||||
|
const isMultipleLinks = !hasSelection && hasLinks && wireLinks.length > 1
|
||||||
|
const canDelete = hasSelection || hasLinks
|
||||||
|
const isGroup = hasSelection && selection.nodes.length === 1 && selection.nodes[0].type === 'group'
|
||||||
|
const canEdit = !RED.workspaces.isLocked()
|
||||||
|
const canRemoveFromGroup = hasSelection && !!selection.nodes[0].g
|
||||||
|
let hasGroup, isAllGroups = true, hasDisabledNode, hasEnabledNode, hasLabeledNode, hasUnlabeledNode;
|
||||||
|
if (hasSelection) {
|
||||||
|
selection.nodes.forEach(n => {
|
||||||
|
if (n.type === 'group') {
|
||||||
|
hasGroup = true;
|
||||||
|
} else {
|
||||||
|
isAllGroups = false;
|
||||||
|
}
|
||||||
|
if (n.d) {
|
||||||
|
hasDisabledNode = true;
|
||||||
|
} else {
|
||||||
|
hasEnabledNode = true;
|
||||||
|
}
|
||||||
|
if (n.l === undefined || n.l) {
|
||||||
|
hasLabeledNode = true;
|
||||||
|
} else {
|
||||||
|
hasUnlabeledNode = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const offset = $("#red-ui-workspace-chart").offset()
|
||||||
|
|
||||||
|
let addX = options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft()
|
||||||
|
let addY = options.y - offset.top + $("#red-ui-workspace-chart").scrollTop()
|
||||||
|
|
||||||
|
if (RED.view.snapGrid) {
|
||||||
|
const gridSize = RED.view.gridSize()
|
||||||
|
addX = gridSize * Math.floor(addX / gridSize)
|
||||||
|
addY = gridSize * Math.floor(addY / gridSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
menuItems.push(
|
||||||
|
{ onselect: 'core:show-action-list', label: RED._("contextMenu.showActionList"), onpostselect: function () { } }
|
||||||
|
)
|
||||||
|
|
||||||
|
const insertOptions = []
|
||||||
|
menuItems.push({ label: RED._("contextMenu.insert"), options: insertOptions })
|
||||||
|
insertOptions.push(
|
||||||
|
{
|
||||||
|
label: RED._("contextMenu.node"),
|
||||||
|
onselect: function () {
|
||||||
|
RED.view.showQuickAddDialog({
|
||||||
|
position: [addX, addY],
|
||||||
|
touchTrigger: 'ontouchstart' in window,
|
||||||
|
splice: isSingleLink ? selection.links[0] : undefined,
|
||||||
|
// spliceMultiple: isMultipleLinks
|
||||||
|
})
|
||||||
|
},
|
||||||
|
disabled: !canEdit
|
||||||
|
},
|
||||||
|
(hasLinks) ? { // has least 1 wire selected
|
||||||
|
label: RED._("contextMenu.junction"),
|
||||||
|
onselect: 'core:split-wires-with-junctions',
|
||||||
|
disabled: !canEdit || !hasLinks
|
||||||
|
} : {
|
||||||
|
label: RED._("contextMenu.junction"),
|
||||||
|
onselect: function () {
|
||||||
|
const nn = {
|
||||||
|
_def: { defaults: {} },
|
||||||
|
type: 'junction',
|
||||||
|
z: RED.workspaces.active(),
|
||||||
|
id: RED.nodes.id(),
|
||||||
|
x: addX,
|
||||||
|
y: addY,
|
||||||
|
w: 0, h: 0,
|
||||||
|
outputs: 1,
|
||||||
|
inputs: 1,
|
||||||
|
dirty: true,
|
||||||
|
moved: true
|
||||||
|
}
|
||||||
|
const junction = RED.nodes.addJunction(nn);
|
||||||
|
const historyEvent = {
|
||||||
|
dirty: RED.nodes.dirty(),
|
||||||
|
t: 'add',
|
||||||
|
junctions: [junction]
|
||||||
|
}
|
||||||
|
RED.history.push(historyEvent);
|
||||||
|
RED.nodes.dirty(true);
|
||||||
|
RED.view.select({nodes: [junction] });
|
||||||
|
RED.view.redraw(true)
|
||||||
|
},
|
||||||
|
disabled: !canEdit
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: RED._("contextMenu.linkNodes"),
|
||||||
|
onselect: 'core:split-wire-with-link-nodes',
|
||||||
|
disabled: !canEdit || !hasLinks
|
||||||
|
},
|
||||||
|
null
|
||||||
|
)
|
||||||
|
if (RED.settings.theme("menu.menu-item-import-library", true)) {
|
||||||
|
insertOptions.push(
|
||||||
|
{ onselect: 'core:show-import-dialog', label: RED._('common.label.import')},
|
||||||
|
{ onselect: 'core:show-examples-import-dialog', label: RED._('menu.label.importExample') }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (hasSelection && canEdit) {
|
||||||
|
const nodeOptions = []
|
||||||
|
if (!hasMultipleSelection && !isGroup) {
|
||||||
|
nodeOptions.push(
|
||||||
|
{ onselect: 'core:show-node-help', label: RED._('menu.label.showNodeHelp') },
|
||||||
|
null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
nodeOptions.push(
|
||||||
|
{ onselect: 'core:enable-selected-nodes', label: RED._('menu.label.enableSelectedNodes'), disabled: !hasDisabledNode },
|
||||||
|
{ onselect: 'core:disable-selected-nodes', label: RED._('menu.label.disableSelectedNodes'), disabled: !hasEnabledNode },
|
||||||
|
null,
|
||||||
|
{ onselect: 'core:show-selected-node-labels', label: RED._('menu.label.showSelectedNodeLabels'), disabled: !hasUnlabeledNode },
|
||||||
|
{ onselect: 'core:hide-selected-node-labels', label: RED._('menu.label.hideSelectedNodeLabels'), disabled: !hasLabeledNode }
|
||||||
|
)
|
||||||
|
menuItems.push({
|
||||||
|
label: RED._('sidebar.info.node'),
|
||||||
|
options: nodeOptions
|
||||||
|
})
|
||||||
|
menuItems.push({
|
||||||
|
label: RED._('sidebar.info.group'),
|
||||||
|
options: [
|
||||||
|
{ onselect: 'core:group-selection', label: RED._("menu.label.groupSelection") },
|
||||||
|
{ onselect: 'core:ungroup-selection', label: RED._("menu.label.ungroupSelection"), disabled: !hasGroup },
|
||||||
|
]
|
||||||
|
})
|
||||||
|
if (hasGroup) {
|
||||||
|
menuItems[menuItems.length - 1].options.push(
|
||||||
|
{ onselect: 'core:merge-selection-to-group', label: RED._("menu.label.groupMergeSelection") }
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
if (canRemoveFromGroup) {
|
||||||
|
menuItems[menuItems.length - 1].options.push(
|
||||||
|
{ onselect: 'core:remove-selection-from-group', label: RED._("menu.label.groupRemoveSelection") }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
menuItems[menuItems.length - 1].options.push(
|
||||||
|
null,
|
||||||
|
{ onselect: 'core:copy-group-style', label: RED._("keyboard.copyGroupStyle"), disabled: !hasGroup },
|
||||||
|
{ onselect: 'core:paste-group-style', label: RED._("keyboard.pasteGroupStyle"), disabled: !hasGroup}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (canEdit && hasMultipleSelection) {
|
||||||
|
menuItems.push({
|
||||||
|
label: RED._('menu.label.arrange'),
|
||||||
|
options: [
|
||||||
|
{ label:RED._("menu.label.alignLeft"), onselect: "core:align-selection-to-left"},
|
||||||
|
{ label:RED._("menu.label.alignCenter"), onselect: "core:align-selection-to-center"},
|
||||||
|
{ label:RED._("menu.label.alignRight"), onselect: "core:align-selection-to-right"},
|
||||||
|
null,
|
||||||
|
{ label:RED._("menu.label.alignTop"), onselect: "core:align-selection-to-top"},
|
||||||
|
{ label:RED._("menu.label.alignMiddle"), onselect: "core:align-selection-to-middle"},
|
||||||
|
{ label:RED._("menu.label.alignBottom"), onselect: "core:align-selection-to-bottom"},
|
||||||
|
null,
|
||||||
|
{ label:RED._("menu.label.distributeHorizontally"), onselect: "core:distribute-selection-horizontally"},
|
||||||
|
{ label:RED._("menu.label.distributeVertically"), onselect: "core:distribute-selection-vertically"}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
menuItems.push(
|
||||||
|
null,
|
||||||
|
{ onselect: 'core:undo', label: RED._("keyboard.undoChange"), disabled: RED.history.list().length === 0 },
|
||||||
|
{ onselect: 'core:redo', label: RED._("keyboard.redoChange"), disabled: RED.history.listRedo().length === 0 },
|
||||||
|
null,
|
||||||
|
{ onselect: 'core:cut-selection-to-internal-clipboard', label: RED._("keyboard.cutNode"), disabled: !canEdit || !hasSelection },
|
||||||
|
{ onselect: 'core:copy-selection-to-internal-clipboard', label: RED._("keyboard.copyNode"), disabled: !hasSelection },
|
||||||
|
{ onselect: 'core:paste-from-internal-clipboard', label: RED._("keyboard.pasteNode"), disabled: !canEdit || !RED.view.clipboard() },
|
||||||
|
{ onselect: 'core:delete-selection', label: RED._('keyboard.deleteSelected'), disabled: !canEdit || !canDelete },
|
||||||
|
{ onselect: 'core:delete-selection-and-reconnect', label: RED._('keyboard.deleteReconnect'), disabled: !canEdit || !canDelete },
|
||||||
|
)
|
||||||
|
if (RED.settings.theme("menu.menu-item-export-library", true)) {
|
||||||
|
menuItems.push(
|
||||||
|
{ onselect: 'core:show-export-dialog', label: RED._("menu.label.export") }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
menuItems.push(
|
||||||
|
{ onselect: 'core:select-all-nodes', label: RED._("keyboard.selectAll") }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
var direction = "right";
|
||||||
|
var MENU_WIDTH = 500; // can not use menu width here
|
||||||
|
if ((options.x -$(document).scrollLeft()) >
|
||||||
|
($(window).width() -MENU_WIDTH)) {
|
||||||
|
direction = "left";
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = RED.menu.init({
|
||||||
|
direction: direction,
|
||||||
|
onpreselect: function() {
|
||||||
|
disposeMenu()
|
||||||
|
},
|
||||||
|
onpostselect: function () {
|
||||||
|
RED.view.focus()
|
||||||
|
},
|
||||||
|
options: menuItems
|
||||||
|
});
|
||||||
|
|
||||||
|
menu.attr("id", "red-ui-workspace-context-menu");
|
||||||
|
menu.css({
|
||||||
|
position: "absolute"
|
||||||
|
})
|
||||||
|
menu.appendTo("body");
|
||||||
|
|
||||||
|
// TODO: prevent the menu from overflowing the window.
|
||||||
|
|
||||||
|
var top = options.y
|
||||||
|
var left = options.x
|
||||||
|
|
||||||
|
if (top + menu.height() - $(document).scrollTop() > $(window).height()) {
|
||||||
|
top -= (top + menu.height()) - $(window).height() + 22;
|
||||||
|
}
|
||||||
|
if (left + menu.width() - $(document).scrollLeft() > $(window).width()) {
|
||||||
|
left -= (left + menu.width()) - $(window).width() + 18;
|
||||||
|
}
|
||||||
|
menu.css({
|
||||||
|
top: top + "px",
|
||||||
|
left: left + "px"
|
||||||
|
})
|
||||||
|
$(".red-ui-menu.red-ui-menu-dropdown").hide();
|
||||||
|
$(document).on("mousedown.red-ui-workspace-context-menu", function (evt) {
|
||||||
|
if (menu && menu[0].contains(evt.target)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
disposeMenu()
|
||||||
|
});
|
||||||
|
menu.show();
|
||||||
|
// set focus to first item so that pressing escape key closes the menu
|
||||||
|
$("#red-ui-workspace-context-menu :first(ul) > a").trigger("focus")
|
||||||
|
|
||||||
|
}
|
||||||
|
// Allow escape key hook and other editor events to close context menu
|
||||||
|
RED.keyboard.add("red-ui-workspace-context-menu", "escape", function () { RED.contextMenu.hide() })
|
||||||
|
RED.events.on("editor:open", function () { RED.contextMenu.hide() });
|
||||||
|
RED.events.on("search:open", function () { RED.contextMenu.hide() });
|
||||||
|
RED.events.on("type-search:open", function () { RED.contextMenu.hide() });
|
||||||
|
RED.events.on("actionList:open", function () { RED.contextMenu.hide() });
|
||||||
|
RED.events.on("view:selection-changed", function () { RED.contextMenu.hide() });
|
||||||
|
return {
|
||||||
|
show: show,
|
||||||
|
hide: disposeMenu
|
||||||
|
}
|
||||||
|
})()
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user