Compare commits
1072 Commits
v0.4.0-bet
...
v0.6.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa0a3f099f | ||
|
|
22087fddc3 | ||
|
|
db59150d74 | ||
|
|
8b8db54309 | ||
|
|
5b019b1c04 | ||
|
|
1811dc73b7 | ||
|
|
29a555f475 | ||
|
|
2d757e9a95 | ||
|
|
691988c885 | ||
|
|
2713434084 | ||
|
|
f18accd9c4 | ||
|
|
2d95d29c63 | ||
|
|
58a5a73124 | ||
|
|
cc4439517d | ||
|
|
f357d9ebd0 | ||
|
|
b4984d6e73 | ||
|
|
db4b9a3d97 | ||
|
|
d9478518fe | ||
|
|
dfd2e09136 | ||
|
|
a5e23ead24 | ||
|
|
f3efc9d95a | ||
|
|
53cf93cb8e | ||
|
|
587483df19 | ||
|
|
7e7dfa3b0b | ||
|
|
cdb41f4376 | ||
|
|
ec2f9ad431 | ||
|
|
319b13fbf9 | ||
|
|
e577fbca20 | ||
|
|
5eadc789fe | ||
|
|
86431ec3dc | ||
|
|
2eb39d43fc | ||
|
|
f645f73993 | ||
|
|
e3201ee21a | ||
|
|
37ee10121b | ||
|
|
aecd402628 | ||
|
|
bf28b32684 | ||
|
|
1accc9f11e | ||
|
|
0297c6384c | ||
|
|
f86d060028 | ||
|
|
fe59f0f976 | ||
|
|
7f22f82b63 | ||
|
|
78955c54ae | ||
|
|
5aabac0554 | ||
|
|
492afaa11e | ||
|
|
17fb44f248 | ||
|
|
3e5bea372d | ||
|
|
0262902164 | ||
|
|
31e2edabb8 | ||
|
|
ba55adde4f | ||
|
|
1c62be7b31 | ||
|
|
8adad1457a | ||
|
|
5423894175 | ||
|
|
dfc8b15ab2 | ||
|
|
3950beaaad | ||
|
|
b16cfbf662 | ||
|
|
dd841b5e1a | ||
|
|
ec9b1b992a | ||
|
|
8fd36933ce | ||
|
|
caab88ed19 | ||
|
|
e2ad6739f1 | ||
|
|
fcd831a010 | ||
|
|
85ba0c524f | ||
|
|
6de2614f05 | ||
|
|
6782641c28 | ||
|
|
ffa9716722 | ||
|
|
690db724b3 | ||
|
|
ca66afd841 | ||
|
|
4739681929 | ||
|
|
002f956861 | ||
|
|
e567c91c25 | ||
|
|
fd586db444 | ||
|
|
9c157a7112 | ||
|
|
68efe83fdf | ||
|
|
78780ff44b | ||
|
|
e33faa594d | ||
|
|
8688b05474 | ||
|
|
57dd1a7b40 | ||
|
|
47e3aad1b7 | ||
|
|
c118de2165 | ||
|
|
99fd3c9945 | ||
|
|
4d4c2257a0 | ||
|
|
a181ffdd41 | ||
|
|
a57a5350bc | ||
|
|
057c0875ba | ||
|
|
230756112b | ||
|
|
13295c7f8c | ||
|
|
f9fff3a165 | ||
|
|
a410aca159 | ||
|
|
81510ce1e0 | ||
|
|
5d2d114c78 | ||
|
|
865d961436 | ||
|
|
930845abfa | ||
|
|
0190a51546 | ||
|
|
9a21f5ee66 | ||
|
|
1c1b1f1f6d | ||
|
|
fbcc2a4934 | ||
|
|
83b8488b05 | ||
|
|
65fdb98302 | ||
|
|
3079a028f0 | ||
|
|
5231b5e553 | ||
|
|
9908a5daf1 | ||
|
|
d44b1615cc | ||
|
|
f6d0a3f2e7 | ||
|
|
cc1dcafa88 | ||
|
|
a530cd0e32 | ||
|
|
d655625ec1 | ||
|
|
05102aa1dc | ||
|
|
4db30397a2 | ||
|
|
9e883774b6 | ||
|
|
3a6a9fbf35 | ||
|
|
49c57fc2d3 | ||
|
|
b3b6c181a0 | ||
|
|
ca5a1bcdda | ||
|
|
990be95e71 | ||
|
|
bbd7fd8535 | ||
|
|
05576abd27 | ||
|
|
f2b0123f75 | ||
|
|
af3d51c72d | ||
|
|
d3fa32c355 | ||
|
|
0c78f272b7 | ||
|
|
4d91559b82 | ||
|
|
b375cd7acc | ||
|
|
44db4bb40e | ||
|
|
0435377dca | ||
|
|
223de1e54f | ||
|
|
2c1293be81 | ||
|
|
9516c7578b | ||
|
|
7e8f4c83b3 | ||
|
|
ed4d495f5a | ||
|
|
942310b093 | ||
|
|
10bda90afb | ||
|
|
ef49c5f4c3 | ||
|
|
4db2fbde67 | ||
|
|
fa3e090cd9 | ||
|
|
9c71c71168 | ||
|
|
76d67e50d5 | ||
|
|
348170fe1e | ||
|
|
a8472c650a | ||
|
|
54d5f5ca58 | ||
|
|
f1c6a712d7 | ||
|
|
d730d9c8c0 | ||
|
|
7f7ee53cd3 | ||
|
|
cf0d2dc28c | ||
|
|
50f868b148 | ||
|
|
bc390263ab | ||
|
|
d73a799593 | ||
|
|
9f60c3545a | ||
|
|
7ea0f70fe8 | ||
|
|
ebaf98015a | ||
|
|
ed4b7c5475 | ||
|
|
b0eaae6705 | ||
|
|
cab46164ff | ||
|
|
0aed61868f | ||
|
|
d9305fc347 | ||
|
|
8cdfcd7293 | ||
|
|
0258b74b42 | ||
|
|
6fb960c255 | ||
|
|
6af28f1b79 | ||
|
|
bcc48d08c8 | ||
|
|
d9844c7f4f | ||
|
|
8c00ec67a8 | ||
|
|
5c73f74355 | ||
|
|
4974c02e3e | ||
|
|
35a24427d8 | ||
|
|
200e1867a2 | ||
|
|
2b16057006 | ||
|
|
665886fa96 | ||
|
|
693ae495d7 | ||
|
|
c1f098ec54 | ||
|
|
6718a7bde4 | ||
|
|
a680fc1e1c | ||
|
|
73bc59a2bc | ||
|
|
022ff0f425 | ||
|
|
3443969d7a | ||
|
|
147d1abac4 | ||
|
|
c6c15855f8 | ||
|
|
0e528dfd66 | ||
|
|
f20edf35fe | ||
|
|
f558978af0 | ||
|
|
51811083cc | ||
|
|
af41532044 | ||
|
|
ed3a92572f | ||
|
|
4f54c4365d | ||
|
|
3ebe794930 | ||
|
|
f6e3722cd3 | ||
|
|
efaed4140d | ||
|
|
f9b40a05e4 | ||
|
|
bc33a71f0d | ||
|
|
5e0eff5407 | ||
|
|
957eb271ca | ||
|
|
0cb8c75744 | ||
|
|
5d72750d92 | ||
|
|
d2cd6341bd | ||
|
|
d5212ec6dd | ||
|
|
29f6ae477b | ||
|
|
27837cc635 | ||
|
|
9ee2c92a9d | ||
|
|
7a77c04caf | ||
|
|
1b4cf508e6 | ||
|
|
6c1fe18f92 | ||
|
|
8532db96e3 | ||
|
|
fe7ccac9ed | ||
|
|
8615fe1a40 | ||
|
|
ef1eb0bff2 | ||
|
|
094556a4f1 | ||
|
|
aa725eee62 | ||
|
|
c0cce67d40 | ||
|
|
195d63073e | ||
|
|
ed38e70989 | ||
|
|
ed3991b7bd | ||
|
|
a842fd6d26 | ||
|
|
ed5f52a164 | ||
|
|
42f72f33d9 | ||
|
|
e00eeb6ef9 | ||
|
|
fd2dfbf056 | ||
|
|
d6e3ab3c26 | ||
|
|
e1824a3d85 | ||
|
|
076fc1a876 | ||
|
|
7009d2d6f4 | ||
|
|
33953affa6 | ||
|
|
706a1b8e96 | ||
|
|
d46a7ffe69 | ||
|
|
2852510b55 | ||
|
|
e2be00a18d | ||
|
|
9149a01949 | ||
|
|
e3c8072f77 | ||
|
|
aae6b162c6 | ||
|
|
0132dae215 | ||
|
|
2b65ff9fb0 | ||
|
|
36b013029a | ||
|
|
5c7ee5c920 | ||
|
|
58cf153aa8 | ||
|
|
91e4eb95b3 | ||
|
|
3b6aaa6c05 | ||
|
|
116c563197 | ||
|
|
4dec2ef1f6 | ||
|
|
cc343e8eb0 | ||
|
|
f6ce5e109c | ||
|
|
8eafe4533a | ||
|
|
ab32b11362 | ||
|
|
29f9dc547d | ||
|
|
33ca8a1827 | ||
|
|
3941849b07 | ||
|
|
206eef9c29 | ||
|
|
07e81f363b | ||
|
|
093d330213 | ||
|
|
b4549ca298 | ||
|
|
c301447363 | ||
|
|
6e4f8ca8ea | ||
|
|
b72d1c82a9 | ||
|
|
7cd8bca9dc | ||
|
|
7f3ac6249c | ||
|
|
3a6abcfb54 | ||
|
|
892580c207 | ||
|
|
2c826a26fa | ||
|
|
eb8fcc3849 | ||
|
|
3c8009cb2f | ||
|
|
a385fcaed2 | ||
|
|
98a9f10548 | ||
|
|
6bdb0435c2 | ||
|
|
4394540b5c | ||
|
|
60b7016622 | ||
|
|
eef033a397 | ||
|
|
c5d50279c0 | ||
|
|
3156f69717 | ||
|
|
791bd9417d | ||
|
|
944780f74b | ||
|
|
91129c80b0 | ||
|
|
ee93d64fd0 | ||
|
|
4481fc1ace | ||
|
|
d11917e4ff | ||
|
|
ee20841ad6 | ||
|
|
e5d3c16a80 | ||
|
|
f01cd506f7 | ||
|
|
ab73f58fd8 | ||
|
|
eb0cd9685d | ||
|
|
4eca322ca2 | ||
|
|
77cba48058 | ||
|
|
01bfb44a52 | ||
|
|
567f9c7068 | ||
|
|
d8e8b485b5 | ||
|
|
f4f639833e | ||
|
|
806cb6d450 | ||
|
|
11f7944fa6 | ||
|
|
5d668097a6 | ||
|
|
28e3a363e3 | ||
|
|
e8d0c1dde2 | ||
|
|
8a3e9bc9ef | ||
|
|
c66143dc9d | ||
|
|
73c20dbb77 | ||
|
|
7c0a1488a6 | ||
|
|
0562af094a | ||
|
|
2f8b955241 | ||
|
|
51c4c54a2d | ||
|
|
a16eb3946d | ||
|
|
1ed8a57713 | ||
|
|
492cd0a277 | ||
|
|
239c1ff46e | ||
|
|
4424f6702c | ||
|
|
c952303049 | ||
|
|
8da2893721 | ||
|
|
38aa576e18 | ||
|
|
8f280ad527 | ||
|
|
227456d1a6 | ||
|
|
ee9c874d6d | ||
|
|
81908e984b | ||
|
|
9d0a7b3f57 | ||
|
|
b4353ce102 | ||
|
|
4961c109a2 | ||
|
|
9147d64953 | ||
|
|
108c8bf112 | ||
|
|
53f8bc9058 | ||
|
|
fe126664df | ||
|
|
9c0b240687 | ||
|
|
4fa703e723 | ||
|
|
df4596a8df | ||
|
|
6c4fb4acb4 | ||
|
|
baa06dcb6b | ||
|
|
1aa13d8aaf | ||
|
|
f042ab5f7b | ||
|
|
13260bfce6 | ||
|
|
f6b044db9b | ||
|
|
8071b34ddb | ||
|
|
056bf1ccab | ||
|
|
7833e4f261 | ||
|
|
b4f4341dc1 | ||
|
|
debcd9203c | ||
|
|
ee07630b55 | ||
|
|
6d4c59cbb4 | ||
|
|
25743a05cd | ||
|
|
bed704270c | ||
|
|
e7ab69233a | ||
|
|
d6923b3268 | ||
|
|
618394f9f7 | ||
|
|
8403265f35 | ||
|
|
d117479a5d | ||
|
|
6a6af073fc | ||
|
|
c7513dcf13 | ||
|
|
ec72c7b1f1 | ||
|
|
a7f8b66cce | ||
|
|
df8e3a543e | ||
|
|
fb00f41829 | ||
|
|
0efd35c603 | ||
|
|
a4aaa62b49 | ||
|
|
3667edf9f7 | ||
|
|
c43ef715d6 | ||
|
|
17fe0092b0 | ||
|
|
cfc94899bc | ||
|
|
fa83741938 | ||
|
|
f5562529f6 | ||
|
|
8e9dda297b | ||
|
|
c035f01848 | ||
|
|
6ef0335321 | ||
|
|
1ba7f8b56f | ||
|
|
f6afd3d22c | ||
|
|
87da9db877 | ||
|
|
cb3df9fc7b | ||
|
|
5a17b2c10f | ||
|
|
2afec002b1 | ||
|
|
2355e5eb2f | ||
|
|
139b38ca1d | ||
|
|
64971d866d | ||
|
|
98ad7b04bd | ||
|
|
8c9335bebf | ||
|
|
f7cb1356f9 | ||
|
|
a6a4ff07af | ||
|
|
63aa96068a | ||
|
|
60dcdd7ee7 | ||
|
|
d9d070ebe3 | ||
|
|
e22c494b84 | ||
|
|
66e217f7e2 | ||
|
|
c7bbeda3ad | ||
|
|
a12bd23ffa | ||
|
|
e65140bcbb | ||
|
|
fe13d562b2 | ||
|
|
b1832cc925 | ||
|
|
db87547a7d | ||
|
|
c96a3c2ba7 | ||
|
|
3808dc3430 | ||
|
|
722b52f168 | ||
|
|
8f2e5366a1 | ||
|
|
2b2c6771e8 | ||
|
|
f5c1152eb0 | ||
|
|
7ccfae6f29 | ||
|
|
5187337db7 | ||
|
|
872a88c347 | ||
|
|
5dee524870 | ||
|
|
720dd4f5e0 | ||
|
|
93cadc6d0a | ||
|
|
19c53eec7b | ||
|
|
e89182e012 | ||
|
|
735bd1e918 | ||
|
|
213789139e | ||
|
|
1302d44c77 | ||
|
|
52c94619ba | ||
|
|
17d73fd8a8 | ||
|
|
e0583c1b22 | ||
|
|
75e49d9fe6 | ||
|
|
b2d0f53767 | ||
|
|
cf80c84fbd | ||
|
|
cf0c51daf1 | ||
|
|
042b9f8c81 | ||
|
|
c733b356f6 | ||
|
|
5233f3f4dc | ||
|
|
75407d9dc4 | ||
|
|
61786e4d94 | ||
|
|
2721e51850 | ||
|
|
77708ac5c1 | ||
|
|
67677f1dfc | ||
|
|
03ad5cb040 | ||
|
|
35bec2749c | ||
|
|
ff21f855ca | ||
|
|
5c0455ec56 | ||
|
|
8b750b7c7c | ||
|
|
1551a8a862 | ||
|
|
50a5048fbe | ||
|
|
cf41665c0a | ||
|
|
02c3131f18 | ||
|
|
af57c3bf4f | ||
|
|
ec42c0c2b4 | ||
|
|
082346b9e9 | ||
|
|
d986dd2beb | ||
|
|
68934ca747 | ||
|
|
078a008e6c | ||
|
|
553a9b9fc9 | ||
|
|
f7a8222939 | ||
|
|
c2eb4ed7fa | ||
|
|
3b11e01cc8 | ||
|
|
12c95cfb8f | ||
|
|
4498eba6ae | ||
|
|
87b995681f | ||
|
|
3ccca3f240 | ||
|
|
95a0301ac7 | ||
|
|
cf05a5687d | ||
|
|
4d9f88afba | ||
|
|
fa2453ae80 | ||
|
|
36d28cf6fc | ||
|
|
f1d3bbd95f | ||
|
|
d556484888 | ||
|
|
07857a2309 | ||
|
|
0296b8dd37 | ||
|
|
e56742a065 | ||
|
|
c6a701393f | ||
|
|
073eb0e417 | ||
|
|
e15f14c21b | ||
|
|
0590621182 | ||
|
|
4519b2a052 | ||
|
|
1dc68f97c5 | ||
|
|
b8d00c8228 | ||
|
|
81bdbadea1 | ||
|
|
6298e0f107 | ||
|
|
ea2193a46e | ||
|
|
96dffbfedd | ||
|
|
eb590b5a71 | ||
|
|
c2294b6e6f | ||
|
|
8906d12a47 | ||
|
|
3162ff4261 | ||
|
|
57643447d6 | ||
|
|
6b86d8ae30 | ||
|
|
4279e09cc2 | ||
|
|
dd104466d6 | ||
|
|
43a11327a6 | ||
|
|
e1080ffd98 | ||
|
|
ebc375fe20 | ||
|
|
b778420d63 | ||
|
|
baf7ff9ebf | ||
|
|
7733754c2b | ||
|
|
3c1d1d2dd5 | ||
|
|
82bc6b2a71 | ||
|
|
e5fe19c107 | ||
|
|
8499318928 | ||
|
|
0dd96e9858 | ||
|
|
0296dc78f1 | ||
|
|
3b403d5576 | ||
|
|
f5d7fdf75f | ||
|
|
0528bd59d1 | ||
|
|
7c95783ab5 | ||
|
|
bff3cafb37 | ||
|
|
9e58207392 | ||
|
|
c33b41dcbe | ||
|
|
efe2a50a4e | ||
|
|
cfc3b41471 | ||
|
|
cfd67eab95 | ||
|
|
98fa04528d | ||
|
|
20e8ebc26a | ||
|
|
405d5585ce | ||
|
|
1fb562d94b | ||
|
|
1beff0e760 | ||
|
|
6c6f8ae53f | ||
|
|
ed53de4cf1 | ||
|
|
9f96627435 | ||
|
|
9ee215affd | ||
|
|
b39b7d9629 | ||
|
|
2ecba36ba3 | ||
|
|
7963f7f7b6 | ||
|
|
50faa97558 | ||
|
|
135d7741d2 | ||
|
|
2b1e9ba07d | ||
|
|
e121353ac8 | ||
|
|
07442a187a | ||
|
|
2c024dedce | ||
|
|
c7687382f8 | ||
|
|
d28bf74c73 | ||
|
|
223523005d | ||
|
|
c68437e836 | ||
|
|
c65a9151ab | ||
|
|
0b90f09873 | ||
|
|
3374f6c908 | ||
|
|
7bcd313883 | ||
|
|
76bb42e526 | ||
|
|
d4b5f2af57 | ||
|
|
1299fcf978 | ||
|
|
d04f8742a6 | ||
|
|
6b8e5f8b76 | ||
|
|
c429ba5aff | ||
|
|
ef36103c47 | ||
|
|
82336e82d9 | ||
|
|
3baf9500c3 | ||
|
|
1dcefc1d57 | ||
|
|
66b6d4a09a | ||
|
|
44c1ba62e8 | ||
|
|
590cdba75b | ||
|
|
9786efe490 | ||
|
|
352851a686 | ||
|
|
b4c1d35b52 | ||
|
|
776d79c12b | ||
|
|
291b0ee3c0 | ||
|
|
16c7e409d7 | ||
|
|
6064fe71a0 | ||
|
|
360f01a07b | ||
|
|
4546337d3e | ||
|
|
aeae192eaf | ||
|
|
3db56ca93e | ||
|
|
c69fc9ec77 | ||
|
|
87b56ec111 | ||
|
|
74abc499d8 | ||
|
|
7c04602cc7 | ||
|
|
daed799fa7 | ||
|
|
65e192efc3 | ||
|
|
e1c700878a | ||
|
|
81a0c62308 | ||
|
|
470538ac91 | ||
|
|
c6e7d621f0 | ||
|
|
99ca1ecf8c | ||
|
|
4a0398923f | ||
|
|
c7816b5a1f | ||
|
|
6c5f09e1f9 | ||
|
|
4aea8817df | ||
|
|
b4929e1b45 | ||
|
|
a56907862c | ||
|
|
24db3fbdc9 | ||
|
|
9cf30dc77b | ||
|
|
b42c80b464 | ||
|
|
8dd310cee2 | ||
|
|
4d1e6100db | ||
|
|
dc5eb9e815 | ||
|
|
e1b5efcd79 | ||
|
|
644c64aa4b | ||
|
|
3c706c8009 | ||
|
|
7234050447 | ||
|
|
6a7ceee75f | ||
|
|
7d64784dc4 | ||
|
|
21b7f08e18 | ||
|
|
47fc2eb20d | ||
|
|
fc5cabedd0 | ||
|
|
b60abba6e4 | ||
|
|
5371a02653 | ||
|
|
a6da1ded25 | ||
|
|
4e5f4df29a | ||
|
|
2b74da9d30 | ||
|
|
924d4bd01f | ||
|
|
a8173b045d | ||
|
|
71e6ff1b79 | ||
|
|
2bd77fd2ce | ||
|
|
aee5fb7a98 | ||
|
|
733f17d59a | ||
|
|
785bc08d7f | ||
|
|
7cb5045dff | ||
|
|
2b0954951d | ||
|
|
ad1e0c91ec | ||
|
|
9cf30bf5fd | ||
|
|
a22c152bd7 | ||
|
|
ec1faad4ab | ||
|
|
35991b7448 | ||
|
|
89cb797250 | ||
|
|
26ab4a950d | ||
|
|
31273a31b7 | ||
|
|
c83952ad00 | ||
|
|
31cf89d874 | ||
|
|
b494e9e1b0 | ||
|
|
fdd248b7d5 | ||
|
|
580bff4643 | ||
|
|
f1c19023e8 | ||
|
|
927b96219c | ||
|
|
2673bada6a | ||
|
|
a026ebf094 | ||
|
|
d830c5006c | ||
|
|
d74138837e | ||
|
|
413875b697 | ||
|
|
a068d6e1c6 | ||
|
|
25f543d3ad | ||
|
|
38bc02c07e | ||
|
|
2921a07f29 | ||
|
|
0c8e6d0e60 | ||
|
|
ac7fda0e5a | ||
|
|
e66aa2e988 | ||
|
|
aa0fa5a18d | ||
|
|
68976883cc | ||
|
|
d7bc382331 | ||
|
|
b38ef8fab0 | ||
|
|
bdca96c460 | ||
|
|
8dd2d88ff2 | ||
|
|
280d97c40c | ||
|
|
771e8e7db3 | ||
|
|
ef4235bbdc | ||
|
|
513147c18a | ||
|
|
65c263c7d8 | ||
|
|
32726af9c6 | ||
|
|
b72dca6536 | ||
|
|
0a52cdfe6b | ||
|
|
bdace3159f | ||
|
|
cd69c2fd71 | ||
|
|
658ab485aa | ||
|
|
0632551c65 | ||
|
|
5b385822dc | ||
|
|
5aefdd2302 | ||
|
|
b691b1a382 | ||
|
|
d029067849 | ||
|
|
162c47ef60 | ||
|
|
8b626251c1 | ||
|
|
6aee11ef6f | ||
|
|
1c9774a659 | ||
|
|
f3f75fb1d4 | ||
|
|
b320ef8818 | ||
|
|
33a2c5e403 | ||
|
|
dc4245ca11 | ||
|
|
4b4f597d3e | ||
|
|
2a3b4a8e3b | ||
|
|
8f6e8d9004 | ||
|
|
0a4a58cddc | ||
|
|
c025d1b5fd | ||
|
|
5cc65cac6e | ||
|
|
e9a320e528 | ||
|
|
7500a179c0 | ||
|
|
8bf3aed9a7 | ||
|
|
612a65d2e6 | ||
|
|
0cb3c9c1f8 | ||
|
|
61c9a76c73 | ||
|
|
93d0f9b3b8 | ||
|
|
4e59d386dc | ||
|
|
118fc0b0cc | ||
|
|
4f39b76573 | ||
|
|
80ba6314ee | ||
|
|
6f1a0b0aef | ||
|
|
3255b8c4c6 | ||
|
|
4bd7f4fd39 | ||
|
|
8e3fa71a2d | ||
|
|
8b161927da | ||
|
|
b0eee23ef2 | ||
|
|
09dc403b0e | ||
|
|
6754cfe73b | ||
|
|
59e8d9b4cf | ||
|
|
d11d033360 | ||
|
|
8cad06f702 | ||
|
|
f0118c0848 | ||
|
|
33dbbd0d62 | ||
|
|
72fd0fcc9b | ||
|
|
43b5571315 | ||
|
|
29756e1e8c | ||
|
|
1d777550ed | ||
|
|
4779d3ae0c | ||
|
|
68880fc4be | ||
|
|
da0cfdb1dc | ||
|
|
5edb95fc6b | ||
|
|
27f9707058 | ||
|
|
cb3c083d8b | ||
|
|
3a36f7da2f | ||
|
|
3e8451e1e1 | ||
|
|
5f8c46b146 | ||
|
|
9363f8667c | ||
|
|
dcc3601bd7 | ||
|
|
46720dc37b | ||
|
|
691c72d717 | ||
|
|
f66f4e0be0 | ||
|
|
93c3c542e8 | ||
|
|
97b7bca255 | ||
|
|
e0ac86ac1f | ||
|
|
310af37d67 | ||
|
|
e29efe8935 | ||
|
|
63a34e7018 | ||
|
|
ddeefd5bf3 | ||
|
|
630a5badf8 | ||
|
|
f5520d3087 | ||
|
|
e547a5d2b9 | ||
|
|
ffd32a803f | ||
|
|
63337c1d26 | ||
|
|
2e824f0c80 | ||
|
|
339bc34f9b | ||
|
|
41db5d0024 | ||
|
|
d3027acd37 | ||
|
|
10c09927e2 | ||
|
|
014e7e4cbe | ||
|
|
884de2b4f2 | ||
|
|
a5a836450e | ||
|
|
da2e3add9d | ||
|
|
e9a505f273 | ||
|
|
8ec4a8e2bb | ||
|
|
a02bd5ab52 | ||
|
|
df43e07057 | ||
|
|
d17cd78605 | ||
|
|
fe6caf094b | ||
|
|
84969180e2 | ||
|
|
7008745395 | ||
|
|
34d5f05821 | ||
|
|
b96038c049 | ||
|
|
0d21df347b | ||
|
|
f865149d35 | ||
|
|
5898428fb9 | ||
|
|
792b05dfdf | ||
|
|
08b6274131 | ||
|
|
d8db1c9019 | ||
|
|
f089c552e0 | ||
|
|
61978088fc | ||
|
|
a9d7095354 | ||
|
|
353fd792a4 | ||
|
|
e7d535e0c0 | ||
|
|
dc756991ae | ||
|
|
7529cfb892 | ||
|
|
08485b0381 | ||
|
|
1283c41283 | ||
|
|
774809a3a8 | ||
|
|
5a0227a339 | ||
|
|
3cb0e8fc2d | ||
|
|
7026c2ca88 | ||
|
|
ed5d57d474 | ||
|
|
61ead7dc66 | ||
|
|
1bb185c8f0 | ||
|
|
0ea5a5b7d6 | ||
|
|
9f8533b96c | ||
|
|
4fd8add19c | ||
|
|
cf8926952a | ||
|
|
47fe8913c4 | ||
|
|
bdd07ec31e | ||
|
|
4fbbb6aa79 | ||
|
|
57193181d1 | ||
|
|
cbbeb394c1 | ||
|
|
1174b8f7ca | ||
|
|
cca9390555 | ||
|
|
b9531ce684 | ||
|
|
e0decdf55e | ||
|
|
f5691e6d7f | ||
|
|
b979e37ad6 | ||
|
|
41f254af74 | ||
|
|
d95a8e8975 | ||
|
|
28f58ee5f3 | ||
|
|
df4f8dda60 | ||
|
|
4441075f49 | ||
|
|
56f9b5b6e6 | ||
|
|
f686b1e75b | ||
|
|
7e88d246c0 | ||
|
|
80aadb2717 | ||
|
|
0cc4fffd08 | ||
|
|
4ba47045b2 | ||
|
|
a6dceb2e64 | ||
|
|
eea5803ae5 | ||
|
|
e06a5ad44f | ||
|
|
f8f36dac09 | ||
|
|
4c300bf432 | ||
|
|
2d545aafa5 | ||
|
|
8d384c7c5c | ||
|
|
790ea6ff63 | ||
|
|
bc15b48ea2 | ||
|
|
3319f9c3b3 | ||
|
|
18f92f7b54 | ||
|
|
b5cf3709c2 | ||
|
|
df8c1984ca | ||
|
|
c32ab5648c | ||
|
|
6a5b4fe40c | ||
|
|
0ee0a5840b | ||
|
|
6f883d1417 | ||
|
|
8e974111ba | ||
|
|
45ee875646 | ||
|
|
1877340cd3 | ||
|
|
bcebec10bc | ||
|
|
dfbe15319c | ||
|
|
33764f645b | ||
|
|
b20ea4dea1 | ||
|
|
e53c623759 | ||
|
|
2c12a99020 | ||
|
|
a4105d22dc | ||
|
|
c7a058e575 | ||
|
|
b603c31398 | ||
|
|
f650e52f6a | ||
|
|
07ea4a1b4f | ||
|
|
a5ae5b3e26 | ||
|
|
adf9e057b4 | ||
|
|
c432f89424 | ||
|
|
410654b766 | ||
|
|
9e49064847 | ||
|
|
f8239f4e8a | ||
|
|
b3b16f8fbd | ||
|
|
939f5fa621 | ||
|
|
d17d0ec16f | ||
|
|
f1ebe01e5e | ||
|
|
1949dae8d4 | ||
|
|
7c6d36fde1 | ||
|
|
5fd8ff003b | ||
|
|
abb5290baa | ||
|
|
fd7dd9c3b4 | ||
|
|
4a4c787de2 | ||
|
|
6fb4525754 | ||
|
|
001609982d | ||
|
|
9353e4852c | ||
|
|
eb29baef4b | ||
|
|
031d20199e | ||
|
|
adf0b7b68b | ||
|
|
7296302af2 | ||
|
|
f040df785d | ||
|
|
5639bd1274 | ||
|
|
babfcbddd8 | ||
|
|
0c9b1f5338 | ||
|
|
81d333243d | ||
|
|
47a7e76a4d | ||
|
|
4391bf4eb8 | ||
|
|
aba7d02cfe | ||
|
|
6f5c0a2816 | ||
|
|
e8571454d9 | ||
|
|
7930fec5d7 | ||
|
|
37a2858d5f | ||
|
|
e88c9a760d | ||
|
|
172a80fa5d | ||
|
|
3e965d0cfb | ||
|
|
72aeb723a5 | ||
|
|
507a7fd243 | ||
|
|
184cd00a8b | ||
|
|
9c81584b02 | ||
|
|
5bc8a363b9 | ||
|
|
f1169b9c7e | ||
|
|
f2268c7f58 | ||
|
|
d33dd3e0fc | ||
|
|
8cac183af6 | ||
|
|
570ac81848 | ||
|
|
5719e9f134 | ||
|
|
891fa7b7d5 | ||
|
|
54f110f7c6 | ||
|
|
dcfb9f3903 | ||
|
|
2482dc963a | ||
|
|
6d57b1081a | ||
|
|
8dd732631a | ||
|
|
1fe70568cb | ||
|
|
bd254fd261 | ||
|
|
fad579c4d3 | ||
|
|
e8c53d71aa | ||
|
|
e0049cf07b | ||
|
|
881b05aeb1 | ||
|
|
cfd9ab98c6 | ||
|
|
dd1d4246fe | ||
|
|
2668f6b80c | ||
|
|
a388d199dc | ||
|
|
d9f3d492dc | ||
|
|
a14ca3d1f5 | ||
|
|
7d9fc83dc9 | ||
|
|
f97c7c3f7b | ||
|
|
6002067b64 | ||
|
|
7e4d24236a | ||
|
|
b82591a0bc | ||
|
|
e5f7f89ed9 | ||
|
|
a68e888654 | ||
|
|
0c0910ee81 | ||
|
|
ced87edfa5 | ||
|
|
5415ec21dc | ||
|
|
3cb496daa2 | ||
|
|
03e0559afe | ||
|
|
be91ff641c | ||
|
|
cec06493c0 | ||
|
|
0da84a3e8c | ||
|
|
6822d7d099 | ||
|
|
d82746be97 | ||
|
|
3b49c7f262 | ||
|
|
9bc9569a0d | ||
|
|
8771e35f11 | ||
|
|
656e8efa43 | ||
|
|
9fc01eb51f | ||
|
|
e32adb17f2 | ||
|
|
1ffa3211ba | ||
|
|
41cf623bb8 | ||
|
|
8ec97032b1 | ||
|
|
40f34eb3bc | ||
|
|
a4b348488b | ||
|
|
8316a0b25f | ||
|
|
86dde2d6b8 | ||
|
|
84a8db7b75 | ||
|
|
975b6f3572 | ||
|
|
b4224dadfb | ||
|
|
7dcd49c485 | ||
|
|
0c266d4a1f | ||
|
|
a3a70f67b4 | ||
|
|
43e76ecca3 | ||
|
|
241a654f28 | ||
|
|
94e1b86eaf | ||
|
|
4d5353b8d4 | ||
|
|
5ddfb66633 | ||
|
|
41d30d4fd4 | ||
|
|
95548fba54 | ||
|
|
ef4ce31c47 | ||
|
|
f2795f120b | ||
|
|
2ef4b55af4 | ||
|
|
3e4dedf397 | ||
|
|
ebcb86ff3e | ||
|
|
c0defcab9b | ||
|
|
25f6f16718 | ||
|
|
34767cdd13 | ||
|
|
9975d2b483 | ||
|
|
3f77c99544 | ||
|
|
9eab136f53 | ||
|
|
998d993102 | ||
|
|
f27d399dfc | ||
|
|
a117cc8e0c | ||
|
|
2c59a4148d | ||
|
|
dc20ff52d8 | ||
|
|
1764e6e0fe | ||
|
|
e65d2f2a85 | ||
|
|
2d26b24b10 | ||
|
|
990a70e958 | ||
|
|
2868391cf6 | ||
|
|
4050cddd12 | ||
|
|
92cee7b441 | ||
|
|
8e0f6c6e83 | ||
|
|
e7eb1dfbf0 | ||
|
|
f8a0b6c0c6 | ||
|
|
9f7bef9447 | ||
|
|
508674f404 | ||
|
|
25fa1a0e69 | ||
|
|
2453f27284 | ||
|
|
05598d1445 | ||
|
|
c82d99a656 | ||
|
|
619acbed15 | ||
|
|
fef5bb6342 | ||
|
|
4e91e06c64 | ||
|
|
0057c2be84 | ||
|
|
e8e50a3e31 | ||
|
|
769053b76d | ||
|
|
1948c303f2 | ||
|
|
476b15ee9d | ||
|
|
9595e00ae1 | ||
|
|
fdc1f275c5 | ||
|
|
1276dddc37 | ||
|
|
ed62a48ddd | ||
|
|
327c379ff3 | ||
|
|
77472b978d | ||
|
|
e81c08f7f0 | ||
|
|
1e24b3d774 | ||
|
|
a4044eff30 | ||
|
|
31c690ebf8 | ||
|
|
b84f118b4d | ||
|
|
c33783ac81 | ||
|
|
725ba6ff72 | ||
|
|
bf9811bf11 | ||
|
|
e08c430422 | ||
|
|
c72000bfc0 | ||
|
|
a131e468c0 | ||
|
|
d4a16589af | ||
|
|
5e69a453a2 | ||
|
|
23d3425ca4 | ||
|
|
653a1ccd58 | ||
|
|
09105d6e3d | ||
|
|
4d8acecc57 | ||
|
|
8d54028b31 | ||
|
|
415acfce57 | ||
|
|
f25401e9fd | ||
|
|
bcf26cee53 | ||
|
|
161bfb0e91 | ||
|
|
c1e52d7837 | ||
|
|
9cb096046a | ||
|
|
3c32f0533a | ||
|
|
3bf197bb32 | ||
|
|
4dc5c7da18 | ||
|
|
9ad070f40a | ||
|
|
a806714f56 | ||
|
|
bd630e31bc | ||
|
|
6313f24dc9 | ||
|
|
5a5cd23eb2 | ||
|
|
7fda7c1a4a | ||
|
|
ab637c7c13 | ||
|
|
7f497d59bc | ||
|
|
d794d61337 | ||
|
|
9f03854b3c | ||
|
|
17996822d3 | ||
|
|
ee438ad7b2 | ||
|
|
6bf4efbfe6 | ||
|
|
3163563fce | ||
|
|
04cb5f656d | ||
|
|
3863c7497b | ||
|
|
8d4dbd4d82 | ||
|
|
8f4fe1b05b | ||
|
|
7794fa065c | ||
|
|
af92da9a7c | ||
|
|
ba378ea00b | ||
|
|
be8a3479ac | ||
|
|
2002841c61 | ||
|
|
fde5096856 | ||
|
|
08f9874745 | ||
|
|
712ab9e0bc | ||
|
|
e07fc0a2c7 | ||
|
|
61fb68f4cf | ||
|
|
f3296dd443 | ||
|
|
8a8cffc542 | ||
|
|
820ad7c523 | ||
|
|
9f66ce618e | ||
|
|
2318425160 | ||
|
|
a36dfcc144 | ||
|
|
213e3083a1 | ||
|
|
683354da9d | ||
|
|
e208fd8222 | ||
|
|
4fc65c8302 | ||
|
|
bcb54faeaf | ||
|
|
f5753f3fde | ||
|
|
5ff8618c10 | ||
|
|
bee918e810 | ||
|
|
37301ae92b | ||
|
|
bd304d5f27 | ||
|
|
827c69bd7b | ||
|
|
812a225334 | ||
|
|
90c4e7818a | ||
|
|
1299df539e | ||
|
|
20b25e0108 | ||
|
|
e959afb2de | ||
|
|
cb25643741 | ||
|
|
bbfb9e713a | ||
|
|
e71a38fe96 | ||
|
|
120e4e13a6 | ||
|
|
04aa9df45b | ||
|
|
8d60a4379d | ||
|
|
4e96dec474 | ||
|
|
9727356d3b | ||
|
|
c0c0cb8545 | ||
|
|
af646c1999 | ||
|
|
38bb4c7a3a | ||
|
|
573fa2c457 | ||
|
|
d7e7fd58b0 | ||
|
|
f5a234fd26 | ||
|
|
f75c9e0d4a | ||
|
|
5eca92a0ea | ||
|
|
384b7a41a9 | ||
|
|
47e27a7a89 | ||
|
|
ac19621d5b | ||
|
|
cf2e84873c | ||
|
|
c523474980 | ||
|
|
754486673a | ||
|
|
a7110082e7 | ||
|
|
db619e4cda | ||
|
|
34d05f2ac0 | ||
|
|
fdb1dbf397 | ||
|
|
5c2925aeed | ||
|
|
dc5fbbf7eb | ||
|
|
e46844988e | ||
|
|
9d98107f3a | ||
|
|
681176c684 | ||
|
|
5d4757ddf1 | ||
|
|
9731e6811a | ||
|
|
23c86a4fcc | ||
|
|
43ea0136c8 | ||
|
|
2cc8eb1313 | ||
|
|
bfe71900d3 | ||
|
|
c6a6b41193 | ||
|
|
b0f7bef279 | ||
|
|
014f76b2fb | ||
|
|
546928fb79 | ||
|
|
b4ead5a2eb | ||
|
|
124918b744 | ||
|
|
9308ad125a | ||
|
|
7dc43829ab |
355
.drone.yml
@@ -1,114 +1,74 @@
|
||||
clone:
|
||||
git:
|
||||
image: plugins/git
|
||||
depth: 1
|
||||
|
||||
pipeline:
|
||||
check-app-compatbility:
|
||||
kind: pipeline
|
||||
name: checkers
|
||||
steps:
|
||||
- name: compatibility
|
||||
image: nextcloudci/php7.1:php7.1-16
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: master
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
|
||||
- cd ../server
|
||||
# Code checker
|
||||
- ./occ app:check-code $APP_NAME -c strong-comparison
|
||||
- ./occ app:check-code $APP_NAME -c deprecation
|
||||
- cd apps/$APP_NAME/
|
||||
- name: syntax-php7.0
|
||||
image: nextcloudci/php7.0:php7.0-17
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ --exclude ./lib/Collaboration/ .
|
||||
- name: syntax-php7.1
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
- name: syntax-php7.2
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
- name: syntax-php7.3
|
||||
image: nextcloudci/php7.3:php7.3-2
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
name: unit-php7.0
|
||||
steps:
|
||||
- name: php7.0
|
||||
image: nextcloudci/php7.0:php7.0-17
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
|
||||
- cd ../server
|
||||
# Code checker
|
||||
- ./occ app:check-code $APP_NAME -c strong-comparison
|
||||
- ./occ app:check-code $APP_NAME -c deprecation
|
||||
- cd apps/$APP_NAME/
|
||||
when:
|
||||
matrix:
|
||||
TESTS: check-app-compatbility
|
||||
signed-off-check:
|
||||
image: nextcloudci/php7.0:php7.0-17
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
commands:
|
||||
- wget https://raw.githubusercontent.com/nextcloud/server/master/build/signed-off-checker.php
|
||||
- php ./signed-off-checker.php
|
||||
secrets: [ github_token ]
|
||||
when:
|
||||
matrix:
|
||||
TESTS: signed-off-check
|
||||
syntax-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=stable13
|
||||
- DB=sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php5.6
|
||||
syntax-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-17
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php7.0
|
||||
syntax-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php7.1
|
||||
syntax-php7.2:
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
commands:
|
||||
- composer install
|
||||
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php7.2
|
||||
php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=stable13
|
||||
- DB=sqlite
|
||||
commands:
|
||||
- apt update && apt-get -y install php5-xdebug
|
||||
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
|
||||
- cd ../server/
|
||||
- ./occ app:enable $APP_NAME
|
||||
- cd apps/$APP_NAME
|
||||
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
when:
|
||||
matrix:
|
||||
TESTS: php5.6
|
||||
php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-17
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
@@ -117,17 +77,26 @@ pipeline:
|
||||
- php occ app:enable deck
|
||||
- cd apps/$APP_NAME
|
||||
# Run phpunit tests
|
||||
- composer install
|
||||
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
when:
|
||||
matrix:
|
||||
TESTS: php7.0
|
||||
php7.1:
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
name: unit-php7.1
|
||||
steps:
|
||||
- name: php7.1
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
@@ -135,17 +104,26 @@ pipeline:
|
||||
- cd ../server/
|
||||
- php occ app:enable deck
|
||||
- cd apps/$APP_NAME
|
||||
- composer install
|
||||
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
when:
|
||||
matrix:
|
||||
TESTS: php7.1
|
||||
php7.2:
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
name: unit-php7.2
|
||||
steps:
|
||||
- name: php7.2
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
@@ -153,17 +131,53 @@ pipeline:
|
||||
- cd ../server/
|
||||
- php occ app:enable deck
|
||||
- cd apps/$APP_NAME
|
||||
- composer install
|
||||
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
when:
|
||||
matrix:
|
||||
TESTS: php7.2
|
||||
integration:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
name: unit-php7.3
|
||||
steps:
|
||||
- name: php7.3
|
||||
image: nextcloudci/php7.3:php7.3-2
|
||||
environment:
|
||||
- APP_NAME=deck
|
||||
- CORE_BRANCH=master
|
||||
- DB=sqlite
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
|
||||
- cd ../server/
|
||||
- php occ app:enable deck
|
||||
- cd apps/$APP_NAME
|
||||
- composer install
|
||||
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
|
||||
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
name: integration-stable16
|
||||
steps:
|
||||
- name: integration
|
||||
image: nextcloudci/php7.1:php7.1-16
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable16
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
@@ -172,41 +186,58 @@ pipeline:
|
||||
- php occ app:enable deck
|
||||
- cd apps/$APP_NAME
|
||||
- cd tests/integration
|
||||
- ./run.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration
|
||||
eslint:
|
||||
- ./run.sh || true
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
name: integration-stable15
|
||||
steps:
|
||||
- name: integration
|
||||
image: nextcloudci/php7.1:php7.1-16
|
||||
environment:
|
||||
APP_NAME: deck
|
||||
CORE_BRANCH: stable15
|
||||
DB: sqlite
|
||||
commands:
|
||||
# Pre-setup steps
|
||||
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
|
||||
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
|
||||
- cd ../server/
|
||||
- php occ app:enable deck
|
||||
- cd apps/$APP_NAME
|
||||
- cd tests/integration
|
||||
- ./run.sh || true
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: frontend
|
||||
steps:
|
||||
- name: eslint
|
||||
image: nextcloudci/eslint:eslint-1
|
||||
commands:
|
||||
- ./run-eslint.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: eslint
|
||||
jsbuild:
|
||||
- name: jsbuild
|
||||
image: mhart/alpine-node:6.8.0
|
||||
commands:
|
||||
- apk add --no-cache make
|
||||
- make build-js
|
||||
when:
|
||||
matrix:
|
||||
TESTS: jsbuild
|
||||
matrix:
|
||||
include:
|
||||
- TESTS: check-app-compatbility
|
||||
- TESTS: signed-off-check
|
||||
- TESTS: syntax-php5.6
|
||||
- TESTS: syntax-php7.0
|
||||
- TESTS: syntax-php7.1
|
||||
- TESTS: syntax-php7.2
|
||||
- TESTS: php5.6
|
||||
- TESTS: php7.0
|
||||
- TESTS: php7.1
|
||||
- TESTS: php7.2
|
||||
- TESTS: eslint
|
||||
- TESTS: jsbuild
|
||||
#- TESTS: integration
|
||||
|
||||
branches: [ master, stable* ]
|
||||
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
|
||||
@@ -6,6 +6,7 @@ extends:
|
||||
env:
|
||||
browser: true
|
||||
amd: true
|
||||
es6: true
|
||||
|
||||
globals:
|
||||
global: false
|
||||
|
||||
17
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
* Resolves: # <!-- related github issue -->
|
||||
* Target version: master
|
||||
|
||||
### Summary
|
||||
|
||||
|
||||
### TODO
|
||||
|
||||
- [ ] ...
|
||||
|
||||
### Checklist
|
||||
|
||||
- [ ] Code is properly formatted
|
||||
- [ ] Sign-off message is added to all commits
|
||||
- [ ] Tests (unit, integration, api and/or acceptance) are included
|
||||
- [ ] Documentation (manuals or wiki) has been updated or is not required
|
||||
25
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 60
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- "1. to develop"
|
||||
- "2. developing"
|
||||
- "3. to review"
|
||||
- "discussion"
|
||||
- "bounty"
|
||||
- "bug"
|
||||
- "enhancement"
|
||||
|
||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
||||
limitPerRun: 30
|
||||
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
2
.gitignore
vendored
@@ -9,3 +9,5 @@ tests/integration/vendor/
|
||||
tests/integration/composer.lock
|
||||
vendor/
|
||||
*.lock
|
||||
|
||||
\.idea/
|
||||
|
||||
@@ -5,8 +5,9 @@ php:
|
||||
- 7.0
|
||||
- 7.1
|
||||
- 7.2
|
||||
- 7.3
|
||||
env:
|
||||
- CORE_BRANCH=master DB=mysql
|
||||
- CORE_BRANCH=stable15 DB=mysql
|
||||
|
||||
before_install:
|
||||
- wget https://phar.phpunit.de/phpunit-5.7.phar
|
||||
@@ -24,6 +25,7 @@ before_script:
|
||||
- cd apps/deck
|
||||
|
||||
script:
|
||||
- composer install
|
||||
- make test-unit
|
||||
|
||||
after_success:
|
||||
|
||||
106
CHANGELOG.md
@@ -1,7 +1,110 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## 0.4.0 - unreleased
|
||||
## 0.6.3 - 2019-06-30
|
||||
|
||||
### Fixed
|
||||
- Fix issues with comments and activity stream
|
||||
- Fix setting archived state through API
|
||||
- Fix type of acl in API responses
|
||||
- Fix type mismatch with fulltext search
|
||||
|
||||
## 0.6.2 - 2019-05-15
|
||||
|
||||
### Fixed
|
||||
- Fix group limit for nonexisting groups
|
||||
- Only map circle ACLs if the app is enabled
|
||||
- Fix updating sharing permissions
|
||||
- Add app version to capabilities
|
||||
|
||||
## 0.6.1 - 2019-04-27
|
||||
|
||||
### Fixed
|
||||
- Fix issue with boards not being shown after update
|
||||
- Fix board selection in projects view outside of deck
|
||||
- Remove collections text from sidebar
|
||||
- Remove leftover use statement
|
||||
|
||||
## 0.6.0 - 2019-04-23
|
||||
|
||||
### Added
|
||||
- Share boards with circles
|
||||
- Integration with collections in Nextcloud 16
|
||||
- Support for full text search
|
||||
- Nextcloud 16 compatibility
|
||||
|
||||
### Fixed
|
||||
- Fix duplicate call to delete
|
||||
- Prevent duplicate tag names @jakobroehrl
|
||||
- Prevent loading details when editing the card title @jakobroehrl
|
||||
- Hide sidebar after card deletion @jakobroehrl
|
||||
- Update labels after change in the UI @jakobroehrl
|
||||
- Allow limiting the app to groups again
|
||||
- Various REST API enhancements and fixes
|
||||
- Fix some issues with comments/activites
|
||||
|
||||
|
||||
## 0.5.2 - 2018-12-20
|
||||
|
||||
### Fixed
|
||||
- Mark notification as read if a card with duedate gets archived
|
||||
- Use proper timezone and locale format for due date activities
|
||||
- Various translation fixes and updates
|
||||
- Check group limit properly
|
||||
- Fix comment activities on Nextcloud 15
|
||||
- Fix issues with Edge
|
||||
- API: Fix numeric types that were returned as strings
|
||||
- API: Fix If-Modified-Since header parsing
|
||||
|
||||
|
||||
## 0.5.1 - 2018-12-05
|
||||
|
||||
### Added
|
||||
- Separate settings for description changes in activity
|
||||
- Less verbose description change activities
|
||||
- Use server settings to restrict sharing to groups
|
||||
- Add setting to exclude groups from creating their own boards
|
||||
|
||||
### Fixed
|
||||
- Fix issue when using a separate table prefix @bpcurse
|
||||
- Fix invalid activity parameters being published
|
||||
- Wording fixes @cloud2018
|
||||
- Improve loading performance by removing unused activity preloading
|
||||
- Fix timestamp issues in deleted items tab
|
||||
- Remember show state of the board navigation @weeman1337
|
||||
- Add optional classes for custom styling @tinko92
|
||||
- Fix missing details on activity emails
|
||||
- Fix unrelated comments in board activity list
|
||||
- Fix search not working properly
|
||||
- Trigger comment notification on update only
|
||||
|
||||
|
||||
## 0.5.0 - 2018-11-15
|
||||
|
||||
### Added
|
||||
|
||||
- Activity stream for board and cards
|
||||
- Comments on cards
|
||||
- Use users locale format on date picker
|
||||
- Compact display mode
|
||||
- Card title inline editing
|
||||
- REST API
|
||||
- Empty content view for board lists
|
||||
- Undo for card and stack deletion
|
||||
- Show tag name on board
|
||||
- Notify users about card assignments
|
||||
- Add shortcut to assign a card to yourself
|
||||
- Improved view for printing
|
||||
- Support for Nextcloud 15
|
||||
|
||||
### Fixed
|
||||
|
||||
- Accesibility improvements
|
||||
- Don't allow empty card titles
|
||||
- Improved checkbox handling in markdown
|
||||
|
||||
|
||||
## 0.4.0 - 2018-07-11
|
||||
|
||||
### Added
|
||||
|
||||
@@ -9,6 +112,7 @@ All notable changes to this project will be documented in this file.
|
||||
- Embed attachments into the card description
|
||||
- Color picker to use any color value for board and labels
|
||||
- Support for checkboxes inside the description
|
||||
- occ command to export user data as JSON
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
13
Makefile
@@ -12,7 +12,7 @@ sign_dir=$(build_dir)/sign
|
||||
cert_dir=$(HOME)/.nextcloud/certificates
|
||||
|
||||
|
||||
default: build
|
||||
default: package
|
||||
|
||||
clean-build:
|
||||
rm -rf $(build_dir)
|
||||
@@ -20,12 +20,15 @@ clean-build:
|
||||
clean-dist:
|
||||
rm -rf js/node_modules
|
||||
|
||||
install-deps:
|
||||
install-deps: install-deps-js
|
||||
composer install
|
||||
|
||||
install-deps-js:
|
||||
cd js && npm install
|
||||
|
||||
build: build-js
|
||||
build: install-deps build-js
|
||||
|
||||
build-js: install-deps
|
||||
build-js: install-deps-js
|
||||
cd js && npm run build
|
||||
|
||||
build-js-dev: install-deps
|
||||
@@ -95,3 +98,5 @@ test-integration:
|
||||
test-js: install-deps
|
||||
cd js && run test
|
||||
|
||||
package:
|
||||
krankerl package
|
||||
|
||||
18
README.md
@@ -1,6 +1,6 @@
|
||||
# Deck
|
||||
|
||||
[](https://travis-ci.org/nextcloud/deck) [](https://codecov.io/github/nextcloud/deck) [](https://www.codacy.com/app/juliushaertl/deck?utm_source=github.com&utm_medium=referral&utm_content=nextcloud/deck&utm_campaign=Badge_Grade) [](https://scrutinizer-ci.com/g/nextcloud/deck/?branch=master) [](https://www.versioneye.com/user/projects/5af6c4090fb24f0e3a423c40) [](https://webchat.freenode.net/?channels=nextcloud-deck)
|
||||
[](https://travis-ci.org/nextcloud/deck) [](https://codecov.io/github/nextcloud/deck) [](https://www.codacy.com/app/juliushaertl/deck?utm_source=github.com&utm_medium=referral&utm_content=nextcloud/deck&utm_campaign=Badge_Grade) [](https://scrutinizer-ci.com/g/nextcloud/deck/?branch=master) [](https://webchat.freenode.net/?channels=nextcloud-deck)
|
||||
|
||||
|
||||
Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.
|
||||
@@ -9,14 +9,18 @@ Deck is a kanban style organization tool aimed at personal planning and project
|
||||
- :page_facing_up: Write down additional notes in markdown
|
||||
- :bookmark: Assign labels for even better organization
|
||||
- :busts_in_silhouette: Share with your team, friends or family
|
||||
- :family: Integrates with the [Circles](https://github.com/nextcloud/circles) app!
|
||||
- :paperclip: Attach files and embed them in your markdown description
|
||||
- :speech_balloon: Discuss with your team using comments
|
||||
- :zap: Keep track of changes in the activity stream
|
||||
- :rocket: Get your project organized
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
## Installation/Update
|
||||
|
||||
This app is supposed to work on Nextcloud version 12 or later.
|
||||
This app is supposed to work on the two latest Nextcloud versions.
|
||||
|
||||
### Install latest release
|
||||
|
||||
@@ -30,10 +34,10 @@ If you want to run the latest development version from git source, you need to c
|
||||
git clone https://github.com/nextcloud/deck.git
|
||||
cd deck
|
||||
make install-deps
|
||||
make
|
||||
make build
|
||||
```
|
||||
|
||||
Please make sure you have installed the following dependencies: `make, which, tar, npm, curl`
|
||||
Please make sure you have installed the following dependencies: `make, which, tar, npm, curl, composer`
|
||||
|
||||
### Install the nightly builds
|
||||
|
||||
@@ -54,13 +58,15 @@ You can use the provided Makefile to run all tests by using:
|
||||
|
||||
make test
|
||||
|
||||
### Documentation
|
||||
|
||||
The documentation for our REST API can be found at https://deck.readthedocs.io/en/latest/API/
|
||||
|
||||
## Contribution Guidelines
|
||||
|
||||
Please read the [Code of Conduct](https://nextcloud.com/community/code-of-conduct/). This document offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere, and to explain how together we can strengthen and support each other.
|
||||
|
||||
For more information please review the [guidelines for contributing](https://github.com/nextcloud/server/blob/master/CONTRIBUTING.md) to this repository.
|
||||
For more information please review the [guidelines for contributing](https://github.com/nextcloud/server/blob/master/.github/CONTRIBUTING.md) to this repository.
|
||||
|
||||
### Apply a license
|
||||
|
||||
|
||||
@@ -21,6 +21,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
if ((@include_once __DIR__ . '/../vendor/autoload.php')===false) {
|
||||
throw new Exception('Cannot include autoload. Did you run install dependencies using composer?');
|
||||
}
|
||||
|
||||
$app = new \OCA\Deck\AppInfo\Application();
|
||||
$app->registerNavigationEntry();
|
||||
$app->registerNotifications();
|
||||
$app->registerNotifications();
|
||||
$app->registerCommentsEntity();
|
||||
$app->registerFullTextSearch();
|
||||
|
||||
/** Load activity style global so it is availabile in the activity app as well */
|
||||
\OC_Util::addStyle('deck', 'activity');
|
||||
|
||||
@@ -5,20 +5,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Deck\AppInfo;
|
||||
@@ -28,4 +28,4 @@ use OCP\AppFramework\App;
|
||||
/**
|
||||
* Additional autoloader registration, e.g. registering composer autoloaders
|
||||
*/
|
||||
// require_once __DIR__ . '/../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
@@ -46,6 +46,13 @@
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
<field>
|
||||
<name>last_modified</name>
|
||||
<type>integer</type>
|
||||
<default></default>
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
</declaration>
|
||||
</table>
|
||||
<table>
|
||||
@@ -77,6 +84,21 @@
|
||||
<length>8</length>
|
||||
<notnull>false</notnull>
|
||||
</field>
|
||||
<field>
|
||||
<name>deleted_at</name>
|
||||
<type>integer</type>
|
||||
<default>0</default>
|
||||
<length>8</length>
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
<field>
|
||||
<name>last_modified</name>
|
||||
<type>integer</type>
|
||||
<default></default>
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
<index>
|
||||
<name>deck_stacks_board_id_index</name>
|
||||
<field>
|
||||
@@ -113,6 +135,11 @@
|
||||
<type>clob</type>
|
||||
<notnull>false</notnull>
|
||||
</field>
|
||||
<field>
|
||||
<name>description_prev</name>
|
||||
<type>clob</type>
|
||||
<notnull>false</notnull>
|
||||
</field>
|
||||
<field>
|
||||
<name>stack_id</name>
|
||||
<type>integer</type>
|
||||
@@ -133,6 +160,12 @@
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
<field>
|
||||
<name>last_editor</name>
|
||||
<type>text</type>
|
||||
<notnull>false</notnull>
|
||||
<length>64</length>
|
||||
</field>
|
||||
<field>
|
||||
<name>created_at</name>
|
||||
<type>integer</type>
|
||||
@@ -167,6 +200,14 @@
|
||||
<type>boolean</type>
|
||||
<default>false</default>
|
||||
</field>
|
||||
<field>
|
||||
<name>deleted_at</name>
|
||||
<type>integer</type>
|
||||
<default>0</default>
|
||||
<length>8</length>
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
<index>
|
||||
<name>deck_cards_stack_id_index</name>
|
||||
<field>
|
||||
@@ -276,6 +317,13 @@
|
||||
<notnull>true</notnull>
|
||||
<length>8</length>
|
||||
</field>
|
||||
<field>
|
||||
<name>last_modified</name>
|
||||
<type>integer</type>
|
||||
<default></default>
|
||||
<notnull>false</notnull>
|
||||
<unsigned>true</unsigned>
|
||||
</field>
|
||||
<index>
|
||||
<name>deck_labels_board_id_index</name>
|
||||
<field>
|
||||
|
||||
@@ -11,30 +11,62 @@
|
||||
- 📄 Write down additional notes in markdown
|
||||
- 🔖 Assign labels for even better organization
|
||||
- 👥 Share with your team, friends or family
|
||||
- 📎 Attach files and embed them in your markdown description
|
||||
- 💬 Discuss with your team using comments
|
||||
- ⚡ Keep track of changes in the activity stream
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>0.4.0-beta2</version>
|
||||
<version>0.6.3</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<namespace>Deck</namespace>
|
||||
<types>
|
||||
<dav />
|
||||
</types>
|
||||
<category>organization</category>
|
||||
<category>office</category>
|
||||
<website>https://github.com/nextcloud/deck</website>
|
||||
<bugs>https://github.com/nextcloud/deck/issues</bugs>
|
||||
<repository type="git">https://github.com/nextcloud/deck.git</repository>
|
||||
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Board.png</screenshot>
|
||||
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Details.png</screenshot>
|
||||
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/0.5/deck-notifications.png</screenshot>
|
||||
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/0.5/deck-comment2.png</screenshot>
|
||||
<dependencies>
|
||||
<nextcloud min-version="12" max-version="14" />
|
||||
<php min-version="5.6"/>
|
||||
<database min-version="9.4">pgsql</database>
|
||||
<database>sqlite</database>
|
||||
<database min-version="5.5">mysql</database>
|
||||
<nextcloud min-version="15" max-version="17" />
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||
<job>OCA\Deck\Cron\ScheduledNotifications</job>
|
||||
<job>OCA\Deck\Cron\CardDescriptionActivity</job>
|
||||
</background-jobs>
|
||||
<repair-steps>
|
||||
<post-migration>
|
||||
<step>OCA\Deck\Migration\UnknownUsers</step>
|
||||
</post-migration>
|
||||
</repair-steps>
|
||||
<commands>
|
||||
<command>OCA\Deck\Command\UserExport</command>
|
||||
</commands>
|
||||
<activity>
|
||||
<settings>
|
||||
<setting>OCA\Deck\Activity\Setting</setting>
|
||||
<setting>OCA\Deck\Activity\SettingComment</setting>
|
||||
<setting>OCA\Deck\Activity\DescriptionSetting</setting>
|
||||
</settings>
|
||||
<filters>
|
||||
<filter>OCA\Deck\Activity\Filter</filter>
|
||||
</filters>
|
||||
<providers>
|
||||
<provider>OCA\Deck\Activity\DeckProvider</provider>
|
||||
</providers>
|
||||
</activity>
|
||||
|
||||
<fulltextsearch>
|
||||
<provider min-version="16">OCA\Deck\Provider\DeckProvider</provider>
|
||||
</fulltextsearch>
|
||||
|
||||
</info>
|
||||
|
||||
@@ -3,28 +3,32 @@
|
||||
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
return [
|
||||
'routes' => [
|
||||
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
|
||||
|
||||
['name' => 'Config#get', 'url' => '/config', 'verb' => 'GET'],
|
||||
['name' => 'Config#setValue', 'url' => '/config/{key}', 'verb' => 'POST'],
|
||||
|
||||
// boards
|
||||
['name' => 'board#index', 'url' => '/boards', 'verb' => 'GET'],
|
||||
['name' => 'board#create', 'url' => '/boards', 'verb' => 'POST'],
|
||||
@@ -43,6 +47,7 @@ return [
|
||||
['name' => 'stack#update', 'url' => '/stacks/{stackId}', 'verb' => 'PUT'],
|
||||
['name' => 'stack#reorder', 'url' => '/stacks/{stackId}/reorder', 'verb' => 'PUT'],
|
||||
['name' => 'stack#delete', 'url' => '/stacks/{stackId}', 'verb' => 'DELETE'],
|
||||
['name' => 'stack#deleted', 'url' => '/{boardId}/stacks/deleted', 'verb' => 'GET'],
|
||||
['name' => 'stack#archived', 'url' => '/stacks/{boardId}/archived', 'verb' => 'GET'],
|
||||
|
||||
// cards
|
||||
@@ -50,6 +55,7 @@ return [
|
||||
['name' => 'card#create', 'url' => '/cards', 'verb' => 'POST'],
|
||||
['name' => 'card#update', 'url' => '/cards/{cardId}', 'verb' => 'PUT'],
|
||||
['name' => 'card#delete', 'url' => '/cards/{cardId}', 'verb' => 'DELETE'],
|
||||
['name' => 'card#deleted', 'url' => '/{boardId}/cards/deleted', 'verb' => 'GET'],
|
||||
['name' => 'card#rename', 'url' => '/cards/{cardId}/rename', 'verb' => 'PUT'],
|
||||
['name' => 'card#reorder', 'url' => '/cards/{cardId}/reorder', 'verb' => 'PUT'],
|
||||
['name' => 'card#archive', 'url' => '/cards/{cardId}/archive', 'verb' => 'PUT'],
|
||||
@@ -74,5 +80,47 @@ return [
|
||||
['name' => 'label#update', 'url' => '/labels/{labelId}', 'verb' => 'PUT'],
|
||||
['name' => 'label#delete', 'url' => '/labels/{labelId}', 'verb' => 'DELETE'],
|
||||
|
||||
// api
|
||||
['name' => 'board_api#index', 'url' => '/api/v1.0/boards', 'verb' => 'GET'],
|
||||
['name' => 'board_api#get', 'url' => '/api/v1.0/boards/{boardId}', 'verb' => 'GET'],
|
||||
['name' => 'board_api#create', 'url' => '/api/v1.0/boards', 'verb' => 'POST'],
|
||||
['name' => 'board_api#delete', 'url' => '/api/v1.0/boards/{boardId}', 'verb' => 'DELETE'],
|
||||
['name' => 'board_api#update', 'url' => '/api/v1.0/boards/{boardId}', 'verb' => 'PUT'],
|
||||
['name' => 'board_api#undo_delete', 'url' => '/api/v1.0/boards/{boardId}/undo_delete', 'verb' => 'POST'],
|
||||
['name' => 'board_api#addAcl', 'url' => '/api/v1.0/boards/{boardId}/acl', 'verb' => 'POST'],
|
||||
['name' => 'board_api#deleteAcl', 'url' => '/api/v1.0/boards/{boardId}/acl/{aclId}', 'verb' => 'DELETE'],
|
||||
['name' => 'board_api#updateAcl', 'url' => '/api/v1.0/boards/{boardId}/acl/{aclId}', 'verb' => 'PUT'],
|
||||
|
||||
|
||||
['name' => 'stack_api#index', 'url' => '/api/v1.0/boards/{boardId}/stacks', 'verb' => 'GET'],
|
||||
['name' => 'stack_api#getArchived', 'url' => '/api/v1.0/boards/{boardId}/stacks/archived', 'verb' => 'GET'],
|
||||
['name' => 'stack_api#get', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}', 'verb' => 'GET'],
|
||||
['name' => 'stack_api#create', 'url' => '/api/v1.0/boards/{boardId}/stacks', 'verb' => 'POST'],
|
||||
['name' => 'stack_api#update', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}', 'verb' => 'PUT'],
|
||||
['name' => 'stack_api#delete', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}', 'verb' => 'DELETE'],
|
||||
|
||||
['name' => 'card_api#get', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}', 'verb' => 'GET'],
|
||||
['name' => 'card_api#create', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards', 'verb' => 'POST'],
|
||||
['name' => 'card_api#update', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}', 'verb' => 'PUT'],
|
||||
['name' => 'card_api#assignLabel', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignLabel', 'verb' => 'PUT'],
|
||||
['name' => 'card_api#removeLabel', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/removeLabel', 'verb' => 'PUT'],
|
||||
['name' => 'card_api#assignUser', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignUser', 'verb' => 'PUT'],
|
||||
['name' => 'card_api#unassignUser', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/unassignUser', 'verb' => 'PUT'],
|
||||
['name' => 'card_api#reorder', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/reorder', 'verb' => 'PUT'],
|
||||
['name' => 'card_api#delete', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}', 'verb' => 'DELETE'],
|
||||
|
||||
['name' => 'label_api#get', 'url' => '/api/v1.0/boards/{boardId}/labels/{labelId}', 'verb' => 'GET'],
|
||||
['name' => 'label_api#create', 'url' => '/api/v1.0/boards/{boardId}/labels', 'verb' => 'POST'],
|
||||
['name' => 'label_api#update', 'url' => '/api/v1.0/boards/{boardId}/labels/{labelId}', 'verb' => 'PUT'],
|
||||
['name' => 'label_api#delete', 'url' => '/api/v1.0/boards/{boardId}/labels/{labelId}', 'verb' => 'DELETE'],
|
||||
|
||||
['name' => 'attachment_api#getAll', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments', 'verb' => 'GET'],
|
||||
['name' => 'attachment_api#display', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}', 'verb' => 'GET'],
|
||||
['name' => 'attachment_api#create', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments', 'verb' => 'POST'],
|
||||
['name' => 'attachment_api#update', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}', 'verb' => 'PUT'],
|
||||
['name' => 'attachment_api#delete', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}', 'verb' => 'DELETE'],
|
||||
['name' => 'attachment_api#restore', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}/restore', 'verb' => 'PUT'],
|
||||
|
||||
['name' => 'board_api#preflighted_cors', 'url' => '/api/v1.0/{path}','verb' => 'OPTIONS', 'requirements' => ['path' => '.+']],
|
||||
]
|
||||
];
|
||||
|
||||
@@ -8,9 +8,12 @@
|
||||
"email": "jus@bitgrid.net"
|
||||
}
|
||||
],
|
||||
"require": {},
|
||||
"require": {
|
||||
"cogpowered/finediff": "0.3.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"christophwurst/nextcloud": "^13.0",
|
||||
"roave/security-advisories": "dev-master",
|
||||
"christophwurst/nextcloud": "^15.0",
|
||||
"jakub-onderka/php-parallel-lint": "^1.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
28
css/activity.css
Normal file
@@ -0,0 +1,28 @@
|
||||
.activitymessage .visualdiff ins {
|
||||
background-color: rgba(70, 186, 97, 0.2);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.activitymessage .visualdiff del {
|
||||
background-color: rgba(233, 50, 45, 0.2);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.activitymessage .visualdiff {
|
||||
overflow: scroll;
|
||||
max-height: 200px;
|
||||
}
|
||||
|
||||
.activityTabView .avatardiv-container {
|
||||
display: inline-block;
|
||||
bottom: -3px;
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.activityTabView .avatar-name-wrapper {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.activityTabView .activitysubject a {
|
||||
font-weight: bold;
|
||||
}
|
||||
43
css/animations.scss
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu>
|
||||
*
|
||||
* @author 2018 Michael Weimann <mail@michael-weimann.eu>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
.compact-item.ng-enter,
|
||||
.compact-item.ng-leave {
|
||||
overflow: hidden;
|
||||
transition: all 250ms linear;
|
||||
}
|
||||
|
||||
.compact-item.ng-enter {
|
||||
max-height: 0;
|
||||
|
||||
&.ng-enter-active {
|
||||
max-height: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
.compact-item.ng-leave {
|
||||
max-height: 50px;
|
||||
|
||||
&.ng-leave-active {
|
||||
max-height: 0;
|
||||
}
|
||||
}
|
||||
77
css/autocomplete.scss
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* based upon apps/comments/js/vendor/At.js/dist/css/jquery.atwho.css,
|
||||
* only changed colors and font-weight
|
||||
*/
|
||||
|
||||
.atwho-view {
|
||||
position:absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: none;
|
||||
margin-top: 18px;
|
||||
background: var(--color-main-background);
|
||||
color: var(--color-main-text);
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: var(--border-radius);
|
||||
box-shadow: 0 0 5px var(--color-box-shadow);
|
||||
min-width: 120px;
|
||||
z-index: 11110 !important;
|
||||
}
|
||||
|
||||
.atwho-view .atwho-header {
|
||||
padding: 5px;
|
||||
margin: 5px;
|
||||
cursor: pointer;
|
||||
border-bottom: solid 1px var(--color-border);
|
||||
color: var(--color-main-text);
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.atwho-view .atwho-header .small {
|
||||
color: var(--color-main-text);
|
||||
float: right;
|
||||
padding-top: 2px;
|
||||
margin-right: -5px;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.atwho-view .atwho-header:hover {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.atwho-view .cur {
|
||||
background: var(--color-primary);
|
||||
color: var(--color-primary-text);
|
||||
}
|
||||
.atwho-view .cur small {
|
||||
color: var(--color-primary-text);
|
||||
}
|
||||
.atwho-view strong {
|
||||
color: var(--color-main-text);
|
||||
font-weight: normal;
|
||||
}
|
||||
.atwho-view .cur strong {
|
||||
color: var(--color-primary-text);
|
||||
font-weight: normal;
|
||||
}
|
||||
.atwho-view ul {
|
||||
/* width: 100px; */
|
||||
list-style:none;
|
||||
padding:0;
|
||||
margin:auto;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.atwho-view ul li {
|
||||
display: block;
|
||||
padding: 5px 10px;
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
cursor: pointer;
|
||||
}
|
||||
.atwho-view small {
|
||||
font-size: smaller;
|
||||
color: var(--color-main-text);
|
||||
font-weight: normal;
|
||||
}
|
||||
10
css/collections.css
Normal file
@@ -0,0 +1,10 @@
|
||||
.icon-deck {
|
||||
background-image: url('../img/deck-dark.svg');
|
||||
}
|
||||
|
||||
.resource-type-deck img {
|
||||
opacity: 0.4 !important;
|
||||
}
|
||||
.resource-type-deck:hover img {
|
||||
opacity: 0.7 !important;
|
||||
}
|
||||
261
css/comments.scss
Normal file
@@ -0,0 +1,261 @@
|
||||
/*
|
||||
* Copyright (c) 2016
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3
|
||||
* or later.
|
||||
*
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
#commentsTabView .emptycontent {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm {
|
||||
margin-left: 36px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm .message {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
min-height: 44px;
|
||||
margin: 0;
|
||||
|
||||
/* Prevent the text from overlapping with the submit button. */
|
||||
padding-right: 30px;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm {
|
||||
.submit,
|
||||
.submitLoading {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
margin: 0;
|
||||
padding: 13px;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
opacity: .3;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
#commentsTabView .deleteLoading {
|
||||
padding: 14px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm .submit:not(:disabled):hover,
|
||||
#commentsTabView .newCommentForm .submit:not(:disabled):focus {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm div.message {
|
||||
resize: none;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm div.message:empty:before {
|
||||
content: attr(data-placeholder);
|
||||
color: grey;
|
||||
}
|
||||
|
||||
#commentsTabView .comment {
|
||||
position: relative;
|
||||
/** padding bottom is little more so that the top and bottom gap look uniform **/
|
||||
padding: 10px 0 15px;
|
||||
}
|
||||
|
||||
#commentsTabView .comments .comment {
|
||||
border-top: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
#commentsTabView .comment .avatar,
|
||||
.atwho-view-ul * .avatar{
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .message .avatar,
|
||||
.atwho-view-ul * .avatar
|
||||
{
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#activityTabView li.comment.collapsed .activitymessage,
|
||||
#commentsTabView .comment.collapsed .message {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#activityTabView li.comment.collapsed .activitymessage,
|
||||
#commentsTabView .comment.collapsed .message {
|
||||
max-height: 70px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#activityTabView li.comment .message-overlay,
|
||||
#commentsTabView .comment .message-overlay {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#activityTabView li.comment.collapsed .message-overlay,
|
||||
#commentsTabView .comment.collapsed .message-overlay {
|
||||
display: block;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
height: 50px;
|
||||
pointer-events: none;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: -moz-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));
|
||||
background: -webkit-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));
|
||||
background: -o-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));
|
||||
background: -ms-linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));
|
||||
background: linear-gradient(rgba(var(--color-main-background), 0), var(--color-main-background));
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
#commentsTabView .hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/** set min-height as 44px to ensure that it fits the button sizes. **/
|
||||
#commentsTabView .comment .authorRow {
|
||||
min-height: 44px;
|
||||
}
|
||||
#commentsTabView .comment .authorRow .tooltip {
|
||||
/** because of the padding on the element, the tooltip appear too far up,
|
||||
adding this brings them closer to the element**/
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.atwho-view-ul * .avatar-name-wrapper,
|
||||
#commentsTabView .comment .authorRow {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser),
|
||||
#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar,
|
||||
#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar img,
|
||||
#commentsTabView .comment .authorRow .avatar:not(.currentUser),
|
||||
#commentsTabView .comment .authorRow .author:not(.currentUser) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.atwho-view-ul .avatar-name-wrapper,
|
||||
.atwho-view-ul .avatar-name-wrapper .avatar,
|
||||
.atwho-view-ul .avatar-name-wrapper .avatar img {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#commentsTabView .comments li .message .atwho-inserted,
|
||||
#commentsTabView .newCommentForm .atwho-inserted {
|
||||
.avatar-name-wrapper {
|
||||
/* Make the wrapper the positioning context of its child contacts
|
||||
* menu. */
|
||||
position: relative;
|
||||
|
||||
display: inline;
|
||||
vertical-align: top;
|
||||
background-color: var(--color-background-dark);
|
||||
border-radius: 50vh;
|
||||
padding: 1px 7px 1px 1px;
|
||||
|
||||
/* Ensure that the avatar and the user name will be kept together. */
|
||||
white-space: nowrap;
|
||||
|
||||
.avatar {
|
||||
img {
|
||||
vertical-align: top;
|
||||
}
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
vertical-align: middle;
|
||||
padding: 1px;
|
||||
margin-top: -3px;
|
||||
margin-left: 0;
|
||||
margin-right: 2px;
|
||||
}
|
||||
strong {
|
||||
/* Ensure that the user name is shown in bold, as different browsers
|
||||
* use different font weights for strong elements. */
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.avatar-name-wrapper.currentUser {
|
||||
background-color: var(--color-primary);
|
||||
color: var(--color-primary-text);
|
||||
}
|
||||
}
|
||||
|
||||
.atwho-view-ul * .avatar-name-wrapper {
|
||||
white-space: nowrap;
|
||||
}
|
||||
#commentsTabView .comment .author,
|
||||
#commentsTabView .comment .date {
|
||||
opacity: .5;
|
||||
}
|
||||
#commentsTabView .comment .author {
|
||||
max-width: 210px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#commentsTabView .comment .date {
|
||||
margin-left: auto;
|
||||
/** this is to fix the tooltip being too close due to the margin-top applied
|
||||
to bring the tooltip closer for the action icons **/
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
#commentsTabView .comments > li:not(.newCommentRow) .message {
|
||||
padding-left: 40px;
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .action {
|
||||
opacity: 0.3;
|
||||
padding: 14px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .action:hover,
|
||||
#commentsTabView .comment .action:focus {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentRow .action-container {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
#commentsTabView .comment.disabled .message {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
#commentsTabView .comment.disabled .action {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#commentsTabView .message.error {
|
||||
color: #e9322d;
|
||||
border-color: #e9322d;
|
||||
box-shadow: 0 0 6px #f8b9b7;
|
||||
}
|
||||
|
||||
.app-files .action-comment {
|
||||
padding: 16px 14px;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .message .contactsmenu-popover {
|
||||
left: -6px;
|
||||
top: 24px;
|
||||
}
|
||||
43
css/compact-mode.scss
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu>
|
||||
*
|
||||
* @author 2018 Michael Weimann <mail@michael-weimann.eu>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
.compact-mode {
|
||||
.card {
|
||||
margin: $compact-board-item-margin;
|
||||
|
||||
&:last-child {
|
||||
margin: $compact-board-last-item-margin;
|
||||
}
|
||||
}
|
||||
|
||||
.stack {
|
||||
.as-sortable-placeholder {
|
||||
margin: $compact-board-item-margin;
|
||||
min-height: 43px;
|
||||
height: 43px;
|
||||
|
||||
&:last-child {
|
||||
margin: $compact-board-last-item-margin;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,9 +34,47 @@
|
||||
}
|
||||
|
||||
.icon-home {
|
||||
background-image: url('../../../core/img/places/home.svg');
|
||||
background-image: var(--icon-home-000, url('../../../core/img/places/home.svg'));
|
||||
}
|
||||
|
||||
.icon-description {
|
||||
background-image: var(--icon-text-000, url('../img/description.svg'));
|
||||
}
|
||||
|
||||
.icon-badge {
|
||||
background-image: url('../../../core/img/places/calendar-dark.svg');
|
||||
background-image: url('../img/calendar-dark.svg');
|
||||
}
|
||||
|
||||
.icon-toggle-compact-collapsed {
|
||||
background-image: url('../img/toggle-view-expand.svg');
|
||||
}
|
||||
|
||||
.icon-toggle-compact-expanded {
|
||||
background-image: url('../img/toggle-view-collapse.svg');
|
||||
}
|
||||
|
||||
@if mixin-exists('icon-black-white') {
|
||||
@include icon-black-white('deck', 'deck', 1);
|
||||
@include icon-black-white('archive', 'deck', 1);
|
||||
@include icon-black-white('circles', 'deck', 1);
|
||||
|
||||
.icon-toggle-compact-collapsed {
|
||||
@include icon-color('toggle-view-expand', 'deck', $color-black);
|
||||
}
|
||||
|
||||
.icon-toggle-compact-expanded {
|
||||
@include icon-color('toggle-view-collapse', 'deck', $color-black);
|
||||
}
|
||||
.icon-activity {
|
||||
@include icon-color('activity-dark', 'activity', $color-black);
|
||||
}
|
||||
}
|
||||
|
||||
.avatardiv.circles {
|
||||
background: var(--color-primary);
|
||||
}
|
||||
.icon-circles {
|
||||
opacity: 1;
|
||||
background-size: 20px;
|
||||
background-position: center center;
|
||||
}
|
||||
90
css/print.scss
Normal file
@@ -0,0 +1,90 @@
|
||||
@media print {
|
||||
/* hide stuff */
|
||||
#body-user {
|
||||
#header,
|
||||
div#app-navigation,
|
||||
div.board-header-controls,
|
||||
#app-navigation-toggle,
|
||||
#app-navigation-toggle-custom,
|
||||
div#controls.ng-scope div.crumb:not(.title),
|
||||
div#controls.ng-scope div.crumb a.bullet,
|
||||
a.ng-binding + a,
|
||||
div.card.create,
|
||||
button.card-options {
|
||||
display: none !important;
|
||||
}
|
||||
#content {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
#app-content {
|
||||
margin: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
div#app-navigation-toggle.icon-menu {
|
||||
display:block;
|
||||
width:0px;
|
||||
height:0px;
|
||||
background:none;
|
||||
}
|
||||
|
||||
/* title */
|
||||
div#controls.ng-scope {padding-left:20px;}
|
||||
div#controls.ng-scope div.crumb.title {
|
||||
display:inline;
|
||||
font-size: 2em;
|
||||
line-height:2.5em;
|
||||
background:none;
|
||||
}
|
||||
|
||||
div#controls.ng-scope div.crumb.title a.ng-binding {
|
||||
color:#000;
|
||||
opacity:1;
|
||||
}
|
||||
|
||||
/*Due, assigned-users and description*/
|
||||
div.card-controls {
|
||||
flex-direction:row;
|
||||
flex-wrap:wrap;
|
||||
}
|
||||
div.card-controls i.icon.icon-filetype-text {background:none;}
|
||||
div.card-controls i.icon.icon-filetype-text:after {
|
||||
content: attr(title);
|
||||
display:block;
|
||||
width:289px;
|
||||
height:1.5em;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
span.due { }
|
||||
|
||||
div.card-assigned-users {
|
||||
margin-right:10px;
|
||||
}
|
||||
|
||||
ul.labels li.ng-scope span.ng-binding {
|
||||
color:#000;
|
||||
display:inline;
|
||||
padding-left:5px;
|
||||
}
|
||||
|
||||
/* Layout */
|
||||
@page {
|
||||
size: A4 landscape;
|
||||
margin: 2cm;
|
||||
}
|
||||
|
||||
div#innerBoard {
|
||||
display:flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
div.stack.ng-scope.as-sortable-item {border-right: 1px solid #000;}
|
||||
|
||||
div#innerBoard.ng-pristine.ng-untouched.ng-valid.ng-scope.ng-not-empty div.stack.ng-scope.as-sortable-item:nth-child(6n) {
|
||||
page-break-after: always;
|
||||
}
|
||||
}
|
||||
406
css/style.scss
@@ -5,6 +5,7 @@
|
||||
* @author Artem Anufrij <artem.anufrij@live.de>
|
||||
* @author Marin Treselj <marin@pixelipo.com>
|
||||
* @author Oskar Kurz <oskar.kurz@gmail.com>
|
||||
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
@@ -23,17 +24,30 @@
|
||||
*
|
||||
*/
|
||||
|
||||
// colors
|
||||
$color-warning-light: nc-lighten($color-warning, 15%);
|
||||
$color-lightgrey: nc-darken($color-main-background, 4%);
|
||||
$color-grey: nc-darken($color-main-background, 7%);
|
||||
$color-darkgrey: nc-darken($color-main-background, 32%);
|
||||
|
||||
@import 'comp-appnav.scss';
|
||||
@import 'icons.scss';
|
||||
// margins/paddings
|
||||
$board-item-margin: 10px 10px 20px 10px;
|
||||
$board-last-item-margin: 10px;
|
||||
|
||||
$compact-board-item-margin: 5px 10px 10px 10px;
|
||||
$compact-board-last-item-margin: 5px 10px 10px;
|
||||
|
||||
@import 'comp-appnav';
|
||||
@import 'icons';
|
||||
@import 'animations';
|
||||
@import 'compact-mode';
|
||||
@import 'autocomplete';
|
||||
@import 'comments';
|
||||
|
||||
/**
|
||||
* General styles
|
||||
*/
|
||||
|
||||
button,
|
||||
.button,
|
||||
.app-deck .icon {
|
||||
@@ -70,6 +84,26 @@ input.input-inline {
|
||||
cursor: text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic app layout
|
||||
*/
|
||||
|
||||
#content {
|
||||
height: 100%;
|
||||
min-height: initial;
|
||||
}
|
||||
|
||||
.app.app-deck {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#app-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation sidebar
|
||||
*/
|
||||
@@ -115,6 +149,22 @@ input.input-inline {
|
||||
|
||||
}
|
||||
|
||||
#app-settings-content {
|
||||
overflow: initial;
|
||||
|
||||
.ui-select-match-item {
|
||||
border: 1px solid var(--color-background-darker) !important;
|
||||
.select-label {
|
||||
color: var(--color-main-text);
|
||||
}
|
||||
}
|
||||
|
||||
p.hint {
|
||||
margin-top: 10px;
|
||||
color: var(--color-text-light);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Board view
|
||||
*/
|
||||
@@ -123,7 +173,7 @@ input.input-inline {
|
||||
z-index: 999;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: $color-main-background;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
}
|
||||
|
||||
#board {
|
||||
@@ -152,10 +202,10 @@ input.input-inline {
|
||||
&.card-selected {
|
||||
|
||||
.card {
|
||||
box-shadow: 0px 0px 7px 0px $color-grey;
|
||||
box-shadow: 0px 0px 7px 0px var(--color-background-darker, $color-grey);
|
||||
|
||||
&.current {
|
||||
box-shadow: 0px 0px 7px 0px $color-darkgrey;
|
||||
box-shadow: 0px 0px 7px 0px var(--color-text-lighter, $color-darkgrey);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -180,10 +230,16 @@ input.input-inline {
|
||||
padding: 10px;
|
||||
|
||||
> .as-sortable-placeholder {
|
||||
display: inline-block !important;
|
||||
display: flex !important;
|
||||
width: 320px;
|
||||
min-width: 320px;
|
||||
margin-top: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
> .as-sortable-drag {
|
||||
background-color: var(--color-main-background $color-main-background);
|
||||
}
|
||||
}
|
||||
|
||||
#controls {
|
||||
@@ -221,9 +277,17 @@ input.input-inline {
|
||||
}
|
||||
|
||||
button {
|
||||
height: inherit;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 9px;
|
||||
}
|
||||
|
||||
#stack-add form {
|
||||
button {
|
||||
height: auto;
|
||||
width: 32px;
|
||||
}
|
||||
}
|
||||
input[type='text'] {
|
||||
padding: 6px;
|
||||
border: 0 none transparent;
|
||||
@@ -238,7 +302,7 @@ input.input-inline {
|
||||
}
|
||||
}
|
||||
|
||||
#app-navigation-toggle {
|
||||
#app-navigation-toggle-custom {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
cursor: pointer;
|
||||
@@ -288,7 +352,7 @@ input.input-inline {
|
||||
}
|
||||
|
||||
#stack-add {
|
||||
background-color: $color-lightgrey;
|
||||
background-color: var(--color-background-dark, $color-lightgrey);
|
||||
border-radius: 3px;
|
||||
margin: 3px;
|
||||
display: flex;
|
||||
@@ -333,9 +397,8 @@ input.input-inline {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
font-size: 12pt;
|
||||
font-weight: 700;
|
||||
border: 0;
|
||||
background-color: $color-main-background;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
min-height: initial;
|
||||
}
|
||||
|
||||
@@ -358,15 +421,20 @@ input.input-inline {
|
||||
}
|
||||
|
||||
.as-sortable-placeholder {
|
||||
margin: 10px 10px 20px 10px;
|
||||
margin: $board-item-margin;
|
||||
border: 1px dashed $color-darkgrey;
|
||||
min-height: 96px;
|
||||
transition: margin 250ms linear;
|
||||
|
||||
&:last-child {
|
||||
margin: 10px;
|
||||
margin: $board-last-item-margin;
|
||||
}
|
||||
}
|
||||
|
||||
&.as-sortable-item {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
> ul {
|
||||
display: flex;
|
||||
@@ -375,17 +443,17 @@ input.input-inline {
|
||||
|
||||
}
|
||||
|
||||
|
||||
.card {
|
||||
background-color: $color-main-background;
|
||||
margin: 10px 10px 20px 10px;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
margin: $board-item-margin;
|
||||
white-space: normal;
|
||||
position: relative;
|
||||
box-shadow: 0 0 3px $color-darkgrey;
|
||||
box-shadow: 0 0 3px 1px var(--color-background-darker, $color-darkgrey);
|
||||
border-radius: 3px;
|
||||
transition: margin 250ms linear;
|
||||
|
||||
&:last-child {
|
||||
margin: 10px;
|
||||
margin: $board-last-item-margin;
|
||||
}
|
||||
|
||||
&.archived .card-upper {
|
||||
@@ -409,7 +477,7 @@ input.input-inline {
|
||||
}
|
||||
|
||||
.card-controls {
|
||||
background: $color-lightgrey;
|
||||
background: var(--color-background-dark, $color-lightgrey);
|
||||
display: flex;
|
||||
position: relative;
|
||||
padding-left: 10px;
|
||||
@@ -422,9 +490,10 @@ input.input-inline {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.icon-filetype-text {
|
||||
.icon-description {
|
||||
margin: 10px;
|
||||
margin-left: 0px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.due {
|
||||
@@ -442,7 +511,7 @@ input.input-inline {
|
||||
|
||||
&.overdue {
|
||||
background-color: $color-error;
|
||||
color: $color-primary-text;
|
||||
color: var(--color-primary-text, $color-primary-text);
|
||||
|
||||
.icon-badge {
|
||||
background-image: url('../img/calendar-white.svg');
|
||||
@@ -460,7 +529,7 @@ input.input-inline {
|
||||
}
|
||||
}
|
||||
|
||||
.card-tasks, .card-files {
|
||||
.card-tasks, .card-files, .card-comments {
|
||||
border-radius: 3px;
|
||||
margin: 4px 4px 4px 0px;
|
||||
padding: 0 2px;
|
||||
@@ -489,37 +558,39 @@ input.input-inline {
|
||||
font-weight: normal;
|
||||
font-size: 10pt;
|
||||
padding: 0;
|
||||
margin: 5px;
|
||||
margin: 0 5px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
&.has-labels h4 {
|
||||
margin-top: 15px;
|
||||
span {
|
||||
padding: 6px 0;
|
||||
padding-top: 7px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
input {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.labels {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
left: 10px;
|
||||
position: relative;
|
||||
margin-left: 5px;
|
||||
|
||||
li {
|
||||
padding: 0;
|
||||
width: 15px;
|
||||
height: 20px;
|
||||
padding: 0 4px;
|
||||
margin: 0 2px 2px 0;
|
||||
border-radius: 3px;
|
||||
font-size: 80%;
|
||||
font-size: 75%;
|
||||
border: none transparent;
|
||||
float: left;
|
||||
|
||||
span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&:hover span {
|
||||
position: absolute;
|
||||
padding: 3px;
|
||||
display: inline-block;
|
||||
font-weight: bold;
|
||||
background-color: inherit;
|
||||
line-height: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -584,7 +655,7 @@ input.input-inline {
|
||||
min-height: 16px;
|
||||
}
|
||||
|
||||
.popovermenu {
|
||||
.popovermenu:not(.action-item__menu) {
|
||||
z-index: 999;
|
||||
opacity: 1;
|
||||
display: block;
|
||||
@@ -617,25 +688,19 @@ input.input-inline {
|
||||
/**
|
||||
* App sidebar
|
||||
*/
|
||||
#app-sidebar {
|
||||
right: -500px;
|
||||
max-width: 100%;
|
||||
width: 500px;
|
||||
display:flex;
|
||||
flex-direction: column;
|
||||
|
||||
&.details-visible {
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
#sidebar-header {
|
||||
|
||||
position: sticky;
|
||||
top: 0;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
z-index: 200;
|
||||
|
||||
h3 {
|
||||
font-size: 14pt;
|
||||
padding: 9px 10px;
|
||||
padding: 15px 15px 3px;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: $color-lightgrey;
|
||||
|
||||
input {
|
||||
min-height: 0px;
|
||||
@@ -643,6 +708,12 @@ input.input-inline {
|
||||
}
|
||||
}
|
||||
|
||||
#card-dates {
|
||||
font-size: 80%;
|
||||
opacity: 0.5;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
.icon-close {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
@@ -662,7 +733,7 @@ input.input-inline {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #fff;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
z-index: 100;
|
||||
opacity: 0.9;
|
||||
text-align: center;
|
||||
@@ -683,7 +754,7 @@ input.input-inline {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 15px;
|
||||
padding: 0 15px;
|
||||
|
||||
.duedate {
|
||||
display: flex;
|
||||
@@ -722,6 +793,7 @@ input.input-inline {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.section-header-tabbed {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 5px;
|
||||
@@ -731,8 +803,15 @@ input.input-inline {
|
||||
margin: 0;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.tabDetails {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.tabDetails {
|
||||
display: flex;
|
||||
height: 40px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
input[type=button] {
|
||||
width: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -742,15 +821,14 @@ input.input-inline {
|
||||
padding: 0 10px;
|
||||
font-size: 8pt;
|
||||
display: none;
|
||||
align-self: flex-end;
|
||||
text-align: center;
|
||||
&.saved {
|
||||
background-color: $color-success;
|
||||
color: $color-primary-text;
|
||||
}
|
||||
&.unsaved {
|
||||
background-color: $color-lightgrey;
|
||||
color: $color-darkgrey;
|
||||
background-color: var(--color-background-dark, $color-lightgrey);
|
||||
color: var(--color-text-light, $color-darkgrey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -760,12 +838,6 @@ input.input-inline {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#card-dates {
|
||||
font-size: 80%;
|
||||
opacity: 0.5;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.card-details-assign-users {
|
||||
|
||||
.select2 .ui-select-choices-row-inner {
|
||||
@@ -799,6 +871,7 @@ input.input-inline {
|
||||
background-color: rgba($color-darkgrey, 0.5);
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 300;
|
||||
}
|
||||
.attachment-list {
|
||||
&.selector {
|
||||
@@ -811,10 +884,10 @@ input.input-inline {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: $color-main-background;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
z-index: 2;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 0 3px $color-darkgrey;
|
||||
box-shadow: 0 0 3px var(--color-background-dark, $color-darkgrey);
|
||||
overflow: scroll;
|
||||
}
|
||||
h3.attachment-selector {
|
||||
@@ -877,6 +950,9 @@ input.input-inline {
|
||||
button.icon-history {
|
||||
width: 44px;
|
||||
}
|
||||
progress {
|
||||
margin-top: 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -905,30 +981,80 @@ input.input-inline {
|
||||
}
|
||||
|
||||
.container {
|
||||
background-color: $color-main-background;
|
||||
background-color: var(--color-main-background, $color-main-background);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#card-attachments {
|
||||
ul {
|
||||
margin: 5px;
|
||||
.activity-icon {
|
||||
opacity: 1 !important;
|
||||
.avatardiv-container {
|
||||
top: -4px;
|
||||
left: -7px;
|
||||
margin-right: 5px;
|
||||
img {
|
||||
max-width: 24px;
|
||||
max-height: 24px;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.details {
|
||||
font-size: 8pt;
|
||||
padding-left: 15px;
|
||||
& > img {
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
#app-content {
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
.activitysubject.commentAuthor {
|
||||
margin-left: 26px;
|
||||
margin-right: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.activityTabView {
|
||||
.activity {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.activitytime {
|
||||
margin: 0 !important;
|
||||
}
|
||||
}
|
||||
.activitysubject .app-popover-menu-utils {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
a {
|
||||
font-weight: normal;
|
||||
}
|
||||
button {
|
||||
opacity: .5;
|
||||
padding: 7px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
&.details-visible {
|
||||
margin-right: 500px;
|
||||
#commentsTabView {
|
||||
.newCommentRow .avatardiv-container {
|
||||
left: -7px;
|
||||
}
|
||||
.comment {
|
||||
position: relative;
|
||||
padding: 0 0 15px;
|
||||
|
||||
.avatardiv {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
}
|
||||
.newCommentForm {
|
||||
margin-left: 26px;
|
||||
}
|
||||
}
|
||||
|
||||
.card-attachments {
|
||||
.error {
|
||||
padding-left: 38px;
|
||||
margin-bottom: 5px;
|
||||
background-position: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -976,8 +1102,8 @@ input.input-inline {
|
||||
}
|
||||
}
|
||||
|
||||
.colorselect-label {
|
||||
background-image: url('../img/color_picker.svg');
|
||||
.colorselect-label, .colorselect-label-white {
|
||||
background-image: url('../img/color_picker-dark.svg');
|
||||
background-position: center center;
|
||||
background-repeat: no-repeat;
|
||||
opacity: 1;
|
||||
@@ -988,6 +1114,9 @@ input.input-inline {
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
.colorselect-label-white {
|
||||
background-image: url('../img/color_picker.svg');
|
||||
}
|
||||
}
|
||||
|
||||
.labels {
|
||||
@@ -1138,6 +1267,7 @@ input.input-inline {
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
vertical-align: middle;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.icon-delete {
|
||||
@@ -1163,7 +1293,7 @@ input.input-inline {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
|
||||
.icon-group {
|
||||
.icon-group, .icon {
|
||||
padding: 16px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
@@ -1177,6 +1307,22 @@ input.input-inline {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.board-detail__deleted-list__item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
* {
|
||||
flex-basis: 44px;
|
||||
}
|
||||
|
||||
.title {
|
||||
flex-grow: 2;
|
||||
}
|
||||
.live-relative-timestamp {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
|
||||
#board-detail-labels {
|
||||
ul li {
|
||||
input {
|
||||
@@ -1222,12 +1368,23 @@ input.input-inline {
|
||||
|
||||
.tabHeaders {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
overflow: initial;
|
||||
margin-bottom: 0;
|
||||
.icon {
|
||||
display: inline-block;
|
||||
background-size: contain;
|
||||
margin-right: 5px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
.tabsContainer {
|
||||
margin-top: 15px;
|
||||
height: 100%;
|
||||
|
||||
.tab {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.ui-select-offscreen {
|
||||
@@ -1238,7 +1395,7 @@ input.input-inline {
|
||||
padding: 0;
|
||||
float: left !important;
|
||||
display: block;
|
||||
border-radius: 0px 0px 5px 5px !important;
|
||||
border-radius: 3px !important;
|
||||
|
||||
.select-label {
|
||||
color: $color-primary-text;
|
||||
@@ -1269,6 +1426,10 @@ input.input-inline {
|
||||
}
|
||||
.select2-search-field {
|
||||
margin-right: -10px;
|
||||
flex-grow: 1;
|
||||
input {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1306,6 +1467,8 @@ input.input-inline {
|
||||
*/
|
||||
#markdown {
|
||||
width: 100% !important;
|
||||
min-height: 40px;
|
||||
cursor: text;
|
||||
|
||||
p {
|
||||
margin-bottom: 15px;
|
||||
@@ -1359,7 +1522,7 @@ input.input-inline {
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: $color-lightgrey;
|
||||
background-color: var(--color-background-dark, $color-lightgrey);
|
||||
padding: 3px;
|
||||
overflow: auto;
|
||||
|
||||
@@ -1382,11 +1545,50 @@ input.input-inline {
|
||||
display: inline-block;
|
||||
min-height: 12px;
|
||||
}
|
||||
li input[type=checkbox] {
|
||||
margin: 0px 10px 0px -20px;
|
||||
|
||||
li input[type="checkbox"].checkbox + label::before {
|
||||
margin-left: -15px;
|
||||
|
||||
}
|
||||
input[type="checkbox"].checkbox + label::before {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
margin-right: 10px;
|
||||
margin-top: 0;
|
||||
}
|
||||
li input[type="checkbox"].checkbox:not(:checked) + label::before {
|
||||
background-color: $color-main-background;
|
||||
}
|
||||
|
||||
table {
|
||||
margin-bottom: 10px;
|
||||
border-collapse: collapse;
|
||||
|
||||
thead {
|
||||
background-color: var(--color-background-dark, $color-lightgrey);
|
||||
}
|
||||
td, th {
|
||||
border: 1px solid var(--color-background-darker, $color-darkgrey);
|
||||
padding: 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.section-wrapper {
|
||||
display: flex;
|
||||
max-width: 100%;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.section-label {
|
||||
background-position: 0px center;
|
||||
width:28px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.section-details {
|
||||
flex-grow: 1;
|
||||
}
|
||||
/**
|
||||
* Mobile optimizations
|
||||
*/
|
||||
@@ -1431,3 +1633,27 @@ input.input-inline {
|
||||
.ui-select-dropdown.select2-drop-active {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom app sidebar handling
|
||||
*/
|
||||
body:not(.snapjs-left) {
|
||||
.app-navigation-hide {
|
||||
#app-content {
|
||||
margin-left: 0 !important; /* overwrite margin since we want the translateX to handle it*/
|
||||
}
|
||||
#app-navigation {
|
||||
transform: translateX(-300px);
|
||||
}
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: 768px) {
|
||||
#app-navigation-toggle-custom {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Print settings, better leave them at the eof
|
||||
*/
|
||||
@import 'print.scss';
|
||||
|
||||
42
docs/API-Nextcloud.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Nextcloud APIs
|
||||
|
||||
## Available sharees
|
||||
|
||||
When sharing a board to a user, group or circle, the possible sharees can be obtained though the files_sharing API.
|
||||
|
||||
API endpoint: https://nextcloud.local/index.php/apps/files_sharing/api/v1/sharees
|
||||
|
||||
### Parameters
|
||||
- format: **The response format**
|
||||
- perPage: **Limit response number**
|
||||
- itemType: **List of types. Currently supported are**
|
||||
- 0 user
|
||||
- 1 group
|
||||
- 7 circle
|
||||
|
||||
|
||||
## Comments
|
||||
|
||||
Comments are stored using the Nextcloud Comments API. You can use the WebDAV endpoint of Nextcloud to fetch, update and delete comments.
|
||||
|
||||
### List comments
|
||||
|
||||
PROPFIND`remote.php/dav/comments/deckCard/{cardId}`
|
||||
|
||||
### Create comment
|
||||
|
||||
POST `remote.php/dav/comments/deckCard/{cardId}`
|
||||
|
||||
### Update comment
|
||||
|
||||
PROPPATCH `remote.php/dav/comments/deckCard/{cardId}/{commentId}`
|
||||
|
||||
### Delete comment
|
||||
|
||||
DELETE `remote.php/dav/comments/deckCard/{cardId}/{commentId}`
|
||||
|
||||
## Activity
|
||||
|
||||
The Nextcloud activity app provides an API to fetch activities filtered for deck: [Activity app API documentation](https://github.com/nextcloud/activity/blob/master/docs/endpoint-v2.md)
|
||||
|
||||
The deck app offers a filter `deck` to only request activity events that are relevant.
|
||||
897
docs/API.md
Normal file
@@ -0,0 +1,897 @@
|
||||
|
||||
The REST API provides access for authenticated users to their data inside the Deck app. To get a better understand of Decks data models and their relations, please have a look at the [data structure](structure.md) documentation.
|
||||
|
||||
# Prequisited
|
||||
|
||||
- All requests require a `OCS-APIRequest` HTTP header to be set to `true` and a `Content-Type` of `application/json`.
|
||||
- The API is located at https://nextcloud.local/index.php/apps/deck/api/v1.0
|
||||
|
||||
## Naming
|
||||
|
||||
- Board is the the project like grouping of tasks that can be shared to different users and groups
|
||||
|
||||
- Stack is the grouping of cards which is rendered in vertical columns in the UI
|
||||
|
||||
- Card is the representation of a single task
|
||||
|
||||
- Labels are defined on a board level and can be assigned to any number of cards
|
||||
|
||||
## Global responses
|
||||
|
||||
### 400 Bad request
|
||||
|
||||
In case the request is invalid, e.g. because a parameter is missing, a 400 error will be returned:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": 400,
|
||||
"message": "title must be provided"
|
||||
}
|
||||
```
|
||||
|
||||
### 403 Permission denied
|
||||
|
||||
In any case a user doesn't have access to a requested entity, a 403 error will be returned:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": 403,
|
||||
"message": "Permission denied"
|
||||
}
|
||||
```
|
||||
|
||||
## Headers
|
||||
|
||||
### If-Modified-Since
|
||||
|
||||
Some index endpoints support limiting the result set to entries that have been changed since the given time.
|
||||
|
||||
Example curl request:
|
||||
|
||||
```bash
|
||||
curl -u admin:admin -X GET \
|
||||
'http://localhost:8000/index.php/apps/deck/api/v1.0/boards/2/stacks' \
|
||||
-H "OCS-APIRequest: true" \
|
||||
-H "If-Modified-Since: Mon, 5 Nov 2018 09:28:00 GMT"
|
||||
```
|
||||
|
||||
# Endpoints
|
||||
|
||||
## Boards
|
||||
|
||||
### GET /boards - Get a list of boards
|
||||
|
||||
#### Headers
|
||||
|
||||
The board list endpoint supports setting an `If-Modified-Since` header to limit the results to entities that are changed after the provided time.
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| options | Bool | **Optional** Enhance boards with details about labels, stacks and users |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
Returns an array of board items
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"title": "Board title",
|
||||
"owner": {
|
||||
"primaryKey": "admin",
|
||||
"uid": "admin",
|
||||
"displayname": "Administrator"
|
||||
},
|
||||
"color": "ff0000",
|
||||
"archived": false,
|
||||
"labels": [],
|
||||
"acl": [],
|
||||
"permissions": {
|
||||
"PERMISSION_READ": true,
|
||||
"PERMISSION_EDIT": true,
|
||||
"PERMISSION_MANAGE": true,
|
||||
"PERMISSION_SHARE": true
|
||||
},
|
||||
"users": [],
|
||||
"shared": 0,
|
||||
"deletedAt": 0,
|
||||
"id": 10
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### POST /boards - Create a new board
|
||||
|
||||
#### Request body
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------ | ---------------------------------------------------- |
|
||||
| title | String | The title of the new board |
|
||||
| color | String | The hexadecimal color of the new board (e.g. FF0000) |
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Board title",
|
||||
"color": "ff0000"
|
||||
}
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Board title",
|
||||
"owner": {
|
||||
"primaryKey": "admin",
|
||||
"uid": "admin",
|
||||
"displayname": "Administrator"
|
||||
},
|
||||
"color": "ff0000",
|
||||
"archived": false,
|
||||
"labels": [
|
||||
{
|
||||
"title": "Finished",
|
||||
"color": "31CC7C",
|
||||
"boardId": 10,
|
||||
"cardId": null,
|
||||
"id": 37
|
||||
},
|
||||
{
|
||||
"title": "To review",
|
||||
"color": "317CCC",
|
||||
"boardId": 10,
|
||||
"cardId": null,
|
||||
"id": 38
|
||||
},
|
||||
{
|
||||
"title": "Action needed",
|
||||
"color": "FF7A66",
|
||||
"boardId": 10,
|
||||
"cardId": null,
|
||||
"id": 39
|
||||
},
|
||||
{
|
||||
"title": "Later",
|
||||
"color": "F1DB50",
|
||||
"boardId": 10,
|
||||
"cardId": null,
|
||||
"id": 40
|
||||
}
|
||||
],
|
||||
"acl": [],
|
||||
"permissions": {
|
||||
"PERMISSION_READ": true,
|
||||
"PERMISSION_EDIT": true,
|
||||
"PERMISSION_MANAGE": true,
|
||||
"PERMISSION_SHARE": true
|
||||
},
|
||||
"users": [],
|
||||
"deletedAt": 0,
|
||||
"id": 10
|
||||
}
|
||||
```
|
||||
|
||||
### GET /boards/{boardId} - Get board details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| boardId | Integer | The id of the board to fetch |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Board title",
|
||||
"owner": {
|
||||
"primaryKey": "admin",
|
||||
"uid": "admin",
|
||||
"displayname": "Administrator"
|
||||
},
|
||||
"color": "ff0000",
|
||||
"archived": false,
|
||||
"labels": [
|
||||
{
|
||||
"title": "Finished",
|
||||
"color": "31CC7C",
|
||||
"boardId": "10",
|
||||
"cardId": null,
|
||||
"id": 37
|
||||
},
|
||||
{
|
||||
"title": "To review",
|
||||
"color": "317CCC",
|
||||
"boardId": "10",
|
||||
"cardId": null,
|
||||
"id": 38
|
||||
},
|
||||
{
|
||||
"title": "Action needed",
|
||||
"color": "FF7A66",
|
||||
"boardId": "10",
|
||||
"cardId": null,
|
||||
"id": 39
|
||||
},
|
||||
{
|
||||
"title": "Later",
|
||||
"color": "F1DB50",
|
||||
"boardId": "10",
|
||||
"cardId": null,
|
||||
"id": 40
|
||||
}
|
||||
],
|
||||
"acl": [],
|
||||
"permissions": {
|
||||
"PERMISSION_READ": true,
|
||||
"PERMISSION_EDIT": true,
|
||||
"PERMISSION_MANAGE": true,
|
||||
"PERMISSION_SHARE": true
|
||||
},
|
||||
"users": [
|
||||
{
|
||||
"primaryKey": "admin",
|
||||
"uid": "admin",
|
||||
"displayname": "Administrator"
|
||||
}
|
||||
],
|
||||
"deletedAt": 0,
|
||||
"id": 10
|
||||
}
|
||||
```
|
||||
|
||||
### PUT /boards/{boardId} - Update board details
|
||||
|
||||
#### Request body
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------ | ---------------------------------------------------- |
|
||||
| title | String | The title of the new board |
|
||||
| color | String | The hexadecimal color of the new board (e.g. FF0000) |
|
||||
| archived | Bool | The hexadecimal color of the new board (e.g. FF0000) |
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Board title",
|
||||
"color": "ff0000",
|
||||
"archived": false
|
||||
}
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### DELETE /boards/{boardId} - Delete a board
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| boardId | Integer | The id of the board to fetch |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### POST /boards/{boardId}/undo_delete - Restore a deleted board
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| boardId | Integer | The id of the board to fetch |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### POST /boards/{boardId}/acl - Add new acl rule
|
||||
|
||||
#### Request body
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------ | ---------------------------------------------------- |
|
||||
| type | Integer | Type of the participant |
|
||||
| participant | String | The uid of the participant |
|
||||
| permissionEdit | Bool | Setting if the participant has edit permissions |
|
||||
| permissionShare | Bool | Setting if the participant has sharing permissions |
|
||||
| permissionManage | Bool | Setting if the participant has management permissions |
|
||||
|
||||
##### Supported participant types:
|
||||
- 0 User
|
||||
- 1 Group
|
||||
- 7 Circle
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
```json
|
||||
[{
|
||||
"participant": {
|
||||
"primaryKey": "userid",
|
||||
"uid": "userid",
|
||||
"displayname": "User Name"
|
||||
},
|
||||
"type": 0,
|
||||
"boardId": 1,
|
||||
"permissionEdit": true,
|
||||
"permissionShare": false,
|
||||
"permissionManage": true,
|
||||
"owner": false,
|
||||
"id": 1
|
||||
}]
|
||||
```
|
||||
|
||||
### PUT /boards/{boardId}/acl/{aclId} - Update an acl rule
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------ | ---------------------------------------------------- |
|
||||
| permissionEdit | Bool | Setting if the participant has edit permissions |
|
||||
| permissionShare | Bool | Setting if the participant has sharing permissions |
|
||||
| permissionManage | Bool | Setting if the participant has management permissions |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### DELETE /boards/{boardId}/acl/{aclId} - Delete an acl rule
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
## Stacks
|
||||
|
||||
### GET /boards/{boardId}/stacks - Get stacks
|
||||
|
||||
#### Headers
|
||||
|
||||
The board list endpoint supports setting an `If-Modified-Since` header to limit the results to entities that are changed after the provided time.
|
||||
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| boardId | Integer | The id of the board to fetch |
|
||||
|
||||
#### Response
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"title": "ToDo",
|
||||
"boardId": 2,
|
||||
"deletedAt": 0,
|
||||
"lastModified": 1541426139,
|
||||
"cards": [...],
|
||||
"order": 999,
|
||||
"id": 4
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### GET /boards/{boardId}/stacks/archived - Get list of archived stacks
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| boardId | Integer | The id of the board to fetch |
|
||||
|
||||
#### Response
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"title": "ToDo",
|
||||
"boardId": 2,
|
||||
"deletedAt": 0,
|
||||
"lastModified": 1541426139,
|
||||
"cards": [...],
|
||||
"order": 999,
|
||||
"id": 4
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### GET /boards/{boardId}/stacks/{stackId} - Get stack details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the stack belongs to |
|
||||
| stackId | Integer | The id of the stack |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### POST /boards/{boardId}/stacks - Create a new stack
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------- |
|
||||
| boardId | Integer | The id of the board to fetch |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId} - Update stack details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the stack belongs to |
|
||||
| stackId | Integer | The id of the stack |
|
||||
|
||||
#### Request body
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------------------- |
|
||||
| title | String | The title of the new stack |
|
||||
| order | Integer | Order for sorting the stacks |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### DELETE /boards/{boardId}/stacks/{stackId} - Delete a stack
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the stack belongs to |
|
||||
| stackId | Integer | The id of the stack |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
## Cards
|
||||
|
||||
### GET /boards/{boardId}/stacks/{stackId}/cards/{cardId} - Get card details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### POST /boards/{boardId}/stacks/{stackId}/cards - Create a new card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
|
||||
#### Request body
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------------------- |
|
||||
| title | String | The title of the new stack |
|
||||
| type | String | Type of the card (for later use) use 'plain' for now |
|
||||
| order | Integer | Order for sorting the stacks |
|
||||
|
||||
#### Response
|
||||
|
||||
```json
|
||||
{
|
||||
"title":"Test",
|
||||
"description":null,
|
||||
"stackId":6,
|
||||
"type":"plain",
|
||||
"lastModified":1541528026,
|
||||
"createdAt":1541528026,
|
||||
"labels":null,
|
||||
"assignedUsers":null,
|
||||
"attachments":null,
|
||||
"attachmentCount":null,
|
||||
"owner":"admin",
|
||||
"order":999,
|
||||
"archived":false,
|
||||
"duedate":null,
|
||||
"deletedAt":0,
|
||||
"commentsUnread":0,
|
||||
"id":10,
|
||||
"overdue":0
|
||||
}
|
||||
```
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId} - Update card details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
|-------------|-----------|------------------------------------------------------|
|
||||
| title | String | The card title |
|
||||
| description | String | The markdown description of the card |
|
||||
| type | String | Type of the card (for later use) use 'plain' for now |
|
||||
| order | Integer | Order for sorting the stacks |
|
||||
| duedate | timestamp | The duedate of the card or null |
|
||||
|
||||
|
||||
```
|
||||
{
|
||||
"title": "Test card",
|
||||
"description": "A card description",
|
||||
"type": "plain",
|
||||
"order": 999,
|
||||
"duedate": null,
|
||||
}
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### DELETE /boards/{boardId}/stacks/{stackId}/cards/{cardId} - Delete a card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignLabel - Assign a label to a card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| labelId | Integer | The label id to assign to the card |
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/removeLabel - Remove a label to a card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| labelId | Integer | The label id to remove to the card |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignUser - Assign a user to a card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| userId | String | The user id to assign to the card |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/unassignUser - Assign a user to a card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| userId | String | The user id to assign to the card |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/reorder - Change the sorting order of a card
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ----------------------------------------------------------- |
|
||||
| order | Integer | The position in the stack where the card should be moved to |
|
||||
| stackId | Integer | The id of the stack where the card should be moved to |
|
||||
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
## Labels
|
||||
|
||||
### GET /boards/{boardId}/labels/{labelId} - Get label details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the label belongs to |
|
||||
| labelId | Integer | The id of the label |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Abgeschlossen",
|
||||
"color": "31CC7C",
|
||||
"boardId": "2",
|
||||
"cardId": null,
|
||||
"id": 5
|
||||
}
|
||||
```
|
||||
|
||||
### POST /boards/{boardId}/labels - Create a new label
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the label belongs to |
|
||||
|
||||
#### Request data
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Finished",
|
||||
"color": "31CC7C"
|
||||
}
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/labels/{labelId} - Update label details
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the label belongs to |
|
||||
| labelId | Integer | The id of the label |
|
||||
|
||||
|
||||
#### Request data
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Finished",
|
||||
"color": "31CC7C"
|
||||
}
|
||||
```
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### DELETE /boards/{boardId}/labels/{labelId} - Delete a label
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | ---------------------------------------- |
|
||||
| boardId | Integer | The id of the board the label belongs to |
|
||||
| labelId | Integer | The id of the label |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
## Attachments
|
||||
|
||||
### GET /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments - Get a list of attachments
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------- |
|
||||
| boardId | Integer | The id of the board the card belongs to |
|
||||
| stackId | Integer | The id of the stack the card belongs to |
|
||||
| cardId | Integer | The id of the card |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"cardId": 5,
|
||||
"type": "deck_file",
|
||||
"data": "6DADC2C69F4.eml",
|
||||
"lastModified": 1541529048,
|
||||
"createdAt": 1541529048,
|
||||
"createdBy": "admin",
|
||||
"deletedAt": 0,
|
||||
"extendedData": {
|
||||
"filesize": 922258,
|
||||
"mimetype": "application/octet-stream",
|
||||
"info": {
|
||||
"dirname": ".",
|
||||
"basename": "6DADC2C69F4.eml",
|
||||
"extension": "eml",
|
||||
"filename": "6DADC2C69F4"
|
||||
}
|
||||
},
|
||||
"id": 6
|
||||
}
|
||||
]
|
||||
|
||||
```
|
||||
|
||||
### GET /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Get the attachment file
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| ------------ | ------- | --------------------------------------------- |
|
||||
| boardId | Integer | The id of the board the attachment belongs to |
|
||||
| stackId | Integer | The id of the stack the attachment belongs to |
|
||||
| cardId | Integer | The id of the card the attachment belongs to |
|
||||
| attachmentId | Integer | The id of the attachment |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### POST /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments - Upload an attachment
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------------- |
|
||||
| boardId | Integer | The id of the board the attachment belongs to |
|
||||
| stackId | Integer | The id of the stack the attachment belongs to |
|
||||
| cardId | Integer | The id of the card the attachment belongs to |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------------- |
|
||||
| type | String | The type of the attachement |
|
||||
| file | Binary | File data to add as an attachment |
|
||||
|
||||
For now only `deck_file` is supported as an attachment type.
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Update an attachment
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| ------------ | ------- | --------------------------------------------- |
|
||||
| boardId | Integer | The id of the board the attachment belongs to |
|
||||
| stackId | Integer | The id of the stack the attachment belongs to |
|
||||
| cardId | Integer | The id of the card the attachment belongs to |
|
||||
| attachmentId | Integer | The id of the attachment |
|
||||
|
||||
#### Request data
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --------- | ------- | --------------------------------------------- |
|
||||
| type | String | The type of the attachement |
|
||||
| file | Binary | File data to add as an attachment |
|
||||
|
||||
For now only `deck_file` is supported as an attachment type.
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### DELETE /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Delete an attachment
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| ------------ | ------- | --------------------------------------------- |
|
||||
| boardId | Integer | The id of the board the attachment belongs to |
|
||||
| stackId | Integer | The id of the stack the attachment belongs to |
|
||||
| cardId | Integer | The id of the card the attachment belongs to |
|
||||
| attachmentId | Integer | The id of the attachment |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
### PUT /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}/restore - Resore a deleted attachment
|
||||
|
||||
#### Request parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| ------------ | ------- | --------------------------------------------- |
|
||||
| boardId | Integer | The id of the board the attachment belongs to |
|
||||
| stackId | Integer | The id of the stack the attachment belongs to |
|
||||
| cardId | Integer | The id of the card the attachment belongs to |
|
||||
| attachmentId | Integer | The id of the attachment |
|
||||
|
||||
#### Response
|
||||
|
||||
##### 200 Success
|
||||
|
||||
27
docs/Markdown.md
Normal file
@@ -0,0 +1,27 @@
|
||||
## What is Markdown
|
||||
|
||||
The [wikipedia markdown entry](https://en.wikipedia.org/wiki/Markdown) introduced markdown as :
|
||||
|
||||
> Markdown is a lightweight markup language with plain text formatting syntax. It is designed so that it can be converted to HTML and many other formats using a tool by the same name. Markdown is often used to format readme files, for writing messages in online discussion forums, and to create rich text using a plain text editor. As the initial description of Markdown contained ambiguities and unanswered questions, many implementations and extensions of Markdown appeared over the years to answer these issues.
|
||||
|
||||
## Markdown in Deck
|
||||
The Deck application plugin uses the [markdown-it](https://github.com/markdown-it/markdown-it) script to offer support for markdown in the cards description field.
|
||||
|
||||
## Supported Markdown
|
||||
|
||||
Markdown comes in may flavors. The best way to learn markdown and understand how to use it, is simply to [try it](https://markdown-it.github.io) on the original script official playground.
|
||||
That same link offers also a comprehensive list of what is supported, and what is not - rendering it unnecessary to duplicate that content in here.
|
||||
|
||||
[CommonMark Markdown Reference](http://commonmark.org/help/)
|
||||
|
||||
## Known Issues
|
||||
|
||||
As per [issue #127](https://github.com/nextcloud/deck/issues/127) Due to a known limitation of the current script to support markdown, Links that contain the `")"` character will not display well, or will break.
|
||||
The recommended solution is to use `"<"` and `">"` to wrap those links. It should assure their integrity.
|
||||
If you come by another case of broken link, or broken display of links, please report it by opening a new issue.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
55
docs/Release.md
Normal file
@@ -0,0 +1,55 @@
|
||||
Releasing a new version works quite easy with [krankerl](https://github.com/ChristophWurst/krankerl) and [github-release](https://github.com/aktau/github-release) installed:
|
||||
|
||||
1. Run krankerl to build the package
|
||||
|
||||
```
|
||||
krankerl package
|
||||
```
|
||||
|
||||
2. Tag the release on GitHub
|
||||
|
||||
```
|
||||
# For a prerelease
|
||||
github-release release -u nextcloud -r deck -t v0.3.1 -p
|
||||
|
||||
# For a regular release
|
||||
github-release release -u nextcloud -r deck -t v0.3.1
|
||||
```
|
||||
|
||||
3. Upload the release package to GitHub
|
||||
|
||||
```
|
||||
github-release upload -u nextcloud -r deck -t v0.3.1 -n deck.tar.gz -f build/artifacts/deck.tar.gz
|
||||
```
|
||||
|
||||
4. Run krankerl to release the package to the app store (add `--nightly` for prerelease packages)
|
||||
|
||||
```
|
||||
krankerl publish https://github.com/nextcloud/deck/releases/download/v0.3.1/deck.tar.gz
|
||||
```
|
||||
|
||||
## Release PR template
|
||||
|
||||
```
|
||||
## Backports
|
||||
|
||||
- [ ] ...
|
||||
|
||||
## Translations
|
||||
|
||||
- [ ] ...
|
||||
|
||||
## Release
|
||||
|
||||
- [ ] Set proper Nextcloud versions in info.xml
|
||||
- [ ] Update changelog
|
||||
- [ ] Build test release
|
||||
- [ ] Tested on
|
||||
- [ ] Nextcloud 13
|
||||
- [ ] Nextcloud 14
|
||||
- [ ] Nextcloud 15
|
||||
- [ ] Merge
|
||||
- [ ] Build final release
|
||||
- [ ] Publish release
|
||||
- [ ] Upload to the app store
|
||||
```
|
||||
69
docs/User_documentation_en.md
Normal file
@@ -0,0 +1,69 @@
|
||||
## Introduction
|
||||
### What about Deck ?
|
||||
You may know Kanban website like Trello ? Deck is about the same thing but secured and respectful of your privacy !
|
||||
Integrated in Nextcloud, you can easily manage your projects while having your data secured.
|
||||
|
||||
### Use cases
|
||||
Project management, time management or ideation, Deck makes it easier for you to manage your work.
|
||||
|
||||
## Using Deck
|
||||
Overall, Deck is easy to use. You can create boards, add users, share the Deck, work collaboratively and in real time.
|
||||
|
||||
1. [Create my first board](#1-create-my-first-board)
|
||||
2. [Create stacks and cards](#2-create-stacks-and-cards)
|
||||
3. [Handle cards options](#3-handle-cards-options)
|
||||
4. [Archive old tasks](#4-archive-old-tasks)
|
||||
5. [Manage your board](#5-manage-your-board)
|
||||
|
||||
### 1. Create my first board
|
||||
In this example, we're going to create a board and share it with an other nextcloud user.
|
||||
|
||||

|
||||
|
||||
|
||||
### 2. Create stacks and cards
|
||||
Stacks are simply columns with list of cards. It can represent a category of tasks or an y step in your projects for example.
|
||||
**Check this out :**
|
||||
|
||||

|
||||
|
||||
What about the cards? Cards are tasks, objects or ideas that fit into a stack. You can put a lot of cards in a stack! An infinity? Who knows! Who knows!
|
||||
|
||||
And all the magic of this software consists on moving your cards from a stack to an other.
|
||||
**Check this out :**
|
||||
|
||||

|
||||
|
||||
### 3. Handle cards options
|
||||
Once you have created your cards, you can modify them or add options by clicking on them. So, what are the options? Well, there are several of them:
|
||||
- Tag Management
|
||||
- Assign a card to a user (s·he will receive a notification)
|
||||
- Render date, or deadline
|
||||
|
||||

|
||||
|
||||
And even :
|
||||
|
||||
- Description in markdown language
|
||||
- Attachment - *you can leave a document, a picture or some other bonus like that.*
|
||||
|
||||

|
||||
|
||||
### 4. Archive old tasks
|
||||
Once finished or obsolete, a task could be archived. The tasks is not deleted, it's just archived, and you can retrieve it later
|
||||
|
||||

|
||||
|
||||
### 5. Manage your board
|
||||
You can manage the settings of your Deck once you are inside it, by clicking on the small wheel at the top right.
|
||||
Once in this menu, you have access to several things:
|
||||
- Sharing
|
||||
- Tags
|
||||
- Deleted objects
|
||||
- Timeline
|
||||
|
||||
The **sharing tab** allows you to add users or even groups to your boards.
|
||||
**Tags** allows you to modify the tags available for the cards.
|
||||
**Deleted objects** allows you to return previously deleted stacks or cards.
|
||||
The **Timeline** allows you to see everything that happened in your boards. Everything!
|
||||
|
||||
3
docs/extra.css
Normal file
@@ -0,0 +1,3 @@
|
||||
.subnav ul {
|
||||
padding-left: 20px;
|
||||
}
|
||||
1
docs/index.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../README.md
|
||||
BIN
docs/resources/er-diagram.dia
Normal file
BIN
docs/resources/er-diagram.jpg
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
docs/resources/gifs/EN_archive.gif
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
docs/resources/gifs/EN_create_board.gif
Normal file
|
After Width: | Height: | Size: 218 KiB |
BIN
docs/resources/gifs/EN_create_columns.gif
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/resources/gifs/EN_create_task.gif
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
docs/resources/gifs/EN_put_infos.gif
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
docs/resources/gifs/EN_put_infos_2.gif
Normal file
|
After Width: | Height: | Size: 556 KiB |
6
docs/structure.md
Normal file
@@ -0,0 +1,6 @@
|
||||
## Database structure
|
||||
|
||||
Deck stores most of its data inside of the database. The structure and relationships between entities is documented in the following ER diagram:
|
||||
|
||||

|
||||
|
||||
1
img/calendar-dark.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" version="1.1" height="32" viewbox="0 0 32 32"><path fill="#000" d="m8 2c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm16 0c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-13 4v2c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1.875a3.993 3.993 0 0 0 -3 3.875v16c0 2.216 1.784 4 4 4h20c2.216 0 4-1.784 4-4v-16a3.993 3.993 0 0 0 -3 -3.875v1.875c0 1.662-1.338 3-3 3s-3-1.338-3-3v-2zm-4.906 10h19.812a0.09 0.09 0 0 1 0.094 0.094v9.812a0.09 0.09 0 0 1 -0.094 0.094h-19.812a0.09 0.09 0 0 1 -0.094 -0.094v-9.812a0.09 0.09 0 0 1 0.094 -0.094z"/></svg>
|
||||
|
After Width: | Height: | Size: 646 B |
1
img/circles.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#000"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 885 B |
1
img/color_picker-dark.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 100 100"><path d="M91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727a5.015 5.015 0 1 0-7.093 7.093l3.727 3.727-41.51 41.508a11.411 11.411 0 0 0-3.329 7.324c-.073 1.087-.347 3.105-.675 5.292a1.748 1.748 0 0 1-.487.983l-3.105 3.106a2.546 2.546 0 0 0 0 3.6l3.493 3.493a2.546 2.546 0 0 0 3.6 0l3.106-3.105c.277-.275.622-.433.981-.486 2.187-.329 4.205-.602 5.293-.675a11.412 11.412 0 0 0 7.325-3.33l41.508-41.508 3.727 3.727a5.015 5.015 0 1 0 7.093-7.093L69.507 29.419l9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726.001-16.2zM65.051 42.749l-20.53 20.53a2.546 2.546 0 0 1-3.6 0l-3.27-3.27a2.545 2.545 0 0 0-3.599.001l-.616.616-.002-.002-14.728 14.727c-.337.337-.819.401-1.076.143s-.194-.74.143-1.076l23.841-23.841.004.004 15.633-15.633a2.546 2.546 0 0 1 3.6 0l4.2 4.201a2.546 2.546 0 0 1 0 3.6z"/></svg>
|
||||
|
After Width: | Height: | Size: 897 B |
@@ -1,5 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg id="Layer_1" width="15" height="15" enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<path d="m91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727c-1.959-1.959-5.134-1.959-7.093 0s-1.959 5.134 0 7.093l3.727 3.727-41.51 41.508c-2.039 2.039-3.149 4.656-3.329 7.324-0.073 1.087-0.347 3.105-0.675 5.292-0.053 0.359-0.212 0.706-0.487 0.983l-3.105 3.106c-0.994 0.994-0.994 2.606 0 3.6l3.493 3.493c0.994 0.994 2.606 0.994 3.6 0l3.106-3.105c0.277-0.275 0.622-0.433 0.981-0.486 2.187-0.329 4.205-0.602 5.293-0.675 2.668-0.18 5.285-1.29 7.325-3.33l41.508-41.508 3.727 3.727c1.959 1.959 5.134 1.959 7.093 0s1.959-5.134 0-7.093l-12.365-12.366 9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726 1e-3 -16.2zm-26.594 34.394l-20.53 20.53c-0.994 0.994-2.606 0.994-3.6 0l-3.27-3.27c-0.994-0.993-2.605-0.993-3.599 1e-3l-0.616 0.616-2e-3 -2e-3 -14.728 14.727c-0.337 0.337-0.819 0.401-1.076 0.143s-0.194-0.74 0.143-1.076l23.841-23.841 4e-3 4e-3 15.633-15.633c0.994-0.994 2.606-0.994 3.6 0l4.2 4.201c0.994 0.994 0.994 2.606 0 3.6z" fill="#fff"/>
|
||||
<metadata><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><cc:license rdf:resource="http://creativecommons.org/licenses/publicdomain/"/><dc:publisher><cc:Agent rdf:about="http://openclipart.org/"><dc:title>Openclipart</dc:title></cc:Agent></dc:publisher></cc:Work><cc:License rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/><cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/><cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/></cc:License></rdf:RDF></metadata></svg>
|
||||
<svg width="15" height="15" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="M91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727a5.015 5.015 0 1 0-7.093 7.093l3.727 3.727-41.51 41.508a11.411 11.411 0 0 0-3.329 7.324c-.073 1.087-.347 3.105-.675 5.292a1.748 1.748 0 0 1-.487.983l-3.105 3.106a2.546 2.546 0 0 0 0 3.6l3.493 3.493a2.546 2.546 0 0 0 3.6 0l3.106-3.105c.277-.275.622-.433.981-.486 2.187-.329 4.205-.602 5.293-.675a11.412 11.412 0 0 0 7.325-3.33l41.508-41.508 3.727 3.727a5.015 5.015 0 1 0 7.093-7.093L69.507 29.419l9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726.001-16.2zM65.051 42.749l-20.53 20.53a2.546 2.546 0 0 1-3.6 0l-3.27-3.27a2.545 2.545 0 0 0-3.599.001l-.616.616-.002-.002-14.728 14.727c-.337.337-.819.401-1.076.143s-.194-.74.143-1.076l23.841-23.841.004.004 15.633-15.633a2.546 2.546 0 0 1 3.6 0l4.2 4.201a2.546 2.546 0 0 1 0 3.6z" fill="#fff"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 910 B |
1
img/description.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path fill="#000" d="m2.5 1c-0.28 0-0.5 0.22-0.5 0.5v13c0 0.28 0.22 0.5 0.5 0.5h11c0.28 0 0.5-0.22 0.5-0.5v-10.5l-3-3h-8.5zm1.5 2h6v1h-6v-1zm0 3h5v1h-5v-1zm0 3h8v1h-8v-1zm0 3h4v1h-4v-1z"/></svg>
|
||||
|
After Width: | Height: | Size: 292 B |
1
img/toggle-view-collapse.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -292.77)" display="none" stroke-width=".23666"><rect x=".28112" y="293.43" width="3.7042" height="1.1906" ry=".20225"/><rect x=".26458" y="295.15" width="3.7042" height="1.1906" ry=".20225"/></g><g transform="translate(0 -292.77)"><g transform="matrix(.040404 0 0 .040404 -3.0978 290.01)"><rect x="83.629" y="114.13" width="91.678" height="13.097" stroke-width="3.9049"/><path d="m155.25 81.388-26.194 26.194-26.194-26.154z" stroke-width="6.5484"/><path d="m155.25 159.97-26.194-26.194-26.194 26.154z" stroke-width="6.5484"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 671 B |
1
img/toggle-view-expand.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -292.77)" display="none" stroke-width=".23666"><rect x=".28112" y="293.43" width="3.7042" height="1.1906" ry=".20225"/><rect x=".26458" y="295.15" width="3.7042" height="1.1906" ry=".20225"/></g><g transform="translate(0 -292.77)"><g transform="matrix(.040404 0 0 .040404 -3.0978 290.01)"><rect x="83.629" y="114.13" width="91.678" height="13.097" stroke-width="3.9049"/><path d="m155.25 107.58-26.194-26.194-26.194 26.154z" stroke-width="6.5484"/><path d="m155.25 133.78-26.194 26.194-26.194-26.154z" stroke-width="6.5484"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 671 B |
12
js/.babelrc.js
Normal file
@@ -0,0 +1,12 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
[
|
||||
'@babel/preset-env',
|
||||
{
|
||||
targets: {
|
||||
browsers: ['last 2 versions', 'ie >= 11']
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"esversion": 6,
|
||||
|
||||
"globals": {
|
||||
"jasmine" : false,
|
||||
"spyOn" : false,
|
||||
@@ -21,7 +23,6 @@
|
||||
"devel" : true,
|
||||
"eqeqeq" : true,
|
||||
"eqnull" : false,
|
||||
"es5" : true,
|
||||
"evil" : false,
|
||||
"forin" : true,
|
||||
"immed" : true,
|
||||
@@ -39,7 +40,6 @@
|
||||
"plusplus" : false,
|
||||
"quotmark" : "single",
|
||||
"regexp" : false,
|
||||
"strict" : true,
|
||||
"sub" : true,
|
||||
"trailing" : true,
|
||||
"undef" : true,
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/* global angular */
|
||||
@@ -48,13 +48,17 @@ import ngsortable from 'ng-sortable';
|
||||
import md from 'angular-markdown-it';
|
||||
import nganimate from 'angular-animate';
|
||||
import 'angular-file-upload';
|
||||
import ngInfiniteScroll from 'ng-infinite-scroll';
|
||||
import '../legacy/jquery.atwho.min';
|
||||
import '../legacy/jquery.caret.min';
|
||||
|
||||
var app = angular.module('Deck', [
|
||||
ngsanitize,
|
||||
uirouter,
|
||||
angularuiselect,
|
||||
ngsortable, md, nganimate,
|
||||
'angularFileUpload'
|
||||
'angularFileUpload',
|
||||
ngInfiniteScroll
|
||||
]);
|
||||
|
||||
export default app;
|
||||
|
||||
@@ -33,12 +33,16 @@ app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterPr
|
||||
|
||||
|
||||
$compileProvider.debugInfoEnabled(true);
|
||||
// This should fix adding "unsafe:" prefix to ui-select href links containing javascript
|
||||
// inline JS is blocked by CSP anyway and filtered out by our markdown renderer as well
|
||||
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|javascript):/);
|
||||
|
||||
markdownItConverterProvider.use(markdownitLinkTarget, {
|
||||
markdownItConverterProvider.config({
|
||||
breaks: true,
|
||||
linkify: true,
|
||||
xhtmlOut: true
|
||||
}).use(markdownitCheckbox);
|
||||
});
|
||||
markdownItConverterProvider.use(markdownitLinkTarget).use(markdownitCheckbox);
|
||||
|
||||
$urlRouterProvider.otherwise('/');
|
||||
|
||||
@@ -67,8 +71,9 @@ app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterPr
|
||||
tab: {value: 0, dynamic: true},
|
||||
},
|
||||
views: {
|
||||
'sidebarView': {
|
||||
templateUrl: '/board.sidebarView.html'
|
||||
'sidebarView@': {
|
||||
templateUrl: '/board.sidebarView.html',
|
||||
controller: 'BoardController'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -78,7 +83,7 @@ app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterPr
|
||||
tab: {value: 0, dynamic: true},
|
||||
},
|
||||
views: {
|
||||
'sidebarView': {
|
||||
'sidebarView@': {
|
||||
templateUrl: '/card.sidebarView.html',
|
||||
controller: 'CardController'
|
||||
}
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from './App.js';
|
||||
|
||||
@@ -56,26 +56,6 @@ app.run(function ($document, $rootScope, $transitions, BoardService) {
|
||||
OC.filePath('deck', 'img', 'app-512.png')
|
||||
);
|
||||
|
||||
$('#app-navigation-toggle').off('click');
|
||||
// App sidebar on mobile
|
||||
var snapper = new Snap({
|
||||
element: document.getElementById('app-content'),
|
||||
disable: 'right',
|
||||
maxPosition: 250,
|
||||
touchToDrag: false
|
||||
});
|
||||
|
||||
$('#app-navigation-toggle').click(function () {
|
||||
if ($(window).width() > 768) {
|
||||
$('#app-navigation').toggle('hidden');
|
||||
} else {
|
||||
if (snapper.state().state === 'left') {
|
||||
snapper.close();
|
||||
} else {
|
||||
snapper.open('left');
|
||||
}
|
||||
}
|
||||
});
|
||||
// Select all elements with data-toggle="tooltips" in the document
|
||||
$('body').tooltip({
|
||||
selector: '[data-toggle="tooltip"]'
|
||||
|
||||
350
js/controller/ActivityController.js
Normal file
@@ -0,0 +1,350 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/* global OC OCA OCP t escapeHTML Handlebars moment */
|
||||
|
||||
import CommentCollection from '../legacy/commentcollection';
|
||||
import CommentModel from '../legacy/commentmodel';
|
||||
|
||||
class ActivityController {
|
||||
constructor ($scope, CardService, ActivityService, BoardService) {
|
||||
'ngInject';
|
||||
this.cardservice = CardService;
|
||||
this.boardservice = BoardService;
|
||||
this.activityservice = ActivityService;
|
||||
this.$scope = $scope;
|
||||
this.type = '';
|
||||
this.loading = false;
|
||||
this.status = {
|
||||
commentCreateLoading: false
|
||||
};
|
||||
this.$scope.newComment = '';
|
||||
this.$scope.newCommentString = 'New comment…';
|
||||
|
||||
this.currentUser = OC.getCurrentUser();
|
||||
|
||||
const self = this;
|
||||
this.$scope.$watch(function () {
|
||||
return self.element.id;
|
||||
}, function (params) {
|
||||
if (self.type === 'deck_card') {
|
||||
self.activityservice.loadComments(self.element.id);
|
||||
}
|
||||
|
||||
if (self.getData(self.element.id).length === 0) {
|
||||
self.loading = true;
|
||||
self.fetchUntilResults();
|
||||
}
|
||||
self.activityservice.fetchNewerActivities(self.type, self.element.id).then(function () {});
|
||||
if (self.type === 'deck_card') {
|
||||
self.cardservice.getCurrent().commentsUnread = 0;
|
||||
}
|
||||
}, true);
|
||||
|
||||
let $target = $('.newCommentForm .message');
|
||||
this.applyAtWho($target);
|
||||
|
||||
this.activityservice.subscribe(this.$scope, function() {
|
||||
self.$scope.$apply();
|
||||
});
|
||||
|
||||
if (typeof OCA.Activity.Templates !== 'undefined') {
|
||||
OCA.Activity.Templates.userLocal = Handlebars.template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||
var helper;
|
||||
// Compiled handlesbars template
|
||||
// '<span class="avatar-name-wrapper"><avatar ng-attr-contactsmenu ng-attr-tooltip ng-attr-user="{{ id }}" ng-attr-displayname="{{name}}" ng-attr-size="16"></avatar> {{ name }}</span>';
|
||||
return "<span class=\"avatar-name-wrapper\"><avatar ng-attr-contactsmenu ng-attr-tooltip ng-attr-user=\""
|
||||
+ container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"id","hash":{},"data":data}) : helper)))
|
||||
+ "\" ng-attr-displayname=\""
|
||||
+ container.escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"name","hash":{},"data":data}) : helper)))
|
||||
+ "\" ng-attr-size=\"16\"></avatar> "
|
||||
+ container.escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"name","hash":{},"data":data}) : helper)))
|
||||
+ "</span>";
|
||||
},"useData":true});
|
||||
} else {
|
||||
OCA.Activity.RichObjectStringParser._userLocalTemplate = '<span class="avatar-name-wrapper"><avatar ng-attr-contactsmenu ng-attr-tooltip ng-attr-user="{{ id }}" ng-attr-displayname="{{name}}" ng-attr-size="16"></avatar> {{ name }}</span>';
|
||||
}
|
||||
}
|
||||
|
||||
applyAtWho($target) {
|
||||
const self = this;
|
||||
if (!$target) {
|
||||
return;
|
||||
}
|
||||
$target.atwho({
|
||||
at: '@',
|
||||
callbacks: {
|
||||
remoteFilter: function(query, callback) {
|
||||
let uids = self.boardservice.getUsers();
|
||||
uids = uids.filter((x) => x.uid.toLowerCase().includes(query.toLowerCase()) || x.displayname.toLowerCase().includes(query.toLowerCase()));
|
||||
callback(uids);
|
||||
},
|
||||
highlighter: function (li) {
|
||||
// misuse the highlighter callback to instead of
|
||||
// highlighting loads the avatars.
|
||||
var $li = $(li);
|
||||
$li.find('.avatar').avatar(undefined, 32);
|
||||
return $li;
|
||||
},
|
||||
sorter: function (q, items) { return items; }
|
||||
},
|
||||
displayTpl: function (item) {
|
||||
return '<li>' +
|
||||
'<span class="avatar-name-wrapper">' +
|
||||
'<span class="avatar" ' +
|
||||
'data-username="' + escapeHTML(item.uid) + '" ' + // for avatars
|
||||
'data-user="' + escapeHTML(item.uid) + '" ' + // for contactsmenu
|
||||
'data-user-display-name="' + escapeHTML(item.displayname) + '">' +
|
||||
'</span>' +
|
||||
'<strong>' + escapeHTML(item.displayname) + '</strong>' +
|
||||
'</span></li>';
|
||||
},
|
||||
insertTpl: function (item) {
|
||||
return '' +
|
||||
'<span class="avatar-name-wrapper">' +
|
||||
'<span class="avatar" ' +
|
||||
'data-username="' + escapeHTML(item.uid) + '" ' + // for avatars
|
||||
'data-user="' + escapeHTML(item.uid) + '" ' + // for contactsmenu
|
||||
'data-user-display-name="' + escapeHTML(item.displayname) + '">' +
|
||||
'</span>' +
|
||||
'<strong>' + escapeHTML(item.displayname) + '</strong>' +
|
||||
'</span>';
|
||||
},
|
||||
searchKey: 'displayname'
|
||||
});
|
||||
$target.on('inserted.atwho', function (je, $el) {
|
||||
$(je.target).find(
|
||||
'span[data-username="' + $el.find('[data-username]').data('username') + '"]'
|
||||
).avatar(undefined, 16);
|
||||
});
|
||||
$target.on('shown.atwho', function (je) {
|
||||
$target.find('.avatar').avatar(undefined, 16);
|
||||
});
|
||||
}
|
||||
|
||||
commentBodyToPlain(content) {
|
||||
let $comment = $('<div/>').html(content);
|
||||
$comment.find('.avatar-name-wrapper').each(function () {
|
||||
var $this = $(this);
|
||||
var $inserted = $this.parent();
|
||||
$inserted.html('@' + $this.find('.avatar').data('username'));
|
||||
});
|
||||
$comment.html(OCP.Comments.richToPlain($comment.html()));
|
||||
$comment.html($comment.html().replace(/<br\s*[\/]?>/gi, '\n'));
|
||||
return $comment.text();
|
||||
}
|
||||
|
||||
static _composeHTMLMention(uid, displayName) {
|
||||
var avatar = '' +
|
||||
'<span class="avatar" data-username="' + escapeHTML(uid) + '" data-user="' + escapeHTML(uid) + '" ng-attr-size="16" ' +
|
||||
'ng-attr-user="' + escapeHTML(uid) + '" ' +
|
||||
'ng-attr-displayname="' + escapeHTML(displayName) + '" ng-attr-contactsmenu="true">' +
|
||||
'</span>';
|
||||
|
||||
var isCurrentUser = (uid === OC.getCurrentUser().uid);
|
||||
|
||||
return '' +
|
||||
'<span class="atwho-inserted" contenteditable="false">' +
|
||||
'<span class="avatar-name-wrapper' + (isCurrentUser ? ' currentUser' : '') + '">' +
|
||||
avatar +
|
||||
'<strong>' + escapeHTML(displayName) + '</strong>' +
|
||||
'</span>' +
|
||||
'</span>';
|
||||
}
|
||||
|
||||
formatMessage(activity) {
|
||||
let message = activity.message;
|
||||
let mentions = activity.commentModel.get('mentions');
|
||||
const editMode = false;
|
||||
message = escapeHTML(message).replace(/\n/g, '<br/>');
|
||||
|
||||
for(var i in mentions) {
|
||||
if(!mentions.hasOwnProperty(i)) {
|
||||
return;
|
||||
}
|
||||
var mention = '@' + mentions[i].mentionId;
|
||||
// escape possible regex characters in the name
|
||||
mention = mention.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
|
||||
const displayName = ActivityController._composeHTMLMention(mentions[i].mentionId, mentions[i].mentionDisplayName);
|
||||
// replace every mention either at the start of the input or after a whitespace
|
||||
// followed by a non-word character.
|
||||
message = message.replace(new RegExp('(^|\\s)(' + mention + ')\\b', 'g'),
|
||||
function(match, p1) {
|
||||
// to get number of whitespaces (0 vs 1) right
|
||||
return p1+displayName;
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
if(editMode !== true) {
|
||||
message = OCP.Comments.plainToRich(message);
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
postComment() {
|
||||
const self = this;
|
||||
this.status.commentCreateLoading = true;
|
||||
|
||||
let content = this.commentBodyToPlain(self.$scope.newComment);
|
||||
if (content.length < 1) {
|
||||
self.status.commentCreateLoading = false;
|
||||
OC.Notification.showTemporary(t('deck', 'Please provide a content for your comment.'));
|
||||
return;
|
||||
}
|
||||
var model = this.activityservice.commentCollection.create({
|
||||
actorId: OC.getCurrentUser().uid,
|
||||
actorDisplayName: OC.getCurrentUser().displayName,
|
||||
actorType: 'users',
|
||||
verb: 'comment',
|
||||
message: content,
|
||||
creationDateTime: (new Date()).toUTCString()
|
||||
}, {
|
||||
at: 0,
|
||||
// wait for real creation before adding
|
||||
wait: true,
|
||||
success: function() {
|
||||
self.$scope.newComment = '';
|
||||
self.activityservice.fetchNewerActivities(self.type, self.element.id).then(function () {});
|
||||
self.status.commentCreateLoading = false;
|
||||
},
|
||||
error: function() {
|
||||
self.status.commentCreateLoading = false;
|
||||
OC.Notification.showTemporary(t('deck', 'Posting the comment failed.'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
updateComment(item) {
|
||||
item.commentEdit = this.formatMessage(item);
|
||||
let $target = $('.newCommentForm .message');
|
||||
this.applyAtWho($target);
|
||||
/** Workaround to trigger avatar rendering after the view has been updated */
|
||||
window.setTimeout(function () {
|
||||
$target.find('.avatar').avatar(undefined, 16);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
editComment(item) {
|
||||
const self = this;
|
||||
let content = this.commentBodyToPlain(item.commentEdit);
|
||||
if (content.length < 1) {
|
||||
OC.Notification.showTemporary(t('deck', 'Please provide a content for your comment.'));
|
||||
return;
|
||||
}
|
||||
/** We need to save the model and afterwards run a fetch to update the mentions
|
||||
* and call apply to propagate the changes to angular
|
||||
*/
|
||||
item.commentModel.on('sync', function() {
|
||||
item.commentModel.off('sync');
|
||||
item.commentModel.fetch({
|
||||
success: function() {
|
||||
self.$scope.$apply();
|
||||
}
|
||||
});
|
||||
});
|
||||
item.commentModel.save({
|
||||
message: content,
|
||||
});
|
||||
item.message = content;
|
||||
item.commentEdit = undefined;
|
||||
}
|
||||
|
||||
deleteComment(item) {
|
||||
item.commentModel.destroy();
|
||||
item.deleted = true;
|
||||
item.commentModel = undefined;
|
||||
item.message = t('deck', 'The comment has been deleted');
|
||||
}
|
||||
|
||||
getData(id) {
|
||||
return this.activityservice.getData(this.type, id);
|
||||
}
|
||||
|
||||
parseMessage(activity) {
|
||||
let subject = activity.subject_rich[0];
|
||||
let parameters = activity.subject_rich[1];
|
||||
if (parameters.after && parameters.after.id && parameters.after.id.startsWith('dt:')) {
|
||||
let dateTime = parameters.after.id.substr(3);
|
||||
parameters.after.name = moment(dateTime).format('L LTS');
|
||||
}
|
||||
return OCA.Activity.RichObjectStringParser.parseMessage(subject, parameters);
|
||||
}
|
||||
|
||||
fetchUntilResults () {
|
||||
const self = this;
|
||||
let dataLengthBefore = self.getData(self.element.id).length;
|
||||
let _executeFetch = function() {
|
||||
let promise = self.activityservice.fetchMoreActivities(self.type, self.element.id);
|
||||
promise.then(function (data) {
|
||||
let dataLengthAfter = self.getData(self.element.id).length;
|
||||
if (data !== null && (dataLengthAfter <= dataLengthBefore || dataLengthAfter < self.activityservice.RESULT_PER_PAGE)) {
|
||||
_executeFetch();
|
||||
} else {
|
||||
self.loading = false;
|
||||
}
|
||||
}, function () {
|
||||
self.loading = false;
|
||||
self.$scope.$apply();
|
||||
});
|
||||
|
||||
};
|
||||
_executeFetch();
|
||||
}
|
||||
|
||||
getComments() {
|
||||
return this.activityservice.comments;
|
||||
}
|
||||
|
||||
getActivityStream() {
|
||||
let activities = this.activityservice.getData(this.type, this.element.id);
|
||||
return activities;
|
||||
}
|
||||
|
||||
page() {
|
||||
if (!this.activityservice.since[this.type][this.element.id].finished) {
|
||||
this.loading = true;
|
||||
this.fetchUntilResults();
|
||||
} else {
|
||||
this.loading = false;
|
||||
}
|
||||
}
|
||||
|
||||
loadingNewer() {
|
||||
return this.activityservice.runningNewer;
|
||||
}
|
||||
|
||||
t(text) {
|
||||
return t('deck', text);
|
||||
}
|
||||
}
|
||||
|
||||
let activityComponent = {
|
||||
templateUrl: OC.linkTo('deck', 'templates/part.card.activity.html'),
|
||||
controller: ActivityController,
|
||||
bindings: {
|
||||
type: '@',
|
||||
element: '='
|
||||
}
|
||||
};
|
||||
export default activityComponent;
|
||||
@@ -4,29 +4,41 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
import app from '../app/App.js';
|
||||
|
||||
/** global: OC */
|
||||
app.controller('AppController', function ($scope, $location, $http, $log, $rootScope) {
|
||||
/* globals oc_current_user: false */
|
||||
app.controller('AppController', function ($scope, $location, $http, $log, $rootScope, $attrs) {
|
||||
$rootScope.sidebar = {
|
||||
show: false
|
||||
};
|
||||
$scope.sidebar = $rootScope.sidebar;
|
||||
$scope.user = oc_current_user;
|
||||
$rootScope.config = JSON.parse($attrs.config);
|
||||
|
||||
$rootScope.compactMode = localStorage.getItem('deck.compactMode') === 'true';
|
||||
$scope.appNavigationHide = localStorage.getItem('deck.appNavigationHide') === 'true';
|
||||
|
||||
$scope.toggleSidebar = function() {
|
||||
if ($(window).width() > 768) {
|
||||
$log.debug($scope.appNavigationHide);
|
||||
$scope.appNavigationHide = !$scope.appNavigationHide;
|
||||
localStorage.setItem('deck.appNavigationHide', JSON.stringify($scope.appNavigationHide));
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
@@ -4,25 +4,33 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
/* global oc_defaults oc_config OC OCP OCA t n */
|
||||
|
||||
import app from '../app/App.js';
|
||||
/* global oc_defaults OC */
|
||||
app.controller('BoardController', function ($rootScope, $scope, $stateParams, StatusService, BoardService, StackService, CardService, LabelService, $state, $transitions, $filter, FileService) {
|
||||
import Vue from 'vue';
|
||||
|
||||
Vue.prototype.t = t;
|
||||
Vue.prototype.n = n;
|
||||
Vue.prototype.OC = OC;
|
||||
|
||||
import CollaborationView from '../views/CollaborationView';
|
||||
|
||||
app.controller('BoardController', function ($rootScope, $scope, $element, $stateParams, StatusService, BoardService, StackService, CardService, LabelService, $state, $transitions, $filter, FileService) {
|
||||
|
||||
$scope.sidebar = $rootScope.sidebar;
|
||||
|
||||
@@ -41,6 +49,48 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
$scope.defaultColors = ['31CC7C', '317CCC', 'FF7A66', 'F1DB50', '7C31CC', 'CC317C', '3A3B3D', 'CACBCD'];
|
||||
$scope.board = BoardService.getCurrent();
|
||||
$scope.uploader = FileService.uploader;
|
||||
$scope.searchText = '';
|
||||
|
||||
$scope.startTitleEdit = function(card) {
|
||||
card.renameTitle = card.title;
|
||||
card.status = card.status || {};
|
||||
card.status.editCard = true;
|
||||
};
|
||||
|
||||
$scope.finishTitleEdit = function(card) {
|
||||
var newTitle;
|
||||
if (!card.renameTitle || !card.renameTitle.trim()) {
|
||||
newTitle = '';
|
||||
} else {
|
||||
newTitle = card.renameTitle.trim();
|
||||
}
|
||||
|
||||
if (newTitle === card.title) {
|
||||
// title unchanged
|
||||
card.status.editCard = false;
|
||||
delete card.renameTitle;
|
||||
} else if (newTitle !== '') {
|
||||
// title changed
|
||||
card.title = newTitle;
|
||||
CardService.update(card).then(function (data) {
|
||||
card.status.editCard = false;
|
||||
delete card.renameTitle;
|
||||
});
|
||||
} else {
|
||||
// empty title
|
||||
card.status.editCard = false;
|
||||
delete card.renameTitle;
|
||||
}
|
||||
};
|
||||
|
||||
$scope.$watch(function() {
|
||||
return $scope.params.tab;
|
||||
}, function (newTab, oldTab) {
|
||||
if (newTab === 2 && oldTab !== 2) {
|
||||
CardService.fetchDeleted($scope.id);
|
||||
StackService.fetchDeleted($scope.id);
|
||||
}
|
||||
});
|
||||
|
||||
// workaround for $stateParams changes not being propagated
|
||||
$scope.$watch(function() {
|
||||
@@ -59,8 +109,8 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
* @returns array of [finished, total] checkboxes
|
||||
*/
|
||||
$scope.getCheckboxes = function(text) {
|
||||
const regTotal = /\[(X|\s|\_|\-)\]\s(.*)/ig;
|
||||
const regFinished = /\[(X|\_|\-)\]\s(.*)/ig;
|
||||
const regTotal = /\[(X|\s|\_|\-)\]/igm;
|
||||
const regFinished = /\[(X|\_|\-)\]/igm;
|
||||
return [
|
||||
((text || '').match(regFinished) || []).length,
|
||||
((text || '').match(regTotal) || []).length
|
||||
@@ -106,6 +156,36 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
}
|
||||
});
|
||||
|
||||
if (parseInt(oc_config.version.split('.')[0]) >= 16) {
|
||||
const ComponentVM = new Vue({
|
||||
render: h => h(CollaborationView),
|
||||
data: {
|
||||
model: BoardService.getCurrent()
|
||||
},
|
||||
});
|
||||
$scope.mountCollections = function () {
|
||||
const MountingPoint = document.getElementById('collaborationResources');
|
||||
if (MountingPoint) {
|
||||
ComponentVM.model = BoardService.getCurrent();
|
||||
ComponentVM.$mount(MountingPoint);
|
||||
}
|
||||
};
|
||||
$scope.$$postDigest($scope.mountCollections);
|
||||
$scope.$watch(function () {
|
||||
return BoardService.getCurrent();
|
||||
}, function () {
|
||||
ComponentVM.model = BoardService.getCurrent();
|
||||
if ($scope.sidebar.show) {
|
||||
$scope.$$postDigest($scope.mountCollections);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$scope.toggleCompactMode = function() {
|
||||
$rootScope.compactMode = !$rootScope.compactMode;
|
||||
localStorage.setItem('deck.compactMode', JSON.stringify($rootScope.compactMode));
|
||||
};
|
||||
|
||||
$scope.stacksData = StackService;
|
||||
$scope.stacks = [];
|
||||
$scope.$watch('stacksData', function () {
|
||||
@@ -175,31 +255,97 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
};
|
||||
|
||||
$scope.createCard = function (stack, title) {
|
||||
var newCard = {
|
||||
'title': title,
|
||||
'stackId': stack,
|
||||
'type': 'plain'
|
||||
};
|
||||
CardService.create(newCard).then(function (data) {
|
||||
$scope.stackservice.addCard(data);
|
||||
$scope.newCard.title = '';
|
||||
});
|
||||
if (this['addCardForm' + stack].$valid) {
|
||||
var newCard = {
|
||||
'title': title,
|
||||
'stackId': stack,
|
||||
'type': 'plain'
|
||||
};
|
||||
CardService.create(newCard).then(function (data) {
|
||||
$scope.stackservice.addCard(data);
|
||||
$scope.newCard.title = '';
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
$scope.stackDelete = function (stack) {
|
||||
$scope.stackservice.delete(stack.id);
|
||||
};
|
||||
|
||||
$scope.stackUndoDelete = function (deletedStack) {
|
||||
return StackService.undoDelete(deletedStack);
|
||||
};
|
||||
|
||||
$scope.cardDelete = function (card) {
|
||||
OC.dialogs.confirm(t('deck', 'Are you sure you want to delete this card with all of its data?'), t('deck', 'Delete'), function(state) {
|
||||
if (!state) {
|
||||
return;
|
||||
}
|
||||
CardService.delete(card.id).then(function () {
|
||||
StackService.removeCard(card);
|
||||
});
|
||||
CardService.delete(card.id).then(function () {
|
||||
StackService.removeCard(card);
|
||||
$scope.sidebar.show = false;
|
||||
});
|
||||
};
|
||||
|
||||
$scope.cardOrCardAndStackUndoDelete = function (deletedCard) {
|
||||
var associatedDeletedStack = $scope.stackservice.deleted[deletedCard.stackId];
|
||||
if(associatedDeletedStack !== undefined) {
|
||||
$scope.cardAndStackUndoDeleteAskForConfirmation(deletedCard, associatedDeletedStack);
|
||||
} else {
|
||||
$scope.cardUndoDelete(deletedCard);
|
||||
}
|
||||
};
|
||||
|
||||
$scope.cardAndStackUndoDeleteAskForConfirmation = function(deletedCard, associatedDeletedStack) {
|
||||
OC.dialogs.confirm(
|
||||
t('deck', 'The associated stack is deleted as well, it will be restored as well.'),
|
||||
t('deck', 'Restore associated stack'),
|
||||
function(state) {
|
||||
if (state) {
|
||||
$scope.cardAndStackUndoDelete(deletedCard, associatedDeletedStack);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
$scope.cardAndStackUndoDelete = function(deletedCard, associatedDeletedStack) {
|
||||
$scope.stackUndoDelete(associatedDeletedStack).then(function() {
|
||||
$scope.cardUndoDelete(deletedCard);
|
||||
});
|
||||
};
|
||||
|
||||
$scope.cardUndoDelete = function(deletedCard) {
|
||||
CardService.undoDelete(deletedCard).then(function() {
|
||||
StackService.addCard(deletedCard);
|
||||
});
|
||||
};
|
||||
|
||||
$scope.cardArchive = function (card) {
|
||||
CardService.archive(card);
|
||||
StackService.removeCard(card);
|
||||
};
|
||||
|
||||
$scope.isCurrentUserAssigned = function (card) {
|
||||
if (! CardService.get(card.id).assignedUsers) {
|
||||
return false;
|
||||
}
|
||||
var userList = CardService.get(card.id).assignedUsers.filter(function (obj) {
|
||||
return obj.participant.uid === OC.getCurrentUser().uid;
|
||||
});
|
||||
return userList.length === 1;
|
||||
};
|
||||
|
||||
$scope.cardAssignToMe = function (card) {
|
||||
CardService.assignUser(card, OC.getCurrentUser().uid)
|
||||
.then(
|
||||
function() {StackService.updateCard(card);}
|
||||
);
|
||||
// TODO: remove this jquery call. Fix and use appPopoverMenuUtils instead
|
||||
$('.popovermenu').addClass('hidden');
|
||||
};
|
||||
|
||||
$scope.cardUnassignFromMe = function (card) {
|
||||
CardService.unassignUser(card, OC.getCurrentUser().uid);
|
||||
StackService.updateCard(card);
|
||||
// TODO: remove this jquery call.Fix and use appPopoverMenuUtils instead
|
||||
$('.popovermenu').addClass('hidden');
|
||||
};
|
||||
$scope.cardUnarchive = function (card) {
|
||||
CardService.unarchive(card);
|
||||
StackService.removeCard(card);
|
||||
@@ -210,8 +356,22 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
// remove from board data
|
||||
var i = BoardService.getCurrent().labels.indexOf(label);
|
||||
BoardService.getCurrent().labels.splice(i, 1);
|
||||
// TODO: remove from cards
|
||||
|
||||
// remove from cards
|
||||
var cards = CardService.data;
|
||||
for (var card in cards) {
|
||||
if (Object.prototype.hasOwnProperty.call(cards, card)) {
|
||||
var labelsFromCard = cards[card].labels;
|
||||
|
||||
labelsFromCard.forEach(function (labelFromCard, index) {
|
||||
if (labelFromCard.id === label.id) {
|
||||
cards[card].labels.splice(index, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$scope.labelCreate = function (label) {
|
||||
label.boardId = $scope.id;
|
||||
LabelService.create(label).then(function (data) {
|
||||
@@ -219,11 +379,35 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
BoardService.getCurrent().labels.push(data);
|
||||
$scope.status.createLabel = false;
|
||||
$scope.newLabel = {};
|
||||
}).catch((err) => {
|
||||
OC.Notification.showTemporary(err);
|
||||
});
|
||||
};
|
||||
|
||||
$scope.labelUpdateBefore = function (label) {
|
||||
label.renameTitle = label.title;
|
||||
};
|
||||
|
||||
$scope.labelUpdate = function (label) {
|
||||
label.edit = false;
|
||||
LabelService.update(label);
|
||||
LabelService.update(label).catch((err) => {
|
||||
label.title = label.renameTitle;
|
||||
OC.Notification.showTemporary(err);
|
||||
});
|
||||
|
||||
// update labels in UI
|
||||
var cards = CardService.data;
|
||||
for (var card in cards) {
|
||||
if (Object.prototype.hasOwnProperty.call(cards, card)) {
|
||||
var labelsFromCard = cards[card].labels;
|
||||
|
||||
labelsFromCard.forEach(function (labelFromCard, index) {
|
||||
if (labelFromCard.id === label.id) {
|
||||
cards[card].labels[index] = label;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$scope.aclAdd = function (sharee) {
|
||||
@@ -231,12 +415,14 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
BoardService.addAcl(sharee);
|
||||
$scope.status.addSharee = null;
|
||||
};
|
||||
|
||||
$scope.aclDelete = function (acl) {
|
||||
BoardService.deleteAcl(acl).then(function(data) {
|
||||
$scope.loadDefault();
|
||||
$scope.refreshData();
|
||||
});
|
||||
};
|
||||
|
||||
$scope.aclUpdate = function (acl) {
|
||||
BoardService.updateAcl(acl);
|
||||
};
|
||||
@@ -250,6 +436,8 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
return 'user';
|
||||
case OC.Share.SHARE_TYPE_GROUP:
|
||||
return 'group';
|
||||
case OC.Share.SHARE_TYPE_CIRCLE:
|
||||
return 'circles';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
@@ -261,7 +449,7 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
itemMoved: function (event) {
|
||||
event.source.itemScope.modelValue.status = event.dest.sortableScope.$parent.column;
|
||||
var order = event.dest.index;
|
||||
var card = event.source.itemScope.c;
|
||||
var card = $scope.cardservice.get(event.source.itemScope.c.id);
|
||||
var newStack = event.dest.sortableScope.$parent.s.id;
|
||||
var oldStack = card.stackId;
|
||||
card.stackId = newStack;
|
||||
@@ -277,7 +465,7 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
},
|
||||
orderChanged: function (event) {
|
||||
var order = event.dest.index;
|
||||
var card = event.source.itemScope.c;
|
||||
var card = $scope.cardservice.get(event.source.itemScope.c.id);
|
||||
var stack = event.dest.sortableScope.$parent.s.id;
|
||||
CardService.reorder(card, order).then(function (data) {
|
||||
StackService.reorderCard(card, order);
|
||||
@@ -354,6 +542,14 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
};
|
||||
};
|
||||
|
||||
$scope.colorValue = function(color) {
|
||||
const re = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/;
|
||||
if (re.test(color)) {
|
||||
return color;
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
$scope.attachmentCount = function(card) {
|
||||
if (Array.isArray(card.attachments)) {
|
||||
return card.attachments.filter((obj) => obj.deletedAt === 0).length;
|
||||
@@ -361,4 +557,12 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
|
||||
return card.attachmentCount;
|
||||
};
|
||||
|
||||
$scope.unreadCommentCount = function(card) {
|
||||
return card.commentsUnread;
|
||||
};
|
||||
|
||||
$scope.isTimelineEnabled = function() {
|
||||
return OCP.Comments && OCA.Activity;
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
@@ -4,28 +4,29 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/* global app moment angular OC */
|
||||
/* global app moment angular OC OCP OCA */
|
||||
import app from '../app/App.js';
|
||||
|
||||
app.controller('CardController', function ($scope, $rootScope, $sce, $location, $stateParams, $state, $interval, $timeout, $filter, BoardService, CardService, StackService, StatusService, markdownItConverter, FileService) {
|
||||
$scope.sidebar = $rootScope.sidebar;
|
||||
$scope.status = {
|
||||
renameTitle: '',
|
||||
lastEdit: 0,
|
||||
lastSave: Date.now()
|
||||
};
|
||||
@@ -43,6 +44,7 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
return $state.params;
|
||||
}, function (params) {
|
||||
$scope.params = params;
|
||||
$scope.fileservice.reset();
|
||||
}, true);
|
||||
$scope.params = $state.params;
|
||||
|
||||
@@ -88,9 +90,10 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
});
|
||||
|
||||
$scope.cardRenameShow = function () {
|
||||
if ($scope.archived || !BoardService.canEdit())
|
||||
{return false;}
|
||||
else {
|
||||
if ($scope.archived || !BoardService.canEdit()) {
|
||||
return false;
|
||||
} else {
|
||||
$scope.status.renameTitle = CardService.getCurrent().title;
|
||||
$scope.status.cardRename = true;
|
||||
}
|
||||
};
|
||||
@@ -98,11 +101,11 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
$scope.toggleCheckbox = function (id) {
|
||||
$('#markdown input[type=checkbox]').attr('disabled', true);
|
||||
$scope.status.edit = angular.copy(CardService.getCurrent());
|
||||
var reg = /\[(X|\s|\_|\-)\]\s(.*)/ig;
|
||||
var reg = /\[(X|\s|\_|\-)\]/ig;
|
||||
var nth = 0;
|
||||
$scope.status.edit.description = $scope.status.edit.description.replace(reg, function (match, i, original) {
|
||||
var result = match;
|
||||
if (nth++ === id) {
|
||||
if ('' + nth++ === '' + id) {
|
||||
if (match.match(/^\[\s\]/i)) {
|
||||
result = match.replace(/\[\s\]/i, '[x]');
|
||||
}
|
||||
@@ -114,7 +117,7 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
return match;
|
||||
});
|
||||
CardService.update($scope.status.edit).then(function (data) {
|
||||
var header = $('.section-header-tabbed .tabDetails');
|
||||
var header = $('.tabDetails');
|
||||
header.find('.save-indicator.unsaved').hide();
|
||||
header.find('.save-indicator.saved').fadeIn(250).fadeOut(1000);
|
||||
});
|
||||
@@ -125,10 +128,11 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
var checkboxId = $($event.target).data('id');
|
||||
if ($event.target.tagName === 'LABEL') {
|
||||
$scope.toggleCheckbox(checkboxId);
|
||||
return;
|
||||
$event.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
if ($event.target.tagName === 'INPUT') {
|
||||
$scope.toggleCheckbox(checkboxId);
|
||||
$event.stopPropagation();
|
||||
return;
|
||||
}
|
||||
if (BoardService.isArchived() || CardService.getCurrent().archived) {
|
||||
@@ -143,7 +147,7 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
};
|
||||
$scope.cardEditDescriptionChanged = function ($event) {
|
||||
$scope.status.lastEdit = Date.now();
|
||||
var header = $('.section-header-tabbed .tabDetails');
|
||||
var header = $('.tabDetails');
|
||||
header.find('.save-indicator.unsaved').show();
|
||||
header.find('.save-indicator.saved').hide();
|
||||
};
|
||||
@@ -153,10 +157,10 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
if (timeSinceEdit > 1000 && $scope.status.lastEdit > $scope.status.lastSave && !$scope.status.saving) {
|
||||
$scope.status.lastSave = currentTime;
|
||||
$scope.status.saving = true;
|
||||
var header = $('.section-header-tabbed .tabDetails');
|
||||
var header = $('.tabDetails');
|
||||
header.find('.save-indicator.unsaved').fadeIn(500);
|
||||
CardService.update($scope.status.edit).then(function (data) {
|
||||
var header = $('.section-header-tabbed .tabDetails');
|
||||
var header = $('.tabDetails');
|
||||
header.find('.save-indicator.unsaved').hide();
|
||||
header.find('.save-indicator.saved').fadeIn(250).fadeOut(1000);
|
||||
$scope.status.saving = false;
|
||||
@@ -166,15 +170,33 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
|
||||
// handle rename to update information on the board as well
|
||||
$scope.cardRename = function (card) {
|
||||
CardService.rename(card).then(function (data) {
|
||||
var newTitle;
|
||||
if (!$scope.status.renameTitle || !$scope.status.renameTitle.trim()) {
|
||||
newTitle = '';
|
||||
} else {
|
||||
newTitle = $scope.status.renameTitle.trim();
|
||||
}
|
||||
|
||||
if (newTitle === card.title) {
|
||||
// title unchanged
|
||||
$scope.status.renameCard = false;
|
||||
});
|
||||
} else if (newTitle !== '') {
|
||||
// title changed
|
||||
card.title = newTitle;
|
||||
CardService.rename(card).then(function (data) {
|
||||
$scope.status.renameCard = false;
|
||||
});
|
||||
} else {
|
||||
// empty title
|
||||
$scope.status.renameTitle = card.title;
|
||||
$scope.status.renameCard = false;
|
||||
}
|
||||
};
|
||||
$scope.cardUpdate = function (card) {
|
||||
CardService.update(card).then(function (data) {
|
||||
$scope.status.cardEditDescription = false;
|
||||
$scope.updateMarkdown($scope.status.edit.description);
|
||||
var header = $('.section-header-tabbed .tabDetails');
|
||||
var header = $('.tabDetails');
|
||||
header.find('.save-indicator.unsaved').hide();
|
||||
header.find('.save-indicator.saved').fadeIn(500).fadeOut(1000);
|
||||
});
|
||||
@@ -219,7 +241,7 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
element.duedate = null;
|
||||
CardService.update(element);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Show ui-select field when clicking the add button
|
||||
*/
|
||||
@@ -257,4 +279,8 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
|
||||
};
|
||||
};
|
||||
|
||||
$scope.isTimelineEnabled = function() {
|
||||
return OCP.Comments && OCA.Activity;
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
@@ -4,25 +4,25 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/* global app angular */
|
||||
/* global app angular oc_isadmin */
|
||||
|
||||
var ListController = function ($scope, $location, $filter, BoardService, $element, $timeout, $stateParams, $state, StatusService) {
|
||||
var ListController = function ($scope, $location, $filter, BoardService, $element, $timeout, $stateParams, $state, StatusService, $http, $q, $rootScope) {
|
||||
|
||||
function calculateNewColor() {
|
||||
var boards = BoardService.getAll();
|
||||
@@ -55,6 +55,63 @@ var ListController = function ($scope, $location, $filter, BoardService, $elemen
|
||||
$scope.colors = ['0082c9', '00c9c6','00c906', 'c92b00', 'F1DB50', '7C31CC', '3A3B3D', 'CACBCD'];
|
||||
$scope.boardservice = BoardService;
|
||||
$scope.updatingBoard = null;
|
||||
$scope.isAdmin = oc_isadmin;
|
||||
$scope.canCreate = $rootScope.config.canCreate;
|
||||
|
||||
if ($scope.isAdmin) {
|
||||
OC.Apps.enableDynamicSlideToggle();
|
||||
$scope.groups = [];
|
||||
$scope.groupLimit = [];
|
||||
$scope.groupLimitDisabled = true;
|
||||
let fetchGroups = function () {
|
||||
var deferred = $q.defer();
|
||||
// TODO: move to groups/details once 15 is min version
|
||||
$http.get(OC.linkToOCS('cloud', 2) + 'groups').then(function (response) {
|
||||
$scope.groups = response.data.ocs.data.groups.reduce((obj, item) => {
|
||||
obj.push({
|
||||
id: item,
|
||||
displayname: item,
|
||||
});
|
||||
return obj;
|
||||
}, []);
|
||||
deferred.resolve($scope.groups);
|
||||
}, function (error) {
|
||||
deferred.reject('Error while loading groups');
|
||||
});
|
||||
$http.get(OC.generateUrl('apps/deck/config')).then(function (response) {
|
||||
$scope.groupLimit = response.data.groupLimit;
|
||||
$scope.groupLimitDisabled = false;
|
||||
deferred.resolve(response.data);
|
||||
}, function (error) {
|
||||
deferred.reject('Error while loading groupLimit');
|
||||
});
|
||||
return deferred.promise;
|
||||
};
|
||||
|
||||
let updateConfig = function() {
|
||||
$scope.groupLimitDisabled = true;
|
||||
var deferred = $q.defer();
|
||||
$http.post(OC.generateUrl('apps/deck/config/groupLimit'), {value: $scope.groupLimit}).then(function (response) {
|
||||
$scope.groupLimitDisabled = false;
|
||||
deferred.resolve(response.data);
|
||||
}, function (error) {
|
||||
deferred.reject('Error while saving groupLimit');
|
||||
});
|
||||
return deferred.promise;
|
||||
};
|
||||
|
||||
$scope.groupLimitAdd = function (element, model) {
|
||||
$scope.groupLimit.push(element);
|
||||
updateConfig();
|
||||
};
|
||||
$scope.groupLimitRemove = function (element, model) {
|
||||
$scope.groupLimit = $scope.groupLimit.filter((el) => {
|
||||
return el.id !== element.id;
|
||||
});
|
||||
updateConfig();
|
||||
};
|
||||
fetchGroups();
|
||||
}
|
||||
|
||||
var filterData = function () {
|
||||
if($element.attr('id') === 'app-navigation') {
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
|
||||
@@ -32,6 +32,10 @@ app.directive('avatar', function() {
|
||||
link: function(scope, element, attr){
|
||||
scope.uid = attr.displayname;
|
||||
scope.displayname = attr.displayname;
|
||||
scope.size = attr.size;
|
||||
if (typeof scope.size === 'undefined') {
|
||||
scope.size = 32;
|
||||
}
|
||||
var value = attr.user;
|
||||
var avatardiv = $(element).find('.avatardiv');
|
||||
if(typeof attr.contactsmenu !== 'undefined' && attr.contactsmenu !== 'false') {
|
||||
@@ -44,8 +48,8 @@ app.directive('avatar', function() {
|
||||
placement: 'top'
|
||||
});
|
||||
}
|
||||
avatardiv.avatar(value, 32, false, false, false, attr.displayname);
|
||||
avatardiv.avatar(value, scope.size, false, false, false, attr.displayname);
|
||||
},
|
||||
controller: function () {}
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
38
js/directive/bindHtmlCompile.js
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
|
||||
app.directive('bindHtmlCompile', function ($compile) {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
restrict: 'A',
|
||||
link: function (scope, element, attrs) {
|
||||
scope.$watch(function () {
|
||||
return scope.$eval(attrs.bindHtmlCompile);
|
||||
}, function (value) {
|
||||
element.html(value);
|
||||
$compile(element.contents())(scope);
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
59
js/directive/contenteditable.js
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
import app from '../app/App';
|
||||
|
||||
app.directive('ngContenteditable', function($compile) {
|
||||
return {
|
||||
require: 'ngModel',
|
||||
restrict: 'A',
|
||||
scope: {
|
||||
submit: '&ngSubmit'
|
||||
},
|
||||
link: function(scope, element, attrs, ngModel) {
|
||||
|
||||
//read the text typed in the div (syncing model with the view)
|
||||
function read() {
|
||||
ngModel.$setViewValue(element.html());
|
||||
}
|
||||
|
||||
//render the data now in your model into your view
|
||||
//$render is invoked when the modelvalue differs from the viewvalue
|
||||
//see documentation: https://docs.angularjs.org/api/ng/type/ngModel.NgModelController#
|
||||
ngModel.$render = function() {
|
||||
element.html(ngModel.$viewValue || '');
|
||||
};
|
||||
|
||||
//do this whenever someone starts typing
|
||||
element.bind('blur keyup change', function(event) {
|
||||
scope.$apply(read);
|
||||
});
|
||||
|
||||
element.bind('keydown', function(event) {
|
||||
if(event.which === 13 && event.shiftKey) {
|
||||
scope.submit();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -30,9 +30,10 @@ app.directive('datepicker', function () {
|
||||
return {
|
||||
link: function (scope, elm, attr) {
|
||||
return elm.datepicker({
|
||||
dateFormat: 'yy-mm-dd',
|
||||
dateFormat: moment.localeData().longDateFormat('L').replace('YYYY', 'YY').toLowerCase(),
|
||||
onSelect: function(date, inst) {
|
||||
scope.setDuedate(moment(date));
|
||||
var selectedDate = $(this).datepicker('getDate');
|
||||
scope.setDuedate(moment(selectedDate));
|
||||
scope.$apply();
|
||||
},
|
||||
beforeShow: function(input, inst) {
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
|
||||
@@ -30,22 +30,32 @@ app.directive('search', function ($document, $location) {
|
||||
'onSearch': '='
|
||||
},
|
||||
link: function (scope) {
|
||||
var box = $('#searchbox');
|
||||
box.val($location.search().search);
|
||||
|
||||
var doSearch = function() {
|
||||
var value = box.val();
|
||||
scope.$apply(function () {
|
||||
scope.onSearch(value);
|
||||
if (OCA.Search && OCA.Search.Core) {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const search = new OCA.Search((term) => {
|
||||
scope.$apply(function () {
|
||||
scope.onSearch(term);
|
||||
});
|
||||
}, () => {
|
||||
scope.$apply(function () {
|
||||
scope.onSearch('');
|
||||
});
|
||||
});
|
||||
};
|
||||
} else {
|
||||
const box = $('#searchbox');
|
||||
box.val($location.search().search);
|
||||
|
||||
box.on('search keyup', function (event) {
|
||||
if (event.type === 'search' || event.keyCode === 13 ) {
|
||||
var doSearch = function () {
|
||||
var value = box.val();
|
||||
scope.$apply(function () {
|
||||
scope.onSearch(value);
|
||||
});
|
||||
};
|
||||
|
||||
box.on('search keyup', function (event) {
|
||||
doSearch();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
@@ -46,7 +46,8 @@ app.filter('dateToTimestamp', function() {
|
||||
app.filter('parseDate', function() {
|
||||
return function (date) {
|
||||
if(moment(date).isValid()) {
|
||||
return moment(date).format('YYYY-MM-DD');
|
||||
var dateFormat = moment.localeData().longDateFormat('L');
|
||||
return moment(date).format(dateFormat);
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
69
js/init-collections.js
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/* global __webpack_nonce__ __webpack_public_path__ OC t n */
|
||||
// eslint-disable-next-line
|
||||
__webpack_nonce__ = btoa(OC.requestToken);
|
||||
// eslint-disable-next-line
|
||||
__webpack_public_path__ = OC.linkTo('deck', 'js/build/');
|
||||
|
||||
import Vue from 'vue';
|
||||
|
||||
Vue.prototype.t = t;
|
||||
Vue.prototype.n = n;
|
||||
Vue.prototype.OC = OC;
|
||||
|
||||
import BoardSelector from './views/BoardSelector';
|
||||
|
||||
import './../css/collections.css';
|
||||
|
||||
((function(OCP) {
|
||||
|
||||
OCP.Collaboration.registerType('deck', {
|
||||
action: () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const container = document.createElement('div');
|
||||
container.id = 'deck-board-select';
|
||||
const body = document.getElementById('body-user');
|
||||
body.append(container);
|
||||
const ComponentVM = new Vue({
|
||||
render: h => h(BoardSelector),
|
||||
});
|
||||
ComponentVM.$mount(container);
|
||||
ComponentVM.$root.$on('close', () => {
|
||||
ComponentVM.$el.remove();
|
||||
ComponentVM.$destroy();
|
||||
reject();
|
||||
});
|
||||
ComponentVM.$root.$on('select', (id) => {
|
||||
resolve(id);
|
||||
ComponentVM.$el.remove();
|
||||
ComponentVM.$destroy();
|
||||
});
|
||||
});
|
||||
},
|
||||
typeString: t('deck', 'Link to a board'),
|
||||
typeIconClass: 'icon-deck'
|
||||
});
|
||||
})(window.OCP));
|
||||
@@ -1,5 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
/* global __webpack_nonce__ __webpack_public_path__ OC t n */
|
||||
// eslint-disable-next-line
|
||||
__webpack_nonce__ = btoa(OC.requestToken);
|
||||
// eslint-disable-next-line
|
||||
__webpack_public_path__ = OC.linkTo('deck', 'js/build/');
|
||||
|
||||
// used for building a vendor stylesheet
|
||||
import 'ng-sortable/dist/ng-sortable.css';
|
||||
|
||||
@@ -14,9 +20,11 @@ import './app/Run.js';
|
||||
|
||||
import ListController from 'controller/ListController.js';
|
||||
import attachmentListComponent from './controller/AttachmentController.js';
|
||||
import activityComponent from './controller/ActivityController.js';
|
||||
|
||||
app.controller('ListController', ListController);
|
||||
app.component('attachmentListComponent', attachmentListComponent);
|
||||
app.component('activityComponent', activityComponent);
|
||||
|
||||
|
||||
// require all the js files from subdirectories
|
||||
|
||||
161
js/legacy/commentcollection.js
Normal file
@@ -0,0 +1,161 @@
|
||||
/**
|
||||
* @licence
|
||||
*/
|
||||
|
||||
import CommentModel from './commentmodel.js';
|
||||
import CommentSummaryModel from './commentsummarymodel.js';
|
||||
|
||||
/**
|
||||
* @class CommentCollection
|
||||
* @classdesc
|
||||
*
|
||||
* Collection of comments assigned to a file
|
||||
*
|
||||
*/
|
||||
var CommentCollection = OC.Backbone.Collection.extend(
|
||||
/** @lends OCA.AnnouncementCenter.Comments.CommentCollection.prototype */ {
|
||||
|
||||
sync: OC.Backbone.davSync,
|
||||
|
||||
model: CommentModel,
|
||||
|
||||
/**
|
||||
* Object type
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
_objectType: 'deckCard',
|
||||
|
||||
/**
|
||||
* Object id
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
_objectId: null,
|
||||
|
||||
/**
|
||||
* True if there are no more page results left to fetch
|
||||
*
|
||||
* @type bool
|
||||
*/
|
||||
_endReached: false,
|
||||
|
||||
/**
|
||||
* Number of comments to fetch per page
|
||||
*
|
||||
* @type int
|
||||
*/
|
||||
_limit : 5,
|
||||
|
||||
/**
|
||||
* Initializes the collection
|
||||
*
|
||||
* @param {string} [options.objectType] object type
|
||||
* @param {string} [options.objectId] object id
|
||||
*/
|
||||
initialize: function(models, options) {
|
||||
options = options || {};
|
||||
if (options.objectType) {
|
||||
this._objectType = options.objectType;
|
||||
}
|
||||
if (options.objectId) {
|
||||
this._objectId = options.objectId;
|
||||
}
|
||||
},
|
||||
|
||||
url: function() {
|
||||
return OC.linkToRemote('dav') + '/comments/' +
|
||||
encodeURIComponent(this._objectType) + '/' +
|
||||
encodeURIComponent(this._objectId) + '/';
|
||||
},
|
||||
|
||||
setObjectId: function(objectId) {
|
||||
this._objectId = objectId;
|
||||
},
|
||||
|
||||
hasMoreResults: function() {
|
||||
return !this._endReached;
|
||||
},
|
||||
|
||||
reset: function() {
|
||||
this._endReached = false;
|
||||
this._summaryModel = null;
|
||||
return OC.Backbone.Collection.prototype.reset.apply(this, arguments);
|
||||
},
|
||||
|
||||
/**
|
||||
* Fetch the next set of results
|
||||
*/
|
||||
fetchNext: function(options) {
|
||||
var self = this;
|
||||
if (!this.hasMoreResults()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var body = '<?xml version="1.0" encoding="utf-8" ?>\n' +
|
||||
'<oc:filter-comments xmlns:D="DAV:" xmlns:oc="http://owncloud.org/ns">\n' +
|
||||
// load one more so we know there is more
|
||||
' <oc:limit>' + (this._limit + 1) + '</oc:limit>\n' +
|
||||
' <oc:offset>' + this.length + '</oc:offset>\n' +
|
||||
'</oc:filter-comments>\n';
|
||||
|
||||
options = options || {};
|
||||
var success = options.success;
|
||||
options = _.extend({
|
||||
remove: false,
|
||||
parse: true,
|
||||
data: body,
|
||||
davProperties: CommentCollection.prototype.model.prototype.davProperties,
|
||||
success: function(resp) {
|
||||
if (resp.length <= self._limit) {
|
||||
// no new entries, end reached
|
||||
self._endReached = true;
|
||||
} else {
|
||||
// remove last entry, for next page load
|
||||
resp = _.initial(resp);
|
||||
}
|
||||
if (!self.set(resp, options)) {
|
||||
return false;
|
||||
}
|
||||
if (success) {
|
||||
success.apply(null, arguments);
|
||||
}
|
||||
self.trigger('sync', 'REPORT', self, options);
|
||||
}
|
||||
}, options);
|
||||
|
||||
return this.sync('REPORT', this, options);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the matching summary model
|
||||
*
|
||||
* @return {OCA.AnnouncementCenter.Comments.CommentSummaryModel} summary model
|
||||
*/
|
||||
getSummaryModel: function() {
|
||||
if (!this._summaryModel) {
|
||||
this._summaryModel = new CommentSummaryModel({
|
||||
id: this._objectId,
|
||||
objectType: this._objectType
|
||||
});
|
||||
}
|
||||
return this._summaryModel;
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates the read marker for this comment thread
|
||||
*
|
||||
* @param {Date} [date] optional date, defaults to now
|
||||
* @param {Object} [options] backbone options
|
||||
*/
|
||||
updateReadMarker: function(date, options) {
|
||||
options = options || {};
|
||||
|
||||
return this.getSummaryModel().save({
|
||||
readMarker: (date || new Date()).toUTCString()
|
||||
}, options);
|
||||
}
|
||||
});
|
||||
|
||||
export default CommentCollection;
|
||||
|
||||
119
js/legacy/commentmodel.js
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright (c) 2016
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3
|
||||
* or later.
|
||||
*
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
var NS_OWNCLOUD = 'http://owncloud.org/ns';
|
||||
/**
|
||||
* @class CommentModel
|
||||
* @classdesc
|
||||
*
|
||||
* Comment
|
||||
*
|
||||
*/
|
||||
var CommentModel = OC.Backbone.Model.extend(
|
||||
/** @lends OCA.Comments.CommentModel.prototype */ {
|
||||
sync: OC.Backbone.davSync,
|
||||
|
||||
/**
|
||||
* Object type
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
_objectType: 'deckCard',
|
||||
|
||||
/**
|
||||
* Object id
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
_objectId: null,
|
||||
|
||||
initialize: function(model, options) {
|
||||
options = options || {};
|
||||
if (options.objectType) {
|
||||
this._objectType = options.objectType;
|
||||
}
|
||||
if (options.objectId) {
|
||||
this._objectId = options.objectId;
|
||||
}
|
||||
},
|
||||
|
||||
defaults: {
|
||||
actorType: 'users',
|
||||
objectType: 'deckCard'
|
||||
},
|
||||
|
||||
davProperties: {
|
||||
'id': '{' + NS_OWNCLOUD + '}id',
|
||||
'message': '{' + NS_OWNCLOUD + '}message',
|
||||
'actorType': '{' + NS_OWNCLOUD + '}actorType',
|
||||
'actorId': '{' + NS_OWNCLOUD + '}actorId',
|
||||
'actorDisplayName': '{' + NS_OWNCLOUD + '}actorDisplayName',
|
||||
'creationDateTime': '{' + NS_OWNCLOUD + '}creationDateTime',
|
||||
'objectType': '{' + NS_OWNCLOUD + '}objectType',
|
||||
'objectId': '{' + NS_OWNCLOUD + '}objectId',
|
||||
'isUnread': '{' + NS_OWNCLOUD + '}isUnread',
|
||||
'mentions': '{' + NS_OWNCLOUD + '}mentions'
|
||||
},
|
||||
|
||||
parse: function(data) {
|
||||
return {
|
||||
id: data.id,
|
||||
message: data.message,
|
||||
actorType: data.actorType,
|
||||
actorId: data.actorId,
|
||||
actorDisplayName: data.actorDisplayName,
|
||||
creationDateTime: data.creationDateTime,
|
||||
objectType: data.objectType,
|
||||
objectId: data.objectId,
|
||||
isUnread: (data.isUnread === 'true'),
|
||||
mentions: this._parseMentions(data.mentions)
|
||||
};
|
||||
},
|
||||
|
||||
_parseMentions: function(mentions) {
|
||||
if(_.isUndefined(mentions)) {
|
||||
return {};
|
||||
}
|
||||
var result = {};
|
||||
for(var i in mentions) {
|
||||
var mention = mentions[i];
|
||||
if(_.isUndefined(mention.localName) || mention.localName !== 'mention') {
|
||||
continue;
|
||||
}
|
||||
result[i] = {};
|
||||
for (var child = mention.firstChild; child; child = child.nextSibling) {
|
||||
if(_.isUndefined(child.localName) || !child.localName.startsWith('mention')) {
|
||||
continue;
|
||||
}
|
||||
result[i][child.localName] = child.textContent;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
url: function() {
|
||||
let baseUrl;
|
||||
if (typeof this.collection === 'undefined') {
|
||||
baseUrl = OC.linkToRemote('dav') + '/comments/' +
|
||||
encodeURIComponent(this.get('objectType')) + '/' +
|
||||
encodeURIComponent(this.get('objectId')) + '/';
|
||||
} else {
|
||||
baseUrl = this.collection.url();
|
||||
}
|
||||
if (typeof this.get('id') !== 'undefined') {
|
||||
return baseUrl + this.get('id');
|
||||
} else {
|
||||
return baseUrl;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export default CommentModel;
|
||||
|
||||
54
js/legacy/commentsummarymodel.js
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
var NS_OWNCLOUD = 'http://owncloud.org/ns';
|
||||
/**
|
||||
* @class OCA.AnnouncementCenter.Comments.CommentSummaryModel
|
||||
* @classdesc
|
||||
*
|
||||
* Model containing summary information related to comments
|
||||
* like the read marker.
|
||||
*
|
||||
*/
|
||||
var CommentSummaryModel = OC.Backbone.Model.extend(
|
||||
/** @lends OCA.AnnouncementCenter.Comments.CommentSummaryModel.prototype */ {
|
||||
sync: OC.Backbone.davSync,
|
||||
|
||||
/**
|
||||
* Object type
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
_objectType: 'deckCard',
|
||||
|
||||
/**
|
||||
* Object id
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
_objectId: null,
|
||||
|
||||
davProperties: {
|
||||
'readMarker': '{' + NS_OWNCLOUD + '}readMarker'
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes the summary model
|
||||
*
|
||||
* @param {string} [options.objectType] object type
|
||||
* @param {string} [options.objectId] object id
|
||||
*/
|
||||
initialize: function(attrs, options) {
|
||||
options = options || {};
|
||||
if (options.objectType) {
|
||||
this._objectType = options.objectType;
|
||||
}
|
||||
},
|
||||
|
||||
url: function() {
|
||||
return OC.linkToRemote('dav') + '/comments/' +
|
||||
encodeURIComponent(this._objectType) + '/' +
|
||||
encodeURIComponent(this.id) + '/';
|
||||
}
|
||||
});
|
||||
|
||||
export default CommentSummaryModel;
|
||||
|
||||
1
js/legacy/jquery.atwho.min.js
vendored
Normal file
561
js/legacy/jquery.caret.min.js
vendored
Normal file
@@ -0,0 +1,561 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
(function($, undefined) {
|
||||
|
||||
var _input = document.createElement('input');
|
||||
|
||||
var _support = {
|
||||
setSelectionRange: ('setSelectionRange' in _input) || ('selectionStart' in _input),
|
||||
createTextRange: ('createTextRange' in _input) || ('selection' in document)
|
||||
};
|
||||
|
||||
var _rNewlineIE = /\r\n/g,
|
||||
_rCarriageReturn = /\r/g;
|
||||
|
||||
var _getValue = function(input) {
|
||||
if (typeof(input.value) !== 'undefined') {
|
||||
return input.value;
|
||||
}
|
||||
return $(input).text();
|
||||
};
|
||||
|
||||
var _setValue = function(input, value) {
|
||||
if (typeof(input.value) !== 'undefined') {
|
||||
input.value = value;
|
||||
} else {
|
||||
$(input).text(value);
|
||||
}
|
||||
};
|
||||
|
||||
var _getIndex = function(input, pos) {
|
||||
var norm = _getValue(input).replace(_rCarriageReturn, '');
|
||||
var len = norm.length;
|
||||
|
||||
if (typeof(pos) === 'undefined') {
|
||||
pos = len;
|
||||
}
|
||||
|
||||
pos = Math.floor(pos);
|
||||
|
||||
// Negative index counts backward from the end of the input/textarea's value
|
||||
if (pos < 0) {
|
||||
pos = len + pos;
|
||||
}
|
||||
|
||||
// Enforce boundaries
|
||||
if (pos < 0) { pos = 0; }
|
||||
if (pos > len) { pos = len; }
|
||||
|
||||
return pos;
|
||||
};
|
||||
|
||||
var _hasAttr = function(input, attrName) {
|
||||
return input.hasAttribute ? input.hasAttribute(attrName) : (typeof(input[attrName]) !== 'undefined');
|
||||
};
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @constructor
|
||||
*/
|
||||
var Range = function(start, end, length, text) {
|
||||
this.start = start || 0;
|
||||
this.end = end || 0;
|
||||
this.length = length || 0;
|
||||
this.text = text || '';
|
||||
};
|
||||
|
||||
Range.prototype.toString = function() {
|
||||
return JSON.stringify(this, null, ' ');
|
||||
};
|
||||
|
||||
var _getCaretW3 = function(input) {
|
||||
return input.selectionStart;
|
||||
};
|
||||
|
||||
/**
|
||||
* @see http://stackoverflow.com/q/6943000/467582
|
||||
*/
|
||||
var _getCaretIE = function(input) {
|
||||
var caret, range, textInputRange, rawValue, len, endRange;
|
||||
|
||||
// Yeah, you have to focus twice for IE 7 and 8. *cries*
|
||||
input.focus();
|
||||
input.focus();
|
||||
|
||||
range = document.selection.createRange();
|
||||
|
||||
if (range && range.parentElement() === input) {
|
||||
rawValue = _getValue(input);
|
||||
|
||||
len = rawValue.length;
|
||||
|
||||
// Create a working TextRange that lives only in the input
|
||||
textInputRange = input.createTextRange();
|
||||
textInputRange.moveToBookmark(range.getBookmark());
|
||||
|
||||
// Check if the start and end of the selection are at the very end
|
||||
// of the input, since moveStart/moveEnd doesn't return what we want
|
||||
// in those cases
|
||||
endRange = input.createTextRange();
|
||||
endRange.collapse(false);
|
||||
|
||||
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
|
||||
caret = rawValue.replace(_rNewlineIE, '\n').length;
|
||||
} else {
|
||||
caret = -textInputRange.moveStart("character", -len);
|
||||
}
|
||||
|
||||
return caret;
|
||||
}
|
||||
|
||||
// NOTE: This occurs when you highlight part of a textarea and then click in the middle of the highlighted portion in IE 6-10.
|
||||
// There doesn't appear to be anything we can do about it.
|
||||
// alert("Your browser is incredibly stupid. I don't know what else to say.");
|
||||
// alert(range + '\n\n' + range.parentElement().tagName + '#' + range.parentElement().id);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the position of the caret in the given input.
|
||||
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
|
||||
* @returns {Number}
|
||||
* @see http://stackoverflow.com/questions/263743/how-to-get-cursor-position-in-textarea/263796#263796
|
||||
*/
|
||||
var _getCaret = function(input) {
|
||||
if (!input) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Mozilla, et al.
|
||||
if (_support.setSelectionRange) {
|
||||
return _getCaretW3(input);
|
||||
}
|
||||
// IE
|
||||
else if (_support.createTextRange) {
|
||||
return _getCaretIE(input);
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
var _setCaretW3 = function(input, pos) {
|
||||
input.setSelectionRange(pos, pos);
|
||||
};
|
||||
|
||||
var _setCaretIE = function(input, pos) {
|
||||
var range = input.createTextRange();
|
||||
range.move('character', pos);
|
||||
range.select();
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the position of the caret in the given input.
|
||||
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
|
||||
* @param {Number} pos
|
||||
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
|
||||
*/
|
||||
var _setCaret = function(input, pos) {
|
||||
input.focus();
|
||||
|
||||
pos = _getIndex(input, pos);
|
||||
|
||||
// Mozilla, et al.
|
||||
if (_support.setSelectionRange) {
|
||||
_setCaretW3(input, pos);
|
||||
}
|
||||
// IE
|
||||
else if (_support.createTextRange) {
|
||||
_setCaretIE(input, pos);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Inserts the specified text at the current caret position in the given input.
|
||||
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
|
||||
* @param {String} text
|
||||
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
|
||||
*/
|
||||
var _insertAtCaret = function(input, text) {
|
||||
var curPos = _getCaret(input);
|
||||
|
||||
var oldValueNorm = _getValue(input).replace(_rCarriageReturn, '');
|
||||
|
||||
var newLength = +(curPos + text.length + (oldValueNorm.length - curPos));
|
||||
var maxLength = +input.getAttribute('maxlength');
|
||||
|
||||
if(_hasAttr(input, 'maxlength') && newLength > maxLength) {
|
||||
var delta = text.length - (newLength - maxLength);
|
||||
text = text.substr(0, delta);
|
||||
}
|
||||
|
||||
_setValue(input, oldValueNorm.substr(0, curPos) + text + oldValueNorm.substr(curPos));
|
||||
|
||||
_setCaret(input, curPos + text.length);
|
||||
};
|
||||
|
||||
var _getInputRangeW3 = function(input) {
|
||||
var range = new Range();
|
||||
|
||||
range.start = input.selectionStart;
|
||||
range.end = input.selectionEnd;
|
||||
|
||||
var min = Math.min(range.start, range.end);
|
||||
var max = Math.max(range.start, range.end);
|
||||
|
||||
range.length = max - min;
|
||||
range.text = _getValue(input).substring(min, max);
|
||||
|
||||
return range;
|
||||
};
|
||||
|
||||
/** @see http://stackoverflow.com/a/3648244/467582 */
|
||||
var _getInputRangeIE = function(input) {
|
||||
var range = new Range();
|
||||
|
||||
input.focus();
|
||||
|
||||
var selection = document.selection.createRange();
|
||||
|
||||
if (selection && selection.parentElement() === input) {
|
||||
var len, normalizedValue, textInputRange, endRange, start = 0, end = 0;
|
||||
var rawValue = _getValue(input);
|
||||
|
||||
len = rawValue.length;
|
||||
normalizedValue = rawValue.replace(/\r\n/g, "\n");
|
||||
|
||||
// Create a working TextRange that lives only in the input
|
||||
textInputRange = input.createTextRange();
|
||||
textInputRange.moveToBookmark(selection.getBookmark());
|
||||
|
||||
// Check if the start and end of the selection are at the very end
|
||||
// of the input, since moveStart/moveEnd doesn't return what we want
|
||||
// in those cases
|
||||
endRange = input.createTextRange();
|
||||
endRange.collapse(false);
|
||||
|
||||
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
|
||||
start = end = len;
|
||||
} else {
|
||||
start = -textInputRange.moveStart("character", -len);
|
||||
start += normalizedValue.slice(0, start).split("\n").length - 1;
|
||||
|
||||
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
|
||||
end = len;
|
||||
} else {
|
||||
end = -textInputRange.moveEnd("character", -len);
|
||||
end += normalizedValue.slice(0, end).split("\n").length - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// normalize newlines
|
||||
start -= (rawValue.substring(0, start).split('\r\n').length - 1);
|
||||
end -= (rawValue.substring(0, end).split('\r\n').length - 1);
|
||||
/// normalize newlines
|
||||
|
||||
range.start = start;
|
||||
range.end = end;
|
||||
range.length = range.end - range.start;
|
||||
range.text = normalizedValue.substr(range.start, range.length);
|
||||
}
|
||||
|
||||
return range;
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the selected text range of the given input.
|
||||
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
|
||||
* @returns {Range}
|
||||
* @see http://stackoverflow.com/a/263796/467582
|
||||
* @see http://stackoverflow.com/a/2966703/467582
|
||||
*/
|
||||
var _getInputRange = function(input) {
|
||||
if (!input) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Mozilla, et al.
|
||||
if (_support.setSelectionRange) {
|
||||
return _getInputRangeW3(input);
|
||||
}
|
||||
// IE
|
||||
else if (_support.createTextRange) {
|
||||
return _getInputRangeIE(input);
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
var _setInputRangeW3 = function(input, startPos, endPos) {
|
||||
input.setSelectionRange(startPos, endPos);
|
||||
};
|
||||
|
||||
var _setInputRangeIE = function(input, startPos, endPos) {
|
||||
var tr = input.createTextRange();
|
||||
tr.moveEnd('textedit', -1);
|
||||
tr.moveStart('character', startPos);
|
||||
tr.moveEnd('character', endPos - startPos);
|
||||
tr.select();
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the selected text range of (i.e., highlights text in) the given input.
|
||||
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
|
||||
* @param {Number} startPos Zero-based index
|
||||
* @param {Number} endPos Zero-based index
|
||||
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
|
||||
* @see http://stackoverflow.com/a/2966703/467582
|
||||
*/
|
||||
var _setInputRange = function(input, startPos, endPos) {
|
||||
startPos = _getIndex(input, startPos);
|
||||
endPos = _getIndex(input, endPos);
|
||||
|
||||
// Mozilla, et al.
|
||||
if (_support.setSelectionRange) {
|
||||
_setInputRangeW3(input, startPos, endPos);
|
||||
}
|
||||
// IE
|
||||
else if (_support.createTextRange) {
|
||||
_setInputRangeIE(input, startPos, endPos);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Replaces the currently selected text with the given string.
|
||||
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
|
||||
* @param {String} text New text that will replace the currently selected text.
|
||||
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
|
||||
*/
|
||||
var _replaceInputRange = function(input, text) {
|
||||
var $input = $(input);
|
||||
|
||||
var oldValue = $input.val();
|
||||
var selection = _getInputRange(input);
|
||||
|
||||
var newLength = +(selection.start + text.length + (oldValue.length - selection.end));
|
||||
var maxLength = +$input.attr('maxlength');
|
||||
|
||||
if($input.is('[maxlength]') && newLength > maxLength) {
|
||||
var delta = text.length - (newLength - maxLength);
|
||||
text = text.substr(0, delta);
|
||||
}
|
||||
|
||||
// Now that we know what the user selected, we can replace it
|
||||
var startText = oldValue.substr(0, selection.start);
|
||||
var endText = oldValue.substr(selection.end);
|
||||
|
||||
$input.val(startText + text + endText);
|
||||
|
||||
// Reset the selection
|
||||
var startPos = selection.start;
|
||||
var endPos = startPos + text.length;
|
||||
|
||||
_setInputRange(input, selection.length ? startPos : endPos, endPos);
|
||||
};
|
||||
|
||||
var _selectAllW3 = function(elem) {
|
||||
var selection = window.getSelection();
|
||||
var range = document.createRange();
|
||||
range.selectNodeContents(elem);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
};
|
||||
|
||||
var _selectAllIE = function(elem) {
|
||||
var range = document.body.createTextRange();
|
||||
range.moveToElementText(elem);
|
||||
range.select();
|
||||
};
|
||||
|
||||
/**
|
||||
* Select all text in the given element.
|
||||
* @param {HTMLElement} elem Any block or inline element other than a form element.
|
||||
*/
|
||||
var _selectAll = function(elem) {
|
||||
var $elem = $(elem);
|
||||
if ($elem.is('input, textarea') || elem.select) {
|
||||
$elem.select();
|
||||
return;
|
||||
}
|
||||
|
||||
// Mozilla, et al.
|
||||
if (_support.setSelectionRange) {
|
||||
_selectAllW3(elem);
|
||||
}
|
||||
// IE
|
||||
else if (_support.createTextRange) {
|
||||
_selectAllIE(elem);
|
||||
}
|
||||
};
|
||||
|
||||
var _deselectAll = function() {
|
||||
if (document.selection) {
|
||||
document.selection.empty();
|
||||
}
|
||||
else if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
};
|
||||
|
||||
$.extend($.fn, {
|
||||
|
||||
/**
|
||||
* Gets or sets the position of the caret or inserts text at the current caret position in an input or textarea element.
|
||||
* @returns {Number|jQuery} The current caret position if invoked as a getter (with no arguments)
|
||||
* or this jQuery object if invoked as a setter or inserter.
|
||||
* @see http://web.archive.org/web/20080704185920/http://parentnode.org/javascript/working-with-the-cursor-position/
|
||||
* @since 1.0.0
|
||||
* @example
|
||||
* <pre>
|
||||
* // Get position
|
||||
* var pos = $('input:first').caret();
|
||||
* </pre>
|
||||
* @example
|
||||
* <pre>
|
||||
* // Set position
|
||||
* $('input:first').caret(15);
|
||||
* $('input:first').caret(-3);
|
||||
* </pre>
|
||||
* @example
|
||||
* <pre>
|
||||
* // Insert text at current position
|
||||
* $('input:first').caret('Some text');
|
||||
* </pre>
|
||||
*/
|
||||
caret: function() {
|
||||
var $inputs = this.filter('input, textarea');
|
||||
|
||||
// getCaret()
|
||||
if (arguments.length === 0) {
|
||||
var input = $inputs.get(0);
|
||||
return _getCaret(input);
|
||||
}
|
||||
// setCaret(position)
|
||||
else if (typeof arguments[0] === 'number') {
|
||||
var pos = arguments[0];
|
||||
$inputs.each(function(_i, input) {
|
||||
_setCaret(input, pos);
|
||||
});
|
||||
}
|
||||
// insertAtCaret(text)
|
||||
else {
|
||||
var text = arguments[0];
|
||||
$inputs.each(function(_i, input) {
|
||||
_insertAtCaret(input, text);
|
||||
});
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets or sets the selection range or replaces the currently selected text in an input or textarea element.
|
||||
* @returns {Range|jQuery} The current selection range if invoked as a getter (with no arguments)
|
||||
* or this jQuery object if invoked as a setter or replacer.
|
||||
* @see http://stackoverflow.com/a/2966703/467582
|
||||
* @since 1.0.0
|
||||
* @example
|
||||
* <pre>
|
||||
* // Get selection range
|
||||
* var range = $('input:first').range();
|
||||
* </pre>
|
||||
* @example
|
||||
* <pre>
|
||||
* // Set selection range
|
||||
* $('input:first').range(15);
|
||||
* $('input:first').range(15, 20);
|
||||
* $('input:first').range(-3);
|
||||
* $('input:first').range(-8, -3);
|
||||
* </pre>
|
||||
* @example
|
||||
* <pre>
|
||||
* // Replace the currently selected text
|
||||
* $('input:first').range('Replacement text');
|
||||
* </pre>
|
||||
*/
|
||||
range: function() {
|
||||
var $inputs = this.filter('input, textarea');
|
||||
|
||||
// getRange() = { start: pos, end: pos }
|
||||
if (arguments.length === 0) {
|
||||
var input = $inputs.get(0);
|
||||
return _getInputRange(input);
|
||||
}
|
||||
// setRange(startPos, endPos)
|
||||
else if (typeof arguments[0] === 'number') {
|
||||
var startPos = arguments[0];
|
||||
var endPos = arguments[1];
|
||||
$inputs.each(function(_i, input) {
|
||||
_setInputRange(input, startPos, endPos);
|
||||
});
|
||||
}
|
||||
// replaceRange(text)
|
||||
else {
|
||||
var text = arguments[0];
|
||||
$inputs.each(function(_i, input) {
|
||||
_replaceInputRange(input, text);
|
||||
});
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Selects all text in each element of this jQuery object.
|
||||
* @returns {jQuery} This jQuery object
|
||||
* @see http://stackoverflow.com/a/11128179/467582
|
||||
* @since 1.5.0
|
||||
* @example
|
||||
* <pre>
|
||||
* // Select the contents of span elements when clicked
|
||||
* $('span').on('click', function() { $(this).highlight(); });
|
||||
* </pre>
|
||||
*/
|
||||
selectAll: function() {
|
||||
return this.each(function(_i, elem) {
|
||||
_selectAll(elem);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$.extend($, {
|
||||
/**
|
||||
* Deselects all text on the page.
|
||||
* @returns {jQuery} The jQuery function
|
||||
* @since 1.5.0
|
||||
* @example
|
||||
* <pre>
|
||||
* // Select some text
|
||||
* $('span').selectAll();
|
||||
*
|
||||
* // Deselect the text
|
||||
* $.deselectAll();
|
||||
* </pre>
|
||||
*/
|
||||
deselectAll: function() {
|
||||
_deselectAll();
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
}(window.jQuery || window.Zepto || window.$));
|
||||
@@ -17,11 +17,15 @@ checkboxReplace = function(md, options, Token) {
|
||||
idPrefix: 'checkbox'
|
||||
};
|
||||
options = Object.assign(defaults, options);
|
||||
pattern = /\[(X|\s|\_|\-)\]\s(.*)/i;
|
||||
createTokens = function(checked, label, Token) {
|
||||
pattern = /(.*?)(\[(X|\s|\_|\-)\])(.*)/igm;
|
||||
createTokens = function(checked, label, Token, before) {
|
||||
var id, idNumeric, nodes, token;
|
||||
nodes = [];
|
||||
|
||||
token = new Token("text", "", 0);
|
||||
token.content = before;
|
||||
nodes.push(token);
|
||||
|
||||
/**
|
||||
* <div class="checkbox">
|
||||
*/
|
||||
@@ -42,6 +46,7 @@ checkboxReplace = function(md, options, Token) {
|
||||
if (checked === true) {
|
||||
token.attrs.push(["checked", "true"]);
|
||||
}
|
||||
token.attrs.push(["class", "checkbox"]);
|
||||
nodes.push(token);
|
||||
|
||||
/**
|
||||
@@ -68,19 +73,20 @@ checkboxReplace = function(md, options, Token) {
|
||||
return nodes;
|
||||
};
|
||||
splitTextToken = function(original, Token) {
|
||||
var checked, label, matches, text, value;
|
||||
var checked, label, matches, text, value, before;
|
||||
text = original.content;
|
||||
matches = text.match(pattern);
|
||||
matches = pattern.exec(text);
|
||||
if (matches === null) {
|
||||
return original;
|
||||
}
|
||||
checked = false;
|
||||
value = matches[1];
|
||||
label = matches[2];
|
||||
before = matches[1];
|
||||
value = matches[3];
|
||||
label = matches[4];
|
||||
if (value === "X" || value === "x") {
|
||||
checked = true;
|
||||
}
|
||||
return createTokens(checked, label, Token);
|
||||
return createTokens(checked, label, Token, before);
|
||||
};
|
||||
return function(state) {
|
||||
lastId = 0;
|
||||
@@ -94,11 +100,11 @@ checkboxReplace = function(md, options, Token) {
|
||||
continue;
|
||||
}
|
||||
tokens = blockTokens[j].children;
|
||||
i = tokens.length - 1;
|
||||
while (i >= 0) {
|
||||
i = 0;
|
||||
while (i < tokens.length) {
|
||||
token = tokens[i];
|
||||
blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, splitTextToken(token, state.Token));
|
||||
i--;
|
||||
i++;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
8772
js/package-lock.json
generated
@@ -3,37 +3,49 @@
|
||||
"description": "Frontend for the Nextcloud Deck app",
|
||||
"repository": "https://github.com/nextcloud/deck",
|
||||
"version": "1.0.0",
|
||||
"main": "Gruntfile.js",
|
||||
"directories": {
|
||||
"test": "tests"
|
||||
},
|
||||
"dependencies": {
|
||||
"@uirouter/angularjs": "^1.0.18",
|
||||
"angular": "^1.7.2",
|
||||
"angular-animate": "^1.7.2",
|
||||
"@uirouter/angularjs": "^1.0.22",
|
||||
"angular": "^1.7.8",
|
||||
"angular-animate": "^1.7.8",
|
||||
"angular-file-upload": "^2.5.0",
|
||||
"angular-markdown-it": "^0.6.1",
|
||||
"angular-sanitize": "^1.7.2",
|
||||
"angular-sanitize": "^1.7.8",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"markdown-it": "^8.4.1",
|
||||
"markdown-it": "^8.4.2",
|
||||
"markdown-it-link-target": "^1.0.2",
|
||||
"nextcloud-axios": "^0.2.0",
|
||||
"nextcloud-vue": "^0.11.4",
|
||||
"nextcloud-vue-collections": "^0.5.2",
|
||||
"ng-infinite-scroll": "^1.3.0",
|
||||
"ng-sortable": "^1.3.8",
|
||||
"ui-select": "^0.19.8"
|
||||
"ui-select": "^0.19.8",
|
||||
"vue": "^2.6.10",
|
||||
"vuex": "^3.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-loader": "^7.1.2",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"css-loader": "^0.28.9",
|
||||
"karma": "^2.0.3",
|
||||
"mini-css-extract-plugin": "^0.4.0",
|
||||
"node-sass": "^4.5.3",
|
||||
"webpack": "^4.12.0",
|
||||
"webpack-cli": "^3.0.8",
|
||||
"webpack-merge": "^4.1.3"
|
||||
"@babel/core": "^7.4.5",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||
"@babel/polyfill": "^7.4.4",
|
||||
"@babel/preset-env": "^7.4.5",
|
||||
"babel-loader": "^8.0.6",
|
||||
"css-loader": "^3.0.0",
|
||||
"karma": "^4.1.0",
|
||||
"mini-css-extract-plugin": "^0.7.0",
|
||||
"style-loader": "^0.23.1",
|
||||
"uglifyjs-webpack-plugin": "^2.1.3",
|
||||
"url-loader": "^2.0.1",
|
||||
"vue-loader": "^15.7.0",
|
||||
"vue-style-loader": "^4.1.2",
|
||||
"vue-template-compiler": "^2.6.10",
|
||||
"webpack": "^4.35.0",
|
||||
"webpack-cli": "^3.3.5",
|
||||
"webpack-merge": "^4.2.1"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "./node_modules/webpack-cli/bin/cli.js --mode production --config webpack.prod.config.js",
|
||||
"build": "NODE_ENV=production ./node_modules/webpack-cli/bin/cli.js --mode production --config webpack.prod.config.js",
|
||||
"dev": "./node_modules/webpack-cli/bin/cli.js --mode development --config webpack.dev.config.js",
|
||||
"watch": "./node_modules/webpack-cli/bin/cli.js --mode development --config webpack.dev.config.js --watch",
|
||||
"test": "echo \"Warning: no test specified\" && exit 0"
|
||||
|
||||
256
js/service/ActivityService.js
Normal file
@@ -0,0 +1,256 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
import app from '../app/App.js';
|
||||
import CommentCollection from '../legacy/commentcollection';
|
||||
import CommentModel from '../legacy/commentmodel';
|
||||
|
||||
const DECK_ACTIVITY_TYPE_BOARD = 'deck_board';
|
||||
const DECK_ACTIVITY_TYPE_CARD = 'deck_card';
|
||||
|
||||
/* global OC oc_requesttoken */
|
||||
class ActivityService {
|
||||
|
||||
static get RESULT_PER_PAGE() { return 50; }
|
||||
|
||||
constructor ($rootScope, $filter, $http, $q) {
|
||||
this.running = false;
|
||||
this.runningNewer = false;
|
||||
this.$filter = $filter;
|
||||
this.$http = $http;
|
||||
this.$q = $q;
|
||||
this.$rootScope = $rootScope;
|
||||
this.data = {};
|
||||
this.data[DECK_ACTIVITY_TYPE_BOARD] = {};
|
||||
this.data[DECK_ACTIVITY_TYPE_CARD] = {};
|
||||
this.toEnhanceWithComments = [];
|
||||
this.commentCollection = new CommentCollection();
|
||||
this.commentCollection._limit = ActivityService.RESULT_PER_PAGE;
|
||||
this.commentCollection.on('request', function() {
|
||||
}, this);
|
||||
this.commentCollection.on('sync', function(a) {
|
||||
for (let index in this.toEnhanceWithComments) {
|
||||
if (this.toEnhanceWithComments.hasOwnProperty(index)) {
|
||||
let item = this.toEnhanceWithComments[index];
|
||||
let commentId = Array.isArray(item.subject_rich[1].comment) ? item.subject_rich[1].comment.id : item.subject_rich[1].comment;
|
||||
item.commentModel = this.commentCollection.get(commentId);
|
||||
if (typeof item.commentModel !== 'undefined') {
|
||||
this.toEnhanceWithComments = this.toEnhanceWithComments.filter((entry) => entry.activity_id !== item.activity_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
var firstUnread = this.commentCollection.findWhere({isUnread: true});
|
||||
if (typeof firstUnread !== 'undefined') {
|
||||
this.commentCollection.updateReadMarker();
|
||||
}
|
||||
this.notify();
|
||||
}, this);
|
||||
this.commentCollection.on('add', function(model, collection, options) {
|
||||
// we need to update the model, because it consists of client data
|
||||
// only, but the server might add meta data, e.g. about mentions
|
||||
model.fetch();
|
||||
}, this);
|
||||
this.since = {
|
||||
deck_card: {
|
||||
|
||||
},
|
||||
deck_board: {
|
||||
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* We need a event here to properly update scope once the external data from
|
||||
* the comments backbone js code has changed
|
||||
*/
|
||||
subscribe(scope, callback) {
|
||||
let handler = this.$rootScope.$on('notify-comment-update', callback);
|
||||
scope.$on('$destroy', handler);
|
||||
}
|
||||
|
||||
notify() {
|
||||
this.$rootScope.$emit('notify-comment-update');
|
||||
}
|
||||
|
||||
static getUrl(type, id, since) {
|
||||
if (type === DECK_ACTIVITY_TYPE_CARD) {
|
||||
return OC.linkToOCS('apps/activity/api/v2/activity', 2) + 'deck?format=json&object_type=deck_card&object_id=' + id + '&limit=' + this.RESULT_PER_PAGE + '&since=' + since;
|
||||
}
|
||||
if (type === DECK_ACTIVITY_TYPE_BOARD) {
|
||||
return OC.linkToOCS('apps/activity/api/v2/activity', 2) + 'deck?format=json&limit=' + this.RESULT_PER_PAGE + '&since=' + since;
|
||||
}
|
||||
}
|
||||
|
||||
fetchCardActivities(type, id, since) {
|
||||
this.running = true;
|
||||
|
||||
this.checkData(type, id);
|
||||
const self = this;
|
||||
return this.$http.get(ActivityService.getUrl(type, id, since)).then(function (response) {
|
||||
const objects = response.data.ocs.data;
|
||||
|
||||
for (let index in objects) {
|
||||
if (objects.hasOwnProperty(index)) {
|
||||
let item = objects[index];
|
||||
self.addItem(type, id, item);
|
||||
if (item.activity_id > self.since[type][id].latest) {
|
||||
self.since[type][id].latest = item.activity_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
self.data[type][id].sort(function(a, b) {
|
||||
return b.activity_id - a.activity_id;
|
||||
});
|
||||
self.since[type][id].oldest = response.headers('X-Activity-Last-Given');
|
||||
self.running = false;
|
||||
return response;
|
||||
}, function (error) {
|
||||
if (error.status === 304 || error.status === 404) {
|
||||
self.since[type][id].finished = true;
|
||||
}
|
||||
self.running = false;
|
||||
});
|
||||
}
|
||||
|
||||
fetchMoreActivities(type, id, success) {
|
||||
const self = this;
|
||||
this.checkData(type, id);
|
||||
if (this.running === true) {
|
||||
return this.runningPromise;
|
||||
}
|
||||
if (!this.since[type][id].finished) {
|
||||
this.runningPromise = this.fetchCardActivities(type, id, this.since[type][id].oldest);
|
||||
this.runningPromise.then(function() {
|
||||
if (type === 'deck_card') {
|
||||
self.commentCollection.fetchNext();
|
||||
}
|
||||
});
|
||||
return this.runningPromise;
|
||||
}
|
||||
return Promise.reject();
|
||||
}
|
||||
checkData(type, id) {
|
||||
if (!Array.isArray(this.data[type][id])) {
|
||||
this.data[type][id] = [];
|
||||
}
|
||||
if (typeof this.since[type][id] === 'undefined') {
|
||||
this.since[type][id] = {
|
||||
latest: -1,
|
||||
oldestCatchedUp: false,
|
||||
oldest: '0',
|
||||
finished: false,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
addItem(type, id, item) {
|
||||
const self = this;
|
||||
const existingEntry = this.data[type][id].findIndex((entry) => { return entry.activity_id === item.activity_id; });
|
||||
if (existingEntry !== -1) {
|
||||
return;
|
||||
}
|
||||
/** check if the fetched item from all deck activities is actually related */
|
||||
const isUnrelatedBoard = (item.object_type === DECK_ACTIVITY_TYPE_BOARD && item.object_id !== id);
|
||||
const isUnrelatedCard = (item.object_type === DECK_ACTIVITY_TYPE_CARD && (
|
||||
(item.subject_rich[1].board && item.subject_rich[1].board.id !== id) || (typeof item.subject_rich[1].board === 'undefined'))
|
||||
);
|
||||
if (type === DECK_ACTIVITY_TYPE_BOARD && (isUnrelatedBoard || isUnrelatedCard)) {
|
||||
return;
|
||||
}
|
||||
item.timestamp = new Date(item.datetime).getTime();
|
||||
item.type = 'activity';
|
||||
if (item.subject_rich[1].comment) {
|
||||
item.type = 'comment';
|
||||
item.commentModel = this.commentCollection.get(item.subject_rich[1].comment);
|
||||
if (typeof item.commentModel === 'undefined') {
|
||||
this.toEnhanceWithComments.push(item);
|
||||
}
|
||||
}
|
||||
|
||||
this.data[type][id].push(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch newer activities starting from the latest ones that are in cache
|
||||
*
|
||||
* @param type
|
||||
* @param id
|
||||
*/
|
||||
fetchNewerActivities(type, id) {
|
||||
if (this.since[type][id].latest === 0) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
let self = this;
|
||||
return this.fetchNewer(type, id).then(function() {
|
||||
return self.fetchNewerActivities(type, id);
|
||||
});
|
||||
}
|
||||
|
||||
fetchNewer(type, id) {
|
||||
const deferred = this.$q.defer();
|
||||
this.running = true;
|
||||
this.runningNewer = true;
|
||||
const self = this;
|
||||
this.$http.get(ActivityService.getUrl(type, id, this.since[type][id].latest) + '&sort=asc').then(function (response) {
|
||||
let objects = response.data.ocs.data;
|
||||
|
||||
let data = [];
|
||||
for (let index in objects) {
|
||||
if (objects.hasOwnProperty(index)) {
|
||||
let item = objects[index];
|
||||
self.addItem(type, id, item);
|
||||
}
|
||||
}
|
||||
self.data[type][id].sort(function(a, b) {
|
||||
return b.activity_id - a.activity_id;
|
||||
});
|
||||
self.since[type][id].latest = response.headers('X-Activity-Last-Given');
|
||||
self.data[type][id] = data.concat(self.data[type][id]);
|
||||
self.running = false;
|
||||
self.runningNewer = false;
|
||||
deferred.resolve(objects);
|
||||
}, function (error) {
|
||||
self.runningNewer = false;
|
||||
self.running = false;
|
||||
});
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
getData(type, id) {
|
||||
if (!Array.isArray(this.data[type][id])) {
|
||||
return [];
|
||||
}
|
||||
return this.data[type][id];
|
||||
}
|
||||
|
||||
loadComments(id) {
|
||||
this.commentCollection.reset();
|
||||
this.commentCollection.setObjectId(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
app.service('ActivityService', ActivityService);
|
||||
|
||||
export default ActivityService;
|
||||
export {DECK_ACTIVITY_TYPE_BOARD, DECK_ACTIVITY_TYPE_CARD};
|
||||
@@ -4,35 +4,48 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
|
||||
/** global: oc_defaults */
|
||||
app.factory('ApiService', function ($http, $q) {
|
||||
var ApiService = function (http, endpoint) {
|
||||
// Consider renaming endpoint to resource
|
||||
this.endpoint = endpoint;
|
||||
this.baseUrl = OC.generateUrl('/apps/deck/' + endpoint);
|
||||
this.baseUrl = this.generateUrl(this.endpoint);
|
||||
this.http = http;
|
||||
this.q = $q;
|
||||
this.data = {};
|
||||
this.deleted = {};
|
||||
this.id = null;
|
||||
this.sorted = [];
|
||||
};
|
||||
|
||||
ApiService.prototype.generateUrl = function(path) {
|
||||
return OC.generateUrl('/apps/deck/' + path);
|
||||
};
|
||||
|
||||
ApiService.prototype.tryAllThenDeleted = function(id) {
|
||||
let object = this.data[id];
|
||||
if (object === undefined) {
|
||||
object = this.deleted[id];
|
||||
}
|
||||
return object;
|
||||
};
|
||||
|
||||
ApiService.prototype.fetchAll = function () {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
@@ -48,6 +61,31 @@ app.factory('ApiService', function ($http, $q) {
|
||||
return deferred.promise;
|
||||
};
|
||||
|
||||
ApiService.prototype.fetchDeleted = function (scopeId) {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
self.deleted = {};
|
||||
$http.get(this.generateUrl(scopeId + '/' + this.endpoint + '/deleted')).then(function (response) {
|
||||
var objects = response.data;
|
||||
objects.forEach(function (obj) {
|
||||
if(self.deleted[obj.id] !== undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.deleted[obj.id] = obj;
|
||||
|
||||
if(self.afterFetch !== undefined) {
|
||||
self.afterFetch(obj);
|
||||
}
|
||||
});
|
||||
deferred.resolve(objects);
|
||||
}, function (error) {
|
||||
deferred.reject('Fetching ' + self.endpoint + ' failed');
|
||||
});
|
||||
return deferred.promise;
|
||||
};
|
||||
|
||||
|
||||
ApiService.prototype.fetchOne = function (id) {
|
||||
|
||||
this.id = id;
|
||||
@@ -81,7 +119,7 @@ app.factory('ApiService', function ($http, $q) {
|
||||
self.add(response.data);
|
||||
deferred.resolve(response.data);
|
||||
}, function (error) {
|
||||
deferred.reject('Fetching' + self.endpoint + ' failed');
|
||||
deferred.reject(error.data.message);
|
||||
});
|
||||
return deferred.promise;
|
||||
};
|
||||
@@ -93,7 +131,7 @@ app.factory('ApiService', function ($http, $q) {
|
||||
self.add(response.data);
|
||||
deferred.resolve(response.data);
|
||||
}, function (error) {
|
||||
deferred.reject('Updating ' + self.endpoint + ' failed');
|
||||
deferred.reject(error.data.message);
|
||||
});
|
||||
return deferred.promise;
|
||||
|
||||
@@ -104,21 +142,41 @@ app.factory('ApiService', function ($http, $q) {
|
||||
var self = this;
|
||||
|
||||
$http.delete(this.baseUrl + '/' + id).then(function (response) {
|
||||
self.remove(id);
|
||||
self.deleted[id] = self.data[id];
|
||||
delete self.data[id];
|
||||
|
||||
let deletedAt = response.data.deletedAt;
|
||||
if (deletedAt !== undefined) {
|
||||
self.deleted[id].deletedAt = deletedAt;
|
||||
}
|
||||
|
||||
deferred.resolve(response.data);
|
||||
|
||||
}, function (error) {
|
||||
deferred.reject('Deleting ' + self.endpoint + ' failed');
|
||||
});
|
||||
return deferred.promise;
|
||||
|
||||
};
|
||||
|
||||
ApiService.prototype.undoDelete = function(entity) {
|
||||
var self = this;
|
||||
entity.deletedAt = 0;
|
||||
|
||||
var promise = this.update(entity);
|
||||
|
||||
promise.then(() => {
|
||||
self.data[entity.id] = entity;
|
||||
delete this.deleted[entity.id];
|
||||
});
|
||||
|
||||
return promise;
|
||||
};
|
||||
|
||||
// methods for managing data
|
||||
ApiService.prototype.clear = function () {
|
||||
this.data = {};
|
||||
};
|
||||
|
||||
ApiService.prototype.add = function (entity) {
|
||||
var element = this.data[entity.id];
|
||||
if (element === undefined) {
|
||||
@@ -132,11 +190,7 @@ app.factory('ApiService', function ($http, $q) {
|
||||
element.status = {};
|
||||
}
|
||||
};
|
||||
ApiService.prototype.remove = function (id) {
|
||||
if (this.data[id] !== undefined) {
|
||||
delete this.data[id];
|
||||
}
|
||||
};
|
||||
|
||||
ApiService.prototype.addAll = function (entities) {
|
||||
var self = this;
|
||||
angular.forEach(entities, function (entity) {
|
||||
|
||||
@@ -4,23 +4,23 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
/* global app OC */
|
||||
/* global app OC angular */
|
||||
app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
var BoardService = function ($http, ep, $q) {
|
||||
ApiService.call(this, $http, ep, $q);
|
||||
@@ -59,7 +59,7 @@ app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
var searchData = {
|
||||
format: 'json',
|
||||
perPage: 4,
|
||||
itemType: [0, 1]
|
||||
itemType: [0, 1, 7]
|
||||
};
|
||||
if (search !== "") {
|
||||
searchData.search = search;
|
||||
@@ -79,6 +79,7 @@ app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
|
||||
var users = response.ocs.data.exact.users.concat(response.ocs.data.users.slice(0, 4));
|
||||
var groups = response.ocs.data.exact.groups.concat(response.ocs.data.groups.slice(0, 4));
|
||||
var circles = response.ocs.data.exact.groups.concat(response.ocs.data.circles.slice(0, 4));
|
||||
|
||||
// filter out everyone who is already in the share list
|
||||
angular.forEach(users, function (item) {
|
||||
@@ -105,6 +106,18 @@ app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
self.sharees.push(acl);
|
||||
}
|
||||
});
|
||||
angular.forEach(circles, function (item) {
|
||||
var acl = self.generateAcl(OC.Share.SHARE_TYPE_CIRCLE, item);
|
||||
var exists = false;
|
||||
angular.forEach(self.getCurrent().acl, function (acl) {
|
||||
if (acl.participant.primaryKey === item.value.shareWith) {
|
||||
exists = true;
|
||||
}
|
||||
});
|
||||
if (!exists) {
|
||||
self.sharees.push(acl);
|
||||
}
|
||||
});
|
||||
|
||||
deferred.resolve(self.sharees);
|
||||
}, function () {
|
||||
@@ -125,8 +138,8 @@ app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
displayname: ocsItem.label
|
||||
},
|
||||
permissionEdit: true,
|
||||
permissionManage: true,
|
||||
permissionShare: true,
|
||||
permissionManage: false,
|
||||
permissionShare: false,
|
||||
type: type
|
||||
};
|
||||
};
|
||||
@@ -159,7 +172,8 @@ app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
$http.delete(this.baseUrl + '/' + acl.boardId + '/acl/' + acl.id).then(function (response) {
|
||||
delete board.acl[response.data.id];
|
||||
var index = board.acl.findIndex((item) => item.id === response.data.id);
|
||||
delete board.acl[index];
|
||||
if (response.data.type === OC.Share.SHARE_TYPE_USER) {
|
||||
self._updateUsers();
|
||||
} else {
|
||||
@@ -179,7 +193,8 @@ app.factory('BoardService', function (ApiService, $http, $q) {
|
||||
var self = this;
|
||||
var _acl = acl;
|
||||
$http.put(this.baseUrl + '/' + acl.boardId + '/acl', _acl).then(function (response) {
|
||||
board.acl[_acl.id] = response.data;
|
||||
var index = board.acl.findIndex((item) => item.id === _acl.id);
|
||||
board.acl[index] = response.data;
|
||||
if (response.data.type === OC.Share.SHARE_TYPE_USER) {
|
||||
self._updateUsers();
|
||||
} else {
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
|
||||
@@ -106,11 +106,11 @@ app.factory('CardService', function (ApiService, $http, $q) {
|
||||
CardService.prototype.assignUser = function (card, user) {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
if (self.getCurrent().assignedUsers === null) {
|
||||
self.getCurrent().assignedUsers = [];
|
||||
if (self.get(card.id).assignedUsers === null) {
|
||||
self.get(card.id).assignedUsers = [];
|
||||
}
|
||||
$http.post(this.baseUrl + '/' + card.id + '/assign', {'userId': user}).then(function (response) {
|
||||
self.getCurrent().assignedUsers.push(response.data);
|
||||
self.get(card.id).assignedUsers.push(response.data);
|
||||
deferred.resolve(response.data);
|
||||
}, function (error) {
|
||||
deferred.reject('Error while update ' + self.endpoint);
|
||||
@@ -123,7 +123,7 @@ app.factory('CardService', function (ApiService, $http, $q) {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
$http.delete(this.baseUrl + '/' + card.id + '/assign/' + user, {}).then(function (response) {
|
||||
self.getCurrent().assignedUsers = self.getCurrent().assignedUsers.filter(function (obj) {
|
||||
self.get(card.id).assignedUsers = self.get(card.id).assignedUsers.filter(function (obj) {
|
||||
return obj.participant.uid !== user;
|
||||
});
|
||||
deferred.resolve(response.data);
|
||||
@@ -174,4 +174,4 @@ app.factory('CardService', function (ApiService, $http, $q) {
|
||||
|
||||
var service = new CardService($http, 'cards', $q);
|
||||
return service;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
@@ -25,18 +25,29 @@ import app from '../app/App.js';
|
||||
/* global OC oc_requesttoken */
|
||||
export default class FileService {
|
||||
|
||||
constructor ($http, FileUploader, CardService) {
|
||||
constructor (FileUploader, CardService, $rootScope, $filter) {
|
||||
this.$filter = $filter;
|
||||
this.uploader = new FileUploader();
|
||||
this.cardservice = CardService;
|
||||
this.uploader.onAfterAddingFile = this.onAfterAddingFile.bind(this);
|
||||
this.uploader.onSuccessItem = this.onSuccessItem.bind(this);
|
||||
this.uploader.onErrorItem = this.onErrorItem.bind(this);
|
||||
this.uploader.onCancelItem = this.onCancelItem.bind(this);
|
||||
|
||||
this.maxUploadSize = $rootScope.config.maxUploadSize;
|
||||
this.progress = [];
|
||||
this.status = null;
|
||||
}
|
||||
|
||||
reset () {
|
||||
this.status = null;
|
||||
}
|
||||
|
||||
runUpload (fileItem, attachmentId) {
|
||||
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment');
|
||||
this.status = null;
|
||||
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment?type=deck_file');
|
||||
if (typeof attachmentId !== 'undefined') {
|
||||
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment/' + attachmentId);
|
||||
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment/' + attachmentId + '?type=deck_file');
|
||||
} else {
|
||||
fileItem.formData = [
|
||||
{
|
||||
@@ -51,8 +62,17 @@ export default class FileService {
|
||||
}
|
||||
|
||||
onAfterAddingFile (fileItem) {
|
||||
if (this.maxUploadSize > 0 && fileItem.file.size > this.maxUploadSize) {
|
||||
this.status = {
|
||||
error: t('deck', `Failed to upload {name}`, {name: fileItem.file.name}),
|
||||
message: t('deck', 'Maximum file size of {size} exceeded', {size: this.$filter('bytes')(this.maxUploadSize)})
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
// Fetch card details before trying to upload so we can detect filename collisions properly
|
||||
let self = this;
|
||||
this.progress.push(fileItem);
|
||||
this.cardservice.fetchOne(fileItem.cardId).then(function (data) {
|
||||
let attachments = self.cardservice.get(fileItem.cardId).attachments;
|
||||
let existingFile = attachments.find((attachment) => {
|
||||
@@ -60,8 +80,8 @@ export default class FileService {
|
||||
});
|
||||
if (typeof existingFile !== 'undefined') {
|
||||
OC.dialogs.confirm(
|
||||
`A file with the name ${fileItem.file.name} already exists. Do you want to overwrite it?`,
|
||||
'File already exists',
|
||||
t('deck', `A file with the name ${fileItem.file.name} already exists. Do you want to overwrite it?`),
|
||||
t('deck', 'File already exists'),
|
||||
function (result) {
|
||||
if (result) {
|
||||
self.runUpload(fileItem, existingFile.id);
|
||||
@@ -81,7 +101,7 @@ export default class FileService {
|
||||
self.runUpload(fileItem);
|
||||
}
|
||||
}, function (error) {
|
||||
|
||||
this.progress = this.progress.filter((item) => (fileItem.file.name !== item.file.name));
|
||||
});
|
||||
|
||||
}
|
||||
@@ -93,8 +113,25 @@ export default class FileService {
|
||||
attachments = attachments.splice(index, 1);
|
||||
}
|
||||
this.cardservice.get(item.cardId).attachments.push(response);
|
||||
this.progress = this.progress.filter((fileItem) => (fileItem.file.name !== item.file.name));
|
||||
}
|
||||
|
||||
onErrorItem (item, response) {
|
||||
this.progress = this.progress.filter((fileItem) => (fileItem.file.name !== item.file.name));
|
||||
this.status = {
|
||||
error: t('deck', `Failed to upload:`) + ' ' + item.file.name,
|
||||
message: response.message
|
||||
};
|
||||
}
|
||||
|
||||
onCancelItem (item) {
|
||||
this.progress = this.progress.filter((fileItem) => (fileItem.file.name !== item.file.name));
|
||||
}
|
||||
|
||||
getProgressItemsForCard (cardId) {
|
||||
return this.progress.filter((fileItem) => (fileItem.cardId === cardId));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
app.service('FileService', FileService);
|
||||
app.service('FileService', FileService);
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
import app from '../app/App.js';
|
||||
|
||||
@@ -27,6 +27,11 @@ app.factory('StackService', function (ApiService, CardService, $http, $q) {
|
||||
ApiService.call(this, $http, ep, $q);
|
||||
};
|
||||
StackService.prototype = angular.copy(ApiService.prototype);
|
||||
|
||||
StackService.prototype.afterFetch = function(stack) {
|
||||
CardService.addAll(stack.cards);
|
||||
};
|
||||
|
||||
StackService.prototype.fetchAll = function (boardId) {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
@@ -129,27 +134,6 @@ app.factory('StackService', function (ApiService, CardService, $http, $q) {
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: Should not show popup but proper undo mechanism
|
||||
StackService.prototype.delete = function (id) {
|
||||
var deferred = $q.defer();
|
||||
var self = this;
|
||||
|
||||
OC.dialogs.confirm(t('deck', 'Are you sure you want to delete the stack with all of its data?'), t('deck', 'Delete'), function(state) {
|
||||
if (!state) {
|
||||
return;
|
||||
}
|
||||
$http.delete(self.baseUrl + '/' + id).then(function (response) {
|
||||
self.remove(id);
|
||||
deferred.resolve(response.data);
|
||||
|
||||
}, function (error) {
|
||||
deferred.reject('Deleting ' + self.endpoint + ' failed');
|
||||
});
|
||||
});
|
||||
return deferred.promise;
|
||||
};
|
||||
|
||||
var service = new StackService($http, 'stacks', $q);
|
||||
return service;
|
||||
});
|
||||
|
||||
|
||||
118
js/views/BoardSelector.vue
Normal file
@@ -0,0 +1,118 @@
|
||||
<!--
|
||||
- @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
|
||||
-
|
||||
- @author Julius Härtl <jus@bitgrid.net>
|
||||
-
|
||||
- @license GNU AGPL version 3 or any later version
|
||||
-
|
||||
- This program is free software: you can redistribute it and/or modify
|
||||
- it under the terms of the GNU Affero General Public License as
|
||||
- published by the Free Software Foundation, either version 3 of the
|
||||
- License, or (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU Affero General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU Affero General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-
|
||||
-->
|
||||
|
||||
<template>
|
||||
<Modal @close="close">
|
||||
<div id="modal-inner" :class="{ 'icon-loading': loading }">
|
||||
<h1>{{ t('deck', 'Select the board to link to a project') }}</h1>
|
||||
<ul v-if="!loading">
|
||||
<li v-for="board in boards" v-if="!currentBoard || ''+board.id !== ''+currentBoard" @click="selectedBoard=board.id" :class="{'selected': (selectedBoard === board.id) }">
|
||||
<span class="board-bullet" :style="{ 'backgroundColor': '#' + board.color }"></span>
|
||||
<span>{{ board.title }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
<button v-if="!loading" @click="select" class="primary">{{ t('deck', 'Select board') }}</button>
|
||||
</div>
|
||||
</Modal>
|
||||
</template>
|
||||
<style scoped>
|
||||
#modal-inner {
|
||||
width: 90vw;
|
||||
max-width: 400px;
|
||||
padding: 20px;
|
||||
}
|
||||
ul {
|
||||
min-height: 100px;
|
||||
}
|
||||
li {
|
||||
padding: 6px;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
li:hover, li:focus {
|
||||
background-color: var(--color-background-dark);
|
||||
}
|
||||
li.selected {
|
||||
border: 1px solid var(--color-primary);
|
||||
}
|
||||
.board-bullet {
|
||||
display: inline-block;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
}
|
||||
li > span,
|
||||
.avatar {
|
||||
vertical-align: middle;
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
<script>
|
||||
/* global OC */
|
||||
import { Modal } from 'nextcloud-vue/dist/Components/Modal'
|
||||
import { Avatar } from 'nextcloud-vue/dist/Components/Avatar'
|
||||
import axios from 'nextcloud-axios'
|
||||
|
||||
export default {
|
||||
name: 'CollaborationView',
|
||||
components: {
|
||||
Modal, Avatar
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
boards: [],
|
||||
selectedBoard: null,
|
||||
loading: true,
|
||||
currentBoard: null,
|
||||
}
|
||||
},
|
||||
beforeMount() {
|
||||
this.fetchBoards();
|
||||
if (typeof angular !== 'undefined' && angular.element('#board')) {
|
||||
try {
|
||||
this.currentBoard = angular.element('#board').scope().boardservice.id || null;
|
||||
} catch (e) {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchBoards() {
|
||||
axios.get(OC.generateUrl('/apps/deck/boards')).then((response) => {
|
||||
this.boards = response.data
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
close() {
|
||||
this.$root.$emit('close');
|
||||
},
|
||||
select() {
|
||||
this.$root.$emit('select', this.selectedBoard)
|
||||
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
||||
},
|
||||
|
||||
}
|
||||
</script>
|
||||
56
js/views/CollaborationView.vue
Normal file
@@ -0,0 +1,56 @@
|
||||
<!--
|
||||
- @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
|
||||
-
|
||||
- @author Julius Härtl <jus@bitgrid.net>
|
||||
-
|
||||
- @license GNU AGPL version 3 or any later version
|
||||
-
|
||||
- This program is free software: you can redistribute it and/or modify
|
||||
- it under the terms of the GNU Affero General Public License as
|
||||
- published by the Free Software Foundation, either version 3 of the
|
||||
- License, or (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU Affero General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU Affero General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<collection-list v-if="boardId" type="deck" :id="boardId" :name="boardTitle"></collection-list>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { CollectionList } from 'nextcloud-vue-collections';
|
||||
import Vue from 'vue';
|
||||
import PopoverMenu from 'nextcloud-vue/dist/Components/PopoverMenu'
|
||||
|
||||
Vue.component('popover-menu', PopoverMenu);
|
||||
|
||||
export default {
|
||||
name: 'CollaborationView',
|
||||
computed: {
|
||||
boardId() {
|
||||
if (this.$root.model && this.$root.model.id) {
|
||||
return '' + this.$root.model.id;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
boardTitle() {
|
||||
if (this.$root.model && this.$root.model.title) {
|
||||
return '' + this.$root.model.title;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
},
|
||||
components: {
|
||||
CollectionList: CollectionList
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,68 +1,76 @@
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||
|
||||
require('babel-polyfill');
|
||||
const { VueLoaderPlugin } = require('vue-loader');
|
||||
|
||||
module.exports = {
|
||||
node: {
|
||||
fs: 'empty',
|
||||
},
|
||||
entry: {
|
||||
deck: ['babel-polyfill', './init.js'],
|
||||
},
|
||||
output: {
|
||||
filename: '[name].js',
|
||||
path: __dirname + '/build'
|
||||
},
|
||||
resolve: {
|
||||
modules: [path.resolve(__dirname), 'node_modules'],
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$/,
|
||||
exclude: /node_modules/,
|
||||
loader: 'babel-loader',
|
||||
query: {
|
||||
presets: ['env'],
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
'css-loader'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
optimization: {
|
||||
splitChunks: {
|
||||
cacheGroups: {
|
||||
/* separate vendor chunk for node_modules and legacy scripts */
|
||||
commons: {
|
||||
test: /[\\/]node_modules[\\/]/,
|
||||
name: 'vendor',
|
||||
chunks: 'all'
|
||||
},
|
||||
legacy: {
|
||||
test: /[\\/]legacy[\\/]/,
|
||||
name: 'vendor',
|
||||
chunks: 'all'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
/* use external jQuery from server */
|
||||
externals: {
|
||||
'jquery': 'jQuery'
|
||||
},
|
||||
plugins: [
|
||||
new MiniCssExtractPlugin('[name].css'),
|
||||
new webpack.ProvidePlugin({
|
||||
$: 'jquery',
|
||||
jQuery: 'jquery'
|
||||
})
|
||||
]
|
||||
node: {
|
||||
fs: 'empty',
|
||||
},
|
||||
entry: {
|
||||
deck: ['./init.js'],
|
||||
collections: ['./init-collections.js']
|
||||
},
|
||||
output: {
|
||||
filename: '[name].js',
|
||||
path: __dirname + '/build'
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.css$/,
|
||||
use: ['vue-style-loader', 'style-loader', 'css-loader']
|
||||
},
|
||||
{
|
||||
test: /\.vue$/,
|
||||
loader: 'vue-loader'
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
exclude: /node_modules/,
|
||||
loader: 'babel-loader',
|
||||
query: {
|
||||
presets: ['@babel/preset-env'],
|
||||
plugins: ['@babel/plugin-syntax-dynamic-import']
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.scss$/,
|
||||
use: [
|
||||
'vue-style-loader',
|
||||
'css-loader',
|
||||
'sass-loader'
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.(png|jpg|gif|svg)$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
name: '[name].[ext]?[hash]'
|
||||
}
|
||||
},
|
||||
]
|
||||
},
|
||||
/* use external jQuery from server */
|
||||
externals: {
|
||||
'jquery': 'jQuery'
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
vue$: 'vue/dist/vue.esm.js'
|
||||
},
|
||||
extensions: ['*', '.js', '.vue', '.json'],
|
||||
modules: [
|
||||
path.resolve(__dirname),
|
||||
path.join(__dirname, 'node_modules'),
|
||||
'node_modules'
|
||||
]
|
||||
},
|
||||
plugins: [
|
||||
new VueLoaderPlugin(),
|
||||
new webpack.ProvidePlugin({
|
||||
$: 'jquery',
|
||||
jQuery: 'jquery'
|
||||
})
|
||||
]
|
||||
};
|
||||
|
||||
@@ -2,5 +2,6 @@ const merge = require('webpack-merge');
|
||||
const baseConfig = require('./webpack.config.js');
|
||||
|
||||
module.exports = merge(baseConfig, {
|
||||
mode: 'development'
|
||||
mode: 'development',
|
||||
devtool: 'source-map',
|
||||
});
|
||||
|
||||
@@ -15,6 +15,7 @@ exclude = [
|
||||
"js/Gruntfile.js",
|
||||
"js/package.json",
|
||||
"js/package-lock.json",
|
||||
"docs/",
|
||||
"tests",
|
||||
".codecov.yml",
|
||||
"composer.json",
|
||||
@@ -28,6 +29,7 @@ exclude = [
|
||||
"issue_template.md",
|
||||
"krankerl.toml",
|
||||
"Makefile",
|
||||
"mkdocs.yml",
|
||||
"run-eslint.sh"
|
||||
]
|
||||
|
||||
|
||||
30
l10n/ast.js
@@ -1,30 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Delete" : "Desaniciar",
|
||||
"Hours" : "Hores",
|
||||
"Minutes" : "Minutos",
|
||||
"Finished" : "Finó",
|
||||
"Action needed" : "Precísase aición",
|
||||
"Later" : "Más sero",
|
||||
"Deck" : "Deck",
|
||||
"Submit" : "Unviar",
|
||||
"Show archived cards" : "Amosar tarxetes archivaes",
|
||||
"Close" : "Zarrar",
|
||||
"Tags" : "Etiquetes",
|
||||
"Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir",
|
||||
"No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.",
|
||||
"Loading" : "Cargando",
|
||||
"Share" : "Compartir",
|
||||
"Edit" : "Editar",
|
||||
"Manage" : "Xestionar",
|
||||
"Discard share" : "Escartar compartición",
|
||||
"Title" : "Títulu",
|
||||
"Members" : "Miembros",
|
||||
"More actions" : "Más aiciones",
|
||||
"by" : "por",
|
||||
"Click to set" : "Primi p'afitar",
|
||||
"Description" : "Descripción",
|
||||
"Saved" : "Guardóse"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -1,28 +0,0 @@
|
||||
{ "translations": {
|
||||
"Delete" : "Desaniciar",
|
||||
"Hours" : "Hores",
|
||||
"Minutes" : "Minutos",
|
||||
"Finished" : "Finó",
|
||||
"Action needed" : "Precísase aición",
|
||||
"Later" : "Más sero",
|
||||
"Deck" : "Deck",
|
||||
"Submit" : "Unviar",
|
||||
"Show archived cards" : "Amosar tarxetes archivaes",
|
||||
"Close" : "Zarrar",
|
||||
"Tags" : "Etiquetes",
|
||||
"Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir",
|
||||
"No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.",
|
||||
"Loading" : "Cargando",
|
||||
"Share" : "Compartir",
|
||||
"Edit" : "Editar",
|
||||
"Manage" : "Xestionar",
|
||||
"Discard share" : "Escartar compartición",
|
||||
"Title" : "Títulu",
|
||||
"Members" : "Miembros",
|
||||
"More actions" : "Más aiciones",
|
||||
"by" : "por",
|
||||
"Click to set" : "Primi p'afitar",
|
||||
"Description" : "Descripción",
|
||||
"Saved" : "Guardóse"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
190
l10n/ca.js
@@ -1,54 +1,202 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Delete" : "Esborra",
|
||||
"Remove user from card" : "Esborra usuari de la targeta",
|
||||
"Please provide a content for your comment." : "Si us plau, proporcioneu un contingut per al vostre comentari.",
|
||||
"Posting the comment failed." : "No s'ha pogut publicar el comentari.",
|
||||
"The comment has been deleted" : "S'ha suprimit el comentari",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "La pila associada també se suprimeix, també es restaurarà.",
|
||||
"Restore associated stack" : "Restaura la pila associada",
|
||||
"Remove user from card" : "Suprimeix l'usuari de la targeta",
|
||||
"Hours" : "Hores",
|
||||
"Minutes" : "Minuts",
|
||||
"Link to a board" : "Enllaça a un tauler",
|
||||
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}",
|
||||
"File already exists" : "El fitxer ja existeix",
|
||||
"You have created a new board {board}" : "Heu creat el nou tauler {board}",
|
||||
"{user} has created a new board {board}" : "{user} ha creat el nou tauler {board}",
|
||||
"You have deleted the board {board}" : "Heu suprimit el tauler {board}",
|
||||
"{user} has deleted the board {board}" : "{user} ha suprimit el tauler {board}",
|
||||
"You have restored the board {board}" : "Heu restaurat el tauler {board}",
|
||||
"{user} has restored the board {board}" : "{user} ha restaurat el tauler {board}",
|
||||
"You have shared the board {board} with {acl}" : "Heu compartit el tauler {board} amb {acl}",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} ha compartit el tauler {board} amb {sharee}",
|
||||
"You have removed {acl} from the board {board}" : "Heu suprimit {acl} del tauler {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} ha suprimit {acl} del tauler {board}",
|
||||
"You have renamed the board {before} to {board}" : "Heu reanomenat el tauler {before} a {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} ha reanomenat el tauler {before} a {board}",
|
||||
"You have archived the board {board}" : "Heu arxivat el tauler {board}",
|
||||
"{user} has archived the board {before}" : "{user} ha arxivat el tauler {before}",
|
||||
"You have unarchived the board {board}" : "Heu desarxivat el tauler {board}",
|
||||
"{user} has unarchived the board {before}" : "{user} ha desarxivat el tauler {before}",
|
||||
"You have created a new stack {stack} on board {board}" : "Heu creat una nova pila {stack} al tauler {board}",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} ha creat una nova pila {stack} al tauler {board}",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Heu reanomenat la pila {before} a {stack} al tauler {board}",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} ha reanomenat la pila {before} a {stack} al tauler {board}",
|
||||
"You have deleted stack {stack} on board {board}" : "Heu suprimit la pila {stack} al tauler {board}",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} ha suprimit la pila {stack} al tauler {board}",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Heu creat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} ha creat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Heu suprimit la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Heu arxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} ha arxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Heu desarxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} ha arxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have removed the due date of card {card}" : "Heu suprimit la data de venciment de la targeta {targeta}",
|
||||
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de venciment de la targeta {targeta}",
|
||||
"You have set the due date of card {card} to {after}" : "Heu establert la data de venciment de la targeta {card} a {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de venciment de la targeta {card} a {after}",
|
||||
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de venciment de la targeta {card} a {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de venciment de la targeta {card} a {after}",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Heu suprimit l'etiqueta {label} de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} ha suprimit l'etiqueta {label} de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Heu assignat a {assigneduser} a la targeta {card} al tauler {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} ha assignat a {assigneduser} la targeta {card} del tauler {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Heu desassignat {assigneduser} de la targeta {card} al tauler {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} ha desassignat {assigneduser} de la targeta {card} al tauler {board}",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Heu mogut la targeta {card} de la pila {stackBefore} a {stack}",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} ha mogut la targeta {card} de la pila {stackBefore} a {stack}",
|
||||
"You have added the attachment {attachment} to card {card}" : "Heu afegit l'adjunt {attachment} a la targeta {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} ha afegit l'adjunt {attachment} a la targeta {card}",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Heu actualitzat l'adjunt {attachment} a la targeta {card}",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} ha actualitzat l'adjunt {attachment} a la targeta {card}",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Heu suprimit l'adjunt {attachment} de la targeta {card}",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} ha suprimit l'adjunt {attachment} de la targeta {card}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Heu restaurat l'adjunt {attachment} a la targeta {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}",
|
||||
"You have commented on card {card}" : "Heu comentat la targeta {card}",
|
||||
"{user} has commented on card {card}" : "{user} ha comentat la targeta {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler",
|
||||
"Deck" : "Tauler",
|
||||
"Changes in the <strong>Deck app</strong>" : "Hi ha canvis a l'<strong>aplicació Tauler</strong>",
|
||||
"Personal" : "Personal",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} us ha assignat la targeta \"%s\" sobre \"%s\".",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} us ha anomenat en un comentari sobre \"%s\".",
|
||||
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
|
||||
"{user} has shared the board %s with you." : "{user} us ha compartit el tauler %s.",
|
||||
"No data was provided to create an attachment." : "No s’ha proporcionat cap dada per crear un fitxer adjunt.",
|
||||
"Finished" : "Acabat",
|
||||
"To review" : "Per revisar",
|
||||
"Action needed" : "Acció necessaria",
|
||||
"Action needed" : "Acció necessària",
|
||||
"Later" : "Més tard",
|
||||
"Deck" : "Coberta",
|
||||
"To do" : "Pendents",
|
||||
"Doing" : "En procés",
|
||||
"Done" : "Finalitzades",
|
||||
"Example Task 3" : "Tasca d'exemple 3",
|
||||
"Example Task 2" : "Tasca d'exemple 2",
|
||||
"Example Task 1" : "Tasca d'exemple 1",
|
||||
"The file was uploaded" : "S'ha carregat el fitxer",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer carregat excedeix la directiva upload_max_filesize dins de php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat excedeix la directiva MAX_FILE_SIZE que hi ha especificada al formulari d'HTML",
|
||||
"The file was only partially uploaded" : "El fitxer s'ha carregat només parcialment",
|
||||
"No file was uploaded" : "No s'ha carregat cap fitxer",
|
||||
"Missing a temporary folder" : "Falta una carpeta temporal",
|
||||
"Could not write file to disk" : "No s’ha pogut escriure el fitxer al disc",
|
||||
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Un projecte d’estil kanban i una eina de gestió personal per a Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
|
||||
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
|
||||
"Select board" : "Selecciona un tauler",
|
||||
"Add a new stack" : "Afegeix una nova pila",
|
||||
"Submit" : "Envia",
|
||||
"Show archived cards" : "Mostra les targetes arxivades",
|
||||
"Hide archived cards" : "Amaga les targetes arxivades",
|
||||
"Board details" : "Detalls de la junta",
|
||||
"All Boards" : "Totes les juntes",
|
||||
"Toggle compact mode" : "Commuta el mode compacte",
|
||||
"Show board details" : "Mostra els detalls del tauler",
|
||||
"All Boards" : "Tots els Taulers",
|
||||
"Archived boards" : "Taulers arxivats",
|
||||
"Archive" : "Arxiu",
|
||||
"Unarchive" : "Desbloquejar",
|
||||
"Enter a card title" : "Introduïu un títol de la targeta",
|
||||
"Sharing" : "Compartir",
|
||||
"Share board" : "Comparteix tauler",
|
||||
"Archived cards" : "Targetes arxivades",
|
||||
"Actions" : "Accions",
|
||||
"Drop your files here to upload it to the card" : "Deixeu anar els fitxers aquí per carregar-los a la targeta",
|
||||
"Assign card to me" : "Assigna'm la targeta",
|
||||
"Unassign card from me" : "Desassigna'm la targeta",
|
||||
"Archive card" : "Arxiva la targeta",
|
||||
"Unarchive card" : "Desarxiva targeta",
|
||||
"Delete card" : "Suprimeix targeta",
|
||||
"Enter a card title" : "Introduïu un títol a la targeta",
|
||||
"Add card" : "Afegeix una targeta",
|
||||
"Close" : "Tanca",
|
||||
"Sharing" : "S'està compartint",
|
||||
"Tags" : "Etiquetes",
|
||||
"Select users or groups to share with" : "Seleccioneu usuaris o grups per compartir",
|
||||
"Deleted items" : "Elements suprimits",
|
||||
"Timeline" : "Línia de temps",
|
||||
"Select users or groups to share with" : "Seleccioneu usuaris o grups amb els qui compartir",
|
||||
"Group" : "Grup",
|
||||
"Circle" : "Cercle",
|
||||
"No matching user or group found." : "No s'ha trobat cap usuari o grup coincident.",
|
||||
"Share" : "Comparteix",
|
||||
"Loading" : "S'està carregant",
|
||||
"Edit" : "Edita",
|
||||
"Manage" : "Gestor",
|
||||
"Share" : "Comparteix",
|
||||
"Manage" : "Gestiona",
|
||||
"Discard share" : "Descarta la compartició",
|
||||
"Sharing has been disabled for your account." : "La compartició s'ha desactivat per al vostre compte.",
|
||||
"Update tag" : "Actualitza etiqueta",
|
||||
"Edit tag" : "Edita etiqueta",
|
||||
"Delete tag" : "Suprimeix etiqueta",
|
||||
"Create" : "Crea",
|
||||
"Create a new tag" : "Crea una nova etiqueta",
|
||||
"Title" : "Title",
|
||||
"Deleted stacks" : "Piles suprimides",
|
||||
"Deleted cards" : "Targetes suprimides",
|
||||
"Status" : "Estat",
|
||||
"No archived boards to display" : "No hi ha cap tauler arxivat per mostrar",
|
||||
"No shared boards to display" : "No hi ha cap tauler compartit per mostrar",
|
||||
"Title" : "Títol",
|
||||
"Members" : "Membres",
|
||||
"More actions" : "Més accions",
|
||||
"Edit board" : "Edita el tauler",
|
||||
"Archive board" : "Arxiu",
|
||||
"Unarchive board" : "Desbloquejar",
|
||||
"Delete board" : "Eliminat",
|
||||
"Create new board" : "Crear nova",
|
||||
"New board title" : "Nou títol",
|
||||
"Archive board" : "Arxiva tauler",
|
||||
"Unarchive board" : "Desarxiva tauler",
|
||||
"Delete board" : "Suprimeix tauler",
|
||||
"Update board" : "Actualitza tauler",
|
||||
"Reset board" : "Reinicialitza tauler",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Desfeu la supressió del tauler - Altrament el tauler serà suprimit durant la següent execució de treball del cron.",
|
||||
"Create new board" : "Crea un nou tauler",
|
||||
"New board title" : "Títol del nou tauler",
|
||||
"Create board" : "Crea tauler",
|
||||
"Select an attachment" : "Selecciona un adjunt",
|
||||
"Cancel upload" : "Cancel·la la càrrega",
|
||||
"by" : "per",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Desfeu la supressió del fitxer - Altrament el fitxer serà suprimit durant la següent execució de treball del cron.",
|
||||
"Undo file deletion" : "Desfés la supressió del fitxer",
|
||||
"Insert the file into the description" : "Insereix el fitxer a la descripció",
|
||||
"Delete attachment" : "Suprimeix l'adjunt",
|
||||
"Modified:" : "Modificat:",
|
||||
"Created:" : "Creat:",
|
||||
"Choose a tag" : "Trieu una etiqueta",
|
||||
"Add a tag" : "Afegeix una etiqueta",
|
||||
"Select tags" : "Selecciona etiquetes",
|
||||
"Assign users" : "Assigna usuaris",
|
||||
"Choose a user to assign" : "Tria un usuari per assignar",
|
||||
"Assign this card to a user" : "Assigna aquesta targeta a un usuari",
|
||||
"Due date" : "Per la data",
|
||||
"Click to set" : "Feu clic per configurar",
|
||||
"Remove due date" : "Elimina la data de venciment",
|
||||
"Description" : "Descripció",
|
||||
"Attachments" : "Adjunts",
|
||||
"Saved" : "Desat",
|
||||
"Unsaved changes" : "Canvis no desats",
|
||||
"Insert attachment" : "Insereix l'adjunt",
|
||||
"Formatting help" : "Format d'ajuda",
|
||||
"Upload attachment" : "Carrega l'adjunt",
|
||||
"Add a card description…" : "Afegeix una descripció de la targeta ...",
|
||||
"Shared boards" : "Taulers compartits",
|
||||
"Move board to archive" : "Mou la placa a l'arxiu",
|
||||
"Create a new board" : "Crear nova"
|
||||
"Move board to archive" : "Mou tauler a l'arxiu",
|
||||
"Create a new board" : "Crea un nou tauler",
|
||||
"Settings" : "Paràmetres",
|
||||
"Limit deck to groups" : "Limita el tauler per grups",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
190
l10n/ca.json
@@ -1,52 +1,200 @@
|
||||
{ "translations": {
|
||||
"Delete" : "Esborra",
|
||||
"Remove user from card" : "Esborra usuari de la targeta",
|
||||
"Please provide a content for your comment." : "Si us plau, proporcioneu un contingut per al vostre comentari.",
|
||||
"Posting the comment failed." : "No s'ha pogut publicar el comentari.",
|
||||
"The comment has been deleted" : "S'ha suprimit el comentari",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "La pila associada també se suprimeix, també es restaurarà.",
|
||||
"Restore associated stack" : "Restaura la pila associada",
|
||||
"Remove user from card" : "Suprimeix l'usuari de la targeta",
|
||||
"Hours" : "Hores",
|
||||
"Minutes" : "Minuts",
|
||||
"Link to a board" : "Enllaça a un tauler",
|
||||
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}",
|
||||
"File already exists" : "El fitxer ja existeix",
|
||||
"You have created a new board {board}" : "Heu creat el nou tauler {board}",
|
||||
"{user} has created a new board {board}" : "{user} ha creat el nou tauler {board}",
|
||||
"You have deleted the board {board}" : "Heu suprimit el tauler {board}",
|
||||
"{user} has deleted the board {board}" : "{user} ha suprimit el tauler {board}",
|
||||
"You have restored the board {board}" : "Heu restaurat el tauler {board}",
|
||||
"{user} has restored the board {board}" : "{user} ha restaurat el tauler {board}",
|
||||
"You have shared the board {board} with {acl}" : "Heu compartit el tauler {board} amb {acl}",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} ha compartit el tauler {board} amb {sharee}",
|
||||
"You have removed {acl} from the board {board}" : "Heu suprimit {acl} del tauler {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} ha suprimit {acl} del tauler {board}",
|
||||
"You have renamed the board {before} to {board}" : "Heu reanomenat el tauler {before} a {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} ha reanomenat el tauler {before} a {board}",
|
||||
"You have archived the board {board}" : "Heu arxivat el tauler {board}",
|
||||
"{user} has archived the board {before}" : "{user} ha arxivat el tauler {before}",
|
||||
"You have unarchived the board {board}" : "Heu desarxivat el tauler {board}",
|
||||
"{user} has unarchived the board {before}" : "{user} ha desarxivat el tauler {before}",
|
||||
"You have created a new stack {stack} on board {board}" : "Heu creat una nova pila {stack} al tauler {board}",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} ha creat una nova pila {stack} al tauler {board}",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Heu reanomenat la pila {before} a {stack} al tauler {board}",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} ha reanomenat la pila {before} a {stack} al tauler {board}",
|
||||
"You have deleted stack {stack} on board {board}" : "Heu suprimit la pila {stack} al tauler {board}",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} ha suprimit la pila {stack} al tauler {board}",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Heu creat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} ha creat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Heu suprimit la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Heu arxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} ha arxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Heu desarxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} ha arxivat la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have removed the due date of card {card}" : "Heu suprimit la data de venciment de la targeta {targeta}",
|
||||
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de venciment de la targeta {targeta}",
|
||||
"You have set the due date of card {card} to {after}" : "Heu establert la data de venciment de la targeta {card} a {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de venciment de la targeta {card} a {after}",
|
||||
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de venciment de la targeta {card} a {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de venciment de la targeta {card} a {after}",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Heu suprimit l'etiqueta {label} de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} ha suprimit l'etiqueta {label} de la targeta {card} a la pila {stack} al tauler {board}",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Heu assignat a {assigneduser} a la targeta {card} al tauler {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} ha assignat a {assigneduser} la targeta {card} del tauler {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Heu desassignat {assigneduser} de la targeta {card} al tauler {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} ha desassignat {assigneduser} de la targeta {card} al tauler {board}",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Heu mogut la targeta {card} de la pila {stackBefore} a {stack}",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} ha mogut la targeta {card} de la pila {stackBefore} a {stack}",
|
||||
"You have added the attachment {attachment} to card {card}" : "Heu afegit l'adjunt {attachment} a la targeta {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} ha afegit l'adjunt {attachment} a la targeta {card}",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Heu actualitzat l'adjunt {attachment} a la targeta {card}",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} ha actualitzat l'adjunt {attachment} a la targeta {card}",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Heu suprimit l'adjunt {attachment} de la targeta {card}",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} ha suprimit l'adjunt {attachment} de la targeta {card}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Heu restaurat l'adjunt {attachment} a la targeta {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}",
|
||||
"You have commented on card {card}" : "Heu comentat la targeta {card}",
|
||||
"{user} has commented on card {card}" : "{user} ha comentat la targeta {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler",
|
||||
"Deck" : "Tauler",
|
||||
"Changes in the <strong>Deck app</strong>" : "Hi ha canvis a l'<strong>aplicació Tauler</strong>",
|
||||
"Personal" : "Personal",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} us ha assignat la targeta \"%s\" sobre \"%s\".",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} us ha anomenat en un comentari sobre \"%s\".",
|
||||
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
|
||||
"{user} has shared the board %s with you." : "{user} us ha compartit el tauler %s.",
|
||||
"No data was provided to create an attachment." : "No s’ha proporcionat cap dada per crear un fitxer adjunt.",
|
||||
"Finished" : "Acabat",
|
||||
"To review" : "Per revisar",
|
||||
"Action needed" : "Acció necessaria",
|
||||
"Action needed" : "Acció necessària",
|
||||
"Later" : "Més tard",
|
||||
"Deck" : "Coberta",
|
||||
"To do" : "Pendents",
|
||||
"Doing" : "En procés",
|
||||
"Done" : "Finalitzades",
|
||||
"Example Task 3" : "Tasca d'exemple 3",
|
||||
"Example Task 2" : "Tasca d'exemple 2",
|
||||
"Example Task 1" : "Tasca d'exemple 1",
|
||||
"The file was uploaded" : "S'ha carregat el fitxer",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer carregat excedeix la directiva upload_max_filesize dins de php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat excedeix la directiva MAX_FILE_SIZE que hi ha especificada al formulari d'HTML",
|
||||
"The file was only partially uploaded" : "El fitxer s'ha carregat només parcialment",
|
||||
"No file was uploaded" : "No s'ha carregat cap fitxer",
|
||||
"Missing a temporary folder" : "Falta una carpeta temporal",
|
||||
"Could not write file to disk" : "No s’ha pogut escriure el fitxer al disc",
|
||||
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Un projecte d’estil kanban i una eina de gestió personal per a Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
|
||||
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
|
||||
"Select board" : "Selecciona un tauler",
|
||||
"Add a new stack" : "Afegeix una nova pila",
|
||||
"Submit" : "Envia",
|
||||
"Show archived cards" : "Mostra les targetes arxivades",
|
||||
"Hide archived cards" : "Amaga les targetes arxivades",
|
||||
"Board details" : "Detalls de la junta",
|
||||
"All Boards" : "Totes les juntes",
|
||||
"Toggle compact mode" : "Commuta el mode compacte",
|
||||
"Show board details" : "Mostra els detalls del tauler",
|
||||
"All Boards" : "Tots els Taulers",
|
||||
"Archived boards" : "Taulers arxivats",
|
||||
"Archive" : "Arxiu",
|
||||
"Unarchive" : "Desbloquejar",
|
||||
"Enter a card title" : "Introduïu un títol de la targeta",
|
||||
"Sharing" : "Compartir",
|
||||
"Share board" : "Comparteix tauler",
|
||||
"Archived cards" : "Targetes arxivades",
|
||||
"Actions" : "Accions",
|
||||
"Drop your files here to upload it to the card" : "Deixeu anar els fitxers aquí per carregar-los a la targeta",
|
||||
"Assign card to me" : "Assigna'm la targeta",
|
||||
"Unassign card from me" : "Desassigna'm la targeta",
|
||||
"Archive card" : "Arxiva la targeta",
|
||||
"Unarchive card" : "Desarxiva targeta",
|
||||
"Delete card" : "Suprimeix targeta",
|
||||
"Enter a card title" : "Introduïu un títol a la targeta",
|
||||
"Add card" : "Afegeix una targeta",
|
||||
"Close" : "Tanca",
|
||||
"Sharing" : "S'està compartint",
|
||||
"Tags" : "Etiquetes",
|
||||
"Select users or groups to share with" : "Seleccioneu usuaris o grups per compartir",
|
||||
"Deleted items" : "Elements suprimits",
|
||||
"Timeline" : "Línia de temps",
|
||||
"Select users or groups to share with" : "Seleccioneu usuaris o grups amb els qui compartir",
|
||||
"Group" : "Grup",
|
||||
"Circle" : "Cercle",
|
||||
"No matching user or group found." : "No s'ha trobat cap usuari o grup coincident.",
|
||||
"Share" : "Comparteix",
|
||||
"Loading" : "S'està carregant",
|
||||
"Edit" : "Edita",
|
||||
"Manage" : "Gestor",
|
||||
"Share" : "Comparteix",
|
||||
"Manage" : "Gestiona",
|
||||
"Discard share" : "Descarta la compartició",
|
||||
"Sharing has been disabled for your account." : "La compartició s'ha desactivat per al vostre compte.",
|
||||
"Update tag" : "Actualitza etiqueta",
|
||||
"Edit tag" : "Edita etiqueta",
|
||||
"Delete tag" : "Suprimeix etiqueta",
|
||||
"Create" : "Crea",
|
||||
"Create a new tag" : "Crea una nova etiqueta",
|
||||
"Title" : "Title",
|
||||
"Deleted stacks" : "Piles suprimides",
|
||||
"Deleted cards" : "Targetes suprimides",
|
||||
"Status" : "Estat",
|
||||
"No archived boards to display" : "No hi ha cap tauler arxivat per mostrar",
|
||||
"No shared boards to display" : "No hi ha cap tauler compartit per mostrar",
|
||||
"Title" : "Títol",
|
||||
"Members" : "Membres",
|
||||
"More actions" : "Més accions",
|
||||
"Edit board" : "Edita el tauler",
|
||||
"Archive board" : "Arxiu",
|
||||
"Unarchive board" : "Desbloquejar",
|
||||
"Delete board" : "Eliminat",
|
||||
"Create new board" : "Crear nova",
|
||||
"New board title" : "Nou títol",
|
||||
"Archive board" : "Arxiva tauler",
|
||||
"Unarchive board" : "Desarxiva tauler",
|
||||
"Delete board" : "Suprimeix tauler",
|
||||
"Update board" : "Actualitza tauler",
|
||||
"Reset board" : "Reinicialitza tauler",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Desfeu la supressió del tauler - Altrament el tauler serà suprimit durant la següent execució de treball del cron.",
|
||||
"Create new board" : "Crea un nou tauler",
|
||||
"New board title" : "Títol del nou tauler",
|
||||
"Create board" : "Crea tauler",
|
||||
"Select an attachment" : "Selecciona un adjunt",
|
||||
"Cancel upload" : "Cancel·la la càrrega",
|
||||
"by" : "per",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Desfeu la supressió del fitxer - Altrament el fitxer serà suprimit durant la següent execució de treball del cron.",
|
||||
"Undo file deletion" : "Desfés la supressió del fitxer",
|
||||
"Insert the file into the description" : "Insereix el fitxer a la descripció",
|
||||
"Delete attachment" : "Suprimeix l'adjunt",
|
||||
"Modified:" : "Modificat:",
|
||||
"Created:" : "Creat:",
|
||||
"Choose a tag" : "Trieu una etiqueta",
|
||||
"Add a tag" : "Afegeix una etiqueta",
|
||||
"Select tags" : "Selecciona etiquetes",
|
||||
"Assign users" : "Assigna usuaris",
|
||||
"Choose a user to assign" : "Tria un usuari per assignar",
|
||||
"Assign this card to a user" : "Assigna aquesta targeta a un usuari",
|
||||
"Due date" : "Per la data",
|
||||
"Click to set" : "Feu clic per configurar",
|
||||
"Remove due date" : "Elimina la data de venciment",
|
||||
"Description" : "Descripció",
|
||||
"Attachments" : "Adjunts",
|
||||
"Saved" : "Desat",
|
||||
"Unsaved changes" : "Canvis no desats",
|
||||
"Insert attachment" : "Insereix l'adjunt",
|
||||
"Formatting help" : "Format d'ajuda",
|
||||
"Upload attachment" : "Carrega l'adjunt",
|
||||
"Add a card description…" : "Afegeix una descripció de la targeta ...",
|
||||
"Shared boards" : "Taulers compartits",
|
||||
"Move board to archive" : "Mou la placa a l'arxiu",
|
||||
"Create a new board" : "Crear nova"
|
||||
"Move board to archive" : "Mou tauler a l'arxiu",
|
||||
"Create a new board" : "Crea un nou tauler",
|
||||
"Settings" : "Paràmetres",
|
||||
"Limit deck to groups" : "Limita el tauler per grups",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
153
l10n/cs.js
@@ -1,46 +1,156 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Are you sure you want to delete this card with all of its data?" : "Opravdu chcete smazat tuto kartu a všechna její data?",
|
||||
"Delete" : "Smazat",
|
||||
"Please provide a content for your comment." : "Zadejte obsah svého komentáře.",
|
||||
"Posting the comment failed." : "Odeslání komentáře se nezdařilo.",
|
||||
"The comment has been deleted" : "Komentář byl smazán",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "Související stack je také smazaný a bude také obnoven.",
|
||||
"Restore associated stack" : "Obnovit související stack",
|
||||
"Remove user from card" : "Odebrat uživatele z karty",
|
||||
"Hours" : "Hodiny",
|
||||
"Minutes" : "Minuty",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Opravdu chcete smazat stack a všechna data v něm?",
|
||||
"Maximum file size of {size} exceeded" : "U souboru {size} překročena nejvyšší umožněná velikost",
|
||||
"File already exists" : "Soubor už existuje",
|
||||
"You have created a new board {board}" : "Vytvořili jste nástěnku {board}",
|
||||
"{user} has created a new board {board}" : "{user} vytvořil(a) novou nástěnku {board}",
|
||||
"You have deleted the board {board}" : "Smazali jste nástěnku {board}",
|
||||
"{user} has deleted the board {board}" : "{user} smazal(a) nástěnku {board}",
|
||||
"You have restored the board {board}" : "Obnovili jste nástěnku {board}",
|
||||
"{user} has restored the board {board}" : "{user} obnovil(a) nástěnku {board}",
|
||||
"You have shared the board {board} with {acl}" : "Nasdíleli jste nástěnku {board} s {acl}",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} nasdílel(a) nástěnku {board} pro {sharee}",
|
||||
"You have removed {acl} from the board {board}" : "Odebrali jste {acl} z nástěnky {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} odebral(a) {acl} z nástěnky {board}",
|
||||
"You have renamed the board {before} to {board}" : "Přejmenovali jste nástěnku {before} na {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} přejmenoval(a) desku {before} na {board}",
|
||||
"You have archived the board {board}" : "Zaarchivovali jste nástěnku {board}",
|
||||
"{user} has archived the board {before}" : "{user} zaarchivoval(a) nástěnku {before}",
|
||||
"You have unarchived the board {board}" : "Zrušili jste archivaci nástěnky {board}",
|
||||
"{user} has unarchived the board {before}" : "{user} zrušil(a) archivaci nástěnky {before}",
|
||||
"You have created a new stack {stack} on board {board}" : "Vytvořili jste novou hromádku {stack} na desce {board}",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} vytvořil(a) nový balíček {stack} na desce {board}",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Přejmenovali jste hromádku {before} na {stack} na desce {board}",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} přejmenoval(a) hromádku {before} na {stack} na desce {board}",
|
||||
"You have deleted stack {stack} on board {board}" : "Smazali jste balíček {stack} na desce {board}",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} smazal(a) balíček {stack} na desce {board}",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Vytvořili jste kartu {card} v balíčku {stack} na kartě {board}",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} vytvořil(a) kartu {card} na hromádce {stack} na desce {board}",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Smazali jste kartu {card} na hromádce {stack} na desce {board}",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} smazal(a) kartu {card} v balíčku {board} na desce {board}",
|
||||
"You have renamed the card {before} to {card}" : "Přejmenovali jste kartu {before} na {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} přejmenoval(a) {before} na {card}",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Přidali jste popis ke kartě {card} v hromádce {stack} na desce {board}",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} přidal(a) popis ke kartě {card} v hromádce {stack} na desce {board}",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Aktualizovali jste popis karty {card} v hromádce {stack} na desce {board}",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} aktualizoval(a) popis karty {card} na hromádce {stack} na nástěnce {board}",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Zaarchivovali kartu {card} v balíčku {stack} na desce {board}",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} zaarchivoval(a) kartu {card} v balíčku {stack} na desce {board}",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Zrušili jste archivaci karty {card} na hromádce {stack} na desce {board}",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} zrušil(a) archivaci karty {card} na hromádce {stack} na desce {board}",
|
||||
"You have removed the due date of card {card}" : "Odebrali jste termín karty {card}",
|
||||
"{user} has removed the due date of card {card}" : "{user} odebral(a) termín karty {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Nastavili jste termín na kartě {card} na {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} nastavil(a) termín karty {card} na {after}",
|
||||
"You have updated the due date of card {card} to {after}" : "Změnili jste termín na kartě {card} na {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} aktualizoval termín karty {card} na {after}",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Přidali jste štítek {label} kartě {card} v hromádce {stack} na nástěnce {board}",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} přidal(a) štítek {label} ke kartě {card} v hromádce {stack} na nástěnce {board}",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Odebrali jste štítek {label} z karty {card} v hromádce {stack} na desce {board}",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} odebral(a) štítek {label} z karty {card} na hromádce {stack} na desce {board}",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Přiřadili jste {assigneduser} ke kartě {card} na desce {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} přiřadil(a) {assigneduser} ke kartě {card} na desce {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Zrušili jste přiřazení {assigneduser} u karty {card} na nástěnce {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} zrušil(a) přiřazení {assigneduser} z karty {card} na desce {board}",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Přesunuli jste kartu {card} z balíčku {stackBefore} do {stack}",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} přesunul(a) kartu {card} z balíčku {stackBefore} do {stack}",
|
||||
"You have added the attachment {attachment} to card {card}" : "Přidali jste přílohu {attachment} ke kartě {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} přidal(a) přílohu {attachment} ke kartě {card}",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Aktualizovali jste přílohu {attachment} na kartě {card}",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} aktualizoval(a) přílohu {attachment} ke kartě {card}",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Smazali jste přílohu {attachment} u karty {card}",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} smazal(a) přílohu {attachment} u karty {card}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Obnovili jste přílohu {attachment} ke kartě {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} obnovil(a) přílohu {attachment} ke kartě {card}",
|
||||
"You have commented on card {card}" : "Přidali jste komentář na kartě {card}",
|
||||
"{user} has commented on card {card}" : "{user} přidal(a) komentář na kartě {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>Popis mapy</strong> v Deck-aplikace byl změněn",
|
||||
"Deck" : "Balík",
|
||||
"Changes in the <strong>Deck app</strong>" : "Změny v <strong>Deck aplikace</strong>",
|
||||
"Personal" : "Osobní",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu „%s“ na „%s“ vám přiřadil(a) %s.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} vám přiřadil(a) kartu „%s“ na „%s“.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s vás zmínil(a) v komentáři k „%s“.",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} vás zmínil(a) v komentáři v „%s“.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.",
|
||||
"{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.",
|
||||
"No data was provided to create an attachment." : "Žádná data k vytvoření přílohy.",
|
||||
"Finished" : "Dokončeno",
|
||||
"To review" : "K revizi",
|
||||
"Action needed" : "Nutná akce",
|
||||
"Later" : "Později",
|
||||
"Deck" : "Balík",
|
||||
"To do" : "Udělat",
|
||||
"Doing" : "Provádí se",
|
||||
"Done" : "Hotovo",
|
||||
"Example Task 3" : "Třetí úkol pro ukázku",
|
||||
"Example Task 2" : "Druhý úkol pro ukázku",
|
||||
"Example Task 1" : "První úkol pro ukázku",
|
||||
"The file was uploaded" : "Soubor byl nahrán",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahrávaný soubor přesahuje nastavení upload_max_filesize v php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Nahrávaný soubor přesáhl svou velikostí hodnotu direktivy MAX_FILE_SIZE, určenou v HTML formuláři",
|
||||
"The file was only partially uploaded" : "Soubor byl nahrán pouze z části",
|
||||
"No file was uploaded" : "Nebyl nahrán žádný soubor",
|
||||
"Missing a temporary folder" : "Chybí složka pro dočasné soubory",
|
||||
"Could not write file to disk" : "Soubor se nedaří se zapsat na úložiště",
|
||||
"A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru.",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Nástroj pro projektový a osobní řízení ve stylu Kanban.",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Karty jsou nástroj zacílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
|
||||
"Select board" : "Vybrat nástěnku",
|
||||
"Add a new stack" : "Přidat nový zásobník",
|
||||
"Submit" : "Odeslat",
|
||||
"Show archived cards" : "Zobrazit archivované karty",
|
||||
"Hide archived cards" : "Skrýt archivované karty",
|
||||
"Board details" : "Detaily desky",
|
||||
"Toggle compact mode" : "Vyp/zap. kompaktní režim",
|
||||
"Show board details" : "Zobrazit podrobnosti o desce",
|
||||
"All Boards" : "Všechny desky",
|
||||
"Archived boards" : "Archivované desky",
|
||||
"Archive" : "Archiv",
|
||||
"Unarchive" : "Zrušit archivování",
|
||||
"Share board" : "Sdílet nástěnku",
|
||||
"Archived cards" : "Archivované karty",
|
||||
"Actions" : "Akce",
|
||||
"Drop your files here to upload it to the card" : "Přetáhněte soubor sem, pokud jej chcete připojit ke kartě.",
|
||||
"Assign card to me" : "Přiřadit kartu mě",
|
||||
"Unassign card from me" : "Zrušit přiřazení karty mě",
|
||||
"Archive card" : "Archivovat kartu",
|
||||
"Unarchive card" : "Zrušit archivaci karty",
|
||||
"Delete card" : "Smazat kartu",
|
||||
"Enter a card title" : "Zadejte nadpis karty",
|
||||
"Add card" : "Přidat kartu",
|
||||
"Close" : "Zavřít",
|
||||
"Sharing" : "Sdílení",
|
||||
"Tags" : "Značky",
|
||||
"Deleted items" : "Smazané položky",
|
||||
"Timeline" : "Časová osa",
|
||||
"Select users or groups to share with" : "Vyberte uživatele nebo skupiny pro sdílení",
|
||||
"Access for" : "Přístup pro",
|
||||
"Group" : "Skupina",
|
||||
"Circle" : "Okruh",
|
||||
"No matching user or group found." : "Nevyhovuje žádný uživatel ani skupina",
|
||||
"Loading" : "Načítání",
|
||||
"Share" : "Sdílet",
|
||||
"Edit" : "Upravit",
|
||||
"Share" : "Sdílet",
|
||||
"Manage" : "Spravovat",
|
||||
"Discard share" : "Zrušit sdílení",
|
||||
"Update" : "Aktualizovat",
|
||||
"Sharing has been disabled for your account." : "Sdílení bylo zakázáno pro váš konto.",
|
||||
"Update tag" : "Aktualizovat štítek",
|
||||
"Edit tag" : "Upravit štítek",
|
||||
"Delete tag" : "Smazat štítek",
|
||||
"Create" : "Vytvořit",
|
||||
"Create a new tag" : "Vytvořit nový štítek",
|
||||
"Deleted stacks" : "Smazané zásobníky",
|
||||
"Deleted cards" : "Smazané karty",
|
||||
"Status" : "Stav",
|
||||
"No archived boards to display" : "Žádné archivované nástěnky k zobrazení",
|
||||
"No shared boards to display" : "Žádné sdílené nástěnky k zobrazení",
|
||||
"Title" : "Název",
|
||||
"Members" : "Členové",
|
||||
"More actions" : "Více akcí",
|
||||
@@ -48,11 +158,19 @@ OC.L10N.register(
|
||||
"Archive board" : "Archivovaná deska",
|
||||
"Unarchive board" : "Odarchivovat desku",
|
||||
"Delete board" : "Smazat desku",
|
||||
"Reset" : "Obnovit",
|
||||
"Update board" : "Aktualizovat desku",
|
||||
"Reset board" : "Resetovat nástěnku",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.",
|
||||
"Create new board" : "VYtvořit ovou desku",
|
||||
"Create new board" : "Vytvořit novou desku",
|
||||
"New board title" : "Nadpis nové desky",
|
||||
"Create board" : "Vytvořit nástěnku",
|
||||
"Select an attachment" : "Vybrat přílohu",
|
||||
"Cancel upload" : "Zrušit nahrávání",
|
||||
"by" : "od",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Vrátit smazání souboru – v opačném případě bude soubor trvale smazán při dalším běhu cronjobu.",
|
||||
"Undo file deletion" : "Vzít zpět smazání souboru",
|
||||
"Insert the file into the description" : "Vložte soubor do popisku.",
|
||||
"Delete attachment" : "Smazat přílohu",
|
||||
"Modified:" : "Upraveno:",
|
||||
"Created:" : "Vytvořeno:",
|
||||
"Choose a tag" : "Vyberte štítek",
|
||||
@@ -65,13 +183,18 @@ OC.L10N.register(
|
||||
"Click to set" : "Klikněte pro výběr",
|
||||
"Remove due date" : "Odstranit termín",
|
||||
"Description" : "Popis",
|
||||
"Attachments" : "Přílohy",
|
||||
"Saved" : "Uloženo",
|
||||
"Unsaved changes" : "Neuložené změny",
|
||||
"Insert attachment" : "Vložit přílohu",
|
||||
"Formatting help" : "Nápověda k formátování",
|
||||
"Add a card description…" : "Přidat popis karty...",
|
||||
"Upload attachment" : "Nahrát přílohu",
|
||||
"Add a card description…" : "Přidat popis karty…",
|
||||
"Shared boards" : "Sdílené desky",
|
||||
"View more" : "Ukázat více",
|
||||
"Move board to archive" : "Přesunout desku do archivu",
|
||||
"Create a new board" : "Vytvořit novou desku"
|
||||
"Create a new board" : "Vytvořit novou desku",
|
||||
"Settings" : "Nastavení",
|
||||
"Limit deck to groups" : "Omezte Deck na skupiny",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Omezení Decků brání uživatelům, kteří nejsou součástí těchto skupin, při vytváření vlastních desek. Uživatelé mohou stále pracovat na deskách, které jsou s nimi sdíleny."
|
||||
},
|
||||
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
|
||||
|
||||
153
l10n/cs.json
@@ -1,44 +1,154 @@
|
||||
{ "translations": {
|
||||
"Are you sure you want to delete this card with all of its data?" : "Opravdu chcete smazat tuto kartu a všechna její data?",
|
||||
"Delete" : "Smazat",
|
||||
"Please provide a content for your comment." : "Zadejte obsah svého komentáře.",
|
||||
"Posting the comment failed." : "Odeslání komentáře se nezdařilo.",
|
||||
"The comment has been deleted" : "Komentář byl smazán",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "Související stack je také smazaný a bude také obnoven.",
|
||||
"Restore associated stack" : "Obnovit související stack",
|
||||
"Remove user from card" : "Odebrat uživatele z karty",
|
||||
"Hours" : "Hodiny",
|
||||
"Minutes" : "Minuty",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Opravdu chcete smazat stack a všechna data v něm?",
|
||||
"Maximum file size of {size} exceeded" : "U souboru {size} překročena nejvyšší umožněná velikost",
|
||||
"File already exists" : "Soubor už existuje",
|
||||
"You have created a new board {board}" : "Vytvořili jste nástěnku {board}",
|
||||
"{user} has created a new board {board}" : "{user} vytvořil(a) novou nástěnku {board}",
|
||||
"You have deleted the board {board}" : "Smazali jste nástěnku {board}",
|
||||
"{user} has deleted the board {board}" : "{user} smazal(a) nástěnku {board}",
|
||||
"You have restored the board {board}" : "Obnovili jste nástěnku {board}",
|
||||
"{user} has restored the board {board}" : "{user} obnovil(a) nástěnku {board}",
|
||||
"You have shared the board {board} with {acl}" : "Nasdíleli jste nástěnku {board} s {acl}",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} nasdílel(a) nástěnku {board} pro {sharee}",
|
||||
"You have removed {acl} from the board {board}" : "Odebrali jste {acl} z nástěnky {board}",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} odebral(a) {acl} z nástěnky {board}",
|
||||
"You have renamed the board {before} to {board}" : "Přejmenovali jste nástěnku {before} na {board}",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} přejmenoval(a) desku {before} na {board}",
|
||||
"You have archived the board {board}" : "Zaarchivovali jste nástěnku {board}",
|
||||
"{user} has archived the board {before}" : "{user} zaarchivoval(a) nástěnku {before}",
|
||||
"You have unarchived the board {board}" : "Zrušili jste archivaci nástěnky {board}",
|
||||
"{user} has unarchived the board {before}" : "{user} zrušil(a) archivaci nástěnky {before}",
|
||||
"You have created a new stack {stack} on board {board}" : "Vytvořili jste novou hromádku {stack} na desce {board}",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} vytvořil(a) nový balíček {stack} na desce {board}",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Přejmenovali jste hromádku {before} na {stack} na desce {board}",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} přejmenoval(a) hromádku {before} na {stack} na desce {board}",
|
||||
"You have deleted stack {stack} on board {board}" : "Smazali jste balíček {stack} na desce {board}",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} smazal(a) balíček {stack} na desce {board}",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Vytvořili jste kartu {card} v balíčku {stack} na kartě {board}",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} vytvořil(a) kartu {card} na hromádce {stack} na desce {board}",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Smazali jste kartu {card} na hromádce {stack} na desce {board}",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} smazal(a) kartu {card} v balíčku {board} na desce {board}",
|
||||
"You have renamed the card {before} to {card}" : "Přejmenovali jste kartu {before} na {card}",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} přejmenoval(a) {before} na {card}",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Přidali jste popis ke kartě {card} v hromádce {stack} na desce {board}",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} přidal(a) popis ke kartě {card} v hromádce {stack} na desce {board}",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Aktualizovali jste popis karty {card} v hromádce {stack} na desce {board}",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} aktualizoval(a) popis karty {card} na hromádce {stack} na nástěnce {board}",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Zaarchivovali kartu {card} v balíčku {stack} na desce {board}",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} zaarchivoval(a) kartu {card} v balíčku {stack} na desce {board}",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Zrušili jste archivaci karty {card} na hromádce {stack} na desce {board}",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} zrušil(a) archivaci karty {card} na hromádce {stack} na desce {board}",
|
||||
"You have removed the due date of card {card}" : "Odebrali jste termín karty {card}",
|
||||
"{user} has removed the due date of card {card}" : "{user} odebral(a) termín karty {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Nastavili jste termín na kartě {card} na {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} nastavil(a) termín karty {card} na {after}",
|
||||
"You have updated the due date of card {card} to {after}" : "Změnili jste termín na kartě {card} na {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} aktualizoval termín karty {card} na {after}",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Přidali jste štítek {label} kartě {card} v hromádce {stack} na nástěnce {board}",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} přidal(a) štítek {label} ke kartě {card} v hromádce {stack} na nástěnce {board}",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Odebrali jste štítek {label} z karty {card} v hromádce {stack} na desce {board}",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} odebral(a) štítek {label} z karty {card} na hromádce {stack} na desce {board}",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Přiřadili jste {assigneduser} ke kartě {card} na desce {board}",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} přiřadil(a) {assigneduser} ke kartě {card} na desce {board}",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Zrušili jste přiřazení {assigneduser} u karty {card} na nástěnce {board}",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} zrušil(a) přiřazení {assigneduser} z karty {card} na desce {board}",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Přesunuli jste kartu {card} z balíčku {stackBefore} do {stack}",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} přesunul(a) kartu {card} z balíčku {stackBefore} do {stack}",
|
||||
"You have added the attachment {attachment} to card {card}" : "Přidali jste přílohu {attachment} ke kartě {card}",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} přidal(a) přílohu {attachment} ke kartě {card}",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Aktualizovali jste přílohu {attachment} na kartě {card}",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} aktualizoval(a) přílohu {attachment} ke kartě {card}",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Smazali jste přílohu {attachment} u karty {card}",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} smazal(a) přílohu {attachment} u karty {card}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Obnovili jste přílohu {attachment} ke kartě {card}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} obnovil(a) přílohu {attachment} ke kartě {card}",
|
||||
"You have commented on card {card}" : "Přidali jste komentář na kartě {card}",
|
||||
"{user} has commented on card {card}" : "{user} přidal(a) komentář na kartě {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>Popis mapy</strong> v Deck-aplikace byl změněn",
|
||||
"Deck" : "Balík",
|
||||
"Changes in the <strong>Deck app</strong>" : "Změny v <strong>Deck aplikace</strong>",
|
||||
"Personal" : "Osobní",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu „%s“ na „%s“ vám přiřadil(a) %s.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} vám přiřadil(a) kartu „%s“ na „%s“.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s vás zmínil(a) v komentáři k „%s“.",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} vás zmínil(a) v komentáři v „%s“.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.",
|
||||
"{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.",
|
||||
"No data was provided to create an attachment." : "Žádná data k vytvoření přílohy.",
|
||||
"Finished" : "Dokončeno",
|
||||
"To review" : "K revizi",
|
||||
"Action needed" : "Nutná akce",
|
||||
"Later" : "Později",
|
||||
"Deck" : "Balík",
|
||||
"To do" : "Udělat",
|
||||
"Doing" : "Provádí se",
|
||||
"Done" : "Hotovo",
|
||||
"Example Task 3" : "Třetí úkol pro ukázku",
|
||||
"Example Task 2" : "Druhý úkol pro ukázku",
|
||||
"Example Task 1" : "První úkol pro ukázku",
|
||||
"The file was uploaded" : "Soubor byl nahrán",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahrávaný soubor přesahuje nastavení upload_max_filesize v php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Nahrávaný soubor přesáhl svou velikostí hodnotu direktivy MAX_FILE_SIZE, určenou v HTML formuláři",
|
||||
"The file was only partially uploaded" : "Soubor byl nahrán pouze z části",
|
||||
"No file was uploaded" : "Nebyl nahrán žádný soubor",
|
||||
"Missing a temporary folder" : "Chybí složka pro dočasné soubory",
|
||||
"Could not write file to disk" : "Soubor se nedaří se zapsat na úložiště",
|
||||
"A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru.",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Nástroj pro projektový a osobní řízení ve stylu Kanban.",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Karty jsou nástroj zacílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
|
||||
"Select board" : "Vybrat nástěnku",
|
||||
"Add a new stack" : "Přidat nový zásobník",
|
||||
"Submit" : "Odeslat",
|
||||
"Show archived cards" : "Zobrazit archivované karty",
|
||||
"Hide archived cards" : "Skrýt archivované karty",
|
||||
"Board details" : "Detaily desky",
|
||||
"Toggle compact mode" : "Vyp/zap. kompaktní režim",
|
||||
"Show board details" : "Zobrazit podrobnosti o desce",
|
||||
"All Boards" : "Všechny desky",
|
||||
"Archived boards" : "Archivované desky",
|
||||
"Archive" : "Archiv",
|
||||
"Unarchive" : "Zrušit archivování",
|
||||
"Share board" : "Sdílet nástěnku",
|
||||
"Archived cards" : "Archivované karty",
|
||||
"Actions" : "Akce",
|
||||
"Drop your files here to upload it to the card" : "Přetáhněte soubor sem, pokud jej chcete připojit ke kartě.",
|
||||
"Assign card to me" : "Přiřadit kartu mě",
|
||||
"Unassign card from me" : "Zrušit přiřazení karty mě",
|
||||
"Archive card" : "Archivovat kartu",
|
||||
"Unarchive card" : "Zrušit archivaci karty",
|
||||
"Delete card" : "Smazat kartu",
|
||||
"Enter a card title" : "Zadejte nadpis karty",
|
||||
"Add card" : "Přidat kartu",
|
||||
"Close" : "Zavřít",
|
||||
"Sharing" : "Sdílení",
|
||||
"Tags" : "Značky",
|
||||
"Deleted items" : "Smazané položky",
|
||||
"Timeline" : "Časová osa",
|
||||
"Select users or groups to share with" : "Vyberte uživatele nebo skupiny pro sdílení",
|
||||
"Access for" : "Přístup pro",
|
||||
"Group" : "Skupina",
|
||||
"Circle" : "Okruh",
|
||||
"No matching user or group found." : "Nevyhovuje žádný uživatel ani skupina",
|
||||
"Loading" : "Načítání",
|
||||
"Share" : "Sdílet",
|
||||
"Edit" : "Upravit",
|
||||
"Share" : "Sdílet",
|
||||
"Manage" : "Spravovat",
|
||||
"Discard share" : "Zrušit sdílení",
|
||||
"Update" : "Aktualizovat",
|
||||
"Sharing has been disabled for your account." : "Sdílení bylo zakázáno pro váš konto.",
|
||||
"Update tag" : "Aktualizovat štítek",
|
||||
"Edit tag" : "Upravit štítek",
|
||||
"Delete tag" : "Smazat štítek",
|
||||
"Create" : "Vytvořit",
|
||||
"Create a new tag" : "Vytvořit nový štítek",
|
||||
"Deleted stacks" : "Smazané zásobníky",
|
||||
"Deleted cards" : "Smazané karty",
|
||||
"Status" : "Stav",
|
||||
"No archived boards to display" : "Žádné archivované nástěnky k zobrazení",
|
||||
"No shared boards to display" : "Žádné sdílené nástěnky k zobrazení",
|
||||
"Title" : "Název",
|
||||
"Members" : "Členové",
|
||||
"More actions" : "Více akcí",
|
||||
@@ -46,11 +156,19 @@
|
||||
"Archive board" : "Archivovaná deska",
|
||||
"Unarchive board" : "Odarchivovat desku",
|
||||
"Delete board" : "Smazat desku",
|
||||
"Reset" : "Obnovit",
|
||||
"Update board" : "Aktualizovat desku",
|
||||
"Reset board" : "Resetovat nástěnku",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.",
|
||||
"Create new board" : "VYtvořit ovou desku",
|
||||
"Create new board" : "Vytvořit novou desku",
|
||||
"New board title" : "Nadpis nové desky",
|
||||
"Create board" : "Vytvořit nástěnku",
|
||||
"Select an attachment" : "Vybrat přílohu",
|
||||
"Cancel upload" : "Zrušit nahrávání",
|
||||
"by" : "od",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Vrátit smazání souboru – v opačném případě bude soubor trvale smazán při dalším běhu cronjobu.",
|
||||
"Undo file deletion" : "Vzít zpět smazání souboru",
|
||||
"Insert the file into the description" : "Vložte soubor do popisku.",
|
||||
"Delete attachment" : "Smazat přílohu",
|
||||
"Modified:" : "Upraveno:",
|
||||
"Created:" : "Vytvořeno:",
|
||||
"Choose a tag" : "Vyberte štítek",
|
||||
@@ -63,13 +181,18 @@
|
||||
"Click to set" : "Klikněte pro výběr",
|
||||
"Remove due date" : "Odstranit termín",
|
||||
"Description" : "Popis",
|
||||
"Attachments" : "Přílohy",
|
||||
"Saved" : "Uloženo",
|
||||
"Unsaved changes" : "Neuložené změny",
|
||||
"Insert attachment" : "Vložit přílohu",
|
||||
"Formatting help" : "Nápověda k formátování",
|
||||
"Add a card description…" : "Přidat popis karty...",
|
||||
"Upload attachment" : "Nahrát přílohu",
|
||||
"Add a card description…" : "Přidat popis karty…",
|
||||
"Shared boards" : "Sdílené desky",
|
||||
"View more" : "Ukázat více",
|
||||
"Move board to archive" : "Přesunout desku do archivu",
|
||||
"Create a new board" : "Vytvořit novou desku"
|
||||
"Create a new board" : "Vytvořit novou desku",
|
||||
"Settings" : "Nastavení",
|
||||
"Limit deck to groups" : "Omezte Deck na skupiny",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Omezení Decků brání uživatelům, kteří nejsou součástí těchto skupin, při vytváření vlastních desek. Uživatelé mohou stále pracovat na deskách, které jsou s nimi sdíleny."
|
||||
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
|
||||
}
|
||||
18
l10n/da.js
@@ -1,12 +1,10 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Are you sure you want to delete this card with all of its data?" : "Er du sikker på, at du vil slette dette kort med alle dets data?",
|
||||
"Delete" : "Slet",
|
||||
"Remove user from card" : "Fjern bruger fra kort",
|
||||
"Hours" : "Timer",
|
||||
"Minutes" : "Minutter",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Er du sikker på, at du ønsker at slette denne stak med alle data?",
|
||||
"Deck" : "Deck",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin udløbsdato.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Brættet \"%s\" er blevet delt med dig af %s.",
|
||||
"{user} has shared the board %s with you." : "{user} har delt brættet %s med dig.",
|
||||
@@ -14,32 +12,25 @@ OC.L10N.register(
|
||||
"To review" : "Gennemse",
|
||||
"Action needed" : "Handling påkrævet",
|
||||
"Later" : "Senere",
|
||||
"Deck" : "Deck",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Et Kanban-inspireret projekt- og styringsværktøj til Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck er et Kanban-inspireret organisationsværktøj beregnet til personlig planlægning og projektstyring for teams - integreret med Nextcloud.\n\n\n- 📥 Tilføj dine opgaver til kort og organiser dem\n- 📄 Skriv yderligere noter i Markdown\n- 🔖 Marker opgaver med tags for bedre organisering\n- 👥 Del med team, venner eller familie\n- 🚀 Organiser dit projekt",
|
||||
"Add a new stack" : "Tilføj en ny stak",
|
||||
"Submit" : "Tilføj",
|
||||
"Show archived cards" : "Vis arkiverede kort",
|
||||
"Hide archived cards" : "Skjul arkiverede kort",
|
||||
"Board details" : "Liste detaljer",
|
||||
"All Boards" : "Alle lister",
|
||||
"Archived boards" : "Arkiverede lister",
|
||||
"Archive" : "Arkivér",
|
||||
"Unarchive" : "Annuller arkivering",
|
||||
"Enter a card title" : "Angiv titel på kort",
|
||||
"Add card" : "Tilføj kort",
|
||||
"Close" : "Luk",
|
||||
"Sharing" : "Deling",
|
||||
"Tags" : "Mærkat",
|
||||
"Select users or groups to share with" : "Vælg brugere eller grupper og dele med",
|
||||
"Access for" : "Adgang for",
|
||||
"No matching user or group found." : "Ingen bruger eller gruppe fundet",
|
||||
"Loading" : "Loader",
|
||||
"Share" : "Del",
|
||||
"Edit" : "Redigér",
|
||||
"Share" : "Del",
|
||||
"Manage" : "Administrer ",
|
||||
"Discard share" : "Kasser deling",
|
||||
"Update" : "Opdatér",
|
||||
"Create" : "Opret",
|
||||
"Create a new tag" : "Opret et nyt mærkat",
|
||||
"Status" : "Status",
|
||||
@@ -50,7 +41,6 @@ OC.L10N.register(
|
||||
"Archive board" : "Arkivér liste",
|
||||
"Unarchive board" : "Annuller arkivering af liste",
|
||||
"Delete board" : "Slet liste",
|
||||
"Reset" : "Nulstil",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Fortryd sletning af board - Ellers vil boardet blive slettet ved næste cronjob kørsel.",
|
||||
"Create new board" : "Opret ny liste",
|
||||
"New board title" : "Ny titel på liste",
|
||||
@@ -72,8 +62,8 @@ OC.L10N.register(
|
||||
"Formatting help" : "Hjælp til formatering",
|
||||
"Add a card description…" : "Tilføj en beskrivelse...",
|
||||
"Shared boards" : "Delte lister",
|
||||
"View more" : "Vis mere",
|
||||
"Move board to archive" : "Flyt liste til arkiv",
|
||||
"Create a new board" : "Opret ny liste"
|
||||
"Create a new board" : "Opret ny liste",
|
||||
"Settings" : "Indstillinger"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
18
l10n/da.json
@@ -1,10 +1,8 @@
|
||||
{ "translations": {
|
||||
"Are you sure you want to delete this card with all of its data?" : "Er du sikker på, at du vil slette dette kort med alle dets data?",
|
||||
"Delete" : "Slet",
|
||||
"Remove user from card" : "Fjern bruger fra kort",
|
||||
"Hours" : "Timer",
|
||||
"Minutes" : "Minutter",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Er du sikker på, at du ønsker at slette denne stak med alle data?",
|
||||
"Deck" : "Deck",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin udløbsdato.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Brættet \"%s\" er blevet delt med dig af %s.",
|
||||
"{user} has shared the board %s with you." : "{user} har delt brættet %s med dig.",
|
||||
@@ -12,32 +10,25 @@
|
||||
"To review" : "Gennemse",
|
||||
"Action needed" : "Handling påkrævet",
|
||||
"Later" : "Senere",
|
||||
"Deck" : "Deck",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Et Kanban-inspireret projekt- og styringsværktøj til Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck er et Kanban-inspireret organisationsværktøj beregnet til personlig planlægning og projektstyring for teams - integreret med Nextcloud.\n\n\n- 📥 Tilføj dine opgaver til kort og organiser dem\n- 📄 Skriv yderligere noter i Markdown\n- 🔖 Marker opgaver med tags for bedre organisering\n- 👥 Del med team, venner eller familie\n- 🚀 Organiser dit projekt",
|
||||
"Add a new stack" : "Tilføj en ny stak",
|
||||
"Submit" : "Tilføj",
|
||||
"Show archived cards" : "Vis arkiverede kort",
|
||||
"Hide archived cards" : "Skjul arkiverede kort",
|
||||
"Board details" : "Liste detaljer",
|
||||
"All Boards" : "Alle lister",
|
||||
"Archived boards" : "Arkiverede lister",
|
||||
"Archive" : "Arkivér",
|
||||
"Unarchive" : "Annuller arkivering",
|
||||
"Enter a card title" : "Angiv titel på kort",
|
||||
"Add card" : "Tilføj kort",
|
||||
"Close" : "Luk",
|
||||
"Sharing" : "Deling",
|
||||
"Tags" : "Mærkat",
|
||||
"Select users or groups to share with" : "Vælg brugere eller grupper og dele med",
|
||||
"Access for" : "Adgang for",
|
||||
"No matching user or group found." : "Ingen bruger eller gruppe fundet",
|
||||
"Loading" : "Loader",
|
||||
"Share" : "Del",
|
||||
"Edit" : "Redigér",
|
||||
"Share" : "Del",
|
||||
"Manage" : "Administrer ",
|
||||
"Discard share" : "Kasser deling",
|
||||
"Update" : "Opdatér",
|
||||
"Create" : "Opret",
|
||||
"Create a new tag" : "Opret et nyt mærkat",
|
||||
"Status" : "Status",
|
||||
@@ -48,7 +39,6 @@
|
||||
"Archive board" : "Arkivér liste",
|
||||
"Unarchive board" : "Annuller arkivering af liste",
|
||||
"Delete board" : "Slet liste",
|
||||
"Reset" : "Nulstil",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Fortryd sletning af board - Ellers vil boardet blive slettet ved næste cronjob kørsel.",
|
||||
"Create new board" : "Opret ny liste",
|
||||
"New board title" : "Ny titel på liste",
|
||||
@@ -70,8 +60,8 @@
|
||||
"Formatting help" : "Hjælp til formatering",
|
||||
"Add a card description…" : "Tilføj en beskrivelse...",
|
||||
"Shared boards" : "Delte lister",
|
||||
"View more" : "Vis mere",
|
||||
"Move board to archive" : "Flyt liste til arkiv",
|
||||
"Create a new board" : "Opret ny liste"
|
||||
"Create a new board" : "Opret ny liste",
|
||||
"Settings" : "Indstillinger"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
166
l10n/de.js
@@ -1,51 +1,158 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Are you sure you want to delete this card with all of its data?" : "Möchtest Du wirklich diese Karte mit all ihren Daten löschen?",
|
||||
"Delete" : "Löschen",
|
||||
"Please provide a content for your comment." : "Bitte gib einen Inhalt für Deinen Kommentar an.",
|
||||
"Posting the comment failed." : "Absenden des Kommentars ist fehlgeschlagen.",
|
||||
"The comment has been deleted" : "Der Kommentar wurde gelöscht",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "Der dazugehörige Stapel wurde auch gelöscht, er wird ebenfalls wiederhergestellt.",
|
||||
"Restore associated stack" : "Dazugehörigen Stapel wiederherstellen",
|
||||
"Remove user from card" : "Benutzer von Karte entfernen",
|
||||
"Hours" : "Stunden",
|
||||
"Minutes" : "Minuten",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Möchtest du diesen Stapel mit allen Daten wirklich löschen?",
|
||||
"Link to a board" : "Mit einem Board verknüpfen",
|
||||
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
|
||||
"File already exists" : "Datei bereits vorhanden",
|
||||
"You have created a new board {board}" : "Du hast das neue Board {board} erstellt",
|
||||
"{user} has created a new board {board}" : "{user} hat das neue Board {board} erstellt",
|
||||
"You have deleted the board {board}" : "Du hast das Board {board} gelöscht",
|
||||
"{user} has deleted the board {board}" : "{user} hat das Board {board} gelöscht",
|
||||
"You have restored the board {board}" : "Du hast das Board {board} wiederhergestellt",
|
||||
"{user} has restored the board {board}" : "{user} hat das Board {board} wiederhergestellt",
|
||||
"You have shared the board {board} with {acl}" : "Du hast das Board {board} mit {acl} geteilt",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} hat das Board {board} mit {sharee} geteilt",
|
||||
"You have removed {acl} from the board {board}" : "Du hast {acl} vom Board {board} entfernt",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} hat {acl} vom Board {board} entfernt",
|
||||
"You have renamed the board {before} to {board}" : "Du hast das Board {before} in {board} umbenannt",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} hat das Board {before} in {board} umbenannt",
|
||||
"You have archived the board {board}" : "Du hast das Board {board} archiviert",
|
||||
"{user} has archived the board {before}" : "{user} hat das Board {before} archiviert",
|
||||
"You have unarchived the board {board}" : "Du hast das Board {board} dearchiviert",
|
||||
"{user} has unarchived the board {before}" : "{user} hat das Board {before} dearchiviert",
|
||||
"You have created a new stack {stack} on board {board}" : "Du hast den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} hat den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Du hast den Stapel {before} auf dem Board {board} in {stack} umbenannt",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} hat den Stapel {before} in {stack} auf dem Board {board} umbenannt",
|
||||
"You have deleted stack {stack} on board {board}" : "Du hast den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} hat den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have renamed the card {before} to {card}" : "Du hast die Karte {before} in {card} umbenannt",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} hat die Karte {before} in {card} umbenannt",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Du hast der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Du hast die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} hat die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"You have removed the due date of card {card}" : "Du hast das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"{user} has removed the due date of card {card}" : "{user} hat das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"You have set the due date of card {card} to {after}" : "Du hast das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"You have updated the due date of card {card} to {after}" : "Du hast das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Du hast der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Du hast von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} hat von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Du hast {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hat {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Du hast die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} hat die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Du hast die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} hat die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"You have added the attachment {attachment} to card {card}" : "Du hast den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Du hast den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Du hast den Anhang {attachment} von der Karte {card} entfernt",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} von Karte {card} entfernt",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Du hast den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"You have commented on card {card}" : "Du hast die Karte {card} kommentiert",
|
||||
"{user} has commented on card {card}" : "{user} hat die Karte {card} kommentiert",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Eine <strong>Kartenbeschreibung</strong> wurde innerhalb der Deck-App geändert",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "Änderungen in der <strong>Deck-App</strong>",
|
||||
"Personal" : "Persönlich",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Die Karte \"%s\" auf \"%s\" wurde Dir von %s zugewiesen.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} hat Dir die Karte \"%s\" auf \"%s\" zugewiesen.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : " %s hat Dich in einem Kommentar zu \"%s\" erwähnt.",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} hat Dich in einem Kommentar zu “%s” erwähnt.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Dir geteilt.",
|
||||
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Dir geteilt.",
|
||||
"No data was provided to create an attachment." : "Es wurden keine Daten zum Erstellen eines Anhangs bereitgestellt.",
|
||||
"Finished" : "Abgeschlossen",
|
||||
"To review" : "Zu überprüfen",
|
||||
"Action needed" : "Handlung erforderlich",
|
||||
"Later" : "Später",
|
||||
"To do" : "Offen",
|
||||
"Doing" : "In Arbeit",
|
||||
"Done" : "Erledigt",
|
||||
"Example Task 3" : "Beispielaufgabe 3",
|
||||
"Example Task 2" : "Beispielaufgabe 2",
|
||||
"Example Task 1" : "Beispielaufgabe 1",
|
||||
"The file was uploaded" : "Die Datei wurde hochgeladen",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
|
||||
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
|
||||
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
|
||||
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
|
||||
"No file uploaded" : "Keine Datei hochgeladen",
|
||||
"Deck" : "Deck",
|
||||
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
|
||||
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werkzeug für Nextcloud",
|
||||
"Add a new stack" : "Stapel hinzufügen",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Füge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 📎 Füge Dateien hinzu und verwende diese in Deinen Markdown-Beschreibungen\n- 💬 Diskutiere mit Deinem Team mit Kommentaren\n- ⚡ Behalte Überblick über Änderungen mit dem Aktivitäten-Stream\n- 🚀 Organisiere Dein Projekt",
|
||||
"Select the board to link to a project" : "Wähle ein Board aus, um dieses mit einem Projekt zu verknüpfen",
|
||||
"Select board" : "Board auswählen",
|
||||
"Add a new stack" : "Neuer Stapel",
|
||||
"Submit" : "Übermitteln",
|
||||
"Show archived cards" : "Archivierte Karten anzeigen",
|
||||
"Hide archived cards" : "Archivierte Karten ausblenden",
|
||||
"Board details" : "Board-Details",
|
||||
"Toggle compact mode" : "Kompaktmodus umschalten",
|
||||
"Show board details" : "Board-Details anzeigen",
|
||||
"All Boards" : "Alle Boards",
|
||||
"Archived boards" : "Archivierte Boards",
|
||||
"Archive" : "Archivieren",
|
||||
"Unarchive" : "Dearchivieren",
|
||||
"Share board" : "Board freigeben",
|
||||
"Archived cards" : "Archivierte Karten",
|
||||
"Actions" : "Aktionen",
|
||||
"Drop your files here to upload it to the card" : "Lege Deine Dateien hier ab, um sie auf die Karte hochzuladen",
|
||||
"Assign card to me" : "Karte mir zuweisen",
|
||||
"Unassign card from me" : "Karte nicht mir zuweisen",
|
||||
"Archive card" : "Karte archivieren",
|
||||
"Unarchive card" : "Karte dearchivieren",
|
||||
"Delete card" : "Karte löschen",
|
||||
"Enter a card title" : "Kartentitel eingeben",
|
||||
"Add card" : "Karte hinzufügen",
|
||||
"Close" : "Schließen",
|
||||
"Sharing" : "Teilen",
|
||||
"Tags" : "Schlagworte",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
|
||||
"Access for" : "Zugriff für",
|
||||
"Deleted items" : "Gelöschte Objekte",
|
||||
"Timeline" : "Zeitachse",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen zum Teilen auswählen",
|
||||
"Group" : "Gruppe",
|
||||
"Circle" : "Kreis",
|
||||
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
|
||||
"Loading" : "Lade",
|
||||
"Share" : "Teilen",
|
||||
"Edit" : "Bearbeiten",
|
||||
"Share" : "Teilen",
|
||||
"Manage" : "Verwalten",
|
||||
"Discard share" : "Teilen beenden",
|
||||
"Update" : "Aktualisieren",
|
||||
"Sharing has been disabled for your account." : "Teilen wurde für Dein Konto deaktiviert.",
|
||||
"Update tag" : "Schlagwort aktualisieren",
|
||||
"Edit tag" : "Schlagwort bearbeiten",
|
||||
"Delete tag" : "Schlagwort löschen",
|
||||
"Create" : "Erstellen",
|
||||
"Create a new tag" : "Neues Etikett erstellen",
|
||||
"Create a new tag" : "Neues Schlagwort",
|
||||
"Deleted stacks" : "Gelöschte Stapel",
|
||||
"Deleted cards" : "Gelöschte Karten",
|
||||
"Status" : "Status",
|
||||
"No archived boards to display" : "Keine archivierten Boards zum Anzeigen",
|
||||
"No shared boards to display" : "Keine geteilten Boards zum Anzeigen",
|
||||
"Title" : "Titel",
|
||||
"Members" : "Mitglieder",
|
||||
"More actions" : "Weitere Aktionen",
|
||||
@@ -53,34 +160,43 @@ OC.L10N.register(
|
||||
"Archive board" : "Board archivieren",
|
||||
"Unarchive board" : "Board dearchivieren",
|
||||
"Delete board" : "Board löschen",
|
||||
"Reset" : "Zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board erstellen",
|
||||
"New board title" : "Neuer Board-Titel",
|
||||
"Update board" : "Board aktualisieren",
|
||||
"Reset board" : "Board zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - andernfalls wird das Board beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board",
|
||||
"New board title" : "Board-Titel",
|
||||
"Create board" : "Neues Board",
|
||||
"Select an attachment" : "Anhang auswählen",
|
||||
"Cancel upload" : "Hochladen abbrechen",
|
||||
"by" : "von",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - andernfalls wird die Datei beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Undo file deletion" : "Dateilöschung rückgängig machen",
|
||||
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
|
||||
"Delete attachment" : "Anhang löschen",
|
||||
"Modified:" : "Geändert:",
|
||||
"Created:" : "Erstellt:",
|
||||
"Choose a tag" : "Schlagwort auswählen",
|
||||
"Add a tag" : "Schlagwort hinzufügen",
|
||||
"Select tags" : "Schlagworte auswählen",
|
||||
"Assign users" : "Nutzer zuweisen",
|
||||
"Choose a user to assign" : "Wähle einen Benutzer zum Zuweisen",
|
||||
"Assign users" : "Benutzer zuweisen",
|
||||
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
|
||||
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
|
||||
"Due date" : "Fälligkeitsdatum",
|
||||
"Click to set" : "Klicken zum Übernehmen",
|
||||
"Remove due date" : "Ablaufdatum löschen",
|
||||
"Click to set" : "Auswählen",
|
||||
"Remove due date" : "Fälligkeitsdatum löschen",
|
||||
"Description" : "Beschreibung",
|
||||
"Attachments" : "Anhänge",
|
||||
"Saved" : "Gespeichert",
|
||||
"Unsaved changes" : "Ungesicherte Änderungen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Formatting help" : "Formatierungshilfe",
|
||||
"Upload attachment" : "Anhang hochladen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Add a card description…" : "Eine Kartenbeschreibung hinzufügen…",
|
||||
"Shared boards" : "Geteilte Boards",
|
||||
"View more" : "Mehr anzeigen",
|
||||
"Move board to archive" : "Board ins Archiv verschieben",
|
||||
"Create a new board" : "Neues Board erstellen"
|
||||
"Create a new board" : "Neues Board",
|
||||
"Settings" : "Einstellungen",
|
||||
"Limit deck to groups" : "Deck auf Gruppen beschränken",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
166
l10n/de.json
@@ -1,49 +1,156 @@
|
||||
{ "translations": {
|
||||
"Are you sure you want to delete this card with all of its data?" : "Möchtest Du wirklich diese Karte mit all ihren Daten löschen?",
|
||||
"Delete" : "Löschen",
|
||||
"Please provide a content for your comment." : "Bitte gib einen Inhalt für Deinen Kommentar an.",
|
||||
"Posting the comment failed." : "Absenden des Kommentars ist fehlgeschlagen.",
|
||||
"The comment has been deleted" : "Der Kommentar wurde gelöscht",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "Der dazugehörige Stapel wurde auch gelöscht, er wird ebenfalls wiederhergestellt.",
|
||||
"Restore associated stack" : "Dazugehörigen Stapel wiederherstellen",
|
||||
"Remove user from card" : "Benutzer von Karte entfernen",
|
||||
"Hours" : "Stunden",
|
||||
"Minutes" : "Minuten",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Möchtest du diesen Stapel mit allen Daten wirklich löschen?",
|
||||
"Link to a board" : "Mit einem Board verknüpfen",
|
||||
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
|
||||
"File already exists" : "Datei bereits vorhanden",
|
||||
"You have created a new board {board}" : "Du hast das neue Board {board} erstellt",
|
||||
"{user} has created a new board {board}" : "{user} hat das neue Board {board} erstellt",
|
||||
"You have deleted the board {board}" : "Du hast das Board {board} gelöscht",
|
||||
"{user} has deleted the board {board}" : "{user} hat das Board {board} gelöscht",
|
||||
"You have restored the board {board}" : "Du hast das Board {board} wiederhergestellt",
|
||||
"{user} has restored the board {board}" : "{user} hat das Board {board} wiederhergestellt",
|
||||
"You have shared the board {board} with {acl}" : "Du hast das Board {board} mit {acl} geteilt",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} hat das Board {board} mit {sharee} geteilt",
|
||||
"You have removed {acl} from the board {board}" : "Du hast {acl} vom Board {board} entfernt",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} hat {acl} vom Board {board} entfernt",
|
||||
"You have renamed the board {before} to {board}" : "Du hast das Board {before} in {board} umbenannt",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} hat das Board {before} in {board} umbenannt",
|
||||
"You have archived the board {board}" : "Du hast das Board {board} archiviert",
|
||||
"{user} has archived the board {before}" : "{user} hat das Board {before} archiviert",
|
||||
"You have unarchived the board {board}" : "Du hast das Board {board} dearchiviert",
|
||||
"{user} has unarchived the board {before}" : "{user} hat das Board {before} dearchiviert",
|
||||
"You have created a new stack {stack} on board {board}" : "Du hast den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} hat den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Du hast den Stapel {before} auf dem Board {board} in {stack} umbenannt",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} hat den Stapel {before} in {stack} auf dem Board {board} umbenannt",
|
||||
"You have deleted stack {stack} on board {board}" : "Du hast den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} hat den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have renamed the card {before} to {card}" : "Du hast die Karte {before} in {card} umbenannt",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} hat die Karte {before} in {card} umbenannt",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Du hast der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Du hast die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} hat die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Du hast die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"You have removed the due date of card {card}" : "Du hast das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"{user} has removed the due date of card {card}" : "{user} hat das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"You have set the due date of card {card} to {after}" : "Du hast das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"You have updated the due date of card {card} to {after}" : "Du hast das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Du hast der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Du hast von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} hat von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Du hast {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hat {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Du hast die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} hat die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Du hast die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} hat die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"You have added the attachment {attachment} to card {card}" : "Du hast den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Du hast den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Du hast den Anhang {attachment} von der Karte {card} entfernt",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} von Karte {card} entfernt",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Du hast den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"You have commented on card {card}" : "Du hast die Karte {card} kommentiert",
|
||||
"{user} has commented on card {card}" : "{user} hat die Karte {card} kommentiert",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Eine <strong>Kartenbeschreibung</strong> wurde innerhalb der Deck-App geändert",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "Änderungen in der <strong>Deck-App</strong>",
|
||||
"Personal" : "Persönlich",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Die Karte \"%s\" auf \"%s\" wurde Dir von %s zugewiesen.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} hat Dir die Karte \"%s\" auf \"%s\" zugewiesen.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : " %s hat Dich in einem Kommentar zu \"%s\" erwähnt.",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} hat Dich in einem Kommentar zu “%s” erwähnt.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Dir geteilt.",
|
||||
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Dir geteilt.",
|
||||
"No data was provided to create an attachment." : "Es wurden keine Daten zum Erstellen eines Anhangs bereitgestellt.",
|
||||
"Finished" : "Abgeschlossen",
|
||||
"To review" : "Zu überprüfen",
|
||||
"Action needed" : "Handlung erforderlich",
|
||||
"Later" : "Später",
|
||||
"To do" : "Offen",
|
||||
"Doing" : "In Arbeit",
|
||||
"Done" : "Erledigt",
|
||||
"Example Task 3" : "Beispielaufgabe 3",
|
||||
"Example Task 2" : "Beispielaufgabe 2",
|
||||
"Example Task 1" : "Beispielaufgabe 1",
|
||||
"The file was uploaded" : "Die Datei wurde hochgeladen",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
|
||||
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
|
||||
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
|
||||
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
|
||||
"No file uploaded" : "Keine Datei hochgeladen",
|
||||
"Deck" : "Deck",
|
||||
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
|
||||
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werkzeug für Nextcloud",
|
||||
"Add a new stack" : "Stapel hinzufügen",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Füge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 📎 Füge Dateien hinzu und verwende diese in Deinen Markdown-Beschreibungen\n- 💬 Diskutiere mit Deinem Team mit Kommentaren\n- ⚡ Behalte Überblick über Änderungen mit dem Aktivitäten-Stream\n- 🚀 Organisiere Dein Projekt",
|
||||
"Select the board to link to a project" : "Wähle ein Board aus, um dieses mit einem Projekt zu verknüpfen",
|
||||
"Select board" : "Board auswählen",
|
||||
"Add a new stack" : "Neuer Stapel",
|
||||
"Submit" : "Übermitteln",
|
||||
"Show archived cards" : "Archivierte Karten anzeigen",
|
||||
"Hide archived cards" : "Archivierte Karten ausblenden",
|
||||
"Board details" : "Board-Details",
|
||||
"Toggle compact mode" : "Kompaktmodus umschalten",
|
||||
"Show board details" : "Board-Details anzeigen",
|
||||
"All Boards" : "Alle Boards",
|
||||
"Archived boards" : "Archivierte Boards",
|
||||
"Archive" : "Archivieren",
|
||||
"Unarchive" : "Dearchivieren",
|
||||
"Share board" : "Board freigeben",
|
||||
"Archived cards" : "Archivierte Karten",
|
||||
"Actions" : "Aktionen",
|
||||
"Drop your files here to upload it to the card" : "Lege Deine Dateien hier ab, um sie auf die Karte hochzuladen",
|
||||
"Assign card to me" : "Karte mir zuweisen",
|
||||
"Unassign card from me" : "Karte nicht mir zuweisen",
|
||||
"Archive card" : "Karte archivieren",
|
||||
"Unarchive card" : "Karte dearchivieren",
|
||||
"Delete card" : "Karte löschen",
|
||||
"Enter a card title" : "Kartentitel eingeben",
|
||||
"Add card" : "Karte hinzufügen",
|
||||
"Close" : "Schließen",
|
||||
"Sharing" : "Teilen",
|
||||
"Tags" : "Schlagworte",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
|
||||
"Access for" : "Zugriff für",
|
||||
"Deleted items" : "Gelöschte Objekte",
|
||||
"Timeline" : "Zeitachse",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen zum Teilen auswählen",
|
||||
"Group" : "Gruppe",
|
||||
"Circle" : "Kreis",
|
||||
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
|
||||
"Loading" : "Lade",
|
||||
"Share" : "Teilen",
|
||||
"Edit" : "Bearbeiten",
|
||||
"Share" : "Teilen",
|
||||
"Manage" : "Verwalten",
|
||||
"Discard share" : "Teilen beenden",
|
||||
"Update" : "Aktualisieren",
|
||||
"Sharing has been disabled for your account." : "Teilen wurde für Dein Konto deaktiviert.",
|
||||
"Update tag" : "Schlagwort aktualisieren",
|
||||
"Edit tag" : "Schlagwort bearbeiten",
|
||||
"Delete tag" : "Schlagwort löschen",
|
||||
"Create" : "Erstellen",
|
||||
"Create a new tag" : "Neues Etikett erstellen",
|
||||
"Create a new tag" : "Neues Schlagwort",
|
||||
"Deleted stacks" : "Gelöschte Stapel",
|
||||
"Deleted cards" : "Gelöschte Karten",
|
||||
"Status" : "Status",
|
||||
"No archived boards to display" : "Keine archivierten Boards zum Anzeigen",
|
||||
"No shared boards to display" : "Keine geteilten Boards zum Anzeigen",
|
||||
"Title" : "Titel",
|
||||
"Members" : "Mitglieder",
|
||||
"More actions" : "Weitere Aktionen",
|
||||
@@ -51,34 +158,43 @@
|
||||
"Archive board" : "Board archivieren",
|
||||
"Unarchive board" : "Board dearchivieren",
|
||||
"Delete board" : "Board löschen",
|
||||
"Reset" : "Zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board erstellen",
|
||||
"New board title" : "Neuer Board-Titel",
|
||||
"Update board" : "Board aktualisieren",
|
||||
"Reset board" : "Board zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - andernfalls wird das Board beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board",
|
||||
"New board title" : "Board-Titel",
|
||||
"Create board" : "Neues Board",
|
||||
"Select an attachment" : "Anhang auswählen",
|
||||
"Cancel upload" : "Hochladen abbrechen",
|
||||
"by" : "von",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - andernfalls wird die Datei beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Undo file deletion" : "Dateilöschung rückgängig machen",
|
||||
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
|
||||
"Delete attachment" : "Anhang löschen",
|
||||
"Modified:" : "Geändert:",
|
||||
"Created:" : "Erstellt:",
|
||||
"Choose a tag" : "Schlagwort auswählen",
|
||||
"Add a tag" : "Schlagwort hinzufügen",
|
||||
"Select tags" : "Schlagworte auswählen",
|
||||
"Assign users" : "Nutzer zuweisen",
|
||||
"Choose a user to assign" : "Wähle einen Benutzer zum Zuweisen",
|
||||
"Assign users" : "Benutzer zuweisen",
|
||||
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
|
||||
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
|
||||
"Due date" : "Fälligkeitsdatum",
|
||||
"Click to set" : "Klicken zum Übernehmen",
|
||||
"Remove due date" : "Ablaufdatum löschen",
|
||||
"Click to set" : "Auswählen",
|
||||
"Remove due date" : "Fälligkeitsdatum löschen",
|
||||
"Description" : "Beschreibung",
|
||||
"Attachments" : "Anhänge",
|
||||
"Saved" : "Gespeichert",
|
||||
"Unsaved changes" : "Ungesicherte Änderungen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Formatting help" : "Formatierungshilfe",
|
||||
"Upload attachment" : "Anhang hochladen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Add a card description…" : "Eine Kartenbeschreibung hinzufügen…",
|
||||
"Shared boards" : "Geteilte Boards",
|
||||
"View more" : "Mehr anzeigen",
|
||||
"Move board to archive" : "Board ins Archiv verschieben",
|
||||
"Create a new board" : "Neues Board erstellen"
|
||||
"Create a new board" : "Neues Board",
|
||||
"Settings" : "Einstellungen",
|
||||
"Limit deck to groups" : "Deck auf Gruppen beschränken",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
170
l10n/de_DE.js
@@ -1,58 +1,158 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Are you sure you want to delete this card with all of its data?" : "Möchten Sie wirklich diese Karte mit all ihren Daten löschen?",
|
||||
"Delete" : "Löschen",
|
||||
"Please provide a content for your comment." : "Bitte geben Sie einen Inhalt für Ihren Kommentar an.",
|
||||
"Posting the comment failed." : "Absenden des Kommentars ist fehlgeschlagen.",
|
||||
"The comment has been deleted" : "Der Kommentar wurde gelöscht",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "Der dazugehörige Stapel wurde auch gelöscht, er wird ebenfalls wiederhergestellt.",
|
||||
"Restore associated stack" : "Dazugehörigen Stapel wiederherstellen",
|
||||
"Remove user from card" : "Benutzer von Karte entfernen",
|
||||
"Hours" : "Stunden",
|
||||
"Minutes" : "Minuten",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Möchten Sie diesen Stapel mit allen Daten wirklich löschen?",
|
||||
"Link to a board" : "Mit einem Board verknüpfen",
|
||||
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
|
||||
"File already exists" : "Datei bereits vorhanden",
|
||||
"You have created a new board {board}" : "Sie haben das neue Board {board} erstellt",
|
||||
"{user} has created a new board {board}" : "{user} hat das neue Board {board} erstellt",
|
||||
"You have deleted the board {board}" : "Sie haben das Board {board} gelöscht",
|
||||
"{user} has deleted the board {board}" : "{user} hat das Board {board} gelöscht",
|
||||
"You have restored the board {board}" : "Sie haben das Board {board} wiederhergestellt",
|
||||
"{user} has restored the board {board}" : "{user} hat das Board {board} wiederhergestellt",
|
||||
"You have shared the board {board} with {acl}" : "Sie haben das Board {board} mit {acl} geteilt",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} hat das Board {board} mit {sharee} geteilt",
|
||||
"You have removed {acl} from the board {board}" : "Sie haben {acl} vom Board {board} entfernt",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} hat {acl} vom Board {board} entfernt",
|
||||
"You have renamed the board {before} to {board}" : "Sie haben das Board {before} in {board} umbenannt",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} hat das Board {before} in {board} umbenannt",
|
||||
"You have archived the board {board}" : "Sie haben das Board {board} archiviert",
|
||||
"{user} has archived the board {before}" : "{user} hat das Board {before} archiviert",
|
||||
"You have unarchived the board {board}" : "Sie haben das Board {board} dearchiviert",
|
||||
"{user} has unarchived the board {before}" : "{user} hat das Board {before} dearchiviert",
|
||||
"You have created a new stack {stack} on board {board}" : "Sie haben den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} hat den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Sie haben den Stapel {before} auf dem Board {board} in {stack} umbenannt",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} hat den Stapel {before} in {stack} auf dem Board {board} umbenannt",
|
||||
"You have deleted stack {stack} on board {board}" : "Sie haben den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} hat den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have renamed the card {before} to {card}" : "Sie haben die Karte {before} in {card} umbenannt",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} hat die Karte {before} in {card} umbenannt",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Sie haben der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Sie haben die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} hat die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"You have removed the due date of card {card}" : "Sie haben das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"{user} has removed the due date of card {card}" : "{user} hat das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"You have set the due date of card {card} to {after}" : "Sie haben das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"You have updated the due date of card {card} to {after}" : "Sie haben das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Sie haben der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Sie haben von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} hat von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Sie haben {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hat {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Sie haben die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} hat die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Sie haben die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} hat die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"You have added the attachment {attachment} to card {card}" : "Sie haben den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Sie haben den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Sie haben den Anhang {attachment} von der Karte {card} entfernt",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} von Karte {card} entfernt",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Sie haben den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"You have commented on card {card}" : "Sie haben die Karte {card} kommentiert",
|
||||
"{user} has commented on card {card}" : "{user} hat die Karte {card} kommentiert",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Eine <strong>Kartenbeschreibung</strong> wurde innerhalb der Deck-App geändert",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "Änderungen in der <strong>Deck-App</strong>",
|
||||
"Personal" : "Persönlich",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Die Karte \"%s\" auf \"%s\" wurde Ihnen von %s zugewiesen.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} hat Ihnen die Karte \"%s\" auf \"%s\" zugewiesen.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s hat Sie in einem Kommentar zu \"%s\" erwähnt.",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} hat Sie in einem Kommentar zu \"%s\" erwähnt.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Ihnen geteilt.",
|
||||
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Ihnen geteilt.",
|
||||
"No data was provided to create an attachment." : "Es wurden keine Daten zum Erstellen eines Anhangs bereitgestellt.",
|
||||
"Finished" : "Abgeschlossen",
|
||||
"To review" : "Zu überprüfen",
|
||||
"Action needed" : "Handlung erforderlich",
|
||||
"Later" : "Später",
|
||||
"To do" : "Offen",
|
||||
"Doing" : "In Arbeit",
|
||||
"Done" : "Erledigt",
|
||||
"Example Task 3" : "Beispielaufgabe 3",
|
||||
"Example Task 2" : "Beispielaufgabe 2",
|
||||
"Example Task 1" : "Beispielaufgabe 1",
|
||||
"The file was uploaded" : "Die Datei wurde hochgeladen",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe erlaubt, die im HTML-Formular spezifiziert ist",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
|
||||
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
|
||||
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
|
||||
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
|
||||
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
|
||||
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
|
||||
"No file uploaded" : "Keine Datei hochgeladen",
|
||||
"Deck" : "Deck",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werzeug für Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie sie ein.\n📄 Zusätzliche Hinweise in der Abschrift notieren\n🔖 Vergabe von Labels für noch bessere Organisation\n👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n🚀 Organisieren Sie Ihr Projekt",
|
||||
"Add a new stack" : "Neuen Stapel hinzufügen",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werkzeug für Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Zuweisung von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 📎 Fügen Sie Dateien hinzu und verwende diese in Ihren Markdown-Beschreibungen\n- 💬 Diskutieren Sie mit Ihrem Team mit Kommentaren\n- ⚡ Behalten Sie Überblick über Änderungen mit dem Aktivitäten-Stream\n- 🚀 Organisieren Sie Ihr Projekt",
|
||||
"Select the board to link to a project" : "Wählen Sie ein Board aus, um dieses mit einem Projekt zu verknüpfen",
|
||||
"Select board" : "Board auswählen",
|
||||
"Add a new stack" : "Neuer Stapel",
|
||||
"Submit" : "Übermitteln",
|
||||
"Show archived cards" : "Archivierte Karten anzeigen",
|
||||
"Hide archived cards" : "Archivierte Karten ausblenden",
|
||||
"Board details" : "Board-Details",
|
||||
"Toggle compact mode" : "Kompaktmodus umschalten",
|
||||
"Show board details" : "Board-Details anzeigen",
|
||||
"All Boards" : "Alle Boards",
|
||||
"Archived boards" : "Archivierte Boards",
|
||||
"Share board" : "Board freigeben",
|
||||
"Archived cards" : "Archivierte Karten",
|
||||
"Actions" : "Aktionen",
|
||||
"Drop your files here to upload it to the card" : "Legen Sie Ihre Dateien hier ab, um sie auf die Karte hochzuladen",
|
||||
"Archive" : "Archivieren",
|
||||
"Unarchive" : "Dearchivieren",
|
||||
"Assign card to me" : "Karte mir zuweisen",
|
||||
"Unassign card from me" : "Karte nicht mir zuweisen",
|
||||
"Archive card" : "Karte archivieren",
|
||||
"Unarchive card" : "Karte dearchivieren",
|
||||
"Delete card" : "Karte löschen",
|
||||
"Enter a card title" : "Kartentitel eingeben",
|
||||
"Add card" : "Karte hinzufügen",
|
||||
"Close" : "Schließen",
|
||||
"Sharing" : "Teilen",
|
||||
"Tags" : "Schlagworte",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
|
||||
"Access for" : "Zugriff für",
|
||||
"Deleted items" : "Gelöschte Objekte",
|
||||
"Timeline" : "Zeitachse",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen zum Teilen auswählen",
|
||||
"Group" : "Gruppe",
|
||||
"Circle" : "Kreis",
|
||||
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
|
||||
"Loading" : "Lade",
|
||||
"Share" : "Teilen",
|
||||
"Edit" : "Bearbeiten",
|
||||
"Share" : "Teilen",
|
||||
"Manage" : "Verwalten",
|
||||
"Discard share" : "Teilen beenden",
|
||||
"Update" : "Aktualisieren",
|
||||
"Sharing has been disabled for your account." : "Teilen wurde für Ihr Konto deaktiviert.",
|
||||
"Update tag" : "Schlagwort aktualisieren",
|
||||
"Edit tag" : "Schlagwort bearbeiten",
|
||||
"Delete tag" : "Schlagwort löschen",
|
||||
"Create" : "Erstellen",
|
||||
"Create a new tag" : "Tag erstellen",
|
||||
"Create a new tag" : "Neues Schlagwort",
|
||||
"Deleted stacks" : "Gelöschte Stapel",
|
||||
"Deleted cards" : "Gelöschte Karten",
|
||||
"Status" : "Status",
|
||||
"No archived boards to display" : "Keine archivierten Boards zum Anzeigen",
|
||||
"No shared boards to display" : "Keine geteilten Boards zum Anzeigen",
|
||||
"Title" : "Titel",
|
||||
"Members" : "Mitglieder",
|
||||
"More actions" : "Weitere Aktionen",
|
||||
@@ -60,37 +160,43 @@ OC.L10N.register(
|
||||
"Archive board" : "Board archivieren",
|
||||
"Unarchive board" : "Board dearchivieren",
|
||||
"Delete board" : "Board löschen",
|
||||
"Reset" : "Zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board erstellen",
|
||||
"New board title" : "Neuer Board-Titel",
|
||||
"Select an attachment" : "Wählen Sie einen Anhang",
|
||||
"Update board" : "Board aktualisieren",
|
||||
"Reset board" : "Board zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - andernfalls wird das Board beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board",
|
||||
"New board title" : "Board-Titel",
|
||||
"Create board" : "Neues Board",
|
||||
"Select an attachment" : "Anhang auswählen",
|
||||
"Cancel upload" : "Hochladen abbrechen",
|
||||
"by" : "von",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten Cronjob-Lauf gelöscht.",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - andernfalls wird die Datei beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Undo file deletion" : "Dateilöschung rückgängig machen",
|
||||
"Insert the file into the description" : "Fügen Sie die Datei in die Beschreibung ein",
|
||||
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
|
||||
"Delete attachment" : "Anhang löschen",
|
||||
"Modified:" : "Geändert:",
|
||||
"Created:" : "Erstellt:",
|
||||
"Choose a tag" : "Schlagwort auswählen",
|
||||
"Add a tag" : "Schlagwort hinzufügen",
|
||||
"Select tags" : "Schlagworte auswählen",
|
||||
"Assign users" : "Benutzer zuordnen",
|
||||
"Choose a user to assign" : "Wählen Sie einen Benutzer zum Zuweisen",
|
||||
"Assign this card to a user" : "Diese Karte einem Benutzer zuordnen",
|
||||
"Due date" : "Zieltermin",
|
||||
"Assign users" : "Benutzer zuweisen",
|
||||
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
|
||||
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
|
||||
"Due date" : "Fälligkeitsdatum",
|
||||
"Click to set" : "Setzen",
|
||||
"Remove due date" : "Zieltermin entfernen",
|
||||
"Remove due date" : "Fälligkeitsdatum entfernen",
|
||||
"Description" : "Beschreibung",
|
||||
"Attachments" : "Anhänge",
|
||||
"Saved" : "Gespeichert",
|
||||
"Unsaved changes" : "Ungesicherte Änderungen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Formatting help" : "Formatierungshilfe",
|
||||
"Upload attachment" : "Anhang hochladen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Add a card description…" : "Beschreibung hinzufügen…",
|
||||
"Shared boards" : "Geteilte Boards",
|
||||
"View more" : "Mehr anzeigen",
|
||||
"Move board to archive" : "Board ins Archiv verschieben",
|
||||
"Create a new board" : "Neues Board erstellen"
|
||||
"Create a new board" : "Neues Board",
|
||||
"Settings" : "Einstellungen",
|
||||
"Limit deck to groups" : "Deck auf Gruppen beschränken",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
170
l10n/de_DE.json
@@ -1,56 +1,156 @@
|
||||
{ "translations": {
|
||||
"Are you sure you want to delete this card with all of its data?" : "Möchten Sie wirklich diese Karte mit all ihren Daten löschen?",
|
||||
"Delete" : "Löschen",
|
||||
"Please provide a content for your comment." : "Bitte geben Sie einen Inhalt für Ihren Kommentar an.",
|
||||
"Posting the comment failed." : "Absenden des Kommentars ist fehlgeschlagen.",
|
||||
"The comment has been deleted" : "Der Kommentar wurde gelöscht",
|
||||
"The associated stack is deleted as well, it will be restored as well." : "Der dazugehörige Stapel wurde auch gelöscht, er wird ebenfalls wiederhergestellt.",
|
||||
"Restore associated stack" : "Dazugehörigen Stapel wiederherstellen",
|
||||
"Remove user from card" : "Benutzer von Karte entfernen",
|
||||
"Hours" : "Stunden",
|
||||
"Minutes" : "Minuten",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Möchten Sie diesen Stapel mit allen Daten wirklich löschen?",
|
||||
"Link to a board" : "Mit einem Board verknüpfen",
|
||||
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
|
||||
"File already exists" : "Datei bereits vorhanden",
|
||||
"You have created a new board {board}" : "Sie haben das neue Board {board} erstellt",
|
||||
"{user} has created a new board {board}" : "{user} hat das neue Board {board} erstellt",
|
||||
"You have deleted the board {board}" : "Sie haben das Board {board} gelöscht",
|
||||
"{user} has deleted the board {board}" : "{user} hat das Board {board} gelöscht",
|
||||
"You have restored the board {board}" : "Sie haben das Board {board} wiederhergestellt",
|
||||
"{user} has restored the board {board}" : "{user} hat das Board {board} wiederhergestellt",
|
||||
"You have shared the board {board} with {acl}" : "Sie haben das Board {board} mit {acl} geteilt",
|
||||
"{user} has shared the board {board} with {sharee}" : "{user} hat das Board {board} mit {sharee} geteilt",
|
||||
"You have removed {acl} from the board {board}" : "Sie haben {acl} vom Board {board} entfernt",
|
||||
"{user} has removed {acl} from the board {board}" : "{user} hat {acl} vom Board {board} entfernt",
|
||||
"You have renamed the board {before} to {board}" : "Sie haben das Board {before} in {board} umbenannt",
|
||||
"{user} has renamed the board {before} to {board}" : "{user} hat das Board {before} in {board} umbenannt",
|
||||
"You have archived the board {board}" : "Sie haben das Board {board} archiviert",
|
||||
"{user} has archived the board {before}" : "{user} hat das Board {before} archiviert",
|
||||
"You have unarchived the board {board}" : "Sie haben das Board {board} dearchiviert",
|
||||
"{user} has unarchived the board {before}" : "{user} hat das Board {before} dearchiviert",
|
||||
"You have created a new stack {stack} on board {board}" : "Sie haben den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created a new stack {stack} on board {board}" : "{user} hat den neuen Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have renamed stack {before} to {stack} on board {board}" : "Sie haben den Stapel {before} auf dem Board {board} in {stack} umbenannt",
|
||||
"{user} has renamed stack {before} to {stack} on board {board}" : "{user} hat den Stapel {before} in {stack} auf dem Board {board} umbenannt",
|
||||
"You have deleted stack {stack} on board {board}" : "Sie haben den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted stack {stack} on board {board}" : "{user} hat den Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have created card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"{user} has created card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} erstellt",
|
||||
"You have deleted card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"{user} has deleted card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} gelöscht",
|
||||
"You have renamed the card {before} to {card}" : "Sie haben die Karte {before} in {card} umbenannt",
|
||||
"{user} has renamed the card {before} to {card}" : "{user} hat die Karte {before} in {card} umbenannt",
|
||||
"You have added a description to card {card} in stack {stack} on board {board}" : "Sie haben der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"{user} has added a description to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} eine Beschreibung hinzugefügt",
|
||||
"You have updated the description of card {card} in stack {stack} on board {board}" : "Sie haben die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"{user} has updated the description of the card {card} in stack {stack} on board {board}" : "{user} hat die Beschreibung der Karte {card} im Stapel {stack} auf dem Board {board} aktualisiert",
|
||||
"You have archived card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"{user} has archived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} archiviert",
|
||||
"You have unarchived card {card} in stack {stack} on board {board}" : "Sie haben die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"{user} has unarchived card {card} in stack {stack} on board {board}" : "{user} hat die Karte {card} im Stapel {stack} auf dem Board {board} dearchiviert",
|
||||
"You have removed the due date of card {card}" : "Sie haben das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"{user} has removed the due date of card {card}" : "{user} hat das Fälligkeitsdatum der Karte {card} entfernt",
|
||||
"You have set the due date of card {card} to {after}" : "Sie haben das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} gesetzt",
|
||||
"You have updated the due date of card {card} to {after}" : "Sie haben das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} hat das Fälligkeitsdatum der Karte {card} auf {after} aktualisiert",
|
||||
"You have added the tag {label} to card {card} in stack {stack} on board {board}" : "Sie haben der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"{user} has added the tag {label} to card {card} in stack {stack} on board {board}" : "{user} hat der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} hinzugefügt",
|
||||
"You have removed the tag {label} from card {card} in stack {stack} on board {board}" : "Sie haben von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"{user} has removed the tag {label} from card {card} in stack {stack} on board {board}" : "{user} hat von der Karte {card} im Stapel {stack} auf dem Board {board} das Schlagwort {label} entfernt",
|
||||
"You have assigned {assigneduser} to card {card} on board {board}" : "Sie haben {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} hat {assigneduser} der Karte {card} auf dem Board {board} zugewiesen",
|
||||
"You have unassigned {assigneduser} from card {card} on board {board}" : "Sie haben die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} hat die Zuweisung von {assigneduser} zur Karte {card} auf dem Board {board} aufgehoben",
|
||||
"You have moved the card {card} from stack {stackBefore} to {stack}" : "Sie haben die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"{user} has moved the card {card} from stack {stackBefore} to {stack}" : "{user} hat die Karte {card} vom Stapel {stackBefore} nach {stack} verschoben",
|
||||
"You have added the attachment {attachment} to card {card}" : "Sie haben den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"{user} has added the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} zur Karte {card} hinzugefügt",
|
||||
"You have updated the attachment {attachment} on card {card}" : "Sie haben den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"{user} has updated the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} aktualisiert",
|
||||
"You have deleted the attachment {attachment} from card {card}" : "Sie haben den Anhang {attachment} von der Karte {card} entfernt",
|
||||
"{user} has deleted the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} von Karte {card} entfernt",
|
||||
"You have restored the attachment {attachment} to card {card}" : "Sie haben den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} hat den Anhang {attachment} der Karte {card} wiederhergestellt",
|
||||
"You have commented on card {card}" : "Sie haben die Karte {card} kommentiert",
|
||||
"{user} has commented on card {card}" : "{user} hat die Karte {card} kommentiert",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Eine <strong>Kartenbeschreibung</strong> wurde innerhalb der Deck-App geändert",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "Änderungen in der <strong>Deck-App</strong>",
|
||||
"Personal" : "Persönlich",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Die Karte \"%s\" auf \"%s\" wurde Ihnen von %s zugewiesen.",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} hat Ihnen die Karte \"%s\" auf \"%s\" zugewiesen.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s hat Sie in einem Kommentar zu \"%s\" erwähnt.",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} hat Sie in einem Kommentar zu \"%s\" erwähnt.",
|
||||
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Ihnen geteilt.",
|
||||
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Ihnen geteilt.",
|
||||
"No data was provided to create an attachment." : "Es wurden keine Daten zum Erstellen eines Anhangs bereitgestellt.",
|
||||
"Finished" : "Abgeschlossen",
|
||||
"To review" : "Zu überprüfen",
|
||||
"Action needed" : "Handlung erforderlich",
|
||||
"Later" : "Später",
|
||||
"To do" : "Offen",
|
||||
"Doing" : "In Arbeit",
|
||||
"Done" : "Erledigt",
|
||||
"Example Task 3" : "Beispielaufgabe 3",
|
||||
"Example Task 2" : "Beispielaufgabe 2",
|
||||
"Example Task 1" : "Beispielaufgabe 1",
|
||||
"The file was uploaded" : "Die Datei wurde hochgeladen",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe erlaubt, die im HTML-Formular spezifiziert ist",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
|
||||
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
|
||||
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
|
||||
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
|
||||
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
|
||||
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
|
||||
"No file uploaded" : "Keine Datei hochgeladen",
|
||||
"Deck" : "Deck",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werzeug für Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie sie ein.\n📄 Zusätzliche Hinweise in der Abschrift notieren\n🔖 Vergabe von Labels für noch bessere Organisation\n👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n🚀 Organisieren Sie Ihr Projekt",
|
||||
"Add a new stack" : "Neuen Stapel hinzufügen",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werkzeug für Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Zuweisung von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 📎 Fügen Sie Dateien hinzu und verwende diese in Ihren Markdown-Beschreibungen\n- 💬 Diskutieren Sie mit Ihrem Team mit Kommentaren\n- ⚡ Behalten Sie Überblick über Änderungen mit dem Aktivitäten-Stream\n- 🚀 Organisieren Sie Ihr Projekt",
|
||||
"Select the board to link to a project" : "Wählen Sie ein Board aus, um dieses mit einem Projekt zu verknüpfen",
|
||||
"Select board" : "Board auswählen",
|
||||
"Add a new stack" : "Neuer Stapel",
|
||||
"Submit" : "Übermitteln",
|
||||
"Show archived cards" : "Archivierte Karten anzeigen",
|
||||
"Hide archived cards" : "Archivierte Karten ausblenden",
|
||||
"Board details" : "Board-Details",
|
||||
"Toggle compact mode" : "Kompaktmodus umschalten",
|
||||
"Show board details" : "Board-Details anzeigen",
|
||||
"All Boards" : "Alle Boards",
|
||||
"Archived boards" : "Archivierte Boards",
|
||||
"Share board" : "Board freigeben",
|
||||
"Archived cards" : "Archivierte Karten",
|
||||
"Actions" : "Aktionen",
|
||||
"Drop your files here to upload it to the card" : "Legen Sie Ihre Dateien hier ab, um sie auf die Karte hochzuladen",
|
||||
"Archive" : "Archivieren",
|
||||
"Unarchive" : "Dearchivieren",
|
||||
"Assign card to me" : "Karte mir zuweisen",
|
||||
"Unassign card from me" : "Karte nicht mir zuweisen",
|
||||
"Archive card" : "Karte archivieren",
|
||||
"Unarchive card" : "Karte dearchivieren",
|
||||
"Delete card" : "Karte löschen",
|
||||
"Enter a card title" : "Kartentitel eingeben",
|
||||
"Add card" : "Karte hinzufügen",
|
||||
"Close" : "Schließen",
|
||||
"Sharing" : "Teilen",
|
||||
"Tags" : "Schlagworte",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
|
||||
"Access for" : "Zugriff für",
|
||||
"Deleted items" : "Gelöschte Objekte",
|
||||
"Timeline" : "Zeitachse",
|
||||
"Select users or groups to share with" : "Benutzer oder Gruppen zum Teilen auswählen",
|
||||
"Group" : "Gruppe",
|
||||
"Circle" : "Kreis",
|
||||
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
|
||||
"Loading" : "Lade",
|
||||
"Share" : "Teilen",
|
||||
"Edit" : "Bearbeiten",
|
||||
"Share" : "Teilen",
|
||||
"Manage" : "Verwalten",
|
||||
"Discard share" : "Teilen beenden",
|
||||
"Update" : "Aktualisieren",
|
||||
"Sharing has been disabled for your account." : "Teilen wurde für Ihr Konto deaktiviert.",
|
||||
"Update tag" : "Schlagwort aktualisieren",
|
||||
"Edit tag" : "Schlagwort bearbeiten",
|
||||
"Delete tag" : "Schlagwort löschen",
|
||||
"Create" : "Erstellen",
|
||||
"Create a new tag" : "Tag erstellen",
|
||||
"Create a new tag" : "Neues Schlagwort",
|
||||
"Deleted stacks" : "Gelöschte Stapel",
|
||||
"Deleted cards" : "Gelöschte Karten",
|
||||
"Status" : "Status",
|
||||
"No archived boards to display" : "Keine archivierten Boards zum Anzeigen",
|
||||
"No shared boards to display" : "Keine geteilten Boards zum Anzeigen",
|
||||
"Title" : "Titel",
|
||||
"Members" : "Mitglieder",
|
||||
"More actions" : "Weitere Aktionen",
|
||||
@@ -58,37 +158,43 @@
|
||||
"Archive board" : "Board archivieren",
|
||||
"Unarchive board" : "Board dearchivieren",
|
||||
"Delete board" : "Board löschen",
|
||||
"Reset" : "Zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board erstellen",
|
||||
"New board title" : "Neuer Board-Titel",
|
||||
"Select an attachment" : "Wählen Sie einen Anhang",
|
||||
"Update board" : "Board aktualisieren",
|
||||
"Reset board" : "Board zurücksetzen",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - andernfalls wird das Board beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Create new board" : "Neues Board",
|
||||
"New board title" : "Board-Titel",
|
||||
"Create board" : "Neues Board",
|
||||
"Select an attachment" : "Anhang auswählen",
|
||||
"Cancel upload" : "Hochladen abbrechen",
|
||||
"by" : "von",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten Cronjob-Lauf gelöscht.",
|
||||
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - andernfalls wird die Datei beim nächsten Cron-Job-Lauf gelöscht.",
|
||||
"Undo file deletion" : "Dateilöschung rückgängig machen",
|
||||
"Insert the file into the description" : "Fügen Sie die Datei in die Beschreibung ein",
|
||||
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
|
||||
"Delete attachment" : "Anhang löschen",
|
||||
"Modified:" : "Geändert:",
|
||||
"Created:" : "Erstellt:",
|
||||
"Choose a tag" : "Schlagwort auswählen",
|
||||
"Add a tag" : "Schlagwort hinzufügen",
|
||||
"Select tags" : "Schlagworte auswählen",
|
||||
"Assign users" : "Benutzer zuordnen",
|
||||
"Choose a user to assign" : "Wählen Sie einen Benutzer zum Zuweisen",
|
||||
"Assign this card to a user" : "Diese Karte einem Benutzer zuordnen",
|
||||
"Due date" : "Zieltermin",
|
||||
"Assign users" : "Benutzer zuweisen",
|
||||
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
|
||||
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
|
||||
"Due date" : "Fälligkeitsdatum",
|
||||
"Click to set" : "Setzen",
|
||||
"Remove due date" : "Zieltermin entfernen",
|
||||
"Remove due date" : "Fälligkeitsdatum entfernen",
|
||||
"Description" : "Beschreibung",
|
||||
"Attachments" : "Anhänge",
|
||||
"Saved" : "Gespeichert",
|
||||
"Unsaved changes" : "Ungesicherte Änderungen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Formatting help" : "Formatierungshilfe",
|
||||
"Upload attachment" : "Anhang hochladen",
|
||||
"Insert attachment" : "Anhang einfügen",
|
||||
"Add a card description…" : "Beschreibung hinzufügen…",
|
||||
"Shared boards" : "Geteilte Boards",
|
||||
"View more" : "Mehr anzeigen",
|
||||
"Move board to archive" : "Board ins Archiv verschieben",
|
||||
"Create a new board" : "Neues Board erstellen"
|
||||
"Create a new board" : "Neues Board",
|
||||
"Settings" : "Einstellungen",
|
||||
"Limit deck to groups" : "Deck auf Gruppen beschränken",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Durch die Begrenzung von Deck werden Benutzer, die nicht Teil dieser Gruppen sind, daran gehindert, eigene Boards zu erstellen. Benutzer können weiterhin an Boards arbeiten, die für sie freigegeben wurden."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
18
l10n/el.js
@@ -1,39 +1,39 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Are you sure you want to delete this card with all of its data?" : "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κάρτα με όλα τα δεδομένα της;",
|
||||
"Delete" : "Διαγραφή",
|
||||
"Remove user from card" : "Αφαίρεση χρήστη από την κάρτα",
|
||||
"Hours" : "Ώρες",
|
||||
"Minutes" : "Λεπτά",
|
||||
"Deck" : "Deck",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η κάρτα \"1%s\" στο \"1%s\" έχει λήξει.",
|
||||
"Finished" : "Ολοκληρώθηκε",
|
||||
"To review" : "Προς επισκόπηση",
|
||||
"Action needed" : "Απαιτείται ενέργεια",
|
||||
"Later" : "Αργότερα",
|
||||
"Deck" : "Deck",
|
||||
"Done" : "Ολοκληρώθηκε",
|
||||
"Add a new stack" : "Πρόσθεσε νέα συστοιχία",
|
||||
"Submit" : "Υποβολή",
|
||||
"Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν",
|
||||
"Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν",
|
||||
"Board details" : "Λεπτομέριες πίνακα",
|
||||
"All Boards" : "Όλοι οι πίνακες",
|
||||
"Archived boards" : "Αρχειοθέτηση πινάκων ",
|
||||
"Archive" : "Αρχειοθέτηση",
|
||||
"Unarchive" : "Αναίρεση αρχειοθέτησης",
|
||||
"Delete card" : "Διαγραφή κάρτας",
|
||||
"Enter a card title" : "Καταχωρίστε έναν τίτλο κάρτας",
|
||||
"Add card" : "Προσθήκη κάρτας",
|
||||
"Close" : "Κλείσιμο",
|
||||
"Sharing" : "Διαμοιρασμός",
|
||||
"Tags" : "Ετικέτες",
|
||||
"Deleted items" : "Διαγραμμένα αντικείμενα",
|
||||
"Timeline" : "Χρονοδιάγραμμα",
|
||||
"Select users or groups to share with" : "Επιλέξτε χρήστες ή ομάδες με τις οποίες θα μοιραστείτε",
|
||||
"No matching user or group found." : "Δεν βρέθηκε χρήστης ή ομάδα να ταιριάζει.",
|
||||
"Loading" : "Γίνεται φόρτωση",
|
||||
"Share" : "Διαμοιρασμός",
|
||||
"Edit" : "Επεξεργασία",
|
||||
"Share" : "Διαμοιρασμός",
|
||||
"Manage" : "Διαχείριση",
|
||||
"Discard share" : "Απόρριψη διαμοιρασμού",
|
||||
"Update" : "Ενημέρωση",
|
||||
"Edit tag" : "Επεξεργασία ετικέτας",
|
||||
"Delete tag" : "Διαγραφή ετικέτας",
|
||||
"Create" : "Δημιουργία",
|
||||
"Create a new tag" : "Δημιούργησε νέα ετικέτα",
|
||||
"Title" : "Τίτλος",
|
||||
@@ -46,6 +46,7 @@ OC.L10N.register(
|
||||
"Create new board" : "Δημιουργία νέου πίνακα",
|
||||
"New board title" : "Νέος τίτλος πίνακα",
|
||||
"by" : "από",
|
||||
"Delete attachment" : "Διαγραφή συνημμένου",
|
||||
"Modified:" : "Τροποποιήθηκε:",
|
||||
"Created:" : "Δημιουργήθηκε:",
|
||||
"Due date" : "Ημερομηνία λήξης",
|
||||
@@ -56,7 +57,6 @@ OC.L10N.register(
|
||||
"Formatting help" : "Βοήθεια μορφοποίησης",
|
||||
"Add a card description…" : "Προσθήκη περιγραφής κάρτας...",
|
||||
"Shared boards" : "Διαμοιρασμένοι πίνακες",
|
||||
"View more" : "Προβολή περισσοτέρων",
|
||||
"Move board to archive" : "Μετακίνηση πίνακα στην αρχειοθήκη",
|
||||
"Create a new board" : "Δημιουργία νέου πίνακα"
|
||||
},
|
||||
|
||||
18
l10n/el.json
@@ -1,37 +1,37 @@
|
||||
{ "translations": {
|
||||
"Are you sure you want to delete this card with all of its data?" : "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κάρτα με όλα τα δεδομένα της;",
|
||||
"Delete" : "Διαγραφή",
|
||||
"Remove user from card" : "Αφαίρεση χρήστη από την κάρτα",
|
||||
"Hours" : "Ώρες",
|
||||
"Minutes" : "Λεπτά",
|
||||
"Deck" : "Deck",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η κάρτα \"1%s\" στο \"1%s\" έχει λήξει.",
|
||||
"Finished" : "Ολοκληρώθηκε",
|
||||
"To review" : "Προς επισκόπηση",
|
||||
"Action needed" : "Απαιτείται ενέργεια",
|
||||
"Later" : "Αργότερα",
|
||||
"Deck" : "Deck",
|
||||
"Done" : "Ολοκληρώθηκε",
|
||||
"Add a new stack" : "Πρόσθεσε νέα συστοιχία",
|
||||
"Submit" : "Υποβολή",
|
||||
"Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν",
|
||||
"Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν",
|
||||
"Board details" : "Λεπτομέριες πίνακα",
|
||||
"All Boards" : "Όλοι οι πίνακες",
|
||||
"Archived boards" : "Αρχειοθέτηση πινάκων ",
|
||||
"Archive" : "Αρχειοθέτηση",
|
||||
"Unarchive" : "Αναίρεση αρχειοθέτησης",
|
||||
"Delete card" : "Διαγραφή κάρτας",
|
||||
"Enter a card title" : "Καταχωρίστε έναν τίτλο κάρτας",
|
||||
"Add card" : "Προσθήκη κάρτας",
|
||||
"Close" : "Κλείσιμο",
|
||||
"Sharing" : "Διαμοιρασμός",
|
||||
"Tags" : "Ετικέτες",
|
||||
"Deleted items" : "Διαγραμμένα αντικείμενα",
|
||||
"Timeline" : "Χρονοδιάγραμμα",
|
||||
"Select users or groups to share with" : "Επιλέξτε χρήστες ή ομάδες με τις οποίες θα μοιραστείτε",
|
||||
"No matching user or group found." : "Δεν βρέθηκε χρήστης ή ομάδα να ταιριάζει.",
|
||||
"Loading" : "Γίνεται φόρτωση",
|
||||
"Share" : "Διαμοιρασμός",
|
||||
"Edit" : "Επεξεργασία",
|
||||
"Share" : "Διαμοιρασμός",
|
||||
"Manage" : "Διαχείριση",
|
||||
"Discard share" : "Απόρριψη διαμοιρασμού",
|
||||
"Update" : "Ενημέρωση",
|
||||
"Edit tag" : "Επεξεργασία ετικέτας",
|
||||
"Delete tag" : "Διαγραφή ετικέτας",
|
||||
"Create" : "Δημιουργία",
|
||||
"Create a new tag" : "Δημιούργησε νέα ετικέτα",
|
||||
"Title" : "Τίτλος",
|
||||
@@ -44,6 +44,7 @@
|
||||
"Create new board" : "Δημιουργία νέου πίνακα",
|
||||
"New board title" : "Νέος τίτλος πίνακα",
|
||||
"by" : "από",
|
||||
"Delete attachment" : "Διαγραφή συνημμένου",
|
||||
"Modified:" : "Τροποποιήθηκε:",
|
||||
"Created:" : "Δημιουργήθηκε:",
|
||||
"Due date" : "Ημερομηνία λήξης",
|
||||
@@ -54,7 +55,6 @@
|
||||
"Formatting help" : "Βοήθεια μορφοποίησης",
|
||||
"Add a card description…" : "Προσθήκη περιγραφής κάρτας...",
|
||||
"Shared boards" : "Διαμοιρασμένοι πίνακες",
|
||||
"View more" : "Προβολή περισσοτέρων",
|
||||
"Move board to archive" : "Μετακίνηση πίνακα στην αρχειοθήκη",
|
||||
"Create a new board" : "Δημιουργία νέου πίνακα"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
OC.L10N.register(
|
||||
"deck",
|
||||
{
|
||||
"Are you sure you want to delete this card with all of its data?" : "Are you sure you want to delete this card with all of its data?",
|
||||
"Delete" : "Delete",
|
||||
"Please provide a content for your comment." : "Please provide a content for your comment.",
|
||||
"Posting the comment failed." : "Posting the comment failed.",
|
||||
"Remove user from card" : "Remove user from card",
|
||||
"Hours" : "Hours",
|
||||
"Minutes" : "Minutes",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Are you sure you want to delete the stack with all of its data?",
|
||||
"Deck" : "Deck",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.",
|
||||
"The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.",
|
||||
"{user} has shared the board %s with you." : "{user} has shared the board %s with you.",
|
||||
@@ -14,32 +14,25 @@ OC.L10N.register(
|
||||
"To review" : "To review",
|
||||
"Action needed" : "Action needed",
|
||||
"Later" : "Later",
|
||||
"Deck" : "Deck",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "A kanban style project and personal management tool for Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organisation for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organised",
|
||||
"Add a new stack" : "Add a new stack",
|
||||
"Submit" : "Submit",
|
||||
"Show archived cards" : "Show archived cards",
|
||||
"Hide archived cards" : "Hide archived cards",
|
||||
"Board details" : "Board details",
|
||||
"All Boards" : "All Boards",
|
||||
"Archived boards" : "Archived boards",
|
||||
"Archive" : "Archive",
|
||||
"Unarchive" : "Unarchive",
|
||||
"Enter a card title" : "Enter a card title",
|
||||
"Add card" : "Add card",
|
||||
"Close" : "Close",
|
||||
"Sharing" : "Sharing",
|
||||
"Tags" : "Tags",
|
||||
"Select users or groups to share with" : "Select users or groups to share with",
|
||||
"Access for" : "Access for",
|
||||
"No matching user or group found." : "No matching user or group found.",
|
||||
"Loading" : "Loading",
|
||||
"Share" : "Share",
|
||||
"Edit" : "Edit",
|
||||
"Share" : "Share",
|
||||
"Manage" : "Manage",
|
||||
"Discard share" : "Discard share",
|
||||
"Update" : "Update",
|
||||
"Create" : "Create",
|
||||
"Create a new tag" : "Create a new tag",
|
||||
"Status" : "Status",
|
||||
@@ -50,7 +43,6 @@ OC.L10N.register(
|
||||
"Archive board" : "Archive board",
|
||||
"Unarchive board" : "Unarchive board",
|
||||
"Delete board" : "Delete board",
|
||||
"Reset" : "Reset",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Undo board deletion - Otherwise the board will be deleted during the next cronjob run.",
|
||||
"Create new board" : "Create new board",
|
||||
"New board title" : "New board title",
|
||||
@@ -72,7 +64,6 @@ OC.L10N.register(
|
||||
"Formatting help" : "Formatting help",
|
||||
"Add a card description…" : "Add a card description…",
|
||||
"Shared boards" : "Shared boards",
|
||||
"View more" : "View more",
|
||||
"Move board to archive" : "Move board to archive",
|
||||
"Create a new board" : "Create a new board"
|
||||
},
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{ "translations": {
|
||||
"Are you sure you want to delete this card with all of its data?" : "Are you sure you want to delete this card with all of its data?",
|
||||
"Delete" : "Delete",
|
||||
"Please provide a content for your comment." : "Please provide a content for your comment.",
|
||||
"Posting the comment failed." : "Posting the comment failed.",
|
||||
"Remove user from card" : "Remove user from card",
|
||||
"Hours" : "Hours",
|
||||
"Minutes" : "Minutes",
|
||||
"Are you sure you want to delete the stack with all of its data?" : "Are you sure you want to delete the stack with all of its data?",
|
||||
"Deck" : "Deck",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.",
|
||||
"The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.",
|
||||
"{user} has shared the board %s with you." : "{user} has shared the board %s with you.",
|
||||
@@ -12,32 +12,25 @@
|
||||
"To review" : "To review",
|
||||
"Action needed" : "Action needed",
|
||||
"Later" : "Later",
|
||||
"Deck" : "Deck",
|
||||
"A kanban style project and personal management tool for Nextcloud" : "A kanban style project and personal management tool for Nextcloud",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organisation for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organised",
|
||||
"Add a new stack" : "Add a new stack",
|
||||
"Submit" : "Submit",
|
||||
"Show archived cards" : "Show archived cards",
|
||||
"Hide archived cards" : "Hide archived cards",
|
||||
"Board details" : "Board details",
|
||||
"All Boards" : "All Boards",
|
||||
"Archived boards" : "Archived boards",
|
||||
"Archive" : "Archive",
|
||||
"Unarchive" : "Unarchive",
|
||||
"Enter a card title" : "Enter a card title",
|
||||
"Add card" : "Add card",
|
||||
"Close" : "Close",
|
||||
"Sharing" : "Sharing",
|
||||
"Tags" : "Tags",
|
||||
"Select users or groups to share with" : "Select users or groups to share with",
|
||||
"Access for" : "Access for",
|
||||
"No matching user or group found." : "No matching user or group found.",
|
||||
"Loading" : "Loading",
|
||||
"Share" : "Share",
|
||||
"Edit" : "Edit",
|
||||
"Share" : "Share",
|
||||
"Manage" : "Manage",
|
||||
"Discard share" : "Discard share",
|
||||
"Update" : "Update",
|
||||
"Create" : "Create",
|
||||
"Create a new tag" : "Create a new tag",
|
||||
"Status" : "Status",
|
||||
@@ -48,7 +41,6 @@
|
||||
"Archive board" : "Archive board",
|
||||
"Unarchive board" : "Unarchive board",
|
||||
"Delete board" : "Delete board",
|
||||
"Reset" : "Reset",
|
||||
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Undo board deletion - Otherwise the board will be deleted during the next cronjob run.",
|
||||
"Create new board" : "Create new board",
|
||||
"New board title" : "New board title",
|
||||
@@ -70,7 +62,6 @@
|
||||
"Formatting help" : "Formatting help",
|
||||
"Add a card description…" : "Add a card description…",
|
||||
"Shared boards" : "Shared boards",
|
||||
"View more" : "View more",
|
||||
"Move board to archive" : "Move board to archive",
|
||||
"Create a new board" : "Create a new board"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
|
||||