Compare commits
	
		
			1709 Commits
		
	
	
		
			0.19.5
			...
			outliner-c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b65e4d5794 | ||
|  | 7599e865fd | ||
|  | ebca8c0217 | ||
|  | 752a080876 | ||
|  | 0541d9189d | ||
|  | 0e454b08c8 | ||
|  | 2d0ca20a03 | ||
|  | 61d9ccf263 | ||
|  | 1c30584153 | ||
|  | 5c5bebd689 | ||
|  | 93211470d1 | ||
|  | b5800205c4 | ||
|  | eeebf04509 | ||
|  | f4f99f594d | ||
|  | 5e8e739f78 | ||
|  | a15adc43af | ||
|  | 07556592c1 | ||
|  | 7694349078 | ||
|  | 4f3cb3103e | ||
|  | 842cd1ecf0 | ||
|  | 81a4f42673 | ||
|  | 152e695f4c | ||
|  | 5a0c10b80e | ||
|  | 7be824640c | ||
|  | c061487a16 | ||
|  | 97fd34150f | ||
|  | 6d294a0c74 | ||
|  | fe4ef354ac | ||
|  | d28b8b5e8d | ||
|  | f2b30d9a3f | ||
|  | 0a614f2741 | ||
|  | a9fb50787b | ||
|  | ce7d7a8e01 | ||
|  | 7006c00233 | ||
|  | 21866634b3 | ||
|  | 34dfd50702 | ||
|  | d9502a6c00 | ||
|  | 95f7b9205a | ||
|  | d14d4944a0 | ||
|  | b4b2729e96 | ||
|  | 299b81f51b | ||
|  | ad6b18e66f | ||
|  | 091a462a42 | ||
|  | cb218a57f1 | ||
|  | ba8649117d | ||
|  | 20daebd965 | ||
|  | 7c2786969a | ||
|  | 565aae5967 | ||
|  | 16a634063a | ||
|  | 4c28b5b227 | ||
|  | a7a949377b | ||
|  | c048b1a25b | ||
|  | f7e7f7ed01 | ||
|  | 5dfcb80de8 | ||
|  | c8f6100a6a | ||
|  | c0f4e07e10 | ||
|  | 3c259b2c22 | ||
|  | 3b3a2d4edc | ||
|  | e930098b51 | ||
|  | 43d5df4a12 | ||
|  | 914cfdbc55 | ||
|  | aa8f4af339 | ||
|  | b6fbe7d07d | ||
|  | bf9d6c7ac4 | ||
|  | 139ae547c6 | ||
|  | 8b252b458c | ||
|  | efecfa328b | ||
|  | 5651e7107f | ||
|  | b6b3ceef4d | ||
|  | 3e74d75f28 | ||
|  | 6d737b9e4c | ||
|  | dec82589d1 | ||
|  | f0193b0f67 | ||
|  | fdf8eb0657 | ||
|  | 2ce424b567 | ||
|  | 8995fa9ed1 | ||
|  | dc412b305c | ||
|  | d7505da997 | ||
|  | 4b54a81dfd | ||
|  | 132254b3a5 | ||
|  | 9128b12960 | ||
|  | e9104df047 | ||
|  | bae52613ab | ||
|  | 18af906fd3 | ||
|  | d45415ab22 | ||
|  | c6c42740c5 | ||
|  | a8d8540346 | ||
|  | cbf1afc9fe | ||
|  | 8a798e620a | ||
|  | 774751a25c | ||
|  | 13718032f6 | ||
|  | 1b497b340b | ||
|  | bb41ab482c | ||
|  | 215aab0fe4 | ||
|  | 666822cf51 | ||
|  | 40101df6ec | ||
|  | 4adcb9c439 | ||
|  | a6cd0bf7e9 | ||
|  | 8158744829 | ||
|  | 70c0c7bc14 | ||
|  | fdda29f048 | ||
|  | 95cc8ea80d | ||
|  | 18f8dde712 | ||
|  | effff3405b | ||
|  | 9d8cbcb993 | ||
|  | 3345f2f3b8 | ||
|  | bcf1d986a4 | ||
|  | a51e74bfa1 | ||
|  | cf00acac04 | ||
|  | 876a7a4646 | ||
|  | 95d1b7bc36 | ||
|  | d4ae0b0a2e | ||
|  | 36739fb444 | ||
|  | 7906c28abb | ||
|  | f87b40941f | ||
|  | 05f816fc5d | ||
|  | f9a157fe18 | ||
|  | ca213589ac | ||
|  | c5ca9fafee | ||
|  | 82b3a97d99 | ||
|  | 1c94064c57 | ||
|  | 7969dd431f | ||
|  | 22e7ddcb1d | ||
|  | b1eafac67a | ||
|  | 5d81cec00c | ||
|  | 9512450d7c | ||
|  | ed1998162f | ||
|  | ac2a21f992 | ||
|  | ad78ce0eb6 | ||
|  | 8ce49c25d4 | ||
|  | 4c24bd4ab9 | ||
|  | 0de49e2a75 | ||
|  | 05c3f459ad | ||
|  | 50aaef5103 | ||
|  | 38872049fd | ||
|  | 5dc1cc54d5 | ||
|  | 57f0fbbb98 | ||
|  | 977fef03b0 | ||
|  | 7d67e6a276 | ||
|  | 0832be5970 | ||
|  | 2343fbd86a | ||
|  | 367ebc1dd4 | ||
|  | 15cc88de6c | ||
|  | 64b3c11682 | ||
|  | b8784185e8 | ||
|  | fdc721baa1 | ||
|  | 03b64bc493 | ||
|  | a6a781f67c | ||
|  | fe1f8ca0a8 | ||
|  | a600feb5de | ||
|  | 1f2c0a78c2 | ||
|  | e4b9c6a2ee | ||
|  | a69db4d572 | ||
|  | 12c92072d0 | ||
|  | e674d9246b | ||
|  | b71f81af57 | ||
|  | b3535281ef | ||
|  | 5f5e6ea845 | ||
|  | 64d2e80690 | ||
|  | b6e0568e76 | ||
|  | dca5b3b2a0 | ||
|  | 243915516e | ||
|  | bc3683d8f6 | ||
|  | 1d36ce0fdf | ||
|  | 88d4d306f3 | ||
|  | 184d928cf7 | ||
|  | fbd911ed27 | ||
|  | dec3762b7a | ||
|  | a849872c21 | ||
|  | 1d71fb3554 | ||
|  | 0d3bf0cd00 | ||
|  | 6c766eba86 | ||
|  | cc760acb62 | ||
|  | f4d4bf8779 | ||
|  | 90f62e5e4a | ||
|  | f1bd3e1711 | ||
|  | 01dde8bea5 | ||
|  | 341c66a199 | ||
|  | bc1fb2770b | ||
|  | 9f1373945b | ||
|  | 266ee2ca81 | ||
|  | 35738cc1a3 | ||
|  | ff310f89bd | ||
|  | 9189db5531 | ||
|  | bfa5f39b6d | ||
|  | 15f97bbf26 | ||
|  | 90ba761325 | ||
|  | ddd428f76e | ||
|  | 0c83fa7060 | ||
|  | f2e2c7e4d0 | ||
|  | 717bfffa63 | ||
|  | a764a4a44b | ||
|  | 247fa0ce7c | ||
|  | 13932b2cfb | ||
|  | 0bd0540d2f | ||
|  | 9a17cc503c | ||
|  | 89a048e5fa | ||
|  | 88bc022e2a | ||
|  | 00e080459e | ||
|  | 5b197adf33 | ||
|  | 9019c31f91 | ||
|  | 2e14703b16 | ||
|  | f87698438d | ||
|  | 4af1cf1d1f | ||
|  | d6ad7dc6eb | ||
|  | f25e4ea520 | ||
|  | 17891d373b | ||
|  | 9f29149d87 | ||
|  | 010e20989a | ||
|  | ee13cd10fe | ||
|  | b0f9bf2c62 | ||
|  | 9fbfc3d677 | ||
|  | 189389f96a | ||
|  | 2af7066512 | ||
|  | 9cbc40a229 | ||
|  | 18bf220ca4 | ||
|  | 8750c4b121 | ||
|  | 417d2cb40a | ||
|  | 36b0698432 | ||
|  | 0edc57f0e3 | ||
|  | 3d76137247 | ||
|  | df9d231389 | ||
|  | e2aebaf0e7 | ||
|  | 20e84a847a | ||
|  | ad4779e32f | ||
|  | 90537e42ba | ||
|  | 4615465599 | ||
|  | 95418724fa | ||
|  | 989cb05257 | ||
|  | d7df20413d | ||
|  | f7e0f55c13 | ||
|  | e16f48c9fd | ||
|  | 4694644043 | ||
|  | f468d6e947 | ||
|  | 9a19477796 | ||
|  | 00d41c6de2 | ||
|  | fc2a9a85ff | ||
|  | 78c86880e4 | ||
|  | aca61c0354 | ||
|  | 73dde4de51 | ||
|  | 597c4a2e4f | ||
|  | 4245c0a0ad | ||
|  | 25aadc690a | ||
|  | 12dc4ab1fa | ||
|  | 55a5917282 | ||
|  | a5b33d11fc | ||
|  | d2d872f51c | ||
|  | 5c0b500f48 | ||
|  | 28418288e3 | ||
|  | 0150769c17 | ||
|  | 2eaea02489 | ||
|  | 1a9c4b7714 | ||
|  | d9f710aa52 | ||
|  | 2069cc4392 | ||
|  | f78be9050a | ||
|  | feb5d13e1c | ||
|  | a3b0448f53 | ||
|  | 3dfbefb9f5 | ||
|  | 9f6bac1b1b | ||
|  | 0f2ed14d16 | ||
|  | 3e898c487a | ||
|  | efb9dce92f | ||
|  | f024e0bbed | ||
|  | 3f1bb6771a | ||
|  | 0b3ced5203 | ||
|  | 373267c53b | ||
|  | ae3e250269 | ||
|  | 33200b2d08 | ||
|  | b032e00d01 | ||
|  | fda95dfc5d | ||
|  | bc96f2d0cb | ||
|  | c649e1b4a2 | ||
|  | f54ed8ebd1 | ||
|  | b82167fefa | ||
|  | 2efc2bc186 | ||
|  | f572c11912 | ||
|  | 4595a77c41 | ||
|  | 7c1853431a | ||
|  | e26eb85718 | ||
|  | 821b5686f2 | ||
|  | c989f466ed | ||
|  | 97c771f93a | ||
|  | 54dbdde9cb | ||
|  | 513957eea1 | ||
|  | 5eed4672ed | ||
|  | aafa4fe0b9 | ||
|  | 572c03631d | ||
|  | 2f869a55e2 | ||
|  | 161f6090c1 | ||
|  | efad7270b7 | ||
|  | 24eb78d137 | ||
|  | e969a1c97c | ||
|  | 4f31632863 | ||
|  | 1d417c07cd | ||
|  | 344c9fe57e | ||
|  | 9d4400349b | ||
|  | 24f7000918 | ||
|  | 6ff3286d78 | ||
|  | f058de8bcd | ||
|  | fbfc74e5ca | ||
|  | 1b5654001c | ||
|  | e0f3e94e2b | ||
|  | 5da89892b4 | ||
|  | a6ecb54cc4 | ||
|  | 04da13eaf9 | ||
|  | 7fa4df082e | ||
|  | ae001c5e82 | ||
|  | e7f942eda7 | ||
|  | fa8236ee2c | ||
|  | 08ec04c889 | ||
|  | e5150ea012 | ||
|  | 222ece2533 | ||
|  | 294696daf5 | ||
|  | d099356207 | ||
|  | 5c06761b1a | ||
|  | 05fc3c5eca | ||
|  | 9d4e2adde4 | ||
|  | a8db3d8dd3 | ||
|  | 6ae7c51dc5 | ||
|  | 84771f5864 | ||
|  | 4304d44851 | ||
|  | 1018c0e8a5 | ||
|  | b1d0013214 | ||
|  | 94ef25bbb9 | ||
|  | 13830ffc9c | ||
|  | e0bef941b4 | ||
|  | 03e9522d98 | ||
|  | 1bdbd31b96 | ||
|  | ef9db701f8 | ||
|  | afb564a4fc | ||
|  | 3e7f58dedd | ||
|  | e46d8345db | ||
|  | 2e364b6d9a | ||
|  | b4177836a8 | ||
|  | 5b2ee21204 | ||
|  | 9b6e798eb6 | ||
|  | 7c91c4ae5a | ||
|  | 7bc3b662e4 | ||
|  | 64af1f7e9b | ||
|  | f0038e9796 | ||
|  | 768aa4ac92 | ||
|  | f61c137ea3 | ||
|  | 20a8059758 | ||
|  | 58696c6ad4 | ||
|  | b5ed018bae | ||
|  | 91b7dd988e | ||
|  | b0c3c78899 | ||
|  | 282f00e091 | ||
|  | 5cd2791506 | ||
|  | 9b2e9ec41a | ||
|  | 08ef9ee682 | ||
|  | a8bc753720 | ||
|  | 266df86d98 | ||
|  | 85a1f59a93 | ||
|  | 43258ee816 | ||
|  | c4ca0b6e91 | ||
|  | 1bf3b3077e | ||
|  | c9194c3635 | ||
|  | 27c462fee9 | ||
|  | 7886e5d57c | ||
|  | 6912dec166 | ||
|  | b8e610e1b6 | ||
|  | 421b5846f2 | ||
|  | 6a30f2cbc8 | ||
|  | a8b1e91843 | ||
|  | 20f97d0d13 | ||
|  | 4c78f06c2b | ||
|  | c700d5c922 | ||
|  | a9508a2c04 | ||
|  | 09d55a0cbd | ||
|  | b165129388 | ||
|  | 0ef3471f8f | ||
|  | 9ba9998bd6 | ||
|  | 72126730ef | ||
|  | fd2213232c | ||
|  | 369c5754f2 | ||
|  | fc3d0ab053 | ||
|  | 1c63d7ff31 | ||
|  | de971fa53f | ||
|  | d005eb46cf | ||
|  | d1dd7d1d51 | ||
|  | b78ef006ec | ||
|  | 134c68c98e | ||
|  | 82539fc420 | ||
|  | 7a5604697f | ||
|  | 84d2b8ad6d | ||
|  | 9a0c843f29 | ||
|  | 4d96d95370 | ||
|  | 51ea5dc342 | ||
|  | 97d58e34f2 | ||
|  | 86ce5c591b | ||
|  | dea47a6e3d | ||
|  | 7621cf3377 | ||
|  | 5090b01b8e | ||
|  | 6675fdf3c2 | ||
|  | 491812fac5 | ||
|  | 8a82552bdc | ||
|  | bd4fc2e5cc | ||
|  | 32aa4c41ce | ||
|  | 2a6bedbd8d | ||
|  | 83942c2551 | ||
|  | 458d794f52 | ||
|  | 95982ad464 | ||
|  | 7723ff461b | ||
|  | 0ca36a89e3 | ||
|  | cc5fdd9844 | ||
|  | d09ee6611f | ||
|  | bba6855872 | ||
|  | 43970b404e | ||
|  | 1868289b71 | ||
|  | 37bcd5c603 | ||
|  | c9ad5bea93 | ||
|  | a09b3bb6c7 | ||
|  | 3d6170be5e | ||
|  | 00477fd67a | ||
|  | 21c57f968a | ||
|  | f7d2314d64 | ||
|  | 5ecf8c83db | ||
|  | 608834eafb | ||
|  | 1fd4b2b9fc | ||
|  | 01a143cd5a | ||
|  | 6321b21a1a | ||
|  | 8405826fab | ||
|  | 22de8855c1 | ||
|  | 1830478ec3 | ||
|  | 6d98b93135 | ||
|  | 54978e4d64 | ||
|  | 9d567d61fe | ||
|  | 79feb691bd | ||
|  | e16fe1e6a5 | ||
|  | 04d3981921 | ||
|  | 40c3099e4e | ||
|  | 3f86fd7176 | ||
|  | 9e6bc46540 | ||
|  | 5e892f222b | ||
|  | 2da1554caa | ||
|  | a53d0c091e | ||
|  | f88bfa059d | ||
|  | 2e38999506 | ||
|  | 42b841cb78 | ||
|  | c0d007ffa9 | ||
|  | 127b361979 | ||
|  | e3dab3cf20 | ||
|  | 569b9f3d06 | ||
|  | d6b5494625 | ||
|  | f76edf74f9 | ||
|  | 5c199d3bb4 | ||
|  | 634a51635c | ||
|  | 4f9395e881 | ||
|  | 8035531a27 | ||
|  | cc177533e8 | ||
|  | cd210d9fbf | ||
|  | 87b9b56b65 | ||
|  | bffcaa1c17 | ||
|  | 33cbb2ada8 | ||
|  | d08e77cf36 | ||
|  | 1f8ed9dcb9 | ||
|  | 53b127902c | ||
|  | 389cbf4900 | ||
|  | 80d100f3f9 | ||
|  | a05589c5a6 | ||
|  | 7d32636133 | ||
|  | 3db5f928ee | ||
|  | 797da3bc8e | ||
|  | 1e8d695311 | ||
|  | 00eb474e02 | ||
|  | ad6104baeb | ||
|  | cd552ab202 | ||
|  | bbd471ad93 | ||
|  | 0f1ca1c7cf | ||
|  | 62fc554d25 | ||
|  | 84dc34e68f | ||
|  | 0bb77bfa7f | ||
|  | b6702a0c3b | ||
|  | a781a1dd4d | ||
|  | d771527f77 | ||
|  | 3d9945b60c | ||
|  | 5897045f24 | ||
|  | b2f53a183e | ||
|  | be3dd63360 | ||
|  | f951fe6939 | ||
|  | 0622be843b | ||
|  | 272fbc0cb0 | ||
|  | 36bf2a3c38 | ||
|  | 663ed9833a | ||
|  | fcf757f715 | ||
|  | 88e729664a | ||
|  | c03abdb5e7 | ||
|  | 6d3eb7bb4b | ||
|  | 7ffd37d9cb | ||
|  | 87aacb4270 | ||
|  | 3f756aac21 | ||
|  | 504d13943d | ||
|  | 59b1466e5d | ||
|  | d5d9ac5c76 | ||
|  | bb12ec702a | ||
|  | 82490b0a58 | ||
|  | 2cbf625483 | ||
|  | 44f2a986a2 | ||
|  | c3df1c6cde | ||
|  | 6b52206186 | ||
|  | 9d4238e5cc | ||
|  | c16c119a7d | ||
|  | b49835c72f | ||
|  | ee6f6ae391 | ||
|  | 95a51aafdc | ||
|  | 5e7cd79ed9 | ||
|  | aba6173e23 | ||
|  | 468beee045 | ||
|  | 70ad66bcff | ||
|  | e2c3b35391 | ||
|  | 448de23f59 | ||
|  | 74a015c329 | ||
|  | 44a07c74fd | ||
|  | 0f8af4ba1c | ||
|  | 214d788029 | ||
|  | 530bf22bd5 | ||
|  | ccc98370eb | ||
|  | 7640bc029c | ||
|  | 3f72eb51a0 | ||
|  | 8801ace247 | ||
|  | faf46e4447 | ||
|  | 63978e226b | ||
|  | b96164d4f5 | ||
|  | 944070dfb1 | ||
|  | f0584df1d0 | ||
|  | ba209c2bdd | ||
|  | c6e2f28b97 | ||
|  | 2436bb0128 | ||
|  | 9c4640e010 | ||
|  | 1ee43113b1 | ||
|  | 902f477ee3 | ||
|  | 9c1d46ff92 | ||
|  | fe0d4f08f3 | ||
|  | 9cbd0fceea | ||
|  | b22a4f94ab | ||
|  | 14c2005bbc | ||
|  | a4c351fd4f | ||
|  | a364d4950d | ||
|  | d017dd75cd | ||
|  | 021df83c3f | ||
|  | 7805974736 | ||
|  | c1dae95f71 | ||
|  | e7c2ff3bd2 | ||
|  | 25459b52a1 | ||
|  | d45274494d | ||
|  | b81be8f358 | ||
|  | aa6c0b9d6e | ||
|  | 64580237d5 | ||
|  | b93165592e | ||
|  | 83c1e44925 | ||
|  | 3088115aba | ||
|  | fc93e502b8 | ||
|  | e90e6eaac3 | ||
|  | 2f4dcba54d | ||
|  | 683c6a748e | ||
|  | 175a871ee0 | ||
|  | b4e2061e85 | ||
|  | 2aef99c440 | ||
|  | 6c125e125f | ||
|  | 88cbc32abc | ||
|  | 8f45e8f84a | ||
|  | 21635aadfe | ||
|  | d5234888b3 | ||
|  | f478afb58a | ||
|  | a54ca699b5 | ||
|  | 1f5ff0c6d3 | ||
|  | 2a2541df59 | ||
|  | cd629c1699 | ||
|  | ff96773295 | ||
|  | 4d6828ec14 | ||
|  | dae1d6057e | ||
|  | 6726c42cc8 | ||
|  | 4f6023e44c | ||
|  | 9e16d7f433 | ||
|  | aa86cfc55f | ||
|  | 6931cb9895 | ||
|  | d32d04bd4e | ||
|  | 0b3e9bf5e2 | ||
|  | a4af7b8e21 | ||
|  | 72deee5d74 | ||
|  | 5e9e523d4c | ||
|  | c54509df3d | ||
|  | 63cc9adeaa | ||
|  | 74d760a46d | ||
|  | d46531def8 | ||
|  | eb09ec6834 | ||
|  | 9bd9c6a400 | ||
|  | 7321e206c5 | ||
|  | 2c7917f0ca | ||
|  | d94b20a908 | ||
|  | b1b1fe21dd | ||
|  | 1db3af7c8e | ||
|  | 397fe31f97 | ||
|  | bc283aa025 | ||
|  | 9dbdf0947b | ||
|  | 7c21bf4555 | ||
|  | 361dc194ee | ||
|  | 8c1aa83d12 | ||
|  | d2755a8049 | ||
|  | 1b78bd1684 | ||
|  | 5f67f1f078 | ||
|  | 07061928df | ||
|  | 18ff2df65c | ||
|  | 7b1411d171 | ||
|  | 3a1d0f3695 | ||
|  | 2cd5e1d3c5 | ||
|  | 000765fb77 | ||
|  | 0ff324b0db | ||
|  | a96d5096fe | ||
|  | e8ef476a6d | ||
|  | 22b9df62d1 | ||
|  | 6026da867b | ||
|  | 4d58902ba7 | ||
|  | 4dc1343445 | ||
|  | 080487cb33 | ||
|  | 0febcf4f9e | ||
|  | cd23f711ed | ||
|  | f9b147af42 | ||
|  | 775f1110d3 | ||
|  | 57649a9b81 | ||
|  | 72a268b70a | ||
|  | f86a171dff | ||
|  | e022b782a9 | ||
|  | bd67731bb7 | ||
|  | 25de4e4782 | ||
|  | c590247afa | ||
|  | 5d36539271 | ||
|  | 0d673486a3 | ||
|  | 29f1651a18 | ||
|  | dd20a3e685 | ||
|  | 75a5b1354c | ||
|  | dae9ac8173 | ||
|  | 78b735276b | ||
|  | e10dd54e2b | ||
|  | cb8deab1f9 | ||
|  | e5c27d0236 | ||
|  | faf6fa9450 | ||
|  | 873bdc6733 | ||
|  | 8a40b075b5 | ||
|  | 56c41374bf | ||
|  | a08c2c6437 | ||
|  | e94634544c | ||
|  | 07fe5b247b | ||
|  | c1c694035d | ||
|  | 147d2a02be | ||
|  | 6f91786f4d | ||
|  | f62a933d1c | ||
|  | 451835fbeb | ||
|  | 547e7a1b21 | ||
|  | 053e3ba923 | ||
|  | bf65dcd49b | ||
|  | a1d186112a | ||
|  | ca7a298509 | ||
|  | ff4d58f648 | ||
|  | a1e10e99fa | ||
|  | 16bda530f6 | ||
|  | bf9e04d9db | ||
|  | 8df86a75b1 | ||
|  | 5056203023 | ||
|  | a0026e66ce | ||
|  | f75dd2209d | ||
|  | e35f6d9e35 | ||
|  | 3cb00ce4e0 | ||
|  | 8e18cf5986 | ||
|  | 81f80600f5 | ||
|  | 895156675f | ||
|  | 1c424e2e0a | ||
|  | 0124bb17e8 | ||
|  | 2c89b2d262 | ||
|  | c7bbe2f1fe | ||
|  | 88609a8829 | ||
|  | 329beb166c | ||
|  | e36f3d937c | ||
|  | 1395092ca6 | ||
|  | c09004dbc8 | ||
|  | 7efe4a2776 | ||
|  | b763e0b0cb | ||
|  | ddd0d1bef3 | ||
|  | dbca2178c0 | ||
|  | af742ea536 | ||
|  | 14c1a86b9b | ||
|  | ee3dc8c4cd | ||
|  | 1ed148aaf5 | ||
|  | 3327adb1ae | ||
|  | 4d5f771f9f | ||
|  | aa69d663ed | ||
|  | 29d1894f9a | ||
|  | e5738d608c | ||
|  | 9775d3a33d | ||
|  | ad4cf8d631 | ||
|  | a27e8777aa | ||
|  | d23edcc0b5 | ||
|  | 52373e5bef | ||
|  | bb70e796a1 | ||
|  | 7957ec4369 | ||
|  | 3365d26b40 | ||
|  | d3c111b533 | ||
|  | ec876eb102 | ||
|  | dddfb1ec08 | ||
|  | 6fc9c03d70 | ||
|  | 199ff071e8 | ||
|  | 7e4a06044a | ||
|  | d047b75cb7 | ||
|  | 6fb6b13037 | ||
|  | 460c5a1ae3 | ||
|  | 9955bcc339 | ||
|  | 0a3ab996eb | ||
|  | 46f912a6f9 | ||
|  | 01e0f24752 | ||
|  | 7178c63e10 | ||
|  | 30c402eb83 | ||
|  | 2601cc898c | ||
|  | d2a8823808 | ||
|  | 6b61fa9f6f | ||
|  | 247052df5f | ||
|  | 8eb28555bc | ||
|  | 73132475dc | ||
|  | 42c6487ff3 | ||
|  | 8d2ca25fd6 | ||
|  | 5c5919a7eb | ||
|  | 34cdbfc852 | ||
|  | 1bc50194aa | ||
|  | 4a75236e74 | ||
|  | 64b2f881c4 | ||
|  | 4709ddea5d | ||
|  | 6ef49152f3 | ||
|  | 1c44b0bc98 | ||
|  | 11bce8c17c | ||
|  | b42fff1055 | ||
|  | 1b2e442513 | ||
|  | a4d48077ba | ||
|  | 901e2527d8 | ||
|  | f0839571d0 | ||
|  | 89d0d6ec93 | ||
|  | 922ab1d17b | ||
|  | 7c7be378bc | ||
|  | ec01f8f54b | ||
|  | 5a094b44c4 | ||
|  | 3c657a6645 | ||
|  | 3129d44ff1 | ||
|  | 00306f82c5 | ||
|  | 7def676a17 | ||
|  | 6c48735854 | ||
|  | a0b1831cdb | ||
|  | db9fb8480a | ||
|  | c138e2ffb4 | ||
|  | 473c45794e | ||
|  | a12aa81d73 | ||
|  | 0033e279f1 | ||
|  | a25e98d0cb | ||
|  | bc65480f27 | ||
|  | 8582cda124 | ||
|  | d963dfdbb6 | ||
|  | f7e9c109f6 | ||
|  | 30c3004f27 | ||
|  | 17653761b9 | ||
|  | 4f049fd94b | ||
|  | f98d1c95cc | ||
|  | a2b5c0247b | ||
|  | bca9b5d8c0 | ||
|  | bc789c7f9f | ||
|  | 28bda9fa41 | ||
|  | 18aeeab041 | ||
|  | c7427a5f7c | ||
|  | 03aa6c7d3a | ||
|  | 10077ae750 | ||
|  | 74eec25285 | ||
|  | b6055479a1 | ||
|  | 69b781419f | ||
|  | da6db24f9e | ||
|  | 2b66723d42 | ||
|  | 00a3e25714 | ||
|  | 8ccbd2d8f9 | ||
|  | 8307f26099 | ||
|  | c686f7eefc | ||
|  | 311c7b1158 | ||
|  | a17325f028 | ||
|  | b734097d16 | ||
|  | afaf077aca | ||
|  | bf14af6a1f | ||
|  | e72faef839 | ||
|  | b274bafe8e | ||
|  | 7bed967755 | ||
|  | 944b81b71c | ||
|  | cd529d53ae | ||
|  | 0d680a58f3 | ||
|  | b30d519523 | ||
|  | 83932e1725 | ||
|  | 4ce0e39760 | ||
|  | 84232f25f0 | ||
|  | 2daedf8fd5 | ||
|  | fe084a4478 | ||
|  | 5bf9646a76 | ||
|  | 2b1f28e6c2 | ||
|  | 5b8bd6e64f | ||
|  | 426fd499ce | ||
|  | 17d3a5840d | ||
|  | be49e1d383 | ||
|  | daa98e8925 | ||
|  | 58784b7568 | ||
|  | 419a183167 | ||
|  | 675b4bde14 | ||
|  | ee6ee99577 | ||
|  | 3bc1f69e75 | ||
|  | 5b9df6d5f2 | ||
|  | 9f062ec1b8 | ||
|  | b52a47bd03 | ||
|  | 5e20134f4f | ||
|  | 89d267d6a2 | ||
|  | 607bc42f59 | ||
|  | 880757fb5d | ||
|  | c8acc6a12e | ||
|  | 7d4c2442da | ||
|  | e5255b0c7c | ||
|  | ac3ef9b6fc | ||
|  | 7b5a41c3ff | ||
|  | d5b0d2a886 | ||
|  | 4d60447242 | ||
|  | 78bee3dc59 | ||
|  | e2db958510 | ||
|  | 16440072fb | ||
|  | be2dd6dc32 | ||
|  | 189bde7c9c | ||
|  | 6a4760e291 | ||
|  | c082bb97e0 | ||
|  | c8e14f91e7 | ||
|  | 6032d096ec | ||
|  | defa9a2270 | ||
|  | 77a913f858 | ||
|  | 6e3fa974ba | ||
|  | 7926055b97 | ||
|  | ffd10e656e | ||
|  | 59c1828078 | ||
|  | 6164271fe8 | ||
|  | 26ba35933d | ||
|  | 87359937c9 | ||
|  | 9b938f6515 | ||
|  | 6c3913785d | ||
|  | 542cf3147d | ||
|  | fb9828badc | ||
|  | 2505ac3f98 | ||
|  | fde8548166 | ||
|  | fe91295704 | ||
|  | 15b99c5749 | ||
|  | 9d66ca4a49 | ||
|  | b749a27f86 | ||
|  | 083212cffe | ||
|  | c4e8756210 | ||
|  | 3a6448f727 | ||
|  | fe18df25ba | ||
|  | db65460ec0 | ||
|  | 0ad3eceb82 | ||
|  | a376d6e361 | ||
|  | 45c7f3f3ca | ||
|  | 238de59a2a | ||
|  | 96255e51d2 | ||
|  | 18c3223105 | ||
|  | b9e97792f3 | ||
|  | cbce9b8637 | ||
|  | 5ab90b85da | ||
|  | f3e1e8a2c7 | ||
|  | e41b292e54 | ||
|  | 86928bbb2d | ||
|  | 2f5ec8b5bf | ||
|  | a42d7d867e | ||
|  | 14ac6446de | ||
|  | 260a9723a4 | ||
|  | 4e7b000dcd | ||
|  | 2254e4c57e | ||
|  | d517697564 | ||
|  | 25a27733b9 | ||
|  | 6ab520984c | ||
|  | 04d7106956 | ||
|  | db5589f2aa | ||
|  | d06dbbb4bd | ||
|  | b7a62bd9e7 | ||
|  | 93ad9a3aa6 | ||
|  | f1855174f0 | ||
|  | a2dedba0ef | ||
|  | 5a65f445f0 | ||
|  | f52289b2c3 | ||
|  | 3b5ea0f15f | ||
|  | 238bcb8698 | ||
|  | 3ee8bcad8c | ||
|  | f0a51bafbe | ||
|  | 944f3bd329 | ||
|  | 8bb7b2e88b | ||
|  | aab0b0b4bf | ||
|  | 083d6c5125 | ||
|  | c2167a2c5f | ||
|  | 1a695e0451 | ||
|  | 8847f325ed | ||
|  | 94c9da468e | ||
|  | 24b38407e4 | ||
|  | f49d1ae860 | ||
|  | 8b3b541a56 | ||
|  | a974e84ad1 | ||
|  | c4f4115bcb | ||
|  | 3c5adbee31 | ||
|  | 55645e3730 | ||
|  | d918bb568c | ||
|  | b1bff62bf7 | ||
|  | d11d389ae4 | ||
|  | a73c159160 | ||
|  | 7adf102d8d | ||
|  | e4d3ff623a | ||
|  | 2433d59f00 | ||
|  | 8c68e76c3e | ||
|  | 0b204de5a9 | ||
|  | 93c811ab70 | ||
|  | 3ff861099a | ||
|  | f22762539f | ||
|  | 677442a3c0 | ||
|  | b73f12cdba | ||
|  | 28fbb61e81 | ||
|  | c1104d1cd6 | ||
|  | e346702292 | ||
|  | 90887779ea | ||
|  | a941b1437c | ||
|  | 04bdcbd490 | ||
|  | 87a815fd6f | ||
|  | d623848c87 | ||
|  | 46abd0cc42 | ||
|  | e315325d91 | ||
|  | f3fc083330 | ||
|  | 92cb57eb7b | ||
|  | d645fbff2f | ||
|  | 8486f4d43a | ||
|  | 60b1a05894 | ||
|  | f955d63707 | ||
|  | f106019938 | ||
|  | 2473249c8b | ||
|  | d13dc4fba3 | ||
|  | 41a0af032c | ||
|  | 70cf7b0c5a | ||
|  | 14f6788ab9 | ||
|  | bb67049d90 | ||
|  | ae2162beaf | ||
|  | 19f2c5e07f | ||
|  | 8abc5b3889 | ||
|  | 4d37c28bc7 | ||
|  | cc0933eee4 | ||
|  | 2de9a804a0 | ||
|  | ffeb2e91f4 | ||
|  | 8cf5ec9e5a | ||
|  | ea0526f29a | ||
|  | cfcb3a69e5 | ||
|  | e3e0378857 | ||
|  | ccc3809daa | ||
|  | c97786e12c | ||
|  | 400071879f | ||
|  | 4cd6e20c91 | ||
|  | 460e3ad395 | ||
|  | 6f08bd6fc5 | ||
|  | eed3a749db | ||
|  | 6587d12fbd | ||
|  | f8dd68ecc4 | ||
|  | f0aef2b853 | ||
|  | 7d27df1b97 | ||
|  | 457ec86c25 | ||
|  | a24c66958f | ||
|  | 617628b886 | ||
|  | 6b7e623d33 | ||
|  | 5ca85b7e83 | ||
|  | 5965bf3332 | ||
|  | baf2dd293b | ||
|  | 2cc19e7e32 | ||
|  | 53ab6f8569 | ||
|  | cf8faac7ef | ||
|  | 86947a384d | ||
|  | 22855279bd | ||
|  | e56fdecdc6 | ||
|  | dc75a5812f | ||
|  | 33e20c9969 | ||
|  | 109204897f | ||
|  | 3b3a2d62f8 | ||
|  | b1b4b3fb63 | ||
|  | d583c68de5 | ||
|  | d360f30af6 | ||
|  | ed033565a4 | ||
|  | 2d6acfae1b | ||
|  | 10da894124 | ||
|  | 6dda8f21e4 | ||
|  | 1a9d759002 | ||
|  | df24e13eb5 | ||
|  | 2ab19937af | ||
|  | 390b86cd8e | ||
|  | 423aba5bab | ||
|  | dc0b9231cd | ||
|  | 3b177bedf8 | ||
|  | 12ce719213 | ||
|  | 320433b1bf | ||
|  | 7f35e2280e | ||
|  | c514d988df | ||
|  | 749a080397 | ||
|  | b105a12505 | ||
|  | abaf363ddd | ||
|  | 16db9d4290 | ||
|  | a694b0364d | ||
|  | b68835f171 | ||
|  | 32714c5dac | ||
|  | 245e06f026 | ||
|  | e0111d3fe6 | ||
|  | a71d4223ff | ||
|  | 20cba6411b | ||
|  | 502a8112b5 | ||
|  | 308c6ee4da | ||
|  | cae003d4fa | ||
|  | b9b900e908 | ||
|  | 8bdba9178a | ||
|  | 97f11e38cd | ||
|  | c4f5df0cd0 | ||
|  | 9ed3a6748a | ||
|  | 359c0354f6 | ||
|  | fc77c089fa | ||
|  | 137a7ac48c | ||
|  | 42b60aef4e | ||
|  | 5ab7380ad1 | ||
|  | afa25df1af | ||
|  | 5cb888328e | ||
|  | 78aeb94917 | ||
|  | 5f3e9a19ea | ||
|  | 420e8c001b | ||
|  | c63b8a4ebc | ||
|  | 5f5feaed5f | ||
|  | 87a1f616b0 | ||
|  | cc051544f9 | ||
|  | 85a438a40f | ||
|  | 877260a243 | ||
|  | 83d99043a8 | ||
|  | 6a57d25f4a | ||
|  | 91473e731e | ||
|  | 1d91ac1169 | ||
|  | 2850477a71 | ||
|  | 651b1c92c3 | ||
|  | 77e74eb37b | ||
|  | 5bb2bc7077 | ||
|  | 98a001a8ca | ||
|  | 0d75ff336d | ||
|  | 8567f1655e | ||
|  | 68b94737ed | ||
|  | 094c92ed85 | ||
|  | 42ab6deff1 | ||
|  | 3a257e1e00 | ||
|  | 2bf9a353a6 | ||
|  | bbe41febf1 | ||
|  | 031362a633 | ||
|  | 4418f8bfce | ||
|  | 364175fa9d | ||
|  | 13cf2b48e1 | ||
|  | e4f6694223 | ||
|  | 59093f1721 | ||
|  | db5e79a19b | ||
|  | f0b1585b52 | ||
|  | 50228c5970 | ||
|  | b98e85016a | ||
|  | bc540eefb6 | ||
|  | 3f1c4b4117 | ||
|  | 5e7689a151 | ||
|  | 42845cfcc0 | ||
|  | caad0eca67 | ||
|  | 67f8ec7f87 | ||
|  | d8d37a66e4 | ||
|  | 69db23f2f6 | ||
|  | c3f6bcad56 | ||
|  | ab1521bf26 | ||
|  | fafe8b88c2 | ||
|  | 9276988ff6 | ||
|  | 85179edf1b | ||
|  | 2f1ba6cf1f | ||
|  | 93674b4e29 | ||
|  | 20851664e8 | ||
|  | 38c87a056c | ||
|  | ad77565508 | ||
|  | 0e02e21967 | ||
|  | 1e35a6ce5e | ||
|  | 90b167eba1 | ||
|  | 5b1defad9f | ||
|  | 8dc1ad8168 | ||
|  | 126a42056d | ||
|  | 5866dad79a | ||
|  | 9dac679b72 | ||
|  | 12ff3abeda | ||
|  | 0f07fb4479 | ||
|  | d9d98439b2 | ||
|  | d251a30cb8 | ||
|  | a2632fdcc8 | ||
|  | 10c818474c | ||
|  | 5e8279cf51 | ||
|  | 4c8c081c31 | ||
|  | bad2baba7f | ||
|  | b5da6f9c74 | ||
|  | 7ec999475e | ||
|  | 742bf85a89 | ||
|  | c9c6f41aad | ||
|  | b0d93df387 | ||
|  | 3e20892fdf | ||
|  | 369f8b3fe0 | ||
|  | 337dfba2b8 | ||
|  | 493687b5bb | ||
|  | c7587960fb | ||
|  | 5c962aa899 | ||
|  | 3e9d2a8062 | ||
|  | c2aa8a206a | ||
|  | 6d8ea2b6a4 | ||
|  | b581e33611 | ||
|  | 5e43a02cd3 | ||
|  | 6f37d5ca5c | ||
|  | 3263008379 | ||
|  | 4588089bd6 | ||
|  | 44b75f0b92 | ||
|  | 162bd6a8c3 | ||
|  | 0c13603185 | ||
|  | ed2a45e975 | ||
|  | 0fa165c606 | ||
|  | fe63ab1242 | ||
|  | faf808da69 | ||
|  | 71709cd662 | ||
|  | d92040b804 | ||
|  | 3662fbb462 | ||
|  | d89ae3ebbf | ||
|  | 6175fecdd8 | ||
|  | fab632da62 | ||
|  | c1e3b0d971 | ||
|  | 7b15ba31ea | ||
|  | f11d4ccd45 | ||
|  | fbec803129 | ||
|  | 0f57d1a433 | ||
|  | 63829b6382 | ||
|  | 8ac3899ddc | ||
|  | 59fb4ea6f8 | ||
|  | 92bb9bb3c3 | ||
|  | 1795c491a8 | ||
|  | ea333c19f7 | ||
|  | 28ef879c07 | ||
|  | 10839abf24 | ||
|  | 9832394f8e | ||
|  | dd89ea3731 | ||
|  | 5d9fd6dc3b | ||
|  | f7c87e26db | ||
|  | f98f4085bf | ||
|  | 543519d055 | ||
|  | 5a9fcd9267 | ||
|  | fe2360883f | ||
|  | b45ddadb09 | ||
|  | a3cbe80a36 | ||
|  | ee6c6266cc | ||
|  | d6bd35287f | ||
|  | 962a29110c | ||
|  | a242475b38 | ||
|  | d59bf84470 | ||
|  | 161ee17f45 | ||
|  | 8aa00b0cfc | ||
|  | afe89c3621 | ||
|  | bdf68311b4 | ||
|  | afa69f4c0e | ||
|  | 6fe2b24592 | ||
|  | 7442b356e3 | ||
|  | 1d7be6457f | ||
|  | c9ff05ba80 | ||
|  | faae184f1c | ||
|  | 515a8a9bbb | ||
|  | 58914e5c5f | ||
|  | c944eaab5c | ||
|  | d3d9533493 | ||
|  | 9c474cc089 | ||
|  | 3f1b0b986f | ||
|  | 28e08ebaf5 | ||
|  | 3213c03754 | ||
|  | 4447288a4c | ||
|  | eee4e83a1e | ||
|  | a67b492620 | ||
|  | 6062ff2748 | ||
|  | 3b11195caa | ||
|  | 9946ea111c | ||
|  | 7074d66f8e | ||
|  | 008b26f329 | ||
|  | b246f0779f | ||
|  | dc89218702 | ||
|  | 3c013b3533 | ||
|  | fe0d0f08e4 | ||
|  | 38b5063038 | ||
|  | e55481a454 | ||
|  | 7063a88513 | ||
|  | a9bf3d0226 | ||
|  | 781b3aff1b | ||
|  | b011b9203b | ||
|  | 39344fcae5 | ||
|  | a046b357da | ||
|  | d8e4020cec | ||
|  | f80b172022 | ||
|  | 66fc4b536c | ||
|  | 1f97ccdddb | ||
|  | 308d6889a7 | ||
|  | c3b9982c44 | ||
|  | fab796e4e4 | ||
|  | 749db6ba82 | ||
|  | 12d6c4ddf5 | ||
|  | 430a03bb14 | ||
|  | 43f21fc7aa | ||
|  | b27da3d1a0 | ||
|  | 4463a8e3b2 | ||
|  | 9e74ddac48 | ||
|  | 5f62e41d62 | ||
|  | 19a103d3a0 | ||
|  | 8fb6bc059e | ||
|  | 8f61a0d258 | ||
|  | 7fa589e430 | ||
|  | 6d8d826764 | ||
|  | a40e84e1f6 | ||
|  | 4844c2123f | ||
|  | 236d437430 | ||
|  | ae726c199b | ||
|  | e7f54f005c | ||
|  | e7b1ec6904 | ||
|  | f4f664a4a2 | ||
|  | fec52a8151 | ||
|  | d8b4c1e209 | ||
|  | eac853c7dd | ||
|  | a04337a270 | ||
|  | 50d7e16365 | ||
|  | ef7bc931b7 | ||
|  | 41de771074 | ||
|  | 2ebdd6c5cb | ||
|  | b51cfcc753 | ||
|  | 91cc03dd80 | ||
|  | 9d673a213e | ||
|  | 97e789538e | ||
|  | e05ff01d57 | ||
|  | 0748dff355 | ||
|  | 28d4084aa0 | ||
|  | afd2ccfb4f | ||
|  | 057127f4de | ||
|  | 2937b25d6d | ||
|  | 419f26db87 | ||
|  | be1b9c0e43 | ||
|  | 894d28c60b | ||
|  | 06cc08d9f7 | ||
|  | 75393c0b28 | ||
|  | bdc1da70c1 | ||
|  | 7cef990ba6 | ||
|  | fb0f12bb20 | ||
|  | e94b8d3e84 | ||
|  | 8c00e1fdf4 | ||
|  | a31fa82284 | ||
|  | 5d0af45d8f | ||
|  | e9f248020e | ||
|  | a8e1058af6 | ||
|  | 1a087fd799 | ||
|  | 50c81533e0 | ||
|  | 5eab9aa4b1 | ||
|  | 1970cbfe37 | ||
|  | 6d736201f9 | ||
|  | 51ec52b573 | ||
|  | d099387186 | ||
|  | 3f91e4da66 | ||
|  | 4124159378 | ||
|  | 18f3789e29 | ||
|  | a713c92530 | ||
|  | 7828af591e | ||
|  | d432dba726 | ||
|  | 72ae87857f | ||
|  | 724acff591 | ||
|  | 482b432e2c | ||
|  | 351c0cb0a8 | ||
|  | 314a0fb5d6 | ||
|  | a301bf8bf5 | ||
|  | 37b3601c47 | ||
|  | 6e944485f0 | ||
|  | 431266069e | ||
|  | d48a09e68b | ||
|  | 1db1ec7b5e | ||
|  | 2a8f0a4eab | ||
|  | 79f3669fac | ||
|  | aab0f2dcd5 | ||
|  | a47831e278 | ||
|  | f1a5e8a42c | ||
|  | 723e9b3cba | ||
|  | ff759a8074 | ||
|  | 4de1056d82 | ||
|  | 884b8da8bf | ||
|  | 044ad77a4b | ||
|  | 1fe8b388a3 | ||
|  | 79fe7d684c | ||
|  | c409af0ea8 | ||
|  | 5110eaff96 | ||
|  | db3eee72b5 | ||
|  | 3bcff91328 | ||
|  | e843f192ec | ||
|  | f3d2053878 | ||
|  | efe8fbbd11 | ||
|  | ce507b3b52 | ||
|  | 85de227003 | ||
|  | 7c6eb7c794 | ||
|  | 2037741b54 | ||
|  | d534a8952d | ||
|  | 0b05b883cb | ||
|  | 6937aa5ddd | ||
|  | 8f6b24e0aa | ||
|  | ba3b64a6c6 | ||
|  | d23b32a830 | ||
|  | ceba08a801 | ||
|  | e0bb03a53f | ||
|  | 0881c6a20b | ||
|  | f88a4b1791 | ||
|  | 2b43e3ee23 | ||
|  | 2e063f91bc | ||
|  | 79062e2034 | ||
|  | a413f3cded | ||
|  | 4baaaa8d59 | ||
|  | c99b35428b | ||
|  | 3c8e4f8bbf | ||
|  | aa9a37da38 | ||
|  | 85efb48c1f | ||
|  | 888e7ee023 | ||
|  | d7bbf8a8da | ||
|  | e2ee88de84 | ||
|  | 1d1ab5b7b2 | ||
|  | 54c863d48f | ||
|  | acc633b4b6 | ||
|  | 766ccf85c2 | ||
|  | 7ab5a2be47 | ||
|  | 7a6e1fe566 | ||
|  | 4749c92252 | ||
|  | 0e035e47df | ||
|  | 1359545e13 | ||
|  | 5b2f24f842 | ||
|  | bb73e30909 | ||
|  | 490903ca25 | ||
|  | 901b32297e | ||
|  | dd72046922 | ||
|  | 6286b34d00 | ||
|  | 81f4e0de56 | ||
|  | 596fbfb517 | ||
|  | da756fa568 | ||
|  | 30aebc4ee3 | ||
|  | 45138ce5ca | ||
|  | f26b9feeaf | ||
|  | 9e47d933af | ||
|  | f309a9d537 | ||
|  | a786b37cb9 | ||
|  | 6a519a30a2 | ||
|  | 81ae552e69 | ||
|  | 0ec04a3624 | ||
|  | 81d5b47fce | ||
|  | ed31a0cf15 | ||
|  | 201d1926bc | ||
|  | 9ee6655bfa | ||
|  | c4beab6b0d | ||
|  | 34b6643913 | ||
|  | 98e391b867 | ||
|  | 19eb8e9a6d | ||
|  | 43b7aa40c3 | ||
|  | 747af44fc1 | ||
|  | a73381e24b | ||
|  | d5ef428edd | ||
|  | 5fa4d227b8 | ||
|  | cc7e3b0c26 | ||
|  | 473a2ae275 | ||
|  | 7f5d47f39d | ||
|  | 6031f146aa | ||
|  | 020a469f3b | ||
|  | 091de3aa66 | ||
|  | b837f7608c | ||
|  | afe9367bac | ||
|  | 9bd9023cb6 | ||
|  | 8502cf8498 | ||
|  | 33dade0584 | ||
|  | 84cc2ad0fa | ||
|  | dc2d3bc7c0 | ||
|  | 64df557423 | ||
|  | 715cc77e76 | ||
|  | b80d1af3d7 | ||
|  | f05f534fd2 | ||
|  | c0837ead0e | ||
|  | a1f135bd66 | ||
|  | 978f4ecc58 | ||
|  | 46a8d96997 | ||
|  | c283224000 | ||
|  | a6ef755139 | ||
|  | 29a257d17a | ||
|  | 368b76a183 | ||
|  | 8bb861124d | ||
|  | 2f884ec778 | ||
|  | 8c561e92c8 | ||
|  | 633b9180d7 | ||
|  | 0e2d0e1b6f | ||
|  | ea4d65ceee | ||
|  | d47ac84d2e | ||
|  | a97759aa35 | ||
|  | 3fcfd4abdd | ||
|  | 6d771da9a9 | ||
|  | 6201247875 | ||
|  | 8c367bcc53 | ||
|  | 8198132ca7 | ||
|  | cf3b4e9e63 | ||
|  | 987dbf8a92 | ||
|  | acf8c9bc4a | ||
|  | 7173895d36 | ||
|  | 43530d4a5f | ||
|  | fefabef9ee | ||
|  | 0dd40a941b | ||
|  | 24b6670bc4 | ||
|  | 76661abbf5 | ||
|  | e9dc9eff9b | ||
|  | 2f160743bc | ||
|  | 98616e772c | ||
|  | bc014fec9b | ||
|  | 732598d9d2 | ||
|  | 2979acd5b8 | ||
|  | fd20cd524e | ||
|  | 7b80ae42e1 | ||
|  | b7012674c6 | ||
|  | c76bd39280 | ||
|  | 09cd710f66 | ||
|  | d9aadf9d98 | ||
|  | 86716b5ffb | ||
|  | 96e3aab3b4 | ||
|  | 72c78fe3ad | ||
|  | abe746020b | ||
|  | 8e1c15419c | ||
|  | ee47646cf7 | ||
|  | 32d9acdaa5 | ||
|  | 4eb3bd496b | ||
|  | 3c4f4d27d6 | ||
|  | 2060af8a92 | ||
|  | 21bf74a467 | ||
|  | 677833a277 | ||
|  | 0b5e4f2dd7 | ||
|  | 06a1f30350 | ||
|  | c1ff241550 | ||
|  | 5717f75eac | ||
|  | 6b3b68a4e5 | ||
|  | 8bda2d0add | ||
|  | bc02c9573c | ||
|  | 86bb5503ab | ||
|  | 21ce23d27d | ||
|  | 6c75baecb2 | ||
|  | 8167608f04 | ||
|  | 514e31aef9 | ||
|  | 20a31a6d38 | ||
|  | 4f0aa1bc02 | ||
|  | be0ef6e594 | ||
|  | 93a8dbd31a | ||
|  | cf931e8ddf | ||
|  | 510bfbf268 | ||
|  | 2f93bb969b | ||
|  | 27365c9f7b | ||
|  | b1d2e188f5 | ||
|  | e4f67df2a1 | ||
|  | e094ea3d2a | ||
|  | 7515b745b5 | ||
|  | 0e902a7e71 | ||
|  | 2dfb443625 | ||
|  | e6e7747ae1 | ||
|  | d80ea6c0f5 | ||
|  | ac6e3988a8 | ||
|  | bfd98f3767 | ||
|  | cc8bc1339f | ||
|  | 542d1dc600 | ||
|  | 1c66c88f95 | ||
|  | dc880c672a | ||
|  | 073f38c68c | ||
|  | 6a6d13b075 | ||
|  | 9bb7e72c69 | ||
|  | 7436e01188 | ||
|  | 3d272d0f10 | ||
|  | ee66a12dad | ||
|  | 47de85b012 | ||
|  | f85b63a972 | ||
|  | e630919ef8 | ||
|  | 2e3fd49b40 | ||
|  | dd54af2c08 | ||
|  | 737bf411ff | ||
|  | 5070b1a6b5 | ||
|  | c849da92cf | ||
|  | 6a4e7201fe | ||
|  | ffa6dea452 | ||
|  | 30c1d31a99 | ||
|  | 6934a2d5c3 | ||
|  | b9906ced9a | ||
|  | 5500b4fe35 | ||
|  | 2353f12cd6 | ||
|  | 1b8cab0f58 | ||
|  | 869c1d4ea4 | ||
|  | 9b938195a8 | ||
|  | bb3c52821a | ||
|  | 81c8ae95e2 | ||
|  | 6098570ab7 | ||
|  | d033c24fe5 | ||
|  | 4995e52dd6 | ||
|  | c0d8f904b3 | ||
|  | 8dba0dac9e | ||
|  | d0bf4a5329 | ||
|  | 7b28ba6078 | ||
|  | e6466c3c3a | ||
|  | d96d3064d6 | ||
|  | d4589ed7e3 | ||
|  | 5cfc52ea18 | ||
|  | 3fcacd8339 | ||
|  | 49fe13f22f | ||
|  | 4d27ba1bda | ||
|  | b715ac8bf4 | ||
|  | d96049416f | ||
|  | 1c4df785fd | ||
|  | 8f94c5efeb | ||
|  | 7cffa1ece7 | ||
|  | 1ac18d7b33 | ||
|  | 1111d2518b | ||
|  | ba7416450e | ||
|  | 3b02d36acb | ||
|  | c2aa9a5337 | ||
|  | 70fb181b7b | ||
|  | e64f4e3f39 | ||
|  | e4d518749f | ||
|  | 7dcca2c907 | ||
|  | 4a027b8a79 | ||
|  | c2c6e6080e | ||
|  | 09abec15b1 | ||
|  | 33d0d12bc8 | ||
|  | f488869635 | ||
|  | 6382564727 | ||
|  | 7476b4c7db | ||
|  | daf3e6a47a | ||
|  | 5bd3d12c7b | ||
|  | c9db74ebca | ||
|  | f8a88cc1a4 | ||
|  | 4a081bf125 | ||
|  | 8a68a3e861 | ||
|  | 7a9dd9ad9c | ||
|  | 6c01d0f9d8 | ||
|  | 45a53ac168 | ||
|  | dabb2790c9 | ||
|  | c66c5ea53c | ||
|  | 0a98ba6985 | ||
|  | bb8e491856 | ||
|  | 5590d31336 | ||
|  | dc7e48dc53 | ||
|  | 371d357218 | ||
|  | f22960ad59 | ||
|  | 34ead436b0 | ||
|  | 808d5a75ae | ||
|  | 55e897faac | ||
|  | 5a5dda21e4 | ||
|  | f085655daa | ||
|  | 9751089807 | ||
|  | b2516117f5 | ||
|  | 2816b3edae | ||
|  | 242398c724 | ||
|  | 289583325d | ||
|  | 0f793ebd65 | ||
|  | ce014044ea | ||
|  | 1064e531f0 | ||
|  | dc3128fb3e | ||
|  | d40aa7260f | ||
|  | fc8c4063f2 | ||
|  | f204c77ba3 | ||
|  | 7a8545273c | ||
|  | c13e79e9c3 | ||
|  | a20eaf852f | ||
|  | 84a6a5235e | ||
|  | 8235b7b96d | ||
|  | 0376e0d711 | ||
|  | 6bd0682e8c | ||
|  | e24c22f9be | ||
|  | f4ca8cd738 | ||
|  | 422109868d | ||
|  | bcc7834650 | ||
|  | 1161e4f6c1 | ||
|  | 14435c24ac | ||
|  | 22ede79799 | ||
|  | 6cb3699ee9 | ||
|  | 6c65d3830e | ||
|  | cdcf39fe82 | ||
|  | 71403e5acd | ||
|  | 3d70bc722a | ||
|  | b2f50da322 | ||
|  | 2a50c66df8 | ||
|  | 8de47c0a6e | ||
|  | 023391e22a | ||
|  | a4ddfd404f | ||
|  | 7307e558cb | ||
|  | 47356f5221 | ||
|  | c6f8950b64 | ||
|  | 071f4eacde | ||
|  | f96bdc578e | ||
|  | 114420e8fd | ||
|  | ba49b2c681 | ||
|  | 5391fc962a | ||
|  | d6211af5bd | ||
|  | ef114e31c2 | ||
|  | fd74a03479 | ||
|  | 428bf634e9 | ||
|  | 8789d983ed | ||
|  | 10faa96bcf | ||
|  | 42d31b9ee6 | ||
|  | c9dc9b4fe9 | ||
|  | f13e02a1a9 | ||
|  | d887ab126b | ||
|  | 1a7868159a | ||
|  | c6a1c8e8c4 | ||
|  | fba339f666 | ||
|  | 09d41a9708 | ||
|  | 4630a162af | ||
|  | fde157ff50 | ||
|  | 51f875c02d | ||
|  | f0957c838f | ||
|  | f5bebef37f | ||
|  | 80a15089b4 | ||
|  | 8edf399631 | ||
|  | d5ffd1432f | ||
|  | e73bf03615 | ||
|  | 665fe0e01e | ||
|  | a866aa9c18 | ||
|  | d9089b798c | ||
|  | d34ebd4d1b | ||
|  | 716aa74004 | ||
|  | 2aae76c9bc | ||
|  | 5fc3ca0e23 | ||
|  | 5bb27109bf | ||
|  | 7406ab6017 | ||
|  | f30ff7a2fd | ||
|  | c102828a99 | ||
|  | cb0e631b85 | ||
|  | 62b2adab78 | ||
|  | 0529eed0c9 | ||
|  | 8c169dc82b | ||
|  | 195342f7db | ||
|  | cfaaef7860 | ||
|  | e939d5e96e | ||
|  | 9f4628cf0a | ||
|  | ec4d24af91 | ||
|  | 51373f59e2 | ||
|  | 6cc56879d3 | ||
|  | da89460830 | ||
|  | 9e006d42bb | ||
|  | 4c02bab4ee | ||
|  | 5800ed41f1 | ||
|  | 18b5b4901f | ||
|  | 368418cf56 | ||
|  | 3e6cadf3d8 | ||
|  | 0c5a76b391 | ||
|  | bf1afcfe8a | ||
|  | 2980818f0d | ||
|  | 9da58dbaf0 | ||
|  | 55d71659f8 | ||
|  | 8d5b546763 | ||
|  | 19c9707d62 | ||
|  | 79e004a040 | ||
|  | 48308db45b | ||
|  | 3f37e96f78 | ||
|  | 4e21a5e557 | ||
|  | 19fa69811b | ||
|  | 0ddb4c625d | ||
|  | 36dc1d2f97 | ||
|  | 11fa2cb35d | ||
|  | 546f07156f | ||
|  | 7e7117632d | ||
|  | 954226da0d | ||
|  | 38a1291c5b | ||
|  | 998bf92ad4 | ||
|  | 974ba40f28 | ||
|  | e57d8ba0ef | ||
|  | 6b79c6135f | ||
|  | a747d8c2d5 | ||
|  | a3aec6b939 | ||
|  | bba57f8d2b | ||
|  | 4312a01707 | ||
|  | ecd8f97d8b | ||
|  | 06abe63fb1 | ||
|  | 9d507b09ca | ||
|  | 9c4a712dc7 | ||
|  | b14a0e0dde | ||
|  | e982f5076f | ||
|  | 42188b9f49 | ||
|  | 50e2dcbcd5 | ||
|  | 6104bb98f1 | ||
|  | 0835fdd0d1 | ||
|  | 522360dcb7 | ||
|  | 979713c4db | ||
|  | e41d5c249f | ||
|  | f82a779817 | ||
|  | df8a8ea204 | ||
|  | 8957d33e49 | ||
|  | 28fe1e4c8f | ||
|  | 0c7f4e2168 | ||
|  | b22956bd99 | ||
|  | 42516206d9 | ||
|  | fc4edde6e6 | ||
|  | 54cc04fd96 | ||
|  | 80062b6a62 | ||
|  | 99af79fcf3 | ||
|  | 11d87205d7 | ||
|  | 5866d414ce | ||
|  | 9a972b0b8a | ||
|  | e6aeeea8c1 | ||
|  | 5d064aa1d7 | ||
|  | 34832d5942 | ||
|  | e3b1179a21 | ||
|  | f94a36613c | ||
|  | efc3cc24f4 | ||
|  | b47f8aaf70 | ||
|  | 94ca4607bc | ||
|  | 2dab1d3e6e | ||
|  | 825b0fb22f | ||
|  | 1cdb039ea2 | ||
|  | 7409cb3abb | ||
|  | e8e8f70c27 | 
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| /packages/node_modules/** linguist-generated=false | ||||
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE.md
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -28,7 +28,8 @@ To help us understand the issue, please fill-in as much of the following informa | ||||
| ### Please tell us about your environment: | ||||
|  | ||||
| - [ ] Node-RED version: | ||||
| - [ ] node.js version: | ||||
| - [ ] Node.js version: | ||||
| - [ ] npm version: | ||||
| - [ ] Platform/OS: | ||||
| - [ ] Browser: | ||||
| - [ ] running in Docker: | ||||
|   | ||||
							
								
								
									
										39
									
								
								.github/ISSUE_TEMPLATE/--bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,39 @@ | ||||
| --- | ||||
| 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
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| --- | ||||
| name: Anything Else | ||||
| about: Something that is not a bug report | ||||
| title: '' | ||||
| labels: '' | ||||
| assignees: '' | ||||
|  | ||||
| --- | ||||
|  | ||||
| Please DO NOT raise an issue. | ||||
|  | ||||
| We DO NOT use the issue tracker for general support or feature requests. Only bug reports should be raised here using the 'Bug report' template. | ||||
|  | ||||
| For general support, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.  | ||||
| That way the whole Node-RED user community can help, rather than rely on the core development team. | ||||
|  | ||||
| For feature requests, please use the Node-RED Forum](https://discourse.nodered.org). Many ideas have already been discussed there and you should search that for your request before starting a new discussion. | ||||
							
								
								
									
										2
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -29,6 +29,6 @@ the [forum](https://discourse.nodered.org) or | ||||
| <!-- Put an `x` in the boxes that apply --> | ||||
|  | ||||
| - [ ] 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 mailing list/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 added suitable unit tests to cover the new/changed functionality | ||||
|   | ||||
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -17,3 +17,9 @@ node_modules | ||||
| public | ||||
| locales/zz-ZZ | ||||
| nodes/core/locales/zz-ZZ | ||||
| !packages/node_modules | ||||
| packages/node_modules/@node-red/editor-client/public | ||||
| !test/**/node_modules | ||||
| docs | ||||
| !packages/node_modules/**/docs | ||||
| .vscode | ||||
| @@ -1,5 +1,4 @@ | ||||
| /Gruntfile.js | ||||
| /.git/* | ||||
| /lib/* | ||||
| *.backup | ||||
| /public/* | ||||
|   | ||||
| @@ -1,7 +0,0 @@ | ||||
| .settings | ||||
| .jshintignore | ||||
| .jshintrc | ||||
| .project | ||||
| .tern-project | ||||
| .travis.yml | ||||
| .git | ||||
| @@ -2,11 +2,11 @@ sudo: false | ||||
| language: node_js | ||||
| matrix: | ||||
|   include: | ||||
|     - node_js: "14" | ||||
|     - node_js: "12" | ||||
|     - node_js: "10" | ||||
|       script: | ||||
|         - ./node_modules/.bin/grunt && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage | ||||
|       before_script: | ||||
|         - npm install -g istanbul coveralls | ||||
|     - node_js: "8" | ||||
|     - node_js: "6" | ||||
|     - node_js: "4" | ||||
|   | ||||
							
								
								
									
										15
									
								
								API.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | ||||
| Node-RED Modules | ||||
| --- | ||||
|  | ||||
| Node-RED provides a set of node modules that implement different parts of the | ||||
| application. | ||||
|  | ||||
| Module | Description | ||||
| -------|------- | ||||
| [node-red](node-red.html) | the main module that pulls together all of the internal modules and provides the executable version of Node-RED | ||||
| [@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API | ||||
| [@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED | ||||
| [@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules | ||||
| @node-red/registry | the internal node registry | ||||
| @node-red/nodes | the default set of core nodes | ||||
| @node-red/editor-client | the client-side resources of the Node-RED editor application | ||||
							
								
								
									
										1076
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						| @@ -26,7 +26,7 @@ relevant nodes, press Ctrl-E and copy the flow data from the Export dialog. | ||||
| At a minimum, please include: | ||||
|  | ||||
|  - Version of Node-RED - either release number if you downloaded a zip, or the first few lines of `git log` if you are cloning the repository directly. | ||||
|  - Version of node.js - what does `node -v` say? | ||||
|  - Version of Node.js - what does `node -v` say? | ||||
|  | ||||
| ## Feature requests | ||||
|  | ||||
|   | ||||
							
								
								
									
										466
									
								
								Gruntfile.js
									
									
									
									
									
								
							
							
						
						| @@ -15,6 +15,8 @@ | ||||
|  **/ | ||||
|  | ||||
| var path = require("path"); | ||||
| var fs = require("fs-extra"); | ||||
| var sass = require("node-sass"); | ||||
|  | ||||
| module.exports = function(grunt) { | ||||
|  | ||||
| @@ -24,9 +26,13 @@ module.exports = function(grunt) { | ||||
|         nodemonArgs.push(flowFile); | ||||
|     } | ||||
|  | ||||
|     var browserstack = grunt.option('browserstack'); | ||||
|     if (browserstack) { | ||||
|         process.env.BROWSERSTACK = true; | ||||
|     } | ||||
|     var nonHeadless = grunt.option('non-headless'); | ||||
|     if (nonHeadless) { | ||||
|         process.env.NODE_RED_NON_HEADLESS = 'true'; | ||||
|         process.env.NODE_RED_NON_HEADLESS = true; | ||||
|     } | ||||
|     grunt.initConfig({ | ||||
|         pkg: grunt.file.readJSON('package.json'), | ||||
| @@ -42,7 +48,7 @@ module.exports = function(grunt) { | ||||
|                 reporter: 'spec' | ||||
|             }, | ||||
|             all: { src: ['test/**/*_spec.js'] }, | ||||
|             core: { src: ["test/_spec.js","test/red/**/*_spec.js"]}, | ||||
|             core: { src: ["test/_spec.js","test/unit/**/*_spec.js"]}, | ||||
|             nodes: { src: ["test/nodes/**/*_spec.js"]} | ||||
|         }, | ||||
|         webdriver: { | ||||
| @@ -57,10 +63,11 @@ module.exports = function(grunt) { | ||||
|                 ignoreLeaks: false, | ||||
|                 ui: 'bdd', | ||||
|                 reportFormats: ['lcov','html'], | ||||
|                 print: 'both' | ||||
|                 print: 'both', | ||||
|                 istanbulOptions: ['--no-default-excludes', '-i','**/packages/node_modules/**'] | ||||
|             }, | ||||
|             all: { src: ["test/_spec.js","test/red/**/*_spec.js","test/nodes/**/*_spec.js"] }, | ||||
|             core: { src: ["test/_spec.js","test/red/**/*_spec.js"]}, | ||||
|             all: { src: ["test/unit/_spec.js","test/unit/**/*_spec.js","test/nodes/**/*_spec.js"] }, | ||||
|             core: { src: ["test/unit/_spec.js","test/unit/**/*_spec.js"]}, | ||||
|             nodes: { src: ["test/nodes/**/*_spec.js"]} | ||||
|         }, | ||||
|         jshint: { | ||||
| @@ -77,22 +84,20 @@ module.exports = function(grunt) { | ||||
|                 //"loopfunc": true, // allow functions to be defined in loops | ||||
|                 //"sub": true       // don't warn that foo['bar'] should be written as foo.bar | ||||
|             }, | ||||
|             all: [ | ||||
|                 'Gruntfile.js', | ||||
|                 'red.js', | ||||
|                 'red/**/*.js', | ||||
|                 'nodes/core/*/*.js', | ||||
|                 'editor/js/**/*.js' | ||||
|             ], | ||||
|             core: { | ||||
|                 files: { | ||||
|                     src: [ | ||||
|                         'Gruntfile.js', | ||||
|                         'red.js', | ||||
|                         'red/**/*.js' | ||||
|                     ] | ||||
|                 } | ||||
|             }, | ||||
|             // all: [ | ||||
|             //     'Gruntfile.js', | ||||
|             //     'red.js', | ||||
|             //     'packages/**/*.js' | ||||
|             // ], | ||||
|             // core: { | ||||
|             //     files: { | ||||
|             //         src: [ | ||||
|             //             'Gruntfile.js', | ||||
|             //             'red.js', | ||||
|             //             'packages/**/*.js', | ||||
|             //         ] | ||||
|             //     } | ||||
|             // }, | ||||
|             nodes: { | ||||
|                 files: { | ||||
|                     src: [ 'nodes/core/*/*.js' ] | ||||
| @@ -100,7 +105,7 @@ module.exports = function(grunt) { | ||||
|             }, | ||||
|             editor: { | ||||
|                 files: { | ||||
|                     src: [ 'editor/js/**/*.js' ] | ||||
|                     src: [ 'packages/node_modules/@node-red/editor-client/src/js/**/*.js' ] | ||||
|                 } | ||||
|             }, | ||||
|             tests: { | ||||
| @@ -120,81 +125,95 @@ module.exports = function(grunt) { | ||||
|                 src: [ | ||||
|                     // Ensure editor source files are concatenated in | ||||
|                     // the right order | ||||
|                     "editor/js/red.js", | ||||
|                     "editor/js/events.js", | ||||
|                     "editor/js/i18n.js", | ||||
|                     "editor/js/settings.js", | ||||
|                     "editor/js/user.js", | ||||
|                     "editor/js/comms.js", | ||||
|                     "editor/js/text/bidi.js", | ||||
|                     "editor/js/text/format.js", | ||||
|                     "editor/js/ui/state.js", | ||||
|                     "editor/js/nodes.js", | ||||
|                     "editor/js/history.js", | ||||
|                     "editor/js/validators.js", | ||||
|                     "editor/js/ui/utils.js", | ||||
|                     "editor/js/ui/common/editableList.js", | ||||
|                     "editor/js/ui/common/checkboxSet.js", | ||||
|                     "editor/js/ui/common/menu.js", | ||||
|                     "editor/js/ui/common/panels.js", | ||||
|                     "editor/js/ui/common/popover.js", | ||||
|                     "editor/js/ui/common/searchBox.js", | ||||
|                     "editor/js/ui/common/tabs.js", | ||||
|                     "editor/js/ui/common/stack.js", | ||||
|                     "editor/js/ui/common/typedInput.js", | ||||
|                     "editor/js/ui/actions.js", | ||||
|                     "editor/js/ui/deploy.js", | ||||
|                     "editor/js/ui/diff.js", | ||||
|                     "editor/js/ui/keyboard.js", | ||||
|                     "editor/js/ui/workspaces.js", | ||||
|                     "editor/js/ui/view.js", | ||||
|                     "editor/js/ui/view-navigator.js", | ||||
|                     "editor/js/ui/sidebar.js", | ||||
|                     "editor/js/ui/palette.js", | ||||
|                     "editor/js/ui/tab-info.js", | ||||
|                     "editor/js/ui/tab-config.js", | ||||
|                     "editor/js/ui/tab-context.js", | ||||
|                     "editor/js/ui/palette-editor.js", | ||||
|                     "editor/js/ui/editor.js", | ||||
|                     "editor/js/ui/editors/*.js", | ||||
|                     "editor/js/ui/tray.js", | ||||
|                     "editor/js/ui/clipboard.js", | ||||
|                     "editor/js/ui/library.js", | ||||
|                     "editor/js/ui/notifications.js", | ||||
|                     "editor/js/ui/search.js", | ||||
|                     "editor/js/ui/typeSearch.js", | ||||
|                     "editor/js/ui/subflow.js", | ||||
|                     "editor/js/ui/userSettings.js", | ||||
|                     "editor/js/ui/projects/projects.js", | ||||
|                     "editor/js/ui/projects/projectSettings.js", | ||||
|                     "editor/js/ui/projects/projectUserSettings.js", | ||||
|                     "editor/js/ui/projects/tab-versionControl.js", | ||||
|                     "editor/js/ui/touch/radialMenu.js" | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/polyfills.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/events.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/user.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/comms.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/ui/state.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/history.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/validators.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/utils.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/panels.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/common/colorPicker.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/actions.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/diff.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/view.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/palette.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.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/editor.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/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/tray.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/library.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/search.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/group.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js", | ||||
|                     "packages/node_modules/@node-red/editor-client/src/js/ui/touch/radialMenu.js" | ||||
|                 ], | ||||
|                 dest: "public/red/red.js" | ||||
|                 dest: "packages/node_modules/@node-red/editor-client/public/red/red.js" | ||||
|             }, | ||||
|             vendor: { | ||||
|                 files: { | ||||
|                     "public/vendor/vendor.js": [ | ||||
|                         "editor/vendor/jquery/js/jquery-1.11.3.min.js", | ||||
|                         "editor/vendor/bootstrap/js/bootstrap.min.js", | ||||
|                         "editor/vendor/jquery/js/jquery-ui-1.10.3.custom.min.js", | ||||
|                         "editor/vendor/jquery/js/jquery.ui.touch-punch.min.js", | ||||
|                         "editor/vendor/marked/marked.min.js", | ||||
|                         "editor/vendor/d3/d3.v3.min.js", | ||||
|                         "editor/vendor/i18next/i18next.min.js" | ||||
|                     ], | ||||
|                     "public/vendor/vendor.css": [ | ||||
|                         // TODO: resolve relative resource paths in | ||||
|                         //       bootstrap/FA/jquery | ||||
|                     ], | ||||
|                     "public/vendor/jsonata/jsonata.min.js": [ | ||||
|                     "packages/node_modules/@node-red/editor-client/public/vendor/vendor.js": [ | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.5.1.min.js", | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-migrate-3.3.0.min.js", | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui.min.js", | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js", | ||||
|                         "node_modules/marked/marked.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/i18next/i18next.min.js", | ||||
|                         "node_modules/jsonata/jsonata-es5.min.js", | ||||
|                         "editor/vendor/jsonata/formatter.js" | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js", | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/ace/ace.js", | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/ace/ext-language_tools.js", | ||||
|                     ], | ||||
|                     "public/vendor/ace/worker-jsonata.js": [ | ||||
|                     // "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [ | ||||
|                     //     // TODO: resolve relative resource paths in | ||||
|                     //     //       bootstrap/FA/jquery | ||||
|                     // ], | ||||
|                     "packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [ | ||||
|                         "node_modules/jsonata/jsonata-es5.min.js", | ||||
|                         "editor/vendor/jsonata/worker-jsonata.js" | ||||
|                         "packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js" | ||||
|                     ] | ||||
|                 } | ||||
|             } | ||||
| @@ -202,63 +221,60 @@ module.exports = function(grunt) { | ||||
|         uglify: { | ||||
|             build: { | ||||
|                 files: { | ||||
|                     'public/red/red.min.js': 'public/red/red.js', | ||||
|                     'public/red/main.min.js': 'public/red/main.js', | ||||
|                     'public/vendor/ace/mode-jsonata.js': 'editor/vendor/jsonata/mode-jsonata.js', | ||||
|                     'public/vendor/ace/snippets/jsonata.js': 'editor/vendor/jsonata/snippets-jsonata.js' | ||||
|                     'packages/node_modules/@node-red/editor-client/public/red/red.min.js': 'packages/node_modules/@node-red/editor-client/public/red/red.js', | ||||
|                     'packages/node_modules/@node-red/editor-client/public/red/main.min.js': 'packages/node_modules/@node-red/editor-client/public/red/main.js', | ||||
|                     'packages/node_modules/@node-red/editor-client/public/vendor/ace/mode-jsonata.js': 'packages/node_modules/@node-red/editor-client/src/vendor/jsonata/mode-jsonata.js', | ||||
|                     'packages/node_modules/@node-red/editor-client/public/vendor/ace/snippets/jsonata.js': 'packages/node_modules/@node-red/editor-client/src/vendor/jsonata/snippets-jsonata.js' | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         sass: { | ||||
|             build: { | ||||
|                 options: { | ||||
|                     implementation: sass, | ||||
|                     outputStyle: 'compressed' | ||||
|                 }, | ||||
|                 files: [{ | ||||
|                     dest: 'public/red/style.min.css', | ||||
|                     src: 'editor/sass/style.scss' | ||||
|                 }, | ||||
|                 { | ||||
|                     dest: 'public/vendor/bootstrap/css/bootstrap.min.css', | ||||
|                     src: 'editor/vendor/bootstrap/css/bootstrap.css' | ||||
|                     dest: 'packages/node_modules/@node-red/editor-client/public/red/style.min.css', | ||||
|                     src: 'packages/node_modules/@node-red/editor-client/src/sass/style.scss' | ||||
|                 }] | ||||
|             } | ||||
|         }, | ||||
|         jsonlint: { | ||||
|             messages: { | ||||
|                 src: [ | ||||
|                     'nodes/core/locales/en-US/messages.json', | ||||
|                     'red/api/locales/en-US/editor.json', | ||||
|                     'red/runtime/locales/en-US/runtime.json' | ||||
|                     'packages/node_modules/@node-red/nodes/locales/**/*.json', | ||||
|                     'packages/node_modules/@node-red/editor-client/locales/**/*.json', | ||||
|                     'packages/node_modules/@node-red/runtime/locales/**/*.json' | ||||
|                 ] | ||||
|             }, | ||||
|             keymaps: { | ||||
|                 src: [ | ||||
|                     'editor/js/keymap.json' | ||||
|                     'packages/node_modules/@node-red/editor-client/src/js/keymap.json' | ||||
|                 ] | ||||
|             } | ||||
|         }, | ||||
|         attachCopyright: { | ||||
|             js: { | ||||
|                 src: [ | ||||
|                     'public/red/red.min.js', | ||||
|                     'public/red/main.min.js' | ||||
|                     'packages/node_modules/@node-red/editor-client/public/red/red.min.js', | ||||
|                     'packages/node_modules/@node-red/editor-client/public/red/main.min.js' | ||||
|                 ] | ||||
|             }, | ||||
|             css: { | ||||
|                 src: [ | ||||
|                     'public/red/style.min.css' | ||||
|                     'packages/node_modules/@node-red/editor-client/public/red/style.min.css' | ||||
|                 ] | ||||
|             } | ||||
|         }, | ||||
|         clean: { | ||||
|             build: { | ||||
|                 src: [ | ||||
|                     "public/red", | ||||
|                     "public/index.html", | ||||
|                     "public/favicon.ico", | ||||
|                     "public/icons", | ||||
|                     "public/vendor" | ||||
|                     "packages/node_modules/@node-red/editor-client/public/red", | ||||
|                     "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/icons", | ||||
|                     "packages/node_modules/@node-red/editor-client/public/vendor" | ||||
|                 ] | ||||
|             }, | ||||
|             release: { | ||||
| @@ -270,27 +286,27 @@ module.exports = function(grunt) { | ||||
|         watch: { | ||||
|             js: { | ||||
|                 files: [ | ||||
|                     'editor/js/**/*.js' | ||||
|                     'packages/node_modules/@node-red/editor-client/src/js/**/*.js' | ||||
|                 ], | ||||
|                 tasks: ['copy:build','concat','uglify','attachCopyright:js'] | ||||
|                 tasks: ['copy:build','concat',/*'uglify',*/ 'attachCopyright:js'] | ||||
|             }, | ||||
|             sass: { | ||||
|                 files: [ | ||||
|                     'editor/sass/**/*.scss' | ||||
|                     'packages/node_modules/@node-red/editor-client/src/sass/**/*.scss' | ||||
|                 ], | ||||
|                 tasks: ['sass','attachCopyright:css'] | ||||
|             }, | ||||
|             json: { | ||||
|                 files: [ | ||||
|                     'nodes/core/locales/en-US/messages.json', | ||||
|                     'red/api/locales/en-US/editor.json', | ||||
|                     'red/runtime/locales/en-US/runtime.json' | ||||
|                     'packages/node_modules/@node-red/nodes/locales/**/*.json', | ||||
|                     'packages/node_modules/@node-red/editor-client/locales/**/*.json', | ||||
|                     'packages/node_modules/@node-red/runtime/locales/**/*.json' | ||||
|                 ], | ||||
|                 tasks: ['jsonlint:messages'] | ||||
|             }, | ||||
|             keymaps: { | ||||
|                 files: [ | ||||
|                     'editor/js/keymap.json' | ||||
|                     'packages/node_modules/@node-red/editor-client/src/js/keymap.json' | ||||
|                 ], | ||||
|                 tasks: ['jsonlint:keymaps','copy:build'] | ||||
|             }, | ||||
| @@ -305,12 +321,13 @@ module.exports = function(grunt) { | ||||
|         nodemon: { | ||||
|             /* uses .nodemonignore */ | ||||
|             dev: { | ||||
|                 script: 'red.js', | ||||
|                 script: 'packages/node_modules/node-red/red.js', | ||||
|                 options: { | ||||
|                     args: nodemonArgs, | ||||
|                     ext: 'js,html,json', | ||||
|                     watch: [ | ||||
|                         'red','nodes' | ||||
|                         'packages/node_modules', | ||||
|                         '!packages/node_modules/@node-red/editor-client' | ||||
|                     ] | ||||
|                 } | ||||
|             } | ||||
| @@ -329,69 +346,56 @@ module.exports = function(grunt) { | ||||
|             build: { | ||||
|                 files:[ | ||||
|                     { | ||||
|                         src: 'editor/js/main.js', | ||||
|                         dest: 'public/red/main.js' | ||||
|                         src: 'packages/node_modules/@node-red/editor-client/src/js/main.js', | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/red/main.js' | ||||
|                     }, | ||||
|                     { | ||||
|                         src: 'editor/js/keymap.json', | ||||
|                         dest: 'public/red/keymap.json' | ||||
|                         src: 'packages/node_modules/@node-red/editor-client/src/js/keymap.json', | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/red/keymap.json' | ||||
|                     }, | ||||
|                     { | ||||
|                         cwd: 'editor/images', | ||||
|                         cwd: 'packages/node_modules/@node-red/editor-client/src/images', | ||||
|                         src: '**', | ||||
|                         expand: true, | ||||
|                         dest: 'public/red/images/' | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/red/images/' | ||||
|                     }, | ||||
|                     { | ||||
|                         cwd: 'editor/vendor', | ||||
|                         cwd: 'packages/node_modules/@node-red/editor-client/src/vendor', | ||||
|                         src: [ | ||||
|                             'ace/**', | ||||
|                             //'bootstrap/css/**', | ||||
|                             'bootstrap/img/**', | ||||
|                             'jquery/css/**', | ||||
|                             'jquery/css/base/**', | ||||
|                             'font-awesome/**' | ||||
|                         ], | ||||
|                         expand: true, | ||||
|                         dest: 'public/vendor/' | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/vendor/' | ||||
|                     }, | ||||
|                     { | ||||
|                         cwd: 'editor/icons', | ||||
|                         cwd: 'packages/node_modules/@node-red/editor-client/src/icons', | ||||
|                         src: '**', | ||||
|                         expand: true, | ||||
|                         dest: 'public/icons/' | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/icons/' | ||||
|                     }, | ||||
|                     { | ||||
|                         expand: true, | ||||
|                         src: ['editor/index.html','editor/favicon.ico'], | ||||
|                         dest: 'public/', | ||||
|                         src: ['packages/node_modules/@node-red/editor-client/src/index.html','packages/node_modules/@node-red/editor-client/src/favicon.ico'], | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/', | ||||
|                         flatten: true | ||||
|                     }, | ||||
|                     { | ||||
|                         src: 'CHANGELOG.md', | ||||
|                         dest: 'public/red/about' | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/red/about' | ||||
|                     }, | ||||
|                     { | ||||
|                         src: 'CHANGELOG.md', | ||||
|                         dest: 'packages/node_modules/node-red/' | ||||
|                     }, | ||||
|                     { | ||||
|                         cwd: 'packages/node_modules/@node-red/editor-client/src/ace/bin/', | ||||
|                         src: '**', | ||||
|                         expand: true, | ||||
|                         dest: 'packages/node_modules/@node-red/editor-client/public/vendor/ace/' | ||||
|                     } | ||||
|                 ] | ||||
|             }, | ||||
|             release: { | ||||
|                 files: [{ | ||||
|                     mode: true, | ||||
|                     expand: true, | ||||
|                     src: [ | ||||
|                         '*.md', | ||||
|                         'LICENSE', | ||||
|                         'package.json', | ||||
|                         'settings.js', | ||||
|                         'red.js', | ||||
|                         'lib/.gitignore', | ||||
|                         'nodes/*.demo', | ||||
|                         'nodes/core/**', | ||||
|                         'red/**', | ||||
|                         'public/**', | ||||
|                         'editor/templates/**', | ||||
|                         'bin/**' | ||||
|                     ], | ||||
|                     dest: path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>') | ||||
|                 }] | ||||
|             } | ||||
|         }, | ||||
|         chmod: { | ||||
| @@ -400,19 +404,92 @@ module.exports = function(grunt) { | ||||
|             }, | ||||
|             release: { | ||||
|                 src: [ | ||||
|                     path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>/nodes/core/hardware/nrgpio*'), | ||||
|                     path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>/red/runtime/storage/localfilesystem/projects/git/node-red-*sh') | ||||
|                     "packages/node_modules/@node-red/nodes/core/hardware/nrgpio", | ||||
|                     "packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/node-red-*sh" | ||||
|                 ] | ||||
|             } | ||||
|         }, | ||||
|         'npm-command': { | ||||
|             options: { | ||||
|                 cmd: "pack", | ||||
|                 cwd: "<%= paths.dist %>/modules" | ||||
|             }, | ||||
|             'node-red': { options: { args: [__dirname+'/packages/node_modules/node-red'] } }, | ||||
|             '@node-red/editor-api': { options: { args: [__dirname+'/packages/node_modules/@node-red/editor-api'] } }, | ||||
|             '@node-red/editor-client': { options: { args: [__dirname+'/packages/node_modules/@node-red/editor-client'] } }, | ||||
|             '@node-red/nodes': { options: { args: [__dirname+'/packages/node_modules/@node-red/nodes'] } }, | ||||
|             '@node-red/registry': { options: { args: [__dirname+'/packages/node_modules/@node-red/registry'] } }, | ||||
|             '@node-red/runtime': { options: { args: [__dirname+'/packages/node_modules/@node-red/runtime'] } }, | ||||
|             '@node-red/util': { options: { args: [__dirname+'/packages/node_modules/@node-red/util'] } } | ||||
|  | ||||
|  | ||||
|         }, | ||||
|         mkdir: { | ||||
|             release: { | ||||
|                 options: { | ||||
|                     create: ['<%= paths.dist %>/modules'] | ||||
|                 }, | ||||
|             }, | ||||
|         }, | ||||
|         compress: { | ||||
|             release: { | ||||
|                 options: { | ||||
|                     archive: '<%= paths.dist %>/node-red-<%= pkg.version %>.zip' | ||||
|                 }, | ||||
|                 expand: true, | ||||
|                 cwd: '<%= paths.dist %>/', | ||||
|                 src: ['node-red-<%= pkg.version %>/**'] | ||||
|                 cwd: 'packages/node_modules/', | ||||
|                 src: [ | ||||
|                     '**', | ||||
|                     '!@node-red/editor-client/src/**' | ||||
|                 ] | ||||
|             } | ||||
|         }, | ||||
|         jsdoc : { | ||||
|             modules: { | ||||
|                 src: [ | ||||
|                     'API.md', | ||||
|                     'packages/node_modules/node-red/lib/red.js', | ||||
|                     'packages/node_modules/@node-red/runtime/lib/index.js', | ||||
|                     'packages/node_modules/@node-red/runtime/lib/api/*.js', | ||||
|                     'packages/node_modules/@node-red/runtime/lib/events.js', | ||||
|                     'packages/node_modules/@node-red/util/**/*.js', | ||||
|                     'packages/node_modules/@node-red/editor-api/lib/index.js', | ||||
|                     'packages/node_modules/@node-red/editor-api/lib/auth/index.js' | ||||
|                 ], | ||||
|                 options: { | ||||
|                     destination: 'docs', | ||||
|                     configure: './jsdoc.json' | ||||
|                 } | ||||
|             }, | ||||
|             _editor: { | ||||
|                 src: [ | ||||
|                     'packages/node_modules/@node-red/editor-client/src/js' | ||||
|                     ], | ||||
|                 options: { | ||||
|                     destination: 'packages/node_modules/@node-red/editor-client/docs', | ||||
|                     configure: './jsdoc.json' | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|         }, | ||||
|         jsdoc2md: { | ||||
|             runtimeAPI: { | ||||
|                 options: { | ||||
|                     separators: true | ||||
|                 }, | ||||
|                 src: [ | ||||
|                     'packages/node_modules/@node-red/runtime/lib/index.js', | ||||
|                     'packages/node_modules/@node-red/runtime/lib/api/*.js', | ||||
|                     'packages/node_modules/@node-red/runtime/lib/events.js' | ||||
|                 ], | ||||
|                 dest: 'packages/node_modules/@node-red/runtime/docs/api.md' | ||||
|             }, | ||||
|             nodeREDUtil: { | ||||
|                 options: { | ||||
|                     separators: true | ||||
|                 }, | ||||
|                 src: 'packages/node_modules/@node-red/util/**/*.js', | ||||
|                 dest: 'packages/node_modules/@node-red/util/docs/api.md' | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| @@ -431,7 +508,13 @@ module.exports = function(grunt) { | ||||
|     grunt.loadNpmTasks('grunt-chmod'); | ||||
|     grunt.loadNpmTasks('grunt-jsonlint'); | ||||
|     grunt.loadNpmTasks('grunt-mocha-istanbul'); | ||||
|     grunt.loadNpmTasks('grunt-webdriver'); | ||||
|     if (fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { | ||||
|         grunt.loadNpmTasks('grunt-webdriver'); | ||||
|     } | ||||
|     grunt.loadNpmTasks('grunt-jsdoc'); | ||||
|     grunt.loadNpmTasks('grunt-jsdoc-to-markdown'); | ||||
|     grunt.loadNpmTasks('grunt-npm-command'); | ||||
|     grunt.loadNpmTasks('grunt-mkdir'); | ||||
|  | ||||
|     grunt.registerMultiTask('attachCopyright', function() { | ||||
|         var files = this.data.src; | ||||
| @@ -473,6 +556,38 @@ module.exports = function(grunt) { | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     grunt.registerTask('verifyPackageDependencies', function() { | ||||
|         var done = this.async(); | ||||
|         var verifyDependencies = require("./scripts/verify-package-dependencies.js"); | ||||
|         verifyDependencies().then(function(failures) { | ||||
|             if (failures.length > 0) { | ||||
|                 failures.forEach(f => grunt.log.error(f)); | ||||
|                 grunt.fail.fatal("Failed to verify package dependencies"); | ||||
|             } | ||||
|             done(); | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|     grunt.registerTask('verifyUiTestDependencies', function() { | ||||
|         if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { | ||||
|             grunt.fail.fatal('You need to install the UI test dependencies first.\nUse the script in "scripts/install-ui-test-dependencies.sh"'); | ||||
|             return false; | ||||
|         } | ||||
|     }); | ||||
|     grunt.registerTask('generatePublishScript', | ||||
|         'Generates a script to publish build output to npm', | ||||
|             function () { | ||||
|                 const done = this.async(); | ||||
|                 const generatePublishScript = require("./scripts/generate-publish-script.js"); | ||||
|                 generatePublishScript().then(function(output) { | ||||
|                     grunt.log.writeln(output); | ||||
|  | ||||
|                     const filePath = path.join(grunt.config.get('paths.dist'),"modules","publish.sh"); | ||||
|                     grunt.file.write(filePath,output); | ||||
|  | ||||
|                     done(); | ||||
|                 }); | ||||
|             }); | ||||
|     grunt.registerTask('setDevEnv', | ||||
|         'Sets NODE_ENV=development so non-minified assets are used', | ||||
|             function () { | ||||
| @@ -481,7 +596,7 @@ module.exports = function(grunt) { | ||||
|  | ||||
|     grunt.registerTask('default', | ||||
|         'Builds editor content then runs code style checks and unit tests on all components', | ||||
|         ['build','jshint:editor','mocha_istanbul:all']); | ||||
|         ['build','verifyPackageDependencies','jshint:editor','mocha_istanbul:all']); | ||||
|  | ||||
|     grunt.registerTask('test-core', | ||||
|         'Runs code style check and unit tests on core runtime code', | ||||
| @@ -491,9 +606,15 @@ module.exports = function(grunt) { | ||||
|         'Runs code style check on editor code', | ||||
|         ['jshint:editor']); | ||||
|  | ||||
|     grunt.registerTask('test-ui', | ||||
|         'Builds editor content then runs unit tests on editor ui', | ||||
|         ['build','jshint:editor','webdriver:all']); | ||||
|     if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { | ||||
|         grunt.registerTask('test-ui', | ||||
|             'Builds editor content then runs unit tests on editor ui', | ||||
|             ['verifyUiTestDependencies']); | ||||
|     } else { | ||||
|         grunt.registerTask('test-ui', | ||||
|             'Builds editor content then runs unit tests on editor ui', | ||||
|             ['verifyUiTestDependencies','build','jshint:editor','webdriver:all']); | ||||
|     } | ||||
|  | ||||
|     grunt.registerTask('test-nodes', | ||||
|         'Runs unit tests on core nodes', | ||||
| @@ -509,9 +630,18 @@ module.exports = function(grunt) { | ||||
|  | ||||
|     grunt.registerTask('release', | ||||
|         'Create distribution zip file', | ||||
|         ['build','clean:release','copy:release','chmod:release','compress:release']); | ||||
|         ['build','verifyPackageDependencies','clean:release','mkdir:release','chmod:release','compress:release','pack-modules','generatePublishScript']); | ||||
|  | ||||
|     grunt.registerTask('pack-modules', | ||||
|         'Create module pack files for release', | ||||
|         ['mkdir:release','npm-command']); | ||||
|  | ||||
|  | ||||
|     grunt.registerTask('coverage', | ||||
|         'Run Istanbul code test coverage task', | ||||
|         ['build','mocha_istanbul:all']); | ||||
|  | ||||
|     grunt.registerTask('docs', | ||||
|         'Generates API documentation', | ||||
|         ['jsdoc']); | ||||
| }; | ||||
|   | ||||
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -5,9 +5,9 @@ http://nodered.org | ||||
| [](https://travis-ci.org/node-red/node-red) | ||||
| [](https://coveralls.io/r/node-red/node-red?branch=master) | ||||
|  | ||||
| A visual tool for wiring the Internet of Things. | ||||
| Low-code programming for event-driven applications. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Quick Start | ||||
|  | ||||
| @@ -44,9 +44,6 @@ If you want to run the latest code from git, here's how to get started: | ||||
| 4. Run | ||||
|  | ||||
|         npm start | ||||
|    or | ||||
|  | ||||
|         node red.js | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| @@ -59,7 +56,7 @@ This project adheres to the [Contributor Covenant 1.4](http://contributor-covena | ||||
|  | ||||
| ## Authors | ||||
|  | ||||
| Node-RED is a project of the [JS Foundation](http://js.foundation). | ||||
| Node-RED is a project of the [OpenJS Foundation](https://openjsf.org). | ||||
|  | ||||
| It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/). | ||||
|  | ||||
| @@ -70,4 +67,4 @@ It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-t | ||||
|  | ||||
| ## Copyright and license | ||||
|  | ||||
| Copyright JS Foundation and other contributors, http://js.foundation under [the Apache 2.0 license](LICENSE). | ||||
| Copyright JS Foundation and other contributors, https://openjsf.org under [the Apache 2.0 license](LICENSE). | ||||
|   | ||||
							
								
								
									
										13
									
								
								SECURITY.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,13 @@ | ||||
| # Security Policy | ||||
|  | ||||
| ## Supported Versions | ||||
|  | ||||
| | Version | Supported          | | ||||
| | ------- | ------------------ | | ||||
| | 1.0.0   | :white_check_mark: | | ||||
| | 0.20.x  | :white_check_mark: | | ||||
|  | ||||
|  | ||||
| ## Reporting a Vulnerability | ||||
|  | ||||
| Please report any potential security issues to `team@nodered.org`. This will notify the core project team who will respond accordingly. | ||||
| Before Width: | Height: | Size: 308 B | 
| Before Width: | Height: | Size: 712 B | 
| Before Width: | Height: | Size: 508 B | 
| Before Width: | Height: | Size: 575 B | 
| Before Width: | Height: | Size: 493 B | 
| Before Width: | Height: | Size: 601 B | 
| Before Width: | Height: | Size: 459 B | 
| Before Width: | Height: | Size: 218 B | 
| Before Width: | Height: | Size: 324 B | 
| Before Width: | Height: | Size: 378 B | 
| Before Width: | Height: | Size: 542 B | 
| Before Width: | Height: | Size: 503 B | 
| Before Width: | Height: | Size: 255 B | 
| Before Width: | Height: | Size: 457 B | 
| Before Width: | Height: | Size: 502 B | 
| Before Width: | Height: | Size: 449 B | 
| Before Width: | Height: | Size: 253 B | 
| Before Width: | Height: | Size: 639 B | 
| Before Width: | Height: | Size: 402 B | 
| Before Width: | Height: | Size: 386 B | 
| Before Width: | Height: | Size: 386 B | 
| Before Width: | Height: | Size: 413 B | 
| Before Width: | Height: | Size: 393 B | 
| Before Width: | Height: | Size: 467 B | 
| Before Width: | Height: | Size: 393 B | 
| Before Width: | Height: | Size: 423 B | 
| Before Width: | Height: | Size: 360 B | 
| Before Width: | Height: | Size: 482 B | 
| Before Width: | Height: | Size: 273 B | 
| Before Width: | Height: | Size: 793 B | 
| Before Width: | Height: | Size: 256 B | 
| Before Width: | Height: | Size: 439 B | 
| Before Width: | Height: | Size: 592 B | 
| Before Width: | Height: | Size: 509 B | 
| Before Width: | Height: | Size: 488 B | 
| Before Width: | Height: | Size: 628 B | 
| Before Width: | Height: | Size: 258 B | 
| Before Width: | Height: | Size: 404 B | 
| Before Width: | Height: | Size: 591 B | 
| Before Width: | Height: | Size: 707 B | 
| Before Width: | Height: | Size: 291 B | 
| Before Width: | Height: | Size: 386 B | 
| Before Width: | Height: | Size: 289 B | 
| Before Width: | Height: | Size: 368 B | 
| Before Width: | Height: | Size: 290 B | 
| Before Width: | Height: | Size: 392 B | 
| Before Width: | Height: | Size: 1019 B | 
| Before Width: | Height: | Size: 600 B | 
| Before Width: | Height: | Size: 410 B | 
| Before Width: | Height: | Size: 638 B | 
| Before Width: | Height: | Size: 546 B | 
| Before Width: | Height: | Size: 638 B | 
| Before Width: | Height: | Size: 646 B | 
| Before Width: | Height: | Size: 809 B | 
| Before Width: | Height: | Size: 563 B | 
| Before Width: | Height: | Size: 588 B | 
| Before Width: | Height: | Size: 502 B | 
| @@ -1,332 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.history = (function() { | ||||
|     var undo_history = []; | ||||
|  | ||||
|     function undoEvent(ev) { | ||||
|         var i; | ||||
|         var len; | ||||
|         var node; | ||||
|         var subflow; | ||||
|         var modifiedTabs = {}; | ||||
|         if (ev) { | ||||
|             if (ev.t == 'multi') { | ||||
|                 len = ev.events.length; | ||||
|                 for (i=len-1;i>=0;i--) { | ||||
|                     undoEvent(ev.events[i]); | ||||
|                 } | ||||
|             } else if (ev.t == 'replace') { | ||||
|                 RED.nodes.clear(); | ||||
|                 var imported = RED.nodes.import(ev.config); | ||||
|                 imported[0].forEach(function(n) { | ||||
|                     if (ev.changed[n.id]) { | ||||
|                         n.changed = true; | ||||
|                     } | ||||
|                 }) | ||||
|  | ||||
|                 RED.nodes.version(ev.rev); | ||||
|             } else if (ev.t == 'add') { | ||||
|                 if (ev.nodes) { | ||||
|                     for (i=0;i<ev.nodes.length;i++) { | ||||
|                         node = RED.nodes.node(ev.nodes[i]); | ||||
|                         if (node.z) { | ||||
|                             modifiedTabs[node.z] = true; | ||||
|                         } | ||||
|                         RED.nodes.remove(ev.nodes[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.links) { | ||||
|                     for (i=0;i<ev.links.length;i++) { | ||||
|                         RED.nodes.removeLink(ev.links[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.workspaces) { | ||||
|                     for (i=0;i<ev.workspaces.length;i++) { | ||||
|                         RED.nodes.removeWorkspace(ev.workspaces[i].id); | ||||
|                         RED.workspaces.remove(ev.workspaces[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.subflows) { | ||||
|                     for (i=0;i<ev.subflows.length;i++) { | ||||
|                         RED.nodes.removeSubflow(ev.subflows[i]); | ||||
|                         RED.workspaces.remove(ev.subflows[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.subflow) { | ||||
|                     if (ev.subflow.instances) { | ||||
|                         ev.subflow.instances.forEach(function(n) { | ||||
|                             var node = RED.nodes.node(n.id); | ||||
|                             if (node) { | ||||
|                                 node.changed = n.changed; | ||||
|                                 node.dirty = true; | ||||
|                             } | ||||
|                         }); | ||||
|                     } | ||||
|                     if (ev.subflow.hasOwnProperty('changed')) { | ||||
|                         subflow = RED.nodes.subflow(ev.subflow.id); | ||||
|                         if (subflow) { | ||||
|                             subflow.changed = ev.subflow.changed; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.removedLinks) { | ||||
|                     for (i=0;i<ev.removedLinks.length;i++) { | ||||
|                         RED.nodes.addLink(ev.removedLinks[i]); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|             } else if (ev.t == "delete") { | ||||
|                 if (ev.workspaces) { | ||||
|                     for (i=0;i<ev.workspaces.length;i++) { | ||||
|                         RED.nodes.addWorkspace(ev.workspaces[i]); | ||||
|                         RED.workspaces.add(ev.workspaces[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.subflow && ev.subflow.subflow) { | ||||
|                     RED.nodes.addSubflow(ev.subflow.subflow); | ||||
|                 } | ||||
|                 if (ev.subflowInputs && ev.subflowInputs.length > 0) { | ||||
|                     subflow = RED.nodes.subflow(ev.subflowInputs[0].z); | ||||
|                     subflow.in.push(ev.subflowInputs[0]); | ||||
|                     subflow.in[0].dirty = true; | ||||
|                 } | ||||
|                 if (ev.subflowOutputs && ev.subflowOutputs.length > 0) { | ||||
|                     subflow = RED.nodes.subflow(ev.subflowOutputs[0].z); | ||||
|                     ev.subflowOutputs.sort(function(a,b) { return a.i-b.i}); | ||||
|                     for (i=0;i<ev.subflowOutputs.length;i++) { | ||||
|                         var output = ev.subflowOutputs[i]; | ||||
|                         subflow.out.splice(output.i,0,output); | ||||
|                         for (var j=output.i+1;j<subflow.out.length;j++) { | ||||
|                             subflow.out[j].i++; | ||||
|                             subflow.out[j].dirty = true; | ||||
|                         } | ||||
|                         RED.nodes.eachLink(function(l) { | ||||
|                             if (l.source.type == "subflow:"+subflow.id) { | ||||
|                                 if (l.sourcePort >= output.i) { | ||||
|                                     l.sourcePort++; | ||||
|                                 } | ||||
|                             } | ||||
|                         }); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.subflow && ev.subflow.hasOwnProperty('instances')) { | ||||
|                     ev.subflow.instances.forEach(function(n) { | ||||
|                         var node = RED.nodes.node(n.id); | ||||
|                         if (node) { | ||||
|                             node.changed = n.changed; | ||||
|                             node.dirty = true; | ||||
|                         } | ||||
|                     }); | ||||
|                 } | ||||
|                 if (subflow) { | ||||
|                     RED.nodes.filterNodes({type:"subflow:"+subflow.id}).forEach(function(n) { | ||||
|                         n.inputs = subflow.in.length; | ||||
|                         n.outputs = subflow.out.length; | ||||
|                         while (n.outputs > n.ports.length) { | ||||
|                             n.ports.push(n.ports.length); | ||||
|                         } | ||||
|                         n.resize = true; | ||||
|                         n.dirty = true; | ||||
|                     }); | ||||
|                 } | ||||
|                 if (ev.nodes) { | ||||
|                     for (i=0;i<ev.nodes.length;i++) { | ||||
|                         RED.nodes.add(ev.nodes[i]); | ||||
|                         modifiedTabs[ev.nodes[i].z] = true; | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.links) { | ||||
|                     for (i=0;i<ev.links.length;i++) { | ||||
|                         RED.nodes.addLink(ev.links[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.changes) { | ||||
|                     for (i in ev.changes) { | ||||
|                         if (ev.changes.hasOwnProperty(i)) { | ||||
|                             node = RED.nodes.node(i); | ||||
|                             if (node) { | ||||
|                                 for (var d in ev.changes[i]) { | ||||
|                                     if (ev.changes[i].hasOwnProperty(d)) { | ||||
|                                         node[d] = ev.changes[i][d]; | ||||
|                                     } | ||||
|                                 } | ||||
|                                 node.dirty = true; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                 } | ||||
|             } else if (ev.t == "move") { | ||||
|                 for (i=0;i<ev.nodes.length;i++) { | ||||
|                     var n = ev.nodes[i]; | ||||
|                     n.n.x = n.ox; | ||||
|                     n.n.y = n.oy; | ||||
|                     n.n.dirty = true; | ||||
|                     n.n.moved = n.moved; | ||||
|                 } | ||||
|                 // A move could have caused a link splice | ||||
|                 if (ev.links) { | ||||
|                     for (i=0;i<ev.links.length;i++) { | ||||
|                         RED.nodes.removeLink(ev.links[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.removedLinks) { | ||||
|                     for (i=0;i<ev.removedLinks.length;i++) { | ||||
|                         RED.nodes.addLink(ev.removedLinks[i]); | ||||
|                     } | ||||
|                 } | ||||
|             } else if (ev.t == "edit") { | ||||
|                 for (i in ev.changes) { | ||||
|                     if (ev.changes.hasOwnProperty(i)) { | ||||
|                         if (ev.node._def.defaults && ev.node._def.defaults[i] && ev.node._def.defaults[i].type) { | ||||
|                             // This is a config node property | ||||
|                             var currentConfigNode = RED.nodes.node(ev.node[i]); | ||||
|                             if (currentConfigNode) { | ||||
|                                 currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1); | ||||
|                             } | ||||
|                             var newConfigNode = RED.nodes.node(ev.changes[i]); | ||||
|                             if (newConfigNode) { | ||||
|                                 newConfigNode.users.push(ev.node); | ||||
|                             } | ||||
|                         } | ||||
|                         ev.node[i] = ev.changes[i]; | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.subflow) { | ||||
|                     if (ev.subflow.hasOwnProperty('inputCount')) { | ||||
|                         if (ev.node.in.length > ev.subflow.inputCount) { | ||||
|                             ev.node.in.splice(ev.subflow.inputCount); | ||||
|                         } else if (ev.subflow.inputs.length > 0) { | ||||
|                             ev.node.in = ev.node.in.concat(ev.subflow.inputs); | ||||
|                         } | ||||
|                     } | ||||
|                     if (ev.subflow.hasOwnProperty('outputCount')) { | ||||
|                         if (ev.node.out.length > ev.subflow.outputCount) { | ||||
|                             ev.node.out.splice(ev.subflow.outputCount); | ||||
|                         } else if (ev.subflow.outputs.length > 0) { | ||||
|                             ev.node.out = ev.node.out.concat(ev.subflow.outputs); | ||||
|                         } | ||||
|                     } | ||||
|                     if (ev.subflow.hasOwnProperty('instances')) { | ||||
|                         ev.subflow.instances.forEach(function(n) { | ||||
|                             var node = RED.nodes.node(n.id); | ||||
|                             if (node) { | ||||
|                                 node.changed = n.changed; | ||||
|                                 node.dirty = true; | ||||
|                             } | ||||
|                         }); | ||||
|                     } | ||||
|                     RED.editor.validateNode(ev.node); | ||||
|                     RED.nodes.filterNodes({type:"subflow:"+ev.node.id}).forEach(function(n) { | ||||
|                         n.inputs = ev.node.in.length; | ||||
|                         n.outputs = ev.node.out.length; | ||||
|                         RED.editor.updateNodeProperties(n); | ||||
|                         RED.editor.validateNode(n); | ||||
|                     }); | ||||
|                 } else { | ||||
|                     var outputMap; | ||||
|                     if (ev.outputMap) { | ||||
|                         outputMap = {}; | ||||
|                         for (var port in ev.outputMap) { | ||||
|                             if (ev.outputMap.hasOwnProperty(port) && ev.outputMap[port] !== "-1") { | ||||
|                                 outputMap[ev.outputMap[port]] = port; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     RED.editor.updateNodeProperties(ev.node,outputMap); | ||||
|                     RED.editor.validateNode(ev.node); | ||||
|                 } | ||||
|                 if (ev.links) { | ||||
|                     for (i=0;i<ev.links.length;i++) { | ||||
|                         RED.nodes.addLink(ev.links[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 ev.node.dirty = true; | ||||
|                 ev.node.changed = ev.changed; | ||||
|             } else if (ev.t == "createSubflow") { | ||||
|                 if (ev.nodes) { | ||||
|                     RED.nodes.filterNodes({z:ev.subflow.subflow.id}).forEach(function(n) { | ||||
|                         n.z = ev.activeWorkspace; | ||||
|                         n.dirty = true; | ||||
|                     }); | ||||
|                     for (i=0;i<ev.nodes.length;i++) { | ||||
|                         RED.nodes.remove(ev.nodes[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ev.links) { | ||||
|                     for (i=0;i<ev.links.length;i++) { | ||||
|                         RED.nodes.removeLink(ev.links[i]); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 RED.nodes.removeSubflow(ev.subflow.subflow); | ||||
|                 RED.workspaces.remove(ev.subflow.subflow); | ||||
|  | ||||
|                 if (ev.removedLinks) { | ||||
|                     for (i=0;i<ev.removedLinks.length;i++) { | ||||
|                         RED.nodes.addLink(ev.removedLinks[i]); | ||||
|                     } | ||||
|                 } | ||||
|             } else if (ev.t == "reorder") { | ||||
|                 if (ev.order) { | ||||
|                     RED.workspaces.order(ev.order); | ||||
|                 } | ||||
|             } | ||||
|             Object.keys(modifiedTabs).forEach(function(id) { | ||||
|                 var subflow = RED.nodes.subflow(id); | ||||
|                 if (subflow) { | ||||
|                     RED.editor.validateNode(subflow); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             RED.nodes.dirty(ev.dirty); | ||||
|             RED.view.redraw(true); | ||||
|             RED.palette.refresh(); | ||||
|             RED.workspaces.refresh(); | ||||
|             RED.sidebar.config.refresh(); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         //TODO: this function is a placeholder until there is a 'save' event that can be listened to | ||||
|         markAllDirty: function() { | ||||
|             for (var i=0;i<undo_history.length;i++) { | ||||
|                 undo_history[i].dirty = true; | ||||
|             } | ||||
|         }, | ||||
|         list: function() { | ||||
|             return undo_history | ||||
|         }, | ||||
|         depth: function() { | ||||
|             return undo_history.length; | ||||
|         }, | ||||
|         push: function(ev) { | ||||
|             undo_history.push(ev); | ||||
|         }, | ||||
|         pop: function() { | ||||
|             var ev = undo_history.pop(); | ||||
|             undoEvent(ev); | ||||
|         }, | ||||
|         peek: function() { | ||||
|             return undo_history[undo_history.length-1]; | ||||
|         }, | ||||
|         clear: function() { | ||||
|             undo_history = []; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| })(); | ||||
| @@ -1,379 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| RED.clipboard = (function() { | ||||
|  | ||||
|     var dialog; | ||||
|     var dialogContainer; | ||||
|     var exportNodesDialog; | ||||
|     var importNodesDialog; | ||||
|     var disabled = false; | ||||
|  | ||||
|     function setupDialogs() { | ||||
|         dialog = $('<div id="clipboard-dialog" class="hide node-red-dialog"><form class="dialog-form form-horizontal"></form></div>') | ||||
|             .appendTo("body") | ||||
|             .dialog({ | ||||
|                 modal: true, | ||||
|                 autoOpen: false, | ||||
|                 width: 500, | ||||
|                 resizable: false, | ||||
|                 buttons: [ | ||||
|                     { | ||||
|                         id: "clipboard-dialog-cancel", | ||||
|                         text: RED._("common.label.cancel"), | ||||
|                         click: function() { | ||||
|                             $( this ).dialog( "close" ); | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         id: "clipboard-dialog-close", | ||||
|                         class: "primary", | ||||
|                         text: RED._("common.label.close"), | ||||
|                         click: function() { | ||||
|                             $( this ).dialog( "close" ); | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         id: "clipboard-dialog-copy", | ||||
|                         class: "primary", | ||||
|                         text: RED._("clipboard.export.copy"), | ||||
|                         click: function() { | ||||
|                             $("#clipboard-export").select(); | ||||
|                             document.execCommand("copy"); | ||||
|                             document.getSelection().removeAllRanges(); | ||||
|                             RED.notify(RED._("clipboard.nodesExported")); | ||||
|                             $( this ).dialog( "close" ); | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         id: "clipboard-dialog-ok", | ||||
|                         class: "primary", | ||||
|                         text: RED._("common.label.import"), | ||||
|                         click: function() { | ||||
|                             RED.view.importNodes($("#clipboard-import").val(),$("#import-tab > a.selected").attr('id') === 'import-tab-new'); | ||||
|                             $( this ).dialog( "close" ); | ||||
|                         } | ||||
|                     } | ||||
|                 ], | ||||
|                 open: function(e) { | ||||
|                     $(this).parent().find(".ui-dialog-titlebar-close").hide(); | ||||
|                 }, | ||||
|                 close: function(e) { | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|         dialogContainer = dialog.children(".dialog-form"); | ||||
|  | ||||
|         exportNodesDialog = | ||||
|             '<div class="form-row">'+ | ||||
|                 '<label style="width:auto;margin-right: 10px;" data-i18n="clipboard.export.copy"></label>'+ | ||||
|                 '<span id="export-range-group" class="button-group">'+ | ||||
|                     '<a id="export-range-selected" class="editor-button toggle" href="#" data-i18n="clipboard.export.selected"></a>'+ | ||||
|                     '<a id="export-range-flow" class="editor-button toggle" href="#" data-i18n="clipboard.export.current"></a>'+ | ||||
|                     '<a id="export-range-full" class="editor-button toggle" href="#" data-i18n="clipboard.export.all"></a>'+ | ||||
|                 '</span>'+ | ||||
|                 '</div>'+ | ||||
|             '<div class="form-row">'+ | ||||
|                 '<textarea readonly style="resize: none; width: 100%; border-radius: 4px;font-family: monospace; font-size: 12px; background:#f3f3f3; padding-left: 0.5em; box-sizing:border-box;" id="clipboard-export" rows="5"></textarea>'+ | ||||
|             '</div>'+ | ||||
|             '<div class="form-row" style="text-align: right;">'+ | ||||
|                 '<span id="export-format-group" class="button-group">'+ | ||||
|                     '<a id="export-format-mini" class="editor-button editor-button-small toggle" href="#" data-i18n="clipboard.export.compact"></a>'+ | ||||
|                     '<a id="export-format-full" class="editor-button editor-button-small toggle" href="#" data-i18n="clipboard.export.formatted"></a>'+ | ||||
|                 '</span>'+ | ||||
|             '</div>'; | ||||
|  | ||||
|         importNodesDialog = '<div class="form-row">'+ | ||||
|             '<textarea style="resize: none; width: 100%; border-radius: 0px;font-family: monospace; font-size: 12px; background:#eee; padding-left: 0.5em; box-sizing:border-box;" id="clipboard-import" rows="5" placeholder="'+ | ||||
|             RED._("clipboard.pasteNodes")+ | ||||
|             '"></textarea>'+ | ||||
|             '</div>'+ | ||||
|             '<div class="form-row">'+ | ||||
|             '<label style="width:auto;margin-right: 10px;" data-i18n="clipboard.import.import"></label>'+ | ||||
|             '<span id="import-tab" class="button-group">'+ | ||||
|                 '<a id="import-tab-current" class="editor-button toggle selected" href="#" data-i18n="clipboard.export.current"></a>'+ | ||||
|                 '<a id="import-tab-new" class="editor-button toggle" href="#" data-i18n="clipboard.import.newFlow"></a>'+ | ||||
|             '</span>'+ | ||||
|             '</div>'; | ||||
|     } | ||||
|  | ||||
|     function validateImport() { | ||||
|         var importInput = $("#clipboard-import"); | ||||
|         var v = importInput.val(); | ||||
|         v = v.substring(v.indexOf('['),v.lastIndexOf(']')+1); | ||||
|         try { | ||||
|             JSON.parse(v); | ||||
|             importInput.removeClass("input-error"); | ||||
|             importInput.val(v); | ||||
|             $("#clipboard-dialog-ok").button("enable"); | ||||
|         } catch(err) { | ||||
|             if (v !== "") { | ||||
|                 importInput.addClass("input-error"); | ||||
|             } | ||||
|             $("#clipboard-dialog-ok").button("disable"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function importNodes() { | ||||
|         if (disabled) { | ||||
|             return; | ||||
|         } | ||||
|         dialogContainer.empty(); | ||||
|         dialogContainer.append($(importNodesDialog)); | ||||
|         dialogContainer.i18n(); | ||||
|  | ||||
|         $("#clipboard-dialog-ok").show(); | ||||
|         $("#clipboard-dialog-cancel").show(); | ||||
|         $("#clipboard-dialog-close").hide(); | ||||
|         $("#clipboard-dialog-copy").hide(); | ||||
|         $("#clipboard-dialog-ok").button("disable"); | ||||
|         $("#clipboard-import").keyup(validateImport); | ||||
|         $("#clipboard-import").on('paste',function() { setTimeout(validateImport,10)}); | ||||
|  | ||||
|         $("#import-tab > a").click(function(evt) { | ||||
|             evt.preventDefault(); | ||||
|             if ($(this).hasClass('disabled') || $(this).hasClass('selected')) { | ||||
|                 return; | ||||
|             } | ||||
|             $(this).parent().children().removeClass('selected'); | ||||
|             $(this).addClass('selected'); | ||||
|         }); | ||||
|  | ||||
|         dialog.dialog("option","title",RED._("clipboard.importNodes")).dialog("open"); | ||||
|     } | ||||
|  | ||||
|     function exportNodes() { | ||||
|         if (disabled) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         dialogContainer.empty(); | ||||
|         dialogContainer.append($(exportNodesDialog)); | ||||
|         dialogContainer.i18n(); | ||||
|         var format = RED.settings.flowFilePretty ? "export-format-full" : "export-format-mini"; | ||||
|  | ||||
|         $("#export-format-group > a").click(function(evt) { | ||||
|             evt.preventDefault(); | ||||
|             if ($(this).hasClass('disabled') || $(this).hasClass('selected')) { | ||||
|                 $("#clipboard-export").focus(); | ||||
|                 return; | ||||
|             } | ||||
|             $(this).parent().children().removeClass('selected'); | ||||
|             $(this).addClass('selected'); | ||||
|  | ||||
|             var flow = $("#clipboard-export").val(); | ||||
|             if (flow.length > 0) { | ||||
|                 var nodes = JSON.parse(flow); | ||||
|  | ||||
|                 format = $(this).attr('id'); | ||||
|                 if (format === 'export-format-full') { | ||||
|                     flow = JSON.stringify(nodes,null,4); | ||||
|                 } else { | ||||
|                     flow = JSON.stringify(nodes); | ||||
|                 } | ||||
|                 $("#clipboard-export").val(flow); | ||||
|                 $("#clipboard-export").focus(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         $("#export-range-group > a").click(function(evt) { | ||||
|             evt.preventDefault(); | ||||
|             if ($(this).hasClass('disabled') || $(this).hasClass('selected')) { | ||||
|                 $("#clipboard-export").focus(); | ||||
|                 return; | ||||
|             } | ||||
|             $(this).parent().children().removeClass('selected'); | ||||
|             $(this).addClass('selected'); | ||||
|             var type = $(this).attr('id'); | ||||
|             var flow = ""; | ||||
|             var nodes = null; | ||||
|             if (type === 'export-range-selected') { | ||||
|                 var selection = RED.view.selection(); | ||||
|                 // Don't include the subflow meta-port nodes in the exported selection | ||||
|                 nodes = RED.nodes.createExportableNodeSet(selection.nodes.filter(function(n) { return n.type !== 'subflow'})); | ||||
|             } else if (type === 'export-range-flow') { | ||||
|                 var activeWorkspace = RED.workspaces.active(); | ||||
|                 nodes = RED.nodes.filterNodes({z:activeWorkspace}); | ||||
|                 var parentNode = RED.nodes.workspace(activeWorkspace)||RED.nodes.subflow(activeWorkspace); | ||||
|                 nodes.unshift(parentNode); | ||||
|                 nodes = RED.nodes.createExportableNodeSet(nodes); | ||||
|             } else if (type === 'export-range-full') { | ||||
|                 nodes = RED.nodes.createCompleteNodeSet(false); | ||||
|             } | ||||
|             if (nodes !== null) { | ||||
|                 if (format === "export-format-full") { | ||||
|                     flow = JSON.stringify(nodes,null,4); | ||||
|                 } else { | ||||
|                     flow = JSON.stringify(nodes); | ||||
|                 } | ||||
|             } | ||||
|             if (flow.length > 0) { | ||||
|                 $("#export-copy").removeClass('disabled'); | ||||
|             } else { | ||||
|                 $("#export-copy").addClass('disabled'); | ||||
|             } | ||||
|             $("#clipboard-export").val(flow); | ||||
|             $("#clipboard-export").focus(); | ||||
|         }) | ||||
|  | ||||
|         $("#clipboard-dialog-ok").hide(); | ||||
|         $("#clipboard-dialog-cancel").hide(); | ||||
|         $("#clipboard-dialog-copy").hide(); | ||||
|         $("#clipboard-dialog-close").hide(); | ||||
|         var selection = RED.view.selection(); | ||||
|         if (selection.nodes) { | ||||
|             $("#export-range-selected").click(); | ||||
|         } else { | ||||
|             $("#export-range-selected").addClass('disabled').removeClass('selected'); | ||||
|             $("#export-range-flow").click(); | ||||
|         } | ||||
|         if (format === "export-format-full") { | ||||
|             $("#export-format-full").click(); | ||||
|         } else { | ||||
|             $("#export-format-mini").click(); | ||||
|         } | ||||
|         $("#clipboard-export") | ||||
|             .focus(function() { | ||||
|                 var textarea = $(this); | ||||
|                 textarea.select(); | ||||
|                 textarea.mouseup(function() { | ||||
|                     textarea.unbind("mouseup"); | ||||
|                     return false; | ||||
|                 }) | ||||
|             }); | ||||
|         dialog.dialog("option","title",RED._("clipboard.exportNodes")).dialog( "open" ); | ||||
|  | ||||
|         $("#clipboard-export").focus(); | ||||
|         if (!document.queryCommandSupported("copy")) { | ||||
|             $("#clipboard-dialog-cancel").hide(); | ||||
|             $("#clipboard-dialog-close").show(); | ||||
|         } else { | ||||
|             $("#clipboard-dialog-cancel").show(); | ||||
|             $("#clipboard-dialog-copy").show(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function hideDropTarget() { | ||||
|         $("#dropTarget").hide(); | ||||
|         RED.keyboard.remove("escape"); | ||||
|     } | ||||
|     function copyText(value,element,msg) { | ||||
|         var truncated = false; | ||||
|         if (typeof value !== "string" ) { | ||||
|             value = JSON.stringify(value, function(key,value) { | ||||
|                 if (value !== null && typeof value === 'object') { | ||||
|                     if (value.__enc__) { | ||||
|                         if (value.hasOwnProperty('data') && value.hasOwnProperty('length')) { | ||||
|                             truncated = value.data.length !== value.length; | ||||
|                             return value.data; | ||||
|                         } | ||||
|                         if (value.type === 'function' || value.type === 'internal') { | ||||
|                             return undefined | ||||
|                         } | ||||
|                         if (value.type === 'number') { | ||||
|                             // Handle NaN and Infinity - they are not permitted | ||||
|                             // in JSON. We can either substitute with a String | ||||
|                             // representation or null | ||||
|                             return null; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 return value; | ||||
|             }); | ||||
|         } | ||||
|         if (truncated) { | ||||
|             msg += "_truncated"; | ||||
|         } | ||||
|         $("#clipboard-hidden").val(value).select(); | ||||
|         var result =  document.execCommand("copy"); | ||||
|         if (result && element) { | ||||
|             var popover = RED.popover.create({ | ||||
|                 target: element, | ||||
|                 direction: 'left', | ||||
|                 size: 'small', | ||||
|                 content: RED._(msg) | ||||
|             }); | ||||
|             setTimeout(function() { | ||||
|                 popover.close(); | ||||
|             },1000); | ||||
|             popover.open(); | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|     return { | ||||
|         init: function() { | ||||
|             setupDialogs(); | ||||
|  | ||||
|             $('<input type="text" id="clipboard-hidden">').appendTo("body"); | ||||
|  | ||||
|             RED.actions.add("core:show-export-dialog",exportNodes); | ||||
|             RED.actions.add("core:show-import-dialog",importNodes); | ||||
|  | ||||
|  | ||||
|             RED.events.on("editor:open",function() { disabled = true; }); | ||||
|             RED.events.on("editor:close",function() { disabled = false; }); | ||||
|             RED.events.on("search:open",function() { disabled = true; }); | ||||
|             RED.events.on("search:close",function() { disabled = false; }); | ||||
|             RED.events.on("type-search:open",function() { disabled = true; }); | ||||
|             RED.events.on("type-search:close",function() { disabled = false; }); | ||||
|  | ||||
|  | ||||
|             $('#chart').on("dragenter",function(event) { | ||||
|                 if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 || | ||||
|                      $.inArray("Files",event.originalEvent.dataTransfer.types) != -1) { | ||||
|                     $("#dropTarget").css({display:'table'}); | ||||
|                     RED.keyboard.add("*", "escape" ,hideDropTarget); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             $('#dropTarget').on("dragover",function(event) { | ||||
|                 if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 || | ||||
|                      $.inArray("Files",event.originalEvent.dataTransfer.types) != -1) { | ||||
|                     event.preventDefault(); | ||||
|                 } | ||||
|             }) | ||||
|             .on("dragleave",function(event) { | ||||
|                 hideDropTarget(); | ||||
|             }) | ||||
|             .on("drop",function(event) { | ||||
|                 if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1) { | ||||
|                     var data = event.originalEvent.dataTransfer.getData("text/plain"); | ||||
|                     data = data.substring(data.indexOf('['),data.lastIndexOf(']')+1); | ||||
|                     RED.view.importNodes(data); | ||||
|                 } else if ($.inArray("Files",event.originalEvent.dataTransfer.types) != -1) { | ||||
|                     var files = event.originalEvent.dataTransfer.files; | ||||
|                     if (files.length === 1) { | ||||
|                         var file = files[0]; | ||||
|                         var reader = new FileReader(); | ||||
|                         reader.onload = (function(theFile) { | ||||
|                             return function(e) { | ||||
|                                 RED.view.importNodes(e.target.result); | ||||
|                             }; | ||||
|                         })(file); | ||||
|                         reader.readAsText(file); | ||||
|                     } | ||||
|                 } | ||||
|                 hideDropTarget(); | ||||
|                 event.preventDefault(); | ||||
|             }); | ||||
|  | ||||
|         }, | ||||
|         import: importNodes, | ||||
|         export: exportNodes, | ||||
|         copyText: copyText | ||||
|     } | ||||
| })(); | ||||
| @@ -1,81 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| RED.panels = (function() { | ||||
|  | ||||
|     function createPanel(options) { | ||||
|         var container = options.container || $("#"+options.id); | ||||
|         var children = container.children(); | ||||
|         if (children.length !== 2) { | ||||
|             throw new Error("Container must have exactly two children"); | ||||
|         } | ||||
|  | ||||
|         container.addClass("red-ui-panels"); | ||||
|         var separator = $('<div class="red-ui-panels-separator"></div>').insertAfter(children[0]); | ||||
|         var startPosition; | ||||
|         var panelHeights = []; | ||||
|         var modifiedHeights = false; | ||||
|         var panelRatio; | ||||
|  | ||||
|         separator.draggable({ | ||||
|                 axis: "y", | ||||
|                 containment: container, | ||||
|                 scroll: false, | ||||
|                 start:function(event,ui) { | ||||
|                     var height = container.height(); | ||||
|                     startPosition = ui.position.top; | ||||
|                     panelHeights = [$(children[0]).height(),$(children[1]).height()]; | ||||
|                 }, | ||||
|                 drag: function(event,ui) { | ||||
|                     var height = container.height(); | ||||
|                     var delta = ui.position.top-startPosition; | ||||
|                     var newHeights = [panelHeights[0]+delta,panelHeights[1]-delta]; | ||||
|                     $(children[0]).height(newHeights[0]); | ||||
|                     $(children[1]).height(newHeights[1]); | ||||
|                     if (options.resize) { | ||||
|                         options.resize(newHeights[0],newHeights[1]); | ||||
|                     } | ||||
|                     ui.position.top -= delta; | ||||
|                     panelRatio = newHeights[0]/height; | ||||
|                 }, | ||||
|                 stop:function(event,ui) { | ||||
|                     modifiedHeights = true; | ||||
|                 } | ||||
|         }); | ||||
|  | ||||
|         return { | ||||
|             resize: function(height) { | ||||
|                 var panelHeights = [$(children[0]).height(),$(children[1]).height()]; | ||||
|                 container.height(height); | ||||
|                 if (modifiedHeights) { | ||||
|                     var topPanelHeight = panelRatio*height; | ||||
|                     var bottomPanelHeight = height - topPanelHeight - 48; | ||||
|                     panelHeights = [topPanelHeight,bottomPanelHeight]; | ||||
|                     $(children[0]).height(panelHeights[0]); | ||||
|                     $(children[1]).height(panelHeights[1]); | ||||
|                 } | ||||
|                 if (options.resize) { | ||||
|                     options.resize(panelHeights[0],panelHeights[1]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         create: createPanel | ||||
|     } | ||||
| })(); | ||||
| @@ -1,171 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| RED.popover = (function() { | ||||
|     var deltaSizes = { | ||||
|         "default": { | ||||
|             top: 10, | ||||
|             leftRight: 17, | ||||
|             leftLeft: 25, | ||||
|             leftBottom: 8, | ||||
|         }, | ||||
|         "small": { | ||||
|             top: 5, | ||||
|             leftRight: 17, | ||||
|             leftLeft: 16, | ||||
|             leftBottom: 3, | ||||
|         } | ||||
|     } | ||||
|     function createPopover(options) { | ||||
|         var target = options.target; | ||||
|         var direction = options.direction || "right"; | ||||
|         var trigger = options.trigger; | ||||
|         var content = options.content; | ||||
|         var delay = options.delay; | ||||
|         var autoClose = options.autoClose; | ||||
|         var width = options.width||"auto"; | ||||
|         var size = options.size||"default"; | ||||
|         if (!deltaSizes[size]) { | ||||
|             throw new Error("Invalid RED.popover size value:",size); | ||||
|         } | ||||
|  | ||||
|         var timer = null; | ||||
|         var active; | ||||
|         var div; | ||||
|  | ||||
|         var openPopup = function(instant) { | ||||
|             if (active) { | ||||
|                 div = $('<div class="red-ui-popover red-ui-popover-'+direction+'"></div>'); | ||||
|                 if (size !== "default") { | ||||
|                     div.addClass("red-ui-popover-size-"+size); | ||||
|                 } | ||||
|                 if (typeof content === 'function') { | ||||
|                     var result = content.call(res); | ||||
|                     if (result === null) { | ||||
|                         return; | ||||
|                     } | ||||
|                     if (typeof result === 'string') { | ||||
|                         div.text(result); | ||||
|                     } else { | ||||
|                         div.append(result); | ||||
|                     } | ||||
|                 } else { | ||||
|                     div.html(content); | ||||
|                 } | ||||
|                 if (width !== "auto") { | ||||
|                     div.width(width); | ||||
|                 } | ||||
|                 div.appendTo("body"); | ||||
|  | ||||
|                 var targetPos = target.offset(); | ||||
|                 var targetWidth = target.outerWidth(); | ||||
|                 var targetHeight = target.outerHeight(); | ||||
|                 var divHeight = div.height(); | ||||
|                 var divWidth = div.width(); | ||||
|                 if (direction === 'right') { | ||||
|                     div.css({top: targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top,left:targetPos.left+targetWidth+deltaSizes[size].leftRight}); | ||||
|                 } else if (direction === 'left') { | ||||
|                     div.css({top: targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top,left:targetPos.left-deltaSizes[size].leftLeft-divWidth}); | ||||
|                 } else if (direction === 'bottom') { | ||||
|                     div.css({top: targetPos.top+targetHeight+deltaSizes[size].top,left:targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftBottom}); | ||||
|                 } | ||||
|                 if (instant) { | ||||
|                     div.show(); | ||||
|                 } else { | ||||
|                     div.fadeIn("fast"); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         var closePopup = function(instant) { | ||||
|             if (!active) { | ||||
|                 if (div) { | ||||
|                     if (instant) { | ||||
|                         $(this).remove(); | ||||
|                     } else { | ||||
|                         div.fadeOut("fast",function() { | ||||
|                             $(this).remove(); | ||||
|                         }); | ||||
|                     } | ||||
|                     div = null; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (trigger === 'hover') { | ||||
|             target.on('mouseenter',function(e) { | ||||
|                 clearTimeout(timer); | ||||
|                 active = true; | ||||
|                 timer = setTimeout(openPopup,delay.show); | ||||
|             }); | ||||
|             target.on('mouseleave', function(e) { | ||||
|                 if (timer) { | ||||
|                     clearTimeout(timer); | ||||
|                 } | ||||
|                 active = false; | ||||
|                 setTimeout(closePopup,delay.hide); | ||||
|             }); | ||||
|         } else if (trigger === 'click') { | ||||
|             target.click(function(e) { | ||||
|                 e.preventDefault(); | ||||
|                 e.stopPropagation(); | ||||
|                 active = !active; | ||||
|                 if (!active) { | ||||
|                     closePopup(); | ||||
|                 } else { | ||||
|                     openPopup(); | ||||
|                 } | ||||
|             }); | ||||
|         } else if (autoClose) { | ||||
|             setTimeout(function() { | ||||
|                 active = false; | ||||
|                 closePopup(); | ||||
|             },autoClose); | ||||
|         } | ||||
|         var res = { | ||||
|             setContent: function(_content) { | ||||
|                 content = _content; | ||||
|                 return res; | ||||
|             }, | ||||
|             open: function (instant) { | ||||
|                 active = true; | ||||
|                 openPopup(instant); | ||||
|                 return res; | ||||
|             }, | ||||
|             close: function (instant) { | ||||
|                 active = false; | ||||
|                 closePopup(instant); | ||||
|                 return res; | ||||
|             } | ||||
|         } | ||||
|         return res; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         create: createPopover, | ||||
|         tooltip: function(target,content) { | ||||
|             RED.popover.create({ | ||||
|                 target:target, | ||||
|                 trigger: "hover", | ||||
|                 size: "small", | ||||
|                 direction: "bottom", | ||||
|                 content: content, | ||||
|                 delay: { show: 550, hide: 10 } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| })(); | ||||
| @@ -1,99 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| (function($) { | ||||
|  | ||||
|     $.widget( "nodered.searchBox", { | ||||
|         _create: function() { | ||||
|             var that = this; | ||||
|  | ||||
|             this.currentTimeout = null; | ||||
|             this.lastSent = ""; | ||||
|             this.element.val(""); | ||||
|             this.uiContainer = this.element.wrap("<div>").parent(); | ||||
|             this.uiContainer.addClass("red-ui-searchBox-container"); | ||||
|  | ||||
|             $('<i class="fa fa-search"></i>').prependTo(this.uiContainer); | ||||
|             this.clearButton = $('<a href="#"><i class="fa fa-times"></i></a>').appendTo(this.uiContainer); | ||||
|             this.clearButton.on("click",function(e) { | ||||
|                 e.preventDefault(); | ||||
|                 that.element.val(""); | ||||
|                 that._change("",true); | ||||
|                 that.element.focus(); | ||||
|             }); | ||||
|  | ||||
|             this.resultCount = $('<span>',{class:"red-ui-searchBox-resultCount hide"}).appendTo(this.uiContainer); | ||||
|  | ||||
|             this.element.val(""); | ||||
|             this.element.on("keydown",function(evt) { | ||||
|                 if (evt.keyCode === 27) { | ||||
|                     that.element.val(""); | ||||
|                 } | ||||
|             }) | ||||
|             this.element.on("keyup",function(evt) { | ||||
|                 that._change($(this).val()); | ||||
|             }); | ||||
|  | ||||
|             this.element.on("focus",function() { | ||||
|                 $("body").one("mousedown",function() { | ||||
|                     that.element.blur(); | ||||
|                 }); | ||||
|             }); | ||||
|  | ||||
|         }, | ||||
|         _change: function(val,instant) { | ||||
|             var fireEvent = false; | ||||
|             if (val === "") { | ||||
|                 this.clearButton.hide(); | ||||
|                 fireEvent = true; | ||||
|             } else { | ||||
|                 this.clearButton.show(); | ||||
|                 fireEvent = (val.length >= (this.options.minimumLength||0)); | ||||
|             } | ||||
|             var current = this.element.val(); | ||||
|             fireEvent = fireEvent && current !== this.lastSent; | ||||
|             if (fireEvent) { | ||||
|                 if (!instant && this.options.delay > 0) { | ||||
|                     clearTimeout(this.currentTimeout); | ||||
|                     var that = this; | ||||
|                     this.currentTimeout = setTimeout(function() { | ||||
|                         that.lastSent = that.element.val(); | ||||
|                         that._trigger("change"); | ||||
|                     },this.options.delay); | ||||
|                 } else { | ||||
|                     this._trigger("change"); | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         value: function(val) { | ||||
|             if (val === undefined) { | ||||
|                 return this.element.val(); | ||||
|             } else { | ||||
|                 this.element.val(val); | ||||
|                 this._change(val); | ||||
|             } | ||||
|         }, | ||||
|         count: function(val) { | ||||
|             if (val === undefined || val === null || val === "") { | ||||
|                 this.resultCount.text("").hide(); | ||||
|             } else { | ||||
|                 this.resultCount.text(val).show(); | ||||
|             } | ||||
|         }, | ||||
|         change: function() { | ||||
|             this._trigger("change"); | ||||
|         } | ||||
|     }); | ||||
| })(jQuery); | ||||
| @@ -1,118 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.editor.types._json = (function() { | ||||
|  | ||||
|  | ||||
|     var template = '<script type="text/x-red" data-template-name="_json"><div class="form-row" style="margin-bottom: 3px; text-align: right;"><button id="node-input-json-reformat" class="editor-button editor-button-small"><span data-i18n="jsonEditor.format"></span></button></div><div class="form-row node-text-editor-row"><div style="height: 200px;min-height: 150px;" class="node-text-editor" id="node-input-json"></div></div></script>'; | ||||
|  | ||||
|     return { | ||||
|         init: function() { | ||||
|             $(template).appendTo(document.body); | ||||
|         }, | ||||
|         show: function(options) { | ||||
|             var value = options.value; | ||||
|             var onComplete = options.complete; | ||||
|             var type = "_json" | ||||
|             RED.view.state(RED.state.EDITING); | ||||
|             var expressionEditor; | ||||
|             var changeTimer; | ||||
|  | ||||
|             var checkValid = function() { | ||||
|                 var v = expressionEditor.getValue(); | ||||
|                 try { | ||||
|                     JSON.parse(v); | ||||
|                     $("#node-dialog-ok").removeClass('disabled'); | ||||
|                     return true; | ||||
|                 } catch(err) { | ||||
|                     $("#node-dialog-ok").addClass('disabled'); | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|             var trayOptions = { | ||||
|                 title: options.title, | ||||
|                 width: "inherit", | ||||
|                 buttons: [ | ||||
|                     { | ||||
|                         id: "node-dialog-cancel", | ||||
|                         text: RED._("common.label.cancel"), | ||||
|                         click: function() { | ||||
|                             RED.tray.close(); | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         id: "node-dialog-ok", | ||||
|                         text: RED._("common.label.done"), | ||||
|                         class: "primary", | ||||
|                         click: function() { | ||||
|                             if (options.requireValid && !checkValid()) { | ||||
|                                 return; | ||||
|                             } | ||||
|                             onComplete(expressionEditor.getValue()); | ||||
|                             RED.tray.close(); | ||||
|                         } | ||||
|                     } | ||||
|                 ], | ||||
|                 resize: function(dimensions) { | ||||
|                     var rows = $("#dialog-form>div:not(.node-text-editor-row)"); | ||||
|                     var editorRow = $("#dialog-form>div.node-text-editor-row"); | ||||
|                     var height = $("#dialog-form").height(); | ||||
|                     for (var i=0;i<rows.size();i++) { | ||||
|                         height -= $(rows[i]).outerHeight(true); | ||||
|                     } | ||||
|                     height -= (parseInt($("#dialog-form").css("marginTop"))+parseInt($("#dialog-form").css("marginBottom"))); | ||||
|                     $(".node-text-editor").css("height",height+"px"); | ||||
|                     expressionEditor.resize(); | ||||
|                 }, | ||||
|                 open: function(tray) { | ||||
|                     var trayBody = tray.find('.editor-tray-body'); | ||||
|                     var dialogForm = RED.editor.buildEditForm(tray.find('.editor-tray-body'),'dialog-form',type,'editor'); | ||||
|                     expressionEditor = RED.editor.createEditor({ | ||||
|                         id: 'node-input-json', | ||||
|                         value: "", | ||||
|                         mode:"ace/mode/json" | ||||
|                     }); | ||||
|                     expressionEditor.getSession().setValue(value||"",-1); | ||||
|                     if (options.requireValid) { | ||||
|                         expressionEditor.getSession().on('change', function() { | ||||
|                             clearTimeout(changeTimer); | ||||
|                             changeTimer = setTimeout(checkValid,200); | ||||
|                         }); | ||||
|                         checkValid(); | ||||
|                     } | ||||
|                     $("#node-input-json-reformat").click(function(evt) { | ||||
|                         evt.preventDefault(); | ||||
|                         var v = expressionEditor.getValue()||""; | ||||
|                         try { | ||||
|                             v = JSON.stringify(JSON.parse(v),null,4); | ||||
|                         } catch(err) { | ||||
|                             // TODO: do an optimistic auto-format | ||||
|                         } | ||||
|                         expressionEditor.getSession().setValue(v||"",-1); | ||||
|                     }); | ||||
|                     dialogForm.i18n(); | ||||
|                 }, | ||||
|                 close: function() { | ||||
|                     expressionEditor.destroy(); | ||||
|                     if (options.onclose) { | ||||
|                         options.onclose(); | ||||
|                     } | ||||
|                 }, | ||||
|                 show: function() {} | ||||
|             } | ||||
|             RED.tray.show(trayOptions); | ||||
|         } | ||||
|     } | ||||
| })(); | ||||
| @@ -1,490 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.library = (function() { | ||||
|  | ||||
|     var exportToLibraryDialog; | ||||
|     var elementPrefix = "node-input-"; | ||||
|  | ||||
|     function loadFlowLibrary() { | ||||
|         $.getJSON("library/flows",function(data) { | ||||
|             //console.log(data); | ||||
|  | ||||
|             var buildMenu = function(data,root) { | ||||
|                 var i; | ||||
|                 var li; | ||||
|                 var a; | ||||
|                 var ul = document.createElement("ul"); | ||||
|                 if (root === "") { | ||||
|                     ul.id = "menu-item-import-library-submenu"; | ||||
|                 } | ||||
|                 ul.className = "dropdown-menu"; | ||||
|                 if (data.d) { | ||||
|                     for (i in data.d) { | ||||
|                         if (data.d.hasOwnProperty(i)) { | ||||
|                             li = document.createElement("li"); | ||||
|                             li.className = "dropdown-submenu pull-left"; | ||||
|                             a = document.createElement("a"); | ||||
|                             a.href="#"; | ||||
|                             var label = i.replace(/^@.*\//,"").replace(/^node-red-contrib-/,"").replace(/^node-red-node-/,"").replace(/-/," ").replace(/_/," "); | ||||
|                             a.innerHTML = label; | ||||
|                             li.appendChild(a); | ||||
|                             li.appendChild(buildMenu(data.d[i],root+(root!==""?"/":"")+i)); | ||||
|                             ul.appendChild(li); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if (data.f) { | ||||
|                     for (i in data.f) { | ||||
|                         if (data.f.hasOwnProperty(i)) { | ||||
|                             li = document.createElement("li"); | ||||
|                             a = document.createElement("a"); | ||||
|                             a.href="#"; | ||||
|                             a.innerHTML = data.f[i]; | ||||
|                             a.flowName = root+(root!==""?"/":"")+data.f[i]; | ||||
|                             a.onclick = function() { | ||||
|                                 $.get('library/flows/'+this.flowName, function(data) { | ||||
|                                     RED.view.importNodes(data); | ||||
|                                 }); | ||||
|                             }; | ||||
|                             li.appendChild(a); | ||||
|                             ul.appendChild(li); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 return ul; | ||||
|             }; | ||||
|             var examples; | ||||
|             if (data.d && data.d._examples_) { | ||||
|                 examples = data.d._examples_; | ||||
|                 delete data.d._examples_; | ||||
|             } | ||||
|             var menu = buildMenu(data,""); | ||||
|             $("#menu-item-import-examples").remove(); | ||||
|             if (examples) { | ||||
|                 RED.menu.addItem("menu-item-import",{id:"menu-item-import-examples",label:RED._("menu.label.examples"),options:[]}) | ||||
|                 $("#menu-item-import-examples-submenu").replaceWith(buildMenu(examples,"_examples_")); | ||||
|             } | ||||
|             //TODO: need an api in RED.menu for this | ||||
|             $("#menu-item-import-library-submenu").replaceWith(menu); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function createUI(options) { | ||||
|         var libraryData = {}; | ||||
|         var selectedLibraryItem = null; | ||||
|         var libraryEditor = null; | ||||
|         elementPrefix = options.elementPrefix || "node-input-"; | ||||
|  | ||||
|         // Orion editor has set/getText | ||||
|         // ACE editor has set/getValue | ||||
|         // normalise to set/getValue | ||||
|         if (options.editor.setText) { | ||||
|             // Orion doesn't like having pos passed in, so proxy the call to drop it | ||||
|             options.editor.setValue = function(text,pos) { | ||||
|                 options.editor.setText.call(options.editor,text); | ||||
|             } | ||||
|         } | ||||
|         if (options.editor.getText) { | ||||
|             options.editor.getValue = options.editor.getText; | ||||
|         } | ||||
|  | ||||
|         function buildFileListItem(item) { | ||||
|             var li = document.createElement("li"); | ||||
|             li.onmouseover = function(e) { $(this).addClass("list-hover"); }; | ||||
|             li.onmouseout = function(e) { $(this).removeClass("list-hover"); }; | ||||
|             return li; | ||||
|         } | ||||
|  | ||||
|         function buildFileList(root,data) { | ||||
|             var ul = document.createElement("ul"); | ||||
|             var li; | ||||
|             for (var i=0; i<data.length; i++) { | ||||
|                 var v = data[i]; | ||||
|                 if (typeof v === "string") { | ||||
|                     // directory | ||||
|                     li = buildFileListItem(v); | ||||
|                     li.onclick = (function () { | ||||
|                         var dirName = v; | ||||
|                         return function(e) { | ||||
|                             var bcli = $('<li class="active"><span class="divider">/</span> <a href="#">'+dirName+'</a></li>'); | ||||
|                             $("a",bcli).click(function(e) { | ||||
|                                 $(this).parent().nextAll().remove(); | ||||
|                                 $.getJSON("library/"+options.url+root+dirName,function(data) { | ||||
|                                     $("#node-select-library").children().first().replaceWith(buildFileList(root+dirName+"/",data)); | ||||
|                                 }); | ||||
|                                 e.stopPropagation(); | ||||
|                             }); | ||||
|                             var bc = $("#node-dialog-library-breadcrumbs"); | ||||
|                             $(".active",bc).removeClass("active"); | ||||
|                             bc.append(bcli); | ||||
|                             $.getJSON("library/"+options.url+root+dirName,function(data) { | ||||
|                                 $("#node-select-library").children().first().replaceWith(buildFileList(root+dirName+"/",data)); | ||||
|                             }); | ||||
|                         } | ||||
|                     })(); | ||||
|                     li.innerHTML = '<i class="fa fa-folder"></i> '+v+"</i>"; | ||||
|                     ul.appendChild(li); | ||||
|                 } else { | ||||
|                     // file | ||||
|                     li = buildFileListItem(v); | ||||
|                     li.innerHTML = v.name; | ||||
|                     li.onclick = (function() { | ||||
|                         var item = v; | ||||
|                         return function(e) { | ||||
|                             $(".list-selected",ul).removeClass("list-selected"); | ||||
|                             $(this).addClass("list-selected"); | ||||
|                             $.get("library/"+options.url+root+item.fn, function(data) { | ||||
|                                 selectedLibraryItem = item; | ||||
|                                 libraryEditor.setValue(data,-1); | ||||
|                             }); | ||||
|                         } | ||||
|                     })(); | ||||
|                     ul.appendChild(li); | ||||
|                 } | ||||
|             } | ||||
|             return ul; | ||||
|         } | ||||
|  | ||||
|         $('#'+elementPrefix+"name").css("width","calc(100% - 52px)").after( | ||||
|             '<div class="btn-group" style="margin-left:5px;">'+ | ||||
|             '<a id="node-input-'+options.type+'-lookup" class="editor-button" data-toggle="dropdown"><i class="fa fa-book"></i> <i class="fa fa-caret-down"></i></a>'+ | ||||
|             '<ul class="dropdown-menu pull-right" role="menu">'+ | ||||
|             '<li><a id="node-input-'+options.type+'-menu-open-library" tabindex="-1" href="#">'+RED._("library.openLibrary")+'</a></li>'+ | ||||
|             '<li><a id="node-input-'+options.type+'-menu-save-library" tabindex="-1" href="#">'+RED._("library.saveToLibrary")+'</a></li>'+ | ||||
|             '</ul></div>' | ||||
|         ); | ||||
|  | ||||
|         $('#node-input-'+options.type+'-menu-open-library').click(function(e) { | ||||
|             $("#node-select-library").children().remove(); | ||||
|             var bc = $("#node-dialog-library-breadcrumbs"); | ||||
|             bc.children().first().nextAll().remove(); | ||||
|             libraryEditor.setValue('',-1); | ||||
|  | ||||
|             $.getJSON("library/"+options.url,function(data) { | ||||
|                 $("#node-select-library").append(buildFileList("/",data)); | ||||
|                 $("#node-dialog-library-breadcrumbs a").click(function(e) { | ||||
|                     $(this).parent().nextAll().remove(); | ||||
|                     $("#node-select-library").children().first().replaceWith(buildFileList("/",data)); | ||||
|                     e.stopPropagation(); | ||||
|                 }); | ||||
|                 $( "#node-dialog-library-lookup" ).dialog( "open" ); | ||||
|             }); | ||||
|  | ||||
|             e.preventDefault(); | ||||
|         }); | ||||
|  | ||||
|         $('#node-input-'+options.type+'-menu-save-library').click(function(e) { | ||||
|             //var found = false; | ||||
|             var name = $("#"+elementPrefix+"name").val().replace(/(^\s*)|(\s*$)/g,""); | ||||
|  | ||||
|             //var buildPathList = function(data,root) { | ||||
|             //    var paths = []; | ||||
|             //    if (data.d) { | ||||
|             //        for (var i in data.d) { | ||||
|             //            var dn = root+(root==""?"":"/")+i; | ||||
|             //            var d = { | ||||
|             //                label:dn, | ||||
|             //                files:[] | ||||
|             //            }; | ||||
|             //            for (var f in data.d[i].f) { | ||||
|             //                d.files.push(data.d[i].f[f].fn.split("/").slice(-1)[0]); | ||||
|             //            } | ||||
|             //            paths.push(d); | ||||
|             //            paths = paths.concat(buildPathList(data.d[i],root+(root==""?"":"/")+i)); | ||||
|             //        } | ||||
|             //    } | ||||
|             //    return paths; | ||||
|             //}; | ||||
|             $("#node-dialog-library-save-folder").attr("value",""); | ||||
|  | ||||
|             var filename = name.replace(/[^\w-]/g,"-"); | ||||
|             if (filename === "") { | ||||
|                 filename = "unnamed-"+options.type; | ||||
|             } | ||||
|             $("#node-dialog-library-save-filename").attr("value",filename+".js"); | ||||
|  | ||||
|             //var paths = buildPathList(libraryData,""); | ||||
|             //$("#node-dialog-library-save-folder").autocomplete({ | ||||
|             //        minLength: 0, | ||||
|             //        source: paths, | ||||
|             //        select: function( event, ui ) { | ||||
|             //            $("#node-dialog-library-save-filename").autocomplete({ | ||||
|             //                    minLength: 0, | ||||
|             //                    source: ui.item.files | ||||
|             //            }); | ||||
|             //        } | ||||
|             //}); | ||||
|  | ||||
|             $( "#node-dialog-library-save" ).dialog( "open" ); | ||||
|             e.preventDefault(); | ||||
|         }); | ||||
|  | ||||
|         libraryEditor = ace.edit('node-select-library-text'); | ||||
|         libraryEditor.setTheme("ace/theme/tomorrow"); | ||||
|         if (options.mode) { | ||||
|             libraryEditor.getSession().setMode(options.mode); | ||||
|         } | ||||
|         libraryEditor.setOptions({ | ||||
|             readOnly: true, | ||||
|             highlightActiveLine: false, | ||||
|             highlightGutterLine: false | ||||
|         }); | ||||
|         libraryEditor.renderer.$cursorLayer.element.style.opacity=0; | ||||
|         libraryEditor.$blockScrolling = Infinity; | ||||
|  | ||||
|         $( "#node-dialog-library-lookup" ).dialog({ | ||||
|             title: RED._("library.typeLibrary", {type:options.type}), | ||||
|             modal: true, | ||||
|             autoOpen: false, | ||||
|             width: 800, | ||||
|             height: 450, | ||||
|             buttons: [ | ||||
|                 { | ||||
|                     text: RED._("common.label.cancel"), | ||||
|                     click: function() { | ||||
|                         $( this ).dialog( "close" ); | ||||
|                     } | ||||
|                 }, | ||||
|                 { | ||||
|                     text: RED._("common.label.load"), | ||||
|                     class: "primary", | ||||
|                     click: function() { | ||||
|                         if (selectedLibraryItem) { | ||||
|                             for (var i=0; i<options.fields.length; i++) { | ||||
|                                 var field = options.fields[i]; | ||||
|                                 $("#"+elementPrefix+field).val(selectedLibraryItem[field]); | ||||
|                             } | ||||
|                             options.editor.setValue(libraryEditor.getValue(),-1); | ||||
|                         } | ||||
|                         $( this ).dialog( "close" ); | ||||
|                     } | ||||
|                 } | ||||
|             ], | ||||
|             open: function(e) { | ||||
|                 var form = $("form",this); | ||||
|                 form.height(form.parent().height()-30); | ||||
|                 $("#node-select-library-text").height("100%"); | ||||
|                 $(".form-row:last-child",form).children().height(form.height()-60); | ||||
|             }, | ||||
|             resize: function(e) { | ||||
|                 var form = $("form",this); | ||||
|                 form.height(form.parent().height()-30); | ||||
|                 $(".form-row:last-child",form).children().height(form.height()-60); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         function saveToLibrary(overwrite) { | ||||
|             var name = $("#"+elementPrefix+"name").val().replace(/(^\s*)|(\s*$)/g,""); | ||||
|             if (name === "") { | ||||
|                 name = RED._("library.unnamedType",{type:options.type}); | ||||
|             } | ||||
|             var filename = $("#node-dialog-library-save-filename").val().replace(/(^\s*)|(\s*$)/g,""); | ||||
|             var pathname = $("#node-dialog-library-save-folder").val().replace(/(^\s*)|(\s*$)/g,""); | ||||
|             if (filename === "" || !/.+\.js$/.test(filename)) { | ||||
|                 RED.notify(RED._("library.invalidFilename"),"warning"); | ||||
|                 return; | ||||
|             } | ||||
|             var fullpath = pathname+(pathname===""?"":"/")+filename; | ||||
|             if (!overwrite) { | ||||
|                 //var pathnameParts = pathname.split("/"); | ||||
|                 //var exists = false; | ||||
|                 //var ds = libraryData; | ||||
|                 //for (var pnp in pathnameParts) { | ||||
|                 //    if (ds.d && pathnameParts[pnp] in ds.d) { | ||||
|                 //        ds = ds.d[pathnameParts[pnp]]; | ||||
|                 //    } else { | ||||
|                 //        ds = null; | ||||
|                 //        break; | ||||
|                 //    } | ||||
|                 //} | ||||
|                 //if (ds && ds.f) { | ||||
|                 //    for (var f in ds.f) { | ||||
|                 //        if (ds.f[f].fn == fullpath) { | ||||
|                 //            exists = true; | ||||
|                 //            break; | ||||
|                 //        } | ||||
|                 //    } | ||||
|                 //} | ||||
|                 //if (exists) { | ||||
|                 //    $("#node-dialog-library-save-content").html(RED._("library.dialogSaveOverwrite",{libraryType:options.type,libraryName:fullpath})); | ||||
|                 //    $("#node-dialog-library-save-confirm").dialog( "open" ); | ||||
|                 //    return; | ||||
|                 //} | ||||
|             } | ||||
|             var queryArgs = []; | ||||
|             var data = {}; | ||||
|             for (var i=0; i<options.fields.length; i++) { | ||||
|                 var field = options.fields[i]; | ||||
|                 if (field == "name") { | ||||
|                     data.name = name; | ||||
|                 } else { | ||||
|                     data[field] = $("#"+elementPrefix+field).val(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             data.text = options.editor.getValue(); | ||||
|             $.ajax({ | ||||
|                 url:"library/"+options.url+'/'+fullpath, | ||||
|                 type: "POST", | ||||
|                 data: JSON.stringify(data), | ||||
|                 contentType: "application/json; charset=utf-8" | ||||
|             }).done(function(data,textStatus,xhr) { | ||||
|                 RED.notify(RED._("library.savedType", {type:options.type}),"success"); | ||||
|             }).fail(function(xhr,textStatus,err) { | ||||
|                 if (xhr.status === 401) { | ||||
|                     RED.notify(RED._("library.saveFailed",{message:RED._("user.notAuthorized")}),"error"); | ||||
|                 } else { | ||||
|                     RED.notify(RED._("library.saveFailed",{message:xhr.responseText}),"error"); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         $( "#node-dialog-library-save-confirm" ).dialog({ | ||||
|             title: RED._("library.saveToLibrary"), | ||||
|             modal: true, | ||||
|             autoOpen: false, | ||||
|             width: 530, | ||||
|             height: 230, | ||||
|             buttons: [ | ||||
|                 { | ||||
|                     text: RED._("common.label.cancel"), | ||||
|                     click: function() { | ||||
|                         $( this ).dialog( "close" ); | ||||
|                     } | ||||
|                 }, | ||||
|                 { | ||||
|                     text: RED._("common.label.save"), | ||||
|                     class: "primary", | ||||
|                     click: function() { | ||||
|                         saveToLibrary(true); | ||||
|                         $( this ).dialog( "close" ); | ||||
|                     } | ||||
|                 } | ||||
|             ] | ||||
|         }); | ||||
|         $( "#node-dialog-library-save" ).dialog({ | ||||
|             title: RED._("library.saveToLibrary"), | ||||
|             modal: true, | ||||
|             autoOpen: false, | ||||
|             width: 530, | ||||
|             height: 230, | ||||
|             buttons: [ | ||||
|                 { | ||||
|                     text: RED._("common.label.cancel"), | ||||
|                     click: function() { | ||||
|                         $( this ).dialog( "close" ); | ||||
|                     } | ||||
|                 }, | ||||
|                 { | ||||
|                     text: RED._("common.label.save"), | ||||
|                     class: "primary", | ||||
|                     click: function() { | ||||
|                         saveToLibrary(false); | ||||
|                         $( this ).dialog( "close" ); | ||||
|                     } | ||||
|                 } | ||||
|             ] | ||||
|         }); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     function exportFlow() { | ||||
|         //TODO: don't rely on the main dialog | ||||
|         var nns = RED.nodes.createExportableNodeSet(RED.view.selection().nodes); | ||||
|         $("#node-input-library-filename").attr('nodes',JSON.stringify(nns)); | ||||
|         exportToLibraryDialog.dialog( "open" ); | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         init: function() { | ||||
|  | ||||
|             RED.actions.add("core:library-export",exportFlow); | ||||
|  | ||||
|             RED.events.on("view:selection-changed",function(selection) { | ||||
|                 if (!selection.nodes) { | ||||
|                     RED.menu.setDisabled("menu-item-export-library",true); | ||||
|                 } else { | ||||
|                     RED.menu.setDisabled("menu-item-export-library",false); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             if (RED.settings.theme("menu.menu-item-import-library") !== false) { | ||||
|                 loadFlowLibrary(); | ||||
|             } | ||||
|  | ||||
|             exportToLibraryDialog = $('<div id="library-dialog" class="hide"><form class="dialog-form form-horizontal"></form></div>') | ||||
|                 .appendTo("body") | ||||
|                 .dialog({ | ||||
|                     modal: true, | ||||
|                     autoOpen: false, | ||||
|                     width: 500, | ||||
|                     resizable: false, | ||||
|                     title: RED._("library.exportToLibrary"), | ||||
|                     buttons: [ | ||||
|                         { | ||||
|                             id: "library-dialog-cancel", | ||||
|                             text: RED._("common.label.cancel"), | ||||
|                             click: function() { | ||||
|                                 $( this ).dialog( "close" ); | ||||
|                             } | ||||
|                         }, | ||||
|                         { | ||||
|                             id: "library-dialog-ok", | ||||
|                             class: "primary", | ||||
|                             text: RED._("common.label.export"), | ||||
|                             click: function() { | ||||
|                                 //TODO: move this to RED.library | ||||
|                                 var flowName = $("#node-input-library-filename").val(); | ||||
|                                 if (!/^\s*$/.test(flowName)) { | ||||
|                                     $.ajax({ | ||||
|                                         url:'library/flows/'+flowName, | ||||
|                                         type: "POST", | ||||
|                                         data: $("#node-input-library-filename").attr('nodes'), | ||||
|                                         contentType: "application/json; charset=utf-8" | ||||
|                                     }).done(function() { | ||||
|                                         RED.library.loadFlowLibrary(); | ||||
|                                         RED.notify(RED._("library.savedNodes"),"success"); | ||||
|                                     }).fail(function(xhr,textStatus,err) { | ||||
|                                         if (xhr.status === 401) { | ||||
|                                             RED.notify(RED._("library.saveFailed",{message:RED._("user.notAuthorized")}),"error"); | ||||
|                                         } else { | ||||
|                                             RED.notify(RED._("library.saveFailed",{message:xhr.responseText}),"error"); | ||||
|                                         } | ||||
|                                     }); | ||||
|                                 } | ||||
|                                 $( this ).dialog( "close" ); | ||||
|                             } | ||||
|                         } | ||||
|                     ], | ||||
|                     open: function(e) { | ||||
|                         $(this).parent().find(".ui-dialog-titlebar-close").hide(); | ||||
|                     }, | ||||
|                     close: function(e) { | ||||
|                     } | ||||
|                 }); | ||||
|             exportToLibraryDialog.children(".dialog-form").append($( | ||||
|                 '<div class="form-row">'+ | ||||
|                 '<label for="node-input-library-filename" data-i18n="[append]editor:library.filename"><i class="fa fa-file"></i> </label>'+ | ||||
|                 '<input type="text" id="node-input-library-filename" data-i18n="[placeholder]editor:library.fullFilenamePlaceholder">'+ | ||||
|                 '<input type="text" style="display: none;" />'+ // Second hidden input to prevent submit on Enter | ||||
|                 '</div>' | ||||
|             )); | ||||
|         }, | ||||
|         create: createUI, | ||||
|         loadFlowLibrary: loadFlowLibrary, | ||||
|  | ||||
|         export: exportFlow | ||||
|     } | ||||
| })(); | ||||
| @@ -1,538 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| RED.palette = (function() { | ||||
|  | ||||
|     var exclusion = ['config','unknown','deprecated']; | ||||
|     var coreCategories = ['subflows', 'input', 'output', 'function', 'social', 'mobile', 'storage', 'analysis', 'advanced']; | ||||
|  | ||||
|     var categoryContainers = {}; | ||||
|  | ||||
|  | ||||
|     function createCategory(originalCategory,rootCategory,category,ns) { | ||||
|         if ($("#palette-base-category-"+rootCategory).length === 0) { | ||||
|             createCategoryContainer(originalCategory,rootCategory, ns+":palette.label."+rootCategory); | ||||
|         } | ||||
|         $("#palette-container-"+rootCategory).show(); | ||||
|         if ($("#palette-"+category).length === 0) { | ||||
|             $("#palette-base-category-"+rootCategory).append('<div id="palette-'+category+'"></div>'); | ||||
|         } | ||||
|     } | ||||
|     function createCategoryContainer(originalCategory,category, labelId) { | ||||
|         var label = RED._(labelId, {defaultValue:category}); | ||||
|         label = (label || category).replace(/_/g, " "); | ||||
|         var catDiv = $('<div id="palette-container-'+category+'" class="palette-category palette-close hide">'+ | ||||
|             '<div id="palette-header-'+category+'" class="palette-header"><i class="expanded fa fa-angle-down"></i><span>'+label+'</span></div>'+ | ||||
|             '<div class="palette-content" id="palette-base-category-'+category+'">'+ | ||||
|             '<div id="palette-'+category+'-input"></div>'+ | ||||
|             '<div id="palette-'+category+'-output"></div>'+ | ||||
|             '<div id="palette-'+category+'-function"></div>'+ | ||||
|             '</div>'+ | ||||
|             '</div>').appendTo("#palette-container"); | ||||
|         catDiv.data('category',originalCategory); | ||||
|         catDiv.data('label',label); | ||||
|         categoryContainers[category] = { | ||||
|             container: catDiv, | ||||
|             close: function() { | ||||
|                 catDiv.removeClass("palette-open"); | ||||
|                 catDiv.addClass("palette-closed"); | ||||
|                 $("#palette-base-category-"+category).slideUp(); | ||||
|                 $("#palette-header-"+category+" i").removeClass("expanded"); | ||||
|             }, | ||||
|             open: function() { | ||||
|                 catDiv.addClass("palette-open"); | ||||
|                 catDiv.removeClass("palette-closed"); | ||||
|                 $("#palette-base-category-"+category).slideDown(); | ||||
|                 $("#palette-header-"+category+" i").addClass("expanded"); | ||||
|             }, | ||||
|             toggle: function() { | ||||
|                 if (catDiv.hasClass("palette-open")) { | ||||
|                     categoryContainers[category].close(); | ||||
|                 } else { | ||||
|                     categoryContainers[category].open(); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         $("#palette-header-"+category).on('click', function(e) { | ||||
|             categoryContainers[category].toggle(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function setLabel(type, el,label, info) { | ||||
|         var nodeWidth = 82; | ||||
|         var nodeHeight = 25; | ||||
|         var lineHeight = 20; | ||||
|         var portHeight = 10; | ||||
|  | ||||
|         var words = label.split(/[ -]/); | ||||
|  | ||||
|         var displayLines = []; | ||||
|  | ||||
|         var currentLine = words[0]; | ||||
|         var currentLineWidth = RED.view.calculateTextWidth(currentLine, "palette_label", 0); | ||||
|  | ||||
|         for (var i=1;i<words.length;i++) { | ||||
|             var newWidth = RED.view.calculateTextWidth(currentLine+" "+words[i], "palette_label", 0); | ||||
|             if (newWidth < nodeWidth) { | ||||
|                 currentLine += " "+words[i]; | ||||
|                 currentLineWidth = newWidth; | ||||
|             } else { | ||||
|                 displayLines.push(currentLine); | ||||
|                 currentLine = words[i]; | ||||
|                 currentLineWidth = RED.view.calculateTextWidth(currentLine, "palette_label", 0); | ||||
|             } | ||||
|         } | ||||
|         displayLines.push(currentLine); | ||||
|  | ||||
|         var lines = displayLines.join("<br/>"); | ||||
|         var multiLineNodeHeight = 8+(lineHeight*displayLines.length); | ||||
|         el.css({height:multiLineNodeHeight+"px"}); | ||||
|  | ||||
|         var labelElement = el.find(".palette_label"); | ||||
|         labelElement.html(lines).attr('dir', RED.text.bidi.resolveBaseTextDir(lines)); | ||||
|  | ||||
|         el.find(".palette_port").css({top:(multiLineNodeHeight/2-5)+"px"}); | ||||
|  | ||||
|         var popOverContent; | ||||
|         try { | ||||
|             var l = "<p><b>"+RED.text.bidi.enforceTextDirectionWithUCC(label)+"</b></p>"; | ||||
|             if (label != type) { | ||||
|                 l = "<p><b>"+RED.text.bidi.enforceTextDirectionWithUCC(label)+"</b><br/><i>"+type+"</i></p>"; | ||||
|             } | ||||
|             popOverContent = $(l+(info?info:$("script[data-help-name='"+type+"']").html()||"<p>"+RED._("palette.noInfo")+"</p>").trim()) | ||||
|                                 .filter(function(n) { | ||||
|                                     return (this.nodeType == 1 && this.nodeName == "P") || (this.nodeType == 3 && this.textContent.trim().length > 0) | ||||
|                                 }).slice(0,2); | ||||
|         } catch(err) { | ||||
|             // Malformed HTML may cause errors. TODO: need to understand what can break | ||||
|             // NON-NLS: internal debug | ||||
|             console.log("Error generating pop-over label for ",type); | ||||
|             console.log(err.toString()); | ||||
|             popOverContent = "<p><b>"+label+"</b></p><p>"+RED._("palette.noInfo")+"</p>"; | ||||
|         } | ||||
|  | ||||
|         el.data('popover').setContent(popOverContent); | ||||
|     } | ||||
|  | ||||
|     function setIcon(element,sf) { | ||||
|         var iconElement = element.find(".palette_icon"); | ||||
|         var icon_url = RED.utils.getNodeIcon(sf._def,sf); | ||||
|         iconElement.attr("style", "background-image: url("+icon_url+")"); | ||||
|     } | ||||
|  | ||||
|     function escapeNodeType(nt) { | ||||
|         return nt.replace(" ","_").replace(".","_").replace(":","_"); | ||||
|     } | ||||
|  | ||||
|     function addNodeType(nt,def) { | ||||
|         var nodeTypeId = escapeNodeType(nt); | ||||
|         if ($("#palette_node_"+nodeTypeId).length) { | ||||
|             return; | ||||
|         } | ||||
|         if (exclusion.indexOf(def.category)===-1) { | ||||
|  | ||||
|             var originalCategory = def.category; | ||||
|             var category = def.category.replace(/ /g,"_"); | ||||
|             var rootCategory = category.split("-")[0]; | ||||
|  | ||||
|             var d = document.createElement("div"); | ||||
|             d.id = "palette_node_"+nodeTypeId; | ||||
|             d.type = nt; | ||||
|  | ||||
|             var label = /^(.*?)([ -]in|[ -]out)?$/.exec(nt)[1]; | ||||
|             if (typeof def.paletteLabel !== "undefined") { | ||||
|                 try { | ||||
|                     label = (typeof def.paletteLabel === "function" ? def.paletteLabel.call(def) : def.paletteLabel)||""; | ||||
|                 } catch(err) { | ||||
|                     console.log("Definition error: "+nt+".paletteLabel",err); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $('<div/>',{class:"palette_label"+(def.align=="right"?" palette_label_right":"")}).appendTo(d); | ||||
|  | ||||
|             d.className="palette_node"; | ||||
|  | ||||
|             if (def.icon) { | ||||
|                 var icon_url = RED.utils.getNodeIcon(def); | ||||
|                 var iconContainer = $('<div/>',{class:"palette_icon_container"+(def.align=="right"?" palette_icon_container_right":"")}).appendTo(d); | ||||
|                 $('<div/>',{class:"palette_icon",style:"background-image: url("+icon_url+")"}).appendTo(iconContainer); | ||||
|             } | ||||
|  | ||||
|             d.style.backgroundColor = RED.utils.getNodeColor(nt,def); | ||||
|  | ||||
|             if (def.outputs > 0) { | ||||
|                 var portOut = document.createElement("div"); | ||||
|                 portOut.className = "palette_port palette_port_output"; | ||||
|                 d.appendChild(portOut); | ||||
|             } | ||||
|  | ||||
|             if (def.inputs > 0) { | ||||
|                 var portIn = document.createElement("div"); | ||||
|                 portIn.className = "palette_port palette_port_input"; | ||||
|                 d.appendChild(portIn); | ||||
|             } | ||||
|  | ||||
|             createCategory(def.category,rootCategory,category,(coreCategories.indexOf(rootCategory) !== -1)?"node-red":def.set.id); | ||||
|  | ||||
|             $("#palette-"+category).append(d); | ||||
|  | ||||
|             $(d).data('category',rootCategory); | ||||
|  | ||||
|             d.onmousedown = function(e) { e.preventDefault(); }; | ||||
|  | ||||
|             var popover = RED.popover.create({ | ||||
|                 target:$(d), | ||||
|                 trigger: "hover", | ||||
|                 width: "300px", | ||||
|                 content: "hi", | ||||
|                 delay: { show: 750, hide: 50 } | ||||
|             }); | ||||
|             $(d).data('popover',popover); | ||||
|  | ||||
|             // $(d).popover({ | ||||
|             //     title:d.type, | ||||
|             //     placement:"right", | ||||
|             //     trigger: "hover", | ||||
|             //     delay: { show: 750, hide: 50 }, | ||||
|             //     html: true, | ||||
|             //     container:'body' | ||||
|             // }); | ||||
|             $(d).click(function() { | ||||
|                 RED.view.focus(); | ||||
|                 var helpText; | ||||
|                 if (nt.indexOf("subflow:") === 0) { | ||||
|                     helpText = marked(RED.nodes.subflow(nt.substring(8)).info||"")||('<span class="node-info-none">'+RED._("sidebar.info.none")+'</span>'); | ||||
|                 } else { | ||||
|                     helpText = $("script[data-help-name='"+d.type+"']").html()||('<span class="node-info-none">'+RED._("sidebar.info.none")+'</span>'); | ||||
|                 } | ||||
|                 RED.sidebar.info.set(helpText,RED._("sidebar.info.nodeHelp")); | ||||
|             }); | ||||
|             var chart = $("#chart"); | ||||
|             var chartOffset = chart.offset(); | ||||
|             var chartSVG = $("#chart>svg").get(0); | ||||
|             var activeSpliceLink; | ||||
|             var mouseX; | ||||
|             var mouseY; | ||||
|             var spliceTimer; | ||||
|             var paletteWidth; | ||||
|             var paletteTop; | ||||
|             $(d).draggable({ | ||||
|                 helper: 'clone', | ||||
|                 appendTo: 'body', | ||||
|                 revert: true, | ||||
|                 revertDuration: 50, | ||||
|                 containment:'#main-container', | ||||
|                 start: function() { | ||||
|                     paletteWidth = $("#palette").width(); | ||||
|                     paletteTop = $("#palette").parent().position().top + $("#palette-container").position().top; | ||||
|                     RED.view.focus(); | ||||
|                 }, | ||||
|                 stop: function() { d3.select('.link_splice').classed('link_splice',false); if (spliceTimer) { clearTimeout(spliceTimer); spliceTimer = null;}}, | ||||
|                 drag: function(e,ui) { | ||||
|  | ||||
|                     // TODO: this is the margin-left of palette node. Hard coding | ||||
|                     // it here makes me sad | ||||
|                     //console.log(ui.helper.position()); | ||||
|                     ui.position.left += 17.5; | ||||
|  | ||||
|                     if (def.inputs > 0 && def.outputs > 0) { | ||||
|                         mouseX = ui.position.left-paletteWidth+(ui.helper.width()/2) - chartOffset.left + chart.scrollLeft(); | ||||
|                         mouseY = ui.position.top-paletteTop+(ui.helper.height()/2) - chartOffset.top + chart.scrollTop(); | ||||
|                         if (!spliceTimer) { | ||||
|                             spliceTimer = setTimeout(function() { | ||||
|                                 var nodes = []; | ||||
|                                 var bestDistance = Infinity; | ||||
|                                 var bestLink = null; | ||||
|                                 if (chartSVG.getIntersectionList) { | ||||
|                                     var svgRect = chartSVG.createSVGRect(); | ||||
|                                     svgRect.x = mouseX; | ||||
|                                     svgRect.y = mouseY; | ||||
|                                     svgRect.width = 1; | ||||
|                                     svgRect.height = 1; | ||||
|                                     nodes = chartSVG.getIntersectionList(svgRect,chartSVG); | ||||
|                                     mouseX /= RED.view.scale(); | ||||
|                                     mouseY /= RED.view.scale(); | ||||
|                                 } else { | ||||
|                                     // Firefox doesn't do getIntersectionList and that | ||||
|                                     // makes us sad | ||||
|                                     mouseX /= RED.view.scale(); | ||||
|                                     mouseY /= RED.view.scale(); | ||||
|                                     nodes = RED.view.getLinksAtPoint(mouseX,mouseY); | ||||
|                                 } | ||||
|  | ||||
|                                 for (var i=0;i<nodes.length;i++) { | ||||
|                                     var node = d3.select(nodes[i]); | ||||
|                                     if (node.classed('link_background') && !node.classed('link_link')) { | ||||
|                                         var length = nodes[i].getTotalLength(); | ||||
|                                         for (var j=0;j<length;j+=10) { | ||||
|                                             var p = nodes[i].getPointAtLength(j); | ||||
|                                             var d2 = ((p.x-mouseX)*(p.x-mouseX))+((p.y-mouseY)*(p.y-mouseY)); | ||||
|                                             if (d2 < 200 && d2 < bestDistance) { | ||||
|                                                 bestDistance = d2; | ||||
|                                                 bestLink = nodes[i]; | ||||
|                                             } | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                                 if (activeSpliceLink && activeSpliceLink !== bestLink) { | ||||
|                                     d3.select(activeSpliceLink.parentNode).classed('link_splice',false); | ||||
|                                 } | ||||
|                                 if (bestLink) { | ||||
|                                     d3.select(bestLink.parentNode).classed('link_splice',true) | ||||
|                                 } else { | ||||
|                                     d3.select('.link_splice').classed('link_splice',false); | ||||
|                                 } | ||||
|                                 if (activeSpliceLink !== bestLink) { | ||||
|                                     if (bestLink) { | ||||
|                                         $(ui.helper).data('splice',d3.select(bestLink).data()[0]); | ||||
|                                     } else { | ||||
|                                         $(ui.helper).removeData('splice'); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 activeSpliceLink = bestLink; | ||||
|                                 spliceTimer = null; | ||||
|                             },200); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             var nodeInfo = null; | ||||
|             if (nt.indexOf("subflow:") === 0) { | ||||
|                 $(d).dblclick(function(e) { | ||||
|                     RED.workspaces.show(nt.substring(8)); | ||||
|                     e.preventDefault(); | ||||
|                 }); | ||||
|                 nodeInfo = marked(def.info||""); | ||||
|             } | ||||
|             setLabel(nt,$(d),label,nodeInfo); | ||||
|  | ||||
|             var categoryNode = $("#palette-container-"+rootCategory); | ||||
|             if (categoryNode.find(".palette_node").length === 1) { | ||||
|                 categoryContainers[rootCategory].open(); | ||||
|             } | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function removeNodeType(nt) { | ||||
|         var nodeTypeId = escapeNodeType(nt); | ||||
|         var paletteNode = $("#palette_node_"+nodeTypeId); | ||||
|         var categoryNode = paletteNode.closest(".palette-category"); | ||||
|         paletteNode.remove(); | ||||
|         if (categoryNode.find(".palette_node").length === 0) { | ||||
|             if (categoryNode.find("i").hasClass("expanded")) { | ||||
|                 categoryNode.find(".palette-content").slideToggle(); | ||||
|                 categoryNode.find("i").toggleClass("expanded"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function hideNodeType(nt) { | ||||
|         var nodeTypeId = escapeNodeType(nt); | ||||
|         var paletteNode = $("#palette_node_"+nodeTypeId); | ||||
|         paletteNode.hide(); | ||||
|         var categoryNode = paletteNode.closest(".palette-category"); | ||||
|         var cl = categoryNode.find(".palette_node"); | ||||
|         var c = 0; | ||||
|         for (var i = 0; i < cl.length; i++) { | ||||
|             if ($(cl[i]).css('display') === 'none') { c += 1; } | ||||
|         } | ||||
|         if (c === cl.length) { categoryNode.hide(); } | ||||
|     } | ||||
|  | ||||
|     function showNodeType(nt) { | ||||
|         var nodeTypeId = escapeNodeType(nt); | ||||
|         var paletteNode = $("#palette_node_"+nodeTypeId); | ||||
|         var categoryNode = paletteNode.closest(".palette-category"); | ||||
|         categoryNode.show(); | ||||
|         paletteNode.show(); | ||||
|     } | ||||
|  | ||||
|     function refreshNodeTypes() { | ||||
|         RED.nodes.eachSubflow(function(sf) { | ||||
|             var paletteNode = $("#palette_node_subflow_"+sf.id.replace(".","_")); | ||||
|             var portInput = paletteNode.find(".palette_port_input"); | ||||
|             var portOutput = paletteNode.find(".palette_port_output"); | ||||
|  | ||||
|             if (portInput.length === 0 && sf.in.length > 0) { | ||||
|                 var portIn = document.createElement("div"); | ||||
|                 portIn.className = "palette_port palette_port_input"; | ||||
|                 paletteNode.append(portIn); | ||||
|             } else if (portInput.length !== 0 && sf.in.length === 0) { | ||||
|                 portInput.remove(); | ||||
|             } | ||||
|  | ||||
|             if (portOutput.length === 0 && sf.out.length > 0) { | ||||
|                 var portOut = document.createElement("div"); | ||||
|                 portOut.className = "palette_port palette_port_output"; | ||||
|                 paletteNode.append(portOut); | ||||
|             } else if (portOutput.length !== 0 && sf.out.length === 0) { | ||||
|                 portOutput.remove(); | ||||
|             } | ||||
|             setLabel(sf.type+":"+sf.id,paletteNode,sf.name,marked(sf.info||"")); | ||||
|             setIcon(paletteNode,sf); | ||||
|  | ||||
|             var currentCategory = paletteNode.data('category'); | ||||
|             var newCategory = (sf.category||"subflows"); | ||||
|             if (currentCategory !== newCategory) { | ||||
|                 var category = newCategory.replace(/ /g,"_"); | ||||
|                 createCategory(newCategory,category,category,"node-red"); | ||||
|  | ||||
|                 var currentCategoryNode = paletteNode.closest(".palette-category"); | ||||
|                 var newCategoryNode = $("#palette-"+category); | ||||
|                 newCategoryNode.append(paletteNode); | ||||
|                 if (newCategoryNode.find(".palette_node").length === 1) { | ||||
|                     categoryContainers[category].open(); | ||||
|                 } | ||||
|  | ||||
|                 paletteNode.data('category',newCategory); | ||||
|                 if (currentCategoryNode.find(".palette_node").length === 0) { | ||||
|                     if (currentCategoryNode.find("i").hasClass("expanded")) { | ||||
|                         currentCategoryNode.find(".palette-content").slideToggle(); | ||||
|                         currentCategoryNode.find("i").toggleClass("expanded"); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|  | ||||
|  | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function filterChange(val) { | ||||
|         var re = new RegExp(val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i'); | ||||
|         $("#palette-container .palette_node").each(function(i,el) { | ||||
|             var currentLabel = $(el).find(".palette_label").text(); | ||||
|             if (val === "" || re.test(el.id) || re.test(currentLabel)) { | ||||
|                 $(this).show(); | ||||
|             } else { | ||||
|                 $(this).hide(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         for (var category in categoryContainers) { | ||||
|             if (categoryContainers.hasOwnProperty(category)) { | ||||
|                 if (categoryContainers[category].container | ||||
|                         .find(".palette_node") | ||||
|                         .filter(function() { return $(this).css('display') !== 'none'}).length === 0) { | ||||
|                     categoryContainers[category].close(); | ||||
|                 } else { | ||||
|                     categoryContainers[category].open(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function init() { | ||||
|  | ||||
|         RED.events.on('registry:node-type-added', function(nodeType) { | ||||
|             var def = RED.nodes.getType(nodeType); | ||||
|             addNodeType(nodeType,def); | ||||
|             if (def.onpaletteadd && typeof def.onpaletteadd === "function") { | ||||
|                 def.onpaletteadd.call(def); | ||||
|             } | ||||
|         }); | ||||
|         RED.events.on('registry:node-type-removed', function(nodeType) { | ||||
|             removeNodeType(nodeType); | ||||
|         }); | ||||
|         RED.events.on('registry:node-set-enabled', function(nodeSet) { | ||||
|             for (var j=0;j<nodeSet.types.length;j++) { | ||||
|                 showNodeType(nodeSet.types[j]); | ||||
|                 var def = RED.nodes.getType(nodeSet.types[j]); | ||||
|                 if (def && def.onpaletteadd && typeof def.onpaletteadd === "function") { | ||||
|                     def.onpaletteadd.call(def); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         RED.events.on('registry:node-set-disabled', function(nodeSet) { | ||||
|             for (var j=0;j<nodeSet.types.length;j++) { | ||||
|                 hideNodeType(nodeSet.types[j]); | ||||
|                 var def = RED.nodes.getType(nodeSet.types[j]); | ||||
|                 if (def && def.onpaletteremove && typeof def.onpaletteremove === "function") { | ||||
|                     def.onpaletteremove.call(def); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         RED.events.on('registry:node-set-removed', function(nodeSet) { | ||||
|             if (nodeSet.added) { | ||||
|                 for (var j=0;j<nodeSet.types.length;j++) { | ||||
|                     removeNodeType(nodeSet.types[j]); | ||||
|                     var def = RED.nodes.getType(nodeSet.types[j]); | ||||
|                     if (def && def.onpaletteremove && typeof def.onpaletteremove === "function") { | ||||
|                         def.onpaletteremove.call(def); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         $("#palette > .palette-spinner").show(); | ||||
|  | ||||
|         $("#palette-search input").searchBox({ | ||||
|             delay: 100, | ||||
|             change: function() { | ||||
|                 filterChange($(this).val()); | ||||
|             } | ||||
|         }) | ||||
|  | ||||
|         var categoryList = coreCategories; | ||||
|         if (RED.settings.paletteCategories) { | ||||
|             categoryList = RED.settings.paletteCategories; | ||||
|         } else if (RED.settings.theme('palette.categories')) { | ||||
|             categoryList = RED.settings.theme('palette.categories'); | ||||
|         } | ||||
|         if (!Array.isArray(categoryList)) { | ||||
|             categoryList = coreCategories | ||||
|         } | ||||
|         categoryList.forEach(function(category){ | ||||
|             createCategoryContainer(category, category, "palette.label."+category); | ||||
|         }); | ||||
|  | ||||
|         $("#palette-collapse-all").on("click", function(e) { | ||||
|             e.preventDefault(); | ||||
|             for (var cat in categoryContainers) { | ||||
|                 if (categoryContainers.hasOwnProperty(cat)) { | ||||
|                     categoryContainers[cat].close(); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         $("#palette-expand-all").on("click", function(e) { | ||||
|             e.preventDefault(); | ||||
|             for (var cat in categoryContainers) { | ||||
|                 if (categoryContainers.hasOwnProperty(cat)) { | ||||
|                     categoryContainers[cat].open(); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|     function getCategories() { | ||||
|         var categories = []; | ||||
|         $("#palette-container .palette-category").each(function(i,d) { | ||||
|             categories.push({id:$(d).data('category'),label:$(d).data('label')}); | ||||
|         }) | ||||
|         return categories; | ||||
|     } | ||||
|     return { | ||||
|         init: init, | ||||
|         add:addNodeType, | ||||
|         remove:removeNodeType, | ||||
|         hide:hideNodeType, | ||||
|         show:showNodeType, | ||||
|         refresh:refreshNodeTypes, | ||||
|         getCategories: getCategories | ||||
|     }; | ||||
| })(); | ||||
| @@ -1,298 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.search = (function() { | ||||
|  | ||||
|     var disabled = false; | ||||
|     var dialog = null; | ||||
|     var searchInput; | ||||
|     var searchResults; | ||||
|     var selected = -1; | ||||
|     var visible = false; | ||||
|  | ||||
|     var index = {}; | ||||
|     var keys = []; | ||||
|     var results = []; | ||||
|  | ||||
|  | ||||
|     function indexProperty(node,label,property) { | ||||
|         if (typeof property === 'string' || typeof property === 'number') { | ||||
|             property = (""+property).toLowerCase(); | ||||
|             index[property] = index[property] || {}; | ||||
|             index[property][node.id] = {node:node,label:label}; | ||||
|         } else if (Array.isArray(property)) { | ||||
|             property.forEach(function(prop) { | ||||
|                 indexProperty(node,label,prop); | ||||
|             }) | ||||
|         } else if (typeof property === 'object') { | ||||
|             for (var prop in property) { | ||||
|                 if (property.hasOwnProperty(prop)) { | ||||
|                     indexProperty(node,label,property[prop]) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     function indexNode(n) { | ||||
|         var l = RED.utils.getNodeLabel(n); | ||||
|         if (l) { | ||||
|             l = (""+l).toLowerCase(); | ||||
|             index[l] = index[l] || {}; | ||||
|             index[l][n.id] = {node:n,label:l} | ||||
|         } | ||||
|         l = l||n.label||n.name||n.id||""; | ||||
|  | ||||
|  | ||||
|         var properties = ['id','type','name','label','info']; | ||||
|         if (n._def && n._def.defaults) { | ||||
|             properties = properties.concat(Object.keys(n._def.defaults)); | ||||
|         } | ||||
|         for (var i=0;i<properties.length;i++) { | ||||
|             if (n.hasOwnProperty(properties[i])) { | ||||
|                 indexProperty(n, l, n[properties[i]]); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function indexWorkspace() { | ||||
|         index = {}; | ||||
|         RED.nodes.eachWorkspace(indexNode); | ||||
|         RED.nodes.eachSubflow(indexNode); | ||||
|         RED.nodes.eachConfig(indexNode); | ||||
|         RED.nodes.eachNode(indexNode); | ||||
|         keys = Object.keys(index); | ||||
|         keys.sort(); | ||||
|         keys.forEach(function(key) { | ||||
|             index[key] = Object.keys(index[key]).map(function(id) { | ||||
|                 return index[key][id]; | ||||
|             }) | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     function search(val) { | ||||
|         searchResults.editableList('empty'); | ||||
|         selected = -1; | ||||
|         results = []; | ||||
|         if (val.length > 0) { | ||||
|             val = val.toLowerCase(); | ||||
|             var i; | ||||
|             var j; | ||||
|             var list = []; | ||||
|             var nodes = {}; | ||||
|             for (i=0;i<keys.length;i++) { | ||||
|                 var key = keys[i]; | ||||
|                 var kpos = keys[i].indexOf(val); | ||||
|                 if (kpos > -1) { | ||||
|                     for (j=0;j<index[key].length;j++) { | ||||
|                         var node = index[key][j]; | ||||
|                         nodes[node.node.id] = nodes[node.node.id] = node; | ||||
|                         nodes[node.node.id].index = Math.min(nodes[node.node.id].index||Infinity,kpos); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             list = Object.keys(nodes); | ||||
|             list.sort(function(A,B) { | ||||
|                 return nodes[A].index - nodes[B].index; | ||||
|             }); | ||||
|  | ||||
|             for (i=0;i<list.length;i++) { | ||||
|                 results.push(nodes[list[i]]); | ||||
|             } | ||||
|             if (results.length > 0) { | ||||
|                 for (i=0;i<Math.min(results.length,25);i++) { | ||||
|                     searchResults.editableList('addItem',results[i]) | ||||
|                 } | ||||
|             } else { | ||||
|                 searchResults.editableList('addItem',{}); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     function ensureSelectedIsVisible() { | ||||
|         var selectedEntry = searchResults.find("li.selected"); | ||||
|         if (selectedEntry.length === 1) { | ||||
|             var scrollWindow = searchResults.parent(); | ||||
|             var scrollHeight = scrollWindow.height(); | ||||
|             var scrollOffset = scrollWindow.scrollTop(); | ||||
|             var y = selectedEntry.position().top; | ||||
|             var h = selectedEntry.height(); | ||||
|             if (y+h > scrollHeight) { | ||||
|                 scrollWindow.animate({scrollTop: '-='+(scrollHeight-(y+h)-10)},50); | ||||
|             } else if (y<0) { | ||||
|                 scrollWindow.animate({scrollTop: '+='+(y-10)},50); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function createDialog() { | ||||
|         dialog = $("<div>",{id:"red-ui-search",class:"red-ui-search"}).appendTo("#main-container"); | ||||
|         var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog); | ||||
|         searchInput = $('<input type="text" data-i18n="[placeholder]menu.label.searchInput">').appendTo(searchDiv).searchBox({ | ||||
|             delay: 200, | ||||
|             change: function() { | ||||
|                 search($(this).val()); | ||||
|             } | ||||
|         }); | ||||
|         searchInput.on('keydown',function(evt) { | ||||
|             var children; | ||||
|             if (results.length > 0) { | ||||
|                 if (evt.keyCode === 40) { | ||||
|                     // Down | ||||
|                     children = searchResults.children(); | ||||
|                     if (selected < children.length-1) { | ||||
|                         if (selected > -1) { | ||||
|                             $(children[selected]).removeClass('selected'); | ||||
|                         } | ||||
|                         selected++; | ||||
|                     } | ||||
|                     $(children[selected]).addClass('selected'); | ||||
|                     ensureSelectedIsVisible(); | ||||
|                     evt.preventDefault(); | ||||
|                 } else if (evt.keyCode === 38) { | ||||
|                     // Up | ||||
|                     children = searchResults.children(); | ||||
|                     if (selected > 0) { | ||||
|                         if (selected < children.length) { | ||||
|                             $(children[selected]).removeClass('selected'); | ||||
|                         } | ||||
|                         selected--; | ||||
|                     } | ||||
|                     $(children[selected]).addClass('selected'); | ||||
|                     ensureSelectedIsVisible(); | ||||
|                     evt.preventDefault(); | ||||
|                 } else if (evt.keyCode === 13) { | ||||
|                     // Enter | ||||
|                     if (results.length > 0) { | ||||
|                         reveal(results[Math.max(0,selected)].node); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         searchInput.i18n(); | ||||
|  | ||||
|         var searchResultsDiv = $("<div>",{class:"red-ui-search-results-container"}).appendTo(dialog); | ||||
|         searchResults = $('<ol>',{id:"search-result-list", style:"position: absolute;top: 5px;bottom: 5px;left: 5px;right: 5px;"}).appendTo(searchResultsDiv).editableList({ | ||||
|             addButton: false, | ||||
|             addItem: function(container,i,object) { | ||||
|                 var node = object.node; | ||||
|                 if (node === undefined) { | ||||
|                     $('<div>',{class:"red-ui-search-empty"}).text(RED._('search.empty')).appendTo(container); | ||||
|  | ||||
|                 } else { | ||||
|                     var def = node._def; | ||||
|                     var div = $('<a>',{href:'#',class:"red-ui-search-result"}).appendTo(container); | ||||
|  | ||||
|                     var nodeDiv = $('<div>',{class:"red-ui-search-result-node"}).appendTo(div); | ||||
|                     var colour = RED.utils.getNodeColor(node.type,def); | ||||
|                     var icon_url = RED.utils.getNodeIcon(def,node); | ||||
|                     if (node.type === 'tab') { | ||||
|                         colour = "#C0DEED"; | ||||
|                     } | ||||
|                     nodeDiv.css('backgroundColor',colour); | ||||
|  | ||||
|                     var iconContainer = $('<div/>',{class:"palette_icon_container"}).appendTo(nodeDiv); | ||||
|                     $('<div/>',{class:"palette_icon",style:"background-image: url("+icon_url+")"}).appendTo(iconContainer); | ||||
|  | ||||
|                     var contentDiv = $('<div>',{class:"red-ui-search-result-description"}).appendTo(div); | ||||
|                     if (node.z) { | ||||
|                         var workspace = RED.nodes.workspace(node.z); | ||||
|                         if (!workspace) { | ||||
|                             workspace = RED.nodes.subflow(node.z); | ||||
|                             workspace = "subflow:"+workspace.name; | ||||
|                         } else { | ||||
|                             workspace = "flow:"+workspace.label; | ||||
|                         } | ||||
|                         $('<div>',{class:"red-ui-search-result-node-flow"}).text(workspace).appendTo(contentDiv); | ||||
|                     } | ||||
|  | ||||
|                     $('<div>',{class:"red-ui-search-result-node-label"}).text(object.label || node.id).appendTo(contentDiv); | ||||
|                     $('<div>',{class:"red-ui-search-result-node-type"}).text(node.type).appendTo(contentDiv); | ||||
|                     $('<div>',{class:"red-ui-search-result-node-id"}).text(node.id).appendTo(contentDiv); | ||||
|  | ||||
|                     div.click(function(evt) { | ||||
|                         evt.preventDefault(); | ||||
|                         reveal(node); | ||||
|                     }); | ||||
|                 } | ||||
|             }, | ||||
|             scrollOnAdd: false | ||||
|         }); | ||||
|  | ||||
|     } | ||||
|     function reveal(node) { | ||||
|         hide(); | ||||
|         RED.view.reveal(node.id); | ||||
|     } | ||||
|  | ||||
|     function show() { | ||||
|         if (disabled) { | ||||
|             return; | ||||
|         } | ||||
|         if (!visible) { | ||||
|             RED.keyboard.add("*","escape",function(){hide()}); | ||||
|             $("#header-shade").show(); | ||||
|             $("#editor-shade").show(); | ||||
|             $("#palette-shade").show(); | ||||
|             $("#sidebar-shade").show(); | ||||
|             $("#sidebar-separator").hide(); | ||||
|             indexWorkspace(); | ||||
|             if (dialog === null) { | ||||
|                 createDialog(); | ||||
|             } | ||||
|             dialog.slideDown(300); | ||||
|             RED.events.emit("search:open"); | ||||
|             visible = true; | ||||
|         } | ||||
|         searchInput.focus(); | ||||
|     } | ||||
|     function hide() { | ||||
|         if (visible) { | ||||
|             RED.keyboard.remove("escape"); | ||||
|             visible = false; | ||||
|             $("#header-shade").hide(); | ||||
|             $("#editor-shade").hide(); | ||||
|             $("#palette-shade").hide(); | ||||
|             $("#sidebar-shade").hide(); | ||||
|             $("#sidebar-separator").show(); | ||||
|             if (dialog !== null) { | ||||
|                 dialog.slideUp(200,function() { | ||||
|                     searchInput.searchBox('value',''); | ||||
|                 }); | ||||
|             } | ||||
|             RED.events.emit("search:close"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function init() { | ||||
|         RED.actions.add("core:search",show); | ||||
|  | ||||
|         RED.events.on("editor:open",function() { disabled = true; }); | ||||
|         RED.events.on("editor:close",function() { disabled = false; }); | ||||
|         RED.events.on("type-search:open",function() { disabled = true; }); | ||||
|         RED.events.on("type-search:close",function() { disabled = false; }); | ||||
|  | ||||
|  | ||||
|  | ||||
|         $("#header-shade").on('mousedown',hide); | ||||
|         $("#editor-shade").on('mousedown',hide); | ||||
|         $("#palette-shade").on('mousedown',hide); | ||||
|         $("#sidebar-shade").on('mousedown',hide); | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         init: init, | ||||
|         show: show, | ||||
|         hide: hide | ||||
|     }; | ||||
|  | ||||
| })(); | ||||
| @@ -1,235 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.sidebar = (function() { | ||||
|  | ||||
|     //$('#sidebar').tabs(); | ||||
|     var sidebar_tabs = RED.tabs.create({ | ||||
|         id:"sidebar-tabs", | ||||
|         onchange:function(tab) { | ||||
|             $("#sidebar-content").children().hide(); | ||||
|             $("#sidebar-footer").children().hide(); | ||||
|             if (tab.onchange) { | ||||
|                 tab.onchange.call(tab); | ||||
|             } | ||||
|             $(tab.wrapper).show(); | ||||
|             if (tab.toolbar) { | ||||
|                 $(tab.toolbar).show(); | ||||
|             } | ||||
|         }, | ||||
|         onremove: function(tab) { | ||||
|             $(tab.wrapper).hide(); | ||||
|             if (tab.onremove) { | ||||
|                 tab.onremove.call(tab); | ||||
|             } | ||||
|         }, | ||||
|         // minimumActiveTabWidth: 70, | ||||
|         collapsible: true | ||||
|         // scrollable: true | ||||
|     }); | ||||
|  | ||||
|     var knownTabs = { | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     function addTab(title,content,closeable,visible) { | ||||
|         var options; | ||||
|         if (typeof title === "string") { | ||||
|             // TODO: legacy support in case anyone uses this... | ||||
|             options = { | ||||
|                 id: content.id, | ||||
|                 label: title, | ||||
|                 name: title, | ||||
|                 content: content, | ||||
|                 closeable: closeable, | ||||
|                 visible: visible | ||||
|             } | ||||
|         } else if (typeof title === "object") { | ||||
|             options = title; | ||||
|         } | ||||
|  | ||||
|         delete options.closeable; | ||||
|  | ||||
|         options.wrapper = $('<div>',{style:"height:100%"}).appendTo("#sidebar-content") | ||||
|         options.wrapper.append(options.content); | ||||
|         options.wrapper.hide(); | ||||
|  | ||||
|         if (!options.enableOnEdit) { | ||||
|             options.shade = $('<div>',{class:"sidebar-shade hide"}).appendTo(options.wrapper); | ||||
|         } | ||||
|  | ||||
|         if (options.toolbar) { | ||||
|             $("#sidebar-footer").append(options.toolbar); | ||||
|             $(options.toolbar).hide(); | ||||
|         } | ||||
|         var id = options.id; | ||||
|  | ||||
|         RED.menu.addItem("menu-item-view-menu",{ | ||||
|             id:"menu-item-view-menu-"+options.id, | ||||
|             label:options.name, | ||||
|             onselect:function() { | ||||
|                 showSidebar(options.id); | ||||
|             }, | ||||
|             group: "sidebar-tabs" | ||||
|         }); | ||||
|  | ||||
|         options.iconClass = options.iconClass || "fa fa-square-o" | ||||
|  | ||||
|         knownTabs[options.id] = options; | ||||
|  | ||||
|         if (options.visible !== false) { | ||||
|             sidebar_tabs.addTab(knownTabs[options.id]); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function removeTab(id) { | ||||
|         sidebar_tabs.removeTab(id); | ||||
|         $(knownTabs[id].wrapper).remove(); | ||||
|         if (knownTabs[id].footer) { | ||||
|             knownTabs[id].footer.remove(); | ||||
|         } | ||||
|         delete knownTabs[id]; | ||||
|         RED.menu.removeItem("menu-item-view-menu-"+id); | ||||
|     } | ||||
|  | ||||
|     var sidebarSeparator =  {}; | ||||
|     $("#sidebar-separator").draggable({ | ||||
|             axis: "x", | ||||
|             start:function(event,ui) { | ||||
|                 sidebarSeparator.closing = false; | ||||
|                 sidebarSeparator.opening = false; | ||||
|                 var winWidth = $(window).width(); | ||||
|                 sidebarSeparator.start = ui.position.left; | ||||
|                 sidebarSeparator.chartWidth = $("#workspace").width(); | ||||
|                 sidebarSeparator.chartRight = winWidth-$("#workspace").width()-$("#workspace").offset().left-2; | ||||
|  | ||||
|                 if (!RED.menu.isSelected("menu-item-sidebar")) { | ||||
|                     sidebarSeparator.opening = true; | ||||
|                     var newChartRight = 7; | ||||
|                     $("#sidebar").addClass("closing"); | ||||
|                     $("#workspace").css("right",newChartRight); | ||||
|                     $("#editor-stack").css("right",newChartRight+1); | ||||
|                     $("#sidebar").width(0); | ||||
|                     RED.menu.setSelected("menu-item-sidebar",true); | ||||
|                     RED.events.emit("sidebar:resize"); | ||||
|                 } | ||||
|                 sidebarSeparator.width = $("#sidebar").width(); | ||||
|             }, | ||||
|             drag: function(event,ui) { | ||||
|                 var d = ui.position.left-sidebarSeparator.start; | ||||
|                 var newSidebarWidth = sidebarSeparator.width-d; | ||||
|                 if (sidebarSeparator.opening) { | ||||
|                     newSidebarWidth -= 3; | ||||
|                 } | ||||
|  | ||||
|                 if (newSidebarWidth > 150) { | ||||
|                     if (sidebarSeparator.chartWidth+d < 200) { | ||||
|                         ui.position.left = 200+sidebarSeparator.start-sidebarSeparator.chartWidth; | ||||
|                         d = ui.position.left-sidebarSeparator.start; | ||||
|                         newSidebarWidth = sidebarSeparator.width-d; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (newSidebarWidth < 150) { | ||||
|                     if (!sidebarSeparator.closing) { | ||||
|                         $("#sidebar").addClass("closing"); | ||||
|                         sidebarSeparator.closing = true; | ||||
|                     } | ||||
|                     if (!sidebarSeparator.opening) { | ||||
|                         newSidebarWidth = 150; | ||||
|                         ui.position.left = sidebarSeparator.width-(150 - sidebarSeparator.start); | ||||
|                         d = ui.position.left-sidebarSeparator.start; | ||||
|                     } | ||||
|                 } else if (newSidebarWidth > 150 && (sidebarSeparator.closing || sidebarSeparator.opening)) { | ||||
|                     sidebarSeparator.closing = false; | ||||
|                     $("#sidebar").removeClass("closing"); | ||||
|                 } | ||||
|  | ||||
|                 var newChartRight = sidebarSeparator.chartRight-d; | ||||
|                 $("#workspace").css("right",newChartRight); | ||||
|                 $("#editor-stack").css("right",newChartRight+1); | ||||
|                 $("#sidebar").width(newSidebarWidth); | ||||
|  | ||||
|                 sidebar_tabs.resize(); | ||||
|                 RED.events.emit("sidebar:resize"); | ||||
|             }, | ||||
|             stop:function(event,ui) { | ||||
|                 if (sidebarSeparator.closing) { | ||||
|                     $("#sidebar").removeClass("closing"); | ||||
|                     RED.menu.setSelected("menu-item-sidebar",false); | ||||
|                     if ($("#sidebar").width() < 180) { | ||||
|                         $("#sidebar").width(180); | ||||
|                         $("#workspace").css("right",187); | ||||
|                         $("#editor-stack").css("right",188); | ||||
|                     } | ||||
|                 } | ||||
|                 $("#sidebar-separator").css("left","auto"); | ||||
|                 $("#sidebar-separator").css("right",($("#sidebar").width()+2)+"px"); | ||||
|                 RED.events.emit("sidebar:resize"); | ||||
|             } | ||||
|     }); | ||||
|  | ||||
|     function toggleSidebar(state) { | ||||
|         if (!state) { | ||||
|             $("#main-container").addClass("sidebar-closed"); | ||||
|         } else { | ||||
|             $("#main-container").removeClass("sidebar-closed"); | ||||
|             sidebar_tabs.resize(); | ||||
|         } | ||||
|         RED.events.emit("sidebar:resize"); | ||||
|     } | ||||
|  | ||||
|     function showSidebar(id) { | ||||
|         if (id) { | ||||
|             if (!containsTab(id)) { | ||||
|                 sidebar_tabs.addTab(knownTabs[id]); | ||||
|             } | ||||
|             sidebar_tabs.activateTab(id); | ||||
|             if (!RED.menu.isSelected("menu-item-sidebar")) { | ||||
|                 RED.menu.setSelected("menu-item-sidebar",true); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function containsTab(id) { | ||||
|         return sidebar_tabs.contains(id); | ||||
|     } | ||||
|  | ||||
|     function init () { | ||||
|         RED.actions.add("core:toggle-sidebar",function(state){ | ||||
|             if (state === undefined) { | ||||
|                 RED.menu.toggleSelected("menu-item-sidebar"); | ||||
|             } else { | ||||
|                 toggleSidebar(state); | ||||
|             } | ||||
|         }); | ||||
|         showSidebar(); | ||||
|         RED.sidebar.info.init(); | ||||
|         RED.sidebar.config.init(); | ||||
|         RED.sidebar.context.init(); | ||||
|         // hide info bar at start if screen rather narrow... | ||||
|         if ($(window).width() < 600) { RED.menu.setSelected("menu-item-sidebar",false); } | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         init: init, | ||||
|         addTab: addTab, | ||||
|         removeTab: removeTab, | ||||
|         show: showSidebar, | ||||
|         containsTab: containsTab, | ||||
|         toggleSidebar: toggleSidebar, | ||||
|     } | ||||
|  | ||||
| })(); | ||||
| @@ -1,631 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| RED.subflow = (function() { | ||||
|  | ||||
|  | ||||
|     function getSubflow() { | ||||
|         return RED.nodes.subflow(RED.workspaces.active()); | ||||
|     } | ||||
|  | ||||
|     function findAvailableSubflowIOPosition(subflow,isInput) { | ||||
|         var pos = {x:50,y:30}; | ||||
|         if (!isInput) { | ||||
|             pos.x += 110; | ||||
|         } | ||||
|         for (var i=0;i<subflow.out.length+subflow.in.length;i++) { | ||||
|             var port; | ||||
|             if (i < subflow.out.length) { | ||||
|                 port = subflow.out[i]; | ||||
|             } else { | ||||
|                 port = subflow.in[i-subflow.out.length]; | ||||
|             } | ||||
|             if (port.x == pos.x && port.y == pos.y) { | ||||
|                 pos.x += 55; | ||||
|                 i=0; | ||||
|             } | ||||
|         } | ||||
|         return pos; | ||||
|     } | ||||
|  | ||||
|     function addSubflowInput() { | ||||
|         var subflow = RED.nodes.subflow(RED.workspaces.active()); | ||||
|         if (subflow.in.length === 1) { | ||||
|             return; | ||||
|         } | ||||
|         var position = findAvailableSubflowIOPosition(subflow,true); | ||||
|         var newInput = { | ||||
|             type:"subflow", | ||||
|             direction:"in", | ||||
|             z:subflow.id, | ||||
|             i:subflow.in.length, | ||||
|             x:position.x, | ||||
|             y:position.y, | ||||
|             id:RED.nodes.id() | ||||
|         }; | ||||
|         var oldInCount = subflow.in.length; | ||||
|         subflow.in.push(newInput); | ||||
|         subflow.dirty = true; | ||||
|         var wasDirty = RED.nodes.dirty(); | ||||
|         var wasChanged = subflow.changed; | ||||
|         subflow.changed = true; | ||||
|         var result = refresh(true); | ||||
|         var historyEvent = { | ||||
|             t:'edit', | ||||
|             node:subflow, | ||||
|             dirty:wasDirty, | ||||
|             changed:wasChanged, | ||||
|             subflow: { | ||||
|                 inputCount: oldInCount, | ||||
|                 instances: result.instances | ||||
|             } | ||||
|         }; | ||||
|         RED.history.push(historyEvent); | ||||
|         RED.view.select(); | ||||
|         RED.nodes.dirty(true); | ||||
|         RED.view.redraw(); | ||||
|         $("#workspace-subflow-input-add").addClass("active"); | ||||
|         $("#workspace-subflow-input-remove").removeClass("active"); | ||||
|     } | ||||
|  | ||||
|     function removeSubflowInput() { | ||||
|         var activeSubflow = RED.nodes.subflow(RED.workspaces.active()); | ||||
|         if (activeSubflow.in.length === 0) { | ||||
|             return; | ||||
|         } | ||||
|         var removedInput = activeSubflow.in[0]; | ||||
|         var removedInputLinks = []; | ||||
|         RED.nodes.eachLink(function(l) { | ||||
|             if (l.source.type == "subflow" && l.source.z == activeSubflow.id && l.source.i == removedInput.i) { | ||||
|                 removedInputLinks.push(l); | ||||
|             } else if (l.target.type == "subflow:"+activeSubflow.id) { | ||||
|                 removedInputLinks.push(l); | ||||
|             } | ||||
|         }); | ||||
|         removedInputLinks.forEach(function(l) { RED.nodes.removeLink(l)}); | ||||
|         activeSubflow.in = []; | ||||
|         $("#workspace-subflow-input-add").removeClass("active"); | ||||
|         $("#workspace-subflow-input-remove").addClass("active"); | ||||
|         activeSubflow.changed = true; | ||||
|         return {subflowInputs: [ removedInput ], links:removedInputLinks}; | ||||
|     } | ||||
|  | ||||
|     function addSubflowOutput(id) { | ||||
|         var subflow = RED.nodes.subflow(RED.workspaces.active()); | ||||
|         var position = findAvailableSubflowIOPosition(subflow,false); | ||||
|  | ||||
|         var newOutput = { | ||||
|             type:"subflow", | ||||
|             direction:"out", | ||||
|             z:subflow.id, | ||||
|             i:subflow.out.length, | ||||
|             x:position.x, | ||||
|             y:position.y, | ||||
|             id:RED.nodes.id() | ||||
|         }; | ||||
|         var oldOutCount = subflow.out.length; | ||||
|         subflow.out.push(newOutput); | ||||
|         subflow.dirty = true; | ||||
|         var wasDirty = RED.nodes.dirty(); | ||||
|         var wasChanged = subflow.changed; | ||||
|         subflow.changed = true; | ||||
|  | ||||
|         var result = refresh(true); | ||||
|  | ||||
|         var historyEvent = { | ||||
|             t:'edit', | ||||
|             node:subflow, | ||||
|             dirty:wasDirty, | ||||
|             changed:wasChanged, | ||||
|             subflow: { | ||||
|                 outputCount: oldOutCount, | ||||
|                 instances: result.instances | ||||
|             } | ||||
|         }; | ||||
|         RED.history.push(historyEvent); | ||||
|         RED.view.select(); | ||||
|         RED.nodes.dirty(true); | ||||
|         RED.view.redraw(); | ||||
|         $("#workspace-subflow-output .spinner-value").text(subflow.out.length); | ||||
|     } | ||||
|  | ||||
|     function removeSubflowOutput(removedSubflowOutputs) { | ||||
|         var activeSubflow = RED.nodes.subflow(RED.workspaces.active()); | ||||
|         if (activeSubflow.out.length === 0) { | ||||
|             return; | ||||
|         } | ||||
|         if (typeof removedSubflowOutputs === "undefined") { | ||||
|             removedSubflowOutputs = [activeSubflow.out[activeSubflow.out.length-1]]; | ||||
|         } | ||||
|         var removedLinks = []; | ||||
|         removedSubflowOutputs.sort(function(a,b) { return b.i-a.i}); | ||||
|         for (i=0;i<removedSubflowOutputs.length;i++) { | ||||
|             var output = removedSubflowOutputs[i]; | ||||
|             activeSubflow.out.splice(output.i,1); | ||||
|             var subflowRemovedLinks = []; | ||||
|             var subflowMovedLinks = []; | ||||
|             RED.nodes.eachLink(function(l) { | ||||
|                 if (l.target.type == "subflow" && l.target.z == activeSubflow.id && l.target.i == output.i) { | ||||
|                     subflowRemovedLinks.push(l); | ||||
|                 } | ||||
|                 if (l.source.type == "subflow:"+activeSubflow.id) { | ||||
|                     if (l.sourcePort == output.i) { | ||||
|                         subflowRemovedLinks.push(l); | ||||
|                     } else if (l.sourcePort > output.i) { | ||||
|                         subflowMovedLinks.push(l); | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|             subflowRemovedLinks.forEach(function(l) { RED.nodes.removeLink(l)}); | ||||
|             subflowMovedLinks.forEach(function(l) { l.sourcePort--; }); | ||||
|  | ||||
|             removedLinks = removedLinks.concat(subflowRemovedLinks); | ||||
|             for (var j=output.i;j<activeSubflow.out.length;j++) { | ||||
|                 activeSubflow.out[j].i--; | ||||
|                 activeSubflow.out[j].dirty = true; | ||||
|             } | ||||
|         } | ||||
|         activeSubflow.changed = true; | ||||
|  | ||||
|         return {subflowOutputs: removedSubflowOutputs, links: removedLinks} | ||||
|     } | ||||
|  | ||||
|     function refresh(markChange) { | ||||
|         var activeSubflow = RED.nodes.subflow(RED.workspaces.active()); | ||||
|         refreshToolbar(activeSubflow); | ||||
|         var subflowInstances = []; | ||||
|         if (activeSubflow) { | ||||
|             RED.nodes.filterNodes({type:"subflow:"+activeSubflow.id}).forEach(function(n) { | ||||
|                 subflowInstances.push({ | ||||
|                     id: n.id, | ||||
|                     changed: n.changed | ||||
|                 }); | ||||
|                 if (markChange) { | ||||
|                     n.changed = true; | ||||
|                 } | ||||
|                 n.inputs = activeSubflow.in.length; | ||||
|                 n.outputs = activeSubflow.out.length; | ||||
|                 while (n.outputs < n.ports.length) { | ||||
|                     n.ports.pop(); | ||||
|                 } | ||||
|                 n.resize = true; | ||||
|                 n.dirty = true; | ||||
|                 RED.editor.updateNodeProperties(n); | ||||
|             }); | ||||
|             RED.editor.validateNode(activeSubflow); | ||||
|             return { | ||||
|                 instances: subflowInstances | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     function refreshToolbar(activeSubflow) { | ||||
|         if (activeSubflow) { | ||||
|             $("#workspace-subflow-input-add").toggleClass("active", activeSubflow.in.length !== 0); | ||||
|             $("#workspace-subflow-input-remove").toggleClass("active",activeSubflow.in.length === 0); | ||||
|  | ||||
|             $("#workspace-subflow-output .spinner-value").text(activeSubflow.out.length); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function showWorkspaceToolbar(activeSubflow) { | ||||
|         var toolbar = $("#workspace-toolbar"); | ||||
|         toolbar.empty(); | ||||
|  | ||||
|         $('<a class="button" id="workspace-subflow-edit" href="#" data-i18n="[append]subflow.editSubflowProperties"><i class="fa fa-pencil"></i> </a>').appendTo(toolbar); | ||||
|         $('<span style="margin-left: 5px;" data-i18n="subflow.input"></span> '+ | ||||
|             '<div style="display: inline-block;" class="button-group">'+ | ||||
|             '<a id="workspace-subflow-input-remove" class="button active" href="#">0</a>'+ | ||||
|             '<a id="workspace-subflow-input-add" class="button" href="#">1</a>'+ | ||||
|             '</div>').appendTo(toolbar); | ||||
|  | ||||
|         $('<span style="margin-left: 5px;" data-i18n="subflow.output"></span> <div id="workspace-subflow-output" style="display: inline-block;" class="button-group spinner-group">'+ | ||||
|             '<a id="workspace-subflow-output-remove" class="button" href="#"><i class="fa fa-minus"></i></a>'+ | ||||
|             '<div class="spinner-value">3</div>'+ | ||||
|             '<a id="workspace-subflow-output-add" class="button" href="#"><i class="fa fa-plus"></i></a>'+ | ||||
|             '</div>').appendTo(toolbar); | ||||
|  | ||||
|         // $('<a class="button disabled" id="workspace-subflow-add-input" href="#" data-i18n="[append]subflow.input"><i class="fa fa-plus"></i> </a>').appendTo(toolbar); | ||||
|         // $('<a class="button" id="workspace-subflow-add-output" href="#" data-i18n="[append]subflow.output"><i class="fa fa-plus"></i> </a>').appendTo(toolbar); | ||||
|         $('<a class="button" id="workspace-subflow-delete" href="#" data-i18n="[append]subflow.deleteSubflow"><i class="fa fa-trash"></i> </a>').appendTo(toolbar); | ||||
|         toolbar.i18n(); | ||||
|  | ||||
|  | ||||
|         $("#workspace-subflow-output-remove").click(function(event) { | ||||
|             event.preventDefault(); | ||||
|             var wasDirty = RED.nodes.dirty(); | ||||
|             var wasChanged = activeSubflow.changed; | ||||
|             var result = removeSubflowOutput(); | ||||
|             if (result) { | ||||
|                 var inst = refresh(true); | ||||
|                 RED.history.push({ | ||||
|                     t:'delete', | ||||
|                     links:result.links, | ||||
|                     subflowOutputs: result.subflowOutputs, | ||||
|                     changed: wasChanged, | ||||
|                     dirty:wasDirty, | ||||
|                     subflow: { | ||||
|                         instances: inst.instances | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|                 RED.view.select(); | ||||
|                 RED.nodes.dirty(true); | ||||
|                 RED.view.redraw(true); | ||||
|             } | ||||
|         }); | ||||
|         $("#workspace-subflow-output-add").click(function(event) { | ||||
|             event.preventDefault(); | ||||
|             addSubflowOutput(); | ||||
|         }); | ||||
|  | ||||
|         $("#workspace-subflow-input-add").click(function(event) { | ||||
|             event.preventDefault(); | ||||
|             addSubflowInput(); | ||||
|         }); | ||||
|         $("#workspace-subflow-input-remove").click(function(event) { | ||||
|             event.preventDefault(); | ||||
|             var wasDirty = RED.nodes.dirty(); | ||||
|             var wasChanged = activeSubflow.changed; | ||||
|             activeSubflow.changed = true; | ||||
|             var result = removeSubflowInput(); | ||||
|             if (result) { | ||||
|                 var inst = refresh(true); | ||||
|                 RED.history.push({ | ||||
|                     t:'delete', | ||||
|                     links:result.links, | ||||
|                     changed: wasChanged, | ||||
|                     subflowInputs: result.subflowInputs, | ||||
|                     dirty:wasDirty, | ||||
|                     subflow: { | ||||
|                         instances: inst.instances | ||||
|                     } | ||||
|                 }); | ||||
|                 RED.view.select(); | ||||
|                 RED.nodes.dirty(true); | ||||
|                 RED.view.redraw(true); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         $("#workspace-subflow-edit").click(function(event) { | ||||
|             RED.editor.editSubflow(RED.nodes.subflow(RED.workspaces.active())); | ||||
|             event.preventDefault(); | ||||
|         }); | ||||
|  | ||||
|         $("#workspace-subflow-delete").click(function(event) { | ||||
|             event.preventDefault(); | ||||
|             var startDirty = RED.nodes.dirty(); | ||||
|             var historyEvent = removeSubflow(RED.workspaces.active()); | ||||
|             historyEvent.t = 'delete'; | ||||
|             historyEvent.dirty = startDirty; | ||||
|  | ||||
|             RED.history.push(historyEvent); | ||||
|  | ||||
|         }); | ||||
|  | ||||
|         refreshToolbar(activeSubflow); | ||||
|  | ||||
|         $("#chart").css({"margin-top": "40px"}); | ||||
|         $("#workspace-toolbar").show(); | ||||
|     } | ||||
|     function hideWorkspaceToolbar() { | ||||
|         $("#workspace-toolbar").hide().empty(); | ||||
|         $("#chart").css({"margin-top": "0"}); | ||||
|     } | ||||
|  | ||||
|     function removeSubflow(id) { | ||||
|         var removedNodes = []; | ||||
|         var removedLinks = []; | ||||
|  | ||||
|         var activeSubflow = RED.nodes.subflow(id); | ||||
|  | ||||
|         RED.nodes.eachNode(function(n) { | ||||
|             if (n.type == "subflow:"+activeSubflow.id) { | ||||
|                 removedNodes.push(n); | ||||
|             } | ||||
|             if (n.z == activeSubflow.id) { | ||||
|                 removedNodes.push(n); | ||||
|             } | ||||
|         }); | ||||
|         RED.nodes.eachConfig(function(n) { | ||||
|             if (n.z == activeSubflow.id) { | ||||
|                 removedNodes.push(n); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         var removedConfigNodes = []; | ||||
|         for (var i=0;i<removedNodes.length;i++) { | ||||
|             var removedEntities = RED.nodes.remove(removedNodes[i].id); | ||||
|             removedLinks = removedLinks.concat(removedEntities.links); | ||||
|             removedConfigNodes = removedConfigNodes.concat(removedEntities.nodes); | ||||
|         } | ||||
|         // TODO: this whole delete logic should be in RED.nodes.removeSubflow.. | ||||
|         removedNodes = removedNodes.concat(removedConfigNodes); | ||||
|  | ||||
|         RED.nodes.removeSubflow(activeSubflow); | ||||
|         RED.workspaces.remove(activeSubflow); | ||||
|         RED.nodes.dirty(true); | ||||
|         RED.view.redraw(); | ||||
|  | ||||
|         return { | ||||
|             nodes:removedNodes, | ||||
|             links:removedLinks, | ||||
|             subflow: { | ||||
|                 subflow: activeSubflow | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     function init() { | ||||
|         RED.events.on("workspace:change",function(event) { | ||||
|             var activeSubflow = RED.nodes.subflow(event.workspace); | ||||
|             if (activeSubflow) { | ||||
|                 showWorkspaceToolbar(activeSubflow); | ||||
|             } else { | ||||
|                 hideWorkspaceToolbar(); | ||||
|             } | ||||
|         }); | ||||
|         RED.events.on("view:selection-changed",function(selection) { | ||||
|             if (!selection.nodes) { | ||||
|                 RED.menu.setDisabled("menu-item-subflow-convert",true); | ||||
|             } else { | ||||
|                 RED.menu.setDisabled("menu-item-subflow-convert",false); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         RED.actions.add("core:create-subflow",createSubflow); | ||||
|         RED.actions.add("core:convert-to-subflow",convertToSubflow); | ||||
|     } | ||||
|  | ||||
|     function createSubflow() { | ||||
|         var lastIndex = 0; | ||||
|         RED.nodes.eachSubflow(function(sf) { | ||||
|            var m = (new RegExp("^Subflow (\\d+)$")).exec(sf.name); | ||||
|            if (m) { | ||||
|                lastIndex = Math.max(lastIndex,m[1]); | ||||
|            } | ||||
|         }); | ||||
|  | ||||
|         var name = "Subflow "+(lastIndex+1); | ||||
|  | ||||
|         var subflowId = RED.nodes.id(); | ||||
|         var subflow = { | ||||
|             type:"subflow", | ||||
|             id:subflowId, | ||||
|             name:name, | ||||
|             info:"", | ||||
|             in: [], | ||||
|             out: [] | ||||
|         }; | ||||
|         RED.nodes.addSubflow(subflow); | ||||
|         RED.history.push({ | ||||
|             t:'createSubflow', | ||||
|             subflow: { | ||||
|                 subflow:subflow | ||||
|             }, | ||||
|             dirty:RED.nodes.dirty() | ||||
|         }); | ||||
|         RED.workspaces.show(subflowId); | ||||
|         RED.nodes.dirty(true); | ||||
|     } | ||||
|  | ||||
|     function convertToSubflow() { | ||||
|         var selection = RED.view.selection(); | ||||
|         if (!selection.nodes) { | ||||
|             RED.notify(RED._("subflow.errors.noNodesSelected"),"error"); | ||||
|             return; | ||||
|         } | ||||
|         var i,n; | ||||
|         var nodes = {}; | ||||
|         var new_links = []; | ||||
|         var removedLinks = []; | ||||
|  | ||||
|         var candidateInputs = []; | ||||
|         var candidateOutputs = []; | ||||
|         var candidateInputNodes = {}; | ||||
|  | ||||
|  | ||||
|         var boundingBox = [selection.nodes[0].x, | ||||
|             selection.nodes[0].y, | ||||
|             selection.nodes[0].x, | ||||
|             selection.nodes[0].y]; | ||||
|  | ||||
|         for (i=0;i<selection.nodes.length;i++) { | ||||
|             n = selection.nodes[i]; | ||||
|             nodes[n.id] = {n:n,outputs:{}}; | ||||
|             boundingBox = [ | ||||
|                 Math.min(boundingBox[0],n.x), | ||||
|                 Math.min(boundingBox[1],n.y), | ||||
|                 Math.max(boundingBox[2],n.x), | ||||
|                 Math.max(boundingBox[3],n.y) | ||||
|             ] | ||||
|         } | ||||
|  | ||||
|         var center = [(boundingBox[2]+boundingBox[0]) / 2,(boundingBox[3]+boundingBox[1]) / 2]; | ||||
|  | ||||
|         RED.nodes.eachLink(function(link) { | ||||
|             if (nodes[link.source.id] && nodes[link.target.id]) { | ||||
|                 // A link wholely within the selection | ||||
|             } | ||||
|  | ||||
|             if (nodes[link.source.id] && !nodes[link.target.id]) { | ||||
|                 // An outbound link from the selection | ||||
|                 candidateOutputs.push(link); | ||||
|                 removedLinks.push(link); | ||||
|             } | ||||
|             if (!nodes[link.source.id] && nodes[link.target.id]) { | ||||
|                 // An inbound link | ||||
|                 candidateInputs.push(link); | ||||
|                 candidateInputNodes[link.target.id] = link.target; | ||||
|                 removedLinks.push(link); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         var outputs = {}; | ||||
|         candidateOutputs = candidateOutputs.filter(function(v) { | ||||
|              if (outputs[v.source.id+":"+v.sourcePort]) { | ||||
|                  outputs[v.source.id+":"+v.sourcePort].targets.push(v.target); | ||||
|                  return false; | ||||
|              } | ||||
|              v.targets = []; | ||||
|              v.targets.push(v.target); | ||||
|              outputs[v.source.id+":"+v.sourcePort] = v; | ||||
|              return true; | ||||
|         }); | ||||
|         candidateOutputs.sort(function(a,b) { return a.source.y-b.source.y}); | ||||
|  | ||||
|         if (Object.keys(candidateInputNodes).length > 1) { | ||||
|              RED.notify(RED._("subflow.errors.multipleInputsToSelection"),"error"); | ||||
|              return; | ||||
|         } | ||||
|  | ||||
|         var lastIndex = 0; | ||||
|         RED.nodes.eachSubflow(function(sf) { | ||||
|            var m = (new RegExp("^Subflow (\\d+)$")).exec(sf.name); | ||||
|            if (m) { | ||||
|                lastIndex = Math.max(lastIndex,m[1]); | ||||
|            } | ||||
|         }); | ||||
|  | ||||
|         var name = "Subflow "+(lastIndex+1); | ||||
|  | ||||
|         var subflowId = RED.nodes.id(); | ||||
|         var subflow = { | ||||
|             type:"subflow", | ||||
|             id:subflowId, | ||||
|             name:name, | ||||
|             info:"", | ||||
|             in: Object.keys(candidateInputNodes).map(function(v,i) { var index = i; return { | ||||
|                 type:"subflow", | ||||
|                 direction:"in", | ||||
|                 x:candidateInputNodes[v].x-(candidateInputNodes[v].w/2)-80, | ||||
|                 y:candidateInputNodes[v].y, | ||||
|                 z:subflowId, | ||||
|                 i:index, | ||||
|                 id:RED.nodes.id(), | ||||
|                 wires:[{id:candidateInputNodes[v].id}] | ||||
|             }}), | ||||
|             out: candidateOutputs.map(function(v,i) { var index = i; return { | ||||
|                 type:"subflow", | ||||
|                 direction:"in", | ||||
|                 x:v.source.x+(v.source.w/2)+80, | ||||
|                 y:v.source.y, | ||||
|                 z:subflowId, | ||||
|                 i:index, | ||||
|                 id:RED.nodes.id(), | ||||
|                 wires:[{id:v.source.id,port:v.sourcePort}] | ||||
|             }}) | ||||
|         }; | ||||
|  | ||||
|         RED.nodes.addSubflow(subflow); | ||||
|  | ||||
|         var subflowInstance = { | ||||
|             id:RED.nodes.id(), | ||||
|             type:"subflow:"+subflow.id, | ||||
|             x: center[0], | ||||
|             y: center[1], | ||||
|             z: RED.workspaces.active(), | ||||
|             inputs: subflow.in.length, | ||||
|             outputs: subflow.out.length, | ||||
|             h: Math.max(30/*node_height*/,(subflow.out.length||0) * 15), | ||||
|             changed:true | ||||
|         } | ||||
|         subflowInstance._def = RED.nodes.getType(subflowInstance.type); | ||||
|         RED.editor.validateNode(subflowInstance); | ||||
|         RED.nodes.add(subflowInstance); | ||||
|  | ||||
|         candidateInputs.forEach(function(l) { | ||||
|             var link = {source:l.source, sourcePort:l.sourcePort, target: subflowInstance}; | ||||
|             new_links.push(link); | ||||
|             RED.nodes.addLink(link); | ||||
|         }); | ||||
|  | ||||
|         candidateOutputs.forEach(function(output,i) { | ||||
|             output.targets.forEach(function(target) { | ||||
|                 var link = {source:subflowInstance, sourcePort:i, target: target}; | ||||
|                 new_links.push(link); | ||||
|                 RED.nodes.addLink(link); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         subflow.in.forEach(function(input) { | ||||
|             input.wires.forEach(function(wire) { | ||||
|                 var link = {source: input, sourcePort: 0, target: RED.nodes.node(wire.id) } | ||||
|                 new_links.push(link); | ||||
|                 RED.nodes.addLink(link); | ||||
|             }); | ||||
|         }); | ||||
|         subflow.out.forEach(function(output,i) { | ||||
|             output.wires.forEach(function(wire) { | ||||
|                 var link = {source: RED.nodes.node(wire.id), sourcePort: wire.port , target: output } | ||||
|                 new_links.push(link); | ||||
|                 RED.nodes.addLink(link); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         for (i=0;i<removedLinks.length;i++) { | ||||
|             RED.nodes.removeLink(removedLinks[i]); | ||||
|         } | ||||
|  | ||||
|         for (i=0;i<selection.nodes.length;i++) { | ||||
|             n = selection.nodes[i]; | ||||
|             if (/^link /.test(n.type)) { | ||||
|                 n.links = n.links.filter(function(id) { | ||||
|                     var isLocalLink = nodes.hasOwnProperty(id); | ||||
|                     if (!isLocalLink) { | ||||
|                         var otherNode = RED.nodes.node(id); | ||||
|                         if (otherNode && otherNode.links) { | ||||
|                             var i = otherNode.links.indexOf(n.id); | ||||
|                             if (i > -1) { | ||||
|                                 otherNode.links.splice(i,1); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     return isLocalLink; | ||||
|                 }); | ||||
|             } | ||||
|             n.z = subflow.id; | ||||
|         } | ||||
|  | ||||
|         RED.history.push({ | ||||
|             t:'createSubflow', | ||||
|             nodes:[subflowInstance.id], | ||||
|             links:new_links, | ||||
|             subflow: { | ||||
|                 subflow: subflow | ||||
|             }, | ||||
|  | ||||
|             activeWorkspace: RED.workspaces.active(), | ||||
|             removedLinks: removedLinks, | ||||
|  | ||||
|             dirty:RED.nodes.dirty() | ||||
|         }); | ||||
|         RED.view.select(null); | ||||
|         RED.editor.validateNode(subflow); | ||||
|         RED.nodes.dirty(true); | ||||
|         RED.view.redraw(true); | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     return { | ||||
|         init: init, | ||||
|         createSubflow: createSubflow, | ||||
|         convertToSubflow: convertToSubflow, | ||||
|         removeSubflow: removeSubflow, | ||||
|         refresh: refresh, | ||||
|         removeInput: removeSubflowInput, | ||||
|         removeOutput: removeSubflowOutput | ||||
|     } | ||||
| })(); | ||||
| @@ -1,292 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.sidebar.context = (function() { | ||||
|  | ||||
|     var content; | ||||
|     var sections; | ||||
|  | ||||
|     var localCache = {}; | ||||
|  | ||||
|  | ||||
|     var nodeSection; | ||||
|     // var subflowSection; | ||||
|     var flowSection; | ||||
|     var globalSection; | ||||
|  | ||||
|     var currentNode; | ||||
|     var currentFlow; | ||||
|  | ||||
|     function init() { | ||||
|  | ||||
|         content = $("<div>").css({"position":"relative","height":"100%"}); | ||||
|         content.className = "sidebar-context" | ||||
|         // var toolbar = $('<div class="sidebar-header">'+ | ||||
|         //     '</div>').appendTo(content); | ||||
|  | ||||
|         var footerToolbar = $('<div>'+ | ||||
|             // '<span class="button-group"><a class="sidebar-footer-button" href="#" data-i18n="[title]node-red:debug.sidebar.openWindow"><i class="fa fa-desktop"></i></a></span> ' + | ||||
|             '</div>'); | ||||
|  | ||||
|  | ||||
|  | ||||
|         var stackContainer = $("<div>",{class:"sidebar-context-stack"}).appendTo(content); | ||||
|         sections = RED.stack.create({ | ||||
|             container: stackContainer | ||||
|         }); | ||||
|  | ||||
|         nodeSection = sections.add({ | ||||
|             title: RED._("sidebar.context.node"), | ||||
|             collapsible: true, | ||||
|             // onexpand: function() { | ||||
|             //     updateNode(currentNode,true); | ||||
|             // } | ||||
|         }); | ||||
|         nodeSection.expand(); | ||||
|         nodeSection.content.css({height:"100%"}); | ||||
|         nodeSection.timestamp = $('<div class="sidebar-context-updated"> </div>').appendTo(nodeSection.content); | ||||
|         var table = $('<table class="node-info"></table>').appendTo(nodeSection.content); | ||||
|         nodeSection.table = $('<tbody>').appendTo(table); | ||||
|         var bg = $('<div style="float: right"></div>').appendTo(nodeSection.header); | ||||
|         $('<button class="editor-button editor-button-small"><i class="fa fa-refresh"></i></button>') | ||||
|             .appendTo(bg) | ||||
|             .click(function(evt) { | ||||
|                 evt.stopPropagation(); | ||||
|                 evt.preventDefault(); | ||||
|                 updateNode(currentNode, true); | ||||
|             }) | ||||
|  | ||||
|         // subflowSection  = sections.add({ | ||||
|         //     title: "Subflow", | ||||
|         //     collapsible: true | ||||
|         // }); | ||||
|         // subflowSection.expand(); | ||||
|         // subflowSection.content.css({height:"100%"}); | ||||
|         // bg = $('<div style="float: right"></div>').appendTo(subflowSection.header); | ||||
|         // $('<button class="editor-button editor-button-small"><i class="fa fa-refresh"></i></button>') | ||||
|         //     .appendTo(bg) | ||||
|         //     .click(function(evt) { | ||||
|         //         evt.stopPropagation(); | ||||
|         //         evt.preventDefault(); | ||||
|         //     }) | ||||
|         // | ||||
|         // subflowSection.container.hide(); | ||||
|  | ||||
|         flowSection = sections.add({ | ||||
|             title: RED._("sidebar.context.flow"), | ||||
|             collapsible: true | ||||
|         }); | ||||
|         flowSection.expand(); | ||||
|         flowSection.content.css({height:"100%"}); | ||||
|         flowSection.timestamp = $('<div class="sidebar-context-updated"> </div>').appendTo(flowSection.content); | ||||
|         var table = $('<table class="node-info"></table>').appendTo(flowSection.content); | ||||
|         flowSection.table = $('<tbody>').appendTo(table); | ||||
|         bg = $('<div style="float: right"></div>').appendTo(flowSection.header); | ||||
|         $('<button class="editor-button editor-button-small"><i class="fa fa-refresh"></i></button>') | ||||
|             .appendTo(bg) | ||||
|             .click(function(evt) { | ||||
|                 evt.stopPropagation(); | ||||
|                 evt.preventDefault(); | ||||
|                 updateFlow(currentFlow); | ||||
|             }) | ||||
|  | ||||
|         globalSection = sections.add({ | ||||
|             title: RED._("sidebar.context.global"), | ||||
|             collapsible: true | ||||
|         }); | ||||
|         globalSection.expand(); | ||||
|         globalSection.content.css({height:"100%"}); | ||||
|         globalSection.timestamp = $('<div class="sidebar-context-updated"> </div>').appendTo(globalSection.content); | ||||
|         var table = $('<table class="node-info"></table>').appendTo(globalSection.content); | ||||
|         globalSection.table = $('<tbody>').appendTo(table); | ||||
|  | ||||
|         bg = $('<div style="float: right"></div>').appendTo(globalSection.header); | ||||
|         $('<button class="editor-button editor-button-small"><i class="fa fa-refresh"></i></button>') | ||||
|             .appendTo(bg) | ||||
|             .click(function(evt) { | ||||
|                 evt.stopPropagation(); | ||||
|                 evt.preventDefault(); | ||||
|                 updateEntry(globalSection,"context/global","global"); | ||||
|             }) | ||||
|  | ||||
|  | ||||
|         RED.actions.add("core:show-context-tab",show); | ||||
|  | ||||
|         RED.sidebar.addTab({ | ||||
|             id: "context", | ||||
|             label: RED._("sidebar.context.label"), | ||||
|             name: RED._("sidebar.context.name"), | ||||
|             iconClass: "fa fa-database", | ||||
|             content: content, | ||||
|             toolbar: footerToolbar, | ||||
|             // pinned: true, | ||||
|             enableOnEdit: true | ||||
|         }); | ||||
|  | ||||
|         // var toggleLiveButton = $("#sidebar-context-toggle-live"); | ||||
|         // toggleLiveButton.click(function(evt) { | ||||
|         //     evt.preventDefault(); | ||||
|         //     if ($(this).hasClass("selected")) { | ||||
|         //         $(this).removeClass("selected"); | ||||
|         //         $(this).find("i").removeClass("fa-pause"); | ||||
|         //         $(this).find("i").addClass("fa-play"); | ||||
|         //     } else { | ||||
|         //         $(this).addClass("selected"); | ||||
|         //         $(this).find("i").removeClass("fa-play"); | ||||
|         //         $(this).find("i").addClass("fa-pause"); | ||||
|         //     } | ||||
|         // }); | ||||
|         // RED.popover.tooltip(toggleLiveButton, function() { | ||||
|         //     if (toggleLiveButton.hasClass("selected")) { | ||||
|         //         return "Pause live updates" | ||||
|         //     } else { | ||||
|         //         return "Start live updates" | ||||
|         //     } | ||||
|         // }); | ||||
|  | ||||
|  | ||||
|         RED.events.on("view:selection-changed", function(event) { | ||||
|             var selectedNode = event.nodes && event.nodes.length === 1 && event.nodes[0]; | ||||
|             updateNode(selectedNode); | ||||
|         }) | ||||
|  | ||||
|         RED.events.on("workspace:change", function(event) { | ||||
|             updateFlow(RED.nodes.workspace(event.workspace)); | ||||
|         }) | ||||
|  | ||||
|         updateEntry(globalSection,"context/global","global"); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     function updateNode(node,force) { | ||||
|         currentNode = node; | ||||
|         if (force) { | ||||
|             if (node) { | ||||
|                 updateEntry(nodeSection,"context/node/"+node.id,node.id); | ||||
|                 // if (/^subflow:/.test(node.type)) { | ||||
|                 //     subflowSection.container.show(); | ||||
|                 //     updateEntry(subflowSection,"context/flow/"+node.id,node.id); | ||||
|                 // } else { | ||||
|                 //     subflowSection.container.hide(); | ||||
|                 // } | ||||
|             } else { | ||||
|                 // subflowSection.container.hide(); | ||||
|                 updateEntry(nodeSection) | ||||
|             } | ||||
|         } else { | ||||
|             $(nodeSection.table).empty(); | ||||
|             if (node) { | ||||
|                 $('<tr class="node-info-node-row red-ui-search-empty blank" colspan="2"><td data-i18n="sidebar.context.refresh"></td></tr>').appendTo(nodeSection.table).i18n(); | ||||
|             } else { | ||||
|                 $('<tr class="node-info-node-row red-ui-search-empty blank" colspan="2"><td data-i18n="sidebar.context.none"></td></tr>').appendTo(nodeSection.table).i18n(); | ||||
|             } | ||||
|             nodeSection.timestamp.html(" "); | ||||
|  | ||||
|         } | ||||
|     } | ||||
|     function updateFlow(flow) { | ||||
|         currentFlow = flow; | ||||
|         if (flow) { | ||||
|             updateEntry(flowSection,"context/flow/"+flow.id,flow.id); | ||||
|         } else { | ||||
|             updateEntry(flowSection) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function refreshEntry(section,baseUrl,id) { | ||||
|  | ||||
|         var contextStores = RED.settings.context.stores; | ||||
|         var container = section.table; | ||||
|  | ||||
|         $.getJSON(baseUrl, function(data) { | ||||
|             $(container).empty(); | ||||
|             var sortedData = {}; | ||||
|             for (var store in data) { | ||||
|                 if (data.hasOwnProperty(store)) { | ||||
|                     for (var key in data[store]) { | ||||
|                         if (data[store].hasOwnProperty(key)) { | ||||
|                             if (!sortedData.hasOwnProperty(key)) { | ||||
|                                 sortedData[key] = []; | ||||
|                             } | ||||
|                             data[store][key].store = store; | ||||
|                             sortedData[key].push(data[store][key]) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             var keys = Object.keys(sortedData); | ||||
|             keys.sort(); | ||||
|             var l = keys.length; | ||||
|             for (var i = 0; i < l; i++) { | ||||
|                 sortedData[keys[i]].forEach(function(v) { | ||||
|                     var k = keys[i]; | ||||
|                     var l2 = sortedData[k].length; | ||||
|                     var propRow = $('<tr class="node-info-node-row"><td class="sidebar-context-property"></td><td></td></tr>').appendTo(container); | ||||
|                     var obj = $(propRow.children()[0]); | ||||
|                     obj.text(k); | ||||
|                     var tools = $('<span class="debug-message-tools button-group"></span>').appendTo(obj); | ||||
|                     var refreshItem = $('<button class="editor-button editor-button-small"><i class="fa fa-refresh"></i></button>').appendTo(tools).click(function(e) { | ||||
|                         e.preventDefault(); | ||||
|                         e.stopPropagation(); | ||||
|                         $.getJSON(baseUrl+"/"+k+"?store="+v.store, function(data) { | ||||
|                             $(propRow.children()[1]).empty(); | ||||
|                             var payload = data.msg; | ||||
|                             var format = data.format; | ||||
|                             payload = RED.utils.decodeObject(payload,format); | ||||
|                             RED.utils.createObjectElement(payload, { | ||||
|                                 typeHint: data.format, | ||||
|                                 sourceId: id+"."+k | ||||
|                             }).appendTo(propRow.children()[1]); | ||||
|                         }) | ||||
|                     }); | ||||
|  | ||||
|  | ||||
|                     var payload = v.msg; | ||||
|                     var format = v.format; | ||||
|                     payload = RED.utils.decodeObject(payload,format); | ||||
|                     RED.utils.createObjectElement(payload, { | ||||
|                         typeHint: v.format, | ||||
|                         sourceId: id+"."+k | ||||
|                     }).appendTo(propRow.children()[1]); | ||||
|                     if (contextStores.length > 1) { | ||||
|                         $("<span>",{class:"sidebar-context-property-storename"}).text(v.store).appendTo($(propRow.children()[0])) | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|             if (l === 0) { | ||||
|                 $('<tr class="node-info-node-row red-ui-search-empty blank" colspan="2"><td data-i18n="sidebar.context.empty"></td></tr>').appendTo(container).i18n(); | ||||
|             } | ||||
|             $(section.timestamp).text(new Date().toLocaleString()); | ||||
|         }); | ||||
|     } | ||||
|     function updateEntry(section,baseUrl,id) { | ||||
|         var container = section.table; | ||||
|         if (id) { | ||||
|             refreshEntry(section,baseUrl,id); | ||||
|         } else { | ||||
|             $(container).empty(); | ||||
|             $('<tr class="node-info-node-row red-ui-search-empty blank" colspan="2"><td data-i18n="sidebar.context.none"></td></tr>').appendTo(container).i18n(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     function show() { | ||||
|         RED.sidebar.show("context"); | ||||
|     } | ||||
|     return { | ||||
|         init: init | ||||
|     } | ||||
| })(); | ||||
| @@ -1,447 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
| RED.sidebar.info = (function() { | ||||
|  | ||||
|     marked.setOptions({ | ||||
|         renderer: new marked.Renderer(), | ||||
|         gfm: true, | ||||
|         tables: true, | ||||
|         breaks: false, | ||||
|         pedantic: false, | ||||
|         sanitize: true, | ||||
|         smartLists: true, | ||||
|         smartypants: false | ||||
|     }); | ||||
|  | ||||
|     var content; | ||||
|     var sections; | ||||
|     var nodeSection; | ||||
|     var infoSection; | ||||
|     var tipBox; | ||||
|  | ||||
|     var expandedSections = { | ||||
|         "property": false | ||||
|     }; | ||||
|  | ||||
|     function init() { | ||||
|  | ||||
|         content = document.createElement("div"); | ||||
|         content.className = "sidebar-node-info" | ||||
|  | ||||
|         RED.actions.add("core:show-info-tab",show); | ||||
|  | ||||
|         var stackContainer = $("<div>",{class:"sidebar-node-info-stack"}).appendTo(content); | ||||
|  | ||||
|         sections = RED.stack.create({ | ||||
|             container: stackContainer | ||||
|         }).hide(); | ||||
|  | ||||
|         nodeSection = sections.add({ | ||||
|             title: RED._("sidebar.info.info"), | ||||
|             collapsible: true | ||||
|         }); | ||||
|         nodeSection.expand(); | ||||
|         infoSection = sections.add({ | ||||
|             title: RED._("sidebar.info.nodeHelp"), | ||||
|             collapsible: true | ||||
|         }); | ||||
|         infoSection.expand(); | ||||
|         infoSection.content.css("padding","6px"); | ||||
|         infoSection.container.css("border-bottom","none"); | ||||
|  | ||||
|         var tipContainer = $('<div class="node-info-tips"></div>').appendTo(content); | ||||
|         tipBox = $('<div class="node-info-tip"></div>').appendTo(tipContainer); | ||||
|         var tipButtons = $('<div class="node-info-tips-buttons"></div>').appendTo(tipContainer); | ||||
|  | ||||
|         var tipRefresh = $('<a href="#" class="workspace-footer-button"><i class="fa fa-refresh"></a>').appendTo(tipButtons); | ||||
|         tipRefresh.click(function(e) { | ||||
|             e.preventDefault(); | ||||
|             tips.next(); | ||||
|         }) | ||||
|  | ||||
|         var tipClose = $('<a href="#" class="workspace-footer-button"><i class="fa fa-times"></a>').appendTo(tipButtons); | ||||
|         tipClose.click(function(e) { | ||||
|             e.preventDefault(); | ||||
|             RED.actions.invoke("core:toggle-show-tips"); | ||||
|             RED.notify(RED._("sidebar.info.showTips")); | ||||
|         }); | ||||
|  | ||||
|         RED.sidebar.addTab({ | ||||
|             id: "info", | ||||
|             label: RED._("sidebar.info.label"), | ||||
|             name: RED._("sidebar.info.name"), | ||||
|             iconClass: "fa fa-info", | ||||
|             content: content, | ||||
|             pinned: true, | ||||
|             enableOnEdit: true | ||||
|         }); | ||||
|         if (tips.enabled()) { | ||||
|             tips.start(); | ||||
|         } else { | ||||
|             tips.stop(); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     function show() { | ||||
|         RED.sidebar.show("info"); | ||||
|     } | ||||
|  | ||||
|     // TODO: DRY - projects.js | ||||
|     function addTargetToExternalLinks(el) { | ||||
|         $(el).find("a").each(function(el) { | ||||
|             var href = $(this).attr('href'); | ||||
|             if (/^https?:/.test(href)) { | ||||
|                 $(this).attr('target','_blank'); | ||||
|             } | ||||
|         }); | ||||
|         return el; | ||||
|     } | ||||
|     function refresh(node) { | ||||
|         if (node === undefined) { | ||||
|             refreshSelection(); | ||||
|             return; | ||||
|         } | ||||
|         sections.show(); | ||||
|         $(nodeSection.content).empty(); | ||||
|         $(infoSection.content).empty(); | ||||
|  | ||||
|         var propRow; | ||||
|  | ||||
|         var table = $('<table class="node-info"></table>').appendTo(nodeSection.content); | ||||
|         var tableBody = $('<tbody>').appendTo(table); | ||||
|         var subflowNode; | ||||
|         var subflowUserCount; | ||||
|  | ||||
|         var activeProject = RED.projects.getActiveProject(); | ||||
|         if (activeProject) { | ||||
|             propRow = $('<tr class="node-info-node-row"><td>Project</td><td></td></tr>').appendTo(tableBody); | ||||
|             $(propRow.children()[1]).text(activeProject.name||""); | ||||
|             $('<tr class="node-info-property-expand blank"><td colspan="2"></td></tr>').appendTo(tableBody); | ||||
|             $('<button class="editor-button editor-button-small" style="position:absolute;right:2px;"><i class="fa fa-ellipsis-h"></i></button>') | ||||
|                 .appendTo(propRow.children()[1]) | ||||
|                 .click(function(evt) { | ||||
|                     evt.preventDefault(); | ||||
|                     RED.projects.editProject(); | ||||
|                 }); | ||||
|         } | ||||
|         infoSection.container.show(); | ||||
|         if (node === null) { | ||||
|             return; | ||||
|         } else if (Array.isArray(node)) { | ||||
|             infoSection.container.hide(); | ||||
|             propRow = $('<tr class="node-info-node-row"><td>'+RED._("sidebar.info.selection")+"</td><td></td></tr>").appendTo(tableBody); | ||||
|             $(propRow.children()[1]).text(RED._("sidebar.info.nodes",{count:node.length})) | ||||
|         } else { | ||||
|             var m = /^subflow(:(.+))?$/.exec(node.type); | ||||
|             if (m) { | ||||
|                 if (m[2]) { | ||||
|                     subflowNode = RED.nodes.subflow(m[2]); | ||||
|                 } else { | ||||
|                     subflowNode = node; | ||||
|                 } | ||||
|  | ||||
|                 subflowUserCount = 0; | ||||
|                 var subflowType = "subflow:"+subflowNode.id; | ||||
|                 RED.nodes.eachNode(function(n) { | ||||
|                     if (n.type === subflowType) { | ||||
|                         subflowUserCount++; | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|             if (node.type === "tab" || node.type === "subflow") { | ||||
|                 propRow = $('<tr class="node-info-node-row"><td>'+RED._("sidebar.info."+(node.type==='tab'?'flow':'subflow'))+'</td><td></td></tr>').appendTo(tableBody); | ||||
|                 RED.utils.createObjectElement(node.id).appendTo(propRow.children()[1]); | ||||
|                 propRow = $('<tr class="node-info-node-row"><td>'+RED._("sidebar.info.tabName")+"</td><td></td></tr>").appendTo(tableBody); | ||||
|                 $(propRow.children()[1]).text(node.label||node.name||""); | ||||
|                 if (node.type === "tab") { | ||||
|                     propRow = $('<tr class="node-info-node-row"><td>'+RED._("sidebar.info.status")+'</td><td></td></tr>').appendTo(tableBody); | ||||
|                     $(propRow.children()[1]).text((!!!node.disabled)?RED._("sidebar.info.enabled"):RED._("sidebar.info.disabled")) | ||||
|                 } else if (node.type === "subflow") { | ||||
|                     propRow = $('<tr class="node-info-node-row"><td>'+RED._("subflow.category")+'</td><td></td></tr>').appendTo(tableBody); | ||||
|                     var category = node.category||"subflows"; | ||||
|                     $(propRow.children()[1]).text(RED._("palette.label."+category,{defaultValue:category})) | ||||
|                 } | ||||
|             } else { | ||||
|                 propRow = $('<tr class="node-info-node-row"><td>'+RED._("sidebar.info.node")+"</td><td></td></tr>").appendTo(tableBody); | ||||
|                 RED.utils.createObjectElement(node.id).appendTo(propRow.children()[1]); | ||||
|  | ||||
|  | ||||
|                 if (node.type !== "subflow" && node.type !== "unknown" && node.name) { | ||||
|                     propRow = $('<tr class="node-info-node-row"><td>'+RED._("common.label.name")+'</td><td></td></tr>').appendTo(tableBody); | ||||
|                     $('<span class="bidiAware" dir="'+RED.text.bidi.resolveBaseTextDir(node.name)+'"></span>').text(node.name).appendTo(propRow.children()[1]); | ||||
|                 } | ||||
|                 if (!m) { | ||||
|                     propRow = $('<tr class="node-info-node-row"><td>'+RED._("sidebar.info.type")+"</td><td></td></tr>").appendTo(tableBody); | ||||
|                     $(propRow.children()[1]).text((node.type === "unknown")?node._orig.type:node.type); | ||||
|                     if (node.type === "unknown") { | ||||
|                         $('<span style="float: right; font-size: 0.8em"><i class="fa fa-warning"></i></span>').prependTo($(propRow.children()[1])) | ||||
|                     } | ||||
|                 } | ||||
|                 if (!m && node.type != "subflow" && node.type != "comment") { | ||||
|                     var defaults; | ||||
|                     if (node.type === 'unknown') { | ||||
|                         defaults = {}; | ||||
|                         Object.keys(node._orig).forEach(function(k) { | ||||
|                             if (k !== 'type') { | ||||
|                                 defaults[k] = {}; | ||||
|                             } | ||||
|                         }) | ||||
|                     } else if (node._def) { | ||||
|                         defaults = node._def.defaults; | ||||
|                     } | ||||
|                     if (defaults) { | ||||
|                         var count = 0; | ||||
|                         for (var n in defaults) { | ||||
|                             if (n != "name" && defaults.hasOwnProperty(n)) { | ||||
|                                 var val = node[n]; | ||||
|                                 var type = typeof val; | ||||
|                                 count++; | ||||
|                                 propRow = $('<tr class="node-info-property-row'+(expandedSections.property?"":" hide")+'"><td>'+n+"</td><td></td></tr>").appendTo(tableBody); | ||||
|                                 if (defaults[n].type) { | ||||
|                                     var configNode = RED.nodes.node(val); | ||||
|                                     if (!configNode) { | ||||
|                                         RED.utils.createObjectElement(undefined).appendTo(propRow.children()[1]); | ||||
|                                     } else { | ||||
|                                         var configLabel = RED.utils.getNodeLabel(configNode,val); | ||||
|                                         var container = propRow.children()[1]; | ||||
|  | ||||
|                                         var div = $('<span>',{class:""}).appendTo(container); | ||||
|                                         var nodeDiv = $('<div>',{class:"palette_node palette_node_small"}).appendTo(div); | ||||
|                                         var colour = RED.utils.getNodeColor(configNode.type,configNode._def); | ||||
|                                         var icon_url = RED.utils.getNodeIcon(configNode._def); | ||||
|                                         nodeDiv.css({'backgroundColor':colour, "cursor":"pointer"}); | ||||
|                                         var iconContainer = $('<div/>',{class:"palette_icon_container"}).appendTo(nodeDiv); | ||||
|                                         $('<div/>',{class:"palette_icon",style:"background-image: url("+icon_url+")"}).appendTo(iconContainer); | ||||
|                                         var nodeContainer = $('<span></span>').css({"verticalAlign":"top","marginLeft":"6px"}).text(configLabel).appendTo(container); | ||||
|  | ||||
|                                         nodeDiv.on('dblclick',function() { | ||||
|                                             RED.editor.editConfig("", configNode.type, configNode.id); | ||||
|                                         }) | ||||
|  | ||||
|                                     } | ||||
|                                 } else { | ||||
|                                     RED.utils.createObjectElement(val).appendTo(propRow.children()[1]); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                         if (count > 0) { | ||||
|                             $('<tr class="node-info-property-expand blank"><td colspan="2"><a href="#" class=" node-info-property-header'+(expandedSections.property?" expanded":"")+'"><span class="node-info-property-show-more">'+RED._("sidebar.info.showMore")+'</span><span class="node-info-property-show-less">'+RED._("sidebar.info.showLess")+'</span> <i class="fa fa-caret-down"></i></a></td></tr>').appendTo(tableBody); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if (node.type !== 'tab') { | ||||
|                     if (m) { | ||||
|                         $('<tr class="blank"><th colspan="2">'+RED._("sidebar.info.subflow")+'</th></tr>').appendTo(tableBody); | ||||
|                         $('<tr class="node-info-subflow-row"><td>'+RED._("common.label.name")+'</td><td><span class="bidiAware" dir=\"'+RED.text.bidi.resolveBaseTextDir(subflowNode.name)+'">'+subflowNode.name+'</span></td></tr>').appendTo(tableBody); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if (m) { | ||||
|                 propRow = $('<tr class="node-info-node-row"><td>'+RED._("subflow.category")+'</td><td></td></tr>').appendTo(tableBody); | ||||
|                 var category = subflowNode.category||"subflows"; | ||||
|                 $(propRow.children()[1]).text(RED._("palette.label."+category,{defaultValue:category})) | ||||
|                 $('<tr class="node-info-subflow-row"><td>'+RED._("sidebar.info.instances")+"</td><td>"+subflowUserCount+'</td></tr>').appendTo(tableBody); | ||||
|             } | ||||
|  | ||||
|             var infoText = ""; | ||||
|             if (!subflowNode && node.type !== "comment" && node.type !== "tab") { | ||||
|                 infoSection.title.text(RED._("sidebar.info.nodeHelp")); | ||||
|                 var helpText = $("script[data-help-name='"+node.type+"']").html()||('<span class="node-info-none">'+RED._("sidebar.info.none")+'</span>'); | ||||
|                 infoText = helpText; | ||||
|             } else if (node.type === "tab") { | ||||
|                 infoSection.title.text(RED._("sidebar.info.flowDesc")); | ||||
|                 infoText = marked(node.info||"")||('<span class="node-info-none">'+RED._("sidebar.info.none")+'</span>'); | ||||
|             } | ||||
|  | ||||
|             if (subflowNode) { | ||||
|                 infoText = infoText + (marked(subflowNode.info||"")||('<span class="node-info-none">'+RED._("sidebar.info.none")+'</span>')); | ||||
|                 infoSection.title.text(RED._("sidebar.info.subflowDesc")); | ||||
|             } else if (node._def && node._def.info) { | ||||
|                 infoSection.title.text(RED._("sidebar.info.nodeHelp")); | ||||
|                 var info = node._def.info; | ||||
|                 var textInfo = (typeof info === "function" ? info.call(node) : info); | ||||
|                 // TODO: help | ||||
|                 infoText = infoText + marked(textInfo); | ||||
|             } | ||||
|             if (infoText) { | ||||
|                 setInfoText(infoText); | ||||
|             } | ||||
|             $(".sidebar-node-info-stack").scrollTop(0); | ||||
|             $(".node-info-property-header").click(function(e) { | ||||
|                 e.preventDefault(); | ||||
|                 expandedSections["property"] = !expandedSections["property"]; | ||||
|                 $(this).toggleClass("expanded",expandedSections["property"]); | ||||
|                 $(".node-info-property-row").toggle(expandedSections["property"]); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     function setInfoText(infoText) { | ||||
|         var info = addTargetToExternalLinks($('<div class="node-help"><span class="bidiAware" dir=\"'+RED.text.bidi.resolveBaseTextDir(infoText)+'">'+infoText+'</span></div>')).appendTo(infoSection.content); | ||||
|         info.find(".bidiAware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "<span></span>" ); | ||||
|         var foldingHeader = "H3"; | ||||
|         info.find(foldingHeader).wrapInner('<a class="node-info-header expanded" href="#"></a>') | ||||
|             .find("a").prepend('<i class="fa fa-angle-right">').click(function(e) { | ||||
|                 e.preventDefault(); | ||||
|                 var isExpanded = $(this).hasClass('expanded'); | ||||
|                 var el = $(this).parent().next(); | ||||
|                 while(el.length === 1 && el[0].nodeName !== foldingHeader) { | ||||
|                     el.toggle(!isExpanded); | ||||
|                     el = el.next(); | ||||
|                 } | ||||
|                 $(this).toggleClass('expanded',!isExpanded); | ||||
|             }) | ||||
|     } | ||||
|     var tips = (function() { | ||||
|         var enabled = true; | ||||
|         var startDelay = 1000; | ||||
|         var cycleDelay = 15000; | ||||
|         var startTimeout; | ||||
|         var refreshTimeout; | ||||
|         var tipCount = -1; | ||||
|  | ||||
|         RED.actions.add("core:toggle-show-tips",function(state) { | ||||
|             if (state === undefined) { | ||||
|                 RED.userSettings.toggle("view-show-tips"); | ||||
|             } else { | ||||
|                 enabled = state; | ||||
|                 if (enabled) { | ||||
|                     startTips(); | ||||
|                 } else { | ||||
|                     stopTips(); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         function setTip() { | ||||
|             var r = Math.floor(Math.random() * tipCount); | ||||
|             var tip = RED._("infotips:info.tip"+r); | ||||
|  | ||||
|             var m; | ||||
|             while ((m=/({{(.*?)}})/.exec(tip))) { | ||||
|                 var shortcut = RED.keyboard.getShortcut(m[2]); | ||||
|                 if (shortcut) { | ||||
|                     tip = tip.replace(m[1],RED.keyboard.formatKey(shortcut.key)); | ||||
|                 } else { | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|             while ((m=/(\[(.*?)\])/.exec(tip))) { | ||||
|                 tip = tip.replace(m[1],RED.keyboard.formatKey(m[2])); | ||||
|             } | ||||
|             tipBox.html(tip).fadeIn(200); | ||||
|             if (startTimeout) { | ||||
|                 startTimeout = null; | ||||
|                 refreshTimeout = setInterval(cycleTips,cycleDelay); | ||||
|             } | ||||
|         } | ||||
|         function cycleTips() { | ||||
|             tipBox.fadeOut(300,function() { | ||||
|                 setTip(); | ||||
|             }) | ||||
|         } | ||||
|         function startTips() { | ||||
|             $(".sidebar-node-info").addClass('show-tips'); | ||||
|             if (enabled) { | ||||
|                 if (!startTimeout && !refreshTimeout) { | ||||
|                     if (tipCount === -1) { | ||||
|                         do { | ||||
|                             tipCount++; | ||||
|                         } while(RED._("infotips:info.tip"+tipCount)!=="infotips:info.tip"+tipCount); | ||||
|                     } | ||||
|                     startTimeout = setTimeout(setTip,startDelay); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         function stopTips() { | ||||
|             $(".sidebar-node-info").removeClass('show-tips'); | ||||
|             clearInterval(refreshTimeout); | ||||
|             clearTimeout(startTimeout); | ||||
|             refreshTimeout = null; | ||||
|             startTimeout = null; | ||||
|         } | ||||
|         function nextTip() { | ||||
|             clearInterval(refreshTimeout); | ||||
|             startTimeout = true; | ||||
|             setTip(); | ||||
|         } | ||||
|         return { | ||||
|             start: startTips, | ||||
|             stop: stopTips, | ||||
|             next: nextTip, | ||||
|             enabled: function() { return enabled; } | ||||
|         } | ||||
|     })(); | ||||
|  | ||||
|     function clear() { | ||||
|         // sections.hide(); | ||||
|         refresh(null); | ||||
|     } | ||||
|  | ||||
|     function set(html,title) { | ||||
|         // tips.stop(); | ||||
|         // sections.show(); | ||||
|         refresh(null); | ||||
|         nodeSection.container.hide(); | ||||
|         infoSection.title.text(title||RED._("sidebar.info.info")); | ||||
|         setInfoText(html); | ||||
|         $(".sidebar-node-info-stack").scrollTop(0); | ||||
|     } | ||||
|  | ||||
|     function refreshSelection(selection) { | ||||
|         if (selection === undefined) { | ||||
|             selection = RED.view.selection(); | ||||
|         } | ||||
|         if (selection.nodes) { | ||||
|             if (selection.nodes.length == 1) { | ||||
|                 var node = selection.nodes[0]; | ||||
|                 if (node.type === "subflow" && node.direction) { | ||||
|                     refresh(RED.nodes.subflow(node.z)); | ||||
|                 } else { | ||||
|                     refresh(node); | ||||
|                 } | ||||
|             } else { | ||||
|                 refresh(selection.nodes); | ||||
|             } | ||||
|         } else { | ||||
|             var activeWS = RED.workspaces.active(); | ||||
|  | ||||
|             var flow = RED.nodes.workspace(activeWS) || RED.nodes.subflow(activeWS); | ||||
|             if (flow) { | ||||
|                 refresh(flow); | ||||
|             } else { | ||||
|                 var workspace = RED.nodes.workspace(RED.workspaces.active()); | ||||
|                 if (workspace && workspace.info) { | ||||
|                     refresh(workspace); | ||||
|                 } else { | ||||
|                     refresh(null) | ||||
|                     // clear(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     RED.events.on("view:selection-changed",refreshSelection); | ||||
|  | ||||
|     return { | ||||
|         init: init, | ||||
|         show: show, | ||||
|         refresh: refresh, | ||||
|         clear: clear, | ||||
|         set: set | ||||
|     } | ||||
| })(); | ||||
							
								
								
									
										2885
									
								
								editor/js/ui/view.js
									
									
									
									
									
								
							
							
						
						| @@ -1,8 +0,0 @@ | ||||
| .ace_gutter { | ||||
|     border-top-left-radius: 4px; | ||||
|     border-bottom-left-radius: 4px; | ||||
| } | ||||
| .ace_scroller { | ||||
|     border-top-right-radius: 4px; | ||||
|     border-bottom-right-radius: 4px; | ||||
| } | ||||
| @@ -1,69 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| $background-color: #f3f3f3; | ||||
|  | ||||
| $form-placeholder-color: #bbbbbb; | ||||
| $form-text-color: #444; | ||||
| $form-input-focus-color:  rgba(85,150,230,0.8); | ||||
| $form-input-border-color:  #ccc; | ||||
| $form-input-border-selected-color:  #aaa; | ||||
|  | ||||
|  | ||||
| $node-selected-color: #ff7f0e; | ||||
| $port-selected-color: #ff7f0e; | ||||
| $link-color: #888; | ||||
| $link-link-color: #ccc; | ||||
| $link-link-active-color: #ff7f0e; | ||||
| $link-subflow-color: #bbb; | ||||
| $link-unknown-color: #f00; | ||||
|  | ||||
| $primary-border-color: #bbbbbb; | ||||
| $secondary-border-color: #dddddd; | ||||
|  | ||||
| $tab-background-active: #fff; | ||||
| $tab-background-inactive: #f0f0f0; | ||||
| $tab-background-hover: #ddd; | ||||
|  | ||||
| $palette-header-background: #f3f3f3; | ||||
|  | ||||
| $workspace-button-background: #fff; | ||||
| $workspace-button-background-hover: #ddd; | ||||
| $workspace-button-background-active: #efefef; | ||||
| $workspace-button-color: #888; | ||||
| $workspace-button-color-disabled: #ccc; | ||||
| $workspace-button-color-focus: #999; | ||||
| $workspace-button-color-hover: #666; | ||||
| $workspace-button-color-active: #666; | ||||
| $workspace-button-color-selected: #AAA; | ||||
|  | ||||
| $workspace-button-toggle-color: #999; | ||||
| $workspace-button-toggle-color-selected: #888; | ||||
| $workspace-button-toggle-color-disabled: #ddd; | ||||
|  | ||||
| $workspace-button-color-focus-outline: rgba(85,150,230,0.2); | ||||
|  | ||||
| $typedInput-button-background: #efefef; | ||||
| $typedInput-button-background-hover: #ddd; | ||||
| $typedInput-button-background-active: #ddd; | ||||
|  | ||||
| $editor-button-color-primary: #eee; | ||||
| $editor-button-background-primary: #AD1625; | ||||
| $editor-button-background-primary-hover: #6E0A1E; | ||||
| $editor-button-color: #999; | ||||
| $editor-button-background: #fff; | ||||
|  | ||||
| $shade-color: rgba(160,160,160,0.5); | ||||
| @@ -1,262 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| .debug-window { | ||||
|     padding:0; | ||||
|     margin:0; | ||||
|     background: #fff; | ||||
|     line-height: 20px; | ||||
| } | ||||
| .debug-window .debug-message-payload { | ||||
|     font-size: 14px; | ||||
| } | ||||
| .debug-content { | ||||
|     position: absolute; | ||||
|     top: 43px; | ||||
|     bottom: 0px; | ||||
|     left:0px; | ||||
|     right: 0px; | ||||
|     overflow-y: scroll; | ||||
| } | ||||
| .debug-filter-box { | ||||
|     position:absolute; | ||||
|     top: 42px; | ||||
|     left: 0px; | ||||
|     right: 0px; | ||||
|     z-index: 20; | ||||
|     background: #f9f9f9; | ||||
|     padding: 10px; | ||||
|     border-bottom: 1px solid #ddd; | ||||
|     box-shadow: 0 2px 6px rgba(0,0,0,0.1); | ||||
| } | ||||
| .debug-filter-row { | ||||
|     .red-ui-nodeList { | ||||
|         margin: 10px 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .debug-message { | ||||
|     position: relative; | ||||
|     border-bottom: 1px solid #eee; | ||||
|     border-left: 8px solid #eee; | ||||
|     border-right: 8px solid #eee; | ||||
|     padding: 2px; | ||||
|     &>.debug-message-meta .debug-message-tools { | ||||
|         display: none; | ||||
|     } | ||||
|  | ||||
|     &.debug-message-hover { | ||||
|         border-right-color: #999; | ||||
|         &>.debug-message-meta .debug-message-tools { | ||||
|             display: inline-block; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .debug-message-row { | ||||
|     .debug-message-tools-pin { | ||||
|         display: none; | ||||
|     } | ||||
|     &.debug-message-row-pinned .debug-message-tools-pin { | ||||
|         display: inline-block; | ||||
|     } | ||||
|     &:hover { | ||||
|         background: #f3f3f3; | ||||
|         &>.debug-message-tools { | ||||
|             .debug-message-tools-copy { | ||||
|                 display: inline-block; | ||||
|             } | ||||
|             .debug-message-tools-pin { | ||||
|                 display: inline-block; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .debug-message-meta .debug-message-tools { | ||||
|     .editor-button-small { | ||||
|         font-size: 11px; | ||||
|     } | ||||
| } | ||||
| .debug-message-tools { | ||||
|     .button-group:not(:last-child) { | ||||
|         margin-right: 3px; | ||||
|     } | ||||
|     .editor-button-small { | ||||
|         height: 16px; | ||||
|         line-height: 14px; | ||||
|         font-size: 8px; | ||||
|         border-radius: 1px; | ||||
|         padding: 0 3px; | ||||
|         min-width: 18px; | ||||
|         i.fa-terminal { | ||||
|             // terminal icon is a bit thin, so darken its color for better contrast | ||||
|             color: darken($editor-button-color, 30%) !important; | ||||
|         } | ||||
|         &.selected { | ||||
|             color: darken($workspace-button-color-selected, 10%) !important; | ||||
|             background: darken($workspace-button-background-active,10%); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .debug-message-meta { | ||||
|     background: #fff; | ||||
|     font-size: 11px; | ||||
|     color: #707070; | ||||
| } | ||||
| .debug-message-date { | ||||
|     padding: 1px 5px 1px 1px; | ||||
| } | ||||
| .debug-message-topic { | ||||
|     display: block; | ||||
|     color: #a66; | ||||
| } | ||||
| .debug-message-name { | ||||
|     padding: 1px 5px; | ||||
|     color: #707070; | ||||
| } | ||||
| .debug-message-tools { | ||||
|     position: absolute; | ||||
|     top: 3px; | ||||
|     right: 1px; | ||||
|     .debug-message-tools-copy { | ||||
|         display: none; | ||||
|     } | ||||
| } | ||||
| .debug-message-payload { | ||||
|     display: block; | ||||
|     padding: 2px; | ||||
|     background: #fff; | ||||
| } | ||||
| .debug-message-level-log { | ||||
|     border-left-color: #eee; | ||||
|     border-right-color: #eee; | ||||
| } | ||||
| .debug-message-level-30 { | ||||
|     border-left-color: #ffdf9d; | ||||
|     border-right-color: #ffdf9d; | ||||
| } | ||||
| .debug-message-level-20 { | ||||
|     border-left-color: #f99; | ||||
|     border-right-color: #f99; | ||||
| } | ||||
| .debug-message-object-entry { | ||||
|     position: relative; | ||||
|     padding-left: 15px; | ||||
| } | ||||
| .debug-message-element { | ||||
|     color: #333; | ||||
|     font-family: Menlo, monospace; | ||||
|     font-size: 13px !important; | ||||
|     line-height: 1.3em; | ||||
| } | ||||
| .debug-message-object-key { | ||||
|     color: #792e90; | ||||
| } | ||||
| .debug-message-object-value { | ||||
|  | ||||
| } | ||||
| .debug-message-object-handle { | ||||
|     color: #666; | ||||
|     font-size: 1em; | ||||
|     width: 1em; | ||||
|     text-align: center; | ||||
|     transition: transform 0.1s ease-in-out; | ||||
|     transform: rotate(90deg); | ||||
| } | ||||
| .debug-message-element:not(.debug-message-top-level)>.debug-message-expandable>.debug-message-object-handle { | ||||
|     margin-left: -1em; | ||||
| } | ||||
| .debug-message-object-entry>.debug-message-expandable>.debug-message-object-handle { | ||||
|     margin-left: -1em; | ||||
| } | ||||
| .debug-message-object-entry.collapsed>span>.debug-message-object-handle { | ||||
|     transform: rotate(0deg); | ||||
| } | ||||
| .debug-message-element.collapsed>span>.debug-message-object-handle { | ||||
|     transform: rotate(0deg); | ||||
| } | ||||
| .debug-message-object-entry.collapsed > .debug-message-object-entry { | ||||
|     display:none; | ||||
| } | ||||
| .debug-message-element.collapsed .debug-message-object-entry { | ||||
|     display:none; | ||||
| } | ||||
| .debug-message-element:not(.collapsed)>.debug-message-expandable>.debug-message-object-value>.debug-message-object-header { | ||||
|     display:none; | ||||
| } | ||||
| .debug-message-element.collapsed .debug-message-buffer-opts { | ||||
|     display: none; | ||||
| } | ||||
| .debug-message-element.collapsed .debug-message-object-type-header { | ||||
|     display:none; | ||||
| } | ||||
| .debug-message-object-entry pre { | ||||
|     font-family: Menlo, monospace; | ||||
|     font-size: 13px; | ||||
|     line-height: 1.2em; | ||||
|     margin: 0 0 0 -1em; | ||||
| } | ||||
|  | ||||
| .debug-message-type-other { color: #2033d6; } | ||||
| .debug-message-type-string { color: #b72828; } | ||||
| .debug-message-type-null { color: #666; font-style: italic;} | ||||
| .debug-message-type-meta { color: #666; font-style: italic;} | ||||
| .debug-message-type-number { color: #2033d6; }; | ||||
| .debug-message-type-number-toggle { cursor: pointer;} | ||||
|  | ||||
| .debug-message-row { | ||||
|     display: block; | ||||
|     padding: 4px 2px 2px; | ||||
|     position: relative; | ||||
|     &.debug-message-row-pinned { | ||||
|         background: #f6f6f6; | ||||
|     } | ||||
| } | ||||
| .debug-message-expandable { | ||||
|     cursor: pointer; | ||||
| } | ||||
| .debug-message-expandable:hover .debug-message-object-handle { | ||||
|     color: #b72828 !important; | ||||
| } | ||||
|  | ||||
| .debug-message-buffer-opts a { | ||||
|     font-size: 9px; | ||||
|     color: #bbb; | ||||
|     border: 1px solid #bbb; | ||||
|     border-radius: 2px; | ||||
|     padding: 2px 5px; | ||||
|     margin-left: 5px; | ||||
| } | ||||
| .debug-message-buffer-opts a:hover { | ||||
|     text-decoration: none; | ||||
|     color: #999; | ||||
|     border: 1px solid #999; | ||||
|     background: #f3f3f3; | ||||
| } | ||||
| .debug-message-buffer-raw > .debug-message-string-rows { | ||||
|     display: none; | ||||
| } | ||||
| .debug-message-buffer-string > .debug-message-array-rows { | ||||
|     display: none; | ||||
| } | ||||
| .debug-message-type-string-swatch { | ||||
|     display: inline-block; | ||||
|     width: 1.1em; | ||||
|     height: 0.9em; | ||||
|     vertical-align: middle; | ||||
|     border-radius: 3px; | ||||
|     margin: 0 4px; | ||||
| } | ||||
| @@ -1,84 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| .dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus, .dropdown-submenu:hover>a, .dropdown-submenu:focus>a { | ||||
|     background: #999; | ||||
| } | ||||
|  | ||||
| .dropdown-menu * .fa-check-square { | ||||
|     display: none; | ||||
|     color: #e0e0e0; | ||||
|     margin-left: -25px; | ||||
|     margin-top: 3px; | ||||
| } | ||||
| .dropdown-menu * a.active > .fa-check-square { | ||||
|     display: inline-block; | ||||
| } | ||||
| .dropdown-menu * .fa-square { | ||||
|     display: inline-block; | ||||
|     color: #e0e0e0; | ||||
|     margin-left: -25px; | ||||
|     margin-top: 3px; | ||||
| } | ||||
| .dropdown-menu * a.active > .fa-square { | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
|  | ||||
| .dropdown-menu>li.disabled>a:hover>[class^="icon-"] { | ||||
|     background-image: url("vendor/bootstrap/img/glyphicons-halflings.png") !important; | ||||
| } | ||||
| /** Fix for unreachable dropdown menu **/ | ||||
| .dropdown-menu  { | ||||
|     border-radius: 0; | ||||
|     width: 200px !important; | ||||
|     margin-left: 0px !important; | ||||
| } | ||||
| .dropdown-menu > li > a > i { | ||||
|     width: 10px; | ||||
|     text-align: center; | ||||
|     margin-left: -8px; | ||||
| } | ||||
| .dropdown-menu > li > a { | ||||
|      padding-left: 38px ; | ||||
|      text-indent: -8px ; | ||||
|      white-space: normal !important; | ||||
| } | ||||
|  | ||||
| .dropdown-submenu>a:after { | ||||
|     display: none; | ||||
| } | ||||
| .dropdown-submenu>a:before { | ||||
|     display: block; | ||||
|     float: left; | ||||
|     width: 0; | ||||
|     height: 0; | ||||
|     margin-top: 5px; | ||||
|     margin-left: -30px; | ||||
|     border-color: transparent; | ||||
|     border-right-color: #e0e0e0; | ||||
|     border-style: solid; | ||||
|     border-width: 5px 5px 5px 0; | ||||
|     content: " "; | ||||
| } | ||||
|  | ||||
| .dropdown-submenu.disabled > a:before { | ||||
|     border-right-color: #444; | ||||
| } | ||||
| .dropdown-submenu.pull-left>.dropdown-menu { | ||||
|     border-radius: 0; | ||||
| } | ||||
| @@ -1,416 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| #editor-stack { | ||||
|     position: absolute; | ||||
|     margin: 0; | ||||
|     top: 0; | ||||
|     bottom: 0px; | ||||
|     right: 323px; | ||||
|     width: 0; | ||||
|     z-index: 5; | ||||
| } | ||||
| .editor-tray { | ||||
|     position:absolute; | ||||
|     margin: 0; | ||||
|     top: 0; | ||||
|     //min-width: 500px; | ||||
|     width: auto; | ||||
|     right: -1000px; | ||||
|     bottom: 0; | ||||
|     background: #fff; | ||||
|     border-left: 1px solid $secondary-border-color; | ||||
|     border-bottom: 1px solid $primary-border-color; | ||||
|     box-sizing: content-box; | ||||
| } | ||||
| .editor-tray.open { | ||||
|     right: 0; | ||||
| } | ||||
| .editor-tray-body-wrapper { | ||||
|     width: 100%; | ||||
|     box-sizing: border-box; | ||||
|     overflow: auto; | ||||
| } | ||||
| .editor-tray-body { | ||||
|     position: relative; | ||||
|     box-sizing: border-box; | ||||
|     padding: 0.1px; // prevent margin collapsing | ||||
|     .dialog-form,#dialog-form, #node-config-dialog-edit-form { | ||||
|         margin: 20px; | ||||
|         height: calc(100% - 40px); | ||||
|     } | ||||
| } | ||||
| .editor-tray-content { | ||||
|     overflow: auto; | ||||
| } | ||||
| .editor-tray-header { | ||||
|     @include disable-selection; | ||||
|     position: relative; | ||||
|     box-sizing: border-box; | ||||
|     font-weight: bold; | ||||
|     border-bottom: 1px solid $secondary-border-color; | ||||
|     background: $palette-header-background; | ||||
|     &:after { | ||||
|         content: ""; | ||||
|         display: table; | ||||
|         clear: both; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .editor-tray-footer { | ||||
|     @include component-footer; | ||||
|     height: 35px; | ||||
|  | ||||
|     button { | ||||
|         @include editor-button; | ||||
|         padding: 3px 7px; | ||||
|         font-size: 11px; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .editor-tray-toolbar { | ||||
|     text-align: right; | ||||
|     padding: 6px; | ||||
|  | ||||
|     button { | ||||
|         @include editor-button; | ||||
|         &.toggle { | ||||
|             @include workspace-button-toggle; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .editor-tray-titlebar { | ||||
|     border-bottom: 1px solid $secondary-border-color; | ||||
|     padding: 8px; | ||||
| } | ||||
| .editor-tray-breadcrumbs { | ||||
|     list-style-type: none; | ||||
|     margin: 0; | ||||
|     padding:0; | ||||
|  | ||||
|     li { | ||||
|         display: inline-block; | ||||
|         padding:0; | ||||
|         margin:0; | ||||
|  | ||||
|         &:not(:last-child) { | ||||
|             color: $editor-button-color; | ||||
|             font-weight: normal; | ||||
|  | ||||
|             &:after { | ||||
|                 display: inline-block; | ||||
|                 content: '>'; | ||||
|                 margin: 0 5px; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .editor-tray-resize-handle { | ||||
|     position: absolute; | ||||
|     top: 0px; | ||||
|     bottom: 0px; | ||||
|     width: 7px; | ||||
|     left: -9px; | ||||
|     background: $background-color url(images/grip.png) no-repeat 50% 50%; | ||||
|     cursor: col-resize; | ||||
|     border-left: 1px solid $primary-border-color; | ||||
|     box-shadow: -1px 0 6px rgba(0,0,0,0.1); | ||||
|  | ||||
|     &.editor-tray-resize-maximised { | ||||
|         background: $background-color; | ||||
|         cursor: default; | ||||
|     } | ||||
| } | ||||
| .editor-tray-resize-button { | ||||
|     @include workspace-button; | ||||
|     display: block; | ||||
|     height: 37px; | ||||
|     line-height: 35px; | ||||
|     border: none; | ||||
|     border-bottom: 1px solid $secondary-border-color; | ||||
|     margin: 0; | ||||
|     background: $background-color; | ||||
|     color: $workspace-button-color; | ||||
| } | ||||
| #palette-shade, #editor-shade, #header-shade, #sidebar-shade  { | ||||
|     @include shade; | ||||
|     z-index: 2; | ||||
| } | ||||
| #sidebar-shade  { | ||||
|     left: -8px; | ||||
|     top: -1px; | ||||
|     bottom: -1px; | ||||
| } | ||||
| #full-shade { | ||||
|     @include shade; | ||||
|     z-index: 15; | ||||
| } | ||||
|  | ||||
| .dialog-form,#dialog-form, #node-config-dialog-edit-form { | ||||
|     height: 100%; | ||||
| } | ||||
|  | ||||
| .input-error { | ||||
|     border-color: rgb(214, 97, 95) !important; | ||||
| } | ||||
|  | ||||
| .form-row { | ||||
|     clear: both; | ||||
|     color: $form-text-color; | ||||
|     margin-bottom:12px; | ||||
| } | ||||
| .form-row label { | ||||
|     display: inline-block; | ||||
|     width: 100px; | ||||
| } | ||||
| .form-row input, .form-row div[contenteditable="true"] { | ||||
|     width:70%; | ||||
| } | ||||
|  | ||||
| .form-tips { | ||||
|     background: #ffe; | ||||
|     padding: 8px; | ||||
|     border-radius: 2px; | ||||
|     border: 1px solid $secondary-border-color; | ||||
|     max-width: 450px; | ||||
| } | ||||
| .form-tips code { | ||||
|     border: none; | ||||
|     padding: auto; | ||||
| } | ||||
| .form-tips a { | ||||
|     text-decoration: underline; | ||||
| } | ||||
|  | ||||
| .form-warning { | ||||
|     border-color: #d6615f; | ||||
| } | ||||
|  | ||||
| .node-text-editor { | ||||
|     border:1px solid #ccc; | ||||
|     border-radius:5px; | ||||
|     overflow: hidden; | ||||
|     font-size: 14px !important; | ||||
|     font-family: Menlo, Consolas, 'DejaVu Sans Mono', Courier, monospace !important; | ||||
| } | ||||
|  | ||||
| .editor-button { | ||||
|     @include workspace-button; | ||||
|     height: 34px; | ||||
|     line-height: 32px; | ||||
|     font-size: 13px; | ||||
|     border-radius: 2px; | ||||
|     padding: 0 10px; | ||||
|     white-space: nowrap; | ||||
|     text-overflow: ellipsis; | ||||
|     &.toggle { | ||||
|         @include workspace-button-toggle; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| .editor-button-small { | ||||
|     height: 20px; | ||||
|     min-width: 20px; | ||||
|     line-height: 18px; | ||||
|     font-size: 10px; | ||||
|     border-radius: 2px; | ||||
|     padding: 0 5px; | ||||
| } | ||||
|  | ||||
| #node-config-dialog-scope-container { | ||||
|     cursor: auto; | ||||
|     float: right; | ||||
|     font-size: 12px !important; | ||||
|     line-height: 35px; | ||||
| } | ||||
| #node-config-dialog-scope-warning { | ||||
|     display: inline-block; | ||||
|     margin-right: 5px; | ||||
|     color: #AD1625; | ||||
|     vertical-align: middle; | ||||
| } | ||||
| #node-config-dialog-scope { | ||||
|     margin: 1px 0 0 0; | ||||
|     padding: 0; | ||||
|     height: 22px; | ||||
|     width: 200px; | ||||
|  | ||||
| } | ||||
| #node-config-dialog-user-count { | ||||
|     vertical-align: middle; | ||||
|     display:inline-block; | ||||
|     margin-right: 20px; | ||||
|     float:left; | ||||
|     font-size: 12px; | ||||
|     line-height: 35px; | ||||
| } | ||||
| .node-input-expression-editor #dialog-form { | ||||
|     margin: 0; | ||||
|     height: 100%; | ||||
|     .red-ui-panel { | ||||
|         &:first-child { | ||||
|             padding: 20px 20px 0; | ||||
|         } | ||||
|         &:last-child { | ||||
|             padding-bottom: 20px; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .node-input-expression-tab-content { | ||||
|     position: relative; | ||||
|     padding: 0 20px; | ||||
| } | ||||
|  | ||||
| #node-input-expression-help { | ||||
|     position: absolute; | ||||
|     top: 35px; | ||||
|     left:0; | ||||
|     right: 0; | ||||
|     bottom:0; | ||||
|     padding: 0 20px; | ||||
|     overflow: auto; | ||||
|     box-sizing: border-box; | ||||
| } | ||||
| #node-input-expression-panel-info { | ||||
|     & > .form-row { | ||||
|         margin: 0; | ||||
|         & > div:first-child { | ||||
|             margin-top: 10px; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .node-input-expression-legacy, .node-input-buffer-type { | ||||
|     font-size: 0.8em; | ||||
|     float: left; | ||||
|     cursor: pointer; | ||||
|     border: 1px solid white; | ||||
|     padding: 2px 5px; | ||||
|     border-radius: 2px; | ||||
|     &:hover { | ||||
|         border-color: $form-input-border-color; | ||||
|     } | ||||
| } | ||||
| .node-input-buffer-type { | ||||
|     float: none; | ||||
|     text-align: right; | ||||
| } | ||||
|  | ||||
| #clipboard-hidden { | ||||
|     position: absolute; | ||||
|     top: -3000px; | ||||
| } | ||||
| .node-label-form-row { | ||||
|     margin: 5px 0; | ||||
|     label { | ||||
|         margin-right: 20px; | ||||
|         text-align: right; | ||||
|         width: 30px; | ||||
|     } | ||||
|     button { | ||||
|         margin-left: 10px; | ||||
|     } | ||||
|     input { | ||||
|         width: calc(100% - 100px); | ||||
|     } | ||||
|     #node-settings-icon-module { | ||||
|         width: calc(55% - 50px); | ||||
|     } | ||||
|     #node-settings-icon-file { | ||||
|         width: calc(45% - 55px); | ||||
|         margin-left: 5px; | ||||
|     } | ||||
| } | ||||
| .node-label-form-none { | ||||
|     span { | ||||
|         padding-left: 50px; | ||||
|         width: 100px; | ||||
|         color: #999; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .ace_read-only { | ||||
|     background: #eee !important; | ||||
|     .ace_cursor { | ||||
|        color: transparent !important; | ||||
|     } | ||||
|  | ||||
| } | ||||
| #node-settings-icon { | ||||
|     margin-left: 10px; | ||||
|     width: calc(100% - 163px); | ||||
| } | ||||
| .red-ui-icon-picker { | ||||
|     position: absolute; | ||||
|     border: 1px solid $primary-border-color; | ||||
|     box-shadow: 0 1px 6px -3px black; | ||||
|     background: white; | ||||
|     z-Index: 21; | ||||
|     display: none; | ||||
|     select { | ||||
|         box-sizing: border-box; | ||||
|         margin: 3px; | ||||
|         width: calc(100% - 6px); | ||||
|     } | ||||
| } | ||||
| .red-ui-icon-list { | ||||
|     width: 308px; | ||||
|     height: 200px; | ||||
|     overflow-y: scroll; | ||||
|     line-height: 0px; | ||||
| } | ||||
| .red-ui-icon-list-icon { | ||||
|     display: inline-block; | ||||
|     margin: 2px; | ||||
|     padding: 4px; | ||||
|     cursor: pointer; | ||||
|     border-radius: 4px; | ||||
|     &:hover { | ||||
|         background: lighten($node-selected-color,20%); | ||||
|     } | ||||
|     &.selected { | ||||
|         background: lighten($node-selected-color,20%); | ||||
|         .red-ui-search-result-node { | ||||
|             border-color: white; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .red-ui-icon-list-module { | ||||
|     background: $palette-header-background; | ||||
|     font-size: 0.9em; | ||||
|     padding: 3px; | ||||
|     color: #666; | ||||
|     clear: both; | ||||
|     i { | ||||
|         margin-right: 5px; | ||||
|     } | ||||
| } | ||||
| .red-ui-icon-meta { | ||||
|     border-top: 1px solid $secondary-border-color; | ||||
|     span { | ||||
|         padding: 4px; | ||||
|         color: #666; | ||||
|         font-size: 0.9em; | ||||
|     } | ||||
|     button { | ||||
|         float: right; | ||||
|         margin: 2px; | ||||
|     } | ||||
| } | ||||
| @@ -1,296 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| .hidden { | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| .lasso { | ||||
|     stroke-width: 1px; | ||||
|     stroke: #ff7f0e; | ||||
|     fill: rgba(20,125,255,0.1); | ||||
|     stroke-dasharray: 10 5; | ||||
| } | ||||
|  | ||||
| .group-box { | ||||
|     stroke-width: 1px; | ||||
|     stroke: #aaaaaa; | ||||
|     fill: rgba(208, 211, 238, 0.1); | ||||
|     stroke-dasharray: 3 3; | ||||
| } | ||||
| .group-box-active { | ||||
|     fill: #fff; | ||||
|     stroke: #ff7f0e; | ||||
| } | ||||
|  | ||||
| .group_label { | ||||
|     stroke-width: 0; | ||||
|     fill: #999; | ||||
|     font-size: 11px; | ||||
|     pointer-events: none; | ||||
|     -webkit-touch-callout: none; | ||||
|     @include disable-selection; | ||||
| } | ||||
|  | ||||
| .pull-right { | ||||
|     margin-left: 20px; | ||||
| } | ||||
|  | ||||
| .node_label_italic { | ||||
|     font-style: italic; | ||||
| } | ||||
| .node_label_unknown { | ||||
|     font-style: italic; | ||||
|     fill: #e00 !important; | ||||
| } | ||||
| .node_label_white { | ||||
|     fill: #eee !important; | ||||
| } | ||||
| .node_label { | ||||
|     stroke-width: 0; | ||||
|     fill: #333; | ||||
|     font-size: 14px; | ||||
|     pointer-events: none; | ||||
|     -webkit-touch-callout: none; | ||||
|     @include disable-selection; | ||||
| } | ||||
|  | ||||
| .port_label { | ||||
|     stroke-width: 0; | ||||
|     fill: #888; | ||||
|     font-size: 16px; | ||||
|     alignment-baseline: middle; | ||||
|     text-anchor: middle; | ||||
|     pointer-events: none; | ||||
|     -webkit-touch-callout: none; | ||||
|     @include disable-selection; | ||||
| } | ||||
|  | ||||
|  | ||||
| .function_label { | ||||
|     font-size: 12px; | ||||
| } | ||||
| .node { | ||||
|     stroke: #999; | ||||
|     cursor: move; | ||||
|     stroke-width: 1; | ||||
| } | ||||
| .node_unknown { | ||||
|     stroke-dasharray:10,4; | ||||
|     stroke: #f33; | ||||
| } | ||||
| .tool_arrow { | ||||
|     stroke-width: 1; | ||||
|     stroke: #999; | ||||
|     fill: #999; | ||||
|     cursor: pointer; | ||||
| } | ||||
| .node_tools { | ||||
|     fill: #ddd; | ||||
|     stroke: #999; | ||||
|     cursor: move; | ||||
|     stroke-width: 1; | ||||
|     cursor: pointer; | ||||
| } | ||||
| .node_tools_hovered { | ||||
|     stroke: #ff7f0e; | ||||
|     fill: #eee; | ||||
| } | ||||
|  | ||||
| .node_button { | ||||
|     fill: inherit; | ||||
|  | ||||
| } | ||||
| .port { | ||||
|     stroke: #999; | ||||
|     stroke-width: 1; | ||||
|     fill: #ddd; | ||||
|     cursor: crosshair; | ||||
| } | ||||
|  | ||||
| .port_highlight { | ||||
|     stroke: #6DA332; | ||||
|     stroke-width: 3; | ||||
|     fill: #fff; | ||||
|     pointer-events:none; | ||||
|     fill-opacity: 0.5; | ||||
| } | ||||
|  | ||||
| .node_error { | ||||
|     stroke: #ff0000; | ||||
|     stroke-width: 2; | ||||
|     fill: #ff7f0e; | ||||
| } | ||||
|  | ||||
| .node_badge { | ||||
|     stroke: rgb(93, 114, 145); | ||||
|     stroke-width: 1; | ||||
|     fill: rgb(190, 209, 255); | ||||
| } | ||||
| .node_badge_label { | ||||
|     stroke-width:0; | ||||
|     fill: #fff; | ||||
|     font-size: 11px; | ||||
|     pointer-events: none; | ||||
|     -webkit-touch-callout: none; | ||||
|     @include disable-selection; | ||||
|  | ||||
| } | ||||
| .node_invalid { | ||||
|     stroke: #ff0000; | ||||
| } | ||||
| .node_selected { | ||||
|     stroke-width: 2; | ||||
|     stroke: $node-selected-color !important; | ||||
| } | ||||
| .node_highlighted { | ||||
|     border-color: #dd1616 !important; | ||||
|     border-style: dashed !important; | ||||
|     stroke: #dd1616; | ||||
|     stroke-width: 2; | ||||
|     stroke-dasharray: 10, 4; | ||||
| } | ||||
| .node_hovered { | ||||
| } | ||||
|  | ||||
| .node_subflow .node { | ||||
|     stroke-dasharray:8, 3; | ||||
| } | ||||
|  | ||||
|  | ||||
| .node_quickadd * { | ||||
|     stroke-dasharray: 12,3; | ||||
| } | ||||
|  | ||||
| .node_status_label { | ||||
|     @include disable-selection; | ||||
|     stroke-width: 0; | ||||
|     fill: #888; | ||||
|     font-size:9pt; | ||||
|     stroke:#000; | ||||
|     text-anchor:start; | ||||
| } | ||||
|  | ||||
| .port_hovered { | ||||
|     stroke: $port-selected-color; | ||||
|     fill:  $port-selected-color; | ||||
| } | ||||
|  | ||||
| .port_quick_link { | ||||
|     stroke: $port-selected-color; | ||||
|     fill:  $port-selected-color; | ||||
| } | ||||
|  | ||||
|  | ||||
| .subflowport { | ||||
|     stroke-dasharray: 5,5; | ||||
|     fill: #eee; | ||||
|     stroke: #999; | ||||
| } | ||||
|  | ||||
| .drag_line { | ||||
|     stroke: $node-selected-color; | ||||
|     stroke-width: 3; | ||||
|     fill: none; | ||||
|     pointer-events: none; | ||||
| } | ||||
|  | ||||
| .drag_line_hidden { | ||||
|     stroke: $node-selected-color; | ||||
|     stroke-width: 0; | ||||
|     pointer-events: none; | ||||
|     fill: none; | ||||
| } | ||||
|  | ||||
| .link_line { | ||||
|     stroke: $link-color; | ||||
|     stroke-width: 3; | ||||
|     fill: none; | ||||
|     pointer-events: none; | ||||
| } | ||||
| .link_link { | ||||
|     stroke-width: 2; | ||||
|     stroke-dasharray: 10,5; | ||||
|     stroke: $link-link-color; | ||||
|     fill: none; | ||||
|     stroke-dasharray: 15,2; | ||||
|     pointer-events: none; | ||||
| } | ||||
| .link_port { | ||||
|     fill: #fff; | ||||
|     stroke: $link-link-color; | ||||
|     stroke-width: 1; | ||||
| } | ||||
| .link_group_active .link_port { | ||||
|     stroke: $link-link-active-color; | ||||
| } | ||||
| .link_group:hover { | ||||
|     cursor: pointer; | ||||
| } | ||||
| .link_subflow { | ||||
|     stroke: $link-subflow-color; | ||||
|     stroke-dasharray: 10,5; | ||||
|     stroke-width: 2; | ||||
| } | ||||
|  | ||||
| .link_outline { | ||||
|     stroke: #fff; | ||||
|     stroke-width: 5; | ||||
|     cursor: crosshair; | ||||
|     fill: none; | ||||
|     pointer-events: none; | ||||
| } | ||||
| .link_background { | ||||
|     stroke: #fff; | ||||
|     opacity: 0; | ||||
|     stroke-width: 20; | ||||
|     cursor: crosshair; | ||||
|     fill: none; | ||||
| } | ||||
| .link_splice > .link_line { | ||||
|     stroke-dasharray: 15,8; | ||||
| } | ||||
|  | ||||
| g.link_selected path.link_line { | ||||
|     stroke: $node-selected-color; | ||||
| } | ||||
| g.link_unknown path.link_line { | ||||
|     stroke: $link-unknown-color; | ||||
|     stroke-width: 2; | ||||
|     stroke-dasharray: 10, 4; | ||||
| } | ||||
|  | ||||
| @keyframes port_tooltip_fadeIn { from { opacity:0; } to { opacity:1; } } | ||||
|  | ||||
| .port_tooltip { | ||||
|     opacity:0; | ||||
|     animation: 0.1s ease-in 0s 1 normal forwards port_tooltip_fadeIn; | ||||
|     pointer-events: none; | ||||
|  | ||||
|     path { | ||||
|         fill: white; | ||||
|         stroke: #999; | ||||
|         stroke-width: 1; | ||||
|     } | ||||
| } | ||||
| .port_tooltip_label { | ||||
|     stroke-width: 0; | ||||
|     fill: #666; | ||||
|     font-size: 12px; | ||||
|     pointer-events: none; | ||||
|     -webkit-touch-callout: none; | ||||
|     @include disable-selection; | ||||
| } | ||||
| @@ -1,291 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| $activeButton: #121212; | ||||
|  | ||||
| $deployButton: #8C101C; | ||||
| $deployButtonHover: #6E0A1E; | ||||
| $deployButtonActive: #4C0A17; | ||||
|  | ||||
| $deployDisabledButton: #444; | ||||
| $deployDisabledButtonHover: #555; | ||||
| $deployDisabledButtonActive: #444; | ||||
|  | ||||
| $headerMenuBackground: #121212; | ||||
| $headerMenuItemHover: #323232; | ||||
| $headerMenuItemDivider: #464646; | ||||
|  | ||||
| #header { | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     width: 100%; | ||||
|     height: 40px; | ||||
|     background: #000; | ||||
|     box-sizing: border-box; | ||||
|     padding: 0px 0px 0px 20px; | ||||
|     color: #C7C7C7; | ||||
|     font-size: 14px; | ||||
| } | ||||
|  | ||||
| span.logo { | ||||
|     float: left; | ||||
|     margin-top: 5px; | ||||
|     font-size: 30px; | ||||
|     line-height: 30px; | ||||
|     text-decoration: none; | ||||
|  | ||||
|     span { | ||||
|         vertical-align: middle; | ||||
|         font-size: 16px !important; | ||||
|     } | ||||
|     img { | ||||
|         height: 18px; | ||||
|     } | ||||
|  | ||||
|     a { | ||||
|         color: inherit; | ||||
|         &:hover { | ||||
|             text-decoration: none; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .header-toolbar { | ||||
|     padding: 0; | ||||
|     margin: 0; | ||||
|     list-style: none; | ||||
|     float: right; | ||||
|  | ||||
|     > li { | ||||
|         display: inline-block; | ||||
|         padding: 0; | ||||
|         margin: 0; | ||||
|         position: relative; | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| .button { | ||||
|     @include disable-selection; | ||||
| } | ||||
|  | ||||
| #header .button { | ||||
|     min-width: 20px; | ||||
|     text-align: center; | ||||
|     line-height: 40px; | ||||
|     display: inline-block; | ||||
|     font-size: 20px; | ||||
|     padding: 0px 12px; | ||||
|     text-decoration: none; | ||||
|     color: #C7C7C7; | ||||
|     margin: auto 5px; | ||||
|     vertical-align: middle; | ||||
|     border-left: 2px solid #000; | ||||
|     border-right: 2px solid #000; | ||||
|  | ||||
|     &:hover { | ||||
|         border-color: $headerMenuItemHover; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #header .button-group { | ||||
|     display: inline-block; | ||||
|     margin: auto 15px; | ||||
|     vertical-align: middle; | ||||
|     clear: both; | ||||
| } | ||||
| #header .button-group > a { | ||||
|     display: inline-block; | ||||
|     position: relative; | ||||
|     float: left; | ||||
|     line-height: 22px; | ||||
|     font-size: 14px; | ||||
|     text-decoration: none; | ||||
|     padding: 4px 8px; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| .deploy-button { | ||||
|     background: $deployButton; | ||||
|     color: #eee !important; | ||||
|  | ||||
|     &:hover { | ||||
|         background: $deployButtonHover; | ||||
|     } | ||||
|  | ||||
|     &:active { | ||||
|         background: $deployButtonActive; | ||||
|         color: #ccc !important; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .deploy-button-spinner { | ||||
|     position: absolute; | ||||
|     left: 0; | ||||
|     top: 0; | ||||
|     right: 0; | ||||
|     bottom: 0; | ||||
|     text-align: center; | ||||
|  | ||||
|     img { | ||||
|         opacity: 0.8; | ||||
|         height: 100%; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #btn-deploy { | ||||
|  | ||||
|     padding: 4px 12px; | ||||
|  | ||||
|     &.disabled { | ||||
|         cursor: default; | ||||
|         background: $deployDisabledButton; | ||||
|         color: #999 !important; | ||||
|  | ||||
|         .deploy-button-content>img { | ||||
|             opacity: 0.3; | ||||
|         } | ||||
|  | ||||
|         &+ #btn-deploy-options { | ||||
|             background: $deployDisabledButton; | ||||
|             color: #ddd; | ||||
|         } | ||||
|         &+ #btn-deploy-options:hover { | ||||
|             background: $deployDisabledButtonHover; | ||||
|         } | ||||
|         &+ #btn-deploy-options:active { | ||||
|             background: $deployDisabledButton; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .deploy-button-content>img { | ||||
|         margin-right: 8px; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .deploy-button-group.open { | ||||
|     #btn-deploy-options { | ||||
|         background: $activeButton !important; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| #header .button { | ||||
|     &:active, &.active { | ||||
|         background: $activeButton; | ||||
|     } | ||||
|     &:focus { | ||||
|         outline: none; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #header li.open .button { | ||||
|     background: $activeButton; | ||||
|     border-color: $activeButton; | ||||
| } | ||||
|  | ||||
|  | ||||
| #header ul.dropdown-menu { | ||||
|     background: $headerMenuBackground; | ||||
|     width: 250px !important; | ||||
|     margin-top: 0; | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu li a { | ||||
|     color: #C7C7C7; | ||||
|     padding: 3px 40px; | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu li a img { | ||||
|     margin-right: 10px; | ||||
|     padding: 4px; | ||||
|     border: 3px solid rgba(0,0,0,0); | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu li a.active img { | ||||
|     border: 3px solid #777677; | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu li a span.menu-label-container { | ||||
|     width: 180px; | ||||
|     vertical-align: top; | ||||
|     display: inline-block; | ||||
|     text-indent: 0px; | ||||
| } | ||||
| #header ul.dropdown-menu li a span.menu-label { | ||||
|     font-size: 14px; | ||||
|     display: inline-block; | ||||
|     text-indent: 0px; | ||||
| } | ||||
| #header ul.dropdown-menu li a span.menu-sublabel { | ||||
|     color: #aeaeae; | ||||
|     font-size: 13px; | ||||
|     display: inline-block; | ||||
|     text-indent: 0px; | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu > li:hover > a, | ||||
| #header ul.dropdown-menu > li:focus > a { | ||||
|     background: $headerMenuItemHover !important; | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu li.divider { | ||||
|     background: $headerMenuItemDivider; | ||||
|     border-bottom-color: $headerMenuItemHover; | ||||
| } | ||||
| #header ul.dropdown-menu li.disabled a { | ||||
|     color: #666; | ||||
| } | ||||
|  | ||||
| #header ul.dropdown-menu > li.disabled:hover > a, | ||||
| #header ul.dropdown-menu > li.disabled:focus > a { | ||||
|     background: none !important; | ||||
| } | ||||
|  | ||||
| /* Deploy menu customisations */ | ||||
| #header ul#btn-deploy-options-submenu { | ||||
|     width: 300px !important; | ||||
| } | ||||
| #header ul#btn-deploy-options-submenu li a span.menu-label { | ||||
|     font-size: 16px; | ||||
|     display: inline-block; | ||||
|     text-indent: 0px; | ||||
| } | ||||
| #header ul#btn-deploy-options-submenu li a { | ||||
|     padding: 10px 30px; | ||||
|     color: #fff; | ||||
| } | ||||
| #header ul#btn-deploy-options-submenu li a > i.fa { | ||||
|     display: none !important; | ||||
| } | ||||
|  | ||||
| /* User menu customisations */ | ||||
| #header ul#btn-usermenu-submenu li a#btn-username > .menu-label { | ||||
|     font-size: 16px; | ||||
|     color: #fff; | ||||
| } | ||||
|  | ||||
| #btn-usermenu .user-profile { | ||||
|     background-position: center center; | ||||
|     background-repeat: no-repeat; | ||||
|     background-size: contain; | ||||
|     display: inline-block; | ||||
|     width: 40px; | ||||
|     height: 35px; | ||||
|     vertical-align: middle; | ||||
| } | ||||
| @@ -1,136 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| #keyboard-help-dialog { | ||||
|     font-size: 0.9em; | ||||
|     padding-top: 10px; | ||||
|  | ||||
| } | ||||
|  | ||||
| #user-settings-tab-keyboard .red-ui-editableList-container { | ||||
|     border-radius: 0; | ||||
|     border: none; | ||||
|     padding: 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| .keyboard-shortcut-entry.keyboard-shortcut-list-header { | ||||
|     padding:0 5px 0 5px; | ||||
|     div { | ||||
|         color: #666 !important; | ||||
|     } | ||||
|     .red-ui-searchBox-container { | ||||
|         width: calc(100% - 20px); | ||||
|     } | ||||
|     .keyboard-shortcut-entry-scope { | ||||
|         text-align: center; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .keyboard-shortcut-list-header { | ||||
|     border-bottom: 1px solid $primary-border-color; | ||||
|  | ||||
| } | ||||
| .keyboard-shortcut-list { | ||||
|     position: absolute; | ||||
|     top:30px; | ||||
|     left:10px; | ||||
|     right:10px; | ||||
|     bottom:10px; | ||||
|     li { | ||||
|         padding: 0; | ||||
|         .red-ui-editableList-item-content { | ||||
|             padding: 8px; | ||||
|             cursor: pointer; | ||||
|         } | ||||
|     } | ||||
|     li:hover { | ||||
|         background: #f6f6f6; | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-entry { | ||||
|     div { | ||||
|         display: inline-block; | ||||
|     } | ||||
|     // white-space: nowrap; | ||||
|  | ||||
|     select { | ||||
|         margin: 0; | ||||
|         width: calc(100% - 30px); | ||||
|         font-size: 0.9em; | ||||
|         margin-right: 5px; | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-entry-key { | ||||
|     width:160px; | ||||
|     vertical-align: middle; | ||||
|     input { | ||||
|         margin:0; | ||||
|         width: calc(100% - 5px); | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-entry-text { | ||||
|     vertical-align: middle; | ||||
|     width: calc(100% - 160px - 100px - 10px); | ||||
|     overflow: hidden; | ||||
|     i { | ||||
|         color: #ccc; | ||||
|         margin-right: 5px; | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-entry-scope { | ||||
|     width:100px; | ||||
|     color: #999; | ||||
|     vertical-align: middle; | ||||
|     text-align: right; | ||||
| } | ||||
| .keyboard-shortcut-entry:not(.keyboard-shortcut-list-header) { | ||||
|     .keyboard-shortcut-entry-scope { | ||||
|         font-size: 0.8em; | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-entry-unassigned { | ||||
|     color: #999; | ||||
|     .keyboard-shortcut-entry-key { | ||||
|         font-style: italic; | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-entry-expanded { | ||||
|     .keyboard-shortcut-entry-key { | ||||
|         width: 150px; | ||||
|     } | ||||
|     .keyboard-shortcut-entry-text { | ||||
|     } | ||||
|     .keyboard-shortcut-entry-scope { | ||||
|         width: 110px; | ||||
|     } | ||||
|     span { | ||||
|         display: none; | ||||
|     } | ||||
| } | ||||
| .keyboard-shortcut-edit  { | ||||
| } | ||||
| .help-key { | ||||
|     border: 1px solid #ddd; | ||||
|     padding: 4px; | ||||
|     border-radius: 3px; | ||||
|     background: #f6f6f6; | ||||
|     font-family: Courier, monospace; | ||||
|     box-shadow: #999 1px 1px 1px; | ||||
| } | ||||
| .help-key-block { | ||||
|     white-space: nowrap; | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| #notifications { | ||||
|     z-index: 100; | ||||
|     width: 500px; | ||||
|     margin-left: -250px; | ||||
|     left: 50%; | ||||
|     position: absolute; | ||||
|     top: 1px; | ||||
| } | ||||
| .notification { | ||||
|     box-sizing: border-box; | ||||
|     position: relative; | ||||
|     padding: 14px 18px; | ||||
|     margin-bottom: 4px; | ||||
|     box-shadow: 0 1px 1px 1px rgba(0,0,0, 0.15); | ||||
|     background-color: #fff; | ||||
|     color: #666; | ||||
|     border: 1px solid #325C80; | ||||
|     border-left-width: 16px; | ||||
|     overflow: hidden; | ||||
| } | ||||
| .notification p:first-child { | ||||
|     font-size: 1.1em; | ||||
|     font-weight: 400; | ||||
| } | ||||
| .notification a { | ||||
|     text-decoration: none; | ||||
|     &:hover { | ||||
|         text-decoration: underline; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .notification-success { | ||||
|     border-color: #4B8400; | ||||
| } | ||||
| .notification-warning { | ||||
|     border-color: #D74108; | ||||
| } | ||||
| .notification-error { | ||||
|     border-color: #AD1625; | ||||
| } | ||||
| @@ -1,124 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| .red-ui-popover { | ||||
|     display: none; | ||||
|     position: absolute; | ||||
|     width: auto; | ||||
|     padding: 10px; | ||||
|     height: auto; | ||||
|     background: #fff; | ||||
|  | ||||
|     z-index: 1000; | ||||
|     font-size: 14px; | ||||
|     line-height: 1.4em; | ||||
|     @include component-shadow; | ||||
| } | ||||
|  | ||||
| .red-ui-popover:after, .red-ui-popover:before { | ||||
|     border: solid transparent; | ||||
|     content: " "; | ||||
|     height: 0; | ||||
|     width: 0; | ||||
|     position: absolute; | ||||
|     pointer-events: none; | ||||
| } | ||||
| .red-ui-popover.red-ui-popover-right:after, .red-ui-popover.red-ui-popover-right:before { | ||||
|     top: 50%; | ||||
|     right: 100%; | ||||
| } | ||||
| .red-ui-popover.red-ui-popover-left:after, .red-ui-popover.red-ui-popover-left:before { | ||||
|     top: 50%; | ||||
|     left: 100%; | ||||
| } | ||||
|  | ||||
| .red-ui-popover.red-ui-popover-bottom:after, .red-ui-popover.red-ui-popover-bottom:before { | ||||
|     bottom: 100%; | ||||
|     left: 50%; | ||||
| } | ||||
|  | ||||
| .red-ui-popover.red-ui-popover-right:after { | ||||
|     border-color: rgba(136, 183, 213, 0); | ||||
|     border-right-color: #fff; | ||||
|     border-width: 10px; | ||||
|     margin-top: -10px; | ||||
| } | ||||
| .red-ui-popover.red-ui-popover-right:before { | ||||
|     border-color: rgba(194, 225, 245, 0); | ||||
|     border-right-color: $primary-border-color; | ||||
|     border-width: 11px; | ||||
|     margin-top: -11px; | ||||
| } | ||||
|  | ||||
| .red-ui-popover.red-ui-popover-left:after { | ||||
|     border-color: rgba(136, 183, 213, 0); | ||||
|     border-left-color: #fff; | ||||
|     border-width: 10px; | ||||
|     margin-top: -10px; | ||||
| } | ||||
| .red-ui-popover.red-ui-popover-left:before { | ||||
|     border-color: rgba(194, 225, 245, 0); | ||||
|     border-left-color: $primary-border-color; | ||||
|     border-width: 11px; | ||||
|     margin-top: -11px; | ||||
| } | ||||
|  | ||||
|  | ||||
| .red-ui-popover.red-ui-popover-bottom:after { | ||||
|     border-color: rgba(136, 183, 213, 0); | ||||
|     border-bottom-color: #fff; | ||||
|     border-width: 10px; | ||||
|     margin-left: -10px; | ||||
| } | ||||
| .red-ui-popover.red-ui-popover-bottom:before { | ||||
|     border-color: rgba(194, 225, 245, 0); | ||||
|     border-bottom-color: $primary-border-color; | ||||
|     border-width: 11px; | ||||
|     margin-left: -11px; | ||||
| } | ||||
|  | ||||
|  | ||||
| .red-ui-popover-size-small { | ||||
|     font-size: 11px; | ||||
|     padding: 5px; | ||||
|  | ||||
|     &.red-ui-popover-right:after { | ||||
|         border-width: 5px; | ||||
|         margin-top: -5px; | ||||
|     } | ||||
|     &.red-ui-popover-right:before { | ||||
|         border-width: 6px; | ||||
|         margin-top: -6px; | ||||
|     } | ||||
|  | ||||
|     &.red-ui-popover-left:after { | ||||
|         border-width: 5px; | ||||
|         margin-top: -5px; | ||||
|     } | ||||
|     &.red-ui-popover-left:before { | ||||
|         border-width: 6px; | ||||
|         margin-top: -6px; | ||||
|     } | ||||
|     &.red-ui-popover-bottom:after { | ||||
|         border-width: 5px; | ||||
|         margin-left: -5px; | ||||
|     } | ||||
|     &.red-ui-popover-bottom:before { | ||||
|         border-width: 6px; | ||||
|         margin-left: -6px; | ||||
|     } | ||||
| } | ||||
| @@ -1,105 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| #sidebar { | ||||
|     position: absolute; | ||||
|     top: 0px; | ||||
|     right: 0px; | ||||
|     bottom: 0px; | ||||
|     width: 315px; | ||||
|     background: #fff; | ||||
|     box-sizing: border-box; | ||||
|     z-index: 10; | ||||
|     @include component-border; | ||||
| } | ||||
|  | ||||
| #sidebar.closing { | ||||
|     background: #eee; | ||||
|     border-color: #900; | ||||
|     border-style: dashed; | ||||
| } | ||||
|  | ||||
| #sidebar-content { | ||||
|     position: absolute; | ||||
|     top: 35px; | ||||
|     right: 0; | ||||
|     bottom: 25px; | ||||
|     left: 0px; | ||||
|     overflow-y: auto; | ||||
| } | ||||
|  | ||||
| #sidebar-separator { | ||||
|     position: absolute; | ||||
|     top: 5px; | ||||
|     right: 315px; | ||||
|     bottom:10px; | ||||
|     width: 7px; | ||||
|     z-index: 11; | ||||
|     background: $background-color url(images/grip.png) no-repeat 50% 50%; | ||||
|     cursor: col-resize; | ||||
| } | ||||
|  | ||||
| .sidebar-closed > #sidebar { display: none; } | ||||
| .sidebar-closed > #sidebar-separator { right: 0px !important; } | ||||
| .sidebar-closed > #workspace { right: 7px !important; } | ||||
| .sidebar-closed > #editor-stack { right: 8px !important; } | ||||
|  | ||||
| #sidebar .button { | ||||
|     @include workspace-button; | ||||
|     line-height: 18px; | ||||
|     font-size: 12px; | ||||
|     margin-right: 5px; | ||||
|     padding: 2px 8px; | ||||
| } | ||||
|  | ||||
| .sidebar-header { | ||||
|     color: #666; | ||||
|     text-align: right; | ||||
|     padding: 8px 10px; | ||||
|     background: #f3f3f3; | ||||
|     border-bottom: 1px solid $secondary-border-color; | ||||
|     white-space: nowrap; | ||||
| } | ||||
|  | ||||
| #sidebar-footer { | ||||
|     @include component-footer; | ||||
| } | ||||
|  | ||||
| .sidebar-footer-button { | ||||
|     @include component-footer-button; | ||||
| } | ||||
| .sidebar-footer-button-toggle { | ||||
|     @include component-footer-button-toggle; | ||||
| } | ||||
| .sidebar-header-button { | ||||
|     @include workspace-button; | ||||
|     font-size: 13px; | ||||
|     line-height: 13px; | ||||
|     padding: 5px 8px; | ||||
| } | ||||
| .sidebar-header-button-toggle { | ||||
|     @include workspace-button-toggle; | ||||
|     font-size: 13px; | ||||
|     line-height: 13px; | ||||
|     padding: 5px 8px; | ||||
| } | ||||
| .sidebar-header-button:not(:first-child) { | ||||
|     border-left: none; | ||||
| } | ||||
|  | ||||
| .sidebar-shade { | ||||
|     @include shade; | ||||
| } | ||||
| @@ -1,136 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| @import "colors"; | ||||
| @import "mixins"; | ||||
|  | ||||
| @import "forms"; | ||||
|  | ||||
| @import "jquery"; | ||||
| @import "bootstrap"; | ||||
| @import "ace"; | ||||
|  | ||||
| @import "dropdownMenu"; | ||||
|  | ||||
| @import "header"; | ||||
| @import "palette"; | ||||
| @import "sidebar"; | ||||
| @import "workspace"; | ||||
| @import "workspaceToolbar"; | ||||
|  | ||||
| @import "notifications"; | ||||
|  | ||||
| @import "editor"; | ||||
| @import "library"; | ||||
| @import "search"; | ||||
|  | ||||
| @import "panels"; | ||||
| @import "tabs"; | ||||
| @import "tab-config"; | ||||
| @import "tab-context"; | ||||
| @import "tab-info"; | ||||
| @import "popover"; | ||||
| @import "flow"; | ||||
| @import "palette-editor"; | ||||
| @import "diff"; | ||||
|  | ||||
| @import "userSettings"; | ||||
|  | ||||
| @import "projects"; | ||||
|  | ||||
|  | ||||
| @import "ui/common/editableList"; | ||||
| @import "ui/common/searchBox"; | ||||
| @import "ui/common/typedInput"; | ||||
| @import "ui/common/nodeList"; | ||||
| @import "ui/common/checkboxSet"; | ||||
| @import "ui/common/stack"; | ||||
|  | ||||
| @import "dragdrop"; | ||||
|  | ||||
| @import "keyboard"; | ||||
|  | ||||
| @import "debug"; | ||||
|  | ||||
| body { | ||||
|     font-size: 14px; | ||||
|     font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; | ||||
|     padding-top: 100px; | ||||
|     background: $background-color; | ||||
| } | ||||
|  | ||||
| #main-container { | ||||
|     position: absolute; | ||||
|     top:40px; left:0; bottom: 0; right:0; | ||||
|     overflow:hidden; | ||||
| } | ||||
|  | ||||
| i.spinner { | ||||
|     display: inline-block; | ||||
|     width: 14px; | ||||
|     height: 14px; | ||||
|     line-height: 14px; | ||||
|     vertical-align: text-top; | ||||
|     margin-top: 0px; | ||||
|     background: url(images/spin.svg) no-repeat 50% 50%; | ||||
|     background-size: contain | ||||
| } | ||||
|  | ||||
| code, pre { | ||||
|   padding: 0 3px 2px; | ||||
|   font-family: monospace; | ||||
|   font-size: 14px; | ||||
|   color: #333333; | ||||
|   border-radius: 1px; | ||||
| } | ||||
|  | ||||
| code { | ||||
|   padding: 0px 3px 2px 3px; | ||||
|   margin: 1px; | ||||
|   color: #AD1625; | ||||
|   white-space: nowrap; | ||||
|   background-color: #f7f7f9; | ||||
|   border: 1px solid #e1e1e8; | ||||
|   border-radius: 2px; | ||||
| } | ||||
|  | ||||
| pre { | ||||
|   display: block; | ||||
|   padding: 9.5px; | ||||
|   margin: 0 0 10px; | ||||
|   line-height: 20px; | ||||
|   word-break: break-all; | ||||
|   word-wrap: break-word; | ||||
|   white-space: pre; | ||||
|   white-space: pre-wrap; | ||||
|   background-color: #f5f5f5; | ||||
|   border: 1px solid #ccc; | ||||
|   border: 1px solid rgba(0, 0, 0, 0.15); | ||||
|   border-radius: 2px; | ||||
| } | ||||
|  | ||||
| pre code { | ||||
|   padding: 0; | ||||
|   color: inherit; | ||||
|   white-space: pre; | ||||
|   white-space: pre-wrap; | ||||
|   background-color: transparent; | ||||
|   border: 0; | ||||
| } | ||||
|  | ||||
| .hide { | ||||
|     display: none; | ||||
| } | ||||
| @@ -1,82 +0,0 @@ | ||||
| /** | ||||
|  * Copyright JS Foundation and other contributors, http://js.foundation | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| .sidebar-node-config { | ||||
|     position: relative; | ||||
|     background: #f3f3f3; | ||||
|     height: 100%; | ||||
|     overflow-y:auto; | ||||
|     @include disable-selection; | ||||
| } | ||||
|  | ||||
|  .config-node-list { | ||||
|      margin: 0; | ||||
|      list-style-type: none; | ||||
|  | ||||
|           .palette_label { | ||||
|               margin-left: 8px; | ||||
|               line-height: 24px; | ||||
|               text-align: left; | ||||
|               white-space: nowrap; | ||||
|               overflow: hidden; | ||||
|               text-overflow: ellipsis; | ||||
|           } | ||||
|           .palette_icon_container { | ||||
|               font-size: 12px; | ||||
|               line-height: 30px; | ||||
|               background-color: #e8e8e8; | ||||
|               border-top-right-radius: 4px; | ||||
|               border-bottom-right-radius: 4px; | ||||
|           } | ||||
|  } | ||||
|  .config_node { | ||||
|      width: 160px; | ||||
|      height: 30px; | ||||
|      background: #f3f3f3; | ||||
|      color: #666; | ||||
|      cursor: pointer; | ||||
| } | ||||
| .config_node_type { | ||||
|     color: #999; | ||||
|     text-align: right; | ||||
|     padding-right: 3px; | ||||
|     &:not(:first-child) { | ||||
|         margin-top: 20px; | ||||
|     } | ||||
| } | ||||
| .config_node_none { | ||||
|     color: #ddd; | ||||
|     text-align:right; | ||||
|     padding-right: 3px; | ||||
| } | ||||
| .config_node_unused { | ||||
|     border-color: #aaa; | ||||
|     background: #f9f9f9; | ||||
|     border-style: dashed; | ||||
|     color: #aaa; | ||||
| } | ||||
| .config-node-filter-info { | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     right:0; | ||||
|     height: 38px; | ||||
|     line-height: 38px; | ||||
|     padding: 0 8px; | ||||
|     background: $palette-header-background; | ||||
|     font-size: 0.8em; | ||||
|     color: #999; | ||||
|     font-weight: normal; | ||||
| } | ||||