mirror of
https://github.com/nasa/openmct.git
synced 2025-06-26 19:12:02 +00:00
Compare commits
687 Commits
open683
...
api-tutori
Author | SHA1 | Date | |
---|---|---|---|
b4dc50295c | |||
382dde300a | |||
02aa08a3ef | |||
c95d9c7956 | |||
b1b8df4d87 | |||
bd3c6665fb | |||
10e90519c0 | |||
d341a8be97 | |||
8c439d8109 | |||
9c88b7ce1d | |||
2463e4d59f | |||
d73c505bea | |||
831ecc59d9 | |||
1de26d3c5d | |||
11409ce509 | |||
93872ce074 | |||
8861644f2d | |||
d4948f771b | |||
8295a0bed1 | |||
0656a298da | |||
fe2ce91d50 | |||
14f30b2489 | |||
62d90a8114 | |||
87682607a5 | |||
7bf265b478 | |||
1d31fe8d02 | |||
bfdbc71e40 | |||
1147f3aa47 | |||
719f9f45e8 | |||
95ef70a24c | |||
d5aa998b4c | |||
7890fcae69 | |||
18843cee48 | |||
1879c122c7 | |||
d7ddb96c4e | |||
b55668426d | |||
5b656faa9d | |||
8d2c489fa9 | |||
4366b0870d | |||
47a543beb7 | |||
06f87c1472 | |||
c9c41cdcc8 | |||
14a56ea17e | |||
b2e7db71cc | |||
d51e6bfd92 | |||
d475d767d5 | |||
a63e053399 | |||
370b515c23 | |||
4a50f325cb | |||
dbe6a4efc1 | |||
13920d8802 | |||
b6a8c514aa | |||
e4a4704baa | |||
be0029e59a | |||
9cb273ef0a | |||
eec9b1cf4c | |||
1f96e84542 | |||
c289a27305 | |||
c944080790 | |||
96316de6e4 | |||
2240a87ddc | |||
d891affe48 | |||
21a618d1ce | |||
5de7a96ccc | |||
09a833f524 | |||
580a4e52b5 | |||
9c4e17bfab | |||
d3e5d95d6b | |||
c70793ac2d | |||
a6ef1d3423 | |||
4ca2f51d5e | |||
86ac80ddbd | |||
0525ba6b0b | |||
a79e958ffc | |||
03cb0ccb57 | |||
7205faa6bb | |||
136f2ae785 | |||
a07e2fb8e5 | |||
55b531bdeb | |||
7ece5897e8 | |||
a29c7a6eab | |||
c4fec1af6a | |||
a6996df3df | |||
0c660238f2 | |||
b73b824e55 | |||
1954d98628 | |||
7aa034ce23 | |||
385dc5d298 | |||
a88b4b31a1 | |||
04112956cf | |||
f1113fda24 | |||
33c208d8fe | |||
c557fb6cd5 | |||
bde2bc7709 | |||
5fe759aa91 | |||
a5b7badb95 | |||
eefd4c8669 | |||
7c11f2db4f | |||
7501f679f7 | |||
52e087d8f8 | |||
c5cd495fce | |||
37a417051d | |||
97d819739c | |||
3935378b0c | |||
952f95aa4c | |||
0a75a5be1f | |||
70b593e28a | |||
ed69a65f9b | |||
05b4f5401e | |||
2ff0c7b06a | |||
2330f1d135 | |||
ff92d3acab | |||
32d7187db6 | |||
00534f8af7 | |||
3795570938 | |||
362248a02e | |||
16d20eabd2 | |||
eb5566f041 | |||
757da1dff4 | |||
85432af187 | |||
f0ab817e87 | |||
96af931c0b | |||
9a5209f7c2 | |||
0818a7cda0 | |||
f35947361c | |||
9a8bcc0550 | |||
eff46b076c | |||
ab64b682c3 | |||
1c007ea256 | |||
6c1412784b | |||
6e7f4df5e3 | |||
5b6ea600ba | |||
fd9d766913 | |||
b6502e9ea1 | |||
25a2321578 | |||
6fb36374f6 | |||
9861e63589 | |||
bce5643994 | |||
ad5691142e | |||
e468080373 | |||
c98c36753c | |||
1419ff86e8 | |||
601bc03ba2 | |||
ea454d65bb | |||
776586ae25 | |||
78bf804e02 | |||
2a4004fd5b | |||
b5229d7786 | |||
20ecf168f2 | |||
dc348f33c5 | |||
b7cfaf6b63 | |||
34d5bc4f28 | |||
e4b192001f | |||
516b8c9e38 | |||
f9631ff4c5 | |||
fa77139077 | |||
f12b9704d9 | |||
edb158f2d3 | |||
b2c6db6207 | |||
bcdd835275 | |||
5b4952d4c6 | |||
de43aa81be | |||
5eff4e45c9 | |||
70a13a75d5 | |||
dcf26d3863 | |||
a729edd399 | |||
69cc1086df | |||
18fa9aeaf6 | |||
96892722a4 | |||
54a0de4a08 | |||
a11dba88b2 | |||
d08cdfba49 | |||
031a46aa8e | |||
ffacf6e1ae | |||
69c4c3a2c8 | |||
c305fba0a7 | |||
44f4a82fa1 | |||
5bf750c90c | |||
836b5db8cf | |||
1753a5473c | |||
d00e13e4ee | |||
4b786d3536 | |||
e6bbc3442b | |||
433dd87e51 | |||
cf9eb3f602 | |||
bd686790dc | |||
e5ef7c0c22 | |||
3d891073da | |||
116c6e57ed | |||
a39ce566d1 | |||
671ba66354 | |||
a5ba72582c | |||
73c2c01def | |||
7c82e31b66 | |||
a58fe1f81c | |||
2829b8d495 | |||
3727b287a1 | |||
c448753bab | |||
7ade873365 | |||
8788523c25 | |||
c301523156 | |||
46e1347dc8 | |||
f5539ec678 | |||
2e8604e18d | |||
9ed28a4a37 | |||
3ca9d21bbd | |||
61683800cc | |||
4c74391137 | |||
f3b265bdd5 | |||
cae85f3e30 | |||
ab6ef22363 | |||
09d1c2cd4b | |||
d6aa31e4aa | |||
3efaa3b1cb | |||
2fe9698ea8 | |||
1cdeccc7a7 | |||
00433f02bc | |||
7fad4e9ea1 | |||
c6d326bbbc | |||
d60bc08843 | |||
3d62cba1b3 | |||
1c6ef28b80 | |||
00706558f5 | |||
5279c842f5 | |||
431b836568 | |||
de2703ee48 | |||
01f290dc45 | |||
ff36d9ee80 | |||
a13d0b7fab | |||
0390f46460 | |||
9e5689f7dd | |||
0ccb696ee2 | |||
d385e55e76 | |||
6bf1ef5bcc | |||
abb511521b | |||
11cfb6e1b8 | |||
3a9b1ee901 | |||
8b390e7fb9 | |||
29bce69eea | |||
aac5a6d250 | |||
06436c488a | |||
8b7af43d6c | |||
abb47eed36 | |||
027d86ef4b | |||
6cb9619fbe | |||
8c3616da32 | |||
ffd5faf9a2 | |||
00bf05c929 | |||
b682cf8340 | |||
22a5122ab7 | |||
7a7877d7c4 | |||
69c059c943 | |||
6d58f23c0c | |||
26e368f52d | |||
1d78af8f1d | |||
d48871f204 | |||
519a9333ab | |||
2fe7ba982f | |||
7f108c3b24 | |||
6322964dec | |||
1bb6e17829 | |||
f34e8ba61b | |||
2fb9b65652 | |||
0c6b4a5a23 | |||
20672ad028 | |||
99ba9edb95 | |||
23a8c305c1 | |||
934eb13813 | |||
a224711dce | |||
c1ae68b565 | |||
9351285182 | |||
aa45e53440 | |||
f6a9c90cef | |||
0b11ddbcfd | |||
5088453712 | |||
5e44bfc6c7 | |||
c591ade479 | |||
8f4f0cb78e | |||
e87280aa15 | |||
e0a2d02d23 | |||
ddc241c0d0 | |||
73012233b8 | |||
339916ccd4 | |||
70acef6905 | |||
da09ffd3fa | |||
5b98da6681 | |||
2040abb768 | |||
d35fccbbe8 | |||
06c6832676 | |||
f49552779a | |||
200a426f17 | |||
e068173f3e | |||
4441e88769 | |||
254a944d7a | |||
0c00061cbc | |||
dee0613b81 | |||
6b6bada700 | |||
530b940a64 | |||
e23bf5ed39 | |||
6ecea9950d | |||
4816dddf41 | |||
cae775f9bc | |||
a4b79cdb5b | |||
012a38cccd | |||
a01f7ddd2d | |||
e7e91e21fc | |||
cbea842c8b | |||
cc5d14deec | |||
4c5217d646 | |||
5e54b193ca | |||
cd7ff8ad85 | |||
fa5d59bff8 | |||
ddbb72b88a | |||
88784d37fd | |||
700e605bbd | |||
594f3b8ec2 | |||
b08d00ef3e | |||
0643fb1f3f | |||
289debf19d | |||
7da1a4b2a3 | |||
528169de2c | |||
c13231b8e8 | |||
3e4a3aeb9b | |||
650ef9bfa4 | |||
dd053f7e6e | |||
cb655d486b | |||
3c52ceb71a | |||
b2337dea97 | |||
dea6554e04 | |||
31d8c9a48f | |||
f8682a7a29 | |||
e5544615cc | |||
ec0cc572f6 | |||
6c2a28aba2 | |||
baccd005dc | |||
1e4ff5a73f | |||
9f29382e18 | |||
5f6b4adcda | |||
d6ab70447e | |||
a411bac331 | |||
5624c7d545 | |||
007741b4e7 | |||
e0a69744e5 | |||
e7a6c34bcc | |||
7f3ac4077c | |||
7eaffdc34a | |||
5034e88656 | |||
aa48044345 | |||
d12111d9b8 | |||
9c9db3c24f | |||
3fe41575bd | |||
8fa030437e | |||
17faf000b0 | |||
90c82f6ef2 | |||
5e6fe16b93 | |||
f0ca6fdfdb | |||
ad4c456ca2 | |||
b0476edb8c | |||
8f6a287fb8 | |||
07d554d114 | |||
24d2cecdcd | |||
8efa9c6aac | |||
22e98274ca | |||
471b57f47c | |||
9c775c6715 | |||
1f09b7b0ac | |||
b0cf9bbd29 | |||
4a1ca25e17 | |||
cc97e567b6 | |||
53f03cddb7 | |||
da1e6750a0 | |||
3258342783 | |||
73b7365ae2 | |||
32a42bd679 | |||
324c2cac03 | |||
42ac657105 | |||
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 | |||
22be6bc860 | |||
ff5f37dfbe | |||
7c2ddf3926 | |||
134452582c | |||
fb56b3ad56 | |||
8b5a425da6 | |||
d6ec7e9ab8 | |||
e470451718 | |||
5920533637 | |||
7eb7027b67 | |||
c7f199a59e | |||
43176cfbb8 | |||
f34ef8c4c8 | |||
1cdbc11894 | |||
2be6b3f051 | |||
4f85616632 | |||
65095d18f2 | |||
a1a7b2b8ce | |||
bf232d0593 | |||
19c9fcd369 | |||
9526207af8 | |||
6aeb156a58 | |||
f380e43219 | |||
6289fe333b | |||
c00d77dcb1 | |||
56a91dfbaf | |||
f6898d16c9 | |||
72ef134750 | |||
a8f7bc01c3 | |||
2dabe0d3c4 | |||
dda0628621 | |||
91bf98b38d | |||
ac5ac8d34e | |||
9f840aa0fd | |||
377786caf9 | |||
bc8aafbb1f | |||
02b806ebe0 | |||
f092bfe653 | |||
28ae62b4ac | |||
91fb82d212 | |||
4a609943f9 | |||
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 | |||
53c60ee64f | |||
7d0de68db9 | |||
24c750b41e | |||
ab1c79f25d | |||
437b235361 | |||
6880c82719 | |||
645bd5743f | |||
273cf1c14f | |||
be031285b9 | |||
303e870b0d | |||
b42ccebd5a | |||
a444fc01ad | |||
a126e43286 | |||
32fc50bbd3 | |||
4adb075a2b | |||
d8b1e570d9 | |||
5033e2cdbb | |||
b40ac6f44f | |||
5292b27e7d | |||
3adc5f1e26 | |||
92e49d6b76 | |||
659d05f73a | |||
2f0fd8eebd | |||
882cf80ba9 | |||
8c1264ab22 | |||
cb0f191ab3 | |||
c07dc0ea8b | |||
c4d5643ea7 | |||
300d71ddc2 | |||
54c67b891c | |||
013690e0df | |||
8868b6a130 | |||
750a5648d2 | |||
cec6295d24 | |||
15eb4b047f | |||
3ae8fcc8b4 | |||
9371fcbc4c | |||
abf5f22155 | |||
f2903f4030 | |||
371669fbce | |||
68f3cd087d | |||
115ffe7963 | |||
e3a0cae5fd | |||
8bb5a47b88 | |||
f1b6d7f749 | |||
6fb6761abf | |||
c091063b83 | |||
2e65a6a63e | |||
43f6981ba1 | |||
b8206b8824 | |||
5f7f349f29 | |||
ef0a918b59 | |||
5fd1f6a055 | |||
d45c5e2ffb | |||
1fef6b30b7 | |||
461cc59b3e | |||
c038ccd0d2 | |||
e16b156d1d | |||
1f6284257e | |||
16bf800257 | |||
7fad2f6f2e | |||
73ca30e654 | |||
fc751b1332 | |||
cdc2a407dc | |||
14722a6ef5 | |||
0538d6e60f | |||
1fcf900271 | |||
183468fcbf | |||
9b11d95437 | |||
67d78772fa | |||
7f0f03e787 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,8 +4,11 @@
|
|||||||
*.tgz
|
*.tgz
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
|
|
||||||
|
# Compiled CSS, unless directly added
|
||||||
*.sass-cache
|
*.sass-cache
|
||||||
*COMPILE.css
|
*COMPILE.css
|
||||||
|
*.css
|
||||||
|
*.css.map
|
||||||
|
|
||||||
# Intellij project configuration files
|
# Intellij project configuration files
|
||||||
*.idea
|
*.idea
|
||||||
|
4
.jscsrc
4
.jscsrc
@ -1,3 +1,5 @@
|
|||||||
{
|
{
|
||||||
"preset": "crockford"
|
"preset": "crockford",
|
||||||
|
"requireMultipleVarDecl": false,
|
||||||
|
"requireVarDeclFirst": false
|
||||||
}
|
}
|
||||||
|
23
.jshintrc
23
.jshintrc
@ -1,4 +1,23 @@
|
|||||||
{
|
{
|
||||||
"validthis": true,
|
"bitwise": true,
|
||||||
"laxbreak": true
|
"browser": true,
|
||||||
|
"curly": true,
|
||||||
|
"eqeqeq": true,
|
||||||
|
"forin": true,
|
||||||
|
"freeze": true,
|
||||||
|
"funcscope": false,
|
||||||
|
"futurehostile": true,
|
||||||
|
"latedef": true,
|
||||||
|
"noarg": true,
|
||||||
|
"nocomma": true,
|
||||||
|
"nonbsp": true,
|
||||||
|
"nonew": true,
|
||||||
|
"predef": [
|
||||||
|
"define",
|
||||||
|
"Promise"
|
||||||
|
],
|
||||||
|
"shadow": "outer",
|
||||||
|
"strict": "implied",
|
||||||
|
"undef": true,
|
||||||
|
"unused": "vars"
|
||||||
}
|
}
|
||||||
|
114
API.md
Normal file
114
API.md
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
# Open MCT API
|
||||||
|
|
||||||
|
The Open MCT framework public api can be utilized by building the application (`gulp install`) and then copying the file from `dist/main.js` to your directory
|
||||||
|
of choice.
|
||||||
|
|
||||||
|
Open MCT supports AMD, CommonJS, and standard browser loading; it's easy to use
|
||||||
|
in your project.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Open MCT's goal is to allow you to browse, create, edit, and visualize all of the domain knowledge you need on a daily basis.
|
||||||
|
|
||||||
|
To do this, the main building block provided by Open MCT is the domain object-- the temperature sensor on the starboard solar panel, an overlay plot comparing the results of all temperature sensor, the command dictionary for a spacecraft, the individual commands in that dictionary, your "my documents" folder: all of these things are domain objects.
|
||||||
|
|
||||||
|
Domain objects have Types-- so a specific instrument temperature sensor is a "Telemetry Point," and turning on a drill for a certain duration of time is an "Activity". Types allow you to form an ontology of knowledge and provide an abstraction for grouping, visualizing, and interpreting data.
|
||||||
|
|
||||||
|
And then we have Views. Views allow you to visualize a domain object. Views can apply to specific domain objects; they may also apply to certain types of domain objects, or they may apply to everything. Views are simply a method of visualizing domain objects.
|
||||||
|
|
||||||
|
Regions allow you to specify what views are displayed for specific types of domain objects in response to different user actions-- for instance, you may want to display a different view while editing, or you may want to update the toolbar display when objects are selected. Regions allow you to map views to specific user actions.
|
||||||
|
|
||||||
|
Domain objects can be mutated and persisted, developers can create custom actions and apply them to domain objects, and many more things can be done. For more information, read on.
|
||||||
|
|
||||||
|
## The API
|
||||||
|
|
||||||
|
### `MCT.Type(options)`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
Returns a `typeInstance`. `options` is an object supporting the following properties:
|
||||||
|
|
||||||
|
* `metadata`: `object` defining metadata used in displaying the object; has the following properties:
|
||||||
|
* `label`: `string`, the human-readible name of the type. used in menus and inspector.
|
||||||
|
* `glyph`: `string`, the name of the icon to display for this type, used in labels.
|
||||||
|
* `description`: `string`, a human readible description of the object and what it is for.
|
||||||
|
* `initialize`: `function` which initializes new instances of this type. it is called with an object, should add any default properties to that object.
|
||||||
|
* `creatable`: `boolean`, if true, this object will be visible in the create menu.
|
||||||
|
* `form`: `Array` an array of form fields, as defined... somewhere! Generates a property sheet that is visible while editing this object.
|
||||||
|
|
||||||
|
### `MCT.type(typeKey, typeInstance)`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
Register a `typeInstance` with a given Type `key` (a `string`). There can only be one `typeInstance` registered per type `key`. typeInstances must be registered before they can be utilized.
|
||||||
|
|
||||||
|
### `MCT.Objects`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
Allows you to register object providers, which allows you to integrate domain objects from various different sources. Also implements methods for mutation and persistence of objects. See [Object API](src/api/objects/README.md) for more details.
|
||||||
|
|
||||||
|
### `MCT.Composition`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
Objects can contain other objects, and the Composition API allows you to fetch the composition of any given domain object, or implement custom methods for defining composition as necessary.
|
||||||
|
|
||||||
|
### `MCT.view(region, definition)`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
Register a view factory for a specific region. View factories receive an instance of a domain object and return a `View` for that object, or return undefined if they do not know how to generate a view for that object.
|
||||||
|
|
||||||
|
* `ViewDefinition`: an object with the following properties:
|
||||||
|
* `canView(domainObject)`: should return truthy if the view is valid for a given domain object, falsy if it is not capable of generating a view for that object.
|
||||||
|
* `view(domainObject)`: should instantate and return a `View` for the given object.
|
||||||
|
* `metadata()`: a function that returns metadata about this view. Optional.
|
||||||
|
* `View`: an object containing a number of lifecycle methods:
|
||||||
|
* `view.show(container)`: instantiate a view (a set of dom elements) and attach it to the container.
|
||||||
|
* `view.destroy(container)`: remove any listeners and expect your dom elements to be destroyed.
|
||||||
|
|
||||||
|
For a basic introduction to views & types, check out these tutorials:
|
||||||
|
|
||||||
|
* [custom-view](custom-view.html) -- Implementing a custom view with vanilla javascript.
|
||||||
|
* [custom-view-react](custom-view-react.html) -- Implementing a custom view with React.
|
||||||
|
|
||||||
|
### `MCT.conductor`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
The time conductor is an API that facilitates time synchronization across multiple components. Components that would like to be "time aware" may attach listeners to the time conductor API to allow them to remain synchronized with other components. For more information ont he time conductor API, please look at the API draft here: https://github.com/nasa/openmct/blob/66220b89ca568075f107505ba414de9457dc0427/platform/features/conductor-redux/src/README.md
|
||||||
|
|
||||||
|
### `MCT.selection`
|
||||||
|
Status: First Draft
|
||||||
|
|
||||||
|
Tracks the application's selection state (which elements of a view has a user selected?)
|
||||||
|
|
||||||
|
One or more JavaScript objects may be selected at any given time. User code is responsible for any necessary type-checking.
|
||||||
|
|
||||||
|
The following methods are exposed from this object:
|
||||||
|
|
||||||
|
* `select(value)`: Add `value` to the current selection.
|
||||||
|
* `deselect(value)`: Remove `value` from the current selection.
|
||||||
|
* `selected()`: Get array of all selected objects.
|
||||||
|
* `clear()`: Deselect all selected objects.
|
||||||
|
|
||||||
|
MCT.selection is an EventEmitter; a `change` event is emitted whenever the selection changes.
|
||||||
|
|
||||||
|
### `MCT.systems`
|
||||||
|
Status: Not Implemented, Needs to be ported from old system.
|
||||||
|
|
||||||
|
A registry for different time system definitions. Based upon the previous time format system which utilized the "formats" extension category.
|
||||||
|
|
||||||
|
### `MCT.run([container])`
|
||||||
|
Status: Stable Draft
|
||||||
|
|
||||||
|
Run the MCT application, loading the application into the `container`, a DOM element. If a container is not specified, the application is injected into the body of the page.
|
||||||
|
|
||||||
|
### `MCT.install(plugin)`
|
||||||
|
Status: Stable Draft
|
||||||
|
|
||||||
|
Install a plugin in MCT. Must be called before calling `run`. Plugins are functions which are invoked with the `MCT` instance as their first argument, and are expected to use the MCT public API to add functionality.
|
||||||
|
|
||||||
|
For an example of writing a plugin, check out [plugin-example.html](plugin-example.html)
|
||||||
|
|
||||||
|
### `MCT.setAssetPath(path)`
|
||||||
|
|
||||||
|
Sets the path (absolute or relative) at which the Open MCT static files are being hosted. The default value is '.'.
|
||||||
|
|
||||||
|
Note that this API is transitional and will be removed in a future version.
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
# Contributing to Open MCT Web
|
# Contributing to Open MCT
|
||||||
|
|
||||||
This document describes the process of contributing to Open MCT Web as well
|
This document describes the process of contributing to Open MCT as well
|
||||||
as the standards that will be applied when evaluating contributions.
|
as the standards that will be applied when evaluating contributions.
|
||||||
|
|
||||||
Please be aware that additional agreements will be necessary before we can
|
Please be aware that additional agreements will be necessary before we can
|
||||||
@ -21,9 +21,9 @@ The short version:
|
|||||||
|
|
||||||
## Contribution Process
|
## Contribution Process
|
||||||
|
|
||||||
Open MCT Web uses git for software version control, and for branching and
|
Open MCT uses git for software version control, and for branching and
|
||||||
merging. The central repository is at
|
merging. The central repository is at
|
||||||
https://github.com/nasa/openmctweb.git.
|
https://github.com/nasa/openmct.git.
|
||||||
|
|
||||||
### Roles
|
### Roles
|
||||||
|
|
||||||
@ -116,18 +116,18 @@ the merge back to the master branch.
|
|||||||
|
|
||||||
## Standards
|
## Standards
|
||||||
|
|
||||||
Contributions to Open MCT Web are expected to meet the following standards.
|
Contributions to Open MCT are expected to meet the following standards.
|
||||||
In addition, reviewers should use general discretion before accepting
|
In addition, reviewers should use general discretion before accepting
|
||||||
changes.
|
changes.
|
||||||
|
|
||||||
### Code Standards
|
### Code Standards
|
||||||
|
|
||||||
JavaScript sources in Open MCT Web must satisfy JSLint under its default
|
JavaScript sources in Open MCT must satisfy JSLint under its default
|
||||||
settings. This is verified by the command line build.
|
settings. This is verified by the command line build.
|
||||||
|
|
||||||
#### Code Guidelines
|
#### Code Guidelines
|
||||||
|
|
||||||
JavaScript sources in Open MCT Web should:
|
JavaScript sources in Open MCT should:
|
||||||
|
|
||||||
* Use four spaces for indentation. Tabs should not be used.
|
* Use four spaces for indentation. Tabs should not be used.
|
||||||
* Include JSDoc for any exposed API (e.g. public methods, constructors.)
|
* Include JSDoc for any exposed API (e.g. public methods, constructors.)
|
||||||
@ -159,7 +159,7 @@ JavaScript sources in Open MCT Web should:
|
|||||||
* Third, imperative statements.
|
* Third, imperative statements.
|
||||||
* Finally, the returned value.
|
* Finally, the returned value.
|
||||||
|
|
||||||
Deviations from Open MCT Web code style guidelines require two-party agreement,
|
Deviations from Open MCT code style guidelines require two-party agreement,
|
||||||
typically from the author of the change and its reviewer.
|
typically from the author of the change and its reviewer.
|
||||||
|
|
||||||
#### Code Example
|
#### Code Example
|
||||||
@ -260,7 +260,7 @@ these standards.
|
|||||||
|
|
||||||
## Issue Reporting
|
## Issue Reporting
|
||||||
|
|
||||||
Issues are tracked at https://github.com/nasa/openmctweb/issues
|
Issues are tracked at https://github.com/nasa/openmct/issues
|
||||||
|
|
||||||
Issues should include:
|
Issues should include:
|
||||||
|
|
||||||
|
122
LICENSES.md
122
LICENSES.md
@ -309,30 +309,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Modernizr
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://modernizr.com
|
|
||||||
|
|
||||||
* Version: 2.6.2
|
|
||||||
|
|
||||||
* Author: Faruk Ateş
|
|
||||||
|
|
||||||
* Description: Browser/device capability finding
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2009–2015
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Normalize.css
|
### Normalize.css
|
||||||
|
|
||||||
#### Info
|
#### Info
|
||||||
@ -416,6 +392,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
|
### Json.NET
|
||||||
|
|
||||||
#### Info
|
#### Info
|
||||||
|
24
README.md
24
README.md
@ -1,6 +1,6 @@
|
|||||||
# Open MCT Web
|
# Open MCT
|
||||||
|
|
||||||
Open MCT Web is a web-based platform for mission operations user interface
|
Open MCT is a web-based platform for mission operations user interface
|
||||||
software.
|
software.
|
||||||
|
|
||||||
## Bundles
|
## Bundles
|
||||||
@ -8,7 +8,7 @@ software.
|
|||||||
A bundle is a group of software components (including source code, declared
|
A bundle is a group of software components (including source code, declared
|
||||||
as AMD modules, as well as resources such as images and HTML templates)
|
as AMD modules, as well as resources such as images and HTML templates)
|
||||||
that are intended to be added or removed as a single unit. A plug-in for
|
that are intended to be added or removed as a single unit. A plug-in for
|
||||||
Open MCT Web will be expressed as a bundle; platform components are also
|
Open MCT will be expressed as a bundle; platform components are also
|
||||||
expressed as bundles.
|
expressed as bundles.
|
||||||
|
|
||||||
A bundle is also just a directory which contains a file `bundle.json`,
|
A bundle is also just a directory which contains a file `bundle.json`,
|
||||||
@ -16,7 +16,7 @@ which declares its contents.
|
|||||||
|
|
||||||
The file `bundles.json` (note the plural), at the top level of the
|
The file `bundles.json` (note the plural), at the top level of the
|
||||||
repository, is a JSON file containing an array of all bundles (expressed as
|
repository, is a JSON file containing an array of all bundles (expressed as
|
||||||
directory names) to include in a running instance of Open MCT Web. Adding or
|
directory names) to include in a running instance of Open MCT. Adding or
|
||||||
removing paths from this list will add or remove bundles from the running
|
removing paths from this list will add or remove bundles from the running
|
||||||
application.
|
application.
|
||||||
|
|
||||||
@ -45,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
|
The tests described above are all at the unit-level; an additional
|
||||||
test suite using [Protractor](https://angular.github.io/protractor/)
|
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:
|
To run:
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ To run:
|
|||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
Open MCT Web is built using [`npm`](http://npmjs.com/)
|
Open MCT is built using [`npm`](http://npmjs.com/)
|
||||||
and [`gulp`](http://gulpjs.com/).
|
and [`gulp`](http://gulpjs.com/).
|
||||||
|
|
||||||
To build:
|
To build:
|
||||||
@ -64,18 +64,18 @@ To build:
|
|||||||
`npm run prepublish`
|
`npm run prepublish`
|
||||||
|
|
||||||
This will compile and minify JavaScript sources, as well as copy over assets.
|
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
|
The contents of the `dist` folder will contain a runnable Open MCT
|
||||||
instance (e.g. by starting an HTTP server in that directory), including:
|
instance (e.g. by starting an HTTP server in that directory), including:
|
||||||
|
|
||||||
* A `main.js` file containing Open MCT Web source code.
|
* A `main.js` file containing Open MCT source code.
|
||||||
* Various assets in the `example` and `platform` directories.
|
* Various assets in the `example` and `platform` directories.
|
||||||
* An `index.html` that runs Open MCT Web in its default configuration.
|
* An `index.html` that runs Open MCT in its default configuration.
|
||||||
|
|
||||||
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
||||||
|
|
||||||
### Building Documentation
|
### Building Documentation
|
||||||
|
|
||||||
Open MCT Web's documentation is generated by an
|
Open MCT's documentation is generated by an
|
||||||
[npm](https://www.npmjs.com/)-based build. It has additional dependencies that
|
[npm](https://www.npmjs.com/)-based build. It has additional dependencies that
|
||||||
may not be available on every platform and thus is not covered in the standard
|
may not be available on every platform and thus is not covered in the standard
|
||||||
npm install. Ensure your system has [libcairo](http://cairographics.org/)
|
npm install. Ensure your system has [libcairo](http://cairographics.org/)
|
||||||
@ -89,7 +89,7 @@ Documentation will be generated in `target/docs`.
|
|||||||
|
|
||||||
# Glossary
|
# Glossary
|
||||||
|
|
||||||
Certain terms are used throughout Open MCT Web with consistent meanings
|
Certain terms are used throughout Open MCT with consistent meanings
|
||||||
or conventions. Any deviations from the below are issues and should be
|
or conventions. Any deviations from the below are issues and should be
|
||||||
addressed (either by updating this glossary or changing code to reflect
|
addressed (either by updating this glossary or changing code to reflect
|
||||||
correct usage.) Other developer documentation, particularly in-line
|
correct usage.) Other developer documentation, particularly in-line
|
||||||
@ -112,7 +112,7 @@ documentation, may presume an understanding of these terms.
|
|||||||
(Most often used in the context of extensions, domain
|
(Most often used in the context of extensions, domain
|
||||||
object models, or other similar application-specific objects.)
|
object models, or other similar application-specific objects.)
|
||||||
* _domain object_: A meaningful object to the user; a distinct thing in
|
* _domain object_: A meaningful object to the user; a distinct thing in
|
||||||
the work support by Open MCT Web. Anything that appears in the left-hand
|
the work support by Open MCT. Anything that appears in the left-hand
|
||||||
tree is a domain object.
|
tree is a domain object.
|
||||||
* _extension_: An extension is a unit of functionality exposed to the
|
* _extension_: An extension is a unit of functionality exposed to the
|
||||||
platform in a declarative fashion by a bundle. For more
|
platform in a declarative fashion by a bundle. For more
|
||||||
|
15
app.js
15
app.js
@ -14,10 +14,12 @@
|
|||||||
options = require('minimist')(process.argv.slice(2)),
|
options = require('minimist')(process.argv.slice(2)),
|
||||||
express = require('express'),
|
express = require('express'),
|
||||||
app = express(),
|
app = express(),
|
||||||
fs = require('fs');
|
fs = require('fs'),
|
||||||
|
request = require('request');
|
||||||
|
|
||||||
// Defaults
|
// Defaults
|
||||||
options.port = options.port || options.p || 8080;
|
options.port = options.port || options.p || 8080;
|
||||||
|
options.directory = options.directory || options.D || '.';
|
||||||
['include', 'exclude', 'i', 'x'].forEach(function (opt) {
|
['include', 'exclude', 'i', 'x'].forEach(function (opt) {
|
||||||
options[opt] = options[opt] || [];
|
options[opt] = options[opt] || [];
|
||||||
// Make sure includes/excludes always end up as arrays
|
// Make sure includes/excludes always end up as arrays
|
||||||
@ -35,6 +37,7 @@
|
|||||||
console.log(" --port, -p <number> Specify port.");
|
console.log(" --port, -p <number> Specify port.");
|
||||||
console.log(" --include, -i <bundle> Include the specified bundle.");
|
console.log(" --include, -i <bundle> Include the specified bundle.");
|
||||||
console.log(" --exclude, -x <bundle> Exclude the specified bundle.");
|
console.log(" --exclude, -x <bundle> Exclude the specified bundle.");
|
||||||
|
console.log(" --directory, -D <bundle> Serve files from specified directory.");
|
||||||
console.log("");
|
console.log("");
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
@ -61,8 +64,16 @@
|
|||||||
res.send(JSON.stringify(bundles));
|
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
|
// Expose everything else as static files
|
||||||
app.use(express['static']('.'));
|
app.use(express['static'](options.directory));
|
||||||
|
|
||||||
// Finally, open the HTTP server
|
// Finally, open the HTTP server
|
||||||
app.listen(options.port);
|
app.listen(options.port);
|
||||||
|
14
bower.json
14
bower.json
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "openmctweb",
|
"name": "openmct",
|
||||||
"description": "The OpenMCTWeb core platform",
|
"description": "The Open MCT core platform",
|
||||||
"main": "",
|
"main": "",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"moduleType": [],
|
"moduleType": [],
|
||||||
"homepage": "http://nasa.github.io/openmctweb/",
|
"homepage": "http://nasa.github.io/openmct/",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"angular": "1.4.4",
|
"angular": "1.4.4",
|
||||||
@ -15,6 +15,12 @@
|
|||||||
"text": "requirejs-text#^2.0.14",
|
"text": "requirejs-text#^2.0.14",
|
||||||
"es6-promise": "^3.0.2",
|
"es6-promise": "^3.0.2",
|
||||||
"screenfull": "^3.0.0",
|
"screenfull": "^3.0.0",
|
||||||
"node-uuid": "^1.4.7"
|
"node-uuid": "^1.4.7",
|
||||||
|
"comma-separated-values": "^3.6.4",
|
||||||
|
"FileSaver.js": "^0.0.2",
|
||||||
|
"zepto": "^1.1.6",
|
||||||
|
"eventemitter3": "^1.2.0",
|
||||||
|
"lodash": "3.10.1",
|
||||||
|
"almond": "~0.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,17 +22,19 @@
|
|||||||
#* at runtime from the About dialog for additional information.
|
#* at runtime from the About dialog for additional information.
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
# Script to build and deploy docs to github pages.
|
# Script to build and deploy docs.
|
||||||
|
|
||||||
OUTPUT_DIRECTORY="target/docs"
|
OUTPUT_DIRECTORY="target/docs"
|
||||||
REPOSITORY_URL="git@github.com:nasa/openmctweb.git"
|
# Docs, once built, are pushed to the private website repo
|
||||||
|
REPOSITORY_URL="git@github.com:nasa/openmct-website.git"
|
||||||
|
WEBSITE_DIRECTORY="website"
|
||||||
|
|
||||||
BUILD_SHA=`git rev-parse head`
|
BUILD_SHA=`git rev-parse HEAD`
|
||||||
|
|
||||||
# A remote will be created for the git repository we are pushing to.
|
# A remote will be created for the git repository we are pushing to.
|
||||||
# Don't worry, as this entire directory will get trashed inbetween builds.
|
# Don't worry, as this entire directory will get trashed inbetween builds.
|
||||||
REMOTE_NAME="documentation"
|
REMOTE_NAME="documentation"
|
||||||
WEBSITE_BRANCH="gh-pages"
|
WEBSITE_BRANCH="master"
|
||||||
|
|
||||||
# Clean output directory, JSDOC will recreate
|
# Clean output directory, JSDOC will recreate
|
||||||
if [ -d $OUTPUT_DIRECTORY ]; then
|
if [ -d $OUTPUT_DIRECTORY ]; then
|
||||||
@ -40,23 +42,21 @@ if [ -d $OUTPUT_DIRECTORY ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
npm run docs
|
npm run docs
|
||||||
cd $OUTPUT_DIRECTORY || exit 1
|
|
||||||
|
|
||||||
echo "git init"
|
echo "git clone $REPOSITORY_URL website"
|
||||||
git init
|
git clone $REPOSITORY_URL website || exit 1
|
||||||
|
echo "cp -r $OUTPUT_DIRECTORY $WEBSITE_DIRECTORY/docs"
|
||||||
|
cp -r $OUTPUT_DIRECTORY $WEBSITE_DIRECTORY/docs
|
||||||
|
echo "cd $WEBSITE_DIRECTORY"
|
||||||
|
cd $WEBSITE_DIRECTORY || exit 1
|
||||||
|
|
||||||
# Configure github for CircleCI user.
|
# Configure github for CircleCI user.
|
||||||
git config user.email "buildbot@circleci.com"
|
git config user.email "buildbot@circleci.com"
|
||||||
git config user.name "BuildBot"
|
git config user.name "BuildBot"
|
||||||
|
|
||||||
echo "git remote add $REMOTE_NAME $REPOSITORY_URL"
|
|
||||||
git remote add $REMOTE_NAME $REPOSITORY_URL
|
|
||||||
echo "git add ."
|
echo "git add ."
|
||||||
git add .
|
git add .
|
||||||
echo "git commit -m \"Generate docs from build $BUILD_SHA\""
|
echo "git commit -m \"Docs updated from build $BUILD_SHA\""
|
||||||
git commit -m "Generate docs from build $BUILD_SHA"
|
git commit -m "Docs updated from build $BUILD_SHA"
|
||||||
|
# Push to the website repo
|
||||||
echo "git push $REMOTE_NAME HEAD:$WEBSITE_BRANCH -f"
|
git push
|
||||||
git push $REMOTE_NAME HEAD:$WEBSITE_BRANCH -f
|
|
||||||
|
|
||||||
echo "Documentation pushed to gh-pages branch."
|
|
||||||
|
16
circle.yml
16
circle.yml
@ -4,12 +4,22 @@ deployment:
|
|||||||
commands:
|
commands:
|
||||||
- npm install canvas nomnoml
|
- npm install canvas nomnoml
|
||||||
- ./build-docs.sh
|
- ./build-docs.sh
|
||||||
|
- git fetch --unshallow
|
||||||
- git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master
|
- git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master
|
||||||
openmctweb-staging-un:
|
openmct-demo:
|
||||||
branch: nem_prototype
|
branch: live_demo
|
||||||
heroku:
|
heroku:
|
||||||
appname: openmctweb-staging-un
|
appname: openmct-demo
|
||||||
openmctweb-staging-deux:
|
openmctweb-staging-deux:
|
||||||
branch: mobile
|
branch: mobile
|
||||||
heroku:
|
heroku:
|
||||||
appname: openmctweb-staging-deux
|
appname: openmctweb-staging-deux
|
||||||
|
test:
|
||||||
|
post:
|
||||||
|
- gulp lint
|
||||||
|
- gulp checkstyle
|
||||||
|
|
||||||
|
general:
|
||||||
|
branches:
|
||||||
|
ignore:
|
||||||
|
- gh-pages
|
||||||
|
65
composition-test.html
Normal file
65
composition-test.html
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Implementing a composition provider</title>
|
||||||
|
<script src="dist/main.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var widgetParts = ['foo', 'bar', 'baz', 'bing', 'frobnak']
|
||||||
|
|
||||||
|
function fabricateName() {
|
||||||
|
return [
|
||||||
|
widgetParts[Math.floor(Math.random() * widgetParts.length)],
|
||||||
|
widgetParts[Math.floor(Math.random() * widgetParts.length)],
|
||||||
|
Math.floor(Math.random() * 1000)
|
||||||
|
].join('_');
|
||||||
|
}
|
||||||
|
|
||||||
|
MCT.type('example.widget-factory', new MCT.Type({
|
||||||
|
metadata: {
|
||||||
|
label: "Widget Factory",
|
||||||
|
glyph: "s",
|
||||||
|
description: "A factory for making widgets"
|
||||||
|
},
|
||||||
|
initialize: function (object) {
|
||||||
|
object.widgetCount = 5;
|
||||||
|
object.composition = [];
|
||||||
|
},
|
||||||
|
creatable: true,
|
||||||
|
form: [
|
||||||
|
{
|
||||||
|
name: "Widget Count",
|
||||||
|
control: "textfield",
|
||||||
|
key: "widgetCount",
|
||||||
|
property: "widgetCount",
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
MCT.Composition.addProvider({
|
||||||
|
appliesTo: function (domainObject) {
|
||||||
|
return domainObject.type === 'example.widget-factory';
|
||||||
|
},
|
||||||
|
load: function (domainObject) {
|
||||||
|
var widgets = [];
|
||||||
|
while (widgets.length < domainObject.widgetCount) {
|
||||||
|
widgets.push({
|
||||||
|
name: fabricateName(),
|
||||||
|
key: {
|
||||||
|
namespace: 'widget-factory',
|
||||||
|
identifier: '' + widgets.length
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return Promise.resolve(widgets);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
MCT.run();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
144
custom-view-react.html
Normal file
144
custom-view-react.html
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Implementing a Custom Type and View </title>
|
||||||
|
<script src="dist/main.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.2.1/react.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.2.1/react-dom.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script type="text/babel">
|
||||||
|
|
||||||
|
// First, we're going to create the Todo List type, so that users can create
|
||||||
|
// todo lists.
|
||||||
|
|
||||||
|
MCT.type('example.todo', new MCT.Type({
|
||||||
|
metadata: {
|
||||||
|
label: "To-Do List",
|
||||||
|
glyph: "2",
|
||||||
|
description: "A list of things that need to be done."
|
||||||
|
},
|
||||||
|
initialize: function (object) {
|
||||||
|
object.tasks = [
|
||||||
|
{ description: "This is a task." }
|
||||||
|
];
|
||||||
|
},
|
||||||
|
creatable: true
|
||||||
|
}));
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the page, and you should be able to create new Todo Lists.
|
||||||
|
unfortunately, when you navigate to a Todo list, you see a blank page. let's
|
||||||
|
fix that by adding a main view for that todo list.
|
||||||
|
|
||||||
|
If you're wondering why this is commented out, well, it's because we'll
|
||||||
|
write a new version later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Task = React.createClass({
|
||||||
|
render: function() {
|
||||||
|
return (
|
||||||
|
<li>
|
||||||
|
<input type="checkbox"
|
||||||
|
checked={this.props.checked}/>
|
||||||
|
<span>{this.props.description}</span>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var TaskList = React.createClass({
|
||||||
|
render: function () {
|
||||||
|
var taskNodes = this.props.tasks.map(function(task) {
|
||||||
|
return (
|
||||||
|
<Task checked={task.checked}
|
||||||
|
description={task.description}/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<ul>
|
||||||
|
{taskNodes}
|
||||||
|
</ul>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
MCT.view(MCT.regions.main, {
|
||||||
|
canView: function (domainObject) {
|
||||||
|
return domainObject.type === 'example.todo';
|
||||||
|
},
|
||||||
|
view: function (domainObject) {
|
||||||
|
var mutableObject = MCT.Objects.getMutable(domainObject);
|
||||||
|
|
||||||
|
return {
|
||||||
|
show: function (container) {
|
||||||
|
ReactDOM.render(
|
||||||
|
<TaskList tasks={domainObject.tasks}/>,
|
||||||
|
container
|
||||||
|
);
|
||||||
|
mutableObject.on('tasks', function (tasks) {
|
||||||
|
ReactDOM.render(
|
||||||
|
<TaskList tasks={tasks}/>,
|
||||||
|
container
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the page and you should see a todo list with checkboxes! Now let's
|
||||||
|
Allow you to add tasks by mutating the object. We'll add a toolbar view to
|
||||||
|
do this.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var TaskToolbar = React.createClass({
|
||||||
|
render: function () {
|
||||||
|
return (
|
||||||
|
<button onClick={this.props.addTask}>Add Task</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
MCT.view(MCT.regions.toolbar, {
|
||||||
|
canView: function (domainObject) {
|
||||||
|
return domainObject.type === 'example.todo';
|
||||||
|
},
|
||||||
|
view: function (domainObject) {
|
||||||
|
var mutableObject = MCT.Objects.getMutable(domainObject);
|
||||||
|
|
||||||
|
function addTask(event) {
|
||||||
|
var description = prompt('Task description');
|
||||||
|
var tasks = mutableObject.get('tasks');
|
||||||
|
tasks.push({
|
||||||
|
description: description,
|
||||||
|
complete: false
|
||||||
|
});
|
||||||
|
mutableObject.set('tasks', tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
show: function (container) {
|
||||||
|
ReactDOM.render(
|
||||||
|
<TaskToolbar addTask={addTask}/>,
|
||||||
|
container
|
||||||
|
);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the page, edit the todo list, and you'll have a button that allows
|
||||||
|
you to add tasks! Unfortunately, new tasks don't show in the list. Why?
|
||||||
|
Well, if your view should update on mutation, you need to set up the correct
|
||||||
|
listeners. Let's update the TodoView we made earlier:
|
||||||
|
*/
|
||||||
|
|
||||||
|
MCT.run();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
160
custom-view.html
Normal file
160
custom-view.html
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Implementing a Custom Type and View </title>
|
||||||
|
<script src="dist/main.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// First, we're going to create the Todo List type, so that users can create
|
||||||
|
// todo lists.
|
||||||
|
|
||||||
|
MCT.type('example.todo', new MCT.Type({
|
||||||
|
metadata: {
|
||||||
|
label: "To-Do List",
|
||||||
|
glyph: "2",
|
||||||
|
description: "A list of things that need to be done."
|
||||||
|
},
|
||||||
|
initialize: function (object) {
|
||||||
|
object.tasks = [
|
||||||
|
{ description: "This is a task." }
|
||||||
|
];
|
||||||
|
},
|
||||||
|
creatable: true
|
||||||
|
}));
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the page, and you should be able to create new Todo Lists.
|
||||||
|
unfortunately, when you navigate to a Todo list, you see a blank page. let's
|
||||||
|
fix that by adding a main view for that todo list.
|
||||||
|
|
||||||
|
If you're wondering why this is commented out, well, it's because we'll
|
||||||
|
write a new version later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// MCT.view(MCT.regions.main, {
|
||||||
|
// canView: function (domainObject) {
|
||||||
|
// return domainObject.type === 'example.todo';
|
||||||
|
// },
|
||||||
|
// view: function (domainObject) {
|
||||||
|
// function renderTask(task) {
|
||||||
|
// return [
|
||||||
|
// '<li>',
|
||||||
|
// '<input type="checkbox"' + (task.complete ? ' checked="true"' : '') + '>',
|
||||||
|
// '<span>' + task.description + '</span>',
|
||||||
|
// '</li>'
|
||||||
|
// ].join('');
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// function renderTaskList() {
|
||||||
|
// return [
|
||||||
|
// '<ul>',
|
||||||
|
// domainObject.tasks.map(renderTask).join(''),
|
||||||
|
// '</ul>'
|
||||||
|
// ].join('');
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// return {
|
||||||
|
// show: function (container) {
|
||||||
|
// container.innerHTML = renderTaskList();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the page and you should see a todo list with checkboxes! Now let's
|
||||||
|
Allow you to add tasks by mutating the object. We'll add a toolbar view to
|
||||||
|
do this.
|
||||||
|
*/
|
||||||
|
|
||||||
|
MCT.view(MCT.regions.toolbar, {
|
||||||
|
canView: function (domainObject) {
|
||||||
|
return domainObject.type === 'example.todo';
|
||||||
|
},
|
||||||
|
view: function (domainObject) {
|
||||||
|
var mutableObject = MCT.Objects.getMutable(domainObject);
|
||||||
|
|
||||||
|
function addTask(event) {
|
||||||
|
var description = prompt('Task description');
|
||||||
|
var tasks = mutableObject.get('tasks');
|
||||||
|
tasks.push({
|
||||||
|
description: description,
|
||||||
|
complete: false
|
||||||
|
});
|
||||||
|
mutableObject.set('tasks', tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
show: function (container) {
|
||||||
|
container.addEventListener('click', addTask);
|
||||||
|
container.innerHTML = '<button>Add Task</button>';
|
||||||
|
},
|
||||||
|
destroy: function (container) {
|
||||||
|
container.removeEventListener('click', addTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the page, edit the todo list, and you'll have a button that allows
|
||||||
|
you to add tasks! Unfortunately, new tasks don't show in the list. Why?
|
||||||
|
Well, if your view should update on mutation, you need to set up the correct
|
||||||
|
listeners. Let's update the TodoView we made earlier:
|
||||||
|
*/
|
||||||
|
|
||||||
|
MCT.view(MCT.regions.main, {
|
||||||
|
canView: function(domainObject) {
|
||||||
|
return domainObject.type === 'example.todo'
|
||||||
|
},
|
||||||
|
view: function (domainObject) {
|
||||||
|
|
||||||
|
var mutableObject = MCT.Objects.getMutable(domainObject);
|
||||||
|
|
||||||
|
function renderTask(task) {
|
||||||
|
return [
|
||||||
|
'<li>',
|
||||||
|
'<input type="checkbox"' + (task.complete ? ' checked="true"' : '') + '>',
|
||||||
|
'<span>' + task.description + '</span>',
|
||||||
|
'</li>'
|
||||||
|
].join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderTaskList(tasks) {
|
||||||
|
return [
|
||||||
|
'<ul>',
|
||||||
|
tasks.map(renderTask).join(''),
|
||||||
|
'</ul>'
|
||||||
|
].join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
function onCheckboxChange(event) {
|
||||||
|
var checkbox = event.target;
|
||||||
|
var taskEl = checkbox.parentNode;
|
||||||
|
var taskList = taskEl.parentNode;
|
||||||
|
var taskIndex = [].slice.apply(taskList.children).indexOf(taskEl);
|
||||||
|
mutableObject.set('tasks[' + taskIndex + '].complete', checkbox.checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
show: function (container) {
|
||||||
|
container.innerHTML = renderTaskList(domainObject.tasks);
|
||||||
|
mutableObject.on('tasks', function (tasks) {
|
||||||
|
container.innerHTML = renderTaskList(tasks);
|
||||||
|
});
|
||||||
|
container.addEventListener('change', onCheckboxChange);
|
||||||
|
},
|
||||||
|
destroy: function () {
|
||||||
|
mutableObject.stopListening();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
MCT.run();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,9 +1,3 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<cite>
|
|
||||||
This document is styled using
|
|
||||||
<a href="https://github.com/jasonm23/markdown-css-themes">
|
|
||||||
https://github.com/jasonm23/markdown-css-themes
|
|
||||||
</a>.
|
|
||||||
</cite>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet"
|
<link rel="stylesheet"
|
||||||
href="http://jasonm23.github.io/markdown-css-themes/avenir-white.css">
|
href="//nasa.github.io/openmct/static/res/css/styles.css">
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="//nasa.github.io/openmct/static/res/css/documentation.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ software components to communicate. The software components it recognizes
|
|||||||
are:
|
are:
|
||||||
|
|
||||||
* _Extensions_: Individual units of functionality that can be added to
|
* _Extensions_: Individual units of functionality that can be added to
|
||||||
or removed from Open MCT Web. _Extension categories_ distinguish what
|
or removed from Open MCT. _Extension categories_ distinguish what
|
||||||
type of functionality is being added/removed.
|
type of functionality is being added/removed.
|
||||||
* _Bundles_: A grouping of related extensions
|
* _Bundles_: A grouping of related extensions
|
||||||
(named after an analogous concept from [OSGi](http://www.osgi.org/))
|
(named after an analogous concept from [OSGi](http://www.osgi.org/))
|
||||||
@ -19,7 +19,7 @@ manner which the framework layer can understand.
|
|||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
#direction: down
|
#direction: down
|
||||||
[Open MCT Web|
|
[Open MCT|
|
||||||
[Dependency injection framework]-->[Platform bundle #1]
|
[Dependency injection framework]-->[Platform bundle #1]
|
||||||
[Dependency injection framework]-->[Platform bundle #2]
|
[Dependency injection framework]-->[Platform bundle #2]
|
||||||
[Dependency injection framework]-->[Plugin bundle #1]
|
[Dependency injection framework]-->[Plugin bundle #1]
|
||||||
@ -35,7 +35,7 @@ manner which the framework layer can understand.
|
|||||||
```
|
```
|
||||||
|
|
||||||
The "dependency injection framework" in this case is
|
The "dependency injection framework" in this case is
|
||||||
[AngularJS](https://angularjs.org/). Open MCT Web's framework layer
|
[AngularJS](https://angularjs.org/). Open MCT's framework layer
|
||||||
is really just a thin wrapper over Angular that recognizes the
|
is really just a thin wrapper over Angular that recognizes the
|
||||||
concepts of bundles and extensions (as declared in JSON files) and
|
concepts of bundles and extensions (as declared in JSON files) and
|
||||||
registering extensions with Angular. It additionally acts as a
|
registering extensions with Angular. It additionally acts as a
|
||||||
@ -60,7 +60,7 @@ activities which were performed by the framework component.
|
|||||||
|
|
||||||
## Application Initialization
|
## Application Initialization
|
||||||
|
|
||||||
The framework component initializes an Open MCT Web application following
|
The framework component initializes an Open MCT application following
|
||||||
a simple sequence of steps.
|
a simple sequence of steps.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -97,7 +97,7 @@ a simple sequence of steps.
|
|||||||
[Extension]o->[Dependency #3]
|
[Extension]o->[Dependency #3]
|
||||||
```
|
```
|
||||||
|
|
||||||
Open MCT Web's architecture relies on a simple premise: Individual units
|
Open MCT's architecture relies on a simple premise: Individual units
|
||||||
(extensions) only have access to the dependencies they declare that they
|
(extensions) only have access to the dependencies they declare that they
|
||||||
need, and they acquire references to these dependencies via dependency
|
need, and they acquire references to these dependencies via dependency
|
||||||
injection. This has several desirable traits:
|
injection. This has several desirable traits:
|
||||||
@ -121,11 +121,11 @@ injection. This has several desirable traits:
|
|||||||
the framework.
|
the framework.
|
||||||
|
|
||||||
A drawback to this approach is that it makes it difficult to define
|
A drawback to this approach is that it makes it difficult to define
|
||||||
"the architecture" of Open MCT Web, in terms of describing the specific
|
"the architecture" of Open MCT, in terms of describing the specific
|
||||||
units that interact at run-time. The run-time architecture is determined
|
units that interact at run-time. The run-time architecture is determined
|
||||||
by the framework as the consequence of wiring together dependencies.
|
by the framework as the consequence of wiring together dependencies.
|
||||||
As such, the specific architecture of any given application built on
|
As such, the specific architecture of any given application built on
|
||||||
Open MCT Web can look very different.
|
Open MCT can look very different.
|
||||||
|
|
||||||
Keeping that in mind, there are a few useful patterns supported by the
|
Keeping that in mind, there are a few useful patterns supported by the
|
||||||
framework that are useful to keep in mind.
|
framework that are useful to keep in mind.
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# Introduction
|
# Introduction
|
||||||
|
|
||||||
The purpose of this document is to familiarize developers with the
|
The purpose of this document is to familiarize developers with the
|
||||||
overall architecture of Open MCT Web.
|
overall architecture of Open MCT.
|
||||||
|
|
||||||
The target audience includes:
|
The target audience includes:
|
||||||
|
|
||||||
* _Platform maintainers_: Individuals involved in developing,
|
* _Platform maintainers_: Individuals involved in developing,
|
||||||
extending, and maintaing capabilities of the platform.
|
extending, and maintaing capabilities of the platform.
|
||||||
* _Integration developers_: Individuals tasked with integrated
|
* _Integration developers_: Individuals tasked with integrated
|
||||||
Open MCT Web into a larger system, who need to understand
|
Open MCT into a larger system, who need to understand
|
||||||
its inner workings sufficiently to complete this integration.
|
its inner workings sufficiently to complete this integration.
|
||||||
|
|
||||||
As the focus of this document is on architecture, whenever possible
|
As the focus of this document is on architecture, whenever possible
|
||||||
@ -17,25 +17,25 @@ omitted. These details may be found in the developer guide.
|
|||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Open MCT Web is client software: It runs in a web browser and
|
Open MCT is client software: It runs in a web browser and
|
||||||
provides a user interface, while communicating with various
|
provides a user interface, while communicating with various
|
||||||
server-side resources through browser APIs.
|
server-side resources through browser APIs.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
#direction: right
|
#direction: right
|
||||||
[Client|[Browser|[Open MCT Web]->[Browser APIs]]]
|
[Client|[Browser|[Open MCT]->[Browser APIs]]]
|
||||||
[Server|[Web services]]
|
[Server|[Web services]]
|
||||||
[Client]<->[Server]
|
[Client]<->[Server]
|
||||||
```
|
```
|
||||||
|
|
||||||
While Open MCT Web can be configured to run as a standalone client,
|
While Open MCT can be configured to run as a standalone client,
|
||||||
this is rarely very useful. Instead, it is intended to be used as a
|
this is rarely very useful. Instead, it is intended to be used as a
|
||||||
display and interaction layer for information obtained from a
|
display and interaction layer for information obtained from a
|
||||||
variety of back-end services. Doing so requires authoring or utilizing
|
variety of back-end services. Doing so requires authoring or utilizing
|
||||||
adapter plugins which allow Open MCT Web to interact with these services.
|
adapter plugins which allow Open MCT to interact with these services.
|
||||||
|
|
||||||
Typically, the pattern here is to provide a known interface that
|
Typically, the pattern here is to provide a known interface that
|
||||||
Open MCT Web can utilize, and implement it such that it interacts with
|
Open MCT can utilize, and implement it such that it interacts with
|
||||||
whatever back-end provides the relevant information.
|
whatever back-end provides the relevant information.
|
||||||
Examples of back-ends that can be utilized in this fashion include
|
Examples of back-ends that can be utilized in this fashion include
|
||||||
databases for the persistence of user-created objects, or sources of
|
databases for the persistence of user-created objects, or sources of
|
||||||
@ -43,13 +43,13 @@ telemetry data.
|
|||||||
|
|
||||||
## Software Architecture
|
## Software Architecture
|
||||||
|
|
||||||
The simplest overview of Open MCT Web is to look at it as a "layered"
|
The simplest overview of Open MCT is to look at it as a "layered"
|
||||||
architecture, where each layer more clearly specifies the behavior
|
architecture, where each layer more clearly specifies the behavior
|
||||||
of the software.
|
of the software.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
#direction: down
|
#direction: down
|
||||||
[Open MCT Web|
|
[Open MCT|
|
||||||
[Platform]<->[Application]
|
[Platform]<->[Application]
|
||||||
[Framework]->[Application]
|
[Framework]->[Application]
|
||||||
[Framework]->[Platform]
|
[Framework]->[Platform]
|
||||||
@ -64,14 +64,14 @@ These layers are:
|
|||||||
established an abstraction by which different software components
|
established an abstraction by which different software components
|
||||||
may communicate and/or interact.
|
may communicate and/or interact.
|
||||||
* [_Platform_](platform.md): The platform layer defines the general look,
|
* [_Platform_](platform.md): The platform layer defines the general look,
|
||||||
feel, and behavior of Open MCT Web. This includes user-facing components like
|
feel, and behavior of Open MCT. This includes user-facing components like
|
||||||
Browse mode and Edit mode, as well as underlying elements of the
|
Browse mode and Edit mode, as well as underlying elements of the
|
||||||
information model and the general service infrastructure.
|
information model and the general service infrastructure.
|
||||||
* _Application_: The application layer defines specific features of
|
* _Application_: The application layer defines specific features of
|
||||||
an application built on Open MCT Web. This includes adapters to
|
an application built on Open MCT. This includes adapters to
|
||||||
specific back-ends, new types of things for users to create, and
|
specific back-ends, new types of things for users to create, and
|
||||||
new ways of visualizing objects within the system. This layer
|
new ways of visualizing objects within the system. This layer
|
||||||
typically consists of a mix of custom plug-ins to Open MCT Web,
|
typically consists of a mix of custom plug-ins to Open MCT,
|
||||||
as well as optional features (such as Plot view) included alongside
|
as well as optional features (such as Plot view) included alongside
|
||||||
the platform.
|
the platform.
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
The Open MCT Web platform utilizes the [framework layer](Framework.md)
|
The Open MCT platform utilizes the [framework layer](Framework.md)
|
||||||
to provide an extensible baseline for applications which includes:
|
to provide an extensible baseline for applications which includes:
|
||||||
|
|
||||||
* A common user interface (and user interface paradigm) for dealing with
|
* A common user interface (and user interface paradigm) for dealing with
|
||||||
@ -16,7 +16,7 @@ building application, the platform adds more specificity by defining
|
|||||||
additional extension types and allowing for integration with back end
|
additional extension types and allowing for integration with back end
|
||||||
components.
|
components.
|
||||||
|
|
||||||
The run-time architecture of an Open MCT Web application can be categorized
|
The run-time architecture of an Open MCT application can be categorized
|
||||||
into certain high-level tiers:
|
into certain high-level tiers:
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -29,7 +29,7 @@ into certain high-level tiers:
|
|||||||
[Browser APIs]->[Back-end]
|
[Browser APIs]->[Back-end]
|
||||||
```
|
```
|
||||||
|
|
||||||
Applications built using Open MCT Web may add or configure functionality
|
Applications built using Open MCT may add or configure functionality
|
||||||
in __any of these tiers__.
|
in __any of these tiers__.
|
||||||
|
|
||||||
* _DOM_: The rendered HTML document, composed from HTML templates which
|
* _DOM_: The rendered HTML document, composed from HTML templates which
|
||||||
@ -60,7 +60,7 @@ in __any of these tiers__.
|
|||||||
functionality needed to support the information model. This includes
|
functionality needed to support the information model. This includes
|
||||||
exposing underlying sets of extensions and mediating with the
|
exposing underlying sets of extensions and mediating with the
|
||||||
back-end.
|
back-end.
|
||||||
* _Back-end_: The back-end is out of the scope of Open MCT Web, except
|
* _Back-end_: The back-end is out of the scope of Open MCT, except
|
||||||
for the interfaces which are utilized by adapters participating in the
|
for the interfaces which are utilized by adapters participating in the
|
||||||
service infrastructure. Includes the underlying persistence stores, telemetry
|
service infrastructure. Includes the underlying persistence stores, telemetry
|
||||||
streams, and so forth which the Open MCT Web client is being used to interact
|
streams, and so forth which the Open MCT Web client is being used to interact
|
||||||
@ -70,15 +70,15 @@ in __any of these tiers__.
|
|||||||
|
|
||||||
Once the
|
Once the
|
||||||
[application has been initialized](Framework.md#application-initialization)
|
[application has been initialized](Framework.md#application-initialization)
|
||||||
Open MCT Web primarily operates in an event-driven paradigm; various
|
Open MCT primarily operates in an event-driven paradigm; various
|
||||||
events (mouse clicks, timers firing, receiving responses to XHRs) trigger
|
events (mouse clicks, timers firing, receiving responses to XHRs) trigger
|
||||||
the invocation of functions, typically in the presentation layer for
|
the invocation of functions, typically in the presentation layer for
|
||||||
user actions or in the service infrastructure for server responses.
|
user actions or in the service infrastructure for server responses.
|
||||||
|
|
||||||
The "main point of entry" into an initialized Open MCT Web application
|
The "main point of entry" into an initialized Open MCT application
|
||||||
is effectively the
|
is effectively the
|
||||||
[route](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
[route](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
||||||
which is associated with the URL used to access Open MCT Web (or a
|
which is associated with the URL used to access Open MCT (or a
|
||||||
default route.) This route will be associated with a template which
|
default route.) This route will be associated with a template which
|
||||||
will be displayed; this template will include references to directives
|
will be displayed; this template will include references to directives
|
||||||
and controllers which will be interpreted by Angular and used to
|
and controllers which will be interpreted by Angular and used to
|
||||||
@ -107,11 +107,11 @@ both the information model and the service infrastructure.
|
|||||||
|
|
||||||
# Presentation Layer
|
# Presentation Layer
|
||||||
|
|
||||||
The presentation layer of Open MCT Web is responsible for providing
|
The presentation layer of Open MCT is responsible for providing
|
||||||
information to display within templates, and for handling interactions
|
information to display within templates, and for handling interactions
|
||||||
which are initiated from templated DOM elements. AngularJS acts as
|
which are initiated from templated DOM elements. AngularJS acts as
|
||||||
an intermediary between the web page as the user sees it, and the
|
an intermediary between the web page as the user sees it, and the
|
||||||
presentation layer implemented as Open MCT Web extensions.
|
presentation layer implemented as Open MCT extensions.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
[Presentation Layer|
|
[Presentation Layer|
|
||||||
@ -143,12 +143,12 @@ to primitives from AngularJS:
|
|||||||
attributes and tags.
|
attributes and tags.
|
||||||
* [_Routes_](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
* [_Routes_](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
||||||
are used to associate specific URLs (including the fragment identifier)
|
are used to associate specific URLs (including the fragment identifier)
|
||||||
with specific application states. (In Open MCT Web, these are used to
|
with specific application states. (In Open MCT, these are used to
|
||||||
describe the mode of usage - e.g. browse or edit - as well as to
|
describe the mode of usage - e.g. browse or edit - as well as to
|
||||||
identify the object being used.)
|
identify the object being used.)
|
||||||
* [_Templates_](https://docs.angularjs.org/guide/templates) are partial
|
* [_Templates_](https://docs.angularjs.org/guide/templates) are partial
|
||||||
HTML documents that will be rendered and kept up-to-date by AngularJS.
|
HTML documents that will be rendered and kept up-to-date by AngularJS.
|
||||||
Open MCT Web introduces a custom `mct-include` directive which acts
|
Open MCT introduces a custom `mct-include` directive which acts
|
||||||
as a wrapper around `ng-include` to allow templates to be referred
|
as a wrapper around `ng-include` to allow templates to be referred
|
||||||
to by symbolic names.
|
to by symbolic names.
|
||||||
|
|
||||||
@ -189,10 +189,10 @@ to displaying domain objects.
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
Domain objects are the most fundamental component of Open MCT Web's
|
Domain objects are the most fundamental component of Open MCT's
|
||||||
information model. A domain object is some distinct thing relevant to a
|
information model. A domain object is some distinct thing relevant to a
|
||||||
user's work flow, such as a telemetry channel, display, or similar.
|
user's work flow, such as a telemetry channel, display, or similar.
|
||||||
Open MCT Web is a tool for viewing, browsing, manipulating, and otherwise
|
Open MCT is a tool for viewing, browsing, manipulating, and otherwise
|
||||||
interacting with a graph of domain objects.
|
interacting with a graph of domain objects.
|
||||||
|
|
||||||
A domain object should be conceived of as the union of the following:
|
A domain object should be conceived of as the union of the following:
|
||||||
@ -254,7 +254,7 @@ Concrete examples of capabilities which follow this pattern
|
|||||||
|
|
||||||
# Service Infrastructure
|
# Service Infrastructure
|
||||||
|
|
||||||
Most services exposed by the Open MCT Web platform follow the
|
Most services exposed by the Open MCT platform follow the
|
||||||
[composite services](Framework.md#composite-services) to permit
|
[composite services](Framework.md#composite-services) to permit
|
||||||
a higher degree of flexibility in how a service can be modified
|
a higher degree of flexibility in how a service can be modified
|
||||||
or customized for specific applications.
|
or customized for specific applications.
|
||||||
@ -327,7 +327,7 @@ A short summary of the roles of these services:
|
|||||||
[DomainObjectProvider]o-[CapabilityService]
|
[DomainObjectProvider]o-[CapabilityService]
|
||||||
```
|
```
|
||||||
|
|
||||||
As domain objects are central to Open MCT Web's information model,
|
As domain objects are central to Open MCT's information model,
|
||||||
acquiring domain objects is equally important.
|
acquiring domain objects is equally important.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -338,7 +338,7 @@ acquiring domain objects is equally important.
|
|||||||
[<state> Instantiate DomainObject]->[<end> End]
|
[<state> Instantiate DomainObject]->[<end> End]
|
||||||
```
|
```
|
||||||
|
|
||||||
Open MCT Web includes an implementation of an `ObjectService` which
|
Open MCT includes an implementation of an `ObjectService` which
|
||||||
satisfies this capability by:
|
satisfies this capability by:
|
||||||
|
|
||||||
* Consulting the [Model Service](#model-service) to acquire domain object
|
* Consulting the [Model Service](#model-service) to acquire domain object
|
||||||
@ -437,9 +437,9 @@ objects (this allows failures to be recognized and handled in groups.)
|
|||||||
The telemetry service is responsible for acquiring telemetry data.
|
The telemetry service is responsible for acquiring telemetry data.
|
||||||
|
|
||||||
Notably, the platform does not include any providers for
|
Notably, the platform does not include any providers for
|
||||||
`TelemetryService`; applications built on Open MCT Web will need to
|
`TelemetryService`; applications built on Open MCT will need to
|
||||||
implement a provider for this service if they wish to expose telemetry
|
implement a provider for this service if they wish to expose telemetry
|
||||||
data. This is usually the most important step for integrating Open MCT Web
|
data. This is usually the most important step for integrating Open MCT
|
||||||
into an existing telemetry system.
|
into an existing telemetry system.
|
||||||
|
|
||||||
Requests for telemetry data are usually initiated in the
|
Requests for telemetry data are usually initiated in the
|
||||||
@ -721,6 +721,6 @@ disallow.
|
|||||||
```
|
```
|
||||||
|
|
||||||
The type service provides metadata about the different types of domain
|
The type service provides metadata about the different types of domain
|
||||||
objects that exist within an Open MCT Web application. The platform
|
objects that exist within an Open MCT application. The platform
|
||||||
implementation reads these types in from extension category `types`
|
implementation reads these types in from extension category `types`
|
||||||
and wraps them in a JavaScript interface.
|
and wraps them in a JavaScript interface.
|
@ -1,4 +1,4 @@
|
|||||||
# Open MCT Web Developer Guide
|
# Open MCT Developer Guide
|
||||||
Victor Woeltjen
|
Victor Woeltjen
|
||||||
|
|
||||||
[victor.woeltjen@nasa.gov](mailto:victor.woeltjen@nasa.gov)
|
[victor.woeltjen@nasa.gov](mailto:victor.woeltjen@nasa.gov)
|
||||||
@ -7,34 +7,35 @@ September 23, 2015
|
|||||||
Document Version 1.1
|
Document Version 1.1
|
||||||
|
|
||||||
Date | Version | Summary of Changes | Author
|
Date | Version | Summary of Changes | Author
|
||||||
------------------- | --------- | ----------------------- | ---------------
|
------------------- | --------- | ------------------------- | ---------------
|
||||||
April 29, 2015 | 0 | Initial Draft | Victor Woeltjen
|
April 29, 2015 | 0 | Initial Draft | Victor Woeltjen
|
||||||
May 12, 2015 | 0.1 | | Victor Woeltjen
|
May 12, 2015 | 0.1 | | Victor Woeltjen
|
||||||
June 4, 2015 | 1.0 | Name Changes | Victor Woeltjen
|
June 4, 2015 | 1.0 | Name Changes | Victor Woeltjen
|
||||||
October 4, 2015 | 1.1 | Conversion to MarkDown | Andrew Henry
|
October 4, 2015 | 1.1 | Conversion to MarkDown | Andrew Henry
|
||||||
|
April 5, 2016 | 1.2 | Added Mct-table directive | Andrew Henry
|
||||||
|
|
||||||
# Introduction
|
# Introduction
|
||||||
The purpose of this guide is to familiarize software developers with the Open
|
The purpose of this guide is to familiarize software developers with the Open
|
||||||
MCT Web platform.
|
MCT Web platform.
|
||||||
|
|
||||||
## What is Open MCT Web
|
## What is Open MCT
|
||||||
Open MCT Web is a platform for building user interface and display tools,
|
Open MCT is a platform for building user interface and display tools,
|
||||||
developed at the NASA Ames Research Center in collaboration with teams at the
|
developed at the NASA Ames Research Center in collaboration with teams at the
|
||||||
Jet Propulsion Laboratory. It is written in HTML5, CSS3, and JavaScript, using
|
Jet Propulsion Laboratory. It is written in HTML5, CSS3, and JavaScript, using
|
||||||
[AngularJS](http://www.angularjs.org) as a framework. Its intended use is to
|
[AngularJS](http://www.angularjs.org) as a framework. Its intended use is to
|
||||||
create single-page web applications which integrate data and behavior from a
|
create single-page web applications which integrate data and behavior from a
|
||||||
variety of sources and domains.
|
variety of sources and domains.
|
||||||
|
|
||||||
Open MCT Web has been developed to support the remote operation of space
|
Open MCT has been developed to support the remote operation of space
|
||||||
vehicles, so some of its features are specific to that task; however, it is
|
vehicles, so some of its features are specific to that task; however, it is
|
||||||
flexible enough to be adapted to a variety of other application domains where a
|
flexible enough to be adapted to a variety of other application domains where a
|
||||||
display tool oriented toward browsing, composing, and visualizing would be
|
display tool oriented toward browsing, composing, and visualizing would be
|
||||||
useful.
|
useful.
|
||||||
|
|
||||||
Open MCT Web provides:
|
Open MCT provides:
|
||||||
|
|
||||||
* A common user interface paradigm which can be applied to a variety of domains
|
* A common user interface paradigm which can be applied to a variety of domains
|
||||||
and tasks. Open MCT Web is more than a widget toolkit - it provides a standard
|
and tasks. Open MCT is more than a widget toolkit - it provides a standard
|
||||||
tree-on-the-left, view-on-the-right browsing environment which you customize by
|
tree-on-the-left, view-on-the-right browsing environment which you customize by
|
||||||
adding new browsable object types, visualizations, and back-end adapters.
|
adding new browsable object types, visualizations, and back-end adapters.
|
||||||
* A plugin framework and an extensible API for introducing new application
|
* A plugin framework and an extensible API for introducing new application
|
||||||
@ -43,17 +44,17 @@ features of a variety of types.
|
|||||||
visualizations and infrastructure specific to telemetry display.
|
visualizations and infrastructure specific to telemetry display.
|
||||||
|
|
||||||
## Client-Server Relationship
|
## Client-Server Relationship
|
||||||
Open MCT Web is client software - it runs entirely in the user's web browser. As
|
Open MCT is client software - it runs entirely in the user's web browser. As
|
||||||
such, it is largely 'server agnostic'; any web server capable of serving files
|
such, it is largely 'server agnostic'; any web server capable of serving files
|
||||||
from paths is capable of providing Open MCT Web.
|
from paths is capable of providing Open MCT.
|
||||||
|
|
||||||
While Open MCT Web can be configured to run as a standalone client, this is
|
While Open MCT can be configured to run as a standalone client, this is
|
||||||
rarely very useful. Instead, it is intended to be used as a display and
|
rarely very useful. Instead, it is intended to be used as a display and
|
||||||
interaction layer for information obtained from a variety of back-end services.
|
interaction layer for information obtained from a variety of back-end services.
|
||||||
Doing so requires authoring or utilizing adapter plugins which allow Open MCT
|
Doing so requires authoring or utilizing adapter plugins which allow Open MCT
|
||||||
Web to interact with these services.
|
Web to interact with these services.
|
||||||
|
|
||||||
Typically, the pattern here is to provide a known interface that Open MCT Web
|
Typically, the pattern here is to provide a known interface that Open MCT
|
||||||
can utilize, and implement it such that it interacts with whatever back-end
|
can utilize, and implement it such that it interacts with whatever back-end
|
||||||
provides the relevant information. Examples of back-ends that can be utilized in
|
provides the relevant information. Examples of back-ends that can be utilized in
|
||||||
this fashion include databases for the persistence of user-created objects, or
|
this fashion include databases for the persistence of user-created objects, or
|
||||||
@ -62,52 +63,52 @@ sources of telemetry data.
|
|||||||
See the [Architecture Guide](../architecture/index.md#Overview) for information
|
See the [Architecture Guide](../architecture/index.md#Overview) for information
|
||||||
on the client-server relationship.
|
on the client-server relationship.
|
||||||
|
|
||||||
## Developing with Open MCT Web
|
## Developing with Open MCT
|
||||||
Building applications with Open MCT Web typically means authoring and utilizing
|
Building applications with Open MCT typically means authoring and utilizing
|
||||||
a set of plugins which provide application-specific details about how Open MCT
|
a set of plugins which provide application-specific details about how Open MCT
|
||||||
Web should behave.
|
Web should behave.
|
||||||
|
|
||||||
### Technologies
|
### Technologies
|
||||||
|
|
||||||
Open MCT Web sources are written in JavaScript, with a number of configuration
|
Open MCT sources are written in JavaScript, with a number of configuration
|
||||||
files written in JSON. Displayable components are written in HTML5 and CSS3.
|
files written in JSON. Displayable components are written in HTML5 and CSS3.
|
||||||
Open MCT Web is built using [AngularJS](http://www.angularjs.org) from Google. A
|
Open MCT is built using [AngularJS](http://www.angularjs.org) from Google. A
|
||||||
good understanding of Angular is recommended for developers working with Open
|
good understanding of Angular is recommended for developers working with Open
|
||||||
MCT Web.
|
MCT Web.
|
||||||
|
|
||||||
### Forking
|
### Forking
|
||||||
Open MCT Web does not currently have a single stand-alone artifact that can be
|
Open MCT does not currently have a single stand-alone artifact that can be
|
||||||
used as a library. Instead, the recommended approach for creating a new
|
used as a library. Instead, the recommended approach for creating a new
|
||||||
application is to start by forking/branching Open MCT Web, and then adding new
|
application is to start by forking/branching Open MCT, and then adding new
|
||||||
features from there. Put another way, Open MCT Web's source structure is built
|
features from there. Put another way, Open MCT's source structure is built
|
||||||
to serve as a template for specific applications.
|
to serve as a template for specific applications.
|
||||||
|
|
||||||
Forking in this manner should not require that you edit Open MCT Web's sources.
|
Forking in this manner should not require that you edit Open MCT's sources.
|
||||||
The preferred approach is to create a new directory (peer to `index.html`) for
|
The preferred approach is to create a new directory (peer to `index.html`) for
|
||||||
the new application, then add new bundles (as described in the Framework
|
the new application, then add new bundles (as described in the Framework
|
||||||
chapter) within that directory.
|
chapter) within that directory.
|
||||||
|
|
||||||
To initially clone the Open MCT Web repository:
|
To initially clone the Open MCT repository:
|
||||||
`git clone <repository URL> <local repo directory> -b open-master`
|
`git clone <repository URL> <local repo directory> -b open-master`
|
||||||
|
|
||||||
To create a fork to begin working on a new application using Open MCT Web:
|
To create a fork to begin working on a new application using Open MCT:
|
||||||
|
|
||||||
cd <local repo directory>
|
cd <local repo directory>
|
||||||
git checkout open-master
|
git checkout open-master
|
||||||
git checkout -b <new branch name>
|
git checkout -b <new branch name>
|
||||||
|
|
||||||
As a convention used internally, applications built using Open MCT Web have
|
As a convention used internally, applications built using Open MCT have
|
||||||
master branch names with an identifying prefix. For instance, if building an
|
master branch names with an identifying prefix. For instance, if building an
|
||||||
application called 'Foo', the last statement above would look like:
|
application called 'Foo', the last statement above would look like:
|
||||||
|
|
||||||
git checkout -b foo-master
|
git checkout -b foo-master
|
||||||
|
|
||||||
This convention is not enforced or understood by Open MCT Web in any way; it is
|
This convention is not enforced or understood by Open MCT in any way; it is
|
||||||
mentioned here as a more general recommendation.
|
mentioned here as a more general recommendation.
|
||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Open MCT Web is implemented as a framework component which manages a set of
|
Open MCT is implemented as a framework component which manages a set of
|
||||||
other components. These components, called _bundles_, act as containers to group
|
other components. These components, called _bundles_, act as containers to group
|
||||||
sets of related functionality; individual units of functionality are expressed
|
sets of related functionality; individual units of functionality are expressed
|
||||||
within these bundles as _extensions_.
|
within these bundles as _extensions_.
|
||||||
@ -118,7 +119,7 @@ run-time to satisfy these declared dependency. This dependency injection
|
|||||||
approach allows software components which have been authored separately (e.g. as
|
approach allows software components which have been authored separately (e.g. as
|
||||||
plugins) but to collaborate at run-time.
|
plugins) but to collaborate at run-time.
|
||||||
|
|
||||||
Open MCT Web's framework layer is implemented on top of AngularJS's [dependency
|
Open MCT's framework layer is implemented on top of AngularJS's [dependency
|
||||||
injection mechanism](https://docs.angularjs.org/guide/di) and is modelled after
|
injection mechanism](https://docs.angularjs.org/guide/di) and is modelled after
|
||||||
[OSGi](hhttp://www.osgi.org/) and its [Declarative Services component model](http://wiki.osgi.org/wiki/Declarative_Services).
|
[OSGi](hhttp://www.osgi.org/) and its [Declarative Services component model](http://wiki.osgi.org/wiki/Declarative_Services).
|
||||||
In particular, this is where the term _bundle_ comes from.
|
In particular, this is where the term _bundle_ comes from.
|
||||||
@ -133,7 +134,7 @@ The framework is described in more detail in the [Framework Overview](../archite
|
|||||||
architecture guide.
|
architecture guide.
|
||||||
|
|
||||||
### Tiers
|
### Tiers
|
||||||
While all bundles in a running Open MCT Web instance are effectively peers, it
|
While all bundles in a running Open MCT instance are effectively peers, it
|
||||||
is useful to think of them as a tiered architecture, where each tier adds more
|
is useful to think of them as a tiered architecture, where each tier adds more
|
||||||
specificity to the application.
|
specificity to the application.
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -151,7 +152,7 @@ It additionally interprets bundle definitions (see explanation below, as well as
|
|||||||
further detail in the Framework chapter.) At this tier, we are at our most
|
further detail in the Framework chapter.) At this tier, we are at our most
|
||||||
general: We know only that we are a plugin-based application.
|
general: We know only that we are a plugin-based application.
|
||||||
* __Platform__: Components in the Platform tier describe both the general user
|
* __Platform__: Components in the Platform tier describe both the general user
|
||||||
interface and corresponding developer-facing interfaces of Open MCT Web. This
|
interface and corresponding developer-facing interfaces of Open MCT. This
|
||||||
tier provides the general infrastructure for applications. It is less general
|
tier provides the general infrastructure for applications. It is less general
|
||||||
than the framework tier, insofar as this tier introduces a specific user
|
than the framework tier, insofar as this tier introduces a specific user
|
||||||
interface paradigm, but it is still non-specific as to what useful features
|
interface paradigm, but it is still non-specific as to what useful features
|
||||||
@ -159,7 +160,7 @@ will be provided. Although they can be removed or replaced easily, bundles
|
|||||||
provided by the Platform tier generally should not be thought of as optional.
|
provided by the Platform tier generally should not be thought of as optional.
|
||||||
* __Application__: The application tier consists of components which utilize the
|
* __Application__: The application tier consists of components which utilize the
|
||||||
infrastructure provided by the Platform to provide functionality which will (or
|
infrastructure provided by the Platform to provide functionality which will (or
|
||||||
could) be useful to specific applications built using Open MCT Web. These
|
could) be useful to specific applications built using Open MCT. These
|
||||||
include adapters to specific persistence back-ends (such as ElasticSearch or
|
include adapters to specific persistence back-ends (such as ElasticSearch or
|
||||||
CouchDB) as well as bundles which describe more user-facing features (such as
|
CouchDB) as well as bundles which describe more user-facing features (such as
|
||||||
_Plot_ views for visualizing time series data, or _Layout_ objects for
|
_Plot_ views for visualizing time series data, or _Layout_ objects for
|
||||||
@ -168,20 +169,20 @@ compromising basic application functionality, with the caveat that at least one
|
|||||||
persistence adapter needs to be present.
|
persistence adapter needs to be present.
|
||||||
* __Plugins__: Conceptually, this tier is not so different from the application
|
* __Plugins__: Conceptually, this tier is not so different from the application
|
||||||
tier; it consists of bundles describing new features, back-end adapters, that
|
tier; it consists of bundles describing new features, back-end adapters, that
|
||||||
are specific to the application being built on Open MCT Web. It is described as
|
are specific to the application being built on Open MCT. It is described as
|
||||||
a separate tier here because it has one important distinction from the
|
a separate tier here because it has one important distinction from the
|
||||||
application tier: It consists of bundles that are not included with the platform
|
application tier: It consists of bundles that are not included with the platform
|
||||||
(either authored anew for the specific application, or obtained from elsewhere.)
|
(either authored anew for the specific application, or obtained from elsewhere.)
|
||||||
|
|
||||||
Note that bundles in any tier can go off and consult back-end services. In
|
Note that bundles in any tier can go off and consult back-end services. In
|
||||||
practice, this responsibility is handled at the Application and/or Plugin tiers;
|
practice, this responsibility is handled at the Application and/or Plugin tiers;
|
||||||
Open MCT Web is built to be server-agnostic, so any back-end is considered an
|
Open MCT is built to be server-agnostic, so any back-end is considered an
|
||||||
application-specific detail.
|
application-specific detail.
|
||||||
|
|
||||||
## Platform Overview
|
## Platform Overview
|
||||||
|
|
||||||
The "tiered" architecture described in the preceding text describes a way of
|
The "tiered" architecture described in the preceding text describes a way of
|
||||||
thinking of and categorizing software components of a Open MCT Web application,
|
thinking of and categorizing software components of a Open MCT application,
|
||||||
as well as the framework layer's role in mediating between these components.
|
as well as the framework layer's role in mediating between these components.
|
||||||
Once the framework layer has wired these software components together, however,
|
Once the framework layer has wired these software components together, however,
|
||||||
the application's logical architecture emerges.
|
the application's logical architecture emerges.
|
||||||
@ -192,7 +193,7 @@ section of the Platform guide
|
|||||||
|
|
||||||
### Web Services
|
### Web Services
|
||||||
|
|
||||||
As mentioned in the Introduction, Open MCT Web is a platform single-page
|
As mentioned in the Introduction, Open MCT is a platform single-page
|
||||||
applications which runs entirely in the browser. Most applications will want to
|
applications which runs entirely in the browser. Most applications will want to
|
||||||
additionally interact with server-side resources, to (for example) read
|
additionally interact with server-side resources, to (for example) read
|
||||||
telemetry data or store user-created objects. This interaction is handled by
|
telemetry data or store user-created objects. This interaction is handled by
|
||||||
@ -205,7 +206,7 @@ individual bundles using APIs which are supported in browser (such as
|
|||||||
[Web Service #2] <- [Web Browser]
|
[Web Service #2] <- [Web Browser]
|
||||||
[Web Service #3] <- [Web Browser]
|
[Web Service #3] <- [Web Browser]
|
||||||
[<package> Web Browser |
|
[<package> Web Browser |
|
||||||
[<package> Open MCT Web |
|
[<package> Open MCT |
|
||||||
[Plugin Bundle #1]-->[Core API]
|
[Plugin Bundle #1]-->[Core API]
|
||||||
[Core API]<--[Plugin Bundle #2]
|
[Core API]<--[Plugin Bundle #2]
|
||||||
[Platform Bundle #1]-->[Core API]
|
[Platform Bundle #1]-->[Core API]
|
||||||
@ -215,16 +216,16 @@ individual bundles using APIs which are supported in browser (such as
|
|||||||
[Core API]<--[Platform Bundle #5]
|
[Core API]<--[Platform Bundle #5]
|
||||||
[Core API]<--[Plugin Bundle #3]
|
[Core API]<--[Plugin Bundle #3]
|
||||||
]
|
]
|
||||||
[Open MCT Web] ->[Browser APIs]
|
[Open MCT] ->[Browser APIs]
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
This architectural approach ensures a loose coupling between applications built
|
This architectural approach ensures a loose coupling between applications built
|
||||||
using Open MCT Web and the backends which support them.
|
using Open MCT and the backends which support them.
|
||||||
|
|
||||||
### Glossary
|
### Glossary
|
||||||
|
|
||||||
Certain terms are used throughout Open MCT Web with consistent meanings or
|
Certain terms are used throughout Open MCT with consistent meanings or
|
||||||
conventions. Other developer documentation, particularly in-line documentation,
|
conventions. Other developer documentation, particularly in-line documentation,
|
||||||
may presume an understanding of these terms.
|
may presume an understanding of these terms.
|
||||||
|
|
||||||
@ -246,7 +247,7 @@ readable description of a thing; usually a single sentence or short paragraph.
|
|||||||
(Most often used in the context of extensions, domain object models, or other
|
(Most often used in the context of extensions, domain object models, or other
|
||||||
similar application-specific objects.)
|
similar application-specific objects.)
|
||||||
* __domain object__: A meaningful object to the user; a distinct thing in the
|
* __domain object__: A meaningful object to the user; a distinct thing in the
|
||||||
work support by Open MCT Web. Anything that appears in the left-hand tree is a
|
work support by Open MCT. Anything that appears in the left-hand tree is a
|
||||||
domain object.
|
domain object.
|
||||||
* __extension__: An extension is a unit of functionality exposed to the platform
|
* __extension__: An extension is a unit of functionality exposed to the platform
|
||||||
in a declarative fashion by a bundle. The term 'extension category' is used to
|
in a declarative fashion by a bundle. The term 'extension category' is used to
|
||||||
@ -278,10 +279,10 @@ side-by-side without conflicting.
|
|||||||
|
|
||||||
# Framework
|
# Framework
|
||||||
|
|
||||||
Open MCT Web is built on the [AngularJS framework]( http://www.angularjs.org ). A
|
Open MCT is built on the [AngularJS framework]( http://www.angularjs.org ). A
|
||||||
good understanding of that framework is recommended.
|
good understanding of that framework is recommended.
|
||||||
|
|
||||||
Open MCT Web adds an extra layer on top of AngularJS to (a) generalize its
|
Open MCT adds an extra layer on top of AngularJS to (a) generalize its
|
||||||
dependency injection mechanism slightly, particularly to handle many-to-one
|
dependency injection mechanism slightly, particularly to handle many-to-one
|
||||||
relationships; and (b) handle script loading. Combined, these features become a
|
relationships; and (b) handle script loading. Combined, these features become a
|
||||||
plugin mechanism.
|
plugin mechanism.
|
||||||
@ -300,7 +301,7 @@ MCT Web.)
|
|||||||
are collected together in bundles, and may interact with other extensions.
|
are collected together in bundles, and may interact with other extensions.
|
||||||
|
|
||||||
The framework layer, loaded and initiated from `index.html`, is the main point
|
The framework layer, loaded and initiated from `index.html`, is the main point
|
||||||
of entry for an application built on Open MCT Web. It is responsible for wiring
|
of entry for an application built on Open MCT. It is responsible for wiring
|
||||||
together the application at run time (much of this responsibility is actually
|
together the application at run time (much of this responsibility is actually
|
||||||
delegated to Angular); at a high-level, the framework does this by proceeding
|
delegated to Angular); at a high-level, the framework does this by proceeding
|
||||||
through four stages:
|
through four stages:
|
||||||
@ -320,7 +321,7 @@ have been registered.
|
|||||||
|
|
||||||
## Bundles
|
## Bundles
|
||||||
|
|
||||||
The basic configurable unit of Open MCT Web is the _bundle_. This term has been
|
The basic configurable unit of Open MCT is the _bundle_. This term has been
|
||||||
used a bit already; now we'll get to a more formal definition.
|
used a bit already; now we'll get to a more formal definition.
|
||||||
|
|
||||||
A bundle is a directory which contains:
|
A bundle is a directory which contains:
|
||||||
@ -328,13 +329,13 @@ A bundle is a directory which contains:
|
|||||||
* A bundle definition; a file named `bundle.json`.
|
* A bundle definition; a file named `bundle.json`.
|
||||||
* Subdirectories for sources, resources, and tests.
|
* Subdirectories for sources, resources, and tests.
|
||||||
* Optionally, a `README.md` Markdown file describing its contents (this is not
|
* Optionally, a `README.md` Markdown file describing its contents (this is not
|
||||||
used by Open MCT Web in any way, but it's a helpful convention to follow.)
|
used by Open MCT in any way, but it's a helpful convention to follow.)
|
||||||
|
|
||||||
The bundle definition is the main point of entry for the bundle. The framework
|
The bundle definition is the main point of entry for the bundle. The framework
|
||||||
looks at this to determine which components need to be loaded and how they
|
looks at this to determine which components need to be loaded and how they
|
||||||
interact.
|
interact.
|
||||||
|
|
||||||
A plugin in Open MCT Web is a bundle. The platform itself is also decomposed
|
A plugin in Open MCT is a bundle. The platform itself is also decomposed
|
||||||
into bundles, each of which provides some category of functionality. The
|
into bundles, each of which provides some category of functionality. The
|
||||||
difference between a _bundle_ and a _plugin_ is purely a matter of the intended
|
difference between a _bundle_ and a _plugin_ is purely a matter of the intended
|
||||||
use; a plugin is just a bundle that is meant to be easily added or removed. When
|
use; a plugin is just a bundle that is meant to be easily added or removed. When
|
||||||
@ -355,7 +356,7 @@ For instance, if `bundles.json` contained:
|
|||||||
"example/extensions"
|
"example/extensions"
|
||||||
]
|
]
|
||||||
|
|
||||||
...then the Open MCT Web framework would look for bundle definitions at
|
...then the Open MCT framework would look for bundle definitions at
|
||||||
`example/builtins/bundle.json` and `example/extensions/bundle.json`, relative
|
`example/builtins/bundle.json` and `example/extensions/bundle.json`, relative
|
||||||
to the path of `index.html`. No other bundles would be loaded.
|
to the path of `index.html`. No other bundles would be loaded.
|
||||||
|
|
||||||
@ -456,7 +457,7 @@ arrays of extension definitions.
|
|||||||
### General Extensions
|
### General Extensions
|
||||||
|
|
||||||
Extensions are intended as a general-purpose mechanism for adding new types of
|
Extensions are intended as a general-purpose mechanism for adding new types of
|
||||||
functionality to Open MCT Web.
|
functionality to Open MCT.
|
||||||
|
|
||||||
An extension category is registered with Angular under the name of the
|
An extension category is registered with Angular under the name of the
|
||||||
extension, plus a suffix of two square brackets; so, an Angular service (or,
|
extension, plus a suffix of two square brackets; so, an Angular service (or,
|
||||||
@ -465,7 +466,7 @@ extensions, from all bundles, by including this string (e.g. `types[]` to get
|
|||||||
all type definitions) in a dependency declaration.
|
all type definitions) in a dependency declaration.
|
||||||
|
|
||||||
As a convention, extension categories are given single-word, plural nouns for
|
As a convention, extension categories are given single-word, plural nouns for
|
||||||
names within Open MCT Web (e.g. `types`.) This convention is not enforced by the
|
names within Open MCT (e.g. `types`.) This convention is not enforced by the
|
||||||
platform in any way. For extension categories introduced by external plugins, it
|
platform in any way. For extension categories introduced by external plugins, it
|
||||||
is recommended to prefix the extension category with a vendor identifier (or
|
is recommended to prefix the extension category with a vendor identifier (or
|
||||||
similar) followed by a dot, to avoid collisions.
|
similar) followed by a dot, to avoid collisions.
|
||||||
@ -504,7 +505,7 @@ the Angular-supported method for dependency injection is (effectively)
|
|||||||
constructor-style injection; so, both declared dependencies and run-time
|
constructor-style injection; so, both declared dependencies and run-time
|
||||||
arguments are competing for space in a constructor's arguments.
|
arguments are competing for space in a constructor's arguments.
|
||||||
|
|
||||||
To resolve this, the Open MCT Web framework registers extension instances in a
|
To resolve this, the Open MCT framework registers extension instances in a
|
||||||
partially constructed form. That is, the constructor exposed by the extension's
|
partially constructed form. That is, the constructor exposed by the extension's
|
||||||
implementation is effectively decomposed into two calls; the first takes the
|
implementation is effectively decomposed into two calls; the first takes the
|
||||||
dependencies, and returns the constructor in its second form, which takes the
|
dependencies, and returns the constructor in its second form, which takes the
|
||||||
@ -548,7 +549,7 @@ sorted according to these conventions when using them.
|
|||||||
### Angular Built-ins
|
### Angular Built-ins
|
||||||
|
|
||||||
Several entities supported Angular are expressed and managed as extensions in
|
Several entities supported Angular are expressed and managed as extensions in
|
||||||
Open MCT Web. Specifically, these extension categories are _directives_,
|
Open MCT. Specifically, these extension categories are _directives_,
|
||||||
_controllers_, _services_, _constants_, _runs_, and _routes_.
|
_controllers_, _services_, _constants_, _runs_, and _routes_.
|
||||||
|
|
||||||
#### Angular Directives
|
#### Angular Directives
|
||||||
@ -591,7 +592,7 @@ property value , which is the constant value that will be registered.
|
|||||||
In some cases, you want to register code to run as soon as the application
|
In some cases, you want to register code to run as soon as the application
|
||||||
starts; these can be registered as extensions of the [ runs category](https://docs.angularjs.org/api/ng/type/angular.Module#run ).
|
starts; these can be registered as extensions of the [ runs category](https://docs.angularjs.org/api/ng/type/angular.Module#run ).
|
||||||
Implementations registered in this category will be invoked (with their declared
|
Implementations registered in this category will be invoked (with their declared
|
||||||
dependencies) when the Open MCT Web application first starts. (Note that, in
|
dependencies) when the Open MCT application first starts. (Note that, in
|
||||||
this case, the implementation is better thought of as just a function, as
|
this case, the implementation is better thought of as just a function, as
|
||||||
opposed to a constructor function.)
|
opposed to a constructor function.)
|
||||||
|
|
||||||
@ -626,13 +627,13 @@ providers of the same service (that is, with matching `provides` properties);
|
|||||||
for a decorator, this will be whichever provider, decorator, or aggregator is
|
for a decorator, this will be whichever provider, decorator, or aggregator is
|
||||||
next in the sequence of decorators.
|
next in the sequence of decorators.
|
||||||
|
|
||||||
Services exposed by the Open MCT Web platform are often declared as composite
|
Services exposed by the Open MCT platform are often declared as composite
|
||||||
services, as this form is open for a variety of common modifications.
|
services, as this form is open for a variety of common modifications.
|
||||||
|
|
||||||
# Core API
|
# Core API
|
||||||
|
|
||||||
Most of Open MCT Web's relevant API is provided and/or mediated by the
|
Most of Open MCT's relevant API is provided and/or mediated by the
|
||||||
framework; that is, much of developing for Open MCT Web is a matter of adding
|
framework; that is, much of developing for Open MCT is a matter of adding
|
||||||
extensions which access other parts of the platform by means of dependency
|
extensions which access other parts of the platform by means of dependency
|
||||||
injection.
|
injection.
|
||||||
|
|
||||||
@ -641,9 +642,9 @@ to be passed along by other services.
|
|||||||
|
|
||||||
## Domain Objects
|
## Domain Objects
|
||||||
|
|
||||||
Domain objects are the most fundamental component of Open MCT Web's information
|
Domain objects are the most fundamental component of Open MCT's information
|
||||||
model. A domain object is some distinct thing relevant to a user's work flow,
|
model. A domain object is some distinct thing relevant to a user's work flow,
|
||||||
such as a telemetry channel, display, or similar. Open MCT Web is a tool for
|
such as a telemetry channel, display, or similar. Open MCT is a tool for
|
||||||
viewing, browsing, manipulating, and otherwise interacting with a graph of
|
viewing, browsing, manipulating, and otherwise interacting with a graph of
|
||||||
domain objects.
|
domain objects.
|
||||||
|
|
||||||
@ -680,7 +681,7 @@ exposed.
|
|||||||
### Identifier Syntax
|
### Identifier Syntax
|
||||||
|
|
||||||
For most purposes, a domain object identifier can be treated as a purely
|
For most purposes, a domain object identifier can be treated as a purely
|
||||||
symbolic string; these are typically generated by Open MCT Web and plug-ins
|
symbolic string; these are typically generated by Open MCT and plug-ins
|
||||||
should rarely be concerned with its internal structure.
|
should rarely be concerned with its internal structure.
|
||||||
|
|
||||||
A domain object identifier has one or two parts, separated by a colon.
|
A domain object identifier has one or two parts, separated by a colon.
|
||||||
@ -723,7 +724,7 @@ exposed it to be removed from its container.
|
|||||||
containing:
|
containing:
|
||||||
* `name`: Human-readable name.
|
* `name`: Human-readable name.
|
||||||
* `description`: Human-readable summary of this action.
|
* `description`: Human-readable summary of this action.
|
||||||
* `glyph`: Single character to be displayed in Open MCT Web's icon font set.
|
* `glyph`: Single character to be displayed in Open MCT's icon font set.
|
||||||
* `context`: The context in which this action is being performed (see below)
|
* `context`: The context in which this action is being performed (see below)
|
||||||
|
|
||||||
Action instances are typically obtained via a domain object's `action`
|
Action instances are typically obtained via a domain object's `action`
|
||||||
@ -739,7 +740,7 @@ dragged object in a drag-and-drop operation.)
|
|||||||
|
|
||||||
## Telemetry
|
## Telemetry
|
||||||
|
|
||||||
Telemetry series data in Open MCT Web is represented by a common interface, and
|
Telemetry series data in Open MCT is represented by a common interface, and
|
||||||
packaged in a consistent manner to facilitate passing telemetry updates around
|
packaged in a consistent manner to facilitate passing telemetry updates around
|
||||||
multiple visualizations.
|
multiple visualizations.
|
||||||
|
|
||||||
@ -752,7 +753,7 @@ is useful when multiple distinct data sources are in use side-by-side.
|
|||||||
* `key`: A machine-readable identifier for a unique series of telemetry within
|
* `key`: A machine-readable identifier for a unique series of telemetry within
|
||||||
that source.
|
that source.
|
||||||
* _Note: This API is still under development; additional properties, such as
|
* _Note: This API is still under development; additional properties, such as
|
||||||
start and end time, should be present in future versions of Open MCT Web._
|
start and end time, should be present in future versions of Open MCT._
|
||||||
|
|
||||||
Additional properties may be included in telemetry requests which have specific
|
Additional properties may be included in telemetry requests which have specific
|
||||||
interpretations for specific sources.
|
interpretations for specific sources.
|
||||||
@ -776,7 +777,7 @@ not. (Typically, domain values are interpreted as UTC timestamps in milliseconds
|
|||||||
relative to the UNIX epoch.) A series must have at least one domain and one
|
relative to the UNIX epoch.) A series must have at least one domain and one
|
||||||
range, and may have more than one.
|
range, and may have more than one.
|
||||||
|
|
||||||
Telemetry series data in Open MCT Web is expressed via the following
|
Telemetry series data in Open MCT is expressed via the following
|
||||||
`TelemetrySeries` interface:
|
`TelemetrySeries` interface:
|
||||||
|
|
||||||
* `getPointCount()`: Returns the number of unique points/samples in this series.
|
* `getPointCount()`: Returns the number of unique points/samples in this series.
|
||||||
@ -815,7 +816,7 @@ interface:
|
|||||||
* `getName()`: Get the human-readable name for this type.
|
* `getName()`: Get the human-readable name for this type.
|
||||||
* `getDescription()`: Get a human-readable summary of this type.
|
* `getDescription()`: Get a human-readable summary of this type.
|
||||||
* `getGlyph()`: Get the single character to be rendered as an icon for this type
|
* `getGlyph()`: Get the single character to be rendered as an icon for this type
|
||||||
in Open MCT Web's custom font set.
|
in Open MCT's custom font set.
|
||||||
* `getInitialModel()`: Get a domain object model that represents the initial
|
* `getInitialModel()`: Get a domain object model that represents the initial
|
||||||
state (before user specification of properties) for domain objects of this type.
|
state (before user specification of properties) for domain objects of this type.
|
||||||
* `getDefinition()`: Get the extension definition for this type, as a JavaScript
|
* `getDefinition()`: Get the extension definition for this type, as a JavaScript
|
||||||
@ -831,7 +832,7 @@ an array of `TypeProperty` instances.
|
|||||||
### Type Features
|
### Type Features
|
||||||
|
|
||||||
Features of a domain object type are expressed as symbolic string identifiers.
|
Features of a domain object type are expressed as symbolic string identifiers.
|
||||||
They are defined in practice by usage; currently, the Open MCT Web platform only
|
They are defined in practice by usage; currently, the Open MCT platform only
|
||||||
uses the creation feature to determine which domain object types should appear
|
uses the creation feature to determine which domain object types should appear
|
||||||
in the Create menu.
|
in the Create menu.
|
||||||
|
|
||||||
@ -885,7 +886,7 @@ Categories supported by the platform include:
|
|||||||
* `key`: A machine-readable identifier for this action.
|
* `key`: A machine-readable identifier for this action.
|
||||||
* `name`: A human-readable name for this action (e.g. to show in a menu)
|
* `name`: A human-readable name for this action (e.g. to show in a menu)
|
||||||
* `description`: A human-readable summary of the behavior of this action.
|
* `description`: A human-readable summary of the behavior of this action.
|
||||||
* `glyph`: A single character which will be rendered in Open MCT Web's custom
|
* `glyph`: A single character which will be rendered in Open MCT's custom
|
||||||
font set as an icon for this action.
|
font set as an icon for this action.
|
||||||
|
|
||||||
## Capabilities Category
|
## Capabilities Category
|
||||||
@ -911,6 +912,23 @@ 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,
|
down capabilities to those which should be exposed by specific domain objects,
|
||||||
based on their domain object models.
|
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 Category
|
||||||
|
|
||||||
Controls provide options for the `mct-control` directive.
|
Controls provide options for the `mct-control` directive.
|
||||||
@ -979,7 +997,7 @@ of unremoved listeners.
|
|||||||
## Indicators Category
|
## Indicators Category
|
||||||
|
|
||||||
An indicator is an element that should appear in the status area at the bottom
|
An indicator is an element that should appear in the status area at the bottom
|
||||||
of a running Open MCT Web client instance.
|
of a running Open MCT client instance.
|
||||||
|
|
||||||
### Standard Indicators
|
### Standard Indicators
|
||||||
|
|
||||||
@ -989,7 +1007,7 @@ provide implementations with the following methods:
|
|||||||
* `getText()`: Provides the human-readable text that will be displayed for this
|
* `getText()`: Provides the human-readable text that will be displayed for this
|
||||||
indicator.
|
indicator.
|
||||||
* `getGlyph()`: Provides a single-character string that will be displayed as an
|
* `getGlyph()`: Provides a single-character string that will be displayed as an
|
||||||
icon in Open MCT Web's custom font set.
|
icon in Open MCT's custom font set.
|
||||||
* `getDescription()`: Provides a human-readable summary of the current state of
|
* `getDescription()`: Provides a human-readable summary of the current state of
|
||||||
this indicator; will be displayed in a tooltip on hover.
|
this indicator; will be displayed in a tooltip on hover.
|
||||||
* `getClass()`: Get a CSS class that will be applied to this indicator.
|
* `getClass()`: Get a CSS class that will be applied to this indicator.
|
||||||
@ -1015,7 +1033,7 @@ this variety do not need to provide an implementation.
|
|||||||
## Licenses Category
|
## Licenses Category
|
||||||
|
|
||||||
The extension category `licenses` can be used to add entries into the 'Licensing
|
The extension category `licenses` can be used to add entries into the 'Licensing
|
||||||
information' page, reachable from Open MCT Web's About dialog.
|
information' page, reachable from Open MCT's About dialog.
|
||||||
|
|
||||||
Licenses may have the following properties, all of which are strings:
|
Licenses may have the following properties, all of which are strings:
|
||||||
|
|
||||||
@ -1028,11 +1046,11 @@ Licenses may have the following properties, all of which are strings:
|
|||||||
|
|
||||||
## Policies Category
|
## Policies Category
|
||||||
|
|
||||||
Policies are used to handle decisions made using Open MCT Web's `policyService`;
|
Policies are used to handle decisions made using Open MCT's `policyService`;
|
||||||
examples of these decisions are determining the applicability of certain
|
examples of these decisions are determining the applicability of certain
|
||||||
actions, or checking whether or not a domain object of one type can contain a
|
actions, or checking whether or not a domain object of one type can contain a
|
||||||
domain object of a different type. See the section on the Policies for an
|
domain object of a different type. See the section on the Policies for an
|
||||||
overview of Open MCT Web's policy model.
|
overview of Open MCT's policy model.
|
||||||
|
|
||||||
A policy's extension definition should include:
|
A policy's extension definition should include:
|
||||||
|
|
||||||
@ -1048,7 +1066,7 @@ context)`. The specific types used for `candidate` and `context` vary by policy
|
|||||||
category; in general, what is being asked is 'is this candidate allowed in this
|
category; in general, what is being asked is 'is this candidate allowed in this
|
||||||
context?' This method should return a boolean value.
|
context?' This method should return a boolean value.
|
||||||
|
|
||||||
Open MCT Web's policy model requires consensus; a policy decision is allowed
|
Open MCT's policy model requires consensus; a policy decision is allowed
|
||||||
when and only when all policies choose to allow it. As such, policies should
|
when and only when all policies choose to allow it. As such, policies should
|
||||||
generally be written to reject a certain case, and allow (by returning `true`)
|
generally be written to reject a certain case, and allow (by returning `true`)
|
||||||
anything else.
|
anything else.
|
||||||
@ -1177,7 +1195,7 @@ Templates do not have implementations.
|
|||||||
## Types Category
|
## Types Category
|
||||||
|
|
||||||
The types extension category describes types of domain objects which may
|
The types extension category describes types of domain objects which may
|
||||||
appear within Open MCT Web.
|
appear within Open MCT.
|
||||||
|
|
||||||
A type's extension definition should have the following properties:
|
A type's extension definition should have the following properties:
|
||||||
|
|
||||||
@ -1185,7 +1203,7 @@ A type's extension definition should have the following properties:
|
|||||||
stored to and matched against the type property of domain object models.
|
stored to and matched against the type property of domain object models.
|
||||||
* `name`: The human-readable name for this domain object type.
|
* `name`: The human-readable name for this domain object type.
|
||||||
* `description`: A human-readable summary of this domain object type.
|
* `description`: A human-readable summary of this domain object type.
|
||||||
* `glyph`: A single character to be rendered as an icon in Open MCT Web's custom
|
* `glyph`: A single character to be rendered as an icon in Open MCT's custom
|
||||||
font set.
|
font set.
|
||||||
* `model`: A domain object model, used as the initial state for created domain
|
* `model`: A domain object model, used as the initial state for created domain
|
||||||
objects of this type (before any properties are specified.)
|
objects of this type (before any properties are specified.)
|
||||||
@ -1234,7 +1252,7 @@ utilized via `mct-representation`); additionally:
|
|||||||
|
|
||||||
* `name`: The human-readable name for this view type.
|
* `name`: The human-readable name for this view type.
|
||||||
* description : A human-readable summary of this view type.
|
* description : A human-readable summary of this view type.
|
||||||
* `glyph`: A single character to be rendered as an icon in Open MCT Web's custom
|
* `glyph`: A single character to be rendered as an icon in Open MCT's custom
|
||||||
font set.
|
font set.
|
||||||
* `type`: Optional; if present, this representation is only applicable for
|
* `type`: Optional; if present, this representation is only applicable for
|
||||||
domain object's of this type.
|
domain object's of this type.
|
||||||
@ -1276,7 +1294,7 @@ are visible, and what state they manage and/or behavior they invoke.
|
|||||||
|
|
||||||
This set may contain up to two different objects: The _view proxy_, which is
|
This set may contain up to two different objects: The _view proxy_, which is
|
||||||
used to make changes to the view as a whole, and the _selected object_, which is
|
used to make changes to the view as a whole, and the _selected object_, which is
|
||||||
used to represent some state within the view. (Future versions of Open MCT Web
|
used to represent some state within the view. (Future versions of Open MCT
|
||||||
may support multiple selected objects.)
|
may support multiple selected objects.)
|
||||||
|
|
||||||
The `selection` object made available during Edit mode has the following
|
The `selection` object made available during Edit mode has the following
|
||||||
@ -1312,14 +1330,14 @@ are supported:
|
|||||||
|
|
||||||
# Directives
|
# Directives
|
||||||
|
|
||||||
Open MCT Web defines several Angular directives that are intended for use both
|
Open MCT defines several Angular directives that are intended for use both
|
||||||
internally within the platform, and by plugins.
|
internally within the platform, and by plugins.
|
||||||
|
|
||||||
## Before Unload
|
## Before Unload
|
||||||
|
|
||||||
The `mct-before-unload` directive is used to listen for (and prompt for user
|
The `mct-before-unload` directive is used to listen for (and prompt for user
|
||||||
confirmation) of navigation changes in the browser. This includes reloading,
|
confirmation) of navigation changes in the browser. This includes reloading,
|
||||||
following links out of Open MCT Web, or changing routes. It is used to hook into
|
following links out of Open MCT, or changing routes. It is used to hook into
|
||||||
both `onbeforeunload` event handling as well as route changes from within
|
both `onbeforeunload` event handling as well as route changes from within
|
||||||
Angular.
|
Angular.
|
||||||
|
|
||||||
@ -1431,7 +1449,7 @@ Passed as plain text in the attribute.
|
|||||||
|
|
||||||
### Form Structure
|
### Form Structure
|
||||||
|
|
||||||
Forms in Open MCT Web have a common structure to permit consistent display. A
|
Forms in Open MCT have a common structure to permit consistent display. A
|
||||||
form is broken down into sections, which will be displayed in groups; each
|
form is broken down into sections, which will be displayed in groups; each
|
||||||
section is broken down into rows, each of which provides a control for a single
|
section is broken down into rows, each of which provides a control for a single
|
||||||
property. Input from this form is two-way bound to the object passed via
|
property. Input from this form is two-way bound to the object passed via
|
||||||
@ -1583,9 +1601,64 @@ there are items .
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
## Table
|
||||||
|
|
||||||
|
The `mct-table` directive provides a generic table component, with optional
|
||||||
|
sorting and filtering capabilities. The table can be pre-populated with data
|
||||||
|
by setting the `rows` parameter, and it can be updated in real-time using the
|
||||||
|
`add:row` and `remove:row` broadcast events. The table will expand to occupy
|
||||||
|
100% of the size of its containing element. The table is highly optimized for
|
||||||
|
very large data sets.
|
||||||
|
|
||||||
|
### Events
|
||||||
|
|
||||||
|
The table supports two events for notifying that the rows have changed. For
|
||||||
|
performance reasons, the table does not monitor the content of `rows`
|
||||||
|
constantly.
|
||||||
|
|
||||||
|
* `add:row`: A `$broadcast` event that will notify the table that a new row
|
||||||
|
has been added to the table.
|
||||||
|
|
||||||
|
eg. The code below adds a new row, and alerts the table using the `add:row`
|
||||||
|
event. Sorting and filtering will be applied automatically by the table component.
|
||||||
|
|
||||||
|
```
|
||||||
|
$scope.rows.push(newRow);
|
||||||
|
$scope.$broadcast('add:row', $scope.rows.length-1);
|
||||||
|
```
|
||||||
|
|
||||||
|
* `remove:row`: A `$broadcast` event that will notify the table that a row
|
||||||
|
should be removed from the table.
|
||||||
|
|
||||||
|
eg. The code below removes a row from the rows array, and then alerts the table
|
||||||
|
to its removal.
|
||||||
|
|
||||||
|
```
|
||||||
|
$scope.rows.slice(5, 1);
|
||||||
|
$scope.$broadcast('remove:row', 5);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
* `headers`: An array of string values which will constitute the column titles
|
||||||
|
that appear at the top of the table. Corresponding values are specified in
|
||||||
|
the rows using the header title provided here.
|
||||||
|
* `rows`: An array of objects containing row values. Each element in the
|
||||||
|
array must be an associative array, where the key corresponds to a column header.
|
||||||
|
* `enableFilter`: A boolean that if true, will enable searching and result
|
||||||
|
filtering. When enabled, each column will have a text input field that can be
|
||||||
|
used to filter the table rows in real time.
|
||||||
|
* `enableSort`: A boolean determining whether rows can be sorted. If true,
|
||||||
|
sorting will be enabled allowing sorting by clicking on column headers. Only
|
||||||
|
one column may be sorted at a time.
|
||||||
|
* `autoScroll`: A boolean value that if true, will cause the table to automatically
|
||||||
|
scroll to the bottom as new data arrives. Auto-scroll can be disengaged manually
|
||||||
|
by scrolling away from the bottom of the table, and can also be enabled manually
|
||||||
|
by scrolling to the bottom of the table rows.
|
||||||
|
|
||||||
# Services
|
# Services
|
||||||
|
|
||||||
The Open MCT Web platform provides a variety of services which can be retrieved
|
The Open MCT platform provides a variety of services which can be retrieved
|
||||||
and utilized via dependency injection. These services fall into two categories:
|
and utilized via dependency injection. These services fall into two categories:
|
||||||
|
|
||||||
* _Composite Services_ are defined by a set of components extensions; plugins may
|
* _Composite Services_ are defined by a set of components extensions; plugins may
|
||||||
@ -1597,7 +1670,7 @@ utilized by plugins but are not intended to be modified or augmented.
|
|||||||
|
|
||||||
## Composite Type Services
|
## Composite Type Services
|
||||||
|
|
||||||
This section describes the composite services exposed by Open MCT Web,
|
This section describes the composite services exposed by Open MCT,
|
||||||
specifically focusing on their interface and contract.
|
specifically focusing on their interface and contract.
|
||||||
|
|
||||||
In many cases, the platform will include a provider for a service which consumes
|
In many cases, the platform will include a provider for a service which consumes
|
||||||
@ -1915,7 +1988,7 @@ The `workerService` may be used to run web workers defined via the
|
|||||||
as a shared worker); if the `key` is unknown, returns `undefined`.
|
as a shared worker); if the `key` is unknown, returns `undefined`.
|
||||||
|
|
||||||
# Models
|
# Models
|
||||||
Domain object models in Open MCT Web are JavaScript objects describing the
|
Domain object models in Open MCT are JavaScript objects describing the
|
||||||
persistent state of the domain objects they describe. Their contents include a
|
persistent state of the domain objects they describe. Their contents include a
|
||||||
mix of commonly understood metadata attributes; attributes which are recognized
|
mix of commonly understood metadata attributes; attributes which are recognized
|
||||||
by and/or determine the applicability of specific extensions; and properties
|
by and/or determine the applicability of specific extensions; and properties
|
||||||
@ -1931,7 +2004,7 @@ MCT Web and can be utilized directly:
|
|||||||
## Extension-specific Properties
|
## Extension-specific Properties
|
||||||
|
|
||||||
Other properties of domain object models have specific meaning imposed by other
|
Other properties of domain object models have specific meaning imposed by other
|
||||||
extensions within the Open MCT Web platform.
|
extensions within the Open MCT platform.
|
||||||
|
|
||||||
### Capability-specific Properties
|
### Capability-specific Properties
|
||||||
|
|
||||||
@ -2215,7 +2288,7 @@ way of its `composition` capability.)
|
|||||||
|
|
||||||
# Policies
|
# Policies
|
||||||
|
|
||||||
Policies are consulted to determine when certain behavior in Open MCT Web is
|
Policies are consulted to determine when certain behavior in Open MCT is
|
||||||
allowed. Policy questions are assigned to certain categories, which broadly
|
allowed. Policy questions are assigned to certain categories, which broadly
|
||||||
describe the type of decision being made; within each category, policies have a
|
describe the type of decision being made; within each category, policies have a
|
||||||
candidate (the thing which may or may not be allowed) and, optionally, a context
|
candidate (the thing which may or may not be allowed) and, optionally, a context
|
||||||
@ -2240,13 +2313,13 @@ The candidate argument is the view's extension definition; the context argument
|
|||||||
is the `DomainObject` to be viewed.
|
is the `DomainObject` to be viewed.
|
||||||
|
|
||||||
# Build-Test-Deploy
|
# Build-Test-Deploy
|
||||||
Open MCT Web is designed to support a broad variety of build and deployment
|
Open MCT is designed to support a broad variety of build and deployment
|
||||||
options. The sources can be deployed in the same directory structure used during
|
options. The sources can be deployed in the same directory structure used during
|
||||||
development. A few utilities are included to support development processes.
|
development. A few utilities are included to support development processes.
|
||||||
|
|
||||||
## Command-line Build
|
## Command-line Build
|
||||||
|
|
||||||
Open MCT Web is built using [`npm`](http://npmjs.com/)
|
Open MCT is built using [`npm`](http://npmjs.com/)
|
||||||
and [`gulp`](http://gulpjs.com/).
|
and [`gulp`](http://gulpjs.com/).
|
||||||
|
|
||||||
To install build dependencies (only needs to be run once):
|
To install build dependencies (only needs to be run once):
|
||||||
@ -2258,12 +2331,12 @@ To build:
|
|||||||
`npm run prepublish`
|
`npm run prepublish`
|
||||||
|
|
||||||
This will compile and minify JavaScript sources, as well as copy over assets.
|
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
|
The contents of the `dist` folder will contain a runnable Open MCT
|
||||||
instance (e.g. by starting an HTTP server in that directory), including:
|
instance (e.g. by starting an HTTP server in that directory), including:
|
||||||
|
|
||||||
* A `main.js` file containing Open MCT Web source code.
|
* A `main.js` file containing Open MCT source code.
|
||||||
* Various assets in the `example` and `platform` directories.
|
* Various assets in the `example` and `platform` directories.
|
||||||
* An `index.html` that runs Open MCT Web in its default configuration.
|
* An `index.html` that runs Open MCT in its default configuration.
|
||||||
|
|
||||||
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
||||||
|
|
||||||
@ -2272,7 +2345,7 @@ download build dependencies.
|
|||||||
|
|
||||||
## Test Suite
|
## Test Suite
|
||||||
|
|
||||||
Open MCT Web uses [Jasmine 1.3](http://jasmine.github.io/) and
|
Open MCT uses [Jasmine 1.3](http://jasmine.github.io/) and
|
||||||
[Karma](http://karma-runner.github.io) for automated testing.
|
[Karma](http://karma-runner.github.io) for automated testing.
|
||||||
|
|
||||||
The test suite is configured to load any scripts ending with `Spec.js` found
|
The test suite is configured to load any scripts ending with `Spec.js` found
|
||||||
@ -2310,8 +2383,8 @@ information using [Blanket.JS](http://blanketjs.org/) and display this at the
|
|||||||
bottom of the screen. Currently, only statement coverage is displayed.
|
bottom of the screen. Currently, only statement coverage is displayed.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
Open MCT Web is built to be flexible in terms of the deployment strategies it
|
Open MCT is built to be flexible in terms of the deployment strategies it
|
||||||
supports. In order to run in the browser, Open MCT Web needs:
|
supports. In order to run in the browser, Open MCT needs:
|
||||||
|
|
||||||
1. HTTP access to sources/resources for the framework, platform, and all active
|
1. HTTP access to sources/resources for the framework, platform, and all active
|
||||||
bundles.
|
bundles.
|
||||||
@ -2320,13 +2393,13 @@ external services need to support HTTP or some other web-accessible interface,
|
|||||||
like WebSockets.)
|
like WebSockets.)
|
||||||
|
|
||||||
Any HTTP server capable of serving flat files is sufficient for the first point.
|
Any HTTP server capable of serving flat files is sufficient for the first point.
|
||||||
The command-line build also packages Open MCT Web into a `.war` file for easier
|
The command-line build also packages Open MCT into a `.war` file for easier
|
||||||
deployment on containers such as Apache Tomcat.
|
deployment on containers such as Apache Tomcat.
|
||||||
|
|
||||||
The second point may be less flexible, as it depends upon the specific services
|
The second point may be less flexible, as it depends upon the specific services
|
||||||
to be utilized by Open MCT Web. Because of this, it is often the set of external
|
to be utilized by Open MCT. Because of this, it is often the set of external
|
||||||
services (and the manner in which they are exposed) that determine how to deploy
|
services (and the manner in which they are exposed) that determine how to deploy
|
||||||
Open MCT Web.
|
Open MCT.
|
||||||
|
|
||||||
One important constraint to consider in this context is the browser's same
|
One important constraint to consider in this context is the browser's same
|
||||||
origin policy. If external services are not on the same apparent host and port
|
origin policy. If external services are not on the same apparent host and port
|
||||||
@ -2343,7 +2416,7 @@ configuration does not create a security vulnerability.
|
|||||||
Examples of deployment strategies (and the conditions under which they make the
|
Examples of deployment strategies (and the conditions under which they make the
|
||||||
most sense) include:
|
most sense) include:
|
||||||
|
|
||||||
* If the external services that Open MCT Web will utilize are all running on
|
* If the external services that Open MCT will utilize are all running on
|
||||||
[Apache Tomcat](https://tomcat.apache.org/), then it makes sense to run Open
|
[Apache Tomcat](https://tomcat.apache.org/), then it makes sense to run Open
|
||||||
MCT Web from the same Tomcat instance as a separate web application. The
|
MCT Web from the same Tomcat instance as a separate web application. The
|
||||||
`.war` artifact produced by the command line build facilitates this deployment
|
`.war` artifact produced by the command line build facilitates this deployment
|
||||||
@ -2354,28 +2427,28 @@ hosts/ports, then it may make sense to use a web server that supports proxying,
|
|||||||
such as the [Apache HTTP Server](http://httpd.apache.org/). In this
|
such as the [Apache HTTP Server](http://httpd.apache.org/). In this
|
||||||
configuration, the HTTP server would be configured to proxy (or reverse proxy)
|
configuration, the HTTP server would be configured to proxy (or reverse proxy)
|
||||||
requests at specific paths to the various external services, while providing
|
requests at specific paths to the various external services, while providing
|
||||||
Open MCT Web as flat files from a different path.
|
Open MCT as flat files from a different path.
|
||||||
* If a single server component is being developed to handle all server-side
|
* If a single server component is being developed to handle all server-side
|
||||||
needs of an Open MCT Web instance, it can make sense to serve Open MCT Web (as
|
needs of an Open MCT instance, it can make sense to serve Open MCT (as
|
||||||
flat files) from the same component using an embedded HTTP server such as
|
flat files) from the same component using an embedded HTTP server such as
|
||||||
[Nancy](http://nancyfx.org/).
|
[Nancy](http://nancyfx.org/).
|
||||||
* If no external services are needed (or if the 'external services' will just
|
* If no external services are needed (or if the 'external services' will just
|
||||||
be generating flat files to read) it makes sense to utilize a lightweight flat
|
be generating flat files to read) it makes sense to utilize a lightweight flat
|
||||||
file HTTP server such as [Lighttpd](http://www.lighttpd.net/). In this
|
file HTTP server such as [Lighttpd](http://www.lighttpd.net/). In this
|
||||||
configuration, Open MCT Web sources/resources would be placed at one path, while
|
configuration, Open MCT sources/resources would be placed at one path, while
|
||||||
the files generated by the external service are placed at another path.
|
the files generated by the external service are placed at another path.
|
||||||
* If all external services support CORS, it may make sense to have an HTTP
|
* If all external services support CORS, it may make sense to have an HTTP
|
||||||
server that is solely responsible for making Open MCT Web sources/resources
|
server that is solely responsible for making Open MCT sources/resources
|
||||||
available, and to have Open MCT Web contact these external services directly.
|
available, and to have Open MCT contact these external services directly.
|
||||||
Again, lightweight HTTP servers such as [Lighttpd](http://www.lighttpd.net/)
|
Again, lightweight HTTP servers such as [Lighttpd](http://www.lighttpd.net/)
|
||||||
are useful in this circumstance. The downside of this option is that additional
|
are useful in this circumstance. The downside of this option is that additional
|
||||||
configuration effort is required, both to enable CORS on the external services,
|
configuration effort is required, both to enable CORS on the external services,
|
||||||
and to ensure that Open MCT Web can correctly locate these services.
|
and to ensure that Open MCT can correctly locate these services.
|
||||||
|
|
||||||
Another important consideration is authentication. By design, Open MCT Web does
|
Another important consideration is authentication. By design, Open MCT does
|
||||||
not handle user authentication. Instead, this should typically be treated as a
|
not handle user authentication. Instead, this should typically be treated as a
|
||||||
deployment-time concern, where authentication is handled by the HTTP server
|
deployment-time concern, where authentication is handled by the HTTP server
|
||||||
which provides Open MCT Web, or an external access management system.
|
which provides Open MCT, or an external access management system.
|
||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
In most of the deployment options above, some level of configuration is likely
|
In most of the deployment options above, some level of configuration is likely
|
||||||
@ -2383,7 +2456,7 @@ to be needed or desirable to make sure that bundles can reach the external
|
|||||||
services they need to reach. Most commonly this means providing the path or URL
|
services they need to reach. Most commonly this means providing the path or URL
|
||||||
to an external service.
|
to an external service.
|
||||||
|
|
||||||
Configurable parameters within Open MCT Web are specified via constants
|
Configurable parameters within Open MCT are specified via constants
|
||||||
(literally, as extensions of the `constants` category) and accessed via
|
(literally, as extensions of the `constants` category) and accessed via
|
||||||
dependency injection by the scripts which need them. Reasonable defaults for
|
dependency injection by the scripts which need them. Reasonable defaults for
|
||||||
these constants are provided in the bundle where they are used. Plugins are
|
these constants are provided in the bundle where they are used. Plugins are
|
||||||
@ -2402,7 +2475,7 @@ for error, but is viable if there are a small number of constants to change.
|
|||||||
constants. This is particularly appropriate when multiple configurations (e.g.
|
constants. This is particularly appropriate when multiple configurations (e.g.
|
||||||
development, test, production) need to be managed easily; these can be swapped
|
development, test, production) need to be managed easily; these can be swapped
|
||||||
quickly by changing the set of active bundles in bundles.json.
|
quickly by changing the set of active bundles in bundles.json.
|
||||||
* Deploy Open MCT Web and its external services in such a fashion that the
|
* Deploy Open MCT and its external services in such a fashion that the
|
||||||
default paths to reach external services are all correct.
|
default paths to reach external services are all correct.
|
||||||
|
|
||||||
### Configuration Constants
|
### Configuration Constants
|
||||||
@ -2413,7 +2486,7 @@ The following constants have global significance:
|
|||||||
to be overridden by other bundles, but persistence adapters may wish to
|
to be overridden by other bundles, but persistence adapters may wish to
|
||||||
consume this constant in order to provide persistence for that space.
|
consume this constant in order to provide persistence for that space.
|
||||||
|
|
||||||
The following configuration constants are recognized by Open MCT Web bundles:
|
The following configuration constants are recognized by Open MCT bundles:
|
||||||
* Common UI elements - `platform/commonUI/general`
|
* Common UI elements - `platform/commonUI/general`
|
||||||
* `THEME`: A string identifying the current theme symbolically. Individual
|
* `THEME`: A string identifying the current theme symbolically. Individual
|
||||||
stylesheets (the `stylesheets` extension category) may specify an optional
|
stylesheets (the `stylesheets` extension category) may specify an optional
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# Open MCT Web Documentation
|
# Open MCT Documentation
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
Documentation is provided to support the use and development of
|
Documentation is provided to support the use and development of
|
||||||
Open MCT Web. It's recommended that before doing
|
Open MCT. It's recommended that before doing
|
||||||
any development with Open MCT Web you take some time to familiarize yourself
|
any development with Open MCT you take some time to familiarize yourself
|
||||||
with the documentation below.
|
with the documentation below.
|
||||||
|
|
||||||
Open MCT Web provides functionality out of the box, but it's also a platform for
|
Open MCT provides functionality out of the box, but it's also a platform for
|
||||||
building rich mission operations applications based on modern web technology.
|
building rich mission operations applications based on modern web technology.
|
||||||
The platform is configured declaratively, and defines conventions for
|
The platform is configured declaratively, and defines conventions for
|
||||||
building on the provided capabilities by creating modular 'bundles' that
|
building on the provided capabilities by creating modular 'bundles' that
|
||||||
@ -17,7 +17,7 @@
|
|||||||
## Sections
|
## Sections
|
||||||
|
|
||||||
* The [Architecture Overview](architecture/) describes the concepts used
|
* The [Architecture Overview](architecture/) describes the concepts used
|
||||||
throughout Open MCT Web, and gives a high level overview of the platform's design.
|
throughout Open MCT, and gives a high level overview of the platform's design.
|
||||||
|
|
||||||
* The [Developer's Guide](guide/) goes into more detail about how to use the
|
* The [Developer's Guide](guide/) goes into more detail about how to use the
|
||||||
platform and the functionality that it provides.
|
platform and the functionality that it provides.
|
||||||
@ -31,5 +31,4 @@
|
|||||||
functions that make up the software platform.
|
functions that make up the software platform.
|
||||||
|
|
||||||
* Finally, the [Development Process](process/) document describes the
|
* Finally, the [Development Process](process/) document describes the
|
||||||
Open MCT Web software development cycle.
|
Open MCT software development cycle.
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Development Cycle
|
# Development Cycle
|
||||||
|
|
||||||
Development of Open MCT Web occurs on an iterative cycle of
|
Development of Open MCT occurs on an iterative cycle of
|
||||||
sprints and releases.
|
sprints and releases.
|
||||||
|
|
||||||
* A _sprint_ is three weeks in duration, and represents a
|
* A _sprint_ is three weeks in duration, and represents a
|
||||||
@ -151,11 +151,9 @@ emphasis on testing.
|
|||||||
ensuring software passes that testing in order to ship on time;
|
ensuring software passes that testing in order to ship on time;
|
||||||
may prefer to disable malfunctioning components and fix them
|
may prefer to disable malfunctioning components and fix them
|
||||||
in a subsequent sprint, for example.
|
in a subsequent sprint, for example.
|
||||||
* __Ship.__ Tag a code snapshot that has passed acceptance
|
* [__Ship.__](version.md) Tag a code snapshot that has passed release/sprint
|
||||||
testing and deploy that version. (Only true if acceptance
|
testing and deploy that version. (Only true if relevant
|
||||||
testing has passed by this point; if acceptance testing has not
|
testing has passed by this point; if testing has not
|
||||||
been passed, will need to make ad hoc decisions with stakeholders,
|
been passed, will need to make ad hoc decisions with stakeholders,
|
||||||
e.g. "extend the sprint" or "defer shipment until end of next
|
e.g. "extend the sprint" or "defer shipment until end of next
|
||||||
sprint.")
|
sprint.")
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
# Development Process
|
# Development Process
|
||||||
|
|
||||||
The process used to develop Open MCT Web is described in the following
|
The process used to develop Open MCT is described in the following
|
||||||
documents:
|
documents:
|
||||||
|
|
||||||
* [Development Cycle](cycle.md): Describes how and when specific
|
* The [Development Cycle](cycle.md) describes how and when specific
|
||||||
process points are repeated during development.
|
process points are repeated during development.
|
||||||
|
* The [Version Guide](version.md) describes version numbering for
|
||||||
|
Open MCT (both semantics and process.)
|
||||||
* Testing is described in two documents:
|
* Testing is described in two documents:
|
||||||
* The [Test Plan](testing/plan.md) summarizes the approaches used
|
* The [Test Plan](testing/plan.md) summarizes the approaches used
|
||||||
to test Open MCT Web.
|
to test Open MCT.
|
||||||
* The [Test Procedures](testing/procedures.md) document what
|
* The [Test Procedures](testing/procedures.md) document what
|
||||||
specific tests are performed to verify correctness, and how
|
specific tests are performed to verify correctness, and how
|
||||||
they should be carried out.
|
they should be carried out.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Test Levels
|
## Test Levels
|
||||||
|
|
||||||
Testing for Open MCT Web includes:
|
Testing for Open MCT includes:
|
||||||
|
|
||||||
* _Smoke testing_: Brief, informal testing to verify that no major issues
|
* _Smoke testing_: Brief, informal testing to verify that no major issues
|
||||||
or regressions are present in the software, or in specific features of
|
or regressions are present in the software, or in specific features of
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
This document is intended to be used:
|
This document is intended to be used:
|
||||||
|
|
||||||
* By testers, to verify that Open MCT Web behaves as specified.
|
* By testers, to verify that Open MCT behaves as specified.
|
||||||
* By the development team, to document new test cases and to provide
|
* By the development team, to document new test cases and to provide
|
||||||
guidance on how to author these.
|
guidance on how to author these.
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ Test cases should be narrow in scope; if a list of steps is excessively
|
|||||||
long (or must be written vaguely to be kept short) it should be broken
|
long (or must be written vaguely to be kept short) it should be broken
|
||||||
down into multiple tests which reference one another.
|
down into multiple tests which reference one another.
|
||||||
|
|
||||||
All requirements satisfied by Open MCT Web should be verifiable using
|
All requirements satisfied by Open MCT should be verifiable using
|
||||||
one or more test procedures.
|
one or more test procedures.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
|
142
docs/src/process/version.md
Normal file
142
docs/src/process/version.md
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
# Version Guide
|
||||||
|
|
||||||
|
This document describes semantics and processes for providing version
|
||||||
|
numbers for Open MCT, and additionally provides guidelines for dependent
|
||||||
|
projects developed by the same team.
|
||||||
|
|
||||||
|
Versions are incremented at specific points in Open MCT's
|
||||||
|
[Development Cycle](cycle.md); see that document for a description of
|
||||||
|
sprints and releases.
|
||||||
|
|
||||||
|
## Audience
|
||||||
|
|
||||||
|
Individuals interested in consuming version numbers can be categorized as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
* _Users_: Generally disinterested, occasionally wish to identify version
|
||||||
|
to cross-reference against documentation, or to report issues.
|
||||||
|
* _Testers_: Want to identify which version of the software they are
|
||||||
|
testing, e.g. to file issues for defects.
|
||||||
|
* _Internal developers_: Often, inverse of testers; want to identify which
|
||||||
|
version of software was/is in use when certain behavior is observed. Want
|
||||||
|
to be able to correlate versions in use with “streams” of development
|
||||||
|
(e.g. dev vs. prod), when possible.
|
||||||
|
* _External developers_: Need to understand which version of software is
|
||||||
|
in use when developing/maintaining plug-ins, in order to ensure
|
||||||
|
compatibility of their software.
|
||||||
|
|
||||||
|
## Version Reporting
|
||||||
|
|
||||||
|
Software versions should be reflected in the user interface of the
|
||||||
|
application in three ways:
|
||||||
|
|
||||||
|
* _Version number_: A semantic version (see below) which serves both to
|
||||||
|
uniquely identify releases, as well as to inform plug-in developers
|
||||||
|
about compatibility with previous releases.
|
||||||
|
* _Revision identifier_: While using git, the commit hash. Supports
|
||||||
|
internal developers and testers by uniquely identifying client
|
||||||
|
software snapshots.
|
||||||
|
* _Branding_: Identifies which variant is in use. (Typically, Open MCT
|
||||||
|
is re-branded when deployed for a specific mission or center.)
|
||||||
|
|
||||||
|
## Version Numbering
|
||||||
|
|
||||||
|
Open MCT shall provide version numbers consistent with
|
||||||
|
[Semantic Versioning 2.0.0](http://semver.org/). In summary, versions
|
||||||
|
are expressed in a "major.minor.patch" form, and incremented based on
|
||||||
|
nature of changes to external API. Breaking changes require a "major"
|
||||||
|
version increment; backwards-compatible changes require a "minor"
|
||||||
|
version increment; neutral changes (such as bug fixes) require a "patch"
|
||||||
|
version increment. A hyphen-separated suffix indicates a pre-release
|
||||||
|
version, which may be unstable or may not fully meet compatibility
|
||||||
|
requirements.
|
||||||
|
|
||||||
|
Additionally, the following project-specific standards will be used:
|
||||||
|
|
||||||
|
* During development, a "-SNAPSHOT" suffix shall be appended to the
|
||||||
|
version number. The version number before the suffix shall reflect
|
||||||
|
the next expected version number for release.
|
||||||
|
* Prior to a 1.0.0 release, the _minor_ version will be incremented
|
||||||
|
on a per-release basis; the _patch_ version will be incremented on a
|
||||||
|
per-sprint basis.
|
||||||
|
* Starting at version 1.0.0, version numbers will be updated with each
|
||||||
|
completed sprint. The version number for the sprint shall be
|
||||||
|
determined relative to the previous released version; the decision
|
||||||
|
to increment the _major_, _minor_, or _patch_ version should be
|
||||||
|
made based on the nature of changes during that release. (It is
|
||||||
|
recommended that these numbers are incremented as changes are
|
||||||
|
introduced, such that at end of release the version number may
|
||||||
|
be chosen by simply removing the suffix.)
|
||||||
|
* The first three sprints in a release may be unstable; in these cases, a
|
||||||
|
unique version identifier should still be generated, but a suffix
|
||||||
|
should be included to indicate that the version is not necessarily
|
||||||
|
production-ready. Recommended suffixes are:
|
||||||
|
|
||||||
|
Sprint | Suffix
|
||||||
|
:------:|:--------:
|
||||||
|
1 | `-alpha`
|
||||||
|
2 | `-beta`
|
||||||
|
3 | `-rc`
|
||||||
|
|
||||||
|
### Scope of External API
|
||||||
|
|
||||||
|
"External API" refers to the API exposed to, documented for, and used by
|
||||||
|
plug-in developers. Changes to interfaces used internally by Open MCT
|
||||||
|
(or otherwise not documented for use externally) require only a _patch_
|
||||||
|
version bump.
|
||||||
|
|
||||||
|
## Incrementing Versions
|
||||||
|
|
||||||
|
At the end of a sprint, the [project manager](cycle.md#roles)
|
||||||
|
should update (or delegate the task of updating) Open MCT version
|
||||||
|
numbers by the following process:
|
||||||
|
|
||||||
|
1. Update version number in `package.json`
|
||||||
|
1. Remove `-SNAPSHOT` suffix.
|
||||||
|
2. Verify that resulting version number meets semantic versioning
|
||||||
|
requirements relative to previous stable version. Increment if
|
||||||
|
necessary.
|
||||||
|
3. If version is considered unstable (which may be the case during
|
||||||
|
the first three sprints of a release), apply a new suffix per
|
||||||
|
[Version Numbering](#version-numbering) guidance above.
|
||||||
|
2. Tag the release.
|
||||||
|
1. Commit changes to `package.json` on the `master` branch.
|
||||||
|
The commit message should reference the sprint being closed,
|
||||||
|
preferably by a URL reference to the associated Milestone in
|
||||||
|
GitHub.
|
||||||
|
2. Verify that build still completes, that application passes
|
||||||
|
smoke-testing, and that only differences from tested versions
|
||||||
|
are the changes to version number above.
|
||||||
|
3. Push the `master` branch.
|
||||||
|
4. Tag this commit with the version number, prepending the letter "v".
|
||||||
|
(e.g. `git tag v0.9.3-alpha`)
|
||||||
|
5. Push the tag to GitHub. (e.g. `git push origin v0.9.3-alpha`).
|
||||||
|
3. Upload a release archive.
|
||||||
|
1. Run `npm pack` to generate the archive.
|
||||||
|
2. Use the [GitHub release interface](https://github.com/nasa/openmct/releases)
|
||||||
|
to draft a new release.
|
||||||
|
3. Choose the existing tag for the new version (created and pushed above.)
|
||||||
|
Enter the tag name as the release name as well; see existing releases
|
||||||
|
for examples.
|
||||||
|
4. Attach the release archive.
|
||||||
|
5. Designate the release as a "pre-release" as appropriate (for instance,
|
||||||
|
when the version number has been suffixed as unstable, or when
|
||||||
|
the version number is below 1.0.0.)
|
||||||
|
4. Restore snapshot status in `package.json`
|
||||||
|
1. Remove any suffix from the version number, or increment the
|
||||||
|
_patch_ version if there is no suffix.
|
||||||
|
2. Append a `-SNAPSHOT` suffix.
|
||||||
|
3. Commit changes to `package.json` on the `master` branch.
|
||||||
|
The commit message should reference the sprint being opened,
|
||||||
|
preferably by a URL reference to the associated Milestone in
|
||||||
|
GitHub.
|
||||||
|
4. Verify that build still completes, that application passes
|
||||||
|
smoke-testing.
|
||||||
|
5. Push the `master` branch.
|
||||||
|
|
||||||
|
Projects dependent on Open MCT being co-developed by the Open MCT
|
||||||
|
team should follow a similar process, except that they should
|
||||||
|
additionally update their dependency on Open MCT to point to the
|
||||||
|
latest archive when removing their `-SNAPSHOT` status, and
|
||||||
|
that they should be pointed back to the `master` branch after
|
||||||
|
this has completed.
|
File diff suppressed because it is too large
Load Diff
@ -32,7 +32,7 @@ define([
|
|||||||
|
|
||||||
legacyRegistry.register("example/eventGenerator", {
|
legacyRegistry.register("example/eventGenerator", {
|
||||||
"name": "Event Message Generator",
|
"name": "Event Message Generator",
|
||||||
"description": "Example of a component that produces event data.",
|
"description": "For development use. Creates sample event message data that mimics a live data stream.",
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"components": [
|
"components": [
|
||||||
{
|
{
|
||||||
@ -49,16 +49,26 @@ define([
|
|||||||
{
|
{
|
||||||
"key": "eventGenerator",
|
"key": "eventGenerator",
|
||||||
"name": "Event Message Generator",
|
"name": "Event Message Generator",
|
||||||
"glyph": "f",
|
"glyph": "\u0066",
|
||||||
"description": "An event message generator",
|
"description": "For development use. Creates sample event message data that mimics a live data stream.",
|
||||||
|
"priority": 10,
|
||||||
"features": "creation",
|
"features": "creation",
|
||||||
"model": {
|
"model": {
|
||||||
"telemetry": {}
|
"telemetry": {}
|
||||||
},
|
},
|
||||||
"telemetry": {
|
"telemetry": {
|
||||||
"source": "eventGenerator",
|
"source": "eventGenerator",
|
||||||
|
"domains": [
|
||||||
|
{
|
||||||
|
"key": "time",
|
||||||
|
"name": "Time",
|
||||||
|
"format": "utc"
|
||||||
|
}
|
||||||
|
],
|
||||||
"ranges": [
|
"ranges": [
|
||||||
{
|
{
|
||||||
|
"key": "message",
|
||||||
|
"name": "Message",
|
||||||
"format": "string"
|
"format": "string"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
58
example/eventGenerator/data/transcript.json
Normal file
58
example/eventGenerator/data/transcript.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
[
|
||||||
|
"CC: Eagle, Houston. You're GO for landing. Over.",
|
||||||
|
"LMP: Roger. Understand. GO for landing. 3000 feet. PROGRAM ALARM.",
|
||||||
|
"CC: Copy.",
|
||||||
|
"LMP: 1201",
|
||||||
|
"CDR: 1201.",
|
||||||
|
"CC: Roger. 1201 alarm. We're GO. Same type. We're GO.",
|
||||||
|
"LMP: 2000 feet. 2000 feet, Into the AGS, 47 degrees.",
|
||||||
|
"CC: Roger.",
|
||||||
|
"LMP: 47 degrees.",
|
||||||
|
"CC: Eagle, looking great. You're GO.",
|
||||||
|
"CC: Roger. 1202. We copy it.",
|
||||||
|
"O1: LMP 35 degrees. 35 degrees. 750. Coming aown to 23.fl",
|
||||||
|
"LMP: 700 feet, 21 down, 33 degrees.",
|
||||||
|
"LMP: 600 feet, down at 19.",
|
||||||
|
"LMP: 540 feet, down at - 30. Down at 15.",
|
||||||
|
"LMP: At 400 feet, down at 9.",
|
||||||
|
"LMP: ...forward.",
|
||||||
|
"LMP: 350 feet, down at 4.",
|
||||||
|
"LMP: 30, ... one-half down.",
|
||||||
|
"LMP: We're pegged on horizontal velocity.",
|
||||||
|
"LMP: 300 feet, down 3 1/2, 47 forward.",
|
||||||
|
"LMP: ... up.",
|
||||||
|
"LMP: On 1 a minute, 1 1/2 down.",
|
||||||
|
"CDR: 70.",
|
||||||
|
"LMP: Watch your shadow out there.",
|
||||||
|
"LMP: 50, down at 2 1/2, 19 forward.",
|
||||||
|
"LMP: Altitude-velocity light.",
|
||||||
|
"LMP: 3 1/2 down s 220 feet, 13 forward.",
|
||||||
|
"LMP: 1t forward. Coming down nicely.",
|
||||||
|
"LMP: 200 feet, 4 1/2 down.",
|
||||||
|
"LMP: 5 1/2 down.",
|
||||||
|
"LMP: 160, 6 - 6 1/2 down.",
|
||||||
|
"LMP: 5 1/2 down, 9 forward. That's good.",
|
||||||
|
"LMP: 120 feet.",
|
||||||
|
"LMP: 100 feet, 3 1/2 down, 9 forward. Five percent.",
|
||||||
|
"LMP: ...",
|
||||||
|
"LMP: Okay. 75 feet. There's looking good. Down a half, 6 forward.",
|
||||||
|
"CC: 60 seconds.",
|
||||||
|
"LMP: Lights on. ...",
|
||||||
|
"LMP: Down 2 1/2. Forward. Forward. Good.",
|
||||||
|
"LMP: 40 feet, down 2 1/2. Kicking up some dust.",
|
||||||
|
"LMP: 30 feet, 2 1/2 down. Faint shadow.",
|
||||||
|
"LMP: 4 forward. 4 forward. Drifting to the right a little. Okay. Down a half.",
|
||||||
|
"CC: 30 seconds.",
|
||||||
|
"CDR: Forward drift?",
|
||||||
|
"LMP: Yes.",
|
||||||
|
"LMP: Okay.",
|
||||||
|
"LMP: CONTACT LIGHT.",
|
||||||
|
"LMP: Okay. ENGINE STOP.",
|
||||||
|
"LMP: ACA - out of DETENT.",
|
||||||
|
"CDR: Out of DETENT.",
|
||||||
|
"LMP: MODE CONTROL - both AUTO. DESCENT ENGINE COMMAND OVERRIDE - OFF. ENGINE ARM - OFF.",
|
||||||
|
"LMP: 413 is in.",
|
||||||
|
"CC: We copy you down, Eagle.",
|
||||||
|
"CDR: Houston, Tranquility Base here.",
|
||||||
|
"CDR: THE EAGLE HAS LANDED."
|
||||||
|
]
|
@ -27,45 +27,12 @@
|
|||||||
* Modified by shale on 06/23/2015.
|
* Modified by shale on 06/23/2015.
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
[],
|
['text!../data/transcript.json'],
|
||||||
function () {
|
function (transcript) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var
|
var firstObservedTime = Date.now(),
|
||||||
firstObservedTime = Date.now(),
|
messages = JSON.parse(transcript);
|
||||||
messages = [];
|
|
||||||
|
|
||||||
messages.push(["CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Open the pod bay doors, Hal."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I'm sorry, Dave, I'm afraid I can't do that."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: What's the problem?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I think you know what the problem is just as well as I do."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: What're you talking about, Hal?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: This mission is too important for me to allow you to jeopardise it."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: I don't know what you're talking about, Hal."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I know that you and Frank were planning to disconnect me, and I'm afraid that's something I cannot allow to happen."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Where the hell'd you get that idea, Hal?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Dave, although you took very thorough precautions in the pod against my hearing you, I could see your lips move."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Alright, I'll go in through the emergency airlock."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Without your space-helmet, Dave, you're going to find that rather difficult."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Hal, I won't argue with you any more. Open the doors."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Dave, this conversation can serve no purpose any more. Goodbye."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I hope the two of you are not concerned about this."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: No, I'm not, Hal."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Are you quite sure?"]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Yeh. I'd like to ask you a question, though."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Of course."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: How would you account for this discrepancy between you and the twin 9000?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Well, I don't think there is any question about it. It can only be attributable to human error. This sort of thing has cropped up before, and it has always been due to human error."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Listen, There's never been any instance at all of a computer error occurring in the 9000 series, has there?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: None whatsoever, The 9000 series has a perfect operational record."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Well, of course, I know all the wonderful achievements of the 9000 series, but - er - huh - are you certain there's never been any case of even the most insignificant computer error?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: None whatsoever, Quite honestly, I wouldn't worry myself about that."]);
|
|
||||||
messages.push(["RESP: SYS-COMM MSG: (Pause) Well, I'm sure you're right, Umm - fine, thanks very much. Oh, Frank, I'm having a bit of trouble with my transmitter in C-pod, I wonder if you'd come down and take a look at it with me?"]);
|
|
||||||
messages.push(["CMD: SYS-HAL9K MSG: Sure."]);
|
|
||||||
messages.push(["RESP: SYS-COMM MSG: See you later, Hal."]);
|
|
||||||
|
|
||||||
|
|
||||||
function EventTelemetry(request, interval) {
|
function EventTelemetry(request, interval) {
|
||||||
|
|
||||||
@ -85,8 +52,7 @@ define(
|
|||||||
generatorData.getRangeValue = function (i, range) {
|
generatorData.getRangeValue = function (i, range) {
|
||||||
var domainDelta = this.getDomainValue(i) - firstObservedTime,
|
var domainDelta = this.getDomainValue(i) - firstObservedTime,
|
||||||
ind = i % messages.length;
|
ind = i % messages.length;
|
||||||
return "TEMP " + i.toString() + "-" + messages[ind][0] + "[" + domainDelta.toString() + "]";
|
return messages[ind] + " - [" + domainDelta.toString() + "]";
|
||||||
// TODO: Unsure why we are prepeding 'TEMP'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return generatorData;
|
return generatorData;
|
||||||
|
@ -37,7 +37,8 @@ define(
|
|||||||
var
|
var
|
||||||
subscriptions = [],
|
subscriptions = [],
|
||||||
genInterval = 1000,
|
genInterval = 1000,
|
||||||
startTime = Date.now();
|
generating = false,
|
||||||
|
id = Math.random() * 100000;
|
||||||
|
|
||||||
//
|
//
|
||||||
function matchesSource(request) {
|
function matchesSource(request) {
|
||||||
@ -79,11 +80,13 @@ define(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function startGenerating() {
|
function startGenerating() {
|
||||||
|
generating = true;
|
||||||
$timeout(function () {
|
$timeout(function () {
|
||||||
//console.log("startGenerating... " + Date.now());
|
|
||||||
handleSubscriptions();
|
handleSubscriptions();
|
||||||
if (subscriptions.length > 0) {
|
if (generating && subscriptions.length > 0) {
|
||||||
startGenerating();
|
startGenerating();
|
||||||
|
} else {
|
||||||
|
generating = false;
|
||||||
}
|
}
|
||||||
}, genInterval);
|
}, genInterval);
|
||||||
}
|
}
|
||||||
@ -93,7 +96,6 @@ define(
|
|||||||
callback: callback,
|
callback: callback,
|
||||||
requests: requests
|
requests: requests
|
||||||
};
|
};
|
||||||
|
|
||||||
function unsubscribe() {
|
function unsubscribe() {
|
||||||
subscriptions = subscriptions.filter(function (s) {
|
subscriptions = subscriptions.filter(function (s) {
|
||||||
return s !== subscription;
|
return s !== subscription;
|
||||||
@ -101,8 +103,7 @@ define(
|
|||||||
}
|
}
|
||||||
|
|
||||||
subscriptions.push(subscription);
|
subscriptions.push(subscription);
|
||||||
|
if (!generating) {
|
||||||
if (subscriptions.length === 1) {
|
|
||||||
startGenerating();
|
startGenerating();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
89
example/export/ExportTelemetryAsCSVAction.js
Normal file
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;
|
||||||
|
});
|
45
example/export/bundle.js
Normal file
45
example/export/bundle.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*/
|
||||||
|
|
||||||
|
define([
|
||||||
|
'legacyRegistry',
|
||||||
|
'./ExportTelemetryAsCSVAction'
|
||||||
|
], function (legacyRegistry, ExportTelemetryAsCSVAction) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
legacyRegistry.register("example/export", {
|
||||||
|
"name": "Example of using CSV Export",
|
||||||
|
"extensions": {
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"key": "example.export",
|
||||||
|
"name": "Export Telemetry as CSV",
|
||||||
|
"implementation": ExportTelemetryAsCSVAction,
|
||||||
|
"category": "contextual",
|
||||||
|
"glyph": "\u0033",
|
||||||
|
"depends": [ "exportService" ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
@ -36,7 +36,7 @@ define([
|
|||||||
|
|
||||||
legacyRegistry.register("example/generator", {
|
legacyRegistry.register("example/generator", {
|
||||||
"name": "Sine Wave Generator",
|
"name": "Sine Wave Generator",
|
||||||
"description": "Example of a component that produces dataa.",
|
"description": "For development use. Generates example streaming telemetry data using a simple sine wave algorithm.",
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"components": [
|
"components": [
|
||||||
{
|
{
|
||||||
@ -86,8 +86,9 @@ define([
|
|||||||
{
|
{
|
||||||
"key": "generator",
|
"key": "generator",
|
||||||
"name": "Sine Wave Generator",
|
"name": "Sine Wave Generator",
|
||||||
"glyph": "T",
|
"glyph": "\u0054",
|
||||||
"description": "A sine wave generator",
|
"description": "For development use. Generates example streaming telemetry data using a simple sine wave algorithm.",
|
||||||
|
"priority": 10,
|
||||||
"features": "creation",
|
"features": "creation",
|
||||||
"model": {
|
"model": {
|
||||||
"telemetry": {
|
"telemetry": {
|
||||||
@ -126,7 +127,7 @@ define([
|
|||||||
{
|
{
|
||||||
"name": "Period",
|
"name": "Period",
|
||||||
"control": "textfield",
|
"control": "textfield",
|
||||||
"cssclass": "l-small l-numeric",
|
"cssclass": "l-input-sm l-numeric",
|
||||||
"key": "period",
|
"key": "period",
|
||||||
"required": true,
|
"required": true,
|
||||||
"property": [
|
"property": [
|
||||||
|
@ -34,7 +34,8 @@ define(
|
|||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function SinewaveTelemetryProvider($q, $timeout) {
|
function SinewaveTelemetryProvider($q, $timeout) {
|
||||||
var subscriptions = [];
|
var subscriptions = [],
|
||||||
|
generating = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
function matchesSource(request) {
|
function matchesSource(request) {
|
||||||
@ -75,10 +76,13 @@ define(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function startGenerating() {
|
function startGenerating() {
|
||||||
|
generating = true;
|
||||||
$timeout(function () {
|
$timeout(function () {
|
||||||
handleSubscriptions();
|
handleSubscriptions();
|
||||||
if (subscriptions.length > 0) {
|
if (generating && subscriptions.length > 0) {
|
||||||
startGenerating();
|
startGenerating();
|
||||||
|
} else {
|
||||||
|
generating = false;
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
@ -97,7 +101,7 @@ define(
|
|||||||
|
|
||||||
subscriptions.push(subscription);
|
subscriptions.push(subscription);
|
||||||
|
|
||||||
if (subscriptions.length === 1) {
|
if (!generating) {
|
||||||
startGenerating();
|
startGenerating();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,8 +49,10 @@ define([
|
|||||||
{
|
{
|
||||||
"key": "imagery",
|
"key": "imagery",
|
||||||
"name": "Example Imagery",
|
"name": "Example Imagery",
|
||||||
"glyph": "T",
|
"glyph": "\u00e3",
|
||||||
"features": "creation",
|
"features": "creation",
|
||||||
|
"description": "For development use. Creates example imagery data that mimics a live imagery stream.",
|
||||||
|
"priority": 10,
|
||||||
"model": {
|
"model": {
|
||||||
"telemetry": {}
|
"telemetry": {}
|
||||||
},
|
},
|
||||||
@ -60,7 +62,7 @@ define([
|
|||||||
{
|
{
|
||||||
"name": "Time",
|
"name": "Time",
|
||||||
"key": "time",
|
"key": "time",
|
||||||
"format": "timestamp"
|
"format": "utc"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ranges": [
|
"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
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
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/msl-adapter", {
|
||||||
|
"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": "\u0054",
|
||||||
|
"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
1
example/msl/data/rems.json
Normal file
File diff suppressed because one or more lines are too long
79
example/msl/src/MSLDataDictionary.js
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
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;
|
||||||
|
}
|
||||||
|
);
|
95
example/msl/src/RemsTelemetryModelProvider.js
Normal file
95
example/msl/src/RemsTelemetryModelProvider.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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, parent){
|
||||||
|
var format = FORMAT_MAPPINGS[measurement.type];
|
||||||
|
models[makeId(measurement)] = {
|
||||||
|
type: "msl.measurement",
|
||||||
|
name: measurement.name,
|
||||||
|
location: parent,
|
||||||
|
telemetry: {
|
||||||
|
key: measurement.identifier,
|
||||||
|
ranges: [{
|
||||||
|
key: "value",
|
||||||
|
name: measurement.units,
|
||||||
|
units: measurement.units,
|
||||||
|
format: format
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function addInstrument(subsystem, spacecraftId) {
|
||||||
|
var measurements = (subsystem.measurements || []),
|
||||||
|
instrumentId = makeId(subsystem);
|
||||||
|
|
||||||
|
models[instrumentId] = {
|
||||||
|
type: "msl.instrument",
|
||||||
|
name: subsystem.name,
|
||||||
|
location: spacecraftId,
|
||||||
|
composition: measurements.map(makeId)
|
||||||
|
};
|
||||||
|
measurements.forEach(function(measurement) {
|
||||||
|
addMeasurement(measurement, instrumentId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
(dictionary.instruments || []).forEach(function(instrument) {
|
||||||
|
addInstrument(instrument, "msl:curiosity");
|
||||||
|
});
|
||||||
|
return models;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
getModels: function (ids) {
|
||||||
|
return ids.some(isRelevant) ? buildTaxonomy(adapter.dictionary) : {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return RemsTelemetryModelProvider;
|
||||||
|
}
|
||||||
|
);
|
83
example/msl/src/RemsTelemetryProvider.js
Normal file
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
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
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="status block ok" ng-controller="DialogLaunchController">
|
||||||
<span class="ui-symbol status-indicator"></span>
|
<!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! -->
|
||||||
<span class="label">
|
<span class="ui-symbol status-indicator"></span><span class="label">
|
||||||
<a ng-click="launchProgress(true)">Known</a> |
|
<a ng-click="launchProgress(true)">Known</a> |
|
||||||
<a ng-click="launchProgress(false)">Unknown</a> |
|
<a ng-click="launchProgress(false)">Unknown</a> |
|
||||||
<a ng-click="launchError()">Error</a> |
|
<a ng-click="launchError()">Error</a> |
|
||||||
<a ng-click="launchInfo()">Info</a>
|
<a ng-click="launchInfo()">Info</a>
|
||||||
</span>
|
</span><span class="count">Dialogs</span>
|
||||||
<span class="count">Dialogs</span>
|
|
||||||
</span>
|
</span>
|
@ -1,10 +1,9 @@
|
|||||||
<span class="status block ok" ng-controller="NotificationLaunchController">
|
<span class="status block ok" ng-controller="NotificationLaunchController">
|
||||||
<span class="ui-symbol status-indicator"></span>
|
<!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! -->
|
||||||
<span class="label">
|
<span class="ui-symbol status-indicator"></span><span class="label">
|
||||||
<a ng-click="newInfo()">Success</a> |
|
<a ng-click="newInfo()">Success</a> |
|
||||||
<a ng-click="newError()">Error</a> |
|
<a ng-click="newError()">Error</a> |
|
||||||
<a ng-click="newAlert()">Alert</a> |
|
<a ng-click="newAlert()">Alert</a> |
|
||||||
<a ng-click="newProgress()">Progress</a>
|
<a ng-click="newProgress()">Progress</a>
|
||||||
</span>
|
</span><span class="count">Notifications</span>
|
||||||
<span class="count">Notifications</span>
|
|
||||||
</span>
|
</span>
|
146
example/plotOptions/bundle.js
Normal file
146
example/plotOptions/bundle.js
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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": "Example Telemetry Plot",
|
||||||
|
"glyph": "\u0074",
|
||||||
|
"description": "For development use. A plot for displaying telemetry.",
|
||||||
|
"priority": 10,
|
||||||
|
"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*)?$"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
91
gulpfile.js
91
gulpfile.js
@ -21,35 +21,33 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/*global require,__dirname*/
|
/*global require,__dirname*/
|
||||||
|
|
||||||
var gulp = require('gulp'),
|
var gulp = require('gulp'),
|
||||||
requirejsOptimize = require('gulp-requirejs-optimize'),
|
|
||||||
sourcemaps = require('gulp-sourcemaps'),
|
sourcemaps = require('gulp-sourcemaps'),
|
||||||
compass = require('gulp-compass'),
|
|
||||||
jshint = require('gulp-jshint'),
|
|
||||||
jscs = require('gulp-jscs'),
|
|
||||||
replace = require('gulp-replace-task'),
|
|
||||||
karma = require('karma'),
|
|
||||||
path = require('path'),
|
path = require('path'),
|
||||||
fs = require('fs'),
|
fs = require('fs'),
|
||||||
git = require('git-rev-sync'),
|
git = require('git-rev-sync'),
|
||||||
moment = require('moment'),
|
moment = require('moment'),
|
||||||
project = require('./package.json'),
|
project = require('./package.json'),
|
||||||
|
_ = require('lodash'),
|
||||||
paths = {
|
paths = {
|
||||||
main: 'main.js',
|
main: 'main.js',
|
||||||
dist: 'dist',
|
dist: 'dist',
|
||||||
assets: 'dist/assets',
|
scss: ['./platform/**/*.scss', './example/**/*.scss'],
|
||||||
scss: 'platform/**/*.scss',
|
assets: [
|
||||||
|
'./{example,platform}/**/*.{css,css.map,png,svg,ico,woff,eot,ttf}'
|
||||||
|
],
|
||||||
scripts: [ 'main.js', 'platform/**/*.js', 'src/**/*.js' ],
|
scripts: [ 'main.js', 'platform/**/*.js', 'src/**/*.js' ],
|
||||||
static: [
|
specs: [ 'platform/**/*Spec.js', 'src/**/*Spec.js' ],
|
||||||
'index.html',
|
|
||||||
'platform/**/*',
|
|
||||||
'example/**/*',
|
|
||||||
'bower_components/**/*'
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
options = {
|
options = {
|
||||||
requirejsOptimize: {
|
requirejsOptimize: {
|
||||||
name: paths.main.replace(/\.js$/, ''),
|
name: 'bower_components/almond/almond.js',
|
||||||
|
include: paths.main.replace('.js', ''),
|
||||||
|
wrap: {
|
||||||
|
startFile: "src/start.frag",
|
||||||
|
endFile: "src/end.frag"
|
||||||
|
},
|
||||||
mainConfigFile: paths.main,
|
mainConfigFile: paths.main,
|
||||||
wrapShim: true
|
wrapShim: true
|
||||||
},
|
},
|
||||||
@ -57,9 +55,8 @@ var gulp = require('gulp'),
|
|||||||
configFile: path.resolve(__dirname, 'karma.conf.js'),
|
configFile: path.resolve(__dirname, 'karma.conf.js'),
|
||||||
singleRun: true
|
singleRun: true
|
||||||
},
|
},
|
||||||
compass: {
|
sass: {
|
||||||
sass: __dirname,
|
sourceComments: true
|
||||||
css: paths.assets
|
|
||||||
},
|
},
|
||||||
replace: {
|
replace: {
|
||||||
variables: {
|
variables: {
|
||||||
@ -72,6 +69,8 @@ var gulp = require('gulp'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
gulp.task('scripts', function () {
|
gulp.task('scripts', function () {
|
||||||
|
var requirejsOptimize = require('gulp-requirejs-optimize');
|
||||||
|
var replace = require('gulp-replace-task');
|
||||||
return gulp.src(paths.main)
|
return gulp.src(paths.main)
|
||||||
.pipe(sourcemaps.init())
|
.pipe(sourcemaps.init())
|
||||||
.pipe(requirejsOptimize(options.requirejsOptimize))
|
.pipe(requirejsOptimize(options.requirejsOptimize))
|
||||||
@ -81,23 +80,48 @@ gulp.task('scripts', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('test', function (done) {
|
gulp.task('test', function (done) {
|
||||||
|
var karma = require('karma');
|
||||||
new karma.Server(options.karma, done).start();
|
new karma.Server(options.karma, done).start();
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('stylesheets', function () {
|
gulp.task('stylesheets', function () {
|
||||||
return gulp.src(paths.scss)
|
var sass = require('gulp-sass');
|
||||||
.pipe(compass(options.compass))
|
var rename = require('gulp-rename');
|
||||||
.pipe(gulp.dest(paths.assets));
|
var bourbon = require('node-bourbon');
|
||||||
|
options.sass.includePaths = bourbon.includePaths;
|
||||||
|
|
||||||
|
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(path.sep + 'sass', path.sep + 'css');
|
||||||
|
return file;
|
||||||
|
}))
|
||||||
|
.pipe(sourcemaps.write('.'))
|
||||||
|
.pipe(gulp.dest(__dirname));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('lint', function () {
|
gulp.task('lint', function () {
|
||||||
return gulp.src(paths.scripts)
|
var jshint = require('gulp-jshint');
|
||||||
.pipe(jshint())
|
var merge = require('merge-stream');
|
||||||
|
|
||||||
|
var nonspecs = paths.specs.map(function (glob) {
|
||||||
|
return "!" + glob;
|
||||||
|
}),
|
||||||
|
scriptLint = gulp.src(paths.scripts.concat(nonspecs))
|
||||||
|
.pipe(jshint()),
|
||||||
|
specLint = gulp.src(paths.specs)
|
||||||
|
.pipe(jshint({ jasmine: true }));
|
||||||
|
|
||||||
|
return merge(scriptLint, specLint)
|
||||||
.pipe(jshint.reporter('default'))
|
.pipe(jshint.reporter('default'))
|
||||||
.pipe(jshint.reporter('fail'));
|
.pipe(jshint.reporter('fail'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('checkstyle', function () {
|
gulp.task('checkstyle', function () {
|
||||||
|
var jscs = require('gulp-jscs');
|
||||||
|
|
||||||
return gulp.src(paths.scripts)
|
return gulp.src(paths.scripts)
|
||||||
.pipe(jscs())
|
.pipe(jscs())
|
||||||
.pipe(jscs.reporter())
|
.pipe(jscs.reporter())
|
||||||
@ -105,18 +129,31 @@ gulp.task('checkstyle', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('fixstyle', function () {
|
gulp.task('fixstyle', function () {
|
||||||
|
var jscs = require('gulp-jscs');
|
||||||
|
|
||||||
return gulp.src(paths.scripts, { base: '.' })
|
return gulp.src(paths.scripts, { base: '.' })
|
||||||
.pipe(jscs({ fix: true }))
|
.pipe(jscs({ fix: true }))
|
||||||
.pipe(gulp.dest('.'));
|
.pipe(gulp.dest('.'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('static', function () {
|
gulp.task('assets', ['stylesheets'], function () {
|
||||||
return gulp.src(paths.static, { base: '.' })
|
return gulp.src(paths.assets)
|
||||||
.pipe(gulp.dest(paths.dist));
|
.pipe(gulp.dest(paths.dist));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('install', [ 'static', 'scripts' ]);
|
gulp.task('watch', function () {
|
||||||
|
return gulp.watch(paths.scss, ['stylesheets', 'assets']);
|
||||||
|
});
|
||||||
|
|
||||||
gulp.task('verify', [ 'lint', 'test' ]);
|
gulp.task('serve', function () {
|
||||||
|
console.log('Running development server with all defaults');
|
||||||
|
var app = require('./app.js');
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('develop', ['serve', 'install', 'watch']);
|
||||||
|
|
||||||
|
gulp.task('install', [ 'assets', 'scripts' ]);
|
||||||
|
|
||||||
|
gulp.task('verify', [ 'lint', 'test', 'checkstyle' ]);
|
||||||
|
|
||||||
gulp.task('build', [ 'verify', 'install' ]);
|
gulp.task('build', [ 'verify', 'install' ]);
|
||||||
|
17
index.html
17
index.html
@ -30,16 +30,27 @@
|
|||||||
</script>
|
</script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
require(['main'], function (mct) {
|
require(['main'], function (mct) {
|
||||||
|
require([
|
||||||
|
'./tutorials/todo/todo',
|
||||||
|
'./example/imagery/bundle',
|
||||||
|
'./example/eventGenerator/bundle',
|
||||||
|
'./example/generator/bundle'
|
||||||
|
], function (todoPlugin) {
|
||||||
|
mct.install(todoPlugin);
|
||||||
mct.run();
|
mct.run();
|
||||||
|
})
|
||||||
});
|
});
|
||||||
</script>
|
</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-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-96x96.png" sizes="96x96">
|
||||||
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16">
|
<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">
|
<link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico">
|
||||||
</head>
|
</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>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/*global module*/
|
/*global module,process*/
|
||||||
module.exports = function(config) {
|
module.exports = function(config) {
|
||||||
config.set({
|
config.set({
|
||||||
|
|
||||||
@ -39,6 +39,7 @@ module.exports = function(config) {
|
|||||||
{pattern: 'example/**/*.js', included: false},
|
{pattern: 'example/**/*.js', included: false},
|
||||||
{pattern: 'platform/**/*.js', included: false},
|
{pattern: 'platform/**/*.js', included: false},
|
||||||
{pattern: 'warp/**/*.js', included: false},
|
{pattern: 'warp/**/*.js', included: false},
|
||||||
|
{pattern: 'platform/**/*.html', included: false},
|
||||||
'test-main.js'
|
'test-main.js'
|
||||||
],
|
],
|
||||||
|
|
||||||
@ -57,7 +58,7 @@ module.exports = function(config) {
|
|||||||
// Test results reporter to use
|
// Test results reporter to use
|
||||||
// Possible values: 'dots', 'progress'
|
// Possible values: 'dots', 'progress'
|
||||||
// Available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
// Available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||||
reporters: ['progress', 'coverage', 'html'],
|
reporters: ['progress', 'coverage', 'html', 'junit'],
|
||||||
|
|
||||||
// Web server port.
|
// Web server port.
|
||||||
port: 9876,
|
port: 9876,
|
||||||
@ -78,7 +79,14 @@ module.exports = function(config) {
|
|||||||
|
|
||||||
// Code coverage reporting.
|
// Code coverage reporting.
|
||||||
coverageReporter: {
|
coverageReporter: {
|
||||||
dir: "dist/coverage"
|
dir: process.env.CIRCLE_ARTIFACTS ?
|
||||||
|
process.env.CIRCLE_ARTIFACTS + '/coverage' :
|
||||||
|
"dist/coverage",
|
||||||
|
check: {
|
||||||
|
global: {
|
||||||
|
lines: 80
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// HTML test reporting.
|
// HTML test reporting.
|
||||||
@ -88,6 +96,10 @@ module.exports = function(config) {
|
|||||||
foldAll: false
|
foldAll: false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
junitReporter: {
|
||||||
|
outputDir: process.env.CIRCLE_TEST_REPORTS || 'target/junit'
|
||||||
|
},
|
||||||
|
|
||||||
// Continuous Integration mode.
|
// Continuous Integration mode.
|
||||||
// If true, Karma captures browsers, runs the tests and exits.
|
// If true, Karma captures browsers, runs the tests and exits.
|
||||||
singleRun: true
|
singleRun: true
|
||||||
|
84
main.js
84
main.js
@ -19,19 +19,24 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define, window, requirejs*/
|
/*global requirejs*/
|
||||||
|
|
||||||
requirejs.config({
|
requirejs.config({
|
||||||
"paths": {
|
"paths": {
|
||||||
"legacyRegistry": "src/legacyRegistry",
|
"legacyRegistry": "src/legacyRegistry",
|
||||||
"angular": "bower_components/angular/angular.min",
|
"angular": "bower_components/angular/angular.min",
|
||||||
"angular-route": "bower_components/angular-route/angular-route.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",
|
"es6-promise": "bower_components/es6-promise/promise.min",
|
||||||
|
"EventEmitter": "bower_components/eventemitter3/index",
|
||||||
"moment": "bower_components/moment/moment",
|
"moment": "bower_components/moment/moment",
|
||||||
"moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format",
|
"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",
|
"screenfull": "bower_components/screenfull/dist/screenfull.min",
|
||||||
"text": "bower_components/text/text",
|
"text": "bower_components/text/text",
|
||||||
"uuid": "bower_components/node-uuid/uuid"
|
"uuid": "bower_components/node-uuid/uuid",
|
||||||
|
"zepto": "bower_components/zepto/zepto.min",
|
||||||
|
"lodash": "bower_components/lodash/lodash"
|
||||||
},
|
},
|
||||||
"shim": {
|
"shim": {
|
||||||
"angular": {
|
"angular": {
|
||||||
@ -40,60 +45,43 @@ requirejs.config({
|
|||||||
"angular-route": {
|
"angular-route": {
|
||||||
"deps": ["angular"]
|
"deps": ["angular"]
|
||||||
},
|
},
|
||||||
|
"EventEmitter": {
|
||||||
|
"exports": "EventEmitter"
|
||||||
|
},
|
||||||
"moment-duration-format": {
|
"moment-duration-format": {
|
||||||
"deps": ["moment"]
|
"deps": ["moment"]
|
||||||
|
},
|
||||||
|
"screenfull": {
|
||||||
|
"exports": "screenfull"
|
||||||
|
},
|
||||||
|
"zepto": {
|
||||||
|
"exports": "Zepto"
|
||||||
|
},
|
||||||
|
"lodash": {
|
||||||
|
"exports": "lodash"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
define([
|
define([
|
||||||
'./platform/framework/src/Main',
|
'./platform/framework/src/Main',
|
||||||
'legacyRegistry',
|
'./src/defaultRegistry',
|
||||||
|
'./src/MCT'
|
||||||
|
], function (Main, defaultRegistry, MCT) {
|
||||||
|
var mct = new MCT();
|
||||||
|
|
||||||
'./platform/framework/bundle',
|
mct.legacyRegistry = defaultRegistry;
|
||||||
'./platform/core/bundle',
|
mct.run = function (domElement) {
|
||||||
'./platform/representation/bundle',
|
if (!domElement) { domElement = document.body; }
|
||||||
'./platform/commonUI/about/bundle',
|
var appDiv = document.createElement('div');
|
||||||
'./platform/commonUI/browse/bundle',
|
appDiv.setAttribute('ng-view', '');
|
||||||
'./platform/commonUI/edit/bundle',
|
appDiv.className = 'user-environ';
|
||||||
'./platform/commonUI/dialog/bundle',
|
domElement.appendChild(appDiv);
|
||||||
'./platform/commonUI/formats/bundle',
|
mct.start();
|
||||||
'./platform/commonUI/general/bundle',
|
|
||||||
'./platform/commonUI/inspect/bundle',
|
|
||||||
'./platform/commonUI/mobile/bundle',
|
|
||||||
'./platform/commonUI/themes/espresso/bundle',
|
|
||||||
'./platform/commonUI/notification/bundle',
|
|
||||||
'./platform/containment/bundle',
|
|
||||||
'./platform/execution/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/forms/bundle',
|
|
||||||
'./platform/identity/bundle',
|
|
||||||
'./platform/persistence/aggregator/bundle',
|
|
||||||
'./platform/persistence/local/bundle',
|
|
||||||
'./platform/persistence/queue/bundle',
|
|
||||||
'./platform/policy/bundle',
|
|
||||||
'./platform/entanglement/bundle',
|
|
||||||
'./platform/search/bundle',
|
|
||||||
'./platform/status/bundle',
|
|
||||||
|
|
||||||
'./example/imagery/bundle',
|
|
||||||
'./example/eventGenerator/bundle',
|
|
||||||
'./example/generator/bundle'
|
|
||||||
], function (Main, legacyRegistry) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
return {
|
|
||||||
legacyRegistry: legacyRegistry,
|
|
||||||
run: function () {
|
|
||||||
return new Main().run(legacyRegistry);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
mct.on('start', function () {
|
||||||
|
return new Main().run(defaultRegistry);
|
||||||
|
});
|
||||||
|
|
||||||
|
return mct;
|
||||||
});
|
});
|
64
object-provider.html
Normal file
64
object-provider.html
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Groot Tutorial</title>
|
||||||
|
<script src="dist/main.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// First, we need a source of objects, so we're going to define a few
|
||||||
|
// objects that we wish to expose. The first object is a folder which
|
||||||
|
// contains the other objects.
|
||||||
|
|
||||||
|
|
||||||
|
var GROOT_ROOT = {
|
||||||
|
name: 'I am groot',
|
||||||
|
type: 'folder',
|
||||||
|
composition: [
|
||||||
|
{
|
||||||
|
namespace: 'groot',
|
||||||
|
identifier: 'arms'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
namespace: 'groot',
|
||||||
|
identifier: 'legs'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
namespace: 'groot',
|
||||||
|
identifier: 'torso'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
// Now, we will define an object provider. This will allow us to fetch the
|
||||||
|
// GROOT_ROOT object, plus any other objects in the `groot` namespace.
|
||||||
|
// For more info, see the Object API documentation.
|
||||||
|
|
||||||
|
MCT.Objects.addProvider('groot', {
|
||||||
|
// we'll only define a get function, objects from this provider will
|
||||||
|
// not be mutable.
|
||||||
|
get: function (key) {
|
||||||
|
if (key.identifier === 'groot') {
|
||||||
|
return Promise.resolve(GROOT_ROOT);
|
||||||
|
}
|
||||||
|
return Promise.resolve({
|
||||||
|
name: 'Groot\'s ' + key.identifier
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Finally, we need to add a "ROOT." This is an identifier for an object
|
||||||
|
// that Open MCT will load at run time and show at the top-level of the
|
||||||
|
// navigation tree.
|
||||||
|
|
||||||
|
MCT.Objects.addRoot({
|
||||||
|
namespace: 'groot',
|
||||||
|
identifier: 'groot'
|
||||||
|
});
|
||||||
|
|
||||||
|
MCT.run();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
27
package.json
27
package.json
@ -1,21 +1,23 @@
|
|||||||
{
|
{
|
||||||
"name": "openmctweb",
|
"name": "openmct",
|
||||||
"version": "0.9.2-SNAPSHOT",
|
"version": "0.10.2-SNAPSHOT",
|
||||||
"description": "The Open MCT Web core platform",
|
"description": "The Open MCT core platform",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^4.13.1",
|
"express": "^4.13.1",
|
||||||
"minimist": "^1.1.1"
|
"minimist": "^1.1.1",
|
||||||
|
"request": "^2.69.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bower": "^1.7.7",
|
"bower": "^1.7.7",
|
||||||
"git-rev-sync": "^1.4.0",
|
"git-rev-sync": "^1.4.0",
|
||||||
"glob": ">= 3.0.0",
|
"glob": ">= 3.0.0",
|
||||||
"gulp": "^3.9.0",
|
"gulp": "^3.9.0",
|
||||||
"gulp-compass": "^2.1.0",
|
|
||||||
"gulp-jscs": "^3.0.2",
|
"gulp-jscs": "^3.0.2",
|
||||||
"gulp-jshint": "^2.0.0",
|
"gulp-jshint": "^2.0.0",
|
||||||
|
"gulp-rename": "^1.2.2",
|
||||||
"gulp-replace-task": "^0.11.0",
|
"gulp-replace-task": "^0.11.0",
|
||||||
"gulp-requirejs-optimize": "^0.3.1",
|
"gulp-requirejs-optimize": "^0.3.1",
|
||||||
|
"gulp-sass": "^2.2.0",
|
||||||
"gulp-sourcemaps": "^1.6.0",
|
"gulp-sourcemaps": "^1.6.0",
|
||||||
"jasmine-core": "^2.3.0",
|
"jasmine-core": "^2.3.0",
|
||||||
"jsdoc": "^3.3.2",
|
"jsdoc": "^3.3.2",
|
||||||
@ -26,30 +28,33 @@
|
|||||||
"karma-coverage": "^0.5.3",
|
"karma-coverage": "^0.5.3",
|
||||||
"karma-html-reporter": "^0.2.7",
|
"karma-html-reporter": "^0.2.7",
|
||||||
"karma-jasmine": "^0.1.5",
|
"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",
|
"karma-requirejs": "^0.2.2",
|
||||||
"lodash": "^3.10.1",
|
"lodash": "^3.10.1",
|
||||||
"markdown-toc": "^0.11.7",
|
"markdown-toc": "^0.11.7",
|
||||||
"marked": "^0.3.5",
|
"marked": "^0.3.5",
|
||||||
|
"merge-stream": "^1.0.0",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"moment": "^2.11.1",
|
"moment": "^2.11.1",
|
||||||
"phantomjs": "^1.9.19",
|
"node-bourbon": "^4.2.3",
|
||||||
"requirejs": "^2.1.17",
|
"phantomjs-prebuilt": "^2.1.0",
|
||||||
|
"requirejs": "2.1.x",
|
||||||
"split": "^1.0.0"
|
"split": "^1.0.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node app.js",
|
"start": "node app.js",
|
||||||
"test": "karma start --single-run",
|
"test": "karma start --single-run",
|
||||||
"jshint": "jshint platform example || exit 0",
|
"jshint": "jshint platform example",
|
||||||
"watch": "karma start",
|
"watch": "karma start",
|
||||||
"jsdoc": "jsdoc -c jsdoc.json -r -d target/docs/api",
|
"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'",
|
"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"
|
"prepublish": "node ./node_modules/bower/bin/bower install && node ./node_modules/gulp/bin/gulp.js install"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nasa/openmctweb.git"
|
"url": "https://github.com/nasa/openmct.git"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
@ -19,22 +19,34 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"text!./res/templates/about-dialog.html",
|
"text!./res/templates/about-dialog.html",
|
||||||
"./src/LogoController",
|
"./src/LogoController",
|
||||||
"./src/AboutController",
|
"./src/AboutController",
|
||||||
"./src/LicenseController",
|
"./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'
|
'legacyRegistry'
|
||||||
], function (
|
], function (
|
||||||
aboutDialogTemplate,
|
aboutDialogTemplate,
|
||||||
LogoController,
|
LogoController,
|
||||||
AboutController,
|
AboutController,
|
||||||
LicenseController,
|
LicenseController,
|
||||||
|
appLogoTemplate,
|
||||||
|
aboutLogoTemplate,
|
||||||
|
overlayAboutTemplate,
|
||||||
|
licenseApacheTemplate,
|
||||||
|
licenseMitTemplate,
|
||||||
|
licensesTemplate,
|
||||||
|
licensesExportMdTemplate,
|
||||||
legacyRegistry
|
legacyRegistry
|
||||||
) {
|
) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
legacyRegistry.register("platform/commonUI/about", {
|
legacyRegistry.register("platform/commonUI/about", {
|
||||||
"name": "About Open MCT Web",
|
"name": "About Open MCT Web",
|
||||||
@ -43,12 +55,12 @@ define([
|
|||||||
{
|
{
|
||||||
"key": "app-logo",
|
"key": "app-logo",
|
||||||
"priority": "optional",
|
"priority": "optional",
|
||||||
"templateUrl": "templates/app-logo.html"
|
"template": appLogoTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "about-logo",
|
"key": "about-logo",
|
||||||
"priority": "preferred",
|
"priority": "preferred",
|
||||||
"templateUrl": "templates/about-logo.html"
|
"template": aboutLogoTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "about-dialog",
|
"key": "about-dialog",
|
||||||
@ -56,15 +68,15 @@ define([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "overlay-about",
|
"key": "overlay-about",
|
||||||
"templateUrl": "templates/overlay-about.html"
|
"template": overlayAboutTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "license-apache",
|
"key": "license-apache",
|
||||||
"templateUrl": "templates/license-apache.html"
|
"template": licenseApacheTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "license-mit",
|
"key": "license-mit",
|
||||||
"templateUrl": "templates/license-mit.html"
|
"template": licenseMitTemplate
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"controllers": [
|
"controllers": [
|
||||||
@ -156,11 +168,11 @@ define([
|
|||||||
"routes": [
|
"routes": [
|
||||||
{
|
{
|
||||||
"when": "/licenses",
|
"when": "/licenses",
|
||||||
"templateUrl": "templates/licenses.html"
|
"template": licensesTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"when": "/licenses-md",
|
"when": "/licenses-md",
|
||||||
"templateUrl": "templates/licenses-export-md.html"
|
"template": licensesExportMdTemplate
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,9 @@
|
|||||||
at runtime from the About dialog for additional information.
|
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="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-splash s-splash"></div>
|
||||||
<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="s-text l-content">
|
<div class="s-text l-content">
|
||||||
<h1 class="l-title s-title">OpenMCT Web</h1>
|
<h1 class="l-title s-title">Open MCT</h1>
|
||||||
<div class="l-description s-description">
|
<div class="l-description s-description">
|
||||||
<p>Open MCT Web, Copyright © 2014-2015, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.</p>
|
<p>Open MCT Web, Copyright © 2014-2015, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.</p>
|
||||||
<p>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 <a target="_blank" href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>.</p>
|
<p>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 <a target="_blank" href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>.</p>
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,7 +28,6 @@
|
|||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The AboutController provides information to populate the
|
* The AboutController provides information to populate the
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides extension-introduced licenses information to the
|
* Provides extension-introduced licenses information to the
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The LogoController provides functionality to the application
|
* The LogoController provides functionality to the application
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
['../src/AboutController'],
|
['../src/AboutController'],
|
||||||
function (AboutController) {
|
function (AboutController) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The About controller", function () {
|
describe("The About controller", function () {
|
||||||
var testVersions,
|
var testVersions,
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
['../src/LicenseController'],
|
['../src/LicenseController'],
|
||||||
function (LicenseController) {
|
function (LicenseController) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The License controller", function () {
|
describe("The License controller", function () {
|
||||||
var testLicenses,
|
var testLicenses,
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
['../src/LogoController'],
|
['../src/LogoController'],
|
||||||
function (LogoController) {
|
function (LogoController) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The About controller", function () {
|
describe("The About controller", function () {
|
||||||
var mockOverlayService,
|
var mockOverlayService,
|
||||||
|
@ -19,59 +19,72 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"./src/BrowseController",
|
"./src/BrowseController",
|
||||||
"./src/PaneController",
|
"./src/PaneController",
|
||||||
"./src/BrowseObjectController",
|
"./src/BrowseObjectController",
|
||||||
"./src/creation/CreateMenuController",
|
|
||||||
"./src/creation/LocatorController",
|
|
||||||
"./src/MenuArrowController",
|
"./src/MenuArrowController",
|
||||||
"./src/navigation/NavigationService",
|
"./src/navigation/NavigationService",
|
||||||
"./src/creation/CreationPolicy",
|
|
||||||
"./src/navigation/NavigateAction",
|
"./src/navigation/NavigateAction",
|
||||||
"./src/windowing/NewTabAction",
|
"./src/windowing/NewTabAction",
|
||||||
"./src/windowing/FullscreenAction",
|
"./src/windowing/FullscreenAction",
|
||||||
"./src/creation/CreateActionProvider",
|
|
||||||
"./src/creation/AddActionProvider",
|
|
||||||
"./src/creation/CreationService",
|
|
||||||
"./src/windowing/WindowTitler",
|
"./src/windowing/WindowTitler",
|
||||||
|
"text!./res/templates/browse.html",
|
||||||
|
"text!./res/templates/browse-object.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",
|
||||||
|
"text!./res/templates/view-object.html",
|
||||||
'legacyRegistry'
|
'legacyRegistry'
|
||||||
], function (
|
], function (
|
||||||
BrowseController,
|
BrowseController,
|
||||||
PaneController,
|
PaneController,
|
||||||
BrowseObjectController,
|
BrowseObjectController,
|
||||||
CreateMenuController,
|
|
||||||
LocatorController,
|
|
||||||
MenuArrowController,
|
MenuArrowController,
|
||||||
NavigationService,
|
NavigationService,
|
||||||
CreationPolicy,
|
|
||||||
NavigateAction,
|
NavigateAction,
|
||||||
NewTabAction,
|
NewTabAction,
|
||||||
FullscreenAction,
|
FullscreenAction,
|
||||||
CreateActionProvider,
|
|
||||||
AddActionProvider,
|
|
||||||
CreationService,
|
|
||||||
WindowTitler,
|
WindowTitler,
|
||||||
|
browseTemplate,
|
||||||
|
browseObjectTemplate,
|
||||||
|
gridItemTemplate,
|
||||||
|
objectHeaderTemplate,
|
||||||
|
menuArrowTemplate,
|
||||||
|
backArrowTemplate,
|
||||||
|
itemsTemplate,
|
||||||
|
objectPropertiesTemplate,
|
||||||
|
inspectorRegionTemplate,
|
||||||
|
viewObjectTemplate,
|
||||||
legacyRegistry
|
legacyRegistry
|
||||||
) {
|
) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
legacyRegistry.register("platform/commonUI/browse", {
|
legacyRegistry.register("platform/commonUI/browse", {
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"routes": [
|
"routes": [
|
||||||
{
|
{
|
||||||
"when": "/browse/:ids*",
|
"when": "/browse/:ids*",
|
||||||
"templateUrl": "templates/browse.html",
|
"template": browseTemplate,
|
||||||
"reloadOnSearch": false
|
"reloadOnSearch": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"when": "",
|
"when": "",
|
||||||
"templateUrl": "templates/browse.html",
|
"template": browseTemplate,
|
||||||
"reloadOnSearch": false
|
"reloadOnSearch": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"constants": [
|
||||||
|
{
|
||||||
|
"key": "DEFAULT_PATH",
|
||||||
|
"value": "mine",
|
||||||
|
"priority": "fallback"
|
||||||
|
}
|
||||||
|
],
|
||||||
"controllers": [
|
"controllers": [
|
||||||
{
|
{
|
||||||
"key": "BrowseController",
|
"key": "BrowseController",
|
||||||
@ -80,10 +93,12 @@ define([
|
|||||||
"$scope",
|
"$scope",
|
||||||
"$route",
|
"$route",
|
||||||
"$location",
|
"$location",
|
||||||
"$q",
|
"$window",
|
||||||
"objectService",
|
"objectService",
|
||||||
"navigationService",
|
"navigationService",
|
||||||
"urlService"
|
"urlService",
|
||||||
|
"policyService",
|
||||||
|
"DEFAULT_PATH"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -102,25 +117,7 @@ define([
|
|||||||
"depends": [
|
"depends": [
|
||||||
"$scope",
|
"$scope",
|
||||||
"$location",
|
"$location",
|
||||||
"$route",
|
"$route"
|
||||||
"$q",
|
|
||||||
"navigationService"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "CreateMenuController",
|
|
||||||
"implementation": CreateMenuController,
|
|
||||||
"depends": [
|
|
||||||
"$scope"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "LocatorController",
|
|
||||||
"implementation": LocatorController,
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"$timeout",
|
|
||||||
"objectService"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -131,16 +128,14 @@ define([
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"controls": [
|
|
||||||
{
|
|
||||||
"key": "locator",
|
|
||||||
"templateUrl": "templates/create/locator.html"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"representations": [
|
"representations": [
|
||||||
|
{
|
||||||
|
"key": "view-object",
|
||||||
|
"template": viewObjectTemplate
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"key": "browse-object",
|
"key": "browse-object",
|
||||||
"templateUrl": "templates/browse-object.html",
|
"template": browseObjectTemplate,
|
||||||
"gestures": [
|
"gestures": [
|
||||||
"drop"
|
"drop"
|
||||||
],
|
],
|
||||||
@ -148,20 +143,9 @@ define([
|
|||||||
"view"
|
"view"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"key": "create-button",
|
|
||||||
"templateUrl": "templates/create/create-button.html"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "create-menu",
|
|
||||||
"templateUrl": "templates/create/create-menu.html",
|
|
||||||
"uses": [
|
|
||||||
"action"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"key": "grid-item",
|
"key": "grid-item",
|
||||||
"templateUrl": "templates/items/grid-item.html",
|
"template": gridItemTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"type",
|
"type",
|
||||||
"action",
|
"action",
|
||||||
@ -174,14 +158,14 @@ define([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "object-header",
|
"key": "object-header",
|
||||||
"templateUrl": "templates/browse/object-header.html",
|
"template": objectHeaderTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"type"
|
"type"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "menu-arrow",
|
"key": "menu-arrow",
|
||||||
"templateUrl": "templates/menu-arrow.html",
|
"template": menuArrowTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"action"
|
"action"
|
||||||
],
|
],
|
||||||
@ -194,7 +178,15 @@ define([
|
|||||||
"uses": [
|
"uses": [
|
||||||
"context"
|
"context"
|
||||||
],
|
],
|
||||||
"templateUrl": "templates/back-arrow.html"
|
"template": backArrowTemplate
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "object-properties",
|
||||||
|
"template": objectPropertiesTemplate
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "inspector-region",
|
||||||
|
"template": inspectorRegionTemplate
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"services": [
|
"services": [
|
||||||
@ -203,12 +195,6 @@ define([
|
|||||||
"implementation": NavigationService
|
"implementation": NavigationService
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"policies": [
|
|
||||||
{
|
|
||||||
"implementation": CreationPolicy,
|
|
||||||
"category": "creation"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"key": "navigate",
|
"key": "navigate",
|
||||||
@ -250,7 +236,7 @@ define([
|
|||||||
"name": "Items",
|
"name": "Items",
|
||||||
"glyph": "9",
|
"glyph": "9",
|
||||||
"description": "Grid of available items",
|
"description": "Grid of available items",
|
||||||
"templateUrl": "templates/items/items.html",
|
"template": itemsTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"composition"
|
"composition"
|
||||||
],
|
],
|
||||||
@ -261,42 +247,6 @@ define([
|
|||||||
"editable": false
|
"editable": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"key": "CreateActionProvider",
|
|
||||||
"provides": "actionService",
|
|
||||||
"type": "provider",
|
|
||||||
"implementation": CreateActionProvider,
|
|
||||||
"depends": [
|
|
||||||
"$q",
|
|
||||||
"typeService",
|
|
||||||
"navigationService",
|
|
||||||
"policyService"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "AddActionProvider",
|
|
||||||
"provides": "actionService",
|
|
||||||
"type": "provider",
|
|
||||||
"implementation": AddActionProvider,
|
|
||||||
"depends": [
|
|
||||||
"$q",
|
|
||||||
"typeService",
|
|
||||||
"dialogService",
|
|
||||||
"policyService"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "CreationService",
|
|
||||||
"provides": "creationService",
|
|
||||||
"type": "provider",
|
|
||||||
"implementation": CreationService,
|
|
||||||
"depends": [
|
|
||||||
"$q",
|
|
||||||
"$log"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"runs": [
|
"runs": [
|
||||||
{
|
{
|
||||||
"implementation": WindowTitler,
|
"implementation": WindowTitler,
|
||||||
|
@ -47,11 +47,6 @@
|
|||||||
<div class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
|
<div class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
|
||||||
<!-- Toolbar and Save/Cancel buttons -->
|
<!-- Toolbar and Save/Cancel buttons -->
|
||||||
<div class="l-edit-controls flex-elem l-flex-row flex-align-end">
|
<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-representation key="'edit-action-buttons'"
|
||||||
mct-object="domainObject"
|
mct-object="domainObject"
|
||||||
class='flex-elem conclude-editing'>
|
class='flex-elem conclude-editing'>
|
||||||
@ -60,9 +55,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<mct-representation key="representation.selected.key"
|
<mct-representation key="representation.selected.key"
|
||||||
mct-object="representation.selected.key && domainObject"
|
mct-object="representation.selected.key && domainObject"
|
||||||
class="abs flex-elem grows object-holder-main scroll"
|
class="abs flex-elem grows object-holder-main scroll">
|
||||||
toolbar="toolbar">
|
|
||||||
</mct-representation>
|
</mct-representation>
|
||||||
</div><!--/ l-object-wrapper-inner -->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -63,7 +63,7 @@
|
|||||||
<mct-split-pane class='l-object-and-inspector contents abs' anchor='right'>
|
<mct-split-pane class='l-object-and-inspector contents abs' anchor='right'>
|
||||||
<div class='split-pane-component t-object pane primary-pane left'>
|
<div class='split-pane-component t-object pane primary-pane left'>
|
||||||
<mct-representation mct-object="navigatedObject"
|
<mct-representation mct-object="navigatedObject"
|
||||||
key="'browse-object'"
|
key="'view-object'"
|
||||||
class="abs holder holder-object">
|
class="abs holder holder-object">
|
||||||
</mct-representation>
|
</mct-representation>
|
||||||
</div>
|
</div>
|
||||||
|
@ -19,14 +19,12 @@
|
|||||||
this source code distribution or the Licensing information page available
|
this source code distribution or the Licensing information page available
|
||||||
at runtime from the About dialog for additional information.
|
at runtime from the About dialog for additional information.
|
||||||
-->
|
-->
|
||||||
<div content="jquery-wrapper"
|
<div ng-controller="InspectorController">
|
||||||
class="abs holder-all edit-mode"
|
<div ng-repeat="region in regions">
|
||||||
ng-controller="EditController as editMode"
|
<mct-representation
|
||||||
mct-before-unload="editMode.getUnloadWarning()">
|
key="region.content.key"
|
||||||
|
mct-object="domainObject"
|
||||||
<mct-representation key="'edit-object'" mct-object="editMode.navigatedObject()">
|
ng-model="ngModel">
|
||||||
</mct-representation>
|
</mct-representation>
|
||||||
|
</div>
|
||||||
<mct-include key="'bottombar'"></mct-include>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
@ -26,5 +26,5 @@
|
|||||||
<mct-representation
|
<mct-representation
|
||||||
key="'menu-arrow'"
|
key="'menu-arrow'"
|
||||||
mct-object='domainObject'
|
mct-object='domainObject'
|
||||||
class="flex-elem"></mct-representation>
|
class="flex-elem context-available-w"></mct-representation>
|
||||||
</span>
|
</span>
|
@ -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>
|
@ -19,19 +19,15 @@
|
|||||||
this source code distribution or the Licensing information page available
|
this source code distribution or the Licensing information page available
|
||||||
at runtime from the About dialog for additional information.
|
at runtime from the About dialog for additional information.
|
||||||
-->
|
-->
|
||||||
<table class="tabular">
|
<!--
|
||||||
<thead>
|
A representation that allows the 'View' region of an object view to change
|
||||||
<tr>
|
dynamically (eg. between browse and edit modes). Values correspond to a
|
||||||
<th ng-repeat="header in headers">
|
representation key, and currently defaults to 'browse-object'.
|
||||||
{{header}}
|
|
||||||
</th>
|
In the case of edit, the EditRepresenter will change this to editable
|
||||||
</tr>
|
representation of the object as needed.
|
||||||
</thead>
|
-->
|
||||||
<tbody>
|
<mct-representation mct-object="domainObject"
|
||||||
<tr ng-repeat="row in rows">
|
key="viewObjectTemplate || 'browse-object'"
|
||||||
<td ng-repeat="cell in row">
|
class="abs holder">
|
||||||
{{cell}}
|
</mct-representation>
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
@ -19,23 +19,16 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise, confirm*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This bundle implements Browse mode.
|
* This bundle implements Browse mode.
|
||||||
* @namespace platform/commonUI/browse
|
* @namespace platform/commonUI/browse
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
[
|
[],
|
||||||
'../../../representation/src/gestures/GestureConstants',
|
function () {
|
||||||
'../../edit/src/objects/EditableDomainObject'
|
|
||||||
],
|
|
||||||
function (GestureConstants, EditableDomainObject) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var ROOT_ID = "ROOT",
|
var ROOT_ID = "ROOT";
|
||||||
DEFAULT_PATH = "mine",
|
|
||||||
CONFIRM_MSG = "Unsaved changes will be lost if you leave this page.";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The BrowseController is used to populate the initial scope in Browse
|
* The BrowseController is used to populate the initial scope in Browse
|
||||||
@ -47,18 +40,21 @@ define(
|
|||||||
* @memberof platform/commonUI/browse
|
* @memberof platform/commonUI/browse
|
||||||
* @constructor
|
* @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(
|
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) {
|
function updateRoute(domainObject) {
|
||||||
var priorRoute = $route.current,
|
var priorRoute = $route.current,
|
||||||
// Act as if params HADN'T changed to avoid page reload
|
// Act as if params HADN'T changed to avoid page reload
|
||||||
@ -75,31 +71,35 @@ define(
|
|||||||
// urlService.urlForLocation used to adjust current
|
// urlService.urlForLocation used to adjust current
|
||||||
// path to new, addressed, path based on
|
// path to new, addressed, path based on
|
||||||
// domainObject
|
// domainObject
|
||||||
$location.path(urlService.urlForLocation("browse",
|
$location.path(urlService.urlForLocation("browse", domainObject));
|
||||||
domainObject.hasCapability('editor') ?
|
|
||||||
domainObject.getOriginalObject() : domainObject));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback for updating the in-scope reference to the object
|
// Callback for updating the in-scope reference to the object
|
||||||
// that is currently navigated-to.
|
// that is currently navigated-to.
|
||||||
function setNavigation(domainObject) {
|
function setNavigation(domainObject) {
|
||||||
|
var navigationAllowed = true;
|
||||||
|
|
||||||
if (domainObject === $scope.navigatedObject) {
|
if (domainObject === $scope.navigatedObject) {
|
||||||
//do nothing;
|
//do nothing;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDirty() && !confirm(CONFIRM_MSG)) {
|
policyService.allow("navigation", $scope.navigatedObject, domainObject, function (message) {
|
||||||
$scope.treeModel.selectedObject = $scope.navigatedObject;
|
navigationAllowed = $window.confirm(message + "\r\n\r\n" +
|
||||||
navigationService.setNavigation($scope.navigatedObject);
|
" Are you sure you want to continue?");
|
||||||
} else {
|
});
|
||||||
if ($scope.navigatedObject && $scope.navigatedObject.hasCapability("editor")){
|
|
||||||
$scope.navigatedObject.getCapability("editor").cancel();
|
if (navigationAllowed) {
|
||||||
}
|
|
||||||
$scope.navigatedObject = domainObject;
|
$scope.navigatedObject = domainObject;
|
||||||
$scope.treeModel.selectedObject = domainObject;
|
$scope.treeModel.selectedObject = domainObject;
|
||||||
navigationService.setNavigation(domainObject);
|
navigationService.setNavigation(domainObject);
|
||||||
updateRoute(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 +143,12 @@ define(
|
|||||||
} else {
|
} else {
|
||||||
doNavigate(nextObject, index + 1);
|
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 {
|
} else {
|
||||||
// Couldn't find the next element of the path
|
// Couldn't find the next element of the path
|
||||||
// so navigate to the last path object we did find
|
// so navigate to the last path object we did find
|
||||||
@ -170,16 +176,11 @@ define(
|
|||||||
selectedObject: navigationService.getNavigation()
|
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.
|
// Listen for changes in navigation state.
|
||||||
navigationService.addListener(setNavigation);
|
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);
|
$scope.$watch("treeModel.selectedObject", setNavigation);
|
||||||
|
|
||||||
// Clean up when the scope is destroyed
|
// Clean up when the scope is destroyed
|
||||||
|
@ -19,15 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[
|
[],
|
||||||
'../../../representation/src/gestures/GestureConstants',
|
function () {
|
||||||
'../../edit/src/objects/EditableDomainObject'
|
|
||||||
],
|
|
||||||
function (GestureConstants, EditableDomainObject) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for the `browse-object` representation of a domain
|
* Controller for the `browse-object` representation of a domain
|
||||||
@ -35,7 +30,7 @@ define(
|
|||||||
* @memberof platform/commonUI/browse
|
* @memberof platform/commonUI/browse
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function BrowseObjectController($scope, $location, $route, $q, navigationService) {
|
function BrowseObjectController($scope, $location, $route) {
|
||||||
var navigatedObject;
|
var navigatedObject;
|
||||||
function setViewForDomainObject(domainObject) {
|
function setViewForDomainObject(domainObject) {
|
||||||
|
|
||||||
@ -57,10 +52,9 @@ define(
|
|||||||
|
|
||||||
function updateQueryParam(viewKey) {
|
function updateQueryParam(viewKey) {
|
||||||
var unlisten,
|
var unlisten,
|
||||||
priorRoute = $route.current,
|
priorRoute = $route.current;
|
||||||
isEditMode = $scope.domainObject && $scope.domainObject.hasCapability('editor');
|
|
||||||
|
|
||||||
if (viewKey && !isEditMode) {
|
if (viewKey) {
|
||||||
$location.search('view', viewKey);
|
$location.search('view', viewKey);
|
||||||
unlisten = $scope.$on('$locationChangeSuccess', function () {
|
unlisten = $scope.$on('$locationChangeSuccess', function () {
|
||||||
// Checks path to make sure /browse/ is at front
|
// Checks path to make sure /browse/ is at front
|
||||||
@ -76,10 +70,6 @@ define(
|
|||||||
$scope.$watch('domainObject', setViewForDomainObject);
|
$scope.$watch('domainObject', setViewForDomainObject);
|
||||||
$scope.$watch('representation.selected.key', updateQueryParam);
|
$scope.$watch('representation.selected.key', updateQueryParam);
|
||||||
|
|
||||||
$scope.cancelEditing = function() {
|
|
||||||
navigationService.setNavigation($scope.domainObject.getDomainObject());
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.doAction = function (action) {
|
$scope.doAction = function (action) {
|
||||||
return $scope[action] && $scope[action]();
|
return $scope[action] && $scope[action]();
|
||||||
};
|
};
|
||||||
|
67
platform/commonUI/browse/src/InspectorRegion.js
Normal file
67
platform/commonUI/browse/src/InspectorRegion.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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(
|
||||||
|
[
|
||||||
|
'../../regions/src/Region'
|
||||||
|
],
|
||||||
|
function (Region) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
);
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining MenuArrowController. Created by shale on 06/30/2015.
|
* Module defining MenuArrowController. Created by shale on 06/30/2015.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A left-click on the menu arrow should display a
|
* A left-click on the menu arrow should display a
|
||||||
|
@ -19,13 +19,11 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller to provide the ability to show/hide the tree in
|
* Controller to provide the ability to show/hide the tree in
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining NavigateAction. Created by vwoeltje on 11/10/14.
|
* Module defining NavigateAction. Created by vwoeltje on 11/10/14.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The navigate action navigates to a specific domain object.
|
* The navigate action navigates to a specific domain object.
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining NavigationService. Created by vwoeltje on 11/10/14.
|
* Module defining NavigationService. Created by vwoeltje on 11/10/14.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The navigation service maintains the application's current
|
* The navigation service maintains the application's current
|
||||||
@ -59,6 +57,7 @@ define(
|
|||||||
callback(value);
|
callback(value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,15 +19,13 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,screenfull,Promise*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining FullscreenAction. Created by vwoeltje on 11/18/14.
|
* Module defining FullscreenAction. Created by vwoeltje on 11/18/14.
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
["screenfull"],
|
["screenfull"],
|
||||||
function () {
|
function (screenfull) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var ENTER_FULLSCREEN = "Enter full screen mode",
|
var ENTER_FULLSCREEN = "Enter full screen mode",
|
||||||
EXIT_FULLSCREEN = "Exit full screen mode";
|
EXIT_FULLSCREEN = "Exit full screen mode";
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining NewTabAction (Originally NewWindowAction). Created by vwoeltje on 11/18/14.
|
* Module defining NewTabAction (Originally NewWindowAction). Created by vwoeltje on 11/18/14.
|
||||||
@ -27,9 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
var ROOT_ID = "ROOT",
|
|
||||||
DEFAULT_PATH = "/mine";
|
|
||||||
/**
|
/**
|
||||||
* The new tab action allows a domain object to be opened
|
* The new tab action allows a domain object to be opened
|
||||||
* into a new browser tab.
|
* into a new browser tab.
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the title of the current window to reflect the name
|
* Updates the title of the current window to reflect the name
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine,xit,xdescribe*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
||||||
@ -27,10 +26,8 @@
|
|||||||
define(
|
define(
|
||||||
["../src/BrowseController"],
|
["../src/BrowseController"],
|
||||||
function (BrowseController) {
|
function (BrowseController) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
//TODO: Disabled for NEM Beta
|
describe("The browse controller", function () {
|
||||||
xdescribe("The browse controller", function () {
|
|
||||||
var mockScope,
|
var mockScope,
|
||||||
mockRoute,
|
mockRoute,
|
||||||
mockLocation,
|
mockLocation,
|
||||||
@ -40,6 +37,9 @@ define(
|
|||||||
mockUrlService,
|
mockUrlService,
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
mockNextObject,
|
mockNextObject,
|
||||||
|
mockWindow,
|
||||||
|
mockPolicyService,
|
||||||
|
testDefaultRoot,
|
||||||
controller;
|
controller;
|
||||||
|
|
||||||
function mockPromise(value) {
|
function mockPromise(value) {
|
||||||
@ -50,7 +50,32 @@ define(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function instantiateController() {
|
||||||
|
controller = new BrowseController(
|
||||||
|
mockScope,
|
||||||
|
mockRoute,
|
||||||
|
mockLocation,
|
||||||
|
mockWindow,
|
||||||
|
mockObjectService,
|
||||||
|
mockNavigationService,
|
||||||
|
mockUrlService,
|
||||||
|
mockPolicyService,
|
||||||
|
testDefaultRoot
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
beforeEach(function () {
|
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(
|
mockScope = jasmine.createSpyObj(
|
||||||
"$scope",
|
"$scope",
|
||||||
["$on", "$watch"]
|
["$on", "$watch"]
|
||||||
@ -101,41 +126,28 @@ define(
|
|||||||
]));
|
]));
|
||||||
mockNextObject.useCapability.andReturn(undefined);
|
mockNextObject.useCapability.andReturn(undefined);
|
||||||
mockNextObject.getId.andReturn("next");
|
mockNextObject.getId.andReturn("next");
|
||||||
mockDomainObject.getId.andReturn("mine");
|
mockDomainObject.getId.andReturn(testDefaultRoot);
|
||||||
|
|
||||||
controller = new BrowseController(
|
instantiateController();
|
||||||
mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService,
|
|
||||||
mockUrlService
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("uses composition to set the navigated object, if there is none", function () {
|
it("uses composition to set the navigated object, if there is none", function () {
|
||||||
controller = new BrowseController(
|
instantiateController();
|
||||||
mockScope,
|
expect(mockNavigationService.setNavigation)
|
||||||
mockRoute,
|
.toHaveBeenCalledWith(mockDomainObject);
|
||||||
mockLocation,
|
});
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService,
|
it("navigates to a root-level object, even when default path is not found", function () {
|
||||||
mockUrlService
|
mockDomainObject.getId
|
||||||
);
|
.andReturn("something-other-than-the-" + testDefaultRoot);
|
||||||
|
instantiateController();
|
||||||
expect(mockNavigationService.setNavigation)
|
expect(mockNavigationService.setNavigation)
|
||||||
.toHaveBeenCalledWith(mockDomainObject);
|
.toHaveBeenCalledWith(mockDomainObject);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not try to override navigation", function () {
|
it("does not try to override navigation", function () {
|
||||||
mockNavigationService.getNavigation.andReturn(mockDomainObject);
|
mockNavigationService.getNavigation.andReturn(mockDomainObject);
|
||||||
controller = new BrowseController(
|
instantiateController();
|
||||||
mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService,
|
|
||||||
mockUrlService
|
|
||||||
);
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockDomainObject);
|
expect(mockScope.navigatedObject).toBe(mockDomainObject);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -162,14 +174,8 @@ define(
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("uses route parameters to choose initially-navigated object", function () {
|
it("uses route parameters to choose initially-navigated object", function () {
|
||||||
mockRoute.current.params.ids = "mine/next";
|
mockRoute.current.params.ids = testDefaultRoot + "/next";
|
||||||
controller = new BrowseController(
|
instantiateController();
|
||||||
mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService
|
|
||||||
);
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockNextObject);
|
expect(mockScope.navigatedObject).toBe(mockNextObject);
|
||||||
expect(mockNavigationService.setNavigation)
|
expect(mockNavigationService.setNavigation)
|
||||||
.toHaveBeenCalledWith(mockNextObject);
|
.toHaveBeenCalledWith(mockNextObject);
|
||||||
@ -179,14 +185,8 @@ define(
|
|||||||
// Idea here is that if we get a bad path of IDs,
|
// Idea here is that if we get a bad path of IDs,
|
||||||
// browse controller should traverse down it until
|
// browse controller should traverse down it until
|
||||||
// it hits an invalid ID.
|
// it hits an invalid ID.
|
||||||
mockRoute.current.params.ids = "mine/junk";
|
mockRoute.current.params.ids = testDefaultRoot + "/junk";
|
||||||
controller = new BrowseController(
|
instantiateController();
|
||||||
mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService
|
|
||||||
);
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockDomainObject);
|
expect(mockScope.navigatedObject).toBe(mockDomainObject);
|
||||||
expect(mockNavigationService.setNavigation)
|
expect(mockNavigationService.setNavigation)
|
||||||
.toHaveBeenCalledWith(mockDomainObject);
|
.toHaveBeenCalledWith(mockDomainObject);
|
||||||
@ -196,14 +196,8 @@ define(
|
|||||||
// Idea here is that if we get a path which passes
|
// Idea here is that if we get a path which passes
|
||||||
// through an object without a composition, browse controller
|
// through an object without a composition, browse controller
|
||||||
// should stop at it since remaining IDs cannot be loaded.
|
// should stop at it since remaining IDs cannot be loaded.
|
||||||
mockRoute.current.params.ids = "mine/next/junk";
|
mockRoute.current.params.ids = testDefaultRoot + "/next/junk";
|
||||||
controller = new BrowseController(
|
instantiateController();
|
||||||
mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService
|
|
||||||
);
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockNextObject);
|
expect(mockScope.navigatedObject).toBe(mockNextObject);
|
||||||
expect(mockNavigationService.setNavigation)
|
expect(mockNavigationService.setNavigation)
|
||||||
.toHaveBeenCalledWith(mockNextObject);
|
.toHaveBeenCalledWith(mockNextObject);
|
||||||
@ -230,7 +224,10 @@ define(
|
|||||||
// prior to setting $route.current
|
// prior to setting $route.current
|
||||||
mockLocation.path.andReturn("/browse/");
|
mockLocation.path.andReturn("/browse/");
|
||||||
|
|
||||||
|
mockNavigationService.setNavigation.andReturn(true);
|
||||||
|
|
||||||
// Exercise the Angular workaround
|
// Exercise the Angular workaround
|
||||||
|
mockNavigationService.addListener.mostRecentCall.args[0]();
|
||||||
mockScope.$on.mostRecentCall.args[1]();
|
mockScope.$on.mostRecentCall.args[1]();
|
||||||
expect(mockUnlisten).toHaveBeenCalled();
|
expect(mockUnlisten).toHaveBeenCalled();
|
||||||
|
|
||||||
@ -241,6 +238,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);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -19,13 +19,11 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
["../src/BrowseObjectController"],
|
["../src/BrowseObjectController"],
|
||||||
function (BrowseObjectController) {
|
function (BrowseObjectController) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The browse object controller", function () {
|
describe("The browse object controller", function () {
|
||||||
var mockScope,
|
var mockScope,
|
||||||
|
43
platform/commonUI/browse/test/InspectorRegionSpec.js
Normal file
43
platform/commonUI/browse/test/InspectorRegionSpec.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MCTIncudeSpec. Created by vwoeltje on 11/6/14.
|
||||||
|
*/
|
||||||
|
define(
|
||||||
|
["../src/InspectorRegion"],
|
||||||
|
function (InspectorRegion) {
|
||||||
|
|
||||||
|
describe("The inspector region", function () {
|
||||||
|
var inspectorRegion;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
inspectorRegion = new InspectorRegion();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("creates default region parts", function () {
|
||||||
|
expect(inspectorRegion.regions.length).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MenuArrowControllerSpec. Created by shale on 07/02/2015.
|
* MenuArrowControllerSpec. Created by shale on 07/02/2015.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
["../src/MenuArrowController"],
|
["../src/MenuArrowController"],
|
||||||
function (MenuArrowController) {
|
function (MenuArrowController) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The menu arrow controller ", function () {
|
describe("The menu arrow controller ", function () {
|
||||||
var mockScope,
|
var mockScope,
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
["../src/PaneController"],
|
["../src/PaneController"],
|
||||||
function (PaneController) {
|
function (PaneController) {
|
||||||
'use strict';
|
|
||||||
|
|
||||||
describe("The PaneController", function () {
|
describe("The PaneController", function () {
|
||||||
var mockScope,
|
var mockScope,
|
||||||
|
@ -1,132 +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.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine,xit,xdescribe*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
["../../src/creation/CreateAction"],
|
|
||||||
function (CreateAction) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The create action", function () {
|
|
||||||
var mockType,
|
|
||||||
mockParent,
|
|
||||||
mockContext,
|
|
||||||
mockDialogService,
|
|
||||||
mockCreationService,
|
|
||||||
action;
|
|
||||||
|
|
||||||
function mockPromise(value) {
|
|
||||||
return {
|
|
||||||
then: function (callback) {
|
|
||||||
return mockPromise(callback(value));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockType = jasmine.createSpyObj(
|
|
||||||
"type",
|
|
||||||
[
|
|
||||||
"getKey",
|
|
||||||
"getGlyph",
|
|
||||||
"getName",
|
|
||||||
"getDescription",
|
|
||||||
"getProperties",
|
|
||||||
"getInitialModel"
|
|
||||||
]
|
|
||||||
);
|
|
||||||
mockParent = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
[
|
|
||||||
"getId",
|
|
||||||
"getModel",
|
|
||||||
"getCapability"
|
|
||||||
]
|
|
||||||
);
|
|
||||||
mockContext = {
|
|
||||||
domainObject: mockParent
|
|
||||||
};
|
|
||||||
mockDialogService = jasmine.createSpyObj(
|
|
||||||
"dialogService",
|
|
||||||
[ "getUserInput" ]
|
|
||||||
);
|
|
||||||
mockCreationService = jasmine.createSpyObj(
|
|
||||||
"creationService",
|
|
||||||
[ "createObject" ]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockType.getKey.andReturn("test");
|
|
||||||
mockType.getGlyph.andReturn("T");
|
|
||||||
mockType.getDescription.andReturn("a test type");
|
|
||||||
mockType.getName.andReturn("Test");
|
|
||||||
mockType.getProperties.andReturn([]);
|
|
||||||
mockType.getInitialModel.andReturn({});
|
|
||||||
|
|
||||||
mockDialogService.getUserInput.andReturn(mockPromise({}));
|
|
||||||
|
|
||||||
action = new CreateAction(
|
|
||||||
mockType,
|
|
||||||
mockParent,
|
|
||||||
mockContext,
|
|
||||||
mockDialogService,
|
|
||||||
mockCreationService
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("exposes type-appropriate metadata", function () {
|
|
||||||
var metadata = action.getMetadata();
|
|
||||||
|
|
||||||
expect(metadata.name).toEqual("Test");
|
|
||||||
expect(metadata.description).toEqual("a test type");
|
|
||||||
expect(metadata.glyph).toEqual("T");
|
|
||||||
});
|
|
||||||
|
|
||||||
//TODO: Disabled for NEM Beta
|
|
||||||
xit("invokes the creation service when performed", function () {
|
|
||||||
action.perform();
|
|
||||||
expect(mockCreationService.createObject).toHaveBeenCalledWith(
|
|
||||||
{ type: "test" },
|
|
||||||
mockParent
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
//TODO: Disabled for NEM Beta
|
|
||||||
xit("does not create an object if the user cancels", function () {
|
|
||||||
mockDialogService.getUserInput.andReturn({
|
|
||||||
then: function (callback, fail) {
|
|
||||||
fail();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
action.perform();
|
|
||||||
|
|
||||||
expect(mockCreationService.createObject)
|
|
||||||
.not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
||||||
@ -27,12 +26,10 @@
|
|||||||
define(
|
define(
|
||||||
["../../src/navigation/NavigateAction"],
|
["../../src/navigation/NavigateAction"],
|
||||||
function (NavigateAction) {
|
function (NavigateAction) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The navigate action", function () {
|
describe("The navigate action", function () {
|
||||||
var mockNavigationService,
|
var mockNavigationService,
|
||||||
mockQ,
|
mockQ,
|
||||||
actionContext,
|
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
action;
|
action;
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
["../../src/navigation/NavigationService"],
|
["../../src/navigation/NavigationService"],
|
||||||
function (NavigationService) {
|
function (NavigationService) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The navigation service", function () {
|
describe("The navigation service", function () {
|
||||||
var navigationService;
|
var navigationService;
|
||||||
|
@ -19,33 +19,30 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine,afterEach,window*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
["../../src/windowing/FullscreenAction"],
|
["../../src/windowing/FullscreenAction", "screenfull"],
|
||||||
function (FullscreenAction) {
|
function (FullscreenAction, screenfull) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The fullscreen action", function () {
|
describe("The fullscreen action", function () {
|
||||||
var action,
|
var action,
|
||||||
oldScreenfull;
|
oldToggle;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
// Screenfull is not shimmed or injected, so
|
// Screenfull is not shimmed or injected, so
|
||||||
// we need to spy on it in the global scope.
|
// we need to spy on it in the global scope.
|
||||||
oldScreenfull = window.screenfull;
|
oldToggle = screenfull.toggle;
|
||||||
|
|
||||||
window.screenfull = {};
|
screenfull.toggle = jasmine.createSpy("toggle");
|
||||||
window.screenfull.toggle = jasmine.createSpy("toggle");
|
|
||||||
|
|
||||||
action = new FullscreenAction({});
|
action = new FullscreenAction({});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(function () {
|
afterEach(function () {
|
||||||
window.screenfull = oldScreenfull;
|
screenfull.toggle = oldToggle;
|
||||||
});
|
});
|
||||||
|
|
||||||
it("toggles fullscreen mode when performed", function () {
|
it("toggles fullscreen mode when performed", function () {
|
||||||
|
@ -19,18 +19,15 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine,afterEach,window*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
["../../src/windowing/NewTabAction"],
|
["../../src/windowing/NewTabAction"],
|
||||||
function (NewTabAction) {
|
function (NewTabAction) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The new tab action", function () {
|
describe("The new tab action", function () {
|
||||||
var actionSelected,
|
var actionSelected,
|
||||||
actionCurrent,
|
actionCurrent,
|
||||||
mockWindow,
|
mockWindow,
|
||||||
mockDomainObject,
|
|
||||||
mockContextCurrent,
|
mockContextCurrent,
|
||||||
mockContextSelected,
|
mockContextSelected,
|
||||||
mockUrlService;
|
mockUrlService;
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WindowTitlerSpec. Created by vwoeltje on 11/6/14.
|
* WindowTitlerSpec. Created by vwoeltje on 11/6/14.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
["../../src/windowing/WindowTitler"],
|
["../../src/windowing/WindowTitler"],
|
||||||
function (WindowTitler) {
|
function (WindowTitler) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The window titler", function () {
|
describe("The window titler", function () {
|
||||||
var mockNavigationService,
|
var mockNavigationService,
|
||||||
|
@ -19,18 +19,30 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"./src/DialogService",
|
"./src/DialogService",
|
||||||
"./src/OverlayService",
|
"./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'
|
'legacyRegistry'
|
||||||
], function (
|
], function (
|
||||||
DialogService,
|
DialogService,
|
||||||
OverlayService,
|
OverlayService,
|
||||||
|
overlayDialogTemplate,
|
||||||
|
overlayOptionsTemplate,
|
||||||
|
dialogTemplate,
|
||||||
|
overlayBlockingMessageTemplate,
|
||||||
|
messageTemplate,
|
||||||
|
overlayMessageListTemplate,
|
||||||
|
overlayTemplate,
|
||||||
legacyRegistry
|
legacyRegistry
|
||||||
) {
|
) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
legacyRegistry.register("platform/commonUI/dialog", {
|
legacyRegistry.register("platform/commonUI/dialog", {
|
||||||
"extensions": {
|
"extensions": {
|
||||||
@ -57,33 +69,33 @@ define([
|
|||||||
"templates": [
|
"templates": [
|
||||||
{
|
{
|
||||||
"key": "overlay-dialog",
|
"key": "overlay-dialog",
|
||||||
"templateUrl": "templates/overlay-dialog.html"
|
"template": overlayDialogTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "overlay-options",
|
"key": "overlay-options",
|
||||||
"templateUrl": "templates/overlay-options.html"
|
"template": overlayOptionsTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "form-dialog",
|
"key": "form-dialog",
|
||||||
"templateUrl": "templates/dialog.html"
|
"template": dialogTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "overlay-blocking-message",
|
"key": "overlay-blocking-message",
|
||||||
"templateUrl": "templates/overlay-blocking-message.html"
|
"template": overlayBlockingMessageTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "message",
|
"key": "message",
|
||||||
"templateUrl": "templates/message.html"
|
"template": messageTemplate
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "overlay-message-list",
|
"key": "overlay-message-list",
|
||||||
"templateUrl": "templates/overlay-message-list.html"
|
"template": overlayMessageListTemplate
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"containers": [
|
"containers": [
|
||||||
{
|
{
|
||||||
"key": "overlay",
|
"key": "overlay",
|
||||||
"templateUrl": "templates/overlay.html"
|
"template": overlayTemplate
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="abs message-body">
|
<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>
|
||||||
<div class="abs bottom-bar">
|
<div class="abs bottom-bar">
|
||||||
<a ng-repeat="dialogAction in ngModel.dialog.actions"
|
<a ng-repeat="dialogAction in ngModel.dialog.actions"
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This bundle implements the dialog service, which can be used to
|
* This bundle implements the dialog service, which can be used to
|
||||||
@ -29,7 +28,6 @@
|
|||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
/**
|
/**
|
||||||
* The dialog service is responsible for handling window-modal
|
* The dialog service is responsible for handling window-modal
|
||||||
* communication with the user, such as displaying forms for user
|
* communication with the user, such as displaying forms for user
|
||||||
|
@ -19,12 +19,10 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define(
|
define(
|
||||||
[],
|
[],
|
||||||
function () {
|
function () {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
// Template to inject into the DOM to show the dialog; really just points to
|
// Template to inject into the DOM to show the dialog; really just points to
|
||||||
// the a specific template that can be included via mct-include
|
// the a specific template that can be included via mct-include
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* 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.
|
* MCTIncudeSpec. Created by vwoeltje on 11/6/14.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
["../src/DialogService"],
|
["../src/DialogService"],
|
||||||
function (DialogService) {
|
function (DialogService) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The dialog service", function () {
|
describe("The dialog service", function () {
|
||||||
var mockOverlayService,
|
var mockOverlayService,
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* 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.
|
* MCTIncudeSpec. Created by vwoeltje on 11/6/14.
|
||||||
@ -27,7 +26,6 @@
|
|||||||
define(
|
define(
|
||||||
["../src/OverlayService"],
|
["../src/OverlayService"],
|
||||||
function (OverlayService) {
|
function (OverlayService) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
describe("The overlay service", function () {
|
describe("The overlay service", function () {
|
||||||
var mockDocument,
|
var mockDocument,
|
||||||
|
@ -19,61 +19,88 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"./src/controllers/EditController",
|
|
||||||
"./src/controllers/EditActionController",
|
"./src/controllers/EditActionController",
|
||||||
"./src/controllers/EditPanesController",
|
"./src/controllers/EditPanesController",
|
||||||
"./src/controllers/ElementsController",
|
"./src/controllers/ElementsController",
|
||||||
|
"./src/controllers/EditObjectController",
|
||||||
"./src/directives/MCTBeforeUnload",
|
"./src/directives/MCTBeforeUnload",
|
||||||
"./src/actions/LinkAction",
|
"./src/actions/EditAndComposeAction",
|
||||||
"./src/actions/EditAction",
|
"./src/actions/EditAction",
|
||||||
"./src/actions/PropertiesAction",
|
"./src/actions/PropertiesAction",
|
||||||
"./src/actions/RemoveAction",
|
"./src/actions/RemoveAction",
|
||||||
"./src/actions/SaveAction",
|
"./src/actions/SaveAction",
|
||||||
|
"./src/actions/SaveAsAction",
|
||||||
"./src/actions/CancelAction",
|
"./src/actions/CancelAction",
|
||||||
"./src/policies/EditActionPolicy",
|
"./src/policies/EditActionPolicy",
|
||||||
|
"./src/policies/EditableLinkPolicy",
|
||||||
|
"./src/policies/EditableMovePolicy",
|
||||||
|
"./src/policies/EditNavigationPolicy",
|
||||||
|
"./src/policies/EditContextualActionPolicy",
|
||||||
"./src/representers/EditRepresenter",
|
"./src/representers/EditRepresenter",
|
||||||
"./src/representers/EditToolbarRepresenter",
|
"./src/representers/EditToolbarRepresenter",
|
||||||
|
"./src/capabilities/EditorCapability",
|
||||||
|
"./src/capabilities/TransactionCapabilityDecorator",
|
||||||
|
"./src/services/TransactionService",
|
||||||
|
"./src/creation/CreateMenuController",
|
||||||
|
"./src/creation/LocatorController",
|
||||||
|
"./src/creation/CreationPolicy",
|
||||||
|
"./src/creation/CreateActionProvider",
|
||||||
|
"./src/creation/AddActionProvider",
|
||||||
|
"./src/creation/CreationService",
|
||||||
|
"text!./res/templates/create/locator.html",
|
||||||
|
"text!./res/templates/create/create-button.html",
|
||||||
|
"text!./res/templates/create/create-menu.html",
|
||||||
|
"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'
|
'legacyRegistry'
|
||||||
], function (
|
], function (
|
||||||
EditController,
|
|
||||||
EditActionController,
|
EditActionController,
|
||||||
EditPanesController,
|
EditPanesController,
|
||||||
ElementsController,
|
ElementsController,
|
||||||
|
EditObjectController,
|
||||||
MCTBeforeUnload,
|
MCTBeforeUnload,
|
||||||
LinkAction,
|
EditAndComposeAction,
|
||||||
EditAction,
|
EditAction,
|
||||||
PropertiesAction,
|
PropertiesAction,
|
||||||
RemoveAction,
|
RemoveAction,
|
||||||
SaveAction,
|
SaveAction,
|
||||||
|
SaveAsAction,
|
||||||
CancelAction,
|
CancelAction,
|
||||||
EditActionPolicy,
|
EditActionPolicy,
|
||||||
|
EditableLinkPolicy,
|
||||||
|
EditableMovePolicy,
|
||||||
|
EditNavigationPolicy,
|
||||||
|
EditContextualActionPolicy,
|
||||||
EditRepresenter,
|
EditRepresenter,
|
||||||
EditToolbarRepresenter,
|
EditToolbarRepresenter,
|
||||||
|
EditorCapability,
|
||||||
|
TransactionCapabilityDecorator,
|
||||||
|
TransactionService,
|
||||||
|
CreateMenuController,
|
||||||
|
LocatorController,
|
||||||
|
CreationPolicy,
|
||||||
|
CreateActionProvider,
|
||||||
|
AddActionProvider,
|
||||||
|
CreationService,
|
||||||
|
locatorTemplate,
|
||||||
|
createButtonTemplate,
|
||||||
|
createMenuTemplate,
|
||||||
|
libraryTemplate,
|
||||||
|
editObjectTemplate,
|
||||||
|
editActionButtonsTemplate,
|
||||||
|
elementsTemplate,
|
||||||
|
topbarEditTemplate,
|
||||||
legacyRegistry
|
legacyRegistry
|
||||||
) {
|
) {
|
||||||
"use strict";
|
|
||||||
|
|
||||||
legacyRegistry.register("platform/commonUI/edit", {
|
legacyRegistry.register("platform/commonUI/edit", {
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"routes": [
|
|
||||||
{
|
|
||||||
"when": "/edit",
|
|
||||||
"templateUrl": "templates/edit.html"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"controllers": [
|
"controllers": [
|
||||||
{
|
|
||||||
"key": "EditController",
|
|
||||||
"implementation": EditController,
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"$q",
|
|
||||||
"navigationService"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"key": "EditActionController",
|
"key": "EditActionController",
|
||||||
"implementation": EditActionController,
|
"implementation": EditActionController,
|
||||||
@ -94,6 +121,31 @@ define([
|
|||||||
"depends": [
|
"depends": [
|
||||||
"$scope"
|
"$scope"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "EditObjectController",
|
||||||
|
"implementation": EditObjectController,
|
||||||
|
"depends": [
|
||||||
|
"$scope",
|
||||||
|
"$location",
|
||||||
|
"policyService"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "CreateMenuController",
|
||||||
|
"implementation": CreateMenuController,
|
||||||
|
"depends": [
|
||||||
|
"$scope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "LocatorController",
|
||||||
|
"implementation": LocatorController,
|
||||||
|
"depends": [
|
||||||
|
"$scope",
|
||||||
|
"$timeout",
|
||||||
|
"objectService"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"directives": [
|
"directives": [
|
||||||
@ -108,7 +160,7 @@ define([
|
|||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"key": "compose",
|
"key": "compose",
|
||||||
"implementation": LinkAction
|
"implementation": EditAndComposeAction
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "edit",
|
"key": "edit",
|
||||||
@ -116,8 +168,7 @@ define([
|
|||||||
"depends": [
|
"depends": [
|
||||||
"$location",
|
"$location",
|
||||||
"navigationService",
|
"navigationService",
|
||||||
"$log",
|
"$log"
|
||||||
"$q"
|
|
||||||
],
|
],
|
||||||
"description": "Edit this object.",
|
"description": "Edit this object.",
|
||||||
"category": "view-control",
|
"category": "view-control",
|
||||||
@ -155,6 +206,15 @@ define([
|
|||||||
"implementation": SaveAction,
|
"implementation": SaveAction,
|
||||||
"name": "Save",
|
"name": "Save",
|
||||||
"description": "Save changes made to these objects.",
|
"description": "Save changes made to these objects.",
|
||||||
|
"depends": [],
|
||||||
|
"priority": "mandatory"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "save",
|
||||||
|
"category": "conclude-editing",
|
||||||
|
"implementation": SaveAsAction,
|
||||||
|
"name": "Save",
|
||||||
|
"description": "Save changes made to these objects.",
|
||||||
"depends": [
|
"depends": [
|
||||||
"$injector",
|
"$injector",
|
||||||
"policyService",
|
"policyService",
|
||||||
@ -170,42 +230,64 @@ define([
|
|||||||
"implementation": CancelAction,
|
"implementation": CancelAction,
|
||||||
"name": "Cancel",
|
"name": "Cancel",
|
||||||
"description": "Discard changes made to these objects.",
|
"description": "Discard changes made to these objects.",
|
||||||
"depends": [
|
"depends": []
|
||||||
"$injector",
|
|
||||||
"navigationService"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"policies": [
|
"policies": [
|
||||||
{
|
{
|
||||||
"category": "action",
|
"category": "action",
|
||||||
"implementation": EditActionPolicy
|
"implementation": EditActionPolicy
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "action",
|
||||||
|
"implementation": EditContextualActionPolicy,
|
||||||
|
"depends": ["navigationService", "editModeBlacklist", "nonEditContextBlacklist"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "action",
|
||||||
|
"implementation": EditableMovePolicy
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "action",
|
||||||
|
"implementation": EditableLinkPolicy
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "navigation",
|
||||||
|
"message": "Continuing will cause the loss of any unsaved changes.",
|
||||||
|
"implementation": EditNavigationPolicy
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"implementation": CreationPolicy,
|
||||||
|
"category": "creation"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"templates": [
|
"templates": [
|
||||||
{
|
{
|
||||||
"key": "edit-library",
|
"key": "edit-library",
|
||||||
"templateUrl": "templates/library.html"
|
"template": libraryTemplate
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"representations": [
|
"representations": [
|
||||||
{
|
{
|
||||||
"key": "edit-object",
|
"key": "edit-object",
|
||||||
"templateUrl": "templates/edit-object.html",
|
"template": editObjectTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"view"
|
"view"
|
||||||
|
],
|
||||||
|
"gestures": [
|
||||||
|
"drop"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "edit-action-buttons",
|
"key": "edit-action-buttons",
|
||||||
"templateUrl": "templates/edit-action-buttons.html",
|
"template": editActionButtonsTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"action"
|
"action"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "edit-elements",
|
"key": "edit-elements",
|
||||||
"templateUrl": "templates/elements.html",
|
"template": elementsTemplate,
|
||||||
"uses": [
|
"uses": [
|
||||||
"composition"
|
"composition"
|
||||||
],
|
],
|
||||||
@ -215,9 +297,74 @@ define([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "topbar-edit",
|
"key": "topbar-edit",
|
||||||
"templateUrl": "templates/topbar-edit.html"
|
"template": topbarEditTemplate
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "create-button",
|
||||||
|
"template": createButtonTemplate
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "create-menu",
|
||||||
|
"template": createMenuTemplate,
|
||||||
|
"uses": [
|
||||||
|
"action"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"components": [
|
||||||
|
{
|
||||||
|
"type": "decorator",
|
||||||
|
"provides": "capabilityService",
|
||||||
|
"implementation": TransactionCapabilityDecorator,
|
||||||
|
"depends": [
|
||||||
|
"$q",
|
||||||
|
"transactionService"
|
||||||
|
],
|
||||||
|
"priority": "fallback"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "provider",
|
||||||
|
"provides": "transactionService",
|
||||||
|
"implementation": TransactionService,
|
||||||
|
"depends": [
|
||||||
|
"$q",
|
||||||
|
"$log"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "CreateActionProvider",
|
||||||
|
"provides": "actionService",
|
||||||
|
"type": "provider",
|
||||||
|
"implementation": CreateActionProvider,
|
||||||
|
"depends": [
|
||||||
|
"typeService",
|
||||||
|
"policyService"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "AddActionProvider",
|
||||||
|
"provides": "actionService",
|
||||||
|
"type": "provider",
|
||||||
|
"implementation": AddActionProvider,
|
||||||
|
"depends": [
|
||||||
|
"$q",
|
||||||
|
"typeService",
|
||||||
|
"dialogService",
|
||||||
|
"policyService"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "CreationService",
|
||||||
|
"provides": "creationService",
|
||||||
|
"type": "provider",
|
||||||
|
"implementation": CreationService,
|
||||||
|
"depends": [
|
||||||
|
"$q",
|
||||||
|
"$log"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
"representers": [
|
"representers": [
|
||||||
{
|
{
|
||||||
"implementation": EditRepresenter,
|
"implementation": EditRepresenter,
|
||||||
@ -229,6 +376,33 @@ define([
|
|||||||
{
|
{
|
||||||
"implementation": EditToolbarRepresenter
|
"implementation": EditToolbarRepresenter
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"constants": [
|
||||||
|
{
|
||||||
|
"key": "editModeBlacklist",
|
||||||
|
"value": ["copy", "follow", "window", "link", "locate"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "nonEditContextBlacklist",
|
||||||
|
"value": ["copy", "follow", "properties", "move", "link", "remove", "locate"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"capabilities": [
|
||||||
|
{
|
||||||
|
"key": "editor",
|
||||||
|
"name": "Editor Capability",
|
||||||
|
"description": "Provides transactional editing capabilities",
|
||||||
|
"implementation": EditorCapability,
|
||||||
|
"depends": [
|
||||||
|
"transactionService"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"controls": [
|
||||||
|
{
|
||||||
|
"key": "locator",
|
||||||
|
"template": locatorTemplate
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user