mirror of
https://github.com/TracksApp/tracks.git
synced 2025-09-22 05:50:47 +02:00
Compare commits
511 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
97220798db | ||
![]() |
bebdcb233c | ||
![]() |
52c9a50f16 | ||
![]() |
6e0cb8125d | ||
![]() |
1d483148d7 | ||
![]() |
d397e7be97 | ||
![]() |
8a8a816645 | ||
![]() |
36cba2fffc | ||
![]() |
02ca81f761 | ||
![]() |
f8966fb48f | ||
![]() |
a121b6381d | ||
![]() |
d670a70ede | ||
![]() |
21e27915a6 | ||
![]() |
2691d18cdb | ||
![]() |
4ffdf00dca | ||
![]() |
889540cc94 | ||
![]() |
ea70f0a13b | ||
![]() |
3b2c26478f | ||
![]() |
a2d86b5d6c | ||
![]() |
86a0ace6b9 | ||
![]() |
18e9fb7b0c | ||
![]() |
a3e23ef9ed | ||
![]() |
4cf825cb83 | ||
![]() |
c684b1ce19 | ||
![]() |
86b982df8e | ||
![]() |
c1dd33975b | ||
![]() |
661ef20c5f | ||
![]() |
ab640a8f46 | ||
![]() |
8a50b67edd | ||
![]() |
61841c1f14 | ||
![]() |
e7aace3cac | ||
![]() |
160b9a7ab5 | ||
![]() |
2f5451a713 | ||
![]() |
42e397d028 | ||
![]() |
edf145f366 | ||
![]() |
82e49bd00b | ||
![]() |
e3a26f9396 | ||
![]() |
3fbf0b07f5 | ||
![]() |
4bbc809a1c | ||
![]() |
a185b2c0f8 | ||
![]() |
3ccd2345ba | ||
![]() |
95597a969c | ||
![]() |
4f6d806724 | ||
![]() |
63d2060dc1 | ||
![]() |
2eb54b1c3e | ||
![]() |
36b47125ef | ||
![]() |
d51432d09b | ||
![]() |
46a6cd716b | ||
![]() |
1a9ffd96d3 | ||
![]() |
eecd15b150 | ||
![]() |
7b6f7fe8bb | ||
![]() |
2f6dd0f808 | ||
![]() |
8a8bdfe732 | ||
![]() |
db41886954 | ||
![]() |
77d12853c1 | ||
![]() |
19c8fcc0d9 | ||
![]() |
b97aa8fd4e | ||
![]() |
fc2a8bb8f3 | ||
![]() |
70c5ba94df | ||
![]() |
761ec11e07 | ||
![]() |
c69811e19c | ||
![]() |
3fbe3b2c90 | ||
![]() |
8868c389af | ||
![]() |
23223dea9b | ||
![]() |
674e24ea62 | ||
![]() |
3e07e27099 | ||
![]() |
c43cd6cb16 | ||
![]() |
7ed9f2ca3d | ||
![]() |
b32cb2090e | ||
![]() |
2094826d2f | ||
![]() |
4f94e2dfc2 | ||
![]() |
13bdef74b3 | ||
![]() |
3fc943ce2a | ||
![]() |
e77b83683a | ||
![]() |
854034c554 | ||
![]() |
7d9c5786be | ||
![]() |
fa7d213ca7 | ||
![]() |
da726b1700 | ||
![]() |
ffa79f2820 | ||
![]() |
6d5f269d77 | ||
![]() |
2144160ec5 | ||
![]() |
41f7a86bba | ||
![]() |
03dc26c06e | ||
![]() |
10bb9e86ac | ||
![]() |
4863c82469 | ||
![]() |
3a8988ac74 | ||
![]() |
5484a4c894 | ||
![]() |
ecaed7bca7 | ||
![]() |
69d3ea5f30 | ||
![]() |
fb38741fa2 | ||
![]() |
cb9fc6900d | ||
![]() |
ad356a9a01 | ||
![]() |
b27cf9f533 | ||
![]() |
7d96e9b0cf | ||
![]() |
0487c9f17c | ||
![]() |
4e6d8396ad | ||
![]() |
c8c48306ea | ||
![]() |
87a2fca247 | ||
![]() |
9d737b57f4 | ||
![]() |
2431cdef3b | ||
![]() |
f64445cd33 | ||
![]() |
0d2223ef52 | ||
![]() |
29ce045f15 | ||
![]() |
dd406ad6cc | ||
![]() |
c5e27b3c5a | ||
![]() |
57cc1185f4 | ||
![]() |
1d1bc3b71e | ||
![]() |
fbd888c200 | ||
![]() |
186901cf32 | ||
![]() |
9a2e947173 | ||
![]() |
692b6bf653 | ||
![]() |
976ad893e7 | ||
![]() |
fe2befc72e | ||
![]() |
846494843b | ||
![]() |
57aa499027 | ||
![]() |
3221f1c194 | ||
![]() |
61b9c93a7d | ||
![]() |
1ca43b8ee5 | ||
![]() |
9742bfc338 | ||
![]() |
39ab8dddcf | ||
![]() |
450db54865 | ||
![]() |
f960c1939e | ||
![]() |
308410ea71 | ||
![]() |
d946081e0f | ||
![]() |
c56db12281 | ||
![]() |
a5e5d0934f | ||
![]() |
3077578e6b | ||
![]() |
2e82791887 | ||
![]() |
5b49f9e704 | ||
![]() |
a746dd31d3 | ||
![]() |
b3754f2ee6 | ||
![]() |
5243a0a092 | ||
![]() |
5682a380f3 | ||
![]() |
477dd9737f | ||
![]() |
4b043968ad | ||
![]() |
ecccf02cc9 | ||
![]() |
9290e32739 | ||
![]() |
df1e9a064a | ||
![]() |
e4b366494d | ||
![]() |
cfaa0a00be | ||
![]() |
06000a0aab | ||
![]() |
894e497e88 | ||
![]() |
6eef42d569 | ||
![]() |
0616dc41a7 | ||
![]() |
7be0e4286a | ||
![]() |
1438f25b79 | ||
![]() |
89a464d9ea | ||
![]() |
8e85af75e8 | ||
![]() |
322d2b62d8 | ||
![]() |
6844679547 | ||
![]() |
2204b2c246 | ||
![]() |
87950c6500 | ||
![]() |
e829daca1e | ||
![]() |
e4f3fd0737 | ||
![]() |
24c4634a7b | ||
![]() |
e70a569511 | ||
![]() |
e81919888e | ||
![]() |
d9854e1a4e | ||
![]() |
8abfafa0c6 | ||
![]() |
efea77c9cb | ||
![]() |
96712ee99c | ||
![]() |
a79660299a | ||
![]() |
5f456d5300 | ||
![]() |
fac04ee0c1 | ||
![]() |
d9f254e2c5 | ||
![]() |
10a6ebcb41 | ||
![]() |
36529c50b3 | ||
![]() |
75420d9c38 | ||
![]() |
b0d288d2ef | ||
![]() |
6a4a72270e | ||
![]() |
d64e1a0fa4 | ||
![]() |
c23ca0574e | ||
![]() |
c7d81bb79f | ||
![]() |
784f8c3009 | ||
![]() |
0fc66953c0 | ||
![]() |
49fa90c7a6 | ||
![]() |
31f35f50c7 | ||
![]() |
a984011ddc | ||
![]() |
22f42211b0 | ||
![]() |
92348f9bc5 | ||
![]() |
0d2d89780b | ||
![]() |
3fcdb41fa9 | ||
![]() |
a9a978c1f8 | ||
![]() |
e1c5fbbbc2 | ||
![]() |
36f139d879 | ||
![]() |
11a1a6a58e | ||
![]() |
62ad2f7f0b | ||
![]() |
a0999e3e45 | ||
![]() |
76d3083e8f | ||
![]() |
50f5a946d4 | ||
![]() |
13d7a711a4 | ||
![]() |
55050af2cb | ||
![]() |
f5f0193b60 | ||
![]() |
ad87729e31 | ||
![]() |
f097a1f5e9 | ||
![]() |
2bf2f9476a | ||
![]() |
7b9a1e322f | ||
![]() |
d2fff6a64c | ||
![]() |
8f7b1ab7b2 | ||
![]() |
0968152c5a | ||
![]() |
7a64917647 | ||
![]() |
8464d0c60e | ||
![]() |
212b2dc20c | ||
![]() |
75a88f2955 | ||
![]() |
ff5adc5696 | ||
![]() |
5940fe10a6 | ||
![]() |
11ef1b6f6b | ||
![]() |
a66dca4a6b | ||
![]() |
2726abb8ea | ||
![]() |
2108b203a6 | ||
![]() |
78ab8b0ff2 | ||
![]() |
713c89c6e0 | ||
![]() |
38db8f983d | ||
![]() |
720cb02697 | ||
![]() |
867f1bc5d1 | ||
![]() |
b280485ef2 | ||
![]() |
54ed7d118b | ||
![]() |
f20aa13b7b | ||
![]() |
247caf6e98 | ||
![]() |
1d79436a52 | ||
![]() |
29a8c3dff8 | ||
![]() |
167274a6da | ||
![]() |
b274c270f1 | ||
![]() |
d5235e8c61 | ||
![]() |
6274e9e1d3 | ||
![]() |
fcdc464725 | ||
![]() |
8ed97a511d | ||
![]() |
d26275c5e9 | ||
![]() |
10ad112b70 | ||
![]() |
98e57367e9 | ||
![]() |
ddf0260a03 | ||
![]() |
2214c18d9f | ||
![]() |
0eaa0d65c1 | ||
![]() |
fa8be2a238 | ||
![]() |
fd76ff273a | ||
![]() |
f024ff7650 | ||
![]() |
3a0ddc0c02 | ||
![]() |
495d84adb7 | ||
![]() |
2d5aba6ad0 | ||
![]() |
1e86b123cc | ||
![]() |
03c85842db | ||
![]() |
9ba1f7a5e3 | ||
![]() |
180af5c752 | ||
![]() |
1e1fcd20a1 | ||
![]() |
d056abbc3a | ||
![]() |
445ad25571 | ||
![]() |
a910eaf436 | ||
![]() |
e9f9d8fa5c | ||
![]() |
c27c517648 | ||
![]() |
bbff8d2d07 | ||
![]() |
b01f46e412 | ||
![]() |
781ae2de5c | ||
![]() |
3150420940 | ||
![]() |
085faab554 | ||
![]() |
05854c6560 | ||
![]() |
80c3b22e04 | ||
![]() |
86b0a7aa95 | ||
![]() |
aefa65a4b4 | ||
![]() |
fcff755284 | ||
![]() |
753d230259 | ||
![]() |
8f4a0f475f | ||
![]() |
12d7b7911c | ||
![]() |
b79c983f36 | ||
![]() |
974af02dbf | ||
![]() |
ddd8cb8f29 | ||
![]() |
1be3c27165 | ||
![]() |
063c8bd786 | ||
![]() |
a94d4fa00b | ||
![]() |
86e36b07a6 | ||
![]() |
7f567862d7 | ||
![]() |
9e662428b8 | ||
![]() |
2f32ba5595 | ||
![]() |
cecdac6af7 | ||
![]() |
9e7010b6fb | ||
![]() |
444fa0dfff | ||
![]() |
9fe75adca3 | ||
![]() |
2360a4ba4e | ||
![]() |
662782ec46 | ||
![]() |
97da4df7cb | ||
![]() |
03bc9a4dda | ||
![]() |
099a0ff886 | ||
![]() |
f76a00f261 | ||
![]() |
7584d4f051 | ||
![]() |
a9a54f76bf | ||
![]() |
6ead4c0307 | ||
![]() |
7eb80fb1a1 | ||
![]() |
f405861c60 | ||
![]() |
101c97ddff | ||
![]() |
7c5aaa9594 | ||
![]() |
010eb00f8e | ||
![]() |
f5f82bb250 | ||
![]() |
3d45c7dbae | ||
![]() |
1b1e3c5322 | ||
![]() |
7b84dadd87 | ||
![]() |
4b8dbe4a8c | ||
![]() |
ebb4e63fb2 | ||
![]() |
854cac6acf | ||
![]() |
e01d52756c | ||
![]() |
7ec8279178 | ||
![]() |
f81137591f | ||
![]() |
01b63e6c18 | ||
![]() |
a8ca55389b | ||
![]() |
b6797bf67c | ||
![]() |
d98f173aa5 | ||
![]() |
61a4de71ac | ||
![]() |
d64e3fb96d | ||
![]() |
6f8bf1db4e | ||
![]() |
e97f74041c | ||
![]() |
fbc0c4f39a | ||
![]() |
e454fc21ce | ||
![]() |
c8ddc60f0c | ||
![]() |
c214037b9a | ||
![]() |
12afa11429 | ||
![]() |
471f07bf46 | ||
![]() |
cc7dcee618 | ||
![]() |
31b46825de | ||
![]() |
f5000acb43 | ||
![]() |
c58a16106e | ||
![]() |
10ff863c38 | ||
![]() |
33ac82c262 | ||
![]() |
77af1b4148 | ||
![]() |
6345d3c643 | ||
![]() |
bb9baae664 | ||
![]() |
92c0fd2c7c | ||
![]() |
282510a7e7 | ||
![]() |
5aa51245ed | ||
![]() |
e66e782a96 | ||
![]() |
d4f7457cf4 | ||
![]() |
c278640525 | ||
![]() |
bda9bde5e1 | ||
![]() |
53d69fcb02 | ||
![]() |
e9b44f6370 | ||
![]() |
706832cc78 | ||
![]() |
596b700c7f | ||
![]() |
5537de25ef | ||
![]() |
beaf5b9064 | ||
![]() |
6d92f273a6 | ||
![]() |
1342be9697 | ||
![]() |
2ad4631ae6 | ||
![]() |
c87abb62d0 | ||
![]() |
c0cdc19a37 | ||
![]() |
2ca6b731f0 | ||
![]() |
13603eff68 | ||
![]() |
97a5f622f1 | ||
![]() |
f295bfd023 | ||
![]() |
140d804745 | ||
![]() |
5863dd47d5 | ||
![]() |
1a293ea325 | ||
![]() |
11895a160a | ||
![]() |
0164195ae9 | ||
![]() |
a55d4500a0 | ||
![]() |
399f6cfbcf | ||
![]() |
452c12b38f | ||
![]() |
5d5b552685 | ||
![]() |
1cc50d071b | ||
![]() |
3d21e2a415 | ||
![]() |
a57843ec36 | ||
![]() |
d62cd4fc90 | ||
![]() |
fae82f91b6 | ||
![]() |
69e254c4e2 | ||
![]() |
a385d82626 | ||
![]() |
76050612ea | ||
![]() |
b2c40534b6 | ||
![]() |
d2cfb7e7f9 | ||
![]() |
e088e63cb9 | ||
![]() |
67f07ec0c8 | ||
![]() |
8e598ec760 | ||
![]() |
e746f190f7 | ||
![]() |
87377792c3 | ||
![]() |
49bf58d536 | ||
![]() |
69fc52347f | ||
![]() |
08c3ced469 | ||
![]() |
d3fb77ebe5 | ||
![]() |
d2f6ac7e1b | ||
![]() |
ae9470659b | ||
![]() |
39c28c1e6d | ||
![]() |
b8657dc4d3 | ||
![]() |
4b023c0454 | ||
![]() |
3deb8ce993 | ||
![]() |
763578f165 | ||
![]() |
2802d7cf4e | ||
![]() |
1f72de1ff5 | ||
![]() |
deb2e9b123 | ||
![]() |
1fcdd40f3f | ||
![]() |
796712472e | ||
![]() |
f6ddc170c5 | ||
![]() |
0ce54f8475 | ||
![]() |
df687a6df2 | ||
![]() |
cf4a25e6c0 | ||
![]() |
b03f84893f | ||
![]() |
79f2cadd97 | ||
![]() |
07035ca2fe | ||
![]() |
0e5fa90c2d | ||
![]() |
6caacad9d1 | ||
![]() |
fdcd6b2abb | ||
![]() |
2963e2d454 | ||
![]() |
beb2583679 | ||
![]() |
ea5a4a8ec7 | ||
![]() |
f01a3fd2f9 | ||
![]() |
18c603162b | ||
![]() |
fa56fa4ef2 | ||
![]() |
7b78b635f0 | ||
![]() |
ca941cf69e | ||
![]() |
54f9379afe | ||
![]() |
0557fd3401 | ||
![]() |
ea3886b4ed | ||
![]() |
936d057217 | ||
![]() |
a00d6d5ca8 | ||
![]() |
428ee55976 | ||
![]() |
4ddc6ffc99 | ||
![]() |
0e4592f642 | ||
![]() |
f972941f4e | ||
![]() |
dc1dc7c739 | ||
![]() |
51c2889443 | ||
![]() |
228b92677e | ||
![]() |
bb63717810 | ||
![]() |
81d27edbf0 | ||
![]() |
4c372fa2f6 | ||
![]() |
df0e99b8dc | ||
![]() |
53858b10fe | ||
![]() |
bafaf6adb5 | ||
![]() |
a75e8e4cba | ||
![]() |
98f94ff185 | ||
![]() |
011162849d | ||
![]() |
5e369866b1 | ||
![]() |
58942cc5e6 | ||
![]() |
e2d435135e | ||
![]() |
eeeeb952a6 | ||
![]() |
59790c0236 | ||
![]() |
d039a9f12c | ||
![]() |
068edfe5c1 | ||
![]() |
0e95c8aa53 | ||
![]() |
f8b8e28ea1 | ||
![]() |
571f2b4ba2 | ||
![]() |
c1e2b2880e | ||
![]() |
f322b54643 | ||
![]() |
878577bf14 | ||
![]() |
d90782ee25 | ||
![]() |
10382ea4d6 | ||
![]() |
242e522d02 | ||
![]() |
9bde927072 | ||
![]() |
b194d72189 | ||
![]() |
d4a69ce2b0 | ||
![]() |
9c2fb152d9 | ||
![]() |
967289becc | ||
![]() |
d9d9d19921 | ||
![]() |
2e43dfd4e2 | ||
![]() |
371ef6e827 | ||
![]() |
b6884ad385 | ||
![]() |
98b14f8482 | ||
![]() |
af6fcc8c67 | ||
![]() |
d424d59dba | ||
![]() |
031230d807 | ||
![]() |
6f930da901 | ||
![]() |
c91a5ab05c | ||
![]() |
e6a8dbb994 | ||
![]() |
baae1f2924 | ||
![]() |
f0c2e0a19f | ||
![]() |
66aca440d5 | ||
![]() |
8afaebf721 | ||
![]() |
d89f9176b6 | ||
![]() |
aee0630a81 | ||
![]() |
9cb844d7a7 | ||
![]() |
fae6c2cb8e | ||
![]() |
e24f5f4016 | ||
![]() |
f29b72ec44 | ||
![]() |
d451e90c51 | ||
![]() |
5a98b62cb1 | ||
![]() |
076aba6f8c | ||
![]() |
c5e5f39648 | ||
![]() |
226c7c2bd8 | ||
![]() |
6130547e07 | ||
![]() |
3fd631ac6a | ||
![]() |
7c7f1b5a76 | ||
![]() |
957892055c | ||
![]() |
eb33ffdc97 | ||
![]() |
be45b47f2e | ||
![]() |
7d67195322 | ||
![]() |
ba08928618 | ||
![]() |
82bc9d7417 | ||
![]() |
5542bffe21 | ||
![]() |
45093f31fd | ||
![]() |
7010d88313 | ||
![]() |
abc4fc7b22 | ||
![]() |
c38797cc3b | ||
![]() |
f54455c845 | ||
![]() |
8cceece390 | ||
![]() |
99057020ec | ||
![]() |
11010b3008 | ||
![]() |
dc1b8f4ac6 | ||
![]() |
23b60f2099 | ||
![]() |
7bea9f2f3d | ||
![]() |
4ae2a4e1b2 | ||
![]() |
22c9bba754 | ||
![]() |
7633500f37 | ||
![]() |
f2476df3e8 | ||
![]() |
f08007fc91 | ||
![]() |
0f60fa7e0d | ||
![]() |
67e158bea2 | ||
![]() |
4f2671e1a8 | ||
![]() |
ad62bb28c2 | ||
![]() |
2be637754f | ||
![]() |
d40d7db1b5 | ||
![]() |
36a27c3a13 | ||
![]() |
84cc264a9c | ||
![]() |
21e1009ad7 | ||
![]() |
6e27633f64 | ||
![]() |
ef99075c91 | ||
![]() |
c101e9cf4e | ||
![]() |
a34922f59b | ||
![]() |
0a315c10e3 |
84 changed files with 1736 additions and 1341 deletions
|
@ -21,14 +21,5 @@ plugins:
|
||||||
enabled: true
|
enabled: true
|
||||||
reek:
|
reek:
|
||||||
enabled: true
|
enabled: true
|
||||||
rubocop:
|
|
||||||
enabled: true
|
|
||||||
checks:
|
|
||||||
Rubocop/Style/StringLiterals:
|
|
||||||
enabled: false
|
|
||||||
Rubocop/Style/TrailingCommaInLiteral:
|
|
||||||
enabled: false
|
|
||||||
Rubocop/Style/HashSyntax:
|
|
||||||
enabled: false
|
|
||||||
#exclude_patterns:
|
#exclude_patterns:
|
||||||
#- app/assets/javascripts-jquery-ui
|
#- app/assets/javascripts-jquery-ui
|
||||||
|
|
|
@ -3,9 +3,7 @@ config/database.yml
|
||||||
config/site.yml
|
config/site.yml
|
||||||
coverage
|
coverage
|
||||||
db/*.sqlite3
|
db/*.sqlite3
|
||||||
doc
|
|
||||||
features
|
features
|
||||||
log
|
log
|
||||||
public/assets
|
public/assets
|
||||||
test
|
|
||||||
tmp
|
tmp
|
||||||
|
|
1
.github/dependabot.yml
vendored
1
.github/dependabot.yml
vendored
|
@ -9,3 +9,4 @@ updates:
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
|
55
.github/workflows/build-custom-release.yml
vendored
Normal file
55
.github/workflows/build-custom-release.yml
vendored
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
---
|
||||||
|
name: 'Build custom release'
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: 'Tag to release'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
description: 'Name of the release'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-publish-release:
|
||||||
|
name: 'Build custom release'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout the code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ inputs.tag }}
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
target: production
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
tracksapp/tracks:${{ inputs.name }}
|
||||||
|
ghcr.io/tracksapp/tracks:${{ inputs.name }}
|
||||||
|
|
||||||
|
# platforms: linux/amd64,linux/arm64
|
45
.github/workflows/build-latest.yml
vendored
Normal file
45
.github/workflows/build-latest.yml
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
---
|
||||||
|
name: 'Build latest'
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-publish-latest:
|
||||||
|
name: 'Build latest'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2 # Checking out the repo
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
target: production
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
tracksapp/tracks:latest
|
||||||
|
tracksapp/tracks:master
|
||||||
|
ghcr.io/tracksapp/tracks:latest
|
||||||
|
|
||||||
|
# platforms: linux/amd64,linux/arm64
|
44
.github/workflows/build-release.yml
vendored
Normal file
44
.github/workflows/build-release.yml
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
name: 'Build release'
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-publish-release:
|
||||||
|
name: 'Build release'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2 # Checking out the repo
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
target: production
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
tracksapp/tracks:${{ github.event.release.name }}
|
||||||
|
ghcr.io/tracksapp/tracks:${{ github.event.release.name }}
|
||||||
|
|
||||||
|
# platforms: linux/amd64,linux/arm64
|
8
.github/workflows/continuous-integration.yml
vendored
8
.github/workflows/continuous-integration.yml
vendored
|
@ -6,14 +6,8 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ruby: ["2.6", "2.7", "3.0"]
|
ruby: ["3.2", "3.3"]
|
||||||
db: [sqlite, mysql, postgres]
|
db: [sqlite, mysql, postgres]
|
||||||
exclude:
|
|
||||||
- ruby: "2.6"
|
|
||||||
db: sqlite
|
|
||||||
- ruby: "2.6"
|
|
||||||
db: postgres
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- run: bash -x script/cibuild ${{ matrix.ruby }} ${{ matrix.db }}
|
- run: bash -x script/cibuild ${{ matrix.ruby }} ${{ matrix.db }}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2.5
|
3.3
|
||||||
|
|
|
@ -19,13 +19,15 @@ It would be great to first discuss them on the [mailing list](https://groups.goo
|
||||||
If you want to contribute an enhancement or a fix, you can:
|
If you want to contribute an enhancement or a fix, you can:
|
||||||
|
|
||||||
1. [fork the project](https://help.github.com/articles/fork-a-repo)
|
1. [fork the project](https://help.github.com/articles/fork-a-repo)
|
||||||
1. [create a topic branch](http://learn.github.com/p/branching.html).
|
2. [create a topic branch](http://learn.github.com/p/branching.html).
|
||||||
1. install [docker-compose](https://docs.docker.com/compose/)
|
3. install [docker-compose](https://docs.docker.com/compose/)
|
||||||
1. copy `app/config/site.yml.tmpl` to `app/config/site.yml` and customize as needed
|
4. copy `app/config/site.yml.tmpl` to `app/config/site.yml` and customize as needed
|
||||||
1. then with `./bin/setup` you will prepare for the first run
|
5. then with `./bin/setup` you will prepare for the first run
|
||||||
1. start the server with `./script/server` which will start everything you need in Docker and present Tracks at [http://0.0.0.0:3000](http://0.0.0.0:3000)
|
6. start the server with `./script/server` which will start everything you need in Docker and present Tracks at [http://0.0.0.0:3000](http://0.0.0.0:3000)
|
||||||
1. if you need, you can launch a Rails console with `./bin/rails c` (will run inside Docker)
|
7. if you need, you can launch a Rails console with `./bin/rails c` (will run inside Docker)
|
||||||
1. make your changes and add/update relevant tests
|
8. make your changes and add/update relevant tests
|
||||||
1. run the test suite with `./bin/rake test` (will run inside Docker)
|
9. run the test suite with `./bin/rake test` (will run inside Docker)
|
||||||
1. commit the changes
|
10. commit the changes
|
||||||
1. send a pull request.
|
11. send a pull request.
|
||||||
|
|
||||||
|
Make sure that you've added the necessary tests for any new functionality and preferably also for any bugs and that your contribution conforms to the coding style defined by the CodeClimate checks. The coding style definition should be approximately the same as the [Shopify Ruby Style Guide](https://ruby-style-guide.shopify.dev/).
|
||||||
|
|
49
Dockerfile
49
Dockerfile
|
@ -1,19 +1,12 @@
|
||||||
FROM ruby:2.7
|
ARG RUBY_VERSION=3.3
|
||||||
|
FROM ruby:${RUBY_VERSION} AS base
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
RUN touch /etc/app-env
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
RUN apt-get update && apt-get install -y npm netcat-openbsd
|
||||||
|
RUN npm install -g yarn
|
||||||
RUN gem install bundler
|
RUN gem install bundler
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn netcat
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
RUN mkdir /app/log
|
||||||
|
|
||||||
|
@ -36,12 +29,38 @@ COPY lib /app/lib/
|
||||||
COPY app /app/app/
|
COPY app /app/app/
|
||||||
COPY db /app/db/
|
COPY db /app/db/
|
||||||
|
|
||||||
COPY .git /app/.git
|
# Use glob to omit error if the .git directory doesn't exists (in case the
|
||||||
|
# code is from a release archive, not a Git clone)
|
||||||
|
COPY .gi[t] /app/.git
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
COPY Gemfile* /app/
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
CMD ["./bin/rails", "server", "-b", "0.0.0.0"]
|
CMD ["./bin/rails", "server", "-b", "0.0.0.0"]
|
||||||
|
|
||||||
|
FROM base AS precompile
|
||||||
|
RUN bundle config set deployment true
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
RUN RAILS_GROUPS=assets bundle exec rake assets:precompile
|
||||||
|
|
||||||
|
# Build the environment-specific stuff
|
||||||
|
FROM base AS production
|
||||||
|
RUN bundle config set without assets
|
||||||
|
RUN bundle config --global frozen 1
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
COPY --from=precompile /app/public/assets /app/public/assets
|
||||||
|
|
||||||
|
FROM base AS test
|
||||||
|
COPY test /app/test/
|
||||||
|
# For testing the API client
|
||||||
|
COPY doc /app/doc/
|
||||||
|
RUN bundle config set without assets
|
||||||
|
RUN bundle config set with development test
|
||||||
|
RUN bundle config --global frozen 1
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
COPY --from=precompile /app/public/assets /app/public/assets
|
||||||
|
|
||||||
|
FROM base AS development
|
||||||
|
RUN bundle config set with development test
|
||||||
|
RUN bundle install --jobs 4
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
FROM ruby:2.6
|
|
||||||
|
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn
|
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
|
||||||
RUN gem install bundler
|
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
|
||||||
|
|
||||||
COPY . /app/
|
|
||||||
COPY config/database.docker.yml /app/config/database.yml
|
|
||||||
COPY config/site.docker.yml /app/config/site.yml
|
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD ["rails", "server", "-b", "0.0.0.0"]
|
|
|
@ -1,30 +0,0 @@
|
||||||
FROM ruby:3.0
|
|
||||||
|
|
||||||
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
||||||
RUN bundle config --global frozen 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN touch /etc/app-env
|
|
||||||
|
|
||||||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
||||||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
|
||||||
RUN apt-get update && apt-get install -y yarn
|
|
||||||
|
|
||||||
COPY Gemfile* /app/
|
|
||||||
RUN gem install bundler
|
|
||||||
RUN bundle install --jobs 4
|
|
||||||
|
|
||||||
RUN mkdir /app/log
|
|
||||||
|
|
||||||
COPY . /app/
|
|
||||||
COPY config/database.docker.yml /app/config/database.yml
|
|
||||||
COPY config/site.docker.yml /app/config/site.yml
|
|
||||||
|
|
||||||
RUN RAILS_ENV=production bundle exec rake assets:precompile
|
|
||||||
|
|
||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD ["rails", "server", "-b", "0.0.0.0"]
|
|
76
Gemfile
76
Gemfile
|
@ -1,70 +1,72 @@
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
gem 'actionpack-xml_parser', '~> 2.0'
|
gem 'actionpack-xml_parser', '~> 2.0'
|
||||||
gem 'activemodel-serializers-xml', '~> 1.0.1'
|
gem 'activemodel-serializers-xml', '~> 1.0.3'
|
||||||
|
|
||||||
gem 'coffee-rails', '~> 5.0.0'
|
gem 'rails', '~> 7.1'
|
||||||
|
|
||||||
gem 'jquery-rails', '~> 4.5'
|
gem 'font-awesome-sass', '~> 6.7.2'
|
||||||
gem 'jquery-ui-rails', '~>6.0.1'
|
gem 'jquery-rails', '~> 4.6'
|
||||||
|
gem 'jquery-ui-rails', '~>8.0.0'
|
||||||
gem 'rails', '~> 6.0.0'
|
gem 'aasm', '~> 5.5.1'
|
||||||
gem 'sassc-rails', '~> 2.1.2'
|
|
||||||
|
|
||||||
gem 'bootstrap-sass', '3.4.1'
|
|
||||||
gem 'font-awesome-sass', '~> 6.1.2'
|
|
||||||
|
|
||||||
gem 'uglifier', '>=1.3.0'
|
|
||||||
|
|
||||||
gem 'aasm', '~> 5.3.0'
|
|
||||||
gem 'acts_as_list'
|
gem 'acts_as_list'
|
||||||
gem 'bcrypt', '~> 3.1.18'
|
gem 'bcrypt', '~> 3.1.20'
|
||||||
gem 'htmlentities'
|
gem 'htmlentities'
|
||||||
gem "kt-paperclip", "~> 7.1"
|
gem "kt-paperclip", "~> 7.2"
|
||||||
gem 'puma', '~> 5.6'
|
gem 'puma', '~> 6.6'
|
||||||
gem 'rails_autolink'
|
gem 'rails_autolink'
|
||||||
gem 'RedCloth'
|
gem 'RedCloth'
|
||||||
gem 'sanitize', '~> 6.0'
|
gem 'sanitize', '~> 7.0'
|
||||||
gem 'tracks-chartjs-ror'
|
gem 'tracks-chartjs-ror'
|
||||||
gem 'will_paginate'
|
gem 'will_paginate'
|
||||||
|
|
||||||
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
gem 'rexml'
|
||||||
gem 'therubyracer', group: :therubyracer
|
|
||||||
|
|
||||||
# Use --without <group> argument to skip unnecessary drivers
|
# Use --without <group> argument to skip unnecessary drivers
|
||||||
gem 'sqlite3', group: :sqlite
|
gem 'sqlite3', '~> 2.7', group: :sqlite
|
||||||
gem 'mysql2', '~> 0.5.4', group: :mysql
|
gem 'mysql2', '~> 0.5', group: :mysql
|
||||||
gem 'pg', '~> 1.4.3', group: :postgresql
|
gem 'pg', '~> 1.5', group: :postgresql
|
||||||
|
|
||||||
group :development do
|
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
||||||
gem 'spring', '~> 3'
|
gem 'mini_racer', group: :therubyracer
|
||||||
|
|
||||||
|
gem 'sprockets-rails'
|
||||||
|
gem 'coffee-rails', '~> 5.0.0'
|
||||||
|
gem 'dartsass-sprockets'
|
||||||
|
gem 'bootstrap-sass', '3.4.1'
|
||||||
|
gem 'terser'
|
||||||
|
gem 'listen'
|
||||||
|
gem 'tolk', '~> 6.0.0'
|
||||||
|
|
||||||
|
group :development, :optional => true do
|
||||||
|
gem 'spring', '~> 4'
|
||||||
gem 'yard'
|
gem 'yard'
|
||||||
|
|
||||||
gem 'tolk', '~> 4.3.0'
|
|
||||||
|
|
||||||
gem 'bullet'
|
gem 'bullet'
|
||||||
gem 'rack-mini-profiler'
|
gem 'rack-mini-profiler'
|
||||||
gem 'solargraph'
|
gem 'solargraph'
|
||||||
|
|
||||||
gem 'i18n-tasks', '~> 1.0.11'
|
gem 'i18n-tasks', '~> 1.0.15'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test, :optional => true do
|
||||||
gem 'byebug'
|
gem 'byebug'
|
||||||
gem 'listen'
|
gem 'rubocop', '~> 1.78'
|
||||||
gem 'rubocop', '~> 1.34', require: false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test, :optional => true do
|
||||||
|
|
||||||
# get test coverage info on codeclimate
|
# get test coverage info on codeclimate
|
||||||
gem 'codeclimate-test-reporter', '1.0.7', group: :test, require: nil
|
gem 'codeclimate-test-reporter', '1.0.9'
|
||||||
gem 'database_cleaner', '~> 1'
|
gem 'database_cleaner', '~> 2'
|
||||||
gem 'factory_bot_rails'
|
gem 'factory_bot_rails'
|
||||||
gem 'minitest-stub-const'
|
gem 'minitest-stub-const'
|
||||||
gem 'mocha', :require => false
|
gem 'mocha'
|
||||||
gem 'rails-controller-testing'
|
gem 'rails-controller-testing'
|
||||||
gem 'rails-dom-testing', '~> 2.0.0'
|
gem 'rails-dom-testing', '~> 2.3.0'
|
||||||
gem 'rspec-expectations'
|
gem 'rspec-expectations'
|
||||||
gem 'simplecov'
|
gem 'simplecov'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
group :stripe, :optional => true do
|
||||||
|
gem 'stripe'
|
||||||
|
end
|
||||||
|
|
587
Gemfile.lock
587
Gemfile.lock
|
@ -1,98 +1,115 @@
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
RedCloth (4.3.2)
|
RedCloth (4.3.4)
|
||||||
aasm (5.3.0)
|
aasm (5.5.1)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
actioncable (6.0.5.1)
|
actioncable (7.1.5.1)
|
||||||
actionpack (= 6.0.5.1)
|
actionpack (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.0.5.1)
|
zeitwerk (~> 2.6)
|
||||||
actionpack (= 6.0.5.1)
|
actionmailbox (7.1.5.1)
|
||||||
activejob (= 6.0.5.1)
|
actionpack (= 7.1.5.1)
|
||||||
activerecord (= 6.0.5.1)
|
activejob (= 7.1.5.1)
|
||||||
activestorage (= 6.0.5.1)
|
activerecord (= 7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activestorage (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.0.5.1)
|
net-imap
|
||||||
actionpack (= 6.0.5.1)
|
net-pop
|
||||||
actionview (= 6.0.5.1)
|
net-smtp
|
||||||
activejob (= 6.0.5.1)
|
actionmailer (7.1.5.1)
|
||||||
|
actionpack (= 7.1.5.1)
|
||||||
|
actionview (= 7.1.5.1)
|
||||||
|
activejob (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
net-imap
|
||||||
actionpack (6.0.5.1)
|
net-pop
|
||||||
actionview (= 6.0.5.1)
|
net-smtp
|
||||||
activesupport (= 6.0.5.1)
|
rails-dom-testing (~> 2.2)
|
||||||
rack (~> 2.0, >= 2.0.8)
|
actionpack (7.1.5.1)
|
||||||
|
actionview (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
|
nokogiri (>= 1.8.5)
|
||||||
|
racc
|
||||||
|
rack (>= 2.2.4)
|
||||||
|
rack-session (>= 1.0.1)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.6)
|
||||||
actionpack-xml_parser (2.0.1)
|
actionpack-xml_parser (2.0.1)
|
||||||
actionpack (>= 5.0)
|
actionpack (>= 5.0)
|
||||||
railties (>= 5.0)
|
railties (>= 5.0)
|
||||||
actiontext (6.0.5.1)
|
actiontext (7.1.5.1)
|
||||||
actionpack (= 6.0.5.1)
|
actionpack (= 7.1.5.1)
|
||||||
activerecord (= 6.0.5.1)
|
activerecord (= 7.1.5.1)
|
||||||
activestorage (= 6.0.5.1)
|
activestorage (= 7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activesupport (= 7.1.5.1)
|
||||||
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.0.5.1)
|
actionview (7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activesupport (= 7.1.5.1)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.11)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.6)
|
||||||
activejob (6.0.5.1)
|
activejob (7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activesupport (= 7.1.5.1)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.0.5.1)
|
activemodel (7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activesupport (= 7.1.5.1)
|
||||||
activemodel-serializers-xml (1.0.2)
|
activemodel-serializers-xml (1.0.3)
|
||||||
activemodel (> 5.x)
|
activemodel (>= 5.0.0.a)
|
||||||
activesupport (> 5.x)
|
activesupport (>= 5.0.0.a)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
activerecord (6.0.5.1)
|
activerecord (7.1.5.1)
|
||||||
activemodel (= 6.0.5.1)
|
activemodel (= 7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activesupport (= 7.1.5.1)
|
||||||
activestorage (6.0.5.1)
|
timeout (>= 0.4.0)
|
||||||
actionpack (= 6.0.5.1)
|
activestorage (7.1.5.1)
|
||||||
activejob (= 6.0.5.1)
|
actionpack (= 7.1.5.1)
|
||||||
activerecord (= 6.0.5.1)
|
activejob (= 7.1.5.1)
|
||||||
|
activerecord (= 7.1.5.1)
|
||||||
|
activesupport (= 7.1.5.1)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
activesupport (6.0.5.1)
|
activesupport (7.1.5.1)
|
||||||
|
base64
|
||||||
|
benchmark (>= 0.3)
|
||||||
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 0.7, < 2)
|
connection_pool (>= 2.2.5)
|
||||||
minitest (~> 5.1)
|
drb
|
||||||
tzinfo (~> 1.1)
|
i18n (>= 1.6, < 2)
|
||||||
zeitwerk (~> 2.2, >= 2.2.2)
|
logger (>= 1.4.2)
|
||||||
acts_as_list (1.0.4)
|
minitest (>= 5.1)
|
||||||
activerecord (>= 4.2)
|
mutex_m
|
||||||
ast (2.4.2)
|
securerandom (>= 0.3)
|
||||||
autoprefixer-rails (10.4.7.0)
|
tzinfo (~> 2.0)
|
||||||
|
acts_as_list (1.2.4)
|
||||||
|
activerecord (>= 6.1)
|
||||||
|
activesupport (>= 6.1)
|
||||||
|
ast (2.4.3)
|
||||||
|
autoprefixer-rails (10.4.21.0)
|
||||||
execjs (~> 2)
|
execjs (~> 2)
|
||||||
backport (1.2.0)
|
backport (1.2.0)
|
||||||
bcrypt (3.1.18)
|
base64 (0.3.0)
|
||||||
benchmark (0.2.0)
|
bcrypt (3.1.20)
|
||||||
better_html (1.0.16)
|
benchmark (0.4.1)
|
||||||
actionview (>= 4.0)
|
bigdecimal (3.2.2)
|
||||||
activesupport (>= 4.0)
|
|
||||||
ast (~> 2.0)
|
|
||||||
erubi (~> 1.4)
|
|
||||||
html_tokenizer (~> 0.0.6)
|
|
||||||
parser (>= 2.4)
|
|
||||||
smart_properties
|
|
||||||
bootstrap-sass (3.4.1)
|
bootstrap-sass (3.4.1)
|
||||||
autoprefixer-rails (>= 5.2.1)
|
autoprefixer-rails (>= 5.2.1)
|
||||||
sassc (>= 2.0.0)
|
sassc (>= 2.0.0)
|
||||||
builder (3.2.4)
|
builder (3.3.0)
|
||||||
bullet (7.0.3)
|
bullet (8.0.8)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
uniform_notifier (~> 1.11)
|
uniform_notifier (~> 1.11)
|
||||||
byebug (11.1.3)
|
byebug (12.0.0)
|
||||||
climate_control (0.2.0)
|
climate_control (0.2.0)
|
||||||
codeclimate-test-reporter (1.0.7)
|
codeclimate-test-reporter (1.0.9)
|
||||||
simplecov
|
simplecov (<= 0.13)
|
||||||
coffee-rails (5.0.0)
|
coffee-rails (5.0.0)
|
||||||
coffee-script (>= 2.2.0)
|
coffee-script (>= 2.2.0)
|
||||||
railties (>= 5.2.0)
|
railties (>= 5.2.0)
|
||||||
|
@ -100,279 +117,355 @@ GEM
|
||||||
coffee-script-source
|
coffee-script-source
|
||||||
execjs
|
execjs
|
||||||
coffee-script-source (1.12.2)
|
coffee-script-source (1.12.2)
|
||||||
concurrent-ruby (1.1.10)
|
concurrent-ruby (1.3.5)
|
||||||
|
connection_pool (2.5.3)
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
database_cleaner (1.99.0)
|
dartsass-sprockets (3.2.1)
|
||||||
diff-lcs (1.5.0)
|
railties (>= 4.0.0)
|
||||||
docile (1.4.0)
|
sassc-embedded (~> 1.80.1)
|
||||||
e2mmap (0.1.0)
|
sprockets (> 3.0)
|
||||||
erubi (1.11.0)
|
sprockets-rails
|
||||||
execjs (2.8.1)
|
tilt
|
||||||
factory_bot (6.2.1)
|
database_cleaner (2.1.0)
|
||||||
activesupport (>= 5.0.0)
|
database_cleaner-active_record (>= 2, < 3)
|
||||||
factory_bot_rails (6.2.0)
|
database_cleaner-active_record (2.2.0)
|
||||||
factory_bot (~> 6.2.0)
|
activerecord (>= 5.a)
|
||||||
railties (>= 5.0.0)
|
database_cleaner-core (~> 2.0.0)
|
||||||
ffi (1.15.5)
|
database_cleaner-core (2.0.1)
|
||||||
font-awesome-sass (6.1.2)
|
date (3.4.1)
|
||||||
|
diff-lcs (1.6.2)
|
||||||
|
docile (1.1.5)
|
||||||
|
drb (2.2.3)
|
||||||
|
erb (5.0.1)
|
||||||
|
erubi (1.13.1)
|
||||||
|
execjs (2.10.0)
|
||||||
|
factory_bot (6.5.4)
|
||||||
|
activesupport (>= 6.1.0)
|
||||||
|
factory_bot_rails (6.5.0)
|
||||||
|
factory_bot (~> 6.5)
|
||||||
|
railties (>= 6.1.0)
|
||||||
|
ffi (1.17.0)
|
||||||
|
font-awesome-sass (6.7.2)
|
||||||
sassc (~> 2.0)
|
sassc (~> 2.0)
|
||||||
globalid (1.0.0)
|
globalid (1.2.1)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 6.1)
|
||||||
highline (2.0.3)
|
google-protobuf (4.31.1)
|
||||||
html_tokenizer (0.0.7)
|
bigdecimal
|
||||||
|
rake (>= 13)
|
||||||
|
highline (3.1.2)
|
||||||
|
reline
|
||||||
htmlentities (4.3.4)
|
htmlentities (4.3.4)
|
||||||
i18n (1.12.0)
|
i18n (1.14.7)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-tasks (1.0.11)
|
i18n-tasks (1.0.15)
|
||||||
activesupport (>= 4.0.2)
|
activesupport (>= 4.0.2)
|
||||||
ast (>= 2.1.0)
|
ast (>= 2.1.0)
|
||||||
better_html (~> 1.0)
|
|
||||||
erubi
|
erubi
|
||||||
highline (>= 2.0.0)
|
highline (>= 2.0.0)
|
||||||
i18n
|
i18n
|
||||||
parser (>= 2.2.3.0)
|
parser (>= 3.2.2.1)
|
||||||
rails-i18n
|
rails-i18n
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
|
ruby-progressbar (~> 1.8, >= 1.8.1)
|
||||||
terminal-table (>= 1.5.1)
|
terminal-table (>= 1.5.1)
|
||||||
jaro_winkler (1.5.4)
|
io-console (0.8.0)
|
||||||
jquery-rails (4.5.0)
|
irb (1.15.2)
|
||||||
|
pp (>= 0.6.0)
|
||||||
|
rdoc (>= 4.0.0)
|
||||||
|
reline (>= 0.4.2)
|
||||||
|
jaro_winkler (1.6.1)
|
||||||
|
jquery-rails (4.6.0)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
jquery-ui-rails (6.0.1)
|
jquery-ui-rails (8.0.0)
|
||||||
railties (>= 3.2.16)
|
railties (>= 3.2.16)
|
||||||
json (2.6.2)
|
json (2.12.2)
|
||||||
kramdown (2.4.0)
|
kramdown (2.5.1)
|
||||||
rexml
|
rexml (>= 3.3.9)
|
||||||
kramdown-parser-gfm (1.1.0)
|
kramdown-parser-gfm (1.1.0)
|
||||||
kramdown (~> 2.0)
|
kramdown (~> 2.0)
|
||||||
kt-paperclip (7.1.1)
|
kt-paperclip (7.2.0)
|
||||||
activemodel (>= 4.2.0)
|
activemodel (>= 4.2.0)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
marcel (~> 1.0.1)
|
marcel (~> 1.0.1)
|
||||||
mime-types
|
mime-types
|
||||||
terrapin (~> 0.6.0)
|
terrapin (~> 0.6.0)
|
||||||
libv8 (3.16.14.19)
|
language_server-protocol (3.17.0.5)
|
||||||
listen (3.7.1)
|
libv8-node (24.1.0.0)
|
||||||
|
lint_roller (1.1.0)
|
||||||
|
listen (3.9.0)
|
||||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.10)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
loofah (2.18.0)
|
logger (1.7.0)
|
||||||
|
loofah (2.24.1)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.12.0)
|
||||||
mail (2.7.1)
|
mail (2.8.1)
|
||||||
mini_mime (>= 0.1.1)
|
mini_mime (>= 0.1.1)
|
||||||
marcel (1.0.2)
|
net-imap
|
||||||
method_source (1.0.0)
|
net-pop
|
||||||
|
net-smtp
|
||||||
|
marcel (1.0.4)
|
||||||
mime-types (3.4.1)
|
mime-types (3.4.1)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2022.0105)
|
mime-types-data (3.2023.0218.1)
|
||||||
mini_mime (1.1.2)
|
mini_mime (1.1.5)
|
||||||
mini_portile2 (2.8.0)
|
mini_portile2 (2.8.9)
|
||||||
minitest (5.16.2)
|
mini_racer (0.19.0)
|
||||||
|
libv8-node (~> 24.1.0.0)
|
||||||
|
minitest (5.25.5)
|
||||||
minitest-stub-const (0.6)
|
minitest-stub-const (0.6)
|
||||||
mocha (1.14.0)
|
mocha (2.7.1)
|
||||||
mysql2 (0.5.4)
|
ruby2_keywords (>= 0.0.5)
|
||||||
nio4r (2.5.8)
|
mutex_m (0.3.0)
|
||||||
nokogiri (1.13.8)
|
mysql2 (0.5.6)
|
||||||
mini_portile2 (~> 2.8.0)
|
net-imap (0.5.9)
|
||||||
|
date
|
||||||
|
net-protocol
|
||||||
|
net-pop (0.1.2)
|
||||||
|
net-protocol
|
||||||
|
net-protocol (0.2.2)
|
||||||
|
timeout
|
||||||
|
net-smtp (0.5.1)
|
||||||
|
net-protocol
|
||||||
|
nio4r (2.7.4)
|
||||||
|
nokogiri (1.18.9)
|
||||||
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
parallel (1.22.1)
|
observer (0.1.2)
|
||||||
parser (3.1.2.1)
|
ostruct (0.6.2)
|
||||||
|
parallel (1.27.0)
|
||||||
|
parser (3.3.8.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
pg (1.4.3)
|
racc
|
||||||
puma (5.6.4)
|
pg (1.5.9)
|
||||||
|
pp (0.6.2)
|
||||||
|
prettyprint
|
||||||
|
prettyprint (0.2.0)
|
||||||
|
prism (1.4.0)
|
||||||
|
psych (5.2.6)
|
||||||
|
date
|
||||||
|
stringio
|
||||||
|
puma (6.6.0)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
racc (1.6.0)
|
racc (1.8.1)
|
||||||
rack (2.2.4)
|
rack (3.2.0)
|
||||||
rack-mini-profiler (3.0.0)
|
rack-mini-profiler (4.0.1)
|
||||||
rack (>= 1.2.0)
|
rack (>= 1.2.0)
|
||||||
rack-test (2.0.2)
|
rack-session (2.1.1)
|
||||||
|
base64 (>= 0.1.0)
|
||||||
|
rack (>= 3.0.0)
|
||||||
|
rack-test (2.2.0)
|
||||||
rack (>= 1.3)
|
rack (>= 1.3)
|
||||||
rails (6.0.5.1)
|
rackup (2.2.1)
|
||||||
actioncable (= 6.0.5.1)
|
rack (>= 3)
|
||||||
actionmailbox (= 6.0.5.1)
|
rails (7.1.5.1)
|
||||||
actionmailer (= 6.0.5.1)
|
actioncable (= 7.1.5.1)
|
||||||
actionpack (= 6.0.5.1)
|
actionmailbox (= 7.1.5.1)
|
||||||
actiontext (= 6.0.5.1)
|
actionmailer (= 7.1.5.1)
|
||||||
actionview (= 6.0.5.1)
|
actionpack (= 7.1.5.1)
|
||||||
activejob (= 6.0.5.1)
|
actiontext (= 7.1.5.1)
|
||||||
activemodel (= 6.0.5.1)
|
actionview (= 7.1.5.1)
|
||||||
activerecord (= 6.0.5.1)
|
activejob (= 7.1.5.1)
|
||||||
activestorage (= 6.0.5.1)
|
activemodel (= 7.1.5.1)
|
||||||
activesupport (= 6.0.5.1)
|
activerecord (= 7.1.5.1)
|
||||||
bundler (>= 1.3.0)
|
activestorage (= 7.1.5.1)
|
||||||
railties (= 6.0.5.1)
|
activesupport (= 7.1.5.1)
|
||||||
sprockets-rails (>= 2.0.0)
|
bundler (>= 1.15.0)
|
||||||
|
railties (= 7.1.5.1)
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
actionview (>= 5.0.1.rc1)
|
actionview (>= 5.0.1.rc1)
|
||||||
activesupport (>= 5.0.1.rc1)
|
activesupport (>= 5.0.1.rc1)
|
||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.3.0)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 5.0.0)
|
||||||
|
minitest
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.4.3)
|
rails-html-sanitizer (1.6.2)
|
||||||
loofah (~> 2.3)
|
loofah (~> 2.21)
|
||||||
rails-i18n (7.0.5)
|
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
||||||
|
rails-i18n (7.0.10)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 6.0.0, < 8)
|
railties (>= 6.0.0, < 8)
|
||||||
rails_autolink (1.1.6)
|
rails_autolink (1.1.8)
|
||||||
rails (> 3.1)
|
actionview (> 3.1)
|
||||||
railties (6.0.5.1)
|
activesupport (> 3.1)
|
||||||
actionpack (= 6.0.5.1)
|
railties (> 3.1)
|
||||||
activesupport (= 6.0.5.1)
|
railties (7.1.5.1)
|
||||||
method_source
|
actionpack (= 7.1.5.1)
|
||||||
rake (>= 0.8.7)
|
activesupport (= 7.1.5.1)
|
||||||
thor (>= 0.20.3, < 2.0)
|
irb
|
||||||
|
rackup (>= 1.0.0)
|
||||||
|
rake (>= 12.2)
|
||||||
|
thor (~> 1.0, >= 1.2.2)
|
||||||
|
zeitwerk (~> 2.6)
|
||||||
rainbow (3.1.1)
|
rainbow (3.1.1)
|
||||||
rake (13.0.6)
|
rake (13.3.0)
|
||||||
rb-fsevent (0.11.1)
|
rb-fsevent (0.11.2)
|
||||||
rb-inotify (0.10.1)
|
rb-inotify (0.11.1)
|
||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
ref (2.0.0)
|
rbs (3.9.4)
|
||||||
regexp_parser (2.5.0)
|
logger
|
||||||
reverse_markdown (2.1.1)
|
rdoc (6.14.1)
|
||||||
|
erb
|
||||||
|
psych (>= 4.0.0)
|
||||||
|
regexp_parser (2.10.0)
|
||||||
|
reline (0.6.1)
|
||||||
|
io-console (~> 0.5)
|
||||||
|
reverse_markdown (3.0.0)
|
||||||
nokogiri
|
nokogiri
|
||||||
rexml (3.2.5)
|
rexml (3.4.1)
|
||||||
rspec-expectations (3.11.0)
|
rspec-expectations (3.13.5)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.11.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-support (3.11.0)
|
rspec-support (3.13.4)
|
||||||
rubocop (1.35.0)
|
rubocop (1.78.0)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
|
language_server-protocol (~> 3.17.0.2)
|
||||||
|
lint_roller (~> 1.1.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.1.2.1)
|
parser (>= 3.3.0.2)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 2.9.3, < 3.0)
|
||||||
rexml (>= 3.2.5, < 4.0)
|
rubocop-ast (>= 1.45.1, < 2.0)
|
||||||
rubocop-ast (>= 1.20.1, < 2.0)
|
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 4.0)
|
||||||
rubocop-ast (1.21.0)
|
rubocop-ast (1.45.1)
|
||||||
parser (>= 3.1.1.0)
|
parser (>= 3.3.7.2)
|
||||||
ruby-progressbar (1.11.0)
|
prism (~> 1.4)
|
||||||
safe_yaml (1.0.5)
|
ruby-progressbar (1.13.0)
|
||||||
sanitize (6.0.0)
|
ruby2_keywords (0.0.5)
|
||||||
|
sanitize (7.0.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.12.0)
|
nokogiri (>= 1.16.8)
|
||||||
|
sass-embedded (1.89.2)
|
||||||
|
google-protobuf (~> 4.31)
|
||||||
|
rake (>= 13)
|
||||||
sassc (2.4.0)
|
sassc (2.4.0)
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
sassc-rails (2.1.2)
|
sassc-embedded (1.80.4)
|
||||||
railties (>= 4.0.0)
|
sass-embedded (~> 1.80)
|
||||||
sassc (>= 2.0)
|
securerandom (0.4.1)
|
||||||
sprockets (> 3.0)
|
simplecov (0.13.0)
|
||||||
sprockets-rails
|
docile (~> 1.1.0)
|
||||||
tilt
|
json (>= 1.8, < 3)
|
||||||
simplecov (0.21.2)
|
simplecov-html (~> 0.10.0)
|
||||||
docile (~> 1.1)
|
simplecov-html (0.10.2)
|
||||||
simplecov-html (~> 0.11)
|
solargraph (0.56.0)
|
||||||
simplecov_json_formatter (~> 0.1)
|
|
||||||
simplecov-html (0.12.3)
|
|
||||||
simplecov_json_formatter (0.1.4)
|
|
||||||
smart_properties (1.17.0)
|
|
||||||
solargraph (0.45.0)
|
|
||||||
backport (~> 1.2)
|
backport (~> 1.2)
|
||||||
benchmark
|
benchmark (~> 0.4)
|
||||||
bundler (>= 1.17.2)
|
bundler (~> 2.0)
|
||||||
diff-lcs (~> 1.4)
|
diff-lcs (~> 1.4)
|
||||||
e2mmap
|
jaro_winkler (~> 1.6, >= 1.6.1)
|
||||||
jaro_winkler (~> 1.5)
|
|
||||||
kramdown (~> 2.3)
|
kramdown (~> 2.3)
|
||||||
kramdown-parser-gfm (~> 1.1)
|
kramdown-parser-gfm (~> 1.1)
|
||||||
|
logger (~> 1.6)
|
||||||
|
observer (~> 0.1)
|
||||||
|
ostruct (~> 0.6)
|
||||||
parser (~> 3.0)
|
parser (~> 3.0)
|
||||||
reverse_markdown (>= 1.0.5, < 3)
|
prism (~> 1.4)
|
||||||
rubocop (>= 0.52)
|
rbs (~> 3.3)
|
||||||
|
reverse_markdown (~> 3.0)
|
||||||
|
rubocop (~> 1.38)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
tilt (~> 2.0)
|
tilt (~> 2.0)
|
||||||
yard (~> 0.9, >= 0.9.24)
|
yard (~> 0.9, >= 0.9.24)
|
||||||
spring (3.1.1)
|
yard-solargraph (~> 0.1)
|
||||||
sprockets (4.1.1)
|
spring (4.3.0)
|
||||||
|
sprockets (4.2.2)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
rack (> 1, < 3)
|
logger
|
||||||
sprockets-rails (3.4.2)
|
rack (>= 2.2.4, < 4)
|
||||||
actionpack (>= 5.2)
|
sprockets-rails (3.5.2)
|
||||||
activesupport (>= 5.2)
|
actionpack (>= 6.1)
|
||||||
|
activesupport (>= 6.1)
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
sqlite3 (1.4.4)
|
sqlite3 (2.7.3)
|
||||||
terminal-table (3.0.2)
|
mini_portile2 (~> 2.8.0)
|
||||||
unicode-display_width (>= 1.1.1, < 3)
|
stringio (3.1.7)
|
||||||
|
stripe (15.5.0)
|
||||||
|
terminal-table (4.0.0)
|
||||||
|
unicode-display_width (>= 1.1.1, < 4)
|
||||||
terrapin (0.6.0)
|
terrapin (0.6.0)
|
||||||
climate_control (>= 0.0.3, < 1.0)
|
climate_control (>= 0.0.3, < 1.0)
|
||||||
therubyracer (0.12.3)
|
terser (1.2.6)
|
||||||
libv8 (~> 3.16.14.15)
|
execjs (>= 0.3.0, < 3)
|
||||||
ref
|
thor (1.4.0)
|
||||||
thor (1.2.1)
|
tilt (2.6.0)
|
||||||
thread_safe (0.3.6)
|
timeout (0.4.3)
|
||||||
tilt (2.0.11)
|
tolk (6.0.0)
|
||||||
tolk (4.3.0)
|
rails (>= 7.0, < 7.3)
|
||||||
rails (>= 5.0)
|
|
||||||
safe_yaml (>= 0.8.6)
|
|
||||||
sassc
|
|
||||||
sprockets-rails (~> 3.4)
|
sprockets-rails (~> 3.4)
|
||||||
tracks-chartjs-ror (3.6.4)
|
tracks-chartjs-ror (3.6.4)
|
||||||
rails (>= 3.1)
|
rails (>= 3.1)
|
||||||
tzinfo (1.2.10)
|
tzinfo (2.0.6)
|
||||||
thread_safe (~> 0.1)
|
concurrent-ruby (~> 1.0)
|
||||||
uglifier (4.2.0)
|
unicode-display_width (3.1.4)
|
||||||
execjs (>= 0.3.0, < 3)
|
unicode-emoji (~> 4.0, >= 4.0.4)
|
||||||
unicode-display_width (2.2.0)
|
unicode-emoji (4.0.4)
|
||||||
uniform_notifier (1.16.0)
|
uniform_notifier (1.17.0)
|
||||||
webrick (1.7.0)
|
websocket-driver (0.8.0)
|
||||||
websocket-driver (0.7.5)
|
base64
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.5)
|
websocket-extensions (0.1.5)
|
||||||
will_paginate (3.3.1)
|
will_paginate (4.0.1)
|
||||||
yard (0.9.28)
|
yard (0.9.37)
|
||||||
webrick (~> 1.7.0)
|
yard-solargraph (0.1.0)
|
||||||
zeitwerk (2.6.0)
|
yard (~> 0.9)
|
||||||
|
zeitwerk (2.7.3)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
RedCloth
|
RedCloth
|
||||||
aasm (~> 5.3.0)
|
aasm (~> 5.5.1)
|
||||||
actionpack-xml_parser (~> 2.0)
|
actionpack-xml_parser (~> 2.0)
|
||||||
activemodel-serializers-xml (~> 1.0.1)
|
activemodel-serializers-xml (~> 1.0.3)
|
||||||
acts_as_list
|
acts_as_list
|
||||||
bcrypt (~> 3.1.18)
|
bcrypt (~> 3.1.20)
|
||||||
bootstrap-sass (= 3.4.1)
|
bootstrap-sass (= 3.4.1)
|
||||||
bullet
|
bullet
|
||||||
byebug
|
byebug
|
||||||
codeclimate-test-reporter (= 1.0.7)
|
codeclimate-test-reporter (= 1.0.9)
|
||||||
coffee-rails (~> 5.0.0)
|
coffee-rails (~> 5.0.0)
|
||||||
database_cleaner (~> 1)
|
dartsass-sprockets
|
||||||
|
database_cleaner (~> 2)
|
||||||
factory_bot_rails
|
factory_bot_rails
|
||||||
font-awesome-sass (~> 6.1.2)
|
font-awesome-sass (~> 6.7.2)
|
||||||
htmlentities
|
htmlentities
|
||||||
i18n-tasks (~> 1.0.11)
|
i18n-tasks (~> 1.0.15)
|
||||||
jquery-rails (~> 4.5)
|
jquery-rails (~> 4.6)
|
||||||
jquery-ui-rails (~> 6.0.1)
|
jquery-ui-rails (~> 8.0.0)
|
||||||
kt-paperclip (~> 7.1)
|
kt-paperclip (~> 7.2)
|
||||||
listen
|
listen
|
||||||
|
mini_racer
|
||||||
minitest-stub-const
|
minitest-stub-const
|
||||||
mocha
|
mocha
|
||||||
mysql2 (~> 0.5.4)
|
mysql2 (~> 0.5)
|
||||||
pg (~> 1.4.3)
|
pg (~> 1.5)
|
||||||
puma (~> 5.6)
|
puma (~> 6.6)
|
||||||
rack-mini-profiler
|
rack-mini-profiler
|
||||||
rails (~> 6.0.0)
|
rails (~> 7.1)
|
||||||
rails-controller-testing
|
rails-controller-testing
|
||||||
rails-dom-testing (~> 2.0.0)
|
rails-dom-testing (~> 2.3.0)
|
||||||
rails_autolink
|
rails_autolink
|
||||||
|
rexml
|
||||||
rspec-expectations
|
rspec-expectations
|
||||||
rubocop (~> 1.34)
|
rubocop (~> 1.78)
|
||||||
sanitize (~> 6.0)
|
sanitize (~> 7.0)
|
||||||
sassc-rails (~> 2.1.2)
|
|
||||||
simplecov
|
simplecov
|
||||||
solargraph
|
solargraph
|
||||||
spring (~> 3)
|
spring (~> 4)
|
||||||
sqlite3
|
sprockets-rails
|
||||||
therubyracer
|
sqlite3 (~> 2.7)
|
||||||
tolk (~> 4.3.0)
|
stripe
|
||||||
|
terser
|
||||||
|
tolk (~> 6.0.0)
|
||||||
tracks-chartjs-ror
|
tracks-chartjs-ror
|
||||||
uglifier (>= 1.3.0)
|
|
||||||
will_paginate
|
will_paginate
|
||||||
yard
|
yard
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.2.33
|
2.4.19
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
[](https://github.com/TracksApp/tracks/actions)
|
[](https://github.com/TracksApp/tracks/actions)
|
||||||
[](https://codeclimate.com/github/TracksApp/tracks)
|
[](https://codeclimate.com/github/TracksApp/tracks)
|
||||||
[](https://hosted.weblate.org/engage/tracks/)
|
[](https://hosted.weblate.org/engage/tracks/)
|
||||||
|
[](https://bestpractices.coreinfrastructure.org/projects/6459)
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
|
@ -12,7 +13,6 @@
|
||||||
* Hosted services: https://github.com/TracksApp/tracks/wiki/Hosted-Tracks
|
* Hosted services: https://github.com/TracksApp/tracks/wiki/Hosted-Tracks
|
||||||
* Bug reports and feature requests: https://github.com/TracksApp/tracks/issues
|
* Bug reports and feature requests: https://github.com/TracksApp/tracks/issues
|
||||||
* Mailing list: http://groups.google.com/group/TracksApp
|
* Mailing list: http://groups.google.com/group/TracksApp
|
||||||
* IRC channel: #tracks on Libera, available also on [Matrix](https://matrix.to/#/#tracks:matrix.org)
|
|
||||||
* License: See COPYING
|
* License: See COPYING
|
||||||
|
|
||||||
Full instructions for both new installations and upgrades from older installations
|
Full instructions for both new installations and upgrades from older installations
|
||||||
|
|
40
app/assets/javascripts-jquery-ui/datepicker-zh-TW.js
Normal file
40
app/assets/javascripts-jquery-ui/datepicker-zh-TW.js
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/* Traditional Chinese (Taiwan) initialisation for the jQuery UI date picker plugin. */
|
||||||
|
/* Written by Claude Code for Tracks application. */
|
||||||
|
( function( factory ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
|
||||||
|
// AMD. Register as an anonymous module.
|
||||||
|
define( [ "../widgets/datepicker" ], factory );
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Browser globals
|
||||||
|
factory( jQuery.datepicker );
|
||||||
|
}
|
||||||
|
} )( function( datepicker ) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
datepicker.regional["zh-TW"] = {
|
||||||
|
closeText: "關閉",
|
||||||
|
prevText: "上一月",
|
||||||
|
nextText: "下一月",
|
||||||
|
currentText: "今天",
|
||||||
|
monthNames: [ "一月", "二月", "三月", "四月", "五月", "六月",
|
||||||
|
"七月", "八月", "九月", "十月", "十一月", "十二月" ],
|
||||||
|
monthNamesShort: [ "1月", "2月", "3月", "4月", "5月", "6月",
|
||||||
|
"7月", "8月", "9月", "10月", "11月", "12月" ],
|
||||||
|
dayNames: [ "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" ],
|
||||||
|
dayNamesShort: [ "日", "一", "二", "三", "四", "五", "六" ],
|
||||||
|
dayNamesMin: [ "日", "一", "二", "三", "四", "五", "六" ],
|
||||||
|
weekHeader: "週",
|
||||||
|
dateFormat: "yy/mm/dd",
|
||||||
|
firstDay: 0,
|
||||||
|
isRTL: false,
|
||||||
|
showMonthAfterYear: true,
|
||||||
|
yearSuffix: "年" };
|
||||||
|
datepicker.setDefaults( datepicker.regional["zh-TW"] );
|
||||||
|
|
||||||
|
return datepicker.regional["zh-TW"];
|
||||||
|
|
||||||
|
} );
|
|
@ -10,9 +10,9 @@
|
||||||
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
||||||
// about supported directives.
|
// about supported directives.
|
||||||
//
|
//
|
||||||
//= require jquery
|
|
||||||
//= require jquery_ujs
|
//= require jquery_ujs
|
||||||
//= require bootstrap-sprockets
|
//= require jquery3
|
||||||
|
//= require bootstrap
|
||||||
|
|
||||||
//= require jquery-ui/widgets/autocomplete
|
//= require jquery-ui/widgets/autocomplete
|
||||||
//= require jquery-ui/widgets/datepicker
|
//= require jquery-ui/widgets/datepicker
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.bootstrap {
|
.bootstrap {
|
||||||
@import "bootstrap-sprockets";
|
|
||||||
@import "bootstrap";
|
@import "bootstrap";
|
||||||
@import "tracks-logo";
|
@import "tracks-logo";
|
||||||
@import "login";
|
@import "login";
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
require_dependency "login_system"
|
require_dependency "login_system"
|
||||||
require_dependency "tracks/source_view"
|
require_dependency "tracks/source_view_switching"
|
||||||
|
|
||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
# Prevent CSRF attacks by raising an exception.
|
# Prevent CSRF attacks by raising an exception.
|
||||||
|
|
|
@ -83,7 +83,7 @@ class ContextsController < ApplicationController
|
||||||
end
|
end
|
||||||
format.xml do
|
format.xml do
|
||||||
if @context.new_record?
|
if @context.new_record?
|
||||||
render_failure @context.errors.to_xml.html_safe, 409
|
render_failure @context.errors.full_messages.to_xml(root: "errors", skip_types: true).html_safe, 409
|
||||||
else
|
else
|
||||||
head :created, :location => context_url(@context)
|
head :created, :location => context_url(@context)
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,7 +36,7 @@ class FeedlistController < ApplicationController
|
||||||
|
|
||||||
def get_feeds_for(object)
|
def get_feeds_for(object)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :file => "feedlist/get_feeds_for_#{object.class.name.downcase}" }
|
format.html { render :template => "feedlist/get_feeds_for_#{object.class.name.downcase}" }
|
||||||
format.js
|
format.js
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
class IntegrationsController < ApplicationController
|
class IntegrationsController < ApplicationController
|
||||||
require 'mail'
|
require 'mail'
|
||||||
|
|
||||||
skip_before_action :login_required, :only => [:cloudmailin, :search_plugin]
|
skip_before_action :login_required, :only => [:search_plugin]
|
||||||
skip_before_action :verify_authenticity_token, only: [:cloudmailin]
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@page_title = 'TRACKS::Integrations'
|
@page_title = 'TRACKS::Integrations'
|
||||||
|
@ -21,31 +20,8 @@ class IntegrationsController < ApplicationController
|
||||||
.pack('m').gsub(/\n/, '')
|
.pack('m').gsub(/\n/, '')
|
||||||
end
|
end
|
||||||
|
|
||||||
def cloudmailin
|
|
||||||
if !verify_cloudmailin_signature
|
|
||||||
render :body => "Message signature verification failed.", :status => 403
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
if process_message(params[:message])
|
|
||||||
render :body => 'success', :status => 200
|
|
||||||
else
|
|
||||||
render :body => "No user found or other error", :status => 404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def process_message(message)
|
|
||||||
MessageGateway.receive(Mail.new(message))
|
|
||||||
end
|
|
||||||
|
|
||||||
def verify_cloudmailin_signature
|
|
||||||
provided = request.request_parameters.delete(:signature)
|
|
||||||
signature = Digest::MD5.hexdigest(flatten_params(request.request_parameters).sort.map { |k, v| v }.join + SITE_CONFIG['cloudmailin'])
|
|
||||||
return provided == signature
|
|
||||||
end
|
|
||||||
|
|
||||||
def flatten_params(params, title = nil, result = {})
|
def flatten_params(params, title = nil, result = {})
|
||||||
params.each do |key, value|
|
params.each do |key, value|
|
||||||
if value.is_a? Hash
|
if value.is_a? Hash
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
require 'openssl'
|
|
||||||
|
|
||||||
class MailgunController < ApplicationController
|
|
||||||
skip_before_action :login_required, :only => [:mailgun]
|
|
||||||
before_action :verify, :only => [:mailgun]
|
|
||||||
protect_from_forgery with: :null_session
|
|
||||||
|
|
||||||
def mailgun
|
|
||||||
unless params.include? 'body-mime'
|
|
||||||
Rails.logger.info "Cannot process Mailgun request, no body-mime sent"
|
|
||||||
render_failure "Unacceptable body-mime", 406
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
todo = MessageGateway.receive(params['body-mime'])
|
|
||||||
if todo
|
|
||||||
render :xml => todo.to_xml(*todo_xml_params)
|
|
||||||
else
|
|
||||||
render_failure "Todo not saved", 406
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def verify
|
|
||||||
unless params['signature'] == OpenSSL::HMAC.hexdigest(
|
|
||||||
OpenSSL::Digest.new('sha256'),
|
|
||||||
SITE_CONFIG['mailgun_api_key'],
|
|
||||||
'%s%s' % [params['timestamp'], params['token']]
|
|
||||||
)
|
|
||||||
Rails.logger.info "Cannot verify Mailgun signature"
|
|
||||||
render_failure "Access denied", 406
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -186,7 +186,7 @@ class ProjectsController < ApplicationController
|
||||||
end
|
end
|
||||||
format.xml do
|
format.xml do
|
||||||
if @project.new_record?
|
if @project.new_record?
|
||||||
render_failure @project.errors.to_xml.html_safe, 409
|
render_failure @project.errors.full_messages.to_xml(root: "errors", skip_types: true).html_safe, 409
|
||||||
else
|
else
|
||||||
head :created, :location => project_url(@project), :text => @project.id
|
head :created, :location => project_url(@project), :text => @project.id
|
||||||
end
|
end
|
||||||
|
|
|
@ -154,7 +154,7 @@ class TodosController < ApplicationController
|
||||||
if @saved
|
if @saved
|
||||||
head :created, :location => todo_url(@todo)
|
head :created, :location => todo_url(@todo)
|
||||||
else
|
else
|
||||||
render_failure @todo.errors.to_xml.html_safe, 409
|
render_failure @todo.errors.full_messages.to_xml(root: "errors", skip_types: true).html_safe, 409
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -438,7 +438,7 @@ class TodosController < ApplicationController
|
||||||
rescue ActiveRecord::RecordInvalid => exception
|
rescue ActiveRecord::RecordInvalid => exception
|
||||||
record = exception.record
|
record = exception.record
|
||||||
if record.is_a?(Dependency)
|
if record.is_a?(Dependency)
|
||||||
record.errors.each { |key, value| @todo.errors[key] << value }
|
record.errors.each { |key, value| @todo.errors.add(key, value) }
|
||||||
end
|
end
|
||||||
@saved = false
|
@saved = false
|
||||||
end
|
end
|
||||||
|
@ -863,8 +863,10 @@ class TodosController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
@single_tag = @tag_expr.size == 1 && @tag_expr[0].size == 1
|
@single_tag = @tag_expr.size == 1 && @tag_expr[0].size == 1
|
||||||
@tag_name = @tag_expr[0][0]
|
|
||||||
@tag_title = @single_tag ? @tag_name : tag_title(@tag_expr)
|
# These are used in the templates, sanitise to prevent XSS.
|
||||||
|
@tag_name = sanitize(@tag_expr[0][0])
|
||||||
|
@tag_title = sanitize(@single_tag ? @tag_name : tag_title(@tag_expr))
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_format_for_tag_view
|
def filter_format_for_tag_view
|
||||||
|
@ -1192,7 +1194,7 @@ end
|
||||||
begin
|
begin
|
||||||
parse_date_per_user_prefs(date)
|
parse_date_per_user_prefs(date)
|
||||||
rescue
|
rescue
|
||||||
@todo.errors[:base] << error_msg
|
@todo.errors.add(:base, error_msg)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -81,13 +81,15 @@ class UsersController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
unless params['approve_tos'] == 'on' || SITE_CONFIG['tos_link'].blank?
|
unless params['approve_tos'] == 'on' || SITE_CONFIG['tos_link'].blank?
|
||||||
render_failure "You have to accept the terms of service to sign up!"
|
notify :error, t('users.tos_error')
|
||||||
|
redirect_to signup_path
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
user = User.new(user_params)
|
user = User.new(user_params)
|
||||||
|
|
||||||
unless user.valid?
|
unless user.valid?
|
||||||
|
notify :error, t('users.create_error')
|
||||||
redirect_to signup_path
|
redirect_to signup_path
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -125,7 +127,7 @@ class UsersController < ApplicationController
|
||||||
unless user.new_record?
|
unless user.new_record?
|
||||||
render :body => t('users.user_created'), :status => 200
|
render :body => t('users.user_created'), :status => 200
|
||||||
else
|
else
|
||||||
render_failure user.errors.to_xml, 409
|
render_failure user.errors.full_messages.to_xml(root: "errors", skip_types: true), 409
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,141 +0,0 @@
|
||||||
class MessageGateway < ActionMailer::Base
|
|
||||||
def receive(email)
|
|
||||||
user = get_receiving_user_from_email_address(email)
|
|
||||||
return false if user.nil?
|
|
||||||
return false unless check_sender_is_in_mailmap(user, email)
|
|
||||||
|
|
||||||
context = user.prefs.sms_context
|
|
||||||
todo_params = get_todo_params(email)
|
|
||||||
|
|
||||||
todo_builder = TodoFromRichMessage.new(user, context.id, todo_params[:description], todo_params[:notes])
|
|
||||||
todo = todo_builder.construct
|
|
||||||
|
|
||||||
if todo.save!
|
|
||||||
Rails.logger.info "Saved email as todo for user #{user.login} in context #{context.name}"
|
|
||||||
|
|
||||||
if attach_email_to_todo(todo, email)
|
|
||||||
Rails.logger.info "Saved email as attachment to todo for user #{user.login} in context #{context.name}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
todo
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def attach_email_to_todo(todo, email)
|
|
||||||
attachment = todo.attachments.build
|
|
||||||
|
|
||||||
# create temp file
|
|
||||||
tmp = Tempfile.new(['attachment', '.eml'], universal_newline: true)
|
|
||||||
tmp.write email.raw_source.gsub(/\r/, "")
|
|
||||||
|
|
||||||
# add temp file to attachment. paperclip will copy the file to the right location
|
|
||||||
Rails.logger.info "Saved received email to #{tmp.path}"
|
|
||||||
attachment.file = tmp
|
|
||||||
tmp.close
|
|
||||||
saved = attachment.save!
|
|
||||||
|
|
||||||
# enable write permissions on group, since MessageGateway could be run under different
|
|
||||||
# user than Tracks (i.e. apache versus mail)
|
|
||||||
dir = File.open(File.dirname(attachment.file.path))
|
|
||||||
dir.chmod(0770)
|
|
||||||
|
|
||||||
# delete temp file
|
|
||||||
tmp.unlink
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_todo_params(email)
|
|
||||||
params = {}
|
|
||||||
|
|
||||||
if email.multipart?
|
|
||||||
params[:description] = get_text_or_nil(email.subject)
|
|
||||||
params[:notes] = get_first_text_plain_part(email)
|
|
||||||
else
|
|
||||||
if email.subject.blank?
|
|
||||||
params[:description] = get_decoded_text_or_nil(email.body)
|
|
||||||
params[:notes] = nil
|
|
||||||
else
|
|
||||||
params[:description] = get_text_or_nil(email.subject)
|
|
||||||
params[:notes] = get_decoded_text_or_nil(email.body)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
params
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_receiving_user_from_email_address(email)
|
|
||||||
SITE_CONFIG['email_dispatch'] == 'single_user' ? get_receiving_user_from_env_setting : get_receiving_user_from_mail_header(email)
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_receiving_user_from_env_setting
|
|
||||||
Rails.logger.info "All received email goes to #{ENV['TRACKS_MAIL_RECEIVER']}"
|
|
||||||
user = User.where(:login => ENV['TRACKS_MAIL_RECEIVER']).first
|
|
||||||
Rails.logger.info "WARNING: Unknown user set for TRACKS_MAIL_RECEIVER (#{ENV['TRACKS_MAIL_RECEIVER']})" if user.nil?
|
|
||||||
return user
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_receiving_user_from_mail_header(email)
|
|
||||||
user = get_receiving_user_from_sms_email(get_address(email))
|
|
||||||
Rails.logger.info(user.nil? ? "User unknown" : "Email belongs to #{user.login}")
|
|
||||||
return user
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_address(email)
|
|
||||||
return SITE_CONFIG['email_dispatch'] == 'to' ? email.to[0] : email.from[0]
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_receiving_user_from_sms_email(address)
|
|
||||||
Rails.logger.info "Looking for user with email #{address}"
|
|
||||||
user = User.where("preferences.sms_email" => address.strip).includes(:preference).first
|
|
||||||
user = User.where("preferences.sms_email" => address.strip[1.100]).includes(:preference).first if user.nil?
|
|
||||||
return user
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_sender_is_in_mailmap(user, email)
|
|
||||||
if user.present? && !sender_is_in_mailmap?(user, email)
|
|
||||||
Rails.logger.warn "#{email.from[0]} not found in mailmap for #{user.login}"
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
def sender_is_in_mailmap?(user, email)
|
|
||||||
if (SITE_CONFIG['mailmap'].is_a? Hash) && SITE_CONFIG['email_dispatch'] == 'to'
|
|
||||||
# Look for the sender in the map of allowed senders
|
|
||||||
SITE_CONFIG['mailmap'][user.preference.sms_email].include? email.from[0]
|
|
||||||
else
|
|
||||||
# We can't check the map if it's not defined, or if the lookup is the
|
|
||||||
# wrong way round, so just allow it
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_text_or_nil(text)
|
|
||||||
return text ? text.strip : nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_decoded_text_or_nil(text)
|
|
||||||
return text ? text.decoded.strip : nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_first_text_plain_part(email)
|
|
||||||
# get all parts from multipart/alternative attachments
|
|
||||||
parts = get_all_parts(email.parts)
|
|
||||||
|
|
||||||
# remove all parts that are not text/plain
|
|
||||||
parts.reject { |part| !part.content_type.start_with?("text/plain") }
|
|
||||||
|
|
||||||
return parts.count > 0 ? parts[0].decoded.strip : ""
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_all_parts(parts)
|
|
||||||
# return a flattened array of parts. If a multipart attachment is found, recurse over its parts
|
|
||||||
all_parts = parts.inject([]) do |set, elem|
|
|
||||||
if elem.content_type.start_with?("multipart/alternative")
|
|
||||||
# recurse to handle multiparts in this multipart
|
|
||||||
set += get_all_parts(elem.parts)
|
|
||||||
else
|
|
||||||
set << elem
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -80,11 +80,11 @@ module RecurringTodos
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_not_blank(object, msg)
|
def validate_not_blank(object, msg)
|
||||||
errors[:base] << msg if object.blank?
|
errors.add(:base, msg) if object.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_not_nil(object, msg)
|
def validate_not_nil(object, msg)
|
||||||
errors[:base] << msg if object.nil?
|
errors.add(:base, msg) if object.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate
|
def validate
|
||||||
|
@ -100,7 +100,7 @@ module RecurringTodos
|
||||||
when "ends_on_end_date"
|
when "ends_on_end_date"
|
||||||
validate_not_blank(end_date, "The end date needs to be filled in for 'Ends on'")
|
validate_not_blank(end_date, "The end date needs to be filled in for 'Ends on'")
|
||||||
else
|
else
|
||||||
errors[:base] << "The end of the recurrence is not selected" unless ends_on == "no_end_date"
|
errors.add(:base, "The end of the recurrence is not selected") unless ends_on == "no_end_date"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ module RecurringTodos
|
||||||
validate_not_nil(show_always?, "Please select when to show the action")
|
validate_not_nil(show_always?, "Please select when to show the action")
|
||||||
validate_not_blank(show_from_delta, "Please fill in the number of days to show the todo before the due date") unless show_always?
|
validate_not_blank(show_from_delta, "Please fill in the number of days to show the todo before the due date") unless show_always?
|
||||||
else
|
else
|
||||||
errors[:base] << "Unexpected value of recurrence target selector '#{target}'"
|
errors.add(:base, "Unexpected value of recurrence target selector '#{target}'")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ module RecurringTodos
|
||||||
|
|
||||||
def validate
|
def validate
|
||||||
super
|
super
|
||||||
errors[:base] << "Every other nth day may not be empty for this daily recurrence setting" if (!only_work_days?) && every_x_days.blank?
|
errors.add(:base, "Every other nth day may not be empty for this daily recurrence setting") if (!only_work_days?) && every_x_days.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_next_date(previous)
|
def get_next_date(previous)
|
||||||
|
|
|
@ -30,7 +30,7 @@ module RecurringTodos
|
||||||
super
|
super
|
||||||
validate_not_blank(every_x_week, "Every other nth week may not be empty for weekly recurrence setting")
|
validate_not_blank(every_x_week, "Every other nth week may not be empty for weekly recurrence setting")
|
||||||
something_set = %w{ sunday monday tuesday wednesday thursday friday saturday }.inject(false) { |set, day| set || send("on_#{day}") }
|
something_set = %w{ sunday monday tuesday wednesday thursday friday saturday }.inject(false) { |set, day| set || send("on_#{day}") }
|
||||||
errors[:base] << "You must specify at least one day on which the todo recurs" unless something_set
|
errors.add(:base, "You must specify at least one day on which the todo recurs") unless something_set
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_next_date(previous)
|
def get_next_date(previous)
|
||||||
|
|
|
@ -11,7 +11,7 @@ xml.rss :version => "2.0" do
|
||||||
xml.item do
|
xml.item do
|
||||||
xml.title h(context.title)
|
xml.title h(context.title)
|
||||||
xml.description context_summary(context, count_undone_todos_phrase(context))
|
xml.description context_summary(context, count_undone_todos_phrase(context))
|
||||||
xml.pubDate context.created_at.to_s(:rfc822)
|
xml.pubDate context.created_at.to_formatted_s(:rfc822)
|
||||||
xml.link context_url(context)
|
xml.link context_url(context)
|
||||||
xml.guid context_url(context)
|
xml.guid context_url(context)
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
<br/><p><%= I18n.t 'integrations.contents_header' %></p>
|
<br/><p><%= I18n.t 'integrations.contents_header' %></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#email-cron-section"><%= I18n.t 'integrations.sections.automatic_email' %></a></li>
|
<li><a href="#email-cron-section"><%= I18n.t 'integrations.sections.automatic_email' %></a></li>
|
||||||
<li><a href="#message_gateway"><%= I18n.t 'integrations.sections.message_gateway' %></a></li>
|
|
||||||
<li><a href="#mailgun"><%= I18n.t 'integrations.sections.mailgun' %></a></li>
|
|
||||||
<li><a href="#todo_rich_message_format"><%= I18n.t 'integrations.sections.email_rich' %></a></li>
|
<li><a href="#todo_rich_message_format"><%= I18n.t 'integrations.sections.email_rich' %></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p><%= raw I18n.t 'integrations.add_your_own', tell_us_link: link_to(I18n.t('integrations.tell_us_link_text'), 'https://github.com/TracksApp/tracks/issues') %></p>
|
<p><%= raw I18n.t 'integrations.add_your_own', tell_us_link: link_to(I18n.t('integrations.tell_us_link_text'), 'https://github.com/TracksApp/tracks/issues') %></p>
|
||||||
|
@ -19,41 +17,6 @@
|
||||||
|
|
||||||
<p><%= raw I18n.t 'integrations.cron_2', feeds_link: link_to(I18n.t('integrations.feeds_link_text'), feeds_path) %></p>
|
<p><%= raw I18n.t 'integrations.cron_2', feeds_link: link_to(I18n.t('integrations.feeds_link_text'), feeds_path) %></p>
|
||||||
|
|
||||||
<a name="message_gateway"> </a>
|
|
||||||
<h2><%= I18n.t 'integrations.sections.message_gateway' %></h2>
|
|
||||||
<p><%= I18n.t 'integrations.message_gateway.description' %></p>
|
|
||||||
<ul>
|
|
||||||
<li><%= raw I18n.t 'integrations.message_gateway.instructions.1', preferences_link: link_to(t('layouts.navigation.preferences'), preferences_url), sms_email_name: Preference.human_attribute_name('sms_email'), sms_context_name: Preference.human_attribute_name('sms_context') %></li>
|
|
||||||
<li><%= raw I18n.t 'integrations.message_gateway.instructions.2', command: "<pre>/PATH/TO/TRACKS/bin/rails r -e production 'MessageGateway.receive(STDIN.read)'</pre>" %></li>
|
|
||||||
<li><%= I18n.t 'integrations.message_gateway.instructions.3' %></li>
|
|
||||||
</ul>
|
|
||||||
<p><%= I18n.t 'integrations.message_gateway.rich_api_tip' %></p>
|
|
||||||
<p><%= raw I18n.t 'integrations.message_gateway.configuration', site_yml: '<tt>site.yml</tt>', to_name: '<tt>to:</tt>', from_name: '<tt>from:</tt>' %></p>
|
|
||||||
<p><%= raw I18n.t 'integrations.message_gateway.one_user_configuration', single_user_value: '<tt>single_user</tt>', code: "<pre>TRACKS_MAIL_RECEIVER=" + current_user.login + " /PATH/TO/TRACKS/bin/rails r -e production 'MessageGateway.receive(STDIN.read)'</pre>" %></p>
|
|
||||||
|
|
||||||
<a name="mailgun"> </a>
|
|
||||||
<h2><%= I18n.t 'integrations.sections.mailgun' %></h2>
|
|
||||||
<p><%= raw I18n.t 'integrations.mailgun.description', mailgun_link: link_to('Mailgun', 'http://www.mailgun.com/') %></p>
|
|
||||||
<p><%= I18n.t 'integrations.mailgun.conditions' %></p>
|
|
||||||
<ul>
|
|
||||||
<li><%= raw I18n.t 'integrations.mailgun.instructions.1', mailgun_link: link_to('Mailgun', 'http://www.mailgun.com/') %></li>
|
|
||||||
<li><%= I18n.t 'integrations.mailgun.instructions.2' %></li>
|
|
||||||
<ul>
|
|
||||||
<li><%= I18n.t 'integrations.mailgun.instructions.2a' %></li>
|
|
||||||
<li><%= I18n.t 'integrations.mailgun.instructions.2b' %></li>
|
|
||||||
</ul>
|
|
||||||
<li><%= raw I18n.t 'integrations.mailgun.instructions.3', preferences_link: link_to(t('layouts.navigation.preferences'), preferences_url), sms_email_name: Preference.human_attribute_name('sms_email') %></li>
|
|
||||||
<li><%= I18n.t 'integrations.mailgun.instructions.4', sms_context_name: Preference.human_attribute_name('sms_context') %></li>
|
|
||||||
<li><%= I18n.t 'integrations.mailgun.instructions.5' %></li>
|
|
||||||
<li><%= raw I18n.t 'integrations.mailgun.instructions.6', code: '<pre class=code>
|
|
||||||
mailmap:
|
|
||||||
tracks@user.mailgun.org:
|
|
||||||
- me@myhome.example.net
|
|
||||||
- mr.user@work.example.com
|
|
||||||
</pre>' %></li>
|
|
||||||
</ul>
|
|
||||||
<p><%= I18n.t 'integrations.mailgun.gateway_instructions' %></p>
|
|
||||||
|
|
||||||
<a name="todo_rich_message_format"> </a>
|
<a name="todo_rich_message_format"> </a>
|
||||||
<h2><%= I18n.t 'integrations.sections.email_rich' %></h2>
|
<h2><%= I18n.t 'integrations.sections.email_rich' %></h2>
|
||||||
<p><%= I18n.t 'integrations.email_rich.description' %></p>
|
<p><%= I18n.t 'integrations.email_rich.description' %></p>
|
||||||
|
|
|
@ -7,14 +7,14 @@
|
||||||
<%= javascript_include_tag "application" %>
|
<%= javascript_include_tag "application" %>
|
||||||
<%= csrf_meta_tags %>
|
<%= csrf_meta_tags %>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var SOURCE_VIEW = '<%=@source_view%>';
|
var SOURCE_VIEW = '<%=j @source_view %>';
|
||||||
var AUTH_TOKEN = '<%= raw(protect_against_forgery? ? form_authenticity_token.inspect : "") %>'
|
var AUTH_TOKEN = '<%=j raw(protect_against_forgery? ? form_authenticity_token.inspect : "") %>'
|
||||||
var TAG_NAME = '<%= @tag_name ? @tag_name : "" %>'
|
var TAG_NAME = '<%=j @tag_name ? @tag_name : "" %>'
|
||||||
var GROUP_VIEW_BY = '<%= @group_view_by ? @group_view_by : "" %>'
|
var GROUP_VIEW_BY = '<%=j @group_view_by ? @group_view_by : "" %>'
|
||||||
var defaultContexts = <%= default_contexts_for_autocomplete.html_safe rescue '{}' %>;
|
var defaultContexts = <%= default_contexts_for_autocomplete.html_safe rescue '{}' %>;
|
||||||
var defaultTags = <%= default_tags_for_autocomplete.html_safe rescue '{}' %>;
|
var defaultTags = <%= default_tags_for_autocomplete.html_safe rescue '{}' %>;
|
||||||
var dateFormat = '<%= date_format_for_date_picker %>';
|
var dateFormat = '<%=j date_format_for_date_picker %>';
|
||||||
var weekStart = '<%= current_user.prefs.week_starts %>';
|
var weekStart = '<%=j current_user.prefs.week_starts %>';
|
||||||
function relative_to_root(path) { return '<%= root_url %>'+path; };
|
function relative_to_root(path) { return '<%= root_url %>'+path; };
|
||||||
<% if current_user.prefs.refresh != 0 -%>
|
<% if current_user.prefs.refresh != 0 -%>
|
||||||
setup_auto_refresh(<%= current_user.prefs["refresh"].to_i*60000 %>);
|
setup_auto_refresh(<%= current_user.prefs["refresh"].to_i*60000 %>);
|
||||||
|
|
|
@ -86,7 +86,7 @@ var <%=object_name%> = {
|
||||||
return "<%= source_view_is_one_of(:project_list, :review) ? js_render('project_listing', {:suppress_drag_handle => source_view_is(:review)}, @project) : "" %>";
|
return "<%= source_view_is_one_of(:project_list, :review) ? js_render('project_listing', {:suppress_drag_handle => source_view_is(:review)}, @project) : "" %>";
|
||||||
},
|
},
|
||||||
html_for_sidebar: function() {
|
html_for_sidebar: function() {
|
||||||
return "<%= source_view_is(:project) ? escape_javascript(render(:file => 'sidebar/sidebar')) : "" %>";
|
return "<%= source_view_is(:project) ? escape_javascript(render(:template => 'sidebar/sidebar.html.erb')) : "" %>";
|
||||||
},
|
},
|
||||||
html_for_project_settings: function() {
|
html_for_project_settings: function() {
|
||||||
return "<%= source_view_is(:project) ? js_render('project_settings', {}, @project) : "" %>";
|
return "<%= source_view_is(:project) ? js_render('project_settings', {}, @project) : "" %>";
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
unless @further
|
unless @further
|
||||||
-%>
|
-%>
|
||||||
<%= raw t('stats.click_to_show_actions_from_week',
|
<%= raw t('stats.click_to_show_actions_from_week',
|
||||||
:link => link_to("here", show_actions_from_chart_path(:id=>"#{params[:id]}_end", :index => params[:index])),
|
:link => link_to("here", show_actions_from_chart_path(:id=>"#{params[:id].to_i}_end", :index => params[:index].to_i)),
|
||||||
:week => params[:index])
|
:week => params[:index].to_i)
|
||||||
-%>
|
-%>
|
||||||
<%
|
<%
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ xml.rss :version => "2.0" do
|
||||||
xml.item do
|
xml.item do
|
||||||
xml.title h(todo.description)
|
xml.title h(todo.description)
|
||||||
xml.description feed_content_for_todo(todo)
|
xml.description feed_content_for_todo(todo)
|
||||||
xml.pubDate todo.created_at.to_s(:rfc822)
|
xml.pubDate todo.created_at.to_formatted_s(:rfc822)
|
||||||
xml.link (todo.project && !todo.project.is_a?(NullProject)) ? project_url(todo.project) : context_url(todo.context)
|
xml.link (todo.project && !todo.project.is_a?(NullProject)) ? project_url(todo.project) : context_url(todo.context)
|
||||||
xml.guid todo_url(todo)
|
xml.guid todo_url(todo)
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,5 +11,5 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="input_box">
|
<div id="input_box">
|
||||||
<%= render :partial => "shared/add_new_item_form" %>
|
<%= render :partial => "shared/add_new_item_form" %>
|
||||||
<%= render :file => "sidebar/sidebar" %>
|
<%= render :template => "sidebar/sidebar" %>
|
||||||
</div>
|
</div>
|
||||||
|
|
2
bin/rake
2
bin/rake
|
@ -9,5 +9,5 @@ if [ -e $SCRIPTPATH/../.use-docker -a ! -e /etc/app-env ];
|
||||||
then
|
then
|
||||||
$SCRIPTPATH/../script/docker-environment $0 "$@"
|
$SCRIPTPATH/../script/docker-environment $0 "$@"
|
||||||
else
|
else
|
||||||
$SCRIPTPATH/run-rake "$@"
|
bundle exec rake "$@"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -12,7 +12,7 @@ SITE_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__), 'site.yml'))
|
||||||
module Tracksapp
|
module Tracksapp
|
||||||
class Application < Rails::Application
|
class Application < Rails::Application
|
||||||
# Initialize configuration defaults for originally generated Rails version.
|
# Initialize configuration defaults for originally generated Rails version.
|
||||||
config.load_defaults 5.1
|
config.load_defaults 7.0
|
||||||
|
|
||||||
# Settings in config/environments/* take precedence over those specified here.
|
# Settings in config/environments/* take precedence over those specified here.
|
||||||
# Application configuration can go into files in config/initializers
|
# Application configuration can go into files in config/initializers
|
||||||
|
@ -21,8 +21,7 @@ module Tracksapp
|
||||||
|
|
||||||
# Custom directories with classes and modules you want to be autoloadable.
|
# Custom directories with classes and modules you want to be autoloadable.
|
||||||
# config.autoload_paths += %W(#{config.root}/extras)
|
# config.autoload_paths += %W(#{config.root}/extras)
|
||||||
config.autoload_paths += %W(#{config.root}/lib)
|
config.autoload_lib(ignore: %w(assets tasks))
|
||||||
config.eager_load_paths += %W(#{config.root}/lib)
|
|
||||||
|
|
||||||
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
||||||
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
test:
|
test:
|
||||||
adapter: <%= ENV.fetch('DATABASE_TYPE') %>
|
adapter: <%= ENV['DATABASE_TYPE'] %>
|
||||||
encoding: <%= ENV.fetch('DATABASE_ENCODING') %>
|
encoding: <%= ENV['DATABASE_ENCODING'] %>
|
||||||
database: <%= ENV.fetch('DATABASE_NAME') %>
|
database: <%= ENV['DATABASE_NAME'] %>
|
||||||
host: <%= ENV.fetch('DATABASE_HOST') %>
|
host: <%= ENV['DATABASE_HOST'] %>
|
||||||
port: <%= ENV.fetch('DATABASE_PORT') %>
|
port: <%= ENV['DATABASE_PORT'] %>
|
||||||
username: <%= ENV.fetch('DATABASE_USERNAME') %>
|
username: <%= ENV['DATABASE_USERNAME'] %>
|
||||||
password: <%= ENV.fetch('DATABASE_PASSWORD') %>
|
password: <%= ENV['DATABASE_PASSWORD'] %>
|
||||||
|
|
||||||
development:
|
development:
|
||||||
adapter: <%= ENV.fetch('DATABASE_TYPE') %>
|
adapter: <%= ENV['DATABASE_TYPE'] %>
|
||||||
encoding: <%= ENV.fetch('DATABASE_ENCODING') %>
|
encoding: <%= ENV['DATABASE_ENCODING'] %>
|
||||||
database: <%= ENV.fetch('DATABASE_NAME') %>
|
database: <%= ENV['DATABASE_NAME'] %>
|
||||||
host: <%= ENV.fetch('DATABASE_HOST') %>
|
host: <%= ENV['DATABASE_HOST'] %>
|
||||||
port: <%= ENV.fetch('DATABASE_PORT') %>
|
port: <%= ENV['DATABASE_PORT'] %>
|
||||||
username: <%= ENV.fetch('DATABASE_USERNAME') %>
|
username: <%= ENV['DATABASE_USERNAME'] %>
|
||||||
password: <%= ENV.fetch('DATABASE_PASSWORD') %>
|
password: <%= ENV['DATABASE_PASSWORD'] %>
|
||||||
|
|
||||||
production:
|
production:
|
||||||
adapter: <%= ENV.fetch('DATABASE_TYPE') %>
|
adapter: <%= ENV['DATABASE_TYPE'] %>
|
||||||
encoding: <%= ENV.fetch('DATABASE_ENCODING') %>
|
encoding: <%= ENV['DATABASE_ENCODING'] %>
|
||||||
database: <%= ENV.fetch('DATABASE_NAME') %>
|
database: <%= ENV['DATABASE_NAME'] %>
|
||||||
host: <%= ENV.fetch('DATABASE_HOST') %>
|
host: <%= ENV['DATABASE_HOST'] %>
|
||||||
port: <%= ENV.fetch('DATABASE_PORT') %>
|
port: <%= ENV['DATABASE_PORT'] %>
|
||||||
username: <%= ENV.fetch('DATABASE_USERNAME') %>
|
username: <%= ENV['DATABASE_USERNAME'] %>
|
||||||
password: <%= ENV.fetch('DATABASE_PASSWORD') %>
|
password: <%= ENV['DATABASE_PASSWORD'] %>
|
||||||
|
|
|
@ -23,7 +23,7 @@ Rails.application.configure do
|
||||||
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
||||||
|
|
||||||
# Compress JavaScripts and CSS.
|
# Compress JavaScripts and CSS.
|
||||||
config.assets.js_compressor = :uglifier
|
config.assets.js_compressor = Terser.new
|
||||||
# config.assets.css_compressor = :sass
|
# config.assets.css_compressor = :sass
|
||||||
|
|
||||||
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
||||||
|
|
|
@ -23,7 +23,7 @@ Rails.application.configure do
|
||||||
config.action_controller.perform_caching = false
|
config.action_controller.perform_caching = false
|
||||||
|
|
||||||
# Raise exceptions instead of rendering exception templates.
|
# Raise exceptions instead of rendering exception templates.
|
||||||
config.action_dispatch.show_exceptions = false
|
config.action_dispatch.show_exceptions = :none
|
||||||
|
|
||||||
# Disable request forgery protection in test environment.
|
# Disable request forgery protection in test environment.
|
||||||
config.action_controller.allow_forgery_protection = false
|
config.action_controller.allow_forgery_protection = false
|
||||||
|
|
|
@ -7,3 +7,11 @@ Rails.application.config.assets.version = '1.0'
|
||||||
# Rails.application.config.assets.paths << Emoji.images_path
|
# Rails.application.config.assets.paths << Emoji.images_path
|
||||||
# Add Yarn node_modules folder to the asset load path.
|
# Add Yarn node_modules folder to the asset load path.
|
||||||
Rails.application.config.assets.paths << Rails.root.join('node_modules')
|
Rails.application.config.assets.paths << Rails.root.join('node_modules')
|
||||||
|
|
||||||
|
# Precompile additional assets.
|
||||||
|
# application.js, application.css, and all non-JS/CSS in the app/assets
|
||||||
|
# folder are already added.
|
||||||
|
# Rails.application.config.assets.precompile += %w( admin.js admin.css )
|
||||||
|
|
||||||
|
# Precompile jQuery UI datepicker locale files
|
||||||
|
Rails.application.config.assets.precompile += Dir[Rails.root.join('app/assets/javascripts-jquery-ui/datepicker-*.js')].map { |f| File.basename(f) }
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
TRACKS_VERSION='2.6.1'
|
TRACKS_VERSION='2.7.1'
|
||||||
TRACKS_REVISION_WITH_DATE=`git log --date=format:'%Y-%m-%d' --pretty=format:"%h @ %ad" -1`
|
TRACKS_REVISION_WITH_DATE=`git log --date=format:'%Y-%m-%d' --pretty=format:"%h @ %ad" -1`
|
||||||
TRACKS_REVISION=`git log --pretty=format:"%h" -1`
|
TRACKS_REVISION=`git log --pretty=format:"%h" -1`
|
||||||
|
|
|
@ -472,7 +472,7 @@ de:
|
||||||
)'"
|
)'"
|
||||||
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
||||||
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
||||||
'4': 'Select a default context for emails to be put in with "%{sms_context_name"'
|
'4': 'Select a default context for emails to be put in with "%{sms_context_name}"'
|
||||||
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
||||||
'6': "Update the mailmap in 'site.yml' to define which senders can send emails\
|
'6': "Update the mailmap in 'site.yml' to define which senders can send emails\
|
||||||
\ to which incoming addresses. For example, to send emails from your work\
|
\ to which incoming addresses. For example, to send emails from your work\
|
||||||
|
|
|
@ -1281,6 +1281,7 @@ en:
|
||||||
change_password_title: TRACKS::Change password
|
change_password_title: TRACKS::Change password
|
||||||
choose_password: Choose password
|
choose_password: Choose password
|
||||||
confirm_password: Confirm password
|
confirm_password: Confirm password
|
||||||
|
create_error: User creation failed, maybe you already have an account here?
|
||||||
desired_login: Desired login
|
desired_login: Desired login
|
||||||
destroy_confirmation: 'Warning: this will delete user ''%{login}'', all their
|
destroy_confirmation: 'Warning: this will delete user ''%{login}'', all their
|
||||||
actions, contexts, project and notes. Are you sure that you want to continue?'
|
actions, contexts, project and notes. Are you sure that you want to continue?'
|
||||||
|
@ -1315,6 +1316,7 @@ en:
|
||||||
signup_successful: Signup successful for user %{username}.
|
signup_successful: Signup successful for user %{username}.
|
||||||
successfully_deleted_user: Successfully deleted user %{username}
|
successfully_deleted_user: Successfully deleted user %{username}
|
||||||
tos_link: read the Terms of Service
|
tos_link: read the Terms of Service
|
||||||
|
tos_error: You have to accept the terms of service to sign up!
|
||||||
total_actions: Total actions
|
total_actions: Total actions
|
||||||
total_contexts: Total contexts
|
total_contexts: Total contexts
|
||||||
total_notes: Total notes
|
total_notes: Total notes
|
||||||
|
|
|
@ -2,8 +2,8 @@ es:
|
||||||
activerecord:
|
activerecord:
|
||||||
attributes:
|
attributes:
|
||||||
note:
|
note:
|
||||||
created_at: Creado el
|
created_at: Creado en
|
||||||
updated_at: actualizado a las
|
updated_at: Actualizado en
|
||||||
preference:
|
preference:
|
||||||
date_format: Formato de fecha
|
date_format: Formato de fecha
|
||||||
due_style: Debido al estilo
|
due_style: Debido al estilo
|
||||||
|
@ -133,7 +133,7 @@ es:
|
||||||
not_available_abbr: n/d
|
not_available_abbr: n/d
|
||||||
note:
|
note:
|
||||||
one: 1 nota
|
one: 1 nota
|
||||||
other: "%{count} notas"
|
other: '%{count} notas'
|
||||||
zero: 0 notas
|
zero: 0 notas
|
||||||
notes: Notas
|
notes: Notas
|
||||||
numbered_step: Paso %{number}
|
numbered_step: Paso %{number}
|
||||||
|
@ -150,13 +150,13 @@ es:
|
||||||
show_all: Mostrar todo
|
show_all: Mostrar todo
|
||||||
sort:
|
sort:
|
||||||
alphabetically: Alfabéticamente
|
alphabetically: Alfabéticamente
|
||||||
alphabetically_confirm: "¿Está seguro que desea ordenar estos proyectos alfabéticamente?\
|
alphabetically_confirm: "¿Está seguro que desea ordenar estos proyectos alfabéticamente?
|
||||||
\ Esto reemplazará el orden existente."
|
Esto reemplazará el orden existente."
|
||||||
alphabetically_title: Ordenar proyectos alfabéticamente
|
alphabetically_title: Ordenar proyectos alfabéticamente
|
||||||
by_task_count: Por número de tareas
|
by_task_count: Por número de tareas
|
||||||
by_task_count_title: Ordenar por número de tareas
|
by_task_count_title: Ordenar por número de tareas
|
||||||
by_task_count_title_confirm: "¿Seguro que desea ordenar estos proyectos por\
|
by_task_count_title_confirm: "¿Seguro que desea ordenar estos proyectos por
|
||||||
\ el número de tareas? Esto reemplazará la ordenación existente."
|
el número de tareas? Esto reemplazará la ordenación existente."
|
||||||
sort: Ordenar
|
sort: Ordenar
|
||||||
third: Tercero
|
third: Tercero
|
||||||
todo: pendiente
|
todo: pendiente
|
||||||
|
@ -175,9 +175,9 @@ es:
|
||||||
context_name: Nombre contextual
|
context_name: Nombre contextual
|
||||||
context_state: Estado contextual
|
context_state: Estado contextual
|
||||||
delete_context: Borrar contexto
|
delete_context: Borrar contexto
|
||||||
delete_context_confirmation: "¿Seguro que desea borrar el contexto '%{name}'?\
|
delete_context_confirmation: "¿Seguro que desea borrar el contexto '%{name}'?
|
||||||
\ ¡Tenga en cuenta que esto también borra todas las acciones (recurrentes) dentro\
|
¡Tenga en cuenta que esto también borra todas las acciones (recurrentes) dentro
|
||||||
\ de este contexto!"
|
de este contexto!"
|
||||||
delete_context_title: Borrar contexto
|
delete_context_title: Borrar contexto
|
||||||
edit_context: Editar contexto
|
edit_context: Editar contexto
|
||||||
hidden_contexts: Contextos ocultos
|
hidden_contexts: Contextos ocultos
|
||||||
|
@ -207,8 +207,8 @@ es:
|
||||||
some: Han ocurrido algunos errores durante la importación
|
some: Han ocurrido algunos errores durante la importación
|
||||||
file_blank: 'Archivo no puede estar en blanco'
|
file_blank: 'Archivo no puede estar en blanco'
|
||||||
invalid_csv: "CSV inválido: no pudo leer cabeceras: %{e}"
|
invalid_csv: "CSV inválido: no pudo leer cabeceras: %{e}"
|
||||||
save_error: "No pudo guardar CSV subido (%{path_and_file}). Puede hacer un\
|
save_error: "No pudo guardar CSV subido (%{path_and_file}). Puede hacer un
|
||||||
\ seguimiento de escritura al directorio de la subida? %{e}"
|
seguimiento de escritura al directorio de la subida? %{e}"
|
||||||
no_context: No pudo encontrar un contexto predeterminado
|
no_context: No pudo encontrar un contexto predeterminado
|
||||||
map_title: 'Asocia campos a ser importados'
|
map_title: 'Asocia campos a ser importados'
|
||||||
header: Importando datos
|
header: Importando datos
|
||||||
|
@ -220,12 +220,12 @@ es:
|
||||||
projects_count: "%{count} proyectos importados"
|
projects_count: "%{count} proyectos importados"
|
||||||
todos_count: "%{count} pendientes importados"
|
todos_count: "%{count} pendientes importados"
|
||||||
yaml_disabled: "Carga YAML deshabilitada"
|
yaml_disabled: "Carga YAML deshabilitada"
|
||||||
yaml_warning: "%{warning}: todos sus datos actuales serán destruidos antes de\
|
yaml_warning: "%{warning}: todos sus datos actuales serán destruidos antes de
|
||||||
\ importar el archivo YAML, por lo que si tiene acceso a la base de datos,\
|
importar el archivo YAML, por lo que si tiene acceso a la base de datos, le
|
||||||
\ le recomendamos encarecidamente respaldar la base de dato ahora mismo, por\
|
recomendamos encarecidamente respaldar la base de dato ahora mismo, por si
|
||||||
\ si algo pueda salir mal."
|
algo pueda salir mal."
|
||||||
paste_field: "Pegue el contenido del archivo YAML que ha exportado a la caja\
|
paste_field: "Pegue el contenido del archivo YAML que ha exportado a la caja
|
||||||
\ de texto de abajo:"
|
de texto de abajo:"
|
||||||
warning: Aviso
|
warning: Aviso
|
||||||
export:
|
export:
|
||||||
page_title: Tracks::Export
|
page_title: Tracks::Export
|
||||||
|
@ -234,11 +234,11 @@ es:
|
||||||
yaml_description: "%{yaml}: Mejor formato para exportar datos."
|
yaml_description: "%{yaml}: Mejor formato para exportar datos."
|
||||||
yaml_link_description: Fichero YAML con todas sus acciones, contextos, proyectos,
|
yaml_link_description: Fichero YAML con todas sus acciones, contextos, proyectos,
|
||||||
etiquetas y notas
|
etiquetas y notas
|
||||||
yaml_experimental: "Por favor tenga en cuenta que la importación de ficheros\
|
yaml_experimental: "Por favor tenga en cuenta que la importación de ficheros
|
||||||
\ YAML actualmente esta soportada de forma experimental. No confíe en este\
|
YAML actualmente esta soportada de forma experimental. No confíe en este formato
|
||||||
\ formato para hacer copias de seguridad de datos importantes."
|
para hacer copias de seguridad de datos importantes."
|
||||||
csv_description: "%{csv}: Mejor formato para importar en una hoja de cálculo\
|
csv_description: "%{csv}: Mejor formato para importar en una hoja de cálculo
|
||||||
\ o en programas de análisis de datos"
|
o en programas de análisis de datos"
|
||||||
csv_actions_description: Fichero CSV con todas sus acciones, con contextos por
|
csv_actions_description: Fichero CSV con todas sus acciones, con contextos por
|
||||||
nombre y proyectos
|
nombre y proyectos
|
||||||
csv_notes_description: Fichero CSV con todas sus notas
|
csv_notes_description: Fichero CSV con todas sus notas
|
||||||
|
@ -426,17 +426,116 @@ es:
|
||||||
message_gateway: Integre Seguimientos con un servidor de correo para ser capaz
|
message_gateway: Integre Seguimientos con un servidor de correo para ser capaz
|
||||||
de enviar una acción a través del correo a los Seguimientos
|
de enviar una acción a través del correo a los Seguimientos
|
||||||
mailgun: Enviar correos a los Seguimientos con Mailgun
|
mailgun: Enviar correos a los Seguimientos con Mailgun
|
||||||
|
automatic_email: Envíese automáticamente por correo electrónico las próximas
|
||||||
|
acciones
|
||||||
|
email_rich: Formato del correo electrónico de Rich Todo Message
|
||||||
|
message_gateway:
|
||||||
|
one_user_configuration: 'También puede enviar todos los correos electrónicos
|
||||||
|
a un usuario específico de Tracks. Configure mail_dispatch en site.yml a %{single_user_value}
|
||||||
|
y pase el inicio de sesión del usuario en el comando de canalización: %{code}'
|
||||||
|
instructions:
|
||||||
|
'1': Vaya a %{preferences_link} y configure su "%{sms_email_name}" y "%{sms_context_name}"
|
||||||
|
para todos los enviados por correo electrónico (que podrían provenir de
|
||||||
|
un mensaje SMS)
|
||||||
|
'3': ¡Envíe un correo electrónico a su dirección recién configurada!
|
||||||
|
'2': En sendmail/qmail/postfix/whatever, configure un alias de dirección de
|
||||||
|
correo electrónico para enviar mensajes a %{command}
|
||||||
|
description: 'Si Tracks se ejecuta en el mismo servidor que tu correo, puedes
|
||||||
|
utilizar el gestor de correo integrado en Tracks. Pasos para configurarlo:'
|
||||||
|
rich_api_tip: También puedes utilizar la Rich Todo API para enviar tareas como
|
||||||
|
"lavar la ropa en casa" o "llamar a Bill > proyecto X". El asunto del mensaje
|
||||||
|
rellenará la descripción, el contexto y el proyecto, mientras que el cuerpo
|
||||||
|
rellenará la nota de la tarea.
|
||||||
|
configuration: Es posible que deba configurar su %{site_yml} para decirle a
|
||||||
|
la puerta de enlace de mensajes que mire el campo %{to_name} o el campo %{from_name}
|
||||||
|
para buscar al usuario de Tracks desde la dirección de correo electrónico
|
||||||
|
en ese campo.
|
||||||
|
mailgun:
|
||||||
|
description: Si desea enviar tareas por correo electrónico a Tracks, pero no
|
||||||
|
puede ejecutar un servidor de correo en el mismo host, puede utilizar la compatibilidad
|
||||||
|
con %{mailgun_link} integrada en Tracks.
|
||||||
|
conditions: Para que esto funcione, su servidor de Tracks tendrá que ser accesible
|
||||||
|
desde Internet, para que Mailgun pueda enviarle datos.
|
||||||
|
instructions:
|
||||||
|
'1': Vaya a %{mailgun_link} y regístrese para obtener una cuenta gratuita.
|
||||||
|
'3': Vaya a %{preferences_link} e introduzca su dirección de correo electrónico
|
||||||
|
entrante de Mailgun (por ejemplo, tracks@user.mailgun.com) en la casilla
|
||||||
|
"%{sms_email_name}".
|
||||||
|
'4': Seleccione un contexto predeterminado para los correos electrónicos que
|
||||||
|
se pondrán con "%{sms_context_name}"
|
||||||
|
'2': "Vaya a 'Rutas' en el panel de control de Mailgun, y añada una nueva
|
||||||
|
ruta:"
|
||||||
|
2a: La 'Expresión de filtro' debe establecerse en 'catch_all()'
|
||||||
|
2b: "'Acción' debe ser 'adelante (\"http://mytracksserver.example.com/mailgun/mime\"\
|
||||||
|
)'"
|
||||||
|
'5': Añade tu clave de API de Mailgun (no la clave de API pública) a los Tracks
|
||||||
|
'site.yml'
|
||||||
|
'6': "Actualice el mapa de correo en 'site.yml' para definir qué remitentes
|
||||||
|
pueden enviar correos electrónicos a qué direcciones entrantes. Por ejemplo,
|
||||||
|
para enviar correos electrónicos desde sus cuentas de correo electrónico
|
||||||
|
del trabajo y de casa a su ruta Tracks Mailgun, configúrelo de la siguiente
|
||||||
|
manera: %{code}"
|
||||||
|
gateway_instructions: Todos los comentarios sobre el formato de correo electrónico
|
||||||
|
de la sección anterior se aplican a la gestión de Mailgun, ya que los datos
|
||||||
|
se procesan de la misma manera
|
||||||
|
developer_documentation_link: Información para desarrolladores de Tracks
|
||||||
|
cron_email_subject: Realiza un seguimiento de las acciones que vencen en los próximos
|
||||||
|
7 días
|
||||||
|
title: Integraciones
|
||||||
|
intro: Tracks se puede integrar con otras herramientas... lo que sea necesario
|
||||||
|
para ayudarle a hacer las cosas! Esta página tiene información sobre cómo configurar
|
||||||
|
algunos de estos. No todas ellas son aplicables a todas las plataformas, y algunas
|
||||||
|
requieren más conocimientos técnicos que otras. Véase también %{documentation_link}
|
||||||
|
cron_2: Por supuesto, puede utilizar otro texto %{feeds_link} - ¿Por qué no enviar
|
||||||
|
una lista de las próximas acciones delproyecto en particular a un grupo de colegas
|
||||||
|
que están trabajando en el proyecto?
|
||||||
|
feeds_link_text: feeds proporcionados por Tracks
|
||||||
|
contents_header: 'Contenido:'
|
||||||
|
add_your_own: ¿Tienes uno propio para agregar? %{tell_us_link} y podemos incluirlo
|
||||||
|
en esta página en futuras versiones de Tracks.
|
||||||
|
tell_us_link_text: Cuéntanos sobre ello en nuestra cola de problemas
|
||||||
|
cron_1: Si ingresa la siguiente entrada a su crontab, recibirá un correo electrónico
|
||||||
|
todos los días alrededor de las 5 AM con una lista de las próximas acciones
|
||||||
|
que deben realizarse dentro de los próximos 7 días.
|
||||||
|
example_names:
|
||||||
|
context: contexto
|
||||||
|
project: proyecto
|
||||||
|
tag:
|
||||||
|
'1': etiqueta1
|
||||||
|
'2': etiqueta2
|
||||||
|
todo: mi impresionante tarea
|
||||||
|
email_rich:
|
||||||
|
description: 'Para los dos métodos anteriores, se puede utilizar el siguiente
|
||||||
|
formato en el asunto del mensaje para añadir metadatos:'
|
||||||
|
fields_title: 'Los campos son:'
|
||||||
|
symbol_title: Símbolo
|
||||||
|
meaning_title: Significado
|
||||||
|
field_descriptions:
|
||||||
|
due_date: La fecha de vencimiento de las tareas (puede ser de 2 dígitos para
|
||||||
|
el día, de 4 dígitos para el mes-día o de 6 dígitos para el año-mes-día)
|
||||||
|
tag: Una etiqueta para aplicar a la tarea - puede utilizarse varias veces
|
||||||
|
star: Bandera para empezar la tarea
|
||||||
|
project: El proyecto para colocar la tarea en
|
||||||
|
context: El contexto en el que colocar la tarea
|
||||||
|
tickler_date: La fecha clave para las tareas (puede ser de 2 dígitos para
|
||||||
|
el día, 4 dígitos para el día del mes o 6 dígitos para el día del mes)
|
||||||
|
fields_instruction: Todos los símbolos son opcionales, y el texto hasta el primer
|
||||||
|
símbolo (o el final de la cadena) se utiliza como descripción de la tarea
|
||||||
help:
|
help:
|
||||||
title: Help
|
title: Help
|
||||||
usage: ''
|
usage: 'Puedes encontrar información sobre el uso en el %{manual_link} en la wiki
|
||||||
|
de GitHub del proyecto.'
|
||||||
manual_link_text: User manual
|
manual_link_text: User manual
|
||||||
bugs: ''
|
bugs: 'Si encuentras un error o tienes una petición de funcionalidad, por favor
|
||||||
issue_link_text: ''
|
infórmalo en el %{issue_link}.'
|
||||||
contribute: ''
|
issue_link_text: 'cola de problemas'
|
||||||
|
contribute: 'Todas las contribuciones a Tracks son bienvenidas. Consulta el enlace
|
||||||
|
%{contribute_link} para más información. También puedes venir a debatir con
|
||||||
|
la comunidad:'
|
||||||
contribute_link_text: project website
|
contribute_link_text: project website
|
||||||
mailing_list_link_text: Mailing list
|
mailing_list_link_text: Mailing list
|
||||||
irc_bullet: '%{irc_link} (también disponible en %{matrix_link})'
|
irc_bullet: '%{irc_link} (también disponible en %{matrix_link})'
|
||||||
irc_link_text: 'IRC channel #Tracks@FreeNode'
|
irc_link_text: 'Canal IRC #Tracks@Libera'
|
||||||
matrix_link_text: Matriz
|
matrix_link_text: Matriz
|
||||||
layouts:
|
layouts:
|
||||||
mobile_navigation:
|
mobile_navigation:
|
||||||
|
@ -452,7 +551,7 @@ es:
|
||||||
tickler: Recordatorio
|
tickler: Recordatorio
|
||||||
navigation:
|
navigation:
|
||||||
admin: Admin
|
admin: Admin
|
||||||
api_docs: ''
|
api_docs: 'Documentación sobre la API REST'
|
||||||
calendar: Calendario
|
calendar: Calendario
|
||||||
calendar_title: Calendario de las acciones pendientes
|
calendar_title: Calendario de las acciones pendientes
|
||||||
completed_tasks: Hecho
|
completed_tasks: Hecho
|
||||||
|
@ -460,7 +559,7 @@ es:
|
||||||
contexts_title: Contextos
|
contexts_title: Contextos
|
||||||
export: Exportar
|
export: Exportar
|
||||||
export_title: Exportar datos
|
export_title: Exportar datos
|
||||||
feeds: ''
|
feeds: 'Feeds'
|
||||||
feeds_title: Vea un listado de alimentaciones disponibles
|
feeds_title: Vea un listado de alimentaciones disponibles
|
||||||
group_view_by_context: Grupo por contexto
|
group_view_by_context: Grupo por contexto
|
||||||
group_view_by_project: Grupo por proyecto
|
group_view_by_project: Grupo por proyecto
|
||||||
|
@ -474,7 +573,7 @@ es:
|
||||||
integrations_: Pistas Integradas
|
integrations_: Pistas Integradas
|
||||||
manage_users: Administrar usuarios
|
manage_users: Administrar usuarios
|
||||||
manage_users_title: Añadir o eliminar usuarios
|
manage_users_title: Añadir o eliminar usuarios
|
||||||
mobile: ''
|
mobile: 'Version móvil'
|
||||||
notes_title: Mostrar todas las notas
|
notes_title: Mostrar todas las notas
|
||||||
options: Opciones
|
options: Opciones
|
||||||
organize: Organizar
|
organize: Organizar
|
||||||
|
@ -495,34 +594,35 @@ es:
|
||||||
tickler: Recordatorio
|
tickler: Recordatorio
|
||||||
tickler_title: Recordatorio
|
tickler_title: Recordatorio
|
||||||
view: Ver
|
view: Ver
|
||||||
next_actions_rss_feed: ''
|
next_actions_rss_feed: 'RSS de las próximas acciones'
|
||||||
toggle_contexts: Conmuta contextos colapsados
|
toggle_contexts: Conmuta contextos colapsados
|
||||||
toggle_contexts_title: Hacer que los contextos colapsados sea (in)visibles
|
toggle_contexts_title: Hacer que los contextos colapsados sea (in)visibles
|
||||||
toggle_notes: Conmuta anotaciones
|
toggle_notes: Conmuta anotaciones
|
||||||
toggle_notes_title: Conmuta todas las anotaciones
|
toggle_notes_title: Conmuta todas las anotaciones
|
||||||
login:
|
login:
|
||||||
account_login: Acceso a la cuenta
|
account_login: Acceso a la cuenta
|
||||||
cas_create_account: ''
|
cas_create_account: 'Si desea realizar una solicitud, por favor vaya aquí %{signup_link}'
|
||||||
cas_logged_in_greeting: ''
|
cas_logged_in_greeting: '¡Hola, %{username}! Está autenticad@.'
|
||||||
cas_login: ''
|
cas_login: 'Inicio de sesión en CAS'
|
||||||
cas_no_user_found: ''
|
cas_no_user_found: '¡Hola, %{username}! No tienes una cuenta en Tracks.'
|
||||||
cas_signup_link: Solicitar cuenta
|
cas_signup_link: Solicitar cuenta
|
||||||
cas_username_not_found: Disculpe, ningún usuario por esa id de usuario CAS existe
|
cas_username_not_found: Disculpe, ningún usuario por esa id de usuario CAS existe
|
||||||
(%{username})
|
(%{username})
|
||||||
log_in_again: ''
|
log_in_again: 'conéctate de nuevo.'
|
||||||
logged_out: ''
|
logged_out: 'Has salido de Tracks.'
|
||||||
login_cas: ''
|
login_cas: 'ir al CAS'
|
||||||
login_standard: ''
|
login_standard: 'volver al inicio de sesión estándar'
|
||||||
login_with_openid: ''
|
login_with_openid: 'iniciar sesión con OpenID'
|
||||||
mobile_use_openid: ""
|
mobile_use_openid: "...o iniciar sesión con OpenID"
|
||||||
openid_identity_url_not_found: ''
|
openid_identity_url_not_found: 'Lo sentimos, no existe ningún usuari@ con esa
|
||||||
|
URL (%{identity_url})'
|
||||||
option_separator: o,
|
option_separator: o,
|
||||||
please_login: ''
|
please_login: 'Por favor, inicia sesión para utilizar Tracks'
|
||||||
session_time_out: ''
|
session_time_out: 'La sesión ha expirado. Por favor %{link}'
|
||||||
session_will_expire: ''
|
session_will_expire: 'la sesión expirará tras %{hours} hora(s) de inactividad.'
|
||||||
session_will_not_expire: sesión no caducada.
|
session_will_not_expire: sesión no caducada.
|
||||||
sign_in: Entrar
|
sign_in: Entrar
|
||||||
signup_prompt: ''
|
signup_prompt: '¿Quiere crear una cuenta?'
|
||||||
successful: Has entrado correctamente. ¡Bienvenido de nuevo!
|
successful: Has entrado correctamente. ¡Bienvenido de nuevo!
|
||||||
successful_with_session_info: 'Entrada correcta:'
|
successful_with_session_info: 'Entrada correcta:'
|
||||||
unsuccessful: Entrada incorrecta.
|
unsuccessful: Entrada incorrecta.
|
||||||
|
@ -545,9 +645,10 @@ es:
|
||||||
user:
|
user:
|
||||||
error_context_not_associated: ID de contexto %{context} no asociado con el id
|
error_context_not_associated: ID de contexto %{context} no asociado con el id
|
||||||
%{user} del usuario.
|
%{user} del usuario.
|
||||||
error_project_not_associated: ''
|
error_project_not_associated: 'El id de proyecto %{project} no está asociado
|
||||||
|
al id de usuario %{user}.'
|
||||||
notes:
|
notes:
|
||||||
delete_confirmation: ''
|
delete_confirmation: '¿Estás seguro de que quieres borrar la nota ''%{id}''?'
|
||||||
delete_item_title: Delete item
|
delete_item_title: Delete item
|
||||||
delete_note_confirm: Are you sure that you want to delete the note '%{id}'?
|
delete_note_confirm: Are you sure that you want to delete the note '%{id}'?
|
||||||
delete_note_title: Delete the note '%{id}'
|
delete_note_title: Delete the note '%{id}'
|
||||||
|
@ -642,6 +743,8 @@ es:
|
||||||
token_description: Token (for feeds and API use)
|
token_description: Token (for feeds and API use)
|
||||||
token_header: Su vale
|
token_header: Su vale
|
||||||
updated: Las preferencias de actualización
|
updated: Las preferencias de actualización
|
||||||
|
pick_one: 'O elige uno de los siguientes:'
|
||||||
|
result_in: 'Esto dará lugar a: '
|
||||||
projects:
|
projects:
|
||||||
actions_in_project_title: Acciones en este proyecto
|
actions_in_project_title: Acciones en este proyecto
|
||||||
active_projects: Proyectos Activos
|
active_projects: Proyectos Activos
|
||||||
|
@ -986,7 +1089,8 @@ es:
|
||||||
depends_on: Depends on
|
depends_on: Depends on
|
||||||
depends_on_separate_with_commas: Depende de (separar con comas)
|
depends_on_separate_with_commas: Depende de (separar con comas)
|
||||||
done: Done?
|
done: Done?
|
||||||
drag_action_title: ''
|
drag_action_title: 'Arrastre sobre otra acción para marcar esa acción como dependencia
|
||||||
|
de esta acción.'
|
||||||
due: Fecha límite
|
due: Fecha límite
|
||||||
edit: Edit
|
edit: Edit
|
||||||
edit_action: Edit action
|
edit_action: Edit action
|
||||||
|
@ -1183,15 +1287,17 @@ es:
|
||||||
para verlos.'
|
para verlos.'
|
||||||
to_tickler: al recordatorio
|
to_tickler: al recordatorio
|
||||||
unable_to_add_dependency: Es imposible añadir dependencia
|
unable_to_add_dependency: Es imposible añadir dependencia
|
||||||
unresolved_dependency: ''
|
unresolved_dependency: 'El valor que ha introducido en el campo de dependencia
|
||||||
|
no se ha resuelto con una acción existente. Este valor no se guardará con el
|
||||||
|
resto de la acción. ¿Continuar?'
|
||||||
was_due_on_date: venció el %{date}
|
was_due_on_date: venció el %{date}
|
||||||
users:
|
users:
|
||||||
account_signup: ''
|
account_signup: 'Registro de la cuenta'
|
||||||
approve_tos: Apruebo los Términos del Servicio
|
approve_tos: Apruebo los Términos del Servicio
|
||||||
auth_change_submit: Modifica el tipo de autenticación
|
auth_change_submit: Modifica el tipo de autenticación
|
||||||
auth_type_update_error: 'Hubo un problema actualizando su tipo de autenticación:
|
auth_type_update_error: 'Hubo un problema actualizando su tipo de autenticación:
|
||||||
%{error_messages}'
|
%{error_messages}'
|
||||||
auth_type_updated: Tipo autenticador actualizado
|
auth_type_updated: Tipo autenticador actualizado.
|
||||||
change_auth_type_title: TRACKS::Change tipo de autenticación
|
change_auth_type_title: TRACKS::Change tipo de autenticación
|
||||||
change_authentication_type: Cambia el tipo de autenticación
|
change_authentication_type: Cambia el tipo de autenticación
|
||||||
change_password_prompt: Introduzca su contraseña nueva dentro de los campos debajo
|
change_password_prompt: Introduzca su contraseña nueva dentro de los campos debajo
|
||||||
|
@ -1201,7 +1307,8 @@ es:
|
||||||
choose_password: Elija contraseña
|
choose_password: Elija contraseña
|
||||||
confirm_password: Conformar contraseña
|
confirm_password: Conformar contraseña
|
||||||
desired_login: Acceso deseado
|
desired_login: Acceso deseado
|
||||||
destroy_confirmation: ''
|
destroy_confirmation: 'Aviso: esto eliminará al usuario ''%{login}'', todas sus
|
||||||
|
acciones, contextos, proyecto y notas. ¿Está seguro de que desea continuar?'
|
||||||
destroy_error: Hubo un error al borrar el usuario %{login}
|
destroy_error: Hubo un error al borrar el usuario %{login}
|
||||||
destroy_successful: El usuario %{login} fue destruido completamente
|
destroy_successful: El usuario %{login} fue destruido completamente
|
||||||
destroy_user: Destruir usuario
|
destroy_user: Destruir usuario
|
||||||
|
@ -1239,6 +1346,9 @@ es:
|
||||||
total_users_count: You have a total of %{count} users
|
total_users_count: You have a total of %{count} users
|
||||||
user_created: User created.
|
user_created: User created.
|
||||||
you_have_to_reset_your_password: Usted tiene que restablecer su contraseña
|
you_have_to_reset_your_password: Usted tiene que restablecer su contraseña
|
||||||
|
manage_users_title: TRACKS::Gestión de usuarios
|
||||||
|
create_error: La creación de usuario falló, ¿quizás ya tienes una cuenta aquí?
|
||||||
|
tos_error: ¡Tienes que aceptar los términos del servicio para registrarte!
|
||||||
will_paginate:
|
will_paginate:
|
||||||
next_label: Siguiente »
|
next_label: Siguiente »
|
||||||
page_entries_info:
|
page_entries_info:
|
||||||
|
@ -1258,5 +1368,94 @@ es:
|
||||||
rest_help:
|
rest_help:
|
||||||
auth:
|
auth:
|
||||||
title: Autenticación
|
title: Autenticación
|
||||||
|
basic_auth_link_text: Autenticación HTTP básica
|
||||||
|
content: La autenticación se gestiona mediante %{auth_link}. Su nombre de usuario
|
||||||
|
y contraseña de Tracks se utilizan como credenciales de autenticación para
|
||||||
|
la API. Tenga en cuenta que en la autenticación HTTP básica, su contraseña
|
||||||
|
se envía en texto claro. Si necesitas una solución de autenticación más segura,
|
||||||
|
debes configurar tu servidor web para ejecutar Tracks bajo HTTPS.
|
||||||
activeresource:
|
activeresource:
|
||||||
ror_link_text: Ruby on Rails
|
ror_link_text: Ruby on Rails
|
||||||
|
title: Consumir la API con ActiveResource
|
||||||
|
activeresource_link_text: ActiveResource
|
||||||
|
wrapper_description: 'Inspirándonos en el contenedor Highrise de %{signals_link},
|
||||||
|
creamos un pequeño contenedor Ruby (que se encuentra en el directorio doc/-)
|
||||||
|
para la interfaz que crea modelos ActiveResource para que juegues con ellos
|
||||||
|
en una sesión IRB:'
|
||||||
|
description: '%{activeresource_link} es un contenedor delgado pero poderoso
|
||||||
|
para los servicios RESTful expuestos por %{ror_link}. Será parte de Rails
|
||||||
|
2.0 pero hasta entonces podrás obtenerlo con %{gem_command}.'
|
||||||
|
signals_link_text: 37 Signals
|
||||||
|
notes:
|
||||||
|
curl_description: Todos los ejemplos utilizan %{curl}.
|
||||||
|
description: 'En la documentación se han aplicado algunas convenciones, las
|
||||||
|
cuales son:'
|
||||||
|
bullet1: '%{id} del recurso %{url} indica que debe reemplazarse con el identificador
|
||||||
|
único del recurso'
|
||||||
|
bullet2: '%{omit} indica que se han omitido partes irrelevantes de los datos
|
||||||
|
de la respuesta para aclarar la instrucción'
|
||||||
|
title: Notas sobre la documentación
|
||||||
|
title: Documentación de la API REST para desarrolladores
|
||||||
|
id: ID
|
||||||
|
curl_link_text: cURL
|
||||||
|
intro:
|
||||||
|
title: Introducción
|
||||||
|
content: Tracks está diseñado para integrarse con scripts, servicios web y aplicaciones
|
||||||
|
de terceros. Esta página sirve como documentación de nuestra API REST.
|
||||||
|
content_2: La API REST de Tracks permite a los desarrolladores integrar Tracks
|
||||||
|
en sus aplicaciones. Permite a las aplicaciones acceder a los datos de Tracks
|
||||||
|
y modificarlos, y se implementa como Vanilla XML sobre HTTP.
|
||||||
|
restful_link_text: RESTful
|
||||||
|
content_3: La API es un servicio %{restful_link}. Todos los datos están disponibles
|
||||||
|
a través de la API como un recurso al que se puede hacer referencia utilizando
|
||||||
|
un identificador único. Responde a varios de los métodos HTTP, concretamente
|
||||||
|
GET, PUT, POST y UPDATE, y todas las respuestas de la API están en un formato
|
||||||
|
XML sencillo codificado como UTF-8.
|
||||||
|
writing:
|
||||||
|
example_todo_response_title: 'La respuesta es de nuevo un %{response_code} con
|
||||||
|
la cabecera %{header} indicando dónde se puede encontrar el nuevo recurso
|
||||||
|
todo. Cambiando las notas de todo, de nuevo usando curl:'
|
||||||
|
title: Escribiendo en la API
|
||||||
|
example_project_response_title: 'La respuesta es un %{response_code} con una
|
||||||
|
cabecera %{header} que indica dónde se puede encontrar el nuevo recurso del
|
||||||
|
proyecto. Ahora podemos añadir una tarea a este proyecto, usando curl:'
|
||||||
|
example_todo_name: Modelar la casa del árbol en SketchUp
|
||||||
|
example_note_text: usar textura de arce
|
||||||
|
example_delete_title: 'Si queremos borrar esa tarea podemos llamar a su identificador
|
||||||
|
único de recurso (la URL) con el método HTTP %{delete}, de nuevo con curl:'
|
||||||
|
example_delete_response_title: La API devuelve un %{response_code} y la tarea
|
||||||
|
se elimina.
|
||||||
|
example_title: 'Creando un nuevo proyecto, usando curl:'
|
||||||
|
description: La API proporciona mecanismos para añadir, actualizar y eliminar
|
||||||
|
recursos utilizando los métodos HTTP %{put}, %{post} y %{delete} en combinación
|
||||||
|
con el contenido.
|
||||||
|
example_project_name: Construir una casa en el árbol para los niños
|
||||||
|
example_note_response_title: 'La respuesta es un %{response_code} con en el
|
||||||
|
cuerpo la representación XML de la tarea actualizada. Proporcionamos un método
|
||||||
|
abreviado para activar o desactivar una tarea sin tener que realizar la actualización
|
||||||
|
con los valores de campo correctos:'
|
||||||
|
retrieve:
|
||||||
|
content: 'Para recuperar datos basta con hacer un HTTP GET sobre un identificador
|
||||||
|
de recurso. Por ejemplo, si desea obtener todos los contextos con %{curl_link}:'
|
||||||
|
single_context: 'Obtener un contexto único:'
|
||||||
|
todos_from_context: 'Obtener las tareas dentro de un contexto:'
|
||||||
|
paths_title: 'Todos los datos están disponibles según las siguientes rutas de
|
||||||
|
recursos:'
|
||||||
|
active_todos: 'Si sólo quieres obtener las tareas activas, añade el parámetro
|
||||||
|
%{active_code} y ponlo en algún valor como este:'
|
||||||
|
title: Recuperar datos de la API
|
||||||
|
projects: También puede aplicar el patrón mostrado anteriormente con proyectos
|
||||||
|
en lugar de contextos.
|
||||||
|
limit: 'Para los recursos de tareas pendientes (tareas, tickler, hecho, oculto
|
||||||
|
y calendario), puede limitar el campo devuelto a %{fields} agregando el parámetro
|
||||||
|
%{limit_parameter} y configurándolo en %{set_to}. Por ejemplo:'
|
||||||
|
response:
|
||||||
|
title: Tratamiento de la respuesta y estado de la respuesta
|
||||||
|
description: Todas las operaciones exitosas responden con un código de estado
|
||||||
|
de %{response_200} o %{response_201} dependiendo de la operación. A veces
|
||||||
|
una lista, digamos %{example_call} no tendrá ningún elemento, devolverá una
|
||||||
|
lista vacía.
|
||||||
|
xml_description: 'El XML para las respuestas de la lista vacía tiene este aspecto,
|
||||||
|
de nuevo con curl:'
|
||||||
|
auth_type:
|
||||||
|
database: Base de datos
|
||||||
|
|
|
@ -132,7 +132,7 @@ fi:
|
||||||
not_available_abbr: ei
|
not_available_abbr: ei
|
||||||
note:
|
note:
|
||||||
one: 1 muistiinpano
|
one: 1 muistiinpano
|
||||||
other: "%{count} muistiinpanoa"
|
other: '%{count} muistiinpanoa'
|
||||||
zero: ei muistiinpanoja
|
zero: ei muistiinpanoja
|
||||||
notes: Muistiinpanot
|
notes: Muistiinpanot
|
||||||
numbered_step: Askel %{number}
|
numbered_step: Askel %{number}
|
||||||
|
@ -1268,7 +1268,7 @@ fi:
|
||||||
tickler_items_due:
|
tickler_items_due:
|
||||||
one: Yksi muistilistan merkintä on nyt ajankohtainen – päivitä sivu nähdäksesi
|
one: Yksi muistilistan merkintä on nyt ajankohtainen – päivitä sivu nähdäksesi
|
||||||
sen.
|
sen.
|
||||||
other: '{%count} muistilistan merkintää on nyt ajankohtaisia – päivitä sivu
|
other: '%{count} muistilistan merkintää on nyt ajankohtaisia – päivitä sivu
|
||||||
nähdäksesi ne.'
|
nähdäksesi ne.'
|
||||||
to_tickler: muistilistaan
|
to_tickler: muistilistaan
|
||||||
unable_to_add_dependency: Riippuvuuden lisääminen epäonnistui
|
unable_to_add_dependency: Riippuvuuden lisääminen epäonnistui
|
||||||
|
@ -1331,6 +1331,9 @@ fi:
|
||||||
total_users_count: Sinulla on yhteensä %{count} käyttäjää
|
total_users_count: Sinulla on yhteensä %{count} käyttäjää
|
||||||
user_created: Käyttäjä luotu.
|
user_created: Käyttäjä luotu.
|
||||||
you_have_to_reset_your_password: Palauta salasanasi
|
you_have_to_reset_your_password: Palauta salasanasi
|
||||||
|
create_error: Tunnuksen luominen epäonnistui, ehkä sinulla on jo käyttäjätunnus
|
||||||
|
täällä?
|
||||||
|
tos_error: Sinun täytyy hyväksyä käyttöehdot rekisteröityäksesi!
|
||||||
will_paginate:
|
will_paginate:
|
||||||
next_label: Seuraava →
|
next_label: Seuraava →
|
||||||
page_entries_info:
|
page_entries_info:
|
||||||
|
|
|
@ -921,7 +921,7 @@ fr:
|
||||||
delete: Supprimer
|
delete: Supprimer
|
||||||
delete_action: Supprimer action
|
delete_action: Supprimer action
|
||||||
delete_recurring_action_confirm: Êtes-vous sûr·e de vouloir supprimer l'action
|
delete_recurring_action_confirm: Êtes-vous sûr·e de vouloir supprimer l'action
|
||||||
récurrente « % {description} » ?
|
récurrente « %{description} » ?
|
||||||
delete_recurring_action_title: Supprimer l'action récurrente
|
delete_recurring_action_title: Supprimer l'action récurrente
|
||||||
deleted_success: Action supprimée avec succès.
|
deleted_success: Action supprimée avec succès.
|
||||||
depends_on: Dépend de
|
depends_on: Dépend de
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
---
|
|
||||||
nl:
|
nl:
|
||||||
activerecord:
|
activerecord:
|
||||||
attributes:
|
attributes:
|
||||||
|
@ -70,8 +69,8 @@ nl:
|
||||||
odd: moet oneven zijn
|
odd: moet oneven zijn
|
||||||
record_invalid: 'Validatie mislukt: %{errors}'
|
record_invalid: 'Validatie mislukt: %{errors}'
|
||||||
restrict_dependent_destroy:
|
restrict_dependent_destroy:
|
||||||
many: Kan record niet verwijderen omdat afhankelijke %{record} bestaan
|
|
||||||
one: Kan record niet verwijderen omdat een afhankelijk %{record} bestaat
|
one: Kan record niet verwijderen omdat een afhankelijk %{record} bestaat
|
||||||
|
many: Kan record niet verwijderen omdat afhankelijke %{record} bestaan
|
||||||
taken: is al gepakt
|
taken: is al gepakt
|
||||||
too_long: is te lang (maximum is %{count} karakters)
|
too_long: is te lang (maximum is %{count} karakters)
|
||||||
too_short: is te kort (minimum is %{count} karakters)
|
too_short: is te kort (minimum is %{count} karakters)
|
||||||
|
@ -87,7 +86,7 @@ nl:
|
||||||
body: Er waren problemen met de volgende velden
|
body: Er waren problemen met de volgende velden
|
||||||
header:
|
header:
|
||||||
one: 1 fout voorkomt het kunnen bewaren van deze %{model}
|
one: 1 fout voorkomt het kunnen bewaren van deze %{model}
|
||||||
other: "%{count} fouten voorkomen dat dit %{model} bewaard kan worden"
|
other: '%{count} fouten voorkomen dat dit %{model} bewaard kan worden'
|
||||||
common:
|
common:
|
||||||
action: Actie
|
action: Actie
|
||||||
actions: Acties
|
actions: Acties
|
||||||
|
@ -145,11 +144,13 @@ nl:
|
||||||
show_all: Toon alle
|
show_all: Toon alle
|
||||||
sort:
|
sort:
|
||||||
alphabetically: Alfabetisch
|
alphabetically: Alfabetisch
|
||||||
alphabetically_confirm: Weet u zeker dat u deze projecten alfabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen.
|
alphabetically_confirm: Weet u zeker dat u deze projecten alfabetisch wilt sorteren?
|
||||||
|
Dat zal de huidige sorteervolgorde aanpassen.
|
||||||
alphabetically_title: Sorteer projecten alfabetisch
|
alphabetically_title: Sorteer projecten alfabetisch
|
||||||
by_task_count: Op aantal acties
|
by_task_count: Op aantal acties
|
||||||
by_task_count_title: Sorteer op aantal acties
|
by_task_count_title: Sorteer op aantal acties
|
||||||
by_task_count_title_confirm: Weet u zeker dat u deze op aantal acties wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen.
|
by_task_count_title_confirm: Weet u zeker dat u deze op aantal acties wilt sorteren?
|
||||||
|
Dat zal de huidige sorteervolgorde aanpassen.
|
||||||
sort: Sorteer
|
sort: Sorteer
|
||||||
third: Derde
|
third: Derde
|
||||||
todo: actie
|
todo: actie
|
||||||
|
@ -167,7 +168,8 @@ nl:
|
||||||
context_name: Context naam
|
context_name: Context naam
|
||||||
context_state: Status
|
context_state: Status
|
||||||
delete_context: Verwijder context
|
delete_context: Verwijder context
|
||||||
delete_context_confirmation: Weet u zeker dat u de context '%{name}' wilt verwijderen? Merk op dat dit ook alle (herhalende) acties in deze context zal verwijderen!
|
delete_context_confirmation: Weet u zeker dat u de context '%{name}' wilt verwijderen?
|
||||||
|
Merk op dat dit ook alle (herhalende) acties in deze context zal verwijderen!
|
||||||
delete_context_title: Verwijder context
|
delete_context_title: Verwijder context
|
||||||
edit_context: Bewerk context
|
edit_context: Bewerk context
|
||||||
hidden_contexts: Verborgen contexten
|
hidden_contexts: Verborgen contexten
|
||||||
|
@ -279,16 +281,16 @@ nl:
|
||||||
other: over %{count} jaren
|
other: over %{count} jaren
|
||||||
x_days:
|
x_days:
|
||||||
one: 1 dag
|
one: 1 dag
|
||||||
other: "%{count} dagen"
|
other: '%{count} dagen'
|
||||||
x_minutes:
|
x_minutes:
|
||||||
one: 1 minuut
|
one: 1 minuut
|
||||||
other: "%{count} minuten"
|
other: '%{count} minuten'
|
||||||
x_months:
|
x_months:
|
||||||
one: 1 maand
|
one: 1 maand
|
||||||
other: "%{count} maanden"
|
other: '%{count} maanden'
|
||||||
x_seconds:
|
x_seconds:
|
||||||
one: 1 seconde
|
one: 1 seconde
|
||||||
other: "%{count} seconden"
|
other: '%{count} seconden'
|
||||||
prompts:
|
prompts:
|
||||||
day: Dag
|
day: Dag
|
||||||
hour: Uur
|
hour: Uur
|
||||||
|
@ -321,7 +323,8 @@ nl:
|
||||||
too_long: is te lang (maximum is %{count} karakters)
|
too_long: is te lang (maximum is %{count} karakters)
|
||||||
too_short: is te kort (minimum is %{count} karakters)
|
too_short: is te kort (minimum is %{count} karakters)
|
||||||
wrong_length: is de verkeerde lengte (zou %{count} karakters moeten zijn)
|
wrong_length: is de verkeerde lengte (zou %{count} karakters moeten zijn)
|
||||||
user_unauthorized: '401 Unauthorized: Alleen administratieve gebruikers mogen deze functie gebruiken.'
|
user_unauthorized: '401 Unauthorized: Alleen administratieve gebruikers mogen
|
||||||
|
deze functie gebruiken.'
|
||||||
feedlist:
|
feedlist:
|
||||||
actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen
|
actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen
|
||||||
actions_due_next_week: Acties die binnen 7 dagen afgerond moeten
|
actions_due_next_week: Acties die binnen 7 dagen afgerond moeten
|
||||||
|
@ -334,14 +337,17 @@ nl:
|
||||||
choose_context: Kies de context waar je een feed van wilt
|
choose_context: Kies de context waar je een feed van wilt
|
||||||
choose_project: Kies het project waar je een feed van wilt
|
choose_project: Kies het project waar je een feed van wilt
|
||||||
context_centric_actions: Feeds voor onafgeronde acties in een specifieke context
|
context_centric_actions: Feeds voor onafgeronde acties in een specifieke context
|
||||||
context_needed: Er moet eerst ten minste één context zijn voor je een feed kan opvragen
|
context_needed: Er moet eerst ten minste één context zijn voor je een feed kan
|
||||||
|
opvragen
|
||||||
ical_feed: iCal feed
|
ical_feed: iCal feed
|
||||||
last_fixed_number: Laatste %{number} acties
|
last_fixed_number: Laatste %{number} acties
|
||||||
legend: Legenda
|
legend: Legenda
|
||||||
notice_incomplete_only: 'Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld.'
|
notice_incomplete_only: 'Merk op: alle feeds laten alleen acties zien die niet
|
||||||
|
afgerond zijn, tenzij anders vermeld.'
|
||||||
plain_text_feed: Reguliere tekst feed
|
plain_text_feed: Reguliere tekst feed
|
||||||
project_centric: Feeds voor onafgeronde acties in een specifiek project
|
project_centric: Feeds voor onafgeronde acties in een specifiek project
|
||||||
project_needed: Er moet ten minste één project zijn voor een feed opgevraagd kan worden
|
project_needed: Er moet ten minste één project zijn voor een feed opgevraagd kan
|
||||||
|
worden
|
||||||
projects_and_actions: Actieve projecten met hun acties
|
projects_and_actions: Actieve projecten met hun acties
|
||||||
rss_feed: RSS Feed
|
rss_feed: RSS Feed
|
||||||
select_feed_for_context: Kies de feed voor deze context
|
select_feed_for_context: Kies de feed voor deze context
|
||||||
|
@ -359,52 +365,83 @@ nl:
|
||||||
integrations:
|
integrations:
|
||||||
sections:
|
sections:
|
||||||
automatic_email: Email jezelf automatisch de acties met een aflopende deadline
|
automatic_email: Email jezelf automatisch de acties met een aflopende deadline
|
||||||
message_gateway: Integreer Tracks met een email server om een actie via email naar Tracks te sturen
|
message_gateway: Integreer Tracks met een email server om een actie via email
|
||||||
|
naar Tracks te sturen
|
||||||
mailgun: Send emails to Tracks with Mailgun
|
mailgun: Send emails to Tracks with Mailgun
|
||||||
email_rich: Rich Todo Message email format
|
email_rich: Rich Todo Message email format
|
||||||
opensearch_description: Zoek in Tracks
|
opensearch_description: Zoek in Tracks
|
||||||
title: Integratie
|
title: Integratie
|
||||||
intro: "Tracks kan met een aantal tools worden geïntegreerd... Alles om je te helpen om dingen gedaan te krijgen! Deze pagina heeft informatie over het tot stand brengen van sommige integratievormen. Deze voorbeelden zijn niet altijd voor alle platformen van toepassing en sommige voorbeelden vragen meer technische kennis dan anderen Zie ook %{documentation_link}."
|
intro: "Tracks kan met een aantal tools worden geïntegreerd... Alles om je te
|
||||||
developer_documentation_link: "de documentatie voor ontwikkelaars met Tracks' REST API"
|
helpen om dingen gedaan te krijgen! Deze pagina heeft informatie over het tot
|
||||||
|
stand brengen van sommige integratievormen. Deze voorbeelden zijn niet altijd
|
||||||
|
voor alle platformen van toepassing en sommige voorbeelden vragen meer technische
|
||||||
|
kennis dan anderen Zie ook %{documentation_link}."
|
||||||
|
developer_documentation_link: "de documentatie voor ontwikkelaars met Tracks'
|
||||||
|
REST API"
|
||||||
contents_header: "Inhoud:"
|
contents_header: "Inhoud:"
|
||||||
add_your_own: Heb je een tip om hier toe te voegen? %{tell_us_link} en misschien voegen we jouw tip toe op deze pagina in een toekomstige versie van Tracks.
|
add_your_own: Heb je een tip om hier toe te voegen? %{tell_us_link} en misschien
|
||||||
|
voegen we jouw tip toe op deze pagina in een toekomstige versie van Tracks.
|
||||||
tell_us_link_text: Vertel ons er over in onze issue queue
|
tell_us_link_text: Vertel ons er over in onze issue queue
|
||||||
cron_1: Als je de volgende regel toevoegd aan jouw crontab, dat ontvang je een e-mail op elke dag rond 05:00 met een lijst met acties waarvan de deadline afloopt binnen de komende 7 dagen.
|
cron_1: Als je de volgende regel toevoegd aan jouw crontab, dat ontvang je een
|
||||||
cron_2: "Uiteraard kan je ook een andere %{feeds_link} – bijvoorbeeld een email met een lijst van acties voor een specifiek project naar een groep collega's die werken aan dat project?"
|
e-mail op elke dag rond 05:00 met een lijst met acties waarvan de deadline afloopt
|
||||||
|
binnen de komende 7 dagen.
|
||||||
|
cron_2: "Uiteraard kan je ook een andere %{feeds_link} – bijvoorbeeld een email
|
||||||
|
met een lijst van acties voor een specifiek project naar een groep collega's
|
||||||
|
die werken aan dat project?"
|
||||||
cron_email_subject: Tracks actions due in the next 7 days
|
cron_email_subject: Tracks actions due in the next 7 days
|
||||||
feeds_link_text: text feed gebruiken die Tracks biedt
|
feeds_link_text: text feed gebruiken die Tracks biedt
|
||||||
message_gateway:
|
message_gateway:
|
||||||
description: 'Als Tracks draait op dezelfde server als jouw mailserver, dan kan je de geïntegreerde mail handler gebruiken van Tracks. Om dit in te stellen:'
|
description: 'Als Tracks draait op dezelfde server als jouw mailserver, dan
|
||||||
rich_api_tip: 'Je kan ook de Rich Todo API gebruiken om acties te maken zoals "do laundry @ Home" of "Call Bill > project X". Het onderwerp van het bericht zal de bijschrijving van de actie vullen, de context, en het project, terwijl de body van het bericht de notities van de actie zal vullen.'
|
kan je de geïntegreerde mail handler gebruiken van Tracks. Om dit in te stellen:'
|
||||||
configuration: "Het kan nodig zijn om jouw %{site_yml} te configureren om de message gateway te laten kijken naar het %{to_name} veld of het %{from_name} veld om de Tracks-gebruiker op te zoeken met het emailadres uit dat veld."
|
rich_api_tip: 'Je kan ook de Rich Todo API gebruiken om acties te maken zoals
|
||||||
one_user_configuration: "Je kan ook alle email naar een specifieke Tracks gebruiker sturen. Stel mail_dispatch in site.yml in op %{single_user_value} en geeft de login van de gebruiker door: %{code}"
|
"do laundry @ Home" of "Call Bill > project X". Het onderwerp van het bericht
|
||||||
|
zal de bijschrijving van de actie vullen, de context, en het project, terwijl
|
||||||
|
de body van het bericht de notities van de actie zal vullen.'
|
||||||
|
configuration: "Het kan nodig zijn om jouw %{site_yml} te configureren om de
|
||||||
|
message gateway te laten kijken naar het %{to_name} veld of het %{from_name}
|
||||||
|
veld om de Tracks-gebruiker op te zoeken met het emailadres uit dat veld."
|
||||||
|
one_user_configuration: "Je kan ook alle email naar een specifieke Tracks gebruiker
|
||||||
|
sturen. Stel mail_dispatch in site.yml in op %{single_user_value} en geeft
|
||||||
|
de login van de gebruiker door: %{code}"
|
||||||
instructions:
|
instructions:
|
||||||
'1': 'Ga naar %{preferences_link} en stel in "%{sms_email_name}" en "%{sms_context_name}" voor acties die verzonden zijn via email (die bijv. komen via een SMS message)'
|
'1': 'Ga naar %{preferences_link} en stel in "%{sms_email_name}" en "%{sms_context_name}"
|
||||||
'2': In sendmail/qmail/postfix/whatever, stel een email address alias in om berichten door te sturen naar %{command}
|
voor acties die verzonden zijn via email (die bijv. komen via een SMS message)'
|
||||||
|
'2': In sendmail/qmail/postfix/whatever, stel een email address alias in om
|
||||||
|
berichten door te sturen naar %{command}
|
||||||
'3': Verstuur een email naar het net geconfigureerde e-mail adres!
|
'3': Verstuur een email naar het net geconfigureerde e-mail adres!
|
||||||
mailgun:
|
mailgun:
|
||||||
description: If you want to email tasks to Tracks, but cannot run a mailserver on the same host, you could use the %{mailgun_link} support built in to Tracks.
|
description: If you want to email tasks to Tracks, but cannot run a mailserver
|
||||||
conditions: For this to work your Tracks server will need to be reachable from the internet, so that Mailgun can POST data to it.
|
on the same host, you could use the %{mailgun_link} support built in to Tracks.
|
||||||
gateway_instructions: All the comments about the email format from the section above apply to the Mailgun handling, as the data is processed the same way
|
conditions: For this to work your Tracks server will need to be reachable from
|
||||||
|
the internet, so that Mailgun can POST data to it.
|
||||||
|
gateway_instructions: All the comments about the email format from the section
|
||||||
|
above apply to the Mailgun handling, as the data is processed the same way
|
||||||
instructions:
|
instructions:
|
||||||
'1': Go to %{mailgun_link} and register for a free account.
|
'1': Go to %{mailgun_link} and register for a free account.
|
||||||
'2': "Go to 'Routes' in the Mailgun control panel, and add a new route:"
|
'2': "Go to 'Routes' in the Mailgun control panel, and add a new route:"
|
||||||
2a: "'Filter expression' should be set to 'catch_all()'"
|
2a: "'Filter expression' should be set to 'catch_all()'"
|
||||||
2b: "'Action' should be 'forward(\"http://mytracksserver.example.com/mailgun/mime\")'"
|
2b: "'Action' should be 'forward(\"http://mytracksserver.example.com/mailgun/mime\"\
|
||||||
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address (e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
)'"
|
||||||
'4': 'Select a default context for emails to be put in with "%{sms_context_name"'
|
'3': 'Go to %{preferences_link} and enter your incoming Mailgun email address
|
||||||
|
(e.g. tracks@user.mailgun.com) in the "%{sms_email_name}" box.'
|
||||||
|
'4': 'Select a default context for emails to be put in with "%{sms_context_name}"'
|
||||||
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
'5': "Add your Mailgun API key (not the Public API key) to the Tracks 'site.yml'"
|
||||||
'6': "Update the mailmap in 'site.yml' to define which senders can send emails to which incoming addresses. For example, to send emails from your work and home email accounts to your tracks Mailgun route, set it up like this: %{code}"
|
'6': "Update the mailmap in 'site.yml' to define which senders can send emails
|
||||||
|
to which incoming addresses. For example, to send emails from your work
|
||||||
|
and home email accounts to your tracks Mailgun route, set it up like this:
|
||||||
|
%{code}"
|
||||||
email_rich:
|
email_rich:
|
||||||
description: "For both of the above methods, the follow format can be used:"
|
description: "For both of the above methods, the follow format can be used:"
|
||||||
fields_title: "The fields are:"
|
fields_title: "The fields are:"
|
||||||
symbol_title: Symbol
|
symbol_title: Symbol
|
||||||
meaning_title: Meaning
|
meaning_title: Meaning
|
||||||
fields_instruction: All symbols are optional, and text up to the first symbol (or end of string) is used as the description of the todo
|
fields_instruction: All symbols are optional, and text up to the first symbol
|
||||||
|
(or end of string) is used as the description of the todo
|
||||||
field_descriptions:
|
field_descriptions:
|
||||||
context: The context to place the Todo in
|
context: The context to place the Todo in
|
||||||
project: The project to place the Todo in
|
project: The project to place the Todo in
|
||||||
due_date: The due date for the Todo (may be 2 digits for day, 4 digits for month-day, or 6 digits for year-month-day)
|
due_date: The due date for the Todo (may be 2 digits for day, 4 digits for
|
||||||
|
month-day, or 6 digits for year-month-day)
|
||||||
tag: A tag to apply to the Todo – may be used multiple times
|
tag: A tag to apply to the Todo – may be used multiple times
|
||||||
star: Flag to star the Todo
|
star: Flag to star the Todo
|
||||||
example_names:
|
example_names:
|
||||||
|
@ -416,11 +453,14 @@ nl:
|
||||||
'2': tag2
|
'2': tag2
|
||||||
help:
|
help:
|
||||||
title: Help
|
title: Help
|
||||||
usage: 'You can find information on the usage in the %{manual_link} in the project GitHub wiki.'
|
usage: 'You can find information on the usage in the %{manual_link} in the project
|
||||||
|
GitHub wiki.'
|
||||||
manual_link_text: User manual
|
manual_link_text: User manual
|
||||||
bugs: 'If you encounter a bug or have a feature request, please report it in the %{issue_link}.'
|
bugs: 'If you encounter a bug or have a feature request, please report it in the
|
||||||
|
%{issue_link}.'
|
||||||
issue_link_text: issue queue
|
issue_link_text: issue queue
|
||||||
contribute: 'We gladly welcome all contributions to Tracks. Check the %{contribute_link} for further information. You can also come discuss with the community:'
|
contribute: 'We gladly welcome all contributions to Tracks. Check the %{contribute_link}
|
||||||
|
for further information. You can also come discuss with the community:'
|
||||||
contribute_link_text: project website
|
contribute_link_text: project website
|
||||||
mailing_list_link_text: Mailing list
|
mailing_list_link_text: Mailing list
|
||||||
irc_bullet: '%{irc_link} (also available in %{matrix_link})'
|
irc_bullet: '%{irc_link} (also available in %{matrix_link})'
|
||||||
|
@ -495,14 +535,16 @@ nl:
|
||||||
cas_login: CAS Inloggen
|
cas_login: CAS Inloggen
|
||||||
cas_no_user_found: Hallo,%{username}! Je hebt nog geen account op Tracks.
|
cas_no_user_found: Hallo,%{username}! Je hebt nog geen account op Tracks.
|
||||||
cas_signup_link: Aanvragen account
|
cas_signup_link: Aanvragen account
|
||||||
cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (%{username})
|
cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat
|
||||||
|
(%{username})
|
||||||
log_in_again: opnieuw in te loggen.
|
log_in_again: opnieuw in te loggen.
|
||||||
logged_out: Je bent afgemeld bij Tracks.
|
logged_out: Je bent afgemeld bij Tracks.
|
||||||
login_cas: Ga naar het CAS
|
login_cas: Ga naar het CAS
|
||||||
login_standard: Ga terug naar de standaard login
|
login_standard: Ga terug naar de standaard login
|
||||||
login_with_openid: inloggen met een OpenID
|
login_with_openid: inloggen met een OpenID
|
||||||
mobile_use_openid: "... if inloggen met een OpenID"
|
mobile_use_openid: "... if inloggen met een OpenID"
|
||||||
openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat (%{identity_url})
|
openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat
|
||||||
|
(%{identity_url})
|
||||||
option_separator: of,
|
option_separator: of,
|
||||||
please_login: Log in om Tracks te gebruiken
|
please_login: Log in om Tracks te gebruiken
|
||||||
session_time_out: Sessie is verlopen. Gelieve %{link}
|
session_time_out: Sessie is verlopen. Gelieve %{link}
|
||||||
|
@ -530,8 +572,10 @@ nl:
|
||||||
todo:
|
todo:
|
||||||
error_date_must_be_future: moet een datum in de toekomst zijn
|
error_date_must_be_future: moet een datum in de toekomst zijn
|
||||||
user:
|
user:
|
||||||
error_context_not_associated: Context %{context} niet geassocieerd met gebruikers %{user}.
|
error_context_not_associated: Context %{context} niet geassocieerd met gebruikers
|
||||||
error_project_not_associated: Project %{project} niet geassocieerd met gebruikers %{user}.
|
%{user}.
|
||||||
|
error_project_not_associated: Project %{project} niet geassocieerd met gebruikers
|
||||||
|
%{user}.
|
||||||
notes:
|
notes:
|
||||||
delete_confirmation: Weet u zeker dat u de notitie '%{id}' wilt verwijderen?
|
delete_confirmation: Weet u zeker dat u de notitie '%{id}' wilt verwijderen?
|
||||||
delete_item_title: Verwijder item
|
delete_item_title: Verwijder item
|
||||||
|
@ -540,7 +584,8 @@ nl:
|
||||||
deleted_note: Verwijder notitie '%{id}'
|
deleted_note: Verwijder notitie '%{id}'
|
||||||
edit_item_title: Item bewerken
|
edit_item_title: Item bewerken
|
||||||
in_project: 'In:'
|
in_project: 'In:'
|
||||||
no_notes_available: 'Momenteel zijn er geen notities: voeg notities toe aan projecten vanaf de individuele project pagina''s.'
|
no_notes_available: 'Momenteel zijn er geen notities: voeg notities toe aan projecten
|
||||||
|
vanaf de individuele project pagina''s.'
|
||||||
note_header: Notitie %{id}
|
note_header: Notitie %{id}
|
||||||
note_link_title: Toon notitie %{id}
|
note_link_title: Toon notitie %{id}
|
||||||
note_location_link: 'In:'
|
note_location_link: 'In:'
|
||||||
|
@ -551,17 +596,17 @@ nl:
|
||||||
format:
|
format:
|
||||||
delimiter: "."
|
delimiter: "."
|
||||||
format: "%u %n"
|
format: "%u %n"
|
||||||
precision: 2
|
precision: '2'
|
||||||
separator: ","
|
separator: ","
|
||||||
significant: false
|
significant: 'False'
|
||||||
strip_insignificant_zeros: false
|
strip_insignificant_zeros: 'False'
|
||||||
unit: "€"
|
unit: "€"
|
||||||
format:
|
format:
|
||||||
delimiter: "."
|
delimiter: "."
|
||||||
precision: 3
|
precision: '3'
|
||||||
separator: ","
|
separator: ","
|
||||||
significant: false
|
significant: 'False'
|
||||||
strip_insignificant_zeros: false
|
strip_insignificant_zeros: 'False'
|
||||||
human:
|
human:
|
||||||
decimal_units:
|
decimal_units:
|
||||||
format: "%n %u"
|
format: "%n %u"
|
||||||
|
@ -574,9 +619,9 @@ nl:
|
||||||
unit: "."
|
unit: "."
|
||||||
format:
|
format:
|
||||||
delimiter: "."
|
delimiter: "."
|
||||||
precision: 1
|
precision: '1'
|
||||||
significant: true
|
significant: 'True'
|
||||||
strip_insignificant_zeros: true
|
strip_insignificant_zeros: 'True'
|
||||||
storage_units:
|
storage_units:
|
||||||
format: "%n %u"
|
format: "%n %u"
|
||||||
units:
|
units:
|
||||||
|
@ -602,14 +647,18 @@ nl:
|
||||||
current_authentication_type: Uw authenticatietype is %{auth_type}
|
current_authentication_type: Uw authenticatietype is %{auth_type}
|
||||||
edit_preferences: Voorkeuren bewerken
|
edit_preferences: Voorkeuren bewerken
|
||||||
generate_new_token: Genereer een nieuwe token
|
generate_new_token: Genereer een nieuwe token
|
||||||
generate_new_token_confirm: Weet u dit zeker? Het genereren van een nieuw token zal de bestaande te vervangen en dit zal het extern gebruiken van de oude token laten mislukken.
|
generate_new_token_confirm: Weet u dit zeker? Het genereren van een nieuw token
|
||||||
|
zal de bestaande te vervangen en dit zal het extern gebruiken van de oude token
|
||||||
|
laten mislukken.
|
||||||
is_false: Nee
|
is_false: Nee
|
||||||
is_true: Ja
|
is_true: Ja
|
||||||
open_id_url: Uw OpenID URL is
|
open_id_url: Uw OpenID URL is
|
||||||
page_title: 'TRACKS:: Voorkeuren'
|
page_title: 'TRACKS:: Voorkeuren'
|
||||||
page_title_edit: 'TRACKS:: Voorkeuren bewerken'
|
page_title_edit: 'TRACKS:: Voorkeuren bewerken'
|
||||||
password_changed: Je wachtwoord is gewijzigd, meld je opnieuw aan.
|
password_changed: Je wachtwoord is gewijzigd, meld je opnieuw aan.
|
||||||
remove_introduction: You can remove your user account here. Note that this is irreversible and will remove all your data! After removal you will be logged out.
|
remove_introduction: You can remove your user account here. Note that this is
|
||||||
|
irreversible and will remove all your data! After removal you will be logged
|
||||||
|
out.
|
||||||
show_number_completed: Toon %{number} voltooide items
|
show_number_completed: Toon %{number} voltooide items
|
||||||
sms_context_none: Geen
|
sms_context_none: Geen
|
||||||
staleness_starts_after: Markeren openstaande acties begint na %{days} dagen
|
staleness_starts_after: Markeren openstaande acties begint na %{days} dagen
|
||||||
|
@ -629,7 +678,8 @@ nl:
|
||||||
add_note: Een notitie toevoegen
|
add_note: Een notitie toevoegen
|
||||||
add_note_submit: Notitie toevoegen
|
add_note_submit: Notitie toevoegen
|
||||||
add_project: Voeg project toe
|
add_project: Voeg project toe
|
||||||
all_completed_tasks_title: TRACKS::Overzicht van all afgeronde acties in project '%{project_name}'
|
all_completed_tasks_title: TRACKS::Overzicht van all afgeronde acties in project
|
||||||
|
'%{project_name}'
|
||||||
completed_actions: Completed actions
|
completed_actions: Completed actions
|
||||||
completed_actions_empty: Completed actions empty
|
completed_actions_empty: Completed actions empty
|
||||||
completed_projects: Voltooide projecten
|
completed_projects: Voltooide projecten
|
||||||
|
@ -641,7 +691,8 @@ nl:
|
||||||
deferred_actions: Deferred actions
|
deferred_actions: Deferred actions
|
||||||
deferred_actions_empty: Deferred actions empty
|
deferred_actions_empty: Deferred actions empty
|
||||||
delete_project: Project verwijderen
|
delete_project: Project verwijderen
|
||||||
delete_project_confirmation: Weet u zeker dat u wilt het project '%{name} wilt verwijderen?
|
delete_project_confirmation: Weet u zeker dat u wilt het project '%{name} wilt
|
||||||
|
verwijderen?
|
||||||
delete_project_title: Verwijder het project
|
delete_project_title: Verwijder het project
|
||||||
edit_project_settings: Bewerk project instellingen
|
edit_project_settings: Bewerk project instellingen
|
||||||
edit_project_title: Bewerk project
|
edit_project_title: Bewerk project
|
||||||
|
@ -749,11 +800,15 @@ nl:
|
||||||
action_selection_title: 'TRACKS:: Actie selectie'
|
action_selection_title: 'TRACKS:: Actie selectie'
|
||||||
actions: Acties
|
actions: Acties
|
||||||
actions_30days_title: Acties in de afgelopen 30 dagen
|
actions_30days_title: Acties in de afgelopen 30 dagen
|
||||||
actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt
|
actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld
|
||||||
|
%{count} acties gemaakt
|
||||||
actions_avg_completed: en voltooide een gemiddelde van %{count} acties per maand.
|
actions_avg_completed: en voltooide een gemiddelde van %{count} acties per maand.
|
||||||
actions_avg_completed_30days: en voltooide een gemiddelde van %{count} acties per dag.
|
actions_avg_completed_30days: en voltooide een gemiddelde van %{count} acties
|
||||||
actions_avg_completion_time: Van al uw afgeronde acties, de gemiddelde tijd dat dit in beslag nam is %{count} dagen.
|
per dag.
|
||||||
actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld%{count} acties aangemaakt
|
actions_avg_completion_time: Van al uw afgeronde acties, de gemiddelde tijd dat
|
||||||
|
dit in beslag nam is %{count} dagen.
|
||||||
|
actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld%{count} acties
|
||||||
|
aangemaakt
|
||||||
actions_day_of_week_legend:
|
actions_day_of_week_legend:
|
||||||
day_of_week: Dag van de week
|
day_of_week: Dag van de week
|
||||||
number_of_actions: Aantal acties
|
number_of_actions: Aantal acties
|
||||||
|
@ -762,7 +817,7 @@ nl:
|
||||||
day_of_week: Dag van de week
|
day_of_week: Dag van de week
|
||||||
number_of_actions: Aantal acties
|
number_of_actions: Aantal acties
|
||||||
actions_dow_30days_title: Dag van de week (laatste 30 dagen)
|
actions_dow_30days_title: Dag van de week (laatste 30 dagen)
|
||||||
actions_further: en verder
|
actions_further: ' en verder'
|
||||||
actions_last_year: Acties in de afgelopen jaren
|
actions_last_year: Acties in de afgelopen jaren
|
||||||
actions_last_year_legend:
|
actions_last_year_legend:
|
||||||
months_ago: Maanden geleden
|
months_ago: Maanden geleden
|
||||||
|
@ -773,10 +828,13 @@ nl:
|
||||||
actions_selected_from_week: Gekozen acties van week
|
actions_selected_from_week: Gekozen acties van week
|
||||||
click_to_return: Klik %{link} om terug te keren naar de statistieken pagina.
|
click_to_return: Klik %{link} om terug te keren naar de statistieken pagina.
|
||||||
click_to_return_link: hier
|
click_to_return_link: hier
|
||||||
click_to_show_actions_from_week: Klik %{link} om de acties van week %{week} en verder te zien.
|
click_to_show_actions_from_week: Klik %{link} om de acties van week %{week} en
|
||||||
click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder aan te passen.
|
verder te zien.
|
||||||
|
click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder
|
||||||
|
aan te passen.
|
||||||
contexts: Contexten
|
contexts: Contexten
|
||||||
current_running_time_of_incomplete_visible_actions: Huidige looptijd van onvolledige zichtbare acties
|
current_running_time_of_incomplete_visible_actions: Huidige looptijd van onvolledige
|
||||||
|
zichtbare acties
|
||||||
index_title: TRACKS::Statistiek
|
index_title: TRACKS::Statistiek
|
||||||
labels:
|
labels:
|
||||||
avg_completed: Gem afgerond
|
avg_completed: Gem afgerond
|
||||||
|
@ -793,7 +851,8 @@ nl:
|
||||||
number_of_days: Aantal dagen geleden
|
number_of_days: Aantal dagen geleden
|
||||||
percentage: Percentage
|
percentage: Percentage
|
||||||
running_time: Looptijd van een actie (weken)
|
running_time: Looptijd van een actie (weken)
|
||||||
more_stats_will_appear: Meer statistieken zullen hier verschijnen zodra u acties hebt toegevoegd.
|
more_stats_will_appear: Meer statistieken zullen hier verschijnen zodra u acties
|
||||||
|
hebt toegevoegd.
|
||||||
no_actions_selected: Er zijn geen acties geselecteerd.
|
no_actions_selected: Er zijn geen acties geselecteerd.
|
||||||
no_tags_available: geen tags beschikbaar
|
no_tags_available: geen tags beschikbaar
|
||||||
open_per_week: Active (zichtbare en verborgen) volgende acties per week
|
open_per_week: Active (zichtbare en verborgen) volgende acties per week
|
||||||
|
@ -812,10 +871,13 @@ nl:
|
||||||
percentage: Percentage
|
percentage: Percentage
|
||||||
weeks: Looptijd van een actie (weken). Klik op een balk voor meer info
|
weeks: Looptijd van een actie (weken). Klik op een balk voor meer info
|
||||||
spread_of_actions_for_all_context: Verdeling van acties voor alle contexten
|
spread_of_actions_for_all_context: Verdeling van acties voor alle contexten
|
||||||
spread_of_running_actions_for_visible_contexts: Verdeling van actieve acties voor zichtbare contexten
|
spread_of_running_actions_for_visible_contexts: Verdeling van actieve acties voor
|
||||||
tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen.
|
zichtbare contexten
|
||||||
|
tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt
|
||||||
|
of voltooid in de afgelopen 90 dagen.
|
||||||
tag_cloud_90days_title: Tag cloud met acties in afgelopen 90 dagen
|
tag_cloud_90days_title: Tag cloud met acties in afgelopen 90 dagen
|
||||||
tag_cloud_description: Deze tag cloud bevat tags van alle acties (afgerond, niet voltooid, zichtbaar en / of verborgen)
|
tag_cloud_description: Deze tag cloud bevat tags van alle acties (afgerond, niet
|
||||||
|
voltooid, zichtbaar en / of verborgen)
|
||||||
tag_cloud_title: Tag Cloud voor alle acties
|
tag_cloud_title: Tag Cloud voor alle acties
|
||||||
tags: Tags
|
tags: Tags
|
||||||
time_of_day: Tijd van de dag (alle acties)
|
time_of_day: Tijd van de dag (alle acties)
|
||||||
|
@ -830,7 +892,8 @@ nl:
|
||||||
top10_projects: Top 10 projecten
|
top10_projects: Top 10 projecten
|
||||||
top10_projects_30days: Top 10 project in de laatste 30 dagen
|
top10_projects_30days: Top 10 project in de laatste 30 dagen
|
||||||
top5_contexts: Top 5 contexten
|
top5_contexts: Top 5 contexten
|
||||||
top5_visible_contexts_with_incomplete_actions: Top 5 zichtbare contexten met onvolledige acties
|
top5_visible_contexts_with_incomplete_actions: Top 5 zichtbare contexten met onvolledige
|
||||||
|
acties
|
||||||
totals: Totalen
|
totals: Totalen
|
||||||
totals_action_count: u heeft een totaal van %{count} acties
|
totals_action_count: u heeft een totaal van %{count} acties
|
||||||
totals_actions_completed: "%{count} van deze zijn voltooid."
|
totals_actions_completed: "%{count} van deze zijn voltooid."
|
||||||
|
@ -851,7 +914,7 @@ nl:
|
||||||
support:
|
support:
|
||||||
array:
|
array:
|
||||||
last_word_connector: ", en"
|
last_word_connector: ", en"
|
||||||
two_words_connector: en
|
two_words_connector: ' en '
|
||||||
words_connector: ","
|
words_connector: ","
|
||||||
select:
|
select:
|
||||||
prompt: Selecteer
|
prompt: Selecteer
|
||||||
|
@ -870,8 +933,10 @@ nl:
|
||||||
action_deleted_error: Verwijderen van de actie is mislukt
|
action_deleted_error: Verwijderen van de actie is mislukt
|
||||||
action_deleted_success: Actie succesvol verwijderd
|
action_deleted_success: Actie succesvol verwijderd
|
||||||
action_due_on: "(deadline actie op %{date})"
|
action_due_on: "(deadline actie op %{date})"
|
||||||
action_marked_complete: De actie <strong>'%{description}'</strong> werd gemarkeerd als <strong>%{completed}</strong>
|
action_marked_complete: De actie <strong>'%{description}'</strong> werd gemarkeerd
|
||||||
action_marked_complete_error: De actie <strong>'%{description}'</strong> is niet gemarkeerd als <strong>%{completed} vanwege een fout op de server.</strong>
|
als <strong>%{completed}</strong>
|
||||||
|
action_marked_complete_error: De actie <strong>'%{description}'</strong> is niet
|
||||||
|
gemarkeerd als <strong>%{completed} vanwege een fout op de server.</strong>
|
||||||
action_saved: Actie opgeslagen
|
action_saved: Actie opgeslagen
|
||||||
action_saved_to_tickler: Actie opgeslagen in tickler
|
action_saved_to_tickler: Actie opgeslagen in tickler
|
||||||
actions:
|
actions:
|
||||||
|
@ -909,7 +974,8 @@ nl:
|
||||||
due_today: Deadline vandaag
|
due_today: Deadline vandaag
|
||||||
get_in_ical_format: Ontvang deze agenda in iCal-formaat
|
get_in_ical_format: Ontvang deze agenda in iCal-formaat
|
||||||
calendar_page_title: TRACKS::Agenda
|
calendar_page_title: TRACKS::Agenda
|
||||||
cannot_add_dependency_to_completed_todo: Kan deze actie niet als een afhankelijkheid van een voltooide actie toevoegen!
|
cannot_add_dependency_to_completed_todo: Kan deze actie niet als een afhankelijkheid
|
||||||
|
van een voltooide actie toevoegen!
|
||||||
clear_due_date: Maak deadline leeg
|
clear_due_date: Maak deadline leeg
|
||||||
clear_show_from_date: Maak de datum Tonen Vanaf leeg
|
clear_show_from_date: Maak de datum Tonen Vanaf leeg
|
||||||
completed: Afgerond
|
completed: Afgerond
|
||||||
|
@ -920,7 +986,8 @@ nl:
|
||||||
other: Er zijn %{count} afgeronde acties in het archief.
|
other: Er zijn %{count} afgeronde acties in het archief.
|
||||||
completed_last_day: Voltooid in de laatste 24 uur
|
completed_last_day: Voltooid in de laatste 24 uur
|
||||||
completed_last_x_days: Voltooid in de laatste %{count} dagen
|
completed_last_x_days: Voltooid in de laatste %{count} dagen
|
||||||
completed_recurrence_completed: Er is geen actie na de terugkerende actie die u new verwijderd heeft. De herhaling is voltooid
|
completed_recurrence_completed: Er is geen actie na de terugkerende actie die
|
||||||
|
u new verwijderd heeft. De herhaling is voltooid
|
||||||
completed_recurring: Afgesloten terugkerende todos
|
completed_recurring: Afgesloten terugkerende todos
|
||||||
completed_recurring_actions_title: TRACKS::Completed recurring actions
|
completed_recurring_actions_title: TRACKS::Completed recurring actions
|
||||||
completed_rest_of_month: Afgerond in de rest van deze maand
|
completed_rest_of_month: Afgerond in de rest van deze maand
|
||||||
|
@ -932,22 +999,25 @@ nl:
|
||||||
confirm_delete: Weet u zeker dat u de actie '%{description}' wilt verwijderen?
|
confirm_delete: Weet u zeker dat u de actie '%{description}' wilt verwijderen?
|
||||||
context_changed: Context veranderd in '%{name}'
|
context_changed: Context veranderd in '%{name}'
|
||||||
convert_to_project: Maak project
|
convert_to_project: Maak project
|
||||||
defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitsteldatum aan te passen.
|
defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag
|
||||||
|
bewerken alvorens uitsteldatum aan te passen.
|
||||||
defer_x_days:
|
defer_x_days:
|
||||||
one: Een dag uitstellen
|
one: Een dag uitstellen
|
||||||
other: "%{count} dagen uitstellen"
|
other: '%{count} dagen uitstellen'
|
||||||
deferred_actions_with: Uitgestelde acties met de tag '%{tag_name}'
|
deferred_actions_with: Uitgestelde acties met de tag '%{tag_name}'
|
||||||
deferred_pending_actions: Uitgestelde/wachtende acties
|
deferred_pending_actions: Uitgestelde/wachtende acties
|
||||||
deferred_tasks_title: TRACKS::Tickler
|
deferred_tasks_title: TRACKS::Tickler
|
||||||
delete: Verwijder
|
delete: Verwijder
|
||||||
delete_action: Verwijder actie
|
delete_action: Verwijder actie
|
||||||
delete_recurring_action_confirm: Weet u zeker dat u wilt de terugkerende actie '%{description}' wilt verwijderen?
|
delete_recurring_action_confirm: Weet u zeker dat u wilt de terugkerende actie
|
||||||
|
'%{description}' wilt verwijderen?
|
||||||
delete_recurring_action_title: Verwijder de terugkerende actie
|
delete_recurring_action_title: Verwijder de terugkerende actie
|
||||||
deleted_success: De actie werd met succes verwijderd.
|
deleted_success: De actie werd met succes verwijderd.
|
||||||
depends_on: Hangt af van
|
depends_on: Hangt af van
|
||||||
depends_on_separate_with_commas: Afhankelijk van (gescheiden door komma's)
|
depends_on_separate_with_commas: Afhankelijk van (gescheiden door komma's)
|
||||||
done: Voltooid?
|
done: Voltooid?
|
||||||
drag_action_title: Sleep naar een andere actie om deze afhankelijk te maken van die actie
|
drag_action_title: Sleep naar een andere actie om deze afhankelijk te maken van
|
||||||
|
die actie
|
||||||
due: Deadline
|
due: Deadline
|
||||||
edit: Bewerken
|
edit: Bewerken
|
||||||
edit_action: Actie bewerken
|
edit_action: Actie bewerken
|
||||||
|
@ -956,13 +1026,19 @@ nl:
|
||||||
error:
|
error:
|
||||||
invalid_due_date: Ongeldige deadline datum
|
invalid_due_date: Ongeldige deadline datum
|
||||||
invalid_show_from_date: Ongeldige datum voor tonen vanaf
|
invalid_show_from_date: Ongeldige datum voor tonen vanaf
|
||||||
error_completing_todo: Er was een fout bij het voltooien / activeren van de terugkerende actie '%{description}'
|
error_completing_todo: Er was een fout bij het voltooien / activeren van de terugkerende
|
||||||
error_deleting_item: Er is een fout opgetreden bij het verwijderen van het item '%{description}'
|
actie '%{description}'
|
||||||
error_deleting_recurring: Er is een fout opgetreden bij het verwijderen van het item '%{description}'
|
error_deleting_item: Er is een fout opgetreden bij het verwijderen van het item
|
||||||
error_removing_dependency: Er is een fout opgetreden het verwijderen van de afhankelijke actie
|
'%{description}'
|
||||||
error_saving_recurring: Er is een fout opgetreden het opslaan van de terugkerende actie '%{description}'
|
error_deleting_recurring: Er is een fout opgetreden bij het verwijderen van het
|
||||||
|
item '%{description}'
|
||||||
|
error_removing_dependency: Er is een fout opgetreden het verwijderen van de afhankelijke
|
||||||
|
actie
|
||||||
|
error_saving_recurring: Er is een fout opgetreden het opslaan van de terugkerende
|
||||||
|
actie '%{description}'
|
||||||
error_starring: Kon niet de ster van deze actie niet omzetten '%{description}'
|
error_starring: Kon niet de ster van deze actie niet omzetten '%{description}'
|
||||||
error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omzetten '%{description}'
|
error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omzetten
|
||||||
|
'%{description}'
|
||||||
error_toggle_complete: Kon deze actie niet als afgerond markeren
|
error_toggle_complete: Kon deze actie niet als afgerond markeren
|
||||||
feed_title_in_context: in context '%{context}'
|
feed_title_in_context: in context '%{context}'
|
||||||
feed_title_in_project: In het project '%{project}'
|
feed_title_in_project: In het project '%{project}'
|
||||||
|
@ -976,10 +1052,12 @@ nl:
|
||||||
in_hidden_state: in verborgen toestand
|
in_hidden_state: in verborgen toestand
|
||||||
in_pending_state: in wachtende toestand
|
in_pending_state: in wachtende toestand
|
||||||
list_incomplete_next_actions: Toon onvoltooide acties
|
list_incomplete_next_actions: Toon onvoltooide acties
|
||||||
list_incomplete_next_actions_with_limit: Toont de laatste %{count} onvoltooide acties
|
list_incomplete_next_actions_with_limit: Toont de laatste %{count} onvoltooide
|
||||||
|
acties
|
||||||
mark_complete: Markeer gereed
|
mark_complete: Markeer gereed
|
||||||
mobile_todos_page_title: Alle acties
|
mobile_todos_page_title: Alle acties
|
||||||
new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo
|
new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze
|
||||||
|
terugkerende todo
|
||||||
new_related_todo_created_short: een nieuwe actie gemaakt
|
new_related_todo_created_short: een nieuwe actie gemaakt
|
||||||
new_related_todo_not_created_short: een nieuwe actie is niet gemaakt
|
new_related_todo_not_created_short: een nieuwe actie is niet gemaakt
|
||||||
next_action_description: Actie beschrijving
|
next_action_description: Actie beschrijving
|
||||||
|
@ -1108,9 +1186,11 @@ nl:
|
||||||
yearly_every_x_day: Elke %{month} %{day}
|
yearly_every_x_day: Elke %{month} %{day}
|
||||||
yearly_every_xth_day: De %{day} %{day_of_week} van %{month}
|
yearly_every_xth_day: De %{day} %{day_of_week} van %{month}
|
||||||
yearly_options: Instellingen voor jaarlijks terugkerende acties
|
yearly_options: Instellingen voor jaarlijks terugkerende acties
|
||||||
recurrence_completed: Er is geen volgende actie na de terugkerende actie die u zojuist hebt voltooid. De herhaling is voltooid
|
recurrence_completed: Er is geen volgende actie na de terugkerende actie die u
|
||||||
|
zojuist hebt voltooid. De herhaling is voltooid
|
||||||
recurrence_period: Herhaling periode
|
recurrence_period: Herhaling periode
|
||||||
recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd
|
recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is.
|
||||||
|
werd een nieuwe actie toegevoegd
|
||||||
recurring_action_saved: Terugkerende actie opgeslagen
|
recurring_action_saved: Terugkerende actie opgeslagen
|
||||||
recurring_actions_title: TRACKS::Terugkerende acties
|
recurring_actions_title: TRACKS::Terugkerende acties
|
||||||
recurring_deleted_success: De recurrente actie is succesvol verwijderd.
|
recurring_deleted_success: De recurrente actie is succesvol verwijderd.
|
||||||
|
@ -1134,27 +1214,35 @@ nl:
|
||||||
task_list_title: TRACKS::Toon acties
|
task_list_title: TRACKS::Toon acties
|
||||||
tickler_items_due:
|
tickler_items_due:
|
||||||
one: Een tickler item wordt nu zichtbaar - vernieuw de pagina om het te zien.
|
one: Een tickler item wordt nu zichtbaar - vernieuw de pagina om het te zien.
|
||||||
other: "%{count} tickerl items zijn nu zichtbaar - vernieuw de pagina om ze te zien."
|
other: '%{count} tickerl items zijn nu zichtbaar - vernieuw de pagina om ze
|
||||||
|
te zien.'
|
||||||
to_tickler: naar tickler
|
to_tickler: naar tickler
|
||||||
unable_to_add_dependency: Niet in staat om de afhankelijkheid toe te voegen
|
unable_to_add_dependency: Niet in staat om de afhankelijkheid toe te voegen
|
||||||
unresolved_dependency: De waarde die u ingevoerd heeft in het afhankelijkheden veld is niet herleidbaar naar een bestaande actie. Deze waarde wordt niet bewaard met de rest van de actie. Doorgaan?
|
unresolved_dependency: De waarde die u ingevoerd heeft in het afhankelijkheden
|
||||||
|
veld is niet herleidbaar naar een bestaande actie. Deze waarde wordt niet bewaard
|
||||||
|
met de rest van de actie. Doorgaan?
|
||||||
was_due_on_date: had deadline op %{date}
|
was_due_on_date: had deadline op %{date}
|
||||||
users:
|
users:
|
||||||
account_signup: Aanmelden voor een account
|
account_signup: Aanmelden voor een account
|
||||||
approve_tos: I approve the Terms of Service
|
approve_tos: I approve the Terms of Service
|
||||||
auth_change_submit: Wijzigen authenticatietype
|
auth_change_submit: Wijzigen authenticatietype
|
||||||
auth_type_update_error: 'Er was een probleem met het bijwerken van uw authenticatietype: %{error_messages}'
|
auth_type_update_error: 'Er was een probleem met het bijwerken van uw authenticatietype:
|
||||||
|
%{error_messages}'
|
||||||
auth_type_updated: Authenticatietype bijgewerkt.
|
auth_type_updated: Authenticatietype bijgewerkt.
|
||||||
change_auth_type_title: TRACKS::Wijzig authenticatietype
|
change_auth_type_title: TRACKS::Wijzig authenticatietype
|
||||||
change_authentication_type: Wijzigen authenticatietype
|
change_authentication_type: Wijzigen authenticatietype
|
||||||
change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen.
|
change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in
|
||||||
|
en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen.
|
||||||
change_password_submit: Wachtwoord wijzigen
|
change_password_submit: Wachtwoord wijzigen
|
||||||
change_password_title: TRACKS::Wachtwoord wijzigen
|
change_password_title: TRACKS::Wachtwoord wijzigen
|
||||||
choose_password: Kies een wachtwoord
|
choose_password: Kies een wachtwoord
|
||||||
confirm_password: Bevestig wachtwoord
|
confirm_password: Bevestig wachtwoord
|
||||||
desired_login: Gewenste login
|
desired_login: Gewenste login
|
||||||
destroy_confirmation: 'Waarschuwing: dit zal de gebruiker ''%{login} verwijderen met al zijn acties, contexten, projecten en notities. Weet u zeker dat u wilt doorgaan?'
|
destroy_confirmation: 'Waarschuwing: dit zal de gebruiker ''%{login} verwijderen
|
||||||
destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}'
|
met al zijn acties, contexten, projecten en notities. Weet u zeker dat u wilt
|
||||||
|
doorgaan?'
|
||||||
|
destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker
|
||||||
|
'%{login}'
|
||||||
destroy_successful: Gebruiker %{login} met succes verwijderd
|
destroy_successful: Gebruiker %{login} met succes verwijderd
|
||||||
destroy_user: Verwijder de gebruiker
|
destroy_user: Verwijder de gebruiker
|
||||||
email_address: Email address
|
email_address: Email address
|
||||||
|
@ -1169,12 +1257,15 @@ nl:
|
||||||
new_user_heading: 'Registreer een nieuwe gebruiker:'
|
new_user_heading: 'Registreer een nieuwe gebruiker:'
|
||||||
new_user_title: 'TRACKS:: Aanmelden als de admin gebruiker'
|
new_user_title: 'TRACKS:: Aanmelden als de admin gebruiker'
|
||||||
no_signups_title: 'TRACKS:: Geen nieuwe aanmeldingen'
|
no_signups_title: 'TRACKS:: Geen nieuwe aanmeldingen'
|
||||||
openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren.
|
openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit,
|
||||||
openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen.
|
maar er was een probleem met het opslaan van uw authenticatie voorkeuren.
|
||||||
|
openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit
|
||||||
|
en uw authenticatie type OpenID opgeslagen.
|
||||||
password_confirmation_label: Bevestig wachtwoord
|
password_confirmation_label: Bevestig wachtwoord
|
||||||
password_updated: Wachtwoord bijgewerkt.
|
password_updated: Wachtwoord bijgewerkt.
|
||||||
register_with_cas: Met uw CAS gebruikersnaam
|
register_with_cas: Met uw CAS gebruikersnaam
|
||||||
select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen.
|
select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op
|
||||||
|
'Wijzigen authenticatietype' om uw huidige instellingen te vervangen.
|
||||||
signup: Aanmelden
|
signup: Aanmelden
|
||||||
signup_new_user: Registreer nieuwe gebruiker
|
signup_new_user: Registreer nieuwe gebruiker
|
||||||
signup_successful: Aanmelding succesvol voor gebruiker %{username}.
|
signup_successful: Aanmelding succesvol voor gebruiker %{username}.
|
||||||
|
@ -1191,7 +1282,8 @@ nl:
|
||||||
next_label: Volgende »
|
next_label: Volgende »
|
||||||
page_entries_info:
|
page_entries_info:
|
||||||
multi_page: Toon %{model} %{from} - %{to} van %{count} in totaal
|
multi_page: Toon %{model} %{from} - %{to} van %{count} in totaal
|
||||||
multi_page_html: Toon %{model} <b>%{from} - %{to}</b> van <b>%{count}</b> in totaal
|
multi_page_html: Toon %{model} <b>%{from} - %{to}</b> van <b>%{count}</b>
|
||||||
|
in totaal
|
||||||
single_page:
|
single_page:
|
||||||
one: Toon 1 %{model}
|
one: Toon 1 %{model}
|
||||||
other: Toon alle %{count} %{model}
|
other: Toon alle %{count} %{model}
|
||||||
|
|
|
@ -221,6 +221,7 @@ ru:
|
||||||
нет доступа к каталогу загрузок? %{e}
|
нет доступа к каталогу загрузок? %{e}
|
||||||
invalid_csv: 'Недопустимый CSV: не удаётся прочитать заголовки: %{e}'
|
invalid_csv: 'Недопустимый CSV: не удаётся прочитать заголовки: %{e}'
|
||||||
invalid_destination: 'Неверное место назначения импорта: %{e}'
|
invalid_destination: 'Неверное место назначения импорта: %{e}'
|
||||||
|
no_context: Контекст по умолчанию не найден
|
||||||
yaml_disabled: Загрузка YAML отключена
|
yaml_disabled: Загрузка YAML отключена
|
||||||
todos_count: '%{count} задач импортировано'
|
todos_count: '%{count} задач импортировано'
|
||||||
projects_count: '%{count} проектов импортировано'
|
projects_count: '%{count} проектов импортировано'
|
||||||
|
@ -458,7 +459,7 @@ ru:
|
||||||
интернета. Тогда Mailgun сможет отправлять на него данные.
|
интернета. Тогда Mailgun сможет отправлять на него данные.
|
||||||
description: Если вы хотите отправлять письма в Tracks, но не можете запустить
|
description: Если вы хотите отправлять письма в Tracks, но не можете запустить
|
||||||
почтовый сервер на том же сервере, то можно использовать встроенную в Tracks
|
почтовый сервер на том же сервере, то можно использовать встроенную в Tracks
|
||||||
поддержку {mailgun_link}.
|
поддержку %{mailgun_link}.
|
||||||
example_names:
|
example_names:
|
||||||
tag:
|
tag:
|
||||||
'2': метка2
|
'2': метка2
|
||||||
|
@ -474,12 +475,15 @@ ru:
|
||||||
для месяца и дня или шестизначной для года, месяца и дня)
|
для месяца и дня или шестизначной для года, месяца и дня)
|
||||||
project: Проект для внесения в задачу
|
project: Проект для внесения в задачу
|
||||||
context: Контекст для внесения в задачу
|
context: Контекст для внесения в задачу
|
||||||
|
tickler_date: Дата напоминания для задачи (может быть 2 цифры для дня, 4 цифры
|
||||||
|
для месяца-дня или 6 цифр для года-месяца-дня)
|
||||||
fields_instruction: Все специальные символы являются необязательными, а текст
|
fields_instruction: Все специальные символы являются необязательными, а текст
|
||||||
до первого символа (или конца строки) используется в качестве описания задачи
|
до первого символа (или конца строки) используется в качестве описания задачи
|
||||||
meaning_title: Значение
|
meaning_title: Значение
|
||||||
symbol_title: Символ
|
symbol_title: Символ
|
||||||
fields_title: 'Поля:'
|
fields_title: 'Поля:'
|
||||||
description: 'Для обоих описанных методов используется следующий формат:'
|
description: 'Для обоих описанных методов в теме сообщения можно использовать
|
||||||
|
следующий формат для добавления метаданных:'
|
||||||
message_gateway:
|
message_gateway:
|
||||||
instructions:
|
instructions:
|
||||||
'3': На вашу свежеустановленную почту отправлено письмо!
|
'3': На вашу свежеустановленную почту отправлено письмо!
|
||||||
|
@ -1082,7 +1086,6 @@ ru:
|
||||||
one: Отложить на 1 день
|
one: Отложить на 1 день
|
||||||
few: Отложить на %{count} дня
|
few: Отложить на %{count} дня
|
||||||
many: Отложить на %{count} дней
|
many: Отложить на %{count} дней
|
||||||
other: Отложить на %{count} дней
|
|
||||||
deferred_actions_with: Отложенные действия с меткой '%{tag_name}'
|
deferred_actions_with: Отложенные действия с меткой '%{tag_name}'
|
||||||
deferred_pending_actions: Отложенные/ожидающие действия
|
deferred_pending_actions: Отложенные/ожидающие действия
|
||||||
deferred_tasks_title: TRACKS::Отложенные
|
deferred_tasks_title: TRACKS::Отложенные
|
||||||
|
@ -1378,8 +1381,27 @@ ru:
|
||||||
другими приложениями. На этой странице представлена документация по нашему
|
другими приложениями. На этой странице представлена документация по нашему
|
||||||
REST API.
|
REST API.
|
||||||
title: Вступление
|
title: Вступление
|
||||||
|
content_3: API — это служба %{restful_link}. Все данные доступны через API как
|
||||||
|
ресурс, на который можно сослаться по уникальному идентификатору. Он отвечает
|
||||||
|
на ряд методов HTTP, в частности GET, PUT, POST и UPDATE, а все ответы от
|
||||||
|
API представлены в простом XML формате, в кодировке UTF-8.
|
||||||
|
restful_link_text: RESTful
|
||||||
curl_link_text: cURL
|
curl_link_text: cURL
|
||||||
id: ID
|
id: ID
|
||||||
title: Документация REST API для разаработчиков
|
title: Документация REST API для разаработчиков
|
||||||
|
auth:
|
||||||
|
basic_auth_link_text: Базовая HTTP-аутентификация
|
||||||
|
title: Аутентификация
|
||||||
|
content: Аутентификация обрабатывается с помощью %{auth_link}. Ваше имя пользователя
|
||||||
|
и пароль Tracks используются в качестве учетных данных аутентификации через
|
||||||
|
API. Обратите внимание, что при обычной HTTP-аутентификации ваш пароль отправляется
|
||||||
|
в виде открытого текста. Если вам нужно более безопасное решение для аутентификации,
|
||||||
|
вам следует настроить веб-сервер для запуска Tracks по HTTPS.
|
||||||
|
retrieve:
|
||||||
|
title: Получение данных из API
|
||||||
|
content: 'Чтобы получить данные, вам нужно всего лишь выполнить HTTP GET запрос
|
||||||
|
для идентификатора ресурса. Например, если вы хотите получить все контексты
|
||||||
|
с %{curl_link}:'
|
||||||
|
single_context: 'Получение единого контекста:'
|
||||||
auth_type:
|
auth_type:
|
||||||
database: База данных
|
database: База данных
|
||||||
|
|
|
@ -21,9 +21,9 @@ tr:
|
||||||
paste_field: 'İçe aktarılan YAML dosyasının içeriğini aşağıdaki metin kutucuğuna
|
paste_field: 'İçe aktarılan YAML dosyasının içeriğini aşağıdaki metin kutucuğuna
|
||||||
yapıştır:'
|
yapıştır:'
|
||||||
warning: Dikkat
|
warning: Dikkat
|
||||||
yaml_warning: '%{warning}: YAML dosyası dışa aktarılmadan önce mevcut bütün bilgileriniz
|
yaml_warning: '%{warning}: YAML dosyası dışa aktarılmadan önce mevcut bütün
|
||||||
kaybolacak. Herhangi bir sorun yaşama ihtimalinize karşılık, eğer veri tabanına
|
bilgileriniz kaybolacak. Herhangi bir sorun yaşama ihtimalinize karşılık,
|
||||||
şu anda erişiminiz var ise yedeklemenizi öneririz.'
|
eğer veri tabanına şu anda erişiminiz var ise yedeklemenizi öneririz.'
|
||||||
export:
|
export:
|
||||||
page_title: Tracks::Export
|
page_title: Tracks::Export
|
||||||
title: Dışa aktarılıyor
|
title: Dışa aktarılıyor
|
||||||
|
@ -35,12 +35,12 @@ tr:
|
||||||
etiketlerinizi ve notlarınızı içerir
|
etiketlerinizi ve notlarınızı içerir
|
||||||
csv_notes_title: CSV dosyası (sadece notlar)
|
csv_notes_title: CSV dosyası (sadece notlar)
|
||||||
xml_link_title: XML dosyası (sadece eylemler)
|
xml_link_title: XML dosyası (sadece eylemler)
|
||||||
yaml_description: ':{yaml}: Dışarı aktarmak için en iyisidir.'
|
yaml_description: '%{yaml}: Dışarı aktarmak için en iyisidir.'
|
||||||
download_link: İndirme bağlantısı
|
download_link: İndirme bağlantısı
|
||||||
yaml_link_title: YAML dosyası
|
yaml_link_title: YAML dosyası
|
||||||
xml_description: '%{xml}: Veri aktarımı ve düzenleme için en iyisidir'
|
xml_description: '%{xml}: Veri aktarımı ve düzenleme için en iyisidir'
|
||||||
yaml_experimental: Lütfen YAML dosyalarının deneysel olarak desteklendiğini göz
|
yaml_experimental: Lütfen YAML dosyalarının deneysel olarak desteklendiğini
|
||||||
önünde bulundurunuz. Önemli verileri yedeklerken dikkatli olunuz.
|
göz önünde bulundurunuz. Önemli verileri yedeklerken dikkatli olunuz.
|
||||||
csv_description: '%{csv}: İş tablosuna veya veri analizi yazılımlarına aktarmak
|
csv_description: '%{csv}: İş tablosuna veya veri analizi yazılımlarına aktarmak
|
||||||
için en iyisidir'
|
için en iyisidir'
|
||||||
xml_link_description: XML dosyası bütün eylemlerinizi, içeriklerinizi, projelerinizi,
|
xml_link_description: XML dosyası bütün eylemlerinizi, içeriklerinizi, projelerinizi,
|
||||||
|
@ -80,7 +80,8 @@ tr:
|
||||||
context_hide: Font sayfasında gizle?
|
context_hide: Font sayfasında gizle?
|
||||||
context_deleted: Silinen içerik '%{name}'
|
context_deleted: Silinen içerik '%{name}'
|
||||||
completed_tasks_title: TRACKS::şuradan '%{context_name}' tamamlanan eylemler
|
completed_tasks_title: TRACKS::şuradan '%{context_name}' tamamlanan eylemler
|
||||||
all_completed_tasks_title: TRACKS::şuradan '%{context_name}' tamamlanan bütün eylemler
|
all_completed_tasks_title: TRACKS::şuradan '%{context_name}' tamamlanan bütün
|
||||||
|
eylemler
|
||||||
add_context: İçerik ekle
|
add_context: İçerik ekle
|
||||||
common:
|
common:
|
||||||
wiki: Wiki
|
wiki: Wiki
|
||||||
|
@ -97,8 +98,8 @@ tr:
|
||||||
by_task_count_title: Görev sayısına göre sırala
|
by_task_count_title: Görev sayısına göre sırala
|
||||||
by_task_count: Görev sayısına göre
|
by_task_count: Görev sayısına göre
|
||||||
alphabetically_title: Projeleri alfabetik olarak sırala
|
alphabetically_title: Projeleri alfabetik olarak sırala
|
||||||
alphabetically_confirm: Bu projeleri alfabetik olarak sıralamak istediğinize emin
|
alphabetically_confirm: Bu projeleri alfabetik olarak sıralamak istediğinize
|
||||||
misiniz? Bu işlem mevcut sıralamayı iptal edecektir.
|
emin misiniz? Bu işlem mevcut sıralamayı iptal edecektir.
|
||||||
alphabetically: Alfabetik sırayla
|
alphabetically: Alfabetik sırayla
|
||||||
show_all: Hepsini göster
|
show_all: Hepsini göster
|
||||||
server_error: Sunucuda bir hata meydana geldi.
|
server_error: Sunucuda bir hata meydana geldi.
|
||||||
|
@ -147,10 +148,10 @@ tr:
|
||||||
other: Günler
|
other: Günler
|
||||||
note:
|
note:
|
||||||
one: Not yok
|
one: Not yok
|
||||||
other: 1 not var
|
other: '%{count} not var'
|
||||||
actions_midsentence:
|
actions_midsentence:
|
||||||
one: Eylem
|
one: eylem
|
||||||
other: Eylemler
|
other: eylemler
|
||||||
activerecord:
|
activerecord:
|
||||||
errors:
|
errors:
|
||||||
template:
|
template:
|
||||||
|
@ -172,7 +173,8 @@ tr:
|
||||||
taken: zaten alınmış
|
taken: zaten alınmış
|
||||||
restrict_dependent_destroy:
|
restrict_dependent_destroy:
|
||||||
has_many: Bu kayda bağlı bir dosya bulunduğu için kayıt silinemez %{record}
|
has_many: Bu kayda bağlı bir dosya bulunduğu için kayıt silinemez %{record}
|
||||||
has_one: Bu kayda bağlı farklı bir dosya bulunduğu için kayıt silinemez %{record}
|
has_one: Bu kayda bağlı farklı bir dosya bulunduğu için kayıt silinemez
|
||||||
|
%{record}
|
||||||
record_invalid: 'Doğrulama başarısız: %{errors}'
|
record_invalid: 'Doğrulama başarısız: %{errors}'
|
||||||
odd: tek sayı olmalıdır
|
odd: tek sayı olmalıdır
|
||||||
not_a_number: rakam değildir
|
not_a_number: rakam değildir
|
||||||
|
@ -380,10 +382,10 @@ tr:
|
||||||
ical_feed: iCal akış
|
ical_feed: iCal akış
|
||||||
last_fixed_number: Son %{number} eylem/ler
|
last_fixed_number: Son %{number} eylem/ler
|
||||||
legend: 'Semboller:'
|
legend: 'Semboller:'
|
||||||
notice_incomplete_only: "Not: Akış, aksi işaretlenmedikçe sadece tamamlanmamış eylemleri\
|
notice_incomplete_only: "Not: Akış, aksi işaretlenmedikçe sadece tamamlanmamış\
|
||||||
\ gösterir. Bu iCal akışları todo listesine eklenebilir. Eğer bitimi yaklaşan\
|
\ eylemleri gösterir. Bu iCal akışları todo listesine eklenebilir. Eğer bitimi\
|
||||||
\ todo'ları takvimde görüntülemek istiyorsanız, takvim sayfasından iCal akışını\
|
\ yaklaşan todo'ları takvimde görüntülemek istiyorsanız, takvim sayfasından\
|
||||||
\ kullanın"
|
\ iCal akışını kullanın"
|
||||||
plain_text_feed: Düz Yazı Akışı
|
plain_text_feed: Düz Yazı Akışı
|
||||||
project_centric: Belirli bir projedeki tamamlanmamış eylemler akışı
|
project_centric: Belirli bir projedeki tamamlanmamış eylemler akışı
|
||||||
project_needed: Akış talep etmeden önce en az bir proje olmalı
|
project_needed: Akış talep etmeden önce en az bir proje olmalı
|
||||||
|
@ -401,9 +403,9 @@ tr:
|
||||||
add_your_own: Eklemek istediğiniz araç mı var? Tracks'ın gelecek sürümlerine ekleyebilmemiz
|
add_your_own: Eklemek istediğiniz araç mı var? Tracks'ın gelecek sürümlerine ekleyebilmemiz
|
||||||
için bize gönderin %{tell_us_link}.
|
için bize gönderin %{tell_us_link}.
|
||||||
intro: 'Tracks işinize yarayabilecek diğer araçlarla entegre edilebilir! Bu sayfa
|
intro: 'Tracks işinize yarayabilecek diğer araçlarla entegre edilebilir! Bu sayfa
|
||||||
bazılarını entegre etmeye yönelik bilgi içerir. Her platforma uygulanabilir olmayabilirler
|
bazılarını entegre etmeye yönelik bilgi içerir. Her platforma uygulanabilir
|
||||||
ve bazıları diğerlerine kıyasla daha fazla teknik bilgi gerektirebilir. Ek bilgi
|
olmayabilirler ve bazıları diğerlerine kıyasla daha fazla teknik bilgi gerektirebilir.
|
||||||
için: %{documentation_link}'
|
Ek bilgi için: %{documentation_link}'
|
||||||
developer_documentation_link: Tracks için geliştirici dokümantasyonu
|
developer_documentation_link: Tracks için geliştirici dokümantasyonu
|
||||||
contents_header: 'İçerikler:'
|
contents_header: 'İçerikler:'
|
||||||
tell_us_link_text: Bunun hakkında bize görüş bildirin
|
tell_us_link_text: Bunun hakkında bize görüş bildirin
|
||||||
|
@ -415,8 +417,8 @@ tr:
|
||||||
bitimi yaklaşan eylemlerle ilgili bir e-posta alacaksınız.
|
bitimi yaklaşan eylemlerle ilgili bir e-posta alacaksınız.
|
||||||
message_gateway:
|
message_gateway:
|
||||||
rich_api_tip: Mesaj içeriği tanım, içerik ve proje kısmına, not ise gövde metnine
|
rich_api_tip: Mesaj içeriği tanım, içerik ve proje kısmına, not ise gövde metnine
|
||||||
yazarak "çamaşırları yıka @ Ev" veya "Mehmet'i Ara > x projesi" ve benzeri türden
|
yazarak "çamaşırları yıka @ Ev" veya "Mehmet'i Ara > x projesi" ve benzeri
|
||||||
görevler oluşturmak için Rich Todo API kullanabilirsiniz.
|
türden görevler oluşturmak için Rich Todo API kullanabilirsiniz.
|
||||||
footer:
|
footer:
|
||||||
send_feedback: Geri bildirim
|
send_feedback: Geri bildirim
|
||||||
version: 'Tracks %{version} (%{revision_with_date})'
|
version: 'Tracks %{version} (%{revision_with_date})'
|
||||||
|
|
352
config/locales/zh-TW.yml
Normal file
352
config/locales/zh-TW.yml
Normal file
|
@ -0,0 +1,352 @@
|
||||||
|
# Traditional Chinese (Taiwan) locale for Tracks
|
||||||
|
# 繁體中文 (台灣) 語言包
|
||||||
|
zh-TW:
|
||||||
|
activerecord:
|
||||||
|
attributes:
|
||||||
|
note:
|
||||||
|
created_at: 建立於
|
||||||
|
updated_at: 更新於
|
||||||
|
preference:
|
||||||
|
date_format: 日期格式
|
||||||
|
due_style: 到期樣式
|
||||||
|
first_name: 名字
|
||||||
|
last_name: 姓氏
|
||||||
|
email: 電子郵件
|
||||||
|
locale: 語言
|
||||||
|
mobile_todos_per_page: 每頁動作數 (行動版)
|
||||||
|
refresh: 重新整理間隔 (分鐘)
|
||||||
|
review_period: 專案檢視間隔
|
||||||
|
show_completed_projects_in_sidebar: 在側邊欄顯示已完成的專案
|
||||||
|
show_hidden_contexts_in_sidebar: 在側邊欄顯示隱藏的情境
|
||||||
|
show_hidden_projects_in_sidebar: 在側邊欄顯示隱藏的專案
|
||||||
|
show_number_completed: 顯示已完成的動作數量
|
||||||
|
show_project_on_todo_done: 完成待辦事項時進入專案頁面
|
||||||
|
sms_context: 預設電子郵件情境
|
||||||
|
sms_email: 寄件者電子郵件
|
||||||
|
staleness_starts: 過期開始時間
|
||||||
|
theme: 主題
|
||||||
|
time_zone: 時區
|
||||||
|
title_date_format: 標題日期格式
|
||||||
|
verbose_action_descriptors: 以詳細形式顯示動作的描述 (情境、專案)
|
||||||
|
week_starts: 每週開始於
|
||||||
|
project:
|
||||||
|
default_context_name: 預設情境
|
||||||
|
default_tags: 預設標籤
|
||||||
|
description: 描述
|
||||||
|
name: 名稱
|
||||||
|
todo:
|
||||||
|
context: 情境
|
||||||
|
description: 描述
|
||||||
|
due: 到期
|
||||||
|
notes: 備註
|
||||||
|
predecessors: 依賴於
|
||||||
|
project: 專案
|
||||||
|
show_from: 顯示開始時間
|
||||||
|
tags: 標籤
|
||||||
|
user:
|
||||||
|
auth_type: 驗證類型
|
||||||
|
created_at: 建立於
|
||||||
|
display_name: 顯示名稱
|
||||||
|
email: 電子郵件地址
|
||||||
|
first_name: 名字
|
||||||
|
last_login_at: 上次登入時間
|
||||||
|
last_name: 姓氏
|
||||||
|
login: 登入名稱
|
||||||
|
open_id_url: OpenID 網址
|
||||||
|
password: 密碼
|
||||||
|
errors:
|
||||||
|
full_messages:
|
||||||
|
format: "%{attribute} %{message}"
|
||||||
|
messages:
|
||||||
|
accepted: 必須被接受
|
||||||
|
blank: 不能為空
|
||||||
|
confirmation: 與確認不符
|
||||||
|
empty: 不能為空
|
||||||
|
equal_to: '必須等於 %{count}'
|
||||||
|
even: 必須為偶數
|
||||||
|
exclusion: 被保留使用
|
||||||
|
greater_than: '必須大於 %{count}'
|
||||||
|
greater_than_or_equal_to: '必須大於或等於 %{count}'
|
||||||
|
inclusion: 不在清單中
|
||||||
|
invalid: 無效
|
||||||
|
less_than: '必須小於 %{count}'
|
||||||
|
less_than_or_equal_to: '必須小於或等於 %{count}'
|
||||||
|
not_a_number: 不是數字
|
||||||
|
odd: 必須為奇數
|
||||||
|
record_invalid: '驗證失敗:%{errors}'
|
||||||
|
restrict_dependent_destroy:
|
||||||
|
has_one: '無法刪除記錄,因為存在相依的 %{record}'
|
||||||
|
has_many: '無法刪除記錄,因為存在相依的 %{record}'
|
||||||
|
taken: 已被使用
|
||||||
|
too_long: '太長了 (最多 %{count} 個字元)'
|
||||||
|
too_short: '太短了 (最少 %{count} 個字元)'
|
||||||
|
wrong_length: '長度錯誤 (應為 %{count} 個字元)'
|
||||||
|
models:
|
||||||
|
project:
|
||||||
|
attributes:
|
||||||
|
name:
|
||||||
|
blank: 專案必須有名稱
|
||||||
|
taken: 已存在
|
||||||
|
too_long: 專案名稱必須少於 256 個字元
|
||||||
|
template:
|
||||||
|
body: 下列欄位有問題:
|
||||||
|
header:
|
||||||
|
one: '1 個錯誤阻止了 %{model} 的儲存'
|
||||||
|
other: '%{count} 個錯誤阻止了 %{model} 的儲存'
|
||||||
|
common:
|
||||||
|
action: 動作
|
||||||
|
actions: 動作
|
||||||
|
actions_midsentence:
|
||||||
|
one: 動作
|
||||||
|
other: 動作
|
||||||
|
zero: 動作
|
||||||
|
add: 新增
|
||||||
|
ajaxError: 從伺服器取得資料時發生錯誤
|
||||||
|
back: 返回
|
||||||
|
bugs: 錯誤回報
|
||||||
|
cancel: 取消
|
||||||
|
collapse_expand: 摺疊/展開
|
||||||
|
context: 情境
|
||||||
|
contexts: 情境
|
||||||
|
contribute: 貢獻
|
||||||
|
create: 建立
|
||||||
|
days_midsentence:
|
||||||
|
one: 天
|
||||||
|
other: 天
|
||||||
|
zero: 天
|
||||||
|
deferred: 延期
|
||||||
|
description: 描述
|
||||||
|
drag_handle: 拖曳
|
||||||
|
email: 電子郵件
|
||||||
|
errors_with_fields: 下列欄位有問題:
|
||||||
|
first: 第一個
|
||||||
|
forth: 第四個
|
||||||
|
fourth: 第四個
|
||||||
|
go_back: 返回
|
||||||
|
last: 最後一個
|
||||||
|
logout: 登出
|
||||||
|
mailing_list: 郵寄清單
|
||||||
|
month: 月
|
||||||
|
months: 月
|
||||||
|
next: 下一個
|
||||||
|
none: 無
|
||||||
|
not_available_abbr: 無
|
||||||
|
note:
|
||||||
|
one: 1 個備註
|
||||||
|
other: "%{count} 個備註"
|
||||||
|
zero: 無備註
|
||||||
|
notes: 備註
|
||||||
|
numbered_step: '步驟 %{number}'
|
||||||
|
ok: 確定
|
||||||
|
optional: 選填
|
||||||
|
previous: 前一個
|
||||||
|
project: 專案
|
||||||
|
projects: 專案
|
||||||
|
recurring_todos: 重複動作
|
||||||
|
review: 檢視
|
||||||
|
search: 搜尋
|
||||||
|
second: 第二個
|
||||||
|
server_error: 伺服器發生錯誤。
|
||||||
|
show_all: 顯示全部
|
||||||
|
sort:
|
||||||
|
alphabetically: 依字母排序
|
||||||
|
alphabetically_confirm: 您確定要依字母順序排列這些專案嗎?這會取代現有的排序順序。
|
||||||
|
alphabetically_title: 依字母順序排列專案
|
||||||
|
by_task_count: 依任務數量排序
|
||||||
|
by_task_count_title: 依任務數量排序
|
||||||
|
by_task_count_title_confirm: 您確定要依任務數量排列這些專案嗎?這會取代現有的排序順序。
|
||||||
|
sort: 排序
|
||||||
|
third: 第三個
|
||||||
|
todo: 待辦事項
|
||||||
|
update: 更新
|
||||||
|
website: 網站
|
||||||
|
week: 週
|
||||||
|
weeks: 週
|
||||||
|
wiki: Wiki
|
||||||
|
login:
|
||||||
|
account_login: 帳戶登入
|
||||||
|
please_login: 請登入以使用 Tracks
|
||||||
|
sign_in: 登入
|
||||||
|
successful: 登入成功。歡迎回來!
|
||||||
|
unsuccessful: 登入失敗。
|
||||||
|
logout: 登出
|
||||||
|
logged_out: 您已從 Tracks 登出。
|
||||||
|
layouts:
|
||||||
|
navigation:
|
||||||
|
home: 首頁
|
||||||
|
contexts_title: 情境
|
||||||
|
projects_title: 專案
|
||||||
|
calendar: 日曆
|
||||||
|
calendar_title: 到期動作的日曆
|
||||||
|
completed_tasks: 已完成
|
||||||
|
completed_tasks_title: 已完成
|
||||||
|
starred: 已標星
|
||||||
|
starred_title: 查看您已標星的動作
|
||||||
|
preferences: 偏好設定
|
||||||
|
preferences_title: 顯示我的偏好設定
|
||||||
|
help: "?"
|
||||||
|
help_page: 說明
|
||||||
|
todos:
|
||||||
|
next_actions_title: Tracks - 下一步動作
|
||||||
|
action_saved: 動作已儲存
|
||||||
|
action_marked_complete: '動作 <strong>"%{description}"</strong> 已標記為 <strong>%{completed}</strong>'
|
||||||
|
confirm_delete: '您確定要刪除動作 "%{description}" 嗎?'
|
||||||
|
deleted_success: 動作已成功刪除。
|
||||||
|
edit_action: 編輯動作
|
||||||
|
delete_action: 刪除動作
|
||||||
|
mark_complete: 標記完成
|
||||||
|
due: 到期
|
||||||
|
context: 情境
|
||||||
|
project: 專案
|
||||||
|
tags: 標籤 (用逗號分隔)
|
||||||
|
notes: 備註
|
||||||
|
show_from: 顯示開始時間
|
||||||
|
completed: 已完成
|
||||||
|
no_actions:
|
||||||
|
not_done: 目前沒有未完成動作
|
||||||
|
completed: 目前沒有已完成動作
|
||||||
|
title: 找不到動作
|
||||||
|
contexts:
|
||||||
|
add_context: 新增情境
|
||||||
|
context_name: 情境名稱
|
||||||
|
save_status_message: 情境已儲存
|
||||||
|
delete_context: 刪除情境
|
||||||
|
delete_context_confirmation: '您確定要刪除情境 "%{name}" 嗎?請注意,這也會刪除此情境中的所有(重複)動作!'
|
||||||
|
context_deleted: '已刪除情境 "%{name}"'
|
||||||
|
edit_context: 編輯情境
|
||||||
|
show_form: 建立新情境
|
||||||
|
hide_form: 隱藏表單
|
||||||
|
projects:
|
||||||
|
add_project: 新增專案
|
||||||
|
project_saved_status: 專案已儲存
|
||||||
|
delete_project: 刪除專案
|
||||||
|
delete_project_confirmation: '您確定要刪除專案 "%{name}" 嗎?'
|
||||||
|
project_destroyed_status: '已刪除專案 "%{name}"'
|
||||||
|
edit_project_title: 編輯專案
|
||||||
|
show_form: 新增專案
|
||||||
|
hide_form: 隱藏表單
|
||||||
|
notes: 備註
|
||||||
|
add_note: 新增備註
|
||||||
|
add_note_submit: 新增備註
|
||||||
|
settings: 設定
|
||||||
|
preferences:
|
||||||
|
title: 您的偏好設定
|
||||||
|
edit_preferences: 編輯偏好設定
|
||||||
|
updated: 偏好設定已更新
|
||||||
|
tabs:
|
||||||
|
profile: 個人檔案
|
||||||
|
authentication: 驗證
|
||||||
|
date_and_time: 日期和時間
|
||||||
|
tracks_behavior: Tracks 行為
|
||||||
|
remove_account: 移除帳戶
|
||||||
|
help:
|
||||||
|
title: 說明
|
||||||
|
usage: '您可以在專案 GitHub wiki 的 %{manual_link} 中找到使用資訊。'
|
||||||
|
manual_link_text: 使用手冊
|
||||||
|
bugs: '如果您遇到錯誤或有功能請求,請在 %{issue_link} 中回報。'
|
||||||
|
issue_link_text: 問題佇列
|
||||||
|
date:
|
||||||
|
abbr_day_names:
|
||||||
|
- 日
|
||||||
|
- 一
|
||||||
|
- 二
|
||||||
|
- 三
|
||||||
|
- 四
|
||||||
|
- 五
|
||||||
|
- 六
|
||||||
|
day_names:
|
||||||
|
- 星期日
|
||||||
|
- 星期一
|
||||||
|
- 星期二
|
||||||
|
- 星期三
|
||||||
|
- 星期四
|
||||||
|
- 星期五
|
||||||
|
- 星期六
|
||||||
|
abbr_month_names:
|
||||||
|
-
|
||||||
|
- 1月
|
||||||
|
- 2月
|
||||||
|
- 3月
|
||||||
|
- 4月
|
||||||
|
- 5月
|
||||||
|
- 6月
|
||||||
|
- 7月
|
||||||
|
- 8月
|
||||||
|
- 9月
|
||||||
|
- 10月
|
||||||
|
- 11月
|
||||||
|
- 12月
|
||||||
|
month_names:
|
||||||
|
-
|
||||||
|
- 一月
|
||||||
|
- 二月
|
||||||
|
- 三月
|
||||||
|
- 四月
|
||||||
|
- 五月
|
||||||
|
- 六月
|
||||||
|
- 七月
|
||||||
|
- 八月
|
||||||
|
- 九月
|
||||||
|
- 十月
|
||||||
|
- 十一月
|
||||||
|
- 十二月
|
||||||
|
formats:
|
||||||
|
default: "%Y-%m-%d"
|
||||||
|
long: "%Y年%m月%d日"
|
||||||
|
short: "%m月%d日"
|
||||||
|
order:
|
||||||
|
- :year
|
||||||
|
- :month
|
||||||
|
- :day
|
||||||
|
time:
|
||||||
|
am: 上午
|
||||||
|
pm: 下午
|
||||||
|
formats:
|
||||||
|
default: "%a, %d %b %Y %H:%M:%S %z"
|
||||||
|
long: "%Y年%m月%d日 %H:%M"
|
||||||
|
short: "%m月%d日 %H:%M"
|
||||||
|
number:
|
||||||
|
format:
|
||||||
|
delimiter: ","
|
||||||
|
separator: "."
|
||||||
|
currency:
|
||||||
|
format:
|
||||||
|
unit: "$"
|
||||||
|
delimiter: ","
|
||||||
|
separator: "."
|
||||||
|
format: "%u%n"
|
||||||
|
errors:
|
||||||
|
format: "%{attribute} %{message}"
|
||||||
|
messages:
|
||||||
|
accepted: 必須被接受
|
||||||
|
blank: 不能為空
|
||||||
|
confirmation: '與 %{attribute} 不符'
|
||||||
|
empty: 不能為空
|
||||||
|
equal_to: '必須等於 %{count}'
|
||||||
|
even: 必須為偶數
|
||||||
|
exclusion: 被保留使用
|
||||||
|
greater_than: '必須大於 %{count}'
|
||||||
|
greater_than_or_equal_to: '必須大於或等於 %{count}'
|
||||||
|
inclusion: 不在清單中
|
||||||
|
invalid: 無效
|
||||||
|
less_than: '必須小於 %{count}'
|
||||||
|
less_than_or_equal_to: '必須小於或等於 %{count}'
|
||||||
|
not_a_number: 不是數字
|
||||||
|
not_an_integer: 必須是整數
|
||||||
|
odd: 必須為奇數
|
||||||
|
other_than: '必須不同於 %{count}'
|
||||||
|
present: 必須為空白
|
||||||
|
taken: 已被使用
|
||||||
|
too_long: '太長了 (最多 %{count} 個字元)'
|
||||||
|
too_short: '太短了 (最少 %{count} 個字元)'
|
||||||
|
wrong_length: '長度錯誤 (應為 %{count} 個字元)'
|
||||||
|
users:
|
||||||
|
signup: 註冊
|
||||||
|
signup_successful: '用戶 %{username} 註冊成功。'
|
||||||
|
create_error: 用戶建立失敗,也許您在這裡已經有帳戶?
|
||||||
|
user_created: 用戶已建立。
|
||||||
|
choose_password: 選擇密碼
|
||||||
|
confirm_password: 確認密碼
|
||||||
|
email_address: 電子郵件地址
|
||||||
|
change_password: 變更您的密碼
|
||||||
|
password_updated: 密碼已更新。
|
|
@ -1,7 +1,7 @@
|
||||||
class ProjectsContextsRemoveNotNullFromPosition < ActiveRecord::Migration[5.2]
|
class ProjectsContextsRemoveNotNullFromPosition < ActiveRecord::Migration[5.2]
|
||||||
def self.up
|
def self.up
|
||||||
change_column :projects, :position, :integer, {:null => true, :default => nil}
|
change_column :projects, :position, :integer, :null => true, :default => nil
|
||||||
change_column :contexts, :position, :integer, {:null => true, :default => nil}
|
change_column :contexts, :position, :integer, :null => true, :default => nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.down
|
def self.down
|
||||||
|
@ -10,13 +10,13 @@ class ProjectsContextsRemoveNotNullFromPosition < ActiveRecord::Migration[5.2]
|
||||||
project.position = 0 if !project.position?
|
project.position = 0 if !project.position?
|
||||||
project.save
|
project.save
|
||||||
end
|
end
|
||||||
change_column :projects, :position, :integer, {:null => false, :default => nil}
|
change_column :projects, :position, :integer, :null => false, :default => nil
|
||||||
|
|
||||||
@contexts = Context.find(:all)
|
@contexts = Context.find(:all)
|
||||||
@contexts.each do |context|
|
@contexts.each do |context|
|
||||||
context.position = 0 if !context.position?
|
context.position = 0 if !context.position?
|
||||||
context.save
|
context.save
|
||||||
end
|
end
|
||||||
change_column :contexts, :position, :integer, {:null => false, :default => nil}
|
change_column :contexts, :position, :integer, :null => false, :default => nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
78
db/schema.rb
78
db/schema.rb
|
@ -2,30 +2,33 @@
|
||||||
# of editing this file, please use the migrations feature of Active Record to
|
# of editing this file, please use the migrations feature of Active Record to
|
||||||
# incrementally modify your database, and then regenerate this schema definition.
|
# incrementally modify your database, and then regenerate this schema definition.
|
||||||
#
|
#
|
||||||
# Note that this schema.rb definition is the authoritative source for your
|
# This file is the source Rails uses to define your schema when running `bin/rails
|
||||||
# database schema. If you need to create the application database on another
|
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
|
||||||
# system, you should be using db:schema:load, not running all the migrations
|
# be faster and is potentially less error prone than running all of your
|
||||||
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
# migrations from scratch. Old migrations may fail to apply correctly if those
|
||||||
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
# migrations use external dependencies or application code.
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
|
|
||||||
create_table "attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
# These are extensions that must be enabled in order to support this database
|
||||||
t.integer "todo_id"
|
enable_extension "plpgsql"
|
||||||
|
|
||||||
|
create_table "attachments", force: :cascade do |t|
|
||||||
|
t.bigint "todo_id"
|
||||||
t.string "file_file_name"
|
t.string "file_file_name"
|
||||||
t.string "file_content_type"
|
t.string "file_content_type"
|
||||||
t.integer "file_file_size"
|
t.bigint "file_file_size"
|
||||||
t.datetime "file_updated_at"
|
t.datetime "file_updated_at"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at", null: false
|
||||||
t.index ["todo_id"], name: "index_attachments_on_todo_id"
|
t.index ["todo_id"], name: "index_attachments_on_todo_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "contexts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "contexts", force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.integer "position", default: 0
|
t.integer "position"
|
||||||
t.integer "user_id", default: 1
|
t.integer "user_id", default: 1
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
|
@ -34,7 +37,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_contexts_on_user_id"
|
t.index ["user_id"], name: "index_contexts_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "dependencies", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "dependencies", force: :cascade do |t|
|
||||||
t.integer "successor_id", null: false
|
t.integer "successor_id", null: false
|
||||||
t.integer "predecessor_id", null: false
|
t.integer "predecessor_id", null: false
|
||||||
t.string "relationship_type"
|
t.string "relationship_type"
|
||||||
|
@ -42,7 +45,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["successor_id"], name: "index_dependencies_on_successor_id"
|
t.index ["successor_id"], name: "index_dependencies_on_successor_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "notes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "notes", force: :cascade do |t|
|
||||||
t.integer "user_id", null: false
|
t.integer "user_id", null: false
|
||||||
t.integer "project_id", null: false
|
t.integer "project_id", null: false
|
||||||
t.text "body"
|
t.text "body"
|
||||||
|
@ -52,7 +55,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_notes_on_user_id"
|
t.index ["user_id"], name: "index_notes_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "open_id_authentication_associations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "open_id_authentication_associations", force: :cascade do |t|
|
||||||
t.integer "issued"
|
t.integer "issued"
|
||||||
t.integer "lifetime"
|
t.integer "lifetime"
|
||||||
t.string "handle"
|
t.string "handle"
|
||||||
|
@ -61,13 +64,13 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.binary "secret"
|
t.binary "secret"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "open_id_authentication_nonces", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "open_id_authentication_nonces", force: :cascade do |t|
|
||||||
t.integer "timestamp", null: false
|
t.integer "timestamp", null: false
|
||||||
t.string "server_url"
|
t.string "server_url"
|
||||||
t.string "salt", null: false
|
t.string "salt", null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "preferences", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "preferences", force: :cascade do |t|
|
||||||
t.integer "user_id", null: false
|
t.integer "user_id", null: false
|
||||||
t.string "date_format", limit: 40, default: "%d/%m/%Y", null: false
|
t.string "date_format", limit: 40, default: "%d/%m/%Y", null: false
|
||||||
t.integer "week_starts", default: 0, null: false
|
t.integer "week_starts", default: 0, null: false
|
||||||
|
@ -79,9 +82,9 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.integer "refresh", default: 0, null: false
|
t.integer "refresh", default: 0, null: false
|
||||||
t.boolean "verbose_action_descriptors", default: false, null: false
|
t.boolean "verbose_action_descriptors", default: false, null: false
|
||||||
t.boolean "show_hidden_projects_in_sidebar", default: true, null: false
|
t.boolean "show_hidden_projects_in_sidebar", default: true, null: false
|
||||||
t.string "time_zone", default: "London", null: false
|
t.string "time_zone", limit: 255, default: "London", null: false
|
||||||
t.boolean "show_project_on_todo_done", default: false, null: false
|
t.boolean "show_project_on_todo_done", default: false, null: false
|
||||||
t.string "title_date_format", default: "%A, %d %B %Y", null: false
|
t.string "title_date_format", limit: 255, default: "%A, %d %B %Y", null: false
|
||||||
t.integer "mobile_todos_per_page", default: 6, null: false
|
t.integer "mobile_todos_per_page", default: 6, null: false
|
||||||
t.string "sms_email"
|
t.string "sms_email"
|
||||||
t.integer "sms_context_id"
|
t.integer "sms_context_id"
|
||||||
|
@ -91,11 +94,11 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_preferences_on_user_id"
|
t.index ["user_id"], name: "index_preferences_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "projects", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "projects", force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.integer "position", default: 0
|
t.integer "position"
|
||||||
t.integer "user_id", default: 1
|
t.integer "user_id", default: 1
|
||||||
t.text "description", limit: 16777215
|
t.text "description"
|
||||||
t.string "state", limit: 20, null: false
|
t.string "state", limit: 20, null: false
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
|
@ -109,12 +112,12 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id"], name: "index_projects_on_user_id"
|
t.index ["user_id"], name: "index_projects_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "recurring_todos", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "recurring_todos", force: :cascade do |t|
|
||||||
t.integer "user_id", default: 1
|
t.integer "user_id", default: 1
|
||||||
t.integer "context_id", null: false
|
t.integer "context_id", null: false
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.string "description", null: false
|
t.string "description", null: false
|
||||||
t.text "notes", limit: 16777215
|
t.text "notes"
|
||||||
t.string "state", limit: 20, null: false
|
t.string "state", limit: 20, null: false
|
||||||
t.datetime "start_from"
|
t.datetime "start_from"
|
||||||
t.string "ends_on"
|
t.string "ends_on"
|
||||||
|
@ -133,21 +136,21 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.integer "every_count"
|
t.integer "every_count"
|
||||||
t.integer "weekday"
|
t.integer "weekday"
|
||||||
t.datetime "completed_at"
|
t.datetime "completed_at"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at", null: false
|
||||||
t.boolean "show_always"
|
t.boolean "show_always"
|
||||||
t.index ["state"], name: "index_recurring_todos_on_state"
|
t.index ["state"], name: "index_recurring_todos_on_state"
|
||||||
t.index ["user_id"], name: "index_recurring_todos_on_user_id"
|
t.index ["user_id"], name: "index_recurring_todos_on_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "sessions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "sessions", force: :cascade do |t|
|
||||||
t.string "session_id"
|
t.string "session_id"
|
||||||
t.text "data"
|
t.text "data"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.index ["session_id"], name: "sessions_session_id_index"
|
t.index ["session_id"], name: "index_sessions_on_session_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "taggings", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "taggings", force: :cascade do |t|
|
||||||
t.integer "taggable_id"
|
t.integer "taggable_id"
|
||||||
t.integer "tag_id"
|
t.integer "tag_id"
|
||||||
t.string "taggable_type"
|
t.string "taggable_type"
|
||||||
|
@ -156,7 +159,7 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type"
|
t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tags", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tags", force: :cascade do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
|
@ -164,11 +167,11 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["name"], name: "index_tags_on_name"
|
t.index ["name"], name: "index_tags_on_name"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "todos", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "todos", force: :cascade do |t|
|
||||||
t.integer "context_id", null: false
|
t.integer "context_id", null: false
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.text "description", null: false
|
t.text "description", null: false
|
||||||
t.text "notes", limit: 16777215
|
t.text "notes"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "due"
|
t.datetime "due"
|
||||||
t.datetime "completed_at"
|
t.datetime "completed_at"
|
||||||
|
@ -177,7 +180,6 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.string "state", limit: 20, null: false
|
t.string "state", limit: 20, null: false
|
||||||
t.integer "recurring_todo_id"
|
t.integer "recurring_todo_id"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.text "rendered_notes", limit: 16777215
|
|
||||||
t.index ["context_id"], name: "index_todos_on_context_id"
|
t.index ["context_id"], name: "index_todos_on_context_id"
|
||||||
t.index ["project_id"], name: "index_todos_on_project_id"
|
t.index ["project_id"], name: "index_todos_on_project_id"
|
||||||
t.index ["state"], name: "index_todos_on_state"
|
t.index ["state"], name: "index_todos_on_state"
|
||||||
|
@ -186,20 +188,20 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["user_id", "state"], name: "index_todos_on_user_id_and_state"
|
t.index ["user_id", "state"], name: "index_todos_on_user_id_and_state"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tolk_locales", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tolk_locales", force: :cascade do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.index ["name"], name: "index_tolk_locales_on_name", unique: true
|
t.index ["name"], name: "index_tolk_locales_on_name", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tolk_phrases", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tolk_phrases", force: :cascade do |t|
|
||||||
t.text "key"
|
t.text "key"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "tolk_translations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "tolk_translations", force: :cascade do |t|
|
||||||
t.integer "phrase_id"
|
t.integer "phrase_id"
|
||||||
t.integer "locale_id"
|
t.integer "locale_id"
|
||||||
t.text "text"
|
t.text "text"
|
||||||
|
@ -210,9 +212,9 @@ ActiveRecord::Schema.define(version: 2020_08_20_000743) do
|
||||||
t.index ["phrase_id", "locale_id"], name: "index_tolk_translations_on_phrase_id_and_locale_id", unique: true
|
t.index ["phrase_id", "locale_id"], name: "index_tolk_translations_on_phrase_id_and_locale_id", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
|
create_table "users", force: :cascade do |t|
|
||||||
t.string "login", limit: 80, null: false
|
t.string "login", limit: 80, null: false
|
||||||
t.string "crypted_password", limit: 60
|
t.string "crypted_password", limit: 60, null: false
|
||||||
t.string "token"
|
t.string "token"
|
||||||
t.boolean "is_admin", default: false, null: false
|
t.boolean "is_admin", default: false, null: false
|
||||||
t.string "first_name"
|
t.string "first_name"
|
||||||
|
|
|
@ -1,5 +1,64 @@
|
||||||
See doc/upgrading.md for the upgrade documentation!
|
See doc/upgrading.md for the upgrade documentation!
|
||||||
|
|
||||||
|
## Version 2.7.1
|
||||||
|
|
||||||
|
### Security advisory CVE-2024-41805 (severity 6.1 / moderate)
|
||||||
|
|
||||||
|
This release fixes a few reflected XSS vulnerabilities which enabled execution
|
||||||
|
of malicious JavaScript in the context of a user’s browser if that user clicks
|
||||||
|
on a malicious link, possibly allowing retrieval or modification of the current
|
||||||
|
user's data. The issue is of moderate severity (score 6.1/10) with the CVSS
|
||||||
|
rating CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N.
|
||||||
|
|
||||||
|
I want to thank Alec Romano for reporting the issues.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
* The test suite now uses always the same Dockerfile as the main build.
|
||||||
|
* The Dockerfile now supports environment-specific builds via stages.
|
||||||
|
Note: This requires slight changes to docker build commands, see documentation!
|
||||||
|
|
||||||
|
### Deprecations
|
||||||
|
|
||||||
|
* This will be the last release to support Ruby 3.0, which is already end-of-life.
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
* Lots of dependencies have been updated (including security updates).
|
||||||
|
* Fixed Docker build not working on an archive version (ie. one not cloned with Git)
|
||||||
|
* An error is shown if the user being created already exists.
|
||||||
|
* The TOS error in user creation is now in template.
|
||||||
|
* Schema.rb has been updated for Postgres support.
|
||||||
|
|
||||||
|
### Updated translations
|
||||||
|
|
||||||
|
* Spanish (thanks Gallegonovato!)
|
||||||
|
* Finnish (by maintainer Jyri-Petteri ”ZeiP” Paloposki)
|
||||||
|
|
||||||
|
## Version 2.7
|
||||||
|
|
||||||
|
### Removed features
|
||||||
|
|
||||||
|
* Support for Ruby 2.6 and 2.7 were dropped.
|
||||||
|
* Support for inbound message handling was dropped due to API changes caused by required Ruby on Rails upgrade. If you need this, comment in the issue https://github.com/TracksApp/tracks/issues/2463
|
||||||
|
* Rubocop is no longer used in the CI due to missing support for Ruby > 2.5.
|
||||||
|
|
||||||
|
### Deprecations
|
||||||
|
|
||||||
|
* This will be the last release to support Ruby 3.0, which is already end-of-life.
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
* The base version for the Docker image was updated from Ruby 2.7 to Ruby 3.3.
|
||||||
|
* Lots of dependencies have been updated (including security updates).
|
||||||
|
|
||||||
|
### Updated translations
|
||||||
|
|
||||||
|
* Spanish (thanks Gallegonovato!)
|
||||||
|
* Dutch (thanks Ranforingus!)
|
||||||
|
* Russian (thanks Alexey Svistunov!)
|
||||||
|
* Turkish (thanks Burak Hüseyin Ekseli!)
|
||||||
|
|
||||||
## Version 2.6.1
|
## Version 2.6.1
|
||||||
|
|
||||||
### Deprecations
|
### Deprecations
|
||||||
|
|
|
@ -44,7 +44,7 @@ Tracks container. In future there should be an official image in Docker Hub. You
|
||||||
1. Get the Tracks code base by either downloading the archive file for the latest releast or cloning it from GitHub.
|
1. Get the Tracks code base by either downloading the archive file for the latest releast or cloning it from GitHub.
|
||||||
2. Run the following command in the Tracks directory to build the image:
|
2. Run the following command in the Tracks directory to build the image:
|
||||||
```
|
```
|
||||||
$ docker build -t="tracks" .
|
$ docker build -t="tracks" --target=production .
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Make sure you have Docker properly installed.
|
1. Make sure you have Docker properly installed.
|
||||||
|
@ -58,7 +58,7 @@ Tracks container. In future there should be an official image in Docker Hub. You
|
||||||
# MySQL
|
# MySQL
|
||||||
$ mysql -u root -p
|
$ mysql -u root -p
|
||||||
mysql> CREATE DATABASE tracks;
|
mysql> CREATE DATABASE tracks;
|
||||||
mysql> GRANT ALL PRIVILEGES ON tracks.* TO yourmysqluser@localhost IDENTIFIED BY 'password-goes-here' WITH GRANT OPTION;
|
mysql> GRANT ALL PRIVILEGES ON tracks.* TO yourmysqluser@'%' IDENTIFIED BY 'password-goes-here' WITH GRANT OPTION;
|
||||||
|
|
||||||
# PostgreSQL
|
# PostgreSQL
|
||||||
$ sudo -u postgres psql
|
$ sudo -u postgres psql
|
||||||
|
@ -142,7 +142,7 @@ You need to create a database and database-user to use with Tracks. For this, yo
|
||||||
#### PostgreSQL
|
#### PostgreSQL
|
||||||
|
|
||||||
$ sudo -u postgres psql
|
$ sudo -u postgres psql
|
||||||
postgres=# CREATE USER tracks WITH ENCRYPTED PASSWORD 'password-goes-here';
|
postgres=# CREATE ROLE tracks WITH LOGIN NOSUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION PASSWORD 'password-goes-here';
|
||||||
postgres=# CREATE DATABASE tracks OWNER=tracks;
|
postgres=# CREATE DATABASE tracks OWNER=tracks;
|
||||||
|
|
||||||
### Install dependencies
|
### Install dependencies
|
||||||
|
@ -153,13 +153,22 @@ Tracks is built upon a number of Ruby libraries (known as ‘gems’). The Bundl
|
||||||
* If you are using SQLite:
|
* If you are using SQLite:
|
||||||
|
|
||||||
```
|
```
|
||||||
bundle install --without "development test mysql"
|
bundle config set without mysql postgresql
|
||||||
|
bundle install
|
||||||
```
|
```
|
||||||
|
|
||||||
* If you are using MySQL:
|
* If you are using MySQL:
|
||||||
|
|
||||||
```
|
```
|
||||||
bundle install --without "development test sqlite"
|
bundle config set without sqlite postgresql
|
||||||
|
bundle install
|
||||||
|
```
|
||||||
|
|
||||||
|
* If you are using PostgreSQL:
|
||||||
|
|
||||||
|
```
|
||||||
|
bundle config set without sqlite mysql
|
||||||
|
bundle install
|
||||||
```
|
```
|
||||||
|
|
||||||
* If you are installing Tracks on Windows or Mac OS X, or if you have another JavaScript runtime such as Node.js installed, you may also append `therubyracer` as an additional "without" parameter.
|
* If you are installing Tracks on Windows or Mac OS X, or if you have another JavaScript runtime such as Node.js installed, you may also append `therubyracer` as an additional "without" parameter.
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mysql:5.7
|
image: mariadb:lts
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
MARIADB_DATABASE: ${TRACKS_DB:-tracks}
|
||||||
volumes:
|
volumes:
|
||||||
- db-data:/var/lib/mysql
|
- db-data:/var/lib/mysql
|
||||||
web:
|
web:
|
||||||
build: .
|
build:
|
||||||
|
context: .
|
||||||
|
target: production # can also be development or test
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/ci-build, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
docker_compose="docker-compose --file test-envs/docker-compose-$1-$2.yml"
|
export RUBY_VERSION=$1
|
||||||
|
|
||||||
|
docker_compose="docker compose --file test-envs/docker-compose-$2.yml"
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
$docker_compose down
|
$docker_compose down
|
||||||
|
@ -20,7 +22,7 @@ export DATABASE_NAME=tracks_test
|
||||||
|
|
||||||
$docker_compose build
|
$docker_compose build
|
||||||
$docker_compose up -d
|
$docker_compose up -d
|
||||||
script/poll-for-db
|
script/poll-for-db $2
|
||||||
|
|
||||||
# Leaving this in since it will be needed for Rails 5
|
# Leaving this in since it will be needed for Rails 5
|
||||||
$docker_compose run web bin/rails db:environment:set RAILS_ENV=test || true
|
$docker_compose run web bin/rails db:environment:set RAILS_ENV=test || true
|
||||||
|
@ -32,5 +34,5 @@ else
|
||||||
$docker_compose run web bin/rake db:migrate
|
$docker_compose run web bin/rake db:migrate
|
||||||
$docker_compose run web bin/rake db:seed
|
$docker_compose run web bin/rake db:seed
|
||||||
fi
|
fi
|
||||||
$docker_compose run web bin/rake test
|
echo "==> Running the tests…"
|
||||||
|
$docker_compose run web bin/rails test
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
docker_compose="docker-compose --file docker-compose.yml"
|
docker_compose="docker compose --file docker-compose.yml"
|
||||||
|
|
||||||
# Find our app dir
|
# Find our app dir
|
||||||
appdir=$(cd $(dirname "$0")/.. && pwd)
|
appdir=$(cd $(dirname "$0")/.. && pwd)
|
||||||
|
|
|
@ -2,13 +2,16 @@
|
||||||
|
|
||||||
echo "==> Polling DB…"
|
echo "==> Polling DB…"
|
||||||
|
|
||||||
appdir=$(cd $(dirname "$0")/.. && pwd)
|
if [ -z "$1" ] || [ "$1" == "mysql" ]; then
|
||||||
[ -f /etc/app-env ] || exec "$appdir/script/docker-environment" $0 $@
|
appdir=$(cd $(dirname "$0")/.. && pwd)
|
||||||
|
[ -f /etc/app-env ] || exec "$appdir/script/docker-environment" $0 $@
|
||||||
|
|
||||||
for i in {1..60}; do
|
for i in {1..60}; do
|
||||||
nc -z -w5 db 3306 && exit
|
echo "... Checking for connection"
|
||||||
sleep 1
|
nc -z -w5 db 3306 && exit
|
||||||
done
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
echo "Unable to reach database!"
|
echo "Unable to reach database!"
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: mysql:5.7
|
|
||||||
environment:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-2.6
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: root
|
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,17 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: "/app/db.sqlite"
|
|
||||||
DATABASE_TYPE: sqlite3
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
|
@ -1,29 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: mysql:5.7
|
|
||||||
environment:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-3.0
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: root
|
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,32 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: postgres:13
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: ${DATABASE_NAME:-tracks}
|
|
||||||
POSTGRES_PASSWORD: password
|
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/postgresql/data
|
|
||||||
web:
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: Dockerfile-3.0
|
|
||||||
environment:
|
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
|
||||||
RAILS_ENV: $RAILS_ENV
|
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
|
||||||
DATABASE_USERNAME: postgres
|
|
||||||
DATABASE_PASSWORD: password
|
|
||||||
DATABASE_TYPE: postgresql
|
|
||||||
DATABASE_ENCODING: unicode
|
|
||||||
DATABASE_PORT: 5432
|
|
||||||
volumes:
|
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,29 +1,25 @@
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mysql:5.7
|
image: mariadb:lts
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: 1
|
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
|
||||||
MYSQL_DATABASE: ${TRACKS_DB:-tracks}
|
MARIADB_DATABASE: ${TRACKS_DB:-tracks}
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/mysql
|
|
||||||
web:
|
web:
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: Dockerfile
|
target: test
|
||||||
|
args:
|
||||||
|
RUBY_VERSION: ${RUBY_VERSION}
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/cibuild, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
DATABASE_NAME: $DATABASE_NAME
|
||||||
DATABASE_USERNAME: root
|
DATABASE_USERNAME: root
|
||||||
DATABASE_PASSWORD_EMPTY: 1
|
DATABASE_PASSWORD_EMPTY: 1
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,18 +1,17 @@
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: postgres:13
|
image: postgres:13
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: ${DATABASE_NAME:-tracks}
|
POSTGRES_DB: ${DATABASE_NAME:-tracks}
|
||||||
POSTGRES_PASSWORD: password
|
POSTGRES_PASSWORD: password
|
||||||
volumes:
|
|
||||||
- db-data:/var/lib/postgresql/data
|
|
||||||
web:
|
web:
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: Dockerfile
|
target: test
|
||||||
|
args:
|
||||||
|
RUBY_VERSION: ${RUBY_VERSION}
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/cibuild, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
DATABASE_NAME: $DATABASE_NAME
|
DATABASE_NAME: $DATABASE_NAME
|
||||||
DATABASE_USERNAME: postgres
|
DATABASE_USERNAME: postgres
|
||||||
|
@ -21,12 +20,9 @@ services:
|
||||||
DATABASE_ENCODING: unicode
|
DATABASE_ENCODING: unicode
|
||||||
DATABASE_PORT: 5432
|
DATABASE_PORT: 5432
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME:-..}:/app:Z
|
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
volumes:
|
|
||||||
db-data:
|
|
|
@ -1,17 +1,20 @@
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
web:
|
web:
|
||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: Dockerfile-3.0
|
target: test
|
||||||
|
args:
|
||||||
|
RUBY_VERSION: ${RUBY_VERSION}
|
||||||
environment:
|
environment:
|
||||||
# These are set in script/ci-build, so we need to pass-thru them.
|
# These are set in script/cibuild, so we need to pass-thru them.
|
||||||
RAILS_ENV: $RAILS_ENV
|
RAILS_ENV: $RAILS_ENV
|
||||||
DATABASE_NAME: "/app/db.sqlite"
|
DATABASE_NAME: "/app/db/db.sqlite"
|
||||||
DATABASE_TYPE: sqlite3
|
DATABASE_TYPE: sqlite3
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME:-..}:/app:Z
|
- sqlite:/app/db:Z
|
||||||
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
- ${VOLUME:-..}/config/database.docker.yml:/app/config/database.yml:Z
|
||||||
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
- ${VOLUME:-..}/config/site.docker.yml:/app/config/site.yml:Z
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
|
volumes:
|
||||||
|
sqlite: {}
|
|
@ -124,7 +124,7 @@ class ContextsControllerTest < ActionController::TestCase
|
||||||
%w(guid link).each do |node|
|
%w(guid link).each do |node|
|
||||||
assert_select node, /http:\/\/test.host\/contexts\/.+/
|
assert_select node, /http:\/\/test.host\/contexts\/.+/
|
||||||
end
|
end
|
||||||
assert_select 'pubDate', contexts(:agenda).created_at.to_s(:rfc822)
|
assert_select 'pubDate', contexts(:agenda).created_at.to_formatted_s(:rfc822)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,65 +13,4 @@ class IntegrationsControllerTest < ActionController::TestCase
|
||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_cloudmailin_integration_success
|
|
||||||
stub_site_config do
|
|
||||||
SITE_CONFIG['cloudmailin'] = "123456789"
|
|
||||||
SITE_CONFIG['email_dispatch'] = 'from'
|
|
||||||
post :cloudmailin, params: {
|
|
||||||
"html"=>"",
|
|
||||||
"plain"=>"asdasd",
|
|
||||||
"x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]",
|
|
||||||
"disposable"=>"",
|
|
||||||
"from"=>"5555555555@tmomail.net",
|
|
||||||
"signature"=>"e85e908fb893394762047c21e54ce248",
|
|
||||||
"to"=>"<123123@cloudmailin.net>",
|
|
||||||
"subject"=>"asd",
|
|
||||||
"x_cc_header"=>"",
|
|
||||||
"message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <5555555555@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_response :success
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_cloudmailin_integration_invalid_signature
|
|
||||||
stub_site_config do
|
|
||||||
SITE_CONFIG['cloudmailin'] = "12345678901234567890"
|
|
||||||
post :cloudmailin, params: {
|
|
||||||
"html"=>"",
|
|
||||||
"plain"=>"asdasd",
|
|
||||||
"x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]",
|
|
||||||
"disposable"=>"",
|
|
||||||
"from"=>"5555555555@tmomail.net",
|
|
||||||
"signature"=>"e85e908fb893394762047c21e54ce248",
|
|
||||||
"to"=>"<123123@cloudmailin.net>",
|
|
||||||
"subject"=>"asd",
|
|
||||||
"x_cc_header"=>"",
|
|
||||||
"message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <5555555555@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_response 403
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_cloudmailin_integration_unknown_address
|
|
||||||
stub_site_config do
|
|
||||||
SITE_CONFIG['cloudmailin'] = "123456789"
|
|
||||||
post :cloudmailin, params: {
|
|
||||||
"html"=>"",
|
|
||||||
"plain"=>"asdasd",
|
|
||||||
"x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]",
|
|
||||||
"disposable"=>"",
|
|
||||||
"from"=>"444444444444@tmomail.net",
|
|
||||||
"signature"=>"6d2df0e807bfa9b77d24c31dce6d4515",
|
|
||||||
"to"=>"<123123@cloudmailin.net>",
|
|
||||||
"subject"=>"asd",
|
|
||||||
"x_cc_header"=>"",
|
|
||||||
"message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <444444444444@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_response 404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
require 'test_helper'
|
|
||||||
require 'support/stub_site_config_helper'
|
|
||||||
|
|
||||||
class MailgunControllerTest < ActionController::TestCase
|
|
||||||
include StubSiteConfigHelper
|
|
||||||
|
|
||||||
def setup
|
|
||||||
@user = users(:sms_user)
|
|
||||||
@inbox = contexts(:inbox)
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_message(filename)
|
|
||||||
File.read(File.join(Rails.root, 'test', 'fixtures', filename))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mailgun_signature_verifies
|
|
||||||
stub_site_config do
|
|
||||||
SITE_CONFIG['mailgun_api_key'] = "123456789"
|
|
||||||
SITE_CONFIG['email_dispatch'] = 'from'
|
|
||||||
|
|
||||||
post :mailgun, params: {
|
|
||||||
"timestamp" => "1379539674",
|
|
||||||
"token" => "5km6cwo0e3bfvg78hw4s69znro09xhk1h8u6-s633yasc8hcr5",
|
|
||||||
"signature" => "da92708b8f2c9dcd7ecdc91d52946c01802833e6683e46fc00b3f081920dd5b1",
|
|
||||||
"body-mime" => load_message('mailgun_message1.txt')
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_response :success
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mailgun_creates_todo_with_mailmap
|
|
||||||
stub_site_config do
|
|
||||||
SITE_CONFIG['mailgun_api_key'] = "123456789"
|
|
||||||
SITE_CONFIG['email_dispatch'] = 'to'
|
|
||||||
SITE_CONFIG['mailmap'] = {
|
|
||||||
'5555555555@tmomail.net' => ['incoming@othermail.com', 'notused@foo.org']
|
|
||||||
}
|
|
||||||
|
|
||||||
todo_count = Todo.count
|
|
||||||
post :mailgun, params: {
|
|
||||||
"timestamp" => "1379539674",
|
|
||||||
"token" => "5km6cwo0e3bfvg78hw4s69znro09xhk1h8u6-s633yasc8hcr5",
|
|
||||||
"signature" => "da92708b8f2c9dcd7ecdc91d52946c01802833e6683e46fc00b3f081920dd5b1",
|
|
||||||
"body-mime" => load_message('mailgun_message2.txt')
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_response :success
|
|
||||||
|
|
||||||
assert_equal(todo_count+1, Todo.count)
|
|
||||||
message_todo = Todo.where(:description => "test").first
|
|
||||||
assert_not_nil(message_todo)
|
|
||||||
assert_equal(@inbox, message_todo.context)
|
|
||||||
assert_equal(@user, message_todo.user)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mailgun_signature_fails
|
|
||||||
stub_site_config do
|
|
||||||
SITE_CONFIG['mailgun_api_key'] = "invalidkey"
|
|
||||||
SITE_CONFIG['email_dispatch'] = 'from'
|
|
||||||
|
|
||||||
post :mailgun, params: {
|
|
||||||
"timestamp" => "1379539674",
|
|
||||||
"token" => "5km6cwo0e3bfvg78hw4s69znro09xhk1h8u6-s633yasc8hcr5",
|
|
||||||
"signature" => "da92708b8f2c9dcd7ecdc91d52946c01802833e6683e46fc00b3f081920dd5b1",
|
|
||||||
"body-mime" => load_message('mailgun_message1.txt')
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_response 406
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,103 +0,0 @@
|
||||||
require 'test_helper'
|
|
||||||
|
|
||||||
class MessageGatewayTest < ActiveSupport::TestCase
|
|
||||||
|
|
||||||
def setup
|
|
||||||
@user = users(:sms_user)
|
|
||||||
@inbox = contexts(:inbox)
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_message(filename)
|
|
||||||
MessageGateway.receive(File.read(File.join(Rails.root, 'test', 'fixtures', filename)))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sms_with_no_subject
|
|
||||||
todo_count = Todo.count
|
|
||||||
|
|
||||||
load_message('sample_sms.txt')
|
|
||||||
# assert some stuff about it being created
|
|
||||||
assert_equal(todo_count+1, Todo.count)
|
|
||||||
|
|
||||||
message_todo = Todo.where(:description => "message_content").first
|
|
||||||
assert_not_nil(message_todo)
|
|
||||||
|
|
||||||
assert_equal(@inbox, message_todo.context)
|
|
||||||
assert_equal(@user, message_todo.user)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mms_with_subject
|
|
||||||
todo_count = Todo.count
|
|
||||||
|
|
||||||
load_message('sample_mms.txt')
|
|
||||||
|
|
||||||
# assert some stuff about it being created
|
|
||||||
assert_equal(todo_count+1, Todo.count)
|
|
||||||
|
|
||||||
message_todo = Todo.where(:description => "This is the subject").first
|
|
||||||
assert_not_nil(message_todo)
|
|
||||||
|
|
||||||
assert_equal(@inbox, message_todo.context)
|
|
||||||
assert_equal(@user, message_todo.user)
|
|
||||||
assert_equal("This is the message body", message_todo.notes)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_email_with_winmail_dat
|
|
||||||
todo_count = Todo.count
|
|
||||||
|
|
||||||
load_message('email_with_winmail.txt')
|
|
||||||
|
|
||||||
# assert some stuff about it being created
|
|
||||||
assert_equal(todo_count+1, Todo.count)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_email_with_multipart_attachments
|
|
||||||
todo_count = Todo.count
|
|
||||||
|
|
||||||
load_message('email_with_multipart.txt')
|
|
||||||
|
|
||||||
# assert some stuff about it being created
|
|
||||||
assert_equal(todo_count+1, Todo.count)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_no_user
|
|
||||||
todo_count = Todo.count
|
|
||||||
badmessage = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_sms.txt'))
|
|
||||||
badmessage.gsub!("5555555555", "notauser")
|
|
||||||
MessageGateway.receive(badmessage)
|
|
||||||
assert_equal(todo_count, Todo.count)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_direct_to_context
|
|
||||||
message = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_sms.txt'))
|
|
||||||
|
|
||||||
valid_context_msg = message.gsub('message_content', 'this is a task @ anothercontext')
|
|
||||||
invalid_context_msg = message.gsub('message_content', 'this is also a task @ notacontext')
|
|
||||||
|
|
||||||
MessageGateway.receive(valid_context_msg)
|
|
||||||
valid_context_todo = Todo.where(:description => "this is a task").first
|
|
||||||
assert_not_nil(valid_context_todo)
|
|
||||||
assert_equal(contexts(:anothercontext), valid_context_todo.context)
|
|
||||||
|
|
||||||
MessageGateway.receive(invalid_context_msg)
|
|
||||||
invalid_context_todo = Todo.where(:description => 'this is also a task').first
|
|
||||||
assert_not_nil(invalid_context_todo)
|
|
||||||
assert_equal(@inbox, invalid_context_todo.context)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_receiving_email_adds_attachment
|
|
||||||
attachment_count = Attachment.count
|
|
||||||
|
|
||||||
load_message('sample_mms.txt')
|
|
||||||
|
|
||||||
message_todo = Todo.where(:description => "This is the subject").first
|
|
||||||
assert_not_nil(message_todo)
|
|
||||||
|
|
||||||
assert_equal attachment_count+1, Attachment.count
|
|
||||||
assert_equal 1,message_todo.attachments.count
|
|
||||||
|
|
||||||
orig = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_mms.txt'))
|
|
||||||
attachment = File.read(message_todo.attachments.first.file.path)
|
|
||||||
|
|
||||||
assert_equal orig, attachment
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -102,7 +102,7 @@ class ProjectsControllerTest < ActionController::TestCase
|
||||||
%w(guid link).each do |node|
|
%w(guid link).each do |node|
|
||||||
assert_select node, /http:\/\/test.host\/projects\/.+/
|
assert_select node, /http:\/\/test.host\/projects\/.+/
|
||||||
end
|
end
|
||||||
assert_select 'pubDate', projects(:timemachine).updated_at.to_s(:rfc822)
|
assert_select 'pubDate', projects(:timemachine).updated_at.to_formatted_s(:rfc822)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -403,7 +403,7 @@ class TodosControllerTest < ActionController::TestCase
|
||||||
assert_equal "bar, foo", t.tag_list
|
assert_equal "bar, foo", t.tag_list
|
||||||
expected = Date.new(2006,11,30)
|
expected = Date.new(2006,11,30)
|
||||||
actual = t.due.to_date
|
actual = t.due.to_date
|
||||||
assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}"
|
assert_equal expected, actual, "Expected #{expected.to_formatted_s(:db)}, was #{actual.to_formatted_s(:db)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_update_todos_with_blank_project_name
|
def test_update_todos_with_blank_project_name
|
||||||
|
@ -551,7 +551,7 @@ class TodosControllerTest < ActionController::TestCase
|
||||||
assert_select 'description', /.*/
|
assert_select 'description', /.*/
|
||||||
assert_select 'link', %r{http://test.host/contexts/.+}
|
assert_select 'link', %r{http://test.host/contexts/.+}
|
||||||
assert_select 'guid', %r{http://test.host/todos/.+}
|
assert_select 'guid', %r{http://test.host/todos/.+}
|
||||||
assert_select 'pubDate', todos(:call_bill_gates_every_day).created_at.to_s(:rfc822)
|
assert_select 'pubDate', todos(:call_bill_gates_every_day).created_at.to_formatted_s(:rfc822)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
2
test/fixtures/contexts.yml
vendored
2
test/fixtures/contexts.yml
vendored
|
@ -5,7 +5,7 @@
|
||||||
<%
|
<%
|
||||||
|
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.to_s(:db)
|
Time.zone.now.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
6
test/fixtures/notes.yml
vendored
6
test/fixtures/notes.yml
vendored
|
@ -4,15 +4,15 @@
|
||||||
# rails does automatically in models or controllers! Convert to utc manually!
|
# rails does automatically in models or controllers! Convert to utc manually!
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.to_s(:db)
|
Time.zone.now.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.utc.to_s(:db)
|
1.week.from_now.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.to_s(:db)
|
1.week.ago.utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|
6
test/fixtures/projects.yml
vendored
6
test/fixtures/projects.yml
vendored
|
@ -4,13 +4,13 @@
|
||||||
# rails does automatically in models or controllers! Convert to utc manually!
|
# rails does automatically in models or controllers! Convert to utc manually!
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
def yesterday
|
def yesterday
|
||||||
1.day.ago.utc.beginning_of_day.to_s(:db)
|
1.day.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.beginning_of_day.to_s(:db)
|
1.week.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|
12
test/fixtures/recurring_todos.yml
vendored
12
test/fixtures/recurring_todos.yml
vendored
|
@ -3,27 +3,27 @@
|
||||||
|
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.utc.beginning_of_day.to_s(:db)
|
1.week.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.beginning_of_day.to_s(:db)
|
1.week.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_ago
|
def two_weeks_ago
|
||||||
2.weeks.ago.utc.beginning_of_day.to_s(:db)
|
2.weeks.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_hence
|
def two_weeks_hence
|
||||||
2.weeks.from_now.utc.beginning_of_day.to_s(:db)
|
2.weeks.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def way_back
|
def way_back
|
||||||
Time.zone.local(2008,1,1).utc.to_s(:db)
|
Time.zone.local(2008,1,1).utc.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
2
test/fixtures/tags.yml
vendored
2
test/fixtures/tags.yml
vendored
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
<%
|
<%
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|
12
test/fixtures/todos.yml
vendored
12
test/fixtures/todos.yml
vendored
|
@ -8,27 +8,27 @@ def yesterday
|
||||||
Time.zone.now.utc.beginning_of_day - 1.day
|
Time.zone.now.utc.beginning_of_day - 1.day
|
||||||
end
|
end
|
||||||
def today
|
def today
|
||||||
Time.zone.now.utc.beginning_of_day.to_s(:db)
|
Time.zone.now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def tomorrow
|
def tomorrow
|
||||||
(Time.zone.now.utc.beginning_of_day + 1.day).to_s(:db)
|
(Time.zone.now.utc.beginning_of_day + 1.day).to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.utc.beginning_of_day.to_s(:db)
|
1.week.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_week
|
def last_week
|
||||||
1.week.ago.utc.beginning_of_day.to_s(:db)
|
1.week.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_ago
|
def two_weeks_ago
|
||||||
2.weeks.ago.utc.beginning_of_day.to_s(:db)
|
2.weeks.ago.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_weeks_hence
|
def two_weeks_hence
|
||||||
2.weeks.from_now.utc.beginning_of_day.to_s(:db)
|
2.weeks.from_now.utc.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
|
@ -110,7 +110,7 @@ class RecurringTodoTest < ActiveSupport::TestCase
|
||||||
# every_day should return start_day if it is in the future
|
# every_day should return start_day if it is in the future
|
||||||
@every_day.start_from = @in_three_days
|
@every_day.start_from = @in_three_days
|
||||||
due_date = @every_day.get_due_date(nil)
|
due_date = @every_day.get_due_date(nil)
|
||||||
assert_equal @in_three_days.at_midnight.to_s(:db), due_date.to_s(:db)
|
assert_equal @in_three_days.at_midnight.to_formatted_s(:db), due_date.to_formatted_s(:db)
|
||||||
due_date = @every_day.get_due_date(@tomorrow)
|
due_date = @every_day.get_due_date(@tomorrow)
|
||||||
assert_equal @in_three_days.at_midnight, due_date
|
assert_equal @in_three_days.at_midnight, due_date
|
||||||
|
|
||||||
|
|
|
@ -122,8 +122,8 @@ module RecurringTodos
|
||||||
travel_to Time.zone.local(2013,1,1) do
|
travel_to Time.zone.local(2013,1,1) do
|
||||||
rt = create_recurring_todo
|
rt = create_recurring_todo
|
||||||
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil), "no previous date, use today"
|
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil), "no previous date, use today"
|
||||||
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil, 1.day).to_s(:db), "no previous date, use today without offset"
|
assert_equal Time.zone.parse("2013-01-01 00:00:00"), rt.send(:determine_start, nil, 1.day).to_formatted_s(:db), "no previous date, use today without offset"
|
||||||
assert_equal Time.zone.parse("2013-01-02 00:00:00"), rt.send(:determine_start, Time.zone.now, 1.day).to_s(:db), "use previous date and offset"
|
assert_equal Time.zone.parse("2013-01-02 00:00:00"), rt.send(:determine_start, Time.zone.now, 1.day).to_formatted_s(:db), "use previous date and offset"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -131,14 +131,14 @@ module RecurringTodos
|
||||||
rt = create_recurring_todo
|
rt = create_recurring_todo
|
||||||
|
|
||||||
# march 2014 has 5 saturdays, the last will return the 5th
|
# march 2014 has 5 saturdays, the last will return the 5th
|
||||||
assert_equal Time.zone.parse("2014-03-01 00:00:00"), rt.send(:get_xth_day_of_month, 1, 6, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-01 00:00:00"), rt.send(:get_xth_day_of_month, 1, 6, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-22 00:00:00"), rt.send(:get_xth_day_of_month, 4, 6, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-22 00:00:00"), rt.send(:get_xth_day_of_month, 4, 6, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-29 00:00:00"), rt.send(:get_xth_day_of_month, 5, 6, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-29 00:00:00"), rt.send(:get_xth_day_of_month, 5, 6, 3, 2014).to_formatted_s(:db)
|
||||||
|
|
||||||
# march 2014 has 4 fridays, the last will return the 4th
|
# march 2014 has 4 fridays, the last will return the 4th
|
||||||
assert_equal Time.zone.parse("2014-03-07 00:00:00"), rt.send(:get_xth_day_of_month, 1, 5, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-07 00:00:00"), rt.send(:get_xth_day_of_month, 1, 5, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 4, 5, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 4, 5, 3, 2014).to_formatted_s(:db)
|
||||||
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 5, 5, 3, 2014).to_s(:db)
|
assert_equal Time.zone.parse("2014-03-28 00:00:00"), rt.send(:get_xth_day_of_month, 5, 5, 3, 2014).to_formatted_s(:db)
|
||||||
|
|
||||||
assert_raise(RuntimeError, "should check on valid weekdays"){ rt.send(:get_xth_day_of_month, 5, 9, 3, 2014) }
|
assert_raise(RuntimeError, "should check on valid weekdays"){ rt.send(:get_xth_day_of_month, 5, 9, 3, 2014) }
|
||||||
assert_raise(RuntimeError, "should check on valid count x"){ rt.send(:get_xth_day_of_month, 6, 5, 3, 2014) }
|
assert_raise(RuntimeError, "should check on valid count x"){ rt.send(:get_xth_day_of_month, 6, 5, 3, 2014) }
|
||||||
|
|
|
@ -10,7 +10,7 @@ class TodoTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_week
|
def next_week
|
||||||
1.week.from_now.beginning_of_day.to_s(:db)
|
1.week.from_now.beginning_of_day.to_formatted_s(:db)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Test loading a todo item
|
# Test loading a todo item
|
||||||
|
@ -102,7 +102,7 @@ class TodoTest < ActiveSupport::TestCase
|
||||||
@not_completed2
|
@not_completed2
|
||||||
assert_equal :active, @not_completed2.aasm.current_state
|
assert_equal :active, @not_completed2.aasm.current_state
|
||||||
@not_completed2.show_from = Time.zone.now + 1.week
|
@not_completed2.show_from = Time.zone.now + 1.week
|
||||||
assert @not_completed2.save, "should have saved successfully" + @not_completed2.errors.to_xml
|
assert @not_completed2.save, "should have saved successfully " + @not_completed2.errors.full_messages.to_s
|
||||||
assert_equal :deferred, @not_completed2.aasm.current_state
|
assert_equal :deferred, @not_completed2.aasm.current_state
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -112,14 +112,14 @@ class TodoTest < ActiveSupport::TestCase
|
||||||
todo.show_from = next_week
|
todo.show_from = next_week
|
||||||
todo.context_id = 1
|
todo.context_id = 1
|
||||||
todo.description = 'foo'
|
todo.description = 'foo'
|
||||||
assert todo.save, "should have saved successfully" + todo.errors.to_xml
|
assert todo.save, "should have saved successfully" + todo.errors.full_messages.to_s
|
||||||
assert_equal :deferred, todo.aasm.current_state
|
assert_equal :deferred, todo.aasm.current_state
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_create_a_new_deferred_todo_by_passing_attributes
|
def test_create_a_new_deferred_todo_by_passing_attributes
|
||||||
user = users(:other_user)
|
user = users(:other_user)
|
||||||
todo = user.todos.build(:show_from => next_week, :context_id => 1, :description => 'foo')
|
todo = user.todos.build(:show_from => next_week, :context_id => 1, :description => 'foo')
|
||||||
assert todo.save, "should have saved successfully" + todo.errors.to_xml
|
assert todo.save, "should have saved successfully " + todo.errors.full_messages.to_s
|
||||||
assert_equal :deferred, todo.aasm.current_state
|
assert_equal :deferred, todo.aasm.current_state
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -551,7 +551,7 @@ class TodoTest < ActiveSupport::TestCase
|
||||||
new_path = attachment.file.path
|
new_path = attachment.file.path
|
||||||
|
|
||||||
# then the attachment should be there
|
# then the attachment should be there
|
||||||
assert File.exists?(new_path), "attachment should be on file system"
|
assert File.exist?(new_path), "attachment should be on file system"
|
||||||
assert_equal 1, todo.attachments.reload.count, "should have one attachment"
|
assert_equal 1, todo.attachments.reload.count, "should have one attachment"
|
||||||
|
|
||||||
# When I destroy the todo
|
# When I destroy the todo
|
||||||
|
@ -559,7 +559,7 @@ class TodoTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
# Then the attachement and file should nogt be there anymore
|
# Then the attachement and file should nogt be there anymore
|
||||||
assert_equal 0, todo.user.attachments.reload.count
|
assert_equal 0, todo.user.attachments.reload.count
|
||||||
assert !File.exists?(new_path), "attachment should not be on file system"
|
assert !File.exist?(new_path), "attachment should not be on file system"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_destroying_action_activates_successors
|
def test_destroying_action_activates_successors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue