Compare commits
2144 Commits
deploy.201
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1f5eb7f525 | ||
![]() |
812bf1a4f5 | ||
![]() |
b9688352f4 | ||
![]() |
2701581c12 | ||
![]() |
1ff47c63c4 | ||
![]() |
dbedf34be1 | ||
![]() |
5733d14ae4 | ||
![]() |
4cb225d578 | ||
![]() |
249deb0eff | ||
![]() |
446a9bc9b1 | ||
![]() |
ee4b26a7d7 | ||
![]() |
7601173aaa | ||
![]() |
e74b29c313 | ||
![]() |
eb7a746549 | ||
![]() |
d85469c98e | ||
![]() |
fe8a5a13e1 | ||
![]() |
f8d05dea78 | ||
![]() |
dc34ab38e7 | ||
![]() |
5c3d905424 | ||
![]() |
f00a899e74 | ||
![]() |
1c49615a2d | ||
![]() |
d6c4f1beea | ||
![]() |
f459fed279 | ||
![]() |
8de13d1949 | ||
![]() |
35f9d00a7d | ||
![]() |
17f200081a | ||
![]() |
a17556baf6 | ||
![]() |
575d78e38d | ||
![]() |
d6d1b7c738 | ||
![]() |
3fa2fcea93 | ||
![]() |
67104fc1f1 | ||
![]() |
ebb451d70c | ||
![]() |
e14003eb53 | ||
![]() |
bc8efb758f | ||
![]() |
8cd14b8952 | ||
![]() |
f62143217e | ||
![]() |
2c56238de0 | ||
![]() |
286b59c8ed | ||
![]() |
c5f3cc4873 | ||
![]() |
36e1f9b30e | ||
![]() |
7035b3f763 | ||
![]() |
862b14bad3 | ||
![]() |
38e45810e9 | ||
![]() |
bf636b05f2 | ||
![]() |
fa000b80c9 | ||
![]() |
ae57f3903e | ||
![]() |
6505a058d6 | ||
![]() |
e3efe7d7fc | ||
![]() |
703cdbd598 | ||
![]() |
217618ea71 | ||
![]() |
919857dfad | ||
![]() |
c74fa87016 | ||
![]() |
1cfb9d37be | ||
![]() |
cbd0c46e37 | ||
![]() |
e66efc1cbc | ||
![]() |
71c55779a1 | ||
![]() |
fa62539a40 | ||
![]() |
26ca2875ae | ||
![]() |
65cf81169b | ||
![]() |
2220334265 | ||
![]() |
3618488151 | ||
![]() |
ae8092ddc0 | ||
![]() |
d9c7ada46d | ||
![]() |
e1500d76a1 | ||
![]() |
a940e176e7 | ||
![]() |
381bdc98b5 | ||
![]() |
2c1c1a000e | ||
![]() |
935092c8d7 | ||
![]() |
fdd07e83b4 | ||
![]() |
f482c8be36 | ||
![]() |
b859386fda | ||
![]() |
07d241bdc2 | ||
![]() |
e35e01747a | ||
![]() |
8c374cde93 | ||
![]() |
8fb479c3e0 | ||
![]() |
c65a88a23a | ||
![]() |
521fb30b42 | ||
![]() |
38398588bb | ||
![]() |
79b456e511 | ||
![]() |
c6ec02429d | ||
![]() |
fa7c275eaa | ||
![]() |
bfb1b69374 | ||
![]() |
5dc64c4937 | ||
![]() |
ab0a2af471 | ||
![]() |
7292d6f53e | ||
![]() |
de26ed2091 | ||
![]() |
0dc7e0e045 | ||
![]() |
725d3b00da | ||
![]() |
09637d5e07 | ||
![]() |
7ad66ac83e | ||
![]() |
c31d87871b | ||
![]() |
adb8753b60 | ||
![]() |
a3ce77831d | ||
![]() |
57dec8f2fc | ||
![]() |
df325866f1 | ||
![]() |
20b72e5f10 | ||
![]() |
51f91c3748 | ||
![]() |
0f99defb25 | ||
![]() |
8211dd716a | ||
![]() |
55005b1b13 | ||
![]() |
4fc13503d5 | ||
![]() |
dad5950142 | ||
![]() |
101a0ec71f | ||
![]() |
192ebce0c3 | ||
![]() |
77dcbacd5e | ||
![]() |
3a211b8a73 | ||
![]() |
b0d1ac8463 | ||
![]() |
a09ec1c264 | ||
![]() |
546a678712 | ||
![]() |
645daffd10 | ||
![]() |
e436dbaeac | ||
![]() |
0a5b7465d8 | ||
![]() |
90dc71694e | ||
![]() |
9f636b986c | ||
![]() |
2ae61562ea | ||
![]() |
c118153f2f | ||
![]() |
08bc13aedd | ||
![]() |
f8ce0b494f | ||
![]() |
af4b85ab24 | ||
![]() |
d55147ee04 | ||
![]() |
be6bfda455 | ||
![]() |
ae1719b5f4 | ||
![]() |
a343815476 | ||
![]() |
7a6bb1cdd9 | ||
![]() |
eda72b785c | ||
![]() |
92eec06b6e | ||
![]() |
707c77aeee | ||
![]() |
20e8a47576 | ||
![]() |
238969bc51 | ||
![]() |
a27131015f | ||
![]() |
c65841e7ce | ||
![]() |
24aa541616 | ||
![]() |
1091385aab | ||
![]() |
a6e850ecea | ||
![]() |
9c9f161c26 | ||
![]() |
c07709139c | ||
![]() |
4347c1efe4 | ||
![]() |
9d429966d0 | ||
![]() |
243bd4aed5 | ||
![]() |
38be0fc90c | ||
![]() |
534714e7e9 | ||
![]() |
21cbc96e77 | ||
![]() |
90408dfb47 | ||
![]() |
1d0fb6468e | ||
![]() |
8e610a6191 | ||
![]() |
768963efc6 | ||
![]() |
1b00bc72a1 | ||
![]() |
4443dc9ddd | ||
![]() |
788bcfa0d4 | ||
![]() |
b481946000 | ||
![]() |
3fef8fdd0e | ||
![]() |
1c4f748b2e | ||
![]() |
cd7ab9b719 | ||
![]() |
ac4f5ed193 | ||
![]() |
84e207641e | ||
![]() |
620632500b | ||
![]() |
92896aa8e1 | ||
![]() |
58955469c6 | ||
![]() |
4b9d9fda1e | ||
![]() |
6deae83a1b | ||
![]() |
7764479c14 | ||
![]() |
24465e634f | ||
![]() |
b1aead7577 | ||
![]() |
41884ff9d2 | ||
![]() |
6639a29411 | ||
![]() |
22c938489e | ||
![]() |
c0df9d03e1 | ||
![]() |
84660db9d2 | ||
![]() |
9a9d3805d8 | ||
![]() |
f6d6e9150a | ||
![]() |
5d74d57ac6 | ||
![]() |
4f394ad72e | ||
![]() |
d82ff49359 | ||
![]() |
9cff29ce80 | ||
![]() |
0570a86035 | ||
![]() |
e919906f99 | ||
![]() |
2882c8ca96 | ||
![]() |
069f7ddbeb | ||
![]() |
add716945f | ||
![]() |
5c0697ed85 | ||
![]() |
7cfa83deb8 | ||
![]() |
35961e3c63 | ||
![]() |
3e7a8b694e | ||
![]() |
1fc82577b1 | ||
![]() |
05b85eb37f | ||
![]() |
6efb2ac449 | ||
![]() |
2d0aee4e68 | ||
![]() |
b0df09fb22 | ||
![]() |
4bbf114e82 | ||
![]() |
e1a2f42030 | ||
![]() |
5ddbde82f1 | ||
![]() |
a7e2099829 | ||
![]() |
c70ed06848 | ||
![]() |
557797ab19 | ||
![]() |
0a872e25a7 | ||
![]() |
8eaee33d6d | ||
![]() |
660752ec78 | ||
![]() |
93deb7f4e2 | ||
![]() |
f9dde74f59 | ||
![]() |
0c15a09d54 | ||
![]() |
ed71aa133e | ||
![]() |
efaae492c4 | ||
![]() |
c96a4602cd | ||
![]() |
99b7ce4a9d | ||
![]() |
c694ab24f6 | ||
![]() |
76749e2250 | ||
![]() |
9a7508e25d | ||
![]() |
5163e5129b | ||
![]() |
a63188ae13 | ||
![]() |
34ca0cc386 | ||
![]() |
fb1b820837 | ||
![]() |
ee5f842d51 | ||
![]() |
271b8f89ea | ||
![]() |
13d2eba016 | ||
![]() |
21f25cd2bf | ||
![]() |
c3ef9ac5d9 | ||
![]() |
becde631d5 | ||
![]() |
1c33475ff6 | ||
![]() |
dcac5d4150 | ||
![]() |
ea79bb1625 | ||
![]() |
bd7e4a001d | ||
![]() |
e3b77b4b5a | ||
![]() |
6eed891a1a | ||
![]() |
bbf0b7459f | ||
![]() |
cebaa0e8d1 | ||
![]() |
982d13e897 | ||
![]() |
b8f8071f98 | ||
![]() |
253a56f47d | ||
![]() |
f9df4b1896 | ||
![]() |
85b2837c52 | ||
![]() |
39cf0b3044 | ||
![]() |
4b71704b1c | ||
![]() |
e7ca2c8bfe | ||
![]() |
a920ae9cd7 | ||
![]() |
4e3a755908 | ||
![]() |
a6087d4fcd | ||
![]() |
131a09c9c5 | ||
![]() |
f5823669b2 | ||
![]() |
03332a8654 | ||
![]() |
16da227dd9 | ||
![]() |
bde3b7375a | ||
![]() |
7649c180dd | ||
![]() |
561e671e0d | ||
![]() |
0606aff5b8 | ||
![]() |
e6520ff7cc | ||
![]() |
959da82d91 | ||
![]() |
0b8c032c21 | ||
![]() |
ac7c92d0c4 | ||
![]() |
f349321024 | ||
![]() |
040932d676 | ||
![]() |
b57adacf02 | ||
![]() |
6ee82c0cf8 | ||
![]() |
5bf4e4ffe4 | ||
![]() |
f4aa705b51 | ||
![]() |
341296aaaa | ||
![]() |
01bcfb8a8c | ||
![]() |
493bf72605 | ||
![]() |
1233eba3e8 | ||
![]() |
8d2ca774d0 | ||
![]() |
f445690fb5 | ||
![]() |
10b0c62fc2 | ||
![]() |
8e2b3a86c6 | ||
![]() |
5a0618b22e | ||
![]() |
4edd1feaad | ||
![]() |
f5211f1fdc | ||
![]() |
dbd124852d | ||
![]() |
7aa77b4f6f | ||
![]() |
00d448c231 | ||
![]() |
0813d8cd45 | ||
![]() |
d8160614bf | ||
![]() |
737685a7c0 | ||
![]() |
ece4141cc5 | ||
![]() |
e60b0a0224 | ||
![]() |
fafaf65043 | ||
![]() |
09e4f52dac | ||
![]() |
e27a19101d | ||
![]() |
ab54733723 | ||
![]() |
9e94643dc4 | ||
![]() |
4e720519fe | ||
![]() |
e5763ee2d6 | ||
![]() |
ca3a24e686 | ||
![]() |
ac576077ab | ||
![]() |
b68ae942a6 | ||
![]() |
83bb882475 | ||
![]() |
8abc24f04b | ||
![]() |
573ebfd406 | ||
![]() |
ae704df6bf | ||
![]() |
f6b95a9a9a | ||
![]() |
7f74787b91 | ||
![]() |
f01b95f886 | ||
![]() |
8cf9be6adc | ||
![]() |
a751145fef | ||
![]() |
f9263fc8f3 | ||
![]() |
21285bbe8b | ||
![]() |
6e73923fbb | ||
![]() |
c9bfb0c05e | ||
![]() |
0885052537 | ||
![]() |
cbe5d7ac34 | ||
![]() |
92935b626b | ||
![]() |
7fa107a3f0 | ||
![]() |
d95e34484f | ||
![]() |
b4a8dc5707 | ||
![]() |
a941bc867a | ||
![]() |
79c8e97f51 | ||
![]() |
fc0aefb42c | ||
![]() |
90675b1380 | ||
![]() |
7eef434c67 | ||
![]() |
b99dc5ee59 | ||
![]() |
875ff4fb44 | ||
![]() |
201a37aa70 | ||
![]() |
8c9f92062d | ||
![]() |
bae81542b9 | ||
![]() |
d18715858f | ||
![]() |
af76a3f30b | ||
![]() |
96f22bff8c | ||
![]() |
e170753ba8 | ||
![]() |
fdd7b5b91b | ||
![]() |
462b3d637f | ||
![]() |
2e2d2ae81b | ||
![]() |
c6a5db87a4 | ||
![]() |
5a747a4da0 | ||
![]() |
598f6a02fb | ||
![]() |
830211444b | ||
![]() |
048e7737ea | ||
![]() |
b950b60c64 | ||
![]() |
b94cc70a4e | ||
![]() |
4d73d67f51 | ||
![]() |
80a0255f39 | ||
![]() |
e09da9386d | ||
![]() |
f07dd50e43 | ||
![]() |
679d5227b3 | ||
![]() |
6ad07924d3 | ||
![]() |
e25d1e80a6 | ||
![]() |
b2b892238b | ||
![]() |
9a55449789 | ||
![]() |
cc38f08df4 | ||
![]() |
09f27d47be | ||
![]() |
2793d6a6e6 | ||
![]() |
d94801ed18 | ||
![]() |
9d5775f6a2 | ||
![]() |
787febe4f6 | ||
![]() |
00653e9420 | ||
![]() |
ada9e9ba02 | ||
![]() |
6db80a4073 | ||
![]() |
9201f86921 | ||
![]() |
87fdd95a6f | ||
![]() |
ee23903cc2 | ||
![]() |
d4955c1ed0 | ||
![]() |
0d9755489f | ||
![]() |
35c5d619bd | ||
![]() |
36d099667e | ||
![]() |
bdcb906fe0 | ||
![]() |
842c050100 | ||
![]() |
2be45cdc18 | ||
![]() |
e8f2e5ae97 | ||
![]() |
a56e4a39c3 | ||
![]() |
e1a334678d | ||
![]() |
9b4d5c5b4e | ||
![]() |
b31831d535 | ||
![]() |
b8b1459cf5 | ||
![]() |
69dd90b76b | ||
![]() |
a732a18e59 | ||
![]() |
c3fd0d8e98 | ||
![]() |
7ae4d6aa7d | ||
![]() |
147ab06fcf | ||
![]() |
e2a602a8af | ||
![]() |
e7c4d18e9b | ||
![]() |
e84cf89cf7 | ||
![]() |
e161717f73 | ||
![]() |
d7400c0567 | ||
![]() |
81898e422f | ||
![]() |
60348781d6 | ||
![]() |
7187d2ef45 | ||
![]() |
d636369daa | ||
![]() |
35f95739c7 | ||
![]() |
dbd83c8643 | ||
![]() |
ca633bdf7b | ||
![]() |
ad4d06cb25 | ||
![]() |
39a579c9db | ||
![]() |
34e53c1034 | ||
![]() |
e4623d981b | ||
![]() |
c50c01f8ea | ||
![]() |
a2bd6d827d | ||
![]() |
74a9a1603e | ||
![]() |
d59e402314 | ||
![]() |
3946077c96 | ||
![]() |
c40e413f35 | ||
![]() |
ab0b0cbebc | ||
![]() |
1843d8cb54 | ||
![]() |
6ee956367c | ||
![]() |
8de314e943 | ||
![]() |
47439657a1 | ||
![]() |
d9cff6e8b4 | ||
![]() |
6ff69bf94a | ||
![]() |
5cf1cbba6b | ||
![]() |
d677307006 | ||
![]() |
63ddf332a8 | ||
![]() |
69ac8e1a00 | ||
![]() |
60a77742c0 | ||
![]() |
60116154c7 | ||
![]() |
14d372251c | ||
![]() |
efe80caa37 | ||
![]() |
2e45aae5f9 | ||
![]() |
174e7b2bc1 | ||
![]() |
86a6cf5c05 | ||
![]() |
5a8024fd42 | ||
![]() |
e0629a1571 | ||
![]() |
129674aa25 | ||
![]() |
3827b6b4d8 | ||
![]() |
61e445381c | ||
![]() |
d78ec1a438 | ||
![]() |
b2ec5ab110 | ||
![]() |
e86de3d068 | ||
![]() |
657839a2a4 | ||
![]() |
88b7af156d | ||
![]() |
ac426b3914 | ||
![]() |
5ece740957 | ||
![]() |
e4658e8023 | ||
![]() |
728f428c1f | ||
![]() |
9cb7c6c836 | ||
![]() |
576409ba1e | ||
![]() |
9baadcfd9e | ||
![]() |
0b1bd7d090 | ||
![]() |
495c3b50f8 | ||
![]() |
3fa79819dd | ||
![]() |
85f61c5155 | ||
![]() |
336479a2be | ||
![]() |
fe36e018ce | ||
![]() |
fd885304f6 | ||
![]() |
a6e6cb0418 | ||
![]() |
c7212174fb | ||
![]() |
1ba9548ad0 | ||
![]() |
0176f9fb0c | ||
![]() |
613e1dac80 | ||
![]() |
f117c939dd | ||
![]() |
bdfd78c9f1 | ||
![]() |
465ddc81f6 | ||
![]() |
f9d5e94d41 | ||
![]() |
b482922dd7 | ||
![]() |
d40e2eddb3 | ||
![]() |
00304798a6 | ||
![]() |
6771e53da6 | ||
![]() |
4db677b407 | ||
![]() |
36a28290ec | ||
![]() |
fbe9eb2fc4 | ||
![]() |
787b2fa4d1 | ||
![]() |
466588d1d6 | ||
![]() |
362ff8d73a | ||
![]() |
41f69029a4 | ||
![]() |
a604463c9d | ||
![]() |
af6e1ec69a | ||
![]() |
6784f6f708 | ||
![]() |
d299f330ff | ||
![]() |
9b3440be1f | ||
![]() |
4bbb90ce02 | ||
![]() |
a091cdf97f | ||
![]() |
6afdd3b0e3 | ||
![]() |
3f2fb06791 | ||
![]() |
afecf3dfbb | ||
![]() |
193eccb179 | ||
![]() |
9acb4a2476 | ||
![]() |
335b7a1302 | ||
![]() |
4d69e32534 | ||
![]() |
339b1269e4 | ||
![]() |
2eaf1e9c4d | ||
![]() |
983ccd5e0a | ||
![]() |
9a1474aac4 | ||
![]() |
b4ccfa5110 | ||
![]() |
834ab67ac2 | ||
![]() |
cfcd65c0b1 | ||
![]() |
5b930a661a | ||
![]() |
ff6455bab7 | ||
![]() |
6e8e48ab96 | ||
![]() |
46a3af254a | ||
![]() |
b5ef87fd32 | ||
![]() |
7b04ae16ce | ||
![]() |
701acecc56 | ||
![]() |
88fd47002f | ||
![]() |
dfb303a0a3 | ||
![]() |
b23aaa8b02 | ||
![]() |
11b66b26a0 | ||
![]() |
d5ac31b557 | ||
![]() |
2299494da8 | ||
![]() |
2fac9ba462 | ||
![]() |
f898636a25 | ||
![]() |
7d1dce76ee | ||
![]() |
e2122050df | ||
![]() |
f7599e98c3 | ||
![]() |
813998be35 | ||
![]() |
d16b655d1c | ||
![]() |
0f6230fddc | ||
![]() |
e247ab35b4 | ||
![]() |
6a8911b36e | ||
![]() |
8f7ec796af | ||
![]() |
701c683bff | ||
![]() |
72879709f0 | ||
![]() |
fbd7305252 | ||
![]() |
46836812f4 | ||
![]() |
cd82f30f8c | ||
![]() |
b35e24868a | ||
![]() |
8719b1a772 | ||
![]() |
e80f399e83 | ||
![]() |
fda6e7f6f9 | ||
![]() |
e47ec2f581 | ||
![]() |
1620db18c9 | ||
![]() |
811ab63f1e | ||
![]() |
b350414ae6 | ||
![]() |
625e23228a | ||
![]() |
4a54b2df9b | ||
![]() |
512450b7ce | ||
![]() |
8c911fcc2c | ||
![]() |
5f00526700 | ||
![]() |
def57c603b | ||
![]() |
64a580f299 | ||
![]() |
68cee22a76 | ||
![]() |
e1f5086877 | ||
![]() |
52cbf7a130 | ||
![]() |
d1f3ee2c6f | ||
![]() |
aad5530d2e | ||
![]() |
380204bb44 | ||
![]() |
68537ca3a5 | ||
![]() |
1d6cf2fbea | ||
![]() |
1545dbd9d1 | ||
![]() |
02f986fe72 | ||
![]() |
00fbf2c6d9 | ||
![]() |
5c99abfafc | ||
![]() |
36147b36a0 | ||
![]() |
99e3864acd | ||
![]() |
8bf917984c | ||
![]() |
14faf23d0b | ||
![]() |
9fa7e408cd | ||
![]() |
558f6e64c0 | ||
![]() |
fa0d533059 | ||
![]() |
10a747d2ac | ||
![]() |
1bbceeaf13 | ||
![]() |
bb544f8a7d | ||
![]() |
9c403da804 | ||
![]() |
f33161f95e | ||
![]() |
16a8d356fc | ||
![]() |
bc67c4cccd | ||
![]() |
02e2f84209 | ||
![]() |
a713a5969f | ||
![]() |
718bf96a87 | ||
![]() |
a048e1fca1 | ||
![]() |
9052ec133c | ||
![]() |
a5c3cf69f2 | ||
![]() |
2e39139da3 | ||
![]() |
860e89dd86 | ||
![]() |
7d6dd75bdf | ||
![]() |
e80c022874 | ||
![]() |
ebc7c5a1ed | ||
![]() |
8f61f49826 | ||
![]() |
3306e5a7e6 | ||
![]() |
3c2fbc067e | ||
![]() |
7f57466484 | ||
![]() |
f9ac2e6a76 | ||
![]() |
1ba4cf25d0 | ||
![]() |
e646edbc0e | ||
![]() |
1d71f943ca | ||
![]() |
24032d4040 | ||
![]() |
b7215bbeaf | ||
![]() |
4da602c632 | ||
![]() |
e603c2ac9a | ||
![]() |
a9c39ceab6 | ||
![]() |
c0917d2128 | ||
![]() |
0d94c1b786 | ||
![]() |
2b84d5228b | ||
![]() |
fedc6acec1 | ||
![]() |
fbb30d120c | ||
![]() |
4ed60c5fbb | ||
![]() |
12ac35a123 | ||
![]() |
f41a6d0e34 | ||
![]() |
942a48996a | ||
![]() |
0ff2f25de4 | ||
![]() |
e4e29ff418 | ||
![]() |
a6ca21f03d | ||
![]() |
42b75fab6a | ||
![]() |
27cb6035a3 | ||
![]() |
d07afa8b6f | ||
![]() |
eb502c9094 | ||
![]() |
4687957514 | ||
![]() |
3a366a234a | ||
![]() |
6e7a27da87 | ||
![]() |
1a1fedfb74 | ||
![]() |
0f2f2253cf | ||
![]() |
76c9b368cf | ||
![]() |
8562ac894c | ||
![]() |
e350f7bb04 | ||
![]() |
c38a64bc2f | ||
![]() |
eb60eb0caf | ||
![]() |
ffb635b846 | ||
![]() |
a964272df2 | ||
![]() |
3ef64f0910 | ||
![]() |
ace639adc0 | ||
![]() |
33917bf73c | ||
![]() |
abf40de3c2 | ||
![]() |
b665468bf7 | ||
![]() |
d44f020dec | ||
![]() |
f9b1c37d04 | ||
![]() |
732f572c6e | ||
![]() |
b79b711e40 | ||
![]() |
cb01f58f4d | ||
![]() |
5a35f0c1b7 | ||
![]() |
ac8765f0f1 | ||
![]() |
b74aa037d5 | ||
![]() |
8b7a316ebf | ||
![]() |
6d86b587e9 | ||
![]() |
0e210d791a | ||
![]() |
b7350f3ee0 | ||
![]() |
8ea023cdbd | ||
![]() |
e8fb719591 | ||
![]() |
4dc5c03077 | ||
![]() |
b5648b864b | ||
![]() |
df59484afb | ||
![]() |
ceba450eb2 | ||
![]() |
26fe355e40 | ||
![]() |
5326821990 | ||
![]() |
6d0067bdb0 | ||
![]() |
06c579c453 | ||
![]() |
ad40e7b53a | ||
![]() |
ca54a64211 | ||
![]() |
a8d585cb74 | ||
![]() |
a00704943a | ||
![]() |
fe67ce0882 | ||
![]() |
05f9b0df7e | ||
![]() |
b3c966b245 | ||
![]() |
dda11feb33 | ||
![]() |
b047f4920d | ||
![]() |
dda2051d57 | ||
![]() |
13ce7f88bd | ||
![]() |
8d5e7d5b87 | ||
![]() |
36058f79b9 | ||
![]() |
1570935099 | ||
![]() |
ea88a6271a | ||
![]() |
df4b715ce9 | ||
![]() |
e64ceab8c4 | ||
![]() |
7b655eee61 | ||
![]() |
9de0df7cbd | ||
![]() |
d6cbdba401 | ||
![]() |
4e0790e504 | ||
![]() |
8aac1c062d | ||
![]() |
507dcc7376 | ||
![]() |
c7f412f636 | ||
![]() |
94a018769d | ||
![]() |
2e5c3c8a2d | ||
![]() |
fcff3f549d | ||
![]() |
e8af1e0109 | ||
![]() |
9370b4b7be | ||
![]() |
c5fa70776b | ||
![]() |
cecd09fa99 | ||
![]() |
05b22c40e0 | ||
![]() |
58f540457b | ||
![]() |
978b35b6ca | ||
![]() |
d6fa74c8f6 | ||
![]() |
7dc3a66383 | ||
![]() |
6ef0c1af96 | ||
![]() |
33c439a928 | ||
![]() |
c0fe47f2c1 | ||
![]() |
47d8951535 | ||
![]() |
dd09b105ee | ||
![]() |
aa22f7bb61 | ||
![]() |
da10f0a839 | ||
![]() |
1f7f75b32c | ||
![]() |
eec378116f | ||
![]() |
86cd0f8a13 | ||
![]() |
ee52beaa10 | ||
![]() |
9053a1e379 | ||
![]() |
9aee4fd4b8 | ||
![]() |
144c3cd4f8 | ||
![]() |
3d1cbdd1d8 | ||
![]() |
11b5e2f024 | ||
![]() |
73d5024e06 | ||
![]() |
f6e4aca204 | ||
![]() |
e4b689b0d5 | ||
![]() |
75ce90fc03 | ||
![]() |
fa27fae524 | ||
![]() |
1233890a5a | ||
![]() |
8341b2c1cd | ||
![]() |
073fd3feac | ||
![]() |
6de92f20d9 | ||
![]() |
7e68915ede | ||
![]() |
110c17d2c4 | ||
![]() |
79eb530270 | ||
![]() |
bc1db07901 | ||
![]() |
5736dbfe4b | ||
![]() |
98d9476b7a | ||
![]() |
0238eb18b1 | ||
![]() |
351cb909b6 | ||
![]() |
0cea3d43a6 | ||
![]() |
b4c6edf72c | ||
![]() |
d8f2758e31 | ||
![]() |
db93e755d6 | ||
![]() |
97463e6320 | ||
![]() |
2ebba3e774 | ||
![]() |
a2e78bb058 | ||
![]() |
a6f18ab19c | ||
![]() |
e382d3015d | ||
![]() |
8e5d40029a | ||
![]() |
a0ca1ec66b | ||
![]() |
8c35e42b2b | ||
![]() |
7e59794571 | ||
![]() |
daeb5fa056 | ||
![]() |
c0f2416703 | ||
![]() |
5ad61f1968 | ||
![]() |
457f66b91f | ||
![]() |
759e56d7ba | ||
![]() |
58a817ee8d | ||
![]() |
23c5161365 | ||
![]() |
caff4dda46 | ||
![]() |
9efa886d01 | ||
![]() |
86aea340eb | ||
![]() |
f41babc783 | ||
![]() |
5b361a49ef | ||
![]() |
d15d35a9ff | ||
![]() |
72b214e5b8 | ||
![]() |
0059a34daa | ||
![]() |
8bc1d4ad33 | ||
![]() |
163ad2a6dd | ||
![]() |
8795a932d0 | ||
![]() |
b6488cceaf | ||
![]() |
b9434e5baf | ||
![]() |
0f39e6fb7a | ||
![]() |
0e60932829 | ||
![]() |
584977e97d | ||
![]() |
42ee11263e | ||
![]() |
4c28a41dff | ||
![]() |
eeeb64d29a | ||
![]() |
2d34fc0252 | ||
![]() |
5ec89df59e | ||
![]() |
023293de8a | ||
![]() |
f5f910bed3 | ||
![]() |
ff9813f200 | ||
![]() |
ed7bebdfe4 | ||
![]() |
691e02d08f | ||
![]() |
db72c54bc4 | ||
![]() |
63d8db4692 | ||
![]() |
e6fd028a6e | ||
![]() |
ac6c73a340 | ||
![]() |
a052278bda | ||
![]() |
cf7849a446 | ||
![]() |
6eb1405cea | ||
![]() |
14ac3872c3 | ||
![]() |
dac21f6164 | ||
![]() |
6578e8b3ce | ||
![]() |
d2abeb6841 | ||
![]() |
4ca636caf1 | ||
![]() |
183b4bf966 | ||
![]() |
8891b325b3 | ||
![]() |
4ba671542a | ||
![]() |
bed880019f | ||
![]() |
0efcaabc62 | ||
![]() |
868995bf09 | ||
![]() |
7817cd47e4 | ||
![]() |
7652f9b5b0 | ||
![]() |
271724f994 | ||
![]() |
e7aa74872d | ||
![]() |
dd4580f151 | ||
![]() |
c74cf7932a | ||
![]() |
b4f9cd95e8 | ||
![]() |
34510791b0 | ||
![]() |
8f7603c9fe | ||
![]() |
7293e06c0e | ||
![]() |
87ddf9979a | ||
![]() |
fcfd634591 | ||
![]() |
b32ce35a05 | ||
![]() |
e2be355054 | ||
![]() |
dd319b343e | ||
![]() |
47809b013f | ||
![]() |
6a3f51ef9a | ||
![]() |
dc2daeafdc | ||
![]() |
0ae751f7dc | ||
![]() |
309f5aa578 | ||
![]() |
2accdd5626 | ||
![]() |
8d4762eb81 | ||
![]() |
004d890a08 | ||
![]() |
f4b9a3bbe2 | ||
![]() |
99f828ef65 | ||
![]() |
cc0bed2974 | ||
![]() |
a2af72a10d | ||
![]() |
a7ad2c0a63 | ||
![]() |
68ea7071e0 | ||
![]() |
f6fec80b5d | ||
![]() |
3cbbbcbfdb | ||
![]() |
76ca9c1eaa | ||
![]() |
f5d986aaca | ||
![]() |
31eca3e5c3 | ||
![]() |
08dbac84aa | ||
![]() |
a7bc36cba7 | ||
![]() |
72f323bce4 | ||
![]() |
d6a869dba0 | ||
![]() |
44d59909d3 | ||
![]() |
48fc13b7bf | ||
![]() |
db1db13066 | ||
![]() |
052aae3856 | ||
![]() |
cb9c26d3a5 | ||
![]() |
918453a3a5 | ||
![]() |
9bee539474 | ||
![]() |
a38309ff05 | ||
![]() |
636f7cd987 | ||
![]() |
9c0a2780c3 | ||
![]() |
e6bbdba6dc | ||
![]() |
18623d231c | ||
![]() |
800db73e96 | ||
![]() |
1ec639e930 | ||
![]() |
68e1f5cc7c | ||
![]() |
7e811e3f81 | ||
![]() |
342ee75964 | ||
![]() |
cb4879ef75 | ||
![]() |
c2b9c086a5 | ||
![]() |
9533c32033 | ||
![]() |
79144d6d48 | ||
![]() |
0bc1b03041 | ||
![]() |
dd01d22b0f | ||
![]() |
7ed4d33053 | ||
![]() |
e934061ce7 | ||
![]() |
0865600cff | ||
![]() |
695d0a2495 | ||
![]() |
fade8f05c3 | ||
![]() |
70ec68e0d4 | ||
![]() |
e407dd69fb | ||
![]() |
afd4a15aeb | ||
![]() |
a59723cf67 | ||
![]() |
a340028554 | ||
![]() |
263ebd6af6 | ||
![]() |
cbdd754c00 | ||
![]() |
1d068fdfde | ||
![]() |
0ab508a5dc | ||
![]() |
fc5e003be9 | ||
![]() |
f6a1b455e6 | ||
![]() |
a6d4c2f6f7 | ||
![]() |
572804653c | ||
![]() |
8a1d1b9be6 | ||
![]() |
7bc0be0de1 | ||
![]() |
b575d78250 | ||
![]() |
7601e15ab8 | ||
![]() |
996bde3200 | ||
![]() |
e75fbc2485 | ||
![]() |
86315e48ad | ||
![]() |
c0b49095b4 | ||
![]() |
bd6e1e347b | ||
![]() |
859ed2cdea | ||
![]() |
413a326022 | ||
![]() |
9d94f313b6 | ||
![]() |
0d4e3a029a | ||
![]() |
2ebd6e893a | ||
![]() |
1072577ce0 | ||
![]() |
360d4fd195 | ||
![]() |
c4bc5a5f8b | ||
![]() |
5ba541fb43 | ||
![]() |
78d16542b3 | ||
![]() |
fa7472c172 | ||
![]() |
f262ae15f5 | ||
![]() |
e42a4088e7 | ||
![]() |
ce2397dd9a | ||
![]() |
07ce13b2e4 | ||
![]() |
8ebd644485 | ||
![]() |
6529449617 | ||
![]() |
ef045bdcb8 | ||
![]() |
c83afe458a | ||
![]() |
37da11d55a | ||
![]() |
21a50aa9a5 | ||
![]() |
20afef8c43 | ||
![]() |
8f4c9cf58e | ||
![]() |
fdb09ecd4c | ||
![]() |
3fe260243b | ||
![]() |
3d84a52dbc | ||
![]() |
4e03709cca | ||
![]() |
8ff3297083 | ||
![]() |
7e973ff50a | ||
![]() |
5ae9c1603d | ||
![]() |
774262175a | ||
![]() |
609fb5ae9b | ||
![]() |
4989c4f68e | ||
![]() |
b61b06620c | ||
![]() |
1365caae9a | ||
![]() |
af8df832f7 | ||
![]() |
99a6ebb89f | ||
![]() |
607b092918 | ||
![]() |
6318fcd716 | ||
![]() |
2332c3cf63 | ||
![]() |
78580c1e76 | ||
![]() |
fb4b39f8af | ||
![]() |
1086dae2e2 | ||
![]() |
4115a7c59b | ||
![]() |
1c9dbed4df | ||
![]() |
0b548f7316 | ||
![]() |
eff7d41a06 | ||
![]() |
c299dbc35d | ||
![]() |
1cdd447ae6 | ||
![]() |
afe34223bd | ||
![]() |
92eb8436a1 | ||
![]() |
f5473a3b7f | ||
![]() |
d252a0657a | ||
![]() |
acc1b490b3 | ||
![]() |
6552418e4b | ||
![]() |
5f37bcb312 | ||
![]() |
648d7579e4 | ||
![]() |
6b6f0a6994 | ||
![]() |
db8b70848d | ||
![]() |
950cb45a7c | ||
![]() |
410f4730bb | ||
![]() |
f8470cd231 | ||
![]() |
e1bb8a2e41 | ||
![]() |
81264689f8 | ||
![]() |
d2dd744811 | ||
![]() |
4201b81fe8 | ||
![]() |
394e9ce11b | ||
![]() |
8b333c09fa | ||
![]() |
e9736dfda9 | ||
![]() |
e8da85562c | ||
![]() |
7229e068c5 | ||
![]() |
d687ebe01a | ||
![]() |
275f8f14b2 | ||
![]() |
d08e70f6cf | ||
![]() |
08e53b6aee | ||
![]() |
064f414da7 | ||
![]() |
1b1dbe3d15 | ||
![]() |
4b8900be0a | ||
![]() |
2d0cd7e44f | ||
![]() |
697f3bc56c | ||
![]() |
3d21fd88a7 | ||
![]() |
4559a8441f | ||
![]() |
621b5750f0 | ||
![]() |
0b658dab73 | ||
![]() |
d32fe183ad | ||
![]() |
ac6d6037f9 | ||
![]() |
d398f468b8 | ||
![]() |
b9cf051575 | ||
![]() |
2700bc9557 | ||
![]() |
1fb4a868be | ||
![]() |
ff107384c2 | ||
![]() |
4d519f145a | ||
![]() |
93373e89ee | ||
![]() |
234572f8a6 | ||
![]() |
ce64132de1 | ||
![]() |
5c24778394 | ||
![]() |
f9fcd3888c | ||
![]() |
f697278527 | ||
![]() |
621481cdfc | ||
![]() |
a26dd329de | ||
![]() |
38c90b53f0 | ||
![]() |
44bff4571e | ||
![]() |
c817cd5ed3 | ||
![]() |
cc98163686 | ||
![]() |
9c4bee76f5 | ||
![]() |
b04cf65485 | ||
![]() |
dfbd1cab2c | ||
![]() |
22ac301149 | ||
![]() |
e2db99c7fd | ||
![]() |
a85f0ebc9f | ||
![]() |
b27977baaa | ||
![]() |
f8390b8f82 | ||
![]() |
29c95a4180 | ||
![]() |
984dd2328e | ||
![]() |
193a005434 | ||
![]() |
a4a75912b0 | ||
![]() |
a304ce2640 | ||
![]() |
e217335f2d | ||
![]() |
971691852f | ||
![]() |
870c6703b1 | ||
![]() |
5e1dd9a83b | ||
![]() |
2751d8878e | ||
![]() |
bfb4946df8 | ||
![]() |
1fc1fdadfa | ||
![]() |
95c91786ac | ||
![]() |
5229dc9fef | ||
![]() |
141015b583 | ||
![]() |
7b7b16e57f | ||
![]() |
8c07e4ec7a | ||
![]() |
661b16255b | ||
![]() |
7373d47b14 | ||
![]() |
55a9eaf7b3 | ||
![]() |
0557f17cfa | ||
![]() |
ee4eb418ef | ||
![]() |
1801645ddd | ||
![]() |
1456fcb22b | ||
![]() |
d6e40d6ebd | ||
![]() |
0964c8753e | ||
![]() |
e8c719587f | ||
![]() |
ab9697892f | ||
![]() |
065796bc76 | ||
![]() |
8733b46d32 | ||
![]() |
c2226f14f7 | ||
![]() |
fe13a44237 | ||
![]() |
593602bf49 | ||
![]() |
935e421256 | ||
![]() |
e5c4a45173 | ||
![]() |
4ac5841a6d | ||
![]() |
1760168d45 | ||
![]() |
05e7b41a5e | ||
![]() |
4ea1ace04d | ||
![]() |
b0bccce0ab | ||
![]() |
f8207c75da | ||
![]() |
6dc3dd357e | ||
![]() |
b735f08153 | ||
![]() |
66ef0dcfab | ||
![]() |
11daca52a1 | ||
![]() |
ca483a2a78 | ||
![]() |
f2211ef267 | ||
![]() |
466b42b8c1 | ||
![]() |
49b83f4d2b | ||
![]() |
c7a72644b2 | ||
![]() |
0a4976f4ac | ||
![]() |
b22f4d5464 | ||
![]() |
7e250b5f26 | ||
![]() |
9a232626cc | ||
![]() |
28afd84ef1 | ||
![]() |
4d5884c42b | ||
![]() |
3356b4367a | ||
![]() |
8a60afda1d | ||
![]() |
b609b11ff2 | ||
![]() |
0cfc7b85e7 | ||
![]() |
397600c46d | ||
![]() |
9b58ff45b6 | ||
![]() |
84010f63c4 | ||
![]() |
99801ee6ab | ||
![]() |
8b7d84ff95 | ||
![]() |
db571219b1 | ||
![]() |
53c8feaa97 | ||
![]() |
a06b565f36 | ||
![]() |
36413c9f75 | ||
![]() |
929a964e71 | ||
![]() |
9feda6fa17 | ||
![]() |
5e01bb8d68 | ||
![]() |
212efad6f2 | ||
![]() |
feb3115da6 | ||
![]() |
268bc6096a | ||
![]() |
9bf5582f7d | ||
![]() |
9609daab3b | ||
![]() |
cc1ae3c2e7 | ||
![]() |
f9563187d3 | ||
![]() |
c76d4de614 | ||
![]() |
60bd9e6a26 | ||
![]() |
3703194709 | ||
![]() |
249003d2ff | ||
![]() |
89f055cbd0 | ||
![]() |
972f9bf83c | ||
![]() |
6367f1882b | ||
![]() |
62c1326bd0 | ||
![]() |
9e7af7eaad | ||
![]() |
126c767fe1 | ||
![]() |
23e719ed78 | ||
![]() |
64dc75fa2d | ||
![]() |
d0e0c9588b | ||
![]() |
6d815dde20 | ||
![]() |
991d92b4e5 | ||
![]() |
c6ee26c2e5 | ||
![]() |
3feaf18e1e | ||
![]() |
36be656c62 | ||
![]() |
203fbcea8a | ||
![]() |
a78e226de1 | ||
![]() |
bcfa16a500 | ||
![]() |
3797d363e5 | ||
![]() |
8e080486fb | ||
![]() |
cac01a5c90 | ||
![]() |
283cf40aee | ||
![]() |
413fcb456c | ||
![]() |
76cc70acb3 | ||
![]() |
b9f525bffd | ||
![]() |
6e2b834cfd | ||
![]() |
cabf8bc57a | ||
![]() |
30da33022e | ||
![]() |
ccd5532956 | ||
![]() |
38ef4ab6f9 | ||
![]() |
e973a557da | ||
![]() |
b65209e3b1 | ||
![]() |
11966b1445 | ||
![]() |
c116cc3bbe | ||
![]() |
797f746c84 | ||
![]() |
3f8f20f9d0 | ||
![]() |
75ca986093 | ||
![]() |
3940e43886 | ||
![]() |
2deb352f96 | ||
![]() |
e33f38a159 | ||
![]() |
95cb234afa | ||
![]() |
e421ccf389 | ||
![]() |
3cf6b3f46e | ||
![]() |
970a1e7f4f | ||
![]() |
cbbd555fdd | ||
![]() |
708c738e5d | ||
![]() |
5a156a41df | ||
![]() |
7ab8d23e61 | ||
![]() |
4778ff3197 | ||
![]() |
7a04307c25 | ||
![]() |
eb2edd83db | ||
![]() |
acd0f1a65c | ||
![]() |
986d59c70d | ||
![]() |
ed9d80b555 | ||
![]() |
121859bf62 | ||
![]() |
34d864c0f8 | ||
![]() |
89fb73c931 | ||
![]() |
a1cc21b976 | ||
![]() |
64aa0f60ab | ||
![]() |
23ede27153 | ||
![]() |
cd4ad5b101 | ||
![]() |
35d8d20f0f | ||
![]() |
b7598e4d64 | ||
![]() |
a5453d66f0 | ||
![]() |
f09db46949 | ||
![]() |
0f01ba9a69 | ||
![]() |
de0dd340cf | ||
![]() |
9d6c703865 | ||
![]() |
24d2ee6253 | ||
![]() |
c0599de54f | ||
![]() |
f3543bf225 | ||
![]() |
5db4a2ff60 | ||
![]() |
84d187eb83 | ||
![]() |
d36bbbde1d | ||
![]() |
ff601fb748 | ||
![]() |
99d609cc23 | ||
![]() |
2f1c57df69 | ||
![]() |
4f9b286605 | ||
![]() |
8751635071 | ||
![]() |
b239cb5fa7 | ||
![]() |
4cbc492178 | ||
![]() |
6ac359d26d | ||
![]() |
918b6e043e | ||
![]() |
17a8edba50 | ||
![]() |
32124418a0 | ||
![]() |
796e7429bf | ||
![]() |
2220e84e2e | ||
![]() |
532a9c7f4d | ||
![]() |
06722927df | ||
![]() |
60bec2cd87 | ||
![]() |
c00947c5d8 | ||
![]() |
130eae92b2 | ||
![]() |
78f7fc99b0 | ||
![]() |
35d611f989 | ||
![]() |
42cacb31ec | ||
![]() |
a5ade45b47 | ||
![]() |
f7e0440a91 | ||
![]() |
305f74042c | ||
![]() |
8b6ca0790e | ||
![]() |
1093c4534a | ||
![]() |
32db6098cc | ||
![]() |
39857216c9 | ||
![]() |
5b49f62630 | ||
![]() |
bd29db1a14 | ||
![]() |
9b10f9058c | ||
![]() |
624a8dad71 | ||
![]() |
ac05a6d19a | ||
![]() |
defc930699 | ||
![]() |
8274e23b34 | ||
![]() |
13b9f3f6f2 | ||
![]() |
5e21afd1f4 | ||
![]() |
cf1e77c5e5 | ||
![]() |
d50b847f3f | ||
![]() |
03e5ec53df | ||
![]() |
59258637ba | ||
![]() |
a1e4a449ea | ||
![]() |
cdcf013fb6 | ||
![]() |
c2a6cec282 | ||
![]() |
e64efa9a4d | ||
![]() |
9d46fc6712 | ||
![]() |
c716752945 | ||
![]() |
98895b63d7 | ||
![]() |
ae3c12d0a8 | ||
![]() |
6695a8e19a | ||
![]() |
ecc635bde5 | ||
![]() |
5f4c6f4cfd | ||
![]() |
b30492296c | ||
![]() |
53b2f6ca0e | ||
![]() |
136a7a3e63 | ||
![]() |
d29193f396 | ||
![]() |
86c6d84941 | ||
![]() |
4dce8c8cc4 | ||
![]() |
f02d683892 | ||
![]() |
54cd5079a8 | ||
![]() |
c72509b4dd | ||
![]() |
95dc02727b | ||
![]() |
568582d749 | ||
![]() |
74d1415258 | ||
![]() |
461bef7682 | ||
![]() |
9133555efd | ||
![]() |
32bdc69e94 | ||
![]() |
5e66504b4d | ||
![]() |
125f230ea1 | ||
![]() |
a9ad4fb70a | ||
![]() |
a731028dfa | ||
![]() |
d3bf48a415 | ||
![]() |
76ac33a285 | ||
![]() |
0129c48aeb | ||
![]() |
802740e549 | ||
![]() |
6eb89c514f | ||
![]() |
d2a7e8bff1 | ||
![]() |
6a3a70bfe2 | ||
![]() |
51477b6938 | ||
![]() |
d32a121ba2 | ||
![]() |
e82abcc1d7 | ||
![]() |
6e2887b868 | ||
![]() |
a3ada26e17 | ||
![]() |
dfbd57cacd | ||
![]() |
de41d97229 | ||
![]() |
c2c5e7ff5c | ||
![]() |
c4b114bdb6 | ||
![]() |
e93f358db8 | ||
![]() |
20471649ef | ||
![]() |
aa9f226299 | ||
![]() |
439ac1f8ca | ||
![]() |
c5e35e43d5 | ||
![]() |
45fbd5a341 | ||
![]() |
5dc699b49f | ||
![]() |
5ddb4df521 | ||
![]() |
1c58ab9a1f | ||
![]() |
89baf93c62 | ||
![]() |
13fc4e83e5 | ||
![]() |
797bf28823 | ||
![]() |
3aa3dd5e00 | ||
![]() |
0bed9a5fa7 | ||
![]() |
26aa5c64ab | ||
![]() |
cc95e7a4e6 | ||
![]() |
d0234d5011 | ||
![]() |
88b128fc3e | ||
![]() |
c1e6934fc6 | ||
![]() |
4eb3aa25ad | ||
![]() |
92e0b4a54c | ||
![]() |
7584af6e52 | ||
![]() |
1d827e926d | ||
![]() |
eb0b7af011 | ||
![]() |
0ebf5b82a8 | ||
![]() |
03bd183704 | ||
![]() |
97b23dca96 | ||
![]() |
d28f37f18e | ||
![]() |
03d65f4cdc | ||
![]() |
39f403c98c | ||
![]() |
c76271a0d0 | ||
![]() |
b3ff3e3481 | ||
![]() |
81c6c7b9f8 | ||
![]() |
730a75bda1 | ||
![]() |
95b8fe485b | ||
![]() |
1b4cdc50e4 | ||
![]() |
c20134d8ae | ||
![]() |
8be71f07f5 | ||
![]() |
cc0265352b | ||
![]() |
def6f2b2c0 | ||
![]() |
b37dc28d99 | ||
![]() |
93918168f5 | ||
![]() |
455e758653 | ||
![]() |
6540f3ac5b | ||
![]() |
59ac99778c | ||
![]() |
63dff660ea | ||
![]() |
df6b87ddb8 | ||
![]() |
8cd3da7f5b | ||
![]() |
694bd43a87 | ||
![]() |
c5137d0fb4 | ||
![]() |
717099cc63 | ||
![]() |
aedd0d97fb | ||
![]() |
5fdc848123 | ||
![]() |
b703665fe5 | ||
![]() |
ea9e9d81c1 | ||
![]() |
a0949bed85 | ||
![]() |
dad8d9629a | ||
![]() |
274b948d8c | ||
![]() |
485e3d86b3 | ||
![]() |
51a791f4c9 | ||
![]() |
8324d967c4 | ||
![]() |
d20d7e7568 | ||
![]() |
5b9dd4819f | ||
![]() |
c735444039 | ||
![]() |
fa13d84089 | ||
![]() |
7715ed31d6 | ||
![]() |
6bd5fe8387 | ||
![]() |
3291355808 | ||
![]() |
56bf89346b | ||
![]() |
80aa01f3b0 | ||
![]() |
55fd558eb0 | ||
![]() |
32d1bc3a36 | ||
![]() |
72fdfc20a2 | ||
![]() |
9f827dc472 | ||
![]() |
26459444bc | ||
![]() |
1bce9f76c4 | ||
![]() |
32b539b948 | ||
![]() |
96a8463240 | ||
![]() |
4fc3ead817 | ||
![]() |
85e4237165 | ||
![]() |
bfb212fc49 | ||
![]() |
70a0ce798c | ||
![]() |
07db658fac | ||
![]() |
5bb66cf30c | ||
![]() |
ce6cd943bb | ||
![]() |
6459cbfb2a | ||
![]() |
c0cd45bcf2 | ||
![]() |
a206fac3dc | ||
![]() |
af287fecce | ||
![]() |
84b6238eac | ||
![]() |
c32f4a1c83 | ||
![]() |
69d6f9e8a1 | ||
![]() |
0ce971bd60 | ||
![]() |
2da4a7d29e | ||
![]() |
7e6ae05943 | ||
![]() |
b6fa4d668f | ||
![]() |
d1082a0210 | ||
![]() |
e198c618cc | ||
![]() |
51323fbd1c | ||
![]() |
c085b52d6d | ||
![]() |
ed90a348db | ||
![]() |
4ef953fb9f | ||
![]() |
4e7c64d45e | ||
![]() |
6be4ddf820 | ||
![]() |
743df1b4b2 | ||
![]() |
2a8c566c2f | ||
![]() |
c8cfbbca5a | ||
![]() |
63dc5d19a5 | ||
![]() |
c45029812a | ||
![]() |
7897078140 | ||
![]() |
e61846a43c | ||
![]() |
dd21d1b5e8 | ||
![]() |
d46c0f13ac | ||
![]() |
b116102452 | ||
![]() |
38b89a6fc8 | ||
![]() |
ebeed77c39 | ||
![]() |
bde90dd69f | ||
![]() |
754ac9dab9 | ||
![]() |
03bec245aa | ||
![]() |
4e532118ea | ||
![]() |
de411b228b | ||
![]() |
6eba365812 | ||
![]() |
20149bcf00 | ||
![]() |
843ccd4b1d | ||
![]() |
f716600490 | ||
![]() |
1603d05fb4 | ||
![]() |
0d2dbbf9e2 | ||
![]() |
ae223fa211 | ||
![]() |
efde5d7b6f | ||
![]() |
7dc1153831 | ||
![]() |
bd74ddd7a2 | ||
![]() |
a6268f3e47 | ||
![]() |
ce39df2b5c | ||
![]() |
a9f7b383a4 | ||
![]() |
eb03818bd7 | ||
![]() |
9ad20dd3bb | ||
![]() |
b946a2783e | ||
![]() |
b763a00bac | ||
![]() |
d9cb754879 | ||
![]() |
082427c469 | ||
![]() |
e81f3ca3ad | ||
![]() |
af364e044c | ||
![]() |
3327528348 | ||
![]() |
79b3f5fd3b | ||
![]() |
839511f6bd | ||
![]() |
82e8d94207 | ||
![]() |
1539113371 | ||
![]() |
d1c56364c0 | ||
![]() |
c8fad34c54 | ||
![]() |
b6b7f092a6 | ||
![]() |
d1c93f3af8 | ||
![]() |
436fd7e923 | ||
![]() |
2194052a35 | ||
![]() |
4425292f14 | ||
![]() |
699a0dbe0e | ||
![]() |
3539143c07 | ||
![]() |
3405d2fa38 | ||
![]() |
2b3b3adf5f | ||
![]() |
9661bd11fd | ||
![]() |
ce8e4db442 | ||
![]() |
b443f0440e | ||
![]() |
9ba2e768f9 | ||
![]() |
e1112c73cc | ||
![]() |
572ac9eb74 | ||
![]() |
141a8122e1 | ||
![]() |
30485d1f00 | ||
![]() |
4adc03afd0 | ||
![]() |
5adda57d80 | ||
![]() |
a6674a93e1 | ||
![]() |
0fb8239e74 | ||
![]() |
8df3ae3499 | ||
![]() |
02a1d2dd8e | ||
![]() |
1483a0e86c | ||
![]() |
c77ed00425 | ||
![]() |
7e43157924 | ||
![]() |
343dfc81e9 | ||
![]() |
92dd28e05e | ||
![]() |
6a80f03537 | ||
![]() |
b02165f0f2 | ||
![]() |
a4e94b6ca6 | ||
![]() |
41d4259c22 | ||
![]() |
08c671daef | ||
![]() |
7d8d5ba0df | ||
![]() |
e9732c965e | ||
![]() |
c8f1fddda8 | ||
![]() |
a334230962 | ||
![]() |
879a6e9a94 | ||
![]() |
99d20b6335 | ||
![]() |
074cf2d427 | ||
![]() |
48551e291c | ||
![]() |
3d8c7c3d56 | ||
![]() |
29b3d8be88 | ||
![]() |
faca83ba5f | ||
![]() |
35851ef34b | ||
![]() |
c3f697350a | ||
![]() |
c8891f8023 | ||
![]() |
5180ca8211 | ||
![]() |
f27ea4a193 | ||
![]() |
a5cc2dd099 | ||
![]() |
7c913bbc58 | ||
![]() |
dfc4c9077d | ||
![]() |
2cf1b5b679 | ||
![]() |
c72db42231 | ||
![]() |
d6885fdaa1 | ||
![]() |
d7e3cc09ec | ||
![]() |
3e6ec019b5 | ||
![]() |
cf946d5da5 | ||
![]() |
39a15275a1 | ||
![]() |
32c6ee18d6 | ||
![]() |
520361cb78 | ||
![]() |
8087761c8a | ||
![]() |
b96b776b02 | ||
![]() |
405cdd3dae | ||
![]() |
ae7586c121 | ||
![]() |
c20f5bb61a | ||
![]() |
a9155287c5 | ||
![]() |
6bb53716a9 | ||
![]() |
bd4825f296 | ||
![]() |
89b782957e | ||
![]() |
d896d673a8 | ||
![]() |
e189bc607b | ||
![]() |
7c3ea5b7bc | ||
![]() |
0d0b484954 | ||
![]() |
a65c0b8aa1 | ||
![]() |
e8ad482434 | ||
![]() |
acb70dcac7 | ||
![]() |
f599723bf2 | ||
![]() |
203302bd63 | ||
![]() |
e4a58787f4 | ||
![]() |
101fbc3021 | ||
![]() |
8c1e52dd13 | ||
![]() |
788e624646 | ||
![]() |
94aea59450 | ||
![]() |
26ffa632f1 | ||
![]() |
5d41629672 | ||
![]() |
3df0b1d3d7 | ||
![]() |
758f26282a | ||
![]() |
b3c2ed1d98 | ||
![]() |
34d4f1624e | ||
![]() |
6caa1bf56d | ||
![]() |
622ef6bb76 | ||
![]() |
f83483306b | ||
![]() |
ab3246a68e | ||
![]() |
5f4748f3d0 | ||
![]() |
8f795dd4bd | ||
![]() |
92fbc73760 | ||
![]() |
50ad230104 | ||
![]() |
423246629b | ||
![]() |
597c31b375 | ||
![]() |
cf9bea3ea5 | ||
![]() |
3417095768 | ||
![]() |
84259fc9d6 | ||
![]() |
46d9df8500 | ||
![]() |
583922d11f | ||
![]() |
01f00f08aa | ||
![]() |
567c8d5e90 | ||
![]() |
1774e6d571 | ||
![]() |
1a9f984b58 | ||
![]() |
da86a68efa | ||
![]() |
6696c10a6a | ||
![]() |
bb23d05120 | ||
![]() |
d39fd31b1b | ||
![]() |
52a905ce73 | ||
![]() |
b629101fee | ||
![]() |
bf7c4e1464 | ||
![]() |
a446344096 | ||
![]() |
34ff17df12 | ||
![]() |
40e186d7c7 | ||
![]() |
a89e77a56d | ||
![]() |
b142b01e1a | ||
![]() |
351cf8078d | ||
![]() |
0f6a6a9551 | ||
![]() |
6ef1e479fd | ||
![]() |
d125bade7d | ||
![]() |
ee4564c72b | ||
![]() |
518e99c02f | ||
![]() |
187ab0eaf8 | ||
![]() |
c97001b761 | ||
![]() |
dfc22014a8 | ||
![]() |
36059a2329 | ||
![]() |
239aab2861 | ||
![]() |
b243ceb05a | ||
![]() |
2eb626193d | ||
![]() |
6da7043c67 | ||
![]() |
1f2f72677f | ||
![]() |
a13370b392 | ||
![]() |
7e1168cae2 | ||
![]() |
b2b70b592f | ||
![]() |
0285cd3a96 | ||
![]() |
7375fbb440 | ||
![]() |
f17f0ceb7b | ||
![]() |
d2305baa60 | ||
![]() |
10da41b29e | ||
![]() |
997e68351c | ||
![]() |
3d0920ecb2 | ||
![]() |
3af2ca192c | ||
![]() |
4eda7ec0d0 | ||
![]() |
545facfb22 | ||
![]() |
40c900fba1 | ||
![]() |
780edf69c8 | ||
![]() |
fb2cbf7970 | ||
![]() |
f7f274f5d5 | ||
![]() |
29513b744d | ||
![]() |
0eed77401e | ||
![]() |
1c2f16d372 | ||
![]() |
258300fb21 | ||
![]() |
faa3f73c7a | ||
![]() |
407e34e201 | ||
![]() |
0e6d7b0115 | ||
![]() |
5bb419ef7b | ||
![]() |
ffdfcc5739 | ||
![]() |
d4f3208afb | ||
![]() |
8f63e3f827 | ||
![]() |
090c645ea6 | ||
![]() |
0578af0c4c | ||
![]() |
0e86df8da0 | ||
![]() |
b9c58fae46 | ||
![]() |
9559d55400 | ||
![]() |
9601d53ad6 | ||
![]() |
3d6cad10b2 | ||
![]() |
1105981e7d | ||
![]() |
a11f3bd511 | ||
![]() |
77c92bf369 | ||
![]() |
0e1fd2746f | ||
![]() |
2c61304a5d | ||
![]() |
01c973cac9 | ||
![]() |
f7b034102a | ||
![]() |
b9cacdc596 | ||
![]() |
7e0fe8cb61 | ||
![]() |
adcc8b57f4 | ||
![]() |
7dac12cfea | ||
![]() |
07dd6c411e | ||
![]() |
c9d4ccdc48 | ||
![]() |
262175595c | ||
![]() |
8589b7e97d | ||
![]() |
44ff31c86f | ||
![]() |
924021d49a | ||
![]() |
c747bb5a63 | ||
![]() |
63bf1fcffe | ||
![]() |
49ea505981 | ||
![]() |
f2d24d8653 | ||
![]() |
90fbf62987 | ||
![]() |
3dd7b18e26 | ||
![]() |
06f1bb9c91 | ||
![]() |
3964eef9be | ||
![]() |
167fb4217b | ||
![]() |
36dbcd3097 | ||
![]() |
5d60a0e897 | ||
![]() |
7e527b7480 | ||
![]() |
911d4b6aa9 | ||
![]() |
0309ac29c0 | ||
![]() |
4afd7db020 | ||
![]() |
9c149313f7 | ||
![]() |
4ffd33c087 | ||
![]() |
f8e787fcdd | ||
![]() |
c2b8fe469f | ||
![]() |
0002263d3c | ||
![]() |
ce405137f8 | ||
![]() |
72dace6f11 | ||
![]() |
96aff03599 | ||
![]() |
5f601c492c | ||
![]() |
f7e1f8d603 | ||
![]() |
2ebb30c476 | ||
![]() |
c00b5492f9 | ||
![]() |
a34826d904 | ||
![]() |
411401fd15 | ||
![]() |
15415999c2 | ||
![]() |
81911777da | ||
![]() |
767e49d95a | ||
![]() |
4a401dc8cb | ||
![]() |
f5f44a8e6f | ||
![]() |
66e76447aa | ||
![]() |
3ab72e0c86 | ||
![]() |
355b5b7db3 | ||
![]() |
b0b0c76bc4 | ||
![]() |
85fc6c5cf4 | ||
![]() |
9ff3b8c1d8 | ||
![]() |
6c01631b2e | ||
![]() |
aacad11258 | ||
![]() |
b4e69ea837 | ||
![]() |
cc1026656c | ||
![]() |
4f38faf3c2 | ||
![]() |
55cf221b56 | ||
![]() |
39b780e615 | ||
![]() |
86983f1e6d | ||
![]() |
bf80fec82f | ||
![]() |
dda62c5394 | ||
![]() |
ae7708fecd | ||
![]() |
485976d003 | ||
![]() |
6877c3afc1 | ||
![]() |
7e1a943a80 | ||
![]() |
b09fbdcabe | ||
![]() |
2ebc2a6be1 | ||
![]() |
16e31a5b89 | ||
![]() |
559bfd8ab2 | ||
![]() |
e784301bb0 | ||
![]() |
fe3796b0c7 | ||
![]() |
705fe69208 | ||
![]() |
a6b9c2b0d9 | ||
![]() |
76672e76ca | ||
![]() |
5f8562b2e2 | ||
![]() |
5dbd90be5d | ||
![]() |
4dc35f7932 | ||
![]() |
c9e0337071 | ||
![]() |
df9467d04f | ||
![]() |
aed549fd51 | ||
![]() |
caebbde09c | ||
![]() |
4efd8f9f66 | ||
![]() |
95619b42fb | ||
![]() |
ab33383d15 | ||
![]() |
cd83556d36 | ||
![]() |
9846b41861 | ||
![]() |
03ae9df2b5 | ||
![]() |
9591fdc4c6 | ||
![]() |
3f7a9df8ba | ||
![]() |
b5feda7fdc | ||
![]() |
52f62c15e6 | ||
![]() |
2a7d00ba78 | ||
![]() |
d6cc390b52 | ||
![]() |
23792440e6 | ||
![]() |
20da61148e | ||
![]() |
eab311737a | ||
![]() |
f53f9947a5 | ||
![]() |
9314541b2a | ||
![]() |
6533c2c425 | ||
![]() |
28e9da05bf | ||
![]() |
9c1427db3c | ||
![]() |
e943f9ef5c | ||
![]() |
3780eaa13f | ||
![]() |
6a29198eee | ||
![]() |
f72d942801 | ||
![]() |
2525888668 | ||
![]() |
1f5d5a2bd2 | ||
![]() |
90e2366eef | ||
![]() |
ed8d4354f6 | ||
![]() |
3e0ec54ba5 | ||
![]() |
42021bb11a | ||
![]() |
a47c282281 | ||
![]() |
41d8ab1b28 | ||
![]() |
8ad4e1f27e | ||
![]() |
24d18afd48 | ||
![]() |
6584d4c885 | ||
![]() |
37cae3987b | ||
![]() |
7268243b4e | ||
![]() |
59477e5eac | ||
![]() |
3d216ad9f7 | ||
![]() |
141457c4f9 | ||
![]() |
86b0e3a765 | ||
![]() |
e33af8a672 | ||
![]() |
6f0eaf7091 | ||
![]() |
426e67e7b4 | ||
![]() |
106fd016ac | ||
![]() |
ff99ccab0b | ||
![]() |
c6d4ecf78d | ||
![]() |
89e604fdc9 | ||
![]() |
874a6de443 | ||
![]() |
fcbcabb0cd | ||
![]() |
420cab0d75 | ||
![]() |
67cae2c8f5 | ||
![]() |
8f7c58ce4c | ||
![]() |
ba9b6d844a | ||
![]() |
fdda7b482f | ||
![]() |
571552b861 | ||
![]() |
c6dbd3a634 | ||
![]() |
3f00cec935 | ||
![]() |
c4b7677238 | ||
![]() |
f6751e4b08 | ||
![]() |
f82025c6d5 | ||
![]() |
e00d0b00a3 | ||
![]() |
7c2cfad6aa | ||
![]() |
89081a873b | ||
![]() |
90b91bd49b | ||
![]() |
b87ce94ec4 | ||
![]() |
f9e6108537 | ||
![]() |
961b487fac | ||
![]() |
7a60cfe9b2 | ||
![]() |
4dde61bad9 | ||
![]() |
bf28f66b44 | ||
![]() |
0dba0fdad5 | ||
![]() |
41d406bb19 | ||
![]() |
30447f6e68 | ||
![]() |
e9cc76cbd6 | ||
![]() |
1a78d6303f | ||
![]() |
08b3e753ea | ||
![]() |
020da3048d | ||
![]() |
65e0789250 | ||
![]() |
579388e08d | ||
![]() |
0dab5c7e9e | ||
![]() |
8959f382c2 | ||
![]() |
9a70e8d8f7 | ||
![]() |
b0bd24a129 | ||
![]() |
3a09a0da9a | ||
![]() |
b519b678e8 | ||
![]() |
166aea4b10 | ||
![]() |
c296a86138 | ||
![]() |
9c0e02ad51 | ||
![]() |
ab822c95e0 | ||
![]() |
3710dd8167 | ||
![]() |
a0932e51ae | ||
![]() |
ab7a818f4d | ||
![]() |
38b4b3ed95 | ||
![]() |
1be07ae5f7 | ||
![]() |
56f4be5bb1 | ||
![]() |
9f4e408242 | ||
![]() |
429d580b00 | ||
![]() |
1e9d136911 | ||
![]() |
2e05002a83 | ||
![]() |
5fd821d59e | ||
![]() |
3f3781459d | ||
![]() |
a431f80f3a | ||
![]() |
bf33ffce41 | ||
![]() |
051562540c | ||
![]() |
f47b893cb8 | ||
![]() |
17df511c6a | ||
![]() |
98892425bb | ||
![]() |
c8211520f2 | ||
![]() |
cd1d4a80ce | ||
![]() |
64323fe4d9 | ||
![]() |
1a6c09e624 | ||
![]() |
2e644d0415 | ||
![]() |
df605a8600 | ||
![]() |
52232f1b82 | ||
![]() |
64804aae08 | ||
![]() |
bfdb9cd47b | ||
![]() |
dcd0b9d352 | ||
![]() |
42f9559d33 | ||
![]() |
6948a3f746 | ||
![]() |
a302f7f273 | ||
![]() |
fedacace0e | ||
![]() |
c8be0c91e5 | ||
![]() |
165d072d79 | ||
![]() |
6fb1bfaaaf | ||
![]() |
0a048d1f00 | ||
![]() |
031cc0124d | ||
![]() |
d01fa740ea | ||
![]() |
949431b7df | ||
![]() |
316b43144d | ||
![]() |
7422327e0e | ||
![]() |
882f6d7673 | ||
![]() |
a5c98c794c | ||
![]() |
b0b1ef305b | ||
![]() |
6460c6692d | ||
![]() |
bdb427492f | ||
![]() |
ca659944cd | ||
![]() |
7650520beb | ||
![]() |
fefd18593e | ||
![]() |
0eaa2af8fd | ||
![]() |
f94ff75a13 | ||
![]() |
e00d5d5d5c | ||
![]() |
b7f11adafb | ||
![]() |
485d312255 | ||
![]() |
47c87317d0 | ||
![]() |
8124bc3780 | ||
![]() |
0f910b8da2 | ||
![]() |
9297b25445 | ||
![]() |
5fa2070fc6 | ||
![]() |
4871409032 | ||
![]() |
8f5c5022cb | ||
![]() |
138d5c2206 | ||
![]() |
cb3bb3830c | ||
![]() |
59d2592577 | ||
![]() |
8b1fd91af4 | ||
![]() |
4d8fe96a41 | ||
![]() |
8689ba8d81 | ||
![]() |
efa94c9031 | ||
![]() |
15a4ba045d | ||
![]() |
6b177d2238 | ||
![]() |
5c5ed6e408 | ||
![]() |
0cc5065b76 | ||
![]() |
6e987d7599 | ||
![]() |
599e6f0bf9 | ||
![]() |
32b66b9e21 | ||
![]() |
05bc0e0574 | ||
![]() |
ac25220ef2 | ||
![]() |
ec24b21e81 | ||
![]() |
81f950e4f6 | ||
![]() |
f26a7770bb | ||
![]() |
2a44a46831 | ||
![]() |
4b78a81356 | ||
![]() |
e09fc2e5eb | ||
![]() |
042cac68ee | ||
![]() |
91dd526e4b | ||
![]() |
586d89a4f4 | ||
![]() |
84dbdffc7a | ||
![]() |
93bb5f68e7 | ||
![]() |
2a87f73648 | ||
![]() |
81493fc479 | ||
![]() |
8ee3f43fec | ||
![]() |
ebc3c762ee | ||
![]() |
9f3150f65b | ||
![]() |
0baf5dc6d0 | ||
![]() |
54007ee78a | ||
![]() |
d1eaf8e79b | ||
![]() |
951a1f7830 | ||
![]() |
755a9460ea | ||
![]() |
3584710a86 | ||
![]() |
bf6b0b47b5 | ||
![]() |
9f0e799a59 | ||
![]() |
139f950861 | ||
![]() |
20567df443 | ||
![]() |
331ccafc87 | ||
![]() |
4d78f232c3 | ||
![]() |
584157dba7 | ||
![]() |
c7147e6146 | ||
![]() |
3d42a5961d | ||
![]() |
3aabd40874 | ||
![]() |
8f075662ac | ||
![]() |
a2f022283a | ||
![]() |
71633f1a00 | ||
![]() |
45615e71ee | ||
![]() |
69f06493fa | ||
![]() |
1323d2fca5 | ||
![]() |
0f96e18552 | ||
![]() |
b06582557a | ||
![]() |
547620648d | ||
![]() |
0a02c8a349 | ||
![]() |
8a51ebcbcf | ||
![]() |
26c5111294 | ||
![]() |
bc53d98b2a | ||
![]() |
a5978dd36f | ||
![]() |
91d07a848d | ||
![]() |
ecbfe4e74e | ||
![]() |
9b0d98234e | ||
![]() |
131025f999 | ||
![]() |
d77ca0600c | ||
![]() |
9d451324c2 | ||
![]() |
85e2b660bf | ||
![]() |
3eb07394e7 | ||
![]() |
d53987c6e8 | ||
![]() |
19c80a80af | ||
![]() |
bf4bb17996 | ||
![]() |
974861adda | ||
![]() |
133be31e86 | ||
![]() |
3b46bb1c10 | ||
![]() |
622c9d9841 | ||
![]() |
a51abc285b | ||
![]() |
8c54341815 | ||
![]() |
e0b223b8a5 | ||
![]() |
fc8f1d77f9 | ||
![]() |
06795152aa | ||
![]() |
a0a7056f1d | ||
![]() |
0dcf283aa0 | ||
![]() |
f26d3edcc5 | ||
![]() |
c205529295 | ||
![]() |
345cb6e29e | ||
![]() |
67e787596f | ||
![]() |
3c057ea401 | ||
![]() |
76f4ac758c | ||
![]() |
681622b58c | ||
![]() |
6540304db5 | ||
![]() |
47e4dd664d | ||
![]() |
0217862626 | ||
![]() |
96c7138df1 | ||
![]() |
0cbc2f3f7d | ||
![]() |
94f052bb74 | ||
![]() |
19c3b6f455 | ||
![]() |
83bbb1d87f | ||
![]() |
33cf63ed83 | ||
![]() |
ef460e1dc2 | ||
![]() |
0676f27ee1 | ||
![]() |
ac36b827dd | ||
![]() |
1ee3d0c0ed | ||
![]() |
4fae71a002 | ||
![]() |
f299aceb21 | ||
![]() |
eb00c7104e | ||
![]() |
03ef70c82a | ||
![]() |
ad5518104d | ||
![]() |
114a6a641d | ||
![]() |
126ef95b9f | ||
![]() |
f3f56978da | ||
![]() |
b5990032f5 | ||
![]() |
bd950faf4a | ||
![]() |
7fad98811d | ||
![]() |
17f2b9c821 | ||
![]() |
fc0c549556 | ||
![]() |
2396fb925d | ||
![]() |
9d72db05a5 | ||
![]() |
5065bb5739 | ||
![]() |
a891892bd8 | ||
![]() |
1ab14e9188 | ||
![]() |
8715087237 | ||
![]() |
5c280001d3 | ||
![]() |
56e19df5f2 | ||
![]() |
ec8d93f8cf | ||
![]() |
2b86e93d13 | ||
![]() |
df74b618ce | ||
![]() |
8ff844e5a1 | ||
![]() |
3c224c809e | ||
![]() |
e1a61af64a | ||
![]() |
f7b2f0cbf1 | ||
![]() |
1e8daa3e2c | ||
![]() |
d69ab156e0 | ||
![]() |
8b6db4461c | ||
![]() |
43e06fc180 | ||
![]() |
9c9002b204 | ||
![]() |
0db4a3a6ca | ||
![]() |
9023d0ca06 | ||
![]() |
23cebc4826 | ||
![]() |
09075e880d | ||
![]() |
486e417d12 | ||
![]() |
aca82a0379 | ||
![]() |
8c74c10654 | ||
![]() |
68a08ac51b | ||
![]() |
eb78d62adb | ||
![]() |
4d9d0f10d9 | ||
![]() |
3bf326a942 | ||
![]() |
3582969e90 | ||
![]() |
2a64382563 | ||
![]() |
ee2db5d891 | ||
![]() |
2d468190e0 | ||
![]() |
7959442a99 | ||
![]() |
78dccd194c | ||
![]() |
97050b8111 | ||
![]() |
c0a681e73b | ||
![]() |
cc7fef21ca | ||
![]() |
f1f5d26a51 | ||
![]() |
34759558dd | ||
![]() |
e6bde154ec | ||
![]() |
b335bc9f20 | ||
![]() |
d2faa71acc | ||
![]() |
725a2f3014 | ||
![]() |
810eacf15a | ||
![]() |
ad0567fe13 | ||
![]() |
e68b6b49c0 | ||
![]() |
b5a41b5271 | ||
![]() |
8abbdb931a | ||
![]() |
f921e2fa1d | ||
![]() |
37b1155383 | ||
![]() |
7e3e056e1c | ||
![]() |
05ff10c0cb | ||
![]() |
2d69946772 | ||
![]() |
86a02ad1da | ||
![]() |
9759735249 | ||
![]() |
35b059e783 | ||
![]() |
f566d601ee | ||
![]() |
36b174102a | ||
![]() |
963ad64d62 | ||
![]() |
c6195f124a | ||
![]() |
68c29eee6a | ||
![]() |
60410d50ec | ||
![]() |
84878e9394 | ||
![]() |
6130d835de | ||
![]() |
321c1efb33 | ||
![]() |
514a127083 | ||
![]() |
0074acb8fe | ||
![]() |
e95e679e80 | ||
![]() |
5cfc3d44a6 | ||
![]() |
04e97aa9ab | ||
![]() |
8241c2b91e | ||
![]() |
dee7e7758a | ||
![]() |
d95738c975 | ||
![]() |
fbcfa04859 | ||
![]() |
eb9eac2b09 | ||
![]() |
47e1de1d26 | ||
![]() |
f64adfbc89 | ||
![]() |
15283b0294 | ||
![]() |
820c4b8377 | ||
![]() |
376c95f474 | ||
![]() |
63ea231fe6 | ||
![]() |
94b5989e23 | ||
![]() |
86c2e8334e | ||
![]() |
8a37d9e92d | ||
![]() |
b3cfeea612 | ||
![]() |
88ce89d34c | ||
![]() |
e9cbd98713 | ||
![]() |
fde3af46f2 | ||
![]() |
b7bb36769f | ||
![]() |
23dd688d09 | ||
![]() |
73f06eba0f | ||
![]() |
8309941c95 | ||
![]() |
88eb2e09db | ||
![]() |
51e8806d17 | ||
![]() |
e712644a86 | ||
![]() |
2c05af6588 | ||
![]() |
0fc0d0eb03 | ||
![]() |
8e2f8fc7f3 | ||
![]() |
284734ee65 | ||
![]() |
b4573ff293 | ||
![]() |
62d9fdc6a6 | ||
![]() |
3c99ec395c | ||
![]() |
f8c17775ed | ||
![]() |
e904067679 | ||
![]() |
249d45ace6 | ||
![]() |
385287489c | ||
![]() |
66be22af68 | ||
![]() |
f355bc58f3 | ||
![]() |
345dacff29 | ||
![]() |
b771f79587 | ||
![]() |
9d4146f155 | ||
![]() |
5f2f4c3852 | ||
![]() |
0dfb5dc10c | ||
![]() |
e08584b879 | ||
![]() |
8d867010b5 | ||
![]() |
fa6b0fe161 | ||
![]() |
c13cd4e72e | ||
![]() |
0a69a5424d | ||
![]() |
e6800c80c6 | ||
![]() |
09eeeaff1b | ||
![]() |
ce11b48c9d | ||
![]() |
9a055e4640 | ||
![]() |
1e97d6fb59 | ||
![]() |
922fb93dca | ||
![]() |
3e8b55e41c | ||
![]() |
62824e2a97 | ||
![]() |
296d25206e | ||
![]() |
f2bd748526 | ||
![]() |
59115b7779 | ||
![]() |
a287026aa2 | ||
![]() |
a2af3f859b | ||
![]() |
70485132ef | ||
![]() |
d421d4f9fe | ||
![]() |
fc18c185cc | ||
![]() |
febd134f54 | ||
![]() |
2a5b1c89d8 | ||
![]() |
4da636a5c4 | ||
![]() |
df54fc5807 | ||
![]() |
b5276ef4a6 | ||
![]() |
54b666a86a | ||
![]() |
e44052f299 | ||
![]() |
8ea9dbf0c8 | ||
![]() |
096e9872a6 | ||
![]() |
a2de29baf5 | ||
![]() |
81ffc3d6a7 | ||
![]() |
aef53f4554 | ||
![]() |
806fd899bc | ||
![]() |
90c8997379 | ||
![]() |
354c6a4410 | ||
![]() |
a2d4446382 | ||
![]() |
b09d26b1e8 | ||
![]() |
2f1933a137 | ||
![]() |
e4a76499a8 | ||
![]() |
a7ad256324 | ||
![]() |
860977347f | ||
![]() |
2d5643f392 | ||
![]() |
b8f8383a5e | ||
![]() |
718b2aaddc | ||
![]() |
08780deeca | ||
![]() |
6aa44ff060 | ||
![]() |
18450c7ba6 | ||
![]() |
3995a0aa90 | ||
![]() |
864a2d527a | ||
![]() |
edcdb61e31 | ||
![]() |
22aab4a629 | ||
![]() |
df4b10e057 | ||
![]() |
29c01c9bd2 | ||
![]() |
a1eac086fd | ||
![]() |
69ef9f147f | ||
![]() |
8a3c05fe36 | ||
![]() |
776e3e9c3b | ||
![]() |
541273a33b | ||
![]() |
4035c3c435 | ||
![]() |
8647880cc7 | ||
![]() |
e7ed51e20f | ||
![]() |
4d0bd26d65 | ||
![]() |
1e793575e0 | ||
![]() |
7e54228386 | ||
![]() |
b4da069990 | ||
![]() |
ce3ef8f7d2 | ||
![]() |
ae00085f88 | ||
![]() |
2f2d05689e | ||
![]() |
391890f299 | ||
![]() |
11b20aa7dc | ||
![]() |
a8bd45eaec | ||
![]() |
03926ddc70 | ||
![]() |
55f6fa30ec | ||
![]() |
cb3f1a4d9f | ||
![]() |
e32e2922de | ||
![]() |
79968ca76b | ||
![]() |
326e31b6a1 | ||
![]() |
df8f6c1b7c | ||
![]() |
847786cbea | ||
![]() |
72a355d46a | ||
![]() |
abb5f422f2 | ||
![]() |
702b975624 | ||
![]() |
e7e283ab8f | ||
![]() |
2df958ca15 | ||
![]() |
f5db8c5cc8 | ||
![]() |
c3a843a886 | ||
![]() |
e98d429426 | ||
![]() |
844f99155c | ||
![]() |
2a3c1424dc | ||
![]() |
d32fbf4565 | ||
![]() |
82983b1c02 | ||
![]() |
5b53628634 | ||
![]() |
e9b8183ead | ||
![]() |
b897e81fd2 | ||
![]() |
4ce70d2784 | ||
![]() |
c03514763c | ||
![]() |
f8aaf2c2b2 | ||
![]() |
60a8cd5a40 | ||
![]() |
ebbc93ff25 | ||
![]() |
b51ca7e50a | ||
![]() |
3d0b50c679 | ||
![]() |
9057650646 | ||
![]() |
95538498f0 | ||
![]() |
840ce5a47d | ||
![]() |
767c546ab5 | ||
![]() |
fa5e9179af | ||
![]() |
978c887123 | ||
![]() |
3084212f2e | ||
![]() |
e40d8a282f | ||
![]() |
aa7fab4cc0 | ||
![]() |
5d72292915 | ||
![]() |
2b0f107225 | ||
![]() |
b21ceadc63 | ||
![]() |
8e0b2e9fb3 | ||
![]() |
e66ccfdfcd | ||
![]() |
89a3c20217 | ||
![]() |
2faca2e9d6 | ||
![]() |
a789fdab6f | ||
![]() |
3db8a7624b | ||
![]() |
0972475dcb | ||
![]() |
f9fe221e9a | ||
![]() |
9011f9d85d | ||
![]() |
bc3a6e41df | ||
![]() |
7315efed5f | ||
![]() |
b348ee0e40 | ||
![]() |
bb034704d2 | ||
![]() |
bd4c0aa0a0 | ||
![]() |
1909c50647 | ||
![]() |
fa8a00194a | ||
![]() |
6ab834f516 | ||
![]() |
e9552a5f60 | ||
![]() |
5130726389 | ||
![]() |
1951784c28 | ||
![]() |
aa286866a8 | ||
![]() |
f827c155f5 | ||
![]() |
be63d535e1 | ||
![]() |
ce8237b4e7 | ||
![]() |
ef9b5d8646 | ||
![]() |
aa7baffb9f | ||
![]() |
0d062be3a0 | ||
![]() |
73c98ef9db | ||
![]() |
0468b1e327 | ||
![]() |
2aba520512 | ||
![]() |
8b1dfd67f9 | ||
![]() |
bf8f944ab1 | ||
![]() |
b2d3a6199d | ||
![]() |
65ee0d5486 | ||
![]() |
89826c70e0 | ||
![]() |
10b19b64b1 | ||
![]() |
818a91e1e5 | ||
![]() |
2c027f730e | ||
![]() |
e84b7b81c5 | ||
![]() |
5c913fcaaa | ||
![]() |
1200d27fb3 | ||
![]() |
43a7ad927f | ||
![]() |
1297c99396 | ||
![]() |
13408d875a |
.bowerrc.buildpacks.editorconfig.ember-cli.gitignore.jshintrc.ruby-version.travis.yml.watchmanconfigAssetfileGemfileGemfile.lockGuardfileGuardfile.phantomProcfileREADME.mdRakefile
app
adapters
app.jscomponents
.gitkeepadd-env-var.jsadd-ssh-key.jsbranch-row.jsbroadcast-tower.jsbuild-header.jsbuild-repo-actions.jsbuild-tile.jsbuild-wrapper.jsbuilds-item.jsbuilds-wrapper.jscaches-item.jsdashboard-row.jsenv-var.jseye-icon.jsflash-display.jsflash-item.jshook-switch.jshooks-list-item.jsjob-log.jsjob-repo-actions.jsjob-wrapper.jsjobs-item.jsjobs-list.jslastbuild-tile.jslimit-concurrent-builds.jsloading-indicator.jslog-content.jsno-builds.jsno-repos.jsnot-active.jsorg-item.jsorgs-filter.jsowner-repo-tile.jsowner-sync-button.jspopup-click-handler.jsprofile-accounts-wrapper.jsqueued-jobs.jsremove-log-popup.jsrepo-actions.jsrepo-show-tabs.jsrepo-show-tools.jsrepo-wrapper.jsrepos-empty.jsrepos-list-item.jsrepos-list-tabs.jsrepos-list.jsrequest-icon.jsrequests-item.jsrunning-jobs-item.jsrunning-jobs.jssettings-switch.jsshow-more-button.jsssh-key.jsstatus-icon.jsstatus-image-input.jsstatus-images.jssubscribe-button.jssync-button.jsteam-member.jstravis-layout.jstravis-status.jstravis-switch.jsuser-avatar.js
controllers
4
.bowerrc
Normal file
4
.bowerrc
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"directory": "bower_components",
|
||||
"analytics": false
|
||||
}
|
|
@ -1,2 +1,2 @@
|
|||
https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
https://github.com/travis-ci/travis-web-buildpack.git
|
||||
https://github.com/travis-ci/travis-web-ember-cli-buildpack.git
|
||||
|
|
34
.editorconfig
Normal file
34
.editorconfig
Normal file
|
@ -0,0 +1,34 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.js]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.hbs]
|
||||
insert_final_newline = false
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.css]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.html]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{diff,md}]
|
||||
trim_trailing_whitespace = false
|
9
.ember-cli
Normal file
9
.ember-cli
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
/**
|
||||
Ember CLI sends analytics information by default. The data is completely
|
||||
anonymous, but there are times when you might want to disable this behavior.
|
||||
|
||||
Setting `disableAnalytics` to true will prevent any data from being sent.
|
||||
*/
|
||||
"disableAnalytics": false
|
||||
}
|
27
.gitignore
vendored
27
.gitignore
vendored
|
@ -1,14 +1,19 @@
|
|||
/.bundle
|
||||
/config/travis.yml
|
||||
/tmp
|
||||
# compiled output
|
||||
dist
|
||||
tmp
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
bower_components
|
||||
|
||||
# misc
|
||||
.sass-cache
|
||||
.localeapp/key
|
||||
/assets/scripts/config/locales.js
|
||||
connect.lock
|
||||
coverage/*
|
||||
libpeerconnection.log
|
||||
npm-debug.log
|
||||
testem.log
|
||||
.DS_Store
|
||||
*.sw[op]
|
||||
|
||||
/public/images
|
||||
/public/scripts
|
||||
/public/styles/app.css
|
||||
/public/version
|
||||
|
||||
# files generated by older build tools
|
||||
public/scripts
|
||||
|
|
42
.jshintrc
Normal file
42
.jshintrc
Normal file
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"predef": [
|
||||
"server",
|
||||
"document",
|
||||
"window",
|
||||
"-Promise",
|
||||
"jQuery",
|
||||
"Visibility",
|
||||
"$",
|
||||
"Travis",
|
||||
"_cio",
|
||||
"_gaq",
|
||||
"Log",
|
||||
"moment",
|
||||
"Pusher",
|
||||
"md5"
|
||||
],
|
||||
"browser": true,
|
||||
"boss": true,
|
||||
"curly": true,
|
||||
"debug": false,
|
||||
"devel": true,
|
||||
"eqeqeq": true,
|
||||
"evil": true,
|
||||
"forin": false,
|
||||
"immed": false,
|
||||
"laxbreak": false,
|
||||
"newcap": true,
|
||||
"noarg": true,
|
||||
"noempty": false,
|
||||
"nonew": false,
|
||||
"nomen": false,
|
||||
"onevar": false,
|
||||
"plusplus": false,
|
||||
"regexp": false,
|
||||
"undef": true,
|
||||
"sub": true,
|
||||
"strict": false,
|
||||
"white": false,
|
||||
"eqnull": true,
|
||||
"esnext": true
|
||||
}
|
1
.ruby-version
Normal file
1
.ruby-version
Normal file
|
@ -0,0 +1 @@
|
|||
2.1.2
|
80
.travis.yml
80
.travis.yml
|
@ -1,34 +1,66 @@
|
|||
language: ruby
|
||||
rvm:
|
||||
- 2.1.2
|
||||
---
|
||||
language: node_js
|
||||
node_js: stable
|
||||
|
||||
env:
|
||||
global:
|
||||
- secure: "RFuCOppyjWHC4XWKtQlgS4zO4B6KVxytdX8+G5jRY3XM+OEGte8VDD88gZLM\nKDpkqMFDbNJAVTsh1kMANCTct2ONi30RTxuJWLtRyK7RE5zCcaGbAkTNZgXo\nOR5OWLEPJZbNfbh17H6J7izTy6yiLR+CsVP1wMgeVusP0eoDhCA="
|
||||
- secure: "duqMXPALumXB3e2j/kM2uCaCGwgZsRrU0GCDY+3Zk6a+PK+s0mE9BftcXdxm\n6u87ld2PvCBO0inpe5YeS9LOZsT+OFS4jj+GGTsRI6rmGz+kok0N+ATLTdcj\nu15zhLhUUlhoKW0DZURrDv/iTiC/FKvJ0u5Rft0XbjfTY+0go/M="
|
||||
# SAUCE_ACCESS_KEY
|
||||
- secure: "vf+RnbxcpCZcJYCcJdlT/EbPm9go5BnyyGKHCBwdPqb3+w+k0XyYnUkO5V9pIewIFAKof50i2YlAT8DG9GiUmKrX8z54dqSDlA+R1arMxgZRCHJohLxBjcxHVZe05aVZm/9U7YMOl3DuX88gISG91XC6nr8jnmmp2xGNQR8MkaU="
|
||||
# SAUCE_USERNAME
|
||||
- secure: "tg6TWOS7ZtS4/SXezv4mK482rR+F2MPKCe6PCp+U4oYidm5Jj0NPw/lVog26HSVxxLpayMq35WrBJPwR+7DiNLc+RyBS+yeL8zsLnDlBdGFqSYg6L0j3QK3mVUhQi/ivgvd5NiTcxLROKBie+NJ58HKbenwFFTfvVCy/WjK+dPA="
|
||||
- EMBER_VERSION=default
|
||||
- EMBER_VERSION=release
|
||||
- EMBER_VERSION=beta
|
||||
- EMBER_VERSION=canary
|
||||
|
||||
matrix:
|
||||
- "TEST_SUITE=ruby ARTIFACTS_S3_BUCKET=travis-web-production"
|
||||
- "TEST_SUITE=phantomjs"
|
||||
- "TEST_SUITE=saucelabs BROWSER='firefox::Windows XP'"
|
||||
- "TEST_SUITE=saucelabs BROWSER='chrome::Windows XP'"
|
||||
matrix:
|
||||
allow_failures:
|
||||
- env: EMBER_VERSION=release
|
||||
- env: EMBER_VERSION=beta
|
||||
- env: EMBER_VERSION=canary
|
||||
|
||||
script: "script/ci"
|
||||
fast_finish: true
|
||||
|
||||
addons:
|
||||
sauce_connect: true
|
||||
|
||||
sudo: false
|
||||
|
||||
cache:
|
||||
branch: md5deep
|
||||
directories:
|
||||
- node_modules
|
||||
|
||||
before_install:
|
||||
- "gem install bundler"
|
||||
before_script:
|
||||
- "test $TEST_SUITE = \"ruby\" && gem install travis-artifacts || true"
|
||||
- "bundle exec rakep"
|
||||
- "phantomjs --version"
|
||||
after_script:
|
||||
- "test $TEST_SUITE = \"ruby\" && test $TRAVIS_PULL_REQUEST = \"false\" && travis-artifacts upload --target-path assets/$TRAVIS_BRANCH --path public/scripts:scripts --path public/styles:styles || true"
|
||||
- "npm config set spin false"
|
||||
- "npm install -g npm@^2"
|
||||
- mkdir travis-phantomjs
|
||||
- wget https://s3.amazonaws.com/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2 -O $PWD/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2
|
||||
- tar -xvf $PWD/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2 -C $PWD/travis-phantomjs
|
||||
- export PATH=$PWD/travis-phantomjs:$PATH
|
||||
|
||||
install:
|
||||
- npm install -g bower
|
||||
- npm install
|
||||
- bower install
|
||||
|
||||
script:
|
||||
- ember try $EMBER_VERSION
|
||||
|
||||
notifications:
|
||||
irc: "irc.freenode.org#travis"
|
||||
campfire:
|
||||
secure: "JJezWGD9KJY/LC2aznI3Zyohy31VTIhcTKX7RWR4C/C8YKbW9kZv3xV6Vn11\nSHxJTeZo6st2Bpv6tjlWZ+HCR09kyCNavIChedla3+oHOiuL0D4gSo+gkTNW\nUKYZz9mcQUd9RoQpTeyxvdvX+l7z62/7JwFA7txHOqxbTS8jrjc="
|
||||
|
||||
before_deploy:
|
||||
- ASSETS_HOST=https://s3.amazonaws.com/travis-error-pages ember build --env production
|
||||
# delete some of the stuff that's useless for maintenance page
|
||||
- rm -fr dist/assets/*.js dist/images/emoji dist/index.html dist/images/sponsors
|
||||
- cp dist/maintenance.html dist/index.html
|
||||
|
||||
deploy:
|
||||
provider: s3
|
||||
access_key_id: $MAINTENANCE_S3_ACCESS_KEY_ID
|
||||
secret_access_key: $MAINTENANCE_S3_SECRET_ACCESS_KEY
|
||||
bucket: travis-error-pages
|
||||
skip_cleanup: true
|
||||
acl: public_read
|
||||
local_dir: dist
|
||||
region: us-east-1
|
||||
on:
|
||||
branch: master
|
||||
condition: "$EMBER_VERSION = default"
|
||||
|
|
3
.watchmanconfig
Normal file
3
.watchmanconfig
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"ignore_dirs": ["tmp", "dist"]
|
||||
}
|
91
Assetfile
91
Assetfile
|
@ -1,91 +0,0 @@
|
|||
$: << 'lib'
|
||||
|
||||
require 'rake-pipeline-web-filters'
|
||||
require 'travis/assets'
|
||||
require 'compass'
|
||||
|
||||
Encoding.default_external = Encoding::UTF_8
|
||||
Encoding.default_internal = Encoding::UTF_8
|
||||
|
||||
assets ||= Travis::Assets.new
|
||||
assets.setup_compass
|
||||
assets.update_version
|
||||
|
||||
output 'public/scripts'
|
||||
input assets.scripts do
|
||||
match '**/*.hbs' do
|
||||
travis_handlebars :precompile => false # assets.production?
|
||||
concat 'templates.js'
|
||||
end
|
||||
|
||||
match '**/*.coffee' do
|
||||
coffee_script
|
||||
end
|
||||
|
||||
match 'vendor/**/*.js' do
|
||||
if assets.production?
|
||||
reject 'ember.js'
|
||||
else
|
||||
reject 'ember.prod.js'
|
||||
end
|
||||
safe_concat assets.vendor_order, 'vendor.js'
|
||||
end
|
||||
|
||||
match '{spec,spec/integration,spec/unit,spec/unit/views}/*.js' do
|
||||
concat 'spec/specs.js'
|
||||
end
|
||||
|
||||
match 'spec/support/*.js' do
|
||||
concat 'spec/support.js'
|
||||
end
|
||||
|
||||
match 'spec/vendor/*.js' do
|
||||
concat assets.spec_vendor_order, 'spec/vendor.js'
|
||||
end
|
||||
|
||||
match 'spec/{vendor,support,specs}.js' do
|
||||
concat ['spec/vendor.js', 'spec/support.js', 'spec/specs.js'], 'specs.js'
|
||||
end
|
||||
|
||||
match %r(^(?!vendor|spec).*\.js$) do
|
||||
modules = proc { |input| input.path.gsub(%r((^app/|lib/|\.js$)), '') }
|
||||
minispade(string: assets.development?, rewrite_requires: true, module_id_generator: modules)
|
||||
end
|
||||
|
||||
match %r(^(?!spec).*\.js$) do
|
||||
paths = ['min/app.js']
|
||||
paths.push 'app.js' unless assets.production?
|
||||
concat ['vendor.js'], paths
|
||||
end
|
||||
|
||||
if assets.production?
|
||||
match 'min/app.js' do
|
||||
strip_debug
|
||||
# uglify squeeze: true
|
||||
concat 'app.js'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
output 'public/styles'
|
||||
input assets.styles do
|
||||
match '**/*.{scss,sass,css}' do
|
||||
sass assets.production? ? { style: :compressed } : {}
|
||||
concat [], ['app.css']
|
||||
end
|
||||
end
|
||||
|
||||
output 'public/images'
|
||||
input assets.images do
|
||||
skip %r(^ui/)
|
||||
match '**/*' do
|
||||
copy
|
||||
end
|
||||
end
|
||||
|
||||
# output 'public'
|
||||
# input assets.static do
|
||||
# match '**/*' do
|
||||
# copy
|
||||
# end
|
||||
# end
|
14
Gemfile
14
Gemfile
|
@ -1,20 +1,13 @@
|
|||
source 'http://rubygems.org'
|
||||
ruby '2.1.2'
|
||||
|
||||
gem 'travis-web', path: 'waiter'
|
||||
gem 'puma'
|
||||
gem 'rack-ssl', '~> 1.3'
|
||||
gem 'rack-protection', '~> 1.3'
|
||||
gem 'rack-mobile-detect'
|
||||
gem 'sinatra'
|
||||
|
||||
gem 'rake-pipeline', github: 'livingsocial/rake-pipeline'
|
||||
gem 'rake-pipeline-web-filters', github: 'wycats/rake-pipeline-web-filters'
|
||||
gem 'coffee-script'
|
||||
gem 'compass'
|
||||
gem 'tilt'
|
||||
gem 'uglifier'
|
||||
gem 'yui-compressor'
|
||||
gem 'libv8', '~> 3.16.0'
|
||||
gem 'hashr'
|
||||
|
||||
group :development, :test do
|
||||
gem 'rake'
|
||||
|
@ -24,9 +17,6 @@ end
|
|||
group :development do
|
||||
# gem 'debugger'
|
||||
gem 'foreman'
|
||||
gem 'rerun', '~> 0.10.0'
|
||||
gem 'guard'
|
||||
gem 'rb-fsevent', '~> 0.9.1'
|
||||
end
|
||||
|
||||
group :test do
|
||||
|
|
141
Gemfile.lock
141
Gemfile.lock
|
@ -1,137 +1,70 @@
|
|||
GIT
|
||||
remote: git://github.com/livingsocial/rake-pipeline.git
|
||||
revision: 65b1e744defa208e313703d89f3453447cc103b2
|
||||
PATH
|
||||
remote: waiter
|
||||
specs:
|
||||
rake-pipeline (0.8.0)
|
||||
json
|
||||
rake (~> 10.0.0)
|
||||
thor
|
||||
|
||||
GIT
|
||||
remote: git://github.com/wycats/rake-pipeline-web-filters.git
|
||||
revision: fd8d838491bd6b8de0bab72d90115b9a4f2da8a1
|
||||
specs:
|
||||
rake-pipeline-web-filters (0.6.0)
|
||||
rack
|
||||
rake-pipeline (~> 0.6)
|
||||
travis-web (0.0.1)
|
||||
|
||||
GEM
|
||||
remote: http://rubygems.org/
|
||||
specs:
|
||||
POpen4 (0.1.4)
|
||||
Platform (>= 0.4.0)
|
||||
open4
|
||||
Platform (0.4.0)
|
||||
backports (3.0.3)
|
||||
celluloid (0.15.2)
|
||||
timers (~> 1.1.0)
|
||||
chunky_png (1.2.7)
|
||||
coderay (1.0.9)
|
||||
coffee-script (2.2.0)
|
||||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.5.0)
|
||||
compass (0.12.2)
|
||||
chunky_png (~> 1.2)
|
||||
fssm (>= 0.2.7)
|
||||
sass (~> 3.1)
|
||||
diff-lcs (1.2.1)
|
||||
eventmachine (1.0.0)
|
||||
execjs (1.4.0)
|
||||
multi_json (~> 1.0)
|
||||
ffi (1.9.3)
|
||||
foreman (0.61.0)
|
||||
thor (>= 0.13.6)
|
||||
fssm (0.2.10)
|
||||
guard (1.6.2)
|
||||
listen (>= 0.6.0)
|
||||
lumberjack (>= 1.0.2)
|
||||
pry (>= 0.9.10)
|
||||
terminal-table (>= 1.4.3)
|
||||
thor (>= 0.14.6)
|
||||
json (1.7.7)
|
||||
libv8 (3.16.14.3)
|
||||
listen (2.7.9)
|
||||
celluloid (>= 0.15.2)
|
||||
rb-fsevent (>= 0.9.3)
|
||||
rb-inotify (>= 0.9)
|
||||
lumberjack (1.0.2)
|
||||
method_source (0.8.1)
|
||||
multi_json (1.6.1)
|
||||
open4 (1.3.0)
|
||||
pry (0.9.12)
|
||||
coderay (~> 1.0.5)
|
||||
method_source (~> 0.8)
|
||||
slop (~> 3.4)
|
||||
puma (2.6.0)
|
||||
backports (3.6.3)
|
||||
diff-lcs (1.2.5)
|
||||
dotenv (0.11.1)
|
||||
dotenv-deployment (~> 0.0.2)
|
||||
dotenv-deployment (0.0.2)
|
||||
foreman (0.75.0)
|
||||
dotenv (~> 0.11.1)
|
||||
thor (~> 0.19.1)
|
||||
hashr (0.0.22)
|
||||
multi_json (1.10.1)
|
||||
puma (2.9.1)
|
||||
rack (>= 1.1, < 2.0)
|
||||
rack (1.5.2)
|
||||
rack-mobile-detect (0.4.0)
|
||||
rack
|
||||
rack-protection (1.3.2)
|
||||
rack-protection (1.5.3)
|
||||
rack
|
||||
rack-ssl (1.3.3)
|
||||
rack-ssl (1.4.1)
|
||||
rack
|
||||
rack-test (0.6.2)
|
||||
rack (>= 1.0)
|
||||
rake (10.0.3)
|
||||
rb-fsevent (0.9.3)
|
||||
rb-inotify (0.9.5)
|
||||
ffi (>= 0.5.0)
|
||||
rerun (0.10.0)
|
||||
listen (~> 2.7, >= 2.7.3)
|
||||
rspec (2.13.0)
|
||||
rspec-core (~> 2.13.0)
|
||||
rspec-expectations (~> 2.13.0)
|
||||
rspec-mocks (~> 2.13.0)
|
||||
rspec-core (2.13.0)
|
||||
rspec-expectations (2.13.0)
|
||||
rake (10.1.1)
|
||||
rspec (2.99.0)
|
||||
rspec-core (~> 2.99.0)
|
||||
rspec-expectations (~> 2.99.0)
|
||||
rspec-mocks (~> 2.99.0)
|
||||
rspec-core (2.99.2)
|
||||
rspec-expectations (2.99.2)
|
||||
diff-lcs (>= 1.1.3, < 2.0)
|
||||
rspec-mocks (2.13.0)
|
||||
sass (3.2.6)
|
||||
sinatra (1.3.5)
|
||||
rspec-mocks (2.99.2)
|
||||
sinatra (1.4.5)
|
||||
rack (~> 1.4)
|
||||
rack-protection (~> 1.3)
|
||||
tilt (~> 1.3, >= 1.3.3)
|
||||
sinatra-contrib (1.3.2)
|
||||
rack-protection (~> 1.4)
|
||||
tilt (~> 1.3, >= 1.3.4)
|
||||
sinatra-contrib (1.4.2)
|
||||
backports (>= 2.0)
|
||||
eventmachine
|
||||
multi_json
|
||||
rack-protection
|
||||
rack-test
|
||||
sinatra (~> 1.3.0)
|
||||
sinatra (~> 1.4.0)
|
||||
tilt (~> 1.3)
|
||||
slop (3.4.3)
|
||||
terminal-table (1.4.5)
|
||||
thor (0.17.0)
|
||||
tilt (1.3.3)
|
||||
timers (1.1.0)
|
||||
uglifier (1.3.0)
|
||||
execjs (>= 0.3.0)
|
||||
multi_json (~> 1.0, >= 1.0.2)
|
||||
yui-compressor (0.9.6)
|
||||
POpen4 (>= 0.1.4)
|
||||
thor (0.19.1)
|
||||
tilt (1.4.1)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
coffee-script
|
||||
compass
|
||||
foreman
|
||||
guard
|
||||
libv8 (~> 3.16.0)
|
||||
hashr
|
||||
puma
|
||||
rack-mobile-detect
|
||||
rack-protection (~> 1.3)
|
||||
rack-ssl (~> 1.3)
|
||||
rake
|
||||
rake-pipeline!
|
||||
rake-pipeline-web-filters!
|
||||
rb-fsevent (~> 0.9.1)
|
||||
rerun (~> 0.10.0)
|
||||
rspec (~> 2.11)
|
||||
sinatra
|
||||
sinatra-contrib
|
||||
tilt
|
||||
uglifier
|
||||
yui-compressor
|
||||
travis-web!
|
||||
|
||||
BUNDLED WITH
|
||||
1.10.1
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
$: << 'lib'
|
||||
|
||||
guard 'assets' do
|
||||
watch(%r(^Assetfile))
|
||||
watch(%r(^assets))
|
||||
end
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
$: << 'lib'
|
||||
|
||||
guard 'specs' do
|
||||
watch(%r(^public))
|
||||
end
|
||||
|
2
Procfile
2
Procfile
|
@ -1,3 +1,3 @@
|
|||
web: bundle exec rackup -s puma -p $PORT
|
||||
web: bundle exec rackup -s puma -p $PORT waiter/config.ru
|
||||
assets: rerun -x -p 'assets/**/*' 'bundle exec rakep'
|
||||
#specs: rerun -x -p 'public/**/*' './run_jasmine.coffee public/spec.html'
|
||||
|
|
105
README.md
105
README.md
|
@ -2,56 +2,77 @@
|
|||
[](https://travis-ci.org/travis-ci/travis-web)
|
||||
### Running the app
|
||||
|
||||
The app is developed using [Ember CLI](http://ember-cli.com). It requires nodejs
|
||||
with npm installed.
|
||||
|
||||
In order to run the app you need to install dependencies with:
|
||||
|
||||
bundle install
|
||||
bower install
|
||||
npm install
|
||||
|
||||
Then you have to run the server, the easiest way to do this is to
|
||||
use foreman:
|
||||
Now you can run the server:
|
||||
|
||||
bundle exec foreman start
|
||||
ember serve
|
||||
|
||||
Now you can open [localhost:5000](http://localhost:5000)
|
||||
And open http://localhost:4200 in the browser.
|
||||
|
||||
By default it uses the official API at `https://api.travis-ci.org`, but you
|
||||
can customize the API server URL using:
|
||||
Alternatively you can run `ember build --watch` and start the server with `waiter/script/server`
|
||||
|
||||
### Running the app in private repos mode
|
||||
|
||||
At the moment Travis CI is available as two separate sites - https://travis-ci.org for Open Source
|
||||
projects and https://travis-ci.com for private projects. travis-web will connect
|
||||
to the Open Source version by default. In order to connect it to the API for private projects
|
||||
you need to run:
|
||||
|
||||
```
|
||||
TRAVIS_PRO=true ember serve --ssl --ssl-key=ssl/server.key --ssl-cert=ssl/server.crt
|
||||
```
|
||||
|
||||
One caveat here is that the command will start server with SSL, so the page will
|
||||
be accessible at https://localhost:4200 (note `https` part).
|
||||
|
||||
### Running on SSL in general
|
||||
|
||||
Sometimes there is a need to test the app with an SSL connection. This is required
|
||||
to make Pusher work when running Travis CI Pro, but it may also be needed in other
|
||||
situations.
|
||||
|
||||
There's already an SSL certificate in the `ssl` directory, which is set for `localhost`
|
||||
host. If you want to use it, you can start the server with:
|
||||
|
||||
```
|
||||
ember serve --ssl --ssl-key=ssl/server.key --ssl-cert=ssl/server.crt
|
||||
```
|
||||
|
||||
In case you want your own certificate, you can follow the instructions posted
|
||||
here: https://gist.github.com/trcarden/3295935 and then point the server to your
|
||||
certificate with `--ssl-key` and `--ssl-cert`.
|
||||
|
||||
### Running tests
|
||||
|
||||
To run a test suite execute:
|
||||
|
||||
ember test
|
||||
|
||||
You can also start an interactive test runner for easier development:
|
||||
|
||||
ember test --serve
|
||||
|
||||
|
||||
API_ENDPOINT="http://localhost:3000/" bundle exec foreman start
|
||||
### Updating the team page
|
||||
|
||||
This will run against API run locally.
|
||||
The team information can be found in `app/routes/team.js`.
|
||||
To add another member just add the info in the same style as the previous ones. Like so
|
||||
|
||||
### Compiling assets manually
|
||||
{
|
||||
name: 'Mr T'
|
||||
title: 'Mascot'
|
||||
handle: 'travisci'
|
||||
nationality: 'internet'
|
||||
country: 'internet'
|
||||
image: 'mrt'
|
||||
}
|
||||
|
||||
bundle exec rakep
|
||||
ENV=production bundle exec rakep
|
||||
|
||||
### Running the spec suite
|
||||
|
||||
First, start the app (see above).
|
||||
|
||||
bundle exec foreman start
|
||||
|
||||
To run the Ruby specs, run rspec against the spec/ directory:
|
||||
|
||||
bundle exec rspec spec/
|
||||
|
||||
To run the Jasmine specs, open the spec page: [localhost:5000/spec.html](http://localhost:5000/spec.html)
|
||||
|
||||
### i18n
|
||||
|
||||
Localization for travis-web is managed via [localeapp](http://localeapp.com).
|
||||
If you are interested in improving the existing localizations or adding
|
||||
a new locale, please contact us on irc (#travis) and we will set you up.
|
||||
|
||||
Please do **not** edit the YAML files directly.
|
||||
|
||||
Localization data can be synced with the following rake task:
|
||||
|
||||
bundle exec localeapp:update
|
||||
|
||||
This will publish any new keys in en.yml, as well as any missing keys
|
||||
from your handlebars templates and pull down the latest localizations.
|
||||
|
||||
*note*: You will need to have the localeapp api key exported to
|
||||
LOCALEAPP_API_KEY
|
||||
The order of value pairs does not matter, the quotationmarks do. Name and title will be displayed as they are. The handle will be used to generate a link to Twitter and displayed with a '@' in front of it. Nationality and country determine the flags. Please use the name of the country and not the adjective (like 'germany' and NOT 'german'). Image is the identifier to find the right image and animated gif. 'mrt' in the example will result in `team-mrt.png` and `mrt-animated.gif`.
|
||||
Add the images themselves to `public/images/team/` and additional flags to `public/images/pro-landing/`. Mind the naming conventions already in place.
|
||||
|
|
36
Rakefile
36
Rakefile
|
@ -1,36 +0,0 @@
|
|||
$: << 'lib'
|
||||
namespace :localeapp do
|
||||
desc "syncs localeapp, yaml and handlebars"
|
||||
task :update do
|
||||
require 'localeapp-handlebars_i18n'
|
||||
Localeapp::HandlebarsI18n.configure($stdout) do |config|
|
||||
config.hbs_load_path = Dir[File.expand_path '../assets/scripts/app/templates/**/*.hbs', __FILE__]
|
||||
config.yml_load_path = File.expand_path '../locales/', __FILE__
|
||||
config.localeapp_api_key = ENV['LOCALEAPP_API_KEY']
|
||||
end
|
||||
system "localeapp push locales/#{Localeapp::HandlebarsI18n.default_locale}.yml"
|
||||
Localeapp::HandlebarsI18n.send_missing_translations
|
||||
system "localeapp pull"
|
||||
end
|
||||
end
|
||||
|
||||
namespace :ember do
|
||||
desc 'update ember'
|
||||
task :update do
|
||||
if File.exists?('tmp/ember.js')
|
||||
system 'cd tmp/ember.js; git fetch origin; git reset --hard origin/master'
|
||||
else
|
||||
system 'git clone https://github.com/emberjs/ember.js.git tmp/ember.js'
|
||||
end
|
||||
|
||||
system 'cd tmp/ember.js; bundle update'
|
||||
system 'cd tmp/ember.js; rake dist'
|
||||
system 'cp tmp/ember.js/dist/ember.js assets/javascripts/vendor/ember.js'
|
||||
end
|
||||
end
|
||||
|
||||
task :update_emojis do
|
||||
s = Dir.glob('assets/images/emoji/*.png').map {|png| png.split('/', 4)[3].gsub('.png', '')}.map{|png| "'#{png}'"}.join(", ")
|
||||
e = "@EmojiDictionary = [#{s}]"
|
||||
File.open("assets/scripts/config/emoij.coffee", "w") {|f| f.write(e) }
|
||||
end
|
57
app/adapters/application.js
Normal file
57
app/adapters/application.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
import config from 'travis/config/environment';
|
||||
import Ember from 'ember';
|
||||
import ActiveModelAdapter from 'active-model-adapter';
|
||||
|
||||
export default ActiveModelAdapter.extend({
|
||||
auth: Ember.inject.service(),
|
||||
host: config.apiEndpoint,
|
||||
coalesceFindRequests: true,
|
||||
|
||||
// Before Ember Data 2.0 the default behaviour of running `findAll` was to get
|
||||
// new records only when there're no records in the store. This will change
|
||||
// to a different strategy in 2.0: when you run `findAll` it will not get any
|
||||
// new data initially, but it will try loading new data in the background.
|
||||
//
|
||||
// I'm disabling the new behaviour for now.
|
||||
shouldBackgroundReloadRecord() {
|
||||
return false;
|
||||
},
|
||||
|
||||
ajaxOptions(url, type, options) {
|
||||
var base, hash, token;
|
||||
|
||||
hash = this._super(...arguments);
|
||||
hash.headers = hash.headers || {};
|
||||
hash.headers['accept'] = 'application/json; version=2';
|
||||
|
||||
if (token = this.get('auth').token()) {
|
||||
if(!hash.headers['Authorization']) {
|
||||
hash.headers['Authorization'] = "token " + token;
|
||||
}
|
||||
}
|
||||
|
||||
return hash;
|
||||
},
|
||||
|
||||
findMany(store, type, ids) {
|
||||
return this.ajax(this.buildURL(type.modelName), 'GET', {
|
||||
data: {
|
||||
ids: ids
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
handleResponse(status, headers, payload) {
|
||||
if (status > 299) {
|
||||
console.log("[ERROR] API responded with an error (" + status + "): " + (JSON.stringify(payload)));
|
||||
}
|
||||
|
||||
return this._super(...arguments);
|
||||
},
|
||||
|
||||
// this can be removed once this PR is merged and live:
|
||||
// https://github.com/emberjs/data/pull/4204
|
||||
findRecord(store, type, id, snapshot) {
|
||||
return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET');
|
||||
}
|
||||
});
|
27
app/adapters/env-var.js
Normal file
27
app/adapters/env-var.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
import Ember from 'ember';
|
||||
import ApplicationAdapter from 'travis/adapters/application';
|
||||
|
||||
export default ApplicationAdapter.extend({
|
||||
namespace: 'settings',
|
||||
|
||||
buildURL(type, id, record) {
|
||||
var delimiter, repoId, url;
|
||||
url = this._super.apply(this, arguments);
|
||||
if (record && record.belongsTo('repo') && (repoId = record.belongsTo('repo').id)) {
|
||||
delimiter = url.indexOf('?') !== -1 ? '&' : '?';
|
||||
url = "" + url + delimiter + "repository_id=" + repoId;
|
||||
}
|
||||
return url;
|
||||
},
|
||||
|
||||
updateRecord(store, type, record) {
|
||||
var data, serializer;
|
||||
data = {};
|
||||
serializer = store.serializerFor(type.modelName);
|
||||
serializer.serializeIntoHash(data, type, record);
|
||||
var id = record.id;
|
||||
return this.ajax(this.buildURL(type.modelName, id, record), "PATCH", {
|
||||
data: data
|
||||
});
|
||||
}
|
||||
});
|
9
app/adapters/hook.js
Normal file
9
app/adapters/hook.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
import ApplicationAdapter from 'travis/adapters/application';
|
||||
|
||||
export default ApplicationAdapter.extend({
|
||||
updateRecord(store, type, snapshot) {
|
||||
return this._super(...arguments).then( (data) => {
|
||||
return { hook: { id: snapshot.id } };
|
||||
});
|
||||
}
|
||||
});
|
26
app/adapters/repo.js
Normal file
26
app/adapters/repo.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import V3Adapter from 'travis/adapters/v3';
|
||||
import ApplicationAdapter from 'travis/adapters/application';
|
||||
import Config from 'travis/config/environment';
|
||||
|
||||
let Adapter = Config.useV3API ? V3Adapter : ApplicationAdapter;
|
||||
|
||||
export default Adapter.extend({
|
||||
defaultSerializer: '-repo',
|
||||
|
||||
ajaxOptions(url, type, options) {
|
||||
var hash = options || {};
|
||||
if(!hash.data) {
|
||||
hash.data = {};
|
||||
}
|
||||
|
||||
if(Config.useV3API) {
|
||||
if(hash.data.include) {
|
||||
hash.data.include += ',repository.default_branch,branch.last_build,build.commit';
|
||||
} else {
|
||||
hash.data.include = 'repository.default_branch,branch.last_build,build.commit';
|
||||
}
|
||||
}
|
||||
|
||||
return this._super(url, type, hash);
|
||||
}
|
||||
});
|
29
app/adapters/ssh-key.js
Normal file
29
app/adapters/ssh-key.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
import Ember from 'ember';
|
||||
import ApplicationAdapter from 'travis/adapters/application';
|
||||
|
||||
export default ApplicationAdapter.extend({
|
||||
namespace: 'settings',
|
||||
|
||||
findRecord(store, type, id, record) {
|
||||
return this.ajax(this.urlPrefix() + '/ssh_key/' + id, 'GET');
|
||||
},
|
||||
|
||||
deleteRecord(store, type, record) {
|
||||
var id = record.id;
|
||||
return this.ajax(this.urlPrefix() + '/ssh_key/' + id, "DELETE");
|
||||
},
|
||||
|
||||
createRecord(store, type, record) {
|
||||
var data, serializer;
|
||||
data = {};
|
||||
serializer = store.serializerFor(type.modelName);
|
||||
serializer.serializeIntoHash(data, type, record, {
|
||||
includeId: true
|
||||
});
|
||||
|
||||
var id = record.id;
|
||||
return this.ajax(this.urlPrefix() + '/ssh_key/' + id, "PATCH", {
|
||||
data: data
|
||||
});
|
||||
}
|
||||
});
|
64
app/adapters/v3.js
Normal file
64
app/adapters/v3.js
Normal file
|
@ -0,0 +1,64 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
import RESTAdapter from 'ember-data/adapters/rest';
|
||||
|
||||
export default RESTAdapter.extend({
|
||||
auth: Ember.inject.service(),
|
||||
host: config.apiEndpoint,
|
||||
|
||||
sortQueryParams: false,
|
||||
coalesceFindRequests: false,
|
||||
headers: {
|
||||
'Travis-API-Version': '3',
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
|
||||
ajaxOptions: function(url, type, options) {
|
||||
var hash = this._super(...arguments);
|
||||
|
||||
hash.headers = hash.headers || {};
|
||||
|
||||
var token;
|
||||
if(token = this.get('auth').token()) {
|
||||
hash.headers['Authorization'] = "token " + token;
|
||||
}
|
||||
|
||||
return hash;
|
||||
},
|
||||
|
||||
// TODO: I shouldn't override this method as it's private, a better way would
|
||||
// be to create my own URL generator
|
||||
_buildURL: function(modelName, id) {
|
||||
var url = [];
|
||||
var host = Ember.get(this, 'host');
|
||||
var prefix = this.urlPrefix();
|
||||
var path;
|
||||
|
||||
if (modelName) {
|
||||
path = this.pathForType(modelName, id);
|
||||
if (path) { url.push(path); }
|
||||
}
|
||||
|
||||
if (id) { url.push(encodeURIComponent(id)); }
|
||||
if (prefix) { url.unshift(prefix); }
|
||||
|
||||
url = url.join('/');
|
||||
if (!host && url && url.charAt(0) !== '/') {
|
||||
url = '/' + url;
|
||||
}
|
||||
|
||||
return url;
|
||||
},
|
||||
|
||||
pathForType: function(modelName, id) {
|
||||
var underscored = Ember.String.underscore(modelName);
|
||||
return id ? underscored : Ember.String.pluralize(underscored);
|
||||
},
|
||||
|
||||
// this can be removed once this PR is merged and live:
|
||||
// https://github.com/emberjs/data/pull/4204
|
||||
findRecord(store, type, id, snapshot) {
|
||||
return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET');
|
||||
}
|
||||
});
|
130
app/app.js
Normal file
130
app/app.js
Normal file
|
@ -0,0 +1,130 @@
|
|||
import Ember from 'ember';
|
||||
import Resolver from './resolver';
|
||||
import loadInitializers from 'ember-load-initializers';
|
||||
import config from './config/environment';
|
||||
|
||||
Ember.MODEL_FACTORY_INJECTIONS = true;
|
||||
|
||||
Ember.LinkComponent.reopen({
|
||||
attributeBindings: ['alt']
|
||||
});
|
||||
|
||||
var App = Ember.Application.extend(Ember.Evented, {
|
||||
LOG_TRANSITIONS: true,
|
||||
LOG_TRANSITIONS_INTERNAL: true,
|
||||
LOG_ACTIVE_GENERATION: true,
|
||||
LOG_MODULE_RESOLVER: true,
|
||||
LOG_VIEW_LOOKUPS: true,
|
||||
modulePrefix: config.modulePrefix,
|
||||
podModulePrefix: config.podModulePrefix,
|
||||
Resolver: Resolver,
|
||||
|
||||
flash(options) {
|
||||
return Ember.getOwner(Travis).lookup('controller:flash').loadFlashes([options]);
|
||||
},
|
||||
|
||||
toggleSidebar() {
|
||||
var element;
|
||||
$('body').toggleClass('maximized');
|
||||
element = $('<span></span>');
|
||||
$('#top .profile').append(element);
|
||||
Ember.run.later((function() {
|
||||
return element.remove();
|
||||
}), 10);
|
||||
element = $('<span></span>');
|
||||
$('#repo').append(element);
|
||||
return Ember.run.later((function() {
|
||||
return element.remove();
|
||||
}), 10);
|
||||
},
|
||||
|
||||
ready() {
|
||||
if (location.hash.slice(0, 2) === '#!') {
|
||||
location.href = location.href.replace('#!/', '');
|
||||
}
|
||||
this.on('user:signed_in', function(user) {
|
||||
return Travis.onUserUpdate(user);
|
||||
});
|
||||
this.on('user:refreshed', function(user) {
|
||||
return Travis.onUserUpdate(user);
|
||||
});
|
||||
this.on('user:synced', function(user) {
|
||||
return Travis.onUserUpdate(user);
|
||||
});
|
||||
return this.on('user:signed_out', function() {
|
||||
if (config.userlike) {
|
||||
return Travis.removeUserlike();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
currentDate() {
|
||||
return new Date();
|
||||
},
|
||||
|
||||
onUserUpdate(user) {
|
||||
if (config.pro) {
|
||||
this.identifyCustomer(user);
|
||||
}
|
||||
if (config.userlike) {
|
||||
this.setupUserlike(user);
|
||||
}
|
||||
return this.subscribePusher(user);
|
||||
},
|
||||
|
||||
subscribePusher(user) {
|
||||
var channels;
|
||||
if (!user.channels) {
|
||||
return;
|
||||
}
|
||||
channels = user.channels;
|
||||
if (config.pro) {
|
||||
channels = channels.map(function(channel) {
|
||||
if (channel.match(/^private-/)) {
|
||||
return channel;
|
||||
} else {
|
||||
return "private-" + channel;
|
||||
}
|
||||
});
|
||||
}
|
||||
return Travis.pusher.subscribeAll(channels);
|
||||
},
|
||||
|
||||
setupUserlike(user) {
|
||||
var btn, s, userlikeData;
|
||||
btn = document.getElementById('userlikeCustomTab');
|
||||
btn.classList.add("logged-in");
|
||||
userlikeData = window.userlikeData = {};
|
||||
userlikeData.user = {};
|
||||
userlikeData.user.name = user.login;
|
||||
userlikeData.user.email = user.email;
|
||||
if (!document.getElementById('userlike-script')) {
|
||||
s = document.createElement('script');
|
||||
s.id = 'userlike-script';
|
||||
s.src = '//userlike-cdn-widgets.s3-eu-west-1.amazonaws.com/0327dbb23382ccbbb91b445b76e8a91d4b37d90ef9f2faf84e11177847ff7bb9.js';
|
||||
return document.body.appendChild(s);
|
||||
}
|
||||
},
|
||||
|
||||
removeUserlike() {
|
||||
var btn;
|
||||
btn = document.getElementById('userlikeCustomTab');
|
||||
return btn.classList.remove("logged-in");
|
||||
},
|
||||
|
||||
identifyCustomer(user) {
|
||||
if (_cio && _cio.identify) {
|
||||
return _cio.identify({
|
||||
id: user.id,
|
||||
email: user.email,
|
||||
name: user.name,
|
||||
created_at: (Date.parse(user.created_at) / 1000) || null,
|
||||
login: user.login
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
loadInitializers(App, config.modulePrefix);
|
||||
|
||||
export default App;
|
55
app/components/add-env-var.js
Normal file
55
app/components/add-env-var.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['form--envvar'],
|
||||
classNameBindings: ['nameIsBlank:form-error'],
|
||||
store: Ember.inject.service(),
|
||||
|
||||
isValid() {
|
||||
if (Ember.isBlank(this.get('name'))) {
|
||||
this.set('nameIsBlank', true);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
|
||||
reset() {
|
||||
return this.setProperties({
|
||||
name: null,
|
||||
value: null,
|
||||
"public": null
|
||||
});
|
||||
},
|
||||
|
||||
actions: {
|
||||
save() {
|
||||
var env_var, self;
|
||||
if (this.get('isSaving')) {
|
||||
return;
|
||||
}
|
||||
this.set('isSaving', true);
|
||||
if (this.isValid()) {
|
||||
env_var = this.get('store').createRecord('env_var', {
|
||||
name: this.get('name'),
|
||||
value: this.get('value'),
|
||||
"public": this.get('public'),
|
||||
repo: this.get('repo')
|
||||
});
|
||||
self = this;
|
||||
return env_var.save().then(() => {
|
||||
this.set('isSaving', false);
|
||||
return this.reset();
|
||||
}, () => {
|
||||
return this.set('isSaving', false);
|
||||
});
|
||||
} else {
|
||||
return this.set('isSaving', false);
|
||||
}
|
||||
},
|
||||
|
||||
nameChanged() {
|
||||
return this.set('nameIsBlank', false);
|
||||
}
|
||||
}
|
||||
});
|
85
app/components/add-ssh-key.js
Normal file
85
app/components/add-ssh-key.js
Normal file
|
@ -0,0 +1,85 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['form--sshkey'],
|
||||
classNameBindings: ['valueError:form-error'],
|
||||
store: Ember.inject.service(),
|
||||
isSaving: false,
|
||||
|
||||
didInsertElement() {
|
||||
var id = this.get('repo.id');
|
||||
var model = this.get('store').recordForId('ssh_key', id);
|
||||
|
||||
if (model) {
|
||||
this.get('store').unloadRecord(model);
|
||||
var typeMap = this.get('store').typeMapFor(model.constructor);
|
||||
var idToRecord = typeMap.idToRecord;
|
||||
delete idToRecord[id];
|
||||
}
|
||||
|
||||
model = this.get('store').createRecord('ssh_key', { id: id });
|
||||
|
||||
return this.set('model', model);
|
||||
},
|
||||
|
||||
isValid() {
|
||||
if (Ember.isBlank(this.get('value'))) {
|
||||
this.set('valueError', 'Value can\'t be blank.');
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
|
||||
reset() {
|
||||
return this.setProperties({
|
||||
description: null,
|
||||
value: null
|
||||
});
|
||||
},
|
||||
|
||||
valueChanged: function() {
|
||||
return this.set('valueError', false);
|
||||
}.observes('value'),
|
||||
|
||||
addErrorsFromResponse(errArr) {
|
||||
var error = errArr[0].detail;
|
||||
|
||||
if (error.code === 'not_a_private_key') {
|
||||
return this.set('valueError', 'This key is not a private key.');
|
||||
} else if (error.code === 'key_with_a_passphrase') {
|
||||
return this.set('valueError', 'The key can\'t have a passphrase.');
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
save() {
|
||||
var ssh_key;
|
||||
|
||||
this.set('valueError', false);
|
||||
if (this.get('isSaving')) {
|
||||
return;
|
||||
}
|
||||
this.set('isSaving', true);
|
||||
if (this.isValid()) {
|
||||
ssh_key = this.get('model');
|
||||
ssh_key.setProperties({
|
||||
description: this.get('description'),
|
||||
value: this.get('value')
|
||||
});
|
||||
return ssh_key.save().then(() => {
|
||||
this.set('isSaving', false);
|
||||
this.reset();
|
||||
return this.sendAction('sshKeyAdded', ssh_key);
|
||||
}, (error) => {
|
||||
this.set('isSaving', false);
|
||||
if (error.errors) {
|
||||
return this.addErrorsFromResponse(error.errors);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return this.set('isSaving', false);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
103
app/components/branch-row.js
Normal file
103
app/components/branch-row.js
Normal file
|
@ -0,0 +1,103 @@
|
|||
import Ember from 'ember';
|
||||
import { githubCommit as githubCommitUrl } from 'travis/utils/urls';
|
||||
import TravisRoute from 'travis/routes/basic';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
routing: Ember.inject.service('-routing'),
|
||||
tagName: 'li',
|
||||
classNameBindings: ['build.last_build.state'],
|
||||
classNames: ['branch-row', 'row-li'],
|
||||
isLoading: false,
|
||||
isTriggering: false,
|
||||
hasTriggered: false,
|
||||
|
||||
urlGithubCommit: function() {
|
||||
return githubCommitUrl(this.get('build.repository.slug'), this.get('build.last_build.commit.sha'));
|
||||
}.property('build.last_build'),
|
||||
|
||||
getLast5Builds: function() {
|
||||
var apiEndpoint, branchName, lastBuilds, options, repoId;
|
||||
lastBuilds = Ember.ArrayProxy.create({
|
||||
content: [{}, {}, {}, {}, {}],
|
||||
isLoading: true,
|
||||
count: 0
|
||||
});
|
||||
if (!this.get('build.last_build')) {
|
||||
lastBuilds.set('isLoading', false);
|
||||
} else {
|
||||
apiEndpoint = config.apiEndpoint;
|
||||
repoId = this.get('build.repository.id');
|
||||
branchName = this.get('build.name');
|
||||
options = {};
|
||||
if (this.get('auth.signedIn')) {
|
||||
options.headers = {
|
||||
Authorization: "token " + (this.auth.token())
|
||||
};
|
||||
}
|
||||
$.ajax(apiEndpoint + "/v3/repo/" + repoId + "/builds?branch.name=" + branchName + "&limit=5&build.event_type=push,api", options).then(function(response) {
|
||||
var array, i, j, ref;
|
||||
array = response.builds.map(function(build) {
|
||||
return Ember.Object.create(build);
|
||||
});
|
||||
if (array.length < 5) {
|
||||
for (i = j = 1, ref = 5 - array.length; j <= ref; i = j += 1) {
|
||||
array.push({});
|
||||
}
|
||||
}
|
||||
lastBuilds.set('count', response['@pagination'].count);
|
||||
lastBuilds.set('content', array);
|
||||
return lastBuilds.set('isLoading', false);
|
||||
});
|
||||
}
|
||||
return lastBuilds;
|
||||
}.property(),
|
||||
|
||||
canTrigger: function() {
|
||||
var permissions;
|
||||
if (!this.get('auth.signedIn')) {
|
||||
return false;
|
||||
} else {
|
||||
permissions = this.get('auth.currentUser.permissions');
|
||||
if (permissions.contains(parseInt(this.get('build.repository.id')))) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}.property(),
|
||||
|
||||
triggerBuild: function() {
|
||||
var apiEndpoint, options, repoId;
|
||||
apiEndpoint = config.apiEndpoint;
|
||||
repoId = this.get('build.repository.id');
|
||||
options = {
|
||||
type: 'POST',
|
||||
body: {
|
||||
request: {
|
||||
branch: this.get('build.name')
|
||||
}
|
||||
}
|
||||
};
|
||||
if (this.get('auth.signedIn')) {
|
||||
options.headers = {
|
||||
Authorization: "token " + (this.auth.token())
|
||||
};
|
||||
}
|
||||
return $.ajax(apiEndpoint + "/v3/repo/" + repoId + "/requests", options).then(() => {
|
||||
this.set('isTriggering', false);
|
||||
return this.set('hasTriggered', true);
|
||||
});
|
||||
},
|
||||
|
||||
actions: {
|
||||
tiggerBuild(branch) {
|
||||
this.set('isTriggering', true);
|
||||
return this.triggerBuild();
|
||||
},
|
||||
|
||||
viewAllBuilds(branch) {
|
||||
return this.get('routing').transitionTo('builds');
|
||||
}
|
||||
}
|
||||
});
|
21
app/components/broadcast-tower.js
Normal file
21
app/components/broadcast-tower.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['broadcast'],
|
||||
isOpen: false,
|
||||
timeoutId: '',
|
||||
actions: {
|
||||
toggleBroadcasts() {
|
||||
this.toggleProperty('isOpen');
|
||||
this.sendAction('toggleBroadcasts');
|
||||
if (this.get('isOpen') === true) {
|
||||
return this.set('timeoutId', setTimeout(() => {
|
||||
this.toggleProperty('isOpen');
|
||||
return this.sendAction('toggleBroadcasts');
|
||||
}, 10000));
|
||||
} else {
|
||||
return clearTimeout(this.get('timeoutId'));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
27
app/components/build-header.js
Normal file
27
app/components/build-header.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
import Ember from 'ember';
|
||||
import { gravatarImage } from 'travis/utils/urls';
|
||||
import GithubUrlProperties from 'travis/mixins/github-url-properties';
|
||||
import { durationFrom, safe } from 'travis/utils/helpers';
|
||||
import { githubCommit } from 'travis/utils/urls';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'section',
|
||||
classNames: ['build-header'],
|
||||
classNameBindings: ['item.state'],
|
||||
|
||||
isJob: function() {
|
||||
if (this.get('item.build')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}.property('item'),
|
||||
|
||||
urlGithubCommit: function() {
|
||||
return githubCommit(this.get('repo.slug'), this.get('commit.sha'));
|
||||
}.property('item'),
|
||||
|
||||
elapsedTime: function() {
|
||||
return durationFrom(this.get('item.startedAt'), this.get('item.finishedAt'));
|
||||
}.property('item.startedAt', 'item.finishedAt', 'item.duration')
|
||||
});
|
7
app/components/build-repo-actions.js
Normal file
7
app/components/build-repo-actions.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Ember from 'ember';
|
||||
import RepoActionsItemComponentMixin from 'travis/utils/repo-actions-item-component-mixin';
|
||||
|
||||
export default Ember.Component.extend(RepoActionsItemComponentMixin, {
|
||||
item: Ember.computed.alias('build'),
|
||||
type: 'build'
|
||||
});
|
14
app/components/build-tile.js
Normal file
14
app/components/build-tile.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNameBindings: ['build.state'],
|
||||
attributeBindings: ['title'],
|
||||
|
||||
title: function() {
|
||||
var num, state;
|
||||
num = this.get('build.number');
|
||||
state = this.get('build.state');
|
||||
return "Build #" + num + " " + state;
|
||||
}.property('build')
|
||||
});
|
12
app/components/build-wrapper.js
Normal file
12
app/components/build-wrapper.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
import Ember from 'ember';
|
||||
import { colorForState } from 'travis/utils/helpers';
|
||||
import Polling from 'travis/mixins/polling';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNameBindings: ['color'],
|
||||
pollModels: 'build',
|
||||
|
||||
color: function() {
|
||||
return colorForState(this.get('build.state'));
|
||||
}.property('build.state')
|
||||
});
|
12
app/components/builds-item.js
Normal file
12
app/components/builds-item.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
import Ember from 'ember';
|
||||
import { githubCommit as githubCommitUrl } from 'travis/utils/urls';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNameBindings: ['build.state'],
|
||||
classNames: ['row-li', 'pr-row'],
|
||||
|
||||
urlGithubCommit: function() {
|
||||
return githubCommitUrl(this.get('build.repo.slug'), this.get('build.commit.sha'));
|
||||
}.property('build.commit.sha')
|
||||
});
|
30
app/components/builds-wrapper.js
Normal file
30
app/components/builds-wrapper.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
import Ember from 'ember';
|
||||
import Polling from 'travis/mixins/polling';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
store: Ember.inject.service('store'),
|
||||
|
||||
pollHook: function(store) {
|
||||
var contentType, repositoryId;
|
||||
contentType = this.get('contentType');
|
||||
repositoryId = this.get('repo.id');
|
||||
store = this.get('store');
|
||||
|
||||
if (contentType === 'builds') {
|
||||
return store.query('build', {
|
||||
event_type: 'push',
|
||||
repository_id: repositoryId
|
||||
});
|
||||
} else if (contentType === 'pull_requests') {
|
||||
return store.filter('build', {
|
||||
event_type: 'pull_request',
|
||||
repository_id: repositoryId
|
||||
});
|
||||
} else {
|
||||
return store.query('build', {
|
||||
repository_id: repositoryId,
|
||||
branches: true
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
33
app/components/caches-item.js
Normal file
33
app/components/caches-item.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
ajax: Ember.inject.service(),
|
||||
tagName: 'li',
|
||||
classNames: ['cache-item'],
|
||||
classNameBindings: ['cache.type'],
|
||||
isDeleting: false,
|
||||
|
||||
actions: {
|
||||
"delete": function() {
|
||||
var data, deletingDone, repo;
|
||||
if (this.get('isDeleting')) {
|
||||
return;
|
||||
}
|
||||
if (confirm('Are you sure?')) {
|
||||
this.set('isDeleting', true);
|
||||
data = {
|
||||
branch: this.get('cache.branch')
|
||||
};
|
||||
deletingDone = () => {
|
||||
return this.set('isDeleting', false);
|
||||
};
|
||||
repo = this.get('repo');
|
||||
return this.get('ajax').ajax("/repos/" + (repo.get('id')) + "/caches", "DELETE", {
|
||||
data: data
|
||||
}).then(deletingDone, deletingDone).then(() => {
|
||||
return this.get('caches').removeObject(this.get('cache'));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
36
app/components/dashboard-row.js
Normal file
36
app/components/dashboard-row.js
Normal file
|
@ -0,0 +1,36 @@
|
|||
import Ember from 'ember';
|
||||
import { githubCommit as githubCommitUrl } from 'travis/utils/urls';
|
||||
import config from 'travis/config/environment';
|
||||
import { hasAdminPermission, hasPushPermission } from 'travis/utils/permission';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNameBindings: ['repo.default_branch.last_build.state'],
|
||||
classNames: ['rows', 'rows--dashboard'],
|
||||
isLoading: false,
|
||||
isTriggering: false,
|
||||
hasTriggered: false,
|
||||
dropupIsOpen: false,
|
||||
|
||||
urlGithubCommit: function() {
|
||||
return githubCommitUrl(this.get('repo.slug'), this.get('repo.default_branch.last_build.commit.sha'));
|
||||
}.property('repo'),
|
||||
|
||||
displayMenuTofu: function() {
|
||||
return hasPushPermission(this.get('currentUser'), this.get('repo.id'));
|
||||
},
|
||||
|
||||
displayActivateLink: function() {
|
||||
return hasAdminPermission(this.get('currentUser'), this.get('repo.id'));
|
||||
},
|
||||
|
||||
actions: {
|
||||
tiggerBuild(branch) {
|
||||
this.set('isTriggering', true);
|
||||
return this.triggerBuild();
|
||||
},
|
||||
openDropup() {
|
||||
this.toggleProperty('dropupIsOpen');
|
||||
}
|
||||
}
|
||||
});
|
28
app/components/env-var.js
Normal file
28
app/components/env-var.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['settings-envvar'],
|
||||
classNameBindings: ['envVar.public:is-public'],
|
||||
isDeleting: false,
|
||||
validates: { name: ['presence'] },
|
||||
actionType: 'Save',
|
||||
showValueField: Ember.computed.alias('public'),
|
||||
|
||||
value: function(key) {
|
||||
if (this.get('envVar.public')) {
|
||||
return this.get('envVar.value');
|
||||
} else {
|
||||
return '••••••••••••••••';
|
||||
}
|
||||
}.property('envVar.value', 'envVar.public'),
|
||||
|
||||
actions: {
|
||||
"delete": function() {
|
||||
if (this.get('isDeleting')) {
|
||||
return;
|
||||
}
|
||||
this.set('isDeleting', true);
|
||||
return this.get('envVar').destroyRecord();
|
||||
}
|
||||
}
|
||||
});
|
6
app/components/eye-icon.js
Normal file
6
app/components/eye-icon.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'span',
|
||||
classNames: ['icon-eye']
|
||||
});
|
14
app/components/flash-display.js
Normal file
14
app/components/flash-display.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
flashes: Ember.inject.service(),
|
||||
classNames: ['flash'],
|
||||
tagName: 'ul',
|
||||
messagesBinding: 'flashes.messages',
|
||||
|
||||
actions: {
|
||||
closeMessage(msg) {
|
||||
return this.get('flashes').close(msg);
|
||||
}
|
||||
}
|
||||
});
|
16
app/components/flash-item.js
Normal file
16
app/components/flash-item.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNameBindings: ['type'],
|
||||
|
||||
type: function() {
|
||||
return this.get('flash.type') || 'broadcast';
|
||||
}.property('flash.type'),
|
||||
|
||||
actions: {
|
||||
close() {
|
||||
return this.attrs.close(this.get('flash'));
|
||||
}
|
||||
}
|
||||
});
|
17
app/components/hook-switch.js
Normal file
17
app/components/hook-switch.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'a',
|
||||
classNames: ['switch--icon'],
|
||||
classNameBindings: ['active'],
|
||||
activeBinding: "hook.active",
|
||||
click() {
|
||||
var hook;
|
||||
this.sendAction('onToggle');
|
||||
hook = this.get('hook');
|
||||
return hook.toggle().then((function() {}), () => {
|
||||
this.toggleProperty('hook.active');
|
||||
return this.sendAction('onToggleError', hook);
|
||||
});
|
||||
}
|
||||
});
|
23
app/components/hooks-list-item.js
Normal file
23
app/components/hooks-list-item.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNames: ['row'],
|
||||
classNameBindings: ['hook.active:active'],
|
||||
githubOrgsOauthAccessSettingsUrl: config.githubOrgsOauthAccessSettingsUrl,
|
||||
|
||||
actions: {
|
||||
handleToggleError() {
|
||||
return this.set("showError", true);
|
||||
},
|
||||
|
||||
close() {
|
||||
return this.send('resetErrors');
|
||||
},
|
||||
|
||||
resetErrors() {
|
||||
return this.set("showError", false);
|
||||
}
|
||||
}
|
||||
});
|
35
app/components/job-log.js
Normal file
35
app/components/job-log.js
Normal file
|
@ -0,0 +1,35 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
logBinding: 'job.log',
|
||||
classNames: ['job-log'],
|
||||
|
||||
didReceiveAttrs: function(options) {
|
||||
this._super(...arguments);
|
||||
|
||||
let oldJob = options.oldAttrs && options.oldAttrs.job && options.oldAttrs.job.value,
|
||||
newJob = options.newAttrs && options.newAttrs.job && options.newAttrs.job.value;
|
||||
|
||||
if(newJob !== oldJob) {
|
||||
if(newJob) {
|
||||
this.setupLog(newJob);
|
||||
}
|
||||
|
||||
if(oldJob) {
|
||||
this.teardownLog(oldJob);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
teardownLog(job) {
|
||||
job.unsubscribe();
|
||||
},
|
||||
|
||||
setupLog(job) {
|
||||
this.set('error', false);
|
||||
job.get('log').fetch().then(function() { }, () => {
|
||||
this.set('error', true);
|
||||
});
|
||||
job.subscribe();
|
||||
}
|
||||
});
|
7
app/components/job-repo-actions.js
Normal file
7
app/components/job-repo-actions.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Ember from 'ember';
|
||||
import RepoActionsItemComponentMixin from 'travis/utils/repo-actions-item-component-mixin';
|
||||
|
||||
export default Ember.Component.extend(RepoActionsItemComponentMixin, {
|
||||
item: Ember.computed.alias('job'),
|
||||
type: 'job'
|
||||
});
|
18
app/components/job-wrapper.js
Normal file
18
app/components/job-wrapper.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
import Ember from 'ember';
|
||||
import { colorForState } from 'travis/utils/helpers';
|
||||
import { githubCommit } from 'travis/utils/urls';
|
||||
import Polling from 'travis/mixins/polling';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
pollModels: 'job.build',
|
||||
commitBinding: 'job.commit',
|
||||
currentItemBinding: 'job',
|
||||
|
||||
color: function() {
|
||||
return colorForState(this.get('job.state'));
|
||||
}.property('job.state'),
|
||||
|
||||
urlGithubCommit: function() {
|
||||
return githubCommit(this.get('repo.slug'), this.get('commit.sha'));
|
||||
}.property('repo.slug', 'commit.sha')
|
||||
});
|
36
app/components/jobs-item.js
Normal file
36
app/components/jobs-item.js
Normal file
|
@ -0,0 +1,36 @@
|
|||
import Ember from 'ember';
|
||||
import { colorForState } from 'travis/utils/helpers';
|
||||
import { languageConfigKeys } from 'travis/utils/keys-map';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNameBindings: ['job.state'],
|
||||
classNames: ['jobs-item'],
|
||||
|
||||
languages: function() {
|
||||
var config, gemfile, key, languageName, output, version;
|
||||
output = [];
|
||||
if (config = this.get('job.config')) {
|
||||
for (key in languageConfigKeys) {
|
||||
languageName = languageConfigKeys[key];
|
||||
if (version = config[key]) {
|
||||
output.push(languageName + ': ' + version);
|
||||
}
|
||||
}
|
||||
gemfile = this.get('job.config.gemfile');
|
||||
if (gemfile && this.get('job.config.env')) {
|
||||
output.push("Gemfile: " + gemfile);
|
||||
}
|
||||
}
|
||||
return output.join(' ');
|
||||
}.property('job.config'),
|
||||
|
||||
environment: function() {
|
||||
var env, gemfile;
|
||||
if (env = this.get('job.config.env')) {
|
||||
return env;
|
||||
} else if (gemfile = this.get('job.config.gemfile')) {
|
||||
return "Gemfile: " + gemfile;
|
||||
}
|
||||
}.property('job.config.env', 'job.config.gemfile')
|
||||
});
|
13
app/components/jobs-list.js
Normal file
13
app/components/jobs-list.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'section',
|
||||
classNames: ['jobs'],
|
||||
jobTableId: Ember.computed(function() {
|
||||
if (this.get('required')) {
|
||||
return 'jobs';
|
||||
} else {
|
||||
return 'allowed_failure_jobs';
|
||||
}
|
||||
})
|
||||
});
|
8
app/components/lastbuild-tile.js
Normal file
8
app/components/lastbuild-tile.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
|
||||
tagName: 'li',
|
||||
classNameBindings: ['build.state']
|
||||
|
||||
});
|
55
app/components/limit-concurrent-builds.js
Normal file
55
app/components/limit-concurrent-builds.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['limit-concurrent-builds'],
|
||||
|
||||
description: function() {
|
||||
var description;
|
||||
description = "Limit concurrent jobs";
|
||||
if (this.get('enabled')) {
|
||||
description += " ";
|
||||
}
|
||||
return description;
|
||||
}.property('enabled'),
|
||||
|
||||
limitChanged() {
|
||||
var limit, repo, savingFinished;
|
||||
repo = this.get('repo');
|
||||
limit = parseInt(this.get('value'));
|
||||
if (limit) {
|
||||
this.set('isSaving', true);
|
||||
savingFinished = () => {
|
||||
return this.set('isSaving', false);
|
||||
};
|
||||
return repo.saveSettings({
|
||||
maximum_number_of_builds: limit
|
||||
}).then(savingFinished, savingFinished);
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
toggle() {
|
||||
var savingFinished;
|
||||
if (!this.get('enabled')) {
|
||||
if (this.get('value') === 0) {
|
||||
return;
|
||||
}
|
||||
if (this.get('isSaving')) {
|
||||
return;
|
||||
}
|
||||
this.set('isSaving', true);
|
||||
savingFinished = () => {
|
||||
return this.set('isSaving', false);
|
||||
};
|
||||
this.get('repo').saveSettings({
|
||||
maximum_number_of_builds: 0
|
||||
}).then(savingFinished, savingFinished);
|
||||
return this.set('value', 0);
|
||||
}
|
||||
},
|
||||
|
||||
limitChanged() {
|
||||
return Ember.run.debounce(this, 'limitChanged', 1000);
|
||||
}
|
||||
}
|
||||
});
|
7
app/components/loading-indicator.js
Normal file
7
app/components/loading-indicator.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'div',
|
||||
classNameBindings: ['center:loading-container', 'inline:inline-block', 'height:icon-height'],
|
||||
center: false
|
||||
});
|
238
app/components/log-content.js
Normal file
238
app/components/log-content.js
Normal file
|
@ -0,0 +1,238 @@
|
|||
import Ember from 'ember';
|
||||
import LinesSelector from 'travis/utils/lines-selector';
|
||||
import LogFolder from 'travis/utils/log-folder';
|
||||
import config from 'travis/config/environment';
|
||||
import { plainTextLog as plainTextLogUrl } from 'travis/utils/urls';
|
||||
|
||||
Log.DEBUG = false;
|
||||
|
||||
Log.LIMIT = 10000;
|
||||
|
||||
Log.Scroll = function(options) {
|
||||
options = options || {};
|
||||
this.beforeScroll = options.beforeScroll;
|
||||
return this;
|
||||
};
|
||||
|
||||
Log.Scroll.prototype = $.extend(new Log.Listener(), {
|
||||
insert: function(log, data, pos) {
|
||||
if (this.numbers) {
|
||||
this.tryScroll();
|
||||
}
|
||||
return true;
|
||||
},
|
||||
tryScroll: function() {
|
||||
var element, ref;
|
||||
if (element = $("#log p:visible.highlight:first")) {
|
||||
if (this.beforeScroll) {
|
||||
this.beforeScroll();
|
||||
}
|
||||
$('#main').scrollTop(0);
|
||||
return $('html, body').scrollTop(((ref = element.offset()) != null ? ref.top : void 0) - (window.innerHeight / 3));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Log.Limit = function(max_lines, limitedLogCallback) {
|
||||
this.max_lines = max_lines || 1000;
|
||||
this.limitedLogCallback = limitedLogCallback || (function() {});
|
||||
return this;
|
||||
};
|
||||
|
||||
Log.Limit.prototype = Log.extend(new Log.Listener(), {
|
||||
count: 0,
|
||||
insert: function(log, node, pos) {
|
||||
if (node.type === 'paragraph' && !node.hidden) {
|
||||
this.count += 1;
|
||||
if (this.limited) {
|
||||
this.limitedLogCallback();
|
||||
}
|
||||
return this.count;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(Log.Limit.prototype, 'limited', {
|
||||
get: function() {
|
||||
return this.count >= this.max_lines;
|
||||
}
|
||||
});
|
||||
|
||||
export default Ember.Component.extend({
|
||||
popup: Ember.inject.service(),
|
||||
classNameBindings: ['logIsVisible:is-open'],
|
||||
logIsVisible: false,
|
||||
currentUserBinding: 'auth.currentUser',
|
||||
|
||||
didInsertElement() {
|
||||
if (Log.DEBUG) {
|
||||
console.log('log view: did insert');
|
||||
}
|
||||
this._super.apply(this, arguments);
|
||||
Ember.run.scheduleOnce('afterRender', this, 'createEngine');
|
||||
},
|
||||
|
||||
willDestroyElement() {
|
||||
if (Log.DEBUG) {
|
||||
console.log('log view: will destroy');
|
||||
}
|
||||
Ember.run.scheduleOnce('afterRender', this, 'teardownLog');
|
||||
},
|
||||
|
||||
teardownLog(log) {
|
||||
var parts, ref;
|
||||
if (log || (log = this.get('log'))) {
|
||||
parts = log.get('parts');
|
||||
parts.removeArrayObserver(this, {
|
||||
didChange: 'partsDidChange',
|
||||
willChange: 'noop'
|
||||
});
|
||||
parts.destroy();
|
||||
log.notifyPropertyChange('parts');
|
||||
if ((ref = this.lineSelector) != null) {
|
||||
ref.willDestroy();
|
||||
}
|
||||
this.clearLogElement();
|
||||
}
|
||||
},
|
||||
|
||||
clearLogElement() {
|
||||
var logElement = this.$('#log');
|
||||
if (logElement && logElement[0]) {
|
||||
logElement[0].innerHTML = '';
|
||||
}
|
||||
},
|
||||
|
||||
createEngine(log) {
|
||||
if (log || (log = this.get('log'))) {
|
||||
this.clearLogElement();
|
||||
log.onClear(() => {
|
||||
this.teardownLog();
|
||||
return this.createEngine();
|
||||
});
|
||||
this.scroll = new Log.Scroll({
|
||||
beforeScroll: () => {
|
||||
return this.unfoldHighlight();
|
||||
}
|
||||
});
|
||||
this.limit = new Log.Limit(Log.LIMIT, () => {
|
||||
return this.set('limited', true);
|
||||
});
|
||||
this.engine = Log.create({
|
||||
listeners: [this.scroll, this.limit]
|
||||
});
|
||||
this.engine.limit = this.limit;
|
||||
this.logFolder = new LogFolder(this.$('#log'));
|
||||
this.lineSelector = new LinesSelector(this.$('#log'), this.scroll, this.logFolder);
|
||||
this.observeParts(log);
|
||||
}
|
||||
},
|
||||
|
||||
didUpdateAttrs(changes) {
|
||||
this._super.apply(this, arguments);
|
||||
if (!changes.oldAttrs) {
|
||||
return;
|
||||
}
|
||||
if (changes.newAttrs.job.value && changes.oldAttrs.job.value && changes.newAttrs.job.value !== changes.oldAttrs.job.value) {
|
||||
this.teardownLog(changes.oldAttrs.job.value.get('log'));
|
||||
return this.createEngine(changes.newAttrs.job.value.get('log'));
|
||||
}
|
||||
},
|
||||
|
||||
unfoldHighlight() {
|
||||
return this.lineSelector.unfoldLines();
|
||||
},
|
||||
|
||||
observeParts(log) {
|
||||
var parts;
|
||||
if (log || (log = this.get('log'))) {
|
||||
parts = log.get('parts');
|
||||
parts.addArrayObserver(this, {
|
||||
didChange: 'partsDidChange',
|
||||
willChange: 'noop'
|
||||
});
|
||||
parts = parts.slice(0);
|
||||
this.partsDidChange(parts, 0, null, parts.length);
|
||||
}
|
||||
},
|
||||
|
||||
partsDidChange(parts, start, _, added) {
|
||||
Ember.run.schedule('afterRender', this, function() {
|
||||
var i, j, len, part, ref, ref1, ref2, results;
|
||||
if (Log.DEBUG) {
|
||||
console.log('log view: parts did change');
|
||||
}
|
||||
if (this.get('_state') !== 'inDOM') {
|
||||
return;
|
||||
}
|
||||
ref = parts.slice(start, start + added);
|
||||
results = [];
|
||||
for (i = j = 0, len = ref.length; j < len; i = ++j) {
|
||||
part = ref[i];
|
||||
if ((ref1 = this.engine) != null ? (ref2 = ref1.limit) != null ? ref2.limited : void 0 : void 0) {
|
||||
break;
|
||||
}
|
||||
results.push(this.engine.set(part.number, part.content));
|
||||
}
|
||||
return results;
|
||||
});
|
||||
},
|
||||
|
||||
plainTextLogUrl: function() {
|
||||
var id, url;
|
||||
if (id = this.get('log.job.id')) {
|
||||
url = plainTextLogUrl(id);
|
||||
if (config.pro) {
|
||||
url += "&access_token=" + (this.get('job.log.token'));
|
||||
}
|
||||
return url;
|
||||
}
|
||||
}.property('job.log.id', 'job.log.token'),
|
||||
|
||||
hasPermission: function() {
|
||||
var permissions;
|
||||
if (permissions = this.get('currentUser.permissions')) {
|
||||
return permissions.contains(parseInt(this.get('job.repo.id')));
|
||||
}
|
||||
}.property('currentUser.permissions.length', 'job.repo.id'),
|
||||
|
||||
canRemoveLog: function() {
|
||||
var job;
|
||||
if (job = this.get('job')) {
|
||||
return job.get('canRemoveLog') && this.get('hasPermission');
|
||||
}
|
||||
}.property('job.canRemoveLog', 'hasPermission'),
|
||||
|
||||
showToTop: function() {
|
||||
return this.get('log.hasContent') && this.get('job.canRemoveLog');
|
||||
}.property('log.hasContent', 'job.canRemoveLog'),
|
||||
|
||||
showTailing: Ember.computed.alias('showToTop'),
|
||||
|
||||
actions: {
|
||||
toTop() {
|
||||
Travis.tailing.stop();
|
||||
return $(window).scrollTop(0);
|
||||
},
|
||||
|
||||
toggleTailing() {
|
||||
Travis.tailing.toggle();
|
||||
this.engine.autoCloseFold = !Travis.tailing.isActive();
|
||||
return false;
|
||||
},
|
||||
|
||||
removeLogPopup() {
|
||||
if (this.get('canRemoveLog')) {
|
||||
this.get('popup').open('remove-log-popup');
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
toggleLog() {
|
||||
this.toggleProperty('logIsVisible');
|
||||
}
|
||||
},
|
||||
|
||||
// don't remove this, it's needed as an empty willChange callback
|
||||
noop: function() {}
|
||||
});
|
20
app/components/no-builds.js
Normal file
20
app/components/no-builds.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
actions: {
|
||||
triggerBuild() {
|
||||
var apiEndpoint;
|
||||
this.set('isLoading', true);
|
||||
apiEndpoint = config.apiEndpoint;
|
||||
return $.ajax(apiEndpoint + ("/v3/repo/" + (this.get('repo.repo.id')) + "/requests"), {
|
||||
headers: {
|
||||
Authorization: 'token ' + this.get('repo.auth')
|
||||
},
|
||||
type: "POST"
|
||||
}).then(() => {
|
||||
return this.set('isLoading', false);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
3
app/components/no-repos.js
Normal file
3
app/components/no-repos.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend();
|
3
app/components/not-active.js
Normal file
3
app/components/not-active.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend();
|
28
app/components/org-item.js
Normal file
28
app/components/org-item.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['media', 'account'],
|
||||
tagName: 'li',
|
||||
classNameBindings: ['type', 'selected'],
|
||||
typeBinding: 'account.type',
|
||||
selectedBinding: 'account.selected',
|
||||
tokenIsVisible: false,
|
||||
|
||||
name: function() {
|
||||
return this.get('account.name') || this.get('account.login');
|
||||
}.property('account'),
|
||||
|
||||
avatarUrl: function() {
|
||||
return this.get('account.avatarUrl') || false;
|
||||
}.property('account'),
|
||||
|
||||
isUser: function() {
|
||||
return this.get('account.type') === 'user';
|
||||
}.property('account'),
|
||||
|
||||
actions: {
|
||||
tokenVisibility() {
|
||||
return this.toggleProperty('tokenIsVisible');
|
||||
}
|
||||
}
|
||||
});
|
17
app/components/orgs-filter.js
Normal file
17
app/components/orgs-filter.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
|
||||
classNames: ['organisation-filter'],
|
||||
actions: {
|
||||
toggleOrgFilter() {
|
||||
this.toggleProperty('showFilter');
|
||||
return false;
|
||||
},
|
||||
|
||||
select(org) {
|
||||
this.toggleProperty('showFilter');
|
||||
return this.sendAction('action', org);
|
||||
}
|
||||
}
|
||||
});
|
24
app/components/owner-repo-tile.js
Normal file
24
app/components/owner-repo-tile.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNames: ['owner-tile', 'row-li'],
|
||||
classNameBindings: ['repo.default_branch.last_build.state'],
|
||||
|
||||
ownerName: function() {
|
||||
return this.get('repo.slug').split(/\//)[0];
|
||||
}.property('repo.slug'),
|
||||
|
||||
repoName: function() {
|
||||
return this.get('repo.slug').split(/\//)[1];
|
||||
}.property('repo.slug'),
|
||||
|
||||
isAnimating: function() {
|
||||
var animationStates, state;
|
||||
state = this.get('repo.default_branch.last_build.state');
|
||||
animationStates = ['received', 'queued', 'started', 'booting'];
|
||||
if (animationStates.indexOf(state) !== -1) {
|
||||
return true;
|
||||
}
|
||||
}.property('repo.default_branch.last_build.state')
|
||||
});
|
4
app/components/owner-sync-button.js
Normal file
4
app/components/owner-sync-button.js
Normal file
|
@ -0,0 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import SyncButton from 'travis/components/sync-button';
|
||||
|
||||
export default SyncButton.extend();
|
17
app/components/popup-click-handler.js
Normal file
17
app/components/popup-click-handler.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
popup: Ember.inject.service(),
|
||||
classNames: ['application'],
|
||||
|
||||
click(event) {
|
||||
var targetAndParents = $(event.target).parents().andSelf();
|
||||
|
||||
if (!(targetAndParents.hasClass('open-popup') || targetAndParents.hasClass('popup'))) {
|
||||
this.get('popup').close();
|
||||
}
|
||||
if (!targetAndParents.hasClass('menu') && !targetAndParents.is('#tools > a')) {
|
||||
$('.menu').removeClass('display');
|
||||
}
|
||||
}
|
||||
});
|
6
app/components/profile-accounts-wrapper.js
Normal file
6
app/components/profile-accounts-wrapper.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['profile-orglist', 'columns', 'medium-4'],
|
||||
tagName: 'aside',
|
||||
});
|
18
app/components/queued-jobs.js
Normal file
18
app/components/queued-jobs.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
store: Ember.inject.service(),
|
||||
updateTimesService: Ember.inject.service('updateTimes'),
|
||||
|
||||
init() {
|
||||
this._super.apply(this, arguments);
|
||||
if (!Ember.testing) {
|
||||
return Visibility.every(config.intervals.updateTimes, this.updateTimes.bind(this));
|
||||
}
|
||||
},
|
||||
|
||||
updateTimes() {
|
||||
this.get('updateTimesService').push(this.get('jobs'));
|
||||
}
|
||||
});
|
27
app/components/remove-log-popup.js
Normal file
27
app/components/remove-log-popup.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
actions: {
|
||||
close() {
|
||||
$('.popup').removeClass('display');
|
||||
return false;
|
||||
},
|
||||
|
||||
removeLog() {
|
||||
var job = this.get('job');
|
||||
$('.popup').removeClass('display');
|
||||
|
||||
return job.removeLog().then(function() {
|
||||
return Travis.flash({ success: 'Log has been successfully removed.' });
|
||||
}, function(xhr) {
|
||||
if (xhr.status === 409) {
|
||||
return Travis.flash({ error: 'Log can\'t be removed' });
|
||||
} else if (xhr.status === 401) {
|
||||
return Travis.flash({ error: 'You don\'t have sufficient access to remove the log' });
|
||||
} else {
|
||||
return Travis.flash({ error: 'An error occured when removing the log' });
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
7
app/components/repo-actions.js
Normal file
7
app/components/repo-actions.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
|
||||
classNames: ['repo-main-tools']
|
||||
|
||||
});
|
74
app/components/repo-show-tabs.js
Normal file
74
app/components/repo-show-tabs.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'nav',
|
||||
classNames: ['tabnav'],
|
||||
ariaRole: 'tablist',
|
||||
|
||||
classCurrent: function() {
|
||||
if (this.get('tab') === 'current') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classBuilds: function() {
|
||||
if (this.get('tab') === 'builds') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classPullRequests: function() {
|
||||
if (this.get('tab') === 'pull_requests') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classBranches: function() {
|
||||
if (this.get('tab') === 'branches') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classBuild: function() {
|
||||
var classes, tab;
|
||||
tab = this.get('tab');
|
||||
classes = [];
|
||||
if (tab === 'build') {
|
||||
classes.push('active');
|
||||
}
|
||||
if (tab === 'build' || tab === 'job') {
|
||||
classes.push('display-inline');
|
||||
}
|
||||
return classes.join(' ');
|
||||
}.property('tab'),
|
||||
|
||||
classJob: function() {
|
||||
if (this.get('tab') === 'job') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classRequests: function() {
|
||||
if (this.get('tab') === 'requests') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classCaches: function() {
|
||||
if (this.get('tab') === 'caches') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classSettings: function() {
|
||||
if (this.get('tab') === 'settings') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classRequest: function() {
|
||||
if (this.get('tab') === 'request') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab')
|
||||
});
|
38
app/components/repo-show-tools.js
Normal file
38
app/components/repo-show-tools.js
Normal file
|
@ -0,0 +1,38 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
import { hasPermission, hasPushPermission } from 'travis/utils/permission';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
popup: Ember.inject.service(),
|
||||
classNames: ['option-button'],
|
||||
classNameBindings: ['isOpen:display'],
|
||||
isOpen: false,
|
||||
|
||||
click(event) {
|
||||
if ($(event.target).is('a') && $(event.target).parents('.settings-dropdown').length) {
|
||||
return this.closeMenu();
|
||||
}
|
||||
},
|
||||
|
||||
closeMenu() {
|
||||
return this.toggleProperty('isOpen');
|
||||
},
|
||||
|
||||
actions: {
|
||||
menu() {
|
||||
return this.toggleProperty('isOpen');
|
||||
}
|
||||
},
|
||||
displaySettingsLink: function() {
|
||||
return hasPushPermission(this.get('currentUser'), this.get('repo.id'));
|
||||
}.property('currentUser.pushPermissions.length', 'repo'),
|
||||
|
||||
displayCachesLink: function() {
|
||||
return hasPushPermission(this.get('currentUser'), this.get('repo.id')) && config.endpoints.caches;
|
||||
}.property('currentUser.pushPermissions.length', 'repo'),
|
||||
|
||||
displayStatusImages: function() {
|
||||
return hasPermission(this.get('currentUser'), this.get('repo.id'));
|
||||
}.property('currentUser.permissions.length', 'repo.id')
|
||||
|
||||
});
|
7
app/components/repo-wrapper.js
Normal file
7
app/components/repo-wrapper.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Polling from 'travis/mixins/polling';
|
||||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend(Polling, {
|
||||
pollModels: 'repo',
|
||||
classNameBindings: ['isLoading:loading']
|
||||
});
|
3
app/components/repos-empty.js
Normal file
3
app/components/repos-empty.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend();
|
27
app/components/repos-list-item.js
Normal file
27
app/components/repos-list-item.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
import Ember from 'ember';
|
||||
import Polling from 'travis/mixins/polling';
|
||||
import { colorForState } from 'travis/utils/helpers';
|
||||
|
||||
export default Ember.Component.extend(Polling, {
|
||||
routing: Ember.inject.service('-routing'),
|
||||
tagName: 'li',
|
||||
pollModels: 'repo',
|
||||
classNames: ['repo'],
|
||||
classNameBindings: ['selected'],
|
||||
|
||||
selected: function() {
|
||||
return this.get('repo') === this.get('selectedRepo');
|
||||
}.property('selectedRepo'),
|
||||
|
||||
color: function() {
|
||||
return colorForState(this.get('repo.lastBuildState'));
|
||||
}.property('repo.lastBuildState'),
|
||||
|
||||
scrollTop: function() {
|
||||
if (window.scrollY > 0) {
|
||||
return $('html, body').animate({
|
||||
scrollTop: 0
|
||||
}, 200);
|
||||
}
|
||||
}
|
||||
});
|
48
app/components/repos-list-tabs.js
Normal file
48
app/components/repos-list-tabs.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
auth: Ember.inject.service(),
|
||||
|
||||
currentUserBinding: 'auth.currentUser',
|
||||
|
||||
classRecent: function() {
|
||||
if (this.get('tab') === 'recent') {
|
||||
return 'active';
|
||||
} else if (this.get('tab') === 'search' && this.get('auth.signedIn')) {
|
||||
return 'hidden';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classRunning: function() {
|
||||
var classes;
|
||||
classes = [];
|
||||
if (this.get('tab') === 'running') {
|
||||
classes.push('active');
|
||||
}
|
||||
return classes.join(' ');
|
||||
}.property('tab'),
|
||||
|
||||
classOwned: function() {
|
||||
var classes;
|
||||
classes = [];
|
||||
if (this.get('tab') === 'owned') {
|
||||
classes.push('active');
|
||||
}
|
||||
if (this.get('currentUser')) {
|
||||
classes.push('display-inline');
|
||||
}
|
||||
return classes.join(' ');
|
||||
}.property('tab', 'currentUser'),
|
||||
|
||||
classSearch: function() {
|
||||
if (this.get('tab') === 'search') {
|
||||
return 'active';
|
||||
}
|
||||
}.property('tab'),
|
||||
|
||||
classNew: function() {
|
||||
if (this.get('currentUser')) {
|
||||
return 'display-inline';
|
||||
}
|
||||
}.property('currentUser')
|
||||
});
|
7
app/components/repos-list.js
Normal file
7
app/components/repos-list.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
var ReposListComponent = Ember.Component.extend({
|
||||
tagName: 'ul'
|
||||
});
|
||||
|
||||
export default ReposListComponent;
|
25
app/components/request-icon.js
Normal file
25
app/components/request-icon.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'span',
|
||||
classNames: ['request-icon', 'icon'],
|
||||
classNameBindings: ['event', 'state'],
|
||||
|
||||
isPush: function() {
|
||||
return this.get('event') === 'push';
|
||||
}.property('event'),
|
||||
|
||||
isPR: function() {
|
||||
return this.get('event') === 'pull_request';
|
||||
}.property('event'),
|
||||
|
||||
isAPI: function() {
|
||||
return this.get('event') === 'api';
|
||||
}.property('event'),
|
||||
|
||||
isEmpty: function() {
|
||||
if (this.get('event') === null || this.get('event') === null) {
|
||||
return true;
|
||||
}
|
||||
}.property('event')
|
||||
});
|
57
app/components/requests-item.js
Normal file
57
app/components/requests-item.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['request-item'],
|
||||
classNameBindings: ['requestClass'],
|
||||
tagName: 'li',
|
||||
|
||||
isGHPages: function() {
|
||||
var message = this.get('request.message');
|
||||
if (message === 'github pages branch') {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}.property('request.message'),
|
||||
|
||||
requestClass: function() {
|
||||
if (this.get('request.isAccepted')) {
|
||||
return 'accepted';
|
||||
} else {
|
||||
return 'rejected';
|
||||
}
|
||||
}.property('content.isAccepted'),
|
||||
|
||||
type: function() {
|
||||
if (this.get('request.isPullRequest')) {
|
||||
return 'pull_request';
|
||||
} else {
|
||||
return 'push';
|
||||
}
|
||||
}.property('request.isPullRequest'),
|
||||
|
||||
status: function() {
|
||||
if (this.get('request.isAccepted')) {
|
||||
return 'Accepted';
|
||||
} else {
|
||||
return 'Rejected';
|
||||
}
|
||||
}.property('request.isAccepted'),
|
||||
|
||||
hasBranchName: function() {
|
||||
return this.get('request.branchName');
|
||||
}.property('request'),
|
||||
|
||||
message: function() {
|
||||
var message;
|
||||
message = this.get('request.message');
|
||||
if (config.pro && message === "private repository") {
|
||||
return '';
|
||||
} else if (!message) {
|
||||
return 'Build created successfully ';
|
||||
} else {
|
||||
return message;
|
||||
}
|
||||
}.property('request.message')
|
||||
});
|
6
app/components/running-jobs-item.js
Normal file
6
app/components/running-jobs-item.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import Ember from 'ember';
|
||||
import Polling from 'travis/mixins/polling';
|
||||
|
||||
export default Ember.Component.extend(Polling, {
|
||||
pollModels: 'job'
|
||||
});
|
23
app/components/running-jobs.js
Normal file
23
app/components/running-jobs.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
import Ember from 'ember';
|
||||
import Polling from 'travis/mixins/polling';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend(Polling, {
|
||||
store: Ember.inject.service(),
|
||||
updateTimesService: Ember.inject.service('updateTimes'),
|
||||
|
||||
pollHook(store) {
|
||||
return this.get('store').find('job', {});
|
||||
},
|
||||
|
||||
init() {
|
||||
this._super.apply(this, arguments);
|
||||
if (!Ember.testing) {
|
||||
return Visibility.every(config.intervals.updateTimes, this.updateTimes.bind(this));
|
||||
}
|
||||
},
|
||||
|
||||
updateTimes() {
|
||||
this.get('updateTimesService').push(this.get('jobs'));
|
||||
}
|
||||
});
|
26
app/components/settings-switch.js
Normal file
26
app/components/settings-switch.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'a',
|
||||
classNames: ['switch'],
|
||||
classNameBindings: ['active'],
|
||||
|
||||
click() {
|
||||
var setting;
|
||||
if (this.get('isSaving')) {
|
||||
return;
|
||||
}
|
||||
this.set('isSaving', true);
|
||||
this.toggleProperty('active');
|
||||
setting = {};
|
||||
setting[this.get('key')] = this.get('active');
|
||||
return this.get('repo').saveSettings(setting).then(() => {
|
||||
return this.set('isSaving', false);
|
||||
}, () => {
|
||||
this.set('isSaving', false);
|
||||
return Travis.flash({
|
||||
error: 'There was an error while saving settings. Please try again.'
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
22
app/components/show-more-button.js
Normal file
22
app/components/show-more-button.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'button',
|
||||
classNames: ['showmore-button'],
|
||||
classNameBindings: ['isLoading', 'showMore'],
|
||||
showMore: true,
|
||||
attributeBindings: ['disabled'],
|
||||
disabledBinding: 'isLoading',
|
||||
|
||||
buttonLabel: function() {
|
||||
if (this.get('isLoading')) {
|
||||
return 'Loading';
|
||||
} else {
|
||||
return 'Show more';
|
||||
}
|
||||
}.property('isLoading'),
|
||||
|
||||
click() {
|
||||
return this.attrs.showMore();
|
||||
}
|
||||
});
|
22
app/components/ssh-key.js
Normal file
22
app/components/ssh-key.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['settings-sshkey'],
|
||||
isDeleting: false,
|
||||
actions: {
|
||||
"delete": function() {
|
||||
var deletingDone;
|
||||
if (this.get('isDeleting')) {
|
||||
return;
|
||||
}
|
||||
this.set('isDeleting', true);
|
||||
deletingDone = () => {
|
||||
return this.set('isDeleting', false);
|
||||
};
|
||||
this.get('key').deleteRecord();
|
||||
return this.get('key').save().then(deletingDone, deletingDone).then(() => {
|
||||
return this.sendAction('sshKeyDeleted');
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
44
app/components/status-icon.js
Normal file
44
app/components/status-icon.js
Normal file
|
@ -0,0 +1,44 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'span',
|
||||
classNames: ['status-icon', 'icon'],
|
||||
classNameBindings: ['status'],
|
||||
attributeBindings: ['label:aria-label', 'label:title'],
|
||||
|
||||
label: function() {
|
||||
return 'Job ' + this.get('status');
|
||||
}.property('status'),
|
||||
|
||||
hasPassed: function() {
|
||||
return this.get('status') === 'passed' || this.get('status') === 'accepted';
|
||||
}.property('status'),
|
||||
|
||||
hasFailed: function() {
|
||||
return this.get('status') === 'failed' || this.get('status') === 'rejected';
|
||||
}.property('status'),
|
||||
|
||||
hasErrored: function() {
|
||||
return this.get('status') === 'errored';
|
||||
}.property('status'),
|
||||
|
||||
wasCanceled: function() {
|
||||
return this.get('status') === 'canceled';
|
||||
}.property('status'),
|
||||
|
||||
isRunning: function() {
|
||||
return this.get('status') === 'started' || this.get('status') === 'queued' || this.get('status') === 'booting' || this.get('status') === 'received' || this.get('status') === 'created';
|
||||
}.property('status'),
|
||||
|
||||
isEmpty: function() {
|
||||
if (!this.get('status')) {
|
||||
return true;
|
||||
} else {
|
||||
if (this.get('status') === '') {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}.property('status')
|
||||
});
|
7
app/components/status-image-input.js
Normal file
7
app/components/status-image-input.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.TextArea.extend({
|
||||
click() {
|
||||
this.get('element').select();
|
||||
}
|
||||
});
|
61
app/components/status-images.js
Normal file
61
app/components/status-images.js
Normal file
|
@ -0,0 +1,61 @@
|
|||
import Ember from 'ember';
|
||||
import { format as formatStatusImage } from 'travis/utils/status-image-formats';
|
||||
import Config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
popup: Ember.inject.service(),
|
||||
auth: Ember.inject.service(),
|
||||
popupNameBinding: 'popup.popupName',
|
||||
|
||||
id: 'status-images',
|
||||
attributeBindings: ['id'],
|
||||
classNames: ['popup', 'status-images'],
|
||||
formats: ['Image URL', 'Markdown', 'Textile', 'Rdoc', 'AsciiDoc', 'RST', 'Pod', 'CCTray'],
|
||||
|
||||
branches: function() {
|
||||
let repoId = this.get('repo.id'),
|
||||
popupName = this.get('popupName');
|
||||
|
||||
if(popupName === 'status-images') {
|
||||
let array = Ember.ArrayProxy.create({ content: [] }),
|
||||
apiEndpoint = Config.apiEndpoint,
|
||||
options = {};
|
||||
|
||||
array.set('isLoaded', false);
|
||||
|
||||
if (this.get('auth.signedIn')) {
|
||||
options.headers = {
|
||||
Authorization: "token " + (this.auth.token())
|
||||
};
|
||||
}
|
||||
|
||||
$.ajax(apiEndpoint + "/v3/repo/" + repoId + "/branches?limit=100", options).then(function(response) {
|
||||
if(response.branches.length) {
|
||||
array.pushObjects(response.branches.map((branch) => { return branch.name; }));
|
||||
} else {
|
||||
array.pushObject('master');
|
||||
}
|
||||
|
||||
array.set('isLoaded', true);
|
||||
});
|
||||
|
||||
return array;
|
||||
} else {
|
||||
// if status images popup is not open, don't fetch any branches
|
||||
return [];
|
||||
}
|
||||
}.property('popupName', 'repo'),
|
||||
|
||||
actions: {
|
||||
close() {
|
||||
return this.get('popup').close();
|
||||
}
|
||||
},
|
||||
|
||||
statusString: function() {
|
||||
let format = this.get('format') || this.get('formats.firstObject'),
|
||||
branch = this.get('branch') || 'master';
|
||||
|
||||
return formatStatusImage(format, this.get('repo.slug'), branch);
|
||||
}.property('format', 'repo.slug', 'branch')
|
||||
});
|
6
app/components/subscribe-button.js
Normal file
6
app/components/subscribe-button.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['cta-btn']
|
||||
});
|
10
app/components/sync-button.js
Normal file
10
app/components/sync-button.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ["sync-button"],
|
||||
actions: {
|
||||
sync() {
|
||||
return this.get('user').sync();
|
||||
}
|
||||
}
|
||||
});
|
6
app/components/team-member.js
Normal file
6
app/components/team-member.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNames: ['team-member']
|
||||
});
|
3
app/components/travis-layout.js
Normal file
3
app/components/travis-layout.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({});
|
26
app/components/travis-status.js
Normal file
26
app/components/travis-status.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
status: null,
|
||||
|
||||
statusPageStatusUrl: function() {
|
||||
return config.statusPageStatusUrl;
|
||||
}.property(),
|
||||
|
||||
didInsertElement() {
|
||||
var self, url;
|
||||
if (url = this.get('statusPageStatusUrl')) {
|
||||
self = this;
|
||||
return this.getStatus(url).then(function(response) {
|
||||
if (response.status && response.status.indicator) {
|
||||
return self.set('status', response.status.indicator);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
getStatus(url) {
|
||||
return $.ajax(url);
|
||||
}
|
||||
});
|
26
app/components/travis-switch.js
Normal file
26
app/components/travis-switch.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
tagName: 'a',
|
||||
classNames: ['travis-switch', 'switch'],
|
||||
classNameBindings: ['_active:active'],
|
||||
|
||||
_active: function() {
|
||||
return this.get('target.active') || this.get('active');
|
||||
}.property('target.active', 'active'),
|
||||
|
||||
click() {
|
||||
var target;
|
||||
target = this.get('target');
|
||||
if (this.get('toggleAutomatically') !== 'false') {
|
||||
if (target) {
|
||||
this.set('target.active', !this.get('target.active'));
|
||||
} else {
|
||||
this.set('active', !this.get('active'));
|
||||
}
|
||||
}
|
||||
return Ember.run.next(this, function() {
|
||||
return this.sendAction('action', target);
|
||||
});
|
||||
}
|
||||
});
|
21
app/components/user-avatar.js
Normal file
21
app/components/user-avatar.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Component.extend({
|
||||
|
||||
tagName: 'span',
|
||||
classNameBindings: ['small:avatar--small:avatar'],
|
||||
|
||||
userInitials: function() {
|
||||
var name = this.get('name');
|
||||
var arr = name.split(' ');
|
||||
var initials = '';
|
||||
|
||||
if (arr.length >= 2) {
|
||||
initials = arr[0].split('')[0] + arr[1].split('')[0];
|
||||
} else {
|
||||
initials = arr[0].split('')[0];
|
||||
}
|
||||
return initials;
|
||||
}.property('userInitials')
|
||||
|
||||
});
|
85
app/controllers/account.js
Normal file
85
app/controllers/account.js
Normal file
|
@ -0,0 +1,85 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
allHooks: [],
|
||||
userBinding: 'auth.currentUser',
|
||||
|
||||
init() {
|
||||
var self;
|
||||
this._super.apply(this, arguments);
|
||||
self = this;
|
||||
return Travis.on("user:synced", (function() {
|
||||
return self.reloadHooks();
|
||||
}));
|
||||
},
|
||||
|
||||
actions: {
|
||||
sync() {
|
||||
return this.get('user').sync();
|
||||
},
|
||||
|
||||
toggle(hook) {
|
||||
return hook.toggle();
|
||||
}
|
||||
},
|
||||
|
||||
reloadHooks() {
|
||||
var hooks, login;
|
||||
if (login = this.get('model.login')) {
|
||||
hooks = this.store.query('hook', {
|
||||
all: true,
|
||||
owner_name: login
|
||||
});
|
||||
hooks.then(function() {
|
||||
return hooks.set('isLoaded', true);
|
||||
});
|
||||
return this.set('allHooks', hooks);
|
||||
}
|
||||
},
|
||||
|
||||
accountName: function() {
|
||||
return this.get('model.name') || this.get('model.login');
|
||||
}.property('model.name', 'model.login'),
|
||||
|
||||
hooks: function() {
|
||||
var hooks;
|
||||
if (!(hooks = this.get('allHooks'))) {
|
||||
this.reloadHooks();
|
||||
}
|
||||
return this.get('allHooks').filter(function(hook) {
|
||||
return hook.get('admin');
|
||||
});
|
||||
}.property('allHooks.length', 'allHooks'),
|
||||
|
||||
hooksWithoutAdmin: function() {
|
||||
var hooks;
|
||||
if (!(hooks = this.get('allHooks'))) {
|
||||
this.reloadHooks();
|
||||
}
|
||||
return this.get('allHooks').filter(function(hook) {
|
||||
return !hook.get('admin');
|
||||
});
|
||||
}.property('allHooks.length', 'allHooks'),
|
||||
|
||||
showPrivateReposHint: function() {
|
||||
return this.config.show_repos_hint === 'private';
|
||||
}.property(),
|
||||
|
||||
showPublicReposHint: function() {
|
||||
return this.config.show_repos_hint === 'public';
|
||||
}.property(),
|
||||
|
||||
billingUrl: function() {
|
||||
var id;
|
||||
id = this.get('model.type') === 'user' ? 'user' : this.get('model.login');
|
||||
return this.config.billingEndpoint + "/subscriptions/" + id;
|
||||
}.property('model.name', 'model.login'),
|
||||
|
||||
subscribeButtonInfo: function() {
|
||||
return {
|
||||
billingUrl: this.get('billingUrl'),
|
||||
subscribed: this.get('model.subscribed'),
|
||||
education: this.get('model.education')
|
||||
};
|
||||
}.property('model.login', 'model.type')
|
||||
});
|
3
app/controllers/accounts.js
Normal file
3
app/controllers/accounts.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend();
|
6
app/controllers/accounts/info.js
Normal file
6
app/controllers/accounts/info.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
repos: Ember.inject.controller(),
|
||||
userBinding: 'auth.currentUser'
|
||||
});
|
3
app/controllers/auth.js
Normal file
3
app/controllers/auth.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend();
|
37
app/controllers/branches.js
Normal file
37
app/controllers/branches.js
Normal file
|
@ -0,0 +1,37 @@
|
|||
import Ember from 'ember';
|
||||
import GithubUrlProperties from 'travis/mixins/github-url-properties';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
defaultBranch: function() {
|
||||
var output, repos;
|
||||
repos = this.get('model');
|
||||
output = repos.filter(function(item, index) {
|
||||
return item.default_branch;
|
||||
});
|
||||
if (output.length) {
|
||||
return output[0];
|
||||
}
|
||||
}.property('model'),
|
||||
|
||||
branchesExist: function() {
|
||||
var branches = this.get('model');
|
||||
|
||||
return branches.length;
|
||||
}.property('model'),
|
||||
|
||||
activeBranches: function() {
|
||||
var repos;
|
||||
repos = this.get('model');
|
||||
return repos = repos.filter(function(item, index) {
|
||||
return item.exists_on_github && !item.default_branch;
|
||||
}).sortBy('last_build.finished_at').reverse();
|
||||
}.property('model'),
|
||||
|
||||
inactiveBranches: function() {
|
||||
var repos;
|
||||
repos = this.get('model');
|
||||
return repos = repos.filter(function(item, index) {
|
||||
return !item.exists_on_github && !item.default_branch;
|
||||
}).sortBy('last_build.finished_at').reverse();
|
||||
}.property('model')
|
||||
});
|
29
app/controllers/build.js
Normal file
29
app/controllers/build.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
import Ember from 'ember';
|
||||
import GithubUrlProperties from 'travis/mixins/github-url-properties';
|
||||
|
||||
export default Ember.Controller.extend(GithubUrlProperties, {
|
||||
repoController: Ember.inject.controller('repo'),
|
||||
repoBinding: 'repoController.repo',
|
||||
commitBinding: 'build.commit',
|
||||
currentUserBinding: 'auth.currentUser',
|
||||
tabBinding: 'repoController.tab',
|
||||
sendFaviconStateChanges: true,
|
||||
currentItemBinding: 'build',
|
||||
|
||||
jobsLoaded: function() {
|
||||
var jobs;
|
||||
if (jobs = this.get('build.jobs')) {
|
||||
return jobs.isEvery('config');
|
||||
}
|
||||
}.property('build.jobs.@each.config'),
|
||||
|
||||
loading: function() {
|
||||
return this.get('build.isLoading');
|
||||
}.property('build.isLoading'),
|
||||
|
||||
buildStateDidChange: function() {
|
||||
if (this.get('sendFaviconStateChanges')) {
|
||||
return this.send('faviconStateDidChange', this.get('build.state'));
|
||||
}
|
||||
}.observes('build.state')
|
||||
});
|
59
app/controllers/builds.js
Normal file
59
app/controllers/builds.js
Normal file
|
@ -0,0 +1,59 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
buildsSorting: ['number:desc'],
|
||||
builds: Ember.computed.sort('model', 'buildsSorting'),
|
||||
repoController: Ember.inject.controller('repo'),
|
||||
repoBinding: 'repoController.repo',
|
||||
tabBinding: 'repoController.tab',
|
||||
isLoadedBinding: 'model.isLoaded',
|
||||
isLoadingBinding: 'model.isLoading',
|
||||
|
||||
showMore() {
|
||||
var id, number, type;
|
||||
id = this.get('repo.id');
|
||||
number = this.get('builds.lastObject.number');
|
||||
type = this.get('tab') === "builds" ? 'push' : 'pull_request';
|
||||
this.olderThanNumber(id, number, type);
|
||||
},
|
||||
|
||||
displayShowMoreButton: function() {
|
||||
return this.get('tab') !== 'branches' && parseInt(this.get('builds.lastObject.number')) > 1;
|
||||
}.property('tab', 'builds.lastObject.number'),
|
||||
|
||||
displayPullRequests: function() {
|
||||
return this.get('tab') === 'pull_requests';
|
||||
}.property('tab'),
|
||||
|
||||
displayBranches: function() {
|
||||
return this.get('tab') === 'branches';
|
||||
}.property('tab'),
|
||||
|
||||
noticeData: function() {
|
||||
return {
|
||||
repo: this.get('repo'),
|
||||
auth: this.auth.token()
|
||||
};
|
||||
}.property('repo'),
|
||||
|
||||
olderThanNumber(id, number, type) {
|
||||
var options;
|
||||
options = {
|
||||
repository_id: id,
|
||||
after_number: number
|
||||
};
|
||||
if (type != null) {
|
||||
options.event_type = type.replace(/s$/, '');
|
||||
if (options.event_type === 'push') {
|
||||
options.event_type = ['push', 'api'];
|
||||
}
|
||||
}
|
||||
return this.store.query('build', options);
|
||||
},
|
||||
|
||||
actions: {
|
||||
showMoreBuilds() {
|
||||
return this.showMore();
|
||||
}
|
||||
}
|
||||
});
|
31
app/controllers/caches.js
Normal file
31
app/controllers/caches.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
ajax: Ember.inject.service(),
|
||||
repoController: Ember.inject.controller('repo'),
|
||||
repo: Ember.computed.alias('repoController.repo'),
|
||||
isDeleting: false,
|
||||
|
||||
cachesExist: function() {
|
||||
return this.get('model.pushes.length') || this.get('model.pullRequests.length');
|
||||
}.property('model.pushes.length', 'model.pullRequests.length'),
|
||||
|
||||
actions: {
|
||||
deleteRepoCache() {
|
||||
var deletingDone, repo;
|
||||
if (this.get('isDeleting')) {
|
||||
return;
|
||||
}
|
||||
if (confirm('Are you sure?')) {
|
||||
this.set('isDeleting', true);
|
||||
deletingDone = () => {
|
||||
return this.set('isDeleting', false);
|
||||
};
|
||||
repo = this.get('repo');
|
||||
return this.get('ajax').ajax("/repos/" + (this.get('repo.id')) + "/caches", "DELETE").then(deletingDone, deletingDone).then(() => {
|
||||
return this.set('model', {});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
18
app/controllers/current-user.js
Normal file
18
app/controllers/current-user.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
sync() {
|
||||
return this.get('model').sync();
|
||||
},
|
||||
|
||||
model: Ember.computed.alias('auth.currentUser'),
|
||||
|
||||
syncingDidChange: function() {
|
||||
var user;
|
||||
if ((user = this.get('model')) && user.get('isSyncing') && !user.get('syncedAt')) {
|
||||
return Ember.run.scheduleOnce('routerTransitions', this, function() {
|
||||
return Ember.getOwner(this).lookup('router:main').send('renderFirstSync');
|
||||
});
|
||||
}
|
||||
}.observes('isSyncing', 'auth.currentUser')
|
||||
});
|
82
app/controllers/dashboard/repositories.js
Normal file
82
app/controllers/dashboard/repositories.js
Normal file
|
@ -0,0 +1,82 @@
|
|||
import Ember from 'ember';
|
||||
import config from 'travis/config/environment';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
queryParams: ['org'],
|
||||
filter: null,
|
||||
org: null,
|
||||
|
||||
filteredRepositories: function() {
|
||||
var filter, org, repos;
|
||||
filter = this.get('filter');
|
||||
repos = this.get('model');
|
||||
org = this.get('org');
|
||||
repos = repos.filter(function(item, index) {
|
||||
if (item.get('default_branch')) {
|
||||
return item.get('default_branch.last_build') !== null;
|
||||
}
|
||||
}).sortBy('default_branch.last_build.finished_at').reverse();
|
||||
if (org) {
|
||||
repos = repos.filter(function(item, index) {
|
||||
return item.get('owner.login') === org;
|
||||
});
|
||||
}
|
||||
if (Ember.isBlank(filter)) {
|
||||
return repos;
|
||||
} else {
|
||||
return repos.filter(function(item, index) {
|
||||
return item.slug.match(new RegExp(filter));
|
||||
});
|
||||
}
|
||||
}.property('filter', 'model', 'org'),
|
||||
|
||||
updateFilter() {
|
||||
var value;
|
||||
value = this.get('_lastFilterValue');
|
||||
this.transitionToRoute({
|
||||
queryParams: {
|
||||
filter: value
|
||||
}
|
||||
});
|
||||
return this.set('filter', value);
|
||||
},
|
||||
|
||||
selectedOrg: function() {
|
||||
return this.get('orgs').findBy('login', this.get('org'));
|
||||
}.property('org', 'orgs.[]'),
|
||||
|
||||
orgs: function() {
|
||||
var apiEndpoint, orgs;
|
||||
orgs = Ember.ArrayProxy.create({
|
||||
content: [],
|
||||
isLoading: true
|
||||
});
|
||||
apiEndpoint = config.apiEndpoint;
|
||||
$.ajax(apiEndpoint + '/v3/orgs', {
|
||||
headers: {
|
||||
Authorization: 'token ' + this.auth.token()
|
||||
}
|
||||
}).then(function(response) {
|
||||
var array;
|
||||
array = response.organizations.map(function(org) {
|
||||
return Ember.Object.create(org);
|
||||
});
|
||||
orgs.set('content', array);
|
||||
return orgs.set('isLoading', false);
|
||||
});
|
||||
return orgs;
|
||||
}.property(),
|
||||
|
||||
actions: {
|
||||
updateFilter(value) {
|
||||
this.set('_lastFilterValue', value);
|
||||
return Ember.run.throttle(this, this.updateFilter, [], 200, false);
|
||||
},
|
||||
|
||||
selectOrg(org) {
|
||||
var login;
|
||||
login = org ? org.get('login') : null;
|
||||
return this.set('org', login);
|
||||
}
|
||||
}
|
||||
});
|
15
app/controllers/error.js
Normal file
15
app/controllers/error.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
layoutName: Ember.computed({
|
||||
get(key) {
|
||||
if(this._layoutName) {
|
||||
return 'layouts/' + this._layoutName;
|
||||
}
|
||||
},
|
||||
|
||||
set(key, value) {
|
||||
return this._layoutName = value;
|
||||
}
|
||||
})
|
||||
});
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user