Compare commits
	
		
			402 Commits
		
	
	
		
			nem-build-
			...
			enumerated
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 262354c8cf | ||
|   | d30532a8bc | ||
|   | 936079da92 | ||
|   | 4e89ffbe07 | ||
|   | f9ed73c55e | ||
|   | bf3b964ad2 | ||
|   | 55ae755522 | ||
|   | d522570c0b | ||
|   | d72aaf54ca | ||
|   | 8f94751a35 | ||
|   | dfb0a570a3 | ||
|   | 5d06979866 | ||
|   | 8b51ae32d2 | ||
|   | ecb37c54be | ||
|   | 43492d31ba | ||
|   | 0e1df444df | ||
|   | f2c040367b | ||
|   | 0ff360ced3 | ||
|   | fc08df4f6f | ||
|   | c5de90a951 | ||
|   | ea0b86fe72 | ||
|   | d789e91c18 | ||
|   | f7ba24c0b6 | ||
|   | 02ec6db104 | ||
|   | a3a9393d1b | ||
|   | 217e697079 | ||
|   | 82b6166408 | ||
|   | 03ab3bddc4 | ||
|   | abd5913f02 | ||
|   | 107ecfe687 | ||
|   | 4a8222a152 | ||
|   | 7ee8d0a3f7 | ||
|   | dc2b3e85cc | ||
|   | d4b15525ca | ||
|   | cbd9509260 | ||
|   | c5ab6c6c97 | ||
|   | cd84a017b8 | ||
|   | d39dea971f | ||
|   | 4f293f22a6 | ||
|   | cebf9f73da | ||
|   | 37e6b5a352 | ||
|   | ece8f7fded | ||
|   | 3b0a3733b4 | ||
|   | baab0be5af | ||
|   | d14a2a6366 | ||
|   | 377d533ec7 | ||
|   | a4c5854561 | ||
|   | 5296255fa6 | ||
|   | 5d084c2618 | ||
|   | 5208631528 | ||
|   | a56edb9ff4 | ||
|   | 7da1a218ba | ||
|   | a4eb9d6a94 | ||
|   | 20f1dcef45 | ||
|   | 4983d35ca6 | ||
|   | 7171fd01e3 | ||
|   | 0957fbc6f9 | ||
|   | bdbb045005 | ||
|   | 318df9878d | ||
|   | 406a31889e | ||
|   | 9e4e3e9c43 | ||
|   | bd7cb98a4c | ||
|   | 0d419fa5fd | ||
|   | 5ee5e7fea1 | ||
|   | 66b1a92554 | ||
|   | c23c2b84bf | ||
|   | 0c2285719e | ||
|   | fd92c5f970 | ||
|   | 938c266b4e | ||
|   | 9e6e33983b | ||
|   | 40895ec1b9 | ||
|   | 43db52fd70 | ||
|   | 75d6803c9f | ||
|   | ed679756b3 | ||
|   | dd66cb60d8 | ||
|   | d5283d57e4 | ||
|   | 7c140c06dc | ||
|   | f9ff9921a9 | ||
|   | cdac0ad67f | ||
|   | 5d771edcf7 | ||
|   | c4f1c4ad1f | ||
|   | 14b8e02f27 | ||
|   | b383921f2a | ||
|   | a509dfb840 | ||
|   | b7a44a7557 | ||
|   | 2d305415b3 | ||
|   | ff5f37dfbe | ||
|   | 7c2ddf3926 | ||
|   | 18167eddf8 | ||
|   | f302bd6cb2 | ||
|   | 071a908c10 | ||
|   | 7e60593501 | ||
|   | f653362247 | ||
|   | b63b7b1e5d | ||
|   | 55e00baeaf | ||
|   | 75178576dd | ||
|   | 670c06103f | ||
|   | 7b5218c5ba | ||
|   | f192544be3 | ||
|   | 2cc2c6a9d3 | ||
|   | a910fa8f37 | ||
|   | 65ca78d8aa | ||
|   | 2f036a89e4 | ||
|   | fa46d31ac2 | ||
|   | 549dfab5aa | ||
|   | 494212a448 | ||
|   | 8511dc93b5 | ||
|   | 751414a686 | ||
|   | 668b09b789 | ||
|   | b9e0a77655 | ||
|   | b9a7ee423a | ||
|   | b5c6b70993 | ||
|   | d9b2034550 | ||
|   | 183bd9793c | ||
|   | d176797307 | ||
|   | 96d9f8c194 | ||
|   | 748673f99b | ||
|   | 78374f8241 | ||
|   | bc6185f76d | ||
|   | 747a98d130 | ||
|   | 7daaecbf8f | ||
|   | 6f9e78a14f | ||
|   | beee4136a6 | ||
|   | 5a9bcfa938 | ||
|   | 721557b814 | ||
|   | 70ed16491a | ||
|   | 7240ff4f8d | ||
|   | 3a6e0be2d7 | ||
|   | 9b21b0b7f2 | ||
|   | 164c2faf07 | ||
|   | 894cf5c461 | ||
|   | fe419714f5 | ||
|   | f3fd2e67fc | ||
|   | 931fa77cbe | ||
|   | 872c4021e3 | ||
|   | 26d29c3d92 | ||
|   | 596735352a | ||
|   | 402512a461 | ||
|   | 2d03e3e6d4 | ||
|   | 19b442cc0b | ||
|   | 5c3d8508a2 | ||
|   | 8581547a9c | ||
|   | 192bbae6e5 | ||
|   | e61711688e | ||
|   | a73f1ebbbd | ||
|   | 4674918b4b | ||
|   | 741d4476e6 | ||
|   | bf1fa0ac4c | ||
|   | 60efdb4ad3 | ||
|   | 8ea56486c5 | ||
|   | e13e068b6e | ||
|   | 852faf061e | ||
|   | f2e4b01721 | ||
|   | 930fed83e8 | ||
|   | 4666292907 | ||
|   | f04c3692c1 | ||
|   | ffa497f22f | ||
|   | 0068348bb2 | ||
|   | bc3eb4ab8d | ||
|   | d203f3adc0 | ||
|   | 5e7eb7e87e | ||
|   | 1a2a2e66ca | ||
|   | 129b554f9d | ||
|   | 164d959f60 | ||
|   | 99cf690ad4 | ||
|   | aabeb72203 | ||
|   | fcdf89a4ee | ||
|   | 77a2e0a70b | ||
|   | f379db55e7 | ||
|   | 51fbbfe601 | ||
|   | eaab70741a | ||
|   | a05d6d8ee8 | ||
|   | 88945c48d4 | ||
|   | bd7ad85bd7 | ||
|   | 9b3c8dce25 | ||
|   | 4d800d26e2 | ||
|   | 0a71835687 | ||
|   | 25f3b1e110 | ||
|   | 31a983966b | ||
|   | 87934df0d5 | ||
|   | db1a7e37e8 | ||
|   | d3e274bfdd | ||
|   | b5c88e5c5c | ||
|   | 5d8efebc55 | ||
|   | 729d91e7f3 | ||
|   | 34b0b55b97 | ||
|   | bd0867b79d | ||
|   | 6d036a5d67 | ||
|   | c0168088a1 | ||
|   | 5f81e95c87 | ||
|   | ebf501ce71 | ||
|   | ed09214f59 | ||
|   | b0b2db24e0 | ||
|   | a2f8f4334f | ||
|   | 626cc502fb | ||
|   | 95f1768fb7 | ||
|   | fb20af24bc | ||
|   | f6cb76354e | ||
|   | 66905cbcbb | ||
|   | a4f24adb8a | ||
|   | 242e02e9af | ||
|   | 0ddaa52a8a | ||
|   | 6fee4f340f | ||
|   | 1eb372177d | ||
|   | 3de094e311 | ||
|   | 53c60ee64f | ||
|   | 42ce2aa7cf | ||
|   | 43d497e069 | ||
|   | 7d0de68db9 | ||
|   | 5306e96374 | ||
|   | 156940f25b | ||
|   | 10e0acddb3 | ||
|   | ceee7e0da9 | ||
|   | 53a49a671b | ||
|   | 99a454f943 | ||
|   | cb53e1aaee | ||
|   | 0f231838ec | ||
|   | 0bdf05e61c | ||
|   | 3146660833 | ||
|   | 72df464f0f | ||
|   | f602aa9247 | ||
|   | b37b82133e | ||
|   | c43929f1c6 | ||
|   | 88750d92ef | ||
|   | 8c602025d4 | ||
|   | 5604120d55 | ||
|   | 5daf2f54cd | ||
|   | 24c750b41e | ||
|   | ab1c79f25d | ||
|   | 668c02f278 | ||
|   | 437b235361 | ||
|   | 6880c82719 | ||
|   | 645bd5743f | ||
|   | 273cf1c14f | ||
|   | be031285b9 | ||
|   | 303e870b0d | ||
|   | b42ccebd5a | ||
|   | a444fc01ad | ||
|   | a126e43286 | ||
|   | 32fc50bbd3 | ||
|   | 4adb075a2b | ||
|   | d8b1e570d9 | ||
|   | 5033e2cdbb | ||
|   | b40ac6f44f | ||
|   | 0a5097a945 | ||
|   | f615dc5409 | ||
|   | b0e4947bf0 | ||
|   | 5292b27e7d | ||
|   | 5d4ace64cb | ||
|   | 3adc5f1e26 | ||
|   | 92e49d6b76 | ||
|   | 659d05f73a | ||
|   | 215008253d | ||
|   | 2f0fd8eebd | ||
|   | 882cf80ba9 | ||
|   | 8c1264ab22 | ||
|   | cb0f191ab3 | ||
|   | c07dc0ea8b | ||
|   | c4d5643ea7 | ||
|   | 300d71ddc2 | ||
|   | 54c67b891c | ||
|   | 013690e0df | ||
|   | 8868b6a130 | ||
|   | 750a5648d2 | ||
|   | cec6295d24 | ||
|   | 15eb4b047f | ||
|   | 3ae8fcc8b4 | ||
|   | 9371fcbc4c | ||
|   | f5e0ad23ea | ||
|   | abf5f22155 | ||
|   | f2903f4030 | ||
|   | 371669fbce | ||
|   | 68f3cd087d | ||
|   | 115ffe7963 | ||
|   | e3a0cae5fd | ||
|   | 8bb5a47b88 | ||
|   | f1b6d7f749 | ||
|   | 6fb6761abf | ||
|   | 73324ce338 | ||
|   | ef708cf11c | ||
|   | ad767d0db9 | ||
|   | f11cd589c5 | ||
|   | 2036a467ce | ||
|   | 4cb183adc3 | ||
|   | 52b01e8bdb | ||
|   | a10db656ce | ||
|   | 4926ccb07b | ||
|   | 2dd9a16bf3 | ||
|   | 339faf5376 | ||
|   | 10c3ffc4be | ||
|   | aebae27391 | ||
|   | 97d0a66684 | ||
|   | bb7f4239f6 | ||
|   | 9b524af3ce | ||
|   | 5081e89590 | ||
|   | d2a7e04b44 | ||
|   | fcb23b42a4 | ||
|   | 6b585d175b | ||
|   | 6b32db778a | ||
|   | 924a4026ff | ||
|   | 25a7df7885 | ||
|   | ddb5837145 | ||
|   | 6509d84a5d | ||
|   | 507f2391ff | ||
|   | 38e703a121 | ||
|   | e564baba1a | ||
|   | 0a546cd50c | ||
|   | baf32dd62f | ||
|   | 71db4b38ab | ||
|   | 2727c9544d | ||
|   | a35b0c1d7b | ||
|   | df94d31cf3 | ||
|   | c3f819fa8c | ||
|   | 5b0ee8588c | ||
|   | fcfb3eebda | ||
|   | 84e1e87ce3 | ||
|   | 41cfd050a2 | ||
|   | d67ffa8401 | ||
|   | fd2f4128a0 | ||
|   | 814fb3b513 | ||
|   | e0fbaa83b0 | ||
|   | 967f8c9151 | ||
|   | 84ecfd3527 | ||
|   | 3a4f6a7229 | ||
|   | 7a160a0a98 | ||
|   | cf15b6eed7 | ||
|   | 452b05eb7b | ||
|   | 82261dfabc | ||
|   | fc7bd36dba | ||
|   | 918c667496 | ||
|   | 7c23f803e8 | ||
|   | 97c69799b4 | ||
|   | 406fdd5efc | ||
|   | f334be8f23 | ||
|   | e1b7f2af30 | ||
|   | ad63b9ff1b | ||
|   | e83b19c84b | ||
|   | dbf196e014 | ||
|   | b5c8ecc85f | ||
|   | 9e6da94878 | ||
|   | 3a26c864b8 | ||
|   | be7827d6f8 | ||
|   | b8b5fdcabf | ||
|   | c091063b83 | ||
|   | 45276183b9 | ||
|   | 54653f3914 | ||
|   | cd2b19eb1e | ||
|   | 3850db268a | ||
|   | c65096f166 | ||
|   | fcae3fd7a9 | ||
|   | 83dd23cd4b | ||
|   | 26c155da3b | ||
|   | 2d44cf78f9 | ||
|   | 9b6f3bff85 | ||
|   | c2207fe7ce | ||
|   | 119429bc42 | ||
|   | a94e99af70 | ||
|   | 96dc055f02 | ||
|   | a50410f8ed | ||
|   | 0dc715199d | ||
|   | aab53c4ae1 | ||
|   | b63812111d | ||
|   | 442229fd42 | ||
|   | a7a707595c | ||
|   | 8c325eb1b1 | ||
|   | 5e628b1a25 | ||
|   | f8114ba6b6 | ||
|   | a10f895904 | ||
|   | 9b59fd7eae | ||
|   | 9fe026a1f1 | ||
|   | 3b5c1bf2e6 | ||
|   | bb993dc94f | ||
|   | 5beb1de805 | ||
|   | 0a012c67dd | ||
|   | 11b71fae68 | ||
|   | e6d0537e5e | ||
|   | 99556ed6a5 | ||
|   | 07c407edea | ||
|   | 2e65a6a63e | ||
|   | 43f6981ba1 | ||
|   | b8206b8824 | ||
|   | 5f7f349f29 | ||
|   | ef0a918b59 | ||
|   | 5fd1f6a055 | ||
|   | d45c5e2ffb | ||
|   | 1fef6b30b7 | ||
|   | 461cc59b3e | ||
|   | c038ccd0d2 | ||
|   | e16b156d1d | ||
|   | 1f6284257e | ||
|   | 16bf800257 | ||
|   | 7fad2f6f2e | ||
|   | 73ca30e654 | ||
|   | fc751b1332 | ||
|   | cdc2a407dc | ||
|   | 14722a6ef5 | ||
|   | 0538d6e60f | ||
|   | 1fcf900271 | ||
|   | 183468fcbf | ||
|   | 9b11d95437 | ||
|   | 67d78772fa | ||
|   | 7f0f03e787 | 
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -4,8 +4,11 @@ | ||||
| *.tgz | ||||
| *.DS_Store | ||||
|  | ||||
| # Compiled CSS, unless directly added | ||||
| *.sass-cache | ||||
| *COMPILE.css | ||||
| *.css | ||||
| *.css.map | ||||
|  | ||||
| # Intellij project configuration files | ||||
| *.idea | ||||
| @@ -15,6 +18,7 @@ | ||||
|  | ||||
| # Build output | ||||
| target | ||||
| dist | ||||
|  | ||||
| # Mac OS X Finder | ||||
| .DS_Store | ||||
| @@ -22,8 +26,9 @@ target | ||||
| # Closed source libraries | ||||
| closed-lib | ||||
|  | ||||
| # Node dependencies | ||||
| # Node, Bower dependencies | ||||
| node_modules | ||||
| bower_components | ||||
|  | ||||
| # Protractor logs | ||||
| protractor/logs | ||||
|   | ||||
							
								
								
									
										35
									
								
								.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,35 @@ | ||||
| *.scssc | ||||
| *.zip | ||||
| *.gzip | ||||
| *.tgz | ||||
| *.DS_Store | ||||
|  | ||||
| *.sass-cache | ||||
| *COMPILE.css | ||||
|  | ||||
| # Intellij project configuration files | ||||
| *.idea | ||||
| *.iml | ||||
|  | ||||
| # External dependencies | ||||
|  | ||||
| # Build output | ||||
| target | ||||
|  | ||||
| # Mac OS X Finder | ||||
| .DS_Store | ||||
|  | ||||
| # Closed source libraries | ||||
| closed-lib | ||||
|  | ||||
| # Node, Bower dependencies | ||||
| node_modules | ||||
| bower_components | ||||
|  | ||||
| Procfile | ||||
|  | ||||
| # Protractor logs | ||||
| protractor/logs | ||||
|  | ||||
| # npm-debug log | ||||
| npm-debug.log | ||||
							
								
								
									
										156
									
								
								LICENSES.md
									
									
									
									
									
								
							
							
						
						| @@ -135,7 +135,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| * Link: http://requirejs.org/ | ||||
|  | ||||
| * Version: 2.1.9 | ||||
| * Version: 2.1.22 | ||||
|  | ||||
| * Author: The Dojo Foundation | ||||
|  | ||||
| @@ -153,13 +153,49 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| --- | ||||
|  | ||||
| ### requirejs-text | ||||
|  | ||||
| #### Info | ||||
|  | ||||
| * Link: https://github.com/requirejs/text | ||||
|  | ||||
| * Version: 2.0.14 | ||||
|  | ||||
| * Author: The Dojo Foundation | ||||
|  | ||||
| * Description: Text loading plugin for RequireJS | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright (c) 2010-2014, The Dojo Foundation | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in | ||||
| all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
| THE SOFTWARE. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ### AngularJS | ||||
|  | ||||
| #### Info | ||||
|  | ||||
| * Link: http://angularjs.org/ | ||||
|  | ||||
| * Version: 1.2.26 | ||||
| * Version: 1.4.4 | ||||
|  | ||||
| * Author: Google | ||||
|  | ||||
| @@ -167,7 +203,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright (c) 2010-2014 Google, Inc. http://angularjs.org | ||||
| Copyright (c) 2010-2015 Google, Inc. http://angularjs.org | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| @@ -183,7 +219,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| * Link: http://angularjs.org/ | ||||
|  | ||||
| * Version: 1.2.26 | ||||
| * Version: 1.4.4 | ||||
|  | ||||
| * Author: Google | ||||
|  | ||||
| @@ -191,7 +227,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright (c) 2010-2014 Google, Inc. http://angularjs.org | ||||
| Copyright (c) 2010-2015 Google, Inc. http://angularjs.org | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| @@ -207,7 +243,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| * Link: https://github.com/jakearchibald/es6-promise | ||||
|  | ||||
| * Version: 2.0.0 | ||||
| * Version: 3.0.2 | ||||
|  | ||||
| * Authors: Yehuda Katz, Tom Dale, Stefan Penner and contributors | ||||
|  | ||||
| @@ -231,7 +267,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| * Link: https://github.com/sindresorhus/screenfull.js/ | ||||
|  | ||||
| * Version: 1.2.0 | ||||
| * Version: 3.0.0 | ||||
|  | ||||
| * Author: Sindre Sorhus | ||||
|  | ||||
| @@ -255,15 +291,15 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| * Link: https://github.com/broofa/node-uuid | ||||
|  | ||||
| * Version: 1.4 | ||||
| * Version: 1.4.7 | ||||
|  | ||||
| * Author: Robert Kieffer | ||||
|  | ||||
| * Description: Unique identifer generation (code adapted.) | ||||
| * Description: Unique identifer generation. | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright (c) 2010 Robert Kieffer | ||||
| Copyright (c) 2010-2012 Robert Kieffer | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| @@ -327,7 +363,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| * Link: http://momentjs.com | ||||
|  | ||||
| * Version: 2.7.0 | ||||
| * Version: 2.11.1 | ||||
|  | ||||
| * Authors: Tim Wood, Iskren Chernev, Moment.js contributors | ||||
|  | ||||
| @@ -380,6 +416,104 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ### CSV.js | ||||
|  | ||||
| #### Info | ||||
|  | ||||
| * Link: https://github.com/knrz/CSV.js | ||||
|  | ||||
| * Version: 3.6.4 | ||||
|  | ||||
| * Authors: Kash Nouroozi | ||||
|  | ||||
| * Description: Encoder for CSV (comma separated values) export | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright (c) 2014 Kash Nouroozi | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ### FileSaver.js | ||||
|  | ||||
| #### Info | ||||
|  | ||||
| * Link: https://github.com/eligrey/FileSaver.js/ | ||||
|  | ||||
| * Version: 0.0.2 | ||||
|  | ||||
| * Authors: Eli Grey | ||||
|  | ||||
| * Description: File download initiator (for file exports) | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright © 2015 Eli Grey. | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ### Zepto | ||||
|  | ||||
| #### Info | ||||
|  | ||||
| * Link: http://zeptojs.com/ | ||||
|  | ||||
| * Version: 1.1.6 | ||||
|  | ||||
| * Authors: Thomas Fuchs | ||||
|  | ||||
| * Description: DOM manipulation | ||||
|  | ||||
| #### License | ||||
|  | ||||
| Copyright (c) 2010-2016 Thomas Fuchs | ||||
| http://zeptojs.com/ | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the | ||||
| "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be | ||||
| included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ### Json.NET | ||||
|  | ||||
| #### Info | ||||
|   | ||||
							
								
								
									
										53
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -20,27 +20,6 @@ directory names) to include in a running instance of Open MCT Web. Adding or | ||||
| removing paths from this list will add or remove bundles from the running | ||||
| application. | ||||
|  | ||||
| ### Bundle Contents | ||||
|  | ||||
| A bundle directory will contain: | ||||
|  | ||||
| * `bundle.json`, the declaration of the bundles contents. | ||||
| * A source code directory, named `src` by convention. This contains all | ||||
|   JavaScript sources exposed by the bundle. These are declared as | ||||
|   AMD modules. | ||||
| * A directory for other resources, named `res` by convention. This | ||||
|   contains all HTML templates, CSS files, images, and so forth to be | ||||
|   used within a given bundle. | ||||
| * A library directory, named `lib` by convention. This contains all | ||||
|   external libraries used and/or exposed by the bundle. | ||||
| * A test directory, named `test` by convention. This contains all unit | ||||
|   tests declared for the bundle, as well as a `suite.json` that acts | ||||
|   as a listing of these dependencies. See the section on unit testing | ||||
|   below. | ||||
|  | ||||
| Following these bundle conventions is required, at present, to ensure | ||||
| that Open MCT Web (and its build and tests) execute correctly. | ||||
|  | ||||
| ## Tests | ||||
|  | ||||
| Tests are written for [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html) | ||||
| @@ -66,7 +45,7 @@ When `npm test` is run, test results will be written as HTML to | ||||
|  | ||||
| The tests described above are all at the unit-level; an additional | ||||
| test suite using [Protractor](https://angular.github.io/protractor/) | ||||
| us under development, in the `protractor` folder. | ||||
| is under development, in the `protractor` folder. | ||||
|  | ||||
| To run: | ||||
|  | ||||
| @@ -77,24 +56,22 @@ To run: | ||||
|  | ||||
| ## Build | ||||
|  | ||||
| Open MCT Web includes a Maven command line build. Although Open MCT Web | ||||
| can be run as-is using the repository contents (that is, by viewing | ||||
| `index.html` in a web browser), the command | ||||
| line build allows machine-driven verification and packaging. | ||||
| Open MCT Web is built using [`npm`](http://npmjs.com/) | ||||
| and [`gulp`](http://gulpjs.com/). | ||||
|  | ||||
| This build will: | ||||
| To build: | ||||
|  | ||||
| * Check all sources (excluding those in directories named `lib`) with | ||||
|   JSLint for code style compliance. The build will fail if any sources | ||||
|   do not satisfy JSLint. | ||||
| * Run the [unit test suite](#tests). | ||||
| * Package the application as a `war` (web archive) file. This is | ||||
|   convenient for deployment on Tomcat or similar. This archive will | ||||
|   include sources, resources, and libraries for bundles, as well | ||||
|   as the top-level files used to initiate running of the application | ||||
|   (`index.html` and `bundles.json`). | ||||
| `npm run prepublish` | ||||
|  | ||||
| Run as `mvn clean install`. | ||||
| This will compile and minify JavaScript sources, as well as copy over assets. | ||||
| The contents of the `dist` folder will contain a runnable Open MCT Web | ||||
| instance (e.g. by starting an HTTP server in that directory), including: | ||||
|  | ||||
| * A `main.js` file containing Open MCT Web source code. | ||||
| * Various assets in the `example` and `platform` directories. | ||||
| * An `index.html` that runs Open MCT Web in its default configuration. | ||||
|  | ||||
| Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). | ||||
|  | ||||
| ### Building Documentation | ||||
|  | ||||
| @@ -105,7 +82,7 @@ npm install.  Ensure your system has [libcairo](http://cairographics.org/) | ||||
| installed and then run the following commands: | ||||
|  | ||||
| * `npm install` | ||||
| * `npm install nomnoml` | ||||
| * `npm install canvas nomnoml` | ||||
| * `npm run docs` | ||||
|  | ||||
| Documentation will be generated in `target/docs`. | ||||
|   | ||||
							
								
								
									
										11
									
								
								app.js
									
									
									
									
									
								
							
							
						
						| @@ -14,7 +14,8 @@ | ||||
|         options = require('minimist')(process.argv.slice(2)), | ||||
|         express = require('express'), | ||||
|         app = express(), | ||||
|         fs = require('fs'); | ||||
|         fs = require('fs'), | ||||
|         request = require('request'); | ||||
|  | ||||
|     // Defaults | ||||
|     options.port = options.port || options.p || 8080; | ||||
| @@ -61,6 +62,14 @@ | ||||
|         res.send(JSON.stringify(bundles)); | ||||
|     }); | ||||
|  | ||||
|     app.use('/proxyUrl', function proxyRequest(req, res, next) { | ||||
|         console.log('Proxying request to: ', req.query.url); | ||||
|         req.pipe(request({ | ||||
|             url: req.query.url, | ||||
|             strictSSL: false | ||||
|         }).on('error', next)).pipe(res); | ||||
|     }); | ||||
|  | ||||
|     // Expose everything else as static files | ||||
|     app.use(express['static']('.')); | ||||
|  | ||||
|   | ||||
							
								
								
									
										23
									
								
								bower.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | ||||
| { | ||||
|   "name": "openmctweb", | ||||
|   "description": "The OpenMCTWeb core platform", | ||||
|   "main": "", | ||||
|   "license": "Apache-2.0", | ||||
|   "moduleType": [], | ||||
|   "homepage": "http://nasa.github.io/openmctweb/", | ||||
|   "private": true, | ||||
|   "dependencies": { | ||||
|     "angular": "1.4.4", | ||||
|     "angular-route": "1.4.4", | ||||
|     "moment": "^2.11.1", | ||||
|     "moment-duration-format": "^1.3.0", | ||||
|     "requirejs": "~2.1.22", | ||||
|     "text": "requirejs-text#^2.0.14", | ||||
|     "es6-promise": "^3.0.2", | ||||
|     "screenfull": "^3.0.0", | ||||
|     "node-uuid": "^1.4.7", | ||||
|     "comma-separated-values": "^3.6.4", | ||||
|     "FileSaver.js": "^0.0.2", | ||||
|     "zepto": "^1.1.6" | ||||
|   } | ||||
| } | ||||
| @@ -2,7 +2,7 @@ deployment: | ||||
|   production: | ||||
|     branch: master | ||||
|     commands: | ||||
|       - npm install nomnoml | ||||
|       - npm install canvas nomnoml | ||||
|       - ./build-docs.sh | ||||
|       - git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master | ||||
|   openmctweb-staging-un: | ||||
| @@ -13,3 +13,6 @@ deployment: | ||||
|     branch: mobile | ||||
|     heroku: | ||||
|       appname: openmctweb-staging-deux | ||||
| test: | ||||
|   post: | ||||
|     - npm run jshint --silent | ||||
|   | ||||
| @@ -910,7 +910,24 @@ A capability's implementation may also expose a static method `appliesTo(model)` | ||||
| which should return a boolean value, and will be used by the platform to filter  | ||||
| down capabilities to those which should be exposed by specific domain objects,  | ||||
| based on their domain object models.  | ||||
|   | ||||
|  | ||||
| ## Containers Category | ||||
|  | ||||
| Containers provide options for the `mct-container` directive. | ||||
|  | ||||
| The definition for an extension in the `containers` category should include: | ||||
|  | ||||
| * `key`: An identifier for the container. | ||||
| * `template`: An Angular template for the container, including an | ||||
|   `ng-transclude` where contained content should go. | ||||
| * `attributes`: An array of attribute names. The values associated with | ||||
|    these attributes will be exposed in the template's scope under the | ||||
|    name provided by the `alias` property. | ||||
| * `alias`: The property name in scope under which attributes will be | ||||
|   exposed. Optional; defaults to "container". | ||||
|  | ||||
| Note that `templateUrl` is not supported for `containers`. | ||||
|  | ||||
| ## Controls Category | ||||
|  | ||||
| Controls provide options for the `mct-control` directive.  | ||||
| @@ -2245,18 +2262,27 @@ options. The sources can be deployed in the same directory structure used during | ||||
| development. A few utilities are included to support development processes. | ||||
|  | ||||
| ## Command-line Build | ||||
| Open MCT Web includes a script for building via command line using Maven 3.3.9  | ||||
| https://maven.apache.org/ . | ||||
|          | ||||
| Invoking mvn clean install will: | ||||
|  | ||||
| * Check code style using JSLint. The build will fail if JSLint raises any warnings. | ||||
| * Run the test suite (see below.) The build will fail if any tests fail. | ||||
| * Populate version info (e.g. commit hash, build time.) | ||||
| * Produce a web archive (`.war`) artifact in the `target` directory. | ||||
| Open MCT Web is built using [`npm`](http://npmjs.com/) | ||||
| and [`gulp`](http://gulpjs.com/). | ||||
|  | ||||
| The produced artifact contains a subset of the repository's own folder  | ||||
| hierarchy, omitting tests and example bundles.         | ||||
| To install build dependencies (only needs to be run once): | ||||
|  | ||||
| `npm install` | ||||
|  | ||||
| To build: | ||||
|  | ||||
| `npm run prepublish` | ||||
|  | ||||
| This will compile and minify JavaScript sources, as well as copy over assets. | ||||
| The contents of the `dist` folder will contain a runnable Open MCT Web | ||||
| instance (e.g. by starting an HTTP server in that directory), including: | ||||
|  | ||||
| * A `main.js` file containing Open MCT Web source code. | ||||
| * Various assets in the `example` and `platform` directories. | ||||
| * An `index.html` that runs Open MCT Web in its default configuration. | ||||
|  | ||||
| Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). | ||||
|  | ||||
| Note that an internet connection is required to run this build, in order to  | ||||
| download build dependencies. | ||||
|   | ||||
							
								
								
									
										111
									
								
								example/enumeratedTelemetry/bundle.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,111 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/EnumeratedTelemetryProvider", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     EnumeratedTelemetryProvider, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("example/enumeratedTelemetry", { | ||||
|         "name": "Enumerated telemetry generator", | ||||
|         "description": "Example telemetry source that provides enumerated telemetry.", | ||||
|         "extensions": { | ||||
|             "components": [ | ||||
|                 { | ||||
|                     "implementation": EnumeratedTelemetryProvider, | ||||
|                     "type": "provider", | ||||
|                     "provides": "telemetryService", | ||||
|                     "depends": [ | ||||
|                         "$q", | ||||
|                         "$interval" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "types": [ | ||||
|                 { | ||||
|                     "key": "example.telemetry.enumerated", | ||||
|                     "name": "Enumerated Telemetry Generator", | ||||
|                     "glyph": "T", | ||||
|                     "description": "Generated enumerated telemetry data", | ||||
|                     "features": "creation", | ||||
|                     "model": { | ||||
|                         "telemetry": { | ||||
|  | ||||
|                         } | ||||
|                     }, | ||||
|                     "telemetry": { | ||||
|                         "source": "example.telemetry.enumerated", | ||||
|                         "domains": [ | ||||
|                             { | ||||
|                                 "key": "time", | ||||
|                                 "name": "Time" | ||||
|                             } | ||||
|                         ], | ||||
|                         "ranges": [ | ||||
|                             { | ||||
|                                 "key": "eu", | ||||
|                                 "name": "Engineering Unit" | ||||
|                             }, | ||||
|                             { | ||||
|                                 "key": "eu", | ||||
|                                 "name": "Enum", | ||||
|                                 "type": "enum", | ||||
|                                 "format": "enum", | ||||
|                                 "enumerations": [ | ||||
|                                     { | ||||
|                                         "key": "eu", | ||||
|                                         "format": "enum", | ||||
|                                         "value": 0, | ||||
|                                         "string": "OFF" | ||||
|                                     }, | ||||
|                                     { | ||||
|                                         "key": "eu", | ||||
|                                         "format": "enum", | ||||
|                                         "value": 1, | ||||
|                                         "string": "IDLE" | ||||
|                                     }, | ||||
|                                     { | ||||
|                                         "key": "eu", | ||||
|                                         "format": "enum", | ||||
|                                         "value": 2, | ||||
|                                         "string": "RECEIVE" | ||||
|                                     }, | ||||
|                                     { | ||||
|                                         "key": "eu", | ||||
|                                         "format": "enum", | ||||
|                                         "value": 3, | ||||
|                                         "string": "TRANSMIT" | ||||
|                                     } | ||||
|                                 ] | ||||
|                             } | ||||
|                         ] | ||||
|                     } | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
							
								
								
									
										163
									
								
								example/enumeratedTelemetry/src/EnumeratedTelemetryProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,163 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ["./EnumeratedTelemetrySeries"], | ||||
|     function (EnumeratedTelemetrySeries) { | ||||
|         "use strict"; | ||||
|  | ||||
|         function EnumeratedTelemetryProvider($q, $interval) { | ||||
|             this.$q = $q; | ||||
|             this.$interval = $interval; | ||||
|         } | ||||
|  | ||||
|         EnumeratedTelemetryProvider.prototype.matchRequest = function ( | ||||
|             request | ||||
|         ) { | ||||
|             return request.source === 'example.telemetry.enumerated'; | ||||
|         }; | ||||
|  | ||||
|         // Return a telemetry series between start and end time with | ||||
|         // 1000 telemetry points. | ||||
|         EnumeratedTelemetryProvider.prototype.getSeries = function ( | ||||
|             start, | ||||
|             end, | ||||
|             request | ||||
|         ) { | ||||
|             var elapsedSeconds = (end - start) / 1000, | ||||
|                 valueEvery = elapsedSeconds / 1000, | ||||
|                 currentSecond = 0, | ||||
|                 values = [], | ||||
|                 currentValue = 0; | ||||
|  | ||||
|             while (currentSecond < elapsedSeconds) { | ||||
|                 values.push({ | ||||
|                     time: +new Date(+start + (currentSecond * 1000)), | ||||
|                     eu: currentValue | ||||
|                 }); | ||||
|                 if ((values.length % Math.pow(3, currentValue + 1)) === 0) { | ||||
|                     if (currentValue === 3) { | ||||
|                         currentValue = 0; | ||||
|                     } else { | ||||
|                         currentValue += 1; | ||||
|                     } | ||||
|                 } | ||||
|                 currentSecond += valueEvery; | ||||
|             } | ||||
|  | ||||
|             return new EnumeratedTelemetrySeries(values); | ||||
|         }; | ||||
|  | ||||
|         EnumeratedTelemetryProvider.prototype.requestTelemetry = function ( | ||||
|             requests | ||||
|         ) { | ||||
|             var validRequests = requests.filter(this.matchRequest), | ||||
|                 generatedTelemetry = {}, | ||||
|                 response = { | ||||
|                     'example.telemetry.enumerated': generatedTelemetry | ||||
|                 }; | ||||
|  | ||||
|             validRequests.forEach(function (validRequest) { | ||||
|                 var start = validRequest.start, | ||||
|                     end = validRequest.end; | ||||
|  | ||||
|                 if (!end) { | ||||
|                     end = new Date(Date.now()); | ||||
|                 } | ||||
|                 if (!start) { | ||||
|                     start = new Date(Date.UTC( | ||||
|                         end.getUTCFullYear(), | ||||
|                         end.getUTCMonth(), | ||||
|                         end.getUTCDate() - 1, | ||||
|                         end.getUTCHours(), | ||||
|                         end.getUTCMinutes(), | ||||
|                         end.getUTCSeconds(), | ||||
|                         end.getUTCMilliseconds() | ||||
|                     )); | ||||
|                 } | ||||
|                 generatedTelemetry[validRequest.key] = | ||||
|                     this.getSeries(start, end); | ||||
|             }, this); | ||||
|  | ||||
|             return this.$q.resolve(response); | ||||
|         }; | ||||
|  | ||||
|         EnumeratedTelemetryProvider.prototype.makeTelemetryEmitter = function ( | ||||
|             request, | ||||
|             callback | ||||
|         ) { | ||||
|             var valueEvery = 1000, | ||||
|                 currentSecond = 0, | ||||
|                 valuesGenerated = 0, | ||||
|                 currentValue = 0, | ||||
|                 interval; | ||||
|  | ||||
|             interval = this.$interval(function () { | ||||
|                 var value = { | ||||
|                         time: +new Date(Date.now()), | ||||
|                         eu: currentValue | ||||
|                     }, | ||||
|                     series = new EnumeratedTelemetrySeries([value]); | ||||
|  | ||||
|                 valuesGenerated += 1; | ||||
|                 if ((valuesGenerated % Math.pow(3, currentValue + 1)) === 0) { | ||||
|                     if (currentValue === 3) { | ||||
|                         currentValue = 0; | ||||
|                     } else { | ||||
|                         currentValue += 1; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 callback(series); | ||||
|             }, valueEvery); | ||||
|  | ||||
|             return function () { | ||||
|                 this.$interval.cancel(interval); | ||||
|             }.bind(this); | ||||
|         } | ||||
|  | ||||
|         EnumeratedTelemetryProvider.prototype.subscribe = function ( | ||||
|             callback, | ||||
|             requests | ||||
|         ) { | ||||
|             var validRequests = requests.filter(this.matchRequest), | ||||
|                 unsubscribes = validRequests.map(function (request) { | ||||
|                     var cb = function (series) { | ||||
|                         var telem = {}, | ||||
|                             response = { | ||||
|                                 'example.telemetry.enumerated': telem | ||||
|                             }; | ||||
|                         telem[request.key] = series; | ||||
|                         callback(response); | ||||
|                     } | ||||
|                     return this.makeTelemetryEmitter(request, cb); | ||||
|                 }, this) | ||||
|             return function () { | ||||
|                 unsubscribes.forEach(function(unsubscribe) { | ||||
|                     unsubscribe(); | ||||
|                 }); | ||||
|             }; | ||||
|         }; | ||||
|  | ||||
|         return EnumeratedTelemetryProvider; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										63
									
								
								example/enumeratedTelemetry/src/EnumeratedTelemetrySeries.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,63 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|  | ||||
| ], function ( | ||||
|  | ||||
| ) { | ||||
|     'use strict'; | ||||
|  | ||||
|  | ||||
|     function EnumeratedTelemetrySeries(data) { | ||||
|         this.data = data; | ||||
|     } | ||||
|  | ||||
|     EnumeratedTelemetrySeries.prototype.getPointCount = function (index) { | ||||
|         return this.data.length; | ||||
|     }; | ||||
|  | ||||
|     EnumeratedTelemetrySeries.prototype.getDatum = function (index) { | ||||
|         if (index > this.data.length || index < 0) { | ||||
|             throw new Error('IndexOutOfRange: index not available in series.'); | ||||
|         } | ||||
|         return this.data[index]; | ||||
|     }; | ||||
|  | ||||
|     EnumeratedTelemetrySeries.prototype.getRangeValue = function ( | ||||
|         index, | ||||
|         range | ||||
|     ) { | ||||
|         range = range || 'eu'; | ||||
|         return this.getDatum(index)[range]; | ||||
|     }; | ||||
|  | ||||
|     EnumeratedTelemetrySeries.prototype.getDomainValue = function ( | ||||
|         index, | ||||
|         domain | ||||
|     ) { | ||||
|         domain = domain || 'time'; | ||||
|         return this.getDatum(index)[domain]; | ||||
|     }; | ||||
|  | ||||
|     return EnumeratedTelemetrySeries; | ||||
| }); | ||||
| @@ -57,8 +57,17 @@ define([ | ||||
|                     }, | ||||
|                     "telemetry": { | ||||
|                         "source": "eventGenerator", | ||||
|                         "domains": [ | ||||
|                             { | ||||
|                                 "key": "time", | ||||
|                                 "name": "Time", | ||||
|                                 "format": "utc" | ||||
|                             } | ||||
|                         ], | ||||
|                         "ranges": [ | ||||
|                             { | ||||
|                                 "key": "message", | ||||
|                                 "name": "Message", | ||||
|                                 "format": "string" | ||||
|                             } | ||||
|                         ] | ||||
|   | ||||
| @@ -37,7 +37,8 @@ define( | ||||
|             var | ||||
| 	            subscriptions = [], | ||||
| 	            genInterval = 1000, | ||||
| 	            startTime = Date.now(); | ||||
|                 generating = false, | ||||
|                 id = Math.random() * 100000; | ||||
|  | ||||
|             // | ||||
|             function matchesSource(request) { | ||||
| @@ -79,11 +80,13 @@ define( | ||||
|             } | ||||
|  | ||||
|             function startGenerating() { | ||||
|                 generating = true; | ||||
|                 $timeout(function () { | ||||
| 	                //console.log("startGenerating... " + Date.now()); | ||||
|                     handleSubscriptions(); | ||||
|                     if (subscriptions.length > 0) { | ||||
|                     if (generating && subscriptions.length > 0) { | ||||
|                         startGenerating(); | ||||
|                     } else { | ||||
|                         generating = false; | ||||
|                     } | ||||
|                 }, genInterval); | ||||
|             } | ||||
| @@ -93,7 +96,6 @@ define( | ||||
|                     callback: callback, | ||||
|                     requests: requests | ||||
|                 }; | ||||
|  | ||||
|                 function unsubscribe() { | ||||
|                     subscriptions = subscriptions.filter(function (s) { | ||||
|                         return s !== subscription; | ||||
| @@ -101,8 +103,7 @@ define( | ||||
|                 } | ||||
|  | ||||
|                 subscriptions.push(subscription); | ||||
|  | ||||
|                 if (subscriptions.length === 1) { | ||||
|                 if (!generating) { | ||||
|                     startGenerating(); | ||||
|                 } | ||||
|  | ||||
|   | ||||
							
								
								
									
										89
									
								
								example/export/ExportTelemetryAsCSVAction.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,89 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([], function () { | ||||
|     'use strict'; | ||||
|  | ||||
|     /** | ||||
|      * An example of using the `exportService`; queries for telemetry | ||||
|      * and provides the results as a CSV file. | ||||
|      * @param {platform/exporters.ExportService} exportService the | ||||
|      *        service which will handle the CSV export | ||||
|      * @param {ActionContext} context the action's context | ||||
|      * @constructor | ||||
|      * @memberof example/export | ||||
|      * @implements {Action} | ||||
|      */ | ||||
|     function ExportTelemetryAsCSVAction(exportService, context) { | ||||
|         this.exportService = exportService; | ||||
|         this.context = context; | ||||
|     } | ||||
|  | ||||
|     ExportTelemetryAsCSVAction.prototype.perform = function () { | ||||
|         var context = this.context, | ||||
|             domainObject = context.domainObject, | ||||
|             telemetry = domainObject.getCapability("telemetry"), | ||||
|             metadata = telemetry.getMetadata(), | ||||
|             domains = metadata.domains, | ||||
|             ranges = metadata.ranges, | ||||
|             exportService = this.exportService; | ||||
|  | ||||
|         function getName(domainOrRange) { | ||||
|             return domainOrRange.name; | ||||
|         } | ||||
|  | ||||
|         telemetry.requestData({}).then(function (series) { | ||||
|             var headers = domains.map(getName).concat(ranges.map(getName)), | ||||
|                 rows = [], | ||||
|                 row, | ||||
|                 i; | ||||
|  | ||||
|             function copyDomainsToRow(row, index) { | ||||
|                 domains.forEach(function (domain) { | ||||
|                     row[domain.name] = series.getDomainValue(index, domain.key); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             function copyRangesToRow(row, index) { | ||||
|                 ranges.forEach(function (range) { | ||||
|                     row[range.name] = series.getRangeValue(index, range.key); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             for (i = 0; i < series.getPointCount(); i += 1) { | ||||
|                 row = {}; | ||||
|                 copyDomainsToRow(row, i); | ||||
|                 copyRangesToRow(row, i); | ||||
|                 rows.push(row); | ||||
|             } | ||||
|             exportService.exportCSV(rows, { headers: headers }); | ||||
|         }); | ||||
|     }; | ||||
|  | ||||
|     ExportTelemetryAsCSVAction.appliesTo = function (context) { | ||||
|         return context.domainObject && | ||||
|             context.domainObject.hasCapability("telemetry"); | ||||
|     }; | ||||
|  | ||||
|     return ExportTelemetryAsCSVAction; | ||||
| }); | ||||
| @@ -22,40 +22,22 @@ | ||||
| /*global define*/ | ||||
| 
 | ||||
| define([ | ||||
|     "./src/RTScrollingListController", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     RTScrollingListController, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     'legacyRegistry', | ||||
|     './ExportTelemetryAsCSVAction' | ||||
| ], function (legacyRegistry, ExportTelemetryAsCSVAction) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     legacyRegistry.register("platform/features/rtscrolling", { | ||||
|         "name": "Scrolling Lists", | ||||
|         "description": "Time-ordered list of latest data.", | ||||
|     legacyRegistry.register("example/export", { | ||||
|         "name": "Example of using CSV Export", | ||||
|         "extensions": { | ||||
|             "views": [ | ||||
|             "actions": [ | ||||
|                 { | ||||
|                     "key": "scrolling", | ||||
|                     "name": "Scrolling", | ||||
|                     "glyph": "5", | ||||
|                     "description": "Scrolling list of data values.", | ||||
|                     "templateUrl": "templates/rtscrolling.html", | ||||
|                     "needs": [ | ||||
|                         "telemetry" | ||||
|                     ], | ||||
|                     "delegation": true | ||||
|                 } | ||||
|             ], | ||||
|             "controllers": [ | ||||
|                 { | ||||
|                     "key": "RTScrollingListController", | ||||
|                     "implementation": RTScrollingListController, | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "telemetryHandler", | ||||
|                         "telemetryFormatter" | ||||
|                     ] | ||||
|                     "key": "example.export", | ||||
|                     "name": "Export Telemetry as CSV", | ||||
|                     "implementation": ExportTelemetryAsCSVAction, | ||||
|                     "category": "contextual", | ||||
|                     "glyph": "\u0033", | ||||
|                     "depends": [ "exportService" ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
| @@ -34,7 +34,8 @@ define( | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SinewaveTelemetryProvider($q, $timeout) { | ||||
|             var subscriptions = []; | ||||
|             var subscriptions = [], | ||||
|                 generating = false; | ||||
|  | ||||
|             // | ||||
|             function matchesSource(request) { | ||||
| @@ -75,10 +76,13 @@ define( | ||||
|             } | ||||
|  | ||||
|             function startGenerating() { | ||||
|                 generating = true; | ||||
|                 $timeout(function () { | ||||
|                     handleSubscriptions(); | ||||
|                     if (subscriptions.length > 0) { | ||||
|                     if (generating && subscriptions.length > 0) { | ||||
|                         startGenerating(); | ||||
|                     } else { | ||||
|                         generating = false; | ||||
|                     } | ||||
|                 }, 1000); | ||||
|             } | ||||
| @@ -97,7 +101,7 @@ define( | ||||
|  | ||||
|                 subscriptions.push(subscription); | ||||
|  | ||||
|                 if (subscriptions.length === 1) { | ||||
|                 if (!generating) { | ||||
|                     startGenerating(); | ||||
|                 } | ||||
|  | ||||
|   | ||||
| @@ -60,7 +60,7 @@ define([ | ||||
|                             { | ||||
|                                 "name": "Time", | ||||
|                                 "key": "time", | ||||
|                                 "format": "timestamp" | ||||
|                                 "format": "utc" | ||||
|                             } | ||||
|                         ], | ||||
|                         "ranges": [ | ||||
|   | ||||
| @@ -1,26 +0,0 @@ | ||||
| # Require any additional compass plugins here. | ||||
| # require "compass-growl" | ||||
|  | ||||
| # Set this to the root of your project when deployed: | ||||
| http_path = "/" | ||||
| css_dir = "css" | ||||
| sass_dir = "sass" | ||||
| images_dir = "images" | ||||
| javascripts_dir = "js" | ||||
|  | ||||
| # You can select your preferred output style here (can be overridden via the command line): | ||||
| # :expanded, :compressed, :nested | ||||
| output_style = :nested | ||||
|  | ||||
| # To enable relative paths to assets via compass helper functions. Uncomment: | ||||
| relative_assets = true | ||||
|  | ||||
| # To disable debugging comments that display the original location of your selectors. Uncomment: | ||||
| # line_comments = false | ||||
|  | ||||
|  | ||||
| # If you prefer the indented syntax, you might want to regenerate this | ||||
| # project again passing --syntax sass, or you can uncomment this: | ||||
| # preferred_syntax = :sass | ||||
| # and then run: | ||||
| # sass-convert -R --from scss --to sass vfn_platform/static/sass scss && rm -rf sass && mv scss sass | ||||
| @@ -1,103 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /************************** FEATURES */ | ||||
| /************************** VERY INFLUENTIAL GLOBAL DIMENSIONS */ | ||||
| /************************** RATIOS */ | ||||
| /************************** LAYOUT */ | ||||
| /************************** CONTROLS */ | ||||
| /************************** PATHS */ | ||||
| /************************** TIMINGS */ | ||||
| /************************** LIMITS */ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /************************** MOBILE REPRESENTATION ITEMS DIMENSIONS */ | ||||
| /************************** MOBILE TREE MENU DIMENSIONS */ | ||||
| /************************** WINDOW DIMENSIONS FOR RWD */ | ||||
| /************************** MEDIA QUERIES: WINDOW CHECKS FOR SPECIFIC ORIENTATIONS FOR EACH DEVICE */ | ||||
| /************************** MEDIA QUERIES: WINDOWS FOR SPECIFIC ORIENTATIONS FOR EACH DEVICE */ | ||||
| /************************** DEVICE PARAMETERS FOR MENUS/REPRESENTATIONS */ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /* REQUIRES mobile/_constants */ | ||||
| @media screen and (orientation: portrait) and (max-width: 514px) and (max-height: 740px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (max-height: 514px) and (max-width: 740px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (max-height: 514px) and (max-width: 740px) and (max-device-width: 1024px) and (max-device-height: 799px), screen and (orientation: portrait) and (min-width: 515px) and (max-width: 799px) and (min-height: 741px) and (max-height: 1024px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (min-height: 515px) and (max-height: 799px) and (min-width: 741px) and (max-width: 1024px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (min-height: 515px) and (max-height: 799px) and (min-width: 741px) and (max-width: 1024px) and (max-device-width: 1024px) and (max-device-height: 799px) { | ||||
|   /* line 28, ../sass/mobile-example.scss */ | ||||
|   .create-btn-holder { | ||||
|     display: block !important; } } | ||||
							
								
								
									
										20
									
								
								example/msl/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| To use this bundle, add the following paths to /main.js - | ||||
| './platform/features/conductor/bundle', | ||||
| './example/msl/bundle', | ||||
|  | ||||
| An example plugin that integrates with public data from the Curiosity rover.  | ||||
| The data shown used by this plugin is published by the Centro de  | ||||
| Astrobiología (CSIC-INTA) at http://cab.inta-csic.es/rems/ | ||||
|  | ||||
| Fetching data from this source requires a cross-origin request which will  | ||||
| fail on most modern browsers due to restrictions on such requests. As such,  | ||||
| it is proxied through a local proxy defined in app.js. In order to use this  | ||||
| example you will need to run app.js locally. | ||||
|  | ||||
| This example shows integration with an historical telemetry source, as  | ||||
| opposed to a real-time data source that is streaming back current information  | ||||
| about the state of a system. This example is atypical of a historical data  | ||||
| source in that it fetches all data in one request. The server infrastructure  | ||||
| of an historical telemetry source should ideally allow queries bounded by  | ||||
| time and other data attributes. | ||||
|  | ||||
							
								
								
									
										118
									
								
								example/msl/bundle.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,118 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/RemsTelemetryServerAdapter", | ||||
|     "./src/RemsTelemetryInitializer", | ||||
|     "./src/RemsTelemetryModelProvider", | ||||
|     "./src/RemsTelemetryProvider", | ||||
|     'legacyRegistry', | ||||
|     "module" | ||||
| ], function ( | ||||
|     RemsTelemetryServerAdapter, | ||||
|     RemsTelemetryInitializer, | ||||
|     RemsTelemetryModelProvider, | ||||
|     RemsTelemetryProvider, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|     legacyRegistry.register("example/notifications", { | ||||
|         "name" : "Mars Science Laboratory Data Adapter", | ||||
|         "extensions" : { | ||||
|         "types": [ | ||||
|             { | ||||
|                 "name":"Mars Science Laboratory", | ||||
|                 "key": "msl.curiosity", | ||||
|                 "glyph": "o" | ||||
|             }, | ||||
|             { | ||||
|                 "name": "Instrument", | ||||
|                 "key": "msl.instrument", | ||||
|                 "glyph": "o", | ||||
|                 "model": {"composition": []} | ||||
|             }, | ||||
|             { | ||||
|                 "name": "Measurement", | ||||
|                 "key": "msl.measurement", | ||||
|                 "glyph": "T", | ||||
|                 "model": {"telemetry": {}}, | ||||
|                 "telemetry": { | ||||
|                     "source": "rems.source", | ||||
|                     "domains": [ | ||||
|                         { | ||||
|                             "name": "Time", | ||||
|                             "key": "timestamp", | ||||
|                             "format": "utc" | ||||
|                         } | ||||
|                     ] | ||||
|                 } | ||||
|             } | ||||
|         ], | ||||
|         "constants": [ | ||||
|             { | ||||
|                 "key": "REMS_WS_URL", | ||||
|                 "value": "/proxyUrl?url=http://cab.inta-csic.es/rems/wp-content/plugins/marsweather-widget/api.php" | ||||
|             } | ||||
|         ], | ||||
|         "roots": [ | ||||
|             { | ||||
|                 "id": "msl:curiosity", | ||||
|                 "priority" : "preferred", | ||||
|                 "model": { | ||||
|                     "type": "msl.curiosity", | ||||
|                     "name": "Mars Science Laboratory", | ||||
|                     "composition": [] | ||||
|                 } | ||||
|             } | ||||
|         ], | ||||
|         "services": [ | ||||
|             { | ||||
|                 "key":"rems.adapter", | ||||
|                 "implementation": RemsTelemetryServerAdapter, | ||||
|                 "depends": ["$q", "$http", "$log", "REMS_WS_URL"] | ||||
|             } | ||||
|         ], | ||||
|         "runs": [ | ||||
|             { | ||||
|                 "implementation": RemsTelemetryInitializer, | ||||
|                 "depends": ["rems.adapter", "objectService"] | ||||
|             } | ||||
|         ], | ||||
|         "components": [ | ||||
|             { | ||||
|                 "provides": "modelService", | ||||
|                 "type": "provider", | ||||
|                 "implementation": RemsTelemetryModelProvider, | ||||
|                 "depends": ["rems.adapter"] | ||||
|             }, | ||||
|             { | ||||
|                 "provides": "telemetryService", | ||||
|                 "type": "provider", | ||||
|                 "implementation": RemsTelemetryProvider, | ||||
|                 "depends": ["rems.adapter", "$q"] | ||||
|             } | ||||
|         ] | ||||
|     } | ||||
|     }); | ||||
| }); | ||||
|  | ||||
							
								
								
									
										1
									
								
								example/msl/data/rems.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										79
									
								
								example/msl/src/MSLDataDictionary.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,79 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     /** | ||||
|      * A data dictionary describes the telemetry available from a data | ||||
|      * source and its data types. The data dictionary will be parsed by a custom | ||||
|      * server provider for this data source (in this case | ||||
|      * {@link RemsTelemetryServerAdapter}). | ||||
|      * | ||||
|      * Typically a data dictionary would be made available alongside the | ||||
|      * telemetry data source itself. | ||||
|      */ | ||||
|     function () { | ||||
|         return { | ||||
|             "name": "Mars Science Laboratory", | ||||
|             "identifier": "msl", | ||||
|             "instruments": [ | ||||
|                 { | ||||
|                     "name":"rems", | ||||
|                     "identifier": "rems", | ||||
|                     "measurements": [ | ||||
|                         { | ||||
|                             "name": "Min. Air Temperature", | ||||
|                             "identifier": "min_temp", | ||||
|                             "units": "degrees", | ||||
|                             "type": "float" | ||||
|                         }, | ||||
|                         { | ||||
|                             "name": "Max. Air Temperature", | ||||
|                             "identifier": "max_temp", | ||||
|                             "units": "degrees", | ||||
|                             "type": "float" | ||||
|                         }, | ||||
|                         { | ||||
|                             "name": "Atmospheric Pressure", | ||||
|                             "identifier": "pressure", | ||||
|                             "units": "pascals", | ||||
|                             "type": "float" | ||||
|                         }, | ||||
|                         { | ||||
|                             "name": "Min. Ground Temperature", | ||||
|                             "identifier": "min_gts_temp", | ||||
|                             "units": "degrees", | ||||
|                             "type": "float" | ||||
|                         }, | ||||
|                         { | ||||
|                             "name": "Max. Ground Temperature", | ||||
|                             "identifier": "max_gts_temp", | ||||
|                             "units": "degrees", | ||||
|                             "type": "float" | ||||
|                         } | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         }; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										71
									
								
								example/msl/src/RemsTelemetryInitializer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,71 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define( | ||||
|     function (){ | ||||
|         "use strict"; | ||||
|  | ||||
|         var TAXONOMY_ID = "msl:curiosity", | ||||
|             PREFIX = "msl_tlm:"; | ||||
|  | ||||
|         /** | ||||
|          * Function that is executed on application startup and populates | ||||
|          * the navigation tree with objects representing the MSL REMS | ||||
|          * telemetry points. The tree is populated based on the data | ||||
|          * dictionary on the provider. | ||||
|          * | ||||
|          * @param {RemsTelemetryServerAdapter} adapter The server adapter | ||||
|          * (necessary in order to retrieve data dictionary) | ||||
|          * @param objectService the ObjectService which allows for lookup of | ||||
|          * objects by ID | ||||
|          * @constructor | ||||
|          */ | ||||
|         function RemsTelemetryInitializer(adapter, objectService) { | ||||
|             function makeId(element) { | ||||
|                 return PREFIX + element.identifier; | ||||
|             } | ||||
|  | ||||
|             function initializeTaxonomy(dictionary) { | ||||
|                 function getTaxonomyObject(domainObjects) { | ||||
|                     return domainObjects[TAXONOMY_ID]; | ||||
|                 } | ||||
|  | ||||
|                 function populateModel (taxonomyObject) { | ||||
|                     return taxonomyObject.useCapability( | ||||
|                         "mutation", | ||||
|                         function (model) { | ||||
|                             model.name = dictionary.name; | ||||
|                             model.composition = dictionary.instruments.map(makeId); | ||||
|                         } | ||||
|                     ); | ||||
|                 } | ||||
|  | ||||
|                 objectService.getObjects([TAXONOMY_ID]) | ||||
|                     .then(getTaxonomyObject) | ||||
|                     .then(populateModel); | ||||
|             } | ||||
|             initializeTaxonomy(adapter.dictionary); | ||||
|         } | ||||
|         return RemsTelemetryInitializer; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										87
									
								
								example/msl/src/RemsTelemetryModelProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,87 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define( | ||||
|     function (){ | ||||
|         "use strict"; | ||||
|  | ||||
|         var PREFIX = "msl_tlm:", | ||||
|             FORMAT_MAPPINGS = { | ||||
|                 float: "number", | ||||
|                 integer: "number", | ||||
|                 string: "string" | ||||
|             }; | ||||
|  | ||||
|         function RemsTelemetryModelProvider(adapter){ | ||||
|  | ||||
|             function isRelevant(id) { | ||||
|                 return id.indexOf(PREFIX) === 0; | ||||
|             } | ||||
|  | ||||
|             function makeId(element){ | ||||
|                 return PREFIX + element.identifier; | ||||
|             } | ||||
|  | ||||
|             function buildTaxonomy(dictionary){ | ||||
|                 var models = {}; | ||||
|  | ||||
|                 function addMeasurement(measurement){ | ||||
|                     var format = FORMAT_MAPPINGS[measurement.type]; | ||||
|                     models[makeId(measurement)] = { | ||||
|                         type: "msl.measurement", | ||||
|                         name: measurement.name, | ||||
|                         telemetry: { | ||||
|                             key: measurement.identifier, | ||||
|                             ranges: [{ | ||||
|                                 key: "value", | ||||
|                                 name: measurement.units, | ||||
|                                 units: measurement.units, | ||||
|                                 format: format | ||||
|                             }] | ||||
|                         } | ||||
|                     }; | ||||
|                 } | ||||
|  | ||||
|                 function addInstrument(subsystem) { | ||||
|                     var measurements = (subsystem.measurements || []); | ||||
|                     models[makeId(subsystem)] = { | ||||
|                         type: "msl.instrument", | ||||
|                         name: subsystem.name, | ||||
|                         composition: measurements.map(makeId) | ||||
|                     }; | ||||
|                     measurements.forEach(addMeasurement); | ||||
|                 } | ||||
|  | ||||
|                 (dictionary.instruments || []).forEach(addInstrument); | ||||
|                 return models; | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|                 getModels: function (ids) { | ||||
|                     return ids.some(isRelevant) ? buildTaxonomy(adapter.dictionary) : {}; | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|         return RemsTelemetryModelProvider; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										83
									
								
								example/msl/src/RemsTelemetryProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,83 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define */ | ||||
| define ( | ||||
|     ['./RemsTelemetrySeries'], | ||||
|     function (RemsTelemetrySeries) { | ||||
|         "use strict"; | ||||
|  | ||||
|         var SOURCE = "rems.source"; | ||||
|  | ||||
|         function RemsTelemetryProvider(adapter, $q) { | ||||
|             this.adapter = adapter; | ||||
|             this.$q = $q; | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Retrieve telemetry from this telemetry source. | ||||
|          * @memberOf example/msl | ||||
|          * @param {Array<TelemetryRequest>} requests An array of all request | ||||
|          * objects (which needs to be filtered to only those relevant to this | ||||
|          * source) | ||||
|          * @returns {Promise} A {@link Promise} resolved with a {@link RemsTelemetrySeries} | ||||
|          * object that wraps the telemetry returned from the telemetry source. | ||||
|          */ | ||||
|         RemsTelemetryProvider.prototype.requestTelemetry = function (requests) { | ||||
|             var packaged = {}, | ||||
|                 relevantReqs, | ||||
|                 adapter = this.adapter; | ||||
|  | ||||
|             function matchesSource(request) { | ||||
|                 return (request.source === SOURCE); | ||||
|             } | ||||
|  | ||||
|             function addToPackage(history) { | ||||
|                 packaged[SOURCE][history.id] = | ||||
|                     new RemsTelemetrySeries(history.values); | ||||
|             } | ||||
|  | ||||
|             function handleRequest(request) { | ||||
|                 return adapter.history(request).then(addToPackage); | ||||
|             } | ||||
|  | ||||
|             relevantReqs = requests.filter(matchesSource); | ||||
|             packaged[SOURCE] = {}; | ||||
|  | ||||
|             return this.$q.all(relevantReqs.map(handleRequest)) | ||||
|                 .then(function () { | ||||
|                     return packaged; | ||||
|                 }); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * This data source does not support real-time subscriptions | ||||
|          */ | ||||
|         RemsTelemetryProvider.prototype.subscribe = function (callback, requests) { | ||||
|             return function() {}; | ||||
|         }; | ||||
|         RemsTelemetryProvider.prototype.unsubscribe = function (callback, requests) { | ||||
|             return function() {}; | ||||
|         }; | ||||
|  | ||||
|         return RemsTelemetryProvider; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										84
									
								
								example/msl/src/RemsTelemetrySeries.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,84 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define */ | ||||
| define( | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * @typedef {Object} RemsTelemetryValue | ||||
|          * @memberOf example/msl | ||||
|          * @property {number} date The date/time of the telemetry value. Constitutes the domain value of this value pair | ||||
|          * @property {number} value The value of this telemetry datum. | ||||
|          * A floating point value representing some observable quantity (eg. | ||||
|          * temperature, air pressure, etc.) | ||||
|          */ | ||||
|  | ||||
|         /** | ||||
|          * A representation of a collection of telemetry data. The REMS | ||||
|          * telemetry data is time ordered, with the 'domain' value | ||||
|          * constituting the time stamp of each data value and the | ||||
|          * 'range' being the value itself. | ||||
|          * | ||||
|          * TelemetrySeries will typically wrap an array of telemetry data, | ||||
|          * and provide an interface for retrieving individual an telemetry | ||||
|          * value. | ||||
|          * @memberOf example/msl | ||||
|          * @param {Array<RemsTelemetryValue>} data An array of telemetry values | ||||
|          * @constructor | ||||
|          */ | ||||
|         function RemsTelemetrySeries(data) { | ||||
|             this.data = data; | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * @returns {number} A count of the number of data values available in | ||||
|          * this series | ||||
|          */ | ||||
|         RemsTelemetrySeries.prototype.getPointCount = function() { | ||||
|                     return this.data.length; | ||||
|         }; | ||||
|         /** | ||||
|          * The domain value at the given index. The Rems telemetry data is | ||||
|          * time ordered, so the domain value is the time stamp of each data | ||||
|          * value. | ||||
|          * @param index | ||||
|          * @returns {number} the time value in ms since 1 January 1970 | ||||
|          */ | ||||
|         RemsTelemetrySeries.prototype.getDomainValue = function(index) { | ||||
|                     return this.data[index].date; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * The range value of the REMS data set is the value of the thing | ||||
|          * being measured, be it temperature, air pressure, etc. | ||||
|          * @param index The datum in the data series to return the range | ||||
|          * value of. | ||||
|          * @returns {number} A floating point number | ||||
|          */ | ||||
|         RemsTelemetrySeries.prototype.getRangeValue = function(index) { | ||||
|                     return this.data[index].value; | ||||
|         }; | ||||
|  | ||||
|         return RemsTelemetrySeries; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										142
									
								
								example/msl/src/RemsTelemetryServerAdapter.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,142 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
| /*jslint es5: true */ | ||||
|  | ||||
| define( | ||||
|     [ | ||||
|         "./MSLDataDictionary", | ||||
|         "module" | ||||
|     ], | ||||
|     function (MSLDataDictionary, module) { | ||||
|         "use strict"; | ||||
|  | ||||
|         var TERRESTRIAL_DATE = "terrestrial_date", | ||||
|             LOCAL_DATA = "../data/rems.json"; | ||||
|  | ||||
|         /** | ||||
|          * Fetches historical data from the REMS instrument on the Curiosity | ||||
|          * Rover. | ||||
|          * @memberOf example/msl | ||||
|          * @param $q | ||||
|          * @param $http | ||||
|          * @param REMS_WS_URL The location of the REMS telemetry data. | ||||
|          * @constructor | ||||
|          */ | ||||
|         function RemsTelemetryServerAdapter($q, $http, $log, REMS_WS_URL) { | ||||
|             this.localDataURI = module.uri.substring(0, module.uri.lastIndexOf('/') + 1) + LOCAL_DATA; | ||||
|             this.deferreds = {}; | ||||
|             this.REMS_WS_URL = REMS_WS_URL; | ||||
|             this.$q = $q; | ||||
|             this.$http = $http; | ||||
|             this.$log = $log; | ||||
|             this.cache = undefined; | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * The data dictionary for this data source. | ||||
|          * @type {MSLDataDictionary} | ||||
|          */ | ||||
|         RemsTelemetryServerAdapter.prototype.dictionary = MSLDataDictionary; | ||||
|  | ||||
|         /** | ||||
|          * Fetches historical data from source, and associates it with the | ||||
|          * given request ID. | ||||
|          * @private | ||||
|          */ | ||||
|         RemsTelemetryServerAdapter.prototype.requestHistory = function(request) { | ||||
|             var self = this, | ||||
|                 id = request.key, | ||||
|                 deferred = this.$q.defer(); | ||||
|  | ||||
|             function processResponse(response){ | ||||
|                 var data = []; | ||||
|                 /* | ||||
|                  * Currently all data is returned for entire history of the mission. Cache response to avoid unnecessary re-queries. | ||||
|                  */ | ||||
|                 self.cache = response; | ||||
|                 /* | ||||
|                  * History data is organised by Sol. Iterate over sols... | ||||
|                  */ | ||||
|                 response.data.soles.forEach(function(solData){ | ||||
|                     /* | ||||
|                      * Check that valid data exists | ||||
|                      */ | ||||
|                     if (!isNaN(solData[id])) { | ||||
|                         /* | ||||
|                          * Append each data point to the array of values | ||||
|                          * for this data point property (min. temp, etc). | ||||
|                          */ | ||||
|                         data.unshift({ | ||||
|                             date: Date.parse(solData[TERRESTRIAL_DATE]), | ||||
|                             value: solData[id] | ||||
|                         }); | ||||
|                     } | ||||
|                 }); | ||||
|                 return data; | ||||
|             } | ||||
|  | ||||
|             function fallbackToLocal() { | ||||
|                 self.$log.warn("Loading REMS data failed, probably due to" + | ||||
|                     " cross origin policy. Falling back to local data"); | ||||
|                 return self.$http.get(self.localDataURI); | ||||
|             } | ||||
|  | ||||
|             //Filter results to match request parameters | ||||
|             function filterResults(results) { | ||||
|                 return results.filter(function(result){ | ||||
|                     return result.date >= (request.start || Number.MIN_VALUE) && | ||||
|                         result.date <= (request.end || Number.MAX_VALUE); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             function packageAndResolve(results){ | ||||
|                 deferred.resolve({id: id, values: results}); | ||||
|             } | ||||
|  | ||||
|  | ||||
|             this.$q.when(this.cache || this.$http.get(this.REMS_WS_URL)) | ||||
|                 .catch(fallbackToLocal) | ||||
|                 .then(processResponse) | ||||
|                 .then(filterResults) | ||||
|                 .then(packageAndResolve); | ||||
|  | ||||
|             return deferred.promise; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Requests historical telemetry for the named data attribute. In | ||||
|          * the case of REMS, this data source exposes multiple different | ||||
|          * data variables from the REMS instrument, including temperature | ||||
|          * and others | ||||
|          * @param id The telemetry data point key to be queried. | ||||
|          * @returns {Promise | Array<RemsTelemetryValue>} that resolves with an Array of {@link RemsTelemetryValue} objects for the request data key. | ||||
|          */ | ||||
|         RemsTelemetryServerAdapter.prototype.history = function(request) { | ||||
|             var id = request.key; | ||||
|             return this.requestHistory(request); | ||||
|         }; | ||||
|  | ||||
|         return RemsTelemetryServerAdapter; | ||||
|     } | ||||
| ); | ||||
|  | ||||
| @@ -1,10 +1,9 @@ | ||||
| <span class="status block ok" ng-controller="DialogLaunchController"> | ||||
|     <span class="ui-symbol status-indicator"></span> | ||||
|     <span class="label"> | ||||
|     <!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! --> | ||||
|     <span class="ui-symbol status-indicator"></span><span class="label"> | ||||
|         <a ng-click="launchProgress(true)">Known</a> | | ||||
|         <a ng-click="launchProgress(false)">Unknown</a> | | ||||
|         <a ng-click="launchError()">Error</a> | | ||||
|         <a ng-click="launchInfo()">Info</a> | ||||
|     </span> | ||||
|     <span class="count">Dialogs</span> | ||||
|     </span><span class="count">Dialogs</span> | ||||
| </span> | ||||
| @@ -1,10 +1,9 @@ | ||||
| <span class="status block ok" ng-controller="NotificationLaunchController"> | ||||
|     <span class="ui-symbol status-indicator"></span> | ||||
|     <span class="label"> | ||||
|     <!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! --> | ||||
|     <span class="ui-symbol status-indicator"></span><span class="label"> | ||||
|         <a ng-click="newInfo()">Success</a> | | ||||
|         <a ng-click="newError()">Error</a> | | ||||
|         <a ng-click="newAlert()">Alert</a> | | ||||
|         <a ng-click="newProgress()">Progress</a> | ||||
|     </span> | ||||
|     <span class="count">Notifications</span> | ||||
|     </span><span class="count">Notifications</span> | ||||
| </span> | ||||
							
								
								
									
										145
									
								
								example/plotOptions/bundle.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,145 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     'legacyRegistry', | ||||
|     '../../platform/commonUI/browse/src/InspectorRegion', | ||||
|     '../../platform/commonUI/regions/src/Region' | ||||
| ], function ( | ||||
|     legacyRegistry, | ||||
|     InspectorRegion, | ||||
|     Region | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     /** | ||||
|      * Add a 'plot options' region part to the inspector region for the | ||||
|      * Telemetry Plot type only. {@link InspectorRegion} is a default region | ||||
|      * implementation that is added automatically to all types. In order to | ||||
|      * customize what appears in the inspector region, you can start from a | ||||
|      * blank slate by using Region, or customize the default inspector | ||||
|      * region by using {@link InspectorRegion}. | ||||
|      */ | ||||
|     var plotInspector = new InspectorRegion(), | ||||
|      /** | ||||
|       * Two region parts are defined here. One that appears only in browse | ||||
|       * mode, and one that appears only in edit mode. For not they both point | ||||
|       * to the same representation, but a different key could be used here to | ||||
|       * include a customized representation for edit mode. | ||||
|       */ | ||||
|         plotOptionsBrowseRegion = new Region({ | ||||
|             name: "plot-options", | ||||
|             title: "Plot Options", | ||||
|             modes: ['browse'], | ||||
|             content: { | ||||
|                 key: "plot-options-browse" | ||||
|             } | ||||
|         }), | ||||
|         plotOptionsEditRegion = new Region({ | ||||
|             name: "plot-options", | ||||
|             title: "Plot Options", | ||||
|             modes: ['edit'], | ||||
|             content: { | ||||
|                 key: "plot-options-browse" | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|     /** | ||||
|      * Both parts are added, and policies of type 'region' will determine | ||||
|      * which is shown based on domain object state. A default policy is | ||||
|      * provided which will check the 'modes' attribute of the region part | ||||
|      * definition. | ||||
|      */ | ||||
|     plotInspector.addRegion(plotOptionsBrowseRegion); | ||||
|     plotInspector.addRegion(plotOptionsEditRegion); | ||||
|  | ||||
|     legacyRegistry.register("example/plotType", { | ||||
|         "name": "Plot Type", | ||||
|         "description": "Example illustrating registration of a new object type", | ||||
|         "extensions": { | ||||
|             "types": [ | ||||
|                 { | ||||
|                     "key": "plot", | ||||
|                     "name": "Telemetry Plot", | ||||
|                     "glyph": "t", | ||||
|                     "description": "A plot for displaying telemetry", | ||||
|                     "delegates": [ | ||||
|                         "telemetry" | ||||
|                     ], | ||||
|                     "features": "creation", | ||||
|                     "contains": [ | ||||
|                         { | ||||
|                             "has": "telemetry" | ||||
|                         } | ||||
|                     ], | ||||
|                     "model": { | ||||
|                         "composition": [] | ||||
|                     }, | ||||
|                     "inspector": plotInspector, | ||||
|                     "telemetry": { | ||||
|                         "source": "generator", | ||||
|                         "domains": [ | ||||
|                             { | ||||
|                                 "key": "time", | ||||
|                                 "name": "Time" | ||||
|                             }, | ||||
|                             { | ||||
|                                 "key": "yesterday", | ||||
|                                 "name": "Yesterday" | ||||
|                             }, | ||||
|                             { | ||||
|                                 "key": "delta", | ||||
|                                 "name": "Delta", | ||||
|                                 "format": "example.delta" | ||||
|                             } | ||||
|                         ], | ||||
|                         "ranges": [ | ||||
|                             { | ||||
|                                 "key": "sin", | ||||
|                                 "name": "Sine" | ||||
|                             }, | ||||
|                             { | ||||
|                                 "key": "cos", | ||||
|                                 "name": "Cosine" | ||||
|                             } | ||||
|                         ] | ||||
|                     }, | ||||
|                     "properties": [ | ||||
|                         { | ||||
|                             "name": "Period", | ||||
|                             "control": "textfield", | ||||
|                             "cssclass": "l-small l-numeric", | ||||
|                             "key": "period", | ||||
|                             "required": true, | ||||
|                             "property": [ | ||||
|                                 "telemetry", | ||||
|                                 "period" | ||||
|                             ], | ||||
|                             "pattern": "^\\d*(\\.\\d*)?$" | ||||
|                         } | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
							
								
								
									
										141
									
								
								gulpfile.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,141 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /*global require,__dirname*/ | ||||
| var gulp = require('gulp'), | ||||
|     requirejsOptimize = require('gulp-requirejs-optimize'), | ||||
|     sourcemaps = require('gulp-sourcemaps'), | ||||
|     rename = require('gulp-rename'), | ||||
|     sass = require('gulp-sass'), | ||||
|     bourbon = require('node-bourbon'), | ||||
|     jshint = require('gulp-jshint'), | ||||
|     jscs = require('gulp-jscs'), | ||||
|     replace = require('gulp-replace-task'), | ||||
|     karma = require('karma'), | ||||
|     path = require('path'), | ||||
|     fs = require('fs'), | ||||
|     git = require('git-rev-sync'), | ||||
|     moment = require('moment'), | ||||
|     project = require('./package.json'), | ||||
|     paths = { | ||||
|         main: 'main.js', | ||||
|         dist: 'dist', | ||||
|         assets: 'dist/assets', | ||||
|         scss: ['./platform/**/*.scss', './example/**/*.scss'], | ||||
|         scripts: [ 'main.js', 'platform/**/*.js', 'src/**/*.js' ], | ||||
|         static: [ | ||||
|             'index.html', | ||||
|             'platform/**/*', | ||||
|             'example/**/*', | ||||
|             'bower_components/**/*' | ||||
|         ] | ||||
|     }, | ||||
|     options = { | ||||
|         requirejsOptimize: { | ||||
|             name: paths.main.replace(/\.js$/, ''), | ||||
|             mainConfigFile: paths.main, | ||||
|             wrapShim: true | ||||
|         }, | ||||
|         karma: { | ||||
|             configFile: path.resolve(__dirname, 'karma.conf.js'), | ||||
|             singleRun: true | ||||
|         }, | ||||
|         sass: { | ||||
|             includePaths: bourbon.includePaths, | ||||
|             sourceComments: true | ||||
|         }, | ||||
|         replace: { | ||||
|             variables: { | ||||
|                 version: project.version, | ||||
|                 timestamp: moment.utc(Date.now()).format(), | ||||
|                 revision: fs.existsSync('.git') ? git.long() : 'Unknown', | ||||
|                 branch: fs.existsSync('.git') ? git.branch() : 'Unknown' | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| gulp.task('scripts', function () { | ||||
|     return gulp.src(paths.main) | ||||
|         .pipe(sourcemaps.init()) | ||||
|         .pipe(requirejsOptimize(options.requirejsOptimize)) | ||||
|         .pipe(sourcemaps.write('.')) | ||||
|         .pipe(replace(options.replace)) | ||||
|         .pipe(gulp.dest(paths.dist)); | ||||
| }); | ||||
|  | ||||
| gulp.task('test', function (done) { | ||||
|     new karma.Server(options.karma, done).start(); | ||||
| }); | ||||
|  | ||||
| gulp.task('stylesheets', function () { | ||||
|     return gulp.src(paths.scss, {base: '.'}) | ||||
|         .pipe(sourcemaps.init()) | ||||
|         .pipe(sass(options.sass).on('error', sass.logError)) | ||||
|         .pipe(rename(function (file) { | ||||
|             file.dirname = file.dirname.replace('/sass', '/css'); | ||||
|             return file; | ||||
|         })) | ||||
|         .pipe(sourcemaps.write('.')) | ||||
|         .pipe(gulp.dest(__dirname)); | ||||
| }); | ||||
|  | ||||
| gulp.task('lint', function () { | ||||
|     return gulp.src(paths.scripts) | ||||
|         .pipe(jshint()) | ||||
|         .pipe(jshint.reporter('default')) | ||||
|         .pipe(jshint.reporter('fail')); | ||||
| }); | ||||
|  | ||||
| gulp.task('checkstyle', function () { | ||||
|     return gulp.src(paths.scripts) | ||||
|         .pipe(jscs()) | ||||
|         .pipe(jscs.reporter()) | ||||
|         .pipe(jscs.reporter('fail')); | ||||
| }); | ||||
|  | ||||
| gulp.task('fixstyle', function () { | ||||
|     return gulp.src(paths.scripts, { base: '.' }) | ||||
|         .pipe(jscs({ fix: true })) | ||||
|         .pipe(gulp.dest('.')); | ||||
| }); | ||||
|  | ||||
| gulp.task('static', ['stylesheets'], function () { | ||||
|     return gulp.src(paths.static, { base: '.' }) | ||||
|         .pipe(gulp.dest(paths.dist)); | ||||
| }); | ||||
|  | ||||
| gulp.task('watch', function () { | ||||
|     gulp.watch(paths.scss, ['stylesheets']); | ||||
| }); | ||||
|  | ||||
| gulp.task('serve', function () { | ||||
|     console.log('Running development server with all defaults'); | ||||
|     var app = require('./app.js'); | ||||
| }); | ||||
|  | ||||
| gulp.task('develop', ['serve', 'stylesheets', 'watch']); | ||||
|  | ||||
| gulp.task('install', [ 'static', 'scripts' ]); | ||||
|  | ||||
| gulp.task('verify', [ 'lint', 'test' ]); | ||||
|  | ||||
| gulp.task('build', [ 'verify', 'install' ]); | ||||
							
								
								
									
										17
									
								
								index.html
									
									
									
									
									
								
							
							
						
						| @@ -26,16 +26,25 @@ | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> | ||||
|     <title></title> | ||||
|     <script type="text/javascript" | ||||
|             src="platform/framework/lib/require.js" | ||||
|             data-main="main.js"> | ||||
|             src="bower_components/requirejs/require.js"> | ||||
|     </script> | ||||
|     <script type="text/javascript"> | ||||
|         require(['main'], function (mct) { | ||||
|             mct.run(); | ||||
|         }); | ||||
|     </script> | ||||
|     <link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css"> | ||||
|     <link rel="stylesheet" href="platform/commonUI/general/res/css/openmct.css"> | ||||
| 	<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32"> | ||||
| 	<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96"> | ||||
| 	<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16"> | ||||
| 	<link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico"> | ||||
| </head> | ||||
| <body class="user-environ" ng-view> | ||||
|  | ||||
| <body class="user-environ"> | ||||
|     <div class="l-splash-holder s-splash-holder"> | ||||
|         <div class="l-splash s-splash"></div> | ||||
|     </div> | ||||
|  | ||||
|     <div ng-view></div> | ||||
| </body> | ||||
| </html> | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /*global module*/ | ||||
| /*global module,process*/ | ||||
| module.exports = function(config) { | ||||
|     config.set({ | ||||
|  | ||||
| @@ -34,10 +34,12 @@ module.exports = function(config) { | ||||
|         // List of files / patterns to load in the browser. | ||||
|         // By default, files are also included in a script tag. | ||||
|         files: [ | ||||
|             {pattern: 'bower_components/**/*.js', included: false}, | ||||
|             {pattern: 'src/**/*.js', included: false}, | ||||
|             {pattern: 'example/**/*.js', included: false}, | ||||
|             {pattern: 'platform/**/*.js', included: false}, | ||||
|             {pattern: 'warp/**/*.js', included: false}, | ||||
|             {pattern: 'platform/**/*.html', included: false}, | ||||
|             'test-main.js' | ||||
|         ], | ||||
|  | ||||
| @@ -49,13 +51,14 @@ module.exports = function(config) { | ||||
|         // Preprocess matching files before serving them to the browser. | ||||
|         // https://npmjs.org/browse/keyword/karma-preprocessor | ||||
|         preprocessors: { | ||||
|             '**/src/**/!(*Spec).js': [ 'coverage' ] | ||||
|             'src/**/src/**/!(*Spec).js': [ 'coverage' ], | ||||
|             'platform/**/src/**/!(*Spec).js': [ 'coverage' ] | ||||
|         }, | ||||
|  | ||||
|         // Test results reporter to use | ||||
|         // Possible values: 'dots', 'progress' | ||||
|         // Available reporters: https://npmjs.org/browse/keyword/karma-reporter | ||||
|         reporters: ['progress', 'coverage', 'html'], | ||||
|         reporters: ['progress', 'coverage', 'html', 'junit'], | ||||
|  | ||||
|         // Web server port. | ||||
|         port: 9876, | ||||
| @@ -76,7 +79,14 @@ module.exports = function(config) { | ||||
|  | ||||
|         // Code coverage reporting. | ||||
|         coverageReporter: { | ||||
|             dir: "target/coverage" | ||||
|             dir: process.env.CIRCLE_ARTIFACTS ? | ||||
|                 process.env.CIRCLE_ARTIFACTS + '/coverage' : | ||||
|                 "dist/coverage", | ||||
|             check: { | ||||
|                 global: { | ||||
|                     lines: 80 | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         // HTML test reporting. | ||||
| @@ -86,6 +96,10 @@ module.exports = function(config) { | ||||
|             foldAll: false | ||||
|         }, | ||||
|  | ||||
|         junitReporter: { | ||||
|             outputDir: process.env.CIRCLE_TEST_REPORTS || 'target/junit' | ||||
|         }, | ||||
|  | ||||
|         // Continuous Integration mode. | ||||
|         // If true, Karma captures browsers, runs the tests and exits. | ||||
|         singleRun: true | ||||
|   | ||||
							
								
								
									
										41
									
								
								main.js
									
									
									
									
									
								
							
							
						
						| @@ -24,12 +24,30 @@ | ||||
| requirejs.config({ | ||||
|     "paths": { | ||||
|         "legacyRegistry": "src/legacyRegistry", | ||||
|         "angular": "platform/framework/lib/angular.min", | ||||
|         "moment": 'platform/telemetry/lib/moment.min' | ||||
|         "angular": "bower_components/angular/angular.min", | ||||
|         "angular-route": "bower_components/angular-route/angular-route.min", | ||||
|         "csv": "bower_components/comma-separated-values/csv.min", | ||||
|         "es6-promise": "bower_components/es6-promise/promise.min", | ||||
|         "moment": "bower_components/moment/moment", | ||||
|         "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", | ||||
|         "saveAs": "bower_components/FileSaver.js/FileSaver.min", | ||||
|         "screenfull": "bower_components/screenfull/dist/screenfull.min", | ||||
|         "text": "bower_components/text/text", | ||||
|         "uuid": "bower_components/node-uuid/uuid", | ||||
|         "zepto": "bower_components/zepto/zepto.min" | ||||
|     }, | ||||
|     "shim": { | ||||
|         "angular": { | ||||
|             "exports": "angular" | ||||
|         }, | ||||
|         "angular-route": { | ||||
|             "deps": [ "angular" ] | ||||
|         }, | ||||
|         "moment-duration-format": { | ||||
|             "deps": [ "moment" ] | ||||
|         }, | ||||
|         "zepto": { | ||||
|             "exports": "Zepto" | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -53,15 +71,15 @@ define([ | ||||
|     './platform/commonUI/notification/bundle', | ||||
|     './platform/containment/bundle', | ||||
|     './platform/execution/bundle', | ||||
|     './platform/exporters/bundle', | ||||
|     './platform/telemetry/bundle', | ||||
|     './platform/features/clock/bundle', | ||||
|     './platform/features/events/bundle', | ||||
|     './platform/features/imagery/bundle', | ||||
|     './platform/features/layout/bundle', | ||||
|     './platform/features/pages/bundle', | ||||
|     './platform/features/plot/bundle', | ||||
|     './platform/features/scrolling/bundle', | ||||
|     './platform/features/timeline/bundle', | ||||
|     './platform/features/table/bundle', | ||||
|     './platform/forms/bundle', | ||||
|     './platform/identity/bundle', | ||||
|     './platform/persistence/aggregator/bundle', | ||||
| @@ -71,11 +89,20 @@ define([ | ||||
|     './platform/entanglement/bundle', | ||||
|     './platform/search/bundle', | ||||
|     './platform/status/bundle', | ||||
|     './platform/commonUI/regions/bundle', | ||||
|  | ||||
|     './example/imagery/bundle', | ||||
|     './example/eventGenerator/bundle', | ||||
|     './example/generator/bundle' | ||||
|     './example/generator/bundle', | ||||
|     './example/enumeratedTelemetry/bundle' | ||||
|  | ||||
| ], function (Main, legacyRegistry) { | ||||
|     'use strict'; | ||||
|     new Main().run(legacyRegistry); | ||||
| }); | ||||
|  | ||||
|     return { | ||||
|         legacyRegistry: legacyRegistry, | ||||
|         run: function () { | ||||
|             return new Main().run(legacyRegistry); | ||||
|         } | ||||
|     }; | ||||
| }); | ||||
|   | ||||
							
								
								
									
										36
									
								
								package.json
									
									
									
									
									
								
							
							
						
						| @@ -1,45 +1,61 @@ | ||||
| { | ||||
|   "name": "open-mct-web", | ||||
|   "version": "0.7.2", | ||||
|   "description": "The OpenMCTWeb core platform", | ||||
|   "name": "openmctweb", | ||||
|   "version": "0.9.3-SNAPSHOT", | ||||
|   "description": "The Open MCT Web core platform", | ||||
|   "dependencies": { | ||||
|     "express": "^4.13.1", | ||||
|     "minimist": "^1.1.1" | ||||
|     "minimist": "^1.1.1", | ||||
|     "request": "^2.69.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "bower": "^1.7.7", | ||||
|     "git-rev-sync": "^1.4.0", | ||||
|     "glob": ">= 3.0.0", | ||||
|     "gulp": "^3.9.0", | ||||
|     "gulp-jscs": "^3.0.2", | ||||
|     "gulp-jshint": "^2.0.0", | ||||
|     "gulp-rename": "^1.2.2", | ||||
|     "gulp-replace-task": "^0.11.0", | ||||
|     "gulp-requirejs-optimize": "^0.3.1", | ||||
|     "gulp-sass": "^2.2.0", | ||||
|     "gulp-sourcemaps": "^1.6.0", | ||||
|     "jasmine-core": "^2.3.0", | ||||
|     "jsdoc": "^3.3.2", | ||||
|     "jshint": "^2.7.0", | ||||
|     "karma": "^0.12.31", | ||||
|     "karma": "^0.13.3", | ||||
|     "karma-chrome-launcher": "^0.1.8", | ||||
|     "karma-cli": "0.0.4", | ||||
|     "karma-coverage": "^0.5.3", | ||||
|     "karma-html-reporter": "^0.2.7", | ||||
|     "karma-jasmine": "^0.1.5", | ||||
|     "karma-phantomjs-launcher": "^0.2.3", | ||||
|     "karma-junit-reporter": "^0.3.8", | ||||
|     "karma-phantomjs-launcher": "^1.0.0", | ||||
|     "karma-requirejs": "^0.2.2", | ||||
|     "lodash": "^3.10.1", | ||||
|     "markdown-toc": "^0.11.7", | ||||
|     "marked": "^0.3.5", | ||||
|     "mkdirp": "^0.5.1", | ||||
|     "phantomjs": "^1.9.19", | ||||
|     "moment": "^2.11.1", | ||||
|     "node-bourbon": "^4.2.3", | ||||
|     "phantomjs-prebuilt": "^2.1.0", | ||||
|     "requirejs": "^2.1.17", | ||||
|     "split": "^1.0.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "start": "node app.js", | ||||
|     "test": "karma start --single-run", | ||||
|     "jshint": "jshint platform example || exit 0", | ||||
|     "jshint": "jshint platform example", | ||||
|     "watch": "karma start", | ||||
|     "jsdoc": "jsdoc -c jsdoc.json -r -d target/docs/api", | ||||
|     "otherdoc": "node docs/gendocs.js --in docs/src --out target/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'", | ||||
|     "docs": "npm run jsdoc ; npm run otherdoc" | ||||
|     "docs": "npm run jsdoc ; npm run otherdoc", | ||||
|     "prepublish": "./node_modules/bower/bin/bower install && ./node_modules/gulp/bin/gulp.js install" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "https://github.com/nasa/openmctweb.git" | ||||
|   }, | ||||
|   "author": "", | ||||
|   "license": "Apache-2.0" | ||||
|   "license": "Apache-2.0", | ||||
|   "private": true | ||||
| } | ||||
|   | ||||
| @@ -22,14 +22,30 @@ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "text!./res/templates/about-dialog.html", | ||||
|     "./src/LogoController", | ||||
|     "./src/AboutController", | ||||
|     "./src/LicenseController", | ||||
|     "text!./res/templates/app-logo.html", | ||||
|     "text!./res/templates/about-logo.html", | ||||
|     "text!./res/templates/overlay-about.html", | ||||
|     "text!./res/templates/license-apache.html", | ||||
|     "text!./res/templates/license-mit.html", | ||||
|     "text!./res/templates/licenses.html", | ||||
|     "text!./res/templates/licenses-export-md.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     aboutDialogTemplate, | ||||
|     LogoController, | ||||
|     AboutController, | ||||
|     LicenseController, | ||||
|     appLogoTemplate, | ||||
|     aboutLogoTemplate, | ||||
|     overlayAboutTemplate, | ||||
|     licenseApacheTemplate, | ||||
|     licenseMitTemplate, | ||||
|     licensesTemplate, | ||||
|     licensesExportMdTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
| @@ -41,28 +57,28 @@ define([ | ||||
|                 { | ||||
|                     "key": "app-logo", | ||||
|                     "priority": "optional", | ||||
|                     "templateUrl": "templates/app-logo.html" | ||||
|                     "template": appLogoTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "about-logo", | ||||
|                     "priority": "preferred", | ||||
|                     "templateUrl": "templates/about-logo.html" | ||||
|                     "template": aboutLogoTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "about-dialog", | ||||
|                     "templateUrl": "templates/about-dialog.html" | ||||
|                     "template": aboutDialogTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "overlay-about", | ||||
|                     "templateUrl": "templates/overlay-about.html" | ||||
|                     "template": overlayAboutTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "license-apache", | ||||
|                     "templateUrl": "templates/license-apache.html" | ||||
|                     "template": licenseApacheTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "license-mit", | ||||
|                     "templateUrl": "templates/license-mit.html" | ||||
|                     "template": licenseMitTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "controllers": [ | ||||
| @@ -154,11 +170,11 @@ define([ | ||||
|             "routes": [ | ||||
|                 { | ||||
|                     "when": "/licenses", | ||||
|                     "templateUrl": "templates/licenses.html" | ||||
|                     "template": licensesTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "when": "/licenses-md", | ||||
|                     "templateUrl": "templates/licenses-export-md.html" | ||||
|                     "template": licensesExportMdTemplate | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|   | ||||
| @@ -20,11 +20,7 @@ | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div class="abs t-about l-about t-about-openmctweb s-about" ng-controller = "AboutController as about"> | ||||
|     <div class="l-logo-holder s-logo-holder"> | ||||
|         <div class="l-logo s-logo s-logo-nasa"></div> | ||||
|         <div class="l-logo l-logo-app s-logo s-logo-openmctweb"></div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="l-splash s-splash"></div> | ||||
|     <div class="s-text l-content"> | ||||
|         <h1 class="l-title s-title">OpenMCT Web</h1> | ||||
|         <div class="l-description s-description"> | ||||
|   | ||||
| @@ -1,5 +0,0 @@ | ||||
| [ | ||||
|     "AboutController", | ||||
|     "LicenseController", | ||||
|     "LogoController" | ||||
| ] | ||||
| @@ -34,8 +34,21 @@ define([ | ||||
|     "./src/windowing/NewTabAction", | ||||
|     "./src/windowing/FullscreenAction", | ||||
|     "./src/creation/CreateActionProvider", | ||||
|     "./src/creation/AddActionProvider", | ||||
|     "./src/creation/CreationService", | ||||
|     "./src/windowing/WindowTitler", | ||||
|     "text!./res/templates/browse.html", | ||||
|     "text!./res/templates/create/locator.html", | ||||
|     "text!./res/templates/browse-object.html", | ||||
|     "text!./res/templates/create/create-button.html", | ||||
|     "text!./res/templates/create/create-menu.html", | ||||
|     "text!./res/templates/items/grid-item.html", | ||||
|     "text!./res/templates/browse/object-header.html", | ||||
|     "text!./res/templates/menu-arrow.html", | ||||
|     "text!./res/templates/back-arrow.html", | ||||
|     "text!./res/templates/items/items.html", | ||||
|     "text!./res/templates/browse/object-properties.html", | ||||
|     "text!./res/templates/browse/inspector-region.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     BrowseController, | ||||
| @@ -50,8 +63,21 @@ define([ | ||||
|     NewTabAction, | ||||
|     FullscreenAction, | ||||
|     CreateActionProvider, | ||||
|     AddActionProvider, | ||||
|     CreationService, | ||||
|     WindowTitler, | ||||
|     browseTemplate, | ||||
|     locatorTemplate, | ||||
|     browseObjectTemplate, | ||||
|     createButtonTemplate, | ||||
|     createMenuTemplate, | ||||
|     gridItemTemplate, | ||||
|     objectHeaderTemplate, | ||||
|     menuArrowTemplate, | ||||
|     backArrowTemplate, | ||||
|     itemsTemplate, | ||||
|     objectPropertiesTemplate, | ||||
|     inspectorRegionTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
| @@ -61,15 +87,22 @@ define([ | ||||
|             "routes": [ | ||||
|                 { | ||||
|                     "when": "/browse/:ids*", | ||||
|                     "templateUrl": "templates/browse.html", | ||||
|                     "template": browseTemplate, | ||||
|                     "reloadOnSearch": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "when": "", | ||||
|                     "templateUrl": "templates/browse.html", | ||||
|                     "template": browseTemplate, | ||||
|                     "reloadOnSearch": false | ||||
|                 } | ||||
|             ], | ||||
|             "constants": [ | ||||
|                 { | ||||
|                     "key": "DEFAULT_PATH", | ||||
|                     "value": "mine", | ||||
|                     "priority": "fallback" | ||||
|                 } | ||||
|             ], | ||||
|             "controllers": [ | ||||
|                 { | ||||
|                     "key": "BrowseController", | ||||
| @@ -78,10 +111,12 @@ define([ | ||||
|                         "$scope", | ||||
|                         "$route", | ||||
|                         "$location", | ||||
|                         "$q", | ||||
|                         "$window", | ||||
|                         "objectService", | ||||
|                         "navigationService", | ||||
|                         "urlService" | ||||
|                         "urlService", | ||||
|                         "policyService", | ||||
|                         "DEFAULT_PATH" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
| @@ -100,9 +135,7 @@ define([ | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "$location", | ||||
|                         "$route", | ||||
|                         "$q", | ||||
|                         "navigationService" | ||||
|                         "$route" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
| @@ -117,7 +150,8 @@ define([ | ||||
|                     "implementation": LocatorController, | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "$timeout" | ||||
|                         "$timeout", | ||||
|                         "objectService" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
| @@ -131,13 +165,17 @@ define([ | ||||
|             "controls": [ | ||||
|                 { | ||||
|                     "key": "locator", | ||||
|                     "templateUrl": "templates/create/locator.html" | ||||
|                     "template": locatorTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "representations": [ | ||||
|                 { | ||||
|                     "key": "view-object", | ||||
|                     "templateUrl": "templates/view-object.html" | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "browse-object", | ||||
|                     "templateUrl": "templates/browse-object.html", | ||||
|                     "template": browseObjectTemplate, | ||||
|                     "gestures": [ | ||||
|                         "drop" | ||||
|                     ], | ||||
| @@ -147,18 +185,18 @@ define([ | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "create-button", | ||||
|                     "templateUrl": "templates/create/create-button.html" | ||||
|                     "template": createButtonTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "create-menu", | ||||
|                     "templateUrl": "templates/create/create-menu.html", | ||||
|                     "template": createMenuTemplate, | ||||
|                     "uses": [ | ||||
|                         "action" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "grid-item", | ||||
|                     "templateUrl": "templates/items/grid-item.html", | ||||
|                     "template": gridItemTemplate, | ||||
|                     "uses": [ | ||||
|                         "type", | ||||
|                         "action", | ||||
| @@ -171,14 +209,14 @@ define([ | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "object-header", | ||||
|                     "templateUrl": "templates/browse/object-header.html", | ||||
|                     "template": objectHeaderTemplate, | ||||
|                     "uses": [ | ||||
|                         "type" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "menu-arrow", | ||||
|                     "templateUrl": "templates/menu-arrow.html", | ||||
|                     "template": menuArrowTemplate, | ||||
|                     "uses": [ | ||||
|                         "action" | ||||
|                     ], | ||||
| @@ -191,7 +229,15 @@ define([ | ||||
|                     "uses": [ | ||||
|                         "context" | ||||
|                     ], | ||||
|                     "templateUrl": "templates/back-arrow.html" | ||||
|                     "template": backArrowTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "object-properties", | ||||
|                     "template": objectPropertiesTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "inspector-region", | ||||
|                     "template": inspectorRegionTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "services": [ | ||||
| @@ -247,7 +293,7 @@ define([ | ||||
|                     "name": "Items", | ||||
|                     "glyph": "9", | ||||
|                     "description": "Grid of available items", | ||||
|                     "templateUrl": "templates/items/items.html", | ||||
|                     "template": itemsTemplate, | ||||
|                     "uses": [ | ||||
|                         "composition" | ||||
|                     ], | ||||
| @@ -271,6 +317,18 @@ define([ | ||||
|                         "policyService" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "AddActionProvider", | ||||
|                     "provides": "actionService", | ||||
|                     "type": "provider", | ||||
|                     "implementation": AddActionProvider, | ||||
|                     "depends": [ | ||||
|                         "$q", | ||||
|                         "typeService", | ||||
|                         "dialogService", | ||||
|                         "policyService" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "CreationService", | ||||
|                     "provides": "creationService", | ||||
|   | ||||
| @@ -1,6 +0,0 @@ | ||||
| /*! | ||||
| * screenfull | ||||
| * v1.2.0 - 2014-04-29 | ||||
| * (c) Sindre Sorhus; MIT License | ||||
| */ | ||||
| !function(){"use strict";var a="undefined"!=typeof module&&module.exports,b="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var a,b,c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],d=0,e=c.length,f={};e>d;d++)if(a=c[d],a&&a[1]in document){for(d=0,b=a.length;b>d;d++)f[c[0][d]]=a[d];return f}return!1}(),d={request:function(a){var d=c.requestFullscreen;a=a||document.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[d]():a[d](b&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){document[c.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:c};return c?(Object.defineProperties(d,{isFullscreen:{get:function(){return!!document[c.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!document[c.fullscreenEnabled]}}}),document.addEventListener(c.fullscreenchange,function(a){d.onchange.call(d,a)}),document.addEventListener(c.fullscreenerror,function(a){d.onerror.call(d,a)}),void(a?module.exports=d:window.screenfull=d)):void(a?module.exports=!1:window.screenfull=!1)}(); | ||||
| @@ -44,14 +44,9 @@ | ||||
|         </div> | ||||
|     </div> | ||||
|     <div class="holder l-flex-col flex-elem grows l-object-wrapper"> | ||||
|         <div class="holder l-flex-col flex-elem grows l-object-wrapper-inner"> | ||||
|         <div ng-if="isEditable" class="holder l-flex-col flex-elem grows l-object-wrapper-inner"> | ||||
|             <!-- Toolbar and Save/Cancel buttons --> | ||||
|             <div class="l-edit-controls flex-elem l-flex-row flex-align-end"> | ||||
|                 <mct-toolbar name="mctToolbar" | ||||
|                              structure="toolbar.structure" | ||||
|                              ng-model="toolbar.state" | ||||
|                              class="flex-elem grows"> | ||||
|                 </mct-toolbar> | ||||
|                 <mct-representation key="'edit-action-buttons'" | ||||
|                                     mct-object="domainObject" | ||||
|                                     class='flex-elem conclude-editing'> | ||||
| @@ -63,6 +58,20 @@ | ||||
|                                 class="abs flex-elem grows object-holder-main scroll" | ||||
|                                 toolbar="toolbar"> | ||||
|             </mct-representation> | ||||
|         </div><!--/ l-object-wrapper-inner --> | ||||
|         </div> | ||||
|         <div ng-if="!isEditable" class="holder l-flex-col flex-elem grows l-object-wrapper-inner"> | ||||
|             <!-- Toolbar and Save/Cancel buttons --> | ||||
|             <div class="l-edit-controls flex-elem l-flex-row flex-align-end"> | ||||
|                 <mct-representation key="'edit-action-buttons'" | ||||
|                                     mct-object="domainObject" | ||||
|                                     class='flex-elem conclude-editing'> | ||||
|                 </mct-representation> | ||||
|  | ||||
|             </div> | ||||
|             <mct-representation key="representation.selected.key" | ||||
|                                 mct-object="representation.selected.key && domainObject" | ||||
|                                 class="abs flex-elem grows object-holder-main scroll"> | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
|   | ||||
| @@ -63,7 +63,7 @@ | ||||
|                     <mct-split-pane class='l-object-and-inspector contents abs' anchor='right'> | ||||
|                         <div class='split-pane-component t-object pane primary-pane left'> | ||||
|                             <mct-representation mct-object="navigatedObject" | ||||
|                                                 key="'browse-object'" | ||||
|                                                 key="'view-object'" | ||||
|                                                 class="abs holder holder-object"> | ||||
|                             </mct-representation> | ||||
|                         </div> | ||||
|   | ||||
| @@ -19,14 +19,12 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div content="jquery-wrapper" | ||||
|      class="abs holder-all edit-mode" | ||||
|      ng-controller="EditController as editMode" | ||||
|      mct-before-unload="editMode.getUnloadWarning()"> | ||||
| 
 | ||||
|     <mct-representation key="'edit-object'" mct-object="editMode.navigatedObject()"> | ||||
|     </mct-representation> | ||||
| 
 | ||||
|     <mct-include key="'bottombar'"></mct-include> | ||||
| 
 | ||||
| <div ng-controller="InspectorController"> | ||||
|     <div ng-repeat="region in regions"> | ||||
|         <mct-representation | ||||
|                 key="region.content.key" | ||||
|                 mct-object="domainObject" | ||||
|                 ng-model="ngModel"> | ||||
|         </mct-representation> | ||||
|     </div> | ||||
| </div> | ||||
| @@ -0,0 +1,61 @@ | ||||
| <!-- | ||||
|  Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  as represented by the Administrator of the National Aeronautics and Space | ||||
|  Administration. All rights reserved. | ||||
|  | ||||
|  Open MCT Web is 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. | ||||
|  | ||||
|  Open MCT Web includes source code licensed under additional open source | ||||
|  licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div ng-controller="ObjectInspectorController as controller"> | ||||
|     <ul class="flex-elem grows l-inspector-part"> | ||||
|         <li> | ||||
|             <em class="t-inspector-part-header">Properties</em> | ||||
|             <div class="inspector-properties" | ||||
|                  ng-repeat="data in metadata" | ||||
|                  ng-class="{ first:$index === 0 }"> | ||||
|                 <div class="label">{{ data.name }}</div> | ||||
|                 <div class="value">{{ data.value }}</div> | ||||
|             </div> | ||||
|         </li> | ||||
|         <li ng-if="contextutalParents.length > 0"> | ||||
|             <em class="t-inspector-part-header" title="The location of this linked object.">Location</em> | ||||
|             <div ng-if="primaryParents.length > 0" class="section-header">This Object</div> | ||||
|             <span class="inspector-location" | ||||
|                   ng-repeat="parent in contextutalParents" | ||||
|                   ng-class="{ last:($index + 1) === contextualParents.length }"> | ||||
|                 <mct-representation key="'label'" | ||||
|                                     mct-object="parent" | ||||
|                                     ng-model="ngModel" | ||||
|                                     ng-click="ngModel.selectedObject = parent" | ||||
|                                     class="location-item"> | ||||
|                 </mct-representation> | ||||
|             </span> | ||||
|         </li> | ||||
|         <li ng-if="primaryParents.length > 0"> | ||||
|             <div class="section-header">Object's Original</div> | ||||
|             <span class="inspector-location" | ||||
|                   ng-repeat="parent in primaryParents" | ||||
|                   ng-class="{ last:($index + 1) === primaryParents.length }"> | ||||
|                 <mct-representation key="'label'" | ||||
|                                     mct-object="parent" | ||||
|                                     ng-model="ngModel" | ||||
|                                     ng-click="ngModel.selectedObject = parent" | ||||
|                                     class="location-item"> | ||||
|                 </mct-representation> | ||||
|             </span> | ||||
|         </li> | ||||
|     </ul> | ||||
| </div> | ||||
| @@ -27,7 +27,9 @@ | ||||
|             <mct-representation class="desktop-hide" key="'info-button'" mct-object="domainObject"></mct-representation> | ||||
|         </div> | ||||
|         <div class='item-main abs lg'> | ||||
|             <span class="t-item-icon" ng-class="{ 'l-icon-link':location.isLink() }">{{type.getGlyph()}}</span> | ||||
|             <span class="t-item-icon" ng-class="{ 'l-icon-link':location.isLink() }"> | ||||
|                 <span class="t-item-icon-glyph ng-binding">{{type.getGlyph()}}</span> | ||||
|             </span> | ||||
|             <div class='ui-symbol abs item-open'>}</div> | ||||
|         </div> | ||||
|         <div class='bottom-bar bar abs'> | ||||
|   | ||||
| @@ -19,19 +19,15 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <table class="tabular"> | ||||
|     <thead> | ||||
|         <tr> | ||||
|             <th ng-repeat="header in headers"> | ||||
|                 {{header}} | ||||
|             </th> | ||||
|         </tr> | ||||
|     </thead> | ||||
|     <tbody> | ||||
|         <tr ng-repeat="row in rows"> | ||||
|             <td ng-repeat="cell in row"> | ||||
|                 {{cell}} | ||||
|             </td> | ||||
|         </tr> | ||||
|     </tbody> | ||||
| </table> | ||||
| <!-- | ||||
|  A representation that allows the 'View' region of an object view to change | ||||
|  dynamically (eg. between browse and edit modes). Values correspond to a | ||||
|  representation key, and currently defaults to 'browse-object'. | ||||
| 
 | ||||
|  In the case of edit, the EditRepresenter will change this to editable | ||||
|  representation of the object as needed. | ||||
|  --> | ||||
| <mct-representation mct-object="domainObject" | ||||
|                     key="viewObjectTemplate || 'browse-object'" | ||||
|                     class="abs holder"> | ||||
| </mct-representation> | ||||
| @@ -27,15 +27,12 @@ | ||||
|  */ | ||||
| define( | ||||
|     [ | ||||
|         '../../../representation/src/gestures/GestureConstants', | ||||
|         '../../edit/src/objects/EditableDomainObject' | ||||
|         '../../../representation/src/gestures/GestureConstants' | ||||
|     ], | ||||
|     function (GestureConstants, EditableDomainObject) { | ||||
|     function (GestureConstants) { | ||||
|         "use strict"; | ||||
|  | ||||
|         var ROOT_ID = "ROOT", | ||||
|             DEFAULT_PATH = "mine", | ||||
|             CONFIRM_MSG = "Unsaved changes will be lost if you leave this page."; | ||||
|         var ROOT_ID = "ROOT"; | ||||
|  | ||||
|         /** | ||||
|          * The BrowseController is used to populate the initial scope in Browse | ||||
| @@ -47,18 +44,21 @@ define( | ||||
|          * @memberof platform/commonUI/browse | ||||
|          * @constructor | ||||
|          */ | ||||
|         function BrowseController($scope, $route, $location, $q, objectService, navigationService, urlService) { | ||||
|         function BrowseController( | ||||
|             $scope,  | ||||
|             $route,  | ||||
|             $location,  | ||||
|             $window,  | ||||
|             objectService,  | ||||
|             navigationService,  | ||||
|             urlService,  | ||||
|             policyService, | ||||
|             defaultPath | ||||
|         ) { | ||||
|             var path = [ROOT_ID].concat( | ||||
|                 ($route.current.params.ids || DEFAULT_PATH).split("/") | ||||
|                 ($route.current.params.ids || defaultPath).split("/") | ||||
|             ); | ||||
|  | ||||
|             function isDirty(){ | ||||
|                 var editorCapability = $scope.navigatedObject && | ||||
|                         $scope.navigatedObject.getCapability("editor"), | ||||
|                     hasChanges = editorCapability && editorCapability.dirty(); | ||||
|                 return hasChanges; | ||||
|             } | ||||
|  | ||||
|             function updateRoute(domainObject) { | ||||
|                 var priorRoute = $route.current, | ||||
|                     // Act as if params HADN'T changed to avoid page reload | ||||
| @@ -75,31 +75,35 @@ define( | ||||
|                 // urlService.urlForLocation used to adjust current | ||||
|                 // path to new, addressed, path based on | ||||
|                 // domainObject | ||||
|                 $location.path(urlService.urlForLocation("browse", | ||||
|                     domainObject.hasCapability('editor') ? | ||||
|                         domainObject.getOriginalObject() : domainObject)); | ||||
|                 $location.path(urlService.urlForLocation("browse", domainObject)); | ||||
|  | ||||
|             } | ||||
|  | ||||
|             // Callback for updating the in-scope reference to the object | ||||
|             // that is currently navigated-to. | ||||
|             function setNavigation(domainObject) { | ||||
|                 var navigationAllowed = true; | ||||
|  | ||||
|                 if (domainObject === $scope.navigatedObject){ | ||||
|                     //do nothing; | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 if (isDirty() && !confirm(CONFIRM_MSG)) { | ||||
|                     $scope.treeModel.selectedObject = $scope.navigatedObject; | ||||
|                     navigationService.setNavigation($scope.navigatedObject); | ||||
|                 } else { | ||||
|                     if ($scope.navigatedObject && $scope.navigatedObject.hasCapability("editor")){ | ||||
|                         $scope.navigatedObject.getCapability("editor").cancel(); | ||||
|                     } | ||||
|                 policyService.allow("navigation", $scope.navigatedObject, domainObject, function(message){ | ||||
|                     navigationAllowed = $window.confirm(message + "\r\n\r\n" + | ||||
|                         " Are you sure you want to continue?"); | ||||
|                 }); | ||||
|  | ||||
|                 if (navigationAllowed) { | ||||
|                     $scope.navigatedObject = domainObject; | ||||
|                     $scope.treeModel.selectedObject = domainObject; | ||||
|                     navigationService.setNavigation(domainObject); | ||||
|                     updateRoute(domainObject); | ||||
|                 } else { | ||||
|                     //If navigation was unsuccessful (ie. blocked), reset | ||||
|                     // the selected object in the tree to the currently | ||||
|                     // navigated object | ||||
|                     $scope.treeModel.selectedObject = $scope.navigatedObject ; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @@ -143,6 +147,12 @@ define( | ||||
|                             } else { | ||||
|                                 doNavigate(nextObject, index + 1); | ||||
|                             } | ||||
|                         } else if (index === 1 && c.length > 0) { | ||||
|                             // Roots are in a top-level container that we don't | ||||
|                             // want to be selected, so if we couldn't find an | ||||
|                             // object at the path we wanted, at least select | ||||
|                             // one of its children. | ||||
|                             navigateTo(c[c.length - 1]); | ||||
|                         } else { | ||||
|                             // Couldn't find the next element of the path | ||||
|                             // so navigate to the last path object we did find | ||||
| @@ -170,18 +180,13 @@ define( | ||||
|                 selectedObject: navigationService.getNavigation() | ||||
|             }; | ||||
|  | ||||
|             $scope.beforeUnloadWarning = function() { | ||||
|                 return isDirty() ? | ||||
|                     "Unsaved changes will be lost if you leave this page." : | ||||
|                     undefined; | ||||
|             }; | ||||
|  | ||||
|             // Listen for changes in navigation state. | ||||
|             navigationService.addListener(setNavigation); | ||||
|  | ||||
|             // Also listen for changes which come from the tree | ||||
|             // Also listen for changes which come from the tree. Changes in | ||||
|             // the tree will trigger a change in browse navigation state. | ||||
|             $scope.$watch("treeModel.selectedObject", setNavigation); | ||||
|              | ||||
|  | ||||
|             // Clean up when the scope is destroyed | ||||
|             $scope.$on("$destroy", function () { | ||||
|                 navigationService.removeListener(setNavigation); | ||||
|   | ||||
| @@ -22,11 +22,8 @@ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| define( | ||||
|     [ | ||||
|         '../../../representation/src/gestures/GestureConstants', | ||||
|         '../../edit/src/objects/EditableDomainObject' | ||||
|     ], | ||||
|     function (GestureConstants, EditableDomainObject) { | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
| @@ -35,7 +32,7 @@ define( | ||||
|          * @memberof platform/commonUI/browse | ||||
|          * @constructor | ||||
|          */ | ||||
|         function BrowseObjectController($scope, $location, $route, $q, navigationService) { | ||||
|         function BrowseObjectController($scope, $location, $route) { | ||||
|             var navigatedObject; | ||||
|             function setViewForDomainObject(domainObject) { | ||||
|                  | ||||
| @@ -57,10 +54,9 @@ define( | ||||
|  | ||||
|             function updateQueryParam(viewKey) { | ||||
|                 var unlisten, | ||||
|                     priorRoute = $route.current, | ||||
|                     isEditMode = $scope.domainObject && $scope.domainObject.hasCapability('editor'); | ||||
|                     priorRoute = $route.current; | ||||
|  | ||||
|                 if (viewKey && !isEditMode) { | ||||
|                 if (viewKey) { | ||||
|                     $location.search('view', viewKey); | ||||
|                     unlisten = $scope.$on('$locationChangeSuccess', function () { | ||||
|                         // Checks path to make sure /browse/ is at front | ||||
| @@ -76,10 +72,6 @@ define( | ||||
|             $scope.$watch('domainObject', setViewForDomainObject); | ||||
|             $scope.$watch('representation.selected.key', updateQueryParam); | ||||
|  | ||||
|             $scope.cancelEditing = function() { | ||||
|                 navigationService.setNavigation($scope.domainObject.getDomainObject()); | ||||
|             }; | ||||
|  | ||||
|             $scope.doAction = function (action){ | ||||
|                 return $scope[action] && $scope[action](); | ||||
|             }; | ||||
|   | ||||
							
								
								
									
										69
									
								
								platform/commonUI/browse/src/InspectorRegion.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,69 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,window*/ | ||||
|  | ||||
| define( | ||||
|     [ | ||||
|         '../../regions/src/Region' | ||||
|     ], | ||||
|     function (Region) { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * Defines the a default Inspector region. Captured in a class to | ||||
|          * allow for modular extension and customization of regions based on | ||||
|          * the typical case. | ||||
|          * @memberOf platform/commonUI/regions | ||||
|          * @constructor | ||||
|          */ | ||||
|         function InspectorRegion() { | ||||
|             Region.call(this, {'name': 'Inspector'}); | ||||
|  | ||||
|             this.buildRegion(); | ||||
|         } | ||||
|  | ||||
|         InspectorRegion.prototype = Object.create(Region.prototype); | ||||
|         InspectorRegion.prototype.constructor = Region; | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          */ | ||||
|         InspectorRegion.prototype.buildRegion = function() { | ||||
|             var metadataRegion = { | ||||
|                 name: 'metadata', | ||||
|                 title: 'Metadata Region', | ||||
|                 // Which modes should the region part be visible in? If | ||||
|                 // nothing provided here, then assumed that part is visible | ||||
|                 // in both. The visibility or otherwise of a region part | ||||
|                 // should be decided by a policy. In this case, 'modes' is a | ||||
|                 // shortcut that is used by the EditableRegionPolicy. | ||||
|                 modes: ['browse', 'edit'], | ||||
|                 content: { | ||||
|                     key: 'object-properties' | ||||
|                 } | ||||
|             }; | ||||
|             this.addRegion(new Region(metadataRegion), 0); | ||||
|         }; | ||||
|  | ||||
|         return InspectorRegion; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										139
									
								
								platform/commonUI/browse/src/creation/AddAction.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,139 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining AddAction. Created by ahenry on 01/21/16. | ||||
|  */ | ||||
| define( | ||||
|     [ | ||||
|         './CreateWizard' | ||||
|     ], | ||||
|     function (CreateWizard) { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * The Add Action is performed to create new instances of | ||||
|          * domain objects of a specific type that are subobjects of an | ||||
|          * object being edited. This is the action that is performed when a | ||||
|          * user uses the Add menu option. | ||||
|          * | ||||
|          * @memberof platform/commonUI/browse | ||||
|          * @implements {Action} | ||||
|          * @constructor | ||||
|          * | ||||
|          * @param {Type} type the type of domain object to create | ||||
|          * @param {DomainObject} parent the domain object that should | ||||
|          *        act as a container for the newly-created object | ||||
|          *        (note that the user will have an opportunity to | ||||
|          *        override this) | ||||
|          * @param {ActionContext} context the context in which the | ||||
|          *        action is being performed | ||||
|          * @param {DialogService} dialogService | ||||
|          */ | ||||
|         function AddAction(type, parent, context, $q, dialogService, policyService) { | ||||
|             this.metadata = { | ||||
|                 key: 'add', | ||||
|                 glyph: type.getGlyph(), | ||||
|                 name: type.getName(), | ||||
|                 type: type.getKey(), | ||||
|                 description: type.getDescription(), | ||||
|                 context: context | ||||
|             }; | ||||
|  | ||||
|             this.type = type; | ||||
|             this.parent = parent; | ||||
|             this.$q = $q; | ||||
|             this.dialogService = dialogService; | ||||
|             this.policyService = policyService; | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * Create a new object of the given type. | ||||
|          * This will prompt for user input first. | ||||
|          * | ||||
|          * @returns {Promise} that will be resolved with the object that the | ||||
|          * action was originally invoked on (ie. the 'parent') | ||||
|          */ | ||||
|         AddAction.prototype.perform = function () { | ||||
|             var newModel = this.type.getInitialModel(), | ||||
|                 newObject, | ||||
|                 parentObject = this.parent, | ||||
|                 wizard; | ||||
|  | ||||
|             newModel.type = this.type.getKey(); | ||||
|             newObject = parentObject.getCapability('instantiation').instantiate(newModel); | ||||
|             newObject.useCapability('mutation', function(model){ | ||||
|                 model.location = parentObject.getId(); | ||||
|             }); | ||||
|  | ||||
|             wizard = new CreateWizard(newObject, this.parent, this.policyService); | ||||
|  | ||||
|             function populateObjectFromInput (formValue) { | ||||
|                 return wizard.populateObjectFromInput(formValue, newObject); | ||||
|             } | ||||
|  | ||||
|             function addToParent (populatedObject) { | ||||
|                 parentObject.getCapability('composition').add(populatedObject); | ||||
|                 return parentObject.getCapability('persistence').persist().then(function(){ | ||||
|                     return parentObject; | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             function save(object) { | ||||
|                 /* | ||||
|                 It's necessary to persist the new sub-object in order | ||||
|                  that it can be retrieved for composition in the parent. | ||||
|                  Future refactoring that allows temporary objects to be | ||||
|                  retrieved from object services will make this unnecessary. | ||||
|                  */ | ||||
|                 return object.getCapability('editor').save(true); | ||||
|             } | ||||
|  | ||||
|             return this.dialogService | ||||
|                 .getUserInput(wizard.getFormStructure(false), wizard.getInitialFormValue()) | ||||
|                 .then(populateObjectFromInput) | ||||
|                 .then(save) | ||||
|                 .then(addToParent); | ||||
|  | ||||
|         }; | ||||
|  | ||||
|  | ||||
|         /** | ||||
|          * Metadata associated with a Add action. | ||||
|          * @typedef {ActionMetadata} AddActionMetadata | ||||
|          * @property {string} type the key for the type of domain object | ||||
|          *           to be created | ||||
|          */ | ||||
|  | ||||
|         /** | ||||
|          * Get metadata about this action. | ||||
|          * @returns {AddActionMetadata} metadata about this action | ||||
|          */ | ||||
|         AddAction.prototype.getMetadata = function () { | ||||
|            return this.metadata; | ||||
|         }; | ||||
|  | ||||
|         return AddAction; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										87
									
								
								platform/commonUI/browse/src/creation/AddActionProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,87 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining AddActionProvider.js. Created by ahenry on 01/21/16. | ||||
|  */ | ||||
| define( | ||||
|     ["./AddAction"], | ||||
|     function (AddAction) { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * The AddActionProvider is an ActionProvider which introduces | ||||
|          * an Add action for creating sub objects. | ||||
|          * | ||||
|          * @memberof platform/commonUI/browse | ||||
|          * @constructor | ||||
|          * @implements {ActionService} | ||||
|          * | ||||
|          * @param {TypeService} typeService the type service, used to discover | ||||
|          *        available types | ||||
|          * @param {DialogService} dialogService the dialog service, used by | ||||
|          *        specific Create actions to get user input to populate the | ||||
|          *        model of the newly-created domain object. | ||||
|          * @param {CreationService} creationService the creation service (also | ||||
|          *        introduced in this bundle), responsible for handling actual | ||||
|          *        object creation. | ||||
|          */ | ||||
|         function AddActionProvider($q, typeService, dialogService, policyService) { | ||||
|             this.typeService = typeService; | ||||
|             this.dialogService = dialogService; | ||||
|             this.$q = $q; | ||||
|             this.policyService = policyService; | ||||
|         } | ||||
|  | ||||
|         AddActionProvider.prototype.getActions = function (actionContext) { | ||||
|             var context = actionContext || {}, | ||||
|                 key = context.key, | ||||
|                 destination = context.domainObject, | ||||
|                 self = this; | ||||
|  | ||||
|             // We only provide Add actions, and we need a | ||||
|             // domain object to serve as the container for the | ||||
|             // newly-created object (although the user may later | ||||
|             // make a different selection) | ||||
|             if (key !== 'add' || !destination) { | ||||
|                 return []; | ||||
|             } | ||||
|  | ||||
|             // Introduce one create action per type | ||||
|             return this.typeService.listTypes().filter(function (type) { | ||||
|                 return self.policyService.allow("creation", type) && self.policyService.allow("composition", destination.getCapability('type'), type); | ||||
|             }).map(function (type) { | ||||
|                 return new AddAction( | ||||
|                     type, | ||||
|                     destination, | ||||
|                     context, | ||||
|                     self.$q, | ||||
|                     self.dialogService, | ||||
|                     self.policyService | ||||
|                 ); | ||||
|             }); | ||||
|         }; | ||||
|  | ||||
|         return AddActionProvider; | ||||
|     } | ||||
| ); | ||||
| @@ -26,18 +26,21 @@ define( | ||||
|         'use strict'; | ||||
|  | ||||
|         /** | ||||
|          * Construct a new CreateWizard. | ||||
|          * A class for capturing user input data from an object creation | ||||
|          * dialog, and populating a domain object with that data. | ||||
|          * | ||||
|          * @param {TypeImpl} type the type of domain object to be created | ||||
|          * @param {DomainObject} domainObject the newly created object to | ||||
|          * populate with user input | ||||
|          * @param {DomainObject} parent the domain object to serve as | ||||
|          *        the initial parent for the created object, in the dialog | ||||
|          * @memberof platform/commonUI/browse | ||||
|          * @constructor | ||||
|          */ | ||||
|         function CreateWizard(type, parent, policyService, initialModel) { | ||||
|             this.type = type; | ||||
|             this.model = initialModel || type.getInitialModel(); | ||||
|             this.properties = type.getProperties(); | ||||
|         function CreateWizard(domainObject, parent, policyService) { | ||||
|             this.type = domainObject.getCapability('type'); | ||||
|             this.model = domainObject.getModel(); | ||||
|             this.domainObject = domainObject; | ||||
|             this.properties = this.type.getProperties(); | ||||
|             this.parent = parent; | ||||
|             this.policyService = policyService; | ||||
|         } | ||||
| @@ -46,11 +49,14 @@ define( | ||||
|          * Get the form model for this wizard; this is a description | ||||
|          * that will be rendered to an HTML form. See the | ||||
|          * platform/forms bundle | ||||
|          * | ||||
|          * @param {boolean} includeLocation if true, a 'location' section | ||||
|          * will be included that will allow the user to select the location | ||||
|          * of the newly created object, otherwise the .location property of | ||||
|          * the model will be used. | ||||
|          * @return {FormModel} formModel the form model to | ||||
|          *         show in the create dialog | ||||
|          */ | ||||
|         CreateWizard.prototype.getFormStructure = function () { | ||||
|         CreateWizard.prototype.getFormStructure = function (includeLocation) { | ||||
|             var sections = [], | ||||
|                 type = this.type, | ||||
|                 policyService = this.policyService; | ||||
| @@ -84,12 +90,16 @@ define( | ||||
|             }); | ||||
|  | ||||
|             // Ensure there is always a "save in" section | ||||
|             sections.push({ name: 'Location', rows: [{ | ||||
|                 name: "Save In", | ||||
|                 control: "locator", | ||||
|                 validate: validateLocation, | ||||
|                 key: "createParent" | ||||
|             }]}); | ||||
|             if (includeLocation) { | ||||
|                 sections.push({ | ||||
|                     name: 'Location', rows: [{ | ||||
|                         name: "Save In", | ||||
|                         control: "locator", | ||||
|                         validate: validateLocation, | ||||
|                         key: "createParent" | ||||
|                     }] | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|                 sections: sections, | ||||
| @@ -97,6 +107,23 @@ define( | ||||
|             }; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Given some form input values and a domain object, populate the | ||||
|          * domain object used to create this wizard from the given form values. | ||||
|          * @param formValue | ||||
|          * @returns {DomainObject} | ||||
|          */ | ||||
|         CreateWizard.prototype.populateObjectFromInput = function(formValue) { | ||||
|             var parent = this.getLocation(formValue), | ||||
|                 formModel = this.createModel(formValue); | ||||
|  | ||||
|             formModel.location = parent.getId(); | ||||
|             this.domainObject.useCapability("mutation", function(){ | ||||
|                 return formModel; | ||||
|             }); | ||||
|             return this.domainObject; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Get the initial value for the form being described. | ||||
|          * This will include the values for all properties described | ||||
| @@ -120,6 +147,7 @@ define( | ||||
|         /** | ||||
|          * Based on a populated form, get the domain object which | ||||
|          * should be used as a parent for the newly-created object. | ||||
|          * @private | ||||
|          * @return {DomainObject} | ||||
|          */ | ||||
|         CreateWizard.prototype.getLocation = function (formValue) { | ||||
| @@ -129,6 +157,7 @@ define( | ||||
|         /** | ||||
|          * Create the domain object model for a newly-created object, | ||||
|          * based on user input read from a formModel. | ||||
|          * @private | ||||
|          * @return {object} the domain object model | ||||
|          */ | ||||
|         CreateWizard.prototype.createModel = function (formValue) { | ||||
|   | ||||
| @@ -33,7 +33,7 @@ define( | ||||
|          * @memberof platform/commonUI/browse | ||||
|          * @constructor | ||||
|          */ | ||||
|         function LocatorController($scope, $timeout) { | ||||
|         function LocatorController($scope, $timeout, objectService) { | ||||
|             // Populate values needed by the locator control. These are: | ||||
|             // * rootObject: The top-level object, since we want to show | ||||
|             //               the full tree | ||||
| @@ -52,6 +52,18 @@ define( | ||||
|                         $scope.rootObject = | ||||
|                             (context && context.getRoot()) || $scope.rootObject; | ||||
|                     }, 0); | ||||
|                 } else if (!contextRoot){ | ||||
|                     //If no context root is available, default to the root | ||||
|                     // object | ||||
|                     $scope.rootObject = undefined; | ||||
|                     // Update the displayed tree on a timeout to avoid | ||||
|                     // an infinite digest exception. | ||||
|                     objectService.getObjects(['ROOT']) | ||||
|                         .then(function(objects){ | ||||
|                             $timeout(function () { | ||||
|                                 $scope.rootObject = objects.ROOT; | ||||
|                             }, 0); | ||||
|                         }); | ||||
|                 } | ||||
|  | ||||
|                 $scope.treeModel.selectedObject = domainObject; | ||||
|   | ||||
| @@ -59,6 +59,7 @@ define( | ||||
|                     callback(value); | ||||
|                 }); | ||||
|             } | ||||
|             return true; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|  * Module defining FullscreenAction. Created by vwoeltje on 11/18/14. | ||||
|  */ | ||||
| define( | ||||
|     ["../../lib/screenfull.min"], | ||||
|     ["screenfull"], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|   | ||||
| @@ -29,8 +29,7 @@ define( | ||||
|     function (BrowseController) { | ||||
|         "use strict"; | ||||
|  | ||||
|         //TODO: Disabled for NEM Beta | ||||
|         xdescribe("The browse controller", function () { | ||||
|         describe("The browse controller", function () { | ||||
|             var mockScope, | ||||
|                 mockRoute, | ||||
|                 mockLocation, | ||||
| @@ -40,6 +39,9 @@ define( | ||||
|                 mockUrlService, | ||||
|                 mockDomainObject, | ||||
|                 mockNextObject, | ||||
|                 mockWindow, | ||||
|                 mockPolicyService, | ||||
|                 testDefaultRoot, | ||||
|                 controller; | ||||
|  | ||||
|             function mockPromise(value) { | ||||
| @@ -50,7 +52,32 @@ define( | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             function instantiateController() { | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockWindow, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService, | ||||
|                     mockUrlService, | ||||
|                     mockPolicyService, | ||||
|                     testDefaultRoot | ||||
|                 ); | ||||
|             } | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockWindow = jasmine.createSpyObj('$window', [ | ||||
|                    "confirm" | ||||
|                 ]); | ||||
|                 mockWindow.confirm.andReturn(true); | ||||
|  | ||||
|                 mockPolicyService = jasmine.createSpyObj('policyService', [ | ||||
|                     'allow' | ||||
|                 ]); | ||||
|  | ||||
|                 testDefaultRoot = "some-root-level-domain-object"; | ||||
|  | ||||
|                 mockScope = jasmine.createSpyObj( | ||||
|                     "$scope", | ||||
|                     [ "$on", "$watch" ] | ||||
| @@ -101,41 +128,28 @@ define( | ||||
|                 ])); | ||||
|                 mockNextObject.useCapability.andReturn(undefined); | ||||
|                 mockNextObject.getId.andReturn("next"); | ||||
|                 mockDomainObject.getId.andReturn("mine"); | ||||
|                 mockDomainObject.getId.andReturn(testDefaultRoot); | ||||
|  | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService, | ||||
|                     mockUrlService | ||||
|                 ); | ||||
|                 instantiateController(); | ||||
|             }); | ||||
|  | ||||
|             it("uses composition to set the navigated object, if there is none", function () { | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService, | ||||
|                     mockUrlService | ||||
|                 ); | ||||
|                 instantiateController(); | ||||
|                 expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockDomainObject); | ||||
|             }); | ||||
|  | ||||
|             it("navigates to a root-level object, even when default path is not found", function () { | ||||
|                 mockDomainObject.getId | ||||
|                     .andReturn("something-other-than-the-" + testDefaultRoot); | ||||
|                 instantiateController(); | ||||
|                 expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockDomainObject); | ||||
|             }); | ||||
|  | ||||
|             it("does not try to override navigation", function () { | ||||
|                 mockNavigationService.getNavigation.andReturn(mockDomainObject); | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService, | ||||
|                     mockUrlService | ||||
|                 ); | ||||
|                 instantiateController(); | ||||
|                 expect(mockScope.navigatedObject).toBe(mockDomainObject); | ||||
|             }); | ||||
|  | ||||
| @@ -162,14 +176,8 @@ define( | ||||
|             }); | ||||
|  | ||||
|             it("uses route parameters to choose initially-navigated object", function () { | ||||
|                 mockRoute.current.params.ids = "mine/next"; | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService | ||||
|                 ); | ||||
|                 mockRoute.current.params.ids = testDefaultRoot + "/next"; | ||||
|                 instantiateController(); | ||||
|                 expect(mockScope.navigatedObject).toBe(mockNextObject); | ||||
|                 expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockNextObject); | ||||
| @@ -179,14 +187,8 @@ define( | ||||
|                 // Idea here is that if we get a bad path of IDs, | ||||
|                 // browse controller should traverse down it until | ||||
|                 // it hits an invalid ID. | ||||
|                 mockRoute.current.params.ids = "mine/junk"; | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService | ||||
|                 ); | ||||
|                 mockRoute.current.params.ids = testDefaultRoot + "/junk"; | ||||
|                 instantiateController(); | ||||
|                 expect(mockScope.navigatedObject).toBe(mockDomainObject); | ||||
|                 expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockDomainObject); | ||||
| @@ -196,14 +198,8 @@ define( | ||||
|                 // Idea here is that if we get a path which passes | ||||
|                 // through an object without a composition, browse controller | ||||
|                 // should stop at it since remaining IDs cannot be loaded. | ||||
|                 mockRoute.current.params.ids = "mine/next/junk"; | ||||
|                 controller = new BrowseController( | ||||
|                     mockScope, | ||||
|                     mockRoute, | ||||
|                     mockLocation, | ||||
|                     mockObjectService, | ||||
|                     mockNavigationService | ||||
|                 ); | ||||
|                 mockRoute.current.params.ids = testDefaultRoot + "/next/junk"; | ||||
|                 instantiateController(); | ||||
|                 expect(mockScope.navigatedObject).toBe(mockNextObject); | ||||
|                 expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockNextObject); | ||||
| @@ -230,7 +226,10 @@ define( | ||||
|                 // prior to setting $route.current | ||||
|                 mockLocation.path.andReturn("/browse/"); | ||||
|  | ||||
|                 mockNavigationService.setNavigation.andReturn(true); | ||||
|  | ||||
|                 // Exercise the Angular workaround | ||||
|                 mockNavigationService.addListener.mostRecentCall.args[0](); | ||||
|                 mockScope.$on.mostRecentCall.args[1](); | ||||
|                 expect(mockUnlisten).toHaveBeenCalled(); | ||||
|  | ||||
| @@ -241,6 +240,36 @@ define( | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|             it("after successful navigation event sets the selected tree " + | ||||
|                 "object", function () { | ||||
|                 mockScope.navigatedObject = mockDomainObject; | ||||
|                 mockNavigationService.setNavigation.andReturn(true); | ||||
|  | ||||
|                 //Simulate a change in selected tree object | ||||
|                 mockScope.treeModel = {selectedObject: mockDomainObject}; | ||||
|                 mockScope.$watch.mostRecentCall.args[1](mockNextObject); | ||||
|  | ||||
|                 expect(mockScope.treeModel.selectedObject).toBe(mockNextObject); | ||||
|                 expect(mockScope.treeModel.selectedObject).not.toBe(mockDomainObject); | ||||
|             }); | ||||
|  | ||||
|             it("after failed navigation event resets the selected tree" + | ||||
|                 " object", function () { | ||||
|                 mockScope.navigatedObject = mockDomainObject; | ||||
|                 mockWindow.confirm.andReturn(false); | ||||
|                 mockPolicyService.allow.andCallFake(function(category, object, context, callback){ | ||||
|                     callback("unsaved changes"); | ||||
|                     return false; | ||||
|                 }); | ||||
|  | ||||
|                 //Simulate a change in selected tree object | ||||
|                 mockScope.treeModel = {selectedObject: mockDomainObject}; | ||||
|                 mockScope.$watch.mostRecentCall.args[1](mockNextObject); | ||||
|  | ||||
|                 expect(mockScope.treeModel.selectedObject).not.toBe(mockNextObject); | ||||
|                 expect(mockScope.treeModel.selectedObject).toBe(mockDomainObject); | ||||
|             }); | ||||
|  | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
|   | ||||
							
								
								
									
										45
									
								
								platform/commonUI/browse/test/InspectorRegionSpec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,45 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ | ||||
|  | ||||
| /** | ||||
|  * MCTIncudeSpec. Created by vwoeltje on 11/6/14. | ||||
|  */ | ||||
| define( | ||||
|     ["../src/InspectorRegion"], | ||||
|     function (InspectorRegion) { | ||||
|         "use strict"; | ||||
|  | ||||
|         describe("The inspector region", function () { | ||||
|             var inspectorRegion; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 inspectorRegion = new InspectorRegion(); | ||||
|             }); | ||||
|  | ||||
|             it("creates default region parts", function () { | ||||
|                 expect(inspectorRegion.regions.length).toBe(1); | ||||
|             }); | ||||
|  | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										137
									
								
								platform/commonUI/browse/test/creation/AddActionProviderSpec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,137 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is 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. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine,xit,xdescribe*/ | ||||
|  | ||||
| /** | ||||
|  * MCTRepresentationSpec. Created by ahenry on 01/21/14. | ||||
|  */ | ||||
| define( | ||||
|     ["../../src/creation/AddActionProvider"], | ||||
|     function (AddActionProvider) { | ||||
|         "use strict"; | ||||
|  | ||||
|         describe("The add action provider", function () { | ||||
|             var mockTypeService, | ||||
|                 mockDialogService, | ||||
|                 mockPolicyService, | ||||
|                 mockCreationPolicy, | ||||
|                 mockCompositionPolicy, | ||||
|                 mockPolicyMap = {}, | ||||
|                 mockTypes, | ||||
|                 mockDomainObject, | ||||
|                 mockQ, | ||||
|                 provider; | ||||
|  | ||||
|             function createMockType(name) { | ||||
|                 var mockType = jasmine.createSpyObj( | ||||
|                     "type" + name, | ||||
|                     [ | ||||
|                         "getKey", | ||||
|                         "getGlyph", | ||||
|                         "getName", | ||||
|                         "getDescription", | ||||
|                         "getProperties", | ||||
|                         "getInitialModel", | ||||
|                         "hasFeature" | ||||
|                     ] | ||||
|                 ); | ||||
|                 mockType.hasFeature.andReturn(true); | ||||
|                 mockType.getName.andReturn(name); | ||||
|                 return mockType; | ||||
|             } | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockTypeService = jasmine.createSpyObj( | ||||
|                     "typeService", | ||||
|                     [ "listTypes" ] | ||||
|                 ); | ||||
|                 mockDialogService = jasmine.createSpyObj( | ||||
|                     "dialogService", | ||||
|                     [ "getUserInput" ] | ||||
|                 ); | ||||
|                 mockPolicyService = jasmine.createSpyObj( | ||||
|                     "policyService", | ||||
|                     [ "allow" ] | ||||
|                 ); | ||||
|  | ||||
|                 mockDomainObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     [ "getCapability" ] | ||||
|                 ); | ||||
|  | ||||
|                 //Mocking getCapability because AddActionProvider uses the | ||||
|                 // type capability of the destination object. | ||||
|                 mockDomainObject.getCapability.andReturn({}); | ||||
|  | ||||
|                 mockTypes = [ "A", "B", "C" ].map(createMockType); | ||||
|  | ||||
|                 mockTypes.forEach(function(type){ | ||||
|                     mockPolicyMap[type.getName()] = true; | ||||
|                 }); | ||||
|  | ||||
|                 mockCreationPolicy = function(type){ | ||||
|                     return mockPolicyMap[type.getName()]; | ||||
|                 }; | ||||
|  | ||||
|                 mockCompositionPolicy = function(){ | ||||
|                     return true; | ||||
|                 }; | ||||
|  | ||||
|                 mockPolicyService.allow.andReturn(true); | ||||
|  | ||||
|                 mockTypeService.listTypes.andReturn(mockTypes); | ||||
|  | ||||
|                 provider = new AddActionProvider( | ||||
|                     mockQ, | ||||
|                     mockTypeService, | ||||
|                     mockDialogService, | ||||
|                     mockPolicyService | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|             it("checks for creatability", function () { | ||||
|                 provider.getActions({ | ||||
|                     key: "add", | ||||
|                     domainObject: mockDomainObject | ||||
|                 }); | ||||
|                 // Make sure it was creation which was used to check | ||||
|                 expect(mockPolicyService.allow) | ||||
|                     .toHaveBeenCalledWith("creation", mockTypes[0]); | ||||
|             }); | ||||
|  | ||||
|             it("checks for composability of type", function () { | ||||
|                 provider.getActions({ | ||||
|                     key: "add", | ||||
|                     domainObject: mockDomainObject | ||||
|                 }); | ||||
|  | ||||
|                 expect(mockPolicyService.allow).toHaveBeenCalledWith( | ||||
|                     "composition", | ||||
|                     jasmine.any(Object), | ||||
|                     jasmine.any(Object) | ||||
|                 ); | ||||
|  | ||||
|                 expect(mockDomainObject.getCapability).toHaveBeenCalledWith('type'); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
| @@ -32,11 +32,12 @@ define( | ||||
|         describe("The create action provider", function () { | ||||
|             var mockTypeService, | ||||
|                 mockDialogService, | ||||
|                 mockCreationService, | ||||
|                 mockNavigationService, | ||||
|                 mockPolicyService, | ||||
|                 mockCreationPolicy, | ||||
|                 mockPolicyMap = {}, | ||||
|                 mockTypes, | ||||
|                 mockQ, | ||||
|                 provider; | ||||
|  | ||||
|             function createMockType(name) { | ||||
| @@ -66,9 +67,9 @@ define( | ||||
|                     "dialogService", | ||||
|                     [ "getUserInput" ] | ||||
|                 ); | ||||
|                 mockCreationService = jasmine.createSpyObj( | ||||
|                     "creationService", | ||||
|                     [ "createObject" ] | ||||
|                 mockNavigationService = jasmine.createSpyObj( | ||||
|                     "navigationService", | ||||
|                     [ "setNavigation" ] | ||||
|                 ); | ||||
|                 mockPolicyService = jasmine.createSpyObj( | ||||
|                     "policyService", | ||||
| @@ -92,15 +93,14 @@ define( | ||||
|                 mockTypeService.listTypes.andReturn(mockTypes); | ||||
|  | ||||
|                 provider = new CreateActionProvider( | ||||
|                     mockQ, | ||||
|                     mockTypeService, | ||||
|                     mockDialogService, | ||||
|                     mockCreationService, | ||||
|                     mockNavigationService, | ||||
|                     mockPolicyService | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|             //TODO: Disabled for NEM Beta | ||||
|             xit("exposes one create action per type", function () { | ||||
|             it("exposes one create action per type", function () { | ||||
|                 expect(provider.getActions({ | ||||
|                     key: "create", | ||||
|                     domainObject: {} | ||||
| @@ -114,8 +114,7 @@ define( | ||||
|                 }).length).toEqual(0); | ||||
|             }); | ||||
|  | ||||
|             //TODO: Disabled for NEM Beta | ||||
|             xit("does not expose non-creatable types", function () { | ||||
|             it("does not expose non-creatable types", function () { | ||||
|                 // One of the types won't have the creation feature... | ||||
|                 mockPolicyMap[mockTypes[0].getName()] = false; | ||||
|                 // ...so it should have been filtered out. | ||||
|   | ||||
| @@ -35,6 +35,7 @@ define( | ||||
|                 mockProperties, | ||||
|                 mockPolicyService, | ||||
|                 testModel, | ||||
|                 mockDomainObject, | ||||
|                 wizard; | ||||
|  | ||||
|             function createMockProperty(name) { | ||||
| @@ -81,8 +82,18 @@ define( | ||||
|                 mockType.getInitialModel.andReturn(testModel); | ||||
|                 mockType.getProperties.andReturn(mockProperties); | ||||
|  | ||||
|                 mockDomainObject = jasmine.createSpyObj( | ||||
|                     'domainObject', | ||||
|                     ['getCapability', 'useCapability', 'getModel'] | ||||
|                 ); | ||||
|  | ||||
|                 //Mocking the getCapability('type') call | ||||
|                 mockDomainObject.getCapability.andReturn(mockType); | ||||
|                 mockDomainObject.useCapability.andReturn(); | ||||
|                 mockDomainObject.getModel.andReturn(testModel); | ||||
|  | ||||
|                 wizard = new CreateWizard( | ||||
|                     mockType, | ||||
|                     mockDomainObject, | ||||
|                     mockParent, | ||||
|                     mockPolicyService | ||||
|                 ); | ||||
| @@ -130,6 +141,18 @@ define( | ||||
|                 }); | ||||
|             }); | ||||
|  | ||||
|             it("populates the model on the associated object", function () { | ||||
|                 var formValue = { | ||||
|                     "A": "ValueA", | ||||
|                     "B": "ValueB", | ||||
|                     "C": "ValueC" | ||||
|                     }, | ||||
|                     compareModel = wizard.createModel(formValue); | ||||
|                 wizard.populateObjectFromInput(formValue); | ||||
|                 expect(mockDomainObject.useCapability).toHaveBeenCalledWith('mutation', jasmine.any(Function)); | ||||
|                 expect(mockDomainObject.useCapability.mostRecentCall.args[1]()).toEqual(compareModel); | ||||
|             }); | ||||
|  | ||||
|             it("validates selection types using policy", function () { | ||||
|                 var mockDomainObject = jasmine.createSpyObj( | ||||
|                         'domainObject', | ||||
| @@ -139,7 +162,8 @@ define( | ||||
|                         'otherType', | ||||
|                         ['getKey'] | ||||
|                     ), | ||||
|                     structure = wizard.getFormStructure(), | ||||
|                     //Create a form structure with location | ||||
|                     structure = wizard.getFormStructure(true), | ||||
|                     sections = structure.sections, | ||||
|                     rows = structure.sections[sections.length - 1].rows, | ||||
|                     locationRow = rows[rows.length - 1]; | ||||
| @@ -156,6 +180,12 @@ define( | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|             it("creates a form model without a location if not requested", function () { | ||||
|                 expect(wizard.getFormStructure(false).sections.some(function(section){ | ||||
|                     return section.name === 'Location'; | ||||
|                 })).toEqual(false); | ||||
|             }); | ||||
|  | ||||
|  | ||||
|         }); | ||||
|     } | ||||
|   | ||||
| @@ -35,6 +35,8 @@ define( | ||||
|                 mockDomainObject, | ||||
|                 mockRootObject, | ||||
|                 mockContext, | ||||
|                 mockObjectService, | ||||
|                 getObjectsPromise, | ||||
|                 controller; | ||||
|  | ||||
|             beforeEach(function () { | ||||
| @@ -55,73 +57,106 @@ define( | ||||
|                     "context", | ||||
|                     [ "getRoot" ] | ||||
|                 ); | ||||
|                 mockObjectService = jasmine.createSpyObj( | ||||
|                     "objectService", | ||||
|                     ["getObjects"] | ||||
|                 ); | ||||
|                 getObjectsPromise = jasmine.createSpyObj( | ||||
|                     "promise", | ||||
|                     ["then"] | ||||
|                 ); | ||||
|  | ||||
|                 mockDomainObject.getCapability.andReturn(mockContext); | ||||
|                 mockContext.getRoot.andReturn(mockRootObject); | ||||
|                 mockObjectService.getObjects.andReturn(getObjectsPromise); | ||||
|  | ||||
|                 mockScope.ngModel = {}; | ||||
|                 mockScope.field = "someField"; | ||||
|  | ||||
|                 controller = new LocatorController(mockScope, mockTimeout); | ||||
|                 controller = new LocatorController(mockScope, mockTimeout, mockObjectService); | ||||
|             }); | ||||
|                 describe("when context is available", function () { | ||||
|  | ||||
|             it("adds a treeModel to scope", function () { | ||||
|                 expect(mockScope.treeModel).toBeDefined(); | ||||
|             }); | ||||
|                     beforeEach(function () { | ||||
|                         mockContext.getRoot.andReturn(mockRootObject); | ||||
|                         controller = new LocatorController(mockScope, mockTimeout, mockObjectService); | ||||
|                     }); | ||||
|  | ||||
|             it("watches for changes to treeModel", function () { | ||||
|                 // This is what the embedded tree representation | ||||
|                 // will be modifying. | ||||
|                 expect(mockScope.$watch).toHaveBeenCalledWith( | ||||
|                     "treeModel.selectedObject", | ||||
|                     jasmine.any(Function) | ||||
|                 ); | ||||
|             }); | ||||
|                     it("adds a treeModel to scope", function () { | ||||
|                         expect(mockScope.treeModel).toBeDefined(); | ||||
|                     }); | ||||
|  | ||||
|             it("changes its own model on embedded model updates", function () { | ||||
|                 // Need to pass on selection changes as updates to | ||||
|                 // the control's value | ||||
|                 mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                 mockTimeout.mostRecentCall.args[0](); | ||||
|                 expect(mockScope.ngModel.someField).toEqual(mockDomainObject); | ||||
|                 expect(mockScope.rootObject).toEqual(mockRootObject); | ||||
|                     it("watches for changes to treeModel", function () { | ||||
|                         // This is what the embedded tree representation | ||||
|                         // will be modifying. | ||||
|                         expect(mockScope.$watch).toHaveBeenCalledWith( | ||||
|                             "treeModel.selectedObject", | ||||
|                             jasmine.any(Function) | ||||
|                         ); | ||||
|                     }); | ||||
|  | ||||
|                 // Verify that the capability we expect to have been used | ||||
|                 // was used. | ||||
|                 expect(mockDomainObject.getCapability) | ||||
|                     .toHaveBeenCalledWith("context"); | ||||
|             }); | ||||
|                     it("changes its own model on embedded model updates", function () { | ||||
|                         // Need to pass on selection changes as updates to | ||||
|                         // the control's value | ||||
|                         mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                         mockTimeout.mostRecentCall.args[0](); | ||||
|                         expect(mockScope.ngModel.someField).toEqual(mockDomainObject); | ||||
|                         expect(mockScope.rootObject).toEqual(mockRootObject); | ||||
|  | ||||
|             it("rejects changes which fail validation", function () { | ||||
|                 mockScope.structure = { validate: jasmine.createSpy('validate') }; | ||||
|                 mockScope.structure.validate.andReturn(false); | ||||
|                         // Verify that the capability we expect to have been used | ||||
|                         // was used. | ||||
|                         expect(mockDomainObject.getCapability) | ||||
|                             .toHaveBeenCalledWith("context"); | ||||
|                     }); | ||||
|  | ||||
|                 // Pass selection change | ||||
|                 mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                 mockTimeout.mostRecentCall.args[0](); | ||||
|                     it("rejects changes which fail validation", function () { | ||||
|                         mockScope.structure = { validate: jasmine.createSpy('validate') }; | ||||
|                         mockScope.structure.validate.andReturn(false); | ||||
|  | ||||
|                 expect(mockScope.structure.validate).toHaveBeenCalled(); | ||||
|                 // Change should have been rejected | ||||
|                 expect(mockScope.ngModel.someField).not.toEqual(mockDomainObject); | ||||
|             }); | ||||
|                         // Pass selection change | ||||
|                         mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                         mockTimeout.mostRecentCall.args[0](); | ||||
|  | ||||
|             it("treats a lack of a selection as invalid", function () { | ||||
|                 mockScope.ngModelController = jasmine.createSpyObj( | ||||
|                     'ngModelController', | ||||
|                     [ '$setValidity' ] | ||||
|                 ); | ||||
|                         expect(mockScope.structure.validate).toHaveBeenCalled(); | ||||
|                         // Change should have been rejected | ||||
|                         expect(mockScope.ngModel.someField).not.toEqual(mockDomainObject); | ||||
|                     }); | ||||
|  | ||||
|                 mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                 mockTimeout.mostRecentCall.args[0](); | ||||
|                 expect(mockScope.ngModelController.$setValidity) | ||||
|                     .toHaveBeenCalledWith(jasmine.any(String), true); | ||||
|                     it("treats a lack of a selection as invalid", function () { | ||||
|                         mockScope.ngModelController = jasmine.createSpyObj( | ||||
|                             'ngModelController', | ||||
|                             [ '$setValidity' ] | ||||
|                         ); | ||||
|  | ||||
|                 mockScope.$watch.mostRecentCall.args[1](undefined); | ||||
|                 mockTimeout.mostRecentCall.args[0](); | ||||
|                 expect(mockScope.ngModelController.$setValidity) | ||||
|                     .toHaveBeenCalledWith(jasmine.any(String), false); | ||||
|             }); | ||||
|                         mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                         mockTimeout.mostRecentCall.args[0](); | ||||
|                         expect(mockScope.ngModelController.$setValidity) | ||||
|                             .toHaveBeenCalledWith(jasmine.any(String), true); | ||||
|  | ||||
|                         mockScope.$watch.mostRecentCall.args[1](undefined); | ||||
|                         mockTimeout.mostRecentCall.args[0](); | ||||
|                         expect(mockScope.ngModelController.$setValidity) | ||||
|                             .toHaveBeenCalledWith(jasmine.any(String), false); | ||||
|                     }); | ||||
|                 }); | ||||
|                 describe("when no context is available", function () { | ||||
|                     var defaultRoot = "DEFAULT_ROOT"; | ||||
|  | ||||
|                     beforeEach(function () { | ||||
|                         mockContext.getRoot.andReturn(undefined); | ||||
|                         getObjectsPromise.then.andCallFake(function(callback){ | ||||
|                             callback({'ROOT':defaultRoot}); | ||||
|                         }); | ||||
|                         controller = new LocatorController(mockScope, mockTimeout, mockObjectService); | ||||
|                     }); | ||||
|  | ||||
|                     it("provides a default context where none is available", function () { | ||||
|                         mockScope.$watch.mostRecentCall.args[1](mockDomainObject); | ||||
|                         mockTimeout.mostRecentCall.args[0](); | ||||
|                         expect(mockScope.rootObject).toBe(defaultRoot); | ||||
|  | ||||
|                     }); | ||||
|                 }); | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
|   | ||||
| @@ -86,4 +86,4 @@ define( | ||||
|  | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
| ); | ||||
|   | ||||
| @@ -1,18 +0,0 @@ | ||||
| [ | ||||
|     "BrowseController", | ||||
|     "BrowseObjectController", | ||||
|     "PaneController", | ||||
|     "MenuArrowController", | ||||
|     "creation/CreateAction", | ||||
|     "creation/CreateActionProvider", | ||||
|     "creation/CreateMenuController", | ||||
|     "creation/CreateWizard", | ||||
|     "creation/CreationService", | ||||
|     "creation/CreationPolicy", | ||||
|     "creation/LocatorController", | ||||
|     "navigation/NavigateAction", | ||||
|     "navigation/NavigationService", | ||||
|     "windowing/FullscreenAction", | ||||
|     "windowing/NewTabAction", | ||||
|     "windowing/WindowTitler" | ||||
| ] | ||||
| @@ -24,10 +24,24 @@ | ||||
| define([ | ||||
|     "./src/DialogService", | ||||
|     "./src/OverlayService", | ||||
|     "text!./res/templates/overlay-dialog.html", | ||||
|     "text!./res/templates/overlay-options.html", | ||||
|     "text!./res/templates/dialog.html", | ||||
|     "text!./res/templates/overlay-blocking-message.html", | ||||
|     "text!./res/templates/message.html", | ||||
|     "text!./res/templates/overlay-message-list.html", | ||||
|     "text!./res/templates/overlay.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     DialogService, | ||||
|     OverlayService, | ||||
|     overlayDialogTemplate, | ||||
|     overlayOptionsTemplate, | ||||
|     dialogTemplate, | ||||
|     overlayBlockingMessageTemplate, | ||||
|     messageTemplate, | ||||
|     overlayMessageListTemplate, | ||||
|     overlayTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
| @@ -57,33 +71,33 @@ define([ | ||||
|             "templates": [ | ||||
|                 { | ||||
|                     "key": "overlay-dialog", | ||||
|                     "templateUrl": "templates/overlay-dialog.html" | ||||
|                     "template": overlayDialogTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "overlay-options", | ||||
|                     "templateUrl": "templates/overlay-options.html" | ||||
|                     "template": overlayOptionsTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "form-dialog", | ||||
|                     "templateUrl": "templates/dialog.html" | ||||
|                     "template": dialogTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "overlay-blocking-message", | ||||
|                     "templateUrl": "templates/overlay-blocking-message.html" | ||||
|                     "template": overlayBlockingMessageTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "message", | ||||
|                     "templateUrl": "templates/message.html" | ||||
|                     "template": messageTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "overlay-message-list", | ||||
|                     "templateUrl": "templates/overlay-message-list.html" | ||||
|                     "template": overlayMessageListTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "containers": [ | ||||
|                 { | ||||
|                     "key": "overlay", | ||||
|                     "templateUrl": "templates/overlay.html" | ||||
|                     "template": overlayTemplate | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|   | ||||
| @@ -6,7 +6,9 @@ | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="abs message-body"> | ||||
|             <mct-include ng-repeat="msg in ngModel.dialog.messages | orderBy: '-'" key="'message'" ng-model="msg"></mct-include> | ||||
|             <mct-include | ||||
|                     ng-repeat="msg in ngModel.dialog.messages | orderBy: '-'" | ||||
|                     key="'message'" ng-model="msg.model"></mct-include> | ||||
|         </div> | ||||
|         <div class="abs bottom-bar"> | ||||
|             <a ng-repeat="dialogAction in ngModel.dialog.actions" | ||||
|   | ||||
| @@ -1,4 +0,0 @@ | ||||
| [ | ||||
|     "DialogService", | ||||
|     "OverlayService" | ||||
| ] | ||||
| @@ -22,10 +22,10 @@ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/controllers/EditController", | ||||
|     "./src/controllers/EditActionController", | ||||
|     "./src/controllers/EditPanesController", | ||||
|     "./src/controllers/ElementsController", | ||||
|     "./src/controllers/EditObjectController", | ||||
|     "./src/directives/MCTBeforeUnload", | ||||
|     "./src/actions/LinkAction", | ||||
|     "./src/actions/EditAction", | ||||
| @@ -34,14 +34,20 @@ define([ | ||||
|     "./src/actions/SaveAction", | ||||
|     "./src/actions/CancelAction", | ||||
|     "./src/policies/EditActionPolicy", | ||||
|     "./src/policies/EditNavigationPolicy", | ||||
|     "./src/representers/EditRepresenter", | ||||
|     "./src/representers/EditToolbarRepresenter", | ||||
|     "text!./res/templates/library.html", | ||||
|     "text!./res/templates/edit-object.html", | ||||
|     "text!./res/templates/edit-action-buttons.html", | ||||
|     "text!./res/templates/elements.html", | ||||
|     "text!./res/templates/topbar-edit.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     EditController, | ||||
|     EditActionController, | ||||
|     EditPanesController, | ||||
|     ElementsController, | ||||
|     EditObjectController, | ||||
|     MCTBeforeUnload, | ||||
|     LinkAction, | ||||
|     EditAction, | ||||
| @@ -50,30 +56,21 @@ define([ | ||||
|     SaveAction, | ||||
|     CancelAction, | ||||
|     EditActionPolicy, | ||||
|     EditNavigationPolicy, | ||||
|     EditRepresenter, | ||||
|     EditToolbarRepresenter, | ||||
|     libraryTemplate, | ||||
|     editObjectTemplate, | ||||
|     editActionButtonsTemplate, | ||||
|     elementsTemplate, | ||||
|     topbarEditTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("platform/commonUI/edit", { | ||||
|         "extensions": { | ||||
|             "routes": [ | ||||
|                 { | ||||
|                     "when": "/edit", | ||||
|                     "templateUrl": "templates/edit.html" | ||||
|                 } | ||||
|             ], | ||||
|             "controllers": [ | ||||
|                 { | ||||
|                     "key": "EditController", | ||||
|                     "implementation": EditController, | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "$q", | ||||
|                         "navigationService" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "EditActionController", | ||||
|                     "implementation": EditActionController, | ||||
| @@ -94,6 +91,15 @@ define([ | ||||
|                     "depends": [ | ||||
|                         "$scope" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "EditObjectController", | ||||
|                     "implementation": EditObjectController, | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "$location", | ||||
|                         "policyService" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "directives": [ | ||||
| @@ -156,14 +162,11 @@ define([ | ||||
|                     "name": "Save", | ||||
|                     "description": "Save changes made to these objects.", | ||||
|                     "depends": [ | ||||
|                         "$q", | ||||
|                         "$location", | ||||
|                         "$injector", | ||||
|                         "urlService", | ||||
|                         "navigationService", | ||||
|                         "policyService", | ||||
|                         "dialogService", | ||||
|                         "creationService" | ||||
|                         "creationService", | ||||
|                         "copyService" | ||||
|                     ], | ||||
|                     "priority": "mandatory" | ||||
|                 }, | ||||
| @@ -183,32 +186,41 @@ define([ | ||||
|                 { | ||||
|                     "category": "action", | ||||
|                     "implementation": EditActionPolicy | ||||
|                 }, | ||||
|                 { | ||||
|                     "category": "navigation", | ||||
|                     "message": "There are unsaved changes.", | ||||
|                     "implementation": EditNavigationPolicy | ||||
|                 } | ||||
|  | ||||
|             ], | ||||
|             "templates": [ | ||||
|                 { | ||||
|                     "key": "edit-library", | ||||
|                     "templateUrl": "templates/library.html" | ||||
|                     "template": libraryTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "representations": [ | ||||
|                 { | ||||
|                     "key": "edit-object", | ||||
|                     "templateUrl": "templates/edit-object.html", | ||||
|                     "template": editObjectTemplate, | ||||
|                     "uses": [ | ||||
|                         "view" | ||||
|                     ], | ||||
|                     "gestures": [ | ||||
|                         "drop" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "edit-action-buttons", | ||||
|                     "templateUrl": "templates/edit-action-buttons.html", | ||||
|                     "template": editActionButtonsTemplate, | ||||
|                     "uses": [ | ||||
|                         "action" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "edit-elements", | ||||
|                     "templateUrl": "templates/elements.html", | ||||
|                     "template": elementsTemplate, | ||||
|                     "uses": [ | ||||
|                         "composition" | ||||
|                     ], | ||||
| @@ -218,7 +230,7 @@ define([ | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "topbar-edit", | ||||
|                     "templateUrl": "templates/topbar-edit.html" | ||||
|                     "template": topbarEditTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "representers": [ | ||||
|   | ||||
| @@ -19,50 +19,51 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <mct-representation key="'topbar-edit'" | ||||
|                     mct-object="domainObject" | ||||
|                     ng-model="representation"> | ||||
| </mct-representation> | ||||
| <div class="holder edit-area abs"> | ||||
|     <mct-split-pane class='contents abs' anchor='right'> | ||||
|         <div class='split-pane-component pane left edit-main'> | ||||
|             <mct-toolbar name="mctToolbar" | ||||
|                          structure="toolbar.structure" | ||||
|                          ng-model="toolbar.state"> | ||||
|             </mct-toolbar> | ||||
|             <mct-representation key="representation.selected.key" | ||||
|                                 toolbar="toolbar" | ||||
|                                 mct-object="representation.selected.key && domainObject" | ||||
|                                 class="holder abs object-holder work-area"> | ||||
| <div class="abs l-flex-col" ng-controller="EditObjectController as EditObjectController"> | ||||
|     <div mct-before-unload="EditObjectController.getUnloadWarning()" | ||||
|          class="holder flex-elem l-flex-row object-browse-bar "> | ||||
|         <div class="items-select left flex-elem l-flex-row grows"> | ||||
|             <mct-representation key="'back-arrow'" | ||||
|                                 mct-object="domainObject" | ||||
|                                 class="flex-elem l-back"></mct-representation> | ||||
|             <mct-representation key="'object-header'" | ||||
|                                 mct-object="domainObject" | ||||
|                                 class="l-flex-row flex-elem grows object-header"> | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|         <mct-splitter></mct-splitter> | ||||
|         <div | ||||
|             class='split-pane-component pane right edit-objects menus-to-left' | ||||
|             ng-controller='EditPanesController as editPanes' | ||||
|             > | ||||
|             <mct-split-pane class='contents abs' anchor='bottom'> | ||||
|                 <div | ||||
|                     class="abs pane top accordion" | ||||
|                     ng-controller="ToggleController as toggle" | ||||
|                     > | ||||
|                     <mct-container key="accordion" label="Library"> | ||||
|                         <mct-representation key="'tree'" | ||||
|                                             mct-object="editPanes.getRoot()"> | ||||
|                         </mct-representation> | ||||
|                     </mct-container> | ||||
|                 </div> | ||||
|                 <mct-splitter></mct-splitter> | ||||
|                 <div | ||||
|                     class="abs pane bottom accordion" | ||||
|                     ng-controller="ToggleController as toggle" | ||||
|                     > | ||||
|                     <mct-container key="accordion" label="Elements"> | ||||
|                         <mct-representation key="'edit-elements'" mct-object="domainObject"> | ||||
|                         </mct-representation> | ||||
|                     </mct-container> | ||||
|                 </div> | ||||
|             </mct-split-pane> | ||||
|         <div class="btn-bar right l-flex-row flex-elem flex-justify-end flex-fixed"> | ||||
|             <mct-representation key="'switcher'" | ||||
|                                 mct-object="domainObject" | ||||
|                                 ng-model="representation"> | ||||
|             </mct-representation> | ||||
|             <!-- Temporarily, on mobile, the action buttons are hidden--> | ||||
|             <mct-representation key="'action-group'" | ||||
|                                 mct-object="domainObject" | ||||
|                                 parameters="{ category: 'view-control' }" | ||||
|                                 class="mobile-hide"> | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|     </mct-split-pane> | ||||
|     </div> | ||||
|     <div class="holder l-flex-col flex-elem grows l-object-wrapper"> | ||||
|         <div class="holder l-flex-col flex-elem grows l-object-wrapper-inner"> | ||||
|             <!-- Toolbar and Save/Cancel buttons --> | ||||
|             <div class="l-edit-controls flex-elem l-flex-row flex-align-end"> | ||||
|                 <mct-toolbar name="mctToolbar" | ||||
|                              structure="toolbar.structure" | ||||
|                              ng-model="toolbar.state" | ||||
|                              class="flex-elem grows"> | ||||
|                 </mct-toolbar> | ||||
|                 <mct-representation key="'edit-action-buttons'" | ||||
|                                     mct-object="domainObject" | ||||
|                                     class='flex-elem conclude-editing'> | ||||
|                 </mct-representation> | ||||
|  | ||||
|             </div> | ||||
|             <mct-representation key="representation.selected.key" | ||||
|                                 mct-object="representation.selected.key && domainObject" | ||||
|                                 class="abs flex-elem grows object-holder-main scroll" | ||||
|                                 toolbar="toolbar"> | ||||
|             </mct-representation> | ||||
|         </div><!--/ l-object-wrapper-inner --> | ||||
|     </div> | ||||
| </div> | ||||
|   | ||||
| @@ -19,16 +19,19 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div ng-controller="ElementsController"> | ||||
| <div ng-controller="ElementsController" class="flex-elem l-flex-col holder grows"> | ||||
|     <mct-include key="'input-filter'" | ||||
|                  class="flex-elem holder" | ||||
|                  ng-model="filterBy"> | ||||
|     </mct-include> | ||||
|     <div class="current-elements abs" style="height: 100%;"> | ||||
|     <div class="flex-elem grows vscroll"> | ||||
|         <ul class="tree"> | ||||
|             <li ng-repeat="containedObject in composition | filter:searchText"> | ||||
|                 <span class="tree-item"> | ||||
|                     <mct-representation key="'label'" mct-object="containedObject"> | ||||
|                     <mct-representation | ||||
|                             class="rep-object-label" | ||||
|                             key="'label'" | ||||
|                             mct-object="containedObject"> | ||||
|                     </mct-representation> | ||||
|                 </span> | ||||
|             </li> | ||||
|   | ||||
| @@ -72,13 +72,26 @@ define( | ||||
|          * Enter edit mode. | ||||
|          */ | ||||
|         EditAction.prototype.perform = function () { | ||||
|             var editableObject; | ||||
|             var self = this; | ||||
|             if (!this.domainObject.hasCapability("editor")) { | ||||
|                 editableObject = new EditableDomainObject(this.domainObject, this.$q); | ||||
|                 editableObject.getCapability('status').set('editing', true); | ||||
|                 this.navigationService.setNavigation(editableObject); | ||||
|                 //TODO: This is only necessary because the drop gesture is | ||||
|                 // wrapping the object itself, need to refactor this later. | ||||
|                 // All responsibility for switching into edit mode should be | ||||
|                 // in the edit action, and not duplicated in the gesture | ||||
|                 this.domainObject = new EditableDomainObject(this.domainObject, this.$q); | ||||
|             } | ||||
|             //this.$location.path("/edit"); | ||||
|             this.navigationService.setNavigation(this.domainObject); | ||||
|             this.domainObject.getCapability('status').set('editing', true); | ||||
|  | ||||
|             //Register a listener to automatically cancel this edit action | ||||
|             //if the user navigates away from this object. | ||||
|             function cancelEditing(navigatedTo){ | ||||
|                 if (!navigatedTo || navigatedTo.getId() !== self.domainObject.getId()) { | ||||
|                     self.domainObject.getCapability('editor').cancel(); | ||||
|                     self.navigationService.removeListener(cancelEditing); | ||||
|                 } | ||||
|             } | ||||
|             this.navigationService.addListener(cancelEditing); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -36,18 +36,22 @@ define( | ||||
|          * @implements {Action} | ||||
|          * @memberof platform/commonUI/edit | ||||
|          */ | ||||
|         function SaveAction($q, $location, $injector, urlService, navigationService, policyService, dialogService, creationService, context) { | ||||
|         function SaveAction( | ||||
|             $injector, | ||||
|             policyService, | ||||
|             dialogService, | ||||
|             creationService, | ||||
|             copyService, | ||||
|             context | ||||
|         ) { | ||||
|             this.domainObject = (context || {}).domainObject; | ||||
|             this.$location = $location; | ||||
|             this.injectObjectService = function(){ | ||||
|                 this.objectService = $injector.get("objectService"); | ||||
|             }; | ||||
|             this.urlService = urlService; | ||||
|             this.navigationService = navigationService; | ||||
|             this.policyService = policyService; | ||||
|             this.dialogService = dialogService; | ||||
|             this.creationService = creationService; | ||||
|             this.$q = $q; | ||||
|             this.copyService = copyService; | ||||
|         } | ||||
|  | ||||
|         SaveAction.prototype.getObjectService = function(){ | ||||
| @@ -67,77 +71,29 @@ define( | ||||
|          */ | ||||
|         SaveAction.prototype.perform = function () { | ||||
|             var domainObject = this.domainObject, | ||||
|                 $location = this.$location, | ||||
|                 urlService = this.urlService, | ||||
|                 copyService = this.copyService, | ||||
|                 self = this; | ||||
|  | ||||
|             function resolveWith(object){ | ||||
|                 return function() { | ||||
|                 return function () { | ||||
|                     return object; | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             function doWizardSave(parent) { | ||||
|                 var context = domainObject.getCapability("context"), | ||||
|                     wizard = new CreateWizard(domainObject.useCapability('type'), parent, self.policyService, domainObject.getModel()); | ||||
|  | ||||
|                 function mergeObjects(fromObject, toObject){ | ||||
|                     Object.keys(fromObject).forEach(function(key) { | ||||
|                         toObject[key] = fromObject[key]; | ||||
|                     }); | ||||
|                 } | ||||
|  | ||||
|                 // Create and persist the new object, based on user | ||||
|                 // input. | ||||
|                 function buildObjectFromInput(formValue) { | ||||
|                     var parent = wizard.getLocation(formValue), | ||||
|                         formModel = wizard.createModel(formValue); | ||||
|  | ||||
|                         formModel.location = parent.getId(); | ||||
|                         //Replace domain object model with model collected | ||||
|                         // from user form. | ||||
|                         domainObject.useCapability("mutation", function(){ | ||||
|                             //Replace object model with the model from the form | ||||
|                             return formModel; | ||||
|                         }); | ||||
|                         return domainObject; | ||||
|                 } | ||||
|  | ||||
|                 function getAllComposees(domainObject){ | ||||
|                     return domainObject.useCapability('composition'); | ||||
|                 } | ||||
|  | ||||
|                 function addComposeesToObject(object){ | ||||
|                     return function(composees){ | ||||
|                         return self.$q.all(composees.map(function (composee) { | ||||
|                             return object.getCapability('composition').add(composee); | ||||
|                         })).then(resolveWith(object)); | ||||
|                     }; | ||||
|                 } | ||||
|  | ||||
|                 /** | ||||
|                  * Add the composees of the 'virtual' object to the | ||||
|                  * persisted object | ||||
|                  * @param object | ||||
|                  * @returns {*} | ||||
|                  */ | ||||
|                 function composeNewObject(object){ | ||||
|                     if (self.$q.when(object.hasCapability('composition') && domainObject.hasCapability('composition'))) { | ||||
|                         return getAllComposees(domainObject) | ||||
|                             .then(addComposeesToObject(object)); | ||||
|                     } | ||||
|                 } | ||||
|                     wizard = new CreateWizard( | ||||
|                         domainObject, | ||||
|                         parent, | ||||
|                         self.policyService | ||||
|                     ); | ||||
|  | ||||
|                 return self.dialogService | ||||
|                     .getUserInput(wizard.getFormStructure(), wizard.getInitialFormValue()) | ||||
|                     .then(buildObjectFromInput); | ||||
|             } | ||||
|  | ||||
|  | ||||
|             function persistObject(object){ | ||||
|                 return  ((object.hasCapability('editor') && object.getCapability('editor').save(true)) || | ||||
|                         object.getCapability('persistence').persist()) | ||||
|                         .then(resolveWith(object)); | ||||
|                     .getUserInput( | ||||
|                         wizard.getFormStructure(true), | ||||
|                         wizard.getInitialFormValue() | ||||
|                     ) | ||||
|                     .then(wizard.populateObjectFromInput.bind(wizard)); | ||||
|             } | ||||
|  | ||||
|             function fetchObject(objectId){ | ||||
| @@ -150,14 +106,18 @@ define( | ||||
|                 return fetchObject(object.getModel().location); | ||||
|             } | ||||
|  | ||||
|             function locateObjectInParent(parent){ | ||||
|                 parent.getCapability('composition').add(domainObject.getId()); | ||||
|                 return parent; | ||||
|             function allowClone(objectToClone) { | ||||
|                 return (objectToClone.getId() === domainObject.getId()) || | ||||
|                     objectToClone.getCapability('location').isOriginal(); | ||||
|             } | ||||
|  | ||||
|             function doNothing() { | ||||
|                 // Create cancelled, do nothing | ||||
|                 return false; | ||||
|             function cloneIntoParent(parent) { | ||||
|                 return copyService.perform(domainObject, parent, allowClone); | ||||
|             } | ||||
|  | ||||
|             function cancelEditingAfterClone(clonedObject) { | ||||
|                 return domainObject.getCapability("editor").cancel() | ||||
|                     .then(resolveWith(clonedObject)); | ||||
|             } | ||||
|  | ||||
|             // Invoke any save behavior introduced by the editor capability; | ||||
| @@ -167,18 +127,13 @@ define( | ||||
|             function doSave() { | ||||
|                 //This is a new 'virtual object' that has not been persisted | ||||
|                 // yet. | ||||
|                 if (!domainObject.getModel().persisted){ | ||||
|                 if (domainObject.getModel().persisted === undefined){ | ||||
|                     return getParent(domainObject) | ||||
|                             .then(doWizardSave) | ||||
|                             .then(persistObject) | ||||
|                             .then(getParent)//Parent may have changed based | ||||
|                                             // on user selection | ||||
|                             .then(locateObjectInParent) | ||||
|                             .then(persistObject) | ||||
|                             .then(function(){ | ||||
|                                 return fetchObject(domainObject.getId()); | ||||
|                             }) | ||||
|                         .catch(doNothing); | ||||
|                         .then(doWizardSave) | ||||
|                         .then(getParent) | ||||
|                         .then(cloneIntoParent) | ||||
|                         .then(cancelEditingAfterClone) | ||||
|                         .catch(resolveWith(false)); | ||||
|                 } else { | ||||
|                     return domainObject.getCapability("editor").save() | ||||
|                         .then(resolveWith(domainObject.getOriginalObject())); | ||||
| @@ -189,7 +144,7 @@ define( | ||||
|             // UI, which will have been pushed atop the Browse UI.) | ||||
|             function returnToBrowse(object) { | ||||
|                 if (object) { | ||||
|                     self.navigationService.setNavigation(object); | ||||
|                     object.getCapability("action").perform("navigate"); | ||||
|                 } | ||||
|                 return object; | ||||
|             } | ||||
|   | ||||
| @@ -19,44 +19,42 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
| /*global define*/ | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * Module defining DomainColumn. Created by vwoeltje on 11/18/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|     ['./EditableLookupCapability'], | ||||
|     function (EditableLookupCapability) { | ||||
|         'use strict'; | ||||
| 
 | ||||
|         /** | ||||
|          * A column which will report telemetry range values | ||||
|          * (typically, measurements.) Used by the ScrollingListController. | ||||
|          * Wrapper for the "instantiation" capability; | ||||
|          * ensures that any domain objects instantiated in Edit mode | ||||
|          * are also wrapped as EditableDomainObjects. | ||||
|          * | ||||
|          * @memberof platform/features/events | ||||
|          * Meant specifically for use by EditableDomainObject and the | ||||
|          * associated cache; the constructor signature is particular | ||||
|          * to a pattern used there and may contain unused arguments. | ||||
|          * @constructor | ||||
|          * @implements {platform/features/events.EventsColumn} | ||||
|          * @param rangeMetadata an object with the machine- and human- | ||||
|          *        readable names for this range (in `key` and `name` | ||||
|          *        fields, respectively.) | ||||
|          * @param {TelemetryFormatter} telemetryFormatter the telemetry | ||||
|          *        formatting service, for making values human-readable. | ||||
|          * @memberof platform/commonUI/edit | ||||
|          * @implements {CompositionCapability} | ||||
|          */ | ||||
|         function RangeColumn(rangeMetadata, telemetryFormatter) { | ||||
|             this.rangeMetadata = rangeMetadata; | ||||
|             this.telemetryFormatter = telemetryFormatter; | ||||
|         } | ||||
| 
 | ||||
|         RangeColumn.prototype.getTitle = function () { | ||||
|             return this.rangeMetadata.name; | ||||
|         }; | ||||
|         RangeColumn.prototype.getValue = function (domainObject, data, index) { | ||||
|             var rangeKey = this.rangeMetadata.key; | ||||
|             return this.telemetryFormatter.formatRangeValue( | ||||
|                 data.getRangeValue(index, rangeKey) | ||||
|         return function EditableInstantiationCapability( | ||||
|             contextCapability, | ||||
|             editableObject, | ||||
|             domainObject, | ||||
|             cache | ||||
|         ) { | ||||
|             // This is a "lookup" style capability (it looks up other
 | ||||
|             // domain objects), but we do not want to return the same
 | ||||
|             // specific value every time (composition may change)
 | ||||
|             return new EditableLookupCapability( | ||||
|                 contextCapability, | ||||
|                 editableObject, | ||||
|                 domainObject, | ||||
|                 cache, | ||||
|                 false // Not idempotent
 | ||||
|             ); | ||||
|         }; | ||||
| 
 | ||||
|         return RangeColumn; | ||||
|     } | ||||
| ); | ||||
| @@ -45,7 +45,8 @@ define( | ||||
|             cache, | ||||
|             idempotent | ||||
|         ) { | ||||
|             var capability = Object.create(contextCapability); | ||||
|             var capability = Object.create(contextCapability), | ||||
|                 method; | ||||
|  | ||||
|             // Check for domain object interface. If something has these | ||||
|             // three methods, we assume it's a domain object. | ||||
| @@ -114,7 +115,9 @@ define( | ||||
|             } | ||||
|  | ||||
|             // Wrap all methods; return only editable domain objects. | ||||
|             Object.keys(contextCapability).forEach(wrapMethod); | ||||
|             for (method in contextCapability) { | ||||
|                 wrapMethod(method); | ||||
|             } | ||||
|  | ||||
|             return capability; | ||||
|         }; | ||||
|   | ||||
| @@ -81,7 +81,8 @@ define( | ||||
|             var domainObject = this.domainObject, | ||||
|                 editableObject = this.editableObject, | ||||
|                 self = this, | ||||
|                 cache = this.cache; | ||||
|                 cache = this.cache, | ||||
|                 returnPromise; | ||||
|  | ||||
|             // Update the underlying, "real" domain object's model | ||||
|             // with changes made to the copy used for editing. | ||||
| @@ -99,14 +100,18 @@ define( | ||||
|             editableObject.getCapability("status").set("editing", false); | ||||
|  | ||||
|             if (nonrecursive) { | ||||
|                 return resolvePromise(doMutate()) | ||||
|                 returnPromise = resolvePromise(doMutate()) | ||||
|                     .then(doPersist) | ||||
|                     .then(function(){ | ||||
|                         self.cancel(); | ||||
|                     }); | ||||
|             } else { | ||||
|                 return resolvePromise(cache.saveAll()); | ||||
|                 returnPromise = resolvePromise(cache.saveAll()); | ||||
|             } | ||||
|             //Return the original (non-editable) object | ||||
|             return returnPromise.then(function() { | ||||
|                 return domainObject.getOriginalObject ? domainObject.getOriginalObject() : domainObject; | ||||
|             }); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
| @@ -119,8 +124,7 @@ define( | ||||
|          */ | ||||
|         EditorCapability.prototype.cancel = function () { | ||||
|             this.editableObject.getCapability("status").set("editing", false); | ||||
|             //TODO: Reset the cache as well here. | ||||
|             this.cache.markClean(this.editableObject); | ||||
|             this.cache.markClean(); | ||||
|             return resolvePromise(undefined); | ||||
|         }; | ||||
|  | ||||
|   | ||||
| @@ -26,41 +26,45 @@ | ||||
|  * @namespace platform/commonUI/edit | ||||
|  */ | ||||
| define( | ||||
|     ["../objects/EditableDomainObject"], | ||||
|     function (EditableDomainObject) { | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
| 
 | ||||
|         /** | ||||
|          * Controller which is responsible for populating the scope for | ||||
|          * Edit mode; introduces an editable version of the currently | ||||
|          * navigated domain object into the scope. | ||||
|          * Edit mode | ||||
|          * @memberof platform/commonUI/edit | ||||
|          * @constructor | ||||
|          */ | ||||
|         function EditController($scope, $q, navigationService) { | ||||
|             var self = this; | ||||
|         function EditObjectController($scope, $location, policyService) { | ||||
|             this.scope = $scope; | ||||
|             this.policyService = policyService; | ||||
| 
 | ||||
|             function setNavigation(domainObject) { | ||||
|                 // Wrap the domain object such that all mutation is
 | ||||
|                 // confined to edit mode (until Save)
 | ||||
|                 self.navigatedDomainObject = | ||||
|                     domainObject && new EditableDomainObject(domainObject, $q); | ||||
|             var navigatedObject; | ||||
|             function setViewForDomainObject(domainObject) { | ||||
| 
 | ||||
|                 var locationViewKey = $location.search().view; | ||||
| 
 | ||||
|                 function selectViewIfMatching(view) { | ||||
|                     if (view.key === locationViewKey) { | ||||
|                         $scope.representation = $scope.representation || {}; | ||||
|                         $scope.representation.selected = view; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 if (locationViewKey) { | ||||
|                     ((domainObject && domainObject.useCapability('view')) || []) | ||||
|                         .forEach(selectViewIfMatching); | ||||
|                 } | ||||
|                 navigatedObject = domainObject; | ||||
|             } | ||||
| 
 | ||||
|             setNavigation(navigationService.getNavigation()); | ||||
|             navigationService.addListener(setNavigation); | ||||
|             $scope.$on("$destroy", function () { | ||||
|                 navigationService.removeListener(setNavigation); | ||||
|             }); | ||||
|         } | ||||
|             $scope.$watch('domainObject', setViewForDomainObject); | ||||
| 
 | ||||
|         /** | ||||
|          * Get the domain object which is navigated-to. | ||||
|          * @returns {DomainObject} the domain object that is navigated-to | ||||
|          */ | ||||
|         EditController.prototype.navigatedObject = function () { | ||||
|             return this.navigatedDomainObject; | ||||
|         }; | ||||
|             $scope.doAction = function (action){ | ||||
|                 return $scope[action] && $scope[action](); | ||||
|             }; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * Get the warning to show if the user attempts to navigate | ||||
| @@ -68,17 +72,18 @@ define( | ||||
|          * @returns {string} the warning to show, or undefined if | ||||
|          *          there are no unsaved changes | ||||
|          */ | ||||
|         EditController.prototype.getUnloadWarning = function () { | ||||
|             var navigatedObject = this.navigatedDomainObject, | ||||
|                 editorCapability = navigatedObject && | ||||
|                     navigatedObject.getCapability("editor"), | ||||
|                 hasChanges = editorCapability && editorCapability.dirty(); | ||||
|         EditObjectController.prototype.getUnloadWarning = function () { | ||||
|             var navigatedObject = this.scope.domainObject, | ||||
|                 policyMessage; | ||||
| 
 | ||||
|             this.policyService.allow("navigation", navigatedObject, undefined, function(message) { | ||||
|                policyMessage = message; | ||||
|             }); | ||||
| 
 | ||||
|             return policyMessage; | ||||
| 
 | ||||
|             return hasChanges ? | ||||
|                 "Unsaved changes will be lost if you leave this page." : | ||||
|                 undefined; | ||||
|         }; | ||||
| 
 | ||||
|         return EditController; | ||||
|         return EditObjectController; | ||||
|     } | ||||
| ); | ||||
| @@ -36,6 +36,7 @@ define( | ||||
|         '../capabilities/EditableContextCapability', | ||||
|         '../capabilities/EditableCompositionCapability', | ||||
|         '../capabilities/EditableRelationshipCapability', | ||||
|         '../capabilities/EditableInstantiationCapability', | ||||
|         '../capabilities/EditorCapability', | ||||
|         '../capabilities/EditableActionCapability', | ||||
|         './EditableDomainObjectCache' | ||||
| @@ -45,6 +46,7 @@ define( | ||||
|         EditableContextCapability, | ||||
|         EditableCompositionCapability, | ||||
|         EditableRelationshipCapability, | ||||
|         EditableInstantiationCapability, | ||||
|         EditorCapability, | ||||
|         EditableActionCapability, | ||||
|         EditableDomainObjectCache | ||||
| @@ -56,6 +58,7 @@ define( | ||||
|             context: EditableContextCapability, | ||||
|             composition: EditableCompositionCapability, | ||||
|             relationship: EditableRelationshipCapability, | ||||
|             instantiation: EditableInstantiationCapability, | ||||
|             editor: EditorCapability | ||||
|         }; | ||||
|  | ||||
|   | ||||
| @@ -126,7 +126,14 @@ define( | ||||
|          * @param {DomainObject} domainObject the domain object | ||||
|          */ | ||||
|         EditableDomainObjectCache.prototype.markClean = function (domainObject) { | ||||
|             delete this.dirtyObjects[domainObject.getId()]; | ||||
|             var self = this; | ||||
|             if (!domainObject) { | ||||
|                 Object.keys(this.dirtyObjects).forEach(function(key) { | ||||
|                     delete self.dirtyObjects[key]; | ||||
|                 }); | ||||
|             } else { | ||||
|                 delete this.dirtyObjects[domainObject.getId()]; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -19,45 +19,49 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,moment*/ | ||||
| /*global define*/ | ||||
| 
 | ||||
| /** | ||||
|  * Module defining DomainColumn. Created by vwoeltje on 11/18/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
| 
 | ||||
|         /** | ||||
|          * A column which will report telemetry domain values | ||||
|          * (typically, timestamps.) Used by the ScrollingListController. | ||||
|          * | ||||
|          * @memberof platform/features/events | ||||
|          * Policy controlling whether navigation events should proceed | ||||
|          * when object is being edited. | ||||
|          * @memberof platform/commonUI/edit | ||||
|          * @constructor | ||||
|          * @implements {platform/features/events.EventsColumn} | ||||
|          * @param domainMetadata an object with the machine- and human- | ||||
|          *        readable names for this domain (in `key` and `name` | ||||
|          *        fields, respectively.) | ||||
|          * @param {TelemetryFormatter} telemetryFormatter the telemetry | ||||
|          *        formatting service, for making values human-readable. | ||||
|          * @implements {Policy.<Action, ActionContext>} | ||||
|          */ | ||||
|         function DomainColumn(domainMetadata, telemetryFormatter) { | ||||
|             this.domainMetadata = domainMetadata; | ||||
|             this.telemetryFormatter = telemetryFormatter; | ||||
|         function EditNavigationPolicy(policyService) { | ||||
|             this.policyService = policyService; | ||||
|         } | ||||
| 
 | ||||
|         DomainColumn.prototype.getTitle = function () { | ||||
|             return this.domainMetadata.name; | ||||
|         /** | ||||
|          * @private | ||||
|          */ | ||||
|         EditNavigationPolicy.prototype.isDirty = function(domainObject) { | ||||
|             var navigatedObject = domainObject, | ||||
|                 editorCapability = navigatedObject && | ||||
|                     navigatedObject.getCapability("editor"), | ||||
|                 statusCapability = navigatedObject && | ||||
|                     navigatedObject.getCapability("status"); | ||||
| 
 | ||||
|             return statusCapability && statusCapability.get('editing') | ||||
|                 && editorCapability && editorCapability.dirty(); | ||||
|         }; | ||||
| 
 | ||||
|         DomainColumn.prototype.getValue = function (domainObject, data, index) { | ||||
|             var domainKey = this.domainMetadata.key; | ||||
|             return this.telemetryFormatter.formatDomainValue( | ||||
|                 data.getDomainValue(index, domainKey) | ||||
|             ); | ||||
|         /** | ||||
|          * Allow navigation if an object is not dirty, or if the user elects | ||||
|          * to proceed anyway. | ||||
|          * @param currentNavigation | ||||
|          * @returns {boolean|*} true if the object model is clean; or if | ||||
|          * it's dirty and the user wishes to proceed anyway. | ||||
|          */ | ||||
|         EditNavigationPolicy.prototype.allow = function (currentNavigation) { | ||||
|             return !this.isDirty(currentNavigation); | ||||
|         }; | ||||
| 
 | ||||
|         return DomainColumn; | ||||
|         return EditNavigationPolicy; | ||||
|     } | ||||
| ); | ||||
| @@ -49,6 +49,7 @@ define( | ||||
|             var self = this; | ||||
|  | ||||
|             this.scope = scope; | ||||
|             this.listenHandle = undefined; | ||||
|  | ||||
|             // Mutate and persist a new version of a domain object's model. | ||||
|             function doPersist(model) { | ||||
| @@ -100,22 +101,53 @@ define( | ||||
|             // Place the "commit" method in the scope | ||||
|             scope.commit = commit; | ||||
|             scope.setEditable = setEditable; | ||||
|  | ||||
|             // Clean up when the scope is destroyed | ||||
|             scope.$on("$destroy", function () { | ||||
|                 self.destroy(); | ||||
|             }); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // Handle a specific representation of a specific domain object | ||||
|         EditRepresenter.prototype.represent = function represent(representation, representedObject) { | ||||
|             var scope = this.scope, | ||||
|                 self = this; | ||||
|             // Track the key, to know which view configuration to save to. | ||||
|             this.key = (representation || {}).key; | ||||
|             // Track the represented object | ||||
|             this.domainObject = representedObject; | ||||
|  | ||||
|             this.scope.isEditable = representedObject.getCapability('status').get('editing'); | ||||
|  | ||||
|             // Ensure existing watches are released | ||||
|             this.destroy(); | ||||
|  | ||||
|             function setEditing(){ | ||||
|                 scope.viewObjectTemplate = 'edit-object'; | ||||
|             } | ||||
|  | ||||
|             /** | ||||
|              * Listen for changes in object state. If the object becomes | ||||
|              * editable then change the view and inspector regions | ||||
|              * object representation accordingly | ||||
|              */ | ||||
|             this.listenHandle = this.domainObject.getCapability('status').listen(function(statuses){ | ||||
|                 if (statuses.indexOf('editing')!=-1){ | ||||
|                     setEditing(); | ||||
|                 } else { | ||||
|                     delete scope.viewObjectTemplate; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             if (representedObject.getCapability('status').get('editing')){ | ||||
|                 setEditing(); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         // Respond to the destruction of the current representation. | ||||
|         EditRepresenter.prototype.destroy = function destroy() { | ||||
|             // Nothing to clean up | ||||
|             return this.listenHandle && this.listenHandle(); | ||||
|         }; | ||||
|  | ||||
|         return EditRepresenter; | ||||
|   | ||||
| @@ -118,6 +118,29 @@ define( | ||||
|                 expect(mockContext.getDomainObject.calls.length).toEqual(2); | ||||
|             }); | ||||
|  | ||||
|             it("wraps inherited methods", function () { | ||||
|                 var CapabilityClass = function(){ | ||||
|                 }; | ||||
|                 CapabilityClass.prototype.inheritedMethod=function () { | ||||
|                     return "an inherited method"; | ||||
|                 }; | ||||
|  | ||||
|                 mockContext = new CapabilityClass(); | ||||
|  | ||||
|                 capability = new EditableLookupCapability( | ||||
|                     mockContext, | ||||
|                     mockEditableObject, | ||||
|                     mockDomainObject, | ||||
|                     factory, | ||||
|                     false | ||||
|                 ); | ||||
|                 expect(capability.inheritedMethod()).toEqual("an inherited method"); | ||||
|                 expect(capability.hasOwnProperty('inheritedMethod')).toBe(true); | ||||
|                 // The presence of an own property indicates that the method | ||||
|                 // has been wrapped on the object itself and this is a valid | ||||
|                 // test that the inherited method has been wrapped. | ||||
|             }); | ||||
|  | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
| @@ -22,102 +22,110 @@ | ||||
| /*global define,describe,it,expect,beforeEach,jasmine*/ | ||||
|  | ||||
| define( | ||||
|     ["../../src/controllers/EditController"], | ||||
|     function (EditController) { | ||||
|     ["../../src/controllers/EditObjectController"], | ||||
|     function (EditObjectController) { | ||||
|         "use strict"; | ||||
|  | ||||
|         describe("The Edit mode controller", function () { | ||||
|             var mockScope, | ||||
|                 mockQ, | ||||
|                 mockNavigationService, | ||||
|                 mockObject, | ||||
|                 mockType, | ||||
|                 mockLocation, | ||||
|                 mockStatusCapability, | ||||
|                 mockCapabilities, | ||||
|                 mockPolicyService, | ||||
|                 controller; | ||||
|  | ||||
|             // Utility function; look for a $watch on scope and fire it | ||||
|             function fireWatch(expr, value) { | ||||
|                 mockScope.$watch.calls.forEach(function (call) { | ||||
|                     if (call.args[0] === expr) { | ||||
|                         call.args[1](value); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockPolicyService = jasmine.createSpyObj( | ||||
|                     "policyService", | ||||
|                     [ | ||||
|                         "allow" | ||||
|                     ] | ||||
|                 ); | ||||
|                 mockScope = jasmine.createSpyObj( | ||||
|                     "$scope", | ||||
|                     [ "$on" ] | ||||
|                 ); | ||||
|                 mockQ = jasmine.createSpyObj('$q', ['when', 'all']); | ||||
|                 mockNavigationService = jasmine.createSpyObj( | ||||
|                     "navigationService", | ||||
|                     [ "getNavigation", "addListener", "removeListener" ] | ||||
|                     [ "$on", "$watch" ] | ||||
|                 ); | ||||
|                 mockObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     [ "getId", "getModel", "getCapability", "hasCapability" ] | ||||
|                     [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ] | ||||
|                 ); | ||||
|                 mockType = jasmine.createSpyObj( | ||||
|                     "type", | ||||
|                     [ "hasFeature" ] | ||||
|                 ); | ||||
|                 mockStatusCapability = jasmine.createSpyObj('statusCapability', | ||||
|                     ["get"] | ||||
|                 ); | ||||
|  | ||||
|                 mockCapabilities = { | ||||
|                     "type" : mockType, | ||||
|                     "status": mockStatusCapability | ||||
|                 }; | ||||
|  | ||||
|                 mockLocation = jasmine.createSpyObj('$location', | ||||
|                     ["search"] | ||||
|                 ); | ||||
|                 mockLocation.search.andReturn({"view": "fixed"}); | ||||
|  | ||||
|                 mockNavigationService.getNavigation.andReturn(mockObject); | ||||
|                 mockObject.getId.andReturn("test"); | ||||
|                 mockObject.getModel.andReturn({ name: "Test object" }); | ||||
|                 mockObject.getCapability.andCallFake(function (key) { | ||||
|                     return key === 'type' && mockType; | ||||
|                     return mockCapabilities[key]; | ||||
|                 }); | ||||
|                 mockType.hasFeature.andReturn(true); | ||||
|  | ||||
|                 controller = new EditController( | ||||
|                 mockScope.domainObject = mockObject; | ||||
|  | ||||
|                 controller = new EditObjectController( | ||||
|                     mockScope, | ||||
|                     mockQ, | ||||
|                     mockNavigationService | ||||
|                     mockLocation, | ||||
|                     mockPolicyService | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|             it("exposes the currently-navigated object", function () { | ||||
|                 expect(controller.navigatedObject()).toBeDefined(); | ||||
|                 expect(controller.navigatedObject().getId()).toEqual("test"); | ||||
|             }); | ||||
|  | ||||
|             it("adds an editor capability to the navigated object", function () { | ||||
|                 // Should provide an editor capability... | ||||
|                 expect(controller.navigatedObject().getCapability("editor")) | ||||
|                     .toBeDefined(); | ||||
|                 // Shouldn't have been the mock capability we provided | ||||
|                 expect(controller.navigatedObject().getCapability("editor")) | ||||
|                     .not.toEqual(mockType); | ||||
|             }); | ||||
|  | ||||
|             it("detaches its navigation listener when destroyed", function () { | ||||
|                 var navCallback = mockNavigationService | ||||
|                         .addListener.mostRecentCall.args[0]; | ||||
|  | ||||
|                 expect(mockScope.$on).toHaveBeenCalledWith( | ||||
|                     "$destroy", | ||||
|                     jasmine.any(Function) | ||||
|                 ); | ||||
|  | ||||
|                 // Verify precondition | ||||
|                 expect(mockNavigationService.removeListener) | ||||
|                     .not.toHaveBeenCalled(); | ||||
|  | ||||
|                 // Trigger destroy | ||||
|                 mockScope.$on.mostRecentCall.args[1](); | ||||
|  | ||||
|                 // Listener should have been removed | ||||
|                 expect(mockNavigationService.removeListener) | ||||
|                     .toHaveBeenCalledWith(navCallback); | ||||
|             }); | ||||
|  | ||||
|             it("exposes a warning message for unload", function () { | ||||
|                 var obj = controller.navigatedObject(), | ||||
|                     mockEditor = jasmine.createSpyObj('editor', ['dirty']); | ||||
|                 var obj = mockObject, | ||||
|                     errorMessage = "Unsaved changes"; | ||||
|  | ||||
|                 // Normally, should be undefined | ||||
|                 expect(controller.getUnloadWarning()).toBeUndefined(); | ||||
|  | ||||
|                 // Override the object's editor capability, make it look | ||||
|                 // like there are unsaved changes. | ||||
|                 obj.getCapability = jasmine.createSpy(); | ||||
|                 obj.getCapability.andReturn(mockEditor); | ||||
|                 mockEditor.dirty.andReturn(true); | ||||
|                 // Override the policy service to prevent navigation | ||||
|                 mockPolicyService.allow.andCallFake(function(category, object, context, callback){ | ||||
|                    callback(errorMessage); | ||||
|                 }); | ||||
|  | ||||
|                 // Should have some warning message here now | ||||
|                 expect(controller.getUnloadWarning()).toEqual(jasmine.any(String)); | ||||
|                 expect(controller.getUnloadWarning()).toEqual(errorMessage); | ||||
|             }); | ||||
|  | ||||
|  | ||||
|             it("sets the active view from query parameters", function () { | ||||
|                 var testViews = [ | ||||
|                         { key: 'abc' }, | ||||
|                         { key: 'def', someKey: 'some value' }, | ||||
|                         { key: 'xyz' } | ||||
|                     ]; | ||||
|  | ||||
|                 mockObject.useCapability.andCallFake(function (c) { | ||||
|                     return (c === 'view') && testViews; | ||||
|                 }); | ||||
|                 mockLocation.search.andReturn({ view: 'def' }); | ||||
|  | ||||
|                 fireWatch('domainObject', mockObject); | ||||
|                 expect(mockScope.representation.selected) | ||||
|                     .toEqual(testViews[1]); | ||||
|             }); | ||||
|  | ||||
|         }); | ||||
|   | ||||
| @@ -33,6 +33,8 @@ define( | ||||
|                 testRepresentation, | ||||
|                 mockDomainObject, | ||||
|                 mockPersistence, | ||||
|                 mockStatusCapability, | ||||
|                 mockCapabilities, | ||||
|                 representer; | ||||
|  | ||||
|             function mockPromise(value) { | ||||
| @@ -46,7 +48,7 @@ define( | ||||
|             beforeEach(function () { | ||||
|                 mockQ = { when: mockPromise }; | ||||
|                 mockLog = jasmine.createSpyObj("$log", ["info", "debug"]); | ||||
|                 mockScope = jasmine.createSpyObj("$scope", ["$watch"]); | ||||
|                 mockScope = jasmine.createSpyObj("$scope", ["$watch", "$on"]); | ||||
|                 testRepresentation = { key: "test" }; | ||||
|                 mockDomainObject = jasmine.createSpyObj("domainObject", [ | ||||
|                     "getId", | ||||
| @@ -57,11 +59,20 @@ define( | ||||
|                 ]); | ||||
|                 mockPersistence = | ||||
|                     jasmine.createSpyObj("persistence", ["persist"]); | ||||
|                 mockStatusCapability = | ||||
|                     jasmine.createSpyObj("statusCapability", ["get", "listen"]); | ||||
|                 mockStatusCapability.get.andReturn(false); | ||||
|                 mockCapabilities = { | ||||
|                     'persistence': mockPersistence, | ||||
|                     'status': mockStatusCapability | ||||
|                 }; | ||||
|  | ||||
|                 mockDomainObject.getModel.andReturn({}); | ||||
|                 mockDomainObject.hasCapability.andReturn(true); | ||||
|                 mockDomainObject.useCapability.andReturn(true); | ||||
|                 mockDomainObject.getCapability.andReturn(mockPersistence); | ||||
|                 mockDomainObject.getCapability.andCallFake(function(capability){ | ||||
|                     return mockCapabilities[capability]; | ||||
|                 }); | ||||
|  | ||||
|                 representer = new EditRepresenter(mockQ, mockLog, mockScope); | ||||
|                 representer.represent(testRepresentation, mockDomainObject); | ||||
| @@ -71,6 +82,17 @@ define( | ||||
|                 expect(mockScope.commit).toEqual(jasmine.any(Function)); | ||||
|             }); | ||||
|  | ||||
|             it("Sets edit view template on edit mode", function () { | ||||
|                 mockStatusCapability.listen.mostRecentCall.args[0](['editing']); | ||||
|                 expect(mockScope.viewObjectTemplate).toEqual('edit-object'); | ||||
|             }); | ||||
|  | ||||
|             it("Cleans up listeners on scope destroy", function () { | ||||
|                 representer.listenHandle = jasmine.createSpy('listen'); | ||||
|                 mockScope.$on.mostRecentCall.args[1](); | ||||
|                 expect(representer.listenHandle).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("mutates and persists upon observed changes", function () { | ||||
|                 mockScope.model = { someKey: "some value" }; | ||||
|                 mockScope.configuration = { someConfiguration: "something" }; | ||||
| @@ -101,4 +123,4 @@ define( | ||||
|  | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
| ); | ||||
|   | ||||
| @@ -1,28 +0,0 @@ | ||||
| [ | ||||
|     "actions/CancelAction", | ||||
|     "actions/EditAction", | ||||
|     "actions/LinkAction", | ||||
|     "actions/PropertiesAction", | ||||
|     "actions/PropertiesDialog", | ||||
|     "actions/RemoveAction", | ||||
|     "actions/SaveAction", | ||||
|     "capabilities/EditableCompositionCapability", | ||||
|     "capabilities/EditableContextCapability", | ||||
|     "capabilities/EditableLookupCapability", | ||||
|     "capabilities/EditablePersistenceCapability", | ||||
|     "capabilities/EditableRelationshipCapability", | ||||
|     "capabilities/EditorCapability", | ||||
|     "controllers/EditActionController", | ||||
|     "controllers/EditController", | ||||
|     "controllers/EditPanesController", | ||||
|     "directives/MCTBeforeUnload", | ||||
|     "objects/EditableDomainObject", | ||||
|     "objects/EditableDomainObjectCache", | ||||
|     "objects/EditableModelCache", | ||||
|     "policies/EditableViewPolicy", | ||||
|     "policies/EditActionPolicy", | ||||
|     "representers/EditRepresenter", | ||||
|     "representers/EditToolbar", | ||||
|     "representers/EditToolbarRepresenter", | ||||
|     "representers/EditToolbarSelection" | ||||
| ] | ||||
| @@ -1,4 +0,0 @@ | ||||
| [ | ||||
|     "FormatProvider", | ||||
|     "UTCTimeFormat" | ||||
| ] | ||||
| @@ -24,6 +24,7 @@ | ||||
| define([ | ||||
|     "./src/services/UrlService", | ||||
|     "./src/services/PopupService", | ||||
|     "./src/SplashScreenManager", | ||||
|     "./src/StyleSheetLoader", | ||||
|     "./src/UnsupportedBrowserWarning", | ||||
|     "./src/controllers/TimeRangeController", | ||||
| @@ -48,10 +49,31 @@ define([ | ||||
|     "./src/directives/MCTScroll", | ||||
|     "./src/directives/MCTSplitPane", | ||||
|     "./src/directives/MCTSplitter", | ||||
|     "./src/directives/MCTTree", | ||||
|     "text!./res/templates/bottombar.html", | ||||
|     "text!./res/templates/controls/action-button.html", | ||||
|     "text!./res/templates/controls/input-filter.html", | ||||
|     "text!./res/templates/indicator.html", | ||||
|     "text!./res/templates/message-banner.html", | ||||
|     "text!./res/templates/progress-bar.html", | ||||
|     "text!./res/templates/controls/time-controller.html", | ||||
|     "text!./res/templates/containers/accordion.html", | ||||
|     "text!./res/templates/subtree.html", | ||||
|     "text!./res/templates/tree.html", | ||||
|     "text!./res/templates/tree-node.html", | ||||
|     "text!./res/templates/label.html", | ||||
|     "text!./res/templates/controls/action-group.html", | ||||
|     "text!./res/templates/menu/context-menu.html", | ||||
|     "text!./res/templates/controls/switcher.html", | ||||
|     "text!./res/templates/object-inspector.html", | ||||
|     "text!./res/templates/controls/selector.html", | ||||
|     "text!./res/templates/controls/datetime-picker.html", | ||||
|     "text!./res/templates/controls/datetime-field.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     UrlService, | ||||
|     PopupService, | ||||
|     SplashScreenManager, | ||||
|     StyleSheetLoader, | ||||
|     UnsupportedBrowserWarning, | ||||
|     TimeRangeController, | ||||
| @@ -76,6 +98,26 @@ define([ | ||||
|     MCTScroll, | ||||
|     MCTSplitPane, | ||||
|     MCTSplitter, | ||||
|     MCTTree, | ||||
|     bottombarTemplate, | ||||
|     actionButtonTemplate, | ||||
|     inputFilterTemplate, | ||||
|     indicatorTemplate, | ||||
|     messageBannerTemplate, | ||||
|     progressBarTemplate, | ||||
|     timeControllerTemplate, | ||||
|     accordionTemplate, | ||||
|     subtreeTemplate, | ||||
|     treeTemplate, | ||||
|     treeNodeTemplate, | ||||
|     labelTemplate, | ||||
|     actionGroupTemplate, | ||||
|     contextMenuTemplate, | ||||
|     switcherTemplate, | ||||
|     objectInspectorTemplate, | ||||
|     selectorTemplate, | ||||
|     datetimePickerTemplate, | ||||
|     datetimeFieldTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
| @@ -117,42 +159,58 @@ define([ | ||||
|                         "notificationService", | ||||
|                         "agentService" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": SplashScreenManager, | ||||
|                     "depends": [ | ||||
|                         "$document" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "filters": [ | ||||
|                 { | ||||
|                     "implementation": "filters/ReverseFilter.js", | ||||
|                     "key": "reverse" | ||||
|                 } | ||||
|             ], | ||||
|             "stylesheets": [ | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/normalize.min.css", | ||||
|                     "priority": "mandatory" | ||||
|                 }, | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/reset.css", | ||||
|                     "priority": "mandatory" | ||||
|                 } | ||||
|             ], | ||||
|             "templates": [ | ||||
|                 { | ||||
|                     "key": "bottombar", | ||||
|                     "templateUrl": "templates/bottombar.html" | ||||
|                     "template": bottombarTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "action-button", | ||||
|                     "templateUrl": "templates/controls/action-button.html" | ||||
|                     "template": actionButtonTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "input-filter", | ||||
|                     "templateUrl": "templates/controls/input-filter.html" | ||||
|                     "template": inputFilterTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "indicator", | ||||
|                     "templateUrl": "templates/indicator.html" | ||||
|                     "template": indicatorTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "message-banner", | ||||
|                     "templateUrl": "templates/message-banner.html" | ||||
|                     "template": messageBannerTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "progress-bar", | ||||
|                     "templateUrl": "templates/progress-bar.html" | ||||
|                     "template": progressBarTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "time-controller", | ||||
|                     "templateUrl": "templates/controls/time-controller.html" | ||||
|                     "template": timeControllerTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "controllers": [ | ||||
| @@ -333,6 +391,11 @@ define([ | ||||
|                 { | ||||
|                     "key": "mctSplitter", | ||||
|                     "implementation": MCTSplitter | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "mctTree", | ||||
|                     "implementation": MCTTree, | ||||
|                     "depends": [ '$parse', 'gestureService' ] | ||||
|                 } | ||||
|             ], | ||||
|             "constants": [ | ||||
| @@ -361,7 +424,7 @@ define([ | ||||
|             "containers": [ | ||||
|                 { | ||||
|                     "key": "accordion", | ||||
|                     "templateUrl": "templates/containers/accordion.html", | ||||
|                     "template": accordionTemplate, | ||||
|                     "attributes": [ | ||||
|                         "label" | ||||
|                     ] | ||||
| @@ -370,7 +433,7 @@ define([ | ||||
|             "representations": [ | ||||
|                 { | ||||
|                     "key": "tree", | ||||
|                     "templateUrl": "templates/subtree.html", | ||||
|                     "template": subtreeTemplate, | ||||
|                     "uses": [ | ||||
|                         "composition" | ||||
|                     ], | ||||
| @@ -379,25 +442,25 @@ define([ | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "tree", | ||||
|                     "templateUrl": "templates/tree.html" | ||||
|                     "template": treeTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "subtree", | ||||
|                     "templateUrl": "templates/subtree.html", | ||||
|                     "template": subtreeTemplate, | ||||
|                     "uses": [ | ||||
|                         "composition" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "tree-node", | ||||
|                     "templateUrl": "templates/tree-node.html", | ||||
|                     "template": treeNodeTemplate, | ||||
|                     "uses": [ | ||||
|                         "action" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "label", | ||||
|                     "templateUrl": "templates/label.html", | ||||
|                     "template": labelTemplate, | ||||
|                     "uses": [ | ||||
|                         "type", | ||||
|                         "location" | ||||
| @@ -410,7 +473,7 @@ define([ | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "node", | ||||
|                     "templateUrl": "templates/label.html", | ||||
|                     "template": labelTemplate, | ||||
|                     "uses": [ | ||||
|                         "type" | ||||
|                     ], | ||||
| @@ -421,42 +484,42 @@ define([ | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "action-group", | ||||
|                     "templateUrl": "templates/controls/action-group.html", | ||||
|                     "template": actionGroupTemplate, | ||||
|                     "uses": [ | ||||
|                         "action" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "context-menu", | ||||
|                     "templateUrl": "templates/menu/context-menu.html", | ||||
|                     "template": contextMenuTemplate, | ||||
|                     "uses": [ | ||||
|                         "action" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "switcher", | ||||
|                     "templateUrl": "templates/controls/switcher.html", | ||||
|                     "template": switcherTemplate, | ||||
|                     "uses": [ | ||||
|                         "view" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "object-inspector", | ||||
|                     "templateUrl": "templates/object-inspector.html" | ||||
|                     "template": objectInspectorTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "controls": [ | ||||
|                 { | ||||
|                     "key": "selector", | ||||
|                     "templateUrl": "templates/controls/selector.html" | ||||
|                     "template": selectorTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "datetime-picker", | ||||
|                     "templateUrl": "templates/controls/datetime-picker.html" | ||||
|                     "template": datetimePickerTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "datetime-field", | ||||
|                     "templateUrl": "templates/controls/datetime-field.html" | ||||
|                     "template": datetimeFieldTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "licenses": [ | ||||
| @@ -479,6 +542,16 @@ define([ | ||||
|                     "copyright": "Copyright (c) Nicolas Gallagher and Jonathan Neal", | ||||
|                     "license": "license-mit", | ||||
|                     "link": "https://github.com/necolas/normalize.css/blob/v1.1.2/LICENSE.md" | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "Zepto", | ||||
|                     "version": "1.1.6", | ||||
|                     "description": "DOM manipulation", | ||||
|                     "author": "Thomas Fuchs", | ||||
|                     "website": "http://zeptojs.com/", | ||||
|                     "copyright": "Copyright (c) 2010-2016 Thomas Fuchs", | ||||
|                     "license": "license-mit", | ||||
|                     "link": "https://github.com/madrobby/zepto/blob/master/MIT-LICENSE" | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|   | ||||
| @@ -1,26 +0,0 @@ | ||||
| # Require any additional compass plugins here. | ||||
| # require "compass-growl" | ||||
|  | ||||
| # Set this to the root of your project when deployed: | ||||
| http_path = "/" | ||||
| css_dir = "css" | ||||
| sass_dir = "sass" | ||||
| images_dir = "images" | ||||
| javascripts_dir = "js" | ||||
|  | ||||
| # You can select your preferred output style here (can be overridden via the command line): | ||||
| # :expanded, :compressed, :nested | ||||
| output_style = :nested | ||||
|  | ||||
| # To enable relative paths to assets via compass helper functions. Uncomment: | ||||
| relative_assets = true | ||||
|  | ||||
| # To disable debugging comments that display the original location of your selectors. Uncomment: | ||||
| # line_comments = false | ||||
|  | ||||
|  | ||||
| # If you prefer the indented syntax, you might want to regenerate this | ||||
| # project again passing --syntax sass, or you can uncomment this: | ||||
| # preferred_syntax = :sass | ||||
| # and then run: | ||||
| # sass-convert -R --from scss --to sass vfn_platform/static/sass scss && rm -rf sass && mv scss sass | ||||
							
								
								
									
										48
									
								
								platform/commonUI/general/res/css/reset.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,48 @@ | ||||
| /* http://meyerweb.com/eric/tools/css/reset/ | ||||
|    v2.0 | 20110126 | ||||
|    License: none (public domain) | ||||
| */ | ||||
|  | ||||
| html, body, div, span, applet, object, iframe, | ||||
| h1, h2, h3, h4, h5, h6, p, blockquote, pre, | ||||
| a, abbr, acronym, address, big, cite, code, | ||||
| del, dfn, em, img, ins, kbd, q, s, samp, | ||||
| small, strike, strong, sub, sup, tt, var, | ||||
| b, u, i, center, | ||||
| dl, dt, dd, ol, ul, li, | ||||
| fieldset, form, label, legend, | ||||
| table, caption, tbody, tfoot, thead, tr, th, td, | ||||
| article, aside, canvas, details, embed, | ||||
| figure, figcaption, footer, header, hgroup, | ||||
| menu, nav, output, ruby, section, summary, | ||||
| time, mark, audio, video { | ||||
| 	margin: 0; | ||||
| 	padding: 0; | ||||
| 	border: 0; | ||||
| 	font-size: 100%; | ||||
| 	font: inherit; | ||||
| 	vertical-align: baseline; | ||||
| } | ||||
| /* HTML5 display-role reset for older browsers */ | ||||
| article, aside, details, figcaption, figure, | ||||
| footer, header, hgroup, menu, nav, section { | ||||
| 	display: block; | ||||
| } | ||||
| body { | ||||
| 	line-height: 1; | ||||
| } | ||||
| ol, ul { | ||||
| 	list-style: none; | ||||
| } | ||||
| blockquote, q { | ||||
| 	quotes: none; | ||||
| } | ||||
| blockquote:before, blockquote:after, | ||||
| q:before, q:after { | ||||
| 	content: ''; | ||||
| 	content: none; | ||||
| } | ||||
| table { | ||||
| 	border-collapse: collapse; | ||||
| 	border-spacing: 0; | ||||
| } | ||||
| @@ -1,19 +1,43 @@ | ||||
| { | ||||
| 	"metadata": { | ||||
| 		"name": "WTD Symbols", | ||||
| 		"lastOpened": 1446670352108, | ||||
| 		"created": 1446670349721 | ||||
| 		"lastOpened": 1455833272792, | ||||
| 		"created": 1455833268424 | ||||
| 	}, | ||||
| 	"iconSets": [ | ||||
| 		{ | ||||
| 			"selection": [ | ||||
| 				{ | ||||
| 					"order": 119, | ||||
| 					"id": 96, | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58905, | ||||
| 					"name": "icon-bullet", | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 120, | ||||
| 					"id": 95, | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58904, | ||||
| 					"name": "icon-session", | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 118, | ||||
| 					"id": 94, | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58903, | ||||
| 					"name": "icon-topic", | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 116, | ||||
| 					"id": 93, | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58902, | ||||
| 					"name": "icon-eye-open-no-gleam", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 115, | ||||
| @@ -21,7 +45,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58901, | ||||
| 					"name": "icon-eye-open", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 110, | ||||
| @@ -29,7 +53,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58899, | ||||
| 					"name": "icon-collapse-pane-left", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 111, | ||||
| @@ -37,7 +61,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58900, | ||||
| 					"name": "icon-collapse-pane-right", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 109, | ||||
| @@ -45,7 +69,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58898, | ||||
| 					"name": "icon-save", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 108, | ||||
| @@ -53,7 +77,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58897, | ||||
| 					"name": "icon-dataset", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 90, | ||||
| @@ -61,7 +85,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58896, | ||||
| 					"name": "icon-bell", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 91, | ||||
| @@ -69,7 +93,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58889, | ||||
| 					"name": "icon-hourglass", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 92, | ||||
| @@ -82,7 +106,7 @@ | ||||
| 						58890 | ||||
| 					], | ||||
| 					"name": "icon-info-v15", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 93, | ||||
| @@ -90,7 +114,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58887, | ||||
| 					"name": "icon-x-in-circle", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 94, | ||||
| @@ -98,7 +122,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58881, | ||||
| 					"name": "icon-datatable", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 95, | ||||
| @@ -106,7 +130,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58882, | ||||
| 					"name": "icon-tabular-scrolling", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 96, | ||||
| @@ -114,7 +138,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58884, | ||||
| 					"name": "icon-tabular", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 97, | ||||
| @@ -122,7 +146,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58885, | ||||
| 					"name": "icon-calendar", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 98, | ||||
| @@ -130,7 +154,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58886, | ||||
| 					"name": "icon-paint-bucket", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 99, | ||||
| @@ -138,7 +162,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 123, | ||||
| 					"name": "icon-pointer-left", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 100, | ||||
| @@ -146,7 +170,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 125, | ||||
| 					"name": "icon-pointer-right", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 101, | ||||
| @@ -154,7 +178,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 80, | ||||
| 					"name": "icon-person", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 102, | ||||
| @@ -162,7 +186,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 232, | ||||
| 					"name": "icon-chain-links", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 103, | ||||
| @@ -170,7 +194,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 115, | ||||
| 					"name": "icon-database-in-brackets", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 104, | ||||
| @@ -178,7 +202,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 114, | ||||
| 					"name": "icon-refresh", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 105, | ||||
| @@ -186,7 +210,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 108, | ||||
| 					"name": "icon-lock", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 106, | ||||
| @@ -194,7 +218,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 51, | ||||
| 					"name": "icon-box-with-dashed-lines", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 10, | ||||
| @@ -202,7 +226,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58880, | ||||
| 					"name": "icon-box-with-arrow-cursor", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 11, | ||||
| @@ -210,7 +234,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 65, | ||||
| 					"name": "icon-activity-mode", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 12, | ||||
| @@ -218,7 +242,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 97, | ||||
| 					"name": "icon-activity", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 87, | ||||
| @@ -226,7 +250,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 33, | ||||
| 					"name": "icon-alert-rect", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 14, | ||||
| @@ -234,7 +258,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58883, | ||||
| 					"name": "icon-alert-triangle", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 15, | ||||
| @@ -242,7 +266,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 238, | ||||
| 					"name": "icon-arrow-double-down", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 16, | ||||
| @@ -250,7 +274,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 235, | ||||
| 					"name": "icon-arrow-double-up", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 2, | ||||
| @@ -258,7 +282,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 118, | ||||
| 					"name": "icon-arrow-down", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 19, | ||||
| @@ -266,7 +290,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 60, | ||||
| 					"name": "icon-arrow-left", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 20, | ||||
| @@ -274,7 +298,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 62, | ||||
| 					"name": "icon-arrow-right", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 21, | ||||
| @@ -282,7 +306,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 236, | ||||
| 					"name": "icon-arrow-tall-down", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 22, | ||||
| @@ -290,7 +314,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 237, | ||||
| 					"name": "icon-arrow-tall-up", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 23, | ||||
| @@ -298,7 +322,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 94, | ||||
| 					"name": "icon-arrow-up", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 24, | ||||
| @@ -306,7 +330,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 73, | ||||
| 					"name": "icon-arrows-out", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 25, | ||||
| @@ -314,7 +338,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58893, | ||||
| 					"name": "icon-arrows-right-left", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 33, | ||||
| @@ -322,7 +346,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 53, | ||||
| 					"name": "icon-arrows-up-down", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 26, | ||||
| @@ -330,7 +354,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 42, | ||||
| 					"name": "icon-asterisk", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 27, | ||||
| @@ -338,7 +362,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 72, | ||||
| 					"name": "icon-autoflow-tabular", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 28, | ||||
| @@ -346,7 +370,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 224, | ||||
| 					"name": "icon-box", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 29, | ||||
| @@ -354,7 +378,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 50, | ||||
| 					"name": "icon-check", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 30, | ||||
| @@ -362,7 +386,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 67, | ||||
| 					"name": "icon-clock", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 31, | ||||
| @@ -370,7 +394,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 46, | ||||
| 					"name": "icon-connectivity", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 32, | ||||
| @@ -378,7 +402,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 100, | ||||
| 					"name": "icon-database-query", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 17, | ||||
| @@ -386,7 +410,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 68, | ||||
| 					"name": "icon-database", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 35, | ||||
| @@ -394,7 +418,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 81, | ||||
| 					"name": "icon-dictionary", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 36, | ||||
| @@ -402,7 +426,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 242, | ||||
| 					"name": "icon-duplicate", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 37, | ||||
| @@ -410,7 +434,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 102, | ||||
| 					"name": "icon-folder-new", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 38, | ||||
| @@ -418,7 +442,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 70, | ||||
| 					"name": "icon-folder", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 39, | ||||
| @@ -426,7 +450,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 95, | ||||
| 					"name": "icon-fullscreen-collapse", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 40, | ||||
| @@ -434,7 +458,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 122, | ||||
| 					"name": "icon-fullscreen-expand", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 41, | ||||
| @@ -442,7 +466,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 71, | ||||
| 					"name": "icon-gear", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 49, | ||||
| @@ -450,7 +474,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 227, | ||||
| 					"name": "icon-image", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 42, | ||||
| @@ -458,7 +482,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 225, | ||||
| 					"name": "icon-layers", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 43, | ||||
| @@ -466,7 +490,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 76, | ||||
| 					"name": "icon-layout", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 44, | ||||
| @@ -474,7 +498,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 226, | ||||
| 					"name": "icon-line-horz", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 75, | ||||
| @@ -482,7 +506,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 244, | ||||
| 					"name": "icon-link", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 46, | ||||
| @@ -490,7 +514,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 88, | ||||
| 					"name": "icon-magnify-in", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 47, | ||||
| @@ -498,7 +522,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 89, | ||||
| 					"name": "icon-magnify-out", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 48, | ||||
| @@ -506,7 +530,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 77, | ||||
| 					"name": "icon-magnify", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 34, | ||||
| @@ -514,7 +538,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 109, | ||||
| 					"name": "icon-menu", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 50, | ||||
| @@ -522,7 +546,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 243, | ||||
| 					"name": "icon-move", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 51, | ||||
| @@ -530,7 +554,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 121, | ||||
| 					"name": "icon-new-window", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 52, | ||||
| @@ -538,7 +562,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 111, | ||||
| 					"name": "icon-object", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 73, | ||||
| @@ -546,7 +570,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 63, | ||||
| 					"name": "icon-object-unknown", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 53, | ||||
| @@ -554,7 +578,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 86, | ||||
| 					"name": "icon-packet", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 54, | ||||
| @@ -562,7 +586,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 234, | ||||
| 					"name": "icon-page", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 55, | ||||
| @@ -570,7 +594,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 241, | ||||
| 					"name": "icon-pause", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 56, | ||||
| @@ -578,7 +602,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 112, | ||||
| 					"name": "icon-pencil", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 65, | ||||
| @@ -586,7 +610,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 79, | ||||
| 					"name": "icon-people", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 57, | ||||
| @@ -594,7 +618,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 239, | ||||
| 					"name": "icon-play", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 58, | ||||
| @@ -602,7 +626,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 233, | ||||
| 					"name": "icon-plot-resource", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 59, | ||||
| @@ -610,7 +634,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 43, | ||||
| 					"name": "icon-plus", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 60, | ||||
| @@ -618,7 +642,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 45, | ||||
| 					"name": "icon-minus", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 61, | ||||
| @@ -626,7 +650,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 54, | ||||
| 					"name": "icon-sine", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 62, | ||||
| @@ -634,7 +658,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 228, | ||||
| 					"name": "icon-T", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 63, | ||||
| @@ -642,7 +666,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 116, | ||||
| 					"name": "icon-telemetry-panel", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 64, | ||||
| @@ -650,7 +674,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 84, | ||||
| 					"name": "icon-telemetry", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 18, | ||||
| @@ -658,7 +682,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 246, | ||||
| 					"name": "icon-thumbs-strip", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 67, | ||||
| @@ -666,7 +690,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 83, | ||||
| 					"name": "icon-timeline", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 68, | ||||
| @@ -674,7 +698,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 245, | ||||
| 					"name": "icon-timer", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 69, | ||||
| @@ -682,7 +706,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 90, | ||||
| 					"name": "icon-trash", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 70, | ||||
| @@ -690,7 +714,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 229, | ||||
| 					"name": "icon-two-parts-both", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 71, | ||||
| @@ -698,7 +722,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 231, | ||||
| 					"name": "icon-two-parts-one-only", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 72, | ||||
| @@ -706,7 +730,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 120, | ||||
| 					"name": "icon-x-heavy", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				}, | ||||
| 				{ | ||||
| 					"order": 66, | ||||
| @@ -714,7 +738,7 @@ | ||||
| 					"prevSize": 32, | ||||
| 					"code": 58946, | ||||
| 					"name": "icon-x", | ||||
| 					"tempChar": "" | ||||
| 					"tempChar": "" | ||||
| 				} | ||||
| 			], | ||||
| 			"id": 2, | ||||
| @@ -729,6 +753,65 @@ | ||||
| 			"height": 1024, | ||||
| 			"prevSize": 32, | ||||
| 			"icons": [ | ||||
| 				{ | ||||
| 					"id": 96, | ||||
| 					"paths": [ | ||||
| 						"M832 752c0 44-36 80-80 80h-480c-44 0-80-36-80-80v-480c0-44 36-80 80-80h480c44 0 80 36 80 80v480z" | ||||
| 					], | ||||
| 					"attrs": [], | ||||
| 					"isMulticolor": false, | ||||
| 					"grid": 0, | ||||
| 					"tags": [ | ||||
| 						"icon-bullet" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [] | ||||
| 					} | ||||
| 				}, | ||||
| 				{ | ||||
| 					"id": 95, | ||||
| 					"paths": [ | ||||
| 						"M923 438.2l-151-100.6c-36-24-103.8-24-139.8 0l-151 100.6c-44.6 29.8-102.6 46.2-163 46.2s-118.4-16.4-163-46.2l-151.4-100.6c-1.8-1.2-3.8-2.4-5.8-3.6v208c36.6 7.4 70.6 20.8 99 39.8l151 100.6c36 24 103.8 24 139.8 0l151-100.6c44.6-29.8 102.6-46.2 163-46.2s118.4 16.4 163 46.2l151 100.6c1.8 1.2 3.8 2.4 5.8 3.6v-208c-36.2-7.2-70.2-20.8-98.6-39.8z", | ||||
| 						"M923 822.2l-151-100.6c-36-24-103.8-24-139.8 0l-151 100.6c-44.6 29.8-102.6 46.2-163 46.2s-118.4-16.4-163-46.2l-151.4-100.6c-1.8-1.2-3.8-2.4-5.8-3.6v112c0 105.6 86.4 192 192 192h640c94.8 0 174.2-69.8 189.4-160.4-35.6-7.4-68.6-20.8-96.4-39.4z", | ||||
| 						"M97 197.8l151 100.6c36 24 103.8 24 139.8 0l151-100.6c44.8-29.8 102.6-46.2 163.2-46.2s118.4 16.4 163 46.2l151 100.6c1.8 1.2 3.8 2.4 5.8 3.6v-112c0-105.6-86.4-192-192-192h-639.8c-94.8 0-174.2 69.8-189.4 160.4 35.6 7.4 68.6 20.8 96.4 39.4z" | ||||
| 					], | ||||
| 					"attrs": [], | ||||
| 					"isMulticolor": false, | ||||
| 					"grid": 0, | ||||
| 					"tags": [ | ||||
| 						"icon-session" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0, | ||||
| 							0, | ||||
| 							0 | ||||
| 						] | ||||
| 					} | ||||
| 				}, | ||||
| 				{ | ||||
| 					"id": 94, | ||||
| 					"paths": [ | ||||
| 						"M546.4 431.2l32-24c31.6-23.8 91.6-23.8 123.2 0l32 24c10.8 8 22.2 15.2 34.4 21.4v-201.2c-38-19.6-82.2-30-128-30-60.4 0-118.2 18.2-162.4 51.4l-32 24c-31.6 23.8-91.6 23.8-123.2 0l-32-24c-10.8-8-22.2-15.2-34.4-21.4v201.2c38 19.6 82.2 30 128 30 60.4 0 118.2-18.2 162.4-51.4z", | ||||
| 						"M640 541.4c-60.4 0-118.2 18.2-162.4 51.4l-32 24c-31.6 23.8-91.6 23.8-123.2 0l-32-24c-10.8-8-22.2-15.2-34.4-21.4v201.2c38 19.6 82.2 30 128 30 60.4 0 118.2-18.2 162.4-51.4l32-24c31.6-23.8 91.6-23.8 123.2 0l32 24c10.8 8 22.2 15.2 34.4 21.4v-201.2c-38-19.6-82.2-30-128-30z", | ||||
| 						"M832 0h-128v192h127.6c0.2 0 0.2 0.2 0.4 0.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-127.6v192h128c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192z", | ||||
| 						"M320 832h-127.6c-0.2 0-0.2-0.2-0.4-0.4v-639.4c0-0.2 0.2-0.2 0.4-0.4h127.6v-191.8h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192z" | ||||
| 					], | ||||
| 					"attrs": [], | ||||
| 					"isMulticolor": false, | ||||
| 					"grid": 0, | ||||
| 					"tags": [ | ||||
| 						"icon-topic" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0, | ||||
| 							0, | ||||
| 							0, | ||||
| 							0 | ||||
| 						] | ||||
| 					} | ||||
| 				}, | ||||
| 				{ | ||||
| 					"id": 93, | ||||
| 					"paths": [ | ||||
| @@ -749,6 +832,10 @@ | ||||
| 						"icon-eye-open-no-gleam" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| @@ -775,6 +862,10 @@ | ||||
| 						"icon-crosshair" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| @@ -801,6 +892,10 @@ | ||||
| 						"icon-collapse-pane-left" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| @@ -827,6 +922,10 @@ | ||||
| 						"icon-collapse-pane-right" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| @@ -853,6 +952,10 @@ | ||||
| 						"icon-save-v2" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| @@ -872,6 +975,7 @@ | ||||
| 						"icon-dataset" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [], | ||||
| 						"125525525516161751": [] | ||||
| 					} | ||||
| 				}, | ||||
| @@ -895,6 +999,10 @@ | ||||
| 						"icon-bell" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| @@ -921,6 +1029,10 @@ | ||||
| 						"icon-hourglass" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							1, | ||||
| 							1 | ||||
| @@ -943,6 +1055,9 @@ | ||||
| 						"icon-info-v1.5" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							0 | ||||
| 						] | ||||
| @@ -1336,6 +1451,10 @@ | ||||
| 						"icon-box-with-arrow-cursor" | ||||
| 					], | ||||
| 					"colorPermutations": { | ||||
| 						"16161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| 						], | ||||
| 						"125525525516161751": [ | ||||
| 							0, | ||||
| 							0 | ||||
| @@ -2367,12 +2486,6 @@ | ||||
| 						161, | ||||
| 						75, | ||||
| 						1 | ||||
| 					], | ||||
| 					[ | ||||
| 						255, | ||||
| 						255, | ||||
| 						255, | ||||
| 						1 | ||||
| 					] | ||||
| 				] | ||||
| 			], | ||||
|   | ||||
| @@ -94,5 +94,8 @@ | ||||
| <glyph unicode="" glyph-name="icon-collapse-pane-right" d="M768 960h256v-1024h-256c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192zM512 640l-512-320v640z" /> | ||||
| <glyph unicode="" glyph-name="icon-eye-open" d="M512 896c-261 0-480.6-195.4-512-448 31.4-252.6 251-448 512-448s480.6 195.4 512 448c-31.4 252.6-251 448-512 448zM768.2 225.4c-71.4-62.8-162.8-97.4-257.6-97.4s-186.2 34.6-257.6 97.4c-66.6 58.6-110.6 137.2-125 222.6 0 0 0 0.2 0 0.2 76.8 154 220.8 257.6 384 257.6s307.2-103.8 384-257.6c0 0 0-0.2 0-0.2-14.4-85.4-61.2-164-127.8-222.6zM512 672c-123.8 0-224-100.2-224-224s100.2-224 224-224 224 100.2 224 224-100.2 224-224 224z" /> | ||||
| <glyph unicode="" glyph-name="icon-eye-open-no-gleam" d="M512 896c-261 0-480.6-195.4-512-448 31.4-252.6 251-448 512-448s480.6 195.4 512 448c-31.4 252.6-251 448-512 448zM768.2 225.4c-71.4-62.8-162.8-97.4-257.6-97.4s-186.2 34.6-257.6 97.4c-66.6 58.6-110.6 137.2-125 222.6 0 0 0 0.2 0 0.2 76.8 154 220.8 257.6 384 257.6s307.2-103.8 384-257.6c0 0 0-0.2 0-0.2-14.4-85.4-61.2-164-127.8-222.6zM512 672c-123.8 0-224-100.2-224-224s100.2-224 224-224 224 100.2 224 224-100.2 224-224 224zM576 416c-53 0-96 43-96 96s43 96 96 96 96-43 96-96c0-53-43-96-96-96z" /> | ||||
| <glyph unicode="" glyph-name="icon-topic" d="M546.4 528.8l32 24c31.6 23.8 91.6 23.8 123.2 0l32-24c10.8-8 22.2-15.2 34.4-21.4v201.2c-38 19.6-82.2 30-128 30-60.4 0-118.2-18.2-162.4-51.4l-32-24c-31.6-23.8-91.6-23.8-123.2 0l-32 24c-10.8 8-22.2 15.2-34.4 21.4v-201.2c38-19.6 82.2-30 128-30 60.4 0 118.2 18.2 162.4 51.4zM640 418.6c-60.4 0-118.2-18.2-162.4-51.4l-32-24c-31.6-23.8-91.6-23.8-123.2 0l-32 24c-10.8 8-22.2 15.2-34.4 21.4v-201.2c38-19.6 82.2-30 128-30 60.4 0 118.2 18.2 162.4 51.4l32 24c31.6 23.8 91.6 23.8 123.2 0l32-24c10.8-8 22.2-15.2 34.4-21.4v201.2c-38 19.6-82.2 30-128 30zM832 960h-128v-192h127.6c0.2 0 0.2-0.2 0.4-0.4v-639.4c0-0.2-0.2-0.2-0.4-0.4h-127.6v-192h128c105.6 0 192 86.4 192 192v640.2c0 105.6-86.4 192-192 192zM320 128h-127.6c-0.2 0-0.2 0.2-0.4 0.4v639.4c0 0.2 0.2 0.2 0.4 0.4h127.6v191.8h-128c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h128v192z" /> | ||||
| <glyph unicode="" glyph-name="icon-session" d="M923 521.8l-151 100.6c-36 24-103.8 24-139.8 0l-151-100.6c-44.6-29.8-102.6-46.2-163-46.2s-118.4 16.4-163 46.2l-151.4 100.6c-1.8 1.2-3.8 2.4-5.8 3.6v-208c36.6-7.4 70.6-20.8 99-39.8l151-100.6c36-24 103.8-24 139.8 0l151 100.6c44.6 29.8 102.6 46.2 163 46.2s118.4-16.4 163-46.2l151-100.6c1.8-1.2 3.8-2.4 5.8-3.6v208c-36.2 7.2-70.2 20.8-98.6 39.8zM923 137.8l-151 100.6c-36 24-103.8 24-139.8 0l-151-100.6c-44.6-29.8-102.6-46.2-163-46.2s-118.4 16.4-163 46.2l-151.4 100.6c-1.8 1.2-3.8 2.4-5.8 3.6v-112c0-105.6 86.4-192 192-192h640c94.8 0 174.2 69.8 189.4 160.4-35.6 7.4-68.6 20.8-96.4 39.4zM97 762.2l151-100.6c36-24 103.8-24 139.8 0l151 100.6c44.8 29.8 102.6 46.2 163.2 46.2s118.4-16.4 163-46.2l151-100.6c1.8-1.2 3.8-2.4 5.8-3.6v112c0 105.6-86.4 192-192 192h-639.8c-94.8 0-174.2-69.8-189.4-160.4 35.6-7.4 68.6-20.8 96.4-39.4z" /> | ||||
| <glyph unicode="" glyph-name="icon-bullet" d="M832 208c0-44-36-80-80-80h-480c-44 0-80 36-80 80v480c0 44 36 80 80 80h480c44 0 80-36 80-80v-480z" /> | ||||
| <glyph unicode="" glyph-name="icon-x" d="M384 448l-365.332-365.332c-24.89-24.89-24.89-65.62 0-90.51l37.49-37.49c24.89-24.89 65.62-24.89 90.51 0 0 0 365.332 365.332 365.332 365.332l365.332-365.332c24.89-24.89 65.62-24.89 90.51 0l37.49 37.49c24.89 24.89 24.89 65.62 0 90.51l-365.332 365.332c0 0 365.332 365.332 365.332 365.332 24.89 24.89 24.89 65.62 0 90.51l-37.49 37.49c-24.89 24.89-65.62 24.89-90.51 0 0 0-365.332-365.332-365.332-365.332l-365.332 365.332c-24.89 24.89-65.62 24.89-90.51 0l-37.49-37.49c-24.89-24.89-24.89-65.62 0-90.51 0 0 365.332-365.332 365.332-365.332z" /> | ||||
| </font></defs></svg> | ||||
| Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 31 KiB | 
| Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 218 KiB | 
							
								
								
									
										32
									
								
								platform/commonUI/general/res/images/logo-app-shdw.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||
| <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||||
| 	 viewBox="20 0 640 150" enable-background="new 20 0 640 150" xml:space="preserve"> | ||||
| <filter  height="130%" width="150%" id="AI_Shadow_Custom" x="-15%" filterUnits="objectBoundingBox" y="-15%"> | ||||
| 	<feGaussianBlur  in="SourceAlpha" result="blur" stdDeviation="6"></feGaussianBlur> | ||||
| 	<feOffset  in="blur" dy="3" result="offsetBlurredAlpha" dx="0"></feOffset> | ||||
| 	<feMerge> | ||||
| 		<feMergeNode  in="offsetBlurredAlpha"></feMergeNode> | ||||
| 		<feMergeNode  in="SourceGraphic"></feMergeNode> | ||||
| 	</feMerge> | ||||
| </filter> | ||||
| <g filter="url(#AI_Shadow_Custom)"> | ||||
| 	<path fill="#FFFFFF" d="M90.7,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8H62.8c-14.8,0-22.8-8-22.8-22.8V36 | ||||
| 		c0-14.8,8-22.8,22.8-22.8H90.7z M97.8,36.2c0-5.8-3.1-9.2-9.2-9.2h-24c-5.8,0-9.2,3.2-9.2,9.2v45.9c0,6,3.4,9.2,9.2,9.2h24 | ||||
| 		c6,0,9.2-3.2,9.2-9.2V36.2z"/> | ||||
| 	<path fill="#FFFFFF" d="M173.2,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8h-9c-11.2,0-19.2-6.6-26.5-13.6v44.2 | ||||
| 		h-15.5V13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6H173.2z M180.3,36.2c0-5.8-3.1-9.2-9.2-9.2h-8.3c-9.4,0-17,3.6-25.2,9.2v45.9 | ||||
| 		c8.2,5.6,15.8,9.2,25.2,9.2h8.3c6.1,0,9.2-3.4,9.2-9.2V36.2z"/> | ||||
| 	<path fill="#FFFFFF" d="M220.3,82.8c0,6,3.2,9.2,9.2,9.2h23c6,0,9.2-3.4,9.2-9.2V76h15.6v6.3c0,14.8-8,22.8-22.8,22.8h-27 | ||||
| 		c-14.8,0-22.8-8-22.8-22.8V36c0-14.8,8-22.8,22.8-22.8h27c14.8,0,22.8,8,22.8,22.8v26.9h-57V82.8z M229.5,26.3 | ||||
| 		c-6,0-9.2,3.2-9.2,9.2v15.8h41.3V35.5c0-6-3.1-9.2-9.2-9.2H229.5z"/> | ||||
| 	<path fill="#FFFFFF" d="M285.7,13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6h7.1c14.8,0,22.8,8,22.8,22.8v69.1h-15.5V36.6 | ||||
| 		c0-6-3.2-9.2-9.2-9.2h-6.6c-9.4,0-17,3.4-25.2,9.2v68.5h-15.5V13.2z"/> | ||||
| 	<path fill="#4F79F7" d="M495.4,105.1c-12.5,0-18.4-6-18.4-18.4V28.7c0-12.5,6.2-18.4,18.7-18.4h42.2c12.5,0,18.1,6,18.1,18.4v17.7 | ||||
| 		h-25.4V33.9c0-1.9-0.5-2.4-2.4-2.4h-23.3c-1.9,0-2.4,0.5-2.4,2.4v47.6c0,1.9,0.5,2.4,2.4,2.4h23.3c1.9,0,2.4-0.5,2.4-2.4V69H556 | ||||
| 		v17.7c0,12.5-6,18.4-18.4,18.4H495.4z"/> | ||||
| 	<path fill="#4F79F7" d="M613.7,32v73.1h-25.4V32H562V10.3h78V32H613.7z"/> | ||||
| 	<path fill="#4F79F7" d="M425.3,93.6l17.4-42.4v48.6c0,3,2.4,5.4,5.4,5.4h19V15.7c0-3-2.4-5.4-5.4-5.4h-23.3l-21.2,49.4l-21.2-49.4 | ||||
| 		h-23.3c-3,0-5.4,2.4-5.4,5.4v89.5h19c3,0,5.4-2.4,5.4-5.4V51.2l17.4,42.4H425.3z"/> | ||||
| </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										24
									
								
								platform/commonUI/general/res/images/logo-app.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||
| <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||||
| 	 viewBox="20 0 640 150" enable-background="new 20 0 640 150" xml:space="preserve"> | ||||
| <g> | ||||
| 	<path fill="#FFFFFF" d="M90.7,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8H62.8c-14.8,0-22.8-8-22.8-22.8V36 | ||||
| 		c0-14.8,8-22.8,22.8-22.8H90.7z M97.8,36.2c0-5.8-3.1-9.2-9.2-9.2h-24c-5.8,0-9.2,3.2-9.2,9.2v45.9c0,6,3.4,9.2,9.2,9.2h24 | ||||
| 		c6,0,9.2-3.2,9.2-9.2V36.2z"/> | ||||
| 	<path fill="#FFFFFF" d="M173.2,13.2c14.8,0,22.8,8,22.8,22.8v46.3c0,14.8-8,22.8-22.8,22.8h-9c-11.2,0-19.2-6.6-26.5-13.6v44.2 | ||||
| 		h-15.5V13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6H173.2z M180.3,36.2c0-5.8-3.1-9.2-9.2-9.2h-8.3c-9.4,0-17,3.6-25.2,9.2v45.9 | ||||
| 		c8.2,5.6,15.8,9.2,25.2,9.2h8.3c6.1,0,9.2-3.4,9.2-9.2V36.2z"/> | ||||
| 	<path fill="#FFFFFF" d="M220.3,82.8c0,6,3.2,9.2,9.2,9.2h23c6,0,9.2-3.4,9.2-9.2V76h15.6v6.3c0,14.8-8,22.8-22.8,22.8h-27 | ||||
| 		c-14.8,0-22.8-8-22.8-22.8V36c0-14.8,8-22.8,22.8-22.8h27c14.8,0,22.8,8,22.8,22.8v26.9h-57V82.8z M229.5,26.3 | ||||
| 		c-6,0-9.2,3.2-9.2,9.2v15.8h41.3V35.5c0-6-3.1-9.2-9.2-9.2H229.5z"/> | ||||
| 	<path fill="#FFFFFF" d="M285.7,13.2h15.5v13.6c7.3-7,15.3-13.6,26.5-13.6h7.1c14.8,0,22.8,8,22.8,22.8v69.1h-15.5V36.6 | ||||
| 		c0-6-3.2-9.2-9.2-9.2h-6.6c-9.4,0-17,3.4-25.2,9.2v68.5h-15.5V13.2z"/> | ||||
| 	<path fill="#4F79F7" d="M495.4,105.1c-12.5,0-18.4-6-18.4-18.4V28.7c0-12.5,6.2-18.4,18.7-18.4h42.2c12.5,0,18.1,6,18.1,18.4v17.7 | ||||
| 		h-25.4V33.9c0-1.9-0.5-2.4-2.4-2.4h-23.3c-1.9,0-2.4,0.5-2.4,2.4v47.6c0,1.9,0.5,2.4,2.4,2.4h23.3c1.9,0,2.4-0.5,2.4-2.4V69H556 | ||||
| 		v17.7c0,12.5-6,18.4-18.4,18.4H495.4z"/> | ||||
| 	<path fill="#4F79F7" d="M613.7,32v73.1h-25.4V32H562V10.3h78V32H613.7z"/> | ||||
| 	<path fill="#4F79F7" d="M425.3,93.6l17.4-42.4v48.6c0,3,2.4,5.4,5.4,5.4h19V15.7c0-3-2.4-5.4-5.4-5.4h-23.3l-21.2,49.4l-21.2-49.4 | ||||
| 		h-23.3c-3,0-5.4,2.4-5.4,5.4v89.5h19c3,0,5.4-2.4,5.4-5.4V51.2l17.4,42.4H425.3z"/> | ||||
| </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.0 KiB | 
| @@ -1,99 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||||
| <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||||
| 	 width="1040px" height="150px" viewBox="0 0 1040 150" enable-background="new 0 0 1040 150" xml:space="preserve"> | ||||
| <filter  width="150%" height="130%" x="-15%" y="-15%" filterUnits="objectBoundingBox" id="AI_Shadow_Custom"> | ||||
| 	<feGaussianBlur  in="SourceAlpha" stdDeviation="6" result="blur"></feGaussianBlur> | ||||
| 	<feOffset  dy="3" dx="0" in="blur" result="offsetBlurredAlpha"></feOffset> | ||||
| 	<feMerge> | ||||
| 		<feMergeNode  in="offsetBlurredAlpha"></feMergeNode> | ||||
| 		<feMergeNode  in="SourceGraphic"></feMergeNode> | ||||
| 	</feMerge> | ||||
| </filter> | ||||
| <g filter="url(#AI_Shadow_Custom)"> | ||||
| 	<path fill="#FFFFFF" d="M121.932,76.064c0,5.952-0.992,11.507-3.174,16.665c-1.984,4.96-4.96,9.324-8.531,13.094 | ||||
| 		c-3.769,3.769-7.936,6.547-13.094,8.531c-4.96,1.984-10.515,2.976-16.466,2.976H56.463c-5.952,0-11.507-0.992-16.466-2.976 | ||||
| 		s-9.523-4.96-13.094-8.531c-3.769-3.769-6.547-8.134-8.729-13.094C15.992,87.57,15,82.015,15,76.064V57.217 | ||||
| 		c0-5.952,0.992-11.507,3.174-16.665s4.96-9.523,8.729-13.094c3.571-3.571,7.936-6.547,12.895-8.531s10.515-3.174,16.466-3.174 | ||||
| 		h24.203c5.952,0,11.507,0.992,16.466,3.174c4.96,1.984,9.324,4.96,13.094,8.531s6.547,7.936,8.531,13.094 | ||||
| 		c1.984,5.158,3.174,10.515,3.174,16.665v18.847H121.932z M103.878,57.217c0-3.571-0.595-6.745-1.786-9.523 | ||||
| 		c-1.19-2.777-2.777-5.357-4.761-7.34c-1.984-1.984-4.563-3.571-7.34-4.761c-2.777-1.19-5.952-1.786-9.523-1.786H56.463 | ||||
| 		c-3.571,0-6.745,0.595-9.523,1.786c-2.777,1.19-5.357,2.777-7.34,4.761c-1.984,1.984-3.571,4.563-4.761,7.34 | ||||
| 		c-1.389,2.777-1.984,5.952-1.984,9.523v18.847c0,3.571,0.595,6.745,1.786,9.523c1.19,2.976,2.777,5.357,4.761,7.34 | ||||
| 		s4.563,3.571,7.34,4.761c2.777,1.19,6.15,1.786,9.523,1.786h24.203c3.571,0,6.745-0.595,9.523-1.786 | ||||
| 		c2.777-1.19,5.357-2.777,7.34-4.761s3.571-4.563,4.761-7.34c1.19-2.777,1.786-6.15,1.786-9.523L103.878,57.217z"/> | ||||
| 	<path fill="#FFFFFF" d="M209.62,90.943c0,3.174-0.397,5.753-1.19,8.332c-0.794,2.381-1.786,4.563-3.174,6.547 | ||||
| 		c-1.19,1.786-2.777,3.373-4.563,4.761c-1.786,1.389-3.571,2.381-5.357,3.174c-1.786,0.794-3.769,1.389-5.555,1.786 | ||||
| 		c-1.984,0.397-3.769,0.595-5.357,0.595h-32.337V98.283h32.337c2.381,0,4.166-0.595,5.357-1.786c1.19-1.19,1.786-2.976,1.786-5.357 | ||||
| 		V66.739c0-2.579-0.595-4.365-1.786-5.555c-1.19-1.19-2.976-1.786-5.357-1.786h-32.139c-2.381,0-4.365,0.595-5.555,1.786 | ||||
| 		c-1.19,1.19-1.786,2.976-1.786,5.357v72.809H127.09V66.541c0-3.174,0.397-5.753,1.19-8.332c0.794-2.381,1.786-4.563,3.174-6.547 | ||||
| 		c1.389-1.786,2.777-3.373,4.563-4.761s3.571-2.381,5.357-3.174s3.769-1.389,5.555-1.786c1.984-0.397,3.769-0.595,5.357-0.595 | ||||
| 		h32.337c3.174,0,5.753,0.397,8.332,1.19c2.381,0.794,4.563,1.786,6.348,3.174c1.786,1.19,3.373,2.777,4.761,4.563 | ||||
| 		s2.381,3.571,3.174,5.357c0.794,1.786,1.389,3.769,1.785,5.555c0.397,1.984,0.595,3.769,0.595,5.357L209.62,90.943L209.62,90.943z" | ||||
| 		/> | ||||
| 	<path fill="#FFFFFF" d="M295.126,66.144c0,2.579-0.397,5.158-1.389,7.936c-0.794,2.777-2.381,5.555-4.166,7.936 | ||||
| 		c-1.984,2.381-4.563,4.563-7.737,6.15c-3.174,1.587-6.944,2.579-11.507,2.579H237.99V73.683h32.337 | ||||
| 		c2.381,0,4.365-0.794,5.555-2.182c1.389-1.587,1.984-3.373,1.984-5.555c0-2.381-0.794-4.166-2.182-5.555 | ||||
| 		c-1.587-1.389-3.373-1.984-5.357-1.984H237.99c-2.381,0-4.365,0.794-5.753,2.182c-1.389,1.587-1.984,3.373-1.984,5.555V91.34 | ||||
| 		c0,2.381,0.794,4.166,2.182,5.555c1.587,1.389,3.373,1.984,5.555,1.984h46.82v17.061h-47.018c-2.579,0-5.158-0.397-7.936-1.389 | ||||
| 		c-2.777-0.794-5.555-2.381-7.936-4.166c-2.381-1.984-4.563-4.563-6.15-7.737c-1.587-3.174-2.381-6.944-2.381-11.507V66.144 | ||||
| 		c0-2.579,0.397-5.158,1.389-7.936c0.794-2.777,2.381-5.555,4.166-7.936c1.984-2.381,4.563-4.563,7.737-6.15 | ||||
| 		s6.944-2.579,11.507-2.579h32.337c2.579,0,5.158,0.397,7.936,1.389c2.777,0.794,5.555,2.381,7.936,4.166 | ||||
| 		c2.381,1.984,4.563,4.563,6.15,7.737C294.332,57.812,295.126,61.78,295.126,66.144z"/> | ||||
| 	<path fill="#FFFFFF" d="M379.838,116.138h-17.855V74.675c0-2.381-0.397-4.365-1.19-6.348c-0.794-1.785-1.984-3.373-3.373-4.761 | ||||
| 		c-1.389-1.389-2.976-2.381-4.96-2.976c-1.785-0.794-3.968-0.992-5.952-0.992h-31.346v56.541h-17.855V50.471 | ||||
| 		c0-1.19,0.198-2.381,0.595-3.571c0.397-0.992,1.19-1.984,1.984-2.777c0.794-0.794,1.785-1.389,2.976-1.984 | ||||
| 		c1.19-0.397,2.182-0.595,3.571-0.595h40.471c2.182,0,4.563,0.198,7.142,0.794c2.579,0.595,4.96,1.389,7.539,2.381 | ||||
| 		c2.381,1.19,4.761,2.579,6.944,4.365c2.182,1.786,4.166,3.769,5.952,6.348c1.785,2.381,3.174,5.357,4.166,8.531 | ||||
| 		c0.992,3.174,1.587,6.944,1.587,10.911v41.265H379.838z"/> | ||||
| 	<path fill="#FFFFFF" d="M502.839,116.138h-18.053V57.217l-31.742,55.946c-0.794,1.389-1.785,2.579-3.373,3.174 | ||||
| 		c-1.389,0.794-2.976,1.19-4.563,1.19s-2.976-0.397-4.365-1.19c-1.389-0.794-2.381-1.786-3.174-3.174l-31.941-55.946v58.922h-17.855 | ||||
| 		V24.879c0-1.984,0.595-3.968,1.785-5.555c1.19-1.587,2.777-2.777,4.761-3.174c0.992-0.198,1.984-0.397,2.976-0.198 | ||||
| 		c0.992,0,1.984,0.198,2.777,0.595c0.992,0.397,1.785,0.794,2.381,1.389c0.794,0.595,1.389,1.389,1.785,2.182l40.868,71.023 | ||||
| 		l40.868-71.023c0.992-1.786,2.579-2.976,4.365-3.769c1.785-0.794,3.769-0.794,5.753-0.397c1.984,0.595,3.571,1.587,4.761,3.174 | ||||
| 		c1.19,1.587,1.785,3.373,1.785,5.555v91.457H502.839z"/> | ||||
| 	<path fill="#FFFFFF" d="M595.685,116.138h-62.493c-1.587,0-3.373-0.198-5.357-0.595c-1.984-0.397-3.769-0.992-5.753-1.786 | ||||
| 		c-1.786-0.794-3.571-1.984-5.357-3.174c-1.786-1.389-3.174-2.976-4.563-4.761c-1.389-1.786-2.381-3.968-3.174-6.547 | ||||
| 		c-0.794-2.381-1.19-5.158-1.19-8.332V42.337c0-1.587,0.198-3.373,0.595-5.357c0.397-1.984,0.992-3.769,1.785-5.753 | ||||
| 		c0.794-1.786,1.984-3.571,3.174-5.357c1.389-1.786,2.976-3.174,4.761-4.563c1.786-1.389,3.968-2.381,6.348-3.174 | ||||
| 		c2.381-0.794,5.158-1.19,8.332-1.19h62.493v17.855h-62.493c-2.381,0-4.166,0.595-5.357,1.786c-1.19,1.19-1.785,3.174-1.785,5.555 | ||||
| 		v48.407c0,2.381,0.595,4.166,1.984,5.357c1.19,1.19,2.976,1.984,5.357,1.984h62.493v18.252H595.685z"/> | ||||
| 	<path fill="#FFFFFF" d="M697.658,35.195h-39.479v80.943h-17.855V35.195h-39.479V17.34h97.012v17.855H697.658z"/> | ||||
| 	<path fill="#4F79F7" d="M98.125,49.083c-0.992-2.381-2.182-4.166-3.769-5.952c-1.587-1.587-3.571-2.777-5.952-3.769 | ||||
| 		c-2.381-0.992-4.96-1.389-7.936-1.389H65.192c-1.389,7.34-1.389,12.697-0.794,15.474c0.198-0.198,0.397-0.198,0.397-0.397 | ||||
| 		c1.587-1.389,3.571-3.174,6.15-4.166c1.785-0.794,3.769-1.19,5.555-1.19c3.174,0,5.952,1.19,7.936,3.373 | ||||
| 		c2.777,3.174,3.968,8.332,3.174,14.879c-1.984,16.07-11.308,17.26-14.086,17.26c-1.786,0-3.769-0.397-5.555-1.19 | ||||
| 		c-2.579-1.19-4.365-2.976-5.555-4.365l-0.198-0.198c-1.389,2.579-2.976,8.531-3.571,17.26h21.823c2.976,0,5.555-0.397,7.936-1.389 | ||||
| 		c2.381-0.992,4.365-2.182,5.952-3.769c1.587-1.587,2.777-3.571,3.769-5.753c0.992-2.381,1.389-4.96,1.389-7.936V57.018 | ||||
| 		C99.514,54.241,99.117,51.463,98.125,49.083z M61.82,72.096c2.777,0,4.365,4.365,7.936,5.952c4.761,2.182,11.308,0.397,12.895-12.3 | ||||
| 		s-4.761-14.482-9.919-12.3c-3.968,1.587-6.547,5.952-9.324,5.952c-3.571,0-5.158-8.134-2.976-21.426h-4.166 | ||||
| 		c-2.976,0-5.555,0.397-7.936,1.389c-2.381,0.992-4.365,2.182-5.952,3.769c-1.587,1.587-2.976,3.571-3.769,5.952 | ||||
| 		c-0.992,2.381-1.389,4.96-1.389,7.936v18.847c0,2.976,0.397,5.753,1.389,7.936c0.992,2.381,2.182,4.166,3.769,5.753 | ||||
| 		c1.587,1.587,3.571,2.777,5.952,3.769c1.587,0.595,3.373,0.992,5.357,1.19C54.479,80.825,58.249,72.096,61.82,72.096z"/> | ||||
| 	<path fill="#4F79F7" d="M858.155,17.142l-16.665,93.045c-0.397,1.786-1.19,3.373-2.579,4.761c-1.389,1.389-2.777,2.182-4.761,2.579 | ||||
| 		s-3.769,0.198-5.357-0.595c-1.587-0.794-2.976-1.984-3.968-3.373l-32.933-54.16l-32.933,54.16 | ||||
| 		c-0.794,1.389-1.786,2.381-3.174,3.174c-1.389,0.794-2.777,1.19-4.365,1.19c-2.182,0-4.166-0.595-5.753-1.984 | ||||
| 		s-2.579-3.174-2.976-5.357l-16.665-93.045h18.252l11.903,65.468l28.37-45.233c0.794-1.389,1.786-2.381,3.174-3.174 | ||||
| 		s2.777-1.19,4.365-1.19c1.587,0,2.976,0.397,4.365,1.19c1.389,0.794,2.381,1.786,3.373,3.174l28.171,45.233l11.903-65.468h18.252 | ||||
| 		V17.142z"/> | ||||
| 	<path fill="#4F79F7" d="M1024.802,91.141c0,1.786-0.198,3.571-0.595,5.357c-0.397,1.984-0.992,3.769-1.786,5.555 | ||||
| 		c-0.794,1.786-1.984,3.571-3.174,5.357c-1.389,1.786-2.976,3.174-4.761,4.563c-1.786,1.389-3.968,2.381-6.547,3.174 | ||||
| 		c-2.381,0.794-5.158,1.19-8.332,1.19H967.07c-1.786,0-3.571-0.198-5.357-0.595c-1.984-0.397-3.769-0.992-5.555-1.786 | ||||
| 		c-1.785-0.794-3.571-1.984-5.357-3.174c-1.786-1.389-3.174-2.976-4.563-4.761c-1.389-1.786-2.381-3.968-3.174-6.547 | ||||
| 		c-0.794-2.381-1.19-5.158-1.19-8.332V10h18.053v81.141c0,2.182,0.595,3.968,1.984,5.357s3.174,1.984,5.158,1.984h32.536 | ||||
| 		c2.182,0,3.968-0.595,5.357-1.984c1.19-1.389,1.984-3.174,1.984-5.357V66.938c0-2.182-0.595-3.968-1.984-5.357 | ||||
| 		c-1.389-1.19-2.976-1.984-5.158-1.984h-32.536V41.544h32.536c1.786,0,3.571,0.198,5.357,0.595c1.984,0.397,3.769,0.992,5.555,1.786 | ||||
| 		c1.786,0.794,3.571,1.984,5.357,3.174c1.785,1.389,3.174,2.976,4.563,4.761s2.381,3.968,3.174,6.547 | ||||
| 		c0.794,2.381,1.19,5.158,1.19,8.332v24.402H1024.802z"/> | ||||
| 	<path fill="#4F79F7" d="M937.709,66.144c0,2.579-0.397,5.158-1.389,7.936c-0.794,2.777-2.381,5.555-4.166,7.936 | ||||
| 		c-1.984,2.381-4.563,4.563-7.737,6.15c-3.174,1.587-6.944,2.579-11.507,2.579h-32.337V73.683h32.337 | ||||
| 		c2.381,0,4.365-0.794,5.555-2.182c1.389-1.587,1.984-3.373,1.984-5.555c0-2.381-0.794-4.166-2.182-5.555 | ||||
| 		c-1.587-1.389-3.373-1.984-5.357-1.984h-32.337c-2.381,0-4.365,0.794-5.753,2.182c-1.389,1.587-1.984,3.373-1.984,5.555V91.34 | ||||
| 		c0,2.381,0.794,4.166,2.182,5.555c1.587,1.389,3.373,1.984,5.555,1.984h47.018v17.061h-47.018c-2.579,0-5.158-0.397-7.936-1.389 | ||||
| 		c-2.777-0.794-5.555-2.381-7.936-4.166c-2.381-1.984-4.563-4.563-6.15-7.737c-1.587-3.174-2.381-6.944-2.381-11.507V66.144 | ||||
| 		c0-2.579,0.397-5.158,1.389-7.936c0.794-2.777,2.381-5.555,4.166-7.936c1.984-2.381,4.563-4.563,7.737-6.15 | ||||
| 		c3.174-1.587,6.944-2.579,11.507-2.579h32.337c2.579,0,5.158,0.397,7.936,1.389c2.777,0.794,5.555,2.381,7.936,4.166 | ||||
| 		c2.381,1.984,4.563,4.563,6.15,7.737C936.717,57.812,937.709,61.78,937.709,66.144z"/> | ||||
| </g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 9.8 KiB | 
| @@ -1,70 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||||
| <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||||
| 	 viewBox="0 0 509 65.2" enable-background="new 0 0 509 65.2" xml:space="preserve"> | ||||
| <g id="logo_s3_4_"> | ||||
| 	<g> | ||||
| 		<g> | ||||
| 			<path fill="#FFFFFF" d="M53.9,33.3c0,3-0.5,5.8-1.6,8.4c-1,2.5-2.5,4.7-4.3,6.6c-1.9,1.9-4,3.3-6.6,4.3c-2.5,1-5.3,1.5-8.3,1.5 | ||||
| 				H20.9c-3,0-5.8-0.5-8.3-1.5c-2.5-1-4.8-2.5-6.6-4.3c-1.9-1.9-3.3-4.1-4.4-6.6C0.5,39.1,0,36.3,0,33.3v-9.5c0-3,0.5-5.8,1.6-8.4 | ||||
| 				c1.1-2.6,2.5-4.8,4.4-6.6C7.8,7,10,5.5,12.5,4.5c2.5-1,5.3-1.6,8.3-1.6h12.2c3,0,5.8,0.5,8.3,1.6c2.5,1,4.7,2.5,6.6,4.3 | ||||
| 				c1.9,1.8,3.3,4,4.3,6.6c1,2.6,1.6,5.3,1.6,8.4V33.3z M44.8,23.8c0-1.8-0.3-3.4-0.9-4.8c-0.6-1.4-1.4-2.7-2.4-3.7 | ||||
| 				c-1-1-2.3-1.8-3.7-2.4c-1.4-0.6-3-0.9-4.8-0.9H20.9c-1.8,0-3.4,0.3-4.8,0.9c-1.4,0.6-2.7,1.4-3.7,2.4c-1,1-1.8,2.3-2.4,3.7 | ||||
| 				C9.3,20.4,9,22,9,23.8v9.5c0,1.8,0.3,3.4,0.9,4.8c0.6,1.5,1.4,2.7,2.4,3.7c1,1,2.3,1.8,3.7,2.4c1.4,0.6,3.1,0.9,4.8,0.9H33 | ||||
| 				c1.8,0,3.4-0.3,4.8-0.9c1.4-0.6,2.7-1.4,3.7-2.4c1-1,1.8-2.3,2.4-3.7c0.6-1.4,0.9-3.1,0.9-4.8V23.8z"/> | ||||
| 			<path fill="#FFFFFF" d="M98.1,40.8c0,1.6-0.2,2.9-0.6,4.2c-0.4,1.2-0.9,2.3-1.6,3.3c-0.6,0.9-1.4,1.7-2.3,2.4 | ||||
| 				c-0.9,0.7-1.8,1.2-2.7,1.6c-0.9,0.4-1.9,0.7-2.8,0.9c-1,0.2-1.9,0.3-2.7,0.3H69.1v-9h16.3c1.2,0,2.1-0.3,2.7-0.9 | ||||
| 				c0.6-0.6,0.9-1.5,0.9-2.7V28.6c0-1.3-0.3-2.2-0.9-2.8c-0.6-0.6-1.5-0.9-2.7-0.9H69.2c-1.2,0-2.2,0.3-2.8,0.9 | ||||
| 				c-0.6,0.6-0.9,1.5-0.9,2.7v36.7h-9V28.5c0-1.6,0.2-2.9,0.6-4.2c0.4-1.2,0.9-2.3,1.6-3.3c0.7-0.9,1.4-1.7,2.3-2.4 | ||||
| 				c0.9-0.7,1.8-1.2,2.7-1.6c0.9-0.4,1.9-0.7,2.8-0.9c1-0.2,1.9-0.3,2.7-0.3h16.3c1.6,0,2.9,0.2,4.2,0.6c1.2,0.4,2.3,0.9,3.2,1.6 | ||||
| 				c0.9,0.6,1.7,1.4,2.4,2.3c0.7,0.9,1.2,1.8,1.6,2.7c0.4,0.9,0.7,1.9,0.9,2.8c0.2,1,0.3,1.9,0.3,2.7V40.8z"/> | ||||
| 			<path fill="#FFFFFF" d="M141.2,28.3c0,1.3-0.2,2.6-0.7,4c-0.4,1.4-1.2,2.8-2.1,4c-1,1.2-2.3,2.3-3.9,3.1 | ||||
| 				c-1.6,0.8-3.5,1.3-5.8,1.3h-16.3v-8.6h16.3c1.2,0,2.2-0.4,2.8-1.1c0.7-0.8,1-1.7,1-2.8c0-1.2-0.4-2.1-1.1-2.8 | ||||
| 				c-0.8-0.7-1.7-1-2.7-1h-16.3c-1.2,0-2.2,0.4-2.9,1.1c-0.7,0.8-1,1.7-1,2.8V41c0,1.2,0.4,2.1,1.1,2.8c0.8,0.7,1.7,1,2.8,1h23.6 | ||||
| 				v8.6h-23.7c-1.3,0-2.6-0.2-4-0.7c-1.4-0.4-2.8-1.2-4-2.1c-1.2-1-2.3-2.3-3.1-3.9c-0.8-1.6-1.2-3.5-1.2-5.8V28.3 | ||||
| 				c0-1.3,0.2-2.6,0.7-4c0.4-1.4,1.2-2.8,2.1-4c1-1.2,2.3-2.3,3.9-3.1c1.6-0.8,3.5-1.3,5.8-1.3h16.3c1.3,0,2.6,0.2,4,0.7 | ||||
| 				c1.4,0.4,2.8,1.2,4,2.1c1.2,1,2.3,2.3,3.1,3.9C140.8,24.1,141.2,26.1,141.2,28.3z"/> | ||||
| 			<path fill="#FFFFFF" d="M183.9,53.5h-9V32.6c0-1.2-0.2-2.2-0.6-3.2c-0.4-0.9-1-1.7-1.7-2.4c-0.7-0.7-1.5-1.2-2.5-1.5 | ||||
| 				c-0.9-0.4-2-0.5-3-0.5h-15.8v28.5h-9V20.4c0-0.6,0.1-1.2,0.3-1.8c0.2-0.5,0.6-1,1-1.4c0.4-0.4,0.9-0.7,1.5-1 | ||||
| 				c0.6-0.2,1.1-0.3,1.8-0.3h20.4c1.1,0,2.3,0.1,3.6,0.4c1.3,0.3,2.5,0.7,3.8,1.2c1.2,0.6,2.4,1.3,3.5,2.2c1.1,0.9,2.1,1.9,3,3.2 | ||||
| 				c0.9,1.2,1.6,2.7,2.1,4.3c0.5,1.6,0.8,3.5,0.8,5.5V53.5z"/> | ||||
| 			<path fill="#FFFFFF" d="M245.9,53.5h-9.1V23.8l-16,28.2c-0.4,0.7-0.9,1.3-1.7,1.6c-0.7,0.4-1.5,0.6-2.3,0.6 | ||||
| 				c-0.8,0-1.5-0.2-2.2-0.6c-0.7-0.4-1.2-0.9-1.6-1.6l-16.1-28.2v29.7h-9v-46c0-1,0.3-2,0.9-2.8c0.6-0.8,1.4-1.4,2.4-1.6 | ||||
| 				c0.5-0.1,1-0.2,1.5-0.1c0.5,0,1,0.1,1.4,0.3c0.5,0.2,0.9,0.4,1.2,0.7c0.4,0.3,0.7,0.7,0.9,1.1l20.6,35.8l20.6-35.8 | ||||
| 				c0.5-0.9,1.3-1.5,2.2-1.9c0.9-0.4,1.9-0.4,2.9-0.2c1,0.3,1.8,0.8,2.4,1.6c0.6,0.8,0.9,1.7,0.9,2.8V53.5z"/> | ||||
| 			<path fill="#FFFFFF" d="M292.7,53.5h-31.5c-0.8,0-1.7-0.1-2.7-0.3c-1-0.2-1.9-0.5-2.9-0.9c-0.9-0.4-1.8-1-2.7-1.6 | ||||
| 				c-0.9-0.7-1.6-1.5-2.3-2.4c-0.7-0.9-1.2-2-1.6-3.3c-0.4-1.2-0.6-2.6-0.6-4.2V16.3c0-0.8,0.1-1.7,0.3-2.7c0.2-1,0.5-1.9,0.9-2.9 | ||||
| 				c0.4-0.9,1-1.8,1.6-2.7c0.7-0.9,1.5-1.6,2.4-2.3c0.9-0.7,2-1.2,3.2-1.6c1.2-0.4,2.6-0.6,4.2-0.6h31.5v9h-31.5 | ||||
| 				c-1.2,0-2.1,0.3-2.7,0.9c-0.6,0.6-0.9,1.6-0.9,2.8v24.4c0,1.2,0.3,2.1,1,2.7c0.6,0.6,1.5,1,2.7,1h31.5V53.5z"/> | ||||
| 			<path fill="#FFFFFF" d="M344.1,12.7h-19.9v40.8h-9V12.7h-19.9v-9h48.9V12.7z"/> | ||||
| 			<path fill="#4F79F7" d="M41.9,19.7c-0.5-1.2-1.1-2.1-1.9-3c-0.8-0.8-1.8-1.4-3-1.9c-1.2-0.5-2.5-0.7-4-0.7h-7.7 | ||||
| 				c-0.7,3.7-0.7,6.4-0.4,7.8c0.1-0.1,0.2-0.1,0.2-0.2c0.8-0.7,1.8-1.6,3.1-2.1c0.9-0.4,1.9-0.6,2.8-0.6c1.6,0,3,0.6,4,1.7 | ||||
| 				c1.4,1.6,2,4.2,1.6,7.5c-1,8.1-5.7,8.7-7.1,8.7c-0.9,0-1.9-0.2-2.8-0.6c-1.3-0.6-2.2-1.5-2.8-2.2c0,0-0.1-0.1-0.1-0.1 | ||||
| 				c-0.7,1.3-1.5,4.3-1.8,8.7h11c1.5,0,2.8-0.2,4-0.7c1.2-0.5,2.2-1.1,3-1.9c0.8-0.8,1.4-1.8,1.9-2.9c0.5-1.2,0.7-2.5,0.7-4v-9.5 | ||||
| 				C42.6,22.3,42.4,20.9,41.9,19.7z M23.6,31.3c1.4,0,2.2,2.2,4,3c2.4,1.1,5.7,0.2,6.5-6.2c0.8-6.4-2.4-7.3-5-6.2 | ||||
| 				c-2,0.8-3.3,3-4.7,3c-1.8,0-2.6-4.1-1.5-10.8h-2.1c-1.5,0-2.8,0.2-4,0.7c-1.2,0.5-2.2,1.1-3,1.9c-0.8,0.8-1.5,1.8-1.9,3 | ||||
| 				c-0.5,1.2-0.7,2.5-0.7,4v9.5c0,1.5,0.2,2.9,0.7,4c0.5,1.2,1.1,2.1,1.9,2.9c0.8,0.8,1.8,1.4,3,1.9c0.8,0.3,1.7,0.5,2.7,0.6 | ||||
| 				C19.9,35.7,21.8,31.3,23.6,31.3z"/> | ||||
| 		</g> | ||||
| 		<g> | ||||
| 			<path fill="#4F79F7" d="M425,3.6l-8.4,46.9c-0.2,0.9-0.6,1.7-1.3,2.4c-0.7,0.7-1.4,1.1-2.4,1.3c-1,0.2-1.9,0.1-2.7-0.3 | ||||
| 				c-0.8-0.4-1.5-1-2-1.7l-16.6-27.3L375,52.2c-0.4,0.7-0.9,1.2-1.6,1.6s-1.4,0.6-2.2,0.6c-1.1,0-2.1-0.3-2.9-1 | ||||
| 				c-0.8-0.7-1.3-1.6-1.5-2.7l-8.4-46.9h9.2l6,33l14.3-22.8c0.4-0.7,0.9-1.2,1.6-1.6c0.7-0.4,1.4-0.6,2.2-0.6c0.8,0,1.5,0.2,2.2,0.6 | ||||
| 				c0.7,0.4,1.2,0.9,1.7,1.6l14.2,22.8l6-33H425z"/> | ||||
| 			<path fill="#4F79F7" d="M509,40.9c0,0.9-0.1,1.8-0.3,2.7c-0.2,1-0.5,1.9-0.9,2.8c-0.4,0.9-1,1.8-1.6,2.7 | ||||
| 				c-0.7,0.9-1.5,1.6-2.4,2.3c-0.9,0.7-2,1.2-3.3,1.6c-1.2,0.4-2.6,0.6-4.2,0.6h-16.4c-0.9,0-1.8-0.1-2.7-0.3 | ||||
| 				c-1-0.2-1.9-0.5-2.8-0.9c-0.9-0.4-1.8-1-2.7-1.6c-0.9-0.7-1.6-1.5-2.3-2.4c-0.7-0.9-1.2-2-1.6-3.3c-0.4-1.2-0.6-2.6-0.6-4.2V0 | ||||
| 				h9.1v40.9c0,1.1,0.3,2,1,2.7c0.7,0.7,1.6,1,2.6,1h16.4c1.1,0,2-0.3,2.7-1c0.6-0.7,1-1.6,1-2.7V28.7c0-1.1-0.3-2-1-2.7 | ||||
| 				c-0.7-0.6-1.5-1-2.6-1h-16.4v-9.1h16.4c0.9,0,1.8,0.1,2.7,0.3c1,0.2,1.9,0.5,2.8,0.9c0.9,0.4,1.8,1,2.7,1.6 | ||||
| 				c0.9,0.7,1.6,1.5,2.3,2.4c0.7,0.9,1.2,2,1.6,3.3c0.4,1.2,0.6,2.6,0.6,4.2V40.9z"/> | ||||
| 			<path fill="#4F79F7" d="M465.1,28.3c0,1.3-0.2,2.6-0.7,4c-0.4,1.4-1.2,2.8-2.1,4c-1,1.2-2.3,2.3-3.9,3.1 | ||||
| 				c-1.6,0.8-3.5,1.3-5.8,1.3h-16.3v-8.6h16.3c1.2,0,2.2-0.4,2.8-1.1c0.7-0.8,1-1.7,1-2.8c0-1.2-0.4-2.1-1.1-2.8 | ||||
| 				c-0.8-0.7-1.7-1-2.7-1h-16.3c-1.2,0-2.2,0.4-2.9,1.1c-0.7,0.8-1,1.7-1,2.8V41c0,1.2,0.4,2.1,1.1,2.8c0.8,0.7,1.7,1,2.8,1H460v8.6 | ||||
| 				h-23.7c-1.3,0-2.6-0.2-4-0.7c-1.4-0.4-2.8-1.2-4-2.1c-1.2-1-2.3-2.3-3.1-3.9c-0.8-1.6-1.2-3.5-1.2-5.8V28.3c0-1.3,0.2-2.6,0.7-4 | ||||
| 				c0.4-1.4,1.2-2.8,2.1-4c1-1.2,2.3-2.3,3.9-3.1c1.6-0.8,3.5-1.3,5.8-1.3h16.3c1.3,0,2.6,0.2,4,0.7c1.4,0.4,2.8,1.2,4,2.1 | ||||
| 				c1.2,1,2.3,2.3,3.1,3.9C464.6,24.1,465.1,26.1,465.1,28.3z"/> | ||||
| 		</g> | ||||
| 	</g> | ||||
| </g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 6.6 KiB |