Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03bfd8a734 | ||
|
|
409245e374 | ||
|
|
5870d38e8e | ||
|
|
c105e348d8 | ||
|
|
ccd0f89ae0 | ||
|
|
bdd28444bb | ||
|
|
c96468d76d | ||
|
|
943cd25592 | ||
|
|
7f4d3ff3ec | ||
|
|
5d2daa4a80 | ||
|
|
6372bb82c4 | ||
|
|
03a7da0795 | ||
|
|
bc1165ef3e | ||
|
|
47f34f6d12 | ||
|
|
d887e553ce | ||
|
|
13b5bb6407 | ||
|
|
5863df3323 | ||
|
|
b0cf69c160 | ||
|
|
60b2787c55 | ||
|
|
4d1e4f011f | ||
|
|
ec607596d1 | ||
|
|
7e4b791c29 | ||
|
|
55d8d26b34 | ||
|
|
3f5175778d | ||
|
|
7e80db36cf | ||
|
|
6828a1e07a | ||
|
|
2a51a17ddc | ||
|
|
ce11933dda | ||
|
|
b9f87bf310 | ||
|
|
28eeee3a28 | ||
|
|
e17e8d4154 | ||
|
|
dee7020a5a | ||
|
|
79f4e2ad6d | ||
|
|
25f1256724 | ||
|
|
4d49265b25 | ||
|
|
3d0e91f80e | ||
|
|
533857c961 | ||
|
|
83bc176ebf | ||
|
|
910f0cecbe | ||
|
|
10f0c49007 | ||
|
|
ba2911a645 | ||
|
|
07860bd4de | ||
|
|
42bd03e333 | ||
|
|
97f525fdbc | ||
|
|
1050e04c10 | ||
|
|
1534b22315 | ||
|
|
bcec728c2e | ||
|
|
6f503ca818 | ||
|
|
1b927a9d3a | ||
|
|
045b8a84a2 | ||
|
|
1624fc82f7 | ||
|
|
42d8773e36 | ||
|
|
15dff73b94 | ||
|
|
ec1d8f275f | ||
|
|
68391a943b | ||
|
|
9c48cc9ec0 | ||
|
|
41c06c1374 | ||
|
|
2c6841210c | ||
|
|
eba8fb4c9c | ||
|
|
95522ebcd9 | ||
|
|
8bf13f43e8 | ||
|
|
ca8f2a70a4 | ||
|
|
f6e9f5a5e8 | ||
|
|
be6d1044a0 | ||
|
|
52938b2f1c | ||
|
|
116372e11e | ||
|
|
14cdb5bdf1 | ||
|
|
de28bf8569 | ||
|
|
419615bed4 | ||
|
|
3ee9b13b3b | ||
|
|
0725ce3fb1 | ||
|
|
eb7623e218 | ||
|
|
19acd7861d | ||
|
|
282f0f91fe | ||
|
|
b51094d5cd | ||
|
|
b9a4b0b51d | ||
|
|
1a49d25c90 | ||
|
|
f57ed2990f | ||
|
|
87412ceb55 | ||
|
|
87cb4598f7 | ||
|
|
b35b9d8aa2 | ||
|
|
6646d48ccb | ||
|
|
23ee93ca3d | ||
|
|
0911511d0c | ||
|
|
b7562a7085 | ||
|
|
16a793e672 | ||
|
|
6e4407ed9c | ||
|
|
05cd1247ab | ||
|
|
af240450d6 | ||
|
|
ba24c4e40c | ||
|
|
2cbd7d83f9 | ||
|
|
892008563b | ||
|
|
c7a40784e7 | ||
|
|
c5e0832e00 | ||
|
|
eb4219504d | ||
|
|
a5e5b44330 | ||
|
|
ee6852f8ea | ||
|
|
2575552e11 | ||
|
|
a77cf56fbd | ||
|
|
07dfe33ed8 | ||
|
|
c8b21b2e17 | ||
|
|
0be1c00fcc | ||
|
|
20edac091a | ||
|
|
311c0d23a4 | ||
|
|
032099cfbe | ||
|
|
cd97cca7b8 | ||
|
|
3f0fddf448 | ||
|
|
f1e103b082 | ||
|
|
afe00d02cd | ||
|
|
e21c078521 | ||
|
|
5eb3784527 | ||
|
|
0ff1e63a5d | ||
|
|
b11ae567c9 | ||
|
|
e41256f935 | ||
|
|
b00db983c8 | ||
|
|
3e4a8bca36 | ||
|
|
54b4682258 | ||
|
|
bda49ed609 | ||
|
|
39be9aa58d | ||
|
|
f245b6b7fa | ||
|
|
ad87f9ff4e | ||
|
|
40abff4c1e | ||
|
|
51ad89c3af | ||
|
|
768412ba7c | ||
|
|
670b964e6b | ||
|
|
f6c377eb9f | ||
|
|
6d063a4f64 | ||
|
|
207be3a363 | ||
|
|
e1ffe943c8 | ||
|
|
431d884e83 | ||
|
|
983714cd72 | ||
|
|
e6629779f7 | ||
|
|
f1587753cb | ||
|
|
a6d4f445fb | ||
|
|
8f34cdc279 | ||
|
|
71cbac358b | ||
|
|
3b2b108744 | ||
|
|
100e2d4696 | ||
|
|
d42c4fb4f6 | ||
|
|
ed3e20dce5 | ||
|
|
82b0bd9ddb | ||
|
|
ab6ec59bfb | ||
|
|
b144fab042 | ||
|
|
b1d1c7c45a | ||
|
|
2353f654de | ||
|
|
6e0ae161ad | ||
|
|
f1660e3b9f | ||
|
|
336a22555f | ||
|
|
06b548f12e | ||
|
|
e4de42d487 | ||
|
|
1617577378 | ||
|
|
2add82efc5 | ||
|
|
06cacd7a5a | ||
|
|
2d4f29cb5a | ||
|
|
0b26250b46 | ||
|
|
09677d0bfa | ||
|
|
aa4bdf7efb | ||
|
|
5755ece33e | ||
|
|
2e93a975c4 | ||
|
|
c4df69a05b | ||
|
|
a562ee4ba1 | ||
|
|
781b384fe9 | ||
|
|
b6cc6c440d | ||
|
|
20da91b774 | ||
|
|
e530077fc5 | ||
|
|
444fff47dc | ||
|
|
1aa8f502ae | ||
|
|
2a25318ba8 | ||
|
|
39a8524354 | ||
|
|
573ca73b45 | ||
|
|
07d1a864d8 | ||
|
|
ffcd380523 | ||
|
|
55534b8b2e | ||
|
|
ca23934bde | ||
|
|
8a622ec7c3 | ||
|
|
39519d1cc9 | ||
|
|
dcbf92b5b1 | ||
|
|
7f6d500cbe | ||
|
|
cb1e91fee8 | ||
|
|
96494bacf5 | ||
|
|
99f68f36b0 | ||
|
|
61e682470c | ||
|
|
415e94d187 | ||
|
|
6b22f96313 | ||
|
|
8c3322f9a9 | ||
|
|
f935cf391e | ||
|
|
fb44df9815 | ||
|
|
e127895cf3 | ||
|
|
1f85b25549 | ||
|
|
df9851e2b7 | ||
|
|
232bc746f4 | ||
|
|
ea448cd6c3 | ||
|
|
a7d12ddcaa | ||
|
|
420e9b23d2 | ||
|
|
cd49018306 | ||
|
|
ddbf4f18ff | ||
|
|
24104991b4 | ||
|
|
d9d451a206 | ||
|
|
1f07050979 | ||
|
|
399ddd2dab | ||
|
|
2876ce633c | ||
|
|
333b9c811d | ||
|
|
1df3d56f7c | ||
|
|
d2a7a82870 | ||
|
|
5e49006b6f | ||
|
|
f73ea218ee | ||
|
|
6ac3249272 | ||
|
|
784f960e8f | ||
|
|
04db8d739e | ||
|
|
7226afdc39 | ||
|
|
446a81ddd0 | ||
|
|
5fd167c182 | ||
|
|
7cd57ee023 | ||
|
|
07ab3b83b1 | ||
|
|
3ade9d95a6 | ||
|
|
55c5f07026 | ||
|
|
b4ade0256b | ||
|
|
afcb8aa49b | ||
|
|
a47ca598e7 | ||
|
|
c9a28db3ab | ||
|
|
1cfb6eee4b | ||
|
|
6c68867efe | ||
|
|
0ef84a0d5f | ||
|
|
e0f4758667 | ||
|
|
8c149da9e9 | ||
|
|
18eafe2fec | ||
|
|
5ac636fdd4 | ||
|
|
6db3474cdf | ||
|
|
6a1bc167cf | ||
|
|
191071d295 | ||
|
|
3e4a9471ba | ||
|
|
9b68aa919a | ||
|
|
8732e4b18f | ||
|
|
d26786a628 | ||
|
|
54b9035eb2 | ||
|
|
3cf6ed916f | ||
|
|
351d9d0c95 | ||
|
|
c0923ed3cf | ||
|
|
fc2eb2e935 | ||
|
|
88844034fc | ||
|
|
3d33ea911a | ||
|
|
bb08e40ea5 | ||
|
|
c4879de4b1 | ||
|
|
fd0afd7b05 | ||
|
|
5c02850bc1 | ||
|
|
1f450df1af | ||
|
|
e933890730 | ||
|
|
8eafa1ac66 | ||
|
|
858bb35612 | ||
|
|
f9018fc3a8 | ||
|
|
252c4b19f9 | ||
|
|
05349a5deb | ||
|
|
d52affe658 | ||
|
|
23dcd084a4 | ||
|
|
a853189486 | ||
|
|
82d0a3df85 | ||
|
|
ef189477dd | ||
|
|
4bcc795778 | ||
|
|
01346152b5 | ||
|
|
5b7b5b3e7e | ||
|
|
2df29324e6 | ||
|
|
51f52fee23 | ||
|
|
6e088af3d1 | ||
|
|
fc9f0d8392 | ||
|
|
cfa2bbd3d4 | ||
|
|
52d633ca69 | ||
|
|
b2fee6a6c1 | ||
|
|
66d35a1528 | ||
|
|
b7105d7b57 | ||
|
|
d5fbd50b76 | ||
|
|
06515559a6 | ||
|
|
c61a126c8b | ||
|
|
b737adfcdf | ||
|
|
3b44acd87c | ||
|
|
6fad68b9b9 | ||
|
|
b05f8e5251 | ||
|
|
31c2afb072 | ||
|
|
863f0fc5db | ||
|
|
055b528532 | ||
|
|
fda392e662 | ||
|
|
e5f9d0a4dd | ||
|
|
3f16bf6054 | ||
|
|
6774b9e905 | ||
|
|
00a38b36a4 | ||
|
|
de365ad62a | ||
|
|
fe631ff75b | ||
|
|
eed649fbe6 | ||
|
|
8ddbc622db | ||
|
|
24b21d23ba | ||
|
|
64fa02cdf5 | ||
|
|
3b50b2c59f | ||
|
|
921460db40 | ||
|
|
4156073b1a | ||
|
|
af7c74b2d3 | ||
|
|
4064f3f406 | ||
|
|
94e47401cb | ||
|
|
5ef83ab236 | ||
|
|
c22eaa26cd | ||
|
|
060b9acd86 | ||
|
|
213b7b4819 | ||
|
|
7a576f9ae4 | ||
|
|
62f06a792f | ||
|
|
1ac11d92ba | ||
|
|
0c299e3225 | ||
|
|
bcc3a39c06 | ||
|
|
13dffca055 | ||
|
|
68ee88a041 | ||
|
|
3718dd4d45 | ||
|
|
506a747fce | ||
|
|
98e255ccec | ||
|
|
4879df0244 | ||
|
|
3bdeaaf552 | ||
|
|
45dea737bf | ||
|
|
b80396f627 | ||
|
|
0735981366 | ||
|
|
5d8cca40d2 | ||
|
|
09ce3e464f | ||
|
|
4c5a2fbd1f | ||
|
|
9c6cd51ca7 | ||
|
|
ea74a34d72 | ||
|
|
28cffc4328 | ||
|
|
0a12319002 | ||
|
|
2f33e3a76b | ||
|
|
96507e6777 | ||
|
|
e6d6b5322e | ||
|
|
b8d8081ded | ||
|
|
0e428233f2 | ||
|
|
fdbc1b5c22 | ||
|
|
ea0239538a | ||
|
|
aa084b7a7e | ||
|
|
8a2509007c | ||
|
|
d0208b2112 | ||
|
|
851bfa53e6 | ||
|
|
ba01ebe05d | ||
|
|
e6a2ffc592 | ||
|
|
f90ca00669 | ||
|
|
bbb65ae4e2 | ||
|
|
eece32d51b | ||
|
|
1865bdbee9 | ||
|
|
85f254da38 | ||
|
|
1fe7394d05 | ||
|
|
6b9a7a3fc1 | ||
|
|
8f33517142 | ||
|
|
0a51ea753f | ||
|
|
235bedab00 | ||
|
|
564e1919af | ||
|
|
1c9dd7233e | ||
|
|
6e7a58b204 | ||
|
|
75bdd33fda | ||
|
|
5f915ef966 | ||
|
|
a570c4a861 | ||
|
|
a797abaa36 | ||
|
|
2bb5a31fa4 | ||
|
|
012ca39a8d | ||
|
|
c3458855bd | ||
|
|
cfcc73724f | ||
|
|
4448488767 | ||
|
|
1742bcd9b1 | ||
|
|
7dc0bbd7b2 | ||
|
|
269698ba78 | ||
|
|
0a1bfd37b3 | ||
|
|
ec03bbe260 | ||
|
|
3cc0a93e0e | ||
|
|
079867ff37 | ||
|
|
533bc045d0 | ||
|
|
b5773232d5 | ||
|
|
3042d2ff9a | ||
|
|
8d5adc0464 | ||
|
|
9cba640120 | ||
|
|
b740381a72 | ||
|
|
2691f033cb | ||
|
|
c7d4a90d5c | ||
|
|
92dd6bbba2 | ||
|
|
e42adcaed0 | ||
|
|
301d96f392 | ||
|
|
1c488cb8a7 | ||
|
|
9e33d8cbab | ||
|
|
4c3907bd41 | ||
|
|
153d729544 | ||
|
|
3d5abd60cc | ||
|
|
1d89e96dd1 | ||
|
|
bc3696b64a | ||
|
|
f803520c76 | ||
|
|
6afc9259f0 | ||
|
|
47df8d6737 | ||
|
|
d2dfd9c3b9 | ||
|
|
63f501c574 | ||
|
|
6aa0aa50dc | ||
|
|
9ae20a3f51 | ||
|
|
280e66947e | ||
|
|
9b9e3c9e0c | ||
|
|
1696bd688e | ||
|
|
63ad79a784 | ||
|
|
f7a0d15db7 | ||
|
|
6a7cb809f4 | ||
|
|
3244c3c32b | ||
|
|
09666585e2 | ||
|
|
ee106d1cb4 | ||
|
|
8ef435c83e | ||
|
|
3a74b88294 | ||
|
|
c5079096b5 | ||
|
|
927e43ab3f | ||
|
|
eddcb2260b | ||
|
|
ff73aa4566 | ||
|
|
de993a079d | ||
|
|
7bb0aa7488 | ||
|
|
fe7398faef | ||
|
|
8e709c1b79 | ||
|
|
3908fe0ab8 | ||
|
|
5d2ff89e9b | ||
|
|
7f38bc7b95 | ||
|
|
ed0c64a270 | ||
|
|
e63e7b1131 | ||
|
|
3f7d9fd42c | ||
|
|
867344f070 | ||
|
|
a84195179e | ||
|
|
f1b18d79cd | ||
|
|
6d1cdebfe2 | ||
|
|
7cf8487f57 | ||
|
|
5403027c9d | ||
|
|
daf397a1ba | ||
|
|
6104c1711f | ||
|
|
db41e41d90 | ||
|
|
1235363465 | ||
|
|
7263d7497f | ||
|
|
666186fee8 | ||
|
|
27d1b5acca | ||
|
|
5eb5ca5752 | ||
|
|
16d371b814 | ||
|
|
df9b4db49d | ||
|
|
2e8e58004d | ||
|
|
a83aa6162b | ||
|
|
07c915ccf0 | ||
|
|
405f176bbb | ||
|
|
6476503137 | ||
|
|
981ed546f1 | ||
|
|
c1287248a6 | ||
|
|
52f884f2b1 | ||
|
|
4550e10fbe | ||
|
|
2efe974195 | ||
|
|
6b808dd74b | ||
|
|
8a917e0efc | ||
|
|
d1f98d0c47 | ||
|
|
323de77a83 | ||
|
|
738e7f9ebc | ||
|
|
b5b4af73a9 | ||
|
|
ab1014b7d8 | ||
|
|
12964aa742 | ||
|
|
e4b1106acd | ||
|
|
d0524532a4 | ||
|
|
7de18eccea | ||
|
|
f9747bc908 | ||
|
|
6fd827792a | ||
|
|
9e95c06415 | ||
|
|
e7603298d7 | ||
|
|
8e14459cff | ||
|
|
3ac5dba243 | ||
|
|
9969c89b1c | ||
|
|
5a5b19d4fc | ||
|
|
4d48fa4d95 | ||
|
|
57545f66d2 | ||
|
|
8586c843a4 | ||
|
|
b2acc3ba45 | ||
|
|
9f0273aa44 | ||
|
|
3407b0e65b | ||
|
|
5899b9366c | ||
|
|
4b196d5378 | ||
|
|
b34ed58289 | ||
|
|
617fdaeb74 | ||
|
|
d26bf04bfa | ||
|
|
a365899312 | ||
|
|
6ebd6defe9 | ||
|
|
93337c20f8 | ||
|
|
6cdd464f54 | ||
|
|
3e0bedd8c7 | ||
|
|
4dcdec0084 | ||
|
|
05c53ca01d |
No files matched your search
@@ -1,4 +1,4 @@
|
||||
FROM ubuntu:disco
|
||||
FROM ubuntu:rolling
|
||||
LABEL maintainer="sgr"
|
||||
|
||||
ENV BUILD_DEPS="gnupg gosu bsdtar wget curl bzip2 g++ build-essential python git ca-certificates iproute2"
|
||||
@@ -6,8 +6,8 @@ ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=8.17.0 \
|
||||
METEOR_RELEASE=1.8.1 \
|
||||
NODE_VERSION=v12.18.3 \
|
||||
METEOR_RELEASE=1.10.2 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=latest \
|
||||
@@ -21,10 +21,13 @@ ENV \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
|
||||
RICHER_CARD_COMMENT_EDITOR=true \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
ATTACHMENTS_STORE_PATH="" \
|
||||
MAX_IMAGE_PIXEL="" \
|
||||
IMAGE_COMPRESS_RATIO="" \
|
||||
BIGEVENTS_PATTERN="" \
|
||||
NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \
|
||||
BIGEVENTS_PATTERN=NONE \
|
||||
NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="" \
|
||||
NOTIFY_DUE_AT_HOUR_OF_DAY="" \
|
||||
EMAIL_NOTIFICATION_TIMEOUT=30000 \
|
||||
@@ -108,7 +111,11 @@ ENV \
|
||||
CORS="" \
|
||||
CORS_ALLOW_HEADERS="" \
|
||||
CORS_EXPOSE_HEADERS="" \
|
||||
DEFAULT_AUTHENTICATION_METHOD=""
|
||||
DEFAULT_AUTHENTICATION_METHOD="" \
|
||||
SCROLLINERTIA="0" \
|
||||
SCROLLAMOUNT="auto" \
|
||||
SCROLLDELTAFACTOR="auto" \
|
||||
PASSWORD_LOGIN_ENABLED=true
|
||||
|
||||
# Install OS
|
||||
RUN set -o xtrace \
|
||||
|
||||
+2
-1
@@ -11,6 +11,7 @@
|
||||
"browser": true,
|
||||
"meteor": true
|
||||
},
|
||||
"parser": "babel-eslint",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"sourceType": "module"
|
||||
@@ -44,7 +45,7 @@
|
||||
"no-spaced-func": 2,
|
||||
"no-trailing-spaces": 2,
|
||||
"operator-linebreak": 2,
|
||||
"quotes": [2, "single"],
|
||||
"quotes": [2, "single", { "avoidEscape": true }],
|
||||
"semi-spacing": 2,
|
||||
"space-unary-ops": 2,
|
||||
"arrow-spacing": 2,
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
name: wekan
|
||||
version: 0
|
||||
version-script: git describe --tags | cut -c 2-
|
||||
summary: The open-source kanban
|
||||
description: |
|
||||
Wekan is an open-source and collaborative kanban board application.
|
||||
|
||||
Whether you’re maintaining a personal todo list, planning your holidays with some friends, or working in a team on your next revolutionary idea, Kanban boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most.
|
||||
Depending on target environment, some configuration settings might need to be adjusted.
|
||||
For full list of configuration options call:
|
||||
$ wekan.help
|
||||
|
||||
confinement: strict
|
||||
grade: stable
|
||||
|
||||
architectures:
|
||||
- amd64
|
||||
|
||||
plugs:
|
||||
mongodb-plug:
|
||||
interface: content
|
||||
target: $SNAP_DATA/shared
|
||||
|
||||
hooks:
|
||||
configure:
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
|
||||
slots:
|
||||
mongodb-slot:
|
||||
interface: content
|
||||
write:
|
||||
- $SNAP_DATA/share
|
||||
|
||||
apps:
|
||||
wekan:
|
||||
command: wekan-control
|
||||
daemon: simple
|
||||
plugs: [network, network-bind]
|
||||
|
||||
mongodb:
|
||||
command: mongodb-control
|
||||
daemon: simple
|
||||
plugs: [network, network-bind]
|
||||
|
||||
caddy:
|
||||
command: caddy-control
|
||||
daemon: simple
|
||||
plugs: [network, network-bind]
|
||||
|
||||
help:
|
||||
command: wekan-help
|
||||
|
||||
database-backup:
|
||||
command: mongodb-backup
|
||||
plugs: [network, network-bind]
|
||||
|
||||
database-list-backups:
|
||||
command: ls -al $SNAP_COMMON/db-backups/
|
||||
|
||||
database-restore:
|
||||
command: mongodb-restore
|
||||
plugs: [network, network-bind]
|
||||
|
||||
parts:
|
||||
mongodb:
|
||||
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.6.tgz
|
||||
plugin: dump
|
||||
stage-packages: [libssl1.0.0, libcurl3]
|
||||
filesets:
|
||||
mongo:
|
||||
- usr
|
||||
- bin
|
||||
- lib
|
||||
stage:
|
||||
- $mongo
|
||||
prime:
|
||||
- $mongo
|
||||
|
||||
wekan:
|
||||
source: .
|
||||
plugin: nodejs
|
||||
node-engine: 12.18.3
|
||||
node-packages:
|
||||
- node-gyp
|
||||
- node-pre-gyp
|
||||
- fibers
|
||||
build-packages:
|
||||
- ca-certificates
|
||||
- apt-utils
|
||||
- python
|
||||
- python3
|
||||
- g++
|
||||
- capnproto
|
||||
- curl
|
||||
- libcurl3
|
||||
- execstack
|
||||
- nodejs
|
||||
- npm
|
||||
stage-packages:
|
||||
- libfontconfig1
|
||||
override-build: |
|
||||
echo "Cleaning environment first"
|
||||
rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules
|
||||
# Create the OpenAPI specification
|
||||
rm -rf .build
|
||||
## Use Meteor 1.8.x on Snap
|
||||
#rm -rf .meteor
|
||||
#mv .snap-meteor-1.8/.meteor .
|
||||
#mv .snap-meteor-1.8/package.json .
|
||||
#mv .snap-meteor-1.8/package-lock.json .
|
||||
## Meteor 1.9.x has changes to Buffer() => Buffer.alloc(), so reverting those
|
||||
#mv .snap-meteor-1.8/cfs_access-point.txt fix-download-unicode/
|
||||
#mv .snap-meteor-1.8/export.js models/
|
||||
#mv .snap-meteor-1.8/wekanCreator.js models/
|
||||
#mv .snap-meteor-1.8/ldap.js packages/wekan-ldap/server/ldap.js
|
||||
#mv .snap-meteor-1.8/oidc_server.js packages/wekan-oidc/oidc_server.js
|
||||
rm -rf .snap-meteor-1.8
|
||||
#mkdir -p .build/python
|
||||
#cd .build/python
|
||||
#git clone --depth 1 -b master https://github.com/Kronuz/esprima-python
|
||||
#cd esprima-python
|
||||
#python3 setup.py install
|
||||
#cd ../../..
|
||||
#mkdir -p ./public/api
|
||||
#python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml
|
||||
# we temporary need api2html and mkdirp
|
||||
#npm install -g api2html@0.3.0
|
||||
#npm install -g mkdirp
|
||||
#api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml
|
||||
#npm uninstall -g mkdirp
|
||||
#npm uninstall -g api2html
|
||||
# Node Fibers 100% CPU usage issue:
|
||||
# https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-381453161
|
||||
# https://github.com/meteor/meteor/issues/9796#issuecomment-381676326
|
||||
# https://github.com/sandstorm-io/sandstorm/blob/0f1fec013fe7208ed0fd97eb88b31b77e3c61f42/shell/server/00-startup.js#L99-L129
|
||||
# Also see beginning of wekan/server/authentication.js
|
||||
# import Fiber from "fibers";
|
||||
# Fiber.poolSize = 1e9;
|
||||
# OLD: Download node version 8.12.0 prerelease build => Official node 8.12.0 has been released
|
||||
# Description at https://releases.wekan.team/node.txt
|
||||
##echo "375bd8db50b9c692c0bbba6e96d4114cd29bee3770f901c1ff2249d1038f1348 node" >> node-SHASUMS256.txt.asc
|
||||
##curl https://releases.wekan.team/node -o node
|
||||
# Verify Fibers patched node authenticity
|
||||
##echo "Fibers 100% CPU issue patched node authenticity:"
|
||||
##grep node node-SHASUMS256.txt.asc | shasum -a 256 -c -
|
||||
##rm -f node-SHASUMS256.txt.asc
|
||||
##chmod +x node
|
||||
##mv node `which node`
|
||||
# DOES NOT WORK: paxctl fix.
|
||||
# Removed from build-packages: - paxctl
|
||||
#echo "Applying paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303"
|
||||
#paxctl -mC `which node`
|
||||
#echo "Installing npm"
|
||||
#curl -L https://www.npmjs.com/install.sh | sh
|
||||
echo "Installing meteor"
|
||||
curl https://install.meteor.com/ -o install_meteor.sh
|
||||
#sed -i "s|RELEASE=.*|RELEASE=\"1.8.1-beta.0\"|g" install_meteor.sh
|
||||
chmod +x install_meteor.sh
|
||||
sh install_meteor.sh
|
||||
rm install_meteor.sh
|
||||
# REPOS BELOW ARE INCLUDED TO WEKAN REPO
|
||||
#if [ ! -d "packages" ]; then
|
||||
# mkdir packages
|
||||
#fi
|
||||
#if [ ! -d "packages/kadira-flow-router" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
|
||||
# cd ..
|
||||
#fi
|
||||
#if [ ! -d "packages/meteor-useraccounts-core" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
|
||||
# sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' meteor-useraccounts-core/package.js
|
||||
# cd ..
|
||||
#fi
|
||||
#if [ ! -d "packages/meteor-accounts-cas" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-cas.git meteor-accounts-cas
|
||||
# cd ..
|
||||
#fi
|
||||
#if [ ! -d "packages/wekan-ldap" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master https://github.com/wekan/wekan-ldap.git
|
||||
# cd ..
|
||||
#fi
|
||||
#if [ ! -d "packages/wekan-scrollbar" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master https://github.com/wekan/wekan-scrollbar.git
|
||||
# cd ..
|
||||
#fi
|
||||
#if [ ! -d "packages/wekan_accounts-oidc" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-oidc.git
|
||||
# mv meteor-accounts-oidc/packages/switch_accounts-oidc wekan-accounts-oidc
|
||||
# mv meteor-accounts-oidc/packages/switch_oidc wekan-oidc
|
||||
# rm -rf meteor-accounts-oidc
|
||||
# cd ..
|
||||
#fi
|
||||
#if [ ! -d "packages/markdown" ]; then
|
||||
# cd packages
|
||||
# git clone --depth 1 -b master --recurse-submodules https://github.com/wekan/markdown.git
|
||||
# cd ..
|
||||
#fi
|
||||
rm -rf .build
|
||||
meteor add standard-minifier-js --allow-superuser
|
||||
meteor npm install --allow-superuser
|
||||
meteor npm install --allow-superuser --save babel-runtime
|
||||
meteor build .build --directory --allow-superuser
|
||||
cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
|
||||
#Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
|
||||
#https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac
|
||||
#https://github.com/wekan/wekan/commit/7eeabf14be3c63fae2226e561ef8a0c1390c8d3c
|
||||
#cd .build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt
|
||||
#rm -rf node_modules/bcrypt
|
||||
#meteor npm install --save bcrypt
|
||||
# Change from npm-bcrypt directory back to .build/bundle/programs/server directory.
|
||||
#cd ../../../../
|
||||
# Change to directory .build/bundle/programs/server
|
||||
cd .build/bundle/programs/server
|
||||
npm install
|
||||
npm install --allow-superuser --save babel-runtime
|
||||
#meteor npm install --save bcrypt
|
||||
# Change back to Wekan source directory
|
||||
cd ../../../..
|
||||
cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/
|
||||
cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/
|
||||
rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/wekan
|
||||
rm -f $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
|
||||
rm -f $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/tar/lib/.mkdir.js.swp
|
||||
rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/node-pre-gyp/node_modules/tar/lib/.mkdir.js.swp
|
||||
rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/node-gyp/node_modules/tar/lib/.mkdir.js.swp
|
||||
# Meteor 1.8.x additional .swp remove
|
||||
rm -f $SNAPCRAFT_PART_INSTALL/programs/server/node_modules/node-pre-gyp/node_modules/tar/lib/.mkdir.js.swp
|
||||
|
||||
organize:
|
||||
README: README.wekan
|
||||
prime:
|
||||
- -lib/node_modules/node-pre-gyp/node_modules/tar/lib/.unpack.js.swp
|
||||
|
||||
helpers:
|
||||
source: snap-src
|
||||
plugin: dump
|
||||
|
||||
caddy:
|
||||
plugin: dump
|
||||
source: https://caddyserver.com/download/linux/amd64?license=personal&telemetry=off
|
||||
source-type: tar
|
||||
organize:
|
||||
caddy: bin/caddy
|
||||
CHANGES.txt: CADDY_CHANGES.txt
|
||||
EULA.txt: CADDY_EULA.txt
|
||||
LICENSES.txt: CADDY_LICENSES.txt
|
||||
README.txt: CADDY_README.txt
|
||||
stage:
|
||||
- -init
|
||||
Executable
+198
@@ -0,0 +1,198 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Note: If you use other locale than en_US.UTF-8 , you need to additionally install en_US.UTF-8"
|
||||
echo " with 'sudo dpkg-reconfigure locales' , so that MongoDB works correctly."
|
||||
echo " You can still use any other locale as your main locale."
|
||||
|
||||
#Below script installs newest node 8.x for Debian/Ubuntu/Mint.
|
||||
#NODE_VERSION=12.18.2
|
||||
#X64NODE="https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz"
|
||||
|
||||
function pause(){
|
||||
read -p "$*"
|
||||
}
|
||||
|
||||
function cprec(){
|
||||
if [[ -d "$1" ]]; then
|
||||
if [[ ! -d "$2" ]]; then
|
||||
sudo mkdir -p "$2"
|
||||
fi
|
||||
|
||||
for i in $(ls -A "$1"); do
|
||||
cprec "$1/$i" "$2/$i"
|
||||
done
|
||||
else
|
||||
sudo cp "$1" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
# sudo npm doesn't work right, so this is a workaround
|
||||
function npm_call(){
|
||||
TMPDIR="/tmp/tmp_npm_prefix"
|
||||
if [[ -d "$TMPDIR" ]]; then
|
||||
rm -rf $TMPDIR
|
||||
fi
|
||||
mkdir $TMPDIR
|
||||
NPM_PREFIX="$(npm config get prefix)"
|
||||
npm config set prefix $TMPDIR
|
||||
npm "$@"
|
||||
npm config set prefix "$NPM_PREFIX"
|
||||
|
||||
echo "Moving files to $NPM_PREFIX"
|
||||
for i in $(ls -A $TMPDIR); do
|
||||
cprec "$TMPDIR/$i" "$NPM_PREFIX/$i"
|
||||
done
|
||||
rm -rf $TMPDIR
|
||||
}
|
||||
|
||||
#function wekan_repo_check(){
|
||||
## UNCOMMENTING, IT'S NOT REQUIRED THAT /HOME/USERNAME IS /HOME/WEKAN
|
||||
# git_remotes="$(git remote show 2>/dev/null)"
|
||||
# res=""
|
||||
# for i in $git_remotes; do
|
||||
# res="$(git remote get-url $i | sed 's/.*wekan\/wekan.*/wekan\/wekan/')"
|
||||
# if [[ "$res" == "wekan/wekan" ]]; then
|
||||
# break
|
||||
# fi
|
||||
# done
|
||||
#
|
||||
# if [[ "$res" != "wekan/wekan" ]]; then
|
||||
# echo "$PWD is not a wekan repository"
|
||||
# exit;
|
||||
# fi
|
||||
#}
|
||||
|
||||
echo
|
||||
PS3='Please enter your choice: '
|
||||
options=("Install Wekan dependencies" "Build Wekan" "Run Meteor for dev on http://localhost:4000" "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000" "Run Meteor for dev on http://CUSTOM-IP-ADDRESS:PORT" "Quit")
|
||||
|
||||
select opt in "${options[@]}"
|
||||
do
|
||||
case $opt in
|
||||
"Install Wekan dependencies")
|
||||
|
||||
if [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
echo "Linux";
|
||||
# Debian, Ubuntu, Mint
|
||||
sudo apt-get install -y build-essential gcc g++ make git curl wget
|
||||
# npm nodejs
|
||||
#sudo npm -g install npm
|
||||
curl -0 -L https://npmjs.org/install.sh | sudo sh
|
||||
sudo chown -R $(id -u):$(id -g) $HOME/.npm
|
||||
sudo npm -g install n
|
||||
sudo n 12.18.2
|
||||
#curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
|
||||
#sudo apt-get install -y nodejs
|
||||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
echo "macOS";
|
||||
pause '1) Install XCode 2) Install Node 8.x from https://nodejs.org/en/ 3) Press [Enter] key to continue.'
|
||||
elif [[ "$OSTYPE" == "cygwin" ]]; then
|
||||
# POSIX compatibility layer and Linux environment emulation for Windows
|
||||
echo "TODO: Add Cygwin";
|
||||
exit;
|
||||
elif [[ "$OSTYPE" == "msys" ]]; then
|
||||
# Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
|
||||
echo "TODO: Add msys on Windows";
|
||||
exit;
|
||||
elif [[ "$OSTYPE" == "win32" ]]; then
|
||||
# I'm not sure this can happen.
|
||||
echo "TODO: Add Windows";
|
||||
exit;
|
||||
elif [[ "$OSTYPE" == "freebsd"* ]]; then
|
||||
echo "TODO: Add FreeBSD";
|
||||
exit;
|
||||
else
|
||||
echo "Unknown"
|
||||
echo ${OSTYPE}
|
||||
exit;
|
||||
fi
|
||||
|
||||
## Latest npm with Meteor 1.8.x
|
||||
npm_call -g install npm
|
||||
npm_call -g install node-gyp
|
||||
# Latest fibers for Meteor 1.8.x
|
||||
sudo mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp
|
||||
npm_call -g install fibers
|
||||
# Install Meteor, if it's not yet installed
|
||||
curl https://install.meteor.com | bash
|
||||
sudo chown -R $(id -u):$(id -g) $HOME/.npm $HOME/.meteor
|
||||
break
|
||||
;;
|
||||
|
||||
"Build Wekan")
|
||||
echo "Building Wekan."
|
||||
#wekan_repo_check
|
||||
# REPOS BELOW ARE INCLUDED TO WEKAN REPO
|
||||
#rm -rf packages/kadira-flow-router packages/meteor-useraccounts-core packages/meteor-accounts-cas packages/wekan-ldap packages/wekan-ldap packages/wekan-scrfollbar packages/meteor-accounts-oidc packages/markdown
|
||||
#mkdir packages
|
||||
#cd packages
|
||||
#git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
|
||||
#git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
|
||||
#git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-cas.git
|
||||
#git clone --depth 1 -b master https://github.com/wekan/wekan-ldap.git
|
||||
#git clone --depth 1 -b master https://github.com/wekan/wekan-scrollbar.git
|
||||
#git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-oidc.git
|
||||
#git clone --depth 1 -b master --recurse-submodules https://github.com/wekan/markdown.git
|
||||
#mv meteor-accounts-oidc/packages/switch_accounts-oidc wekan_accounts-oidc
|
||||
#mv meteor-accounts-oidc/packages/switch_oidc wekan_oidc
|
||||
#rm -rf meteor-accounts-oidc
|
||||
#if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# echo "sed at macOS";
|
||||
# sed -i '' 's/api\.versionsFrom/\/\/api.versionsFrom/' ~/repos/wekan/packages/meteor-useraccounts-core/package.js
|
||||
#else
|
||||
# echo "sed at ${OSTYPE}"
|
||||
# sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' ~/repos/wekan/packages/meteor-useraccounts-core/package.js
|
||||
#fi
|
||||
#cd ..
|
||||
sudo chown -R $(id -u):$(id -g) $HOME/.npm $HOME/.meteor
|
||||
rm -rf node_modules .meteor/local
|
||||
npm install
|
||||
rm -rf .build
|
||||
meteor build .build --directory
|
||||
cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf .build/bundle/programs/web.browser.legacy
|
||||
#Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
|
||||
#https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac
|
||||
#https://github.com/wekan/wekan/commit/7eeabf14be3c63fae2226e561ef8a0c1390c8d3c
|
||||
#cd ~/repos/wekan/.build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt
|
||||
#rm -rf node_modules/bcrypt
|
||||
#meteor npm install bcrypt
|
||||
cd .build/bundle/programs/server
|
||||
rm -rf node_modules
|
||||
npm install
|
||||
#meteor npm install bcrypt
|
||||
cd ../../../..
|
||||
echo Done.
|
||||
break
|
||||
;;
|
||||
|
||||
"Run Meteor for dev on http://localhost:4000")
|
||||
WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://localhost:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000
|
||||
break
|
||||
;;
|
||||
|
||||
"Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000")
|
||||
IPADDRESS=$(ip a | grep 'noprefixroute' | grep 'inet ' | cut -d: -f2 | awk '{ print $2}' | cut -d '/' -f 1)
|
||||
echo "Your IP address is $IPADDRESS"
|
||||
WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000
|
||||
break
|
||||
;;
|
||||
|
||||
"Run Meteor for dev on http://CUSTOM-IP-ADDRESS:PORT")
|
||||
ip address
|
||||
echo "From above list, what is your IP address?"
|
||||
read IPADDRESS
|
||||
echo "On what port you would like to run Wekan?"
|
||||
read PORT
|
||||
echo "ROOT_URL=http://$IPADDRESS:$PORT"
|
||||
WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:$PORT meteor run --exclude-archs web.browser.legacy,web.cordova --port $PORT
|
||||
break
|
||||
;;
|
||||
|
||||
"Quit")
|
||||
break
|
||||
;;
|
||||
*) echo invalid option;;
|
||||
esac
|
||||
done
|
||||
@@ -83,7 +83,7 @@ parts:
|
||||
wekan:
|
||||
source: .
|
||||
plugin: nodejs
|
||||
node-engine: 12.14.1
|
||||
node-engine: 12.18.3
|
||||
node-packages:
|
||||
- node-gyp
|
||||
- node-pre-gyp
|
||||
|
||||
+6
-7
@@ -6,7 +6,7 @@
|
||||
meteor-base@1.4.0
|
||||
|
||||
# Build system
|
||||
ecmascript@0.14.2
|
||||
ecmascript@0.14.3
|
||||
standard-minifier-css@1.6.0
|
||||
standard-minifier-js@2.6.0
|
||||
mquandalle:jade
|
||||
@@ -23,7 +23,7 @@ dburles:collection-helpers
|
||||
idmontie:migrations
|
||||
matb33:collection-hooks
|
||||
matteodem:easy-search
|
||||
mongo@1.9.0
|
||||
mongo@1.10.0
|
||||
mquandalle:collection-mutations
|
||||
|
||||
# Account system
|
||||
@@ -70,20 +70,18 @@ rajit:bootstrap3-datepicker
|
||||
shell-server@0.5.0
|
||||
simple:rest-accounts-password
|
||||
useraccounts:core
|
||||
email@1.2.3
|
||||
email@2.0.0
|
||||
horka:swipebox
|
||||
dynamic-import@0.5.1
|
||||
dynamic-import@0.5.2
|
||||
staringatlights:fast-render
|
||||
|
||||
accounts-password@1.6.0
|
||||
accounts-password@1.6.2
|
||||
cfs:gridfs
|
||||
rzymek:fullcalendar
|
||||
momentjs:moment@2.22.2
|
||||
browser-policy-framing@1.1.0
|
||||
mquandalle:moment
|
||||
msavin:usercache
|
||||
wekan-scrollbar
|
||||
mquandalle:perfect-scrollbar
|
||||
mdg:meteor-apm-agent@3.2.0-rc.0!
|
||||
# Keep stylus in 1.1.0, because building v2 takes extra 52 minutes.
|
||||
coagmano:stylus@1.1.0!
|
||||
@@ -98,3 +96,4 @@ percolate:synced-cron
|
||||
easylogic:summernote
|
||||
cfs:filesystem
|
||||
ostrio:cookies
|
||||
tmeasday:check-npm-versions
|
||||
+1
-1
@@ -1 +1 @@
|
||||
METEOR@1.10.1
|
||||
METEOR@1.11
|
||||
+19
-20
@@ -1,7 +1,7 @@
|
||||
3stack:presence@1.1.2
|
||||
accounts-base@1.6.0
|
||||
accounts-base@1.7.0
|
||||
accounts-oauth@1.2.0
|
||||
accounts-password@1.6.0
|
||||
accounts-password@1.6.2
|
||||
aldeed:collection2@2.10.0
|
||||
aldeed:collection2-core@1.2.0
|
||||
aldeed:schema-deny@1.1.0
|
||||
@@ -51,18 +51,18 @@ dburles:collection-helpers@1.1.0
|
||||
ddp@1.4.0
|
||||
ddp-client@2.3.3
|
||||
ddp-common@1.4.0
|
||||
ddp-rate-limiter@1.0.7
|
||||
ddp-server@2.3.1
|
||||
ddp-rate-limiter@1.0.9
|
||||
ddp-server@2.3.2
|
||||
deps@1.0.12
|
||||
diff-sequence@1.1.1
|
||||
dynamic-import@0.5.2
|
||||
easylogic:summernote@0.8.8
|
||||
ecmascript@0.14.3
|
||||
ecmascript-runtime@0.7.0
|
||||
ecmascript-runtime-client@0.10.0
|
||||
ecmascript-runtime-server@0.9.0
|
||||
ecmascript-runtime-client@0.11.0
|
||||
ecmascript-runtime-server@0.10.0
|
||||
ejson@1.1.1
|
||||
email@1.2.3
|
||||
email@2.0.0
|
||||
es5-shim@4.8.0
|
||||
fastclick@1.0.13
|
||||
fetch@0.1.1
|
||||
@@ -91,7 +91,7 @@ logging@1.1.20
|
||||
lucasantoniassi:accounts-lockout@1.0.0
|
||||
matb33:collection-hooks@0.9.1
|
||||
matteodem:easy-search@1.6.4
|
||||
mdg:meteor-apm-agent@3.2.5
|
||||
mdg:meteor-apm-agent@3.3.0
|
||||
mdg:validation-error@0.5.1
|
||||
meteor@1.9.3
|
||||
meteor-base@1.4.0
|
||||
@@ -101,16 +101,16 @@ meteorhacks:collection-utils@1.2.0
|
||||
meteorhacks:picker@1.0.3
|
||||
meteorhacks:subs-manager@1.6.4
|
||||
meteorspark:util@0.2.0
|
||||
minifier-css@1.5.0
|
||||
minifier-css@1.5.2
|
||||
minifier-js@2.6.0
|
||||
minifiers@1.1.8-faster-rebuild.0
|
||||
minimongo@1.5.0
|
||||
minimongo@1.6.0
|
||||
mobile-status-bar@1.1.0
|
||||
modern-browsers@0.1.5
|
||||
modules@0.15.0
|
||||
modules-runtime@0.12.0
|
||||
momentjs:moment@2.24.0
|
||||
mongo@1.9.1
|
||||
momentjs:moment@2.27.0
|
||||
mongo@1.10.0
|
||||
mongo-decimal@0.1.1
|
||||
mongo-dev-server@1.1.0
|
||||
mongo-id@1.0.7
|
||||
@@ -124,10 +124,9 @@ mquandalle:jquery-textcomplete@0.8.0_1
|
||||
mquandalle:jquery-ui-drag-drop-sort@0.2.0
|
||||
mquandalle:moment@1.0.1
|
||||
mquandalle:mousetrap-bindglobal@0.0.1
|
||||
mquandalle:perfect-scrollbar@0.6.5_2
|
||||
msavin:usercache@1.8.0
|
||||
npm-bcrypt@0.9.3
|
||||
npm-mongo@3.7.0
|
||||
npm-mongo@3.8.0
|
||||
oauth@1.3.0
|
||||
oauth2@1.3.0
|
||||
observe-sequence@1.0.16
|
||||
@@ -162,14 +161,14 @@ simple:json-routes@2.1.0
|
||||
simple:rest-accounts-password@1.1.2
|
||||
simple:rest-bearer-token-parser@1.0.1
|
||||
simple:rest-json-error-handler@1.0.1
|
||||
socket-stream-client@0.2.3
|
||||
socket-stream-client@0.3.1
|
||||
softwarerero:accounts-t9n@1.3.11
|
||||
spacebars@1.0.15
|
||||
spacebars-compiler@1.1.3
|
||||
srp@1.0.12
|
||||
srp@1.1.0
|
||||
standard-minifier-css@1.6.0
|
||||
standard-minifier-js@2.6.0
|
||||
staringatlights:fast-render@3.2.0
|
||||
staringatlights:fast-render@3.3.0
|
||||
staringatlights:inject-data@2.3.0
|
||||
tap:i18n@1.8.2
|
||||
templates:tabs@2.3.0
|
||||
@@ -177,11 +176,12 @@ templating@1.3.2
|
||||
templating-compiler@1.3.3
|
||||
templating-runtime@1.3.2
|
||||
templating-tools@1.1.2
|
||||
tmeasday:check-npm-versions@0.3.2
|
||||
tracker@1.2.0
|
||||
twbs:bootstrap@3.3.6
|
||||
ui@1.0.13
|
||||
underscore@1.0.10
|
||||
url@1.2.0
|
||||
url@1.3.1
|
||||
useraccounts:core@1.14.2
|
||||
useraccounts:flow-routing@1.14.2
|
||||
useraccounts:unstyled@1.14.2
|
||||
@@ -191,8 +191,7 @@ webapp-hashing@1.0.9
|
||||
wekan-accounts-cas@0.1.0
|
||||
wekan-accounts-oidc@1.0.10
|
||||
wekan-ldap@0.0.2
|
||||
wekan-markdown@1.0.7
|
||||
wekan-markdown@1.0.9
|
||||
wekan-oidc@1.0.12
|
||||
wekan-scrollbar@3.1.3
|
||||
yasaricli:slugify@0.0.7
|
||||
zimme:active-route@2.3.2
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
dist: eoan
|
||||
dist: focal
|
||||
sudo: required
|
||||
|
||||
env:
|
||||
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
|
||||
TRAVIS_NODE_VERSION: 12.16.2
|
||||
TRAVIS_NODE_VERSION: 12.18.3
|
||||
TRAVIS_NPM_VERSION: latest
|
||||
|
||||
before_install:
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ host = https://www.transifex.com
|
||||
# tap:i18n requires us to use `-` separator in the language identifiers whereas
|
||||
# Transifex uses a `_` separator, without an option to customize it on one side
|
||||
# or the other, so we need to do a Manual mapping.
|
||||
lang_map = bg_BG:bg, en_GB:en-GB, es_AR:es-AR, el_GR:el, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
|
||||
lang_map = bg_BG:bg, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_PE:es-PE, el_GR:el, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
|
||||
|
||||
[wekan.application]
|
||||
file_filter = i18n/<lang>.i18n.json
|
||||
|
||||
+616
@@ -1,3 +1,619 @@
|
||||
# v4.25 2020-08-31 Wekan release
|
||||
|
||||
This release adds the following docker-compose.yml changes:
|
||||
|
||||
- [Mongo 4.4 does not work. Mongo 4.2 and 3.x works](https://github.com/wekan/wekan/commit/5d2daa4a80c819f0610ff2f17589de1e1085836c).
|
||||
Thanks to GuidoDr for info. Related https://github.com/wekan/wekan/issues/3247
|
||||
|
||||
and adds the following Nextcloud documentation:
|
||||
|
||||
- [Improving documentation for Nextcloud integration](https://github.com/wekan/wekan/pull/3248).
|
||||
Thanks to relikd.
|
||||
|
||||
and removes the following code and allows double quotes in code:
|
||||
|
||||
- Removed custom scrollbar [1](https://github.com/wekan/wekan/pull/3246) and [2](https://github.com/wekan/wekan/commit/5870d38e8e63159ede8c18d1766a4f9f6ba8987c).
|
||||
Also in eslint settings allowed double quotes in code. Thanks to tborychowski and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.24 2020-08-27 Wekan release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Upgrade to Meteor 1.11](https://github.com/wekan/wekan/commit/4d49265b25595444553e1c2d6e48c7a699949654).
|
||||
Thanks to Meteor developers.
|
||||
- [Update bcrypt](https://github.com/wekan/wekan/commit/dee7020a5aaa90c8580ef42fa73aff0ca4ae3e12).
|
||||
Thanks to bcrypt developers.
|
||||
- [Update dependencies](https://github.com/wekan/wekan/commit/60b2787c559b9966d6040a622c5b971fa95241c3).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and adds the following translations:
|
||||
|
||||
- [Add Trigger and Action header words to Rule Details](https://github.com/wekan/wekan/pull/3244).
|
||||
Thanks to helioguardabaxo.
|
||||
- [Add Spanish (Peru) (es_PE)](https://github.com/wekan/wekan/commit/b9f87bf310b4f071c8219bb7511b15a7fa27340d).
|
||||
Thanks to translators.
|
||||
|
||||
and adds the following mouse scroll settings:
|
||||
|
||||
- [Add setting for mouse scroll deltafactor. Fix snap setting for mouse scroll amount](https://github.com/wekan/wekan/commit/7e4b791c2964f4b130abbaee62ffdff1536450c4).
|
||||
Thanks to danger89 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.23 2020-08-13 Wekan release
|
||||
|
||||
This release fixes following CRITICAL VULNERABILITIES:
|
||||
|
||||
- [Update vulnerable dependency elliptic that is dependency of meteor-node-stubs that is dependency of
|
||||
Wekan](https://github.com/wekan/wekan/commit/910f0cecbe7a4b3fdff603e5e74c2cb1c40b660b).
|
||||
Thanks to filipenevola, neeldug, L25inux and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.22 2020-07-23 Wekan release
|
||||
|
||||
This release adds back these features:
|
||||
|
||||
- [Export to JSON and HTML .zip file](https://github.com/commit/1624fc82f7c319e84a78f29445c7867f7da15c32)
|
||||
that also fixes #3216 Clone Boards not working.
|
||||
Thanks to xet7.
|
||||
|
||||
and hides these features temporarily:
|
||||
|
||||
- [Hide CSV export until it's fixed in EdgeHTML compatible way](https://github.com/wekan/wekan/commit/045b8a84a29dde09201dd5108c757719d00e6f55).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Node 12.18.3](https://github.com/wekan/wekan/commit/6f503ca818abff17a20b6612aeea1f9e2c4a8234).
|
||||
Thanks to Node developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Snap](https://github.com/wekan/wekan/commit/68391a943bd37d9f98819ffb7b7a29692d0bd380).
|
||||
This fix was already included to Wekan v4.21 to get it released.
|
||||
TODO: Sometime migrate from Caddy v1 to Caddy v2.
|
||||
Thanks to xet7.
|
||||
- [Fix detecting current IP address on rebuild-wekan.sh](https://github.com/wekan/wekan/commit/ec1d8f275ff4cd720a8cd3bc918b32f9c5f5d099).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.21 2020-07-21 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [REST API: Changed edit_card and get_card_by_customfields to return full documents](https://github.com/wekan/wekan/pull/3215).
|
||||
Thanks to gvespignani70.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.20 2020-07-20 Wekan release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- Update dependencies [Part1](https://github.com/wekan/wekan/commit/419615bed43b6e9de4030193c47137a066b85bde) and
|
||||
[Part2](https://github.com/wekan/wekan/commit/116372e11e09ce9b8376a8694553add595e02815).
|
||||
Thanks to developers of dependencies and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Change slug on card rename](https://github.com/wekan/wekan/pull/3214).
|
||||
Thanks to NicoP-S.
|
||||
- [Add missing Wekan logo sizes for PWAs and Apps](https://github.com/wekan/wekan/commit/de28bf8569a7373a5d6fd60a4f413e76673adc26).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.19 2020-07-18 Wekan release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [Add support for EdgeHTML browser (Microsoft Legacy Edge, not based on Chromium) by removing incompatible csv-stringify package.
|
||||
CSV export will be fixed later](https://github.com/wekan/wekan/commit/b9a4b0b51d3692fcbb715b1afc875f21cd204ae5).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Update dependencies [Part1](https://github.com/wekan/wekan/commit/23ee93ca3d4ea161a93627a8e28e1ce93eea1bab),
|
||||
[Part2](https://github.com/wekan/wekan/commit/6646d48ccbaf04c4935de35fe037eff3bd7fd469),
|
||||
[Part3](https://github.com/wekan/wekan/commit/87cb4598f745a362aaac06b8b457198c40aaf61e),
|
||||
[Part4](https://github.com/wekan/wekan/commit/f57ed2990f5c6e1af10d270b24c7092805711afe).
|
||||
Thanks to developers of dependencies and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Checklist Item PUT API: boolean cast on isFinished](https://github.com/wekan/wekan/pull/3211).
|
||||
Thanks to Robert-Lebedeu.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.18 2020-07-10 Wekan release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Upgrade to Node 12.18.2](https://github.com/wekan/wekan/commit/6e4407ed9cb3c95a99e0dbbb4383324dd57d6be1).
|
||||
Thanks to Node developers and xet7.
|
||||
- [Update dependencies](https://github.com/wekan/wekan/commit/05cd1247ab935f586d747743bb9cd79d23e0b1e6).
|
||||
Thanks to dependency developers and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [All logged in users are now allowed to reorder boards by dragging at All Boards page and Public Boards page](https://github.com/wekan/wekan/commit/ba24c4e40c728d030504ed21ccf79247d0449e1b).
|
||||
Thanks to xet7.
|
||||
- [Fix running meteor for dev in rebuild-wekan.sh](https://github.com/wekan/wekan/commit/a77cf56fbdaf0b74d8b97aa41b0a88fee85e3ee1).
|
||||
Thanks to xet7.
|
||||
- [Fix start-wekan.bat](https://github.com/wekan/wekan/commit/0be1c00fccef8797a1b3612593a6623a9b465e0d) and
|
||||
[Windows bundle install](https://github.com/wekan/wekan/wiki/Windows#a-bundle-with-windows-nodemongodb).
|
||||
Thanks to xet7.
|
||||
- [Fix typo](https://github.com/wekan/wekan/pull/3197).
|
||||
Thanks to Lua00808.
|
||||
- [Fix creating user misbehaving in some special case](https://github.com/wekan/wekan/pull/3206).
|
||||
Thanks to salleman33.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.17 2020-06-18 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Revert finding correct user changes that were made at Wekan v4.16](https://github.com/wekan/wekan/commit/5eb378452761ad1d6d67a491316007fdf6dfd689).
|
||||
Thanks to xet7.
|
||||
- [Fix activities view on mobile devices](https://github.com/wekan/wekan/pull/3183).
|
||||
Thanks to marc1006.
|
||||
- [Add back checks about can user export CSV/TSV](https://github.com/wekan/wekan/commit/afe00d02cddf016a3ccc1ed9a98a7f10d3339f26).
|
||||
Thanks to marc1006 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.16 2020-06-17 Wekan release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [Add find-replace.sh script for development](https://github.com/wekan/wekan/commit/bda49ed60947e0438206b2f55119f5c5c132c734).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Node 12.18.1](https://github.com/wekan/wekan/commit/b11ae567c9b2d16a115ea4f3f7f88e67d076f326).
|
||||
Thanks to Node developers and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [OpenAPI: Fix jsdoc/operation matching](https://github.com/wekan/wekan/pull/3171).
|
||||
Thanks to bentiss.
|
||||
- Fix finding corrent user [Part1](https://github.com/wekan/wekan/pull/3180) and
|
||||
[Part2](https://github.com/wekan/wekan/commit/f245b6b7faa29b4f276527daca48c305fe9689c1).
|
||||
Thanks to salleman33 and xet7.
|
||||
- [Try to prevent errors on CSV/TSV export](https://github.com/wekan/wekan/commit/b00db983c8506e0cdc9968e452c3c8025fc10776).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.15 2020-06-16 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- Fix lint errors [Part1](https://github.com/wekan/wekan/commit/f1587753cb0bba38e4b1df2e0300d3dc2826da72) and
|
||||
[Part2](https://github.com/wekan/wekan/commit/e6629779f77676eadfe4465c407f0bee0ec64061).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.14 2020-06-16 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add user option to hide finished checklist items. Strikethrough checked items](https://github.com/wekan/wekan/pull/3167).
|
||||
Thanks to marc1006.
|
||||
- [Added the possibility to start a vote via API edit_card. And added some better visibility to see what was voted](https://github.com/wekan/wekan/pull/3170).
|
||||
Thanks to NicoP-S.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Update dependencies](https://github.com/wekan/wekan/commit/8f34cdc279602e97085e0a504f7716495349f83c).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix infinite scrolling for activities](https://github.com/wekan/wekan/pull/3168).
|
||||
Thanks to marc1006.
|
||||
- [Remove top and bottom margin for hidden checklist items](https://github.com/wekan/wekan/pull/3172).
|
||||
Thanks to marc1006.
|
||||
- [Alignment and spacing of minicard labels](https://github.com/wekan/wekan/pull/3174).
|
||||
Thanks to hgustafsson.
|
||||
- [Fix: Unable to delete a custom field in a board](https://github.com/wekan/wekan/commit/3b2b1087447bc8613baa8254bfec55e3d485bdc4).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.13 2020-06-09 Wekan release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [OpenShift template updates](https://github.com/wekan/wekan/pull/3158), Thanks to jimmyjones2:
|
||||
1) Remove status fields (this is created by Kubernetes at run time)
|
||||
2) The latest MongoDB by default available with OpenShift is 3.6
|
||||
3) Change MongoDB service name to contain wekan to avoid potentially conflicting with other mongodb instances in the same project.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Copy the labels only if the target board is different](https://github.com/wekan/wekan/pull/3154).
|
||||
Thanks to marc1006.
|
||||
- [Fix condition whether a card is in list](https://github.com/wekan/wekan/pull/3165).
|
||||
Thanks to marc1006.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.12 2020-06-08 Wekan release
|
||||
|
||||
This release fixes the following CRITICAL SECURITY VULNERABILITIES:
|
||||
|
||||
- Fix XSS bug reported 2020-05-24 by [swsjona](https://twitter.com/swsjona):
|
||||
[Part 1](https://github.com/wekan/wekan/commit/1f85b25549b50602380f1745f19e5fe44fe36d6f),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/fb44df981581354bf23a6928427ad2bf73c4550f),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/99f68f36b028d6c75acf2e5b83585b1acee65f97),
|
||||
[Part 4](https://github.com/wekan/wekan/commit/8a622ec7c3043bf8f34399ef34563e6a9a19dcd8).
|
||||
Logged in users could run javascript in input fields. This was partially fixed at v3.85,
|
||||
but at some fields XSS was still possible. This affects at least Wekan versions v3.12-v4.12.
|
||||
After this fix, Javascript in input fields is not executed.
|
||||
Thanks to swsjona, marc1006 and xet7.
|
||||
|
||||
and adds the following new features:
|
||||
|
||||
- Change default view to Swimlanes:
|
||||
[Part 1](https://github.com/wekan/wekan/commit/8c3322f9a93c321e8a2cc5cfcd4b1d6316a5fb7c),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/61e682470cdaef42cce2d74b41fb752cfc61848b),
|
||||
[Part 3 Change dropdown order to Swimlanes/Lists/Calendar](https://github.com/wekan/wekan/commit/7f6d500cbec15496ae357b05b9df3f10e51ed1f1),
|
||||
[Part 4.1. Public board default view to Swimlane. Part 4.2. When changing Public board
|
||||
view (sets view cookie), also reload page so view is changed
|
||||
immediately](https://github.com/wekan/wekan/commit/39519d1cc944c567837be0f88ab4a037e2144c61).
|
||||
Thanks to xet7.
|
||||
- [Use markdown in Swimlane titles](https://github.com/wekan/wekan/commit/6b22f96313354b45b851b93c25aa392bbe346bdb).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Update minifier-css](https://github.com/wekan/wekan/commit/cb1e91fee83eaad1e926c288c0abfc1e4f2a8bd4).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- Fix indent [Part1](https://github.com/wekan/wekan/commit/415e94d187ffcb9a4afaecc5c6960a50a87ca7eb),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/96494bacf550cde65598e6d59199517f311aa33d).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.11 2020-06-04 Wekan release
|
||||
|
||||
This release adds the following new platforms:
|
||||
|
||||
- [Using arm64 bundle on Raspberry Pi OS arm64 with MongoDB 4.2.x for RasPi3 and
|
||||
RasPi4](https://github.com/wekan/wekan/wiki/Raspberry-Pi#raspberry-pi-os-arm64-with-mongodb-42x).
|
||||
Thanks to Raspberry Pi OS devs, MongoDB devs and xet7.
|
||||
- [s390x RHEL 8](https://github.com/wekan/wekan/wiki/s390x#rhel-8).
|
||||
Thanks to IBM, Red Hat Linux, Linux Foundation and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Node v12.18.0](https://github.com/wekan/wekan/commit/d9d451a206cabe7f6ca8ad5d35eb76443198e4c1).
|
||||
Thanks to Node developers and xet7.
|
||||
- [Update `markedjs` package](https://github.com/wekan/wekan/pull/3149).
|
||||
Thanks to marc1006.
|
||||
- [Add fibers](https://github.com/wekan/wekan/commit/cd49018306f826fff37b7024dfde9de05d88b620).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following new features:
|
||||
|
||||
- [Add Calendar Month Event List view](https://github.com/wekan/wekan/commit/f73ea218eefba3f0d6c642849dfede9e03052d25).
|
||||
Thanks to xet7.
|
||||
- [Added dates & assignees to REST API calls](https://github.com/wekan/wekan/pull/3146).
|
||||
Thanks to GitGramm.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.10 2020-05-30 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added an API to get the cards for a specific custom field value](https://github.com/wekan/wekan/pulls/3131).
|
||||
Thanks to gvespignani70.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Node v12.17.0](https://github.com/wekan/wekan/commit/3ade9d95a69b269c345127e1755e1b539dc07263).
|
||||
Thanks to Node developers and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix email verification in `sendSMTPTestEmail`](https://github.com/wekan/wekan/pull/3135).
|
||||
Thanks to marc1006.
|
||||
- [Try to Fix Registration broken "Templates board id is required" with ugly hack. If it works, ugly becomes
|
||||
beautiful](https://github.com/wekan/wekan/pull/3140).
|
||||
Thanks to marc1006.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.09 2020-05-27 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix vote export & export/import currency custom field to CSV/TSV](https://github.com/wekan/wekan/pull/3128).
|
||||
Thanks to brymut.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.08 2020-05-26 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add the 'Currency' Custom Field type](https://github.com/wekan/wekan/pull/3123).
|
||||
Thanks to habenamare.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Add some changes to Modern theme](https://github.com/wekan/wekan/commit/6a1bc167cf10e75d61b3196db9eac2978d70ad8e).
|
||||
Thanks to jeroenstoker and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix typo that caused parse error](https://github.com/wekan/wekan/commit/351d9d0c9577c9d543d543bc12a51388b0141324).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.07 2020-05-26 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix move selection](https://github.com/wekan/wekan/pull/3120).
|
||||
Thanks to marc1006.
|
||||
- [Fix Python API generation](https://github.com/wekan/wekan/pull/3121).
|
||||
Thanks to marc1006.
|
||||
- [Fix default value of `sort`](https://github.com/wekan/wekan/pull/3122).
|
||||
Thanks to marc1006.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.06 2020-05-25 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix Card export CSV, check for vote
|
||||
undefined](https://github.com/wekan/wekan/commit/8eafa1ac66fdcf5fb5f0a95aa6cfee454ddad67f).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.05 2020-05-25 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Import/Export Custom Fields in CSV/TSV](https://github.com/wekan/wekan/pull/3115).
|
||||
Thanks to brymut.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Update packages](https://github.com/wekan/wekan/commit/3b44acd87c35340bf9fe5d210f4402f1b1a1dfdf).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- Try to fix Snap [1](https://github.com/wekan/wekan/commit/6fad68b9b9afd8de7074037d73eeac40f6a3f7c1), [2](https://github.com/wekan/wekan/commit/b737adfcdfc9b8084a7eb84420a89c014bbec1fb). Later reverted those like other ostrio-files changes too.
|
||||
Thanks to xet7.
|
||||
- [Add default attachments store path /var/snap/wekan/common/uploads where attachments will be
|
||||
stored](https://github.com/wekan/wekan/commit/c61a126c8bcb25a1eda0203b89c990ae31de7a70).
|
||||
Thanks to xet7.
|
||||
- [Make scrollParentContainer() more robust as it's used in a timeout callback. Example exception: Exception in setTimeout callback: TypeError: Cannot read property 'parentComponent' of null. Probably there is a better fix for this](https://github.com/wekan/wekan/commit/d5fbd50b760b1d3b84b5b4e8af3a8ed7608e2918).
|
||||
Thanks to marc1006.
|
||||
- [Fix error link not available. Fixes: Exception in template helper: TypeError: Cannot read property 'link' of
|
||||
undefined](https://github.com/wekan/wekan/commit/b7105d7b5712dcdbf9dadebfddaba7691810da5c).
|
||||
Thanks to marc1006.
|
||||
- [Fix minicard cover functionality. Otherwise, if `this.coverId` is undefined then `Attachments.findOne()` would return any
|
||||
attachment](https://github.com/wekan/wekan/commit/66d35a15280795b76a81c3e59cebbd2a29e4dff8).
|
||||
Thanks to marc1006.
|
||||
- [Some fixes suggested by deepcode.ai](https://github.com/wekan/wekan/pull/3112).
|
||||
Thanks to marc1006.
|
||||
- [Sorry marc1006, I had to revert deepcode.ai arrow function fixes because Python API docs generator does not work all when code has arrow functions](https://github.com/wekan/wekan/commit/f9018fc3a87080d8d97c371e29a8f3f0a20ca932).
|
||||
Thanks to xet7.
|
||||
- [Move In Progress ostrio-files changes to separate branch, and revert ostrio-files changes, so that:
|
||||
Export to CSV/TSV with custom fields works, Attachments are not exported to disk,
|
||||
It is possible to build arm64/s390x versions
|
||||
again](https://github.com/wekan/wekan/commit/d52affe65893f17bab59bb43aa9f5afbb54993d3).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.04 2020-05-24 Wekan release
|
||||
|
||||
Please use v4.05 or newer instead, that works better.
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [Found Time Tracking GPLv3 software "Titra" with integration to Wekan](https://github.com/wekan/wekan/wiki/Time-Tracking).
|
||||
Thanks to willhseitz.
|
||||
- [Theme: Natural](https://github.com/wekan/wekan/pull/3098).
|
||||
You can select it from Board Settings / Change color / natural.
|
||||
Thanks to compumatter and helioguardabaxo.
|
||||
- [Theme: Modern](https://github.com/wekan/wekan/pull/3106).
|
||||
Thanks to jeroenstoker com and helioguardabaxo.
|
||||
- [Export board to HTML static page .zip archive](https://github.com/wekan/wekan/pull/3043).
|
||||
Thanks to Lewiscowles1986.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Change the swimlaneid of a card only if a new target swimlaneid is selected](https://github.com/wekan/wekan/pull/3108).
|
||||
Thanks to marc1006.
|
||||
- [Set '*' as default value for swimlane and list name in card move action](https://github.com/wekan/wekan/pull/3109).
|
||||
Thanks to hickorysb and marc1006.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.03 2020-05-16 Wekan release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [Theme: Clearblue](https://github.com/wekan/wekan/pull/3093).
|
||||
You can select it from Board Settings / Change color / clearblue.
|
||||
Thanks to CidKramer.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Can't Scroll on All Boards on mobile phone. Added drag handles](https://github.com/wekan/wekan/issues/3096).
|
||||
Thanks to xet7.
|
||||
- [Try to fix Sandstorm Wekan Export menu](https://github.com/wekan/wekan/commit/1ac11d92ba8f38981c87db25e5b5e1fa2adb6968).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.02 2020-05-15 Wekan release
|
||||
|
||||
This release adds the following server platforms:
|
||||
|
||||
- [Android arm64/x64](https://github.com/wekan/wekan/wiki/Android).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following features:
|
||||
|
||||
- [Install Wekan to mobile homescreen icon and use fullscreen
|
||||
PWA](https://github.com/wekan/wekan/commit/8d5adc04645e3e71423f16869f39b8d79969bccd).
|
||||
[Docs for iOS and Android at wiki PWA page](https://github.com/wekan/wekan/wiki/PWA).
|
||||
Thanks to xet7.
|
||||
- [Add options to rebuild-wekan.sh to run Meteor in development mode where after
|
||||
file change it rebuilds](https://github.com/wekan/wekan/commit/5f915ef966170ea7baca7ddeb11319bc08a26fef).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Update dependencies](https://github.com/wekan/wekan/commit/75bdd33fda58ea0233f5b38c466bcb1a9b0406ab).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following translations:
|
||||
|
||||
- [Add Spanish (Chile)](https://github.com/wekan/wekan/commit/96507e6777ed77a324eaec9799c5b46b0d25ad26).
|
||||
Thanks to isos, Transifex user.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Deleting linked card makes board not load](https://github.com/wekan/wekan/issues/2785).
|
||||
Thanks to marc1006 and xet7.
|
||||
- [Fix getStartDayOfWeek once again](https://github.com/wekan/wekan/pull/3061).
|
||||
Thanks to marc1006.
|
||||
- [Fix shortcuts list and support card shortcuts when hovering
|
||||
a card](https://github.com/wekan/wekan/pull/3066).
|
||||
Thanks to marc1006.
|
||||
- [Add white-space:normal to copy-to-clipboard button in card
|
||||
details](https://github.com/wekan/wekan/pull/3075).
|
||||
Thanks to helioguardabaxo.
|
||||
- [Fix avatar-image class](https://github.com/wekan/wekan/pull/3083).
|
||||
Thanks to krupupakku.
|
||||
- [Fix Swimlanes ID missing in new boards](https://github.com/wekan/wekan/pull/3088).
|
||||
Thanks to krupupakku.
|
||||
- [Fix REST API so Create card does now allow an empty member
|
||||
list](https://github.com/wekan/wekan/pull/3084).
|
||||
Thanks to wackazong.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.01 2020-04-28 Wekan release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Upgrade to Node v12.16.3](https://github.com/wekan/wekan/commit/1d89e96dd101c11913f1acdd6d16b5650eaf18a7).
|
||||
Thanks to Node developers and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Docker builds](https://github.com/wekan/wekan/commit/280e66947e3afa878c41e876cf827ebcec81a2c6).
|
||||
Thanks to xet7.
|
||||
- [Fix Cards and Users API docs at https://wekan.github.io/api/ not generated because of
|
||||
syntax error and new Javascript syntax](https://github.com/wekan/wekan/commit/9ae20a3f51e63c29f536e2f5b3e66a2c7d88c691).
|
||||
Wekan uses wekan/releases/generate-docs*.sh Python code to generate OpenAPI docs,
|
||||
it did not show any errors while generating docs, only left out parts of API docs.
|
||||
This affected Wekan versions v3.94-v4.00.
|
||||
Thanks to pvcon13 and xet7.
|
||||
- [Fix list header height when cards count is shown](https://github.com/wekan/wekan/pull/3056).
|
||||
Thanks to marc1006.
|
||||
- [Smaller height for Add Board button](https://github.com/wekan/wekan/commit/6afc9259f084717a0cc3ce6d66979fd7c1471939).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.00 2020-04-27 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Make sure that the board header buttons fit into one line even for devices with 360px width
|
||||
resolution](https://github.com/wekan/wekan/pull/3052).
|
||||
Thanks to marc1006.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.99 2020-04-27 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix Boards are very hard to tap in mobile](https://github.com/wekan/wekan/pull/3051).
|
||||
Thanks to marc1006.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.98 2020-04-25 Wekan release
|
||||
|
||||
News:
|
||||
|
||||
- There is now many mobile and desktop webbrowser fixes. Please test does your
|
||||
favourite Javascript enabled webbrowser work, and add issues if something
|
||||
does not work, and there is no existing issue about that yet.
|
||||
- Desktop browser mode has setting for Show/Hide drag handles:
|
||||
top right click username / Change Settings / Show desktop drag handles.
|
||||
You can request desktop website also at mobile webbrowsers on Android.
|
||||
At iOS requesting desktop website did not seem to work yet.
|
||||
- At iOS Safari and Chrome, to see swimlane buttons you need to scroll to right.
|
||||
Fixes to this and other issues are welcome as pull request.
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Pre-fill the title of checklists (Trello-style)](https://github.com/wekan/wekan/pull/3030).
|
||||
Thanks to boeserwolf.
|
||||
- [Implement option to change the first day of the week in user settings](https://github.com/wekan/wekan/pull/3032).
|
||||
Thanks to marc1006.
|
||||
- [Add babel to build chain and linter. Enables fancy Javascript language
|
||||
features like optional chaining, for developer happiness](https://github.com/wekan/wekan/pull/3034).
|
||||
Thanks to boeserwolf.
|
||||
- [Use only one 'Apply' button for applying the user settings](https://github.com/wekan/wekan/pull/3039).
|
||||
Thanks to marc1006.
|
||||
- [Allow variable height for board list items. Allow words in title/description to be able to break
|
||||
and wrap onto the next line](https://github.com/wekan/wekan/pull/3046).
|
||||
Thanks to marc1006.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Meteor 1.10.2](https://github.com/wekan/wekan/commit/d1f98d0c472fb41e25fb29a9a6f6dae7db003f6f).
|
||||
Thanks to Meteor developers and xet7.
|
||||
- [Set Snap MongoDB compatibility to 4.2 according to Meteor ChangeLog](https://github.com/wekan/wekan/commit/7de18eccea3854db3be6197bf21afbfd3ddb65a6).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Multiple lint issue fixes](https://github.com/wekan/wekan/pull/3031).
|
||||
Thanks to marc1006.
|
||||
- [Fix lint errors in lint error fix](https://github.com/wekan/wekan/commit/9e95c06415e614e587d684ff9660cc53c5f8c8d3).
|
||||
Thanks to xet7.
|
||||
- [Fix getStartDayOfWeek function](https://github.com/wekan/wekan/pull/3038).
|
||||
Thanks to marc1006 and boeserwolf.
|
||||
- Improve mobile devices support [Part1](https://github.com/wekan/wekan/pull/3040) and [Part2](https://github.com/wekan/wekan/pull/3045).
|
||||
Thanks to marc1006.
|
||||
- [Fix Wekan not load at all in Firefox v.68 for Android](https://github.com/wekan/wekan/commit/1235363465b824d26129d4aa74a4445f362c1a73).
|
||||
Thanks to xet7.
|
||||
- [Fix comment typo in docker-compose.yml](https://github.com/wekan/wekan/pull/3044).
|
||||
Thanks to VictorioBerra.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.97 2020-04-19 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
+7
-2
@@ -4,10 +4,12 @@ LABEL maintainer="wekan"
|
||||
# Set the environment variables (defaults where required)
|
||||
# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
# ENV BUILD_DEPS="paxctl"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v12.16.2 \
|
||||
METEOR_RELEASE=1.10-rc.2 \
|
||||
NODE_VERSION=v12.18.3 \
|
||||
METEOR_RELEASE=1.10.2 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=latest \
|
||||
@@ -114,6 +116,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
DEFAULT_AUTHENTICATION_METHOD="" \
|
||||
SCROLLINERTIA="0" \
|
||||
SCROLLAMOUNT="auto" \
|
||||
SCROLLDELTAFACTOR="auto" \
|
||||
PASSWORD_LOGIN_ENABLED=true
|
||||
|
||||
# Copy the app to the image
|
||||
@@ -271,6 +274,8 @@ RUN \
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
gosu wekan:wekan npm install && \
|
||||
#gosu wekan:wekan npm install bcrypt && \
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy && \
|
||||
mv /home/wekan/app_build/bundle /build && \
|
||||
\
|
||||
# Put back the original tar
|
||||
|
||||
+8
-8
@@ -4,11 +4,11 @@ FROM amd64/alpine:3.7 AS builder
|
||||
ENV QEMU_VERSION=v4.2.0-6 \
|
||||
QEMU_ARCHITECTURE=aarch64 \
|
||||
NODE_ARCHITECTURE=linux-arm64 \
|
||||
NODE_VERSION=v12.16.1 \
|
||||
NODE_VERSION=v12.18.3 \
|
||||
WEKAN_VERSION=3.96 \
|
||||
WEKAN_ARCHITECTURE=arm64
|
||||
|
||||
# Install dependencies
|
||||
|
||||
# Install dependencies
|
||||
RUN apk update && apk add ca-certificates outils-sha1 && \
|
||||
\
|
||||
# Download qemu static for our architecture
|
||||
@@ -18,7 +18,7 @@ RUN apk update && apk add ca-certificates outils-sha1 && \
|
||||
wget https://releases.wekan.team/raspi3/wekan-${WEKAN_VERSION}-${WEKAN_ARCHITECTURE}.zip && \
|
||||
wget https://releases.wekan.team/raspi3/SHA256SUMS.txt && \
|
||||
# Verify wekan
|
||||
grep wekan-${WEKAN_VERSION}-${WEKAN_ARCHITECTURE}.zip SHA256SUMS.txt | sha256sum -c - && \
|
||||
grep wekan-${WEKAN_VERSION}-${WEKAN_ARCHITECTURE}.zip SHA256SUMS.txt | sha256sum -c - && \
|
||||
\
|
||||
# Unzip wekan
|
||||
unzip wekan-${WEKAN_VERSION}-${WEKAN_ARCHITECTURE}.zip && \
|
||||
@@ -33,20 +33,20 @@ RUN apk update && apk add ca-certificates outils-sha1 && \
|
||||
# Extract node and remove tar.gz
|
||||
tar xvzf node-${NODE_VERSION}-${NODE_ARCHITECTURE}.tar.gz
|
||||
|
||||
# Build wekan dockerfile
|
||||
# Build wekan dockerfile
|
||||
FROM arm64v8/ubuntu:19.10
|
||||
LABEL maintainer="wekan"
|
||||
|
||||
# Set the environment variables (defaults where required)
|
||||
ENV QEMU_ARCHITECTURE=aarch64 \
|
||||
NODE_ARCHITECTURE=linux-arm64 \
|
||||
NODE_VERSION=v12.16.1 \
|
||||
NODE_VERSION=v12.18.3 \
|
||||
NODE_ENV=production \
|
||||
NPM_VERSION=latest \
|
||||
WITH_API=true \
|
||||
PORT=8080 \
|
||||
ROOT_URL=http://localhost \
|
||||
MONGO_URL=mongodb://127.0.0.1:27017/wekan
|
||||
MONGO_URL=mongodb://127.0.0.1:27017/wekan
|
||||
|
||||
# Copy qemu-static to image
|
||||
COPY --from=builder qemu-${QEMU_ARCHITECTURE}-static /usr/bin
|
||||
@@ -55,7 +55,7 @@ COPY --from=builder qemu-${QEMU_ARCHITECTURE}-static /usr/bin
|
||||
COPY --from=builder bundle /home/wekan/bundle
|
||||
|
||||
# Copy
|
||||
COPY --from=builder node-${NODE_VERSION}-${NODE_ARCHITECTURE} /opt/nodejs
|
||||
COPY --from=builder node-${NODE_VERSION}-${NODE_ARCHITECTURE} /opt/nodejs
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
|
||||
@@ -34,7 +34,7 @@ and PWA app that can be added as icon on Android and bookmark on iOS, used like
|
||||
|
||||
**NOTE**:
|
||||
- Please read the [FAQ](https://github.com/wekan/wekan/wiki/FAQ) first
|
||||
- Please don't feed the trolls and spammers that are mentioned in the FAQ :)
|
||||
- Please don't feed the [trolls](https://github.com/wekan/wekan/wiki/FAQ#why-am-i-called-a-troll) and [spammers](https://github.com/wekan/wekan/wiki/FAQ#why-am-i-called-a-spammer) that are mentioned in the FAQ :)
|
||||
|
||||
## About Wekan
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v3.97.0"
|
||||
appVersion: "v4.25.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
// PWA
|
||||
if ('serviceWorker' in navigator) {
|
||||
window.addEventListener('load', function() {
|
||||
navigator.serviceWorker.register('/pwa-service-worker.js');
|
||||
});
|
||||
}
|
||||
@@ -34,38 +34,38 @@ template(name="activity")
|
||||
//- board activity ------------------------------------------------------
|
||||
if($eq mode 'board')
|
||||
if($eq activity.activityType 'createBoard')
|
||||
| {{_ 'activity-created' boardLabel}}.
|
||||
| {{{_ 'activity-created' boardLabelLink}}}.
|
||||
|
||||
if($eq activity.activityType 'importBoard')
|
||||
| {{{_ 'activity-imported-board' boardLabel sourceLink}}}.
|
||||
| {{{_ 'activity-imported-board' boardLabelLink sourceLink}}}.
|
||||
|
||||
if($eq activity.activityType 'addBoardMember')
|
||||
| {{{_ 'activity-added' memberLink boardLabel}}}.
|
||||
| {{{_ 'activity-added' memberLink boardLabelLink}}}.
|
||||
|
||||
if($eq activity.activityType 'removeBoardMember')
|
||||
| {{{_ 'activity-excluded' memberLink boardLabel}}}.
|
||||
| {{{_ 'activity-excluded' memberLink boardLabelLink}}}.
|
||||
|
||||
//- card activity -------------------------------------------------------
|
||||
if($eq activity.activityType 'createCard')
|
||||
if($eq mode 'card')
|
||||
| {{{_ 'activity-added' cardLabel activity.listName}}}.
|
||||
| {{{_ 'activity-added' cardLabelLink (sanitize activity.listName)}}}.
|
||||
else
|
||||
| {{{_ 'activity-added' cardLabel boardLabel}}}.
|
||||
| {{{_ 'activity-added' cardLabelLink boardLabelLink}}}.
|
||||
|
||||
if($eq activity.activityType 'importCard')
|
||||
| {{{_ 'activity-imported' cardLink boardLabel sourceLink}}}.
|
||||
| {{{_ 'activity-imported' cardLink boardLabelLink sourceLink}}}.
|
||||
|
||||
if($eq activity.activityType 'moveCard')
|
||||
| {{{_ 'activity-moved' cardLabel activity.oldList.title activity.list.title}}}.
|
||||
| {{{_ 'activity-moved' cardLabelLink (sanitize activity.oldList.title) (sanitize activity.list.title)}}}.
|
||||
|
||||
if($eq activity.activityType 'moveCardBoard')
|
||||
| {{{_ 'activity-moved' cardLink activity.oldBoardName activity.boardName}}}.
|
||||
| {{{_ 'activity-moved' cardLink (sanitize activity.oldBoardName) (sanitize activity.boardName)}}}.
|
||||
|
||||
if($eq activity.activityType 'archivedCard')
|
||||
| {{{_ 'activity-archived' cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'restoredCard')
|
||||
| {{{_ 'activity-sent' cardLink boardLabel}}}.
|
||||
| {{{_ 'activity-sent' cardLink boardLabelLink}}}.
|
||||
|
||||
//- checklist activity --------------------------------------------------
|
||||
if($eq activity.activityType 'addChecklist')
|
||||
@@ -83,25 +83,25 @@ template(name="activity")
|
||||
| {{{_ 'activity-checklist-removed' cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'completeChecklist')
|
||||
| {{{_ 'activity-checklist-completed' activity.checklist.title cardLink}}}.
|
||||
| {{{_ 'activity-checklist-completed' (sanitize activity.checklist.title) cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'uncompleteChecklist')
|
||||
| {{{_ 'activity-checklist-uncompleted' activity.checklist.title cardLink}}}.
|
||||
| {{{_ 'activity-checklist-uncompleted' (sanitize activity.checklist.title) cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'checkedItem')
|
||||
| {{{_ 'activity-checked-item' checkItem activity.checklist.title cardLink}}}.
|
||||
| {{{_ 'activity-checked-item' (sanitize checkItem) (sanitize activity.checklist.title) cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'uncheckedItem')
|
||||
| {{{_ 'activity-unchecked-item' checkItem activity.checklist.title cardLink}}}.
|
||||
| {{{_ 'activity-unchecked-item' (sanitize checkItem) (sanitize activity.checklist.title) cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'addChecklistItem')
|
||||
| {{{_ 'activity-checklist-item-added' activity.checklist.title cardLink}}}.
|
||||
| {{{_ 'activity-checklist-item-added' (sanitize activity.checklist.title) cardLink}}}.
|
||||
.activity-checklist(href="{{ activity.card.absoluteUrl }}")
|
||||
+viewer
|
||||
= activity.checklistItem.title
|
||||
|
||||
if($eq activity.activityType 'removedChecklistItem')
|
||||
| {{{_ 'activity-checklist-item-removed' activity.checklist.title cardLink}}}.
|
||||
| {{{_ 'activity-checklist-item-removed' (sanitize activity.checklist.title) cardLink}}}.
|
||||
|
||||
//- comment activity ----------------------------------------------------
|
||||
if($eq mode 'card')
|
||||
@@ -143,31 +143,31 @@ template(name="activity")
|
||||
| {{_ 'activity-customfield-created' customField}}.
|
||||
|
||||
if($eq activity.activityType 'setCustomField')
|
||||
| {{{_ 'activity-set-customfield' lastCustomField lastCustomFieldValue cardLink}}}.
|
||||
| {{{_ 'activity-set-customfield' (sanitize lastCustomField) (sanitize lastCustomFieldValue) cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'unsetCustomField')
|
||||
| {{{_ 'activity-unset-customfield' lastCustomField cardLink}}}.
|
||||
| {{{_ 'activity-unset-customfield' (sanitize lastCustomField) cardLink}}}.
|
||||
|
||||
//- label activity ------------------------------------------------------
|
||||
if($eq activity.activityType 'addedLabel')
|
||||
| {{{_ 'activity-added-label' lastLabel cardLink}}}.
|
||||
| {{{_ 'activity-added-label' (sanitize lastLabel) cardLink}}}.
|
||||
|
||||
if($eq activity.activityType 'removedLabel')
|
||||
| {{{_ 'activity-removed-label' lastLabel cardLink}}}.
|
||||
| {{{_ 'activity-removed-label' (sanitize lastLabel) cardLink}}}.
|
||||
|
||||
//- list activity -------------------------------------------------------
|
||||
if($neq mode 'card')
|
||||
if($eq activity.activityType 'createList')
|
||||
| {{{_ 'activity-added' listLabel boardLabel}}}.
|
||||
| {{{_ 'activity-added' (sanitize listLabel) boardLabelLink}}}.
|
||||
|
||||
if($eq activity.activityType 'importList')
|
||||
| {{{_ 'activity-imported' listLabel boardLabel sourceLink}}}.
|
||||
| {{{_ 'activity-imported' (sanitize listLabel) boardLabelLink sourceLink}}}.
|
||||
|
||||
if($eq activity.activityType 'removeList')
|
||||
| {{{_ 'activity-removed' activity.title boardLabel}}}.
|
||||
| {{{_ 'activity-removed' (sanitize activity.title) boardLabelLink}}}.
|
||||
|
||||
if($eq activity.activityType 'archivedList')
|
||||
| {{_ 'activity-archived' listLabel}}.
|
||||
| {{_ 'activity-archived' (sanitize listLabel)}}.
|
||||
|
||||
//- member activity ----------------------------------------------------
|
||||
if($eq activity.activityType 'joinMember')
|
||||
@@ -185,15 +185,15 @@ template(name="activity")
|
||||
//- swimlane activity --------------------------------------------------
|
||||
if($neq mode 'card')
|
||||
if($eq activity.activityType 'createSwimlane')
|
||||
| {{{_ 'activity-added' activity.swimlane.title boardLabel}}}.
|
||||
| {{_ 'activity-added' (sanitize activity.swimlane.title) boardLabelLink}}.
|
||||
|
||||
if($eq activity.activityType 'archivedSwimlane')
|
||||
| {{_ 'activity-archived' activity.swimlane.title}}.
|
||||
| {{_ 'activity-archived' (sanitize activity.swimlane.title)}}.
|
||||
|
||||
|
||||
//- I don't understand this part ----------------------------------------
|
||||
if(currentData.timeKey)
|
||||
| {{{_ activity.activityType }}}
|
||||
| {{_ activity.activityType }}
|
||||
= ' '
|
||||
i(title=currentData.timeValue).activity-meta {{ moment currentData.timeValue 'LLL' }}
|
||||
if (currentData.timeOldValue)
|
||||
@@ -203,6 +203,6 @@ template(name="activity")
|
||||
i(title=currentData.timeOldValue).activity-meta {{ moment currentData.timeOldValue 'LLL' }}
|
||||
= ' @'
|
||||
else if(currentData.timeValue)
|
||||
| {{{_ activity.activityType currentData.timeValue}}}
|
||||
| {{_ activity.activityType currentData.timeValue}}
|
||||
|
||||
span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
@@ -1,3 +1,5 @@
|
||||
import sanitizeXss from 'xss';
|
||||
|
||||
const activitiesPerPage = 20;
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
@@ -5,8 +7,9 @@ BlazeComponent.extendComponent({
|
||||
// XXX Should we use ReactiveNumber?
|
||||
this.page = new ReactiveVar(1);
|
||||
this.loadNextPageLocked = false;
|
||||
const sidebar = this.parentComponent(); // XXX for some reason not working
|
||||
sidebar.callFirstWith(null, 'resetNextPeak');
|
||||
// TODO is sidebar always available? E.g. on small screens/mobile devices
|
||||
const sidebar = Sidebar;
|
||||
sidebar && sidebar.callFirstWith(null, 'resetNextPeak');
|
||||
this.autorun(() => {
|
||||
let mode = this.data().mode;
|
||||
const capitalizedMode = Utils.capitalize(mode);
|
||||
@@ -27,6 +30,8 @@ BlazeComponent.extendComponent({
|
||||
this.subscribe('activities', mode, searchId, limit, hideSystem, () => {
|
||||
this.loadNextPageLocked = false;
|
||||
|
||||
// TODO the guard can be removed as soon as the TODO above is resolved
|
||||
if (!sidebar) return;
|
||||
// If the sibear peak hasn't increased, that mean that there are no more
|
||||
// activities, and we can stop calling new subscriptions.
|
||||
// XXX This is hacky! We need to know excatly and reactively how many
|
||||
@@ -41,23 +46,22 @@ BlazeComponent.extendComponent({
|
||||
});
|
||||
});
|
||||
},
|
||||
}).register('activities');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
loadNextPage() {
|
||||
if (this.loadNextPageLocked === false) {
|
||||
this.page.set(this.page.get() + 1);
|
||||
this.loadNextPageLocked = true;
|
||||
}
|
||||
},
|
||||
}).register('activities');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
checkItem() {
|
||||
const checkItemId = this.currentData().activity.checklistItemId;
|
||||
const checkItem = ChecklistItems.findOne({ _id: checkItemId });
|
||||
return checkItem && checkItem.title;
|
||||
},
|
||||
|
||||
boardLabel() {
|
||||
boardLabelLink() {
|
||||
const data = this.currentData();
|
||||
if (data.mode !== 'board') {
|
||||
return createBoardLink(data.activity.board(), data.activity.listName);
|
||||
@@ -65,10 +69,10 @@ BlazeComponent.extendComponent({
|
||||
return TAPi18n.__('this-board');
|
||||
},
|
||||
|
||||
cardLabel() {
|
||||
cardLabelLink() {
|
||||
const data = this.currentData();
|
||||
if (data.mode !== 'card') {
|
||||
return createCardLink(this.currentData().activity.card());
|
||||
return createCardLink(data.activity.card());
|
||||
}
|
||||
return TAPi18n.__('this-card');
|
||||
},
|
||||
@@ -134,11 +138,11 @@ BlazeComponent.extendComponent({
|
||||
{
|
||||
href: source.url,
|
||||
},
|
||||
source.system,
|
||||
sanitizeXss(source.system),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return source.system;
|
||||
return sanitizeXss(source.system);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -162,10 +166,10 @@ BlazeComponent.extendComponent({
|
||||
href: attachment.url({ download: true }),
|
||||
target: '_blank',
|
||||
},
|
||||
attachment.name(),
|
||||
sanitizeXss(attachment.name()),
|
||||
),
|
||||
)) ||
|
||||
this.currentData().activity.attachmentName
|
||||
sanitizeXss(this.currentData().activity.attachmentName)
|
||||
);
|
||||
},
|
||||
|
||||
@@ -202,7 +206,14 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('activity');
|
||||
|
||||
Template.activity.helpers({
|
||||
sanitize(value) {
|
||||
return sanitizeXss(value);
|
||||
},
|
||||
});
|
||||
|
||||
function createCardLink(card) {
|
||||
if (!card) return '';
|
||||
return (
|
||||
card &&
|
||||
Blaze.toHTML(
|
||||
@@ -211,7 +222,7 @@ function createCardLink(card) {
|
||||
href: card.absoluteUrl(),
|
||||
class: 'action-card',
|
||||
},
|
||||
card.title,
|
||||
sanitizeXss(card.title),
|
||||
),
|
||||
)
|
||||
);
|
||||
@@ -228,7 +239,7 @@ function createBoardLink(board, list) {
|
||||
href: board.absoluteUrl(),
|
||||
class: 'action-board',
|
||||
},
|
||||
text,
|
||||
sanitizeXss(text),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
@@ -7,7 +7,7 @@ BlazeComponent.extendComponent({
|
||||
return Boards.find(
|
||||
{ archived: true },
|
||||
{
|
||||
sort: { sort: 1 /* boards default sorting */ }
|
||||
sort: { sort: 1 /* boards default sorting */ },
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
@@ -15,7 +15,7 @@ template(name="board")
|
||||
template(name="boardBody")
|
||||
.board-wrapper(class=currentBoard.colorClass)
|
||||
+sidebar
|
||||
.board-canvas.js-swimlanes.js-perfect-scrollbar(
|
||||
.board-canvas.js-swimlanes(
|
||||
class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
|
||||
class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
|
||||
class="{{#if draggingActive.get}}is-dragging-active{{/if}}")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
const { calculateIndex } = Utils;
|
||||
const swimlaneWhileSortingHeight = 150;
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
@@ -191,9 +191,6 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
});
|
||||
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch('.js-swimlane:not(.placeholder)');
|
||||
|
||||
this.autorun(() => {
|
||||
let showDesktopDragHandles = false;
|
||||
currentUser = Meteor.user();
|
||||
@@ -205,7 +202,7 @@ BlazeComponent.extendComponent({
|
||||
} else {
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
if (!Utils.isMiniScreen() && showDesktopDragHandles) {
|
||||
if (Utils.isMiniScreen() || showDesktopDragHandles) {
|
||||
$swimlanesDom.sortable({
|
||||
handle: '.js-swimlane-header-handle',
|
||||
});
|
||||
@@ -215,9 +212,8 @@ BlazeComponent.extendComponent({
|
||||
});
|
||||
}
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is miniscreen
|
||||
// Disable drag-dropping if the current user is not a board member
|
||||
$swimlanesDom.sortable('option', 'disabled', !userIsMember());
|
||||
$swimlanesDom.sortable('option', 'disabled', Utils.isMiniScreen());
|
||||
});
|
||||
|
||||
function userIsMember() {
|
||||
@@ -327,7 +323,7 @@ BlazeComponent.extendComponent({
|
||||
header: {
|
||||
left: 'title today prev,next',
|
||||
center:
|
||||
'agendaDay,listDay,timelineDay agendaWeek,listWeek,timelineWeek month,timelineMonth timelineYear',
|
||||
'agendaDay,listDay,timelineDay agendaWeek,listWeek,timelineWeek month,listMonth',
|
||||
right: '',
|
||||
},
|
||||
// height: 'parent', nope, doesn't work as the parent might be small
|
||||
|
||||
@@ -293,3 +293,449 @@ setBoardColor(color)
|
||||
|
||||
//.header-quick-access
|
||||
// backgroud-color: #568ba2
|
||||
|
||||
|
||||
/*
|
||||
Alternate "Clear" Styling
|
||||
*/
|
||||
setBoardClear(color1,color2)
|
||||
//color1: The quick access color
|
||||
//color2: The main bar color
|
||||
|
||||
&.sk-spinner div,
|
||||
.board-backgrounds-list &.background-box,
|
||||
.board-list & a
|
||||
background: linear-gradient(180deg, color1 0%, color2 100%)
|
||||
//background: linear-gradient(180deg, rgb(73, 155, 234) 0%, rgb(0, 174, 204) 100%)
|
||||
|
||||
.is-selected .minicard
|
||||
border-left: 3px solid color1
|
||||
|
||||
&.pop-over .pop-over-list li a:not(.disabled):hover,
|
||||
.sidebar .sidebar-content .sidebar-btn:hover,
|
||||
.sidebar-list li a:hover
|
||||
background-color: lighten(color1, 10%)
|
||||
|
||||
&#header ul li.current, &#header-quick-access ul li.current
|
||||
border-bottom: 4px solid lighten(color2, 10%)
|
||||
|
||||
&#header-quick-access
|
||||
background: darken(color1, 10%)
|
||||
//background: rgba(66,137,204,1)
|
||||
color: #FFF
|
||||
|
||||
&#header-quick-access #header-new-board-icon,
|
||||
&#header-quick-access #header-user-bar,
|
||||
&#header-quick-access ul li
|
||||
color: rgba(255,255,255,0.5)
|
||||
|
||||
// The background-color value here is not seen,
|
||||
// its covered by the background of #header-main-bar
|
||||
// it's just to aid transitions between boards
|
||||
&#header
|
||||
background-color: color2
|
||||
border-bottom: 1px solid darken(color2, 20%)
|
||||
border-top: 1px solid darken(color2, 40%)
|
||||
|
||||
// Since the theme uses a gradient for the header
|
||||
// and gradients break transitions, it has to be set here
|
||||
&#header #header-main-bar
|
||||
background: linear-gradient(180deg, color1 0%, color2 100%)
|
||||
|
||||
&#header #header-main-bar p
|
||||
margin-bottom: 6px
|
||||
|
||||
&#header #header-main-bar .board-header-btn.emphasis
|
||||
background: lighten(color2, 10%)
|
||||
|
||||
&:hover,
|
||||
.board-header-btn-close
|
||||
background: rgba(0,0,0,0.2)
|
||||
|
||||
&:hover .board-header-btn-close
|
||||
background: rgba(0,0,0,0.2)
|
||||
|
||||
.materialCheckBox.is-checked
|
||||
border-bottom: 2px solid color1
|
||||
border-right: 2px solid color1
|
||||
|
||||
.is-multiselection-active .multi-selection-checkbox
|
||||
&.is-checked + .minicard
|
||||
background: lighten(color2, 90%)
|
||||
|
||||
&:not(.is-checked) + .minicard:hover:not(.minicard-composer)
|
||||
background: lighten(color2, 97%)
|
||||
|
||||
.toggle-switch:checked ~ .toggle-label
|
||||
background-color: lighten(color1, 20%)
|
||||
|
||||
&:after
|
||||
background-color: darken(color1, 20%)
|
||||
|
||||
.board-canvas
|
||||
background: linear-gradient(135deg, color1 0%, color2 100%)
|
||||
|
||||
.swimlane
|
||||
background: none
|
||||
|
||||
.list:first-child
|
||||
margin-left: 15px
|
||||
|
||||
.list
|
||||
background: rgba(255,255,255,0.35)
|
||||
margin: 10px
|
||||
border: 0
|
||||
border-radius: 14px
|
||||
|
||||
.list.list-composer
|
||||
background: rgba(255,255,255,0.1)
|
||||
height: min-content
|
||||
flex: unset
|
||||
width: 270px
|
||||
padding-bottom: 16px
|
||||
|
||||
.list.list-composer .open-list-composer
|
||||
border-radius: 7px
|
||||
color: rgba(0,0,0,0.3)
|
||||
padding: 7px 10px
|
||||
display: block
|
||||
|
||||
.list.list-composer .open-list-composer:hover
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,.2)
|
||||
background: rgba(255,255,255,0.7)
|
||||
color: rgba(0,0,0,0.6)
|
||||
|
||||
.list-header
|
||||
background-color: rgba(255,255,255,0.25)
|
||||
border-radius: 14px 14px 0 0
|
||||
|
||||
.list-header:not([class*="list-header-"])
|
||||
border-bottom: 6px solid rgba(255,255,255,0)
|
||||
|
||||
.list-header .list-header-name
|
||||
color: rgba(0,0,0,0.6)
|
||||
|
||||
.list-body
|
||||
padding: 11px
|
||||
|
||||
.minicard
|
||||
border-radius: 7px
|
||||
padding: 10px 10px 4px 10px
|
||||
box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15)
|
||||
color: #222
|
||||
|
||||
.card-details
|
||||
border-radius: 0 0 14px 14px
|
||||
box-shadow: 0 0 7px 0 rgba(0,0,0,0.5)
|
||||
margin-left: -10px
|
||||
|
||||
.list-body .open-minicard-composer
|
||||
border-radius: 7px
|
||||
color: rgba(0,0,0,.3)
|
||||
margin-bottom: 11px
|
||||
|
||||
.list-body .open-minicard-composer:hover
|
||||
background: rgba(255,255,255,0.7)
|
||||
color: rgba(0,0,0,0.6)
|
||||
|
||||
button[type=submit].primary, input[type=submit].primary
|
||||
box-shadow: none
|
||||
background-color: rgba(255,255,255,0.5)
|
||||
color: rgba(0,0,0,0.55)
|
||||
border-radius: 7px
|
||||
border: 0
|
||||
|
||||
button[type="submit"].primary:hover, input[type="submit"].primary:hover
|
||||
background-color: rgba(255,255,255,0.7)
|
||||
color: rgba(0,0,0,0.8)
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,.2)
|
||||
|
||||
.quiet, .quiet a
|
||||
color: rgba(0,0,0,0.4)
|
||||
|
||||
.list-header .list-header-watch-icon
|
||||
color: rgba(0,0,0,0.5)
|
||||
position: absolute
|
||||
margin-top: -34px
|
||||
margin-let: -11px
|
||||
|
||||
a.fa, a i.fa
|
||||
color: rgba(0,0,0,0.3)
|
||||
|
||||
a:not(.disabled).is-active.fa, a:not(.disabled).is-active i.fa, a:not(.disabled):hover.fa, a:not(.disabled):hover i.fa
|
||||
color: rgba(0,0,0,0.6)
|
||||
|
||||
input[type="email"], input[type="password"], input[type="text"]
|
||||
border: 0
|
||||
border-radius: 7px
|
||||
|
||||
.sidebar-shadow
|
||||
box-shadow: none
|
||||
border-left: 9px solid color2
|
||||
|
||||
.is-open .sidebar-shadow
|
||||
box-shadow: -10px 0 8px rgba(0,0,0,0.3)
|
||||
|
||||
.list.ui-sortable-helper
|
||||
transform:rotate(0deg)
|
||||
|
||||
.minicard-wrapper.placeholder
|
||||
background: rgba(0,0,0,0.1)
|
||||
|
||||
.minicard-wrapper.ui-sortable-helper
|
||||
transform:rotate(0deg)
|
||||
opacity: 0.8
|
||||
|
||||
.list-body .open-minicard-composer
|
||||
color: rgba(0,0,0,.3)
|
||||
|
||||
.swinlane.ui-sortable-helper
|
||||
transform:rotate(0deg)
|
||||
|
||||
.swimlane .swimlane-header-wrap
|
||||
background: linear-gradient(0deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.25) 100%)
|
||||
|
||||
.swimlane-header-wrap .inlined-form
|
||||
width: 100%
|
||||
|
||||
.swimlane-header-wrap .list-composer
|
||||
text-align: center
|
||||
margin: 5px
|
||||
|
||||
.swimlane-header-wrap .list-name-input.full-line
|
||||
margin: 0
|
||||
display: inline-block
|
||||
width: 270px
|
||||
|
||||
.swimlane-header-wrap .edit-controls
|
||||
display: inline-block
|
||||
vertical-align: middle
|
||||
|
||||
.swimlane-header-wrap .primary.confirm
|
||||
margin-right: 0
|
||||
|
||||
.swimlane-header-wrap .fa.fa-times-thin
|
||||
margin-top: 2px
|
||||
|
||||
// This is a general fix so that the little grabby hand appears when dragging the list via the title
|
||||
.list.ui-sortable-helper,
|
||||
.list.ui-sortable-helper .list-header.ui-sortable-handle,
|
||||
.list.ui-sortable-helper .viewer
|
||||
cursor:-webkit-grabbing;
|
||||
cursor:grabbing
|
||||
|
||||
.board-color-clearblue
|
||||
setBoardClear(rgb(73, 155, 234),rgb(0, 174, 204))
|
||||
|
||||
/*
|
||||
Alternate "Natural" Styling
|
||||
*/
|
||||
.board-color-natural
|
||||
setBoardColor(#596557)
|
||||
|
||||
&#header-quick-access
|
||||
background-color: #2d392b
|
||||
|
||||
.ui-sortable
|
||||
background-color:#dedede
|
||||
|
||||
.list-header
|
||||
background-color: #c9cfc3
|
||||
border-bottom: 6px solid #c9cfc3
|
||||
|
||||
.swimlane .swimlane-header-wrap
|
||||
background-color: #c2c0ab
|
||||
|
||||
/*
|
||||
Alternate "Modern" Styling
|
||||
*/
|
||||
.board-color-modern
|
||||
setBoardColor(#2A80B8)
|
||||
|
||||
/* General */
|
||||
body
|
||||
background: #f5f5f5
|
||||
|
||||
&#header-quick-access
|
||||
padding: 10px
|
||||
font-size: 14px
|
||||
background: #333 !important
|
||||
|
||||
&#header-quick-access ul
|
||||
overflow: visible
|
||||
|
||||
&#header-quick-access ul li.current
|
||||
border: 0 !important
|
||||
font-weight: bold
|
||||
|
||||
&#header-quick-access ul li.separator
|
||||
display: none
|
||||
|
||||
&#header-quick-access ul li:nth-child(3)
|
||||
margin-right: 10px
|
||||
|
||||
&#header-quick-access ul li a
|
||||
padding: 5px 10px
|
||||
border-radius: 2px
|
||||
|
||||
&#header-quick-access ul li.current a
|
||||
border-radius: 2px
|
||||
background: rgba(255,255,255,.2)
|
||||
|
||||
&#header #header-main-bar h1
|
||||
font-family: Poppins
|
||||
font-weight: bold
|
||||
&#header-quick-access #header-user-bar
|
||||
position relative
|
||||
|
||||
&#header-quick-access #header-user-bar .header-user-bar-name
|
||||
margin: 5px 3px 0 0;
|
||||
|
||||
section#notifications-drawer
|
||||
top: 46px;
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,.1)
|
||||
max-width: 100%
|
||||
|
||||
section#notifications-drawer .header
|
||||
top: 46px;
|
||||
border-radius: 0 3px
|
||||
height: 21px
|
||||
background: #f7f7f7
|
||||
|
||||
/* Swimlane */
|
||||
.swimlane
|
||||
background: #f5f5f5
|
||||
|
||||
.swimlane .swimlane-header-wrap .swimlane-header
|
||||
font-family: Poppins
|
||||
|
||||
/* All board views */
|
||||
.board-list .board-list-item
|
||||
padding: 20px
|
||||
|
||||
.board-list-item-name
|
||||
font-family: Poppins
|
||||
|
||||
/* Board */
|
||||
.list
|
||||
background: transparent
|
||||
border-left: 0
|
||||
margin: 10px 0
|
||||
padding: 0px
|
||||
border-radius: 5px
|
||||
min-width: 300px
|
||||
|
||||
.list-body .open-minicard-composer:hover /*me*/
|
||||
background: none
|
||||
box-shadow: none
|
||||
|
||||
.list:first-child
|
||||
margin-left: 5px
|
||||
|
||||
.list.list-composer.js-list-composer
|
||||
transition: all .3s ease
|
||||
min-width: 80px
|
||||
|
||||
.open-list-composer.js-open-inlined-form:hover
|
||||
color: #222
|
||||
|
||||
.list-header
|
||||
background: none
|
||||
border-bottom-width: 0px
|
||||
|
||||
.list-header .list-header-name
|
||||
font-family: Poppins
|
||||
color: #000
|
||||
font-weight: 500
|
||||
|
||||
/* Card changes */
|
||||
.minicard
|
||||
background: #FFF
|
||||
padding: 15px 15px 10px
|
||||
box-shadow: 0 3px 8px rgba(0,0,0,.05)
|
||||
|
||||
.minicard-plum:hover:not(.minicard-composer), .is-selected .minicard-plum, .draggable-hover-card .minicard-plum
|
||||
background: none
|
||||
|
||||
.minicard-title
|
||||
line-height: 1.5em
|
||||
|
||||
.minicard .minicard-cover
|
||||
background-size: cover
|
||||
margin: -15px -15px 10px
|
||||
height: 100px
|
||||
|
||||
.card-label-orange
|
||||
color: #fff
|
||||
|
||||
.card-date
|
||||
font-size: 12px
|
||||
padding: 3px 5px
|
||||
|
||||
/* Pop over */
|
||||
.header-title
|
||||
font-family: Poppins
|
||||
font-size: 16px
|
||||
color: #333
|
||||
|
||||
.pop-over
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,.2)
|
||||
border: 0
|
||||
border-radius: 5px
|
||||
|
||||
.pop-over .header
|
||||
padding: 10px
|
||||
border-bottom: 0
|
||||
border-radius: 5px 5px 0 0
|
||||
background:#eee
|
||||
|
||||
.pop-over .header .header-title
|
||||
font-family: Poppins
|
||||
font-size:16px
|
||||
color:#333
|
||||
|
||||
.pop-over .header .close-btn
|
||||
font-size:20px
|
||||
top:6px
|
||||
right:8px
|
||||
|
||||
.pop-over .content-container .content
|
||||
padding: 5px 20px 20px
|
||||
width: 260px
|
||||
|
||||
.pop-over-list li > a
|
||||
border-radius: 5px
|
||||
|
||||
.pop-over-list li > a > i
|
||||
margin-right: 5px
|
||||
|
||||
.pop-over-list li>a .sub-name
|
||||
margin-bottom: 8px
|
||||
|
||||
/* Sidebar */
|
||||
.sidebar .sidebar-shadow
|
||||
box-shadow: 0 0 60px rgba(0,0,0,.2)
|
||||
|
||||
.sidebar .sidebar-content
|
||||
padding: 30px
|
||||
|
||||
/* Notifications */
|
||||
.board-color-modern section#notifications-drawer
|
||||
border-radius:5px
|
||||
|
||||
.board-color-modern section#notifications-drawer .header
|
||||
padding: 18px 16px
|
||||
border-bottom: 0
|
||||
border-radius: 5px 5px 0 0
|
||||
background: #eee
|
||||
|
||||
.board-color-modern section#notifications-drawer .header h5
|
||||
font-family: Poppins
|
||||
font-weight: bold
|
||||
|
||||
.board-color-modern section#notifications-drawer .header .close
|
||||
font-size: 20px
|
||||
top: 14px
|
||||
|
||||
section#notifications-drawer .header .toggle-read
|
||||
top: 18px
|
||||
@@ -99,13 +99,13 @@ template(name="boardHeaderBar")
|
||||
a.board-header-btn.js-toggle-board-view(
|
||||
title="{{_ 'board-view'}}")
|
||||
i.fa.fa-caret-down
|
||||
if $eq boardView 'board-view-lists'
|
||||
i.fa.fa-trello
|
||||
if $eq boardView 'board-view-swimlanes'
|
||||
i.fa.fa-th-large
|
||||
if $eq boardView 'board-view-lists'
|
||||
i.fa.fa-trello
|
||||
if $eq boardView 'board-view-cal'
|
||||
i.fa.fa-calendar
|
||||
span {{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
|
||||
span {{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-swimlanes'}}{{/if}}
|
||||
|
||||
if canModifyBoard
|
||||
a.board-header-btn.js-multiselection-activate(
|
||||
@@ -172,13 +172,6 @@ template(name="boardChangeWatchPopup")
|
||||
|
||||
template(name="boardChangeViewPopup")
|
||||
ul.pop-over-list
|
||||
li
|
||||
with "board-view-lists"
|
||||
a.js-open-lists-view
|
||||
i.fa.fa-trello.colorful
|
||||
| {{_ 'board-view-lists'}}
|
||||
if $eq Utils.boardView "board-view-lists"
|
||||
i.fa.fa-check
|
||||
li
|
||||
with "board-view-swimlanes"
|
||||
a.js-open-swimlanes-view
|
||||
@@ -186,6 +179,13 @@ template(name="boardChangeViewPopup")
|
||||
| {{_ 'board-view-swimlanes'}}
|
||||
if $eq Utils.boardView "board-view-swimlanes"
|
||||
i.fa.fa-check
|
||||
li
|
||||
with "board-view-lists"
|
||||
a.js-open-lists-view
|
||||
i.fa.fa-trello.colorful
|
||||
| {{_ 'board-view-lists'}}
|
||||
if $eq Utils.boardView "board-view-lists"
|
||||
i.fa.fa-check
|
||||
li
|
||||
with "board-view-cal"
|
||||
a.js-open-cal-view
|
||||
|
||||
@@ -31,6 +31,10 @@ template(name="boardList")
|
||||
i.fa.js-has-spenttime-cards(
|
||||
class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}"
|
||||
title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}")
|
||||
if isMiniScreen
|
||||
i.fa.board-handle(
|
||||
class="fa-arrows"
|
||||
title="{{_ 'Drag board'}}")
|
||||
unless isMiniScreen
|
||||
if isSandstorm
|
||||
i.fa.js-clone-board(
|
||||
|
||||
@@ -9,7 +9,7 @@ Template.boardListHeaderBar.events({
|
||||
|
||||
Template.boardListHeaderBar.helpers({
|
||||
title() {
|
||||
return FlowRouter.getRouteName() == 'home' ? 'my-boards' : 'public';
|
||||
return FlowRouter.getRouteName() === 'home' ? 'my-boards' : 'public';
|
||||
},
|
||||
templatesBoardId() {
|
||||
return Meteor.user() && Meteor.user().getTemplatesBoardId();
|
||||
@@ -25,11 +25,6 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
onRendered() {
|
||||
const self = this;
|
||||
function userIsAllowedToMove() {
|
||||
return Meteor.user();
|
||||
}
|
||||
|
||||
const itemsSelector = '.js-board:not(.placeholder)';
|
||||
|
||||
const $boards = this.$('.js-boards');
|
||||
@@ -73,20 +68,26 @@ BlazeComponent.extendComponent({
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is comment only
|
||||
this.autorun(() => {
|
||||
$boards.sortable('option', 'disabled', !userIsAllowedToMove());
|
||||
if (Utils.isMiniScreen()) {
|
||||
$boards.sortable({
|
||||
handle: '.board-handle',
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
boards() {
|
||||
let query = {
|
||||
const query = {
|
||||
archived: false,
|
||||
type: 'board',
|
||||
};
|
||||
if (FlowRouter.getRouteName() == 'home')
|
||||
if (FlowRouter.getRouteName() === 'home')
|
||||
query['members.userId'] = Meteor.userId();
|
||||
else query.permission = 'public';
|
||||
|
||||
return Boards.find(query, { sort: { sort: 1 /* boards default sorting */ } });
|
||||
return Boards.find(query, {
|
||||
sort: { sort: 1 /* boards default sorting */ },
|
||||
});
|
||||
},
|
||||
isStarred() {
|
||||
const user = Meteor.user();
|
||||
|
||||
@@ -33,7 +33,7 @@ $spaceBetweenTiles = 16px
|
||||
overflow: hidden;
|
||||
background-color: #999
|
||||
color: #f6f6f6
|
||||
height: 90px
|
||||
height: auto
|
||||
font-size: 16px
|
||||
line-height: 22px
|
||||
border-radius: 3px
|
||||
@@ -44,6 +44,7 @@ $spaceBetweenTiles = 16px
|
||||
margin: ($spaceBetweenTiles/2)
|
||||
position: relative
|
||||
text-decoration: none
|
||||
word-wrap: break-word
|
||||
|
||||
&.tile
|
||||
background-size: auto
|
||||
@@ -68,7 +69,7 @@ $spaceBetweenTiles = 16px
|
||||
|
||||
.label
|
||||
font-weight: normal
|
||||
line-height:90px
|
||||
line-height: 56px
|
||||
|
||||
:hover
|
||||
background-color:#939393
|
||||
@@ -207,6 +208,22 @@ $spaceBetweenTiles = 16px
|
||||
top: -100px
|
||||
left: -100px
|
||||
|
||||
.board-handle
|
||||
position: absolute
|
||||
padding: 7px
|
||||
top: 50%
|
||||
transform: translateY(-50%)
|
||||
right: 10px
|
||||
font-size: 24px
|
||||
|
||||
@media screen and (max-width: 360px)
|
||||
li
|
||||
width: 100%
|
||||
|
||||
.board-handle
|
||||
position: absolute
|
||||
padding: 7px
|
||||
top: 50%
|
||||
transform: translateY(-50%)
|
||||
right: 10px
|
||||
font-size: 24px
|
||||
@@ -53,6 +53,23 @@ template(name="cardCustomField-number")
|
||||
if value
|
||||
= value
|
||||
|
||||
template(name="cardCustomField-currency")
|
||||
if canModifyCard
|
||||
+inlinedForm(classNames="js-card-customfield-currency")
|
||||
input(type="text" value=data.value)
|
||||
.edit-controls.clearfix
|
||||
button.primary(type="submit") {{_ 'save'}}
|
||||
a.fa.fa-times-thin.js-close-inlined-form
|
||||
else
|
||||
a.js-open-inlined-form
|
||||
if value
|
||||
= formattedValue
|
||||
else
|
||||
| {{_ 'edit'}}
|
||||
else
|
||||
if value
|
||||
= formattedValue
|
||||
|
||||
template(name="cardCustomField-date")
|
||||
if canModifyCard
|
||||
a.js-edit-date(title="{{showTitle}}" class="{{classes}}")
|
||||
|
||||
@@ -80,6 +80,36 @@ CardCustomField.register('cardCustomField');
|
||||
}
|
||||
}.register('cardCustomField-number'));
|
||||
|
||||
// cardCustomField-currency
|
||||
(class extends CardCustomField {
|
||||
onCreated() {
|
||||
super.onCreated();
|
||||
|
||||
this.currencyCode = this.data().definition.settings.currencyCode;
|
||||
}
|
||||
|
||||
formattedValue() {
|
||||
const locale = TAPi18n.getLanguage();
|
||||
|
||||
return new Intl.NumberFormat(locale, {
|
||||
style: 'currency',
|
||||
currency: this.currencyCode,
|
||||
}).format(this.data().value);
|
||||
}
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'submit .js-card-customfield-currency'(event) {
|
||||
event.preventDefault();
|
||||
const value = Number(this.find('input').value, 10);
|
||||
this.card.setCustomField(this.customFieldId, value);
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
}.register('cardCustomField-currency'));
|
||||
|
||||
// cardCustomField-date
|
||||
(class extends CardCustomField {
|
||||
onCreated() {
|
||||
|
||||
@@ -386,3 +386,30 @@ CardEndDate.register('cardEndDate');
|
||||
return this.date.get().format('l');
|
||||
}
|
||||
}.register('minicardEndDate'));
|
||||
|
||||
class VoteEndDate extends CardDate {
|
||||
onCreated() {
|
||||
super.onCreated();
|
||||
const self = this;
|
||||
self.autorun(() => {
|
||||
self.date.set(moment(self.data().getVoteEnd()));
|
||||
});
|
||||
}
|
||||
classes() {
|
||||
const classes = 'end-date' + ' ';
|
||||
return classes;
|
||||
}
|
||||
showDate() {
|
||||
return this.date.get().format('l LT');
|
||||
}
|
||||
showTitle() {
|
||||
return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`;
|
||||
}
|
||||
|
||||
events() {
|
||||
return super.events().concat({
|
||||
'click .js-edit-date': Popup.open('editVoteEndDate'),
|
||||
});
|
||||
}
|
||||
}
|
||||
VoteEndDate.register('voteEndDate');
|
||||
@@ -1,5 +1,5 @@
|
||||
template(name="cardDetails")
|
||||
section.card-details.js-card-details.js-perfect-scrollbar: .card-details-canvas
|
||||
section.card-details.js-card-details: .card-details-canvas
|
||||
.card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
|
||||
+inlinedForm(classNames="js-card-details-title")
|
||||
+editCardTitleForm
|
||||
@@ -202,9 +202,12 @@ template(name="cardDetails")
|
||||
if getVoteQuestion
|
||||
hr
|
||||
.vote-title
|
||||
h3
|
||||
i.fa.fa-thumbs-up
|
||||
card-details-item-title {{_ 'vote-question'}}
|
||||
div.flex
|
||||
h3
|
||||
i.fa.fa-thumbs-up
|
||||
| {{_ 'vote-question'}}
|
||||
if getVoteEnd
|
||||
+voteEndDate
|
||||
.vote-result
|
||||
if votePublic
|
||||
a.card-label.card-label-green.js-show-positive-votes {{ voteCountPositive }}
|
||||
@@ -212,10 +215,19 @@ template(name="cardDetails")
|
||||
else
|
||||
.card-label.card-label-green {{ voteCountPositive }}
|
||||
.card-label.card-label-red {{ voteCountNegative }}
|
||||
unless ($and currentBoard.isPublic voteAllowNonBoardMembers )
|
||||
.card-label.card-label-gray {{ voteCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }}
|
||||
+viewer
|
||||
= getVoteQuestion
|
||||
button.card-details-green.js-vote.js-vote-positive(class="{{#if voteState}}voted{{/if}}") {{_ 'vote-for-it'}}
|
||||
button.card-details-red.js-vote.js-vote-negative(class="{{#if $eq voteState false}}voted{{/if}}") {{_ 'vote-against'}}
|
||||
if showVotingButtons
|
||||
button.card-details-green.js-vote.js-vote-positive(class="{{#if voteState}}voted{{/if}}")
|
||||
if voteState
|
||||
i.fa.fa-thumbs-up
|
||||
| {{_ 'vote-for-it'}}
|
||||
button.card-details-red.js-vote.js-vote-negative(class="{{#if $eq voteState false}}voted{{/if}}")
|
||||
if $eq voteState false
|
||||
i.fa.fa-thumbs-down
|
||||
| {{_ 'vote-against'}}
|
||||
|
||||
//- XXX We should use "editable" to avoid repetiting ourselves
|
||||
if canModifyCard
|
||||
@@ -333,16 +345,10 @@ template(name="cardDetailsActionsPopup")
|
||||
//li: a.js-members {{_ 'card-edit-members'}}
|
||||
//li: a.js-labels {{_ 'card-edit-labels'}}
|
||||
//li: a.js-attachments {{_ 'card-edit-attachments'}}
|
||||
if getVoteQuestion
|
||||
li
|
||||
a.js-cancel-voting
|
||||
i.fa.fa-thumbs-up
|
||||
| {{_ 'card-cancel-voting'}}
|
||||
else
|
||||
li
|
||||
a.js-start-voting
|
||||
i.fa.fa-thumbs-up
|
||||
| {{_ 'card-start-voting'}}
|
||||
li
|
||||
a.js-start-voting
|
||||
i.fa.fa-thumbs-up
|
||||
| {{_ 'card-edit-voting'}}
|
||||
li
|
||||
a.js-custom-fields
|
||||
i.fa.fa-list-alt
|
||||
@@ -465,14 +471,14 @@ template(name="cardAssigneesPopup")
|
||||
i.fa.fa-check
|
||||
if currentUser.isWorker
|
||||
ul.pop-over-list.js-card-assignee-list
|
||||
li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}")
|
||||
a.name.js-select-assignee(href="#")
|
||||
+userAvatar(userId=currentUser._id)
|
||||
span.full-name
|
||||
= currentUser.profile.fullname
|
||||
| (<span class="username">{{ currentUser.username }}</span>)
|
||||
if currentUser.isCardAssignee
|
||||
i.fa.fa-check
|
||||
li.item(class="{{#if currentUser.isCardAssignee}}active{{/if}}")
|
||||
a.name.js-select-assignee(href="#")
|
||||
+userAvatar(userId=currentUser._id)
|
||||
span.full-name
|
||||
= currentUser.profile.fullname
|
||||
| (<span class="username">{{ currentUser.username }}</span>)
|
||||
if currentUser.isCardAssignee
|
||||
i.fa.fa-check
|
||||
|
||||
template(name="userAvatarAssignee")
|
||||
a.assignee.js-assignee(title="{{userData.profile.fullname}} ({{userData.username}})")
|
||||
@@ -519,7 +525,7 @@ template(name="cardMorePopup")
|
||||
= ' '
|
||||
i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
|
||||
input.inline-input(type="text" id="cardURL" readonly value="{{ absoluteUrl }}" autofocus="autofocus")
|
||||
button.js-copy-card-link-to-clipboard(class="btn") {{_ 'copy-card-link-to-clipboard'}}
|
||||
button.js-copy-card-link-to-clipboard(class="btn" id="clipboard") {{_ 'copy-card-link-to-clipboard'}}
|
||||
span.clearfix
|
||||
br
|
||||
h2 {{_ 'change-card-parent'}}
|
||||
@@ -564,20 +570,39 @@ template(name="setCardColorPopup")
|
||||
template(name="cardDeletePopup")
|
||||
p {{_ "card-delete-pop"}}
|
||||
unless archived
|
||||
p {{_ "card-delete-suggest-archive"}}
|
||||
p {{_ "card-delete-suggest-archive"}}
|
||||
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
|
||||
|
||||
template(name="deleteVotePopup")
|
||||
p {{_ "vote-delete-pop"}}
|
||||
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
|
||||
|
||||
template(name="cardStartVotingPopup")
|
||||
form.edit-vote-question
|
||||
.fields
|
||||
label(for="vote") {{_ 'vote-question'}}
|
||||
input.js-vote-field#vote(type="text" name="vote" value="{{card.getVoteQuestion}}" autofocus)
|
||||
label(for="vote-public") {{_ 'vote-public'}}
|
||||
a.js-toggle-vote-public
|
||||
.materialCheckBox#vote-public(name="vote-public")
|
||||
input.js-vote-field#vote(type="text" name="vote" value="{{getVoteQuestion}}" autofocus disabled="{{#if getVoteQuestion}}disabled{{/if}}")
|
||||
.check-div
|
||||
a.flex(class="{{#if getVoteQuestion}}is-disabled{{else}}js-toggle-vote-allow-non-members{{/if}}")
|
||||
.materialCheckBox#vote-allow-non-members(name="vote-allow-non-members" class="{{#if voteAllowNonBoardMembers}}is-checked{{/if}}")
|
||||
span {{_ 'allowNonBoardMembers'}}
|
||||
.check-div
|
||||
a.flex(class="{{#if getVoteQuestion}}is-disabled{{else}}js-toggle-vote-public{{/if}}")
|
||||
.materialCheckBox#vote-public(name="vote-public" class="{{#if votePublic}}is-checked{{/if}}")
|
||||
span {{_ 'vote-public'}}
|
||||
.check-div.flex
|
||||
i.fa.fa-hourglass-end
|
||||
a.js-end-date
|
||||
span
|
||||
| {{_ 'card-end'}}
|
||||
unless getVoteEnd
|
||||
i.fa.fa-plus
|
||||
if getVoteEnd
|
||||
+voteEndDate
|
||||
|
||||
button.primary.confirm.js-submit {{_ 'save'}}
|
||||
//- button.js-remove-color.negate.wide.right {{_ 'delete'}}
|
||||
button.primary.js-submit {{_ 'save'}}
|
||||
if getVoteQuestion
|
||||
button.js-remove-vote.negate.wide.right {{_ 'delete'}}
|
||||
|
||||
template(name="positiveVoteMembersPopup")
|
||||
ul.pop-over-list.js-card-member-list
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndexData, enableClickOnTouch } = Utils;
|
||||
const { calculateIndexData } = Utils;
|
||||
|
||||
let cardColors;
|
||||
Meteor.startup(() => {
|
||||
@@ -8,7 +8,7 @@ Meteor.startup(() => {
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
mixins() {
|
||||
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
|
||||
return [Mixins.InfiniteScrolling];
|
||||
},
|
||||
|
||||
calculateNextPeak() {
|
||||
@@ -38,38 +38,6 @@ BlazeComponent.extendComponent({
|
||||
Meteor.subscribe('unsaved-edits');
|
||||
},
|
||||
|
||||
voteState() {
|
||||
const card = this.currentData();
|
||||
const userId = Meteor.userId();
|
||||
let state;
|
||||
if (card.vote) {
|
||||
if (card.vote.positive) {
|
||||
state = _.contains(card.vote.positive, userId);
|
||||
if (state === true) return true;
|
||||
}
|
||||
if (card.vote.negative) {
|
||||
state = _.contains(card.vote.negative, userId);
|
||||
if (state === true) return false;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
votePublic() {
|
||||
const card = this.currentData();
|
||||
if (card.vote)
|
||||
return card.vote.public
|
||||
return null
|
||||
},
|
||||
voteCountPositive() {
|
||||
const card = this.currentData();
|
||||
if (card.vote && card.vote.positive) return card.vote.positive.length;
|
||||
return null;
|
||||
},
|
||||
voteCountNegative() {
|
||||
const card = this.currentData();
|
||||
if (card.vote && card.vote.negative) return card.vote.negative.length;
|
||||
return null;
|
||||
},
|
||||
isWatching() {
|
||||
const card = this.currentData();
|
||||
return card.findWatcher(Meteor.userId());
|
||||
@@ -90,11 +58,18 @@ BlazeComponent.extendComponent({
|
||||
|
||||
scrollParentContainer() {
|
||||
const cardPanelWidth = 510;
|
||||
const bodyBoardComponent = this.parentComponent().parentComponent();
|
||||
const parentComponent = this.parentComponent();
|
||||
// TODO sometimes parentComponent is not available, maybe because it's not
|
||||
// yet created?!
|
||||
if (!parentComponent) return;
|
||||
const bodyBoardComponent = parentComponent.parentComponent();
|
||||
//On Mobile View Parent is Board, Not Board Body. I cant see how this funciton should work then.
|
||||
if (bodyBoardComponent === null) return;
|
||||
const $cardView = this.$(this.firstNode());
|
||||
const $cardContainer = bodyBoardComponent.$('.js-swimlanes');
|
||||
// TODO sometimes cardContainer is not available, maybe because it's not yet
|
||||
// created?!
|
||||
if (!$cardContainer) return;
|
||||
const cardContainerScroll = $cardContainer.scrollLeft();
|
||||
const cardContainerWidth = $cardContainer.width();
|
||||
|
||||
@@ -149,6 +124,15 @@ BlazeComponent.extendComponent({
|
||||
return result;
|
||||
},
|
||||
|
||||
showVotingButtons() {
|
||||
const card = this.currentData();
|
||||
return (
|
||||
(currentUser.isBoardMember() ||
|
||||
(currentUser && card.voteAllowNonBoardMembers())) &&
|
||||
!card.expiredVote()
|
||||
);
|
||||
},
|
||||
|
||||
onRendered() {
|
||||
if (Meteor.settings.public.CARD_OPENED_WEBHOOK_ENABLED) {
|
||||
// Send Webhook but not create Activities records ---
|
||||
@@ -187,13 +171,6 @@ BlazeComponent.extendComponent({
|
||||
|
||||
if (!Utils.isMiniScreen()) {
|
||||
Meteor.setTimeout(() => {
|
||||
$('.card-details').mCustomScrollbar({
|
||||
theme: 'minimal-dark',
|
||||
setWidth: false,
|
||||
setLeft: 0,
|
||||
scrollbarPosition: 'outside',
|
||||
mouseWheel: true,
|
||||
});
|
||||
this.scrollParentContainer();
|
||||
}, 500);
|
||||
}
|
||||
@@ -232,9 +209,6 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
});
|
||||
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch('.card-checklist-items .js-checklist');
|
||||
|
||||
const $subtasksDom = this.$('.card-subtasks-items');
|
||||
|
||||
$subtasksDom.sortable({
|
||||
@@ -270,26 +244,21 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
});
|
||||
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch('.card-subtasks-items .js-subtasks');
|
||||
|
||||
function userIsMember() {
|
||||
return Meteor.user() && Meteor.user().isBoardMember();
|
||||
}
|
||||
|
||||
// Disable sorting if the current user is not a board member
|
||||
this.autorun(() => {
|
||||
if ($checklistsDom.data('sortable')) {
|
||||
$checklistsDom.sortable('option', 'disabled', !userIsMember());
|
||||
const disabled = !userIsMember() || Utils.isMiniScreen();
|
||||
if (
|
||||
$checklistsDom.data('uiSortable') ||
|
||||
$checklistsDom.data('sortable')
|
||||
) {
|
||||
$checklistsDom.sortable('option', 'disabled', disabled);
|
||||
}
|
||||
if ($subtasksDom.data('sortable')) {
|
||||
$subtasksDom.sortable('option', 'disabled', !userIsMember());
|
||||
}
|
||||
if ($checklistsDom.data('sortable')) {
|
||||
$checklistsDom.sortable('option', 'disabled', Utils.isMiniScreen());
|
||||
}
|
||||
if ($subtasksDom.data('sortable')) {
|
||||
$subtasksDom.sortable('option', 'disabled', Utils.isMiniScreen());
|
||||
if ($subtasksDom.data('uiSortable') || $subtasksDom.data('sortable')) {
|
||||
$subtasksDom.sortable('option', 'disabled', disabled);
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -380,7 +349,7 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
},
|
||||
'click .js-go-to-linked-card'() {
|
||||
Utils.goCardId(this.data().linkedId)
|
||||
Utils.goCardId(this.data().linkedId);
|
||||
},
|
||||
'click .js-member': Popup.open('cardMember'),
|
||||
'click .js-add-members': Popup.open('cardMembers'),
|
||||
@@ -391,7 +360,7 @@ BlazeComponent.extendComponent({
|
||||
'click .js-start-date': Popup.open('editCardStartDate'),
|
||||
'click .js-due-date': Popup.open('editCardDueDate'),
|
||||
'click .js-end-date': Popup.open('editCardEndDate'),
|
||||
'click .js-show-positive-votes':Popup.open('positiveVoteMembers'),
|
||||
'click .js-show-positive-votes': Popup.open('positiveVoteMembers'),
|
||||
'click .js-show-negative-votes': Popup.open('negativeVoteMembers'),
|
||||
'mouseenter .js-card-details'() {
|
||||
const parentComponent = this.parentComponent().parentComponent();
|
||||
@@ -420,9 +389,9 @@ BlazeComponent.extendComponent({
|
||||
const forIt = $(e.target).hasClass('js-vote-positive');
|
||||
let newState = null;
|
||||
if (
|
||||
this.voteState() == null ||
|
||||
(this.voteState() == false && forIt) ||
|
||||
(this.voteState() == true && !forIt)
|
||||
this.data().voteState() === null ||
|
||||
(this.data().voteState() === false && forIt) ||
|
||||
(this.data().voteState() === true && !forIt)
|
||||
) {
|
||||
newState = forIt;
|
||||
}
|
||||
@@ -620,11 +589,6 @@ Template.cardDetailsActionsPopup.events({
|
||||
'click .js-copy-card': Popup.open('copyCard'),
|
||||
'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
|
||||
'click .js-set-card-color': Popup.open('setCardColor'),
|
||||
'click .js-cancel-voting'(event) {
|
||||
event.preventDefault();
|
||||
this.unsetVote();
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-move-card-to-top'(event) {
|
||||
event.preventDefault();
|
||||
const minOrder = _.min(
|
||||
@@ -658,7 +622,7 @@ Template.cardDetailsActionsPopup.events({
|
||||
},
|
||||
});
|
||||
|
||||
Template.editCardTitleForm.onRendered(function () {
|
||||
Template.editCardTitleForm.onRendered(function() {
|
||||
autosize(this.$('.js-edit-card-title'));
|
||||
});
|
||||
|
||||
@@ -672,7 +636,7 @@ Template.editCardTitleForm.events({
|
||||
},
|
||||
});
|
||||
|
||||
Template.editCardRequesterForm.onRendered(function () {
|
||||
Template.editCardRequesterForm.onRendered(function() {
|
||||
autosize(this.$('.js-edit-card-requester'));
|
||||
});
|
||||
|
||||
@@ -685,7 +649,7 @@ Template.editCardRequesterForm.events({
|
||||
},
|
||||
});
|
||||
|
||||
Template.editCardAssignerForm.onRendered(function () {
|
||||
Template.editCardAssignerForm.onRendered(function() {
|
||||
autosize(this.$('.js-edit-card-assigner'));
|
||||
});
|
||||
|
||||
@@ -825,7 +789,7 @@ Template.copyChecklistToManyCardsPopup.events({
|
||||
|
||||
// copy subtasks
|
||||
cursor = Cards.find({ parentId: oldId });
|
||||
cursor.forEach(function () {
|
||||
cursor.forEach(function() {
|
||||
'use strict';
|
||||
const subtask = arguments[0];
|
||||
subtask.parentId = _id;
|
||||
@@ -976,7 +940,23 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
'click .js-delete': Popup.afterConfirm('cardDelete', function() {
|
||||
Popup.close();
|
||||
Cards.remove(this._id);
|
||||
// verify that there are no linked cards
|
||||
if (Cards.find({ linkedId: this._id }).count() === 0) {
|
||||
Cards.remove(this._id);
|
||||
} else {
|
||||
// TODO: Maybe later we can list where the linked cards are.
|
||||
// Now here is popup with a hint that the card cannot be deleted
|
||||
// as there are linked cards.
|
||||
// Related:
|
||||
// client/components/lists/listHeader.js about line 248
|
||||
// https://github.com/wekan/wekan/issues/2785
|
||||
const message = `${TAPi18n.__(
|
||||
'delete-linked-card-before-this-card',
|
||||
)} linkedId: ${
|
||||
this._id
|
||||
} at client/components/cards/cardDetails.js and https://github.com/wekan/wekan/issues/2785`;
|
||||
alert(message);
|
||||
}
|
||||
Utils.goBoardId(this.boardId);
|
||||
}),
|
||||
'change .js-field-parent-board'(event) {
|
||||
@@ -1009,22 +989,93 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-end-date': Popup.open('editVoteEndDate'),
|
||||
'submit .edit-vote-question'(evt) {
|
||||
evt.preventDefault();
|
||||
const voteQuestion = evt.target.vote.value;
|
||||
const publicVote = $('#vote-public').hasClass('is-checked');
|
||||
this.currentCard.setVoteQuestion(voteQuestion, publicVote);
|
||||
const allowNonBoardMembers = $('#vote-allow-non-members').hasClass(
|
||||
'is-checked',
|
||||
);
|
||||
const endString = this.currentCard.getVoteEnd();
|
||||
|
||||
this.currentCard.setVoteQuestion(
|
||||
voteQuestion,
|
||||
publicVote,
|
||||
allowNonBoardMembers,
|
||||
);
|
||||
if (endString) {
|
||||
this.currentCard.setVoteEnd(endString);
|
||||
}
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-remove-vote': Popup.afterConfirm('deleteVote', () => {
|
||||
event.preventDefault();
|
||||
this.currentCard.unsetVote();
|
||||
Popup.close();
|
||||
}),
|
||||
'click a.js-toggle-vote-public'(event) {
|
||||
event.preventDefault();
|
||||
$('#vote-public').toggleClass('is-checked');
|
||||
},
|
||||
'click a.js-toggle-vote-allow-non-members'(event) {
|
||||
event.preventDefault();
|
||||
$('#vote-allow-non-members').toggleClass('is-checked');
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('cardStartVotingPopup');
|
||||
|
||||
// editVoteEndDatePopup
|
||||
(class extends DatePicker {
|
||||
onCreated() {
|
||||
super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
|
||||
this.data().getVoteEnd() && this.date.set(moment(this.data().getVoteEnd()));
|
||||
}
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'submit .edit-date'(evt) {
|
||||
evt.preventDefault();
|
||||
|
||||
// if no time was given, init with 12:00
|
||||
const time =
|
||||
evt.target.time.value ||
|
||||
moment(new Date().setHours(12, 0, 0)).format('LT');
|
||||
|
||||
const dateString = `${evt.target.date.value} ${time}`;
|
||||
const newDate = moment(dateString, 'L LT', true);
|
||||
if (newDate.isValid()) {
|
||||
// if active vote - store it
|
||||
if (this.currentData().getVoteQuestion()) {
|
||||
this._storeDate(newDate.toDate());
|
||||
Popup.close();
|
||||
} else {
|
||||
this.currentData().vote = { end: newDate.toDate() }; // set vote end temp
|
||||
Popup.back();
|
||||
}
|
||||
} else {
|
||||
this.error.set('invalid-date');
|
||||
evt.target.date.focus();
|
||||
}
|
||||
},
|
||||
'click .js-delete-date'(evt) {
|
||||
evt.preventDefault();
|
||||
this._deleteDate();
|
||||
Popup.close();
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
_storeDate(newDate) {
|
||||
this.card.setVoteEnd(newDate);
|
||||
}
|
||||
_deleteDate() {
|
||||
this.card.unsetVoteEnd();
|
||||
}
|
||||
}.register('editVoteEndDatePopup'));
|
||||
|
||||
// Close the card details pane by pressing escape
|
||||
EscapeActions.register(
|
||||
'detailsPane',
|
||||
|
||||
@@ -10,6 +10,9 @@ avatar-radius = 50%
|
||||
left: -2000px
|
||||
top: 0px
|
||||
|
||||
#clipboard
|
||||
white-space: normal
|
||||
|
||||
.assignee
|
||||
border-radius: 3px
|
||||
display: block
|
||||
@@ -37,6 +40,8 @@ avatar-radius = 50%
|
||||
position: absolute
|
||||
|
||||
&.avatar-image
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
height: 100%
|
||||
width: @height
|
||||
|
||||
@@ -99,10 +104,6 @@ avatar-radius = 50%
|
||||
.mCustomScrollBox
|
||||
padding-left: 0
|
||||
|
||||
.ps-scrollbar-y-rail
|
||||
pointer-event: all
|
||||
position: absolute
|
||||
|
||||
.card-details-canvas
|
||||
width: 470px
|
||||
padding-left: 20px
|
||||
@@ -337,6 +338,11 @@ card-details-color(background, color...)
|
||||
.vote-title
|
||||
display: flex
|
||||
justify-content: space-between
|
||||
|
||||
.js-edit-date
|
||||
align-self: baseline
|
||||
margin-left: 5px
|
||||
|
||||
.vote-result
|
||||
display: flex
|
||||
.js-show-positive-votes
|
||||
|
||||
@@ -1,7 +1,17 @@
|
||||
template(name="checklists")
|
||||
h3
|
||||
i.fa.fa-check
|
||||
| {{_ 'checklists'}}
|
||||
.checklists-title
|
||||
h3
|
||||
i.fa.fa-check
|
||||
| {{_ 'checklists'}}
|
||||
if currentUser.isBoardMember
|
||||
.material-toggle-switch
|
||||
span.toggle-switch-title {{_ 'hide-checked-items'}}
|
||||
if hideCheckedItems
|
||||
input.toggle-switch(type="checkbox" id="toggleHideCheckedItemsButton" checked="checked")
|
||||
else
|
||||
input.toggle-switch(type="checkbox" id="toggleHideCheckedItemsButton")
|
||||
label.toggle-label(for="toggleHideCheckedItemsButton")
|
||||
|
||||
if toggleDeleteDialog.get
|
||||
.board-overlay#card-details-overlay
|
||||
+checklistDeleteDialog(checklist = checklistToDelete)
|
||||
@@ -86,7 +96,7 @@ template(name="checklistItems")
|
||||
| {{_ 'add-checklist-item'}}...
|
||||
|
||||
template(name='checklistItemDetail')
|
||||
.js-checklist-item.checklist-item
|
||||
.js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if hideCheckedItems}} invisible{{/if}}{{/if}}")
|
||||
if canModifyCard
|
||||
.check-box-container
|
||||
.check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const { calculateIndexData, enableClickOnTouch } = Utils;
|
||||
const { calculateIndexData, capitalize } = Utils;
|
||||
|
||||
function initSorting(items) {
|
||||
items.sortable({
|
||||
@@ -36,9 +36,6 @@ function initSorting(items) {
|
||||
checklistItem.move(checklistId, sortIndex.base);
|
||||
},
|
||||
});
|
||||
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch('.js-checklist-item:not(.placeholder)');
|
||||
}
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
@@ -54,14 +51,15 @@ BlazeComponent.extendComponent({
|
||||
return Meteor.user() && Meteor.user().isBoardMember();
|
||||
}
|
||||
|
||||
// Disable sorting if the current user is not a board member
|
||||
// Disable sorting if the current user is not a board member or is a miniscreen
|
||||
self.autorun(() => {
|
||||
const $itemsDom = $(self.itemsDom);
|
||||
if ($itemsDom.data('sortable')) {
|
||||
$(self.itemsDom).sortable('option', 'disabled', !userIsMember());
|
||||
}
|
||||
if ($itemsDom.data('sortable')) {
|
||||
$(self.itemsDom).sortable('option', 'disabled', Utils.isMiniScreen());
|
||||
if ($itemsDom.data('uiSortable') || $itemsDom.data('sortable')) {
|
||||
$(self.itemsDom).sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
!userIsMember() || Utils.isMiniScreen(),
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -177,6 +175,16 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
},
|
||||
|
||||
focusChecklistItem(event) {
|
||||
// If a new checklist is created, pre-fill the title and select it.
|
||||
const checklist = this.currentData().checklist;
|
||||
if (!checklist) {
|
||||
const textarea = event.target;
|
||||
textarea.value = capitalize(TAPi18n.__('r-checklist'));
|
||||
textarea.select();
|
||||
}
|
||||
},
|
||||
|
||||
events() {
|
||||
const events = {
|
||||
'click .toggle-delete-checklist-dialog'(event) {
|
||||
@@ -185,6 +193,9 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get());
|
||||
},
|
||||
'click #toggleHideCheckedItemsButton'() {
|
||||
Meteor.call('toggleHideCheckedItems');
|
||||
},
|
||||
};
|
||||
|
||||
return [
|
||||
@@ -196,12 +207,21 @@ BlazeComponent.extendComponent({
|
||||
'submit .js-edit-checklist-item': this.editChecklistItem,
|
||||
'click .js-delete-checklist-item': this.deleteItem,
|
||||
'click .confirm-checklist-delete': this.deleteChecklist,
|
||||
'focus .js-add-checklist-item': this.focusChecklistItem,
|
||||
keydown: this.pressKey,
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('checklists');
|
||||
|
||||
Template.checklists.helpers({
|
||||
hideCheckedItems() {
|
||||
const currentUser = Meteor.user();
|
||||
if (currentUser) return currentUser.hasHideCheckedItems();
|
||||
return false;
|
||||
},
|
||||
});
|
||||
|
||||
Template.checklistDeleteDialog.onCreated(() => {
|
||||
const $cardDetails = this.$('.card-details');
|
||||
this.scrollState = {
|
||||
@@ -237,6 +257,11 @@ Template.checklistItemDetail.helpers({
|
||||
!Meteor.user().isWorker()
|
||||
);
|
||||
},
|
||||
hideCheckedItems() {
|
||||
const user = Meteor.user();
|
||||
if (user) return user.hasHideCheckedItems();
|
||||
return false;
|
||||
},
|
||||
});
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
|
||||
@@ -16,6 +16,10 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
|
||||
&:hover
|
||||
color: inherit
|
||||
|
||||
.checklists-title
|
||||
display: flex
|
||||
justify-content: space-between
|
||||
|
||||
.checklist-title
|
||||
.checkbox
|
||||
float: left
|
||||
@@ -99,6 +103,17 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
|
||||
margin-top: 3px
|
||||
display: flex
|
||||
background: darken(white, 3%)
|
||||
opacity: 1
|
||||
transition: height 0ms 400ms, opacity 400ms 0ms
|
||||
height: auto
|
||||
overflow: hidden
|
||||
|
||||
&.is-checked.invisible
|
||||
opacity: 0
|
||||
height: 0
|
||||
transition: height 0ms 0ms, opacity 600ms 0ms
|
||||
margin-top: 0
|
||||
margin-bottom: 0
|
||||
|
||||
&.placeholder
|
||||
background: darken(white, 20%)
|
||||
@@ -128,6 +143,7 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
|
||||
&.is-checked
|
||||
color: #8c8c8c
|
||||
font-style: italic
|
||||
text-decoration: line-through
|
||||
& .viewer
|
||||
p
|
||||
margin-bottom: 2px
|
||||
|
||||
@@ -4,8 +4,8 @@ template(name="minicard")
|
||||
class="{{#if isLinkedBoard}}linked-board{{/if}}"
|
||||
class="minicard-{{colorClass}}")
|
||||
if isMiniScreen
|
||||
//.handle
|
||||
// .fa.fa-arrows
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
unless isMiniScreen
|
||||
if showDesktopDragHandles
|
||||
.handle
|
||||
@@ -74,8 +74,12 @@ template(name="minicard")
|
||||
+viewer
|
||||
= definition.name
|
||||
.minicard-custom-field-item
|
||||
+viewer
|
||||
= trueValue
|
||||
if $eq definition.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(definition)
|
||||
else
|
||||
+viewer
|
||||
= trueValue
|
||||
|
||||
if getAssignees
|
||||
.minicard-assignees.js-minicard-assignees
|
||||
@@ -102,8 +106,10 @@ template(name="minicard")
|
||||
span.badge-icon.fa.fa-align-left
|
||||
if getVoteQuestion
|
||||
.badge.badge-state-image-only(title=getVoteQuestion)
|
||||
span.badge-icon.fa.fa-thumbs-up
|
||||
span.badge-icon.fa.fa-thumbs-down
|
||||
span.badge-icon.fa.fa-thumbs-up(class="{{#if voteState}}text-green{{/if}}")
|
||||
span.badge-text {{ voteCountPositive }}
|
||||
span.badge-icon.fa.fa-thumbs-down(class="{{#if $eq voteState false}}text-red{{/if}}")
|
||||
span.badge-text {{ voteCountNegative }}
|
||||
if attachments.count
|
||||
.badge
|
||||
span.badge-icon.fa.fa-paperclip
|
||||
|
||||
@@ -9,6 +9,20 @@ BlazeComponent.extendComponent({
|
||||
return 'minicard';
|
||||
},
|
||||
|
||||
formattedCurrencyCustomFieldValue(definition) {
|
||||
const customField = this.data()
|
||||
.customFieldsWD()
|
||||
.find(f => f._id === definition._id);
|
||||
const customFieldTrueValue =
|
||||
customField && customField.trueValue ? customField.trueValue : '';
|
||||
|
||||
const locale = TAPi18n.getLanguage();
|
||||
return new Intl.NumberFormat(locale, {
|
||||
style: 'currency',
|
||||
currency: definition.settings.currencyCode,
|
||||
}).format(customFieldTrueValue);
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
|
||||
@@ -87,7 +87,9 @@
|
||||
width: 11px
|
||||
height: @width
|
||||
border-radius: 2px
|
||||
margin-left: 3px
|
||||
margin-right: 3px
|
||||
margin-bottom: 3px
|
||||
|
||||
.minicard-custom-fields
|
||||
display:block;
|
||||
.minicard-custom-field
|
||||
@@ -299,3 +301,8 @@ minicard-color(background, color...)
|
||||
|
||||
.minicard-indigo
|
||||
minicard-color(#4b0082, #ffffff) //White text for better visibility
|
||||
|
||||
.text-red
|
||||
color:red
|
||||
.text-green
|
||||
color:green
|
||||
@@ -0,0 +1,37 @@
|
||||
export function getMembersToMap(data) {
|
||||
// we will work on the list itself (an ordered array of objects) when a
|
||||
// mapping is done, we add a 'wekan' field to the object representing the
|
||||
// imported member
|
||||
|
||||
const membersToMap = [];
|
||||
const importedMembers = [];
|
||||
let membersIndex;
|
||||
|
||||
for (let i = 0; i < data[0].length; i++) {
|
||||
if (data[0][i].toLowerCase() === 'members') {
|
||||
membersIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 1; i < data.length; i++) {
|
||||
if (data[i][membersIndex]) {
|
||||
for (const importedMember of data[i][membersIndex].split(' ')) {
|
||||
if (importedMember && importedMembers.indexOf(importedMember) === -1) {
|
||||
importedMembers.push(importedMember);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let importedMember of importedMembers) {
|
||||
importedMember = {
|
||||
username: importedMember,
|
||||
id: importedMember,
|
||||
};
|
||||
const wekanUser = Users.findOne({ username: importedMember.username });
|
||||
if (wekanUser) importedMember.wekanId = wekanUser._id;
|
||||
membersToMap.push(importedMember);
|
||||
}
|
||||
|
||||
return membersToMap;
|
||||
}
|
||||
@@ -13,7 +13,7 @@ template(name="import")
|
||||
template(name="importTextarea")
|
||||
form
|
||||
p: label(for='import-textarea') {{_ instruction}} {{_ 'import-board-instruction-about-errors'}}
|
||||
textarea.js-import-json(placeholder="{{_ 'import-json-placeholder'}}" autofocus)
|
||||
textarea.js-import-json(placeholder="{{_ importPlaceHolder}}" autofocus)
|
||||
| {{jsonText}}
|
||||
input.primary.wide(type="submit" value="{{_ 'import'}}")
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import trelloMembersMapper from './trelloMembersMapper';
|
||||
import wekanMembersMapper from './wekanMembersMapper';
|
||||
import csvMembersMapper from './csvMembersMapper';
|
||||
|
||||
const Papa = require('papaparse');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
title() {
|
||||
@@ -30,20 +33,30 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
},
|
||||
|
||||
importData(evt) {
|
||||
importData(evt, dataSource) {
|
||||
evt.preventDefault();
|
||||
const dataJson = this.find('.js-import-json').value;
|
||||
try {
|
||||
const dataObject = JSON.parse(dataJson);
|
||||
this.setError('');
|
||||
this.importedData.set(dataObject);
|
||||
const membersToMap = this._prepareAdditionalData(dataObject);
|
||||
// store members data and mapping in Session
|
||||
// (we go deep and 2-way, so storing in data context is not a viable option)
|
||||
const input = this.find('.js-import-json').value;
|
||||
if (dataSource === 'csv') {
|
||||
const csv = input.indexOf('\t') > 0 ? input.replace(/(\t)/g, ',') : input;
|
||||
const ret = Papa.parse(csv);
|
||||
if (ret && ret.data && ret.data.length) this.importedData.set(ret.data);
|
||||
else throw new Meteor.Error('error-csv-schema');
|
||||
const membersToMap = this._prepareAdditionalData(ret.data);
|
||||
this.membersToMap.set(membersToMap);
|
||||
this.nextStep();
|
||||
} catch (e) {
|
||||
this.setError('error-json-malformed');
|
||||
} else {
|
||||
try {
|
||||
const dataObject = JSON.parse(input);
|
||||
this.setError('');
|
||||
this.importedData.set(dataObject);
|
||||
const membersToMap = this._prepareAdditionalData(dataObject);
|
||||
// store members data and mapping in Session
|
||||
// (we go deep and 2-way, so storing in data context is not a viable option)
|
||||
this.membersToMap.set(membersToMap);
|
||||
this.nextStep();
|
||||
} catch (e) {
|
||||
this.setError('error-json-malformed');
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -91,6 +104,9 @@ BlazeComponent.extendComponent({
|
||||
case 'wekan':
|
||||
membersToMap = wekanMembersMapper.getMembersToMap(dataObject);
|
||||
break;
|
||||
case 'csv':
|
||||
membersToMap = csvMembersMapper.getMembersToMap(dataObject);
|
||||
break;
|
||||
}
|
||||
return membersToMap;
|
||||
},
|
||||
@@ -109,11 +125,23 @@ BlazeComponent.extendComponent({
|
||||
return `import-board-instruction-${Session.get('importSource')}`;
|
||||
},
|
||||
|
||||
importPlaceHolder() {
|
||||
const importSource = Session.get('importSource');
|
||||
if (importSource === 'csv') {
|
||||
return 'import-csv-placeholder';
|
||||
} else {
|
||||
return 'import-json-placeholder';
|
||||
}
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
submit(evt) {
|
||||
return this.parentComponent().importData(evt);
|
||||
return this.parentComponent().importData(
|
||||
evt,
|
||||
Session.get('importSource'),
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
const { calculateIndex } = Utils;
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
// Proxy
|
||||
@@ -74,18 +74,16 @@ BlazeComponent.extendComponent({
|
||||
const sortIndex = calculateIndex(prevCardDom, nextCardDom, nCards);
|
||||
const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
let swimlaneId = '';
|
||||
const defaultSwimlaneId = currentBoard.getDefaultSwimline()._id;
|
||||
let targetSwimlaneId = null;
|
||||
|
||||
// only set a new swimelane ID if the swimlanes view is active
|
||||
if (
|
||||
Utils.boardView() === 'board-view-swimlanes' ||
|
||||
currentBoard.isTemplatesBoard()
|
||||
)
|
||||
swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
|
||||
else if (
|
||||
Utils.boardView() === 'board-view-lists' ||
|
||||
Utils.boardView() === 'board-view-cal' ||
|
||||
!Utils.boardView
|
||||
)
|
||||
swimlaneId = currentBoard.getDefaultSwimline()._id;
|
||||
targetSwimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))
|
||||
._id;
|
||||
|
||||
// Normally the jquery-ui sortable library moves the dragged DOM element
|
||||
// to its new position, which disrupts Blaze reactive updates mechanism
|
||||
@@ -98,9 +96,12 @@ BlazeComponent.extendComponent({
|
||||
|
||||
if (MultiSelection.isActive()) {
|
||||
Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => {
|
||||
const newSwimlaneId = targetSwimlaneId
|
||||
? targetSwimlaneId
|
||||
: card.swimlaneId || defaultSwimlaneId;
|
||||
card.move(
|
||||
currentBoard._id,
|
||||
swimlaneId,
|
||||
newSwimlaneId,
|
||||
listId,
|
||||
sortIndex.base + i * sortIndex.increment,
|
||||
);
|
||||
@@ -108,15 +109,15 @@ BlazeComponent.extendComponent({
|
||||
} else {
|
||||
const cardDomElement = ui.item.get(0);
|
||||
const card = Blaze.getData(cardDomElement);
|
||||
card.move(currentBoard._id, swimlaneId, listId, sortIndex.base);
|
||||
const newSwimlaneId = targetSwimlaneId
|
||||
? targetSwimlaneId
|
||||
: card.swimlaneId || defaultSwimlaneId;
|
||||
card.move(currentBoard._id, newSwimlaneId, listId, sortIndex.base);
|
||||
}
|
||||
boardComponent.setIsDragging(false);
|
||||
},
|
||||
});
|
||||
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch(itemsSelector);
|
||||
|
||||
this.autorun(() => {
|
||||
let showDesktopDragHandles = false;
|
||||
currentUser = Meteor.user();
|
||||
@@ -129,7 +130,7 @@ BlazeComponent.extendComponent({
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
|
||||
if (!Utils.isMiniScreen() && showDesktopDragHandles) {
|
||||
if (Utils.isMiniScreen() || showDesktopDragHandles) {
|
||||
$cards.sortable({
|
||||
handle: '.handle',
|
||||
});
|
||||
@@ -139,27 +140,16 @@ BlazeComponent.extendComponent({
|
||||
});
|
||||
}
|
||||
|
||||
if ($cards.data('sortable')) {
|
||||
if ($cards.data('uiSortable') || $cards.data('sortable')) {
|
||||
$cards.sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
// Disable drag-dropping when user is not member/is miniscreen
|
||||
// Disable drag-dropping when user is not member
|
||||
!userIsMember(),
|
||||
// Not disable drag-dropping while in multi-selection mode
|
||||
// MultiSelection.isActive() || !userIsMember(),
|
||||
);
|
||||
}
|
||||
|
||||
if ($cards.data('sortable')) {
|
||||
$cards.sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
// Disable drag-dropping when user is not member/is miniscreen
|
||||
Utils.isMiniScreen(),
|
||||
// Not disable drag-dropping while in multi-selection mode
|
||||
// MultiSelection.isActive() || !userIsMember(),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
// We want to re-run this function any time a card is added.
|
||||
|
||||
@@ -43,9 +43,6 @@
|
||||
background: white
|
||||
margin: -3px 0 8px
|
||||
|
||||
.list-header-card-count
|
||||
height: 35px
|
||||
|
||||
.list-header-add
|
||||
flex: 0 0 auto
|
||||
padding: 20px 12px 4px
|
||||
@@ -60,6 +57,9 @@
|
||||
background-color: #e4e4e4;
|
||||
border-bottom: 6px solid #e4e4e4;
|
||||
|
||||
&.list-header-card-count
|
||||
min-height: 35px
|
||||
height: auto
|
||||
|
||||
&.ui-sortable-handle
|
||||
cursor: grab
|
||||
@@ -120,9 +120,6 @@
|
||||
form
|
||||
margin-bottom: 9px
|
||||
|
||||
.ps-scrollbar-y-rail
|
||||
transform: translateX(2px)
|
||||
|
||||
.open-minicard-composer
|
||||
border-radius: 2px
|
||||
color: #8c8c8c
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
template(name="listBody")
|
||||
.list-body.js-perfect-scrollbar
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.count
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
@@ -106,7 +106,7 @@ template(name="searchElementPopup")
|
||||
option(value="{{_id}}") {{title}}
|
||||
form.js-search-term-form
|
||||
input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
|
||||
.list-body.js-perfect-scrollbar.search-card-results
|
||||
.list-body.search-card-results
|
||||
.minicards.clearfix.js-minicards
|
||||
if isBoardTemplateSearch
|
||||
each results
|
||||
|
||||
@@ -8,7 +8,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
mixins() {
|
||||
return [Mixins.PerfectScrollbar];
|
||||
return [];
|
||||
},
|
||||
|
||||
openForm(options) {
|
||||
@@ -77,7 +77,7 @@ BlazeComponent.extendComponent({
|
||||
else if (
|
||||
Utils.boardView() === 'board-view-lists' ||
|
||||
Utils.boardView() === 'board-view-cal' ||
|
||||
!Utils.boardView
|
||||
!Utils.boardView()
|
||||
)
|
||||
swimlaneId = board.getDefaultSwimline()._id;
|
||||
|
||||
@@ -523,7 +523,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
mixins() {
|
||||
return [Mixins.PerfectScrollbar];
|
||||
return [];
|
||||
},
|
||||
|
||||
onCreated() {
|
||||
@@ -658,10 +658,7 @@ BlazeComponent.extendComponent({
|
||||
_id = element.copy(this.boardId, this.swimlaneId, this.listId);
|
||||
// 1.B Linked card
|
||||
} else {
|
||||
delete element._id;
|
||||
element.type = 'cardType-linkedCard';
|
||||
element.linkedId = element.linkedId || element._id;
|
||||
_id = Cards.insert(element);
|
||||
_id = element.link(this.boardId, this.swimlaneId, this.listId);
|
||||
}
|
||||
Filter.addException(_id);
|
||||
// List insertion
|
||||
@@ -675,7 +672,7 @@ BlazeComponent.extendComponent({
|
||||
element.sort = Boards.findOne(this.boardId)
|
||||
.swimlanes()
|
||||
.count();
|
||||
element.type = 'swimlalne';
|
||||
element.type = 'swimlane';
|
||||
_id = element.copy(this.boardId);
|
||||
} else if (this.isBoardTemplateSearch) {
|
||||
board = Boards.findOne(element.linkedId);
|
||||
@@ -724,7 +721,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
onRendered() {
|
||||
this.spinner = this.find('.sk-spinner-list');
|
||||
this.container = this.$(this.spinner).parents('.js-perfect-scrollbar')[0];
|
||||
this.container = this.$(this.spinner).parents('.list-body')[0];
|
||||
|
||||
$(this.container).on(
|
||||
`scroll.spinner_${this.swimlaneId}_${this.listId}`,
|
||||
|
||||
@@ -30,10 +30,9 @@ template(name="listHeader")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-icon
|
||||
a.fa.fa-navicon.js-open-list-menu
|
||||
//a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
else
|
||||
a.list-header-menu-icon.fa.fa-angle-right.js-select-list
|
||||
//a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
else if currentUser.isBoardMember
|
||||
if isWatching
|
||||
i.list-header-watch-icon.fa.fa-eye
|
||||
|
||||
@@ -223,8 +223,35 @@ BlazeComponent.extendComponent({
|
||||
Template.listMorePopup.events({
|
||||
'click .js-delete': Popup.afterConfirm('listDelete', function() {
|
||||
Popup.close();
|
||||
this.allCards().map(card => Cards.remove(card._id));
|
||||
Lists.remove(this._id);
|
||||
// TODO how can we avoid the fetch call?
|
||||
const allCards = this.allCards().fetch();
|
||||
const allCardIds = _.pluck(allCards, '_id');
|
||||
// it's okay if the linked cards are on the same list
|
||||
if (
|
||||
Cards.find({
|
||||
$and: [
|
||||
{ listId: { $ne: this._id } },
|
||||
{ linkedId: { $in: allCardIds } },
|
||||
],
|
||||
}).count() === 0
|
||||
) {
|
||||
allCardIds.map(_id => Cards.remove(_id));
|
||||
Lists.remove(this._id);
|
||||
} else {
|
||||
// TODO: Figure out more informative message.
|
||||
// Popup with a hint that the list cannot be deleted as there are
|
||||
// linked cards. We can adapt the query above so we can list the linked
|
||||
// cards.
|
||||
// Related:
|
||||
// client/components/cards/cardDetails.js about line 969
|
||||
// https://github.com/wekan/wekan/issues/2785
|
||||
const message = `${TAPi18n.__(
|
||||
'delete-linked-cards-before-this-list',
|
||||
)} linkedId: ${
|
||||
this._id
|
||||
} at client/components/lists/listHeader.js and https://github.com/wekan/wekan/issues/2785`;
|
||||
alert(message);
|
||||
}
|
||||
Utils.goBoardId(this.boardId);
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -330,7 +330,7 @@ Template.viewer.events({
|
||||
// the corresponding text). Clicking a link shouldn't fire these actions, stop
|
||||
// we stop these event at the viewer component level.
|
||||
'click a'(event, templateInstance) {
|
||||
let prevent = true;
|
||||
const prevent = true;
|
||||
const userId = event.currentTarget.dataset.userid;
|
||||
if (userId) {
|
||||
Popup.open('member').call({ userId }, event, templateInstance);
|
||||
|
||||
@@ -15,3 +15,27 @@
|
||||
local('Roboto-Bold'),
|
||||
url('/fonts/roboto-bold.woff2') format('woff2'),
|
||||
url('/fonts/roboto-bold.woff') format('woff')
|
||||
|
||||
@font-face
|
||||
font-family: 'Poppins'
|
||||
font-style: normal
|
||||
font-weight: 400
|
||||
src: local('Poppins'),
|
||||
local('Poppins-Regular'),
|
||||
url('/fonts/poppins-regular.woff') format('woff')
|
||||
|
||||
@font-face
|
||||
font-family: 'Poppins'
|
||||
font-style: normal
|
||||
font-weight: 500
|
||||
src: local('Poppins Medium'),
|
||||
local('Poppins-Medium'),
|
||||
url('/fonts/poppins-medium.woff') format('woff')
|
||||
|
||||
@font-face
|
||||
font-family: 'Poppins'
|
||||
font-style: normal
|
||||
font-weight: 700
|
||||
src: local('Poppins Bold'),
|
||||
local('Poppins-Bold'),
|
||||
url('/fonts/poppins-bold.woff') format('woff')
|
||||
@@ -175,7 +175,7 @@
|
||||
.board-header-btn
|
||||
height: 32px
|
||||
line-height: @height
|
||||
font-size: 16px
|
||||
font-size: 15px
|
||||
|
||||
i.fa
|
||||
line-height: 32px
|
||||
|
||||
@@ -6,10 +6,16 @@ head
|
||||
where the application is deployed with a path prefix, but it seems to be
|
||||
difficult to do that cleanly with Blaze -- at least without adding extra
|
||||
packages.
|
||||
link(rel="shortcut icon" href="/wekan-favicon.png")
|
||||
link(rel="apple-touch-icon" href="/wekan-favicon.png")
|
||||
link(rel="mask-icon" href="/wekan-logo-150.svg")
|
||||
link(rel="manifest" href="/wekan-manifest.json")
|
||||
link(rel="shortcut icon" type="image/x-icon" href="/favicon.ico")
|
||||
link(rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png")
|
||||
link(rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png")
|
||||
link(rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png")
|
||||
link(rel="manifest" href="/site.webmanifest")
|
||||
link(rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5")
|
||||
meta(name="apple-mobile-web-app-title" content="Wekan")
|
||||
meta(name="application-name" content="Wekan")
|
||||
meta(name="msapplication-TileColor" content="#00aba9")
|
||||
meta(name="theme-color" content="#ffffff")
|
||||
|
||||
template(name="userFormsLayout")
|
||||
section.auth-layout
|
||||
|
||||
@@ -32,7 +32,7 @@ a:hover,a:focus
|
||||
border-radius: unset
|
||||
|
||||
html, body, input, select, textarea, button
|
||||
font: 14px Roboto, "Helvetica Neue", Arial, Helvetica, sans-serif
|
||||
font: 14px Roboto, Poppins, "Helvetica Neue", Arial, Helvetica, sans-serif
|
||||
line-height: 18px
|
||||
color: #4d4d4d
|
||||
|
||||
|
||||
@@ -107,11 +107,6 @@ $popupWidth = 300px
|
||||
padding: 8px 4px 8px 10px
|
||||
margin-right: 8px
|
||||
|
||||
&::-webkit-scrollbar-button
|
||||
display: block
|
||||
height: 4px
|
||||
width: 4px
|
||||
|
||||
.at-form
|
||||
.at-error, .at-result
|
||||
padding: 8px 12px
|
||||
@@ -135,6 +130,10 @@ $popupWidth = 300px
|
||||
margin-bottom: 8px
|
||||
|
||||
.pop-over-list
|
||||
li
|
||||
display: block
|
||||
clear: both
|
||||
|
||||
li > a
|
||||
clear: both
|
||||
cursor: pointer
|
||||
@@ -316,6 +315,7 @@ $popupWidth = 300px
|
||||
input[type="file"]
|
||||
margin: 4px 0 12px
|
||||
width: 100%
|
||||
box-sizing: border-box
|
||||
|
||||
.pop-over-list
|
||||
li > a
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
const { isTouchDevice } = Utils;
|
||||
|
||||
Mixins.PerfectScrollbar = BlazeComponent.extendComponent({
|
||||
onRendered() {
|
||||
if (!isTouchDevice()) {
|
||||
const component = this.mixinParent();
|
||||
const domElement = component.find('.js-perfect-scrollbar');
|
||||
Ps.initialize(domElement);
|
||||
|
||||
// XXX We should create an event map to be consistent with other components
|
||||
// but since BlazeComponent doesn't merge Mixins events transparently I
|
||||
// prefered to use a jQuery event (which is what an event map ends up doing)
|
||||
component.$(domElement).on('mouseenter', () => Ps.update(domElement));
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -1,2 +0,0 @@
|
||||
.ps-container
|
||||
position: relative
|
||||
@@ -68,8 +68,8 @@ BlazeComponent.extendComponent({
|
||||
const ruleName = this.data().ruleName.get();
|
||||
const trigger = this.data().triggerVar.get();
|
||||
const actionSelected = this.find('#move-spec-action').value;
|
||||
const swimlaneName = this.find('#swimlaneName').value;
|
||||
const listName = this.find('#listName').value;
|
||||
const swimlaneName = this.find('#swimlaneName').value || '*';
|
||||
const listName = this.find('#listName').value || '*';
|
||||
const boardId = Session.get('currentBoard');
|
||||
const destBoardId = this.find('#board-id').value;
|
||||
const desc = Utils.getTriggerActionDesc(event, this);
|
||||
|
||||
@@ -75,7 +75,7 @@ template(name="cardActions")
|
||||
button.trigger-button.trigger-button-color.js-show-color-palette(
|
||||
id="color-action"
|
||||
class="card-details-{{cardColorButton}}")
|
||||
| {{{_ cardColorButtonText }}}
|
||||
| {{_ cardColorButtonText }}
|
||||
div.trigger-button.js-set-color-action.js-goto-rules
|
||||
i.fa.fa-plus
|
||||
|
||||
|
||||
@@ -164,6 +164,7 @@ BlazeComponent.extendComponent({
|
||||
const boardId = Session.get('currentBoard');
|
||||
const actionId = Actions.insert({
|
||||
actionType: 'removeMember',
|
||||
// deepcode ignore NoHardcodedCredentials: it's no credential
|
||||
username: '*',
|
||||
boardId,
|
||||
desc,
|
||||
|
||||
@@ -6,10 +6,14 @@ template(name="ruleDetails")
|
||||
.triggers-content
|
||||
.triggers-body
|
||||
.triggers-main-body
|
||||
h4
|
||||
| {{_ 'r-trigger'}}
|
||||
div.trigger-item
|
||||
div.trigger-content
|
||||
div.trigger-text
|
||||
= trigger
|
||||
= trigger
|
||||
h4
|
||||
| {{_ 'r-action'}}
|
||||
div.trigger-item
|
||||
div.trigger-content
|
||||
div.trigger-text
|
||||
|
||||
@@ -9,7 +9,7 @@ template(name="sidebar")
|
||||
a.board-header-btn.js-shortcuts
|
||||
i.fa.fa-keyboard-o
|
||||
span {{_ 'keyboard-shortcuts' }}
|
||||
.sidebar-content.js-board-sidebar-content.js-perfect-scrollbar
|
||||
.sidebar-content.js-board-sidebar-content
|
||||
//a.hide-btn.js-hide-sidebar
|
||||
// i.fa.fa-navicon
|
||||
unless isDefaultView
|
||||
@@ -230,6 +230,8 @@ template(name="chooseBoardSource")
|
||||
a(href="{{pathFor '/import/trello'}}") {{_ 'from-trello'}}
|
||||
li
|
||||
a(href="{{pathFor '/import/wekan'}}") {{_ 'from-wekan'}}
|
||||
li
|
||||
a(href="{{pathFor '/import/csv'}}") {{_ 'from-csv'}}
|
||||
|
||||
template(name="archiveBoardPopup")
|
||||
p {{_ 'close-board-pop'}}
|
||||
@@ -300,7 +302,7 @@ template(name="boardMenuPopup")
|
||||
ul.pop-over-list
|
||||
if withApi
|
||||
li
|
||||
a(href="{{exportUrl}}", download="{{exportFilename}}")
|
||||
a.js-export-board
|
||||
i.fa.fa-share-alt
|
||||
| {{_ 'export-board'}}
|
||||
li
|
||||
@@ -327,12 +329,10 @@ template(name="boardMenuPopup")
|
||||
if isSandstorm
|
||||
hr
|
||||
ul.pop-over-list
|
||||
if withApi
|
||||
li
|
||||
a(href="{{exportUrl}}", download="{{exportFilename}}")
|
||||
i.fa.fa-share-alt
|
||||
i.fa.fa-sign-out
|
||||
| {{_ 'export-board'}}
|
||||
li
|
||||
a.js-export-board
|
||||
i.fa.fa-share-alt
|
||||
| {{_ 'export-board'}}
|
||||
li
|
||||
a.js-import-board
|
||||
i.fa.fa-share-alt
|
||||
@@ -360,6 +360,25 @@ template(name="boardMenuPopup")
|
||||
i.fa.fa-sitemap
|
||||
| {{_ 'subtask-settings'}}
|
||||
|
||||
template(name="exportBoard")
|
||||
ul.pop-over-list
|
||||
li
|
||||
a.download-json-link(href="{{exportUrl}}", download="{{exportJsonFilename}}")
|
||||
i.fa.fa-share-alt
|
||||
| {{_ 'export-board-json'}}
|
||||
//li
|
||||
// a(href="{{exportCsvUrl}}", download="{{exportCsvFilename}}")
|
||||
// i.fa.fa-share-alt
|
||||
// | {{_ 'export-board-csv'}}
|
||||
//li
|
||||
// a(href="{{exportTsvUrl}}", download="{{exportTsvFilename}}")
|
||||
// i.fa.fa-share-alt
|
||||
// | {{_ 'export-board-tsv'}}
|
||||
li
|
||||
a.html-export-board
|
||||
i.fa.fa-archive
|
||||
| {{_ 'export-board-html'}}
|
||||
|
||||
template(name="labelsWidget")
|
||||
.board-widget.board-widget-labels
|
||||
h3
|
||||
|
||||
@@ -16,7 +16,7 @@ const viewTitles = {
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
mixins() {
|
||||
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
|
||||
return [Mixins.InfiniteScrolling];
|
||||
},
|
||||
|
||||
onCreated() {
|
||||
@@ -196,14 +196,14 @@ Template.boardMenuPopup.events({
|
||||
},
|
||||
'click .js-change-board-color': Popup.open('boardChangeColor'),
|
||||
'click .js-change-language': Popup.open('changeLanguage'),
|
||||
'click .js-archive-board ': Popup.afterConfirm('archiveBoard', function () {
|
||||
'click .js-archive-board ': Popup.afterConfirm('archiveBoard', function() {
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
currentBoard.archive();
|
||||
// XXX We should have some kind of notification on top of the page to
|
||||
// confirm that the board was successfully archived.
|
||||
FlowRouter.go('home');
|
||||
}),
|
||||
'click .js-delete-board': Popup.afterConfirm('deleteBoard', function () {
|
||||
'click .js-delete-board': Popup.afterConfirm('deleteBoard', function() {
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
Popup.close();
|
||||
Boards.remove(currentBoard._id);
|
||||
@@ -213,19 +213,19 @@ Template.boardMenuPopup.events({
|
||||
'click .js-import-board': Popup.open('chooseBoardSource'),
|
||||
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
|
||||
'click .js-card-settings': Popup.open('boardCardSettings'),
|
||||
'click .js-export-board': Popup.open('exportBoard'),
|
||||
});
|
||||
|
||||
|
||||
Template.boardMenuPopup.onCreated(function () {
|
||||
Template.boardMenuPopup.onCreated(function() {
|
||||
this.apiEnabled = new ReactiveVar(false);
|
||||
Meteor.call('_isApiEnabled', (e, result) => {
|
||||
this.apiEnabled.set(result)
|
||||
})
|
||||
})
|
||||
this.apiEnabled.set(result);
|
||||
});
|
||||
});
|
||||
|
||||
Template.boardMenuPopup.helpers({
|
||||
withApi() {
|
||||
return Template.instance().apiEnabled.get()
|
||||
return Template.instance().apiEnabled.get();
|
||||
},
|
||||
exportUrl() {
|
||||
const params = {
|
||||
@@ -248,7 +248,7 @@ Template.memberPopup.events({
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-change-role': Popup.open('changePermissions'),
|
||||
'click .js-remove-member': Popup.afterConfirm('removeMember', function () {
|
||||
'click .js-remove-member': Popup.afterConfirm('removeMember', function() {
|
||||
const boardId = Session.get('currentBoard');
|
||||
const memberId = this.userId;
|
||||
Cards.find({ boardId, members: memberId }).forEach(card => {
|
||||
@@ -406,6 +406,70 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('chooseBoardSourcePopup');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
template() {
|
||||
return 'exportBoard';
|
||||
},
|
||||
withApi() {
|
||||
return Template.instance().apiEnabled.get();
|
||||
},
|
||||
exportUrl() {
|
||||
const params = {
|
||||
boardId: Session.get('currentBoard'),
|
||||
};
|
||||
const queryParams = {
|
||||
authToken: Accounts._storedLoginToken(),
|
||||
};
|
||||
return FlowRouter.path('/api/boards/:boardId/export', params, queryParams);
|
||||
},
|
||||
exportCsvUrl() {
|
||||
const params = {
|
||||
boardId: Session.get('currentBoard'),
|
||||
};
|
||||
const queryParams = {
|
||||
authToken: Accounts._storedLoginToken(),
|
||||
};
|
||||
return FlowRouter.path(
|
||||
'/api/boards/:boardId/export/csv',
|
||||
params,
|
||||
queryParams,
|
||||
);
|
||||
},
|
||||
exportTsvUrl() {
|
||||
const params = {
|
||||
boardId: Session.get('currentBoard'),
|
||||
};
|
||||
const queryParams = {
|
||||
authToken: Accounts._storedLoginToken(),
|
||||
delimiter: '\t',
|
||||
};
|
||||
return FlowRouter.path(
|
||||
'/api/boards/:boardId/export/csv',
|
||||
params,
|
||||
queryParams,
|
||||
);
|
||||
},
|
||||
exportJsonFilename() {
|
||||
const boardId = Session.get('currentBoard');
|
||||
return `wekan-export-board-${boardId}.json`;
|
||||
},
|
||||
exportCsvFilename() {
|
||||
const boardId = Session.get('currentBoard');
|
||||
return `wekan-export-board-${boardId}.csv`;
|
||||
},
|
||||
exportTsvFilename() {
|
||||
const boardId = Session.get('currentBoard');
|
||||
return `wekan-export-board-${boardId}.tsv`;
|
||||
},
|
||||
}).register('exportBoardPopup');
|
||||
|
||||
Template.exportBoard.events({
|
||||
'click .html-export-board': async event => {
|
||||
event.preventDefault();
|
||||
await ExportHtml(Popup)();
|
||||
},
|
||||
});
|
||||
|
||||
Template.labelsWidget.events({
|
||||
'click .js-label': Popup.open('editLabel'),
|
||||
'click .js-add-label': Popup.open('createLabel'),
|
||||
|
||||
@@ -33,6 +33,17 @@ template(name="createCustomFieldPopup")
|
||||
option(value=value selected="selected") {{name}}
|
||||
else
|
||||
option(value=value) {{name}}
|
||||
|
||||
div.js-field-settings.js-field-settings-currency(class="{{#if isTypeNotSelected 'currency'}}hide{{/if}}")
|
||||
label
|
||||
| {{_ 'custom-field-currency-option'}}
|
||||
select.js-field-currency
|
||||
each getCurrencyCodes
|
||||
if selected
|
||||
option(value=value selected="selected") {{name}}
|
||||
else
|
||||
option(value=value) {{name}}
|
||||
|
||||
div.js-field-settings.js-field-settings-dropdown(class="{{#if isTypeNotSelected 'dropdown'}}hide{{/if}}")
|
||||
label
|
||||
| {{_ 'custom-field-dropdown-options'}}
|
||||
|
||||
@@ -16,12 +16,62 @@ BlazeComponent.extendComponent({
|
||||
}).register('customFieldsSidebar');
|
||||
|
||||
const CreateCustomFieldPopup = BlazeComponent.extendComponent({
|
||||
_types: ['text', 'number', 'date', 'dropdown'],
|
||||
_types: ['text', 'number', 'date', 'dropdown', 'currency'],
|
||||
|
||||
_currencyList: [
|
||||
{
|
||||
name: 'US Dollar',
|
||||
code: 'USD',
|
||||
},
|
||||
{
|
||||
name: 'Euro',
|
||||
code: 'EUR',
|
||||
},
|
||||
{
|
||||
name: 'Yen',
|
||||
code: 'JPY',
|
||||
},
|
||||
{
|
||||
name: 'Pound Sterling',
|
||||
code: 'GBP',
|
||||
},
|
||||
{
|
||||
name: 'Australian Dollar',
|
||||
code: 'AUD',
|
||||
},
|
||||
{
|
||||
name: 'Canadian Dollar',
|
||||
code: 'CAD',
|
||||
},
|
||||
{
|
||||
name: 'Swiss Franc',
|
||||
code: 'CHF',
|
||||
},
|
||||
{
|
||||
name: 'Yuan Renminbi',
|
||||
code: 'CNY',
|
||||
},
|
||||
{
|
||||
name: 'Hong Kong Dollar',
|
||||
code: 'HKD',
|
||||
},
|
||||
{
|
||||
name: 'New Zealand Dollar',
|
||||
code: 'NZD',
|
||||
},
|
||||
],
|
||||
|
||||
onCreated() {
|
||||
this.type = new ReactiveVar(
|
||||
this.data().type ? this.data().type : this._types[0],
|
||||
);
|
||||
|
||||
this.currencyCode = new ReactiveVar(
|
||||
this.data().settings && this.data().settings.currencyCode
|
||||
? this.data().settings.currencyCode
|
||||
: this._currencyList[0].code,
|
||||
);
|
||||
|
||||
this.dropdownItems = new ReactiveVar(
|
||||
this.data().settings && this.data().settings.dropdownItems
|
||||
? this.data().settings.dropdownItems
|
||||
@@ -44,6 +94,18 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
|
||||
return this.type.get() !== type;
|
||||
},
|
||||
|
||||
getCurrencyCodes() {
|
||||
const currentCode = this.currencyCode.get();
|
||||
|
||||
return this._currencyList.map(({ name, code }) => {
|
||||
return {
|
||||
name: `${code} - ${name}`,
|
||||
value: code,
|
||||
selected: code === currentCode,
|
||||
};
|
||||
});
|
||||
},
|
||||
|
||||
getDropdownItems() {
|
||||
const items = this.dropdownItems.get();
|
||||
Array.from(this.findAll('.js-field-settings-dropdown input')).forEach(
|
||||
@@ -62,6 +124,11 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
|
||||
getSettings() {
|
||||
const settings = {};
|
||||
switch (this.type.get()) {
|
||||
case 'currency': {
|
||||
const currencyCode = this.currencyCode.get();
|
||||
settings.currencyCode = currencyCode;
|
||||
break;
|
||||
}
|
||||
case 'dropdown': {
|
||||
const dropdownItems = this.getDropdownItems().filter(
|
||||
item => !!item.name.trim(),
|
||||
@@ -80,6 +147,10 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
|
||||
const value = evt.target.value;
|
||||
this.type.set(value);
|
||||
},
|
||||
'change .js-field-currency'(evt) {
|
||||
const value = evt.target.value;
|
||||
this.currencyCode.set(value);
|
||||
},
|
||||
'keydown .js-dropdown-item.last'(evt) {
|
||||
if (evt.target.value.trim() && evt.keyCode === 13) {
|
||||
const items = this.getDropdownItems();
|
||||
|
||||
@@ -157,8 +157,9 @@ Template.disambiguateMultiMemberPopup.events({
|
||||
});
|
||||
|
||||
Template.moveSelectionPopup.events({
|
||||
'click .js-select-list'() {
|
||||
mutateSelectedCards('move', this._id);
|
||||
'click .js-select-list'(event) {
|
||||
// Move the minicard to the end of the target list
|
||||
mutateSelectedCards('moveToEndOfList', { listId: this._id });
|
||||
EscapeActions.executeUpTo('multiselection');
|
||||
},
|
||||
});
|
||||
@@ -1,7 +1,7 @@
|
||||
template(name="searchSidebar")
|
||||
form.js-search-term-form
|
||||
input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
|
||||
.list-body.js-perfect-scrollbar
|
||||
.list-body
|
||||
.minilists.clearfix.js-minilists
|
||||
each (lists)
|
||||
a.minilist-wrapper.js-minilist(href=absoluteUrl)
|
||||
|
||||
@@ -11,7 +11,8 @@ template(name="swimlaneHeader")
|
||||
template(name="swimlaneFixedHeader")
|
||||
.swimlane-header(
|
||||
class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
|
||||
= title
|
||||
+viewer
|
||||
= title
|
||||
.swimlane-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon
|
||||
|
||||
@@ -2,7 +2,7 @@ template(name="swimlane")
|
||||
.swimlane
|
||||
+swimlaneHeader
|
||||
unless collapseSwimlane
|
||||
.swimlane.js-lists.js-swimlane
|
||||
.swimlane.js-lists.js-swimlane(id="swimlane-{{_id}}")
|
||||
if isMiniScreen
|
||||
if currentListIsInThisSwimlane _id
|
||||
+list(currentList)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
const { calculateIndex } = Utils;
|
||||
|
||||
function currentListIsInThisSwimlane(swimlaneId) {
|
||||
const currentList = Lists.findOne(Session.get('currentList'));
|
||||
@@ -23,8 +23,8 @@ function currentCardIsInThisList(listId, swimlaneId) {
|
||||
currentCard.listId === listId &&
|
||||
currentCard.swimlaneId === swimlaneId
|
||||
);
|
||||
// Default view: board-view-lists
|
||||
else return currentCard && currentCard.listId === listId;
|
||||
|
||||
// https://github.com/wekan/wekan/issues/1623
|
||||
// https://github.com/ChronikEwok/wekan/commit/cad9b20451bb6149bfb527a99b5001873b06c3de
|
||||
// TODO: In public board, if you would like to switch between List/Swimlane view, you could
|
||||
@@ -87,9 +87,6 @@ function initSortable(boardComponent, $listsDom) {
|
||||
},
|
||||
});
|
||||
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch('.js-list:not(.js-list-composer)');
|
||||
|
||||
function userIsMember() {
|
||||
return (
|
||||
Meteor.user() &&
|
||||
@@ -111,7 +108,7 @@ function initSortable(boardComponent, $listsDom) {
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
|
||||
if (!Utils.isMiniScreen() && showDesktopDragHandles) {
|
||||
if (Utils.isMiniScreen() || showDesktopDragHandles) {
|
||||
$listsDom.sortable({
|
||||
handle: '.js-list-handle',
|
||||
});
|
||||
@@ -122,34 +119,12 @@ function initSortable(boardComponent, $listsDom) {
|
||||
}
|
||||
|
||||
const $listDom = $listsDom;
|
||||
if ($listDom.data('sortable')) {
|
||||
if ($listDom.data('uiSortable') || $listDom.data('sortable')) {
|
||||
$listsDom.sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
// Disable drag-dropping when user is not member/is worker/is miniscreen
|
||||
!userIsMember(),
|
||||
// Not disable drag-dropping while in multi-selection mode
|
||||
// MultiSelection.isActive() || !userIsMember(),
|
||||
);
|
||||
}
|
||||
|
||||
if ($listDom.data('sortable')) {
|
||||
$listsDom.sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
// Disable drag-dropping when user is not member/is worker/is miniscreen
|
||||
Meteor.user().isWorker(),
|
||||
// Not disable drag-dropping while in multi-selection mode
|
||||
// MultiSelection.isActive() || !userIsMember(),
|
||||
);
|
||||
}
|
||||
|
||||
if ($listDom.data('sortable')) {
|
||||
$listsDom.sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
// Disable drag-dropping when user is not member/is worker/is miniscreen
|
||||
Utils.isMiniScreen(),
|
||||
// Disable drag-dropping when user is not member/is worker
|
||||
!userIsMember() || Meteor.user().isWorker(),
|
||||
// Not disable drag-dropping while in multi-selection mode
|
||||
// MultiSelection.isActive() || !userIsMember(),
|
||||
);
|
||||
@@ -210,8 +185,7 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
|
||||
const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
|
||||
Utils.isMiniScreen() ||
|
||||
(!Utils.isMiniScreen() && showDesktopDragHandles)
|
||||
Utils.isMiniScreen() || showDesktopDragHandles
|
||||
? ['.js-list-handle', '.js-swimlane-header-handle']
|
||||
: ['.js-list-header'],
|
||||
);
|
||||
|
||||
@@ -29,6 +29,8 @@ avatar-radius = 50%
|
||||
position: absolute
|
||||
|
||||
&.avatar-image
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
height: 100%
|
||||
width: @height
|
||||
|
||||
|
||||
@@ -112,11 +112,20 @@ template(name="changeSettingsPopup")
|
||||
i.fa.fa-check
|
||||
unless currentUser.isWorker
|
||||
li
|
||||
label.bold
|
||||
label.bold.clear
|
||||
i.fa.fa-sort-numeric-asc
|
||||
| {{_ 'show-cards-minimum-count'}}
|
||||
input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="0" max="99" onkeydown="return false")
|
||||
input.js-apply-show-cards-at.left(type="submit" value="{{_ 'apply'}}")
|
||||
label.bold.clear
|
||||
i.fa.fa-calendar
|
||||
| {{_ 'start-day-of-week'}}
|
||||
select#start-day-of-week.inline-input.left
|
||||
each day in weekDays startDayOfWeek
|
||||
if day.isSelected
|
||||
option(selected="true", value="#{day.value}") #{day.name}
|
||||
else
|
||||
option(value="#{day.value}") #{day.name}
|
||||
input.js-apply-user-settings.left(type="submit" value="{{_ 'apply'}}")
|
||||
|
||||
template(name="userDeletePopup")
|
||||
unless currentUser.isWorker
|
||||
|
||||
@@ -224,6 +224,27 @@ Template.changeSettingsPopup.helpers({
|
||||
return cookies.get('limitToShowCardsCount');
|
||||
}
|
||||
},
|
||||
weekDays(startDay) {
|
||||
return [
|
||||
TAPi18n.__('sunday'),
|
||||
TAPi18n.__('monday'),
|
||||
TAPi18n.__('tuesday'),
|
||||
TAPi18n.__('wednesday'),
|
||||
TAPi18n.__('thursday'),
|
||||
TAPi18n.__('friday'),
|
||||
TAPi18n.__('saturday'),
|
||||
].map(function(day, index) {
|
||||
return { name: day, value: index, isSelected: index === startDay };
|
||||
});
|
||||
},
|
||||
startDayOfWeek() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return currentUser.getStartDayOfWeek();
|
||||
} else {
|
||||
return cookies.get('startDayOfWeek');
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.changeSettingsPopup.events({
|
||||
@@ -247,20 +268,31 @@ Template.changeSettingsPopup.events({
|
||||
cookies.set('hasHiddenSystemMessages', 'true');
|
||||
}
|
||||
},
|
||||
'click .js-apply-show-cards-at'(event, templateInstance) {
|
||||
'click .js-apply-user-settings'(event, templateInstance) {
|
||||
event.preventDefault();
|
||||
const minLimit = parseInt(
|
||||
templateInstance.$('#show-cards-count-at').val(),
|
||||
10,
|
||||
);
|
||||
const startDay = parseInt(
|
||||
templateInstance.$('#start-day-of-week').val(),
|
||||
10,
|
||||
);
|
||||
const currentUser = Meteor.user();
|
||||
if (!isNaN(minLimit)) {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
Meteor.call('changeLimitToShowCardsCount', minLimit);
|
||||
} else {
|
||||
cookies.set('limitToShowCardsCount', minLimit);
|
||||
}
|
||||
Popup.back();
|
||||
}
|
||||
if (!isNaN(startDay)) {
|
||||
if (currentUser) {
|
||||
Meteor.call('changeStartDayOfWeek', startDay);
|
||||
} else {
|
||||
cookies.set('startDayOfWeek', startDay);
|
||||
}
|
||||
}
|
||||
Popup.back();
|
||||
},
|
||||
});
|
||||
@@ -10,12 +10,22 @@ DatePicker = BlazeComponent.extendComponent({
|
||||
this.defaultTime = defaultTime;
|
||||
},
|
||||
|
||||
startDayOfWeek() {
|
||||
const currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return currentUser.getStartDayOfWeek();
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
},
|
||||
|
||||
onRendered() {
|
||||
const $picker = this.$('.js-datepicker')
|
||||
.datepicker({
|
||||
todayHighlight: true,
|
||||
todayBtn: 'linked',
|
||||
language: TAPi18n.getLanguage(),
|
||||
weekStart: this.startDayOfWeek(),
|
||||
})
|
||||
.on(
|
||||
'changeDate',
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
};
|
||||
return this.each(function() {
|
||||
const element = this;
|
||||
$(element).bind('dragenter dragover dragleave', stopFn);
|
||||
return $(element).bind('drop', function(event) {
|
||||
$(element).on('dragenter dragover dragleave', stopFn);
|
||||
return $(element).on('drop', function(event) {
|
||||
stopFn(event);
|
||||
const files = event.dataTransfer.files;
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
const JSZip = require('jszip');
|
||||
|
||||
window.ExportHtml = Popup => {
|
||||
const saveAs = function(blob, filename) {
|
||||
const dl = document.createElement('a');
|
||||
dl.href = window.URL.createObjectURL(blob);
|
||||
dl.onclick = event => document.body.removeChild(event.target);
|
||||
dl.style.display = 'none';
|
||||
dl.target = '_blank';
|
||||
dl.download = filename;
|
||||
document.body.appendChild(dl);
|
||||
dl.click();
|
||||
};
|
||||
|
||||
const asyncForEach = async function(array, callback) {
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
await callback(array[index], index, array);
|
||||
}
|
||||
};
|
||||
|
||||
const getPageHtmlString = () => {
|
||||
return `<!doctype html>${window.document.querySelector('html').outerHTML}`;
|
||||
};
|
||||
|
||||
const removeAnchors = htmlString => {
|
||||
const replaceOpenAnchor = htmlString.replace(
|
||||
new RegExp('<a ', 'gim'),
|
||||
'<span ',
|
||||
);
|
||||
return replaceOpenAnchor.replace(new RegExp('</a', 'gim'), '</span');
|
||||
};
|
||||
|
||||
const ensureSidebarRemoved = () => {
|
||||
document.querySelector('.board-sidebar.sidebar').remove();
|
||||
};
|
||||
|
||||
const addJsonExportToZip = async (zip, boardSlug) => {
|
||||
const downloadJSONLink = document.querySelector('.download-json-link');
|
||||
const downloadJSONURL = downloadJSONLink.href;
|
||||
const response = await fetch(downloadJSONURL);
|
||||
const responseBody = await response.text();
|
||||
zip.file(`data/${boardSlug}.json`, responseBody);
|
||||
};
|
||||
|
||||
const closeSidebar = () => {
|
||||
document.querySelector('.board-header-btn.js-toggle-sidebar').click();
|
||||
};
|
||||
|
||||
const cleanBoardHtml = () => {
|
||||
Array.from(document.querySelectorAll('script')).forEach(elem =>
|
||||
elem.remove(),
|
||||
);
|
||||
Array.from(
|
||||
document.querySelectorAll('link:not([rel="stylesheet"])'),
|
||||
).forEach(elem => elem.remove());
|
||||
document.querySelector('#header-quick-access').remove();
|
||||
Array.from(
|
||||
document.querySelectorAll('#header-main-bar .board-header-btns'),
|
||||
).forEach(elem => elem.remove());
|
||||
Array.from(document.querySelectorAll('.list-composer')).forEach(elem =>
|
||||
elem.remove(),
|
||||
);
|
||||
Array.from(
|
||||
document.querySelectorAll(
|
||||
'.list-composer,.js-card-composer, .js-add-card',
|
||||
),
|
||||
).forEach(elem => elem.remove());
|
||||
Array.from(document.querySelectorAll('[href]:not(link)')).forEach(elem =>
|
||||
elem.attributes.removeNamedItem('href'),
|
||||
);
|
||||
Array.from(document.querySelectorAll('[href]')).forEach(elem => {
|
||||
// eslint-disable-next-line no-self-assign
|
||||
elem.href = elem.href;
|
||||
// eslint-disable-next-line no-self-assign
|
||||
elem.src = elem.src;
|
||||
});
|
||||
Array.from(document.querySelectorAll('.is-editable')).forEach(elem => {
|
||||
elem.classList.remove('is-editable');
|
||||
});
|
||||
};
|
||||
|
||||
const getBoardSlug = () => {
|
||||
return window.location.href.split('/').pop();
|
||||
};
|
||||
|
||||
const getStylesheetList = () => {
|
||||
return Array.from(
|
||||
document.querySelectorAll('link[href][rel="stylesheet"]'),
|
||||
);
|
||||
};
|
||||
|
||||
const downloadStylesheets = async (stylesheets, zip) => {
|
||||
await asyncForEach(stylesheets, async elem => {
|
||||
const response = await fetch(elem.href);
|
||||
const responseBody = await response.text();
|
||||
|
||||
const finalResponse = responseBody.replace(
|
||||
new RegExp('packages/[^/]+/upstream/', 'gim'),
|
||||
'../',
|
||||
);
|
||||
|
||||
const filename = elem.href
|
||||
.split('/')
|
||||
.pop()
|
||||
.split('?')
|
||||
.shift();
|
||||
const fileFullPath = `style/${filename}`;
|
||||
zip.file(fileFullPath, finalResponse);
|
||||
elem.href = `../${fileFullPath}`;
|
||||
});
|
||||
};
|
||||
|
||||
const getSrcAttached = () => {
|
||||
return Array.from(document.querySelectorAll('[src]'));
|
||||
};
|
||||
|
||||
const downloadSrcAttached = async (elements, zip, boardSlug) => {
|
||||
await asyncForEach(elements, async elem => {
|
||||
const response = await fetch(elem.src);
|
||||
const responseBody = await response.blob();
|
||||
const filename = elem.src
|
||||
.split('/')
|
||||
.pop()
|
||||
.split('?')
|
||||
.shift();
|
||||
const fileFullPath = `${boardSlug}/${elem.tagName.toLowerCase()}/${filename}`;
|
||||
zip.file(fileFullPath, responseBody);
|
||||
elem.src = `./${elem.tagName.toLowerCase()}/${filename}`;
|
||||
});
|
||||
};
|
||||
|
||||
const removeCssUrlSurround = url => {
|
||||
const working = url || '';
|
||||
return working
|
||||
.split('url(')
|
||||
.join('')
|
||||
.split('")')
|
||||
.join('')
|
||||
.split('"')
|
||||
.join('')
|
||||
.split("')")
|
||||
.join('')
|
||||
.split("'")
|
||||
.join('')
|
||||
.split(')')
|
||||
.join('');
|
||||
};
|
||||
|
||||
const getCardCovers = () => {
|
||||
return Array.from(document.querySelectorAll('.minicard-cover')).filter(
|
||||
elem => elem.style['background-image'],
|
||||
);
|
||||
};
|
||||
|
||||
const downloadCardCovers = async (elements, zip, boardSlug) => {
|
||||
await asyncForEach(elements, async elem => {
|
||||
const response = await fetch(
|
||||
removeCssUrlSurround(elem.style['background-image']),
|
||||
);
|
||||
const responseBody = await response.blob();
|
||||
const filename = removeCssUrlSurround(elem.style['background-image'])
|
||||
.split('/')
|
||||
.pop()
|
||||
.split('?')
|
||||
.shift()
|
||||
.split('#')
|
||||
.shift();
|
||||
const fileFullPath = `${boardSlug}/covers/${filename}`;
|
||||
zip.file(fileFullPath, responseBody);
|
||||
elem.style = "background-image: url('" + `covers/${filename}` + "')";
|
||||
});
|
||||
};
|
||||
|
||||
const addBoardHTMLToZip = (boardSlug, zip) => {
|
||||
ensureSidebarRemoved();
|
||||
const htmlOutputPath = `${boardSlug}/index.html`;
|
||||
zip.file(
|
||||
htmlOutputPath,
|
||||
new Blob([removeAnchors(getPageHtmlString())], {
|
||||
type: 'application/html',
|
||||
}),
|
||||
);
|
||||
};
|
||||
|
||||
return async () => {
|
||||
const zip = new JSZip();
|
||||
const boardSlug = getBoardSlug();
|
||||
|
||||
await addJsonExportToZip(zip, boardSlug);
|
||||
Popup.close();
|
||||
closeSidebar();
|
||||
cleanBoardHtml();
|
||||
|
||||
await downloadStylesheets(getStylesheetList(), zip);
|
||||
await downloadSrcAttached(getSrcAttached(), zip, boardSlug);
|
||||
await downloadCardCovers(getCardCovers(), zip, boardSlug);
|
||||
|
||||
addBoardHTMLToZip(boardSlug, zip);
|
||||
|
||||
const content = await zip.generateAsync({ type: 'blob' });
|
||||
saveAs(content, `${boardSlug}.zip`);
|
||||
window.location.reload();
|
||||
};
|
||||
};
|
||||
+21
-11
@@ -1,6 +1,16 @@
|
||||
// XXX There is no reason to define these shortcuts globally, they should be
|
||||
// attached to a template (most of them will go in the `board` template).
|
||||
|
||||
function getHoveredCardId() {
|
||||
const card = $('.js-minicard:hover').get(0);
|
||||
if (!card) return null;
|
||||
return Blaze.getData(card)._id;
|
||||
}
|
||||
|
||||
function getSelectedCardId() {
|
||||
return Session.get('selectedCard') || getHoveredCardId();
|
||||
}
|
||||
|
||||
Mousetrap.bind('?', () => {
|
||||
FlowRouter.go('shortcuts');
|
||||
});
|
||||
@@ -50,9 +60,9 @@ Mousetrap.bind(['down', 'up'], (evt, key) => {
|
||||
}
|
||||
});
|
||||
|
||||
// XXX This shortcut should also work when hovering over a card in board view
|
||||
Mousetrap.bind('space', evt => {
|
||||
if (!Session.get('currentCard')) {
|
||||
const cardId = getSelectedCardId();
|
||||
if (!cardId) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -62,7 +72,7 @@ Mousetrap.bind('space', evt => {
|
||||
}
|
||||
|
||||
if (Meteor.user().isBoardMember()) {
|
||||
const card = Cards.findOne(Session.get('currentCard'));
|
||||
const card = Cards.findOne(cardId);
|
||||
card.toggleMember(currentUserId);
|
||||
// We should prevent scrolling in card when spacebar is clicked
|
||||
// This should do it according to Mousetrap docs, but it doesn't
|
||||
@@ -70,9 +80,9 @@ Mousetrap.bind('space', evt => {
|
||||
}
|
||||
});
|
||||
|
||||
// XXX This shortcut should also work when hovering over a card in board view
|
||||
Mousetrap.bind('c', evt => {
|
||||
if (!Session.get('currentCard')) {
|
||||
const cardId = getSelectedCardId();
|
||||
if (!cardId) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -86,7 +96,7 @@ Mousetrap.bind('c', evt => {
|
||||
!Meteor.user().isCommentOnly() &&
|
||||
!Meteor.user().isWorker()
|
||||
) {
|
||||
const card = Cards.findOne(Session.get('currentCard'));
|
||||
const card = Cards.findOne(cardId);
|
||||
card.archive();
|
||||
// We should prevent scrolling in card when spacebar is clicked
|
||||
// This should do it according to Mousetrap docs, but it doesn't
|
||||
@@ -97,19 +107,19 @@ Mousetrap.bind('c', evt => {
|
||||
Template.keyboardShortcuts.helpers({
|
||||
mapping: [
|
||||
{
|
||||
keys: ['W'],
|
||||
keys: ['w'],
|
||||
action: 'shortcut-toggle-sidebar',
|
||||
},
|
||||
{
|
||||
keys: ['Q'],
|
||||
keys: ['q'],
|
||||
action: 'shortcut-filter-my-cards',
|
||||
},
|
||||
{
|
||||
keys: ['F'],
|
||||
keys: ['f'],
|
||||
action: 'shortcut-toggle-filterbar',
|
||||
},
|
||||
{
|
||||
keys: ['X'],
|
||||
keys: ['x'],
|
||||
action: 'shortcut-clear-filters',
|
||||
},
|
||||
{
|
||||
@@ -129,7 +139,7 @@ Template.keyboardShortcuts.helpers({
|
||||
action: 'shortcut-assign-self',
|
||||
},
|
||||
{
|
||||
keys: ['C'],
|
||||
keys: ['c'],
|
||||
action: 'archive-card',
|
||||
},
|
||||
],
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
options = $.extend({}, defaults, options);
|
||||
return this.each(function() {
|
||||
const element = this;
|
||||
return $(element).bind('paste', function(event) {
|
||||
return $(element).on('paste', function(event) {
|
||||
const types = event.clipboardData.types;
|
||||
const items = event.clipboardData.items;
|
||||
for (let i = 0; i < types.length; i++) {
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ window.Popup = new (class {
|
||||
// has one. This allows us to position a sub-popup exactly at the same
|
||||
// position than its parent.
|
||||
let openerElement;
|
||||
if (clickFromPopup(evt)) {
|
||||
if (clickFromPopup(evt) && self._getTopStack()) {
|
||||
openerElement = self._getTopStack().openerElement;
|
||||
} else {
|
||||
self._stack = [];
|
||||
|
||||
+13
-5
@@ -6,12 +6,18 @@ Utils = {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
Meteor.user().setBoardView(view);
|
||||
} else if (view === 'board-view-lists') {
|
||||
cookies.set('boardView', 'board-view-lists'); //true
|
||||
} else if (view === 'board-view-swimlanes') {
|
||||
cookies.set('boardView', 'board-view-swimlanes'); //true
|
||||
location.reload();
|
||||
} else if (view === 'board-view-lists') {
|
||||
cookies.set('boardView', 'board-view-lists'); //true
|
||||
location.reload();
|
||||
} else if (view === 'board-view-cal') {
|
||||
cookies.set('boardView', 'board-view-cal'); //true
|
||||
location.reload();
|
||||
} else {
|
||||
cookies.set('boardView', 'board-view-swimlanes'); //true
|
||||
location.reload();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -24,14 +30,16 @@ Utils = {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView;
|
||||
} else if (cookies.get('boardView') === 'board-view-lists') {
|
||||
return 'board-view-lists';
|
||||
} else if (cookies.get('boardView') === 'board-view-swimlanes') {
|
||||
return 'board-view-swimlanes';
|
||||
} else if (cookies.get('boardView') === 'board-view-lists') {
|
||||
return 'board-view-lists';
|
||||
} else if (cookies.get('boardView') === 'board-view-cal') {
|
||||
return 'board-view-cal';
|
||||
} else {
|
||||
return false;
|
||||
cookies.set('boardView', 'board-view-swimlanes'); //true
|
||||
location.reload();
|
||||
return 'board-view-swimlanes';
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
+11
-7
@@ -38,7 +38,7 @@ version: '2'
|
||||
# sudo service docker start
|
||||
# ----------------------------------------------------------------------------------
|
||||
# ==== USAGE OF THIS docker-compose.yml ====
|
||||
# 1) For seeing does Wekan work, try this and check with your webbroser:
|
||||
# 1) For seeing does Wekan work, try this and check with your web browser:
|
||||
# docker-compose up
|
||||
# 2) Stop Wekan and start Wekan in background:
|
||||
# docker-compose stop
|
||||
@@ -93,7 +93,9 @@ services:
|
||||
#-------------------------------------------------------------------------------------
|
||||
# ==== MONGODB AND METEOR VERSION ====
|
||||
# a) For Wekan Meteor 1.8.x version at master branch, use mongo 4.x
|
||||
image: mongo:latest
|
||||
# DOES NOT WORK: mongo 4.4, see https://github.com/wekan/wekan/issues/3247
|
||||
# WORKS: mongo 3.x and 4.2
|
||||
image: mongo:4.2
|
||||
# b) For Wekan Meteor 1.6.x version at devel branch.
|
||||
# Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
|
||||
#image: mongo:3.2.21
|
||||
@@ -115,11 +117,11 @@ services:
|
||||
# NOTE: Quay is currently not updated, use Docker Hub image below c)
|
||||
# a) For Wekan Meteor 1.8.x version at master branch,
|
||||
# using https://quay.io/wekan/wekan automatic builds
|
||||
image: quay.io/wekan/wekan
|
||||
#image: quay.io/wekan/wekan
|
||||
# b) Using specific Meteor 1.6.x version tag:
|
||||
# image: quay.io/wekan/wekan:v1.95
|
||||
# c) Using Docker Hub automatic builds https://hub.docker.com/r/wekanteam/wekan
|
||||
#image: wekanteam/wekan
|
||||
image: wekanteam/wekan
|
||||
# image: wekanteam/wekan:v2.99
|
||||
#-------------------------------------------------------------------------------------
|
||||
container_name: wekan-app
|
||||
@@ -180,7 +182,7 @@ services:
|
||||
# that if you're using more than 1 instance of Wekan
|
||||
# (or any MeteorJS based tool) you're supposed to set
|
||||
# MONGO_OPLOG_URL as an environment variable.
|
||||
# Without setting it, Meteor will perform a pull-and-diff
|
||||
# Without setting it, Meteor will perform a poll-and-diff
|
||||
# update of it's dataset. With it, Meteor will update from
|
||||
# the OPLOG. See here
|
||||
# https://blog.meteor.com/tuning-meteor-mongo-livedata-for-scalability-13fe9deb8908
|
||||
@@ -244,6 +246,7 @@ services:
|
||||
# https://github.com/wekan/wekan/issues/2949
|
||||
- SCROLLINERTIA=0
|
||||
- SCROLLAMOUNT=auto
|
||||
- SCROLLDELTAFACTOR=auto
|
||||
#---------------------------------------------------------------
|
||||
# ==== CARD OPENED, SEND WEBHOOK MESSAGE ====
|
||||
# https://github.com/wekan/wekan/issues/2518
|
||||
@@ -353,8 +356,9 @@ services:
|
||||
#- OAUTH2_EMAIL_MAP=email
|
||||
#-----------------------------------------------------------------
|
||||
# ==== OAUTH2 Nextcloud ====
|
||||
# 1) Register the application with Nextcloud: https://your.nextcloud/settings/admin/security
|
||||
# 1) Register the application with Nextcloud: https://your.nextcloud/index.php/settings/admin/security
|
||||
# Make sure you capture the application ID as well as generate a secret key.
|
||||
# Use https://your.wekan/_oauth/oidc for the redirect URI.
|
||||
# 2) Configure the environment variables. This differs slightly
|
||||
# by installation type, but make sure you have the following:
|
||||
#- OAUTH2_ENABLED=true
|
||||
@@ -598,7 +602,7 @@ services:
|
||||
# example : LOGOUT_ON_MINUTES=55
|
||||
#- LOGOUT_ON_MINUTES=
|
||||
#-------------------------------------------------------------------
|
||||
# Hide password login form
|
||||
# Hide password login form
|
||||
# - PASSWORD_LOGIN_ENABLED=true
|
||||
#-------------------------------------------------------------------
|
||||
depends_on:
|
||||
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
|
||||
# Recursive find/replace.
|
||||
# Syntax: ./find-replace.sh searchtext replacetext
|
||||
|
||||
egrep -lRZ '$1' . | xargs -0 -l sed -i -e 's/$1/$2/g'
|
||||
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+41
-7
@@ -152,8 +152,6 @@
|
||||
"card-spent": "Spent Time",
|
||||
"card-edit-attachments": "Edit attachments",
|
||||
"card-edit-custom-fields": "Edit custom fields",
|
||||
"card-start-voting": "Start voting",
|
||||
"card-cancel-voting": "Delete voting and all votes",
|
||||
"card-edit-labels": "Edit labels",
|
||||
"card-edit-members": "Edit members",
|
||||
"card-labels-title": "Change the labels for the card.",
|
||||
@@ -166,10 +164,15 @@
|
||||
"cardStartVotingPopup-title": "Start a vote",
|
||||
"positiveVoteMembersPopup-title": "Proponents",
|
||||
"negativeVoteMembersPopup-title": "Opponents",
|
||||
"card-edit-voting": "Edit voting",
|
||||
"editVoteEndDatePopup-title": "Change vote end date",
|
||||
"allowNonBoardMembers": "Allow all logged in users",
|
||||
"vote-question": "Voting question",
|
||||
"vote-public": "Public vote",
|
||||
"vote-public": "Show who voted what",
|
||||
"vote-for-it": "for it",
|
||||
"vote-against": "against",
|
||||
"deleteVotePopup-title": "Delete vote?",
|
||||
"vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.",
|
||||
"cardDeletePopup-title": "Delete Card?",
|
||||
"cardDetailsActionsPopup-title": "Card Actions",
|
||||
"cardLabelsPopup-title": "Labels",
|
||||
@@ -253,6 +256,8 @@
|
||||
"current": "current",
|
||||
"custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
|
||||
"custom-field-checkbox": "Checkbox",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-date": "Date",
|
||||
"custom-field-dropdown": "Dropdown List",
|
||||
"custom-field-dropdown-none": "(none)",
|
||||
@@ -306,6 +311,7 @@
|
||||
"error-board-notAMember": "You need to be a member of this board to do that",
|
||||
"error-json-malformed": "Your text is not valid JSON",
|
||||
"error-json-schema": "Your JSON data does not include the proper information in the correct format",
|
||||
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
|
||||
"error-list-doesNotExist": "This list does not exist",
|
||||
"error-user-doesNotExist": "This user does not exist",
|
||||
"error-user-notAllowSelf": "You can not invite yourself",
|
||||
@@ -313,6 +319,11 @@
|
||||
"error-username-taken": "This username is already taken",
|
||||
"error-email-taken": "Email has already been taken",
|
||||
"export-board": "Export board",
|
||||
"export-board-json": "Export board to JSON",
|
||||
"export-board-csv": "Export board to CSV",
|
||||
"export-board-tsv": "Export board to TSV",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
@@ -348,12 +359,16 @@
|
||||
"import-board-c": "Import board",
|
||||
"import-board-title-trello": "Import board from Trello",
|
||||
"import-board-title-wekan": "Import board from previous export",
|
||||
"import-board-title-csv": "Import board from CSV/TSV",
|
||||
"from-trello": "From Trello",
|
||||
"from-wekan": "From previous export",
|
||||
"from-csv": "From CSV/TSV",
|
||||
"import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
|
||||
"import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .",
|
||||
"import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
|
||||
"import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.",
|
||||
"import-json-placeholder": "Paste your valid JSON data here",
|
||||
"import-csv-placeholder": "Paste your valid CSV/TSV data here",
|
||||
"import-map-members": "Map members",
|
||||
"import-members-map": "Your imported board has some members. Please map the members you want to import to your users",
|
||||
"import-show-user-mapping": "Review members mapping",
|
||||
@@ -386,6 +401,7 @@
|
||||
"swimlaneActionPopup-title": "Swimlane Actions",
|
||||
"swimlaneAddPopup-title": "Add a Swimlane below",
|
||||
"listImportCardPopup-title": "Import a Trello card",
|
||||
"listImportCardsTsvPopup-title": "Import Excel CSV/TSV",
|
||||
"listMorePopup-title": "More",
|
||||
"link-list": "Link to this list",
|
||||
"list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
|
||||
@@ -622,6 +638,8 @@
|
||||
"r-delete-rule": "Delete rule",
|
||||
"r-new-rule-name": "New rule title",
|
||||
"r-no-rules": "No rules",
|
||||
"r-trigger": "Trigger",
|
||||
"r-action": "Action",
|
||||
"r-when-a-card": "When a card",
|
||||
"r-is": "is",
|
||||
"r-is-moved": "is moved",
|
||||
@@ -641,7 +659,6 @@
|
||||
"r-when-a-member": "When a member is",
|
||||
"r-when-the-member": "When the member",
|
||||
"r-name": "name",
|
||||
"r-is": "is",
|
||||
"r-when-a-attach": "When an attachment",
|
||||
"r-when-a-checklist": "When a checklist is",
|
||||
"r-when-the-checklist": "When the checklist",
|
||||
@@ -655,7 +672,6 @@
|
||||
"r-top-of": "Top of",
|
||||
"r-bottom-of": "Bottom of",
|
||||
"r-its-list": "its list",
|
||||
"r-list": "list",
|
||||
"r-archive": "Move to Archive",
|
||||
"r-unarchive": "Restore from Archive",
|
||||
"r-card": "card",
|
||||
@@ -675,6 +691,7 @@
|
||||
"r-of-checklist": "of checklist",
|
||||
"r-send-email": "Send an email",
|
||||
"r-to": "to",
|
||||
"r-of": "of",
|
||||
"r-subject": "subject",
|
||||
"r-rule-details": "Rule details",
|
||||
"r-d-move-to-top-gen": "Move card to top of its list",
|
||||
@@ -710,7 +727,6 @@
|
||||
"r-swimlane-name": "swimlane name",
|
||||
"r-board-note": "Note: leave a field empty to match every possible value. ",
|
||||
"r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
|
||||
"r-added-to": "added to",
|
||||
"r-when-a-card-is-moved": "When a card is moved to another list",
|
||||
"r-set": "Set",
|
||||
"r-update": "Update",
|
||||
@@ -777,5 +793,23 @@
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Allow Rename",
|
||||
"allowRenamePopup-title": "Allow Rename"
|
||||
"allowRenamePopup-title": "Allow Rename",
|
||||
"start-day-of-week": "Set day of the week start",
|
||||
"monday": "Monday",
|
||||
"tuesday": "Tuesday",
|
||||
"wednesday": "Wednesday",
|
||||
"thursday": "Thursday",
|
||||
"friday": "Friday",
|
||||
"saturday": "Saturday",
|
||||
"sunday": "Sunday",
|
||||
"status": "Status",
|
||||
"swimlane": "Swimlane",
|
||||
"owner": "Owner",
|
||||
"last-modified-at": "Last modified at",
|
||||
"last-activity": "Last activity",
|
||||
"voting": "Voting",
|
||||
"archived": "Archived",
|
||||
"delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
|
||||
"delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
|
||||
"hide-checked-items": "Hide checked items"
|
||||
}
|
||||
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,815 @@
|
||||
{
|
||||
"accept": "Aceptar",
|
||||
"act-activity-notify": "Notificación de actividad",
|
||||
"act-addAttachment": "añadido el adjunto __attachment__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-deleteAttachment": "eliminado el adjunto __attachment__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addSubtask": "añadida la subtarea __subtask__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addLabel": "añadida la etiqueta __label__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addedLabel": "añadida la etiqueta __label__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeLabel": "eliminada la etiqueta __label__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removedLabel": "eliminada la etiqueta __label__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addChecklist": "añadida la lista de verificación __checklist__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addChecklistItem": "añadido el elemento __checklistItem__ a la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeChecklist": "eliminada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeChecklistItem": "eliminado el elemento __checklistItem__ de la lista de verificación __checkList__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-checkedItem": "marcado el elemento __checklistItem__ de la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-uncheckedItem": "desmarcado el elemento __checklistItem__ de la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-completeChecklist": "completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-uncompleteChecklist": "no completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addComment": "comentario en la tarjeta__card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-editComment": "comentario editado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-deleteComment": "comentario eliminado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createBoard": "creó el tablero __board__",
|
||||
"act-createSwimlane": "creó el carril de flujo __swimlane__ en el tablero __board__",
|
||||
"act-createCard": "creada la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createCustomField": "creado el campo personalizado __customField__ en el tablero __board__",
|
||||
"act-deleteCustomField": "eliminado el campo personalizado __customField__ del tablero __board__",
|
||||
"act-setCustomField": "editado el campo personalizado __customField__: __customFieldValue__ en la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createList": "añadida la lista __list__ al tablero __board__",
|
||||
"act-addBoardMember": "añadido el mimbro __member__ al tablero __board__",
|
||||
"act-archivedBoard": "El tablero __board__ se ha archivado",
|
||||
"act-archivedCard": "La tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-archivedList": "La lista __list__ del carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-archivedSwimlane": "El carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-importBoard": "importado el tablero __board__",
|
||||
"act-importCard": "importada la tarjeta __card__ a la lista __list__ del carrril __swimlane__ del tablero __board__",
|
||||
"act-importList": "importada la lista __list__ al carril __swimlane__ del tablero __board__",
|
||||
"act-joinMember": "añadido el miembro __member__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-moveCard": "movida la tarjeta __card__ del tablero __board__ de la lista __oldList__ del carril __oldSwimlane__ a la lista __list__ del carril __swimlane__",
|
||||
"act-moveCardToOtherBoard": "movida la tarjeta __card__ de la lista __oldList__ del carril __oldSwimlane__ del tablero __oldBoard__ a la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeBoardMember": "eliminado el miembro __member__ del tablero __board__",
|
||||
"act-restoredCard": "restaurada la tarjeta __card__ a la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-unjoinMember": "eliminado el miembro __member__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-withBoardTitle": "__board__",
|
||||
"act-withCardTitle": "[__board__] __card__",
|
||||
"actions": "Acciones",
|
||||
"activities": "Actividades",
|
||||
"activity": "Actividad",
|
||||
"activity-added": "ha añadido %s a %s",
|
||||
"activity-archived": "%s se ha archivado",
|
||||
"activity-attached": "ha adjuntado %s a %s",
|
||||
"activity-created": "ha creado %s",
|
||||
"activity-customfield-created": "creó el campo personalizado %s",
|
||||
"activity-excluded": "ha excluido %s de %s",
|
||||
"activity-imported": "ha importado %s a %s desde %s",
|
||||
"activity-imported-board": "ha importado %s desde %s",
|
||||
"activity-joined": "se ha unido a %s",
|
||||
"activity-moved": "ha movido %s de %s a %s",
|
||||
"activity-on": "en %s",
|
||||
"activity-removed": "ha eliminado %s de %s",
|
||||
"activity-sent": "ha enviado %s a %s",
|
||||
"activity-unjoined": "se ha desvinculado de %s",
|
||||
"activity-subtask-added": "ha añadido la subtarea a %s",
|
||||
"activity-checked-item": "marcado %s en la lista de verificación %s de %s",
|
||||
"activity-unchecked-item": "desmarcado %s en lista %s de %s",
|
||||
"activity-checklist-added": "ha añadido una lista de verificación a %s",
|
||||
"activity-checklist-removed": "eliminada una lista de verificación desde %s",
|
||||
"activity-checklist-completed": "lista de verificación completada %s de %s",
|
||||
"activity-checklist-uncompleted": "no completado la lista %s de %s",
|
||||
"activity-checklist-item-added": "ha añadido el elemento de la lista de verificación a '%s' en %s",
|
||||
"activity-checklist-item-removed": "eliminado un elemento de la lista de verificación desde '%s' en %s",
|
||||
"add": "Añadir",
|
||||
"activity-checked-item-card": "marcado %s en la lista de verificación %s",
|
||||
"activity-unchecked-item-card": "desmarcado %s en la lista de verificación %s",
|
||||
"activity-checklist-completed-card": "completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"activity-checklist-uncompleted-card": "no completó la lista de verificación %s",
|
||||
"activity-editComment": "comentario editado",
|
||||
"activity-deleteComment": "comentario eliminado",
|
||||
"add-attachment": "Añadir adjunto",
|
||||
"add-board": "Añadir tablero",
|
||||
"add-card": "Añadir una tarjeta",
|
||||
"add-swimlane": "Añadir un carril de flujo",
|
||||
"add-subtask": "Añadir subtarea",
|
||||
"add-checklist": "Añadir una lista de verificación",
|
||||
"add-checklist-item": "Añadir un elemento a la lista de verificación",
|
||||
"add-cover": "Añadir portada",
|
||||
"add-label": "Añadir una etiqueta",
|
||||
"add-list": "Añadir una lista",
|
||||
"add-members": "Añadir miembros",
|
||||
"added": "Añadida el",
|
||||
"addMemberPopup-title": "Miembros",
|
||||
"admin": "Administrador",
|
||||
"admin-desc": "Puedes ver y editar tarjetas, eliminar miembros, y cambiar las preferencias del tablero",
|
||||
"admin-announcement": "Aviso",
|
||||
"admin-announcement-active": "Activar el aviso para todo el sistema",
|
||||
"admin-announcement-title": "Aviso del administrador",
|
||||
"all-boards": "Tableros",
|
||||
"and-n-other-card": "y __count__ tarjeta más",
|
||||
"and-n-other-card_plural": "y otras __count__ tarjetas",
|
||||
"apply": "Aplicar",
|
||||
"app-is-offline": "Cargando, espera por favor. Refrescar esta página causará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.",
|
||||
"archive": "Archivar",
|
||||
"archive-all": "Archivar todo",
|
||||
"archive-board": "Archivar este tablero",
|
||||
"archive-card": "Archivar esta tarjeta",
|
||||
"archive-list": "Archivar esta lista",
|
||||
"archive-swimlane": "Archivar este carril",
|
||||
"archive-selection": "Archivar esta selección",
|
||||
"archiveBoardPopup-title": "¿Archivar este tablero?",
|
||||
"archived-items": "Archivo",
|
||||
"archived-boards": "Tableros en el Archivo",
|
||||
"restore-board": "Restaurar el tablero",
|
||||
"no-archived-boards": "No hay Tableros en el Archivo",
|
||||
"archives": "Archivo",
|
||||
"template": "Plantilla",
|
||||
"templates": "Plantillas",
|
||||
"assign-member": "Asignar miembros",
|
||||
"attached": "adjuntado",
|
||||
"attachment": "Adjunto",
|
||||
"attachment-delete-pop": "La eliminación de un fichero adjunto es permanente. Esta acción no puede deshacerse.",
|
||||
"attachmentDeletePopup-title": "¿Eliminar el adjunto?",
|
||||
"attachments": "Adjuntos",
|
||||
"auto-watch": "Suscribirse automáticamente a los tableros cuando son creados",
|
||||
"avatar-too-big": "El avatar es muy grande (70KB máx.)",
|
||||
"back": "Atrás",
|
||||
"board-change-color": "Cambiar el color",
|
||||
"board-nb-stars": "%s destacados",
|
||||
"board-not-found": "Tablero no encontrado",
|
||||
"board-private-info": "Este tablero será <strong>privado</strong>.",
|
||||
"board-public-info": "Este tablero será <strong>público</strong>.",
|
||||
"boardChangeColorPopup-title": "Cambiar el fondo del tablero",
|
||||
"boardChangeTitlePopup-title": "Renombrar el tablero",
|
||||
"boardChangeVisibilityPopup-title": "Cambiar visibilidad",
|
||||
"boardChangeWatchPopup-title": "Cambiar vigilancia",
|
||||
"boardMenuPopup-title": "Preferencias del tablero",
|
||||
"boardChangeViewPopup-title": "Vista del tablero",
|
||||
"boards": "Tableros",
|
||||
"board-view": "Vista del tablero",
|
||||
"board-view-cal": "Calendario",
|
||||
"board-view-swimlanes": "Carriles",
|
||||
"board-view-collapse": "Contraer",
|
||||
"board-view-lists": "Listas",
|
||||
"bucket-example": "Como “Cosas por hacer” por ejemplo",
|
||||
"cancel": "Cancelar",
|
||||
"card-archived": "Se archivó esta tarjeta",
|
||||
"board-archived": "Se archivó este tablero",
|
||||
"card-comments-title": "Esta tarjeta tiene %s comentarios.",
|
||||
"card-delete-notice": "la eliminación es permanente. Perderás todas las acciones asociadas a esta tarjeta.",
|
||||
"card-delete-pop": "Se eliminarán todas las acciones del historial de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.",
|
||||
"card-delete-suggest-archive": "Puedes mover una tarjeta al Archivo para quitarla del tablero y preservar la actividad.",
|
||||
"card-due": "Vence",
|
||||
"card-due-on": "Vence el",
|
||||
"card-spent": "Tiempo consumido",
|
||||
"card-edit-attachments": "Editar los adjuntos",
|
||||
"card-edit-custom-fields": "Editar los campos personalizados",
|
||||
"card-edit-labels": "Editar las etiquetas",
|
||||
"card-edit-members": "Editar los miembros",
|
||||
"card-labels-title": "Cambia las etiquetas de la tarjeta",
|
||||
"card-members-title": "Añadir o eliminar miembros del tablero desde la tarjeta.",
|
||||
"card-start": "Comienza",
|
||||
"card-start-on": "Comienza el",
|
||||
"cardAttachmentsPopup-title": "Adjuntar desde",
|
||||
"cardCustomField-datePopup-title": "Cambiar la fecha",
|
||||
"cardCustomFieldsPopup-title": "Editar los campos personalizados",
|
||||
"cardStartVotingPopup-title": "Comience a votar",
|
||||
"positiveVoteMembersPopup-title": "Favorables",
|
||||
"negativeVoteMembersPopup-title": "Contrarios",
|
||||
"card-edit-voting": "Editar votación",
|
||||
"editVoteEndDatePopup-title": "Cambie fecha de termino del voto",
|
||||
"allowNonBoardMembers": "Permitir todos los usuarios autentificados",
|
||||
"vote-question": "Pregunta de votación",
|
||||
"vote-public": "Mostrar quien voto que",
|
||||
"vote-for-it": "por esto",
|
||||
"vote-against": "contrarios",
|
||||
"deleteVotePopup-title": "¿Borrar voto?",
|
||||
"vote-delete-pop": "El Borrado es permanente. Perderá todas las acciones asociadas con este voto.",
|
||||
"cardDeletePopup-title": "¿Eliminar la tarjeta?",
|
||||
"cardDetailsActionsPopup-title": "Acciones de la tarjeta",
|
||||
"cardLabelsPopup-title": "Etiquetas",
|
||||
"cardMembersPopup-title": "Miembros",
|
||||
"cardMorePopup-title": "Más",
|
||||
"cardTemplatePopup-title": "Crear plantilla",
|
||||
"cards": "Tarjetas",
|
||||
"cards-count": "Tarjetas",
|
||||
"casSignIn": "Iniciar sesión con CAS",
|
||||
"cardType-card": "Tarjeta",
|
||||
"cardType-linkedCard": "Tarjeta enlazada",
|
||||
"cardType-linkedBoard": "Tablero enlazado",
|
||||
"change": "Cambiar",
|
||||
"change-avatar": "Cambiar el avatar",
|
||||
"change-password": "Cambiar la contraseña",
|
||||
"change-permissions": "Cambiar los permisos",
|
||||
"change-settings": "Cambiar las preferencias",
|
||||
"changeAvatarPopup-title": "Cambiar el avatar",
|
||||
"changeLanguagePopup-title": "Cambiar el idioma",
|
||||
"changePasswordPopup-title": "Cambiar la contraseña",
|
||||
"changePermissionsPopup-title": "Cambiar los permisos",
|
||||
"changeSettingsPopup-title": "Cambiar las preferencias",
|
||||
"subtasks": "Subtareas",
|
||||
"checklists": "Lista de verificación",
|
||||
"click-to-star": "Haz clic para destacar este tablero.",
|
||||
"click-to-unstar": "Haz clic para dejar de destacar este tablero.",
|
||||
"clipboard": "el portapapeles o con arrastrar y soltar",
|
||||
"close": "Cerrar",
|
||||
"close-board": "Cerrar el tablero",
|
||||
"close-board-pop": "Podrás restaurar el tablero haciendo clic en el botón \"Archivo\" del encabezado de la pantalla inicial.",
|
||||
"color-black": "negra",
|
||||
"color-blue": "azul",
|
||||
"color-crimson": "carmesí",
|
||||
"color-darkgreen": "verde oscuro",
|
||||
"color-gold": "oro",
|
||||
"color-gray": "gris",
|
||||
"color-green": "verde",
|
||||
"color-indigo": "añil",
|
||||
"color-lime": "lima",
|
||||
"color-magenta": "magenta",
|
||||
"color-mistyrose": "rosa claro",
|
||||
"color-navy": "azul marino",
|
||||
"color-orange": "naranja",
|
||||
"color-paleturquoise": "turquesa",
|
||||
"color-peachpuff": "melocotón",
|
||||
"color-pink": "rosa",
|
||||
"color-plum": "púrpura",
|
||||
"color-purple": "violeta",
|
||||
"color-red": "roja",
|
||||
"color-saddlebrown": "marrón",
|
||||
"color-silver": "plata",
|
||||
"color-sky": "celeste",
|
||||
"color-slateblue": "azul",
|
||||
"color-white": "blanco",
|
||||
"color-yellow": "amarilla",
|
||||
"unset-color": "Desmarcar",
|
||||
"comment": "Comentar",
|
||||
"comment-placeholder": "Escribir comentario",
|
||||
"comment-only": "Sólo comentarios",
|
||||
"comment-only-desc": "Solo puedes comentar en las tarjetas.",
|
||||
"no-comments": "No hay comentarios",
|
||||
"no-comments-desc": "No se pueden mostrar comentarios ni actividades.",
|
||||
"worker": "Trabajador",
|
||||
"worker-desc": "Solo puede mover tarjetas, asignarse a la tarjeta y comentar.",
|
||||
"computer": "el ordenador",
|
||||
"confirm-subtask-delete-dialog": "¿Seguro que quieres eliminar la subtarea?",
|
||||
"confirm-checklist-delete-dialog": "¿Seguro que quieres eliminar la lista de verificación?",
|
||||
"copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles",
|
||||
"linkCardPopup-title": "Enlazar tarjeta",
|
||||
"searchElementPopup-title": "Buscar",
|
||||
"copyCardPopup-title": "Copiar la tarjeta",
|
||||
"copyChecklistToManyCardsPopup-title": "Copiar la plantilla de la lista de verificación en varias tarjetas",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Títulos y descripciones de las tarjetas de destino en formato JSON",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título de la primera tarjeta\", \"description\":\"Descripción de la primera tarjeta\"}, {\"title\":\"Título de la segunda tarjeta\",\"description\":\"Descripción de la segunda tarjeta\"},{\"title\":\"Título de la última tarjeta\",\"description\":\"Descripción de la última tarjeta\"} ]",
|
||||
"create": "Crear",
|
||||
"createBoardPopup-title": "Crear tablero",
|
||||
"chooseBoardSourcePopup-title": "Importar un tablero",
|
||||
"createLabelPopup-title": "Crear etiqueta",
|
||||
"createCustomField": "Crear un campo",
|
||||
"createCustomFieldPopup-title": "Crear un campo",
|
||||
"current": "actual",
|
||||
"custom-field-delete-pop": "Se eliminará este campo personalizado de todas las tarjetas y se destruirá su historial. Esta acción no puede deshacerse.",
|
||||
"custom-field-checkbox": "Casilla de verificación",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-date": "Fecha",
|
||||
"custom-field-dropdown": "Lista desplegable",
|
||||
"custom-field-dropdown-none": "(nada)",
|
||||
"custom-field-dropdown-options": "Opciones de la lista",
|
||||
"custom-field-dropdown-options-placeholder": "Pulsa Intro para añadir más opciones",
|
||||
"custom-field-dropdown-unknown": "(desconocido)",
|
||||
"custom-field-number": "Número",
|
||||
"custom-field-text": "Texto",
|
||||
"custom-fields": "Campos personalizados",
|
||||
"date": "Fecha",
|
||||
"decline": "Declinar",
|
||||
"default-avatar": "Avatar por defecto",
|
||||
"delete": "Eliminar",
|
||||
"deleteCustomFieldPopup-title": "¿Eliminar el campo personalizado?",
|
||||
"deleteLabelPopup-title": "¿Eliminar la etiqueta?",
|
||||
"description": "Descripción",
|
||||
"disambiguateMultiLabelPopup-title": "Desambiguar la acción de etiqueta",
|
||||
"disambiguateMultiMemberPopup-title": "Desambiguar la acción de miembro",
|
||||
"discard": "Descartarla",
|
||||
"done": "Hecho",
|
||||
"download": "Descargar",
|
||||
"edit": "Editar",
|
||||
"edit-avatar": "Cambiar el avatar",
|
||||
"edit-profile": "Editar el perfil",
|
||||
"edit-wip-limit": "Cambiar el límite del trabajo en proceso",
|
||||
"soft-wip-limit": "Límite del trabajo en proceso flexible",
|
||||
"editCardStartDatePopup-title": "Cambiar la fecha de comienzo",
|
||||
"editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
|
||||
"editCustomFieldPopup-title": "Editar el campo",
|
||||
"editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
|
||||
"editLabelPopup-title": "Cambiar la etiqueta",
|
||||
"editNotificationPopup-title": "Editar las notificaciones",
|
||||
"editProfilePopup-title": "Editar el perfil",
|
||||
"email": "Correo electrónico",
|
||||
"email-enrollAccount-subject": "Cuenta creada en __siteName__",
|
||||
"email-enrollAccount-text": "Hola __user__,\n\nPara empezar a utilizar el servicio, simplemente haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"email-fail": "Error al enviar el correo",
|
||||
"email-fail-text": "Error al intentar enviar el correo",
|
||||
"email-invalid": "Correo no válido",
|
||||
"email-invite": "Invitar vía correo electrónico",
|
||||
"email-invite-subject": "__inviter__ ha enviado una invitación",
|
||||
"email-invite-text": "Estimado __user__,\n\n__inviter__ te invita a unirte al tablero '__board__' para colaborar.\n\nPor favor, haz clic en el siguiente enlace:\n\n__url__\n\nGracias.",
|
||||
"email-resetPassword-subject": "Restablecer tu contraseña en __siteName__",
|
||||
"email-resetPassword-text": "Hola __user__,\n\nPara restablecer tu contraseña, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"email-sent": "Correo enviado",
|
||||
"email-verifyEmail-subject": "Verifica tu dirección de correo en __siteName__",
|
||||
"email-verifyEmail-text": "Hola __user__,\n\nPara verificar tu cuenta de correo electrónico, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"enable-wip-limit": "Habilitar el límite del trabajo en proceso",
|
||||
"error-board-doesNotExist": "El tablero no existe",
|
||||
"error-board-notAdmin": "Es necesario ser administrador de este tablero para hacer eso",
|
||||
"error-board-notAMember": "Es necesario ser miembro de este tablero para hacer eso",
|
||||
"error-json-malformed": "El texto no es un JSON válido",
|
||||
"error-json-schema": "Sus datos JSON no incluyen la información apropiada en el formato correcto",
|
||||
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
|
||||
"error-list-doesNotExist": "La lista no existe",
|
||||
"error-user-doesNotExist": "El usuario no existe",
|
||||
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
|
||||
"error-user-notCreated": "El usuario no ha sido creado",
|
||||
"error-username-taken": "Este nombre de usuario ya está en uso",
|
||||
"error-email-taken": "Esta dirección de correo ya está en uso",
|
||||
"export-board": "Exportar el tablero",
|
||||
"export-board-json": "Exportar tablero a JSON",
|
||||
"export-board-csv": "Exportar tablero a CSV",
|
||||
"export-board-tsv": "Exportar tablero a TSV",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"exportBoardPopup-title": "Exportar el tablero",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Click para ordenar la lista",
|
||||
"list-sort-by": "Ordenar la lista por:",
|
||||
"list-label-modifiedAt": "Hora de último acceso",
|
||||
"list-label-title": "Nombre de la lista",
|
||||
"list-label-sort": "Tu orden manual",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrar",
|
||||
"filter-cards": "Filtrar tarjetas o listas",
|
||||
"list-filter-label": "Filtrar listas por título",
|
||||
"filter-clear": "Limpiar el filtro",
|
||||
"filter-no-label": "Sin etiqueta",
|
||||
"filter-no-member": "Sin miembro",
|
||||
"filter-no-assignee": "No asignado",
|
||||
"filter-no-custom-fields": "Sin campos personalizados",
|
||||
"filter-show-archive": "Mostrar las listas archivadas",
|
||||
"filter-hide-empty": "Ocultar las listas vacías",
|
||||
"filter-on": "Filtrado activado",
|
||||
"filter-on-desc": "Estás filtrando tarjetas en este tablero. Haz clic aquí para editar el filtro.",
|
||||
"filter-to-selection": "Filtrar la selección",
|
||||
"advanced-filter-label": "Filtrado avanzado",
|
||||
"advanced-filter-description": "El filtrado avanzado permite escribir una cadena que contiene los siguientes operadores: == != <= >= && || ( ) Se utiliza un espacio como separador entre los operadores. Se pueden filtrar todos los campos personalizados escribiendo sus nombres y valores. Por ejemplo: Campo1 == Valor1. Nota: Si los campos o valores contienen espacios, deben encapsularse entre comillas simples. Por ejemplo: 'Campo 1' == 'Valor 1'. Para omitir los caracteres de control único (' \\/), se usa \\. Por ejemplo: Campo1 = I\\'m. También se pueden combinar múltiples condiciones. Por ejemplo: C1 == V1 || C1 == V2. Normalmente todos los operadores se interpretan de izquierda a derecha. Se puede cambiar el orden colocando paréntesis. Por ejemplo: C1 == V1 && ( C2 == V2 || C2 == V3 ). También se puede buscar en campos de texto usando expresiones regulares: C1 == /Tes.*/i",
|
||||
"fullname": "Nombre completo",
|
||||
"header-logo-title": "Volver a tu página de tableros",
|
||||
"hide-system-messages": "Ocultar las notificaciones de actividad",
|
||||
"headerBarCreateBoardPopup-title": "Crear tablero",
|
||||
"home": "Inicio",
|
||||
"import": "Importar",
|
||||
"link": "Enlace",
|
||||
"import-board": "importar un tablero",
|
||||
"import-board-c": "Importar un tablero",
|
||||
"import-board-title-trello": "Importar un tablero desde Trello",
|
||||
"import-board-title-wekan": "Importar tablero desde una exportación previa",
|
||||
"import-board-title-csv": "Importar tablero desde CSV/TSV",
|
||||
"from-trello": "Desde Trello",
|
||||
"from-wekan": "Desde exportación previa",
|
||||
"from-csv": "Desde CSV/TSV",
|
||||
"import-board-instruction-trello": "En tu tablero de Trello, ve a 'Menú', luego 'Más' > 'Imprimir y exportar' > 'Exportar JSON', y copia el texto resultante.",
|
||||
"import-board-instruction-csv": "Pegue en sus Valores separados por coma(CSV)/Valores separados por tab(TSV).",
|
||||
"import-board-instruction-wekan": "En tu tablero, vete a 'Menú', luego 'Exportar tablero', y copia el texto en el archivo descargado.",
|
||||
"import-board-instruction-about-errors": "Aunque obtengas errores cuando importes el tablero, a veces la importación funciona igualmente, y el tablero se encontrará en la página de tableros.",
|
||||
"import-json-placeholder": "Pega tus datos JSON válidos aquí",
|
||||
"import-csv-placeholder": "Paste your valid CSV/TSV data here",
|
||||
"import-map-members": "Mapa de miembros",
|
||||
"import-members-map": "Tu tablero importado tiene algunos miembros. Por favor, mapea los miembros que quieres importar con tus usuarios.",
|
||||
"import-show-user-mapping": "Revisión de la asignación de miembros",
|
||||
"import-user-select": "Selecciona el miembro existe que quieres usar como este miembro.",
|
||||
"importMapMembersAddPopup-title": "Seleccionar miembro",
|
||||
"info": "Versión",
|
||||
"initials": "Iniciales",
|
||||
"invalid-date": "Fecha no válida",
|
||||
"invalid-time": "Tiempo no válido",
|
||||
"invalid-user": "Usuario no válido",
|
||||
"joined": "se ha unido",
|
||||
"just-invited": "Has sido invitado a este tablero",
|
||||
"keyboard-shortcuts": "Atajos de teclado",
|
||||
"label-create": "Crear una etiqueta",
|
||||
"label-default": "etiqueta %s (por defecto)",
|
||||
"label-delete-pop": "Se eliminará esta etiqueta de todas las tarjetas y se destruirá su historial. Esta acción no puede deshacerse.",
|
||||
"labels": "Etiquetas",
|
||||
"language": "Cambiar el idioma",
|
||||
"last-admin-desc": "No puedes cambiar roles porque debe haber al menos un administrador.",
|
||||
"leave-board": "Abandonar el tablero",
|
||||
"leave-board-pop": "¿Seguro que quieres abandonar __boardTitle__? Serás desvinculado de todas las tarjetas en este tablero.",
|
||||
"leaveBoardPopup-title": "¿Abandonar el tablero?",
|
||||
"link-card": "Enlazar a esta tarjeta",
|
||||
"list-archive-cards": "Archivar todas las tarjetas de esta lista",
|
||||
"list-archive-cards-pop": "Esto eliminará del tablero todas las tarjetas en esta lista. Para ver las tarjetas en el Archivo y recuperarlas al tablero haga click en \"Menu\" > \"Archivo\"",
|
||||
"list-move-cards": "Mover todas las tarjetas de esta lista",
|
||||
"list-select-cards": "Seleccionar todas las tarjetas de esta lista",
|
||||
"set-color-list": "Cambiar el color",
|
||||
"listActionPopup-title": "Acciones de la lista",
|
||||
"swimlaneActionPopup-title": "Acciones del carril de flujo",
|
||||
"swimlaneAddPopup-title": "Añadir un carril de flujo debajo",
|
||||
"listImportCardPopup-title": "Importar una tarjeta de Trello",
|
||||
"listImportCardsTsvPopup-title": "Import Excel CSV/TSV",
|
||||
"listMorePopup-title": "Más",
|
||||
"link-list": "Enlazar a esta lista",
|
||||
"list-delete-pop": "Todas las acciones serán eliminadas del historial de actividades y no se podrá recuperar la lista. Esta acción no puede deshacerse.",
|
||||
"list-delete-suggest-archive": "Puedes mover una lista al Archivo para quitarla del tablero y preservar la actividad.",
|
||||
"lists": "Listas",
|
||||
"swimlanes": "Carriles",
|
||||
"log-out": "Finalizar la sesión",
|
||||
"log-in": "Iniciar sesión",
|
||||
"loginPopup-title": "Iniciar sesión",
|
||||
"memberMenuPopup-title": "Preferencias de miembro",
|
||||
"members": "Miembros",
|
||||
"menu": "Menú",
|
||||
"move-selection": "Mover la selección",
|
||||
"moveCardPopup-title": "Mover la tarjeta",
|
||||
"moveCardToBottom-title": "Mover al final",
|
||||
"moveCardToTop-title": "Mover al principio",
|
||||
"moveSelectionPopup-title": "Mover la selección",
|
||||
"multi-selection": "Selección múltiple",
|
||||
"multi-selection-on": "Selección múltiple activada",
|
||||
"muted": "Silenciado",
|
||||
"muted-info": "No serás notificado de ningún cambio en este tablero",
|
||||
"my-boards": "Mis tableros",
|
||||
"name": "Nombre",
|
||||
"no-archived-cards": "No hay tarjetas archivadas.",
|
||||
"no-archived-lists": "No hay listas archivadas.",
|
||||
"no-archived-swimlanes": "No hay carriles archivados.",
|
||||
"no-results": "Sin resultados",
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Puedes ver y editar tarjetas. No puedes cambiar la configuración.",
|
||||
"not-accepted-yet": "La invitación no ha sido aceptada aún",
|
||||
"notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participas como creador o miembro",
|
||||
"notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando",
|
||||
"optional": "opcional",
|
||||
"or": "o",
|
||||
"page-maybe-private": "Esta página puede ser privada. Es posible que puedas verla al <a href='%s'>iniciar sesión</a>.",
|
||||
"page-not-found": "Página no encontrada.",
|
||||
"password": "Contraseña",
|
||||
"paste-or-dragdrop": "pegar o arrastrar y soltar un fichero de imagen (sólo imagen)",
|
||||
"participating": "Participando",
|
||||
"preview": "Previsualizar",
|
||||
"previewAttachedImagePopup-title": "Previsualizar",
|
||||
"previewClipboardImagePopup-title": "Previsualizar",
|
||||
"private": "Privado",
|
||||
"private-desc": "Este tablero es privado. Sólo las personas añadidas al tablero pueden verlo y editarlo.",
|
||||
"profile": "Perfil",
|
||||
"public": "Público",
|
||||
"public-desc": "Este tablero es público. Es visible para cualquiera a través del enlace, y se mostrará en los buscadores como Google. Sólo las personas añadidas al tablero pueden editarlo.",
|
||||
"quick-access-description": "Destaca un tablero para añadir un acceso directo en esta barra.",
|
||||
"remove-cover": "Eliminar portada",
|
||||
"remove-from-board": "Desvincular del tablero",
|
||||
"remove-label": "Eliminar la etiqueta",
|
||||
"listDeletePopup-title": "¿Eliminar la lista?",
|
||||
"remove-member": "Eliminar miembro",
|
||||
"remove-member-from-card": "Eliminar de la tarjeta",
|
||||
"remove-member-pop": "¿Eliminar __name__ (__username__) de __boardTitle__? El miembro será eliminado de todas las tarjetas de este tablero. En ellas se mostrará una notificación.",
|
||||
"removeMemberPopup-title": "¿Eliminar miembro?",
|
||||
"rename": "Renombrar",
|
||||
"rename-board": "Renombrar el tablero",
|
||||
"restore": "Restaurar",
|
||||
"save": "Añadir",
|
||||
"search": "Buscar",
|
||||
"rules": "Reglas",
|
||||
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
|
||||
"search-example": "¿Texto a buscar?",
|
||||
"select-color": "Seleccionar el color",
|
||||
"set-wip-limit-value": "Cambiar el límite para el número máximo de tareas en esta lista.",
|
||||
"setWipLimitPopup-title": "Cambiar el límite del trabajo en proceso",
|
||||
"shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual",
|
||||
"shortcut-autocomplete-emoji": "Autocompletar emoji",
|
||||
"shortcut-autocomplete-members": "Autocompletar miembros",
|
||||
"shortcut-clear-filters": "Limpiar todos los filtros",
|
||||
"shortcut-close-dialog": "Cerrar el cuadro de diálogo",
|
||||
"shortcut-filter-my-cards": "Filtrar mis tarjetas",
|
||||
"shortcut-show-shortcuts": "Mostrar esta lista de atajos",
|
||||
"shortcut-toggle-filterbar": "Conmutar la barra lateral del filtro",
|
||||
"shortcut-toggle-sidebar": "Conmutar la barra lateral del tablero",
|
||||
"show-cards-minimum-count": "Mostrar recuento de tarjetas si la lista contiene más de",
|
||||
"sidebar-open": "Abrir la barra lateral",
|
||||
"sidebar-close": "Cerrar la barra lateral",
|
||||
"signupPopup-title": "Crear una cuenta",
|
||||
"star-board-title": "Haz clic para destacar este tablero. Se mostrará en la parte superior de tu lista de tableros.",
|
||||
"starred-boards": "Tableros destacados",
|
||||
"starred-boards-description": "Los tableros destacados se mostrarán en la parte superior de tu lista de tableros.",
|
||||
"subscribe": "Suscribirse",
|
||||
"team": "Equipo",
|
||||
"this-board": "este tablero",
|
||||
"this-card": "esta tarjeta",
|
||||
"spent-time-hours": "Tiempo consumido (horas)",
|
||||
"overtime-hours": "Tiempo excesivo (horas)",
|
||||
"overtime": "Tiempo excesivo",
|
||||
"has-overtime-cards": "Hay tarjetas con el tiempo excedido",
|
||||
"has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
|
||||
"time": "Hora",
|
||||
"title": "Título",
|
||||
"tracking": "Siguiendo",
|
||||
"tracking-info": "Serás notificado de cualquier cambio en las tarjetas en las que participas como creador o miembro.",
|
||||
"type": "Tipo",
|
||||
"unassign-member": "Desvincular al miembro",
|
||||
"unsaved-description": "Tienes una descripción por añadir.",
|
||||
"unwatch": "Dejar de vigilar",
|
||||
"upload": "Cargar",
|
||||
"upload-avatar": "Cargar un avatar",
|
||||
"uploaded-avatar": "Avatar cargado",
|
||||
"username": "Nombre de usuario",
|
||||
"view-it": "Verla",
|
||||
"warn-list-archived": "advertencia: esta tarjeta está en una lista en el Archivo",
|
||||
"watch": "Vigilar",
|
||||
"watching": "Vigilando",
|
||||
"watching-info": "Serás notificado de cualquier cambio en este tablero",
|
||||
"welcome-board": "Tablero de bienvenida",
|
||||
"welcome-swimlane": "Hito 1",
|
||||
"welcome-list1": "Básicos",
|
||||
"welcome-list2": "Avanzados",
|
||||
"card-templates-swimlane": "Plantilla de tarjeta",
|
||||
"list-templates-swimlane": "Listar plantillas",
|
||||
"board-templates-swimlane": "Plantilla de tablero",
|
||||
"what-to-do": "¿Qué quieres hacer?",
|
||||
"wipLimitErrorPopup-title": "El límite del trabajo en proceso no es válido.",
|
||||
"wipLimitErrorPopup-dialog-pt1": "El número de tareas en esta lista es mayor que el límite del trabajo en proceso que has definido.",
|
||||
"wipLimitErrorPopup-dialog-pt2": "Por favor, mueve algunas tareas fuera de esta lista, o fija un límite del trabajo en proceso más alto.",
|
||||
"admin-panel": "Panel del administrador",
|
||||
"settings": "Preferencias",
|
||||
"people": "Personas",
|
||||
"registration": "Registro",
|
||||
"disable-self-registration": "Deshabilitar autoregistro",
|
||||
"invite": "Invitar",
|
||||
"invite-people": "Invitar a personas",
|
||||
"to-boards": "A el(los) tablero(s)",
|
||||
"email-addresses": "Direcciones de correo electrónico",
|
||||
"smtp-host-description": "Dirección del servidor SMTP para gestionar tus correos",
|
||||
"smtp-port-description": "Puerto usado por el servidor SMTP para mandar correos",
|
||||
"smtp-tls-description": "Habilitar el soporte TLS para el servidor SMTP",
|
||||
"smtp-host": "Servidor SMTP",
|
||||
"smtp-port": "Puerto SMTP",
|
||||
"smtp-username": "Nombre de usuario",
|
||||
"smtp-password": "Contraseña",
|
||||
"smtp-tls": "Soporte TLS",
|
||||
"send-from": "Desde",
|
||||
"send-smtp-test": "Enviarte un correo de prueba a ti mismo",
|
||||
"invitation-code": "Código de Invitación",
|
||||
"email-invite-register-subject": "__inviter__ te ha enviado una invitación",
|
||||
"email-invite-register-text": "Querido __user__,\n__inviter__ le invita al tablero kanban para colaborar.\n\nPor favor, siga el siguiente enlace:\n__url__\n\nY tu código de invitación es: __icode__\n\nGracias.",
|
||||
"email-smtp-test-subject": "Prueba de email SMTP",
|
||||
"email-smtp-test-text": "El correo se ha enviado correctamente",
|
||||
"error-invitation-code-not-exist": "El código de invitación no existe",
|
||||
"error-notAuthorized": "No estás autorizado a ver esta página.",
|
||||
"webhook-title": "Nombre del Webhook",
|
||||
"webhook-token": "Token (opcional para la autenticación)",
|
||||
"outgoing-webhooks": "Webhooks salientes",
|
||||
"bidirectional-webhooks": "Webhooks de doble sentido",
|
||||
"outgoingWebhooksPopup-title": "Webhooks salientes",
|
||||
"boardCardTitlePopup-title": "Filtro de títulos de tarjeta",
|
||||
"disable-webhook": "Deshabilitar este Webhook",
|
||||
"global-webhook": "Webhooks globales",
|
||||
"new-outgoing-webhook": "Nuevo webhook saliente",
|
||||
"no-name": "(Desconocido)",
|
||||
"Node_version": "Versión de Node",
|
||||
"Meteor_version": "Versión de Meteor",
|
||||
"MongoDB_version": "Versión de MongoDB",
|
||||
"MongoDB_storage_engine": "Motor de almacenamiento de MongoDB",
|
||||
"MongoDB_Oplog_enabled": "Oplog de MongoDB habilitado",
|
||||
"OS_Arch": "Arquitectura del sistema",
|
||||
"OS_Cpus": "Número de CPUs del sistema",
|
||||
"OS_Freemem": "Memoria libre del sistema",
|
||||
"OS_Loadavg": "Carga media del sistema",
|
||||
"OS_Platform": "Plataforma del sistema",
|
||||
"OS_Release": "Publicación del sistema",
|
||||
"OS_Totalmem": "Memoria total del sistema",
|
||||
"OS_Type": "Tipo de sistema",
|
||||
"OS_Uptime": "Tiempo activo del sistema",
|
||||
"days": "días",
|
||||
"hours": "horas",
|
||||
"minutes": "minutos",
|
||||
"seconds": "segundos",
|
||||
"show-field-on-card": "Mostrar este campo en la tarjeta",
|
||||
"automatically-field-on-card": "Crear campos automáticamente para todas las tarjetas.",
|
||||
"showLabel-field-on-card": "Mostrar etiquetas de campos en la minitarjeta.",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"accounts": "Cuentas",
|
||||
"accounts-allowEmailChange": "Permitir cambiar el correo electrónico",
|
||||
"accounts-allowUserNameChange": "Permitir cambiar el nombre de usuario",
|
||||
"createdAt": "Fecha de alta",
|
||||
"verified": "Verificado",
|
||||
"active": "Activo",
|
||||
"card-received": "Recibido",
|
||||
"card-received-on": "Recibido el",
|
||||
"card-end": "Finalizado",
|
||||
"card-end-on": "Finalizado el",
|
||||
"editCardReceivedDatePopup-title": "Cambiar la fecha de recepción",
|
||||
"editCardEndDatePopup-title": "Cambiar la fecha de finalización",
|
||||
"setCardColorPopup-title": "Cambiar el color",
|
||||
"setCardActionsColorPopup-title": "Elegir un color",
|
||||
"setSwimlaneColorPopup-title": "Elegir un color",
|
||||
"setListColorPopup-title": "Elegir un color",
|
||||
"assigned-by": "Asignado por",
|
||||
"requested-by": "Solicitado por",
|
||||
"board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.",
|
||||
"delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.",
|
||||
"boardDeletePopup-title": "¿Eliminar el tablero?",
|
||||
"delete-board": "Eliminar el tablero",
|
||||
"default-subtasks-board": "Subtareas para el tablero __board__",
|
||||
"default": "Por defecto",
|
||||
"queue": "Cola",
|
||||
"subtask-settings": "Preferencias de las subtareas",
|
||||
"card-settings": "Preferencias de la tarjeta",
|
||||
"boardSubtaskSettingsPopup-title": "Preferencias de las subtareas del tablero",
|
||||
"boardCardSettingsPopup-title": "Preferencias de la tarjeta",
|
||||
"deposit-subtasks-board": "Depositar subtareas en este tablero:",
|
||||
"deposit-subtasks-list": "Lista de destino para subtareas depositadas aquí:",
|
||||
"show-parent-in-minicard": "Mostrar el padre en una minitarjeta:",
|
||||
"prefix-with-full-path": "Prefijo con ruta completa",
|
||||
"prefix-with-parent": "Prefijo con el padre",
|
||||
"subtext-with-full-path": "Subtexto con ruta completa",
|
||||
"subtext-with-parent": "Subtexto con el padre",
|
||||
"change-card-parent": "Cambiar la tarjeta padre",
|
||||
"parent-card": "Tarjeta padre",
|
||||
"source-board": "Tablero de origen",
|
||||
"no-parent": "No mostrar la tarjeta padre",
|
||||
"activity-added-label": "añadida etiqueta %s a %s",
|
||||
"activity-removed-label": "eliminada etiqueta '%s' desde %s",
|
||||
"activity-delete-attach": "eliminado un adjunto desde %s",
|
||||
"activity-added-label-card": "añadida etiqueta '%s'",
|
||||
"activity-removed-label-card": "eliminada etiqueta '%s'",
|
||||
"activity-delete-attach-card": "eliminado un adjunto",
|
||||
"activity-set-customfield": "Cambiar el campo personalizado '%s' a '%s' en %s",
|
||||
"activity-unset-customfield": "Desmarcar el campo personalizado '%s' en %s",
|
||||
"r-rule": "Regla",
|
||||
"r-add-trigger": "Añadir disparador",
|
||||
"r-add-action": "Añadir acción",
|
||||
"r-board-rules": "Reglas del tablero",
|
||||
"r-add-rule": "Añadir regla",
|
||||
"r-view-rule": "Ver regla",
|
||||
"r-delete-rule": "Eliminar regla",
|
||||
"r-new-rule-name": "Nueva título de regla",
|
||||
"r-no-rules": "No hay reglas",
|
||||
"r-trigger": "Trigger",
|
||||
"r-action": "Action",
|
||||
"r-when-a-card": "Cuando una tarjeta",
|
||||
"r-is": "es",
|
||||
"r-is-moved": "es movida",
|
||||
"r-added-to": "Added to",
|
||||
"r-removed-from": "eliminado de",
|
||||
"r-the-board": "el tablero",
|
||||
"r-list": "la lista",
|
||||
"set-filter": "Filtrar",
|
||||
"r-moved-to": "Movido a",
|
||||
"r-moved-from": "Movido desde",
|
||||
"r-archived": "Se archivó",
|
||||
"r-unarchived": "Restaurado del archivo",
|
||||
"r-a-card": "una tarjeta",
|
||||
"r-when-a-label-is": "Cuando una etiqueta es",
|
||||
"r-when-the-label": "Cuando la etiqueta es",
|
||||
"r-list-name": "Nombre de lista",
|
||||
"r-when-a-member": "Cuando un miembro es",
|
||||
"r-when-the-member": "Cuando el miembro",
|
||||
"r-name": "nombre",
|
||||
"r-when-a-attach": "Cuando un adjunto",
|
||||
"r-when-a-checklist": "Cuando una lista de verificación es",
|
||||
"r-when-the-checklist": "Cuando la lista de verificación",
|
||||
"r-completed": "Completada",
|
||||
"r-made-incomplete": "Hecha incompleta",
|
||||
"r-when-a-item": "Cuando un elemento de la lista de verificación es",
|
||||
"r-when-the-item": "Cuando el elemento de la lista de verificación es",
|
||||
"r-checked": "Marcado",
|
||||
"r-unchecked": "Desmarcado",
|
||||
"r-move-card-to": "Mover la tarjeta",
|
||||
"r-top-of": "Arriba de",
|
||||
"r-bottom-of": "Abajo de",
|
||||
"r-its-list": "su lista",
|
||||
"r-archive": "Archivar",
|
||||
"r-unarchive": "Restaurar del Archivo",
|
||||
"r-card": "la tarjeta",
|
||||
"r-add": "Añadir",
|
||||
"r-remove": "Eliminar",
|
||||
"r-label": "etiqueta",
|
||||
"r-member": "miembro",
|
||||
"r-remove-all": "Eliminar todos los miembros de la tarjeta",
|
||||
"r-set-color": "Cambiar el color a",
|
||||
"r-checklist": "lista de verificación",
|
||||
"r-check-all": "Marcar todo",
|
||||
"r-uncheck-all": "Desmarcar todo",
|
||||
"r-items-check": "elementos de la lista de verificación",
|
||||
"r-check": "Marcar",
|
||||
"r-uncheck": "Desmarcar",
|
||||
"r-item": "elemento",
|
||||
"r-of-checklist": "de la lista de verificación",
|
||||
"r-send-email": "Enviar un email",
|
||||
"r-to": "a",
|
||||
"r-of": "of",
|
||||
"r-subject": "asunto",
|
||||
"r-rule-details": "Detalle de la regla",
|
||||
"r-d-move-to-top-gen": "Mover la tarjeta al inicio de su lista",
|
||||
"r-d-move-to-top-spec": "Mover la tarjeta al inicio de la lista",
|
||||
"r-d-move-to-bottom-gen": "Mover la tarjeta al final de su lista",
|
||||
"r-d-move-to-bottom-spec": "Mover la tarjeta al final de la lista",
|
||||
"r-d-send-email": "Enviar email",
|
||||
"r-d-send-email-to": "a",
|
||||
"r-d-send-email-subject": "asunto",
|
||||
"r-d-send-email-message": "mensaje",
|
||||
"r-d-archive": "Archivar la tarjeta",
|
||||
"r-d-unarchive": "Restaurar tarjeta del Archivo",
|
||||
"r-d-add-label": "Añadir etiqueta",
|
||||
"r-d-remove-label": "Eliminar etiqueta",
|
||||
"r-create-card": "Crear una nueva tarjeta",
|
||||
"r-in-list": "en la lista",
|
||||
"r-in-swimlane": "en el carril",
|
||||
"r-d-add-member": "Añadir miembro",
|
||||
"r-d-remove-member": "Eliminar miembro",
|
||||
"r-d-remove-all-member": "Eliminar todos los miembros",
|
||||
"r-d-check-all": "Marcar todos los elementos de una lista",
|
||||
"r-d-uncheck-all": "Desmarcar todos los elementos de una lista",
|
||||
"r-d-check-one": "Marcar elemento",
|
||||
"r-d-uncheck-one": "Desmarcar elemento",
|
||||
"r-d-check-of-list": "de la lista de verificación",
|
||||
"r-d-add-checklist": "Añadir una lista de verificación",
|
||||
"r-d-remove-checklist": "Eliminar lista de verificación",
|
||||
"r-by": "por",
|
||||
"r-add-checklist": "Añadir una lista de verificación",
|
||||
"r-with-items": "con items",
|
||||
"r-items-list": "item1,item2,item3",
|
||||
"r-add-swimlane": "Agregar el carril",
|
||||
"r-swimlane-name": "nombre del carril",
|
||||
"r-board-note": "Nota: deje un campo vacío para que coincida con todos los valores posibles",
|
||||
"r-checklist-note": "Nota: los ítems de la lista tienen que escribirse como valores separados por coma.",
|
||||
"r-when-a-card-is-moved": "Cuando una tarjeta es movida a otra lista",
|
||||
"r-set": "Cambiar",
|
||||
"r-update": "Actualizar",
|
||||
"r-datefield": "campo de fecha",
|
||||
"r-df-start-at": "comienza",
|
||||
"r-df-due-at": "vencimiento",
|
||||
"r-df-end-at": "finalizado",
|
||||
"r-df-received-at": "recibido",
|
||||
"r-to-current-datetime": "a la fecha/hora actual",
|
||||
"r-remove-value-from": "Eliminar el valor de",
|
||||
"ldap": "LDAP",
|
||||
"oauth2": "OAuth2",
|
||||
"cas": "CAS",
|
||||
"authentication-method": "Método de autenticación",
|
||||
"authentication-type": "Tipo de autenticación",
|
||||
"custom-product-name": "Nombre de producto personalizado",
|
||||
"layout": "Diseño",
|
||||
"hide-logo": "Ocultar el logo",
|
||||
"add-custom-html-after-body-start": "Añade HTML personalizado después de <body>",
|
||||
"add-custom-html-before-body-end": "Añade HTML personalizado después de </body>",
|
||||
"error-undefined": "Algo no está bien",
|
||||
"error-ldap-login": "Ocurrió un error al intentar acceder",
|
||||
"display-authentication-method": "Mostrar el método de autenticación",
|
||||
"default-authentication-method": "Método de autenticación por defecto",
|
||||
"duplicate-board": "Duplicar tablero",
|
||||
"people-number": "El número de personas es:",
|
||||
"swimlaneDeletePopup-title": "¿Eliminar el carril de flujo?",
|
||||
"swimlane-delete-pop": "Todas las acciones serán eliminadas del historial de actividades y no se podrá recuperar el carril de flujo. Esta acción no puede deshacerse.",
|
||||
"restore-all": "Restaurar todas",
|
||||
"delete-all": "Borrar todas",
|
||||
"loading": "Cargando. Por favor, espere.",
|
||||
"previous_as": "el último tiempo fue",
|
||||
"act-a-dueAt": "cambiada la hora de vencimiento a \nCuándo: __timeValue__\nDónde: __card__\n el vencimiento anterior fue __timeOldValue__",
|
||||
"act-a-endAt": "cambiada la hora de finalización a __timeValue__ Fecha anterior: (__timeOldValue__)",
|
||||
"act-a-startAt": "cambiada la hora de comienzo a __timeValue__ Fecha anterior: (__timeOldValue__)",
|
||||
"act-a-receivedAt": "cambiada la fecha de recepción a __timeValue__ Fecha anterior: (__timeOldValue__)",
|
||||
"a-dueAt": "cambiada la hora de vencimiento a",
|
||||
"a-endAt": "cambiada la hora de finalización a",
|
||||
"a-startAt": "cambiada la hora de comienzo a",
|
||||
"a-receivedAt": "cambiada la hora de recepción a",
|
||||
"almostdue": "está próxima la hora de vencimiento actual %s",
|
||||
"pastdue": "se sobrepasó la hora de vencimiento actual%s",
|
||||
"duenow": "la hora de vencimiento actual %s es hoy",
|
||||
"act-newDue": "__list__/__card__ tiene una 1ra notificación de vencimiento [__board__]",
|
||||
"act-withDue": "__list__/__card__ notificaciones de vencimiento [__board__]",
|
||||
"act-almostdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ está próximo",
|
||||
"act-pastdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ se sobrepasó",
|
||||
"act-duenow": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ es ahora",
|
||||
"act-atUserComment": "Se te mencionó en [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "¿Seguro que quieres eliminar esta cuenta? Esta acción no puede deshacerse.",
|
||||
"accounts-allowUserDelete": "Permitir a los usuarios eliminar su cuenta",
|
||||
"hide-minicard-label-text": "Ocultar el texto de la etiqueta de la minitarjeta",
|
||||
"show-desktop-drag-handles": "Mostrar los controles de arrastre del escritorio",
|
||||
"assignee": "Asignado",
|
||||
"cardAssigneesPopup-title": "Asignado",
|
||||
"addmore-detail": "Añadir una descripción detallada",
|
||||
"show-on-card": "Mostrar en la tarjeta",
|
||||
"new": "Nuevo",
|
||||
"editUserPopup-title": "Editar el usuario",
|
||||
"newUserPopup-title": "Nuevo usuario",
|
||||
"notifications": "Notificaciones",
|
||||
"view-all": "Ver todo",
|
||||
"filter-by-unread": "Filtrar por no leído",
|
||||
"mark-all-as-read": "Marcar todo como leido",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Permitir renombrar",
|
||||
"allowRenamePopup-title": "Permitir renombrar",
|
||||
"start-day-of-week": "Set day of the week start",
|
||||
"monday": "Lunes",
|
||||
"tuesday": "Martes",
|
||||
"wednesday": "Miércoles",
|
||||
"thursday": "Jueves",
|
||||
"friday": "Viernes",
|
||||
"saturday": "Sábado",
|
||||
"sunday": "Domingo",
|
||||
"status": "Status",
|
||||
"swimlane": "Swimlane",
|
||||
"owner": "Owner",
|
||||
"last-modified-at": "Last modified at",
|
||||
"last-activity": "Last activity",
|
||||
"voting": "Voting",
|
||||
"archived": "Archived",
|
||||
"delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
|
||||
"delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
|
||||
"hide-checked-items": "Hide checked items"
|
||||
}
|
||||
@@ -0,0 +1,815 @@
|
||||
{
|
||||
"accept": "Aceptar",
|
||||
"act-activity-notify": "Notificación de actividad",
|
||||
"act-addAttachment": "agregado el adjunto __attachment__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-deleteAttachment": "eliminado el adjunto __attachment__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addSubtask": "agregada la subtarea __subtask__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addLabel": "agregada la etiqueta __label__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addedLabel": "agregada la etiqueta __label__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeLabel": "eliminada la etiqueta __label__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removedLabel": "eliminada la etiqueta __label__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addChecklist": "agregada la lista de comprobación __checklist__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addChecklistItem": "agregado el elemento __checklistItem__ a la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeChecklist": "eliminada la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeChecklistItem": "eliminado el elemento __checklistItem__ de la lista de comprobación __checkList__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-checkedItem": "marcado el elemento __checklistItem__ de la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-uncheckedItem": "desmarcado el elemento __checklistItem__ de la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-completeChecklist": "completada la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-uncompleteChecklist": "no completada la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addComment": "comentario en la tarjeta__card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-editComment": "comentario editado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-deleteComment": "comentario eliminado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createBoard": "creó el tablero __board__",
|
||||
"act-createSwimlane": "creó el carril «swimlane» __swimlane__ en el tablero __board__",
|
||||
"act-createCard": "creada la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createCustomField": "creado el campo personalizado __customField__ en el tablero __board__",
|
||||
"act-deleteCustomField": "eliminado el campo personalizado __customField__ del tablero __board__",
|
||||
"act-setCustomField": "editado el campo personalizado __customField__: __customFieldValue__ en la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createList": "agregada la lista __list__ al tablero __board__",
|
||||
"act-addBoardMember": "agregado el mimbro __member__ al tablero __board__",
|
||||
"act-archivedBoard": "El tablero __board__ se ha archivado",
|
||||
"act-archivedCard": "La tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-archivedList": "La lista __list__ del carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-archivedSwimlane": "El carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-importBoard": "importado el tablero __board__",
|
||||
"act-importCard": "importada la tarjeta __card__ a la lista __list__ del carrril __swimlane__ del tablero __board__",
|
||||
"act-importList": "importada la lista __list__ al carril __swimlane__ del tablero __board__",
|
||||
"act-joinMember": "agregado el miembro __member__ a la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-moveCard": "movida la tarjeta __card__ del tablero __board__ de la lista __oldList__ del carril __oldSwimlane__ a la lista __list__ del carril __swimlane__",
|
||||
"act-moveCardToOtherBoard": "movida la tarjeta __card__ de la lista __oldList__ del carril __oldSwimlane__ del tablero __oldBoard__ a la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-removeBoardMember": "eliminado el miembro __member__ del tablero __board__",
|
||||
"act-restoredCard": "restaurada la tarjeta __card__ a la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-unjoinMember": "eliminado el miembro __member__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-withBoardTitle": "__board__",
|
||||
"act-withCardTitle": "[__board__] __card__",
|
||||
"actions": "Acciones",
|
||||
"activities": "Actividades",
|
||||
"activity": "Actividad",
|
||||
"activity-added": "ha agregado %s a %s",
|
||||
"activity-archived": "%s se ha archivado",
|
||||
"activity-attached": "ha adjuntado %s a %s",
|
||||
"activity-created": "ha creado %s",
|
||||
"activity-customfield-created": "creó el campo personalizado %s",
|
||||
"activity-excluded": "ha excluido %s de %s",
|
||||
"activity-imported": "ha importado %s a %s desde %s",
|
||||
"activity-imported-board": "ha importado %s desde %s",
|
||||
"activity-joined": "se ha unido a %s",
|
||||
"activity-moved": "ha movido %s de %s a %s",
|
||||
"activity-on": "en %s",
|
||||
"activity-removed": "ha eliminado %s de %s",
|
||||
"activity-sent": "ha enviado %s a %s",
|
||||
"activity-unjoined": "se ha desvinculado de %s",
|
||||
"activity-subtask-added": "ha agregado la subtarea a %s",
|
||||
"activity-checked-item": "marcado %s en la lista de comprobación %s de %s",
|
||||
"activity-unchecked-item": "desmarcado %s en la lista de comprobación %s de %s",
|
||||
"activity-checklist-added": "ha agregado una lista de comprobación a %s",
|
||||
"activity-checklist-removed": "eliminada una lista de comprobación desde %s",
|
||||
"activity-checklist-completed": "lista de comprobación completada %s de %s",
|
||||
"activity-checklist-uncompleted": "no completado la lista de comprobación %s de %s",
|
||||
"activity-checklist-item-added": "ha agregado el elemento de la lista de comprobación a «%s» en %s",
|
||||
"activity-checklist-item-removed": "eliminado un elemento de la lista de comprobación desde «%s» en %s",
|
||||
"add": "Agregar",
|
||||
"activity-checked-item-card": "marcado %s en la lista de comprobación %s",
|
||||
"activity-unchecked-item-card": "desmarcado %s en la lista de comprobación %s",
|
||||
"activity-checklist-completed-card": "completada la lista de comprobación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"activity-checklist-uncompleted-card": "no completó la lista de comprobación %s",
|
||||
"activity-editComment": "comentario editado",
|
||||
"activity-deleteComment": "comentario eliminado",
|
||||
"add-attachment": "Agregar adjunto",
|
||||
"add-board": "Agregar tablero",
|
||||
"add-card": "Agregar una tarjeta",
|
||||
"add-swimlane": "Agregar un carril «swimlane»",
|
||||
"add-subtask": "Agregar subtarea",
|
||||
"add-checklist": "Agregar lista de comprobación",
|
||||
"add-checklist-item": "Agregar un elemento a la lista de comprobación",
|
||||
"add-cover": "Agregar portada",
|
||||
"add-label": "Agregar una etiqueta",
|
||||
"add-list": "Agregar una lista",
|
||||
"add-members": "Agregar miembros",
|
||||
"added": "Agregada el",
|
||||
"addMemberPopup-title": "Miembros",
|
||||
"admin": "Administrador",
|
||||
"admin-desc": "Puede ver y editar tarjetas, eliminar miembros y cambiar la configuración del tablero.",
|
||||
"admin-announcement": "Anuncio",
|
||||
"admin-announcement-active": "Habilitar los anuncios en todo el sistema",
|
||||
"admin-announcement-title": "Anuncio del administrador",
|
||||
"all-boards": "Todos los tableros",
|
||||
"and-n-other-card": "y __count__ tarjeta más",
|
||||
"and-n-other-card_plural": "y otras __count__ tarjetas",
|
||||
"apply": "Aplicar",
|
||||
"app-is-offline": "Cargando, por favor espere. Actualizar la página causará pérdida de datos. Si la carga no funciona, por favor compruebe que el servidor no se ha detenido.",
|
||||
"archive": "Archivar",
|
||||
"archive-all": "Archivar todo",
|
||||
"archive-board": "Archivar este tablero",
|
||||
"archive-card": "Archivar esta tarjeta",
|
||||
"archive-list": "Archivar esta lista",
|
||||
"archive-swimlane": "Archivar este carril",
|
||||
"archive-selection": "Archivar esta selección",
|
||||
"archiveBoardPopup-title": "¿Archivar este tablero?",
|
||||
"archived-items": "Archivo",
|
||||
"archived-boards": "Tableros en el archivo",
|
||||
"restore-board": "Restaurar el tablero",
|
||||
"no-archived-boards": "No hay tableros en el archivo",
|
||||
"archives": "Archivo",
|
||||
"template": "Plantilla",
|
||||
"templates": "Plantillas",
|
||||
"assign-member": "Asignar miembros",
|
||||
"attached": "adjuntado",
|
||||
"attachment": "Adjunto",
|
||||
"attachment-delete-pop": "La eliminación de un fichero adjunto es permanente. Esta acción no puede deshacerse.",
|
||||
"attachmentDeletePopup-title": "¿Eliminar el adjunto?",
|
||||
"attachments": "Adjuntos",
|
||||
"auto-watch": "Suscribirse automáticamente a los tableros cuando son creados",
|
||||
"avatar-too-big": "El avatar es muy grande (70 KB máx.)",
|
||||
"back": "Atrás",
|
||||
"board-change-color": "Cambiar el color",
|
||||
"board-nb-stars": "%s destacados",
|
||||
"board-not-found": "Tablero no encontrado",
|
||||
"board-private-info": "Este tablero será <strong>privado</strong>.",
|
||||
"board-public-info": "Este tablero será <strong>público</strong>.",
|
||||
"boardChangeColorPopup-title": "Cambiar el fondo del tablero",
|
||||
"boardChangeTitlePopup-title": "Renombrar el tablero",
|
||||
"boardChangeVisibilityPopup-title": "Cambiar visibilidad",
|
||||
"boardChangeWatchPopup-title": "Cambiar vigilancia",
|
||||
"boardMenuPopup-title": "Configuración del tablero",
|
||||
"boardChangeViewPopup-title": "Vista del tablero",
|
||||
"boards": "Tableros",
|
||||
"board-view": "Vista del tablero",
|
||||
"board-view-cal": "Calendario",
|
||||
"board-view-swimlanes": "Carriles",
|
||||
"board-view-collapse": "Contraer",
|
||||
"board-view-lists": "Listas",
|
||||
"bucket-example": "Como «Cosas por hacer» por ejemplo",
|
||||
"cancel": "Cancelar",
|
||||
"card-archived": "Se archivó esta tarjeta",
|
||||
"board-archived": "Se archivó este tablero",
|
||||
"card-comments-title": "Esta tarjeta tiene %s comentarios.",
|
||||
"card-delete-notice": "la eliminación es permanente. Perderá todas las acciones asociadas a esta tarjeta.",
|
||||
"card-delete-pop": "Se eliminarán todas las acciones de la fuente de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.",
|
||||
"card-delete-suggest-archive": "Puede mover una tarjeta al archivo para quitarla del tablero y preservar la actividad.",
|
||||
"card-due": "Vence",
|
||||
"card-due-on": "Vence el",
|
||||
"card-spent": "Tiempo consumido",
|
||||
"card-edit-attachments": "Editar los adjuntos",
|
||||
"card-edit-custom-fields": "Editar los campos personalizados",
|
||||
"card-edit-labels": "Editar las etiquetas",
|
||||
"card-edit-members": "Editar los miembros",
|
||||
"card-labels-title": "Cambia las etiquetas de la tarjeta.",
|
||||
"card-members-title": "Agregar o eliminar miembros del tablero desde la tarjeta.",
|
||||
"card-start": "Comienza",
|
||||
"card-start-on": "Comienza el",
|
||||
"cardAttachmentsPopup-title": "Adjuntar desde",
|
||||
"cardCustomField-datePopup-title": "Cambiar la fecha",
|
||||
"cardCustomFieldsPopup-title": "Editar los campos personalizados",
|
||||
"cardStartVotingPopup-title": "Comience a votar",
|
||||
"positiveVoteMembersPopup-title": "Favorables",
|
||||
"negativeVoteMembersPopup-title": "Contrarios",
|
||||
"card-edit-voting": "Editar votación",
|
||||
"editVoteEndDatePopup-title": "Cambie fecha de termino del voto",
|
||||
"allowNonBoardMembers": "Permitir todos los usuarios autentificados",
|
||||
"vote-question": "Pregunta de votación",
|
||||
"vote-public": "Mostrar quien voto que",
|
||||
"vote-for-it": "por esto",
|
||||
"vote-against": "contrarios",
|
||||
"deleteVotePopup-title": "¿Borrar voto?",
|
||||
"vote-delete-pop": "El borrado es permanente. Perderá todas las acciones asociadas con este voto.",
|
||||
"cardDeletePopup-title": "¿Eliminar la tarjeta?",
|
||||
"cardDetailsActionsPopup-title": "Acciones de la tarjeta",
|
||||
"cardLabelsPopup-title": "Etiquetas",
|
||||
"cardMembersPopup-title": "Miembros",
|
||||
"cardMorePopup-title": "Más",
|
||||
"cardTemplatePopup-title": "Crear plantilla",
|
||||
"cards": "Tarjetas",
|
||||
"cards-count": "Tarjetas",
|
||||
"casSignIn": "Iniciar sesión con CAS",
|
||||
"cardType-card": "Tarjeta",
|
||||
"cardType-linkedCard": "Tarjeta enlazada",
|
||||
"cardType-linkedBoard": "Tablero enlazado",
|
||||
"change": "Cambiar",
|
||||
"change-avatar": "Cambiar el avatar",
|
||||
"change-password": "Cambiar la contraseña",
|
||||
"change-permissions": "Cambiar los permisos",
|
||||
"change-settings": "Cambiar la configuración",
|
||||
"changeAvatarPopup-title": "Cambiar el avatar",
|
||||
"changeLanguagePopup-title": "Cambiar el idioma",
|
||||
"changePasswordPopup-title": "Cambiar la contraseña",
|
||||
"changePermissionsPopup-title": "Cambiar los permisos",
|
||||
"changeSettingsPopup-title": "Cambiar la configuración",
|
||||
"subtasks": "Subtareas",
|
||||
"checklists": "Listas de comprobación",
|
||||
"click-to-star": "Haga clic para destacar este tablero.",
|
||||
"click-to-unstar": "Haga clic para dejar de destacar este tablero.",
|
||||
"clipboard": "el portapapeles o con arrastrar y soltar",
|
||||
"close": "Cerrar",
|
||||
"close-board": "Cerrar el tablero",
|
||||
"close-board-pop": "Podrá restaurar el tablero haciendo clic en el botón «Archivo» de la cabecera de inicio.",
|
||||
"color-black": "negro",
|
||||
"color-blue": "azul",
|
||||
"color-crimson": "carmesí",
|
||||
"color-darkgreen": "verde oscuro",
|
||||
"color-gold": "oro",
|
||||
"color-gray": "gris",
|
||||
"color-green": "verde",
|
||||
"color-indigo": "añil",
|
||||
"color-lime": "lima",
|
||||
"color-magenta": "magenta",
|
||||
"color-mistyrose": "rosa claro",
|
||||
"color-navy": "azul marino",
|
||||
"color-orange": "naranja",
|
||||
"color-paleturquoise": "turquesa",
|
||||
"color-peachpuff": "melocotón",
|
||||
"color-pink": "rosa",
|
||||
"color-plum": "púrpura",
|
||||
"color-purple": "violeta",
|
||||
"color-red": "roja",
|
||||
"color-saddlebrown": "marrón",
|
||||
"color-silver": "plata",
|
||||
"color-sky": "celeste",
|
||||
"color-slateblue": "azul",
|
||||
"color-white": "blanco",
|
||||
"color-yellow": "amarillo",
|
||||
"unset-color": "Desmarcar",
|
||||
"comment": "Comentar",
|
||||
"comment-placeholder": "Escribir comentario",
|
||||
"comment-only": "Sólo comentarios",
|
||||
"comment-only-desc": "Sólo puede comentar en las tarjetas.",
|
||||
"no-comments": "No hay comentarios",
|
||||
"no-comments-desc": "No se pueden mostrar comentarios ni actividades.",
|
||||
"worker": "Trabajador",
|
||||
"worker-desc": "Sólo puede mover tarjetas, asignarse a la tarjeta y comentar.",
|
||||
"computer": "Computadora",
|
||||
"confirm-subtask-delete-dialog": "¿Seguro que desea eliminar la subtarea?",
|
||||
"confirm-checklist-delete-dialog": "¿Seguro que desea eliminar la lista de comprobación?",
|
||||
"copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles",
|
||||
"linkCardPopup-title": "Enlazar tarjeta",
|
||||
"searchElementPopup-title": "Buscar",
|
||||
"copyCardPopup-title": "Copiar la tarjeta",
|
||||
"copyChecklistToManyCardsPopup-title": "Copiar la plantilla de la lista de comprobación en varias tarjetas",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Títulos y descripciones de las tarjetas de destino en formato JSON",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título de la primera tarjeta\", \"description\":\"Descripción de la primera tarjeta\"}, {\"title\":\"Título de la segunda tarjeta\",\"description\":\"Descripción de la segunda tarjeta\"},{\"title\":\"Título de la última tarjeta\",\"description\":\"Descripción de la última tarjeta\"} ]",
|
||||
"create": "Crear",
|
||||
"createBoardPopup-title": "Crear tablero",
|
||||
"chooseBoardSourcePopup-title": "Importar un tablero",
|
||||
"createLabelPopup-title": "Crear etiqueta",
|
||||
"createCustomField": "Crear un campo",
|
||||
"createCustomFieldPopup-title": "Crear un campo",
|
||||
"current": "actual",
|
||||
"custom-field-delete-pop": "Se eliminará este campo personalizado de todas las tarjetas y se destruirá su historial. Esta acción no puede deshacerse.",
|
||||
"custom-field-checkbox": "Casilla de verificación",
|
||||
"custom-field-currency": "Divisa",
|
||||
"custom-field-currency-option": "Código de divisa",
|
||||
"custom-field-date": "Fecha",
|
||||
"custom-field-dropdown": "Lista desplegable",
|
||||
"custom-field-dropdown-none": "(ninguno)",
|
||||
"custom-field-dropdown-options": "Opciones de la lista",
|
||||
"custom-field-dropdown-options-placeholder": "Presione Entrar para agregar más opciones",
|
||||
"custom-field-dropdown-unknown": "(desconocido)",
|
||||
"custom-field-number": "Número",
|
||||
"custom-field-text": "Texto",
|
||||
"custom-fields": "Campos personalizados",
|
||||
"date": "Fecha",
|
||||
"decline": "Declinar",
|
||||
"default-avatar": "Avatar por defecto",
|
||||
"delete": "Eliminar",
|
||||
"deleteCustomFieldPopup-title": "¿Eliminar el campo personalizado?",
|
||||
"deleteLabelPopup-title": "¿Eliminar la etiqueta?",
|
||||
"description": "Descripción",
|
||||
"disambiguateMultiLabelPopup-title": "Desambiguar la acción de etiqueta",
|
||||
"disambiguateMultiMemberPopup-title": "Desambiguar la acción de miembro",
|
||||
"discard": "Descartar",
|
||||
"done": "Hecho",
|
||||
"download": "Descargar",
|
||||
"edit": "Editar",
|
||||
"edit-avatar": "Cambiar el avatar",
|
||||
"edit-profile": "Editar el perfil",
|
||||
"edit-wip-limit": "Cambiar el límite del trabajo en proceso",
|
||||
"soft-wip-limit": "Límite del trabajo en proceso flexible",
|
||||
"editCardStartDatePopup-title": "Cambiar la fecha de comienzo",
|
||||
"editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
|
||||
"editCustomFieldPopup-title": "Editar el campo",
|
||||
"editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
|
||||
"editLabelPopup-title": "Cambiar la etiqueta",
|
||||
"editNotificationPopup-title": "Editar las notificaciones",
|
||||
"editProfilePopup-title": "Editar el perfil",
|
||||
"email": "Correo electrónico",
|
||||
"email-enrollAccount-subject": "Cuenta creada en __siteName__",
|
||||
"email-enrollAccount-text": "Hola __user__,\n\nPara empezar a utilizar el servicio, simplemente haga clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"email-fail": "Error al enviar el correo",
|
||||
"email-fail-text": "Error al intentar enviar el correo",
|
||||
"email-invalid": "Correo no válido",
|
||||
"email-invite": "Invitar vía correo electrónico",
|
||||
"email-invite-subject": "__inviter__ ha enviado una invitación",
|
||||
"email-invite-text": "Estimado __user__,\n\n__inviter__ le invita a unirse al tablero «__board__» para colaborar.\n\nPor favor, haga clic en el siguiente enlace:\n\n__url__\n\nGracias.",
|
||||
"email-resetPassword-subject": "Restablezca su contraseña en __siteName__",
|
||||
"email-resetPassword-text": "Hola __user__,\n\nPara restablecer su contraseña, simplemente haga clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"email-sent": "Correo enviado",
|
||||
"email-verifyEmail-subject": "Verifique su dirección de correo electrónico en __siteName__",
|
||||
"email-verifyEmail-text": "Hola __user__,\n\nPara verificar el correo electrónico de su cuenta, simplemente haga clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"enable-wip-limit": "Habilitar el límite del trabajo en proceso",
|
||||
"error-board-doesNotExist": "El tablero no existe",
|
||||
"error-board-notAdmin": "Es necesario ser administrador de este tablero para hacer eso",
|
||||
"error-board-notAMember": "Es necesario ser miembro de este tablero para hacer eso",
|
||||
"error-json-malformed": "El texto no es un JSON válido",
|
||||
"error-json-schema": "Sus datos JSON no incluyen la información apropiada en el formato correcto",
|
||||
"error-csv-schema": "Su archivo CSV (valores separados por comas) o TSV (valores separados por tabulaciones) no incluye la información adecuada en el formato correcto",
|
||||
"error-list-doesNotExist": "La lista no existe",
|
||||
"error-user-doesNotExist": "El usuario no existe",
|
||||
"error-user-notAllowSelf": "No se puede invitar a sí mismo",
|
||||
"error-user-notCreated": "El usuario no ha sido creado",
|
||||
"error-username-taken": "Este nombre de usuario ya está en uso",
|
||||
"error-email-taken": "Esta dirección de correo ya está en uso",
|
||||
"export-board": "Exportar tablero",
|
||||
"export-board-json": "Exportar tablero a JSON",
|
||||
"export-board-csv": "Exportar tablero a CSV",
|
||||
"export-board-tsv": "Exportar tablero a TSV",
|
||||
"export-board-html": "Exportar tablero a HTML",
|
||||
"exportBoardPopup-title": "Exportar tablero",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Clic para ordenar lista",
|
||||
"list-sort-by": "Ordenar la lista por:",
|
||||
"list-label-modifiedAt": "Hora de último acceso",
|
||||
"list-label-title": "Nombre de la lista",
|
||||
"list-label-sort": "Su orden manual",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrar",
|
||||
"filter-cards": "Filtrar tarjetas o listas",
|
||||
"list-filter-label": "Filtrar listas por título",
|
||||
"filter-clear": "Limpiar el filtro",
|
||||
"filter-no-label": "Sin etiqueta",
|
||||
"filter-no-member": "Sin miembro",
|
||||
"filter-no-assignee": "No asignado",
|
||||
"filter-no-custom-fields": "Sin campos personalizados",
|
||||
"filter-show-archive": "Mostrar las listas archivadas",
|
||||
"filter-hide-empty": "Ocultar las listas vacías",
|
||||
"filter-on": "Filtrado activado",
|
||||
"filter-on-desc": "Está filtrando las tarjetas en este tablero. Haga clic aquí para editar el filtro.",
|
||||
"filter-to-selection": "Filtrar la selección",
|
||||
"advanced-filter-label": "Filtrado avanzado",
|
||||
"advanced-filter-description": "El filtrado avanzado permite escribir una cadena que contiene los siguientes operadores: == != <= >= && || ( ) Se utiliza un espacio como separador entre los operadores. Se pueden filtrar todos los campos personalizados escribiendo sus nombres y valores. Por ejemplo: Campo1 == Valor1. Nota: Si los campos o valores contienen espacios, deben encapsularse entre comillas simples. Por ejemplo: 'Campo 1' == 'Valor 1'. Para omitir los caracteres de control único (' \\/), se usa \\. Por ejemplo: Campo1 = I\\'m. También se pueden combinar múltiples condiciones. Por ejemplo: C1 == V1 || C1 == V2. Normalmente todos los operadores se interpretan de izquierda a derecha. Se puede cambiar el orden colocando paréntesis. Por ejemplo: C1 == V1 && ( C2 == V2 || C2 == V3 ). También se puede buscar en campos de texto usando expresiones regulares: C1 == /Tes.*/i",
|
||||
"fullname": "Nombre completo",
|
||||
"header-logo-title": "Volver a su página de tableros",
|
||||
"hide-system-messages": "Ocultar las notificaciones de actividad",
|
||||
"headerBarCreateBoardPopup-title": "Crear tablero",
|
||||
"home": "Inicio",
|
||||
"import": "Importar",
|
||||
"link": "Enlace",
|
||||
"import-board": "importar un tablero",
|
||||
"import-board-c": "Importar un tablero",
|
||||
"import-board-title-trello": "Importar un tablero desde Trello",
|
||||
"import-board-title-wekan": "Importar tablero desde una exportación previa",
|
||||
"import-board-title-csv": "Importar tablero desde CSV/TSV",
|
||||
"from-trello": "Desde Trello",
|
||||
"from-wekan": "Desde exportación previa",
|
||||
"from-csv": "Desde CSV/TSV",
|
||||
"import-board-instruction-trello": "En su tablero de Trello, vaya a «Menú», luego «Más», «Imprimir y exportar», «Exportar en formato JSON», y copie el texto resultante.",
|
||||
"import-board-instruction-csv": "Pegue en sus Valores separados por comas (CSV)/Valores separados por tabulaciones (TSV).",
|
||||
"import-board-instruction-wekan": "En su tablero, vaya a «Menú», luego «Exportar tablero», y copie el texto en el archivo descargado.",
|
||||
"import-board-instruction-about-errors": "Si se obtienen errores al importar el tablero, a veces la importación sigue funcionando, y el tablero está en la página de todos los tableros.",
|
||||
"import-json-placeholder": "Pegue sus datos JSON válidos aquí",
|
||||
"import-csv-placeholder": "Pegue sus datos CSV/TSV válidos aquí",
|
||||
"import-map-members": "Asignar miembros",
|
||||
"import-members-map": "Su tablero importado tiene algunos miembros. Por favor, asigne los miembros que desea importar a sus usuarios",
|
||||
"import-show-user-mapping": "Revisión de la asignación de miembros",
|
||||
"import-user-select": "Elija su usuario existente que desea utilizar como este miembro",
|
||||
"importMapMembersAddPopup-title": "Seleccionar miembro",
|
||||
"info": "Versión",
|
||||
"initials": "Iniciales",
|
||||
"invalid-date": "Fecha no válida",
|
||||
"invalid-time": "Tiempo no válido",
|
||||
"invalid-user": "Usuario no válido",
|
||||
"joined": "se ha unido",
|
||||
"just-invited": "Ha sido invitado a este tablero",
|
||||
"keyboard-shortcuts": "Atajos de teclado",
|
||||
"label-create": "Crear una etiqueta",
|
||||
"label-default": "etiqueta %s (por defecto)",
|
||||
"label-delete-pop": "Se eliminará esta etiqueta de todas las tarjetas y se destruirá su historial. Esta acción no puede deshacerse.",
|
||||
"labels": "Etiquetas",
|
||||
"language": "Cambiar el idioma",
|
||||
"last-admin-desc": "No se pueden cambiar los roles porque debe haber al menos un administrador.",
|
||||
"leave-board": "Abandonar el tablero",
|
||||
"leave-board-pop": "¿Seguro que desea abandonar __boardTitle__? Será desvinculado de todas las tarjetas en este tablero.",
|
||||
"leaveBoardPopup-title": "¿Abandonar el tablero?",
|
||||
"link-card": "Enlazar a esta tarjeta",
|
||||
"list-archive-cards": "Archivar todas las tarjetas de esta lista",
|
||||
"list-archive-cards-pop": "Esto eliminará todas las tarjetas de esta lista del tablero. Para ver las tarjetas en el archivo y traerlas de vuelta al tablero, haga clic en «Menú» > «Archivo».",
|
||||
"list-move-cards": "Mover todas las tarjetas de esta lista",
|
||||
"list-select-cards": "Seleccionar todas las tarjetas de esta lista",
|
||||
"set-color-list": "Cambiar el color",
|
||||
"listActionPopup-title": "Acciones de la lista",
|
||||
"swimlaneActionPopup-title": "Acciones del carril «swimlane»",
|
||||
"swimlaneAddPopup-title": "Agregar un carril «swimlane» debajo",
|
||||
"listImportCardPopup-title": "Importar una tarjeta de Trello",
|
||||
"listImportCardsTsvPopup-title": "Importar CSV/TSV",
|
||||
"listMorePopup-title": "Más",
|
||||
"link-list": "Enlazar a esta lista",
|
||||
"list-delete-pop": "Todas las acciones serán eliminadas de la fuente de actividades y no se podrá recuperar la lista. Esta acción no puede deshacerse.",
|
||||
"list-delete-suggest-archive": "Puede mover una lista a archivo para eliminarla del tablero y preservar la actividad.",
|
||||
"lists": "Listas",
|
||||
"swimlanes": "Carriles",
|
||||
"log-out": "Finalizar la sesión",
|
||||
"log-in": "Iniciar sesión",
|
||||
"loginPopup-title": "Iniciar sesión",
|
||||
"memberMenuPopup-title": "Configuración de miembros",
|
||||
"members": "Miembros",
|
||||
"menu": "Menú",
|
||||
"move-selection": "Mover la selección",
|
||||
"moveCardPopup-title": "Mover la tarjeta",
|
||||
"moveCardToBottom-title": "Mover al final",
|
||||
"moveCardToTop-title": "Mover al principio",
|
||||
"moveSelectionPopup-title": "Mover la selección",
|
||||
"multi-selection": "Selección múltiple",
|
||||
"multi-selection-on": "Selección múltiple activada",
|
||||
"muted": "Silenciado",
|
||||
"muted-info": "Nunca se le notificará ningún cambio en este tablero",
|
||||
"my-boards": "Mis tableros",
|
||||
"name": "Nombre",
|
||||
"no-archived-cards": "No hay tarjetas archivadas.",
|
||||
"no-archived-lists": "No hay listas archivadas.",
|
||||
"no-archived-swimlanes": "No hay carriles archivados.",
|
||||
"no-results": "Sin resultados",
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Puede ver y editar las tarjetas. No puede cambiar la configuración.",
|
||||
"not-accepted-yet": "La invitación no ha sido aceptada aún",
|
||||
"notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participas como creador o miembro",
|
||||
"notify-watch": "Recibir actualizaciones de cualquier tablero, lista o tarjeta que esté vigilando",
|
||||
"optional": "opcional",
|
||||
"or": "o",
|
||||
"page-maybe-private": "Esta página puede ser privada. Puede verla <a href='%s'>iniciando sesión</a>.",
|
||||
"page-not-found": "Página no encontrada.",
|
||||
"password": "Contraseña",
|
||||
"paste-or-dragdrop": "pegar o arrastrar y soltar un fichero de imagen (sólo imagen)",
|
||||
"participating": "Participando",
|
||||
"preview": "Previsualizar",
|
||||
"previewAttachedImagePopup-title": "Previsualizar",
|
||||
"previewClipboardImagePopup-title": "Previsualizar",
|
||||
"private": "Privado",
|
||||
"private-desc": "Este tablero es privado. Sólo las personas agregadas al tablero pueden verlo y editarlo.",
|
||||
"profile": "Perfil",
|
||||
"public": "Público",
|
||||
"public-desc": "Este tablero es público. Es visible para cualquiera a través del enlace, y se mostrará en los buscadores como Google. Sólo las personas agregadas al tablero pueden editarlo.",
|
||||
"quick-access-description": "Destaca un tablero para añadir un acceso directo en esta barra.",
|
||||
"remove-cover": "Eliminar portada",
|
||||
"remove-from-board": "Desvincular del tablero",
|
||||
"remove-label": "Eliminar la etiqueta",
|
||||
"listDeletePopup-title": "¿Eliminar la lista?",
|
||||
"remove-member": "Eliminar miembro",
|
||||
"remove-member-from-card": "Eliminar de la tarjeta",
|
||||
"remove-member-pop": "¿Eliminar a __name__ (__username__) de __boardTitle__? El miembro será eliminado de todas las tarjetas de este tablero y recibirá una notificación.",
|
||||
"removeMemberPopup-title": "¿Eliminar miembro?",
|
||||
"rename": "Renombrar",
|
||||
"rename-board": "Renombrar el tablero",
|
||||
"restore": "Restaurar",
|
||||
"save": "Guardar",
|
||||
"search": "Buscar",
|
||||
"rules": "Reglas",
|
||||
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
|
||||
"search-example": "¿Texto a buscar?",
|
||||
"select-color": "Seleccionar el color",
|
||||
"set-wip-limit-value": "Cambiar el límite para el número máximo de tareas en esta lista.",
|
||||
"setWipLimitPopup-title": "Cambiar el límite del trabajo en proceso",
|
||||
"shortcut-assign-self": "Asignarse a la tarjeta actual",
|
||||
"shortcut-autocomplete-emoji": "Autocompletar emoji",
|
||||
"shortcut-autocomplete-members": "Autocompletar miembros",
|
||||
"shortcut-clear-filters": "Limpiar todos los filtros",
|
||||
"shortcut-close-dialog": "Cerrar el cuadro de diálogo",
|
||||
"shortcut-filter-my-cards": "Filtrar mis tarjetas",
|
||||
"shortcut-show-shortcuts": "Mostrar esta lista de atajos",
|
||||
"shortcut-toggle-filterbar": "Alternar la barra lateral del filtro",
|
||||
"shortcut-toggle-sidebar": "Alternar la barra lateral del tablero",
|
||||
"show-cards-minimum-count": "Mostrar recuento de tarjetas si la lista contiene más de",
|
||||
"sidebar-open": "Abrir la barra lateral",
|
||||
"sidebar-close": "Cerrar la barra lateral",
|
||||
"signupPopup-title": "Crear una cuenta",
|
||||
"star-board-title": "Haga clic para destacar este tablero. Se mostrará en la parte superior de su lista de tableros.",
|
||||
"starred-boards": "Tableros destacados",
|
||||
"starred-boards-description": "Los tableros destacados se mostrarán en la parte superior de su lista de tableros.",
|
||||
"subscribe": "Suscribirse",
|
||||
"team": "Equipo",
|
||||
"this-board": "este tablero",
|
||||
"this-card": "esta tarjeta",
|
||||
"spent-time-hours": "Tiempo consumido (horas)",
|
||||
"overtime-hours": "Tiempo excesivo (horas)",
|
||||
"overtime": "Tiempo excesivo",
|
||||
"has-overtime-cards": "Hay tarjetas con el tiempo excedido",
|
||||
"has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
|
||||
"time": "Hora",
|
||||
"title": "Título",
|
||||
"tracking": "Siguiendo",
|
||||
"tracking-info": "Será notificado de cualquier cambio en las tarjetas en las que participa como creador o miembro.",
|
||||
"type": "Tipo",
|
||||
"unassign-member": "Desasignar miembro",
|
||||
"unsaved-description": "Tiene una descripción sin guardar.",
|
||||
"unwatch": "Dejar de vigilar",
|
||||
"upload": "Cargar",
|
||||
"upload-avatar": "Cargar un avatar",
|
||||
"uploaded-avatar": "Avatar cargado",
|
||||
"username": "Nombre de usuario",
|
||||
"view-it": "Verla",
|
||||
"warn-list-archived": "advertencia: esta tarjeta está en una lista en el archivo",
|
||||
"watch": "Vigilar",
|
||||
"watching": "Vigilando",
|
||||
"watching-info": "Será notificado de cualquier cambio en este tablero",
|
||||
"welcome-board": "Tablero de bienvenida",
|
||||
"welcome-swimlane": "Hito 1",
|
||||
"welcome-list1": "Básicos",
|
||||
"welcome-list2": "Avanzados",
|
||||
"card-templates-swimlane": "Plantilla de tarjeta",
|
||||
"list-templates-swimlane": "Listar plantillas",
|
||||
"board-templates-swimlane": "Plantilla de tablero",
|
||||
"what-to-do": "¿Qué desea hacer?",
|
||||
"wipLimitErrorPopup-title": "El límite del trabajo en proceso no es válido.",
|
||||
"wipLimitErrorPopup-dialog-pt1": "El número de tareas en esta lista es mayor que el límite del trabajo en proceso que ha definido.",
|
||||
"wipLimitErrorPopup-dialog-pt2": "Por favor, mueva algunas tareas de esta lista, o establezca un límite de trabajo en proceso más alto.",
|
||||
"admin-panel": "Panel de administración",
|
||||
"settings": "Configuración",
|
||||
"people": "Personas",
|
||||
"registration": "Registro",
|
||||
"disable-self-registration": "Deshabilitar autoregistro",
|
||||
"invite": "Invitar",
|
||||
"invite-people": "Invitar a personas",
|
||||
"to-boards": "A el(los) tablero(s)",
|
||||
"email-addresses": "Direcciones de correo electrónico",
|
||||
"smtp-host-description": "La dirección del servidor SMTP que maneja sus correos electrónicos.",
|
||||
"smtp-port-description": "Puerto usado por el servidor SMTP para mandar correos",
|
||||
"smtp-tls-description": "Habilitar el soporte TLS para el servidor SMTP",
|
||||
"smtp-host": "Servidor SMTP",
|
||||
"smtp-port": "Puerto SMTP",
|
||||
"smtp-username": "Nombre de usuario",
|
||||
"smtp-password": "Contraseña",
|
||||
"smtp-tls": "Soporte TLS",
|
||||
"send-from": "Desde",
|
||||
"send-smtp-test": "Enviarte un correo de prueba a ti mismo",
|
||||
"invitation-code": "Código de Invitación",
|
||||
"email-invite-register-subject": "__inviter__ le envió una invitación",
|
||||
"email-invite-register-text": "Estimado __user__,\n\n__inviter__ le invita a participar en un tablero Kanban para colaborar.\n\nPor favor, siga el siguiente enlace:\n__url__\n\nY su código de invitación es: __icode__\n\nGracias.",
|
||||
"email-smtp-test-subject": "Prueba de email SMTP",
|
||||
"email-smtp-test-text": "El correo se ha enviado correctamente",
|
||||
"error-invitation-code-not-exist": "El código de invitación no existe",
|
||||
"error-notAuthorized": "No está autorizado a ver esta página.",
|
||||
"webhook-title": "Nombre del Webhook",
|
||||
"webhook-token": "Token (opcional para la autenticación)",
|
||||
"outgoing-webhooks": "Webhooks salientes",
|
||||
"bidirectional-webhooks": "Webhooks de doble sentido",
|
||||
"outgoingWebhooksPopup-title": "Webhooks salientes",
|
||||
"boardCardTitlePopup-title": "Filtro de títulos de tarjeta",
|
||||
"disable-webhook": "Deshabilitar este Webhook",
|
||||
"global-webhook": "Webhooks globales",
|
||||
"new-outgoing-webhook": "Nuevo webhook saliente",
|
||||
"no-name": "(Desconocido)",
|
||||
"Node_version": "Versión de Node",
|
||||
"Meteor_version": "Versión de Meteor",
|
||||
"MongoDB_version": "Versión de MongoDB",
|
||||
"MongoDB_storage_engine": "Motor de almacenamiento de MongoDB",
|
||||
"MongoDB_Oplog_enabled": "Oplog de MongoDB habilitado",
|
||||
"OS_Arch": "Arquitectura del sistema",
|
||||
"OS_Cpus": "Número de CPUs del sistema",
|
||||
"OS_Freemem": "Memoria libre del sistema",
|
||||
"OS_Loadavg": "Carga media del sistema",
|
||||
"OS_Platform": "Plataforma del sistema",
|
||||
"OS_Release": "Publicación del sistema",
|
||||
"OS_Totalmem": "Memoria total del sistema",
|
||||
"OS_Type": "Tipo de sistema",
|
||||
"OS_Uptime": "Tiempo activo del sistema",
|
||||
"days": "días",
|
||||
"hours": "horas",
|
||||
"minutes": "minutos",
|
||||
"seconds": "segundos",
|
||||
"show-field-on-card": "Mostrar este campo en la tarjeta",
|
||||
"automatically-field-on-card": "Crear campos automáticamente para todas las tarjetas.",
|
||||
"showLabel-field-on-card": "Mostrar etiquetas de campos en la minitarjeta.",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"accounts": "Cuentas",
|
||||
"accounts-allowEmailChange": "Permitir cambiar el correo electrónico",
|
||||
"accounts-allowUserNameChange": "Permitir cambiar el nombre de usuario",
|
||||
"createdAt": "Creado en",
|
||||
"verified": "Verificado",
|
||||
"active": "Activo",
|
||||
"card-received": "Recibido",
|
||||
"card-received-on": "Recibido el",
|
||||
"card-end": "Finalizado",
|
||||
"card-end-on": "Finalizado el",
|
||||
"editCardReceivedDatePopup-title": "Cambiar la fecha de recepción",
|
||||
"editCardEndDatePopup-title": "Cambiar la fecha de finalización",
|
||||
"setCardColorPopup-title": "Cambiar el color",
|
||||
"setCardActionsColorPopup-title": "Elegir un color",
|
||||
"setSwimlaneColorPopup-title": "Elegir un color",
|
||||
"setListColorPopup-title": "Elegir un color",
|
||||
"assigned-by": "Asignado por",
|
||||
"requested-by": "Solicitado por",
|
||||
"board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.",
|
||||
"delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.",
|
||||
"boardDeletePopup-title": "¿Eliminar el tablero?",
|
||||
"delete-board": "Eliminar el tablero",
|
||||
"default-subtasks-board": "Subtareas para el tablero __board__",
|
||||
"default": "Por defecto",
|
||||
"queue": "Cola",
|
||||
"subtask-settings": "Configuración de subtareas",
|
||||
"card-settings": "Configuración de tarjetas",
|
||||
"boardSubtaskSettingsPopup-title": "Configuración de subtareas del tablero",
|
||||
"boardCardSettingsPopup-title": "Configuración de tarjeta",
|
||||
"deposit-subtasks-board": "Depositar subtareas en este tablero:",
|
||||
"deposit-subtasks-list": "Lista de destino para subtareas depositadas aquí:",
|
||||
"show-parent-in-minicard": "Mostrar el padre en una minitarjeta:",
|
||||
"prefix-with-full-path": "Prefijo con ruta completa",
|
||||
"prefix-with-parent": "Prefijo con el padre",
|
||||
"subtext-with-full-path": "Subtexto con ruta completa",
|
||||
"subtext-with-parent": "Subtexto con el padre",
|
||||
"change-card-parent": "Cambiar la tarjeta padre",
|
||||
"parent-card": "Tarjeta padre",
|
||||
"source-board": "Tablero de origen",
|
||||
"no-parent": "No mostrar la tarjeta padre",
|
||||
"activity-added-label": "agregada etiqueta «%s» a %s",
|
||||
"activity-removed-label": "eliminada etiqueta '%s' desde %s",
|
||||
"activity-delete-attach": "eliminado un adjunto desde %s",
|
||||
"activity-added-label-card": "agregada etiqueta «%s»",
|
||||
"activity-removed-label-card": "eliminada etiqueta '%s'",
|
||||
"activity-delete-attach-card": "eliminado un adjunto",
|
||||
"activity-set-customfield": "Cambiar el campo personalizado '%s' a '%s' en %s",
|
||||
"activity-unset-customfield": "Desmarcar el campo personalizado '%s' en %s",
|
||||
"r-rule": "Regla",
|
||||
"r-add-trigger": "Agregar desencadenador",
|
||||
"r-add-action": "Agregar acción",
|
||||
"r-board-rules": "Reglas del tablero",
|
||||
"r-add-rule": "Agregar regla",
|
||||
"r-view-rule": "Ver regla",
|
||||
"r-delete-rule": "Eliminar regla",
|
||||
"r-new-rule-name": "Nuevo título de regla",
|
||||
"r-no-rules": "No hay reglas",
|
||||
"r-trigger": "Desencadenador",
|
||||
"r-action": "Acción",
|
||||
"r-when-a-card": "Cuando una tarjeta",
|
||||
"r-is": "es",
|
||||
"r-is-moved": "es movida",
|
||||
"r-added-to": "Agregado a",
|
||||
"r-removed-from": "eliminado de",
|
||||
"r-the-board": "el tablero",
|
||||
"r-list": "la lista",
|
||||
"set-filter": "Filtrar",
|
||||
"r-moved-to": "Movido a",
|
||||
"r-moved-from": "Movido desde",
|
||||
"r-archived": "Se archivó",
|
||||
"r-unarchived": "Restaurado del archivo",
|
||||
"r-a-card": "una tarjeta",
|
||||
"r-when-a-label-is": "Cuando una etiqueta es",
|
||||
"r-when-the-label": "Cuando la etiqueta es",
|
||||
"r-list-name": "Nombre de lista",
|
||||
"r-when-a-member": "Cuando un miembro es",
|
||||
"r-when-the-member": "Cuando el miembro",
|
||||
"r-name": "nombre",
|
||||
"r-when-a-attach": "Cuando un adjunto",
|
||||
"r-when-a-checklist": "Cuando una lista de comprobación es",
|
||||
"r-when-the-checklist": "Cuando la lista de comprobación",
|
||||
"r-completed": "Completada",
|
||||
"r-made-incomplete": "Hecha incompleta",
|
||||
"r-when-a-item": "Cuando un elemento de la lista de comprobación es",
|
||||
"r-when-the-item": "Cuando el elemento de la lista de comprobación es",
|
||||
"r-checked": "Marcado",
|
||||
"r-unchecked": "Desmarcado",
|
||||
"r-move-card-to": "Mover la tarjeta",
|
||||
"r-top-of": "Arriba de",
|
||||
"r-bottom-of": "Abajo de",
|
||||
"r-its-list": "su lista",
|
||||
"r-archive": "Archivar",
|
||||
"r-unarchive": "Restaurar del archivo",
|
||||
"r-card": "la tarjeta",
|
||||
"r-add": "Agregar",
|
||||
"r-remove": "Eliminar",
|
||||
"r-label": "etiqueta",
|
||||
"r-member": "miembro",
|
||||
"r-remove-all": "Eliminar todos los miembros de la tarjeta",
|
||||
"r-set-color": "Cambiar el color a",
|
||||
"r-checklist": "lista de comprobación",
|
||||
"r-check-all": "Marcar todo",
|
||||
"r-uncheck-all": "Desmarcar todo",
|
||||
"r-items-check": "elementos de la lista de comprobación",
|
||||
"r-check": "Marcar",
|
||||
"r-uncheck": "Desmarcar",
|
||||
"r-item": "elemento",
|
||||
"r-of-checklist": "de la lista de comprobación",
|
||||
"r-send-email": "Enviar un email",
|
||||
"r-to": "a",
|
||||
"r-of": "de",
|
||||
"r-subject": "asunto",
|
||||
"r-rule-details": "Detalle de la regla",
|
||||
"r-d-move-to-top-gen": "Mover la tarjeta al inicio de su lista",
|
||||
"r-d-move-to-top-spec": "Mover la tarjeta al inicio de la lista",
|
||||
"r-d-move-to-bottom-gen": "Mover la tarjeta al final de su lista",
|
||||
"r-d-move-to-bottom-spec": "Mover la tarjeta al final de la lista",
|
||||
"r-d-send-email": "Enviar email",
|
||||
"r-d-send-email-to": "a",
|
||||
"r-d-send-email-subject": "asunto",
|
||||
"r-d-send-email-message": "mensaje",
|
||||
"r-d-archive": "Archivar la tarjeta",
|
||||
"r-d-unarchive": "Restaurar tarjeta del archivo",
|
||||
"r-d-add-label": "Agregar etiqueta",
|
||||
"r-d-remove-label": "Eliminar etiqueta",
|
||||
"r-create-card": "Crear nueva tarjeta",
|
||||
"r-in-list": "en la lista",
|
||||
"r-in-swimlane": "en el carril",
|
||||
"r-d-add-member": "Agregar miembro",
|
||||
"r-d-remove-member": "Eliminar miembro",
|
||||
"r-d-remove-all-member": "Eliminar todos los miembros",
|
||||
"r-d-check-all": "Marcar todos los elementos de una lista",
|
||||
"r-d-uncheck-all": "Desmarcar todos los elementos de una lista",
|
||||
"r-d-check-one": "Marcar elemento",
|
||||
"r-d-uncheck-one": "Desmarcar elemento",
|
||||
"r-d-check-of-list": "de la lista de comprobación",
|
||||
"r-d-add-checklist": "Agregar lista de comprobación",
|
||||
"r-d-remove-checklist": "Eliminar lista de comprobación",
|
||||
"r-by": "por",
|
||||
"r-add-checklist": "Agregar lista de comprobación",
|
||||
"r-with-items": "con elementos",
|
||||
"r-items-list": "elemento1,elemento2,elemento3",
|
||||
"r-add-swimlane": "Agregar el carril",
|
||||
"r-swimlane-name": "nombre del carril",
|
||||
"r-board-note": "Nota: deje un campo vacío para que coincida con todos los valores posibles",
|
||||
"r-checklist-note": "Nota: los elementos de la lista de comprobación deben escribirse como valores separados por comas.",
|
||||
"r-when-a-card-is-moved": "Cuando una tarjeta es movida a otra lista",
|
||||
"r-set": "Cambiar",
|
||||
"r-update": "Actualizar",
|
||||
"r-datefield": "campo de fecha",
|
||||
"r-df-start-at": "comienza",
|
||||
"r-df-due-at": "vencimiento",
|
||||
"r-df-end-at": "finalizado",
|
||||
"r-df-received-at": "recibido",
|
||||
"r-to-current-datetime": "a la fecha/hora actual",
|
||||
"r-remove-value-from": "Eliminar el valor de",
|
||||
"ldap": "LDAP",
|
||||
"oauth2": "OAuth2",
|
||||
"cas": "CAS",
|
||||
"authentication-method": "Método de autenticación",
|
||||
"authentication-type": "Tipo de autenticación",
|
||||
"custom-product-name": "Nombre de producto personalizado",
|
||||
"layout": "Diseño",
|
||||
"hide-logo": "Ocultar el logo",
|
||||
"add-custom-html-after-body-start": "Agrega HTML personalizado después de <body>",
|
||||
"add-custom-html-before-body-end": "Agrega HTML personalizado después de </body>",
|
||||
"error-undefined": "Algo no está bien",
|
||||
"error-ldap-login": "Ocurrió un error al intentar acceder",
|
||||
"display-authentication-method": "Mostrar el método de autenticación",
|
||||
"default-authentication-method": "Método de autenticación por defecto",
|
||||
"duplicate-board": "Duplicar tablero",
|
||||
"people-number": "El número de personas es:",
|
||||
"swimlaneDeletePopup-title": "¿Eliminar el carril «swimlane»?",
|
||||
"swimlane-delete-pop": "Todas las acciones serán eliminadas de la fuente de actividades y no se podrá recuperar el carril «swimlane». Esta acción no puede deshacerse.",
|
||||
"restore-all": "Restaurar todas",
|
||||
"delete-all": "Borrar todas",
|
||||
"loading": "Cargando. Por favor, espere.",
|
||||
"previous_as": "el último tiempo fue",
|
||||
"act-a-dueAt": "cambiada la hora de vencimiento a \nCuándo: __timeValue__\nDónde: __card__\n el vencimiento anterior fue __timeOldValue__",
|
||||
"act-a-endAt": "cambiada la hora de finalización a __timeValue__ Fecha anterior: (__timeOldValue__)",
|
||||
"act-a-startAt": "cambiada la hora de comienzo a __timeValue__ Fecha anterior: (__timeOldValue__)",
|
||||
"act-a-receivedAt": "cambiada la fecha de recepción a __timeValue__ Fecha anterior: (__timeOldValue__)",
|
||||
"a-dueAt": "cambiada la hora de vencimiento a",
|
||||
"a-endAt": "cambiada la hora de finalización a",
|
||||
"a-startAt": "cambiada la hora de comienzo a",
|
||||
"a-receivedAt": "cambiada la hora de recepción a",
|
||||
"almostdue": "está próxima la hora de vencimiento actual %s",
|
||||
"pastdue": "se sobrepasó la hora de vencimiento actual %s",
|
||||
"duenow": "la hora de vencimiento actual %s es hoy",
|
||||
"act-newDue": "__list__/__card__ tiene una 1ra notificación de vencimiento [__board__]",
|
||||
"act-withDue": "__list__/__card__ notificaciones de vencimiento [__board__]",
|
||||
"act-almostdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ está próximo",
|
||||
"act-pastdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ se sobrepasó",
|
||||
"act-duenow": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ es ahora",
|
||||
"act-atUserComment": "Se le mencionó en [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "¿Seguro que desea eliminar esta cuenta? Esta acción no puede deshacerse.",
|
||||
"accounts-allowUserDelete": "Permitir a los usuarios eliminar su cuenta",
|
||||
"hide-minicard-label-text": "Ocultar el texto de la etiqueta de la minitarjeta",
|
||||
"show-desktop-drag-handles": "Mostrar los controles de arrastre del escritorio",
|
||||
"assignee": "Asignado",
|
||||
"cardAssigneesPopup-title": "Asignado",
|
||||
"addmore-detail": "Agregar una descripción detallada",
|
||||
"show-on-card": "Mostrar en la tarjeta",
|
||||
"new": "Nuevo",
|
||||
"editUserPopup-title": "Editar el usuario",
|
||||
"newUserPopup-title": "Nuevo usuario",
|
||||
"notifications": "Notificaciones",
|
||||
"view-all": "Ver todo",
|
||||
"filter-by-unread": "Filtrar por no leído",
|
||||
"mark-all-as-read": "Marcar todo como leido",
|
||||
"remove-all-read": "Eliminar todos los leídos",
|
||||
"allow-rename": "Permitir renombrar",
|
||||
"allowRenamePopup-title": "Permitir renombrar",
|
||||
"start-day-of-week": "Establecer el día de inicio de la semana",
|
||||
"monday": "lunes",
|
||||
"tuesday": "martes",
|
||||
"wednesday": "miércoles",
|
||||
"thursday": "jueves",
|
||||
"friday": "viernes",
|
||||
"saturday": "sábado",
|
||||
"sunday": "domingo",
|
||||
"status": "Estado",
|
||||
"swimlane": "Carril",
|
||||
"owner": "Propietario",
|
||||
"last-modified-at": "Última modificación",
|
||||
"last-activity": "Última actividad",
|
||||
"voting": "Votar",
|
||||
"archived": "Archivado",
|
||||
"delete-linked-card-before-this-card": "No puede borrar esta tarjeta antes de borrar la tarjeta enlazada que tiene",
|
||||
"delete-linked-cards-before-this-list": "No puede borrar esta lista antes de borrar las tarjetas enlazadas que apuntan a tarjetas en esta lista",
|
||||
"hide-checked-items": "Ocultar elementos marcados"
|
||||
}
|
||||
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
+814
-777
File diff suppressed because it is too large.
Load diff
Loaded 100 of 224 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user